remove LOD_Decimator (c++ decimator), now replaced by bmesh decimator. also remove...
[blender.git] / source / blender / modifiers / intern / MOD_decimate.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  * The Original Code is Copyright (C) 2005 by the Blender Foundation.
19  * All rights reserved.
20  *
21  * Contributor(s): Daniel Dunbar
22  *                 Ton Roosendaal,
23  *                 Ben Batt,
24  *                 Brecht Van Lommel,
25  *                 Campbell Barton
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  *
29  */
30
31 /** \file blender/modifiers/intern/MOD_decimate.c
32  *  \ingroup modifiers
33  */
34
35 #include "DNA_meshdata_types.h"
36
37 #include "BLI_math.h"
38 #include "BLI_utildefines.h"
39
40 #include "BLF_translation.h"
41
42 #include "MEM_guardedalloc.h"
43
44 #include "BKE_mesh.h"
45 #include "BKE_modifier.h"
46 #include "BKE_particle.h"
47 #include "BKE_cdderivedmesh.h"
48
49 #include "BKE_tessmesh.h"
50 #include "bmesh.h"
51
52 #ifdef USE_TIMEIT
53 #  include "PIL_time.h"
54 #endif
55
56 #include "MOD_util.h"
57
58 static void initData(ModifierData *md)
59 {
60         DecimateModifierData *dmd = (DecimateModifierData *) md;
61
62         dmd->percent = 1.0;
63 }
64
65 static void copyData(ModifierData *md, ModifierData *target)
66 {
67         DecimateModifierData *dmd = (DecimateModifierData *) md;
68         DecimateModifierData *tdmd = (DecimateModifierData *) target;
69
70         tdmd->percent = dmd->percent;
71 }
72
73 static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob),
74                                   DerivedMesh *derivedData,
75                                   ModifierApplyFlag UNUSED(flag))
76 {
77         DecimateModifierData *dmd = (DecimateModifierData *) md;
78         DerivedMesh *dm = derivedData, *result = NULL;
79         BMEditMesh *em;
80         BMesh *bm;
81
82 #ifdef USE_TIMEIT
83          TIMEIT_START(decim);
84 #endif
85
86         if (dmd->percent == 1.0f) {
87                 return dm;
88         }
89         else if (dm->getNumPolys(dm) <= 3) {
90                 modifier_setError(md, "%s", TIP_("Modifier requires more than 3 input faces"));
91                 return dm;
92         }
93
94         em = DM_to_editbmesh(dm, NULL, FALSE);
95         bm = em->bm;
96
97         BM_mesh_decimate(bm, dmd->percent);
98
99         dmd->faceCount = bm->totface;
100
101         BLI_assert(em->looptris == NULL);
102         result = CDDM_from_BMEditMesh(em, NULL, TRUE, FALSE);
103         BMEdit_Free(em);
104         MEM_freeN(em);
105
106 #ifdef USE_TIMEIT
107          TIMEIT_END(decim);
108 #endif
109
110         return result;
111 }
112
113 ModifierTypeInfo modifierType_Decimate = {
114         /* name */              "Decimate",
115         /* structName */        "DecimateModifierData",
116         /* structSize */        sizeof(DecimateModifierData),
117         /* type */              eModifierTypeType_Nonconstructive,
118         /* flags */             eModifierTypeFlag_AcceptsMesh,
119         /* copyData */          copyData,
120         /* deformVerts */       NULL,
121         /* deformMatrices */    NULL,
122         /* deformVertsEM */     NULL,
123         /* deformMatricesEM */  NULL,
124         /* applyModifier */     applyModifier,
125         /* applyModifierEM */   NULL,
126         /* initData */          initData,
127         /* requiredDataMask */  NULL,
128         /* freeData */          NULL,
129         /* isDisabled */        NULL,
130         /* updateDepgraph */    NULL,
131         /* dependsOnTime */     NULL,
132         /* dependsOnNormals */  NULL,
133         /* foreachObjectLink */ NULL,
134         /* foreachIDLink */     NULL,
135         /* foreachTexLink */    NULL,
136 };