- moved navmesh conversion code to ED_Editors project (ED_navmesh_conversion.h and...
authorNick Samarin <nicks1987@bigmir.net>
Fri, 30 Jul 2010 13:02:32 +0000 (13:02 +0000)
committerNick Samarin <nicks1987@bigmir.net>
Fri, 30 Jul 2010 13:02:32 +0000 (13:02 +0000)
- added new custom data layer CD_Recast

12 files changed:
extern/recastnavigation/make/msvc_9_0/recastnavigation.vcproj
projectfiles_vc9/blender/editors/ED_editors.vcproj
projectfiles_vc9/blender/modifiers/modifiers.vcproj
projectfiles_vc9/gameengine/ketsji/KX_ketsji.vcproj
source/blender/blenkernel/intern/customdata.c
source/blender/editors/include/ED_navmesh_conversion.h [new file with mode: 0644]
source/blender/editors/object/object_navmesh.cpp
source/blender/editors/util/navmesh_conversion.cpp [new file with mode: 0644]
source/blender/makesdna/DNA_customdata_types.h
source/blender/makesdna/DNA_meshdata_types.h
source/blender/modifiers/intern/MOD_navmesh.cpp
source/gameengine/Ketsji/KX_NavMeshObject.cpp

index 5dfa123e471ef9256180d78fe7c0c83b6b9a66f6..bc3004da8956e7a5c42590ad68e77100a76a23e9 100644 (file)
                                </File>\r
                        </Filter>\r
                </Filter>\r
-               <Filter\r
-                       Name="BlenderNavMesh"\r
-                       >\r
-                       <File\r
-                               RelativePath="..\..\BlenderNavMesh\NavMeshConversion.cpp"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\..\BlenderNavMesh\NavMeshConversion.h"\r
-                               >\r
-                       </File>\r
-               </Filter>\r
        </Files>\r
        <Globals>\r
        </Globals>\r
index 7755145e6c23fa3491997fdf4213b55aca85d62f..38e9e31d7e75d1fe4f5b59f3a5d922ae0116ace9 100644 (file)
                                RelativePath="..\..\..\source\blender\editors\include\ED_mesh.h"\r
                                >\r
                        </File>\r
+                       <File\r
+                               RelativePath="..\..\..\source\blender\editors\include\ED_navmesh_conversion.h"\r
+                               >\r
+                       </File>\r
                        <File\r
                                RelativePath="..\..\..\source\blender\editors\include\ED_node.h"\r
                                >\r
                                RelativePath="..\..\..\source\blender\editors\util\editmode_undo.c"\r
                                >\r
                        </File>\r
+                       <File\r
+                               RelativePath="..\..\..\source\blender\editors\util\navmesh_conversion.cpp"\r
+                               >\r
+                       </File>\r
                        <File\r
                                RelativePath="..\..\..\source\blender\editors\util\numinput.c"\r
                                >\r
index c994e838dc98cd1ee38f43e91ce865c3a0dcc476..f47c3ec00ca59e79ea212fb7fba90b5e06a5e6b7 100644 (file)
                        <Tool\r
                                Name="VCCLCompilerTool"\r
                                Optimization="0"\r
-                               AdditionalIncludeDirectories="..\..\..\..\lib\windows\zlib\include;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenkernel\intern;..\..\..\source\blender\makesdna;..\..\..\source\blender\editors\include;..\..\..\source\blender\gpu;..\..\..\source\blender\modifiers;..\..\..\source\blender\render\extern\include;..\..\..\..\build\msvc_9\extern\recastnavigation\Recast\Include;..\..\..\..\build\msvc_9\extern\recastnavigation\BlenderNavMesh"\r
+                               AdditionalIncludeDirectories="..\..\..\..\lib\windows\zlib\include;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenkernel\intern;..\..\..\source\blender\makesdna;..\..\..\source\blender\editors\include;..\..\..\source\blender\gpu;..\..\..\source\blender\modifiers;..\..\..\source\blender\render\extern\include;..\..\..\..\build\msvc_9\extern\recastnavigation\Recast\Include"\r
                                PreprocessorDefinitions="_DEBUG;WIN32;_LIB;WITH_LZO;WITH_LZMA"\r
                                MinimalRebuild="false"\r
                                BasicRuntimeChecks="3"\r
                        <Tool\r
                                Name="VCCLCompilerTool"\r
                                Optimization="2"\r
-                               AdditionalIncludeDirectories="..\..\..\..\lib\windows\zlib\include;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenkernel\intern;..\..\..\source\blender\makesdna;..\..\..\source\blender\modifiers;..\..\..\source\blender\render\extern\include;..\..\..\..\build\msvc_9\extern\recastnavigation\Recast\Include;..\..\..\..\build\msvc_9\extern\recastnavigation\BlenderNavMesh;..\..\..\source\blender\editors\include;..\..\..\source\blender\gpu"\r
+                               AdditionalIncludeDirectories="..\..\..\..\lib\windows\zlib\include;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenkernel\intern;..\..\..\source\blender\makesdna;..\..\..\source\blender\modifiers;..\..\..\source\blender\render\extern\include;..\..\..\..\build\msvc_9\extern\recastnavigation\Recast\Include;..\..\..\source\blender\editors\include;..\..\..\source\blender\gpu"\r
                                PreprocessorDefinitions="NDEBUG;WIN32;_LIB;WITH_LZO;WITH_LZMA"\r
                                BasicRuntimeChecks="0"\r
                                RuntimeLibrary="0"\r
index 28ba0b332fc111e5b91fefb0eff61206df2afd8e..37401df632357f3d0ebf2043715caa5b8e39afb5 100644 (file)
                        <Tool\r
                                Name="VCCLCompilerTool"\r
                                Optimization="0"\r
-                               AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\string\include;..\..\..\..\build\msvc_9\intern\moto\include;..\..\..\..\build\msvc_9\intern\soundsystem\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\extern\bullet\include;..\..\..\..\build\msvc_9\extern\solid\include;..\..\..\..\build\msvc_9\extern\recastnavigation\Detour\Include;..\..\..\..\build\msvc_9\extern\recastnavigation\Recast\Include;..\..\..\..\build\msvc_9\extern\recastnavigation\BlenderNavMesh;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\..\lib\windows\python\include\python3.1;..\..\..\..\lib\windows\sdl\include;..\..\..\source\blender\imbuf;..\..\..\source\blender\include;..\..\..\source\blender\blenlib;..\..\..\source\blender\python;..\..\..\source\blender\python\generic;..\..\..\source\blender\makesdna;..\..\..\source\blender\blenloader;..\..\..\source\blender\blenkernel;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\physics;..\..\..\source\gameengine\rasterizer;..\..\..\source\gameengine\network;..\..\..\source\gameengine\Converter;..\..\..\source\gameengine\gamelogic;..\..\..\source\gameengine\scenegraph;..\..\..\source\gameengine\expressions;..\..\..\source\gameengine\physics\sumo;..\..\..\source\gameengine\physics\dummy;..\..\..\source\gameengine\physics\BlOde;..\..\..\source\gameengine\ketsji\kxnetwork;..\..\..\source\gameengine\physics\common;..\..\..\source\gameengine\physics\sumo\include;..\..\..\source\gameengine\physics\common\dummy;..\..\..\source\gameengine\Rasterizer\RAS_OpenGLRasterizer;..\..\..\source\gameengine\physics\sumo\fuzzics\include;..\..\..\source\sumo\include;..\..\..\source\sumo\fuzzics\include;..\..\..\source\gameengine\physics\bullet;..\..\..\source\blender\python\api2_2x;..\..\..\source\blender\gpu;..\..\..\intern\audaspace\intern"\r
+                               AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\string\include;..\..\..\..\build\msvc_9\intern\moto\include;..\..\..\..\build\msvc_9\intern\soundsystem\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\extern\bullet\include;..\..\..\..\build\msvc_9\extern\solid\include;..\..\..\..\build\msvc_9\extern\recastnavigation\Detour\Include;..\..\..\..\build\msvc_9\extern\recastnavigation\Recast\Include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\..\lib\windows\python\include\python3.1;..\..\..\..\lib\windows\sdl\include;..\..\..\source\blender\imbuf;..\..\..\source\blender\include;..\..\..\source\blender\blenlib;..\..\..\source\blender\python;..\..\..\source\blender\python\generic;..\..\..\source\blender\makesdna;..\..\..\source\blender\blenloader;..\..\..\source\blender\blenkernel;..\..\..\source\blender\editors\include;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\physics;..\..\..\source\gameengine\rasterizer;..\..\..\source\gameengine\network;..\..\..\source\gameengine\Converter;..\..\..\source\gameengine\gamelogic;..\..\..\source\gameengine\scenegraph;..\..\..\source\gameengine\expressions;..\..\..\source\gameengine\physics\sumo;..\..\..\source\gameengine\physics\dummy;..\..\..\source\gameengine\physics\BlOde;..\..\..\source\gameengine\ketsji\kxnetwork;..\..\..\source\gameengine\physics\common;..\..\..\source\gameengine\physics\sumo\include;..\..\..\source\gameengine\physics\common\dummy;..\..\..\source\gameengine\Rasterizer\RAS_OpenGLRasterizer;..\..\..\source\gameengine\physics\sumo\fuzzics\include;..\..\..\source\sumo\include;..\..\..\source\sumo\fuzzics\include;..\..\..\source\gameengine\physics\bullet;..\..\..\source\blender\python\api2_2x;..\..\..\source\blender\gpu;..\..\..\intern\audaspace\intern"\r
                                PreprocessorDefinitions="JANCODEPANCO;WIN32;_LIB;EXP_PYTHON_EMBEDDING;_DEBUG;USE_SUMO_SOLID;WITH_GLEXT;GLEW_STATIC;WITH_FFMPEG"\r
                                BasicRuntimeChecks="3"\r
                                RuntimeLibrary="1"\r
                                Name="VCCLCompilerTool"\r
                                Optimization="2"\r
                                InlineFunctionExpansion="1"\r
-                               AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\string\include;..\..\..\..\build\msvc_9\intern\moto\include;..\..\..\..\build\msvc_9\intern\soundsystem\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\extern\bullet\include;..\..\..\..\build\msvc_9\extern\solid\include;..\..\..\..\build\msvc_9\extern\recastnavigation\Detour\Include;..\..\..\..\build\msvc_9\extern\recastnavigation\Recast\Include;..\..\..\..\build\msvc_9\extern\recastnavigation\BlenderNavMesh;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\..\lib\windows\python\include\python3.1;..\..\..\..\lib\windows\sdl\include;..\..\..\source\blender\imbuf;..\..\..\source\blender\include;..\..\..\source\blender\blenlib;..\..\..\source\blender\python;..\..\..\source\blender\python\generic;..\..\..\source\blender\makesdna;..\..\..\source\blender\blenloader;..\..\..\source\blender\blenkernel;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\physics;..\..\..\source\gameengine\rasterizer;..\..\..\source\gameengine\network;..\..\..\source\gameengine\Converter;..\..\..\source\gameengine\gamelogic;..\..\..\source\gameengine\scenegraph;..\..\..\source\gameengine\expressions;..\..\..\source\gameengine\physics\sumo;..\..\..\source\gameengine\physics\dummy;..\..\..\source\gameengine\physics\BlOde;..\..\..\source\gameengine\ketsji\kxnetwork;..\..\..\source\gameengine\physics\common;..\..\..\source\gameengine\physics\sumo\include;..\..\..\source\gameengine\physics\common\dummy;..\..\..\source\gameengine\Rasterizer\RAS_OpenGLRasterizer;..\..\..\source\gameengine\physics\sumo\fuzzics\include;..\..\..\source\sumo\include;..\..\..\source\sumo\fuzzics\include;..\..\..\source\gameengine\physics\bullet;..\..\..\source\blender\python\api2_2x;..\..\..\source\blender\gpu;..\..\..\intern\audaspace\intern"\r
+                               AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\string\include;..\..\..\..\build\msvc_9\intern\moto\include;..\..\..\..\build\msvc_9\intern\soundsystem\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\extern\bullet\include;..\..\..\..\build\msvc_9\extern\solid\include;..\..\..\..\build\msvc_9\extern\recastnavigation\Detour\Include;..\..\..\..\build\msvc_9\extern\recastnavigation\Recast\Include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\..\lib\windows\python\include\python3.1;..\..\..\..\lib\windows\sdl\include;..\..\..\source\blender\imbuf;..\..\..\source\blender\include;..\..\..\source\blender\blenlib;..\..\..\source\blender\python;..\..\..\source\blender\python\generic;..\..\..\source\blender\makesdna;..\..\..\source\blender\blenloader;..\..\..\source\blender\blenkernel;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\physics;..\..\..\source\gameengine\rasterizer;..\..\..\source\gameengine\network;..\..\..\source\gameengine\Converter;..\..\..\source\gameengine\gamelogic;..\..\..\source\gameengine\scenegraph;..\..\..\source\gameengine\expressions;..\..\..\source\gameengine\physics\sumo;..\..\..\source\gameengine\physics\dummy;..\..\..\source\gameengine\physics\BlOde;..\..\..\source\gameengine\ketsji\kxnetwork;..\..\..\source\gameengine\physics\common;..\..\..\source\gameengine\physics\sumo\include;..\..\..\source\gameengine\physics\common\dummy;..\..\..\source\gameengine\Rasterizer\RAS_OpenGLRasterizer;..\..\..\source\gameengine\physics\sumo\fuzzics\include;..\..\..\source\sumo\include;..\..\..\source\sumo\fuzzics\include;..\..\..\source\gameengine\physics\bullet;..\..\..\source\blender\python\api2_2x;..\..\..\source\blender\gpu;..\..\..\intern\audaspace\intern"\r
                                PreprocessorDefinitions="NDEBUG;WIN32;_LIB;USE_SUMO_SOLID;WITH_GLEXT;GLEW_STATIC;WITH_FFMPEG"\r
                                StringPooling="true"\r
                                RuntimeLibrary="0"\r
index dcc0a0b876f7b8637f2353de735761f7107e32c2..2fab1e2937a41e048673f490b518bbc658b6cf4f 100644 (file)
@@ -794,7 +794,8 @@ const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
         layerSwap_mcol, layerDefault_mcol},
         {sizeof(MCol)*4, "MCol", 4, "TexturedCol", NULL, NULL, layerInterp_mcol,
         layerSwap_mcol, layerDefault_mcol},
-       {sizeof(float)*3, "", 0, NULL, NULL, NULL, NULL, NULL, NULL}
+       {sizeof(float)*3, "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
+       {sizeof(MRecast), "MRecast", 1,"Recast",NULL,NULL,NULL,NULL}
 };
 
 const char *LAYERTYPENAMES[CD_NUMTYPES] = {
@@ -802,7 +803,7 @@ const char *LAYERTYPENAMES[CD_NUMTYPES] = {
        /*   5-9 */ "CDMTFace", "CDMCol", "CDOrigIndex", "CDNormal", "CDFlags",
        /* 10-14 */ "CDMFloatProperty", "CDMIntProperty","CDMStringProperty", "CDOrigSpace", "CDOrco",
        /* 15-19 */ "CDMTexPoly", "CDMLoopUV", "CDMloopCol", "CDTangent", "CDMDisps",
-       /* 20-23 */"CDWeightMCol", "CDIDMCol", "CDTextureMCol", "CDClothOrco"
+       /* 20-24 */"CDWeightMCol", "CDIDMCol", "CDTextureMCol", "CDClothOrco", "CDMRecast"
 };
 
 const CustomDataMask CD_MASK_BAREMESH =
@@ -810,14 +811,14 @@ const CustomDataMask CD_MASK_BAREMESH =
 const CustomDataMask CD_MASK_MESH =
        CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE |
        CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE | CD_MASK_MCOL |
-       CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS;
+       CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS | CD_MASK_RECAST;
 const CustomDataMask CD_MASK_EDITMESH =
        CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE |
-       CD_MASK_MCOL|CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS;
+       CD_MASK_MCOL|CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS | CD_MASK_RECAST;
 const CustomDataMask CD_MASK_DERIVEDMESH =
        CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE |
        CD_MASK_MCOL | CD_MASK_ORIGINDEX | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_CLOTH_ORCO |
-       CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORCO | CD_MASK_TANGENT | CD_MASK_WEIGHT_MCOL;
+       CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORCO | CD_MASK_TANGENT | CD_MASK_WEIGHT_MCOL | CD_MASK_RECAST;
 const CustomDataMask CD_MASK_BMESH = 
        CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR;
 const CustomDataMask CD_MASK_FACECORNERS =
diff --git a/source/blender/editors/include/ED_navmesh_conversion.h b/source/blender/editors/include/ED_navmesh_conversion.h
new file mode 100644 (file)
index 0000000..2892214
--- /dev/null
@@ -0,0 +1,96 @@
+/**
+* $Id$ 
+*
+* ***** 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 *****
+*/
+
+#ifndef NAVMESH_CONVERSION_H
+#define NAVMESH_CONVERSION_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct DerivedMesh;
+
+/* navmesh_conversion.cpp */
+bool buildNavMeshDataByDerivedMesh(DerivedMesh *dm, int& vertsPerPoly, 
+                                                                  int &nverts, float *&verts,
+                                                                  int &ndtris, unsigned short *&dtris,
+                                                                  int& npolys, unsigned short *&dmeshes,
+                                                                  unsigned short*& polys, int *&dtrisToPolysMap,
+                                                                  int *&dtrisToTrisMap, int *&trisToFacesMap);
+
+bool buildRawVertIndicesData(DerivedMesh* dm, int &nverts, float *&verts, 
+                               int &ntris, unsigned short *&tris, int *&trisToFacesMap,
+                               int *&recastData);
+
+bool buildNavMeshData(const int nverts, const float* verts, 
+                                         const int ntris, const unsigned short *tris, 
+                                         const int* recastData, const int* trisToFacesMap,
+                                         int &ndtris, unsigned short *&dtris,
+                                         int &npolys, unsigned short *&dmeshes, unsigned short *&polys,
+                                         int &vertsPerPoly, int *&dtrisToPolysMap, int *&dtrisToTrisMap);
+
+bool buildPolygonsByDetailedMeshes(const int vertsPerPoly, const int npolys, 
+                               unsigned short* polys, const unsigned short* dmeshes, 
+                               const float* verts, const unsigned short* dtris, 
+                               const int* dtrisToPolysMap);
+
+int polyNumVerts(const unsigned short* p, const int vertsPerPoly);
+bool polyIsConvex(const unsigned short* p, const int vertsPerPoly, const float* verts);
+int polyFindVertex(const unsigned short* p, const int vertsPerPoly, unsigned short vertexIdx);
+float distPointToSegmentSq(const float* point, const float* a, const float* b);
+
+
+inline int bit(int a, int b)
+{
+       return (a & (1 << b)) >> b;
+}
+
+inline void intToCol(int i, float* col)
+{
+       int     r = bit(i, 0) + bit(i, 3) * 2 + 1;
+       int     g = bit(i, 1) + bit(i, 4) * 2 + 1;
+       int     b = bit(i, 2) + bit(i, 5) * 2 + 1;
+       col[0] = 1 - r*63.0f/255.0f;
+       col[1] = 1 - g*63.0f/255.0f;
+       col[2] = 1 - b*63.0f/255.0f;
+}
+
+inline float area2(const float* a, const float* b, const float* c)
+{
+       return (b[0] - a[0]) * (c[2] - a[2]) - (c[0] - a[0]) * (b[2] - a[2]);
+}
+inline bool left(const float* a, const float* b, const float* c)
+{
+       return area2(a, b, c) < 0;
+}
+
+#ifdef __cplusplus
+}
+#endif
+#endif //NAVMESH_CONVERSION_H
\ No newline at end of file
index b8728e35a546c78046533c4c20018935804c68fb..dd947e02de6f25ba51fbc1477a170b1593199cbc 100644 (file)
@@ -355,7 +355,7 @@ static Object* createRepresentation(bContext *C, rcPolyMesh*& pmesh, rcPolyMeshD
        polyverts = pmesh->nverts;
 
        //create custom data layer to save polygon idx
-       CustomData_add_layer_named(&em->fdata, CD_PROP_INT, CD_CALLOC, NULL, 0, "recastData");
+       CustomData_add_layer_named(&em->fdata, CD_RECAST, CD_CALLOC, NULL, 0, "recastData");
 
        //create verts and faces for detailed mesh
        for (i=0; i<dmesh->nmeshes; i++)
@@ -398,7 +398,7 @@ static Object* createRepresentation(bContext *C, rcPolyMesh*& pmesh, rcPolyMeshD
                                                                        EM_get_vert_for_index(face[1]), NULL, NULL, NULL);
 
                        //set navigation polygon idx to the custom layer
-                       int* polygonIdx = (int*)CustomData_em_get(&em->fdata, newFace->data, CD_PROP_INT);
+                       int* polygonIdx = (int*)CustomData_em_get(&em->fdata, newFace->data, CD_RECAST);
                        *polygonIdx = i+1; //add 1 to avoid zero idx
                }
                
@@ -496,9 +496,9 @@ static int assign_navpolygon_exec(bContext *C, wmOperator *op)
        efa = EM_get_actFace(em, 0);
        if (efa) 
        {
-               if (CustomData_has_layer(&em->fdata, CD_PROP_INT))
+               if (CustomData_has_layer(&em->fdata, CD_RECAST))
                {
-                       targetPolyIdx = *(int*)CustomData_em_get(&em->fdata, efa->data, CD_PROP_INT);
+                       targetPolyIdx = *(int*)CustomData_em_get(&em->fdata, efa->data, CD_RECAST);
                        targetPolyIdx = targetPolyIdx>=0? targetPolyIdx : -targetPolyIdx;
                        if (targetPolyIdx>0)
                        {
@@ -508,7 +508,7 @@ static int assign_navpolygon_exec(bContext *C, wmOperator *op)
                                {
                                        if((ef->f & SELECT )&& ef!=efa) 
                                        {
-                                               int* recastDataBlock = (int*)CustomData_em_get(&em->fdata, ef->data, CD_PROP_INT);
+                                               int* recastDataBlock = (int*)CustomData_em_get(&em->fdata, ef->data, CD_RECAST);
                                                *recastDataBlock = targetPolyIdx;
                                        }
                                        ef = ef->prev;
@@ -551,7 +551,7 @@ static int findFreeNavPolyIndex(EditMesh* em)
        int idx = 0;
        while(ef) 
        {
-               int polyIdx = *(int*)CustomData_em_get(&em->fdata, ef->data, CD_PROP_INT);
+               int polyIdx = *(int*)CustomData_em_get(&em->fdata, ef->data, CD_RECAST);
                indices[idx] = polyIdx;
                idx++;
                ef = ef->prev;
@@ -576,7 +576,7 @@ static int assign_new_navpolygon_exec(bContext *C, wmOperator *op)
        EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
 
        EditFace *ef;
-       if (CustomData_has_layer(&em->fdata, CD_PROP_INT))
+       if (CustomData_has_layer(&em->fdata, CD_RECAST))
        {
                int targetPolyIdx = findFreeNavPolyIndex(em);
                if (targetPolyIdx>0)
@@ -587,7 +587,7 @@ static int assign_new_navpolygon_exec(bContext *C, wmOperator *op)
                        {
                                if(ef->f & SELECT ) 
                                {
-                                       int* recastDataBlock = (int*)CustomData_em_get(&em->fdata, ef->data, CD_PROP_INT);
+                                       int* recastDataBlock = (int*)CustomData_em_get(&em->fdata, ef->data, CD_RECAST);
                                        *recastDataBlock = targetPolyIdx;
                                }
                                ef = ef->prev;
diff --git a/source/blender/editors/util/navmesh_conversion.cpp b/source/blender/editors/util/navmesh_conversion.cpp
new file mode 100644 (file)
index 0000000..a5f9119
--- /dev/null
@@ -0,0 +1,420 @@
+/**
+* $Id$ 
+*
+* ***** 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 *****
+*/
+#include <math.h>
+#include "Recast.h"
+
+
+extern "C"{
+#include "ED_navmesh_conversion.h"
+
+#include "DNA_meshdata_types.h"
+#include "BKE_cdderivedmesh.h"
+#include "BLI_math.h"
+}
+
+int polyNumVerts(const unsigned short* p, const int vertsPerPoly)
+{
+       int nv = 0;
+       for (int i=0; i<vertsPerPoly; i++)
+       {
+               if (p[i]==0xffff)
+                       break;
+               nv++;
+       }
+       return nv;
+}
+
+bool polyIsConvex(const unsigned short* p, const int vertsPerPoly, const float* verts)
+{
+       int nv = polyNumVerts(p, vertsPerPoly);
+       if (nv<3)
+               return false;
+       for (int j=0; j<nv; j++)
+       {
+               const float* v = &verts[3*p[j]];
+               const float* v_next = &verts[3*p[(j+1)%nv]];
+               const float* v_prev = &verts[3*p[(nv+j-1)%nv]];
+               if (!left(v_prev, v, v_next))
+                       return false;
+
+       }
+       return true;
+}
+
+float distPointToSegmentSq(const float* point, const float* a, const float* b)
+{
+       float abx[3], dx[3];
+       vsub(abx, b,a);
+       vsub(dx, point,a);
+       float d = abx[0]*abx[0]+abx[2]*abx[2];
+       float t = abx[0]*dx[0]+abx[2]*dx[2];
+       if (d > 0)
+               t /= d;
+       if (t < 0)
+               t = 0;
+       else if (t > 1)
+               t = 1;
+       dx[0] = a[0] + t*abx[0] - point[0];
+       dx[2] = a[2] + t*abx[2] - point[2];
+       return dx[0]*dx[0] + dx[2]*dx[2];
+}
+
+bool buildRawVertIndicesData(DerivedMesh* dm, int &nverts, float *&verts, 
+                                                                       int &ntris, unsigned short *&tris, int *&trisToFacesMap,
+                                                                       int *&recastData)
+{
+       nverts = dm->getNumVerts(dm);
+       if (nverts>=0xffff)
+       {
+               printf("Converting navmesh: Error! Too many vertices. Max number of vertices %d\n", 0xffff);
+               return false;
+       }
+       verts = new float[3*nverts];
+       dm->getVertCos(dm, (float(*)[3])verts);
+
+       //flip coordinates
+       for (int vi=0; vi<nverts; vi++)
+       {
+               SWAP(float, verts[3*vi+1], verts[3*vi+2]);
+       }
+
+       //calculate number of tris
+       int nfaces = dm->getNumFaces(dm);
+       MFace *faces = dm->getFaceArray(dm);
+       ntris = nfaces;
+       for (int fi=0; fi<nfaces; fi++)
+       {
+               MFace* face = &faces[fi];
+               if (face->v4)
+                       ntris++;
+       }
+
+       //copy and transform to triangles (reorder on the run)
+       trisToFacesMap = new int[ntris];
+       tris = new unsigned short[3*ntris];
+       unsigned short* tri = tris;
+       int triIdx = 0;
+       for (int fi=0; fi<nfaces; fi++)
+       {
+               MFace* face = &faces[fi];
+               tri[3*triIdx+0] = (unsigned short) face->v1;
+               tri[3*triIdx+1] = (unsigned short) face->v3;
+               tri[3*triIdx+2] = (unsigned short) face->v2;
+               trisToFacesMap[triIdx++]=fi;
+               if (face->v4)
+               {
+                       tri[3*triIdx+0] = (unsigned short) face->v1;
+                       tri[3*triIdx+1] = (unsigned short) face->v4;
+                       tri[3*triIdx+2] = (unsigned short) face->v3;
+                       trisToFacesMap[triIdx++]=fi;
+               }
+       }
+
+       //carefully, recast data is just reference to data in derived mesh
+       recastData = (int*)CustomData_get_layer(&dm->faceData, CD_RECAST);
+       return true;
+}
+
+bool buildPolygonsByDetailedMeshes(const int vertsPerPoly, const int npolys, 
+                                                                                 unsigned short* polys, const unsigned short* dmeshes, 
+                                                                                 const float* verts, const unsigned short* dtris, 
+                                                                                 const int* dtrisToPolysMap)
+{
+       bool res = false;
+       int capacity = vertsPerPoly;
+       unsigned short* newPoly =  new unsigned short[capacity];
+       memset(newPoly, 0xff, sizeof(unsigned short)*capacity);
+       for (int polyidx=0; polyidx<npolys; polyidx++)
+       {
+               int nv = 0;
+               //search border 
+               int btri = -1;
+               int bedge = -1;
+               for (int j=0; j<dmeshes[polyidx*4+3] && btri==-1;j++)
+               {
+                       int curpolytri = dmeshes[polyidx*4+2]+j;
+                       for (int k=0; k<3; k++)
+                       {
+                               unsigned short neighbortri = dtris[curpolytri*3*2+3+k];
+                               if ( neighbortri==0xffff || dtrisToPolysMap[neighbortri]!=polyidx+1)
+                               {
+                                       btri = curpolytri;
+                                       bedge = k;
+                                       break;
+                               }
+                       }                                                       
+               }
+               if (btri==-1 || bedge==-1)
+               {
+                       //can't find triangle with border edge
+                       return false;
+               }
+
+               newPoly[nv++] = dtris[btri*3*2+bedge];
+
+               int tri = btri;
+               int edge = (bedge+1)%3;
+               while (tri!=btri || edge!=bedge)
+               {
+                       int neighbortri = dtris[tri*3*2+3+edge];
+                       if (neighbortri==0xffff || dtrisToPolysMap[neighbortri]!=polyidx+1)
+                       {
+                               if (nv==capacity)
+                               {
+                                       capacity += vertsPerPoly;
+                                       unsigned short* newPolyBig =  new unsigned short[capacity];
+                                       memset(newPolyBig, 0xff, sizeof(unsigned short)*capacity);
+                                       memcpy(newPolyBig, newPoly, sizeof(unsigned short)*nv);
+                                       delete newPoly;
+                                       newPoly = newPolyBig;                   
+                               }
+                               newPoly[nv++] = dtris[tri*3*2+edge];
+                               //move to next edge                                     
+                               edge = (edge+1)%3;
+                       }
+                       else
+                       {
+                               //move to next tri
+                               int twinedge = -1;
+                               for (int k=0; k<3; k++)
+                               {
+                                       if (dtris[neighbortri*3*2+3+k] == tri)
+                                       {
+                                               twinedge = k;
+                                               break;
+                                       }
+                               }
+                               if (twinedge==-1)
+                               {
+                                       printf("Converting navmesh: Error! Can't find neighbor edge - invalid adjacency info\n");
+                                       goto returnLabel;                                       
+                               }
+                               tri = neighbortri;
+                               edge = (twinedge+1)%3;
+                       }
+               }
+
+               unsigned short* adjustedPoly = new unsigned short[nv];
+               int adjustedNv = 0;
+               for (size_t i=0; i<(size_t)nv; i++)
+               {
+                       unsigned short prev = newPoly[(nv+i-1)%nv];
+                       unsigned short cur = newPoly[i];
+                       unsigned short next = newPoly[(i+1)%nv];
+                       float distSq = distPointToSegmentSq(&verts[3*cur], &verts[3*prev], &verts[3*next]);
+                       static const float tolerance = 0.001f;
+                       if (distSq>tolerance)
+                               adjustedPoly[adjustedNv++] = cur;
+               }
+               memcpy(newPoly, adjustedPoly, adjustedNv*sizeof(unsigned short));
+               delete adjustedPoly;
+               nv = adjustedNv;
+
+               if (nv<=vertsPerPoly)
+               {
+                       for (int i=0; i<nv; i++)
+                       {
+                               polys[polyidx*vertsPerPoly*2+i] = newPoly[i];
+                       }
+               }
+       }
+       res = true;
+
+returnLabel:
+       delete newPoly;
+       return true;
+}
+
+struct SortContext
+{
+       const int* recastData;
+       const int* trisToFacesMap;
+};
+static int compareByData(void* data, const void * a, const void * b){
+       SortContext* context = (SortContext*)data;
+       return ( context->recastData[context->trisToFacesMap[*(int*)a]] - 
+               context->recastData[context->trisToFacesMap[*(int*)b]] );
+}
+
+bool buildNavMeshData(const int nverts, const float* verts, 
+                                                        const int ntris, const unsigned short *tris, 
+                                                        const int* recastData, const int* trisToFacesMap,
+                                                        int &ndtris, unsigned short *&dtris,
+                                                        int &npolys, unsigned short *&dmeshes, unsigned short *&polys,
+                                                        int &vertsPerPoly, int *&dtrisToPolysMap, int *&dtrisToTrisMap)
+
+{
+       if (!recastData)
+       {
+               printf("Converting navmesh: Error! Can't find recast custom data\n");
+               return false;
+       }
+
+       //sort the triangles by polygon idx
+       int* trisMapping = new int[ntris];
+       for (int i=0; i<ntris; i++)
+               trisMapping[i]=i;
+       SortContext context;
+       context.recastData = recastData;
+       context.trisToFacesMap = trisToFacesMap;
+       qsort_s(trisMapping, ntris, sizeof(int), compareByData, &context);
+
+       //search first valid triangle - triangle of convex polygon
+       int validTriStart = -1;
+       for (int i=0; i< ntris; i++)
+       {
+               if (recastData[trisToFacesMap[trisMapping[i]]]>0)
+               {
+                       validTriStart = i;
+                       break;
+               }
+       }
+
+       if (validTriStart<0)
+       {
+               printf("Converting navmesh: Error! No valid polygons in mesh\n");
+               delete trisMapping;
+               return false;
+       }
+
+       ndtris = ntris-validTriStart;
+       //fill dtris to faces mapping
+       dtrisToTrisMap = new int[ndtris];
+       memcpy(dtrisToTrisMap, &trisMapping[validTriStart], ndtris*sizeof(int));
+       delete trisMapping; trisMapping=NULL;
+
+       //create detailed mesh triangles  - copy only valid triangles
+       //and reserve memory for adjacency info
+       dtris = new unsigned short[3*2*ndtris];
+       memset(dtris, 0xffff, sizeof(unsigned short)*3*2*ndtris);
+       for (int i=0; i<ndtris; i++)
+       {
+               memcpy(dtris+3*2*i, tris+3*dtrisToTrisMap[i], sizeof(unsigned short)*3);
+       }
+       //create new recast data corresponded to dtris and renumber for continious indices
+       int prevPolyIdx=-1, curPolyIdx, newPolyIdx=0;
+       dtrisToPolysMap = new int[ndtris];
+       for (int i=0; i<ndtris; i++)
+       {
+               curPolyIdx = recastData[trisToFacesMap[dtrisToTrisMap[i]]];
+               if (curPolyIdx!=prevPolyIdx)
+               {
+                       newPolyIdx++;
+                       prevPolyIdx=curPolyIdx;
+               }
+               dtrisToPolysMap[i] = newPolyIdx;
+       }
+
+
+       //build adjacency info for detailed mesh triangles
+       buildMeshAdjacency(dtris, ntris, nverts, 3);
+
+       //create detailed mesh description for each navigation polygon
+       npolys = dtrisToPolysMap[ndtris-1];
+       dmeshes = new unsigned short[npolys*4];
+       memset(dmeshes, 0, npolys*4*sizeof(unsigned short));
+       unsigned short *dmesh = NULL;
+       int prevpolyidx = 0;
+       for (int i=0; i<ndtris; i++)
+       {
+               int curpolyidx = dtrisToPolysMap[i];
+               if (curpolyidx!=prevpolyidx)
+               {
+                       if (curpolyidx!=prevpolyidx+1)
+                       {
+                               printf("Converting navmesh: Error! Wrong order of detailed mesh faces\n");
+                               return false;
+                       }
+                       dmesh = dmesh==NULL ? dmeshes : dmesh+4;
+                       dmesh[2] = (unsigned short)i;   //tbase
+                       dmesh[3] = 0;   //tnum
+                       prevpolyidx = curpolyidx;
+               }
+               dmesh[3]++;
+       }
+
+       //create navigation polygons
+       vertsPerPoly = 6;
+       polys = new unsigned short[npolys*vertsPerPoly*2];
+       memset(polys, 0xff, sizeof(unsigned short)*vertsPerPoly*2*npolys);
+
+       buildPolygonsByDetailedMeshes(vertsPerPoly, npolys, polys, dmeshes, verts, dtris, dtrisToPolysMap);
+
+       return true;
+}
+
+
+bool buildNavMeshDataByDerivedMesh(DerivedMesh *dm, int& vertsPerPoly, 
+                                                                                 int &nverts, float *&verts,
+                                                                                 int &ndtris, unsigned short *&dtris,
+                                                                                 int& npolys, unsigned short *&dmeshes,
+                                                                                 unsigned short*& polys, int *&dtrisToPolysMap,
+                                                                                 int *&dtrisToTrisMap, int *&trisToFacesMap)
+{
+       bool res = true;
+       int ntris =0, *recastData=NULL;
+       unsigned short *tris=NULL;
+       res = buildRawVertIndicesData(dm, nverts, verts, ntris, tris, trisToFacesMap, recastData);
+       if (!res)
+       {
+               printf("Converting navmesh: Error! Can't get vertices and indices from mesh\n");
+               goto exit;
+       }
+
+       res = buildNavMeshData(nverts, verts, ntris, tris, recastData, trisToFacesMap,
+               ndtris, dtris, npolys, dmeshes,polys, vertsPerPoly, 
+               dtrisToPolysMap, dtrisToTrisMap);
+       if (!res)
+       {
+               printf("Converting navmesh: Error! Can't get vertices and indices from mesh\n");
+               goto exit;
+       }
+
+exit:
+       if (tris)
+               delete tris;
+
+       return res;
+}
+
+int polyFindVertex(const unsigned short* p, const int vertsPerPoly, unsigned short vertexIdx)
+{
+       int res = -1;
+       for(int i=0; i<vertsPerPoly; i++)
+       {
+               if (p[i]==0xffff)
+                       break;
+               if (p[i]==vertexIdx)
+               {
+                       res = i;
+                       break;
+               }
+       }
+       return res;
+}
\ No newline at end of file
index 8908143946a6da07c3e45f6271b52cb6a2d58928..313c5634819ed5d5f3252c6da833e6f58063e11c 100644 (file)
@@ -84,7 +84,8 @@ typedef struct CustomData {
 #define CD_ID_MCOL             21
 #define CD_TEXTURE_MCOL        22
 #define CD_CLOTH_ORCO  23
-#define CD_NUMTYPES            24
+#define CD_RECAST              24
+#define CD_NUMTYPES            25
 
 /* Bits for CustomDataMask */
 #define CD_MASK_MVERT          (1 << CD_MVERT)
@@ -109,6 +110,7 @@ typedef struct CustomData {
 #define CD_MASK_MDISPS         (1 << CD_MDISPS)
 #define CD_MASK_WEIGHT_MCOL    (1 << CD_WEIGHT_MCOL)
 #define CD_MASK_CLOTH_ORCO     (1 << CD_CLOTH_ORCO)
+#define CD_MASK_RECAST         (1 << CD_RECAST)
 
 /* CustomData.flag */
 
index 450c56b0dec62b15c9fcf2d300246d8b87aea27a..6dba547f42311ae02f272d85ce308f7a4c24944b 100644 (file)
@@ -181,6 +181,10 @@ typedef struct PartialVisibility {
        unsigned int totface, totedge, totvert, pad;
 } PartialVisibility;
 
+typedef struct MRecast{
+       int             i;
+} MRecast;
+
 /* mvert->flag (1=SELECT) */
 #define ME_SPHERETEST          2
 #define ME_VERT_TMP_TAG                4
index 851615769ab8f60f139a93ef58c6ba282c299c38..fb322086bbc0b5e65a338d63308e4bd373484435 100644 (file)
 */
 #include <math.h>
 #include "Recast.h"
-#include "NavMeshConversion.h"
 
 extern "C"{
+#include "ED_navmesh_conversion.h"
+
 #include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
 #include "BLI_math.h"
@@ -66,7 +67,7 @@ static void drawNavMeshColored(DerivedMesh *dm)
        int a, glmode;
        MVert *mvert = (MVert *)CustomData_get_layer(&dm->vertData, CD_MVERT);
        MFace *mface = (MFace *)CustomData_get_layer(&dm->faceData, CD_MFACE);
-       int* polygonIdx = (int*)CustomData_get_layer(&dm->faceData, CD_PROP_INT);
+       int* polygonIdx = (int*)CustomData_get_layer(&dm->faceData, CD_RECAST);
        if (!polygonIdx)
                return;
        const float BLACK_COLOR[3] = {0.f, 0.f, 0.f};
@@ -86,7 +87,7 @@ static void drawNavMeshColored(DerivedMesh *dm)
                glBegin(glmode = GL_QUADS);
                for(a = 0; a < dm->numFaceData; a++, mface++) {
                        int new_glmode = mface->v4?GL_QUADS:GL_TRIANGLES;
-                       int polygonIdx = *(int*)CustomData_get(&dm->faceData, a, CD_PROP_INT);
+                       int polygonIdx = *(int*)CustomData_get(&dm->faceData, a, CD_RECAST);
                        if (polygonIdx<=0)
                                memcpy(col, BLACK_COLOR, 3*sizeof(float));
                        else
@@ -128,10 +129,10 @@ static DerivedMesh *createNavMeshForVisualization(NavMeshModifierData *mmd,Deriv
        int maxFaces = dm->getNumFaces(dm);
 
        result = CDDM_copy(dm);
-       int *recastData = (int*)CustomData_get_layer(&dm->faceData, CD_PROP_INT);
-       CustomData_add_layer_named(&result->faceData, CD_PROP_INT, CD_DUPLICATE, 
+       int *recastData = (int*)CustomData_get_layer(&dm->faceData, CD_RECAST);
+       CustomData_add_layer_named(&result->faceData, CD_RECAST, CD_DUPLICATE, 
                        recastData, maxFaces, "recastData");
-       recastData = (int*)CustomData_get_layer(&result->faceData, CD_PROP_INT);
+       recastData = (int*)CustomData_get_layer(&result->faceData, CD_RECAST);
        result->drawFacesTex =  navDM_drawFacesTex;
        result->drawFacesSolid = navDM_drawFacesSolid;
        
@@ -206,7 +207,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
 {
        DerivedMesh *result = NULL;
        NavMeshModifierData *nmmd = (NavMeshModifierData*) md;
-       bool hasRecastData = CustomData_has_layer(&derivedData->faceData, CD_PROP_INT)>0;
+       bool hasRecastData = CustomData_has_layer(&derivedData->faceData, CD_RECAST)>0;
        if (ob->body_type!=OB_BODY_TYPE_NAVMESH || !hasRecastData )
        {
                //convert to nav mesh object:
@@ -218,8 +219,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
                if (!hasRecastData)
                {
                        int numFaces = derivedData->getNumFaces(derivedData);
-                       CustomData_add_layer_named(&derivedData->faceData, CD_PROP_INT, CD_CALLOC, NULL, numFaces, "recastData");
-                       int* recastData = (int*)CustomData_get_layer(&derivedData->faceData, CD_PROP_INT);
+                       CustomData_add_layer_named(&derivedData->faceData, CD_RECAST, CD_CALLOC, NULL, numFaces, "recastData");
+                       int* recastData = (int*)CustomData_get_layer(&derivedData->faceData, CD_RECAST);
                        for (int i=0; i<numFaces; i++)
                        {
                                recastData[i] = i+1;
@@ -228,8 +229,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
                        Mesh* obmesh = (Mesh *)ob->data;
                        if (obmesh)
                        {
-                               CustomData_add_layer_named(&obmesh->fdata, CD_PROP_INT, CD_CALLOC, NULL, numFaces, "recastData");
-                               int* recastData = (int*)CustomData_get_layer(&obmesh->fdata, CD_PROP_INT);
+                               CustomData_add_layer_named(&obmesh->fdata, CD_RECAST, CD_CALLOC, NULL, numFaces, "recastData");
+                               int* recastData = (int*)CustomData_get_layer(&obmesh->fdata, CD_RECAST);
                                for (int i=0; i<numFaces; i++)
                                {
                                        recastData[i] = i+1;
index 8ba2f78958bca1c4223b6efeecf99c0ecf9c2d77..55b35a3a180f8d57da2e2b320007be00c92095dd 100644 (file)
 
 #include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
+
 extern "C" {
 #include "BKE_scene.h"
 #include "BKE_customdata.h"
 #include "BKE_cdderivedmesh.h"
 #include "BKE_DerivedMesh.h"
 #include "BLI_math_vector.h"
+
+#include "ED_navmesh_conversion.h"
 }
+
 #include "KX_PythonInit.h"
 #include "KX_PyMath.h"
 #include "Value.h"
 #include "Recast.h"
 #include "DetourStatNavMeshBuilder.h"
-#include "NavMeshConversion.h"
 #include "KX_ObstacleSimulation.h"
 
 static const int MAX_PATH_LEN = 256;
@@ -109,7 +112,7 @@ bool KX_NavMeshObject::BuildVertIndArrays(float *&vertices, int& nverts,
 {
        DerivedMesh* dm = mesh_create_derived_no_virtual(KX_GetActiveScene()->GetBlenderScene(), GetBlenderObject(), 
                                                                                                        NULL, CD_MASK_MESH);
-       int* recastData = (int*) dm->getFaceDataArray(dm, CD_PROP_INT);
+       int* recastData = (int*) dm->getFaceDataArray(dm, CD_RECAST);
        if (recastData)
        {
                int *dtrisToPolysMap=NULL, *dtrisToTrisMap=NULL, *trisToFacesMap=NULL;