Files
GTASource/game/renderer/DrawLists/CopyOffMatrixSet.cpp
expvintl 419f2e4752 init
2025-02-23 17:40:52 +08:00

108 lines
3.5 KiB
C++

#include "system/eaptr.h"
#include "system/cache.h"
#include "system/dependency.h"
#include "system/interlocked.h"
#include "system/ipc.h"
#include "grcore/matrix43.h"
using namespace rage;
void CopyOffMatrixSetImpl(Mat34V* objectMtx, Mat34V* invJointScaleMtx, u16* lodSkelMap, Matrix43* outMtxs, const bool isSkinned, const u32 numBones, u16 firstBoneToScale, u16 lastBoneToScale, float fScaleFactor)
{
# if RSG_XENON
Matrix43* const outMtxsBegin = outMtxs;
# endif
bool bDoAnyScaling = fabs(fScaleFactor - 1.0f) > SMALL_FLOAT;
if( isSkinned )
{
if (lodSkelMap)
{
for (u32 i = 0; i < numBones; ++i, ++outMtxs)
{
Mat34V mtx;
rage::Transform(mtx, objectMtx[lodSkelMap[i]], invJointScaleMtx[lodSkelMap[i]]);
if (bDoAnyScaling && lodSkelMap[i] >= firstBoneToScale && lodSkelMap[i] <= lastBoneToScale)
{
Vec3V vScale(fScaleFactor, fScaleFactor, fScaleFactor);
Scale(mtx, vScale, mtx);
}
outMtxs->FromMatrix34(mtx);
}
}
else
{
for(u32 i = 0; i < numBones; ++i, ++outMtxs, ++objectMtx, ++invJointScaleMtx)
{
Mat34V mtx;
rage::Transform(mtx, *objectMtx, *invJointScaleMtx);
if (bDoAnyScaling && i >= firstBoneToScale && i <= lastBoneToScale)
{
Vec3V vScale(fScaleFactor, fScaleFactor, fScaleFactor);
Scale(mtx, vScale, mtx);
}
outMtxs->FromMatrix34(mtx);
}
}
}
else
{
if (lodSkelMap)
{
for(u32 i = 0; i < numBones; ++i, ++outMtxs)
{
Mat34V mtx = objectMtx[lodSkelMap[i]];
if (bDoAnyScaling && lodSkelMap[i] >= firstBoneToScale && lodSkelMap[i] <= lastBoneToScale)
{
Vec3V vScale(fScaleFactor, fScaleFactor, fScaleFactor);
Scale(mtx, vScale, mtx);
}
outMtxs->FromMatrix34(mtx);
}
}
else
{
for(u32 i = 0; i < numBones; ++i, ++objectMtx, ++outMtxs)
{
Mat34V mtx = *objectMtx;
if (bDoAnyScaling && i >= firstBoneToScale && i <= lastBoneToScale)
{
Vec3V vScale(fScaleFactor, fScaleFactor, fScaleFactor);
Scale(mtx, vScale, mtx);
}
outMtxs->FromMatrix34(mtx);
}
}
}
# if RSG_XENON
WritebackDC(outMtxsBegin, (uptr)outMtxs-(uptr)outMtxsBegin);
# endif
}
bool CopyOffMatrixSetSPU_Dependency(const sysDependency& dependency)
{
Mat34V* objectMtx = static_cast< Mat34V* >( dependency.m_Params[0].m_AsPtr );
Mat34V* invJointScaleMtx = static_cast< Mat34V* >( dependency.m_Params[1].m_AsPtr );
u16* lodSkelMap = static_cast< u16* >( dependency.m_Params[2].m_AsPtr );
Matrix43* outMtxs = static_cast< Matrix43* >( dependency.m_Params[3].m_AsPtr );
const bool isSkinned = dependency.m_Params[4].m_AsShort.m_Low != 0;
const u16 numBones = static_cast< u16 >( dependency.m_Params[4].m_AsShort.m_High );
u16 firstBoneToScale = static_cast< u16 >( dependency.m_Params[5].m_AsShort.m_Low );
u16 lastBoneToScale = static_cast< u16 >( dependency.m_Params[5].m_AsShort.m_High );
float fScaleFactor = static_cast< float >( dependency.m_Params[6].m_AsFloat );
sysEaPtr< u32 > finishedDependencyCountEa = static_cast< u32* >( dependency.m_Params[7].m_AsPtr );
u32 expectedDepdencyCount = dependency.m_Params[8].m_AsUInt;
sysIpcSema* pSema = static_cast< sysIpcSema*>(dependency.m_Params[9].m_AsPtr);
CopyOffMatrixSetImpl( objectMtx, invJointScaleMtx, lodSkelMap, outMtxs, isSkinned, numBones, firstBoneToScale, lastBoneToScale, fScaleFactor );
u32 finishedCount = sysInterlockedIncrement(finishedDependencyCountEa.ToPtr());
if(finishedCount == expectedDepdencyCount)
{
sysIpcSignalSema(*pSema);
}
return true;
}