- moved navmesh conversion code to ED_Editors project (ED_navmesh_conversion.h and navmesh_conversion.cpp files)
- added new custom data layer CD_Recast
This commit is contained in:
@@ -269,18 +269,6 @@
|
||||
</File>
|
||||
</Filter>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="BlenderNavMesh"
|
||||
>
|
||||
<File
|
||||
RelativePath="..\..\BlenderNavMesh\NavMeshConversion.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\BlenderNavMesh\NavMeshConversion.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
|
||||
@@ -250,6 +250,10 @@
|
||||
RelativePath="..\..\..\source\blender\editors\include\ED_mesh.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\source\blender\editors\include\ED_navmesh_conversion.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\source\blender\editors\include\ED_node.h"
|
||||
>
|
||||
@@ -719,6 +723,10 @@
|
||||
RelativePath="..\..\..\source\blender\editors\util\editmode_undo.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\source\blender\editors\util\navmesh_conversion.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\source\blender\editors\util\numinput.c"
|
||||
>
|
||||
|
||||
@@ -182,7 +182,7 @@
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
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"
|
||||
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"
|
||||
PreprocessorDefinitions="_DEBUG;WIN32;_LIB;WITH_LZO;WITH_LZMA"
|
||||
MinimalRebuild="false"
|
||||
BasicRuntimeChecks="3"
|
||||
@@ -253,7 +253,7 @@
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
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"
|
||||
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"
|
||||
PreprocessorDefinitions="NDEBUG;WIN32;_LIB;WITH_LZO;WITH_LZMA"
|
||||
BasicRuntimeChecks="0"
|
||||
RuntimeLibrary="0"
|
||||
|
||||
@@ -194,7 +194,7 @@
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
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"
|
||||
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"
|
||||
PreprocessorDefinitions="JANCODEPANCO;WIN32;_LIB;EXP_PYTHON_EMBEDDING;_DEBUG;USE_SUMO_SOLID;WITH_GLEXT;GLEW_STATIC;WITH_FFMPEG"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="1"
|
||||
@@ -271,7 +271,7 @@
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
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"
|
||||
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"
|
||||
PreprocessorDefinitions="NDEBUG;WIN32;_LIB;USE_SUMO_SOLID;WITH_GLEXT;GLEW_STATIC;WITH_FFMPEG"
|
||||
StringPooling="true"
|
||||
RuntimeLibrary="0"
|
||||
|
||||
@@ -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 =
|
||||
|
||||
96
source/blender/editors/include/ED_navmesh_conversion.h
Normal file
96
source/blender/editors/include/ED_navmesh_conversion.h
Normal file
@@ -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
|
||||
@@ -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;
|
||||
|
||||
420
source/blender/editors/util/navmesh_conversion.cpp
Normal file
420
source/blender/editors/util/navmesh_conversion.cpp
Normal file
@@ -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;
|
||||
}
|
||||
@@ -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 */
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -27,9 +27,10 @@
|
||||
*/
|
||||
#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;
|
||||
|
||||
@@ -31,19 +31,22 @@
|
||||
|
||||
#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;
|
||||
|
||||
Reference in New Issue
Block a user