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
This commit is contained in:
Habib Gahbiche
2025-01-08 12:14:31 +01:00
committed by Habib Gahbiche
parent 368c5b245b
commit 55c38c9850

View File

@@ -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<bNode *>(ptr->data);
NodeTwoXYs *data = static_cast<NodeTwoXYs *>(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<bNode *>(ptr->data);
NodeTwoXYs *data = static_cast<NodeTwoXYs *>(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<bNode *>(ptr->data);
NodeTwoXYs *data = static_cast<NodeTwoXYs *>(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<bNode *>(ptr->data);
NodeTwoXYs *data = static_cast<NodeTwoXYs *>(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<bNode *>(ptr->data);
NodeTwoXYs *data = static_cast<NodeTwoXYs *>(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<bNode *>(ptr->data);
NodeTwoXYs *data = static_cast<NodeTwoXYs *>(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<bNode *>(ptr->data);
NodeTwoXYs *data = static_cast<NodeTwoXYs *>(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<bNode *>(ptr->data);
NodeTwoXYs *data = static_cast<NodeTwoXYs *>(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");