26const int OdeSpace::MAX_CONTACTS = 16;
27OdeWorld* OdeSpace::_static_auto_collide_world;
28OdeSpace* OdeSpace::_static_auto_collide_space;
29dJointGroupID OdeSpace::_static_auto_collide_joint_group;
32OdeSpace(dSpaceID
id) :
34 _auto_collide_world =
nullptr;
35 _auto_collide_joint_group =
nullptr;
49query(
const OdeGeom& geom)
const {
51 return dSpaceQuery(_id, geom.
get_id());
57 return dSpaceQuery(_id, (dGeomID)space.
get_id());
63 dSpaceAdd(_id, (dGeomID)space.
get_id());
69 dSpaceRemove(_id, (dGeomID)space.
get_id());
75 dSpaceAdd(_id, geom.
get_id());
81 dSpaceRemove(_id, geom.
get_id());
92 nassertr(_id,
OdeGeom(
nullptr));
93 return OdeGeom(dSpaceGetGeom(_id, i));
98write(std::ostream &out,
unsigned int indent)
const {
99 out.width(
indent); out <<
"" << get_type() <<
"(id = " << _id <<
")";
103operator bool ()
const {
104 return (_id !=
nullptr);
108set_auto_collide_world(
OdeWorld &world) {
109 _auto_collide_world = &world;
114 _auto_collide_joint_group = joint_group.get_id();
119 if (_auto_collide_world ==
nullptr) {
120 odespace_cat.error() <<
"No collide world has been set!\n";
122 nassertv(_id !=
nullptr);
123 _static_auto_collide_space =
this;
124 _static_auto_collide_world = _auto_collide_world;
125 _static_auto_collide_joint_group = _auto_collide_joint_group;
126 dSpaceCollide(_id,
this, &auto_callback);
131auto_callback(
void *data, dGeomID o1, dGeomID o2) {
135 dBodyID b1 = dGeomGetBody(o1);
136 dBodyID b2 = dGeomGetBody(o2);
138 dContact contact[OdeSpace::MAX_CONTACTS];
140 int surface1 = _static_auto_collide_space->get_surface_type(o1);
141 int surface2 = _static_auto_collide_space->get_surface_type(o2);
143 nassertv(_static_auto_collide_world !=
nullptr);
145 collide_params = _static_auto_collide_world->get_surface(surface1, surface2);
147 for (i=0; i < OdeSpace::MAX_CONTACTS; i++) {
148 contact[i].surface.mode = collide_params.colparams.mode;
149 contact[i].surface.mu = collide_params.colparams.mu;
150 contact[i].surface.mu2 = collide_params.colparams.mu2;
151 contact[i].surface.bounce = collide_params.colparams.bounce;
152 contact[i].surface.bounce_vel = collide_params.colparams.bounce_vel;
153 contact[i].surface.soft_cfm = collide_params.colparams.soft_cfm;
157 numc = dCollide(o1, o2, OdeSpace::MAX_CONTACTS, &contact[0].geom,
sizeof(dContact));
160 if (odespace_cat.is_debug()) {
161 odespace_cat.debug() <<
"collision between geoms " << o1 <<
" and " << o2 <<
"\n";
162 odespace_cat.debug() <<
"collision between body " << b1 <<
" and " << b2 <<
"\n";
163 odespace_cat.debug() <<
"surface1= "<< surface1 <<
" surface2=" << surface2 <<
"\n";
167 if (!_static_auto_collide_space->_collision_event.empty()) {
173 entry->_num_contacts = numc;
177 for(i=0; i < numc; i++) {
178 dJointID c = dJointCreateContact(_static_auto_collide_world->
get_id(), _static_auto_collide_joint_group, contact + i);
179 if ((_static_auto_collide_space->get_collide_id(o1) >= 0) && (_static_auto_collide_space->get_collide_id(o2) >= 0)) {
180 dJointAttach(c, b1, b2);
182 if (!_static_auto_collide_space->_collision_event.empty()) {
183 entry->_contact_geoms[i] = contact[i].geom;
186 _static_auto_collide_world->set_dampen_on_bodies(b1, b2, collide_params.dampen);
188 if (!_static_auto_collide_space->_collision_event.empty()) {
189 throw_event(_static_auto_collide_space->_collision_event,
EventParameter(entry));
195convert_to_simple_space()
const {
197 nassertr(get_class() == OdeGeom::GC_simple_space,
OdeSimpleSpace(
nullptr));
202convert_to_hash_space()
const {
204 nassertr(get_class() == OdeGeom::GC_hash_space,
OdeHashSpace(
nullptr));
209convert_to_quad_tree_space()
const {
211 nassertr(get_class() == OdeGeom::GC_quad_tree_space,
OdeQuadTreeSpace(
nullptr));
217set_surface_type(
int surfaceType, dGeomID
id){
218 _geom_surface_map[id]= surfaceType;
222set_surface_type(
OdeGeom& geom,
int surfaceType){
223 dGeomID
id = geom.
get_id();
224 set_surface_type(surfaceType,
id);
228get_surface_type(dGeomID
id) {
229 GeomSurfaceMap::iterator iter = _geom_surface_map.find(
id);
230 if (iter != _geom_surface_map.end()) {
237get_surface_type(
OdeGeom& geom) {
238 dGeomID
id = geom.
get_id();
239 return get_surface_type(
id);
244set_collide_id(
int collide_id, dGeomID
id) {
245 _geom_collide_id_map[id]= collide_id;
246 return _geom_collide_id_map[id];
250set_collide_id(
OdeGeom& geom,
int collide_id) {
251 dGeomID
id = geom.
get_id();
252 return set_collide_id(collide_id,
id);
257 dGeomID
id = geom.
get_id();
258 return get_collide_id(
id);
263get_collide_id(dGeomID
id) {
264 GeomCollideIdMap::iterator iter = _geom_collide_id_map.find(
id);
265 if (iter != _geom_collide_id_map.end()) {
An optional parameter associated with an event.
A class used to hold information about a collision that has occurred.
dGeomID get_id() const
Returns the underlying dGeomID.
dSpaceID get_id() const
Returns the underlying dSpaceID.
dWorldID get_id() const
Returns the underlying dWorldID.
TypeHandle is the identifier used to differentiate C++ class types.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
std::ostream & indent(std::ostream &out, int indent_level)
A handy function for doing text formatting.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.