00001
00002
00003
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef TA_DYNAMICOBJECTCAR_H
00015 #define TA_DYNAMICOBJECTCAR_H
00016
00017 #ifndef TA_DYNAMICOBJECT_H
00018 #include "DynamicObject.h"
00019 #endif // TA_DYNAMICOBJECT_H
00020
00021 TA_OBFUSCATION_SKIP_PASS_2
00022
00023 namespace TA
00024 {
00025
00026 class CollisionObjectCombo;
00027 class CarTemplate;
00028 class SurfaceAttribute;
00029
00030 class TAPHYSICS_CLASS DynamicObjectCar : public DynamicObject
00031 {
00032 public:
00033 enum WheelFlag
00034 {
00035 WHEEL_FLAG_STEERING = 0x1,
00036 WHEEL_FLAG_DRIVING = 0x2,
00037 WHEEL_FLAG_HAND_BRAKE_AFFECTED = 0x4,
00038 WHEEL_FLAG_CAMBER_CHANGED = 0x8,
00039 };
00040 TA_OBFUSCATION_RESERVED_ON
00041 struct Wheel
00042 {
00043 public:
00044 typedef float (TAC_CALL *FnSlipRatioToNormalisedTraction)(float fSlipRatio, const SurfaceAttribute& surfaceAttribute);
00045 typedef float (TAC_CALL *FnSlipAngleToLateralForce)(float fSlipAngle, float fLongitudinalSlipRatio, const SurfaceAttribute& surfaceAttribute);
00046
00047 const MFrame& GetLocalGraphicsFrame() const;
00048
00049 void SetRadius(float fRadius);
00050 float GetRadius() const;
00051
00052 void SetInvInertia(float fInvInertia);
00053 float GetInvInertia() const;
00054
00055 void SetBrakeTorque(float fBrakeTorque);
00056 float GetBrakeTorque() const;
00057
00058 void SetRollResistance(float fRollResistance);
00059 float GetRollResistance() const;
00060
00061 void SetSuspensionSpringConstant(float fSuspensionSpringConstant);
00062 float GetSuspensionSpringConstant() const;
00063
00064 void SetSuspensionDampingConstant(float fSuspensionDampingConstant);
00065 float GetSuspensionDampingConstant() const;
00066
00067 void SetSlipRatioToNormalisedTractionCallBack(FnSlipRatioToNormalisedTraction pCallBack);
00068 FnSlipRatioToNormalisedTraction GetSlipRatioToNormalisedTractionCallBack() const;
00069
00070 void SetSlipAngleToLateralForceCallBack(FnSlipAngleToLateralForce pCallBack);
00071 FnSlipAngleToLateralForce GetSlipAngleToLateralForceCallBack() const;
00072
00073 void SetSteeringFlag(bool bSteering);
00074 bool GetSteeringFlag() const;
00075
00076 void SetDrivingFlag(bool bDriving);
00077 bool GetDrivingFlag() const;
00078
00079 void SetHandBrakeFlag(bool bHandBrake);
00080 bool GetHandBrakeFlag() const;
00081
00082 void SetYaw(float fYaw);
00083 float GetYaw() const;
00084
00085 void SetPitch(float fPitch);
00086 float GetPitch() const;
00087
00088 void SetPitchVelocity(float fPitchVelocity);
00089 float GetPitchVelocity() const;
00090
00091 void SetCamberAngle(float fCamberAngle);
00092 float GetCamberAngle() const;
00093
00094 TA_OBFUSCATION_RESERVED_OFF
00095
00096 private:
00097 friend class DynamicObjectCar;
00098
00099 MFrame m_localGraphicsFrame;
00100 Mat33 m_m33DefaultRotation;
00101 Mat33 m_m33TotalRotation;
00102 Vec3 m_v3AccumulatedImpulse;
00103 float m_fRadius;
00104 float m_fInvRadius;
00105 float m_fPitchVelocity;
00106 float m_fPitch;
00107 float m_fCamberAngle;
00108 float m_fYaw;
00109 float m_fRollResistance;
00110 float m_fBrakeTorque;
00111 float m_fInvInertia;
00112 float m_fSuspensionSpringConstant;
00113 float m_fSuspensionDampingConstant;
00114 float (TAC_CALL *m_pFnSlipRatioToNormalisedTraction)(float fSlipRatio, const SurfaceAttribute& surfaceAttribute);
00115 float (TAC_CALL *m_pFnSlipAngleToLateralForce)(float fSlipAngle, float fLongitudinalSlipRatio, const SurfaceAttribute& surfaceAttribute);
00116 u32 m_nFlags;
00117 };
00118
00119 TA_OBFUSCATION_RESERVED_ON
00121
00122 void Initialise(CarTemplate* pCarTemplate);
00123 void Initialise(const Char* szFileName);
00124 void Finalise();
00126
00128
00129 virtual void Update(float fDt);
00130
00131 void ClearControls();
00132 void UpdateControls(
00133 float fSteeringAngle,
00134 float fAccelerator,
00135 float fBrake,
00136 float fHandBrake,
00137 float fSteeringHelp,
00138 float fTractionControl,
00139 int nGear = -1);
00141
00142
00144
00145 float GetRPM() const;
00146 int GetGear() const;
00147 int GetNumGears() const;
00148 float GetCarSpeedFromWheels();
00149
00150 void SetTorqueMultiplier(float fTorqueMultiplier);
00151 float GetTorqueMultiplier() const;
00152
00153 void SetAntiRollFudge(float fAntiRollFudge);
00154 float GetAntiRollFudge() const;
00155 const Wheel& GetWheel(int nIndex) const;
00156 Wheel& GetWheel(int nIndex);
00157 int GetNumWheels() const;
00158
00159 void SetOrientation(const Vec3& v3Forward, const Vec3& v3Up);
00160 const Vec3& GetForward() const;
00161 const Vec3& GetUp() const;
00163
00164 static DynamicObjectCar* TAC_CALL CreateNew();
00165
00166 protected:
00167 DynamicObjectCar();
00168 ~DynamicObjectCar();
00169
00170 TA_OBFUSCATION_RESERVED_OFF
00171
00172 private:
00173 struct Controls
00174 {
00175 float fSteeringAngle;
00176 float fAccelerator;
00177 float fBrake;
00178 float fHandBrake;
00179 float fSteeringHelp;
00180 float fTractionControl;
00181 int nGear;
00182 };
00183
00184 Controls m_controls;
00185 Vec3 m_v3Forward;
00186 Vec3 m_v3Up;
00187 Array<Wheel, false> m_wheelArray;
00188
00189 int m_nCurrentGear;
00190
00191 float m_fEngineRadsPerSec;
00192 float m_fInvNumDrivingWheels;
00193
00194 Array<float, false> m_gearRatioArray;
00195 float m_fDifferentialRatio;
00196 float m_fTransmissionEfficiency;
00197 float m_fTorqueMultiplier;
00198 float m_fAntiRollFudge;
00199 float (TAC_CALL *m_pFnTorqueCurve)(float fRadsPerSec);
00200
00201 float m_fAirResistance;
00202 float m_fDownForce;
00203
00204 void InitialiseCommon();
00205 void UpdateDefaultWheelRotation(Wheel& wheel);
00206 };
00207
00208 }
00209
00210 #include "DynamicObjectCar.inl"
00211
00212 #endif // TA_DYNAMICOBJECTCAR_H
© Copyright 2004-2006 TRUE AXIS PTY LTD Australia. All rights reserved.