- added new modifier to create navigation mesh (it's empty now)
authorNick Samarin <nicks1987@bigmir.net>
Fri, 25 Jun 2010 13:03:57 +0000 (13:03 +0000)
committerNick Samarin <nicks1987@bigmir.net>
Fri, 25 Jun 2010 13:03:57 +0000 (13:03 +0000)
- added parameters for navmesh modifier

projectfiles_vc9/blender/modifiers/modifiers.vcproj
release/scripts/ui/properties_data_modifier.py
source/blender/makesdna/DNA_modifier_types.h
source/blender/makesrna/intern/rna_modifier.c
source/blender/modifiers/MOD_modifiertypes.h
source/blender/modifiers/intern/MOD_navmesh.c [new file with mode: 0644]
source/blender/modifiers/intern/MOD_util.c

index 3b56775dcf7e2f5e65858de4533e18046f663f4f..f2c738a0c5d23063743a00c2b6c77bf4074e5334 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="Windows-1252"?>\r
 <VisualStudioProject\r
        ProjectType="Visual C++"\r
-       Version="9,00"\r
+       Version="9.00"\r
        Name="BL_modifiers"\r
        ProjectGUID="{7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}"\r
        RootNamespace="BL_modifiers"\r
                                RelativePath="..\..\..\source\blender\modifiers\intern\MOD_multires.c"\r
                                >\r
                        </File>\r
+                       <File\r
+                               RelativePath="..\..\..\source\blender\modifiers\intern\MOD_navmesh.c"\r
+                               >\r
+                       </File>\r
                        <File\r
                                RelativePath="..\..\..\source\blender\modifiers\intern\MOD_none.c"\r
                                >\r
index a6d6e098812584d5290eb4622e48e8b563faec83..14254dccebc32148ecd04e3c16723bf158ba8e49 100644 (file)
@@ -460,6 +460,67 @@ class DATA_PT_modifiers(DataButtonsPanel):
             row.operator("object.multires_save_external", text="Save External...")
             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")
+
+
     def PARTICLE_INSTANCE(self, layout, ob, md, wide_ui):
         layout.prop(md, "object")
         layout.prop(md, "particle_system_number", text="Particle System")
index 51f23ef210f4cee60e03859edfc9871299c5b529..23d95c3f273f012e19016160611f028bc3a5628a 100644 (file)
@@ -66,6 +66,7 @@ typedef enum ModifierType {
        eModifierType_ShapeKey,
        eModifierType_Solidify,
        eModifierType_Screw,
+       eModifierType_NavMesh,
        NUM_MODIFIER_TYPES
 } ModifierType;
 
@@ -336,6 +337,7 @@ typedef struct DecimateModifierData {
        int faceCount;
 } DecimateModifierData;
 
+
 /* Smooth modifier flags */
 #define MOD_SMOOTH_X (1<<1)
 #define MOD_SMOOTH_Y (1<<2)
@@ -722,4 +724,23 @@ typedef struct ScrewModifierData {
 // #define MOD_SCREW_OBJECT_ANGLE      (1<<4)
 
 
+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
index d2bf791fb67b7e1c5c89c8ec24dc83873488e29c..b08432c43159b092250e0952c6ad982ac0ed1af5 100644 (file)
@@ -60,6 +60,7 @@ EnumPropertyItem modifier_type_items[] ={
        {eModifierType_Solidify, "SOLIDIFY", ICON_MOD_SOLIDIFY, "Solidify", ""},
        {eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, "Subdivision Surface", ""},
        {eModifierType_UVProject, "UV_PROJECT", ICON_MOD_UVPROJECT, "UV Project", ""},
+       {eModifierType_NavMesh, "NAVMESH", ICON_MOD_DECIM, "Navigation mesh", ""},
        {0, "", 0, "Deform", ""},
        {eModifierType_Armature, "ARMATURE", ICON_MOD_ARMATURE, "Armature", ""},
        {eModifierType_Cast, "CAST", ICON_MOD_CAST, "Cast", ""},
@@ -168,6 +169,8 @@ static StructRNA* rna_Modifier_refine(struct PointerRNA *ptr)
                        return &RNA_SolidifyModifier;
                case eModifierType_Screw:
                        return &RNA_ScrewModifier;
+               case eModifierType_NavMesh:
+                       return &RNA_NavMeshModifier;
                default:
                        return &RNA_Modifier;
        }
@@ -2190,6 +2193,84 @@ static void rna_def_modifier_screw(BlenderRNA *brna)
        RNA_def_property_update(prop, 0, "rna_Modifier_update");*/
 }
 
+static void rna_def_modifier_navmesh(BlenderRNA *brna)
+{
+       StructRNA *srna;
+       PropertyRNA *prop;
+
+       srna= RNA_def_struct(brna, "NavMeshModifier", "Modifier");
+       RNA_def_struct_ui_text(srna, "NavMesh Modifier", "NavMesh modifier");
+       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)
 {
        StructRNA *srna;
@@ -2280,6 +2361,7 @@ void RNA_def_modifier(BlenderRNA *brna)
        rna_def_modifier_smoke(brna);
        rna_def_modifier_solidify(brna);
        rna_def_modifier_screw(brna);
+       rna_def_modifier_navmesh(brna);
 }
 
 #endif
index bd10b4aa6fcae8648badea33ab5b4edb9213f291..a55b5934f7dfe2eba6e1c02b58da10050299817f 100644 (file)
@@ -67,6 +67,7 @@ extern ModifierTypeInfo modifierType_Smoke;
 extern ModifierTypeInfo modifierType_ShapeKey;
 extern ModifierTypeInfo modifierType_Solidify;
 extern ModifierTypeInfo modifierType_Screw;
+extern ModifierTypeInfo modifierType_NavMesh;
 
 /* MOD_util.c */
 void modifier_type_init(ModifierTypeInfo *types[], ModifierType type);
diff --git a/source/blender/modifiers/intern/MOD_navmesh.c b/source/blender/modifiers/intern/MOD_navmesh.c
new file mode 100644 (file)
index 0000000..72fd1c4
--- /dev/null
@@ -0,0 +1,198 @@
+/*
+* $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) 2005 by the Blender Foundation.
+* All rights reserved.
+*
+* Contributor(s): 
+*
+* ***** END GPL LICENSE BLOCK *****
+*
+*/
+
+#include "DNA_meshdata_types.h"
+#include "BLI_math.h"
+#include "BKE_cdderivedmesh.h"
+#include "BKE_mesh.h"
+#include "BKE_modifier.h"
+#include "BKE_particle.h"
+
+
+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)
+{
+       NavMeshModifierData *nmmd = (NavMeshModifierData*) md;
+       NavMeshModifierData *tnmmd = (NavMeshModifierData*) target;
+
+}
+
+static DerivedMesh *createNavMesh(NavMeshModifierData *mmd,DerivedMesh *dm)
+{
+       int i;
+       DerivedMesh *result;
+       int numVerts, numEdges, numFaces;
+       int maxVerts = dm->getNumVerts(dm);
+       int maxEdges = dm->getNumEdges(dm);
+       int maxFaces = dm->getNumFaces(dm);
+
+       numVerts = numEdges = numFaces = 0;
+
+       result = CDDM_from_template(dm, maxVerts * 2, maxEdges * 2, maxFaces * 2);
+
+       for(i = 0; i < maxVerts; i++) {
+               MVert inMV;
+               MVert *mv = CDDM_get_vert(result, numVerts);
+               float co[3];
+
+               dm->getVert(dm, i, &inMV);
+
+               copy_v3_v3(co, inMV.co);
+               DM_copy_vert_data(dm, result, i, numVerts, 1);
+               *mv = inMV;
+               numVerts++;
+
+
+               {
+                       MVert *mv2 = CDDM_get_vert(result, numVerts);
+                       DM_copy_vert_data(dm, result, i, numVerts, 1);
+                       *mv2 = *mv;
+                       co[2] +=.5f;
+                       copy_v3_v3(mv2->co, co);
+                       numVerts++;
+               }
+
+       }
+
+       for(i = 0; i < maxEdges; i++) {
+               MEdge inMED;
+               MEdge *med = CDDM_get_edge(result, numEdges);
+
+               dm->getEdge(dm, i, &inMED);
+
+               DM_copy_edge_data(dm, result, i, numEdges, 1);
+               *med = inMED;
+               numEdges++;
+
+               med->v1 = inMED.v1*2;
+               med->v2 = inMED.v2*2;
+               //med->flag |= ME_EDGEDRAW | ME_EDGERENDER;
+
+               {
+                       MEdge *med2 = CDDM_get_edge(result, numEdges);
+
+                       DM_copy_edge_data(dm, result, i, numEdges, 1);
+                       *med2 = *med;
+                       numEdges++;
+
+                       med2->v1 += 1;
+                       med2->v2 += 1;
+               }               
+       }
+
+       for(i = 0; i < maxFaces; i++) {
+               MFace inMF;
+               MFace *mf = CDDM_get_face(result, numFaces);
+
+               dm->getFace(dm, i, &inMF);
+
+               DM_copy_face_data(dm, result, i, numFaces, 1);
+               *mf = inMF;
+               numFaces++;
+
+               mf->v1 = inMF.v1*2;
+               mf->v2 = inMF.v2*2;
+               mf->v3 = inMF.v3*2;
+               mf->v4 = inMF.v4*2;
+
+               {
+                       MFace *mf2 = CDDM_get_face(result, numFaces);
+                       DM_copy_face_data(dm, result, i, numFaces, 1);
+                       *mf2 = *mf;
+
+                       mf2->v1 += 1;
+                       mf2->v2 += 1;
+                       mf2->v3 += 1;
+                       if(inMF.v4) mf2->v4 += 1;
+
+                       //test_index_face(mf2, &result->faceData, numFaces, inMF.v4?4:3);
+                       numFaces++;
+               }
+       }
+
+/*
+       CDDM_lower_num_verts(result, numVerts);
+       CDDM_lower_num_edges(result, numEdges);
+       CDDM_lower_num_faces(result, numFaces);*/       
+
+       return result;
+}
+
+
+static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData,
+                                                                 int useRenderParams, int isFinalCalc)
+{
+       DerivedMesh *result;
+
+       NavMeshModifierData *nmmd = (NavMeshModifierData*) md;
+
+       result = createNavMesh(nmmd, derivedData);
+
+       return result;
+}
+
+
+ModifierTypeInfo modifierType_NavMesh = {
+       /* name */              "NavMesh",
+       /* structName */        "NavMeshModifierData",
+       /* structSize */        sizeof(NavMeshModifierData),
+       /* type */              eModifierTypeType_Constructive,
+       /* flags */             eModifierTypeFlag_AcceptsMesh,
+       /* copyData */          copyData,
+       /* deformVerts */       0,
+       /* deformVertsEM */     0,
+       /* deformMatricesEM */  0,
+       /* applyModifier */     applyModifier,
+       /* applyModifierEM */   0,
+       /* initData */          initData,
+       /* requiredDataMask */  0,
+       /* freeData */          0,
+       /* isDisabled */        0,
+       /* updateDepgraph */    0,
+       /* dependsOnTime */     0,
+       /* foreachObjectLink */ 0,
+       /* foreachIDLink */     0,
+};
index 24b907dcfa8616e701400c36839a5d2f2f3bdb2e..0e9fe81ffdc3e474f4c4036e7c859294566dc487 100644 (file)
@@ -182,5 +182,6 @@ void modifier_type_init(ModifierTypeInfo *types[], ModifierType type)
        INIT_TYPE(ShapeKey);
        INIT_TYPE(Solidify);
        INIT_TYPE(Screw);
+       INIT_TYPE(NavMesh);
 #undef INIT_TYPE
 }