Changeset View
Changeset View
Standalone View
Standalone View
source/gameengine/GameLogic/SCA_NearSensor.cpp
- This file was moved from source/gameengine/Ketsji/KX_NearSensor.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_NearSensor.cpp | /** \file gameengine/GameLogic/SCA_NearSensor.cpp | ||||
| * \ingroup ketsji | * \ingroup gamelogic | ||||
| */ | */ | ||||
| #include "KX_NearSensor.h" | #include "SCA_NearSensor.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 "KX_Scene.h" // needed to create a replica | #include "KX_Scene.h" // needed to create a replica | ||||
| #include "PHY_IPhysicsEnvironment.h" | #include "PHY_IPhysicsEnvironment.h" | ||||
| #include "PHY_IPhysicsController.h" | #include "PHY_IPhysicsController.h" | ||||
| #include "PHY_IMotionState.h" | #include "PHY_IMotionState.h" | ||||
| KX_NearSensor::KX_NearSensor(SCA_EventManager* eventmgr, | SCA_NearSensor::SCA_NearSensor(SCA_EventManager* eventmgr, | ||||
| KX_GameObject* gameobj, | KX_GameObject* gameobj, | ||||
| float margin, | float margin, | ||||
| float resetmargin, | float resetmargin, | ||||
| bool bFindMaterial, | bool bFindMaterial, | ||||
| const STR_String& touchedpropname, | const STR_String& touchedpropname, | ||||
| PHY_IPhysicsController* ctrl) | PHY_IPhysicsController* ctrl) | ||||
| :KX_TouchSensor(eventmgr, | :SCA_TouchSensor(eventmgr, | ||||
| gameobj, | gameobj, | ||||
| bFindMaterial, | bFindMaterial, | ||||
| false, | false, | ||||
| touchedpropname), | touchedpropname), | ||||
| m_Margin(margin), | m_Margin(margin), | ||||
| m_ResetMargin(resetmargin) | m_ResetMargin(resetmargin) | ||||
| { | { | ||||
| gameobj->getClientInfo()->m_sensors.remove(this); | gameobj->getClientInfo()->m_sensors.remove(this); | ||||
| m_client_info = new KX_ClientObjectInfo(gameobj, KX_ClientObjectInfo::SENSOR); | m_client_info = new KX_ClientObjectInfo(gameobj, KX_ClientObjectInfo::SENSOR); | ||||
| m_client_info->m_sensors.push_back(this); | m_client_info->m_sensors.push_back(this); | ||||
| //DT_ShapeHandle shape = (DT_ShapeHandle) vshape; | //DT_ShapeHandle shape = (DT_ShapeHandle) vshape; | ||||
| m_physCtrl = ctrl; | m_physCtrl = ctrl; | ||||
| if (m_physCtrl) | if (m_physCtrl) | ||||
| { | { | ||||
| m_physCtrl->SetMargin(m_Margin); | m_physCtrl->SetMargin(m_Margin); | ||||
| m_physCtrl->SetNewClientInfo(m_client_info); | m_physCtrl->SetNewClientInfo(m_client_info); | ||||
| } | } | ||||
| SynchronizeTransform(); | SynchronizeTransform(); | ||||
| } | } | ||||
| void KX_NearSensor::SynchronizeTransform() | void SCA_NearSensor::SynchronizeTransform() | ||||
| { | { | ||||
| // The near and radar sensors are using a different physical object which is | // The near and radar sensors are using a different physical object which is | ||||
| // not linked to the parent object, must synchronize it. | // not linked to the parent object, must synchronize it. | ||||
| if (m_physCtrl) | if (m_physCtrl) | ||||
| { | { | ||||
| PHY_IMotionState* motionState = m_physCtrl->GetMotionState(); | PHY_IMotionState* motionState = m_physCtrl->GetMotionState(); | ||||
| KX_GameObject* parent = ((KX_GameObject*)GetParent()); | KX_GameObject* parent = ((KX_GameObject*)GetParent()); | ||||
| const MT_Point3& pos = parent->NodeGetWorldPosition(); | const MT_Point3& pos = parent->NodeGetWorldPosition(); | ||||
| float ori[12]; | float ori[12]; | ||||
| parent->NodeGetWorldOrientation().getValue(ori); | parent->NodeGetWorldOrientation().getValue(ori); | ||||
| motionState->SetWorldPosition(pos[0], pos[1], pos[2]); | motionState->SetWorldPosition(pos[0], pos[1], pos[2]); | ||||
| motionState->SetWorldOrientation(ori); | motionState->SetWorldOrientation(ori); | ||||
| m_physCtrl->WriteMotionStateToDynamics(true); | m_physCtrl->WriteMotionStateToDynamics(true); | ||||
| } | } | ||||
| } | } | ||||
| CValue* KX_NearSensor::GetReplica() | CValue* SCA_NearSensor::GetReplica() | ||||
| { | { | ||||
| KX_NearSensor* replica = new KX_NearSensor(*this); | SCA_NearSensor* replica = new SCA_NearSensor(*this); | ||||
| replica->ProcessReplica(); | replica->ProcessReplica(); | ||||
| return replica; | return replica; | ||||
| } | } | ||||
| void KX_NearSensor::ProcessReplica() | void SCA_NearSensor::ProcessReplica() | ||||
| { | { | ||||
| KX_TouchSensor::ProcessReplica(); | SCA_TouchSensor::ProcessReplica(); | ||||
| m_client_info = new KX_ClientObjectInfo(m_client_info->m_gameobject, KX_ClientObjectInfo::SENSOR); | m_client_info = new KX_ClientObjectInfo(m_client_info->m_gameobject, KX_ClientObjectInfo::SENSOR); | ||||
| if (m_physCtrl) | if (m_physCtrl) | ||||
| { | { | ||||
| m_physCtrl = m_physCtrl->GetReplicaForSensors(); | m_physCtrl = m_physCtrl->GetReplicaForSensors(); | ||||
| if (m_physCtrl) | if (m_physCtrl) | ||||
| { | { | ||||
| //static_cast<KX_TouchEventManager*>(m_eventmgr)->GetPhysicsEnvironment()->addSensor(replica->m_physCtrl); | //static_cast<SCA_TouchEventManager*>(m_eventmgr)->GetPhysicsEnvironment()->addSensor(replica->m_physCtrl); | ||||
| m_physCtrl->SetMargin(m_Margin); | m_physCtrl->SetMargin(m_Margin); | ||||
| m_physCtrl->SetNewClientInfo(m_client_info); | m_physCtrl->SetNewClientInfo(m_client_info); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| void KX_NearSensor::ReParent(SCA_IObject* parent) | void SCA_NearSensor::ReParent(SCA_IObject* parent) | ||||
| { | { | ||||
| SCA_ISensor::ReParent(parent); | SCA_ISensor::ReParent(parent); | ||||
| m_client_info->m_gameobject = static_cast<KX_GameObject*>(parent); | m_client_info->m_gameobject = static_cast<KX_GameObject*>(parent); | ||||
| m_client_info->m_sensors.push_back(this); | m_client_info->m_sensors.push_back(this); | ||||
| //Synchronize here with the actual parent. | //Synchronize here with the actual parent. | ||||
| SynchronizeTransform(); | SynchronizeTransform(); | ||||
| } | } | ||||
| KX_NearSensor::~KX_NearSensor() | SCA_NearSensor::~SCA_NearSensor() | ||||
| { | { | ||||
| // for nearsensor, the sensor is the 'owner' of sumoobj | // for nearsensor, the sensor is the 'owner' of sumoobj | ||||
| // for touchsensor, it's the parent | // for touchsensor, it's the parent | ||||
| if (m_physCtrl) | if (m_physCtrl) | ||||
| { | { | ||||
| //static_cast<KX_TouchEventManager*>(m_eventmgr)->GetPhysicsEnvironment()->removeSensor(m_physCtrl); | //static_cast<SCA_TouchEventManager*>(m_eventmgr)->GetPhysicsEnvironment()->removeSensor(m_physCtrl); | ||||
| delete m_physCtrl; | delete m_physCtrl; | ||||
| m_physCtrl = NULL; | m_physCtrl = NULL; | ||||
| } | } | ||||
| if (m_client_info) | if (m_client_info) | ||||
| delete m_client_info; | delete m_client_info; | ||||
| } | } | ||||
| void KX_NearSensor::SetPhysCtrlRadius() | void SCA_NearSensor::SetPhysCtrlRadius() | ||||
| { | { | ||||
| if (m_bTriggered) | if (m_bTriggered) | ||||
| { | { | ||||
| if (m_physCtrl) | if (m_physCtrl) | ||||
| { | { | ||||
| m_physCtrl->SetRadius(m_ResetMargin); | m_physCtrl->SetRadius(m_ResetMargin); | ||||
| } | } | ||||
| } else | } else | ||||
| { | { | ||||
| if (m_physCtrl) | if (m_physCtrl) | ||||
| { | { | ||||
| m_physCtrl->SetRadius(m_Margin); | m_physCtrl->SetRadius(m_Margin); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| bool KX_NearSensor::Evaluate() | bool SCA_NearSensor::Evaluate() | ||||
| { | { | ||||
| bool result = false; | bool result = false; | ||||
| // KX_GameObject* parent = static_cast<KX_GameObject*>(GetParent()); | // KX_GameObject* parent = static_cast<KX_GameObject*>(GetParent()); | ||||
| if (m_bTriggered != m_bLastTriggered) | if (m_bTriggered != m_bLastTriggered) | ||||
| { | { | ||||
| m_bLastTriggered = m_bTriggered; | m_bLastTriggered = m_bTriggered; | ||||
| SetPhysCtrlRadius(); | SetPhysCtrlRadius(); | ||||
| result = true; | result = true; | ||||
| } | } | ||||
| return result; | return result; | ||||
| } | } | ||||
| // this function is called at broad phase stage to check if the two controller | // this function is called at broad phase stage to check if the two controller | ||||
| // need to interact at all. It is used for Near/Radar sensor that don't need to | // need to interact at all. It is used for Near/Radar sensor that don't need to | ||||
| // check collision with object not included in filter | // check collision with object not included in filter | ||||
| bool KX_NearSensor::BroadPhaseFilterCollision(void*obj1,void*obj2) | bool SCA_NearSensor::BroadPhaseFilterCollision(void*obj1,void*obj2) | ||||
| { | { | ||||
| KX_GameObject* parent = static_cast<KX_GameObject*>(GetParent()); | KX_GameObject* parent = static_cast<KX_GameObject*>(GetParent()); | ||||
| // need the mapping from PHY_IPhysicsController to gameobjects now | // need the mapping from PHY_IPhysicsController to gameobjects now | ||||
| assert(obj1==m_physCtrl && obj2); | assert(obj1==m_physCtrl && obj2); | ||||
| KX_ClientObjectInfo *client_info = static_cast<KX_ClientObjectInfo*>((static_cast<PHY_IPhysicsController*>(obj2))->GetNewClientInfo()); | KX_ClientObjectInfo *client_info = static_cast<KX_ClientObjectInfo*>((static_cast<PHY_IPhysicsController*>(obj2))->GetNewClientInfo()); | ||||
| KX_GameObject* gameobj = ( client_info ? | KX_GameObject* gameobj = ( client_info ? | ||||
| Show All 11 Lines | if (client_info->m_type == KX_ClientObjectInfo::ACTOR) | ||||
| return true; | return true; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| return false; | return false; | ||||
| } | } | ||||
| bool KX_NearSensor::NewHandleCollision(void *obj1, void *obj2, const PHY_CollData *coll_data) | bool SCA_NearSensor::NewHandleCollision(void *obj1, void *obj2, const PHY_CollData *coll_data) | ||||
| { | { | ||||
| // KX_TouchEventManager* toucheventmgr = static_cast<KX_TouchEventManager*>(m_eventmgr); | // SCA_TouchEventManager* toucheventmgr = static_cast<SCA_TouchEventManager*>(m_eventmgr); | ||||
| // KX_GameObject* parent = static_cast<KX_GameObject*>(GetParent()); | // KX_GameObject* parent = static_cast<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*> (obj1 == m_physCtrl? | KX_ClientObjectInfo *client_info = static_cast<KX_ClientObjectInfo*> (obj1 == m_physCtrl? | ||||
| ((PHY_IPhysicsController*)obj2)->GetNewClientInfo() : | ((PHY_IPhysicsController*)obj2)->GetNewClientInfo() : | ||||
| ((PHY_IPhysicsController*)obj1)->GetNewClientInfo()); | ((PHY_IPhysicsController*)obj1)->GetNewClientInfo()); | ||||
| Show All 29 Lines | |||||
| /* ------------------------------------------------------------------------- */ | /* ------------------------------------------------------------------------- */ | ||||
| /* Python Functions */ | /* Python Functions */ | ||||
| /* ------------------------------------------------------------------------- */ | /* ------------------------------------------------------------------------- */ | ||||
| /* ------------------------------------------------------------------------- */ | /* ------------------------------------------------------------------------- */ | ||||
| /* Python Integration Hooks */ | /* Python Integration Hooks */ | ||||
| /* ------------------------------------------------------------------------- */ | /* ------------------------------------------------------------------------- */ | ||||
| PyTypeObject KX_NearSensor::Type = { | PyTypeObject SCA_NearSensor::Type = { | ||||
| PyVarObject_HEAD_INIT(NULL, 0) | PyVarObject_HEAD_INIT(NULL, 0) | ||||
| "KX_NearSensor", | "SCA_NearSensor", | ||||
| 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, | ||||
| &KX_TouchSensor::Type, | &SCA_TouchSensor::Type, | ||||
| 0,0,0,0,0,0, | 0,0,0,0,0,0, | ||||
| py_base_new | py_base_new | ||||
| }; | }; | ||||
| PyMethodDef KX_NearSensor::Methods[] = { | PyMethodDef SCA_NearSensor::Methods[] = { | ||||
| //No methods | //No methods | ||||
| {NULL,NULL} //Sentinel | {NULL,NULL} //Sentinel | ||||
| }; | }; | ||||
| PyAttributeDef KX_NearSensor::Attributes[] = { | PyAttributeDef SCA_NearSensor::Attributes[] = { | ||||
| KX_PYATTRIBUTE_FLOAT_RW_CHECK("distance", 0, 10000, KX_NearSensor, m_Margin, CheckResetDistance), | KX_PYATTRIBUTE_FLOAT_RW_CHECK("distance", 0, 10000, SCA_NearSensor, m_Margin, CheckResetDistance), | ||||
| KX_PYATTRIBUTE_FLOAT_RW_CHECK("resetDistance", 0, 10000, KX_NearSensor, m_ResetMargin, CheckResetDistance), | KX_PYATTRIBUTE_FLOAT_RW_CHECK("resetDistance", 0, 10000, SCA_NearSensor, m_ResetMargin, CheckResetDistance), | ||||
| {NULL} //Sentinel | {NULL} //Sentinel | ||||
| }; | }; | ||||
| #endif // WITH_PYTHON | #endif // WITH_PYTHON | ||||