void CPhysicsObject::CalculateVelocityOffset( const Vector &forceVector, const Vector &worldPosition, Vector ¢erVelocity, AngularImpulse ¢erAngularVelocity ) { IVP_U_Point pos; IVP_U_Float_Point force; ConvertForceImpulseToIVP( forceVector, force ); ConvertPositionToIVP( worldPosition, pos ); IVP_Core *core = m_pObject->get_core(); const IVP_U_Matrix *m_world_f_core = core->get_m_world_f_core_PSI(); IVP_U_Float_Point point_d_ws; point_d_ws.subtract(&pos, m_world_f_core->get_position()); IVP_U_Float_Point cross_point_dir; cross_point_dir.calc_cross_product( &point_d_ws, &force); m_world_f_core->inline_vimult3( &cross_point_dir, &cross_point_dir); cross_point_dir.set_pairwise_mult( &cross_point_dir, core->get_inv_rot_inertia()); ConvertAngularImpulseToHL( cross_point_dir, centerAngularVelocity ); force.set_multiple( &force, core->get_inv_mass() ); ConvertForceImpulseToHL( force, centerVelocity ); }
void ConvertShadowControllerToHL( const shadowcontrol_params_t &in, hlshadowcontrol_params_t &out ) { ConvertPositionToHL( in.targetPosition, out.targetPosition ); ConvertRotationToHL( in.targetRotation, out.targetRotation ); out.teleportDistance = ConvertDistanceToHL( in.teleportDistance ); ConvertForceImpulseToHL( in.maxSpeed, out.maxSpeed); VectorAbs( out.maxSpeed, out.maxSpeed ); ConvertAngularImpulseToHL( in.maxAngular, out.maxAngular ); VectorAbs( out.maxAngular, out.maxAngular ); out.dampFactor = in.dampFactor; }
// Output passed to ApplyForceCenter/ApplyTorqueCenter void CPhysicsObject::CalculateForceOffset(const Vector &forceVector, const Vector &worldPosition, Vector *centerForce, AngularImpulse *centerTorque) const { if (!centerForce && !centerTorque) return; btVector3 pos, force; ConvertPosToBull(worldPosition, pos); ConvertForceImpulseToBull(forceVector, force); pos = pos - m_pObject->getWorldTransform().getOrigin(); btVector3 cross = pos.cross(force); if (centerForce) { ConvertForceImpulseToHL(force, *centerForce); } if (centerTorque) { ConvertAngularImpulseToHL(cross, *centerTorque); } }
void CPhysicsObject::CalculateForceOffset( const Vector &forceVector, const Vector &worldPosition, Vector ¢erForce, AngularImpulse ¢erTorque ) { IVP_U_Point pos; IVP_U_Float_Point force; ConvertPositionToIVP( forceVector, force ); ConvertPositionToIVP( worldPosition, pos ); IVP_Core *core = m_pObject->get_core(); const IVP_U_Matrix *m_world_f_core = core->get_m_world_f_core_PSI(); IVP_U_Float_Point point_d_ws; point_d_ws.subtract(&pos, m_world_f_core->get_position()); IVP_U_Float_Point cross_point_dir; cross_point_dir.calc_cross_product( &point_d_ws, &force); m_world_f_core->inline_vimult3( &cross_point_dir, &cross_point_dir); ConvertAngularImpulseToHL( cross_point_dir, centerTorque ); ConvertForceImpulseToHL( force, centerForce ); }
// Thrusters call this and pass output to AddVelocity void CPhysicsObject::CalculateVelocityOffset(const Vector &forceVector, const Vector &worldPosition, Vector *centerVelocity, AngularImpulse *centerAngularVelocity) const { if (!centerVelocity && !centerAngularVelocity) return; btVector3 force, pos; ConvertForceImpulseToBull(forceVector, force); ConvertPosToBull(worldPosition, pos); pos = pos - m_pObject->getWorldTransform().getOrigin(); btVector3 cross = pos.cross(force); // cross.set_pairwise_mult( &cross, core->get_inv_rot_inertia()); // Linear velocity if (centerVelocity) { force *= m_pObject->getInvMass(); ConvertForceImpulseToHL(force, *centerVelocity); } if (centerAngularVelocity) { ConvertAngularImpulseToHL(cross, *centerAngularVelocity); } }
void CPlayerController::GetLastImpulse(Vector *pOut) { if (!pOut) return; ConvertForceImpulseToHL(m_lastImpulse, *pOut); }