Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKester Maddock <Christopher.Maddock.1@uni.massey.ac.nz>2004-11-06 07:58:10 +0300
committerKester Maddock <Christopher.Maddock.1@uni.massey.ac.nz>2004-11-06 07:58:10 +0300
commit38b993f787b1694957f7c9876189f8ef9e346515 (patch)
treecf51058e0dc02eba41d1dd06d7fe3411412a8004 /source/gameengine/Ketsji/KX_TouchEventManager.cpp
parentb3395edd2a371de8ee56b3fbdfff4687750acccd (diff)
Speed up the physics engine: hook the SOLID broad phase, so we can either reject the test or request the penetration depth test as necessary. Previously we were doing the penetration depth test, as well as SOLID's intersection test.
Diffstat (limited to 'source/gameengine/Ketsji/KX_TouchEventManager.cpp')
-rw-r--r--source/gameengine/Ketsji/KX_TouchEventManager.cpp54
1 files changed, 52 insertions, 2 deletions
diff --git a/source/gameengine/Ketsji/KX_TouchEventManager.cpp b/source/gameengine/Ketsji/KX_TouchEventManager.cpp
index 704d949b0e7..4f074ce9b12 100644
--- a/source/gameengine/Ketsji/KX_TouchEventManager.cpp
+++ b/source/gameengine/Ketsji/KX_TouchEventManager.cpp
@@ -40,6 +40,31 @@
#include "SM_Object.h"
+KX_TouchEventManager::Collision::Collision(SCA_ISensor *sensor, SM_Object *obj1, SM_Object *obj2)
+ : m_id(next_id++),
+ m_sensor(sensor),
+ m_object1(obj1),
+ m_object2(obj2)
+{
+}
+
+bool KX_TouchEventManager::Collision::operator<(const Collision &other) const
+{
+ if (*this == other)
+ return true;
+
+ return m_id < other.m_id;
+}
+
+bool KX_TouchEventManager::Collision::operator==(const Collision &other) const
+{
+ return m_sensor == other.m_sensor &&
+ ((m_object1 == other.m_object1 && m_object2 == other.m_object2) ||
+ (m_object1 == other.m_object2 && m_object2 == other.m_object1));
+}
+
+int KX_TouchEventManager::Collision::next_id = 0;
+
KX_TouchEventManager::KX_TouchEventManager(class SCA_LogicManager* logicmgr,
SM_Scene *scene)
: SCA_EventManager(TOUCH_EVENTMGR),
@@ -51,6 +76,24 @@ KX_TouchEventManager::KX_TouchEventManager(class SCA_LogicManager* logicmgr,
m_scene->addTouchCallback(SENSOR_RESPONSE, KX_TouchEventManager::collisionResponse, this);
}
+DT_Bool KX_TouchEventManager::HandleCollision(void* object1, void* object2, const DT_CollData *coll_data)
+{
+ SM_Object * obj1 = static_cast<SM_Object*>(object1);
+ SM_Object * obj2 = static_cast<SM_Object*>(object2);
+ KX_ClientObjectInfo *client_info = static_cast<KX_ClientObjectInfo *>(obj1->getClientObject());
+
+ list<SCA_ISensor*>::iterator it;
+ for ( it = client_info->m_sensors.begin(); it != client_info->m_sensors.end(); ++it)
+ m_collisions.insert(Collision(*it, obj1, obj2));
+
+ client_info = static_cast<KX_ClientObjectInfo *>(obj2->getClientObject());
+ for ( it = client_info->m_sensors.begin(); it != client_info->m_sensors.end(); ++it)
+ m_collisions.insert(Collision(*it, obj2, obj1));
+
+ return DT_CONTINUE;
+}
+
+/*
DT_Bool KX_TouchEventManager::HandleCollision(void* object1,void* object2,
const DT_CollData * coll_data)
{
@@ -76,6 +119,8 @@ DT_Bool KX_TouchEventManager::HandleCollision(void* object1,void* object2,
return DT_CONTINUE;
}
+*/
+
DT_Bool KX_TouchEventManager::collisionResponse(void *client_data,
void *object1,
void *object2,
@@ -115,10 +160,15 @@ void KX_TouchEventManager::NextFrame()
{
vector<SCA_ISensor*>::iterator it;
- for (it = m_sensors.begin();!(it==m_sensors.end());it++)
+ for (it = m_sensors.begin();!(it==m_sensors.end());++it)
static_cast<KX_TouchSensor*>(*it)->SynchronizeTransform();
- for (it = m_sensors.begin();!(it==m_sensors.end());it++)
+ for (std::set<Collision>::iterator cit = m_collisions.begin(); cit != m_collisions.end(); ++cit)
+ static_cast<KX_TouchSensor*>((*cit).m_sensor)->HandleCollision((*cit).m_object1, (*cit).m_object2, NULL);
+
+ m_collisions.clear();
+
+ for (it = m_sensors.begin();!(it==m_sensors.end());++it)
(*it)->Activate(m_logicmgr,NULL);
}
}