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:
Diffstat (limited to 'source/gameengine/Ketsji/KX_TouchSensor.cpp')
-rw-r--r--source/gameengine/Ketsji/KX_TouchSensor.cpp362
1 files changed, 0 insertions, 362 deletions
diff --git a/source/gameengine/Ketsji/KX_TouchSensor.cpp b/source/gameengine/Ketsji/KX_TouchSensor.cpp
deleted file mode 100644
index d5598164eb0..00000000000
--- a/source/gameengine/Ketsji/KX_TouchSensor.cpp
+++ /dev/null
@@ -1,362 +0,0 @@
-/*
- * Senses touch and collision events
- *
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file gameengine/Ketsji/KX_TouchSensor.cpp
- * \ingroup ketsji
- */
-
-
-#include "KX_TouchSensor.h"
-#include "SCA_EventManager.h"
-#include "SCA_LogicManager.h"
-#include "KX_GameObject.h"
-#include "KX_TouchEventManager.h"
-
-#include "PHY_IPhysicsController.h"
-
-#include "RAS_MeshObject.h"
-
-#include <iostream>
-#include "PHY_IPhysicsEnvironment.h"
-
-/* ------------------------------------------------------------------------- */
-/* Native functions */
-/* ------------------------------------------------------------------------- */
-
-void KX_TouchSensor::SynchronizeTransform()
-{
- // the touch sensor does not require any synchronization: it uses
- // the same physical object which is already synchronized by Blender
-}
-
-
-void KX_TouchSensor::EndFrame()
-{
- m_colliders->ReleaseAndRemoveAll();
- m_hitObject = NULL;
- m_bTriggered = false;
- m_bColliderHash = 0;
-}
-
-void KX_TouchSensor::UnregisterToManager()
-{
- // before unregistering the sensor, make sure we release all references
- EndFrame();
- SCA_ISensor::UnregisterToManager();
-}
-
-bool KX_TouchSensor::Evaluate()
-{
- bool result = false;
- bool reset = m_reset && m_level;
- m_reset = false;
- if (m_bTriggered != m_bLastTriggered)
- {
- m_bLastTriggered = m_bTriggered;
- if (!m_bTriggered)
- m_hitObject = NULL;
- result = true;
- }
- if (reset)
- // force an event
- result = true;
-
- if (m_bTouchPulse) { /* pulse on changes to the colliders */
- int count = m_colliders->GetCount();
-
- if (m_bLastCount!=count || m_bColliderHash!=m_bLastColliderHash) {
- m_bLastCount = count;
- m_bLastColliderHash= m_bColliderHash;
- result = true;
- }
- }
- return result;
-}
-
-KX_TouchSensor::KX_TouchSensor(SCA_EventManager* eventmgr,KX_GameObject* gameobj,bool bFindMaterial,bool bTouchPulse,const STR_String& touchedpropname)
-:SCA_ISensor(gameobj,eventmgr),
-m_touchedpropname(touchedpropname),
-m_bFindMaterial(bFindMaterial),
-m_bTouchPulse(bTouchPulse),
-m_hitMaterial("")
-/*m_sumoObj(sumoObj),*/
-{
-// KX_TouchEventManager* touchmgr = (KX_TouchEventManager*) eventmgr;
-// m_resptable = touchmgr->GetResponseTable();
-
-// m_solidHandle = m_sumoObj->getObjectHandle();
-
- m_colliders = new CListValue();
-
- KX_ClientObjectInfo *client_info = gameobj->getClientInfo();
- //client_info->m_gameobject = gameobj;
- //client_info->m_auxilary_info = NULL;
- client_info->m_sensors.push_back(this);
-
- m_physCtrl = gameobj->GetPhysicsController();
- MT_assert( !gameobj->GetPhysicsController() || m_physCtrl );
- Init();
-}
-
-void KX_TouchSensor::Init()
-{
- m_bCollision = false;
- m_bTriggered = false;
- m_bLastTriggered = (m_invert)?true:false;
- m_bLastCount = 0;
- m_bColliderHash = m_bLastColliderHash = 0;
- m_hitObject = NULL;
- m_reset = true;
-}
-
-KX_TouchSensor::~KX_TouchSensor()
-{
- //DT_ClearObjectResponse(m_resptable,m_solidHandle);
- m_colliders->Release();
-}
-
-CValue* KX_TouchSensor::GetReplica()
-{
- KX_TouchSensor* replica = new KX_TouchSensor(*this);
- replica->ProcessReplica();
- return replica;
-}
-
-void KX_TouchSensor::ProcessReplica()
-{
- SCA_ISensor::ProcessReplica();
- m_colliders = new CListValue();
- Init();
-}
-
-void KX_TouchSensor::ReParent(SCA_IObject* parent)
-{
- KX_GameObject *gameobj = static_cast<KX_GameObject *>(parent);
- PHY_IPhysicsController *sphy = ((KX_GameObject*)parent)->GetPhysicsController();
- if (sphy)
- m_physCtrl = sphy;
-
-// m_solidHandle = m_sumoObj->getObjectHandle();
- KX_ClientObjectInfo *client_info = gameobj->getClientInfo();
- //client_info->m_gameobject = gameobj;
- //client_info->m_auxilary_info = NULL;
-
- client_info->m_sensors.push_back(this);
- SCA_ISensor::ReParent(parent);
-}
-
-void KX_TouchSensor::RegisterSumo(KX_TouchEventManager *touchman)
-{
- if (m_physCtrl)
- {
- if (touchman->GetPhysicsEnvironment()->RequestCollisionCallback(m_physCtrl))
- {
- KX_ClientObjectInfo *client_info = static_cast<KX_ClientObjectInfo*>(m_physCtrl->GetNewClientInfo());
- if (client_info->isSensor())
- touchman->GetPhysicsEnvironment()->AddSensor(m_physCtrl);
- }
- }
-}
-void KX_TouchSensor::UnregisterSumo(KX_TouchEventManager* touchman)
-{
- if (m_physCtrl)
- {
- if (touchman->GetPhysicsEnvironment()->RemoveCollisionCallback(m_physCtrl))
- {
- // 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());
- if (client_info->isSensor())
- touchman->GetPhysicsEnvironment()->RemoveSensor(m_physCtrl);
- }
- }
-}
-
-// this function is called only for sensor objects
-// return true if the controller can collide with the object
-bool KX_TouchSensor::BroadPhaseSensorFilterCollision(void*obj1,void*obj2)
-{
- assert(obj1==m_physCtrl && obj2);
-
- KX_GameObject* myobj = (KX_GameObject*)GetParent();
- KX_GameObject* myparent = myobj->GetParent();
- 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_GameObject* otherobj = ( client_info ? client_info->m_gameobject : NULL);
-
- // we can only check on persistent characteristic: m_link and m_suspended are not
- // good candidate because they are transient. That must be handled at another level
- if (!otherobj ||
- otherobj == myparent || // don't interact with our parent
- (my_client_info->m_type == KX_ClientObjectInfo::OBACTORSENSOR &&
- client_info->m_type != KX_ClientObjectInfo::ACTOR)) // only with actor objects
- return false;
-
- bool found = m_touchedpropname.IsEmpty();
- if (!found)
- {
- if (m_bFindMaterial) {
- for (unsigned int i = 0; i < otherobj->GetMeshCount(); ++i) {
- RAS_MeshObject *meshObj = otherobj->GetMesh(i);
- for (unsigned int j = 0; j < meshObj->NumMaterials(); ++j) {
- found = strcmp(m_touchedpropname.ReadPtr(), meshObj->GetMaterialName(j).ReadPtr() + 2) == 0;
- if (found)
- break;
- }
- }
- }
- else {
- found = (otherobj->GetProperty(m_touchedpropname) != NULL);
- }
- }
- return found;
-}
-
-bool KX_TouchSensor::NewHandleCollision(void*object1,void*object2,const PHY_CollData* colldata)
-{
-// KX_TouchEventManager* toucheventmgr = (KX_TouchEventManager*)m_eventmgr;
- KX_GameObject* parent = (KX_GameObject*)GetParent();
-
- // need the mapping from PHY_IPhysicsController to gameobjects now
-
- KX_ClientObjectInfo *client_info = static_cast<KX_ClientObjectInfo*> (object1 == m_physCtrl?
- ((PHY_IPhysicsController*)object2)->GetNewClientInfo():
- ((PHY_IPhysicsController*)object1)->GetNewClientInfo());
-
- KX_GameObject* gameobj = ( client_info ?
- client_info->m_gameobject :
- NULL);
-
- // add the same check as in SCA_ISensor::Activate(),
- // we don't want to record collision when the sensor is not active.
- if (m_links && !m_suspended &&
- gameobj && (gameobj != parent) && client_info->isActor())
- {
-
- bool found = m_touchedpropname.IsEmpty();
- bool hitMaterial = false;
- if (!found)
- {
- if (m_bFindMaterial) {
- for (unsigned int i = 0; i < gameobj->GetMeshCount(); ++i) {
- RAS_MeshObject *meshObj = gameobj->GetMesh(i);
- for (unsigned int j = 0; j < meshObj->NumMaterials(); ++j) {
- found = strcmp(m_touchedpropname.ReadPtr(), meshObj->GetMaterialName(j).ReadPtr() + 2) == 0;
- if (found) {
- hitMaterial = true;
- break;
- }
- }
- }
- }
- else {
- found = (gameobj->GetProperty(m_touchedpropname) != NULL);
- }
- }
- if (found)
- {
- if (!m_colliders->SearchValue(gameobj)) {
- m_colliders->Add(gameobj->AddRef());
-
- if (m_bTouchPulse)
- m_bColliderHash += (uint_ptr)(static_cast<void *>(&gameobj));
- }
- m_bTriggered = true;
- m_hitObject = gameobj;
- m_hitMaterial = hitMaterial;
- //printf("KX_TouchSensor::HandleCollision\n");
- }
-
- }
- return false; // was DT_CONTINUE but this was defined in sumo as false.
-}
-
-#ifdef WITH_PYTHON
-
-/* ------------------------------------------------------------------------- */
-/* Python functions */
-/* ------------------------------------------------------------------------- */
-/* Integration hooks ------------------------------------------------------- */
-PyTypeObject KX_TouchSensor::Type = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "KX_TouchSensor",
- sizeof(PyObjectPlus_Proxy),
- 0,
- py_base_dealloc,
- 0,
- 0,
- 0,
- 0,
- py_base_repr,
- 0,0,0,0,0,0,0,0,0,
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
- 0,0,0,0,0,0,0,
- Methods,
- 0,
- 0,
- &SCA_ISensor::Type,
- 0,0,0,0,0,0,
- py_base_new
-};
-
-PyMethodDef KX_TouchSensor::Methods[] = {
- {NULL,NULL} //Sentinel
-};
-
-PyAttributeDef KX_TouchSensor::Attributes[] = {
- KX_PYATTRIBUTE_STRING_RW("propName",0,MAX_PROP_NAME,false,KX_TouchSensor,m_touchedpropname),
- KX_PYATTRIBUTE_BOOL_RW("useMaterial",KX_TouchSensor,m_bFindMaterial),
- KX_PYATTRIBUTE_BOOL_RW("usePulseCollision",KX_TouchSensor,m_bTouchPulse),
- KX_PYATTRIBUTE_STRING_RO("hitMaterial", KX_TouchSensor, m_hitMaterial),
- KX_PYATTRIBUTE_RO_FUNCTION("hitObject", KX_TouchSensor, pyattr_get_object_hit),
- KX_PYATTRIBUTE_RO_FUNCTION("hitObjectList", KX_TouchSensor, pyattr_get_object_hit_list),
- { NULL } //Sentinel
-};
-
-/* Python API */
-
-PyObject *KX_TouchSensor::pyattr_get_object_hit(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
-{
- KX_TouchSensor* self = static_cast<KX_TouchSensor*>(self_v);
-
- if (self->m_hitObject)
- return self->m_hitObject->GetProxy();
- else
- Py_RETURN_NONE;
-}
-
-PyObject *KX_TouchSensor::pyattr_get_object_hit_list(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
-{
- KX_TouchSensor* self = static_cast<KX_TouchSensor*>(self_v);
- return self->m_colliders->GetProxy();
-}
-
-#endif
-
-/* eof */