[Bf-blender-cvs] [80f083f993d] blender2.8: Gizmo: avoid redundant value2d updates

Campbell Barton noreply at git.blender.org
Thu Sep 13 14:14:41 CEST 2018


Commit: 80f083f993d4f62a7e9c35ab946e031ca70b09cd
Author: Campbell Barton
Date:   Thu Sep 13 22:25:15 2018 +1000
Branches: blender2.8
https://developer.blender.org/rB80f083f993d4f62a7e9c35ab946e031ca70b09cd

Gizmo: avoid redundant value2d updates

===================================================================

M	source/blender/editors/gizmo_library/gizmo_types/value2d_gizmo.c

===================================================================

diff --git a/source/blender/editors/gizmo_library/gizmo_types/value2d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/value2d_gizmo.c
index fd695eec2ba..c6090250db7 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/value2d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/value2d_gizmo.c
@@ -35,6 +35,7 @@
  * So we can use a single gizmo to make redoing an operator seem modal.
  */
 
+#include <float.h>
 #include <math.h>
 
 #include "MEM_guardedalloc.h"
@@ -58,8 +59,13 @@
  * \{ */
 
 typedef struct ValueInteraction {
-	float init_mval[2];
-	float init_prop_value;
+	struct {
+		float mval[2];
+		float prop_value;
+	} init;
+	struct {
+		float prop_value;
+	} prev;
 	float range[2];
 } ValueInteraction;
 
@@ -77,8 +83,8 @@ static int gizmo_value_modal(
 	const float value_scale = 4.0f;  /* Could be option. */
 	const float value_range = inter->range[1] - inter->range[0];
 	float value_delta = (
-	        inter->init_prop_value +
-	        (((event->mval[0] - inter->init_mval[0]) / ar->winx) * value_range)) * value_scale;
+	        inter->init.prop_value +
+	        (((event->mval[0] - inter->init.mval[0]) / ar->winx) * value_range)) * value_scale;
 
 
 	if (tweak_flag & WM_GIZMO_TWEAK_SNAP) {
@@ -87,21 +93,23 @@ static int gizmo_value_modal(
 	if (tweak_flag & WM_GIZMO_TWEAK_PRECISE) {
 		value_delta *= 0.1f;
 	}
-	const float value_final = inter->init_prop_value + value_delta;
+	const float value_final = inter->init.prop_value + value_delta;
 
-	/* set the property for the operator and call its modal function */
-	wmGizmoProperty *gz_prop = WM_gizmo_target_property_find(gz, "offset");
-	if (WM_gizmo_target_property_is_valid(gz_prop)) {
-		WM_gizmo_target_property_float_set(C, gz, gz_prop, value_final);
-	}
+	if (value_final != inter->prev.prop_value) {
+		/* set the property for the operator and call its modal function */
+		wmGizmoProperty *gz_prop = WM_gizmo_target_property_find(gz, "offset");
+		if (WM_gizmo_target_property_is_valid(gz_prop)) {
+			WM_gizmo_target_property_float_set(C, gz, gz_prop, value_final);
+		}
 
-	{
-		ScrArea *sa = CTX_wm_area(C);
-		char str[64];
-		SNPRINTF(str, "%.4f", value_final);
-		ED_area_status_text(sa, str);
+		{
+			ScrArea *sa = CTX_wm_area(C);
+			char str[64];
+			SNPRINTF(str, "%.4f", value_final);
+			ED_area_status_text(sa, str);
+		}
+		inter->prev.prop_value = value_final;
 	}
-
 	return OPERATOR_RUNNING_MODAL;
 }
 
@@ -111,12 +119,13 @@ static int gizmo_value_invoke(
 {
 	ValueInteraction *inter = MEM_callocN(sizeof(ValueInteraction), __func__);
 
-	inter->init_mval[0] = event->mval[0];
-	inter->init_mval[1] = event->mval[1];
+	inter->init.mval[0] = event->mval[0];
+	inter->init.mval[1] = event->mval[1];
+	inter->prev.prop_value = -FLT_MAX;
 
 	wmGizmoProperty *gz_prop = WM_gizmo_target_property_find(gz, "offset");
 	if (WM_gizmo_target_property_is_valid(gz_prop)) {
-		inter->init_prop_value = WM_gizmo_target_property_float_get(gz, gz_prop);
+		inter->init.prop_value = WM_gizmo_target_property_float_get(gz, gz_prop);
 		if (!WM_gizmo_target_property_float_range_get(gz, gz_prop, inter->range)) {
 			inter->range[0] = 0.0f;
 			inter->range[1] = 1.0f;
@@ -136,7 +145,7 @@ static void gizmo_value_exit(bContext *C, wmGizmo *gz, const bool cancel)
 		ValueInteraction *inter = gz->interaction_data;
 		wmGizmoProperty *gz_prop = WM_gizmo_target_property_find(gz, "offset");
 		if (WM_gizmo_target_property_is_valid(gz_prop)) {
-			WM_gizmo_target_property_float_set(C, gz, gz_prop, inter->init_prop_value);
+			WM_gizmo_target_property_float_set(C, gz, gz_prop, inter->init.prop_value);
 		}
 	}
 }



More information about the Bf-blender-cvs mailing list