Extract common modifier parameters into ModifierEvalContext struct
[blender.git] / source / blender / modifiers / intern / MOD_triangulate.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software  Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor(s): Antony Riakiotakis
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  *
22  */
23
24 /** \file blender/modifiers/intern/MOD_triangulate.c
25  *  \ingroup modifiers
26  */
27
28 #include "DNA_object_types.h"
29
30 #include "BLI_utildefines.h"
31
32 #include "BKE_cdderivedmesh.h"
33 #include "BKE_modifier.h"
34
35 #include "bmesh.h"
36 #include "bmesh_tools.h"
37
38 #include "MOD_modifiertypes.h"
39
40 static DerivedMesh *triangulate_dm(DerivedMesh *dm, const int quad_method, const int ngon_method)
41 {
42         DerivedMesh *result;
43         BMesh *bm;
44         int total_edges, i;
45         MEdge *me;
46
47         bm = DM_to_bmesh(dm, true);
48
49         BM_mesh_triangulate(bm, quad_method, ngon_method, false, NULL, NULL, NULL);
50
51         result = CDDM_from_bmesh(bm, false);
52         BM_mesh_free(bm);
53
54         total_edges = result->getNumEdges(result);
55         me = CDDM_get_edges(result);
56
57         /* force drawing of all edges (seems to be omitted in CDDM_from_bmesh) */
58         for (i = 0; i < total_edges; i++, me++)
59                 me->flag |= ME_EDGEDRAW | ME_EDGERENDER;
60
61         result->dirty |= DM_DIRTY_NORMALS;
62
63         return result;
64 }
65
66
67 static void initData(ModifierData *md)
68 {
69         TriangulateModifierData *tmd = (TriangulateModifierData *)md;
70
71         /* Enable in editmode by default */
72         md->mode |= eModifierMode_Editmode;
73         tmd->quad_method = MOD_TRIANGULATE_QUAD_SHORTEDGE;
74         tmd->ngon_method = MOD_TRIANGULATE_NGON_BEAUTY;
75 }
76
77
78 static void copyData(ModifierData *md, ModifierData *target)
79 {
80 #if 0
81         TriangulateModifierData *smd = (TriangulateModifierData *) md;
82         TriangulateModifierData *tsmd = (TriangulateModifierData *) target;
83 #endif
84         modifier_copyData_generic(md, target);
85 }
86
87 static DerivedMesh *applyModifier(ModifierData *md,
88                                   const ModifierEvalContext *UNUSED(ctx),
89                                   DerivedMesh *dm)
90 {
91         TriangulateModifierData *tmd = (TriangulateModifierData *)md;
92         DerivedMesh *result;
93         if (!(result = triangulate_dm(dm, tmd->quad_method, tmd->ngon_method))) {
94                 return dm;
95         }
96
97         return result;
98 }
99
100 ModifierTypeInfo modifierType_Triangulate = {
101         /* name */              "Triangulate",
102         /* structName */        "TriangulateModifierData",
103         /* structSize */        sizeof(TriangulateModifierData),
104         /* type */              eModifierTypeType_Constructive,
105         /* flags */             eModifierTypeFlag_AcceptsMesh |
106                                 eModifierTypeFlag_SupportsEditmode |
107                                 eModifierTypeFlag_SupportsMapping |
108                                 eModifierTypeFlag_EnableInEditmode |
109                                 eModifierTypeFlag_AcceptsCVs,
110
111         /* copyData */          copyData,
112
113         /* deformVerts_DM */    NULL,
114         /* deformMatrices_DM */ NULL,
115         /* deformVertsEM_DM */  NULL,
116         /* deformMatricesEM_DM*/NULL,
117         /* applyModifier_DM */  applyModifier,
118         /* applyModifierEM_DM */NULL,
119
120         /* deformVerts */       NULL,
121         /* deformMatrices */    NULL,
122         /* deformVertsEM */     NULL,
123         /* deformMatricesEM */  NULL,
124         /* applyModifier */     NULL,
125         /* applyModifierEM */   NULL,
126
127         /* initData */          initData,
128         /* requiredDataMask */  NULL, //requiredDataMask,
129         /* freeData */          NULL,
130         /* isDisabled */        NULL,
131         /* updateDepsgraph */   NULL,
132         /* dependsOnTime */     NULL,
133         /* dependsOnNormals */  NULL,
134         /* foreachObjectLink */ NULL,
135         /* foreachIDLink */     NULL,
136 };