//----------------------------------------------------------------------------- // Purpose: // Input : *pEntity - // modelIndex - // &origin - // &angles - // *pSolid - // Output : IPhysicsObject //----------------------------------------------------------------------------- IPhysicsObject *PhysModelCreate( CBaseEntity *pEntity, int modelIndex, const Vector &origin, const QAngle &angles, solid_t *pSolid ) { vcollide_t *pCollide = modelinfo->GetVCollide( modelIndex ); if ( !pCollide || !pCollide->solidCount ) return NULL; solid_t tmpSolid; if ( !pSolid ) { pSolid = &tmpSolid; if ( !PhysModelParseSolidByIndex( tmpSolid, pEntity, pCollide, -1 ) ) return NULL; } int surfaceProp = -1; if ( pSolid->surfaceprop[0] ) { surfaceProp = physprops->GetSurfaceIndex( pSolid->surfaceprop ); } IPhysicsObject *pObject = physenv->CreatePolyObject( pCollide->solids[pSolid->index], surfaceProp, origin, angles, &pSolid->params ); //PhysCheckAdd( pObject, STRING(pEntity->m_iClassname) ); if ( pObject ) { if ( modelinfo->GetModelType(modelinfo->GetModel(modelIndex)) == mod_brush ) { unsigned int contents = modelinfo->GetModelContents( modelIndex ); Assert(contents!=0); // HACKHACK: contents is used to filter collisions // HACKHACK: So keep solid on for water brushes since they should pass collision rules (as triggers) if ( contents & MASK_WATER ) { contents |= CONTENTS_SOLID; } if ( contents != pObject->GetContents() && contents != 0 ) { pObject->SetContents( contents ); pObject->RecheckCollisionFilter(); } } g_pPhysSaveRestoreManager->AssociateModel( pObject, modelIndex); } return pObject; }
//----------------------------------------------------------------------------- // Purpose: // Input : *pEntity - // modelIndex - // &origin - // &angles - // Output : IPhysicsObject //----------------------------------------------------------------------------- IPhysicsObject *PhysModelCreateUnmoveable( CBaseEntity *pEntity, int modelIndex, const Vector &origin, const QAngle &angles ) { vcollide_t *pCollide = modelinfo->GetVCollide( modelIndex ); if ( !pCollide || !pCollide->solidCount ) return NULL; solid_t solid; if ( !PhysModelParseSolidByIndex( solid, pEntity, pCollide, -1 ) ) return NULL; // collisions are off by default solid.params.enableCollisions = true; //solid.params.mass = 1.0; int surfaceProp = -1; if ( solid.surfaceprop[0] ) { surfaceProp = physprops->GetSurfaceIndex( solid.surfaceprop ); } solid.params.pGameData = static_cast<void *>(pEntity); solid.params.pName = STRING(pEntity->GetModelName()); IPhysicsObject *pObject = physenv->CreatePolyObjectStatic( pCollide->solids[0], surfaceProp, origin, angles, &solid.params ); //PhysCheckAdd( pObject, STRING(pEntity->m_iClassname) ); if ( pObject ) { if ( modelinfo->GetModelType(modelinfo->GetModel(modelIndex)) == mod_brush ) { unsigned int contents = modelinfo->GetModelContents( modelIndex ); Assert(contents!=0); if ( contents != pObject->GetContents() && contents != 0 ) { pObject->SetContents( contents ); pObject->RecheckCollisionFilter(); } } g_pPhysSaveRestoreManager->AssociateModel( pObject, modelIndex); } return pObject; }