Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2012-10-22 19:39:06 +0400
committerCampbell Barton <ideasman42@gmail.com>2012-10-22 19:39:06 +0400
commit3526ae98055d28ac27f1e9b5d8b76d7597905e99 (patch)
treeed93bc8e349cc0306a494320c0efe14e66d69ec5 /source/blender/modifiers/intern/MOD_decimate.c
parent63f042250f22eb6a60604f04e0b6955124cd34b4 (diff)
add vertex group option to decimate modifier, handy if you want to pin some parts of the geometry.
Diffstat (limited to 'source/blender/modifiers/intern/MOD_decimate.c')
-rw-r--r--source/blender/modifiers/intern/MOD_decimate.c55
1 files changed, 51 insertions, 4 deletions
diff --git a/source/blender/modifiers/intern/MOD_decimate.c b/source/blender/modifiers/intern/MOD_decimate.c
index d55bc7ab9b1..a882e4f5854 100644
--- a/source/blender/modifiers/intern/MOD_decimate.c
+++ b/source/blender/modifiers/intern/MOD_decimate.c
@@ -32,9 +32,10 @@
* \ingroup modifiers
*/
-#include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
#include "BLI_math.h"
+#include "BLI_string.h"
#include "BLI_utildefines.h"
#include "BLF_translation.h"
@@ -43,6 +44,7 @@
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_deform.h"
#include "BKE_particle.h"
#include "BKE_cdderivedmesh.h"
@@ -70,9 +72,22 @@ static void copyData(ModifierData *md, ModifierData *target)
DecimateModifierData *tdmd = (DecimateModifierData *) target;
tdmd->percent = dmd->percent;
+ BLI_strncpy(tdmd->defgrp_name, dmd->defgrp_name, sizeof(tdmd->defgrp_name));
+ tdmd->flag = dmd->flag;
}
-static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob),
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
+{
+ DecimateModifierData *dmd = (DecimateModifierData *) md;
+ CustomDataMask dataMask = 0;
+
+ /* ask for vertexgroups if we need them */
+ if (dmd->defgrp_name[0]) dataMask |= CD_MASK_MDEFORMVERT;
+
+ return dataMask;
+}
+
+static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
DerivedMesh *derivedData,
ModifierApplyFlag UNUSED(flag))
{
@@ -81,6 +96,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob),
BMEditMesh *em;
BMesh *bm;
+ float *vweights = NULL;
+
#ifdef USE_TIMEIT
TIMEIT_START(decim);
#endif
@@ -93,10 +110,40 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob),
return dm;
}
+ if (dmd->defgrp_name[0]) {
+ MDeformVert *dvert;
+ int defgrp_index;
+
+ modifier_get_vgroup(ob, dm, dmd->defgrp_name, &dvert, &defgrp_index);
+
+ if (dvert) {
+ const unsigned int vert_tot = dm->getNumVerts(dm);
+ unsigned int i;
+
+ vweights = MEM_mallocN(vert_tot * sizeof(float), __func__);
+
+ if (dmd->flag & MOD_DECIM_INVERT_VGROUP) {
+ for (i = 0; i < vert_tot; i++) {
+ vweights[i] = 1.0f - defvert_find_weight(&dvert[i], defgrp_index);
+ }
+ }
+ else {
+ for (i = 0; i < vert_tot; i++) {
+ vweights[i] = defvert_find_weight(&dvert[i], defgrp_index);
+ }
+ }
+ }
+ }
+
+
em = DM_to_editbmesh(dm, NULL, FALSE);
bm = em->bm;
- BM_mesh_decimate(bm, dmd->percent);
+ BM_mesh_decimate(bm, dmd->percent, vweights);
+
+ if (vweights) {
+ MEM_freeN(vweights);
+ }
dmd->faceCount = bm->totface;
@@ -126,7 +173,7 @@ ModifierTypeInfo modifierType_Decimate = {
/* applyModifier */ applyModifier,
/* applyModifierEM */ NULL,
/* initData */ initData,
- /* requiredDataMask */ NULL,
+ /* requiredDataMask */ requiredDataMask,
/* freeData */ NULL,
/* isDisabled */ NULL,
/* updateDepgraph */ NULL,