285 lines
9.7 KiB
C++
285 lines
9.7 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 physxScene.h
|
|
* @author enn0x
|
|
* @date 2009-09-14
|
|
*/
|
|
|
|
#ifndef PHYSXSCENE_H
|
|
#define PHYSXSCENE_H
|
|
|
|
#include "pandabase.h"
|
|
#include "luse.h"
|
|
#include "callbackObject.h"
|
|
|
|
#include "physxObject.h"
|
|
#include "physxObjectCollection.h"
|
|
#include "physxEnums.h"
|
|
#include "physxContactReport.h"
|
|
#include "physxControllerReport.h"
|
|
#include "physxTriggerReport.h"
|
|
#include "physxOverlapReport.h"
|
|
#include "physxMask.h"
|
|
#include "physxGroupsMask.h"
|
|
#include "physx_includes.h"
|
|
|
|
class PhysxActor;
|
|
class PhysxActorDesc;
|
|
class PhysxController;
|
|
class PhysxControllerDesc;
|
|
class PhysxConstraintDominance;
|
|
class PhysxDebugGeomNode;
|
|
class PhysxForceField;
|
|
class PhysxForceFieldDesc;
|
|
class PhysxForceFieldShapeGroup;
|
|
class PhysxForceFieldShapeGroupDesc;
|
|
class PhysxJoint;
|
|
class PhysxJointDesc;
|
|
class PhysxMaterial;
|
|
class PhysxMaterialDesc;
|
|
class PhysxOverlapReport;
|
|
class PhysxRay;
|
|
class PhysxRaycastHit;
|
|
class PhysxRaycastReport;
|
|
class PhysxSceneStats2;
|
|
class PhysxVehicle;
|
|
class PhysxVehicleDesc;
|
|
class PhysxCloth;
|
|
class PhysxClothDesc;
|
|
class PhysxSoftBody;
|
|
class PhysxSoftBodyDesc;
|
|
|
|
/**
|
|
* A scene is a collection of bodies, constraints, and effectors which can
|
|
* interact.
|
|
*
|
|
* The scene simulates the behavior of these objects over time. Several
|
|
* scenes may exist at the same time, but each body, constraint, or effector
|
|
* object is specific to a scene -- they may not be shared.
|
|
*
|
|
* For example, attempting to create a joint in one scene and then using it to
|
|
* attach bodies from a different scene results in undefined behavior.
|
|
*/
|
|
class EXPCL_PANDAPHYSX PhysxScene : public PhysxObject, public PhysxEnums {
|
|
|
|
PUBLISHED:
|
|
INLINE PhysxScene();
|
|
INLINE ~PhysxScene();
|
|
|
|
void simulate(float dt);
|
|
void fetch_results();
|
|
void set_timing_variable();
|
|
void set_timing_fixed(float maxTimestep=1.0f/60.0f, unsigned int maxIter=8);
|
|
|
|
PhysxDebugGeomNode *get_debug_geom_node();
|
|
|
|
void enable_contact_reporting(bool enabled);
|
|
bool is_contact_reporting_enabled() const;
|
|
void enable_trigger_reporting(bool enabled);
|
|
bool is_trigger_reporting_enabled() const;
|
|
void enable_controller_reporting(bool enabled);
|
|
bool is_controller_reporting_enabled() const;
|
|
|
|
INLINE void set_controller_shape_hit_callback(PT(CallbackObject) cbobj);
|
|
INLINE void set_controller_controller_hit_callback(PT(CallbackObject) cbobj);
|
|
|
|
void set_gravity(const LVector3f &gravity);
|
|
|
|
LVector3f get_gravity() const;
|
|
PhysxSceneStats2 get_stats2() const;
|
|
bool get_flag(PhysxSceneFlag flag) const;
|
|
bool is_hardware_scene() const;
|
|
|
|
// Actors
|
|
unsigned int get_num_actors() const;
|
|
PhysxActor *create_actor(PhysxActorDesc &desc);
|
|
PhysxActor *get_actor(unsigned int idx) const;
|
|
MAKE_SEQ(get_actors, get_num_actors, get_actor);
|
|
|
|
// Joints
|
|
unsigned int get_num_joints() const;
|
|
PhysxJoint *create_joint(PhysxJointDesc &desc);
|
|
PhysxJoint *get_joint(unsigned int idx) const;
|
|
MAKE_SEQ(get_joints, get_num_joints, get_joint);
|
|
|
|
// Materials
|
|
unsigned int get_num_materials() const;
|
|
unsigned int get_hightest_material_index() const;
|
|
PhysxMaterial *create_material(PhysxMaterialDesc &desc);
|
|
PhysxMaterial *create_material();
|
|
PhysxMaterial *get_material(unsigned int idx) const;
|
|
PhysxMaterial *get_material_from_index(unsigned int idx) const;
|
|
MAKE_SEQ(get_materials, get_num_materials, get_material);
|
|
|
|
// Controllers
|
|
unsigned int get_num_controllers() const;
|
|
PhysxController *create_controller(PhysxControllerDesc &controllerDesc);
|
|
PhysxController *get_controller(unsigned int idx) const;
|
|
MAKE_SEQ(get_controllers, get_num_controllers, get_controller);
|
|
|
|
// Force fields
|
|
unsigned int get_num_force_fields() const;
|
|
PhysxForceField *create_force_field(PhysxForceFieldDesc &desc);
|
|
PhysxForceField *get_force_field(unsigned int idx) const;
|
|
MAKE_SEQ(get_force_fields, get_num_force_fields, get_force_field);
|
|
|
|
// Force field shape groups
|
|
unsigned int get_num_force_field_shape_groups() const;
|
|
PhysxForceFieldShapeGroup *create_force_field_shape_group(PhysxForceFieldShapeGroupDesc &desc);
|
|
PhysxForceFieldShapeGroup *get_force_field_shape_group(unsigned int idx) const;
|
|
MAKE_SEQ(get_force_field_shape_groups, get_num_force_field_shape_groups, get_force_field_shape_group);
|
|
|
|
// Cloths
|
|
unsigned int get_num_cloths() const;
|
|
PhysxCloth *create_cloth(PhysxClothDesc &desc);
|
|
PhysxCloth *get_cloth(unsigned int idx) const;
|
|
MAKE_SEQ(get_cloths, get_num_cloths, get_cloth);
|
|
|
|
// Soft bodies
|
|
unsigned int get_num_soft_bodies() const;
|
|
PhysxSoftBody *create_soft_body(PhysxSoftBodyDesc &desc);
|
|
PhysxSoftBody *get_soft_body(unsigned int idx) const;
|
|
MAKE_SEQ(get_soft_bodies, get_num_soft_bodies, get_soft_body);
|
|
|
|
// Vehicles
|
|
unsigned int get_num_vehicles() const;
|
|
PhysxVehicle *create_vehicle(PhysxVehicleDesc &desc);
|
|
PhysxVehicle *get_vehicle(unsigned int idx) const;
|
|
MAKE_SEQ(get_vehicles, get_num_vehicles, get_vehicle);
|
|
|
|
// Raycast queries
|
|
bool raycast_any_shape(const PhysxRay &ray,
|
|
PhysxShapesType shapesType=ST_all,
|
|
PhysxMask mask=PhysxMask::all_on(),
|
|
PhysxGroupsMask *groups=NULL) const;
|
|
|
|
PhysxRaycastHit raycast_closest_shape(const PhysxRay &ray,
|
|
PhysxShapesType shapesType=ST_all,
|
|
PhysxMask mask=PhysxMask::all_on(),
|
|
PhysxGroupsMask *groups=NULL, bool smoothNormal=true) const;
|
|
|
|
PhysxRaycastReport raycast_all_shapes(const PhysxRay &ray,
|
|
PhysxShapesType shapesType=ST_all,
|
|
PhysxMask mask=PhysxMask::all_on(),
|
|
PhysxGroupsMask *groups=NULL, bool smoothNormal=true) const;
|
|
|
|
bool raycast_any_bounds(const PhysxRay &ray,
|
|
PhysxShapesType shapesType=ST_all,
|
|
PhysxMask mask=PhysxMask::all_on(),
|
|
PhysxGroupsMask *groups=NULL) const;
|
|
|
|
PhysxRaycastHit raycast_closest_bounds(const PhysxRay &ray,
|
|
PhysxShapesType shapesType=ST_all,
|
|
PhysxMask mask=PhysxMask::all_on(),
|
|
PhysxGroupsMask *groups=NULL, bool smoothNormal=true) const;
|
|
|
|
PhysxRaycastReport raycast_all_bounds(const PhysxRay &ray,
|
|
PhysxShapesType shapesType=ST_all,
|
|
PhysxMask mask=PhysxMask::all_on(),
|
|
PhysxGroupsMask *groups=NULL, bool smoothNormal=true) const;
|
|
|
|
// Overlap queries
|
|
PhysxOverlapReport overlap_sphere_shapes(const LPoint3f ¢er, float radius,
|
|
PhysxShapesType shapesType=ST_all,
|
|
PhysxMask mask=PhysxMask::all_on(), bool accurateCollision=true) const;
|
|
|
|
PhysxOverlapReport overlap_capsule_shapes(const LPoint3f &p0, const LPoint3f &p1, float radius,
|
|
PhysxShapesType shapesType=ST_all,
|
|
PhysxMask mask=PhysxMask::all_on(), bool accurateCollision=true) const;
|
|
|
|
// Filters
|
|
void set_actor_pair_flag(PhysxActor &actorA, PhysxActor &actorB, PhysxContactPairFlag flag, bool value);
|
|
void set_shape_pair_flag(PhysxShape &shapeA, PhysxShape &shapeB, bool value);
|
|
void set_actor_group_pair_flag(unsigned int g1, unsigned int g2, PhysxContactPairFlag flag, bool value);
|
|
void set_group_collision_flag(unsigned int g1, unsigned int g2, bool enable);
|
|
void set_filter_ops(PhysxFilterOp op0, PhysxFilterOp op1, PhysxFilterOp op2);
|
|
void set_filter_bool(bool flag);
|
|
void set_filter_constant0(const PhysxGroupsMask &mask);
|
|
void set_filter_constant1(const PhysxGroupsMask &mask);
|
|
void set_dominance_group_pair(unsigned int g1, unsigned int g2, PhysxConstraintDominance dominance);
|
|
|
|
bool get_actor_pair_flag(PhysxActor &actorA, PhysxActor &actorB, PhysxContactPairFlag flag);
|
|
bool get_shape_pair_flag(PhysxShape &shapeA, PhysxShape &shapeB);
|
|
bool get_actor_group_pair_flag(unsigned int g1, unsigned int g2, PhysxContactPairFlag flag);
|
|
bool get_group_collision_flag(unsigned int g1, unsigned int g2);
|
|
bool get_filter_bool() const;
|
|
PhysxGroupsMask get_filter_constant0() const;
|
|
PhysxGroupsMask get_filter_constant1() const;
|
|
PhysxFilterOp get_filter_op0() const;
|
|
PhysxFilterOp get_filter_op1() const;
|
|
PhysxFilterOp get_filter_op2() const;
|
|
PhysxConstraintDominance get_dominance_group_pair(unsigned int g1, unsigned int g2);
|
|
|
|
PUBLISHED:
|
|
void release();
|
|
|
|
INLINE void ls() const;
|
|
INLINE void ls(ostream &out, int indent_level=0) const;
|
|
|
|
public:
|
|
INLINE NxScene *ptr() const { return _ptr; };
|
|
INLINE NxControllerManager *cm() const { return _cm; };
|
|
|
|
void link(NxScene *ptr);
|
|
void unlink();
|
|
|
|
PhysxObjectCollection<PhysxMaterial> _materials;
|
|
PhysxObjectCollection<PhysxActor> _actors;
|
|
PhysxObjectCollection<PhysxJoint> _joints;
|
|
PhysxObjectCollection<PhysxForceField> _forcefields;
|
|
PhysxObjectCollection<PhysxForceFieldShapeGroup> _ffgroups;
|
|
PhysxObjectCollection<PhysxController> _controllers;
|
|
PhysxObjectCollection<PhysxVehicle> _vehicles;
|
|
PhysxObjectCollection<PhysxCloth> _cloths;
|
|
PhysxObjectCollection<PhysxSoftBody> _softbodies;
|
|
|
|
PhysxMaterial *get_wheel_shape_material();
|
|
|
|
private:
|
|
NxScene *_ptr;
|
|
NxControllerManager *_cm;
|
|
PT(PhysxDebugGeomNode) _debugNode;
|
|
PT(PhysxMaterial) _wheelShapeMaterial;
|
|
|
|
PhysxContactReport _contact_report;
|
|
PhysxControllerReport _controller_report;
|
|
PhysxTriggerReport _trigger_report;
|
|
|
|
static PStatCollector _pcollector_fetch_results;
|
|
static PStatCollector _pcollector_update_transforms;
|
|
static PStatCollector _pcollector_debug_renderer;
|
|
static PStatCollector _pcollector_simulate;
|
|
static PStatCollector _pcollector_cloth;
|
|
static PStatCollector _pcollector_softbody;
|
|
|
|
public:
|
|
static TypeHandle get_class_type() {
|
|
return _type_handle;
|
|
}
|
|
static void init_type() {
|
|
PhysxObject::init_type();
|
|
register_type(_type_handle, "PhysxScene",
|
|
PhysxObject::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 "physxScene.I"
|
|
|
|
#endif // PHYSXSCENE_H
|