- added new modifier to create navigation mesh (it's empty now)
[blender.git] / source / blender / modifiers / intern / MOD_navmesh.c
1 /*
2 * $Id$
3 *
4 * ***** BEGIN GPL LICENSE BLOCK *****
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software  Foundation,
18 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 *
20 * The Original Code is Copyright (C) 2005 by the Blender Foundation.
21 * All rights reserved.
22 *
23 * Contributor(s): 
24 *
25 * ***** END GPL LICENSE BLOCK *****
26 *
27 */
28
29 #include "DNA_meshdata_types.h"
30 #include "BLI_math.h"
31 #include "BKE_cdderivedmesh.h"
32 #include "BKE_mesh.h"
33 #include "BKE_modifier.h"
34 #include "BKE_particle.h"
35
36
37 static void initData(ModifierData *md)
38 {
39         NavMeshModifierData *nmmd = (NavMeshModifierData*) md;
40
41         nmmd->cellsize = 0.3f;
42         nmmd->cellheight = 0.2f;
43         nmmd->agentmaxslope = 45.0f;
44         nmmd->agentmaxclimb = 0.9f;
45         nmmd->agentheight = 2.0f;
46         nmmd->agentradius = 0.6f;
47         nmmd->edgemaxlen = 12.0f;
48         nmmd->edgemaxerror = 1.3f;
49         nmmd->regionminsize = 50.f;
50         nmmd->regionmergesize = 20.f;
51         nmmd->vertsperpoly = 6;
52         nmmd->detailsampledist = 6.0f;
53         nmmd->detailsamplemaxerror = 1.0f;
54 }
55
56 static void copyData(ModifierData *md, ModifierData *target)
57 {
58         NavMeshModifierData *nmmd = (NavMeshModifierData*) md;
59         NavMeshModifierData *tnmmd = (NavMeshModifierData*) target;
60
61 }
62
63 static DerivedMesh *createNavMesh(NavMeshModifierData *mmd,DerivedMesh *dm)
64 {
65         int i;
66         DerivedMesh *result;
67         int numVerts, numEdges, numFaces;
68         int maxVerts = dm->getNumVerts(dm);
69         int maxEdges = dm->getNumEdges(dm);
70         int maxFaces = dm->getNumFaces(dm);
71
72         numVerts = numEdges = numFaces = 0;
73
74         result = CDDM_from_template(dm, maxVerts * 2, maxEdges * 2, maxFaces * 2);
75
76         for(i = 0; i < maxVerts; i++) {
77                 MVert inMV;
78                 MVert *mv = CDDM_get_vert(result, numVerts);
79                 float co[3];
80
81                 dm->getVert(dm, i, &inMV);
82
83                 copy_v3_v3(co, inMV.co);
84                 DM_copy_vert_data(dm, result, i, numVerts, 1);
85                 *mv = inMV;
86                 numVerts++;
87
88
89                 {
90                         MVert *mv2 = CDDM_get_vert(result, numVerts);
91                         DM_copy_vert_data(dm, result, i, numVerts, 1);
92                         *mv2 = *mv;
93                         co[2] +=.5f;
94                         copy_v3_v3(mv2->co, co);
95                         numVerts++;
96                 }
97
98         }
99
100         for(i = 0; i < maxEdges; i++) {
101                 MEdge inMED;
102                 MEdge *med = CDDM_get_edge(result, numEdges);
103
104                 dm->getEdge(dm, i, &inMED);
105
106                 DM_copy_edge_data(dm, result, i, numEdges, 1);
107                 *med = inMED;
108                 numEdges++;
109
110                 med->v1 = inMED.v1*2;
111                 med->v2 = inMED.v2*2;
112                 //med->flag |= ME_EDGEDRAW | ME_EDGERENDER;
113
114                 {
115                         MEdge *med2 = CDDM_get_edge(result, numEdges);
116
117                         DM_copy_edge_data(dm, result, i, numEdges, 1);
118                         *med2 = *med;
119                         numEdges++;
120
121                         med2->v1 += 1;
122                         med2->v2 += 1;
123                 }               
124         }
125
126         for(i = 0; i < maxFaces; i++) {
127                 MFace inMF;
128                 MFace *mf = CDDM_get_face(result, numFaces);
129
130                 dm->getFace(dm, i, &inMF);
131
132                 DM_copy_face_data(dm, result, i, numFaces, 1);
133                 *mf = inMF;
134                 numFaces++;
135
136                 mf->v1 = inMF.v1*2;
137                 mf->v2 = inMF.v2*2;
138                 mf->v3 = inMF.v3*2;
139                 mf->v4 = inMF.v4*2;
140
141                 {
142                         MFace *mf2 = CDDM_get_face(result, numFaces);
143                         DM_copy_face_data(dm, result, i, numFaces, 1);
144                         *mf2 = *mf;
145
146                         mf2->v1 += 1;
147                         mf2->v2 += 1;
148                         mf2->v3 += 1;
149                         if(inMF.v4) mf2->v4 += 1;
150
151                         //test_index_face(mf2, &result->faceData, numFaces, inMF.v4?4:3);
152                         numFaces++;
153                 }
154         }
155
156 /*
157         CDDM_lower_num_verts(result, numVerts);
158         CDDM_lower_num_edges(result, numEdges);
159         CDDM_lower_num_faces(result, numFaces);*/       
160
161         return result;
162 }
163
164
165 static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData,
166                                                                   int useRenderParams, int isFinalCalc)
167 {
168         DerivedMesh *result;
169
170         NavMeshModifierData *nmmd = (NavMeshModifierData*) md;
171
172         result = createNavMesh(nmmd, derivedData);
173
174         return result;
175 }
176
177
178 ModifierTypeInfo modifierType_NavMesh = {
179         /* name */              "NavMesh",
180         /* structName */        "NavMeshModifierData",
181         /* structSize */        sizeof(NavMeshModifierData),
182         /* type */              eModifierTypeType_Constructive,
183         /* flags */             eModifierTypeFlag_AcceptsMesh,
184         /* copyData */          copyData,
185         /* deformVerts */       0,
186         /* deformVertsEM */     0,
187         /* deformMatricesEM */  0,
188         /* applyModifier */     applyModifier,
189         /* applyModifierEM */   0,
190         /* initData */          initData,
191         /* requiredDataMask */  0,
192         /* freeData */          0,
193         /* isDisabled */        0,
194         /* updateDepgraph */    0,
195         /* dependsOnTime */     0,
196         /* foreachObjectLink */ 0,
197         /* foreachIDLink */     0,
198 };