[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29032] branches/soc-2010-nicks/source: - added new game object type for navigation mesh
Nick Samarin
nicks1987 at bigmir.net
Thu May 27 22:19:39 CEST 2010
Revision: 29032
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29032
Author: nicks
Date: 2010-05-27 22:18:56 +0200 (Thu, 27 May 2010)
Log Message:
-----------
- added new game object type for navigation mesh
- added py api for path finding and ray casting
- set svn properties for KX_Pathfinder
Modified Paths:
--------------
branches/soc-2010-nicks/source/blender/makesdna/DNA_object_types.h
branches/soc-2010-nicks/source/blender/makesrna/intern/rna_object.c
branches/soc-2010-nicks/source/gameengine/Converter/BL_BlenderDataConversion.cpp
branches/soc-2010-nicks/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
branches/soc-2010-nicks/source/gameengine/Ketsji/KX_Pathfinder.cpp
branches/soc-2010-nicks/source/gameengine/Ketsji/KX_Pathfinder.h
branches/soc-2010-nicks/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
branches/soc-2010-nicks/source/gameengine/Ketsji/KX_Scene.cpp
branches/soc-2010-nicks/source/gameengine/Ketsji/KX_Scene.h
Property Changed:
----------------
branches/soc-2010-nicks/source/gameengine/Ketsji/KX_Pathfinder.cpp
branches/soc-2010-nicks/source/gameengine/Ketsji/KX_Pathfinder.h
Modified: branches/soc-2010-nicks/source/blender/makesdna/DNA_object_types.h
===================================================================
--- branches/soc-2010-nicks/source/blender/makesdna/DNA_object_types.h 2010-05-27 18:37:06 UTC (rev 29031)
+++ branches/soc-2010-nicks/source/blender/makesdna/DNA_object_types.h 2010-05-27 20:18:56 UTC (rev 29032)
@@ -463,6 +463,7 @@
#define OB_SOFT_BODY 0x20000
#define OB_OCCLUDER 0x40000
#define OB_SENSOR 0x80000
+#define OB_NAVMESH 0x100000
/* ob->gameflag2 */
#define OB_NEVER_DO_ACTIVITY_CULLING 1
@@ -483,6 +484,7 @@
#define OB_BODY_TYPE_SOFT 4
#define OB_BODY_TYPE_OCCLUDER 5
#define OB_BODY_TYPE_SENSOR 6
+#define OB_BODY_TYPE_NAVMESH 7
/* ob->scavisflag */
#define OB_VIS_SENS 1
Modified: branches/soc-2010-nicks/source/blender/makesrna/intern/rna_object.c
===================================================================
--- branches/soc-2010-nicks/source/blender/makesrna/intern/rna_object.c 2010-05-27 18:37:06 UTC (rev 29031)
+++ branches/soc-2010-nicks/source/blender/makesrna/intern/rna_object.c 2010-05-27 20:18:56 UTC (rev 29032)
@@ -737,6 +737,8 @@
if (!(ob->gameflag & OB_COLLISION)) {
if (ob->gameflag & OB_OCCLUDER) {
ob->body_type = OB_BODY_TYPE_OCCLUDER;
+ } else if (ob->gameflag & OB_NAVMESH){
+ ob->body_type = OB_BODY_TYPE_NAVMESH;
} else {
ob->body_type = OB_BODY_TYPE_NO_COLLISION;
}
@@ -766,31 +768,35 @@
switch (ob->body_type) {
case OB_BODY_TYPE_SENSOR:
ob->gameflag |= OB_SENSOR|OB_COLLISION|OB_GHOST;
- ob->gameflag &= ~(OB_OCCLUDER|OB_DYNAMIC|OB_RIGID_BODY|OB_SOFT_BODY|OB_ACTOR|OB_ANISOTROPIC_FRICTION|OB_DO_FH|OB_ROT_FH|OB_COLLISION_RESPONSE);
+ ob->gameflag &= ~(OB_OCCLUDER|OB_NAVMESH|OB_DYNAMIC|OB_RIGID_BODY|OB_SOFT_BODY|OB_ACTOR|OB_ANISOTROPIC_FRICTION|OB_DO_FH|OB_ROT_FH|OB_COLLISION_RESPONSE);
break;
case OB_BODY_TYPE_OCCLUDER:
ob->gameflag |= OB_OCCLUDER;
- ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_DYNAMIC);
+ ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_DYNAMIC|OB_NAVMESH);
break;
+ case OB_BODY_TYPE_NAVMESH:
+ ob->gameflag |= OB_NAVMESH;
+ ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_DYNAMIC|OB_OCCLUDER);
+ break;
case OB_BODY_TYPE_NO_COLLISION:
- ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_OCCLUDER|OB_DYNAMIC);
+ ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_OCCLUDER|OB_DYNAMIC|OB_NAVMESH);
break;
case OB_BODY_TYPE_STATIC:
ob->gameflag |= OB_COLLISION;
- ob->gameflag &= ~(OB_DYNAMIC|OB_RIGID_BODY|OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR);
+ ob->gameflag &= ~(OB_DYNAMIC|OB_RIGID_BODY|OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR|OB_NAVMESH);
break;
case OB_BODY_TYPE_DYNAMIC:
ob->gameflag |= OB_COLLISION|OB_DYNAMIC|OB_ACTOR;
- ob->gameflag &= ~(OB_RIGID_BODY|OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR);
+ ob->gameflag &= ~(OB_RIGID_BODY|OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR|OB_NAVMESH);
break;
case OB_BODY_TYPE_RIGID:
ob->gameflag |= OB_COLLISION|OB_DYNAMIC|OB_RIGID_BODY|OB_ACTOR;
- ob->gameflag &= ~(OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR);
+ ob->gameflag &= ~(OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR|OB_NAVMESH);
break;
default:
case OB_BODY_TYPE_SOFT:
ob->gameflag |= OB_COLLISION|OB_DYNAMIC|OB_SOFT_BODY|OB_ACTOR;
- ob->gameflag &= ~(OB_RIGID_BODY|OB_OCCLUDER|OB_SENSOR);
+ ob->gameflag &= ~(OB_RIGID_BODY|OB_OCCLUDER|OB_SENSOR|OB_NAVMESH);
/* assume triangle mesh, if no bounds chosen for soft body */
if ((ob->gameflag & OB_BOUNDS) && (ob->boundtype<OB_BOUND_POLYH))
@@ -1093,6 +1099,7 @@
{OB_BODY_TYPE_SOFT, "SOFT_BODY", 0, "Soft Body", "Soft body"},
{OB_BODY_TYPE_OCCLUDER, "OCCLUDE", 0, "Occlude", "Occluder for optimizing scene rendering"},
{OB_BODY_TYPE_SENSOR, "SENSOR", 0, "Sensor", "Collision Sensor, detects static and dynamic objects but not the other collision sensor objects"},
+ {OB_BODY_TYPE_NAVMESH, "NAVMESH", 0, "NavMesh", "Navigation mesh"},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "GameObjectSettings", NULL);
Modified: branches/soc-2010-nicks/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- branches/soc-2010-nicks/source/gameengine/Converter/BL_BlenderDataConversion.cpp 2010-05-27 18:37:06 UTC (rev 29031)
+++ branches/soc-2010-nicks/source/gameengine/Converter/BL_BlenderDataConversion.cpp 2010-05-27 20:18:56 UTC (rev 29032)
@@ -1715,6 +1715,13 @@
// needed for python scripting
kxscene->GetLogicManager()->RegisterMeshName(meshobj->GetName(),meshobj);
+ if (ob->gameflag & OB_NAVMESH)
+ {
+ gameobj = new KX_Pathfinder(kxscene,KX_Scene::m_callbacks);
+ gameobj->AddMesh(meshobj);
+ break;
+ }
+
gameobj = new BL_DeformableGameObject(ob,kxscene,KX_Scene::m_callbacks);
// set transformation
@@ -2671,22 +2678,18 @@
logicbrick_conversionlist->Release();
- //create navigation mesh
- KX_Pathfinder* pathfinder = kxscene->GetPathfinder();
- if (pathfinder)
+ //build navigation mesh
+ for ( i=0;i<objectlist->GetCount();i++)
{
- 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_GameObject* gameobj = static_cast<KX_GameObject*>(objectlist->GetValue(i));
- struct Object* blenderobject = gameobj->GetBlenderObject();
- if (blenderobject->type==OB_MESH && gameobj->GetProperty("navmesh") && gameobj->GetMeshCount()>0)
- {
- RAS_MeshObject* meshobj = gameobj->GetMesh(0);
- pathfinder->createFromMesh(meshobj);
- gameobj->SetVisible(0, 0);
- }
- }
- }
+ KX_Pathfinder* pathfinder = static_cast<KX_Pathfinder*>(gameobj);
+ pathfinder->BuildNavMesh();
+ pathfinder->SetVisible(0, true);
+ }
+ }
Modified: branches/soc-2010-nicks/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
===================================================================
--- branches/soc-2010-nicks/source/gameengine/Ketsji/KX_KetsjiEngine.cpp 2010-05-27 18:37:06 UTC (rev 29031)
+++ branches/soc-2010-nicks/source/gameengine/Ketsji/KX_KetsjiEngine.cpp 2010-05-27 20:18:56 UTC (rev 29032)
@@ -1325,9 +1325,6 @@
if (scene->GetPhysicsEnvironment())
scene->GetPhysicsEnvironment()->debugDrawWorld();
-
- if (scene->GetPathfinder())
- scene->GetPathfinder()->debugDraw();
}
/*
To run once per scene
Modified: branches/soc-2010-nicks/source/gameengine/Ketsji/KX_Pathfinder.cpp
===================================================================
--- branches/soc-2010-nicks/source/gameengine/Ketsji/KX_Pathfinder.cpp 2010-05-27 18:37:06 UTC (rev 29031)
+++ branches/soc-2010-nicks/source/gameengine/Ketsji/KX_Pathfinder.cpp 2010-05-27 20:18:56 UTC (rev 29032)
@@ -1,5 +1,5 @@
/**
-* $Id:
+* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -38,9 +38,14 @@
#include "BKE_DerivedMesh.h"
}
#include "KX_PythonInit.h"
+#include "KX_PyMath.h"
+#include "Value.h"
#include "Recast.h"
#include "DetourStatNavMeshBuilder.h"
+static const int MAX_PATH_LEN = 256;
+static const float polyPickExt[3] = {2, 4, 2};
+
static void calcMeshBounds(const float* vert, int nverts, float* bmin, float* bmax)
{
bmin[0] = bmax[0] = vert[0];
@@ -48,19 +53,25 @@
bmin[2] = bmax[2] = vert[2];
for (int i=1; i<nverts; i++)
{
- if (bmin[0]>vert[i+0]) bmin[0] = vert[i+0];
- if (bmin[1]>vert[i+1]) bmin[1] = vert[i+1];
- if (bmin[2]>vert[i+2]) bmin[2] = vert[i+2];
+ if (bmin[0]>vert[3*i+0]) bmin[0] = vert[3*i+0];
+ if (bmin[1]>vert[3*i+1]) bmin[1] = vert[3*i+1];
+ if (bmin[2]>vert[3*i+2]) bmin[2] = vert[3*i+2];
- if (bmax[0]<vert[i+0]) bmax[0] = vert[i+0];
- if (bmax[1]<vert[i+1]) bmax[2] = vert[i+1];
- if (bmax[2]<vert[i+2]) bmax[1] = vert[i+2];
+ if (bmax[0]<vert[3*i+0]) bmax[0] = vert[3*i+0];
+ if (bmax[1]<vert[3*i+1]) bmax[1] = vert[3*i+1];
+ if (bmax[2]<vert[3*i+2]) bmax[2] = vert[3*i+2];
}
}
-KX_Pathfinder::KX_Pathfinder()
-: m_navMesh(NULL)
+inline void flipAxes(float* vec)
{
+ std::swap(vec[1],vec[2]);
+}
+
+KX_Pathfinder::KX_Pathfinder(void* sgReplicationInfo, SG_Callbacks callbacks)
+: KX_GameObject(sgReplicationInfo, callbacks)
+, m_navMesh(NULL)
+{
}
@@ -70,7 +81,7 @@
delete m_navMesh;
}
-bool KX_Pathfinder::buildVertIndArrays(RAS_MeshObject* meshobj, float *&vertices, int& nverts,
+bool KX_Pathfinder::BuildVertIndArrays(RAS_MeshObject* meshobj, float *&vertices, int& nverts,
unsigned short* &faces, int& npolys)
{
if (!meshobj || meshobj->HasColliderPolygon()==false)
@@ -87,112 +98,88 @@
int* index = (int*)dm->getFaceDataArray(dm, CD_ORIGINDEX);
MTFace *tface = (MTFace *)dm->getFaceDataArray(dm, CD_MTFACE);
- vector<bool> vert_tag_array(numverts, false);
- vector<size_t> vert_remap_array(numverts, 0);
-
- // Tag verts we're using
+ nverts = numverts;
+ if (nverts >= 0xffff)
+ return false;
+ //calculate count of tris
+ npolys = numpolys;
for (int p2=0; p2<numpolys; p2++)
{
MFace* mf = &mface[p2];
- RAS_Polygon* poly= meshobj->GetPolygon((index)? index[p2]: p2);
- // only add polygons that have the collision flag set
- if (poly->IsCollider())
- {
- if (vert_tag_array[mf->v1]==false)
- {vert_tag_array[mf->v1]= true;vert_remap_array[mf->v1]= (size_t)nverts;nverts++;}
- if (vert_tag_array[mf->v2]==false)
- {vert_tag_array[mf->v2]= true;vert_remap_array[mf->v2]= (size_t)nverts;nverts++;}
- if (vert_tag_array[mf->v3]==false)
- {vert_tag_array[mf->v3]= true;vert_remap_array[mf->v3]= (size_t)nverts;nverts++;}
- if (mf->v4 && vert_tag_array[mf->v4]==false)
- {vert_tag_array[mf->v4]= true;vert_remap_array[mf->v4]= (size_t)nverts;nverts++;}
- npolys += (mf->v4 ? 2:1); /* a quad or a tri */
- }
+ if (mf->v4)
+ npolys+=1;
}
- if (nverts >= 0xffff)
- return false;
-
+ //create verts
vertices = new float[nverts*3];
+ for (int vi=0; vi<nverts; vi++)
+ {
+ MVert *v = &mvert[vi];
+ for (int j=0; j<3; j++)
+ vertices[3*vi+j] = v->co[j];
+ }
+ //create tris
faces = new unsigned short[npolys*3*2];
memset(faces,0xff,sizeof(unsigned short)*3*2*npolys);
- float *bt= vertices;
- unsigned short *tri_pt= faces;
-
+ unsigned short *face = faces;
for (int p2=0; p2<numpolys; p2++)
{
MFace* mf = &mface[p2];
- MTFace* tf = (tface) ? &tface[p2] : NULL;
- RAS_Polygon* poly= meshobj->GetPolygon((index)? index[p2]: p2);
- // only add polygons that have the collisionflag set
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list