Mesh Modifiers: refactor copying using a generic function
[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 #include "BKE_editmesh.h"
35
36 #include "bmesh.h"
37 #include "bmesh_tools.h"
38
39 static DerivedMesh *triangulate_dm(DerivedMesh *dm, const int quad_method, const int ngon_method)
40 {
41         DerivedMesh *result;
42         BMesh *bm;
43         int total_edges, i;
44         MEdge *me;
45
46         bm = DM_to_bmesh(dm, true);
47
48         BM_mesh_triangulate(bm, quad_method, ngon_method, false, NULL, NULL);
49
50         result = CDDM_from_bmesh(bm, FALSE);
51         BM_mesh_free(bm);
52
53         total_edges = result->getNumEdges(result);
54         me = CDDM_get_edges(result);
55
56         /* force drawing of all edges (seems to be omitted in CDDM_from_bmesh) */
57         for (i = 0; i < total_edges; i++, me++)
58                 me->flag |= ME_EDGEDRAW | ME_EDGERENDER;
59
60         result->dirty |= DM_DIRTY_NORMALS;
61
62         return result;
63 }
64
65
66 static void initData(ModifierData *md)
67 {
68         TriangulateModifierData *tmd = (TriangulateModifierData *)md;
69
70         /* Enable in editmode by default */
71         md->mode |= eModifierMode_Editmode;
72         tmd->quad_method = MOD_TRIANGULATE_QUAD_SHORTEDGE;
73         tmd->ngon_method = MOD_TRIANGULATE_NGON_BEAUTY;
74 }
75
76
77 static void copyData(ModifierData *md, ModifierData *target)
78 {
79 #if 0
80         TriangulateModifierData *smd = (TriangulateModifierData *) md;
81         TriangulateModifierData *tsmd = (TriangulateModifierData *) target;
82 #endif
83         modifier_copyData_generic(md, target);
84 }
85
86 static DerivedMesh *applyModifier(ModifierData *md,
87                                   Object *UNUSED(ob),
88                                   DerivedMesh *dm,
89                                   ModifierApplyFlag UNUSED(flag))
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         /* deformVerts */       NULL,
113         /* deformMatrices */    NULL,
114         /* deformVertsEM */     NULL,
115         /* deformMatricesEM */  NULL,
116         /* applyModifier */     applyModifier,
117         /* applyModifierEM */   NULL,
118         /* initData */          initData,
119         /* requiredDataMask */  NULL, //requiredDataMask,
120         /* freeData */          NULL,
121         /* isDisabled */        NULL,
122         /* updateDepgraph */    NULL,
123         /* dependsOnTime */     NULL,
124         /* dependsOnNormals */  NULL,
125         /* foreachObjectLink */ NULL,
126         /* foreachIDLink */     NULL,
127 };