Files
FC1/CryPhysics/wheeledvehicleentity.h
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

115 lines
3.8 KiB
C++

//////////////////////////////////////////////////////////////////////
//
// Wheeled Vehicle Entity header
//
// File: wheeledvehicleentity.h
// Description : CWheeledVehicleEntity class declaration
//
// History:
// -:Created by Anton Knyazev
//
//////////////////////////////////////////////////////////////////////
#ifndef wheeledvehicleentity_h
#define wheeledvehicleentity_h
#pragma once
struct suspension_point {
int bDriving; // if the corresponding wheel a driving wheel
int iAxle;
vectorf pt; // the uppermost suspension point in car frame
float fullen; // unconstrained length
float kStiffness; // stiffness coefficient
float kDamping,kDamping0; // damping coefficient
float len0; // initial length in model
float Mpt; // hull "mass" at suspension upper point along suspension direction
quaternionf q0; // used to calculate geometry transformation from wheel transformation
vectorf pos0,ptc0; // ...
float Iinv;
float minFriction,maxFriction;
int flags0,flagsCollider0;
int bCanBrake;
int iBuddy;
float r,rinv; // wheel radius, 1.0/radius
float width;
float curlen; // current length
float steer; // steering angle
float rot; // current wheel rotation angle
float w; // current rotation speed
float wa; // current angular acceleration
float T; // wheel's net torque
float prevTdt;
float prevw;
vectorf ncontact,ptcontact; // filled in RegisterPendingCollisions
int bSlip,bSlipPull;
int bContact;
int surface_idx[2];
vectorf vrel;
vectorf rworld;
float vworld;
float PN;
RigidBody *pbody;
CPhysicalEntity *pent;
int ipart;
};
class CWheeledVehicleEntity : public CRigidEntity, public IRigidBodyOwner {
public:
CWheeledVehicleEntity(CPhysicalWorld *pworld);
virtual pe_type GetType() { return PE_WHEELEDVEHICLE; }
virtual int SetParams(pe_params*);
virtual int GetParams(pe_params*);
virtual int Action(pe_action*);
virtual int GetStatus(pe_status*);
enum snapver { SNAPSHOT_VERSION = 1 };
virtual int GetSnapshotVersion() { return SNAPSHOT_VERSION; }
virtual int GetStateSnapshot(class CStream &stm, float time_back=0, int flags=0);
virtual int SetStateFromSnapshot(class CStream &stm, int flags=0);
virtual int AddGeometry(phys_geometry *pgeom, pe_geomparams* params,int id=-1);
virtual void RemoveGeometry(int id);
virtual float GetMaxTimeStep(float time_interval);
virtual float GetDamping(float time_interval);
virtual void CheckAdditionalGeometry(float time_interval, masktype &contact_mask);
virtual int HasContactsWith(CPhysicalEntity *pent);
virtual void AddAdditionalImpulses(float time_interval);
virtual int Update(float time_interval, float damping);
virtual void ComputeBBox();
//virtual RigidBody *GetRigidBody(int ipart=-1) { return &m_bodyStatic; }
virtual void AddImpulseAtContact(entity_contact *pcontact, int iop, const vectorf &dP) {};
virtual vectorf GetVelocityAtContact(entity_contact *pcontact, int iop) { return vectorf(zero); };
virtual int OnRegisterContact(entity_contact *pcontact, int iop);
virtual void OnSolverEvent(int iEvent) {};
virtual void GetMemoryStatistics(ICrySizer *pSizer);
void UpdateWheelsGeoms();
void RecalcSuspStiffness();
float ComputeDrivingTorque(float time_interval);
suspension_point m_susp[8];
float m_enginePower,m_maxSteer;
float m_engineMaxw,m_engineMinw,m_engineIdlew,m_engineShiftUpw,m_engineShiftDownw,m_gearDirSwitchw,m_engineStartw;
float m_axleFriction,m_brakeTorque,m_clutchSpeed,m_maxBrakingFriction,m_kDynFriction,m_slipThreshold;
float m_kStabilizer;
float m_enginePedal,m_steer,m_clutch,m_wengine;
float m_gears[8];
int m_nGears,m_iCurGear;
int m_bHandBrake;
int m_nHullParts;
int m_iIntegrationType;
float m_EminRigid,m_EminVehicle;
float m_maxAllowedStepVehicle,m_maxAllowedStepRigid;
float m_dampingVehicle;
vectorf m_Ffriction,m_Tfriction;
float m_timeNoContacts;
int m_nContacts,m_bHasContacts;
};
#endif