[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