[Bf-blender-cvs] [2fd55e1] id_override_static: Add first basic working auto-override.
Bastien Montagne
noreply at git.blender.org
Mon Jan 2 22:13:28 CET 2017
Commit: 2fd55e1443c7e0dea32701608f755bec310f748e
Author: Bastien Montagne
Date: Mon Jan 2 22:08:50 2017 +0100
Branches: id_override_static
https://developer.blender.org/rB2fd55e1443c7e0dea32701608f755bec310f748e
Add first basic working auto-override.
Still called from pre-depsgraph eval step, does an RNA comparison and
generate overriding rules for changed props...
Note: we most certainly do not want to run this on all depsgraph eval.
Own current idea would be to just tag IDs e.g. in depsgraph callback,
and run actual auto-generation e.g. in a low-priority job, maybe? not
sure... :|
Also, fix stupid mistake in RNA applying of override (used when reading
file to apply static override), and add object's loc/rot/scale as
overridable properties.
===================================================================
M source/blender/blenkernel/intern/library_override.c
M source/blender/editors/object/object_relations.c
M source/blender/makesrna/RNA_access.h
M source/blender/makesrna/intern/rna_access.c
M source/blender/makesrna/intern/rna_object.c
===================================================================
diff --git a/source/blender/blenkernel/intern/library_override.c b/source/blender/blenkernel/intern/library_override.c
index fed8b3f..0ce436f 100644
--- a/source/blender/blenkernel/intern/library_override.c
+++ b/source/blender/blenkernel/intern/library_override.c
@@ -178,7 +178,16 @@ bool BKE_override_operations_create(ID *local)
{
BLI_assert(local->override != NULL);
if (local->flag & LIB_AUTOOVERRIDE) {
- printf("Should generate static override rules for %s\n", local->name);
+ PointerRNA rnaptr_local, rnaptr_reference;
+ RNA_id_pointer_create(local, &rnaptr_local);
+ RNA_id_pointer_create(local->override->reference, &rnaptr_reference);
+
+ if (RNA_struct_auto_override(&rnaptr_local, &rnaptr_reference, local->override)) {
+ printf("We did generate static override rules for %s\n", local->name);
+ }
+ else {
+ printf("No new static override rules for %s\n", local->name);
+ }
}
return false;
}
diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c
index 070ef49..2082731 100644
--- a/source/blender/editors/object/object_relations.c
+++ b/source/blender/editors/object/object_relations.c
@@ -2366,15 +2366,15 @@ static int make_override_exec(bContext *C, wmOperator *UNUSED(op))
/* Note that we most likely want to do this in a more BKE generic function later, but for now will do for testing. */
id_copy(bmain, &refobj->id, (ID **)&locobj, false);
- locobj->id.flag |= LIB_AUTOOVERRIDE;
/* Remapping *before* defining override (this will have to be fixed btw, remapping of ref pointer...). */
BKE_libblock_remap(bmain, refobj, locobj, ID_REMAP_SKIP_INDIRECT_USAGE);
IDOverride *override = BKE_override_init(&locobj->id, &refobj->id);
+ locobj->id.flag |= LIB_AUTOOVERRIDE;
/* For testing only of course! This will have to be auto-generated/editable by user... */
- {
+ if (0) {
IDOverrideProperty *overp = MEM_callocN(sizeof(IDOverrideProperty), __func__);
overp->rna_path = BLI_strdup("location");
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index 8d0b667..9aa07ab 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -1225,6 +1225,8 @@ void RNA_property_override_apply(struct PointerRNA *dst,
struct PointerRNA *src, struct PropertyRNA *prop, struct IDOverrideProperty *op);
void RNA_struct_override_apply(struct PointerRNA *dst, struct PointerRNA *src, struct IDOverride *override);
+bool RNA_struct_auto_override(struct PointerRNA *local, struct PointerRNA *reference, struct IDOverride *override);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index 5c6882c..61040f4 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -6826,7 +6826,7 @@ bool RNA_property_copy(PointerRNA *ptr, PointerRNA *fromptr, PropertyRNA *prop,
RNA_property_float_get_array(fromptr, fromprop, tmparray);
RNA_property_float_set_array(ptr, prop, tmparray);
-
+
MEM_freeN(tmparray);
}
else {
@@ -7158,11 +7158,91 @@ void RNA_struct_override_apply(PointerRNA *dst, PointerRNA *src, IDOverride *ove
{
BLI_assert(src_prop == dst_prop);
- RNA_property_override_apply(&src_data, &dst_data, src_prop, op);
+ RNA_property_override_apply(&dst_data, &src_data, src_prop, op);
}
}
}
+/** Automatically define override rules by comparing \a local and \a reference RNA structs. */
+bool RNA_struct_auto_override(PointerRNA *local, PointerRNA *reference, IDOverride *override)
+{
+ CollectionPropertyIterator iter;
+ PropertyRNA *iterprop;
+ bool changed = false;
+
+ BLI_assert(local->type == reference->type);
+ BLI_assert(local->id.data && reference->id.data);
+
+ if ((((ID *)local->id.data)->flag & LIB_AUTOOVERRIDE) == 0) {
+ return changed;
+ }
+
+ iterprop = RNA_struct_iterator_property(local->type);
+
+ for (RNA_property_collection_begin(local, iterprop, &iter); iter.valid; RNA_property_collection_next(&iter)) {
+ PropertyRNA *prop = iter.ptr.data;
+ IDOverrideProperty *op = NULL;
+
+ if (!(prop->flag & PROP_OVERRIDABLE)) {
+ continue;
+ }
+
+ /* XXX TODO this will have to be refined to handle collections insertions, and array items */
+ char *rna_path = RNA_path_from_ID_to_property(local, prop);
+ if (rna_path == NULL) {
+ continue;
+ }
+
+ if (STREQ(prop->identifier, "location")) {
+ printf("loc: %d\n", rna_property_equals(local, reference, prop, RNA_EQ_STRICT, override, NULL, true, true));
+ }
+ if (!rna_property_equals(local, reference, prop, RNA_EQ_STRICT, override, NULL, true, true)) {
+ switch (RNA_property_type(prop)) {
+ case PROP_POINTER:
+ {
+ PointerRNA sub_local, sub_reference;
+ sub_local = RNA_property_pointer_get(local, prop);
+ sub_reference = RNA_property_pointer_get(reference, prop);
+ changed = changed || RNA_struct_auto_override(&sub_local, &sub_reference, override);
+ break;
+ }
+ case PROP_COLLECTION:
+ /* TODO... of course... */
+ break;
+ default:
+ {
+ /* All other types. */
+ /* TODO: handle arrays! */
+ op = BKE_override_property_find(override, rna_path);
+
+ if (op != NULL) {
+ /* Already overriden prop, later we'll have to check arrays items and such,
+ * for now assume we have nothing to do. */
+ break;
+ }
+
+ op = MEM_callocN(sizeof(IDOverrideProperty), __func__);
+ op->rna_path = BLI_strdup(rna_path);
+
+ IDOverridePropertyOperation *opop = MEM_callocN(sizeof(IDOverridePropertyOperation), __func__);
+ opop->subitem_local_index = opop->subitem_reference_index = -1;
+ opop->operation = IDOVERRIDE_REPLACE;
+
+ BLI_addtail(&op->operations, opop);
+ BLI_addtail(&override->properties, op);
+
+ changed = true;
+ break;
+ }
+ }
+ }
+
+ MEM_SAFE_FREE(rna_path);
+ }
+ RNA_property_collection_end(&iter);
+
+ return changed;
+}
bool RNA_path_resolved_create(
PointerRNA *ptr, struct PropertyRNA *prop,
diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c
index 0cffba4..28714c8 100644
--- a/source/blender/makesrna/intern/rna_object.c
+++ b/source/blender/makesrna/intern/rna_object.c
@@ -2341,6 +2341,7 @@ static void rna_def_object(BlenderRNA *brna)
prop = RNA_def_property(srna, "location", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "loc");
RNA_def_property_editable_array_func(prop, "rna_Object_location_editable");
+ RNA_def_property_flag(prop, PROP_OVERRIDABLE);
RNA_def_property_ui_text(prop, "Location", "Location of the object");
RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, RNA_TRANSLATION_PREC_DEFAULT);
RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_internal_update");
@@ -2348,6 +2349,7 @@ static void rna_def_object(BlenderRNA *brna)
prop = RNA_def_property(srna, "rotation_quaternion", PROP_FLOAT, PROP_QUATERNION);
RNA_def_property_float_sdna(prop, NULL, "quat");
RNA_def_property_editable_array_func(prop, "rna_Object_rotation_4d_editable");
+ RNA_def_property_flag(prop, PROP_OVERRIDABLE);
RNA_def_property_float_array_default(prop, default_quat);
RNA_def_property_ui_text(prop, "Quaternion Rotation", "Rotation in Quaternions");
RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_internal_update");
@@ -2361,12 +2363,14 @@ static void rna_def_object(BlenderRNA *brna)
"rna_Object_rotation_axis_angle_set", NULL);
RNA_def_property_editable_array_func(prop, "rna_Object_rotation_4d_editable");
RNA_def_property_float_array_default(prop, default_axisAngle);
+ RNA_def_property_flag(prop, PROP_OVERRIDABLE);
RNA_def_property_ui_text(prop, "Axis-Angle Rotation", "Angle of Rotation for Axis-Angle rotation representation");
RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_internal_update");
prop = RNA_def_property(srna, "rotation_euler", PROP_FLOAT, PROP_EULER);
RNA_def_property_float_sdna(prop, NULL, "rot");
RNA_def_property_editable_array_func(prop, "rna_Object_rotation_euler_editable");
+ RNA_def_property_flag(prop, PROP_OVERRIDABLE);
RNA_def_property_ui_text(prop, "Euler Rotation", "Rotation in Eulers");
RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_internal_update");
@@ -2379,7 +2383,7 @@ static void rna_def_object(BlenderRNA *brna)
prop = RNA_def_property(srna, "scale", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "size");
- RNA_def_property_flag(prop, PROP_PROPORTIONAL);
+ RNA_def_property_flag(prop, PROP_PROPORTIONAL | PROP_OVERRIDABLE);
RNA_def_property_editable_array_func(prop, "rna_Object_scale_editable");
RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, 3);
RNA_def_property_float_array_default(prop, default_scale);
More information about the Bf-blender-cvs
mailing list