mirror of
https://github.com/alliedmodders/hl2sdk.git
synced 2025-09-19 20:16:10 +08:00
Sync with latest source-sdk-2013.
This commit is contained in:
@ -5895,28 +5895,32 @@ int Studio_FindRandomAttachment( const CStudioHdr *pStudioHdr, const char *pAtta
|
||||
|
||||
int Studio_BoneIndexByName( const CStudioHdr *pStudioHdr, const char *pName )
|
||||
{
|
||||
// binary search for the bone matching pName
|
||||
int start = 0, end = pStudioHdr->numbones()-1;
|
||||
const byte *pBoneTable = pStudioHdr->GetBoneTableSortedByName();
|
||||
mstudiobone_t *pbones = pStudioHdr->pBone( 0 );
|
||||
while (start <= end)
|
||||
if ( pStudioHdr )
|
||||
{
|
||||
int mid = (start + end) >> 1;
|
||||
int cmp = Q_stricmp( pbones[pBoneTable[mid]].pszName(), pName );
|
||||
// binary search for the bone matching pName
|
||||
int start = 0, end = pStudioHdr->numbones()-1;
|
||||
const byte *pBoneTable = pStudioHdr->GetBoneTableSortedByName();
|
||||
mstudiobone_t *pbones = pStudioHdr->pBone( 0 );
|
||||
while (start <= end)
|
||||
{
|
||||
int mid = (start + end) >> 1;
|
||||
int cmp = Q_stricmp( pbones[pBoneTable[mid]].pszName(), pName );
|
||||
|
||||
if ( cmp < 0 )
|
||||
{
|
||||
start = mid + 1;
|
||||
}
|
||||
else if ( cmp > 0 )
|
||||
{
|
||||
end = mid - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return pBoneTable[mid];
|
||||
if ( cmp < 0 )
|
||||
{
|
||||
start = mid + 1;
|
||||
}
|
||||
else if ( cmp > 0 )
|
||||
{
|
||||
end = mid - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return pBoneTable[mid];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -5969,3 +5973,81 @@ bool Studio_PrefetchSequence( const CStudioHdr *pStudioHdr, int iSequence )
|
||||
// Everything for this sequence is resident?
|
||||
return !pendingload;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Drive a flex controller from a component of a bone
|
||||
//-----------------------------------------------------------------------------
|
||||
void Studio_RunBoneFlexDrivers( float *pflFlexControllerWeights, const CStudioHdr *pStudioHdr, const Vector *pvPositions, const matrix3x4_t *pBoneToWorld, const matrix3x4_t &mRootToWorld )
|
||||
{
|
||||
bool bRootToWorldInvComputed = false;
|
||||
matrix3x4_t mRootToWorldInv;
|
||||
matrix3x4_t mParentInv;
|
||||
matrix3x4_t mBoneLocal;
|
||||
|
||||
const int nBoneFlexDriverCount = pStudioHdr->BoneFlexDriverCount();
|
||||
|
||||
for ( int i = 0; i < nBoneFlexDriverCount; ++i )
|
||||
{
|
||||
const mstudioboneflexdriver_t *pBoneFlexDriver = pStudioHdr->BoneFlexDriver( i );
|
||||
const mstudiobone_t *pStudioBone = pStudioHdr->pBone( pBoneFlexDriver->m_nBoneIndex );
|
||||
|
||||
const int nControllerCount = pBoneFlexDriver->m_nControlCount;
|
||||
|
||||
if ( pStudioBone->flags & BONE_USED_BY_BONE_MERGE )
|
||||
{
|
||||
// The local space version of the bone is not available if this is a bonemerged bone
|
||||
// so do the slow computation of the local version of the bone from boneToWorld
|
||||
|
||||
if ( pStudioBone->parent < 0 )
|
||||
{
|
||||
if ( !bRootToWorldInvComputed )
|
||||
{
|
||||
MatrixInvert( mRootToWorld, mRootToWorldInv );
|
||||
bRootToWorldInvComputed = true;
|
||||
}
|
||||
|
||||
MatrixMultiply( mRootToWorldInv, pBoneToWorld[ pBoneFlexDriver->m_nBoneIndex ], mBoneLocal );
|
||||
}
|
||||
else
|
||||
{
|
||||
MatrixInvert( pBoneToWorld[ pStudioBone->parent ], mParentInv );
|
||||
MatrixMultiply( mParentInv, pBoneToWorld[ pBoneFlexDriver->m_nBoneIndex ], mBoneLocal );
|
||||
}
|
||||
|
||||
for ( int j = 0; j < nControllerCount; ++j )
|
||||
{
|
||||
const mstudioboneflexdrivercontrol_t *pController = pBoneFlexDriver->pBoneFlexDriverControl( j );
|
||||
const mstudioflexcontroller_t *pFlexController = pStudioHdr->pFlexcontroller( static_cast< LocalFlexController_t >( pController->m_nFlexControllerIndex ) );
|
||||
|
||||
if ( pFlexController->localToGlobal < 0 )
|
||||
continue;
|
||||
|
||||
Assert( pController->m_nFlexControllerIndex >= 0 && pController->m_nFlexControllerIndex < pStudioHdr->numflexcontrollers() );
|
||||
Assert( pController->m_nBoneComponent >= 0 && pController->m_nBoneComponent <= 2 );
|
||||
pflFlexControllerWeights[pFlexController->localToGlobal] =
|
||||
RemapValClamped( mBoneLocal[pController->m_nBoneComponent][3], pController->m_flMin, pController->m_flMax, 0.0f, 1.0f );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Use the local space version of the bone directly for non-bonemerged bones
|
||||
|
||||
const Vector &position = pvPositions[ pBoneFlexDriver->m_nBoneIndex ];
|
||||
|
||||
for ( int j = 0; j < nControllerCount; ++j )
|
||||
{
|
||||
const mstudioboneflexdrivercontrol_t *pController = pBoneFlexDriver->pBoneFlexDriverControl( j );
|
||||
const mstudioflexcontroller_t *pFlexController = pStudioHdr->pFlexcontroller( static_cast< LocalFlexController_t >( pController->m_nFlexControllerIndex ) );
|
||||
|
||||
if ( pFlexController->localToGlobal < 0 )
|
||||
continue;
|
||||
|
||||
Assert( pController->m_nFlexControllerIndex >= 0 && pController->m_nFlexControllerIndex < pStudioHdr->numflexcontrollers() );
|
||||
Assert( pController->m_nBoneComponent >= 0 && pController->m_nBoneComponent <= 2 );
|
||||
pflFlexControllerWeights[pFlexController->localToGlobal] =
|
||||
RemapValClamped( position[pController->m_nBoneComponent], pController->m_flMin, pController->m_flMax, 0.0f, 1.0f );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user