108 lines
3.5 KiB
C++
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;
|
|
}
|