mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 10:22:45 -04:00
Phase out OdeContactCollection
This commit is contained in:
parent
435805081d
commit
f431703f0a
@ -29,7 +29,6 @@
|
||||
odeContact.I odeContact.h \
|
||||
odeAMotorJoint.I odeAMotorJoint.h \
|
||||
odeBallJoint.I odeBallJoint.h \
|
||||
odeContactCollection.I odeContactCollection.h \
|
||||
odeContactJoint.I odeContactJoint.h \
|
||||
odeFixedJoint.I odeFixedJoint.h \
|
||||
odeHingeJoint.I odeHingeJoint.h \
|
||||
@ -62,7 +61,6 @@
|
||||
odeSpace.cxx \
|
||||
odeGeom.cxx \
|
||||
odeSurfaceParameters.cxx \
|
||||
odeContactCollection.cxx \
|
||||
odeContactGeom.cxx odeContact.cxx \
|
||||
odeAMotorJoint.cxx odeBallJoint.cxx \
|
||||
odeContactJoint.cxx odeFixedJoint.cxx \
|
||||
@ -91,7 +89,6 @@
|
||||
odeGeom.I odeGeom.h \
|
||||
odeSurfaceParameters.I odeSurfaceParameters.h \
|
||||
odeContactGeom.I odeContactGeom.h \
|
||||
odeContactCollection.I odeContactCollection.h \
|
||||
odeContact.I odeContact.h \
|
||||
odeAMotorJoint.I odeAMotorJoint.h \
|
||||
odeBallJoint.I odeBallJoint.h \
|
||||
|
@ -27,7 +27,7 @@ OdeCollisionEntry() {
|
||||
// Description: Returns the first geom in the collision.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE const OdeGeom OdeCollisionEntry::
|
||||
get_geom1() {
|
||||
get_geom1() const {
|
||||
return OdeGeom(_geom1);
|
||||
}
|
||||
|
||||
@ -37,7 +37,7 @@ get_geom1() {
|
||||
// Description: Returns the second geom in the collision.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE const OdeGeom OdeCollisionEntry::
|
||||
get_geom2() {
|
||||
get_geom2() const {
|
||||
return OdeGeom(_geom2);
|
||||
}
|
||||
|
||||
@ -47,7 +47,7 @@ get_geom2() {
|
||||
// Description: Returns the first body in the collision.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE const OdeBody OdeCollisionEntry::
|
||||
get_body1() {
|
||||
get_body1() const {
|
||||
return OdeBody(_body1);
|
||||
}
|
||||
|
||||
@ -57,7 +57,7 @@ get_body1() {
|
||||
// Description: Returns the second body in the collision.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE const OdeBody OdeCollisionEntry::
|
||||
get_body2() {
|
||||
get_body2() const {
|
||||
return OdeBody(_body2);
|
||||
}
|
||||
|
||||
@ -67,7 +67,7 @@ get_body2() {
|
||||
// Description: Returns the number of contacts in the collision.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE const size_t OdeCollisionEntry::
|
||||
get_num_contacts() {
|
||||
get_num_contacts() const {
|
||||
return _num_contacts;
|
||||
}
|
||||
|
||||
@ -77,7 +77,18 @@ get_num_contacts() {
|
||||
// Description: Returns the nth contact geom in the collision.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE const OdeContactGeom OdeCollisionEntry::
|
||||
get_contact_geom(size_t n) {
|
||||
get_contact_geom(size_t n) const {
|
||||
nassertr(n >= 0 && n < _num_contacts, OdeContactGeom());
|
||||
return _contact_geoms[n];
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: OdeCollisionEntry::operator []
|
||||
// Access: Published
|
||||
// Description: Returns the nth contact geom in the collision.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE const OdeContactGeom OdeCollisionEntry::
|
||||
operator [] (size_t n) const {
|
||||
nassertr(n >= 0 && n < _num_contacts, OdeContactGeom());
|
||||
return _contact_geoms[n];
|
||||
}
|
||||
@ -86,10 +97,33 @@ get_contact_geom(size_t n) {
|
||||
// Function: OdeCollisionEntry::get_contact_point
|
||||
// Access: Published
|
||||
// Description: Returns the nth contact point in the collision.
|
||||
// This does exactly the same as
|
||||
// get_contact_geom(n).get_pos().
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE const LPoint3f OdeCollisionEntry::
|
||||
get_contact_point(size_t n) {
|
||||
get_contact_point(size_t n) const {
|
||||
nassertr(n >= 0 && n < _num_contacts, LPoint3f::zero());
|
||||
return _contact_geoms[n].get_pos();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: OdeCollisionEntry::operator bool
|
||||
// Access: Published
|
||||
// Description: An OdeCollisionEntry evaluates to False if it
|
||||
// holds no contacts.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE OdeCollisionEntry::
|
||||
operator bool () const {
|
||||
return (_num_contacts != 0);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: OdeCollisionEntry::is_empty
|
||||
// Access: Published
|
||||
// Description: Returns true if the entry holds no contacts.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE bool OdeCollisionEntry::
|
||||
is_empty() const {
|
||||
return (_num_contacts == 0);
|
||||
}
|
||||
|
||||
|
@ -20,6 +20,8 @@
|
||||
|
||||
#include "odeContactGeom.h"
|
||||
|
||||
class OdeUtil;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : OdeCollisionEntry
|
||||
// Description : A class used to hold information about a collision
|
||||
@ -29,17 +31,21 @@ class EXPCL_PANDAODE OdeCollisionEntry : public TypedReferenceCount {
|
||||
PUBLISHED:
|
||||
virtual ~OdeCollisionEntry();
|
||||
|
||||
INLINE const OdeGeom get_geom1();
|
||||
INLINE const OdeGeom get_geom2();
|
||||
INLINE const OdeBody get_body1();
|
||||
INLINE const OdeBody get_body2();
|
||||
INLINE const OdeGeom get_geom1() const;
|
||||
INLINE const OdeGeom get_geom2() const;
|
||||
INLINE const OdeBody get_body1() const;
|
||||
INLINE const OdeBody get_body2() const;
|
||||
|
||||
INLINE const size_t get_num_contacts();
|
||||
INLINE const LPoint3f get_contact_point(size_t n);
|
||||
INLINE const OdeContactGeom get_contact_geom(size_t n);
|
||||
INLINE const size_t get_num_contacts() const;
|
||||
INLINE const LPoint3f get_contact_point(size_t n) const;
|
||||
INLINE const OdeContactGeom get_contact_geom(size_t n) const;
|
||||
INLINE const OdeContactGeom operator [] (size_t n) const;
|
||||
MAKE_SEQ(get_contact_points, get_num_contacts, get_contact_point);
|
||||
MAKE_SEQ(get_contact_geoms, get_num_contacts, get_contact_geom);
|
||||
|
||||
INLINE operator bool () const;
|
||||
INLINE bool is_empty() const;
|
||||
|
||||
private:
|
||||
INLINE OdeCollisionEntry();
|
||||
dGeomID _geom1, _geom2;
|
||||
@ -66,6 +72,7 @@ private:
|
||||
static TypeHandle _type_handle;
|
||||
|
||||
friend class OdeSpace;
|
||||
friend class OdeUtil;
|
||||
};
|
||||
|
||||
#include "odeCollisionEntry.I"
|
||||
|
@ -1,88 +0,0 @@
|
||||
// Filename: odeContactCollection.I
|
||||
// Created by: pro-rsoft (17Dec08)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: OdeContactCollection::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE OdeContactCollection::
|
||||
~OdeContactCollection() {
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: OdeContactCollection::operator +=
|
||||
// Access: Published
|
||||
// Description: Appends the other list onto the end of this one.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void OdeContactCollection::
|
||||
operator += (const OdeContactCollection &other) {
|
||||
add_contacts_from(other);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: OdeContactCollection::operator +
|
||||
// Access: Published
|
||||
// Description: Returns a OdeContactCollection representing the
|
||||
// concatenation of the two lists.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE OdeContactCollection OdeContactCollection::
|
||||
operator + (const OdeContactCollection &other) const {
|
||||
OdeContactCollection a(*this);
|
||||
a += other;
|
||||
return a;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: OdeContactCollection::clear
|
||||
// Access: Published
|
||||
// Description: Clears the contact collection.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void OdeContactCollection::
|
||||
clear() {
|
||||
_contacts.clear();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: OdeContactCollection::is_empty
|
||||
// Access: Published
|
||||
// Description: Returns true if the collection is empty.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE bool OdeContactCollection::
|
||||
is_empty() const {
|
||||
return _contacts.empty();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: OdeContactCollection::get_num_contacts
|
||||
// Access: Published
|
||||
// Description: Returns the number of Contacts in the collection.
|
||||
// This is the same thing as size().
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE int OdeContactCollection::
|
||||
get_num_contacts() const {
|
||||
return _contacts.size();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: OdeContactCollection::size
|
||||
// Access: Published
|
||||
// Description: Returns the number of Contacts in the collection.
|
||||
// This is the same thing as get_num_contacts().
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE int OdeContactCollection::
|
||||
size() const {
|
||||
return _contacts.size();
|
||||
}
|
||||
|
@ -1,116 +0,0 @@
|
||||
// Filename: odeContactCollection.cxx
|
||||
// Created by: pro-rsoft (17Dec08)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "odeContactCollection.h"
|
||||
|
||||
OdeContactCollection::
|
||||
OdeContactCollection() {
|
||||
}
|
||||
|
||||
OdeContactCollection::
|
||||
OdeContactCollection(const OdeContactCollection ©) :
|
||||
_contacts(copy._contacts) {
|
||||
}
|
||||
|
||||
void OdeContactCollection::
|
||||
operator = (const OdeContactCollection ©) {
|
||||
_contacts = copy._contacts;
|
||||
}
|
||||
|
||||
void OdeContactCollection::
|
||||
add_contact(PT(OdeContact) contact) {
|
||||
_contacts.push_back(contact);
|
||||
}
|
||||
|
||||
bool OdeContactCollection::
|
||||
remove_contact(PT(OdeContact) contact) {
|
||||
int contact_index = -1;
|
||||
for (int i = 0; contact_index == -1 && i < (int)_contacts.size(); i++) {
|
||||
if (_contacts[i] == contact) {
|
||||
contact_index = i;
|
||||
}
|
||||
}
|
||||
|
||||
if (contact_index == -1) {
|
||||
// The indicated contact was not a member of the collection.
|
||||
return false;
|
||||
}
|
||||
|
||||
_contacts.erase(_contacts.begin() + contact_index);
|
||||
return true;
|
||||
}
|
||||
|
||||
void OdeContactCollection::
|
||||
add_contacts_from(const OdeContactCollection &other) {
|
||||
int other_num_contacts = other.get_num_contacts();
|
||||
for (int i = 0; i < other_num_contacts; i++) {
|
||||
add_contact(other.get_contact(i));
|
||||
}
|
||||
}
|
||||
|
||||
void OdeContactCollection::
|
||||
remove_contacts_from(const OdeContactCollection &other) {
|
||||
Contacts new_contacts;
|
||||
int num_contacts = get_num_contacts();
|
||||
for (int i = 0; i < num_contacts; i++) {
|
||||
PT(OdeContact) contact = get_contact(i);
|
||||
if (!other.has_contact(contact)) {
|
||||
new_contacts.push_back(contact);
|
||||
}
|
||||
}
|
||||
_contacts = new_contacts;
|
||||
}
|
||||
|
||||
void OdeContactCollection::
|
||||
remove_duplicate_contacts() {
|
||||
Contacts new_contacts;
|
||||
|
||||
int num_contacts = get_num_contacts();
|
||||
for (int i = 0; i < num_contacts; i++) {
|
||||
PT(OdeContact) contact = get_contact(i);
|
||||
bool duplicated = false;
|
||||
|
||||
for (int j = 0; j < i && !duplicated; j++) {
|
||||
duplicated = (contact == get_contact(j));
|
||||
}
|
||||
|
||||
if (!duplicated) {
|
||||
new_contacts.push_back(contact);
|
||||
}
|
||||
}
|
||||
|
||||
_contacts = new_contacts;
|
||||
}
|
||||
|
||||
bool OdeContactCollection::
|
||||
has_contact(PT(OdeContact) contact) const {
|
||||
for (int i = 0; i < get_num_contacts(); i++) {
|
||||
if (contact == get_contact(i)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
PT(OdeContact) OdeContactCollection::
|
||||
get_contact(int index) const {
|
||||
nassertr(index >= 0 && index < (int)_contacts.size(), NULL);
|
||||
return _contacts[index];
|
||||
}
|
||||
|
||||
PT(OdeContact) OdeContactCollection::
|
||||
operator [] (int index) const {
|
||||
return get_contact(index);
|
||||
}
|
||||
|
@ -1,57 +0,0 @@
|
||||
// Filename: odeContactCollection.h
|
||||
// Created by: pro-rsoft (17Dec08)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef ODECONTACTCOLLECTION_H
|
||||
#define ODECONTACTCOLLECTION_H
|
||||
|
||||
#include "odeContact.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : OdeContactCollection
|
||||
// Description : This is a set of zero or more OdeContacts. It's
|
||||
// handy for returning from functions that need to
|
||||
// return multiple OdeContacts.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDAODE OdeContactCollection {
|
||||
PUBLISHED:
|
||||
OdeContactCollection();
|
||||
OdeContactCollection(const OdeContactCollection ©);
|
||||
void operator = (const OdeContactCollection ©);
|
||||
INLINE ~OdeContactCollection();
|
||||
|
||||
void add_contact(PT(OdeContact) contact);
|
||||
bool remove_contact(PT(OdeContact) contact);
|
||||
void add_contacts_from(const OdeContactCollection &other);
|
||||
void remove_contacts_from(const OdeContactCollection &other);
|
||||
void remove_duplicate_contacts();
|
||||
bool has_contact(PT(OdeContact) contact) const;
|
||||
INLINE void clear();
|
||||
|
||||
INLINE bool is_empty() const;
|
||||
INLINE int get_num_contacts() const;
|
||||
PT(OdeContact) get_contact(int index) const;
|
||||
MAKE_SEQ(get_contacts, get_num_contacts, get_contact);
|
||||
PT(OdeContact) operator [] (int index) const;
|
||||
INLINE int size() const;
|
||||
INLINE void operator += (const OdeContactCollection &other);
|
||||
INLINE OdeContactCollection operator + (const OdeContactCollection &other) const;
|
||||
|
||||
private:
|
||||
typedef pvector<PT(OdeContact)> Contacts;
|
||||
Contacts _contacts;
|
||||
};
|
||||
|
||||
#include "odeContactCollection.I"
|
||||
#endif
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include "odeGeom.h"
|
||||
|
||||
class OdeSpace;
|
||||
class OdeUtil;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : OdeContactGeom
|
||||
@ -31,6 +32,7 @@ class OdeSpace;
|
||||
class EXPCL_PANDAODE OdeContactGeom : public TypedReferenceCount {
|
||||
friend class OdeContact;
|
||||
friend class OdeSpace;
|
||||
friend class OdeUtil;
|
||||
|
||||
PUBLISHED:
|
||||
OdeContactGeom();
|
||||
|
@ -94,21 +94,25 @@ are_connected_excluding(const OdeBody &body1,
|
||||
// Access: Public, Static
|
||||
// Description: Given two geometry objects that potentially touch
|
||||
// (geom1 and geom2), generate contact information
|
||||
// for them. Returns a collection of OdeContacts.
|
||||
// for them. Returns an OdeCollisionEntry.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
OdeContactCollection OdeUtil::
|
||||
PT(OdeCollisionEntry) OdeUtil::
|
||||
collide(const OdeGeom &geom1, const OdeGeom &geom2, const short int max_contacts) {
|
||||
dContactGeom *contact_list = (dContactGeom *)PANDA_MALLOC_ARRAY(max_contacts * sizeof(dContactGeom));
|
||||
int num_contacts = dCollide(geom1.get_id(), geom2.get_id(), max_contacts, contact_list, sizeof(contact_list));
|
||||
OdeContactCollection contacts;
|
||||
PT(OdeCollisionEntry) entry = new OdeCollisionEntry();
|
||||
entry->_geom1 = geom1.get_id();
|
||||
entry->_geom2 = geom2.get_id();
|
||||
entry->_body1 = dGeomGetBody(geom1.get_id());
|
||||
entry->_body2 = dGeomGetBody(geom2.get_id());
|
||||
entry->_num_contacts = num_contacts;
|
||||
entry->_contact_geoms = new OdeContactGeom[num_contacts];
|
||||
for (int i = 0; i < num_contacts; i++) {
|
||||
PT(OdeContact) contact = new OdeContact();
|
||||
contact->set_geom(OdeContactGeom(contact_list[i]));
|
||||
contacts.add_contact(contact);
|
||||
entry->_contact_geoms[i] = contact_list[i];
|
||||
}
|
||||
|
||||
PANDA_FREE_ARRAY(contact_list);
|
||||
return contacts;
|
||||
return entry;
|
||||
}
|
||||
|
||||
#ifdef HAVE_PYTHON
|
||||
@ -153,3 +157,4 @@ OdeGeom OdeUtil::
|
||||
space_to_geom(const OdeSpace &space) {
|
||||
return OdeGeom((dGeomID)space.get_id());
|
||||
}
|
||||
|
||||
|
@ -21,7 +21,7 @@
|
||||
|
||||
#include "ode_includes.h"
|
||||
#include "odeJointCollection.h"
|
||||
#include "odeContactCollection.h"
|
||||
#include "odeCollisionEntry.h"
|
||||
|
||||
#ifdef HAVE_PYTHON
|
||||
#include "py_panda.h"
|
||||
@ -46,7 +46,7 @@ PUBLISHED:
|
||||
static int are_connected_excluding(const OdeBody &body1,
|
||||
const OdeBody &body2,
|
||||
const int joint_type);
|
||||
static OdeContactCollection collide(const OdeGeom &geom1, const OdeGeom &geom2,
|
||||
static PT(OdeCollisionEntry) collide(const OdeGeom &geom1, const OdeGeom &geom2,
|
||||
const short int max_contacts = 150);
|
||||
static int collide2(const OdeGeom &geom1, const OdeGeom &geom2,
|
||||
PyObject* arg, PyObject* callback);
|
||||
|
@ -11,5 +11,4 @@
|
||||
#include "odeSurfaceParameters.cxx"
|
||||
#include "odeContactGeom.cxx"
|
||||
#include "odeContact.cxx"
|
||||
#include "odeContactCollection.cxx"
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user