Gizmo: avoid redundant value2d updates
This commit is contained in:
@@ -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);
|
||||
}
|
||||
inter->prev.prop_value = value_final;
|
||||
}
|
||||
|
||||
{
|
||||
ScrArea *sa = CTX_wm_area(C);
|
||||
char str[64];
|
||||
SNPRINTF(str, "%.4f", value_final);
|
||||
ED_area_status_text(sa, str);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user