diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-10-22 19:39:06 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-10-22 19:39:06 +0400 |
commit | 3526ae98055d28ac27f1e9b5d8b76d7597905e99 (patch) | |
tree | ed93bc8e349cc0306a494320c0efe14e66d69ec5 /source/blender/modifiers/intern | |
parent | 63f042250f22eb6a60604f04e0b6955124cd34b4 (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')
-rw-r--r-- | source/blender/modifiers/intern/MOD_decimate.c | 55 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_util.h | 12 |
2 files changed, 59 insertions, 8 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, diff --git a/source/blender/modifiers/intern/MOD_util.h b/source/blender/modifiers/intern/MOD_util.h index eadf7af553b..6f05c9a957a 100644 --- a/source/blender/modifiers/intern/MOD_util.h +++ b/source/blender/modifiers/intern/MOD_util.h @@ -42,10 +42,14 @@ struct TexResult; void modifier_init_texture(struct Scene *scene, struct Tex *texture); void get_texture_value(struct Tex *texture, float *tex_co, struct TexResult *texres); -void get_texture_coords(struct MappingInfoModifierData *dmd, struct Object *ob, struct DerivedMesh *dm, float (*co)[3], float (*texco)[3], int numVerts); +void get_texture_coords(struct MappingInfoModifierData *dmd, struct Object *ob, struct DerivedMesh *dm, + float (*co)[3], float (*texco)[3], int numVerts); void modifier_vgroup_cache(struct ModifierData *md, float (*vertexCos)[3]); -struct DerivedMesh *get_cddm(struct Object *ob, struct BMEditMesh *em, struct DerivedMesh *dm, float (*vertexCos)[3]); -struct DerivedMesh *get_dm(struct Object *ob, struct BMEditMesh *em, struct DerivedMesh *dm, float (*vertexCos)[3], int orco); -void modifier_get_vgroup(struct Object *ob, struct DerivedMesh *dm, const char *name, struct MDeformVert **dvert, int *defgrp_index); +struct DerivedMesh *get_cddm(struct Object *ob, struct BMEditMesh *em, struct DerivedMesh *dm, + float (*vertexCos)[3]); +struct DerivedMesh *get_dm(struct Object *ob, struct BMEditMesh *em, struct DerivedMesh *dm, + float (*vertexCos)[3], int orco); +void modifier_get_vgroup(struct Object *ob, struct DerivedMesh *dm, + const char *name, struct MDeformVert **dvert, int *defgrp_index); #endif /* __MOD_UTIL_H__ */ |