From 55c38c985002245331e3e2c192360e0e7152b108 Mon Sep 17 00:00:00 2001 From: Habib Gahbiche Date: Wed, 8 Jan 2025 12:14:31 +0100 Subject: [PATCH] Fix #127254: Compositor crop gizmo suggests there is a valid crop when there isn't one Prevent users from creating an invalid bounding box for cropping. The user input is checked and is overridden if it will invert the bounding box, i.e. `xmin > xmax` and `ymin > ymax` of gizmos is not allowed. Pull Request: https://projects.blender.org/blender/blender/pulls/128550 --- .../blender/makesrna/intern/rna_nodetree.cc | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/source/blender/makesrna/intern/rna_nodetree.cc b/source/blender/makesrna/intern/rna_nodetree.cc index cee5580c6ef..44893739f29 100644 --- a/source/blender/makesrna/intern/rna_nodetree.cc +++ b/source/blender/makesrna/intern/rna_nodetree.cc @@ -2381,6 +2381,70 @@ void rna_Node_update(Main *bmain, Scene * /*scene*/, PointerRNA *ptr) ED_node_tree_propagate_change(nullptr, bmain, ntree); } +static void rna_NodeCrop_min_x_set(PointerRNA *ptr, int value) +{ + bNode *node = static_cast(ptr->data); + NodeTwoXYs *data = static_cast(node->storage); + data->x1 = value; + CLAMP_MAX(data->x1, data->x2); +} + +static void rna_NodeCrop_max_x_set(PointerRNA *ptr, int value) +{ + bNode *node = static_cast(ptr->data); + NodeTwoXYs *data = static_cast(node->storage); + data->x2 = value; + CLAMP_MIN(data->x2, data->x1); +} + +static void rna_NodeCrop_min_y_set(PointerRNA *ptr, int value) +{ + bNode *node = static_cast(ptr->data); + NodeTwoXYs *data = static_cast(node->storage); + data->y1 = value; + CLAMP_MIN(data->y1, data->y2); +} + +static void rna_NodeCrop_max_y_set(PointerRNA *ptr, int value) +{ + bNode *node = static_cast(ptr->data); + NodeTwoXYs *data = static_cast(node->storage); + data->y2 = value; + CLAMP_MAX(data->y2, data->y1); +} + +static void rna_NodeCrop_rel_min_x_set(PointerRNA *ptr, float value) +{ + bNode *node = static_cast(ptr->data); + NodeTwoXYs *data = static_cast(node->storage); + data->fac_x1 = value; + CLAMP_MAX(data->fac_x1, data->fac_x2); +} + +static void rna_NodeCrop_rel_max_x_set(PointerRNA *ptr, float value) +{ + bNode *node = static_cast(ptr->data); + NodeTwoXYs *data = static_cast(node->storage); + data->fac_x2 = value; + CLAMP_MIN(data->fac_x2, data->fac_x1); +} + +static void rna_NodeCrop_rel_min_y_set(PointerRNA *ptr, float value) +{ + bNode *node = static_cast(ptr->data); + NodeTwoXYs *data = static_cast(node->storage); + data->fac_y1 = value; + CLAMP_MIN(data->fac_y1, data->fac_y2); +} + +static void rna_NodeCrop_rel_max_y_set(PointerRNA *ptr, float value) +{ + bNode *node = static_cast(ptr->data); + NodeTwoXYs *data = static_cast(node->storage); + data->fac_y2 = value; + CLAMP_MAX(data->fac_y2, data->fac_y1); +} + void rna_Node_update_relations(Main *bmain, Scene *scene, PointerRNA *ptr) { rna_Node_update(bmain, scene, ptr); @@ -7805,48 +7869,56 @@ static void def_cmp_crop(StructRNA *srna) prop = RNA_def_property(srna, "min_x", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, nullptr, "x1"); + RNA_def_property_int_funcs(prop, nullptr, "rna_NodeCrop_min_x_set", nullptr); RNA_def_property_range(prop, 0, 10000); RNA_def_property_ui_text(prop, "X1", ""); RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "max_x", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, nullptr, "x2"); + RNA_def_property_int_funcs(prop, nullptr, "rna_NodeCrop_max_x_set", nullptr); RNA_def_property_range(prop, 0, 10000); RNA_def_property_ui_text(prop, "X2", ""); RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "min_y", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, nullptr, "y1"); + RNA_def_property_int_funcs(prop, nullptr, "rna_NodeCrop_min_y_set", nullptr); RNA_def_property_range(prop, 0, 10000); RNA_def_property_ui_text(prop, "Y1", ""); RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "max_y", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, nullptr, "y2"); + RNA_def_property_int_funcs(prop, nullptr, "rna_NodeCrop_max_y_set", nullptr); RNA_def_property_range(prop, 0, 10000); RNA_def_property_ui_text(prop, "Y2", ""); RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "rel_min_x", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, nullptr, "fac_x1"); + RNA_def_property_float_funcs(prop, nullptr, "rna_NodeCrop_rel_min_x_set", nullptr); RNA_def_property_range(prop, 0.0, 1.0); RNA_def_property_ui_text(prop, "X1", ""); RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "rel_max_x", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, nullptr, "fac_x2"); + RNA_def_property_float_funcs(prop, nullptr, "rna_NodeCrop_rel_max_x_set", nullptr); RNA_def_property_range(prop, 0.0, 1.0); RNA_def_property_ui_text(prop, "X2", ""); RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "rel_min_y", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, nullptr, "fac_y1"); + RNA_def_property_float_funcs(prop, nullptr, "rna_NodeCrop_rel_min_y_set", nullptr); RNA_def_property_range(prop, 0.0, 1.0); RNA_def_property_ui_text(prop, "Y1", ""); RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); prop = RNA_def_property(srna, "rel_max_y", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, nullptr, "fac_y2"); + RNA_def_property_float_funcs(prop, nullptr, "rna_NodeCrop_rel_max_y_set", nullptr); RNA_def_property_range(prop, 0.0, 1.0); RNA_def_property_ui_text(prop, "Y2", ""); RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");