Page MenuHome

callback_data.patch

callback_data.patch

source/gameengine/Ketsji/KX_GameObject.cpp | 12 ++++-
source/gameengine/Ketsji/KX_GameObject.h | 3 +-
source/gameengine/Ketsji/KX_NearSensor.cpp | 3 +-
source/gameengine/Ketsji/KX_NearSensor.h | 3 +-
source/gameengine/Ketsji/KX_PythonInitTypes.cpp | 2 +
source/gameengine/Ketsji/KX_TouchEventManager.cpp | 58 +++++++++++++++-----
source/gameengine/Ketsji/KX_TouchEventManager.h | 15 ++++--
source/gameengine/Ketsji/KX_TouchSensor.cpp | 25 ++++++++-
source/gameengine/Ketsji/KX_TouchSensor.h | 6 ++-
.../Physics/Bullet/CcdPhysicsEnvironment.cpp | 62 ++++++++++++++++------
.../Physics/Bullet/CcdPhysicsEnvironment.h | 2 +-
.../gameengine/Physics/common/PHY_DynamicTypes.h | 8 ++-
12 files changed, 155 insertions(+), 44 deletions(-)
diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp
index 2e39614..54e4fe9 100644
--- a/source/gameengine/Ketsji/KX_GameObject.cpp
+++ b/source/gameengine/Ketsji/KX_GameObject.cpp
@@ -1423,7 +1423,7 @@ void KX_GameObject::RegisterCollisionCallbacks()
pe->AddSensor(spc);
}
}
-void KX_GameObject::RunCollisionCallbacks(KX_GameObject *collider)
+void KX_GameObject::RunCollisionCallbacks(KX_GameObject *collider, KX_CollisionContactPairs *collision_contacts)
{
#ifdef WITH_PYTHON
Py_ssize_t len;
@@ -1431,7 +1431,15 @@ void KX_GameObject::RunCollisionCallbacks(KX_GameObject *collider)
if (collision_callbacks && (len=PyList_GET_SIZE(collision_callbacks)))
{
- PyObject* args = Py_BuildValue("(O)", collider->GetProxy()); // save python creating each call
+ // Convert contacts to Python objects
+ PyObject *contacts = PyList_New((Py_ssize_t)0);
+ KX_CollisionContactPairs::const_iterator contact_it;
+ for (contact_it = collision_contacts->begin(); contact_it != collision_contacts->end(); ++contact_it)
+ {
+ PyList_Append(contacts, (*contact_it)->GetProxy());
+ }
+
+ PyObject* args = Py_BuildValue("(OO)", collider->GetProxy(), contacts); // save python creating each call
PyObject *func;
PyObject *ret;
diff --git a/source/gameengine/Ketsji/KX_GameObject.h b/source/gameengine/Ketsji/KX_GameObject.h
index ac0afca..1189757 100644
--- a/source/gameengine/Ketsji/KX_GameObject.h
+++ b/source/gameengine/Ketsji/KX_GameObject.h
@@ -49,6 +49,7 @@
#include "CTR_HashedPtr.h"
#include "KX_Scene.h"
#include "KX_KetsjiEngine.h" /* for m_anim_framerate */
+#include "KX_CollisionData.h" /* for collision data */
#include "DNA_object_types.h"
#include "SCA_LogicManager.h" /* for ConvertPythonToGameObject to search object names */
@@ -907,7 +908,7 @@ public:
void RegisterCollisionCallbacks();
void UnregisterCollisionCallbacks();
- void RunCollisionCallbacks(KX_GameObject *collider);
+ void RunCollisionCallbacks(KX_GameObject *collider, KX_CollisionContactPairs* collision_contacts);
/**
* Stop making progress
*/
diff --git a/source/gameengine/Ketsji/KX_NearSensor.cpp b/source/gameengine/Ketsji/KX_NearSensor.cpp
index 92ab8f4..4d6e6f0 100644
--- a/source/gameengine/Ketsji/KX_NearSensor.cpp
+++ b/source/gameengine/Ketsji/KX_NearSensor.cpp
@@ -208,7 +208,7 @@ bool KX_NearSensor::BroadPhaseFilterCollision(void*obj1,void*obj2)
return false;
}
-bool KX_NearSensor::NewHandleCollision(void *obj1, void *obj2, const PHY_CollData *coll_data)
+bool KX_NearSensor::NewHandleCollision(void *obj1, void *obj2, KX_CollisionContactPairs* coll_data)
{
// KX_TouchEventManager* toucheventmgr = static_cast<KX_TouchEventManager*>(m_eventmgr);
// KX_GameObject* parent = static_cast<KX_GameObject*>(GetParent());
@@ -239,6 +239,7 @@ bool KX_NearSensor::NewHandleCollision(void *obj1, void *obj2, const PHY_CollDat
// {
m_bTriggered = true;
m_hitObject = gameobj;
+ coll_data = coll_data;
// }
//}
}
diff --git a/source/gameengine/Ketsji/KX_NearSensor.h b/source/gameengine/Ketsji/KX_NearSensor.h
index ef6e15f..c0bb3c4 100644
--- a/source/gameengine/Ketsji/KX_NearSensor.h
+++ b/source/gameengine/Ketsji/KX_NearSensor.h
@@ -73,8 +73,7 @@ public:
virtual bool Evaluate();
virtual void ReParent(SCA_IObject* parent);
- virtual bool NewHandleCollision(void* obj1,void* obj2,
- const PHY_CollData * coll_data);
+ virtual bool NewHandleCollision(void* obj1,void* obj2, KX_CollisionContactPairs* coll_data);
virtual bool BroadPhaseFilterCollision(void*obj1,void*obj2);
virtual bool BroadPhaseSensorFilterCollision(void* obj1,void* obj2) { return false; }
virtual sensortype GetSensorType() { return ST_NEAR; }
diff --git a/source/gameengine/Ketsji/KX_PythonInitTypes.cpp b/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
index bacace9..ca14745 100644
--- a/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
+++ b/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
@@ -44,6 +44,7 @@
#include "KX_BlenderMaterial.h"
#include "KX_CameraActuator.h"
#include "KX_CharacterWrapper.h"
+#include "KX_CollisionData.h"
#include "KX_ConstraintActuator.h"
#include "KX_ConstraintWrapper.h"
#include "KX_GameActuator.h"
@@ -196,6 +197,7 @@ void initPyTypes(void)
PyType_Ready_Attr(dict, KX_CharacterWrapper, init_getset);
PyType_Ready_Attr(dict, KX_ConstraintActuator, init_getset);
PyType_Ready_Attr(dict, KX_ConstraintWrapper, init_getset);
+ PyType_Ready_Attr(dict, KX_CollisionContactPair, init_getset);
PyType_Ready_Attr(dict, KX_GameActuator, init_getset);
PyType_Ready_Attr(dict, KX_GameObject, init_getset);
PyType_Ready_Attr(dict, KX_IpoActuator, init_getset);
diff --git a/source/gameengine/Ketsji/KX_TouchEventManager.cpp b/source/gameengine/Ketsji/KX_TouchEventManager.cpp
index d010d3d..21b0a34 100644
--- a/source/gameengine/Ketsji/KX_TouchEventManager.cpp
+++ b/source/gameengine/Ketsji/KX_TouchEventManager.cpp
@@ -54,14 +54,13 @@ KX_TouchEventManager::KX_TouchEventManager(class SCA_LogicManager* logicmgr,
}
-bool KX_TouchEventManager::NewHandleCollision(void* object1, void* object2, const PHY_CollData *coll_data)
+bool KX_TouchEventManager::NewHandleCollision(void* object1, void* object2, PHY_CollDataVector* coll_data)
{
PHY_IPhysicsController* obj1 = static_cast<PHY_IPhysicsController*>(object1);
PHY_IPhysicsController* obj2 = static_cast<PHY_IPhysicsController*>(object2);
- m_newCollisions.insert(std::pair<PHY_IPhysicsController*, PHY_IPhysicsController*>(obj1, obj2));
-
+ m_newCollisions.insert(NewCollision(obj1, obj2, coll_data));
return false;
}
@@ -69,7 +68,7 @@ bool KX_TouchEventManager::NewHandleCollision(void* object1, void* object2, cons
bool KX_TouchEventManager::newCollisionResponse(void *client_data,
void *object1,
void *object2,
- const PHY_CollData *coll_data)
+ PHY_CollDataVector* coll_data)
{
KX_TouchEventManager *touchmgr = (KX_TouchEventManager *) client_data;
touchmgr->NewHandleCollision(object1, object2, coll_data);
@@ -79,7 +78,7 @@ bool KX_TouchEventManager::newCollisionResponse(void *client_data,
bool KX_TouchEventManager::newBroadphaseResponse(void *client_data,
void *object1,
void *object2,
- const PHY_CollData *coll_data)
+ PHY_CollDataVector* coll_data)
{
PHY_IPhysicsController* ctrl1 = static_cast<PHY_IPhysicsController*>(object1);
PHY_IPhysicsController* ctrl2 = static_cast<PHY_IPhysicsController*>(object2);
@@ -164,6 +163,14 @@ void KX_TouchEventManager::EndFrame()
{
(*it)->EndFrame();
}
+ /* We delete this after all logic has been run for the previous frame
+ As contacts may need to be available after the initial physics frame for the logic stage*/
+ for (KX_CollisionContactPairs::iterator vit = m_contactsCache.begin(); vit != m_contactsCache.end(); ++vit)
+ {
+ delete (*vit);
+
+ }
+ m_contactsCache.clear();
}
@@ -174,11 +181,35 @@ void KX_TouchEventManager::NextFrame()
for (it.begin();!it.end();++it)
(*it)->SynchronizeTransform();
- for (std::set<NewCollision>::iterator cit = m_newCollisions.begin(); cit != m_newCollisions.end(); ++cit)
+ NewCollisions::iterator cit;
+ for (cit = m_newCollisions.begin(); cit != m_newCollisions.end(); ++cit)
{
+ NewCollision collision = (*cit);
+
// Controllers
- PHY_IPhysicsController* ctrl1 = (*cit).first;
- PHY_IPhysicsController* ctrl2 = (*cit).second;
+ PHY_IPhysicsController* ctrl1 = get<0>(collision);
+ PHY_IPhysicsController* ctrl2 = get<1>(collision);
+
+ //Collision data
+ PHY_CollDataVector *contact_pairs = get<2>(collision);
+ PHY_CollDataVector::iterator vit;
+ KX_CollisionContactPairs *pairs = new KX_CollisionContactPairs;
+
+ // Conversion to KX_ data
+ for (vit = contact_pairs->begin(); vit != contact_pairs->end(); ++vit)
+ {
+ KX_CollisionContactPair *contact_pair = new KX_CollisionContactPair(*vit);
+ pairs->push_back(contact_pair);
+ // Remember for later
+ m_contactsCache.push_back(contact_pair);
+ }
+
+ /*
+ contact_pairs is a pointer to a vector of pointers
+ member pointers are still needed, but this memory is our responsibility to free!
+ */
+ delete contact_pairs;
+ contact_pairs = NULL;
// Sensor iterator
list<SCA_ISensor*>::iterator sit;
@@ -190,7 +221,7 @@ void KX_TouchEventManager::NextFrame()
// Invoke sensor response for each object
if (client_info) {
for ( sit = client_info->m_sensors.begin(); sit != client_info->m_sensors.end(); ++sit) {
- static_cast<KX_TouchSensor*>(*sit)->NewHandleCollision(ctrl1, ctrl2, NULL);
+ static_cast<KX_TouchSensor*>(*sit)->NewHandleCollision(ctrl1, ctrl2, pairs);
}
}
@@ -200,12 +231,15 @@ void KX_TouchEventManager::NextFrame()
KX_GameObject *kxObj2 = KX_GameObject::GetClientObject(client_info);
if (client_info) {
for ( sit = client_info->m_sensors.begin(); sit != client_info->m_sensors.end(); ++sit) {
- static_cast<KX_TouchSensor*>(*sit)->NewHandleCollision(ctrl2, ctrl1, NULL);
+ static_cast<KX_TouchSensor*>(*sit)->NewHandleCollision(ctrl2, ctrl1, pairs);
}
}
+
+
+
// Run python callbacks
- kxObj1->RunCollisionCallbacks(kxObj2);
- kxObj2->RunCollisionCallbacks(kxObj1);
+ kxObj1->RunCollisionCallbacks(kxObj2, pairs);
+ kxObj2->RunCollisionCallbacks(kxObj1, pairs);
}
diff --git a/source/gameengine/Ketsji/KX_TouchEventManager.h b/source/gameengine/Ketsji/KX_TouchEventManager.h
index 63e9d15..06680b9 100644
--- a/source/gameengine/Ketsji/KX_TouchEventManager.h
+++ b/source/gameengine/Ketsji/KX_TouchEventManager.h
@@ -36,33 +36,38 @@
#include "SCA_EventManager.h"
#include "KX_TouchSensor.h"
#include "KX_GameObject.h"
+#include "PHY_DynamicTypes.h"
#include <vector>
#include <set>
+#include <tuple>
class SCA_ISensor;
class PHY_IPhysicsEnvironment;
class KX_TouchEventManager : public SCA_EventManager
{
- typedef std::pair<PHY_IPhysicsController*, PHY_IPhysicsController*> NewCollision;
+ typedef std::tuple<PHY_IPhysicsController*, PHY_IPhysicsController*, PHY_CollDataVector*> NewCollision;
+ typedef std::set<NewCollision> NewCollisions;
+
PHY_IPhysicsEnvironment* m_physEnv;
- std::set<NewCollision> m_newCollisions;
+ NewCollisions m_newCollisions;
+ KX_CollisionContactPairs m_contactsCache; // Vector for cleaning up after logic stage
static bool newCollisionResponse(void *client_data,
void *object1,
void *object2,
- const PHY_CollData *coll_data);
+ PHY_CollDataVector* coll_data);
static bool newBroadphaseResponse(void *client_data,
void *object1,
void *object2,
- const PHY_CollData *coll_data);
+ PHY_CollDataVector* coll_data);
virtual bool NewHandleCollision(void* obj1,void* obj2,
- const PHY_CollData * coll_data);
+ PHY_CollDataVector* coll_data);
diff --git a/source/gameengine/Ketsji/KX_TouchSensor.cpp b/source/gameengine/Ketsji/KX_TouchSensor.cpp
index 1b8ef09..b2ab813 100644
--- a/source/gameengine/Ketsji/KX_TouchSensor.cpp
+++ b/source/gameengine/Ketsji/KX_TouchSensor.cpp
@@ -131,6 +131,7 @@ void KX_TouchSensor::Init()
m_bLastCount = 0;
m_bColliderHash = m_bLastColliderHash = 0;
m_hitObject = NULL;
+ m_contacts = NULL;
m_reset = true;
}
@@ -237,7 +238,7 @@ bool KX_TouchSensor::BroadPhaseSensorFilterCollision(void*obj1,void*obj2)
return found;
}
-bool KX_TouchSensor::NewHandleCollision(void*object1,void*object2,const PHY_CollData* colldata)
+bool KX_TouchSensor::NewHandleCollision(void*object1, void*object2, KX_CollisionContactPairs *coll_data)
{
// KX_TouchEventManager* toucheventmgr = (KX_TouchEventManager*)m_eventmgr;
KX_GameObject* parent = (KX_GameObject*)GetParent();
@@ -282,6 +283,7 @@ bool KX_TouchSensor::NewHandleCollision(void*object1,void*object2,const PHY_Coll
}
m_bTriggered = true;
m_hitObject = gameobj;
+ m_contacts = coll_data;
m_hitMaterial = (client_info->m_auxilary_info ? (char*)client_info->m_auxilary_info : "");
//printf("KX_TouchSensor::HandleCollision\n");
}
@@ -329,6 +331,7 @@ PyAttributeDef KX_TouchSensor::Attributes[] = {
KX_PYATTRIBUTE_STRING_RO("hitMaterial", KX_TouchSensor, m_hitMaterial),
KX_PYATTRIBUTE_RO_FUNCTION("hitObject", KX_TouchSensor, pyattr_get_object_hit),
KX_PYATTRIBUTE_RO_FUNCTION("hitObjectList", KX_TouchSensor, pyattr_get_object_hit_list),
+ KX_PYATTRIBUTE_RO_FUNCTION("hitContacts", KX_TouchSensor, pyattr_get_contacts),
{ NULL } //Sentinel
};
@@ -350,6 +353,26 @@ PyObject *KX_TouchSensor::pyattr_get_object_hit_list(void *self_v, const KX_PYAT
return self->m_colliders->GetProxy();
}
+PyObject *KX_TouchSensor::pyattr_get_contacts(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_TouchSensor* self = static_cast<KX_TouchSensor*>(self_v);
+ PyObject *contacts = PyList_New((Py_ssize_t)0);
+
+ // Convert contact points to Python proxies
+ if (self->m_hitObject)
+ {
+ for (KX_CollisionContactPairs::iterator vit = self->m_contacts->begin(); vit != self->m_contacts->end(); ++vit)
+ {
+ KX_CollisionContactPair *contact_pair = *vit;
+ PyList_Append(contacts, contact_pair->GetProxy());
+ }
+ }
+
+
+ return contacts;
+
+}
+
#endif
/* eof */
diff --git a/source/gameengine/Ketsji/KX_TouchSensor.h b/source/gameengine/Ketsji/KX_TouchSensor.h
index 0edca44..e899b7e 100644
--- a/source/gameengine/Ketsji/KX_TouchSensor.h
+++ b/source/gameengine/Ketsji/KX_TouchSensor.h
@@ -39,6 +39,7 @@
struct PHY_CollData;
#include "KX_ClientObjectInfo.h"
+#include "KX_CollisionData.h"
#if defined(_WIN64)
typedef unsigned __int64 uint_ptr;
@@ -74,6 +75,8 @@ protected:
SCA_IObject* m_hitObject;
class CListValue* m_colliders;
STR_String m_hitMaterial;
+
+ KX_CollisionContactPairs* m_contacts; // Pointer to contact vector of PHY_CollData
public:
KX_TouchSensor(class SCA_EventManager* eventmgr,
@@ -99,7 +102,7 @@ public:
const DT_CollData * coll_data);
#endif
- virtual bool NewHandleCollision(void*obj1,void*obj2,const PHY_CollData* colldata);
+ virtual bool NewHandleCollision(void*obj1, void*obj2, KX_CollisionContactPairs* coll_data);
// Allows to do pre-filtering and save computation time
// obj1 = sensor physical controller, obj2 = physical controller of second object
@@ -130,6 +133,7 @@ public:
static PyObject* pyattr_get_object_hit(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_object_hit_list(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_contacts(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
#endif
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
index 3c9c5d0..34c1573 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
@@ -639,7 +639,6 @@ void CcdPhysicsEnvironment::DebugDrawWorld()
bool CcdPhysicsEnvironment::ProceedDeltaTime(double curTime,float timeStep,float interval)
{
std::set<CcdPhysicsController*>::iterator it;
- int i;
for (it=m_controllers.begin(); it!=m_controllers.end(); it++)
{
@@ -647,11 +646,13 @@ bool CcdPhysicsEnvironment::ProceedDeltaTime(double curTime,float timeStep,float
}
float subStep = timeStep / float(m_numTimeSubSteps);
- i = m_dynamicsWorld->stepSimulation(interval,25,subStep);//perform always a full simulation step
+ int subStepsTaken = m_dynamicsWorld->stepSimulation(interval,25,subStep);//perform always a full simulation step
//uncomment next line to see where Bullet spend its time (printf in console)
//CProfileManager::dumpAll();
- ProcessFhSprings(curTime,i*subStep);
+
+ float simulationTime = subStepsTaken * subStep;
+ ProcessFhSprings(curTime, simulationTime);
for (it=m_controllers.begin(); it!=m_controllers.end(); it++)
{
@@ -663,14 +664,13 @@ bool CcdPhysicsEnvironment::ProceedDeltaTime(double curTime,float timeStep,float
// (*it)->SynchronizeMotionStates(timeStep);
//}
- for (i=0;i<m_wrapperVehicles.size();i++)
+ for (int i=0;i<m_wrapperVehicles.size();i++)
{
WrapperVehicle* veh = m_wrapperVehicles[i];
veh->SyncWheels();
}
-
- CallbackTriggers();
+ CallbackTriggers(simulationTime);
return true;
}
@@ -2200,9 +2200,13 @@ bool CcdPhysicsEnvironment::RequestCollisionCallback(PHY_IPhysicsController* ctr
return true;
}
-void CcdPhysicsEnvironment::CallbackTriggers()
+void CcdPhysicsEnvironment::CallbackTriggers(btScalar timeStep)
{
- if (m_triggerCallbacks[PHY_OBJECT_RESPONSE] || (m_debugDrawer && (m_debugDrawer->getDebugMode() & btIDebugDraw::DBG_DrawContactPoints)))
+
+ // If we want to draw contacts
+ bool draw_points = m_debugDrawer && (m_debugDrawer->getDebugMode() & btIDebugDraw::DBG_DrawContactPoints);
+
+ if (m_triggerCallbacks[PHY_OBJECT_RESPONSE] || draw_points)
{
//walk over all overlapping pairs, and if one of the involved bodies is registered for trigger callback, perform callback
btDispatcher* dispatcher = m_dynamicsWorld->getDispatcher();
@@ -2215,16 +2219,28 @@ void CcdPhysicsEnvironment::CallbackTriggers()
{
const btRigidBody* rb0 = static_cast<const btRigidBody*>(manifold->getBody0());
const btRigidBody* rb1 = static_cast<const btRigidBody*>(manifold->getBody1());
- if (m_debugDrawer && (m_debugDrawer->getDebugMode() & btIDebugDraw::DBG_DrawContactPoints))
+ PHY_CollDataVector *contact_pairs = new PHY_CollDataVector();
+ for (int j=0; j < numContacts; j++)
{
- for (int j=0;j<numContacts;j++)
- {
- btVector3 color(1,0,0);
- const btManifoldPoint& cp = manifold->getContactPoint(j);
- if (m_debugDrawer)
- m_debugDrawer->drawContactPoint(cp.m_positionWorldOnB,cp.m_normalWorldOnB,cp.getDistance(),cp.getLifeTime(),color);
- }
+ btVector3 color(1,0,0);
+ const btManifoldPoint& cp = manifold->getContactPoint(j);
+
+ // Create contact information
+ PHY_CollData *coll_data = new PHY_CollData;
+
+ coll_data->m_point1 = (MT_Vector3)cp.getPositionWorldOnA();
+ coll_data->m_point2 = (MT_Vector3)cp.getPositionWorldOnB();
+ coll_data->m_normal = (MT_Vector3)cp.m_normalWorldOnB;
+ coll_data->m_impulse = (MT_Scalar)cp.getAppliedImpulse();
+ coll_data->m_distance = (MT_Scalar)cp.getDistance();
+ coll_data->m_time = (MT_Scalar)timeStep;
+
+ contact_pairs->push_back(coll_data);
+
+ if (draw_points)
+ m_debugDrawer->drawContactPoint(cp.m_positionWorldOnB,cp.m_normalWorldOnB,cp.getDistance(),cp.getLifeTime(),color);
}
+
const btRigidBody* obj0 = rb0;
const btRigidBody* obj1 = rb1;
@@ -2240,8 +2256,20 @@ void CcdPhysicsEnvironment::CallbackTriggers()
if (!(i == m_triggerControllers.end()))
{
+ // Contact pairs must be cleaned up by the recipient of this callback
m_triggerCallbacks[PHY_OBJECT_RESPONSE](m_triggerCallbacksUserPtrs[PHY_OBJECT_RESPONSE],
- ctrl0,ctrl1,0);
+ ctrl0,ctrl1, contact_pairs);
+ }
+ else
+ {
+ // No one consumed , clear it
+ for (PHY_CollDataVector::iterator vit = contact_pairs->begin(); vit != contact_pairs->end(); ++vit)
+ {
+ delete (*vit);
+ }
+ delete contact_pairs;
+ contact_pairs = NULL;
+
}
// Bullet does not refresh the manifold contact point for object without contact response
// may need to remove this when a newer Bullet version is integrated
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
index a94e205..7a3a020 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
@@ -173,7 +173,7 @@ protected:
virtual float getAppliedImpulse(int constraintid);
- virtual void CallbackTriggers();
+ virtual void CallbackTriggers(btScalar timeStep);
#ifdef NEW_BULLET_VEHICLE_SUPPORT
diff --git a/source/gameengine/Physics/common/PHY_DynamicTypes.h b/source/gameengine/Physics/common/PHY_DynamicTypes.h
index d10f48a..3b4aa42 100644
--- a/source/gameengine/Physics/common/PHY_DynamicTypes.h
+++ b/source/gameengine/Physics/common/PHY_DynamicTypes.h
@@ -21,6 +21,7 @@ subject to the following restrictions:
#define __PHY_DYNAMICTYPES_H__
#include "MT_Vector3.h"
+#include <vector>
struct KX_ClientObjectInfo;
@@ -40,13 +41,18 @@ typedef struct PHY_CollData {
MT_Vector3 m_point1; /* Point in object1 in world coordinates */
MT_Vector3 m_point2; /* Point in object2 in world coordinates */
MT_Vector3 m_normal; /* point2 - point1 */
+ MT_Scalar m_impulse;
+ MT_Scalar m_time;
+ MT_Scalar m_distance;
} PHY_CollData;
+typedef std::vector<PHY_CollData *> PHY_CollDataVector;
+
typedef bool (*PHY_ResponseCallback)(void *client_data,
void *client_object1,
void *client_object2,
- const PHY_CollData *coll_data);
+ PHY_CollDataVector *coll_data);
typedef void (*PHY_CullingCallback)(KX_ClientObjectInfo* info, void* param);

File Metadata

Mime Type
text/x-diff
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
52/d8/0b313b021e03a88bacb76f984eb4

Event Timeline