void GetPelletWorldCoords( int pelletIndex, Vector *worldPos, Vector *worldNormal ) { if ( worldPos ) { *worldPos = m_activePellets[pelletIndex].pellet->GetAbsOrigin(); } if ( worldNormal ) { if ( m_activePellets[pelletIndex].parent ) { EntityMatrix tmp; tmp.InitFromEntity( m_activePellets[pelletIndex].parent ); *worldNormal = tmp.LocalToWorldRotation( m_activePellets[pelletIndex].localNormal ); } else { *worldNormal = m_activePellets[pelletIndex].localNormal; } } }
void CPhysThruster::SetupForces( IPhysicsObject *pPhys, Vector &linear, AngularImpulse &angular ) { Vector forward; AngleVectors( GetLocalAngles(), &forward ); forward = forward * m_force; // multiply the force by mass (it's actually just an acceleration) if ( m_spawnflags & SF_THRUST_MASS_INDEPENDENT ) { forward = forward * pPhys->GetMass(); } EntityMatrix xform; xform.InitFromEntity( m_attachedObject ); Vector origin = xform.LocalToWorld( m_localOrigin ); forward = xform.LocalToWorldRotation( forward ); // Adjust for the position of the thruster -- apply proper torque) pPhys->CalculateVelocityOffset( forward, origin, linear, angular ); // Stay in local space always if this flag is set if ( m_spawnflags & SF_THRUST_LOCAL_ORIENTATION ) { linear = xform.WorldToLocalRotation( linear ); } if ( !(m_spawnflags & SF_THRUST_FORCE) ) { // clear out force linear.Init(); } if ( !(m_spawnflags & SF_THRUST_TORQUE) ) { // clear out torque angular.Init(); } }