/* =============== idClipModel::RestoreTraceModels =============== */ void idClipModel::RestoreTraceModels( idRestoreGame *savefile ) { int i, num; ClearTraceModelCache(); savefile->ReadInt( num ); traceModelCache.SetNum( num ); for( i = 0; i < num; i++ ) { trmCache_t *entry = new trmCache_t; savefile->ReadTraceModel( entry->trm ); savefile->ReadFloat( entry->volume ); savefile->ReadVec3( entry->centerOfMass ); savefile->ReadMat3( entry->inertiaTensor ); entry->refCount = 0; traceModelCache[i] = entry; traceModelHash.Add( GetTraceModelHashKey( entry->trm ), i ); } }
/* =============== idClipModel::AllocTraceModel =============== */ int idClipModel::AllocTraceModel( const idTraceModel &trm ) { int i, hashKey, traceModelIndex; trmCache_t *entry; hashKey = GetTraceModelHashKey( trm ); for( i = traceModelHash.First( hashKey ); i >= 0; i = traceModelHash.Next( i ) ) { if( traceModelCache[i]->trm == trm ) { traceModelCache[i]->refCount++; return i; } } entry = new trmCache_t; entry->trm = trm; entry->trm.GetMassProperties( 1.0f, entry->volume, entry->centerOfMass, entry->inertiaTensor ); entry->refCount = 1; traceModelIndex = traceModelCache.Append( entry ); traceModelHash.Add( hashKey, traceModelIndex ); return traceModelIndex; }
/* =============== idClipModel::AllocTraceModel =============== */ int idClipModel::AllocTraceModel( const idTraceModel& trm, bool persistantThroughSaves ) { int i, hashKey, traceModelIndex; trmCache_t* entry; hashKey = GetTraceModelHashKey( trm ); if( persistantThroughSaves ) { // Look Inside the saved list. for( i = traceModelHash.First( hashKey ); i >= 0; i = traceModelHash.Next( i ) ) { if( traceModelCache[i]->trm == trm ) { traceModelCache[i]->refCount++; int flagged_index = i | TRACE_MODEL_SAVED; return flagged_index; } } } else { // Look inside the unsaved list. for( i = traceModelHash_Unsaved.First( hashKey ); i >= 0; i = traceModelHash_Unsaved.Next( i ) ) { if( traceModelCache_Unsaved[i]->trm == trm ) { traceModelCache_Unsaved[i]->refCount++; return i; } } } entry = new( TAG_PHYSICS_CLIP ) trmCache_t; entry->trm = trm; entry->trm.GetMassProperties( 1.0f, entry->volume, entry->centerOfMass, entry->inertiaTensor ); entry->refCount = 1; if( persistantThroughSaves ) { traceModelIndex = traceModelCache.Append( entry ); traceModelHash.Add( hashKey, traceModelIndex ); // Set the saved bit. traceModelIndex |= TRACE_MODEL_SAVED; } else { traceModelIndex = traceModelCache_Unsaved.Append( entry ); traceModelHash_Unsaved.Add( hashKey, traceModelIndex ); // remove the saved bit traceModelIndex &= ~TRACE_MODEL_SAVED; } return traceModelIndex; }