forked from bartvdbraak/blender
fix [#28225] Solidify Modifier creates wrong results when vertex group is attached
infact this is not really a bug, irrespective zero vertex group weights gave overlapping geometry which isn't useful, add an option to set the thickness factor for zero weighted verts.
This commit is contained in:
parent
5e968e36c5
commit
0b23d378fb
@ -73,7 +73,7 @@ class DATA_PT_context_mesh(MeshButtonsPanel, Panel):
|
|||||||
ob = context.object
|
ob = context.object
|
||||||
mesh = context.mesh
|
mesh = context.mesh
|
||||||
space = context.space_data
|
space = context.space_data
|
||||||
|
layout.prop(context.scene.tool_settings, "mesh_select_mode", index=0, text="Vertex")
|
||||||
if ob:
|
if ob:
|
||||||
layout.template_ID(ob, "data")
|
layout.template_ID(ob, "data")
|
||||||
elif mesh:
|
elif mesh:
|
||||||
|
@ -577,13 +577,13 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
|
|||||||
sub = col.column()
|
sub = col.column()
|
||||||
sub.active = bool(md.vertex_group)
|
sub.active = bool(md.vertex_group)
|
||||||
sub.prop(md, "invert_vertex_group", text="Invert")
|
sub.prop(md, "invert_vertex_group", text="Invert")
|
||||||
|
sub.prop(md, "thickness_vertex_group", text="Factor")
|
||||||
|
|
||||||
col.prop(md, "use_even_offset")
|
col.prop(md, "use_even_offset")
|
||||||
col.prop(md, "use_quality_normals")
|
col.prop(md, "use_quality_normals")
|
||||||
col.prop(md, "use_rim")
|
col.prop(md, "use_rim")
|
||||||
|
|
||||||
sub = col.column()
|
sub = col.column()
|
||||||
sub.label()
|
|
||||||
row = sub.split(align=True, percentage=0.4)
|
row = sub.split(align=True, percentage=0.4)
|
||||||
row.prop(md, "material_offset", text="")
|
row.prop(md, "material_offset", text="")
|
||||||
row = row.row()
|
row = row.row()
|
||||||
|
@ -712,16 +712,16 @@ typedef struct ShapeKeyModifierData {
|
|||||||
typedef struct SolidifyModifierData {
|
typedef struct SolidifyModifierData {
|
||||||
ModifierData modifier;
|
ModifierData modifier;
|
||||||
|
|
||||||
char defgrp_name[32]; /* name of vertex group to use */
|
char defgrp_name[32]; /* name of vertex group to use */
|
||||||
float offset; /* new surface offset level*/
|
float offset; /* new surface offset level*/
|
||||||
float offset_fac; /* midpoint of the offset */
|
float offset_fac; /* midpoint of the offset */
|
||||||
|
float offset_fac_vg; /* factor for the minimum weight to use when vgroups are used, avoids 0.0 weights giving duplicate geometry */
|
||||||
float crease_inner;
|
float crease_inner;
|
||||||
float crease_outer;
|
float crease_outer;
|
||||||
float crease_rim;
|
float crease_rim;
|
||||||
int flag;
|
int flag;
|
||||||
short mat_ofs;
|
short mat_ofs;
|
||||||
short mat_ofs_rim;
|
short mat_ofs_rim;
|
||||||
int pad;
|
|
||||||
} SolidifyModifierData;
|
} SolidifyModifierData;
|
||||||
|
|
||||||
#define MOD_SOLIDIFY_RIM (1<<0)
|
#define MOD_SOLIDIFY_RIM (1<<0)
|
||||||
|
@ -2265,6 +2265,13 @@ static void rna_def_modifier_solidify(BlenderRNA *brna)
|
|||||||
RNA_def_property_ui_text(prop, "Thickness", "Thickness of the shell");
|
RNA_def_property_ui_text(prop, "Thickness", "Thickness of the shell");
|
||||||
RNA_def_property_update(prop, 0, "rna_Modifier_update");
|
RNA_def_property_update(prop, 0, "rna_Modifier_update");
|
||||||
|
|
||||||
|
prop= RNA_def_property(srna, "thickness_vertex_group", PROP_FLOAT, PROP_FACTOR);
|
||||||
|
RNA_def_property_float_sdna(prop, NULL, "offset_fac_vg");
|
||||||
|
RNA_def_property_range(prop, 0.0, 1.0);
|
||||||
|
RNA_def_property_ui_range(prop, 0, 1, 0.1, 3);
|
||||||
|
RNA_def_property_ui_text(prop, "Vertex Group Factor", "Thickness factor to use for zero vertex group influence");
|
||||||
|
RNA_def_property_update(prop, 0, "rna_Modifier_update");
|
||||||
|
|
||||||
prop= RNA_def_property(srna, "offset", PROP_FLOAT, PROP_FACTOR);
|
prop= RNA_def_property(srna, "offset", PROP_FLOAT, PROP_FACTOR);
|
||||||
RNA_def_property_float_sdna(prop, NULL, "offset_fac");
|
RNA_def_property_float_sdna(prop, NULL, "offset_fac");
|
||||||
RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
|
RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
|
||||||
|
@ -232,8 +232,10 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
|
|||||||
|
|
||||||
float (*vert_nors)[3]= NULL;
|
float (*vert_nors)[3]= NULL;
|
||||||
|
|
||||||
float const ofs_orig= - (((-smd->offset_fac + 1.0f) * 0.5f) * smd->offset);
|
const float ofs_orig= - (((-smd->offset_fac + 1.0f) * 0.5f) * smd->offset);
|
||||||
float const ofs_new= smd->offset - (((-smd->offset_fac + 1.0f) * 0.5f) * smd->offset);
|
const float ofs_new= smd->offset - (((-smd->offset_fac + 1.0f) * 0.5f) * smd->offset);
|
||||||
|
const float offset_fac_vg= smd->offset_fac_vg;
|
||||||
|
const float offset_fac_vg_inv= 1.0f - smd->offset_fac_vg;
|
||||||
|
|
||||||
/* weights */
|
/* weights */
|
||||||
MDeformVert *dvert, *dv= NULL;
|
MDeformVert *dvert, *dv= NULL;
|
||||||
@ -391,8 +393,9 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
|
|||||||
dv= dvert;
|
dv= dvert;
|
||||||
for(i=0; i<numVerts; i++, mv++) {
|
for(i=0; i<numVerts; i++, mv++) {
|
||||||
if(dv) {
|
if(dv) {
|
||||||
if(defgrp_invert) scalar_short_vgroup = scalar_short * (1.0f - defvert_find_weight(dv, defgrp_index));
|
if(defgrp_invert) scalar_short_vgroup = 1.0f - defvert_find_weight(dv, defgrp_index);
|
||||||
else scalar_short_vgroup = scalar_short * defvert_find_weight(dv, defgrp_index);
|
else scalar_short_vgroup = defvert_find_weight(dv, defgrp_index);
|
||||||
|
scalar_short_vgroup= (offset_fac_vg + (scalar_short_vgroup * offset_fac_vg_inv)) * scalar_short;
|
||||||
dv++;
|
dv++;
|
||||||
}
|
}
|
||||||
VECADDFAC(mv->co, mv->co, mv->no, scalar_short_vgroup);
|
VECADDFAC(mv->co, mv->co, mv->no, scalar_short_vgroup);
|
||||||
@ -405,8 +408,9 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
|
|||||||
dv= dvert;
|
dv= dvert;
|
||||||
for(i=0; i<numVerts; i++, mv++) {
|
for(i=0; i<numVerts; i++, mv++) {
|
||||||
if(dv) {
|
if(dv) {
|
||||||
if(defgrp_invert) scalar_short_vgroup = scalar_short * (1.0f - defvert_find_weight(dv, defgrp_index));
|
if(defgrp_invert) scalar_short_vgroup = 1.0f - defvert_find_weight(dv, defgrp_index);
|
||||||
else scalar_short_vgroup = scalar_short * defvert_find_weight(dv, defgrp_index);
|
else scalar_short_vgroup = defvert_find_weight(dv, defgrp_index);
|
||||||
|
scalar_short_vgroup= (offset_fac_vg + (scalar_short_vgroup * offset_fac_vg_inv)) * scalar_short;
|
||||||
dv++;
|
dv++;
|
||||||
}
|
}
|
||||||
VECADDFAC(mv->co, mv->co, mv->no, scalar_short_vgroup);
|
VECADDFAC(mv->co, mv->co, mv->no, scalar_short_vgroup);
|
||||||
@ -466,15 +470,21 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
|
|||||||
|
|
||||||
/* vertex group support */
|
/* vertex group support */
|
||||||
if(dvert) {
|
if(dvert) {
|
||||||
|
float scalar;
|
||||||
|
|
||||||
dv= dvert;
|
dv= dvert;
|
||||||
if(defgrp_invert) {
|
if(defgrp_invert) {
|
||||||
for(i=0; i<numVerts; i++, dv++) {
|
for(i=0; i<numVerts; i++, dv++) {
|
||||||
vert_angles[i] *= (1.0f - defvert_find_weight(dv, defgrp_index));
|
scalar= 1.0f - defvert_find_weight(dv, defgrp_index);
|
||||||
|
scalar= offset_fac_vg + (scalar * offset_fac_vg_inv);
|
||||||
|
vert_angles[i] *= scalar;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for(i=0; i<numVerts; i++, dv++) {
|
for(i=0; i<numVerts; i++, dv++) {
|
||||||
vert_angles[i] *= defvert_find_weight(dv, defgrp_index);
|
scalar= defvert_find_weight(dv, defgrp_index);
|
||||||
|
scalar= offset_fac_vg + (scalar * offset_fac_vg_inv);
|
||||||
|
vert_angles[i] *= scalar;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user