Merge branch 'master' into blender2.8
[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 static DerivedMesh *applyModifier(ModifierData *md,
78                                   const ModifierEvalContext *UNUSED(ctx),
79                                   DerivedMesh *dm)
80 {
81         TriangulateModifierData *tmd = (TriangulateModifierData *)md;
82         DerivedMesh *result;
83         if (!(result = triangulate_dm(dm, tmd->quad_method, tmd->ngon_method))) {
84                 return dm;
85         }
86
87         return result;
88 }
89
90 ModifierTypeInfo modifierType_Triangulate = {
91         /* name */              "Triangulate",
92         /* structName */        "TriangulateModifierData",
93         /* structSize */        sizeof(TriangulateModifierData),
94         /* type */              eModifierTypeType_Constructive,
95         /* flags */             eModifierTypeFlag_AcceptsMesh |
96                                 eModifierTypeFlag_SupportsEditmode |
97                                 eModifierTypeFlag_SupportsMapping |
98                                 eModifierTypeFlag_EnableInEditmode |
99                                 eModifierTypeFlag_AcceptsCVs,
100
101         /* copyData */          modifier_copyData_generic,
102
103         /* deformVerts_DM */    NULL,
104         /* deformMatrices_DM */ NULL,
105         /* deformVertsEM_DM */  NULL,
106         /* deformMatricesEM_DM*/NULL,
107         /* applyModifier_DM */  applyModifier,
108         /* applyModifierEM_DM */NULL,
109
110         /* deformVerts */       NULL,
111         /* deformMatrices */    NULL,
112         /* deformVertsEM */     NULL,
113         /* deformMatricesEM */  NULL,
114         /* applyModifier */     NULL,
115         /* applyModifierEM */   NULL,
116
117         /* initData */          initData,
118         /* requiredDataMask */  NULL, //requiredDataMask,
119         /* freeData */          NULL,
120         /* isDisabled */        NULL,
121         /* updateDepsgraph */   NULL,
122         /* dependsOnTime */     NULL,
123         /* dependsOnNormals */  NULL,
124         /* foreachObjectLink */ NULL,
125         /* foreachIDLink */     NULL,
126 };