Changeset View
Changeset View
Standalone View
Standalone View
source/gameengine/GameLogic/SCA_TouchSensor.cpp
- This file was moved from source/gameengine/Ketsji/KX_TouchSensor.cpp.
| Show All 22 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_TouchSensor.cpp | /** \file gameengine/GameLogic/SCA_TouchSensor.cpp | ||||
| * \ingroup ketsji | * \ingroup gamelogic | ||||
| */ | */ | ||||
| #include "KX_TouchSensor.h" | #include "SCA_TouchSensor.h" | ||||
| #include "SCA_EventManager.h" | #include "SCA_EventManager.h" | ||||
| #include "SCA_LogicManager.h" | #include "SCA_LogicManager.h" | ||||
| #include "KX_GameObject.h" | #include "KX_GameObject.h" | ||||
| #include "KX_TouchEventManager.h" | #include "SCA_TouchEventManager.h" | ||||
| #include "PHY_IPhysicsController.h" | #include "PHY_IPhysicsController.h" | ||||
| #include <iostream> | #include <iostream> | ||||
| #include "PHY_IPhysicsEnvironment.h" | #include "PHY_IPhysicsEnvironment.h" | ||||
| /* ------------------------------------------------------------------------- */ | /* ------------------------------------------------------------------------- */ | ||||
| /* Native functions */ | /* Native functions */ | ||||
| /* ------------------------------------------------------------------------- */ | /* ------------------------------------------------------------------------- */ | ||||
| void KX_TouchSensor::SynchronizeTransform() | void SCA_TouchSensor::SynchronizeTransform() | ||||
| { | { | ||||
| // the touch sensor does not require any synchronization: it uses | // the touch sensor does not require any synchronization: it uses | ||||
| // the same physical object which is already synchronized by Blender | // the same physical object which is already synchronized by Blender | ||||
| } | } | ||||
| void KX_TouchSensor::EndFrame() | void SCA_TouchSensor::EndFrame() | ||||
| { | { | ||||
| m_colliders->ReleaseAndRemoveAll(); | m_colliders->ReleaseAndRemoveAll(); | ||||
| m_hitObject = NULL; | m_hitObject = NULL; | ||||
| m_bTriggered = false; | m_bTriggered = false; | ||||
| m_bColliderHash = 0; | m_bColliderHash = 0; | ||||
| } | } | ||||
| void KX_TouchSensor::UnregisterToManager() | void SCA_TouchSensor::UnregisterToManager() | ||||
| { | { | ||||
| // before unregistering the sensor, make sure we release all references | // before unregistering the sensor, make sure we release all references | ||||
| EndFrame(); | EndFrame(); | ||||
| SCA_ISensor::UnregisterToManager(); | SCA_ISensor::UnregisterToManager(); | ||||
| } | } | ||||
| bool KX_TouchSensor::Evaluate() | bool SCA_TouchSensor::Evaluate() | ||||
| { | { | ||||
| bool result = false; | bool result = false; | ||||
| bool reset = m_reset && m_level; | bool reset = m_reset && m_level; | ||||
| m_reset = false; | m_reset = false; | ||||
| if (m_bTriggered != m_bLastTriggered) | if (m_bTriggered != m_bLastTriggered) | ||||
| { | { | ||||
| m_bLastTriggered = m_bTriggered; | m_bLastTriggered = m_bTriggered; | ||||
| if (!m_bTriggered) | if (!m_bTriggered) | ||||
| Show All 11 Lines | if (m_bLastCount!=count || m_bColliderHash!=m_bLastColliderHash) { | ||||
| m_bLastCount = count; | m_bLastCount = count; | ||||
| m_bLastColliderHash= m_bColliderHash; | m_bLastColliderHash= m_bColliderHash; | ||||
| result = true; | result = true; | ||||
| } | } | ||||
| } | } | ||||
| return result; | return result; | ||||
| } | } | ||||
| KX_TouchSensor::KX_TouchSensor(SCA_EventManager* eventmgr,KX_GameObject* gameobj,bool bFindMaterial,bool bTouchPulse,const STR_String& touchedpropname) | SCA_TouchSensor::SCA_TouchSensor(SCA_EventManager* eventmgr,KX_GameObject* gameobj,bool bFindMaterial,bool bTouchPulse,const STR_String& touchedpropname) | ||||
| :SCA_ISensor(gameobj,eventmgr), | :SCA_ISensor(gameobj,eventmgr), | ||||
| m_touchedpropname(touchedpropname), | m_touchedpropname(touchedpropname), | ||||
| m_bFindMaterial(bFindMaterial), | m_bFindMaterial(bFindMaterial), | ||||
| m_bTouchPulse(bTouchPulse), | m_bTouchPulse(bTouchPulse), | ||||
| m_hitMaterial("") | m_hitMaterial("") | ||||
| /*m_sumoObj(sumoObj),*/ | /*m_sumoObj(sumoObj),*/ | ||||
| { | { | ||||
| // KX_TouchEventManager* touchmgr = (KX_TouchEventManager*) eventmgr; | // SCA_TouchEventManager* touchmgr = (SCA_TouchEventManager*) eventmgr; | ||||
| // m_resptable = touchmgr->GetResponseTable(); | // m_resptable = touchmgr->GetResponseTable(); | ||||
| // m_solidHandle = m_sumoObj->getObjectHandle(); | // m_solidHandle = m_sumoObj->getObjectHandle(); | ||||
| m_colliders = new CListValue(); | m_colliders = new CListValue(); | ||||
| KX_ClientObjectInfo *client_info = gameobj->getClientInfo(); | KX_ClientObjectInfo *client_info = gameobj->getClientInfo(); | ||||
| //client_info->m_gameobject = gameobj; | //client_info->m_gameobject = gameobj; | ||||
| //client_info->m_auxilary_info = NULL; | //client_info->m_auxilary_info = NULL; | ||||
| client_info->m_sensors.push_back(this); | client_info->m_sensors.push_back(this); | ||||
| m_physCtrl = gameobj->GetPhysicsController(); | m_physCtrl = gameobj->GetPhysicsController(); | ||||
| MT_assert( !gameobj->GetPhysicsController() || m_physCtrl ); | MT_assert( !gameobj->GetPhysicsController() || m_physCtrl ); | ||||
| Init(); | Init(); | ||||
| } | } | ||||
| void KX_TouchSensor::Init() | void SCA_TouchSensor::Init() | ||||
| { | { | ||||
| m_bCollision = false; | m_bCollision = false; | ||||
| m_bTriggered = false; | m_bTriggered = false; | ||||
| m_bLastTriggered = (m_invert)?true:false; | m_bLastTriggered = (m_invert)?true:false; | ||||
| m_bLastCount = 0; | m_bLastCount = 0; | ||||
| m_bColliderHash = m_bLastColliderHash = 0; | m_bColliderHash = m_bLastColliderHash = 0; | ||||
| m_hitObject = NULL; | m_hitObject = NULL; | ||||
| m_reset = true; | m_reset = true; | ||||
| } | } | ||||
| KX_TouchSensor::~KX_TouchSensor() | SCA_TouchSensor::~SCA_TouchSensor() | ||||
| { | { | ||||
| //DT_ClearObjectResponse(m_resptable,m_solidHandle); | //DT_ClearObjectResponse(m_resptable,m_solidHandle); | ||||
| m_colliders->Release(); | m_colliders->Release(); | ||||
| } | } | ||||
| CValue* KX_TouchSensor::GetReplica() | CValue* SCA_TouchSensor::GetReplica() | ||||
| { | { | ||||
| KX_TouchSensor* replica = new KX_TouchSensor(*this); | SCA_TouchSensor* replica = new SCA_TouchSensor(*this); | ||||
| replica->ProcessReplica(); | replica->ProcessReplica(); | ||||
| return replica; | return replica; | ||||
| } | } | ||||
| void KX_TouchSensor::ProcessReplica() | void SCA_TouchSensor::ProcessReplica() | ||||
| { | { | ||||
| SCA_ISensor::ProcessReplica(); | SCA_ISensor::ProcessReplica(); | ||||
| m_colliders = new CListValue(); | m_colliders = new CListValue(); | ||||
| Init(); | Init(); | ||||
| } | } | ||||
| void KX_TouchSensor::ReParent(SCA_IObject* parent) | void SCA_TouchSensor::ReParent(SCA_IObject* parent) | ||||
| { | { | ||||
| KX_GameObject *gameobj = static_cast<KX_GameObject *>(parent); | KX_GameObject *gameobj = static_cast<KX_GameObject *>(parent); | ||||
| PHY_IPhysicsController *sphy = ((KX_GameObject*)parent)->GetPhysicsController(); | PHY_IPhysicsController *sphy = ((KX_GameObject*)parent)->GetPhysicsController(); | ||||
| if (sphy) | if (sphy) | ||||
| m_physCtrl = sphy; | m_physCtrl = sphy; | ||||
| // m_solidHandle = m_sumoObj->getObjectHandle(); | // m_solidHandle = m_sumoObj->getObjectHandle(); | ||||
| KX_ClientObjectInfo *client_info = gameobj->getClientInfo(); | KX_ClientObjectInfo *client_info = gameobj->getClientInfo(); | ||||
| //client_info->m_gameobject = gameobj; | //client_info->m_gameobject = gameobj; | ||||
| //client_info->m_auxilary_info = NULL; | //client_info->m_auxilary_info = NULL; | ||||
| client_info->m_sensors.push_back(this); | client_info->m_sensors.push_back(this); | ||||
| SCA_ISensor::ReParent(parent); | SCA_ISensor::ReParent(parent); | ||||
| } | } | ||||
| void KX_TouchSensor::RegisterSumo(KX_TouchEventManager *touchman) | void SCA_TouchSensor::RegisterSumo(SCA_TouchEventManager *touchman) | ||||
| { | { | ||||
| if (m_physCtrl) | if (m_physCtrl) | ||||
| { | { | ||||
| if (touchman->GetPhysicsEnvironment()->RequestCollisionCallback(m_physCtrl)) | if (touchman->GetPhysicsEnvironment()->RequestCollisionCallback(m_physCtrl)) | ||||
| { | { | ||||
| KX_ClientObjectInfo *client_info = static_cast<KX_ClientObjectInfo*>(m_physCtrl->GetNewClientInfo()); | KX_ClientObjectInfo *client_info = static_cast<KX_ClientObjectInfo*>(m_physCtrl->GetNewClientInfo()); | ||||
| if (client_info->isSensor()) | if (client_info->isSensor()) | ||||
| touchman->GetPhysicsEnvironment()->AddSensor(m_physCtrl); | touchman->GetPhysicsEnvironment()->AddSensor(m_physCtrl); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| void KX_TouchSensor::UnregisterSumo(KX_TouchEventManager* touchman) | void SCA_TouchSensor::UnregisterSumo(SCA_TouchEventManager* touchman) | ||||
| { | { | ||||
| if (m_physCtrl) | if (m_physCtrl) | ||||
| { | { | ||||
| if (touchman->GetPhysicsEnvironment()->RemoveCollisionCallback(m_physCtrl)) | if (touchman->GetPhysicsEnvironment()->RemoveCollisionCallback(m_physCtrl)) | ||||
| { | { | ||||
| // no more sensor on the controller, can remove it if it is a sensor object | // no more sensor on the controller, can remove it if it is a sensor object | ||||
| KX_ClientObjectInfo *client_info = static_cast<KX_ClientObjectInfo*>(m_physCtrl->GetNewClientInfo()); | KX_ClientObjectInfo *client_info = static_cast<KX_ClientObjectInfo*>(m_physCtrl->GetNewClientInfo()); | ||||
| if (client_info->isSensor()) | if (client_info->isSensor()) | ||||
| touchman->GetPhysicsEnvironment()->RemoveSensor(m_physCtrl); | touchman->GetPhysicsEnvironment()->RemoveSensor(m_physCtrl); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| // this function is called only for sensor objects | // this function is called only for sensor objects | ||||
| // return true if the controller can collide with the object | // return true if the controller can collide with the object | ||||
| bool KX_TouchSensor::BroadPhaseSensorFilterCollision(void*obj1,void*obj2) | bool SCA_TouchSensor::BroadPhaseSensorFilterCollision(void*obj1,void*obj2) | ||||
| { | { | ||||
| assert(obj1==m_physCtrl && obj2); | assert(obj1==m_physCtrl && obj2); | ||||
| KX_GameObject* myobj = (KX_GameObject*)GetParent(); | KX_GameObject* myobj = (KX_GameObject*)GetParent(); | ||||
| KX_GameObject* myparent = myobj->GetParent(); | KX_GameObject* myparent = myobj->GetParent(); | ||||
| KX_ClientObjectInfo *client_info = static_cast<KX_ClientObjectInfo*>(((PHY_IPhysicsController*)obj2)->GetNewClientInfo()); | KX_ClientObjectInfo *client_info = static_cast<KX_ClientObjectInfo*>(((PHY_IPhysicsController*)obj2)->GetNewClientInfo()); | ||||
| KX_ClientObjectInfo *my_client_info = static_cast<KX_ClientObjectInfo*>(m_physCtrl->GetNewClientInfo()); | KX_ClientObjectInfo *my_client_info = static_cast<KX_ClientObjectInfo*>(m_physCtrl->GetNewClientInfo()); | ||||
| KX_GameObject* otherobj = ( client_info ? client_info->m_gameobject : NULL); | KX_GameObject* otherobj = ( client_info ? client_info->m_gameobject : NULL); | ||||
| Show All 18 Lines | if (!found) | ||||
| } else | } else | ||||
| { | { | ||||
| found = (otherobj->GetProperty(m_touchedpropname) != NULL); | found = (otherobj->GetProperty(m_touchedpropname) != NULL); | ||||
| } | } | ||||
| } | } | ||||
| return found; | return found; | ||||
| } | } | ||||
| bool KX_TouchSensor::NewHandleCollision(void*object1,void*object2,const PHY_CollData* colldata) | bool SCA_TouchSensor::NewHandleCollision(void*object1,void*object2,const PHY_CollData* colldata) | ||||
| { | { | ||||
| // KX_TouchEventManager* toucheventmgr = (KX_TouchEventManager*)m_eventmgr; | // SCA_TouchEventManager* toucheventmgr = (SCA_TouchEventManager*)m_eventmgr; | ||||
| KX_GameObject* parent = (KX_GameObject*)GetParent(); | KX_GameObject* parent = (KX_GameObject*)GetParent(); | ||||
| // need the mapping from PHY_IPhysicsController to gameobjects now | // need the mapping from PHY_IPhysicsController to gameobjects now | ||||
| KX_ClientObjectInfo *client_info = static_cast<KX_ClientObjectInfo*> (object1 == m_physCtrl? | KX_ClientObjectInfo *client_info = static_cast<KX_ClientObjectInfo*> (object1 == m_physCtrl? | ||||
| ((PHY_IPhysicsController*)object2)->GetNewClientInfo(): | ((PHY_IPhysicsController*)object2)->GetNewClientInfo(): | ||||
| ((PHY_IPhysicsController*)object1)->GetNewClientInfo()); | ((PHY_IPhysicsController*)object1)->GetNewClientInfo()); | ||||
| Show All 27 Lines | if (found) | ||||
| m_colliders->Add(gameobj->AddRef()); | m_colliders->Add(gameobj->AddRef()); | ||||
| if (m_bTouchPulse) | if (m_bTouchPulse) | ||||
| m_bColliderHash += (uint_ptr)(static_cast<void *>(&gameobj)); | m_bColliderHash += (uint_ptr)(static_cast<void *>(&gameobj)); | ||||
| } | } | ||||
| m_bTriggered = true; | m_bTriggered = true; | ||||
| m_hitObject = gameobj; | m_hitObject = gameobj; | ||||
| m_hitMaterial = (client_info->m_auxilary_info ? (char*)client_info->m_auxilary_info : ""); | m_hitMaterial = (client_info->m_auxilary_info ? (char*)client_info->m_auxilary_info : ""); | ||||
| //printf("KX_TouchSensor::HandleCollision\n"); | //printf("SCA_TouchSensor::HandleCollision\n"); | ||||
| } | } | ||||
| } | } | ||||
| return false; // was DT_CONTINUE but this was defined in sumo as false. | return false; // was DT_CONTINUE but this was defined in sumo as false. | ||||
| } | } | ||||
| #ifdef WITH_PYTHON | #ifdef WITH_PYTHON | ||||
| /* ------------------------------------------------------------------------- */ | /* ------------------------------------------------------------------------- */ | ||||
| /* Python functions */ | /* Python functions */ | ||||
| /* ------------------------------------------------------------------------- */ | /* ------------------------------------------------------------------------- */ | ||||
| /* Integration hooks ------------------------------------------------------- */ | /* Integration hooks ------------------------------------------------------- */ | ||||
| PyTypeObject KX_TouchSensor::Type = { | PyTypeObject SCA_TouchSensor::Type = { | ||||
| PyVarObject_HEAD_INIT(NULL, 0) | PyVarObject_HEAD_INIT(NULL, 0) | ||||
| "KX_TouchSensor", | "SCA_TouchSensor", | ||||
| sizeof(PyObjectPlus_Proxy), | sizeof(PyObjectPlus_Proxy), | ||||
| 0, | 0, | ||||
| py_base_dealloc, | py_base_dealloc, | ||||
| 0, | 0, | ||||
| 0, | 0, | ||||
| 0, | 0, | ||||
| 0, | 0, | ||||
| py_base_repr, | py_base_repr, | ||||
| 0,0,0,0,0,0,0,0,0, | 0,0,0,0,0,0,0,0,0, | ||||
| Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, | Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, | ||||
| 0,0,0,0,0,0,0, | 0,0,0,0,0,0,0, | ||||
| Methods, | Methods, | ||||
| 0, | 0, | ||||
| 0, | 0, | ||||
| &SCA_ISensor::Type, | &SCA_ISensor::Type, | ||||
| 0,0,0,0,0,0, | 0,0,0,0,0,0, | ||||
| py_base_new | py_base_new | ||||
| }; | }; | ||||
| PyMethodDef KX_TouchSensor::Methods[] = { | PyMethodDef SCA_TouchSensor::Methods[] = { | ||||
| {NULL,NULL} //Sentinel | {NULL,NULL} //Sentinel | ||||
| }; | }; | ||||
| PyAttributeDef KX_TouchSensor::Attributes[] = { | PyAttributeDef SCA_TouchSensor::Attributes[] = { | ||||
| KX_PYATTRIBUTE_STRING_RW("propName",0,MAX_PROP_NAME,false,KX_TouchSensor,m_touchedpropname), | KX_PYATTRIBUTE_STRING_RW("propName",0,MAX_PROP_NAME,false,SCA_TouchSensor,m_touchedpropname), | ||||
| KX_PYATTRIBUTE_BOOL_RW("useMaterial",KX_TouchSensor,m_bFindMaterial), | KX_PYATTRIBUTE_BOOL_RW("useMaterial",SCA_TouchSensor,m_bFindMaterial), | ||||
| KX_PYATTRIBUTE_BOOL_RW("usePulseCollision",KX_TouchSensor,m_bTouchPulse), | KX_PYATTRIBUTE_BOOL_RW("usePulseCollision",SCA_TouchSensor,m_bTouchPulse), | ||||
| KX_PYATTRIBUTE_STRING_RO("hitMaterial", KX_TouchSensor, m_hitMaterial), | KX_PYATTRIBUTE_STRING_RO("hitMaterial", SCA_TouchSensor, m_hitMaterial), | ||||
| KX_PYATTRIBUTE_RO_FUNCTION("hitObject", KX_TouchSensor, pyattr_get_object_hit), | KX_PYATTRIBUTE_RO_FUNCTION("hitObject", SCA_TouchSensor, pyattr_get_object_hit), | ||||
| KX_PYATTRIBUTE_RO_FUNCTION("hitObjectList", KX_TouchSensor, pyattr_get_object_hit_list), | KX_PYATTRIBUTE_RO_FUNCTION("hitObjectList", SCA_TouchSensor, pyattr_get_object_hit_list), | ||||
| { NULL } //Sentinel | { NULL } //Sentinel | ||||
| }; | }; | ||||
| /* Python API */ | /* Python API */ | ||||
| PyObject *KX_TouchSensor::pyattr_get_object_hit(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) | PyObject *SCA_TouchSensor::pyattr_get_object_hit(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) | ||||
| { | { | ||||
| KX_TouchSensor* self = static_cast<KX_TouchSensor*>(self_v); | SCA_TouchSensor* self = static_cast<SCA_TouchSensor*>(self_v); | ||||
| if (self->m_hitObject) | if (self->m_hitObject) | ||||
| return self->m_hitObject->GetProxy(); | return self->m_hitObject->GetProxy(); | ||||
| else | else | ||||
| Py_RETURN_NONE; | Py_RETURN_NONE; | ||||
| } | } | ||||
| PyObject *KX_TouchSensor::pyattr_get_object_hit_list(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) | PyObject *SCA_TouchSensor::pyattr_get_object_hit_list(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) | ||||
| { | { | ||||
| KX_TouchSensor* self = static_cast<KX_TouchSensor*>(self_v); | SCA_TouchSensor* self = static_cast<SCA_TouchSensor*>(self_v); | ||||
| return self->m_colliders->GetProxy(); | return self->m_colliders->GetProxy(); | ||||
| } | } | ||||
| #endif | #endif | ||||
| /* eof */ | /* eof */ | ||||