[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