[Bf-blender-cvs] [4e73fe8] temp-modifier-deltamush-experimental: minor cleanup, comments
Campbell Barton
noreply at git.blender.org
Mon Mar 30 15:26:14 CEST 2015
Commit: 4e73fe80c5f1c300fca6468395063569171bd01e
Author: Campbell Barton
Date: Mon Mar 30 23:28:35 2015 +1100
Branches: temp-modifier-deltamush-experimental
https://developer.blender.org/rB4e73fe80c5f1c300fca6468395063569171bd01e
minor cleanup, comments
Make UI follow laplacian deform
===================================================================
M release/scripts/startup/bl_ui/properties_data_modifier.py
M source/blender/makesrna/intern/rna_modifier.c
M source/blender/modifiers/intern/MOD_deltamush.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index f0fb349..9c02c5b 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -1388,17 +1388,22 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
def DELTAMUSH(self, layout, ob, md):
is_bind = md.is_bind
- layout.operator("object.deltamush_bind", text="Unbind" if is_bind else "Bind")
- layout.prop(md, "use_only_smooth");
- layout.prop(md, "use_pin_boundary");
- layout.label(text="Smoothing Details")
+
layout.prop(md, "iterations")
layout.prop(md, "lambda_factor", text="Factor")
+
+ layout.label(text="Smoothing Details")
+ row = layout.row()
+ row.prop(md, "use_only_smooth");
+ row.prop(md, "use_pin_boundary");
+
layout.label(text="Vertex Group:")
sub = layout.row(align=True)
sub.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
sub.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
+ layout.operator("object.deltamush_bind", text="Unbind" if is_bind else "Bind")
+
if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 4b61916..4570a32 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -2157,7 +2157,7 @@ static void rna_def_modifier_deltamush(BlenderRNA *brna)
prop = RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "defgrp_name");
RNA_def_property_ui_text(prop, "Vertex Group",
- "Name of Vertex Group which determines influence of modifier per point");
+ "Name of Vertex Group which determines influence of modifier per point");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_DeltaMushModifier_defgrp_name_set");
RNA_def_property_update(prop, 0, "rna_DeltaMushModifier_update");
@@ -2169,8 +2169,8 @@ static void rna_def_modifier_deltamush(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_only_smooth", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_DELTAMUSH_ONLY_SMOOTH);
- RNA_def_property_ui_text(prop, "Display Smoothing Only",
- "Display the effects of smoothing without reconstructing the surface");
+ RNA_def_property_ui_text(prop, "Only Smooth",
+ "Apply smoothing without reconstructing the surface");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop = RNA_def_property(srna, "use_pin_boundary", PROP_BOOLEAN, PROP_NONE);
diff --git a/source/blender/modifiers/intern/MOD_deltamush.c b/source/blender/modifiers/intern/MOD_deltamush.c
index e831881..c511a66 100644
--- a/source/blender/modifiers/intern/MOD_deltamush.c
+++ b/source/blender/modifiers/intern/MOD_deltamush.c
@@ -178,14 +178,6 @@ static void dm_get_boundaries(DerivedMesh *dm, float *smooth_weights)
MEM_freeN(boundaries);
}
-
-typedef struct SmoothingData {
- float delta[3];
-#if (SMOOTH_METHOD == SMOOTH_METHOD_SQUAREDLENGTH) || (SMOOTH_METHOD == SMOOTH_METHOD_LOOPWEIGHT)
- float edge_lengths;
-#endif
-} SmoothingData;
-
/**
* \note This is called many times.
* take care when editing this function since minor changes may impact speed.
@@ -199,7 +191,12 @@ static void smooth_iter(
const float lambda = dmmd->lambda;
unsigned int i;
- SmoothingData *smooth_data = MEM_callocN((size_t)numVerts * sizeof(SmoothingData), "delta mush smoothing data");
+ struct SmoothingData {
+ float delta[3];
+#if (SMOOTH_METHOD == SMOOTH_METHOD_SQUAREDLENGTH) || (SMOOTH_METHOD == SMOOTH_METHOD_LOOPWEIGHT)
+ float edge_lengths;
+#endif
+ } *smooth_data = MEM_callocN((size_t)numVerts * sizeof(*smooth_data), __func__);
#if (SMOOTH_METHOD == SMOOTH_METHOD_SIMPLE)
@@ -225,8 +222,8 @@ static void smooth_iter(
while (iterations--) {
for (i = 0; i < numEdges; i++) {
- SmoothingData *sd_v1;
- SmoothingData *sd_v2;
+ struct SmoothingData *sd_v1;
+ struct SmoothingData *sd_v2;
float edge_dir[3];
float co1[3];
float co2[3];
@@ -246,7 +243,7 @@ static void smooth_iter(
if (smooth_weights == NULL) {
/* fast-path */
for (i = 0; i < numVerts; i++) {
- SmoothingData *sd = &smooth_data[i];
+ struct SmoothingData *sd = &smooth_data[i];
mul_v3_v3fl(vertexCos[i], sd->delta, vertex_edge_count_div[i]);
/* zero for the next iteration (saves memset on entire array) */
memset(sd, 0, sizeof(*sd));
@@ -255,16 +252,11 @@ static void smooth_iter(
else {
for (i = 0; i < numVerts; i++) {
- SmoothingData *sd = &smooth_data[i];
-
- float lambda_alt = 1.0;
-
- if (smooth_weights) {
- lambda_alt *= smooth_weights[i];
- }
+ struct SmoothingData *sd = &smooth_data[i];
+ float lambda_w = lambda * smooth_weights[i];
mul_v3_fl(sd->delta, vertex_edge_count_div[i]);
- interp_v3_v3v3(vertexCos[i], vertexCos[i], sd->delta, lambda_alt);
+ interp_v3_v3v3(vertexCos[i], vertexCos[i], sd->delta, lambda_w);
memset(sd, 0, sizeof(*sd));
}
@@ -282,7 +274,6 @@ static void smooth_iter(
float *vertex_edge_count;
-
/* calculate as floats to avoid int->float conversion in #smooth_iter */
vertex_edge_count = MEM_callocN((size_t)numVerts * sizeof(float), __func__);
for (i = 0; i < numEdges; i++) {
@@ -296,13 +287,15 @@ static void smooth_iter(
while (iterations--) {
for (i = 0; i < numEdges; i++) {
- SmoothingData *sd_v1;
- SmoothingData *sd_v2;
+ struct SmoothingData *sd_v1;
+ struct SmoothingData *sd_v2;
float edge_dir[3];
float edge_dist;
sub_v3_v3v3(edge_dir, vertexCos[edges[i].v2], vertexCos[edges[i].v1]);
edge_dist = len_v3(edge_dir);
+
+ /* weight by distance */
mul_v3_fl(edge_dir, edge_dist);
@@ -319,10 +312,19 @@ static void smooth_iter(
if (smooth_weights == NULL) {
/* fast-path */
for (i = 0; i < numVerts; i++) {
- SmoothingData *sd = &smooth_data[i];
- float div = sd->edge_lengths * vertex_edge_count[i];
+ struct SmoothingData *sd = &smooth_data[i];
+ /* divide by sum of all neighbour distances (weighted) and amount of neighbours, (mean average) */
+ const float div = sd->edge_lengths * vertex_edge_count[i];
if (div > eps) {
+#if 0
+ /* first calculate the new location */
+ mul_v3_fl(sd->delta, 1.0f / div);
+ /* then interpolate */
+ madd_v3_v3fl(vertexCos[i], sd->delta, lambda);
+#else
+ /* do this in one step */
madd_v3_v3fl(vertexCos[i], sd->delta, lambda / div);
+#endif
}
/* zero for the next iteration (saves memset on entire array) */
memset(sd, 0, sizeof(*sd));
@@ -330,17 +332,11 @@ static void smooth_iter(
}
else {
for (i = 0; i < numVerts; i++) {
- SmoothingData *sd = &smooth_data[i];
- float div = sd->edge_lengths * vertex_edge_count[i];
-
+ struct SmoothingData *sd = &smooth_data[i];
+ const float div = sd->edge_lengths * vertex_edge_count[i];
if (div > eps) {
- float lambda_alt = lambda;
-
- if (smooth_weights) {
- lambda_alt *= smooth_weights[i];
- }
-
- madd_v3_v3fl(vertexCos[i], sd->delta, lambda_alt / div);
+ const float lambda_w = lambda * smooth_weights[i];
+ madd_v3_v3fl(vertexCos[i], sd->delta, lambda_w / div);
}
memset(sd, 0, sizeof(*sd));
@@ -378,7 +374,7 @@ static void smooth_iter(
const float *co_curr = vertexCos[v_curr];
const float *co_next = vertexCos[v_next];
float angle = angle_v3v3v3(co_prev, co_curr, co_next);
- SmoothingData *sd = &smooth_data[v_curr];
+ struct SmoothingData *sd = &smooth_data[v_curr];
float co_mid[3];
mid_v3_v3v3(co_mid, co_prev, co_next);
@@ -391,7 +387,7 @@ static void smooth_iter(
if (smooth_weights == NULL) {
/* fast-path */
for (i = 0; i < numVerts; i++) {
- SmoothingData *sd = &smooth_data[i];
+ struct SmoothingData *sd = &smooth_data[i];
if (sd->edge_lengths > eps) {
mul_v3_fl(sd->delta, 1.0f / sd->edge_lengths);
interp_v3_v3v3(vertexCos[i], vertexCos[i], sd->delta, lambda);
@@ -406,14 +402,9 @@ static void smooth_iter(
SmoothingData *sd = &smooth_data[i];
if (sd->edge_lengths > eps) {
- float lambda_alt = 1.0;
-
- if (smooth_weights) {
- lambda_alt *= smooth_weights[i];
- }
-
+ float lambda_w = smooth_weights[i];
mul_v3_fl(sd->delta, 1.0f / sd->edge_lengths);
- interp_v3_v3v3(vertexCos[i], vertexCos[i], sd->delta, lambda_alt);
+ interp_v3_v3v3(vertexCos[i], vertexCos[i], sd->delta, lambda_w);
}
memset(sd, 0, sizeof(*sd));
More information about the Bf-blender-cvs
mailing list