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-23 08:26:39 +0400
committerCampbell Barton <ideasman42@gmail.com>2012-10-23 08:26:39 +0400
commit0636886715b4c5ac56ed7f903bf37a00cfbdc841 (patch)
tree715a71459a6682f623be69b9b7d7ea52911e3be9 /source/blender/modifiers
parented4b2d97385eb8ab6d052ea6c83e5d62f62776e6 (diff)
add un-subdivude as an optional method for the decimate modifier, gives more even geometry & nicer results in some cases.
Diffstat (limited to 'source/blender/modifiers')
-rw-r--r--source/blender/modifiers/intern/MOD_decimate.c48
1 files changed, 30 insertions, 18 deletions
diff --git a/source/blender/modifiers/intern/MOD_decimate.c b/source/blender/modifiers/intern/MOD_decimate.c
index 1cb6853447a..6eb2f8d6c79 100644
--- a/source/blender/modifiers/intern/MOD_decimate.c
+++ b/source/blender/modifiers/intern/MOD_decimate.c
@@ -72,8 +72,10 @@ static void copyData(ModifierData *md, ModifierData *target)
DecimateModifierData *tdmd = (DecimateModifierData *) target;
tdmd->percent = dmd->percent;
+ tdmd->iter = dmd->iter;
BLI_strncpy(tdmd->defgrp_name, dmd->defgrp_name, sizeof(tdmd->defgrp_name));
tdmd->flag = dmd->flag;
+ tdmd->mode = dmd->mode;
}
static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
@@ -110,42 +112,52 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
return dm;
}
- if (dmd->defgrp_name[0]) {
- MDeformVert *dvert;
- int defgrp_index;
+ if (dmd->mode == MOD_DECIM_MODE_COLLAPSE) {
+ if (dmd->defgrp_name[0]) {
+ MDeformVert *dvert;
+ int defgrp_index;
- modifier_get_vgroup(ob, dm, dmd->defgrp_name, &dvert, &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;
+ if (dvert) {
+ const unsigned int vert_tot = dm->getNumVerts(dm);
+ unsigned int i;
- vweights = MEM_mallocN(vert_tot * sizeof(float), __func__);
+ 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);
+ if (dmd->flag & MOD_DECIM_FLAG_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);
+ 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_collapse(bm, dmd->percent, vweights);
+ switch (dmd->mode) {
+ case MOD_DECIM_MODE_COLLAPSE:
+ BM_mesh_decimate_collapse(bm, dmd->percent, vweights);
+ break;
+ case MOD_DECIM_MODE_UNSUBDIV:
+ BM_mesh_decimate_unsubdivide(bm, dmd->iter);
+ break;
+ }
+
if (vweights) {
MEM_freeN(vweights);
}
- dmd->faceCount = bm->totface;
+ /* update for display only */
+ dmd->face_count = bm->totface;
BLI_assert(em->looptris == NULL);
result = CDDM_from_BMEditMesh(em, NULL, TRUE, FALSE);