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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to