diff options
author | Nick Samarin <nicks1987@bigmir.net> | 2010-07-21 23:44:59 +0400 |
---|---|---|
committer | Nick Samarin <nicks1987@bigmir.net> | 2010-07-21 23:44:59 +0400 |
commit | b7819807b33ded7c20956c52bcaf1ee93bf428f7 (patch) | |
tree | 6be1facf43a44ddba910beccf665699ad888a293 | |
parent | e8d129cc76bf4f1d47085232dc729aaeba0e4d3a (diff) |
implemented navigation mesh visualization via modifier
-rw-r--r-- | release/scripts/ui/properties_data_modifier.py | 60 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_DerivedMesh.h | 1 | ||||
-rw-r--r-- | source/blender/editors/object/object_navmesh.cpp | 5 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_modifier_types.h | 16 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_modifier.c | 66 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_navmesh.cpp | 358 |
6 files changed, 74 insertions, 432 deletions
diff --git a/release/scripts/ui/properties_data_modifier.py b/release/scripts/ui/properties_data_modifier.py index a279e3233b1..a334e16d087 100644 --- a/release/scripts/ui/properties_data_modifier.py +++ b/release/scripts/ui/properties_data_modifier.py @@ -461,65 +461,7 @@ class DATA_PT_modifiers(DataButtonsPanel): row.label() def NAVMESH(self, layout, ob, md, wide_ui): - layout.label(text="Rasterization:") - split = layout.split() - - col = split.column() - col.prop(md, "cellsize") - if wide_ui: - col = split.column() - col.prop(md, "cellheight") - - layout.separator() - - layout.label(text="Agent:") - split = layout.split() - col = split.column() - row = col.row() - row.prop(md, "agentheight") - row = col.row() - row.prop(md, "agentradius") - if wide_ui: - col = split.column() - row = col.row() - row.prop(md, "agentmaxslope") - row = col.row() - row.prop(md, "agentmaxclimb") - - layout.separator() - - layout.label(text="Region:") - split = layout.split() - col = split.column() - col.prop(md, "regionminsize") - if wide_ui: - col = split.column() - col.prop(md, "regionmergesize") - - layout.separator() - - layout.label(text="Polygonization:") - split = layout.split() - col = split.column() - row = col.row() - row.prop(md, "edgemaxlen") - row = col.row() - row.prop(md, "edgemaxerror") - if wide_ui: - col = split.column() - row = col.row() - row.prop(md, "vertsperpoly") - - layout.separator() - - layout.label(text="Detail Mesh:") - split = layout.split() - col = split.column() - col.prop(md, "detailsampledist") - if wide_ui: - col = split.column() - col.prop(md, "detailsamplemaxerror") - + layout = self.layout def PARTICLE_INSTANCE(self, layout, ob, md, wide_ui): layout.prop(md, "object") diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h index 33852a1b923..00820823270 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.h +++ b/source/blender/blenkernel/BKE_DerivedMesh.h @@ -227,6 +227,7 @@ struct DerivedMesh { * * Also called for *final* editmode DerivedMeshes */ + void (*drawEdges)(DerivedMesh *dm, int drawLooseEdges, int drawAllEdges); /* Draw all loose edges (edges w/ no adjoining faces) */ diff --git a/source/blender/editors/object/object_navmesh.cpp b/source/blender/editors/object/object_navmesh.cpp index 9b138365ac5..a5ff74ae4fd 100644 --- a/source/blender/editors/object/object_navmesh.cpp +++ b/source/blender/editors/object/object_navmesh.cpp @@ -36,6 +36,7 @@ extern "C" #include "DNA_scene_types.h" #include "DNA_object_types.h" #include "DNA_meshdata_types.h" +#include "DNA_modifier_types.h" #include "DNA_ID.h" #include "BKE_library.h" @@ -306,6 +307,7 @@ static Object* createRepresentation(bContext *C, rcPolyMesh*& pmesh, rcPolyMeshD int i,j, k, polyverts; unsigned short* v; int face[3]; + Scene *scene= CTX_data_scene(C); zero_v3(co); zero_v3(rot); @@ -392,6 +394,9 @@ static Object* createRepresentation(bContext *C, rcPolyMesh*& pmesh, rcPolyMeshD obedit->gameflag |= OB_NAVMESH; obedit->body_type = OB_BODY_TYPE_NAVMESH; rename_id((ID *)obedit, "Navmesh"); + + ED_object_modifier_add(NULL, scene, obedit, NULL, eModifierType_NavMesh); + //ModifierData *md= modifiers_findByType(ob, eModifierType_NavMesh); return obedit; } diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index d30c8d252db..2dbd2c19e50 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -727,21 +727,7 @@ typedef struct ScrewModifierData { typedef struct NavMeshModifierData { ModifierData modifier; - char pad[4]; - float cellsize; - float cellheight; - float agentmaxslope; - float agentmaxclimb; - float agentheight; - float agentradius; - float edgemaxlen; - float edgemaxerror; - float regionminsize; - float regionmergesize; - int vertsperpoly; - float detailsampledist; - float detailsamplemaxerror; - + } NavMeshModifierData; #endif diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index bcdb4709d9a..ea72b1cdcfa 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -2219,72 +2219,6 @@ static void rna_def_modifier_navmesh(BlenderRNA *brna) RNA_def_struct_sdna(srna, "NavMeshModifierData"); RNA_def_struct_ui_icon(srna, ICON_MOD_DECIM); - prop= RNA_def_property(srna, "cellsize", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_range(prop, 0.1, 1, 0.01, 2); - RNA_def_property_ui_text(prop, "Cell size", "Rasterized cell size"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop= RNA_def_property(srna, "cellheight", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_range(prop, 0.1, 1, 0.01, 2); - RNA_def_property_ui_text(prop, "Cell height", "Rasterized cell height"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop= RNA_def_property(srna, "agentheight", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_range(prop, 0.1, 5, 0.1, 2); - RNA_def_property_ui_text(prop, "Agent height", "Minimum height where the agent can still walk"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop= RNA_def_property(srna, "agentradius", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_range(prop, 0.1, 5, 0.1, 2); - RNA_def_property_ui_text(prop, "Agent radius", "Radius of the agent"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop= RNA_def_property(srna, "agentmaxclimb", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_range(prop, 0.1, 5, 0.1, 2); - RNA_def_property_ui_text(prop, "Max climb", "Maximum height between grid cells the agent can climb"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop= RNA_def_property(srna, "agentmaxslope", PROP_FLOAT, PROP_ANGLE); - RNA_def_property_ui_range(prop, 0, 90, 1, 2); - RNA_def_property_ui_text(prop, "Max slope", "Maximum walkable slope angle in degrees"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - - prop= RNA_def_property(srna, "regionminsize", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_range(prop, 0, 150, 1, 2); - RNA_def_property_ui_text(prop, "Min region size", "Minimum regions size. Smaller regions will be deleted"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop= RNA_def_property(srna, "regionmergesize", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_range(prop, 0, 150, 1, 2); - RNA_def_property_ui_text(prop, "Merged region size", "Minimum regions size. Smaller regions will be merged"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop= RNA_def_property(srna, "edgemaxlen", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_range(prop, 0, 50, 1, 2); - RNA_def_property_ui_text(prop, "Max edge length", "Maximum contour edge length"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop= RNA_def_property(srna, "edgemaxerror", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_range(prop, 0.1, 3.0, 0.1, 2); - RNA_def_property_ui_text(prop, "Max edge error", "Maximum distance error from contour to cells"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop= RNA_def_property(srna, "vertsperpoly", PROP_INT, PROP_NONE); - RNA_def_property_ui_range(prop, 3, 12, 1, 0); - RNA_def_property_ui_text(prop, "Verts per poly", "Max number of vertices per polygon"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop= RNA_def_property(srna, "detailsampledist", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_range(prop, 0.0, 16.0, 1, 2); - RNA_def_property_ui_text(prop, "Sample Distance", "Detail mesh sample spacing"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop= RNA_def_property(srna, "detailsamplemaxerror", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_range(prop, 0.0, 16.0, 1, 2); - RNA_def_property_ui_text(prop, "Max Sample Error", "Detail mesh simplification max sample error"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - } void RNA_def_modifier(BlenderRNA *brna) diff --git a/source/blender/modifiers/intern/MOD_navmesh.cpp b/source/blender/modifiers/intern/MOD_navmesh.cpp index d8d6ac4e618..67f06bcf958 100644 --- a/source/blender/modifiers/intern/MOD_navmesh.cpp +++ b/source/blender/modifiers/intern/MOD_navmesh.cpp @@ -46,20 +46,6 @@ extern "C"{ static void initData(ModifierData *md) { NavMeshModifierData *nmmd = (NavMeshModifierData*) md; - - nmmd->cellsize = 0.3f; - nmmd->cellheight = 0.2f; - nmmd->agentmaxslope = 45.0f; - nmmd->agentmaxclimb = 0.9f; - nmmd->agentheight = 2.0f; - nmmd->agentradius = 0.6f; - nmmd->edgemaxlen = 12.0f; - nmmd->edgemaxerror = 1.3f; - nmmd->regionminsize = 50.f; - nmmd->regionmergesize = 20.f; - nmmd->vertsperpoly = 6; - nmmd->detailsampledist = 6.0f; - nmmd->detailsamplemaxerror = 1.0f; } static void copyData(ModifierData *md, ModifierData *target) @@ -70,228 +56,11 @@ static void copyData(ModifierData *md, ModifierData *target) //.todo - deep copy } -static DerivedMesh *buildNavMesh(NavMeshModifierData *mmd,DerivedMesh *dm) -{ - const int nverts = dm->getNumVerts(dm); - MVert *mvert = dm->getVertArray(dm); - const int nfaces = dm->getNumFaces(dm); - MFace *mface = dm->getFaceArray(dm); - float* verts; - int *tris, *tri; - float bmin[3], bmax[3]; - int i,j; - DerivedMesh* result = NULL; - rcHeightfield* solid; - unsigned char *triflags; - rcCompactHeightfield* chf; - rcContourSet *cset; - rcPolyMesh* pmesh; - rcPolyMeshDetail* dmesh; - int numVerts, numEdges, numFaces; - - //calculate count of tris - int ntris = nfaces; - for (i=0; i<nfaces; i++) - { - MFace* mf = &mface[i]; - if (mf->v4) - ntris+=1; - } - - //create verts - verts = (float*) MEM_mallocN(sizeof(float)*3*nverts, "verts"); - for (i=0; i<nverts; i++) - { - MVert *v = &mvert[i]; - verts[3*i+0] = v->co[0]; - verts[3*i+1] = v->co[2]; - verts[3*i+2] = v->co[1]; - } - //create tris - tris = (int*) MEM_mallocN(sizeof(int)*3*ntris, "faces"); - tri = tris; - for (i=0; i<nfaces; i++) - { - MFace* mf = &mface[i]; - tri[0]= mf->v1; tri[1]= mf->v3; tri[2]= mf->v2; - tri += 3; - if (mf->v4) - { - tri[0]= mf->v1; tri[1]= mf->v4; tri[2]= mf->v3; - tri += 3; - } - } - - rcCalcBounds(verts, nverts, bmin, bmax); - - // - // Step 1. Initialize build config. - // - rcConfig cfg; - memset(&cfg, 0, sizeof(cfg)); - cfg.cs = mmd->cellsize; - cfg.ch = mmd->cellheight; - cfg.walkableSlopeAngle = mmd->agentmaxslope; - cfg.walkableHeight = (int)ceilf(mmd->agentheight/ cfg.ch); - cfg.walkableClimb = (int)floorf(mmd->agentmaxclimb / cfg.ch); - cfg.walkableRadius = (int)ceilf(mmd->agentradius / cfg.cs); - cfg.maxEdgeLen = (int)(mmd->edgemaxlen/ mmd->cellsize); - cfg.maxSimplificationError = mmd->edgemaxerror; - cfg.minRegionSize = (int)rcSqr(mmd->regionminsize); - cfg.mergeRegionSize = (int)rcSqr(mmd->regionmergesize); - cfg.maxVertsPerPoly = mmd->vertsperpoly; - cfg.detailSampleDist = mmd->detailsampledist< 0.9f ? 0 : mmd->cellsize * mmd->detailsampledist; - cfg.detailSampleMaxError = mmd->cellheight * mmd->detailsamplemaxerror; - - // Set the area where the navigation will be build. - vcopy(cfg.bmin, bmin); - vcopy(cfg.bmax, bmax); - rcCalcGridSize(cfg.bmin, cfg.bmax, cfg.cs, &cfg.width, &cfg.height); - - // - // Step 2. Rasterize input polygon soup. - // - // Allocate voxel heightfield where we rasterize our input data to. - solid = new rcHeightfield; - if (!solid) - return NULL; - - if (!rcCreateHeightfield(*solid, cfg.width, cfg.height, cfg.bmin, cfg.bmax, cfg.cs, cfg.ch)) - return NULL; - - // Allocate array that can hold triangle flags. - triflags = (unsigned char*) MEM_mallocN(sizeof(unsigned char)*ntris, "triflags"); - if (!triflags) - return NULL; - // Find triangles which are walkable based on their slope and rasterize them. - memset(triflags, 0, ntris*sizeof(unsigned char)); - rcMarkWalkableTriangles(cfg.walkableSlopeAngle, verts, nverts, tris, ntris, triflags); - rcRasterizeTriangles(verts, nverts, tris, triflags, ntris, *solid); - MEM_freeN(triflags); - MEM_freeN(verts); - MEM_freeN(tris); - - // - // Step 3. Filter walkables surfaces. - // - rcFilterLedgeSpans(cfg.walkableHeight, cfg.walkableClimb, *solid); - rcFilterWalkableLowHeightSpans(cfg.walkableHeight, *solid); - - // - // Step 4. Partition walkable surface to simple regions. - // - - chf = new rcCompactHeightfield; - if (!chf) - return NULL; - if (!rcBuildCompactHeightfield(cfg.walkableHeight, cfg.walkableClimb, RC_WALKABLE, *solid, *chf)) - return NULL; - - delete solid; - - // Prepare for region partitioning, by calculating distance field along the walkable surface. - if (!rcBuildDistanceField(*chf)) - return NULL; - - // Partition the walkable surface into simple regions without holes. - if (!rcBuildRegions(*chf, cfg.walkableRadius, cfg.borderSize, cfg.minRegionSize, cfg.mergeRegionSize)) - return NULL; - - // - // Step 5. Trace and simplify region contours. - // - // Create contours. - cset = new rcContourSet; - if (!cset) - return NULL; - - if (!rcBuildContours(*chf, cfg.maxSimplificationError, cfg.maxEdgeLen, *cset)) - return NULL; - - // - // Step 6. Build polygons mesh from contours. - // - pmesh = new rcPolyMesh; - if (!pmesh) - return NULL; - if (!rcBuildPolyMesh(*cset, cfg.maxVertsPerPoly, *pmesh)) - return NULL; - - - // - // Step 7. Create detail mesh which allows to access approximate height on each polygon. - // - - dmesh = new rcPolyMeshDetail; - if (!dmesh) - return NULL; - - if (!rcBuildPolyMeshDetail(*pmesh, *chf, cfg.detailSampleDist, cfg.detailSampleMaxError, *dmesh)) - return NULL; - - delete chf; - delete cset; - - - // - // Create blender mesh from detail poly mesh - // - - numVerts = dmesh->nverts; - numFaces = dmesh->ntris; - numEdges = dmesh->ntris*3; - - result = CDDM_new(numVerts, numEdges, numFaces); - //copy verts - for(i = 0; i < numVerts; i++) { - MVert *mv = CDDM_get_vert(result, i); - copy_v3_v3(mv->co, &dmesh->verts[3*i]); - SWAP(float, mv->co[1], mv->co[2]); - } - - //create faces and edges - numFaces = numEdges = 0; - for (i=0; i<dmesh->nmeshes; i++) - { - unsigned short vbase = dmesh->meshes[4*i+0]; - unsigned short vnum = dmesh->meshes[4*i+1]; - unsigned short tribase = dmesh->meshes[4*i+2]; - unsigned short trinum = dmesh->meshes[4*i+3]; - - for (j=0; j<trinum; j++) - { - unsigned char* tri = &dmesh->tris[4*(tribase+j)]; - MFace *mf = CDDM_get_face(result, numFaces); - MEdge *med; - mf->v1 = vbase + tri[0]; - mf->v2 = vbase + tri[1]; - mf->v3 = vbase + tri[2]; - numFaces++; - - { - int e1=0, e2=2; - for (;e1<3; e2=e1++) - { - med = CDDM_get_edge(result, numEdges); - med->v1 = vbase + tri[e2]; - med->v2 = vbase + tri[e1]; - numEdges++; - } - } - } - } - - - delete pmesh; - delete dmesh; - - return result; -} - 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; @@ -301,33 +70,42 @@ inline void intToCol(int i, float* col) col[1] = 1 - g*63.0f/255.0f; col[2] = 1 - b*63.0f/255.0f; } +/* +static void (*drawFacesSolid_original)(DerivedMesh *dm, float (*partial_redraw_planes)[4], + int fast, int (*setMaterial)(int, void *attribs)) = NULL;*/ -static void navDM_drawFacesSolid(DerivedMesh *dm, - float (*partial_redraw_planes)[4], - int fast, int (*setMaterial)(int, void *attribs)) +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); + if (!polygonIdx) + return; float col[3]; - col[0] = 1.f; - col[1] = 0.f; - col[2] = 0.f; + /* + //UI_ThemeColor(TH_WIRE); + glDisable(GL_LIGHTING); + glLineWidth(2.0); + dm->drawEdges(dm, 0, 1); + glLineWidth(1.0); + glEnable(GL_LIGHTING);*/ + + glDisable(GL_LIGHTING); if(GPU_buffer_legacy(dm) ) { - DEBUG_VBO( "Using legacy code. navDM_drawFacesSolid\n" ); + DEBUG_VBO( "Using legacy code. drawNavMeshColored\n" ); //glShadeModel(GL_SMOOTH); glBegin(glmode = GL_QUADS); - for(a = 0; a < dm->numFaceData; a++, mface++, polygonIdx++) { + for(a = 0; a < dm->numFaceData; a++, mface++) { int new_glmode = mface->v4?GL_QUADS:GL_TRIANGLES; - intToCol(a, col); - //intToCol(*polygonIdx, col); + int* polygonIdx = (int*)CustomData_get(&dm->faceData, a, CD_PROP_INT); + intToCol(*polygonIdx, col); if(new_glmode != glmode) { glEnd(); glBegin(glmode = new_glmode); } - //glColor3fv(col); + glColor3fv(col); glVertex3fv(mvert[mface->v1].co); glVertex3fv(mvert[mface->v2].co); glVertex3fv(mvert[mface->v3].co); @@ -337,9 +115,23 @@ static void navDM_drawFacesSolid(DerivedMesh *dm, } glEnd(); } + glEnable(GL_LIGHTING); } -static DerivedMesh *testCreateNavMesh(NavMeshModifierData *mmd,DerivedMesh *dm) +static void navDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace *tface, MCol *mcol, int matnr)) +{ + drawNavMeshColored(dm); +} + +static void navDM_drawFacesSolid(DerivedMesh *dm, + float (*partial_redraw_planes)[4], + int fast, int (*setMaterial)(int, void *attribs)) +{ + //drawFacesSolid_original(dm, partial_redraw_planes, fast, setMaterial); + drawNavMeshColored(dm); +} + +static DerivedMesh *createNavMeshForVisualization(NavMeshModifierData *mmd,DerivedMesh *dm) { int i; DerivedMesh *result; @@ -348,40 +140,23 @@ static DerivedMesh *testCreateNavMesh(NavMeshModifierData *mmd,DerivedMesh *dm) int maxEdges = dm->getNumEdges(dm); int maxFaces = dm->getNumFaces(dm); -/* MVert *mv; - MEdge *med; - MFace *mf; - numVerts = numEdges = numFaces = 0; - - result = CDDM_new(3, 3, 1); - mv = CDDM_get_vert(result, 0); - mv->co[0] = -10; mv->co[1] = -10; mv->co[2] = 0; - mv = CDDM_get_vert(result, 1); - mv->co[0] = -10; mv->co[1] = 10; mv->co[2] = 0; - mv = CDDM_get_vert(result, 2); - mv->co[0] = 10; mv->co[1] = -10; mv->co[2] = 0; + result = CDDM_copy(dm); + CustomData_add_layer_named(&result->faceData, CD_PROP_INT, CD_DUPLICATE, + CustomData_get_layer(&dm->faceData, CD_PROP_INT), maxFaces, "recastData"); - med = CDDM_get_edge(result, 0); - med->v1 = 0; med->v1 = 1; - med = CDDM_get_edge(result, 1); - med->v1 = 1; med->v1 = 2; - med = CDDM_get_edge(result, 2); - med->v1 = 2; med->v1 = 0; + /*result = CDDM_new(maxVerts, maxEdges, maxFaces); + DM_copy_vert_data(dm, result, 0, 0, maxVerts); + DM_copy_edge_data(dm, result, 0, 0, maxEdges); + DM_copy_face_data(dm, result, 0, 0, maxFaces);*/ - mf = CDDM_get_face(result, 0); - mf->v1 = 0; mf->v2 = 1; mf->v3 = 2; -*/ - - int actualFaces = 0; - for(i = 0; i < maxFaces; i++) { - int* polygonIdx = (int*)CustomData_get(&dm->faceData, i, CD_PROP_INT); - if (*polygonIdx==1) - actualFaces++; - } - - - result = CDDM_new(maxVerts, maxEdges, maxFaces);//maxFaces actualFaces + + /* + if (!drawFacesSolid_original) + drawFacesSolid_original= result->drawFacesSolid;*/ + result->drawFacesTex = navDM_drawFacesTex; result->drawFacesSolid = navDM_drawFacesSolid; + +/* numVerts = numEdges = numFaces = 0; for(i = 0; i < maxVerts; i++) { MVert inMV; @@ -390,10 +165,9 @@ static DerivedMesh *testCreateNavMesh(NavMeshModifierData *mmd,DerivedMesh *dm) dm->getVert(dm, i, &inMV); copy_v3_v3(co, inMV.co); *mv = inMV; - mv->co[2] +=.5f; + //mv->co[2] +=.5f; numVerts++; } - for(i = 0; i < maxEdges; i++) { MEdge inMED; MEdge *med = CDDM_get_edge(result, numEdges); @@ -401,36 +175,35 @@ static DerivedMesh *testCreateNavMesh(NavMeshModifierData *mmd,DerivedMesh *dm) *med = inMED; numEdges++; } - for(i = 0; i < maxFaces; i++) { - /* - int* polygonIdx = (int*)CustomData_get(&dm->faceData, i, CD_PROP_INT); - if (*polygonIdx!=2) - continue;*/ - MFace inMF; MFace *mf = CDDM_get_face(result, numFaces); dm->getFace(dm, i, &inMF); *mf = inMF; numFaces++; - } + }*/ return result; } +/* +static int isDisabled(ModifierData *md, int useRenderParams) +{ + NavMeshModifierData *amd = (NavMeshModifierData*) md; + return false; +}*/ + + static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData, int useRenderParams, int isFinalCalc) { - DerivedMesh *result; - + DerivedMesh *result = NULL; NavMeshModifierData *nmmd = (NavMeshModifierData*) md; - - //for test - //result = testCreateNavMesh(nmmd, derivedData); - //result = buildNavMesh(nmmd, derivedData); - + if (ob->body_type==OB_BODY_TYPE_NAVMESH) + result = createNavMeshForVisualization(nmmd, derivedData); + return result; } @@ -440,7 +213,8 @@ ModifierTypeInfo modifierType_NavMesh = { /* structName */ "NavMeshModifierData", /* structSize */ sizeof(NavMeshModifierData), /* type */ eModifierTypeType_Constructive, - /* flags */ eModifierTypeFlag_AcceptsMesh, + /* flags */ (ModifierTypeFlag) (eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_NoUserAdd), /* copyData */ copyData, /* deformVerts */ 0, /* deformVertsEM */ 0, |