void StudioModel::scaleMeshes (float scale) { CStudioHdr *pStudioHdr = GetStudioHdr(); if (!pStudioHdr) return; int i, j, k; // manadatory to access correct verts SetCurrentModel(); // scale verts int tmp = m_bodynum; for (i = 0; i < pStudioHdr->numbodyparts(); i++) { mstudiobodyparts_t *pbodypart = pStudioHdr->pBodypart( i ); for (j = 0; j < pbodypart->nummodels; j++) { SetBodygroup (i, j); SetupModel (i); const mstudio_modelvertexdata_t *vertData = m_pmodel->GetVertexData(); for (k = 0; k < m_pmodel->numvertices; k++) { *vertData->Position(k) *= scale; } } } m_bodynum = tmp; // scale complex hitboxes int hitboxset = g_MDLViewer->GetCurrentHitboxSet(); mstudiobbox_t *pbboxes = pStudioHdr->pHitbox( 0, hitboxset ); for (i = 0; i < pStudioHdr->iHitboxCount( hitboxset ); i++) { VectorScale (pbboxes[i].bbmin, scale, pbboxes[i].bbmin); VectorScale (pbboxes[i].bbmax, scale, pbboxes[i].bbmax); } // scale bounding boxes for (i = 0; i < pStudioHdr->GetNumSeq(); i++) { mstudioseqdesc_t &seqdesc = pStudioHdr->pSeqdesc( i ); Vector tmp; tmp = seqdesc.bbmin; VectorScale( tmp, scale, tmp ); seqdesc.bbmin = tmp; tmp = seqdesc.bbmax; VectorScale( tmp, scale, tmp ); seqdesc.bbmax = tmp; } // maybe scale exeposition, pivots, attachments }
bool StudioModel::PostLoadModel( const char *modelname ) { MDLCACHE_CRITICAL_SECTION_( g_pMDLCache ); CStudioHdr *pStudioHdr = GetStudioHdr(); if (pStudioHdr == NULL) return false; SetSequence (0); SetController (0, 0.0f); SetController (1, 0.0f); SetController (2, 0.0f); SetController (3, 0.0f); SetBlendTime( DEFAULT_BLEND_TIME ); // SetHeadTurn( 1.0f ); // FIXME:!!! int n; for (n = 0; n < pStudioHdr->numbodyparts(); n++) { SetBodygroup (n, 0); } SetSkin (0); /* Vector mins, maxs; ExtractBbox (mins, maxs); if (mins[2] < 5.0f) m_origin[2] = -mins[2]; */ return true; }
float StudioModel::GetDuration( int iSequence ) { CStudioHdr *pStudioHdr = GetStudioHdr(); if ( !pStudioHdr ) return 0.0f; return Studio_Duration( pStudioHdr, iSequence, m_poseparameter ); }
//----------------------------------------------------------------------------- // Purpose: Returns the the sequence should be hidden or not //----------------------------------------------------------------------------- bool StudioModel::IsHidden( int iSequence ) { CStudioHdr *pStudioHdr = GetStudioHdr(); if (pStudioHdr->pSeqdesc( iSequence ).flags & STUDIO_HIDDEN) return true; return false; }
float StudioModel::SetController( int iController, float flValue ) { CStudioHdr *pStudioHdr = GetStudioHdr(); if (!pStudioHdr) return 0.0f; return Studio_SetController( pStudioHdr, iController, flValue, m_controller[iController] ); }
float StudioModel::SetPoseParameter( int iParameter, float flValue ) { CStudioHdr *pStudioHdr = GetStudioHdr(); if (!pStudioHdr) return 0.0f; return Studio_SetPoseParameter( pStudioHdr, iParameter, flValue, m_poseparameter[iParameter] ); }
float StudioModel::GetPoseParameter( int iParameter ) { CStudioHdr *pStudioHdr = GetStudioHdr(); if (!pStudioHdr) return 0.0f; return Studio_GetPoseParameter( pStudioHdr, iParameter, m_poseparameter[iParameter] ); }
void StudioModel::GetSeqAnims( int iSequence, mstudioanimdesc_t *panim[4], float *weight ) { CStudioHdr *pStudioHdr = GetStudioHdr(); if (!pStudioHdr) return; mstudioseqdesc_t &seqdesc = pStudioHdr->pSeqdesc( iSequence ); Studio_SeqAnims( pStudioHdr, seqdesc, iSequence, m_poseparameter, panim, weight ); }
//----------------------------------------------------------------------------- // Purpose: // Input : iSequence - // Output : Returns true on success, false on failure. //----------------------------------------------------------------------------- bool StudioModel::GetSequenceLoops( int iSequence ) { CStudioHdr *pStudioHdr = GetStudioHdr(); if ( !pStudioHdr ) return false; int flags = GetSequenceFlags( pStudioHdr, iSequence ); bool looping = flags & STUDIO_LOOPING ? true : false; return looping; }
int StudioModel::GetNumFrames( int iSequence ) { CStudioHdr *pStudioHdr = GetStudioHdr(); if ( !pStudioHdr || iSequence < 0 || iSequence >= pStudioHdr->GetNumSeq() ) { return 1; } return Studio_MaxFrame( pStudioHdr, iSequence, m_poseparameter ); }
//----------------------------------------------------------------------------- // Purpose: Returns the ground speed of the current sequence. //----------------------------------------------------------------------------- float StudioModel::GetCurrentVelocity( void ) { Vector vecVelocity; CStudioHdr *pStudioHdr = GetStudioHdr(); if (pStudioHdr && Studio_SeqVelocity( pStudioHdr, m_sequence, m_cycle, m_poseparameter, vecVelocity )) { return vecVelocity.Length(); } return 0; }
void StudioModel::SetFlexControllerRaw( LocalFlexController_t iFlex, float flValue ) { CStudioHdr *pStudioHdr = GetStudioHdr(); if ( !pStudioHdr ) return; if (iFlex >= 0 && iFlex < pStudioHdr->numflexcontrollers()) { // mstudioflexcontroller_t *pflex = pStudioHdr->pFlexcontroller(iFlex); m_flexweight[iFlex] = clamp( flValue, 0.0f, 1.0f ); } }
float StudioModel::GetFlexControllerRaw( LocalFlexController_t iFlex ) { CStudioHdr *pStudioHdr = GetStudioHdr(); if ( !pStudioHdr ) return 0.0f; if (iFlex >= 0 && iFlex < pStudioHdr->numflexcontrollers()) { // mstudioflexcontroller_t *pflex = pStudioHdr->pFlexcontroller(iFlex); return m_flexweight[iFlex]; } return 0.0; }
void StudioModel::scaleBones (float scale) { CStudioHdr *pStudioHdr = GetStudioHdr(); if (!pStudioHdr) return; mstudiobone_t *pbones = pStudioHdr->pBone( 0 ); for (int i = 0; i < pStudioHdr->numbones(); i++) { pbones[i].pos *= scale; pbones[i].posscale *= scale; } }
float StudioModel::GetOverlaySequenceWeight( int iLayer ) { CStudioHdr *pStudioHdr = GetStudioHdr(); if ( !pStudioHdr ) return -1; if (iLayer < 0 || iLayer >= MAXSTUDIOANIMLAYERS) { Assert(0); return 0; } return m_Layer[iLayer].m_weight; }
LocalFlexController_t StudioModel::LookupFlexController( char *szName ) { CStudioHdr *pStudioHdr = GetStudioHdr(); if (!pStudioHdr) return LocalFlexController_t(0); for (LocalFlexController_t iFlex = LocalFlexController_t(0); iFlex < pStudioHdr->numflexcontrollers(); iFlex++) { if (stricmp( szName, pStudioHdr->pFlexcontroller( iFlex )->pszName() ) == 0) { return iFlex; } } return LocalFlexController_t(-1); }
int StudioModel::LookupFlexController( char *szName ) { CStudioHdr *pStudioHdr = GetStudioHdr(); if (!pStudioHdr) return false; for (int iFlex = 0; iFlex < pStudioHdr->numflexcontrollers(); iFlex++) { if (stricmp( szName, pStudioHdr->pFlexcontroller( iFlex )->pszName() ) == 0) { return iFlex; } } return -1; }
int StudioModel::SetSkin( int iValue ) { CStudioHdr *pStudioHdr = GetStudioHdr(); if (!pStudioHdr) return 0; if (iValue >= pStudioHdr->numskinfamilies()) { return m_skinnum; } m_skinnum = iValue; return iValue; }
void StudioModel::GetMovement( int iSequence, float prevCycle, float nextCycle, Vector &vecPos, QAngle &vecAngles ) { CStudioHdr *pStudioHdr = GetStudioHdr(); if ( !pStudioHdr ) { vecPos.Init(); vecAngles.Init(); return; } // FIXME: this doesn't consider layers Studio_SeqMovement( pStudioHdr, iSequence, prevCycle, nextCycle, m_poseparameter, vecPos, vecAngles ); return; }
int StudioModel::LookupAttachment( char const *szName ) { CStudioHdr *pStudioHdr = GetStudioHdr(); if ( !pStudioHdr ) return -1; for (int i = 0; i < pStudioHdr->GetNumAttachments(); i++) { if (stricmp( pStudioHdr->pAttachment( i ).pszName(), szName ) == 0) { return i; } } return -1; }
int StudioModel::LookupPoseParameter( char const *szName ) { CStudioHdr *pStudioHdr = GetStudioHdr(); if (!pStudioHdr) return false; for (int iParameter = 0; iParameter < pStudioHdr->GetNumPoseParameters(); iParameter++) { if (stricmp( szName, pStudioHdr->pPoseParameter( iParameter ).pszName() ) == 0) { return iParameter; } } return -1; }
//------------------------------------------------------------------------------ // Returns true if the model has at least one body part with model data, false if not. //------------------------------------------------------------------------------ bool StudioModel::HasModel() { CStudioHdr *pStudioHdr = GetStudioHdr(); if ( !pStudioHdr ) return false; for ( int i = 0; i < pStudioHdr->numbodyparts(); i++ ) { if ( pStudioHdr->pBodypart(i)->nummodels ) { return true; } } return false; }
int StudioModel::GetNewAnimationLayer( int iPriority ) { CStudioHdr *pStudioHdr = GetStudioHdr(); if ( !pStudioHdr ) return 0; if ( m_iActiveLayers >= MAXSTUDIOANIMLAYERS ) { Assert( 0 ); return MAXSTUDIOANIMLAYERS - 1; } m_Layer[m_iActiveLayers].m_priority = iPriority; return m_iActiveLayers++; }
int StudioModel::LookupSequence( const char *szSequence ) { int i; CStudioHdr *pStudioHdr = GetStudioHdr(); if ( !pStudioHdr ) return -1; for (i = 0; i < pStudioHdr->GetNumSeq(); i++) { if (!stricmp( szSequence, pStudioHdr->pSeqdesc( i ).pszLabel() )) { return i; } } return -1; }
int StudioModel::LookupActivity( const char *szActivity ) { int i; CStudioHdr *pStudioHdr = GetStudioHdr(); if ( !pStudioHdr ) return -1; for (i = 0; i < pStudioHdr->GetNumSeq(); i++) { if (!stricmp( szActivity, pStudioHdr->pSeqdesc( i ).pszActivityName() )) { return i; } } return -1; }
void StudioModel::SetFlexController( LocalFlexController_t iFlex, float flValue ) { CStudioHdr *pStudioHdr = GetStudioHdr(); if ( !pStudioHdr ) return; if (iFlex >= 0 && iFlex < pStudioHdr->numflexcontrollers()) { mstudioflexcontroller_t *pflex = pStudioHdr->pFlexcontroller(iFlex); if (pflex->min != pflex->max) { flValue = (flValue - pflex->min) / (pflex->max - pflex->min); } m_flexweight[iFlex] = clamp( flValue, 0.0f, 1.0f ); } }
void StudioModel::RunFlexRules( ) { CStudioHdr *pStudioHdr = GetStudioHdr(); float src[MAXSTUDIOFLEXCTRL*4]; for (LocalFlexController_t i = LocalFlexController_t(0); i < pStudioHdr->numflexcontrollers(); i++) { mstudioflexcontroller_t *pflex = pStudioHdr->pFlexcontroller( i ); int j = pStudioHdr->pFlexcontroller( i )->localToGlobal; // remap m_flexweights to full dynamic range, global flexcontroller indexes if (j >= 0 && j < MAXSTUDIOFLEXCTRL*4) { src[j] = m_flexweight[i] * (pflex->max - pflex->min) + pflex->min; } } pStudioHdr->RunFlexRules( src, g_flexdescweight ); }
bool StudioModel::GetPoseParameterRange( int iParameter, float *pflMin, float *pflMax ) { *pflMin = 0; *pflMax = 0; CStudioHdr *pStudioHdr = GetStudioHdr(); if (!pStudioHdr) return false; if (iParameter < 0 || iParameter >= pStudioHdr->GetNumPoseParameters()) return false; const mstudioposeparamdesc_t &Pose = pStudioHdr->pPoseParameter( iParameter ); *pflMin = Pose.start; *pflMax = Pose.end; return true; }
int StudioModel::SetSequence( int iSequence ) { CStudioHdr *pStudioHdr = GetStudioHdr(); if ( !pStudioHdr ) return 0; if (iSequence < 0) return 0; if (iSequence > pStudioHdr->GetNumSeq()) return m_sequence; m_prevsequence = m_sequence; m_sequence = iSequence; m_cycle = 0; m_sequencetime = 0.0; return m_sequence; }
void StudioModel::GetMovement( float prevcycle[5], Vector &vecPos, QAngle &vecAngles ) { vecPos.Init(); vecAngles.Init(); CStudioHdr *pStudioHdr = GetStudioHdr(); if ( !pStudioHdr ) return; // assume that changes < -0.5 are loops.... if (m_cycle - prevcycle[0] < -0.5) { prevcycle[0] = prevcycle[0] - 1.0; } Studio_SeqMovement( pStudioHdr, m_sequence, prevcycle[0], m_cycle, m_poseparameter, vecPos, vecAngles ); prevcycle[0] = m_cycle; int i; for (i = 0; i < 4; i++) { Vector vecTmp; QAngle angTmp; if (m_Layer[i].m_cycle - prevcycle[i+1] < -0.5) { prevcycle[i+1] = prevcycle[i+1] - 1.0; } if (m_Layer[i].m_weight > 0.0) { vecTmp.Init(); angTmp.Init(); if (Studio_SeqMovement( pStudioHdr, m_Layer[i].m_sequence, prevcycle[i+1], m_Layer[i].m_cycle, m_poseparameter, vecTmp, angTmp )) { vecPos = vecPos * ( 1.0 - m_Layer[i].m_weight ) + vecTmp * m_Layer[i].m_weight; } } prevcycle[i+1] = m_Layer[i].m_cycle; } return; }