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(); } }
Vector WorldBarrelPosition( void ) { EntityMatrix tmp; tmp.InitFromEntity( this ); return tmp.LocalToWorld( m_barrelPos ); }