#ifndef CAROBJECT_H #define CAROBJECT_H #include #include #include #include #include "worldobject.h" class CarObject : public WorldObject { public: CarObject(ssgEntity *bodymodel, ssgEntity *wheelmodel, ssgEntity *licplatemodel, dWorldID world, dSpaceID bigspace, sgVec3 initialpos); virtual ~CarObject(); void Recover(float dt); void Simulate(float dt); void Sustain(float dt); void SetAccelerator(float v) { accelerator=v; } void SetSteer(float v) { steer = v; } void SetBrake(float v) { brake = v; } void SetEBrake(bool b) { ebrake = b; } float GetAccelerator(void) { return accelerator; } float GetBrake(void) { return brake; } void SetAction(bool a) { action = a; } bool GetAction(void) { return action; } ssgTransform *GetTransform(void) { return chassis_trf; } void GetPos(sgVec3 dst) const { sgMat4 m; chassis_trf->getTransform(m); sgCopyVec3(dst, m[3]); } float GetWheelVelocity(void); bool IsBackWheelGeometry(dGeomID id) { return id==wheel_geoms[2] || id==wheel_geoms[3]; } void SetGroundBody(dBodyID id) { ground_body = id; } bool IsStationary(void) const; protected: ssgTransform *chassis_trf; ssgTransform *sink_trf; // for lowering center of mass ssgTransform *wheel_trfs[4]; dSpaceID space; dBodyID chassis_body; dBodyID wheel_bodies[4]; dGeomID chassis_geom; dGeomID transform_geom; dGeomID wheel_geoms[4]; dJointID joint[4]; // joint[0..1] are the front wheels float accelerator; float brake; float steer; float downtime; float stationarytime; bool action; bool reversegear; bool ebrake; dBodyID ground_body; }; #endif