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-22 13:19:19 +0300
committerKester Maddock <Christopher.Maddock.1@uni.massey.ac.nz>2004-11-22 13:19:19 +0300
commit46fbe6b01e095ddb66f3bf6e0516569cfdca8f74 (patch)
treee7a7754188ef9b290eca479df6ac59b00ea7478b /source/gameengine/Ketsji/KX_TouchEventManager.cpp
parentcf91617d7829647629c8ce04b9f047dfbdf3d910 (diff)
Fix for bugs: 1788 (forces) and 1799 (python delattr on game objects)
Use Polytope collision for faster mesh intersection tests, so SOLID can actually use that qhull lib now.
Diffstat (limited to 'source/gameengine/Ketsji/KX_TouchEventManager.cpp')
-rw-r--r--source/gameengine/Ketsji/KX_TouchEventManager.cpp47
1 files changed, 13 insertions, 34 deletions
diff --git a/source/gameengine/Ketsji/KX_TouchEventManager.cpp b/source/gameengine/Ketsji/KX_TouchEventManager.cpp
index 4f074ce9b12..a95e6a13548 100644
--- a/source/gameengine/Ketsji/KX_TouchEventManager.cpp
+++ b/source/gameengine/Ketsji/KX_TouchEventManager.cpp
@@ -40,31 +40,6 @@
#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),
@@ -80,15 +55,8 @@ DT_Bool KX_TouchEventManager::HandleCollision(void* object1, void* object2, cons
{
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));
+ m_collisions.insert(std::pair<SM_Object*, SM_Object*>(obj1, obj2));
return DT_CONTINUE;
}
@@ -164,7 +132,17 @@ void KX_TouchEventManager::NextFrame()
static_cast<KX_TouchSensor*>(*it)->SynchronizeTransform();
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);
+ {
+ KX_ClientObjectInfo *client_info = static_cast<KX_ClientObjectInfo *>((*cit).first->getClientObject());
+
+ list<SCA_ISensor*>::iterator sit;
+ for ( sit = client_info->m_sensors.begin(); sit != client_info->m_sensors.end(); ++sit)
+ static_cast<KX_TouchSensor*>(*sit)->HandleCollision((*cit).first, (*cit).second, NULL);
+
+ client_info = static_cast<KX_ClientObjectInfo *>((*cit).second->getClientObject());
+ for ( sit = client_info->m_sensors.begin(); sit != client_info->m_sensors.end(); ++sit)
+ static_cast<KX_TouchSensor*>(*sit)->HandleCollision((*cit).second, (*cit).first, NULL);
+ }
m_collisions.clear();
@@ -184,6 +162,7 @@ void KX_TouchEventManager::RemoveSensor(class SCA_ISensor* sensor)
std::swap(*i, m_sensors.back());
m_sensors.pop_back();
}
+
// remove the sensor forever :)
SCA_EventManager::RemoveSensor(sensor);
}