141 lines
4 KiB
C
141 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__
|