Changeset View
Changeset View
Standalone View
Standalone View
source/gameengine/GameLogic/SCA_TouchEventManager.cpp
- This file was moved from source/gameengine/Ketsji/KX_TouchEventManager.cpp.
| Show All 19 Lines | |||||
| * | * | ||||
| * The Original Code is: all of this file. | * The Original Code is: all of this file. | ||||
| * | * | ||||
| * Contributor(s): none yet. | * Contributor(s): none yet. | ||||
| * | * | ||||
| * ***** END GPL LICENSE BLOCK ***** | * ***** END GPL LICENSE BLOCK ***** | ||||
| */ | */ | ||||
| /** \file gameengine/Ketsji/KX_TouchEventManager.cpp | /** \file gameengine/GameLogic/SCA_TouchEventManager.cpp | ||||
| * \ingroup ketsji | * \ingroup gamelogic | ||||
| */ | */ | ||||
| #include "KX_TouchEventManager.h" | #include "SCA_TouchEventManager.h" | ||||
| #include "SCA_ISensor.h" | #include "SCA_ISensor.h" | ||||
| #include "KX_TouchSensor.h" | #include "SCA_TouchSensor.h" | ||||
| #include "KX_GameObject.h" | #include "KX_GameObject.h" | ||||
| #include "PHY_IPhysicsEnvironment.h" | #include "PHY_IPhysicsEnvironment.h" | ||||
| #include "PHY_IPhysicsController.h" | #include "PHY_IPhysicsController.h" | ||||
| KX_TouchEventManager::KX_TouchEventManager(class SCA_LogicManager* logicmgr, | SCA_TouchEventManager::SCA_TouchEventManager(class SCA_LogicManager* logicmgr, | ||||
| PHY_IPhysicsEnvironment* physEnv) | PHY_IPhysicsEnvironment* physEnv) | ||||
| : SCA_EventManager(logicmgr, TOUCH_EVENTMGR), | : SCA_EventManager(logicmgr, TOUCH_EVENTMGR), | ||||
| m_physEnv(physEnv) | m_physEnv(physEnv) | ||||
| { | { | ||||
| //notm_scene->addTouchCallback(STATIC_RESPONSE, KX_TouchEventManager::collisionResponse, this); | //notm_scene->addTouchCallback(STATIC_RESPONSE, SCA_TouchEventManager::collisionResponse, this); | ||||
| //m_scene->addTouchCallback(OBJECT_RESPONSE, KX_TouchEventManager::collisionResponse, this); | //m_scene->addTouchCallback(OBJECT_RESPONSE, SCA_TouchEventManager::collisionResponse, this); | ||||
| //m_scene->addTouchCallback(SENSOR_RESPONSE, KX_TouchEventManager::collisionResponse, this); | //m_scene->addTouchCallback(SENSOR_RESPONSE, SCA_TouchEventManager::collisionResponse, this); | ||||
| m_physEnv->AddTouchCallback(PHY_OBJECT_RESPONSE, KX_TouchEventManager::newCollisionResponse, this); | m_physEnv->AddTouchCallback(PHY_OBJECT_RESPONSE, SCA_TouchEventManager::newCollisionResponse, this); | ||||
| m_physEnv->AddTouchCallback(PHY_SENSOR_RESPONSE, KX_TouchEventManager::newCollisionResponse, this); | m_physEnv->AddTouchCallback(PHY_SENSOR_RESPONSE, SCA_TouchEventManager::newCollisionResponse, this); | ||||
| m_physEnv->AddTouchCallback(PHY_BROADPH_RESPONSE, KX_TouchEventManager::newBroadphaseResponse, this); | m_physEnv->AddTouchCallback(PHY_BROADPH_RESPONSE, SCA_TouchEventManager::newBroadphaseResponse, this); | ||||
| } | } | ||||
| bool KX_TouchEventManager::NewHandleCollision(void* object1, void* object2, const PHY_CollData *coll_data) | bool SCA_TouchEventManager::NewHandleCollision(void* object1, void* object2, const PHY_CollData *coll_data) | ||||
| { | { | ||||
| PHY_IPhysicsController* obj1 = static_cast<PHY_IPhysicsController*>(object1); | PHY_IPhysicsController* obj1 = static_cast<PHY_IPhysicsController*>(object1); | ||||
| PHY_IPhysicsController* obj2 = static_cast<PHY_IPhysicsController*>(object2); | PHY_IPhysicsController* obj2 = static_cast<PHY_IPhysicsController*>(object2); | ||||
| m_newCollisions.insert(std::pair<PHY_IPhysicsController*, PHY_IPhysicsController*>(obj1, obj2)); | m_newCollisions.insert(std::pair<PHY_IPhysicsController*, PHY_IPhysicsController*>(obj1, obj2)); | ||||
| return false; | return false; | ||||
| } | } | ||||
| bool KX_TouchEventManager::newCollisionResponse(void *client_data, | bool SCA_TouchEventManager::newCollisionResponse(void *client_data, | ||||
| void *object1, | void *object1, | ||||
| void *object2, | void *object2, | ||||
| const PHY_CollData *coll_data) | const PHY_CollData *coll_data) | ||||
| { | { | ||||
| KX_TouchEventManager *touchmgr = (KX_TouchEventManager *) client_data; | SCA_TouchEventManager *touchmgr = (SCA_TouchEventManager *) client_data; | ||||
| touchmgr->NewHandleCollision(object1, object2, coll_data); | touchmgr->NewHandleCollision(object1, object2, coll_data); | ||||
| return false; | return false; | ||||
| } | } | ||||
| bool KX_TouchEventManager::newBroadphaseResponse(void *client_data, | bool SCA_TouchEventManager::newBroadphaseResponse(void *client_data, | ||||
| void *object1, | void *object1, | ||||
| void *object2, | void *object2, | ||||
| const PHY_CollData *coll_data) | const PHY_CollData *coll_data) | ||||
| { | { | ||||
| PHY_IPhysicsController* ctrl1 = static_cast<PHY_IPhysicsController*>(object1); | PHY_IPhysicsController* ctrl1 = static_cast<PHY_IPhysicsController*>(object1); | ||||
| PHY_IPhysicsController* ctrl2 = static_cast<PHY_IPhysicsController*>(object2); | PHY_IPhysicsController* ctrl2 = static_cast<PHY_IPhysicsController*>(object2); | ||||
| KX_ClientObjectInfo *info1 = (ctrl1) ? static_cast<KX_ClientObjectInfo*>(ctrl1->GetNewClientInfo()) : NULL; | KX_ClientObjectInfo *info1 = (ctrl1) ? static_cast<KX_ClientObjectInfo*>(ctrl1->GetNewClientInfo()) : NULL; | ||||
| Show All 19 Lines | |||||
| #endif | #endif | ||||
| switch (info1->m_type) | switch (info1->m_type) | ||||
| { | { | ||||
| case KX_ClientObjectInfo::SENSOR: | case KX_ClientObjectInfo::SENSOR: | ||||
| if (info1->m_sensors.size() == 1) | if (info1->m_sensors.size() == 1) | ||||
| { | { | ||||
| // only one sensor for this type of object | // only one sensor for this type of object | ||||
| KX_TouchSensor* touchsensor = static_cast<KX_TouchSensor*>(*info1->m_sensors.begin()); | SCA_TouchSensor* touchsensor = static_cast<SCA_TouchSensor*>(*info1->m_sensors.begin()); | ||||
| return touchsensor->BroadPhaseFilterCollision(object1, object2); | return touchsensor->BroadPhaseFilterCollision(object1, object2); | ||||
| } | } | ||||
| break; | break; | ||||
| case KX_ClientObjectInfo::OBSENSOR: | case KX_ClientObjectInfo::OBSENSOR: | ||||
| case KX_ClientObjectInfo::OBACTORSENSOR: | case KX_ClientObjectInfo::OBACTORSENSOR: | ||||
| // this object may have multiple collision sensors, | // this object may have multiple collision sensors, | ||||
| // check is any of them is interested in this object | // check is any of them is interested in this object | ||||
| for (std::list<SCA_ISensor*>::iterator it = info1->m_sensors.begin(); | for (std::list<SCA_ISensor*>::iterator it = info1->m_sensors.begin(); | ||||
| it != info1->m_sensors.end(); | it != info1->m_sensors.end(); | ||||
| ++it) | ++it) | ||||
| { | { | ||||
| if ((*it)->GetSensorType() == SCA_ISensor::ST_TOUCH) | if ((*it)->GetSensorType() == SCA_ISensor::ST_TOUCH) | ||||
| { | { | ||||
| KX_TouchSensor* touchsensor = static_cast<KX_TouchSensor*>(*it); | SCA_TouchSensor* touchsensor = static_cast<SCA_TouchSensor*>(*it); | ||||
| if (touchsensor->BroadPhaseSensorFilterCollision(object1, object2)) | if (touchsensor->BroadPhaseSensorFilterCollision(object1, object2)) | ||||
| return true; | return true; | ||||
| } | } | ||||
| } | } | ||||
| return has_py_callbacks; | return has_py_callbacks; | ||||
| // quiet the compiler | // quiet the compiler | ||||
| case KX_ClientObjectInfo::STATIC: | case KX_ClientObjectInfo::STATIC: | ||||
| case KX_ClientObjectInfo::ACTOR: | case KX_ClientObjectInfo::ACTOR: | ||||
| case KX_ClientObjectInfo::RESERVED1: | case KX_ClientObjectInfo::RESERVED1: | ||||
| /* do nothing*/ | /* do nothing*/ | ||||
| break; | break; | ||||
| } | } | ||||
| return true; | return true; | ||||
| } | } | ||||
| void KX_TouchEventManager::RegisterSensor(SCA_ISensor* sensor) | void SCA_TouchEventManager::RegisterSensor(SCA_ISensor* sensor) | ||||
| { | { | ||||
| KX_TouchSensor* touchsensor = static_cast<KX_TouchSensor*>(sensor); | SCA_TouchSensor* touchsensor = static_cast<SCA_TouchSensor*>(sensor); | ||||
| if (m_sensors.AddBack(touchsensor)) | if (m_sensors.AddBack(touchsensor)) | ||||
| // the sensor was effectively inserted, register it | // the sensor was effectively inserted, register it | ||||
| touchsensor->RegisterSumo(this); | touchsensor->RegisterSumo(this); | ||||
| } | } | ||||
| void KX_TouchEventManager::RemoveSensor(SCA_ISensor* sensor) | void SCA_TouchEventManager::RemoveSensor(SCA_ISensor* sensor) | ||||
| { | { | ||||
| KX_TouchSensor* touchsensor = static_cast<KX_TouchSensor*>(sensor); | SCA_TouchSensor* touchsensor = static_cast<SCA_TouchSensor*>(sensor); | ||||
| if (touchsensor->Delink()) | if (touchsensor->Delink()) | ||||
| // the sensor was effectively removed, unregister it | // the sensor was effectively removed, unregister it | ||||
| touchsensor->UnregisterSumo(this); | touchsensor->UnregisterSumo(this); | ||||
| } | } | ||||
| void KX_TouchEventManager::EndFrame() | void SCA_TouchEventManager::EndFrame() | ||||
| { | { | ||||
| SG_DList::iterator<KX_TouchSensor> it(m_sensors); | SG_DList::iterator<SCA_TouchSensor> it(m_sensors); | ||||
| for (it.begin();!it.end();++it) | for (it.begin();!it.end();++it) | ||||
| { | { | ||||
| (*it)->EndFrame(); | (*it)->EndFrame(); | ||||
| } | } | ||||
| } | } | ||||
| void KX_TouchEventManager::NextFrame() | void SCA_TouchEventManager::NextFrame() | ||||
| { | { | ||||
| SG_DList::iterator<KX_TouchSensor> it(m_sensors); | SG_DList::iterator<SCA_TouchSensor> it(m_sensors); | ||||
| for (it.begin();!it.end();++it) | for (it.begin();!it.end();++it) | ||||
| (*it)->SynchronizeTransform(); | (*it)->SynchronizeTransform(); | ||||
| for (std::set<NewCollision>::iterator cit = m_newCollisions.begin(); cit != m_newCollisions.end(); ++cit) | for (std::set<NewCollision>::iterator cit = m_newCollisions.begin(); cit != m_newCollisions.end(); ++cit) | ||||
| { | { | ||||
| // Controllers | // Controllers | ||||
| PHY_IPhysicsController* ctrl1 = (*cit).first; | PHY_IPhysicsController* ctrl1 = (*cit).first; | ||||
| PHY_IPhysicsController* ctrl2 = (*cit).second; | PHY_IPhysicsController* ctrl2 = (*cit).second; | ||||
| // Sensor iterator | // Sensor iterator | ||||
| list<SCA_ISensor*>::iterator sit; | list<SCA_ISensor*>::iterator sit; | ||||
| // First client info | // First client info | ||||
| KX_ClientObjectInfo *client_info = static_cast<KX_ClientObjectInfo*>(ctrl1->GetNewClientInfo()); | KX_ClientObjectInfo *client_info = static_cast<KX_ClientObjectInfo*>(ctrl1->GetNewClientInfo()); | ||||
| // First gameobject | // First gameobject | ||||
| KX_GameObject *kxObj1 = KX_GameObject::GetClientObject(client_info); | KX_GameObject *kxObj1 = KX_GameObject::GetClientObject(client_info); | ||||
| // Invoke sensor response for each object | // Invoke sensor response for each object | ||||
| if (client_info) { | if (client_info) { | ||||
| for ( sit = client_info->m_sensors.begin(); sit != client_info->m_sensors.end(); ++sit) { | 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<SCA_TouchSensor*>(*sit)->NewHandleCollision(ctrl1, ctrl2, NULL); | ||||
| } | } | ||||
| } | } | ||||
| // Second client info | // Second client info | ||||
| client_info = static_cast<KX_ClientObjectInfo *>(ctrl2->GetNewClientInfo()); | client_info = static_cast<KX_ClientObjectInfo *>(ctrl2->GetNewClientInfo()); | ||||
| // Second gameobject | // Second gameobject | ||||
| KX_GameObject *kxObj2 = KX_GameObject::GetClientObject(client_info); | KX_GameObject *kxObj2 = KX_GameObject::GetClientObject(client_info); | ||||
| if (client_info) { | if (client_info) { | ||||
| for ( sit = client_info->m_sensors.begin(); sit != client_info->m_sensors.end(); ++sit) { | 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<SCA_TouchSensor*>(*sit)->NewHandleCollision(ctrl2, ctrl1, NULL); | ||||
| } | } | ||||
| } | } | ||||
| // Run python callbacks | // Run python callbacks | ||||
| kxObj1->RunCollisionCallbacks(kxObj2); | kxObj1->RunCollisionCallbacks(kxObj2); | ||||
| kxObj2->RunCollisionCallbacks(kxObj1); | kxObj2->RunCollisionCallbacks(kxObj1); | ||||
| } | } | ||||
| m_newCollisions.clear(); | m_newCollisions.clear(); | ||||
| for (it.begin();!it.end();++it) | for (it.begin();!it.end();++it) | ||||
| (*it)->Activate(m_logicmgr); | (*it)->Activate(m_logicmgr); | ||||
| } | } | ||||