[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29481] branches/soc-2010-nicks/source/ gameengine: - registration obstacle in game object
Nick Samarin
nicks1987 at bigmir.net
Wed Jun 16 02:23:24 CEST 2010
Revision: 29481
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29481
Author: nicks
Date: 2010-06-16 02:23:24 +0200 (Wed, 16 Jun 2010)
Log Message:
-----------
- registration obstacle in game object
- creation obstacle on object replication (including navmesh object)
- creation object transform for navigation mesh directly from blender object instead of using SGNode world transform (because SGNode doesn't exists yet when building navmesh on ProcessReplica)
Modified Paths:
--------------
branches/soc-2010-nicks/source/gameengine/Converter/BL_BlenderDataConversion.cpp
branches/soc-2010-nicks/source/gameengine/Ketsji/KX_GameObject.cpp
branches/soc-2010-nicks/source/gameengine/Ketsji/KX_GameObject.h
branches/soc-2010-nicks/source/gameengine/Ketsji/KX_NavMeshObject.cpp
branches/soc-2010-nicks/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp
branches/soc-2010-nicks/source/gameengine/Ketsji/KX_ObstacleSimulation.h
branches/soc-2010-nicks/source/gameengine/Ketsji/KX_SteeringActuator.cpp
Modified: branches/soc-2010-nicks/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- branches/soc-2010-nicks/source/gameengine/Converter/BL_BlenderDataConversion.cpp 2010-06-15 21:51:15 UTC (rev 29480)
+++ branches/soc-2010-nicks/source/gameengine/Converter/BL_BlenderDataConversion.cpp 2010-06-16 00:23:24 UTC (rev 29481)
@@ -2655,20 +2655,30 @@
}
}
- //build navigation mesh
- for ( i=0;i<objectlist->GetCount();i++)
+ //process navigation mesh objects
+ for ( i=0; i<objectlist->GetCount();i++)
{
KX_GameObject* gameobj = static_cast<KX_GameObject*>(objectlist->GetValue(i));
struct Object* blenderobject = gameobj->GetBlenderObject();
if (blenderobject->type==OB_MESH && (blenderobject->gameflag & OB_NAVMESH))
{
KX_NavMeshObject* navmesh = static_cast<KX_NavMeshObject*>(gameobj);
+ navmesh->SetVisible(0, true);
navmesh->BuildNavMesh();
- navmesh->SetVisible(0, true);
if (obssimulation)
obssimulation->AddObstaclesForNavMesh(navmesh);
}
}
+ for ( i=0; i<inactivelist->GetCount();i++)
+ {
+ KX_GameObject* gameobj = static_cast<KX_GameObject*>(inactivelist->GetValue(i));
+ struct Object* blenderobject = gameobj->GetBlenderObject();
+ if (blenderobject->type==OB_MESH && (blenderobject->gameflag & OB_NAVMESH))
+ {
+ KX_NavMeshObject* navmesh = static_cast<KX_NavMeshObject*>(gameobj);
+ navmesh->SetVisible(0, true);
+ }
+ }
#define CONVERT_LOGIC
#ifdef CONVERT_LOGIC
Modified: branches/soc-2010-nicks/source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- branches/soc-2010-nicks/source/gameengine/Ketsji/KX_GameObject.cpp 2010-06-15 21:51:15 UTC (rev 29480)
+++ branches/soc-2010-nicks/source/gameengine/Ketsji/KX_GameObject.cpp 2010-06-16 00:23:24 UTC (rev 29481)
@@ -67,6 +67,7 @@
#include "SCA_ISensor.h"
#include "SCA_IController.h"
#include "NG_NetworkScene.h" //Needed for sendMessage()
+#include "KX_ObstacleSimulation.h"
#include "PyObjectPlus.h" /* python stuff */
@@ -101,6 +102,7 @@
m_pGraphicController(NULL),
m_xray(false),
m_pHitObject(NULL),
+ m_pObstacle(NULL),
m_isDeformable(false)
#ifndef DISABLE_PYTHON
, m_attr_dict(NULL)
@@ -148,6 +150,14 @@
{
delete m_pGraphicController;
}
+
+ if (m_pObstacle)
+ {
+ KX_Scene *scene = KX_GetActiveScene();
+ KX_ObstacleSimulation* obstacleSimulation = scene->GetObstacleSimulation();
+ obstacleSimulation->DestroyObstacle(m_pObstacle);
+ }
+
#ifndef DISABLE_PYTHON
if (m_attr_dict) {
PyDict_Clear(m_attr_dict); /* incase of circular refs or other weired cases */
@@ -348,6 +358,14 @@
m_pClient_info->m_gameobject = this;
m_state = 0;
+ KX_Scene* scene = KX_GetActiveScene();
+ KX_ObstacleSimulation* obssimulation = scene->GetObstacleSimulation();
+ struct Object* blenderobject = GetBlenderObject();
+ if (obssimulation && (blenderobject->gameflag & OB_HASOBSTACLE))
+ {
+ obssimulation->AddObstacleForObj(this);
+ }
+
#ifndef DISABLE_PYTHON
if(m_attr_dict)
m_attr_dict= PyDict_Copy(m_attr_dict);
Modified: branches/soc-2010-nicks/source/gameengine/Ketsji/KX_GameObject.h
===================================================================
--- branches/soc-2010-nicks/source/gameengine/Ketsji/KX_GameObject.h 2010-06-15 21:51:15 UTC (rev 29480)
+++ branches/soc-2010-nicks/source/gameengine/Ketsji/KX_GameObject.h 2010-06-16 00:23:24 UTC (rev 29481)
@@ -59,6 +59,7 @@
class PHY_IGraphicController;
class PHY_IPhysicsEnvironment;
struct Object;
+struct KX_Obstacle;
#ifndef DISABLE_PYTHON
/* utility conversion function */
@@ -107,6 +108,8 @@
SG_Node* m_pSGNode;
MT_CmMatrix4x4 m_OpenGL_4x4Matrix;
+
+ KX_Obstacle* m_pObstacle;
public:
bool m_isDeformable;
@@ -790,12 +793,24 @@
}
m_bSuspendDynamics = false;
}
+
+ void RegisterObstacle(KX_Obstacle* obstacle)
+ {
+ m_pObstacle = obstacle;
+ }
+ void UnregisterObstacle()
+ {
+ m_pObstacle = NULL;
+ }
+
+
KX_ClientObjectInfo* getClientInfo() { return m_pClient_info; }
CListValue* GetChildren();
CListValue* GetChildrenRecursive();
+
#ifndef DISABLE_PYTHON
/**
* @section Python interface functions.
Modified: branches/soc-2010-nicks/source/gameengine/Ketsji/KX_NavMeshObject.cpp
===================================================================
--- branches/soc-2010-nicks/source/gameengine/Ketsji/KX_NavMeshObject.cpp 2010-06-15 21:51:15 UTC (rev 29480)
+++ branches/soc-2010-nicks/source/gameengine/Ketsji/KX_NavMeshObject.cpp 2010-06-16 00:23:24 UTC (rev 29481)
@@ -42,6 +42,7 @@
#include "Value.h"
#include "Recast.h"
#include "DetourStatNavMeshBuilder.h"
+#include "KX_ObstacleSimulation.h"
static const int MAX_PATH_LEN = 256;
static const float polyPickExt[3] = {2, 4, 2};
@@ -91,7 +92,13 @@
void KX_NavMeshObject::ProcessReplica()
{
KX_GameObject::ProcessReplica();
+
BuildNavMesh();
+ KX_Scene* scene = KX_GetActiveScene();
+ KX_ObstacleSimulation* obssimulation = scene->GetObstacleSimulation();
+ if (obssimulation)
+ obssimulation->AddObstaclesForNavMesh(this);
+
}
bool KX_NavMeshObject::BuildVertIndArrays(RAS_MeshObject* meshobj, float *&vertices, int& nverts,
@@ -171,7 +178,16 @@
return false;
//prepare vertices and indices
- MT_Transform worldTransform = GetSGNode()->GetWorldTransform();
+ struct Object* blenderobject = GetBlenderObject();
+ MT_Point3 posobj;
+ posobj.setValue(blenderobject->loc[0]+blenderobject->dloc[0],
+ blenderobject->loc[1]+blenderobject->dloc[1],
+ blenderobject->loc[2]+blenderobject->dloc[2]);
+ MT_Vector3 eulxyzobj(blenderobject->rot);
+ MT_Vector3 scaleobj(blenderobject->size);
+ MT_Matrix3x3 rotMatrix(eulxyzobj);
+ MT_Transform worldTransform(posobj, rotMatrix.scaled(scaleobj[0], scaleobj[1], scaleobj[2]));
+
MT_Point3 pos;
for (int i=0; i<nverts; i++)
{
Modified: branches/soc-2010-nicks/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp
===================================================================
--- branches/soc-2010-nicks/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp 2010-06-15 21:51:15 UTC (rev 29480)
+++ branches/soc-2010-nicks/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp 2010-06-16 00:23:24 UTC (rev 29481)
@@ -195,9 +195,23 @@
obstacle->m_shape = KX_OBSTACLE_CIRCLE;
obstacle->m_rad = blenderobject->obstacleRad;
obstacle->m_gameObj = gameobj;
-
+ gameobj->RegisterObstacle(obstacle);
}
+void KX_ObstacleSimulation::DestroyObstacle(KX_Obstacle* obstacle)
+{
+ for (size_t i=0; i<m_obstacles.size(); i++)
+ {
+ if (m_obstacles[i] == obstacle)
+ {
+ obstacle->m_gameObj->UnregisterObstacle();
+ m_obstacles[i] = m_obstacles.back();
+ m_obstacles.pop_back();
+ delete obstacle;
+ }
+ }
+}
+
void KX_ObstacleSimulation::AddObstaclesForNavMesh(KX_NavMeshObject* navmeshobj)
{
dtStatNavMesh* navmesh = navmeshobj->GetNavMesh();
Modified: branches/soc-2010-nicks/source/gameengine/Ketsji/KX_ObstacleSimulation.h
===================================================================
--- branches/soc-2010-nicks/source/gameengine/Ketsji/KX_ObstacleSimulation.h 2010-06-15 21:51:15 UTC (rev 29480)
+++ branches/soc-2010-nicks/source/gameengine/Ketsji/KX_ObstacleSimulation.h 2010-06-16 00:23:24 UTC (rev 29481)
@@ -81,6 +81,7 @@
void DrawObstacles();
void AddObstacleForObj(KX_GameObject* gameobj);
+ void DestroyObstacle(KX_Obstacle* obstacle);
void AddObstaclesForNavMesh(KX_NavMeshObject* navmesh);
KX_Obstacle* GetObstacle(KX_GameObject* gameobj);
void UpdateObstacles();
Modified: branches/soc-2010-nicks/source/gameengine/Ketsji/KX_SteeringActuator.cpp
===================================================================
--- branches/soc-2010-nicks/source/gameengine/Ketsji/KX_SteeringActuator.cpp 2010-06-15 21:51:15 UTC (rev 29480)
+++ branches/soc-2010-nicks/source/gameengine/Ketsji/KX_SteeringActuator.cpp 2010-06-16 00:23:24 UTC (rev 29481)
@@ -105,13 +105,13 @@
{
if (clientobj == m_target)
{
- // this object is being deleted, we cannot continue to track it.
+ // this object is being deleted, we cannot continue to use it.
m_target = NULL;
return true;
}
else if (clientobj == m_navmesh)
{
- // this object is being deleted, we cannot continue to track it.
+ // this object is being deleted, we cannot continue to useit.
m_navmesh = NULL;
return true;
}
@@ -159,6 +159,9 @@
if (bNegativeEvent || !delta)
return false; // do nothing on negative events
+ if (!m_target)
+ return false;
+
KX_GameObject *obj = (KX_GameObject*) GetParent();
const MT_Point3& mypos = obj->NodeGetWorldPosition();
const MT_Point3& targpos = m_target->NodeGetWorldPosition();
More information about the Bf-blender-cvs
mailing list