void CGrabController::OnRestore() { if ( m_controller ) { m_controller->SetEventHandler( this ); } }
void CPhysForce::OnRestore( ) { BaseClass::OnRestore(); if ( m_pController ) { m_pController->SetEventHandler( &m_integrator ); } }
//----------------------------------------------------------------------------- // Purpose: Restore the motion controller //----------------------------------------------------------------------------- void CASWEnvShake::OnRestore( void ) { BaseClass::OnRestore(); if ( m_pShakeController ) { m_pShakeController->SetEventHandler( &m_shakeCallback ); } }
void RestoreBlock( IRestore *pRestore, const PhysObjectHeader_t &header ) { CBaseEntity * pOwner = header.hEntity.Get(); unsigned short iQueued = m_QueuedRestores.Find( pOwner ); if ( iQueued != m_QueuedRestores.InvalidIndex() ) { MDLCACHE_CRITICAL_SECTION(); if ( pOwner->ShouldSavePhysics() && header.nObjects > 0 ) { QueuedItem_t *pItem = m_QueuedRestores[iQueued]->FindItem( header.fieldName ); if ( pItem ) { int nObjects = MIN( header.nObjects, pItem->header.nObjects ); if ( pItem->header.type == PIID_IPHYSICSOBJECT && nObjects == 1 ) { RestorePhysicsObjectAndModel( pRestore, header, pItem, nObjects ); } else { void **ppPhysObj = pItem->ppPhysObj; for ( int i = 0; i < nObjects; i++ ) { pRestore->StartBlock(); RestorePhysicsObject( pRestore, header, ppPhysObj + i ); pRestore->EndBlock(); if ( header.type == PIID_IPHYSICSMOTIONCONTROLLER ) { void *pObj = ppPhysObj[i]; IPhysicsMotionController *pController = (IPhysicsMotionController *)pObj; if ( pController ) { // If the entity is the motion callback handler, then automatically set it // NOTE: This is usually the case IMotionEvent *pEvent = dynamic_cast<IMotionEvent *>(pOwner); if ( pEvent ) { pController->SetEventHandler( pEvent ); } } } } } } } else pOwner->CreateVPhysics(); } }
void CPhysMotor::Activate( void ) { BaseClass::Activate(); // This gets called after all objects spawn and after all objects restore if ( m_attachedObject == NULL ) { CBaseEntity *pAttach = gEntList.FindEntityByName( NULL, m_nameAttach, NULL ); if ( pAttach && pAttach->GetMoveType() == MOVETYPE_VPHYSICS ) { m_attachedObject = pAttach; IPhysicsObject *pPhys = m_attachedObject->VPhysicsGetObject(); CalculateAcceleration(); matrix3x4_t matrix; pPhys->GetPositionMatrix( matrix ); Vector motorAxis_ls; VectorIRotate( m_motor.m_axis, matrix, motorAxis_ls ); float inertia = DotProductAbs( pPhys->GetInertia(), motorAxis_ls ); m_motor.m_maxTorque = inertia * m_motor.m_inertiaFactor * (m_angularAcceleration + m_additionalAcceleration); m_motor.m_restistanceDamping = 1.0f; } } if ( m_attachedObject ) { IPhysicsObject *pPhys = m_attachedObject->VPhysicsGetObject(); // create a hinge constraint for this object? if ( m_spawnflags & SF_MOTOR_HINGE ) { // UNDONE: Don't do this on restore? if ( !m_pHinge ) { constraint_hingeparams_t hingeParams; hingeParams.Defaults(); hingeParams.worldAxisDirection = m_motor.m_axis; hingeParams.worldPosition = GetLocalOrigin(); m_pHinge = physenv->CreateHingeConstraint( g_PhysWorldObject, pPhys, NULL, hingeParams ); m_pHinge->SetGameData( (void *)this ); } if ( m_spawnflags & SF_MOTOR_NOCOLLIDE ) { physenv->DisableCollisions( pPhys, g_PhysWorldObject ); } } else { m_pHinge = NULL; } // NOTE: On restore, this path isn't run because m_pController will not be NULL if ( !m_pController ) { m_pController = physenv->CreateMotionController( &m_motor ); m_pController->AttachObject( m_attachedObject->VPhysicsGetObject() ); if ( m_spawnflags & SF_MOTOR_START_ON ) { TurnOn(); } } } // Need to do this on restore since there's no good way to save this if ( m_pController ) { m_pController->SetEventHandler( &m_motor ); } }