1
0
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:
Nicholas Hastings
2014-10-30 12:30:57 -04:00
parent 6abc7fddca
commit aa5841f220
407 changed files with 6784 additions and 10498 deletions

View File

@ -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 );
}
}
}
}