historical/toontown-classic.git/panda/include/bulletVehicle.h
2024-01-16 11:20:27 -06:00

140 lines
4 KiB
C++

/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file bulletVehicle.h
* @author enn0x
* @date 2010-02-16
*/
#ifndef __BULLET_VEHICLE_H__
#define __BULLET_VEHICLE_H__
#include "pandabase.h"
#include "bullet_includes.h"
#include "bullet_utils.h"
#include "typedReferenceCount.h"
#include "luse.h"
class BulletWorld;
class BulletRigidBodyNode;
class BulletWheel;
/**
*
*/
class EXPCL_PANDABULLET BulletVehicleTuning {
PUBLISHED:
void set_suspension_stiffness(PN_stdfloat value);
void set_suspension_compression(PN_stdfloat value);
void set_suspension_damping(PN_stdfloat value);
void set_max_suspension_travel_cm(PN_stdfloat value);
void set_friction_slip(PN_stdfloat value);
void set_max_suspension_force(PN_stdfloat value);
PN_stdfloat get_suspension_stiffness() const;
PN_stdfloat get_suspension_compression() const;
PN_stdfloat get_suspension_damping() const;
PN_stdfloat get_max_suspension_travel_cm() const;
PN_stdfloat get_friction_slip() const;
PN_stdfloat get_max_suspension_force() const;
MAKE_PROPERTY(suspension_stiffness, get_suspension_stiffness, set_suspension_stiffness);
MAKE_PROPERTY(suspension_compression, get_suspension_compression, set_suspension_compression);
MAKE_PROPERTY(suspension_damping, get_suspension_damping, set_suspension_damping);
MAKE_PROPERTY(max_suspension_travel_cm, get_max_suspension_travel_cm, set_max_suspension_travel_cm);
MAKE_PROPERTY(friction_slip, get_friction_slip, set_friction_slip);
MAKE_PROPERTY(max_suspension_force, get_max_suspension_force, set_max_suspension_force);
private:
btRaycastVehicle::btVehicleTuning _;
friend class BulletVehicle;
};
/**
* Simulates a raycast vehicle which casts a ray per wheel at the ground as a
* cheap replacement for complex suspension simulation. The suspension can be
* tuned in various ways. It is possible to add a (probably) arbitrary number
* of wheels.
*/
class EXPCL_PANDABULLET BulletVehicle : public TypedReferenceCount {
PUBLISHED:
BulletVehicle(BulletWorld *world, BulletRigidBodyNode *chassis);
INLINE ~BulletVehicle();
void set_coordinate_system(BulletUpAxis up);
void set_steering_value(PN_stdfloat steering, int idx);
void set_brake(PN_stdfloat brake, int idx);
void set_pitch_control(PN_stdfloat pitch);
BulletRigidBodyNode *get_chassis();
PN_stdfloat get_current_speed_km_hour() const;
PN_stdfloat get_steering_value(int idx) const;
LVector3 get_forward_vector() const;
void reset_suspension();
void apply_engine_force(PN_stdfloat force, int idx);
// Wheels
BulletWheel create_wheel(PN_stdfloat suspension_rest_length=0.4);
int get_num_wheels() const;
BulletWheel get_wheel(int idx) const;
MAKE_SEQ(get_wheels, get_num_wheels, get_wheel);
// Tuning
INLINE BulletVehicleTuning &get_tuning();
MAKE_PROPERTY(chassis, get_chassis);
MAKE_PROPERTY(current_speed_km_hour, get_current_speed_km_hour);
MAKE_PROPERTY(forward_vector, get_forward_vector);
MAKE_SEQ_PROPERTY(wheels, get_num_wheels, get_wheel);
MAKE_PROPERTY(tuning, get_tuning);
public:
INLINE btRaycastVehicle *get_vehicle() const;
BulletRigidBodyNode *do_get_chassis();
void do_sync_b2p();
private:
btRaycastVehicle *_vehicle;
btVehicleRaycaster *_raycaster;
BulletVehicleTuning _tuning;
static btVector3 get_axis(int idx);
public:
static TypeHandle get_class_type() {
return _type_handle;
}
static void init_type() {
TypedReferenceCount::init_type();
register_type(_type_handle, "BulletVehicle",
TypedReferenceCount::get_class_type());
}
virtual TypeHandle get_type() const {
return get_class_type();
}
virtual TypeHandle force_init_type() {
init_type();
return get_class_type();
}
private:
static TypeHandle _type_handle;
};
#include "bulletVehicle.I"
#endif // __BULLET_VEHICLE_H__