[Bf-blender-cvs] [64f78e1] override_static: More WIP: add basic new BKE and RNA override API, update DNA structs.
Bastien Montagne
noreply at git.blender.org
Wed Dec 14 16:10:30 CET 2016
Commit: 64f78e15af47c318d22440010a8cac183a294128
Author: Bastien Montagne
Date: Fri Dec 9 21:36:14 2016 +0100
Branches: override_static
https://developer.blender.org/rB64f78e15af47c318d22440010a8cac183a294128
More WIP: add basic new BKE and RNA override API, update DNA structs.
Still much to do to even get a first dead simple working prototype, not
doing anything yet (except compiling and not crashing when ran :P ).
===================================================================
A source/blender/blenkernel/BKE_library_override.h
M source/blender/blenkernel/CMakeLists.txt
A source/blender/blenkernel/intern/library_override.c
M source/blender/blenkernel/intern/library_remap.c
M source/blender/blenloader/intern/readfile.c
M source/blender/blenloader/intern/writefile.c
M source/blender/makesdna/DNA_ID.h
M source/blender/makesrna/RNA_access.h
M source/blender/makesrna/intern/rna_access.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_library_override.h b/source/blender/blenkernel/BKE_library_override.h
new file mode 100644
index 0000000..c26155a
--- /dev/null
+++ b/source/blender/blenkernel/BKE_library_override.h
@@ -0,0 +1,50 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2016 by Blender Foundation.
+ * All rights reserved.
+ *
+ * Contributor(s): Bastien Montagne.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __BKE_LIBRARY_OVERRIDE_H__
+#define __BKE_LIBRARY_OVERRIDE_H__
+
+/** \file BKE_library_override.h
+ * \ingroup bke
+ * \since December 2016
+ * \author mont29
+ */
+
+struct ID;
+struct IDOverride;
+struct IDOverrideProperty;
+struct Main;
+
+struct IDOverride *BKE_override_init(struct ID *local_id, struct ID *reference_id);
+void BKE_override_clear(struct IDOverride *override);
+void BKE_override_free(struct IDOverride **override);
+
+bool BKE_override_status_check_local(struct ID *local);
+bool BKE_override_status_check_reference(struct ID *local);
+
+bool BKE_override_synchronize_update(struct ID *local);
+
+
+#endif /* __BKE_LIBRARY_OVERRIDE_H__ */
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index 157c440..aabc98e 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -120,6 +120,7 @@ set(SRC
intern/lattice.c
intern/library.c
intern/library_idmap.c
+ intern/library_override.c
intern/library_query.c
intern/library_remap.c
intern/linestyle.c
@@ -246,6 +247,7 @@ set(SRC
BKE_lattice.h
BKE_library.h
BKE_library_idmap.h
+ BKE_library_override.h
BKE_library_query.h
BKE_library_remap.h
BKE_linestyle.h
diff --git a/source/blender/blenkernel/intern/library_override.c b/source/blender/blenkernel/intern/library_override.c
new file mode 100644
index 0000000..07938e6
--- /dev/null
+++ b/source/blender/blenkernel/intern/library_override.c
@@ -0,0 +1,172 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2016 by Blender Foundation.
+ * All rights reserved.
+ *
+ * Contributor(s): Bastien Montagne.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/blenkernel/intern/library_override.c
+ * \ingroup bke
+ */
+
+#include <stdlib.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_ID.h"
+
+#include "BKE_library.h"
+#include "BKE_library_override.h"
+
+#include "BLI_utildefines.h"
+#include "BLI_listbase.h"
+
+#include "RNA_access.h"
+#include "RNA_types.h"
+
+/** Initialize empty overriding of \a reference_id by \a local_id. */
+IDOverride *BKE_override_init(struct ID *local_id, struct ID *reference_id)
+{
+ BLI_assert(reference_id->lib != NULL);
+
+ local_id->override = MEM_callocN(sizeof(*local_id->override), __func__);
+ local_id->override->reference = reference_id;
+ id_us_plus(reference_id);
+ local_id->tag &= ~LIB_TAG_OVERRIDE_OK;
+ /* TODO do we want to add tag or flag to referee to mark it as such? */
+ return local_id->override;
+}
+
+/** Clear any overriding data from given \a override. */
+void BKE_override_clear(struct IDOverride *override)
+{
+ BLI_assert(override != NULL);
+
+ for (IDOverrideProperty *op = override->properties.first; op; op = op->next) {
+ BLI_assert(op->rna_path != NULL);
+
+ MEM_freeN(op->rna_path);
+
+ for (IDOverridePropertyOperation *opop = op->operations.first; opop; opop = opop->next) {
+ if (opop->subitem_reference_name) {
+ MEM_freeN(opop->subitem_reference_name);
+ }
+ if (opop->subitem_local_name) {
+ MEM_freeN(opop->subitem_local_name);
+ }
+ }
+ BLI_freelistN(&op->operations);
+ }
+ BLI_freelistN(&override->properties);
+}
+
+/** Free given \a override. */
+void BKE_override_free(struct IDOverride **override)
+{
+ BLI_assert(*override != NULL);
+
+ BKE_override_clear(*override);
+ MEM_freeN(*override);
+ *override = NULL;
+}
+
+
+/**
+ * Check that status of local data-block is still valid against current reference one.
+ *
+ * It means that all overridable, but not overridden, properties' local values must be equal to reference ones.
+ * Clears LIB_TAG_OVERRIDE_OK if they do not.
+ *
+ * This is typically used to detect whether some property has been changed in local and a new IDOverrideProperty
+ * (of IDOverridePropertyOperation) has to be added.
+ *
+ * \return true if status is OK, false otherwise. */
+bool BKE_override_status_check_local(ID *local)
+{
+ BLI_assert(local->override != NULL);
+
+ ID *reference = local->override->reference;
+
+ BLI_assert(reference != NULL && GS(local->name) == GS(reference->name));
+
+ /* Note that reference is assumed always valid, caller has to ensure that itself. */
+
+ PointerRNA rnaptr_local, rnaptr_reference;
+ RNA_id_pointer_create(local, &rnaptr_local);
+ RNA_id_pointer_create(reference, &rnaptr_reference);
+
+ if (!RNA_struct_override_matches(&rnaptr_local, &rnaptr_reference, local->override, true, true)) {
+ local->tag &= ~LIB_TAG_OVERRIDE_OK;
+ return false;
+ }
+
+ return true;
+}
+
+/**
+ * Check that status of reference data-block is still valid against current local one.
+ *
+ * It means that all non-overridden properties' local values must be equal to reference ones.
+ * Clears LIB_TAG_OVERRIDE_OK if they do not.
+ *
+ * This is typically used to detect whether some reference has changed and local needs to be updated against it.
+ *
+ * \return true if status is OK, false otherwise. */
+bool BKE_override_status_check_reference(ID *local)
+{
+ BLI_assert(local->override != NULL);
+
+ ID *reference = local->override->reference;
+
+ BLI_assert(reference != NULL && GS(local->name) == GS(reference->name));
+
+ if (reference->override && (reference->tag & LIB_TAG_OVERRIDE_OK) == 0) {
+ if (!BKE_override_status_check_reference(reference)) {
+ /* If reference is also override of another data-block, and its status is not OK,
+ * then this override is not OK either.
+ * Note that this should only happen when reloading libraries... */
+ local->tag &= ~LIB_TAG_OVERRIDE_OK;
+ return false;
+ }
+ }
+
+ PointerRNA rnaptr_local, rnaptr_reference;
+ RNA_id_pointer_create(local, &rnaptr_local);
+ RNA_id_pointer_create(reference, &rnaptr_reference);
+
+ if (!RNA_struct_override_matches(&rnaptr_local, &rnaptr_reference, local->override, false, true)) {
+ local->tag &= ~LIB_TAG_OVERRIDE_OK;
+ return false;
+ }
+
+ return true;
+}
+
+/** Compares local and reference data-blocks and create new override operations as needed,
+ * or reset to reference values if overriding is not allowed.
+ * \return true is new overriding op was created, or some local data was reset. */
+bool BKE_override_synchronize_update(ID *local)
+{
+ BLI_assert(local->override != NULL);
+ return false;
+}
+
+
diff --git a/source/blender/blenkernel/intern/library_remap.c b/source/blender/blenkernel/intern/library_remap.c
index 4f1f6d9..551279d 100644
--- a/source/blender/blenkernel/intern/library_remap.c
+++ b/source/blender/blenkernel/intern/library_remap.c
@@ -84,6 +84,7 @@
#include "BKE_lamp.h"
#include "BKE_lattice.h"
#include "BKE_library.h"
+#include "BKE_library_override.h"
#include "BKE_library_query.h"
#include "BKE_library_remap.h"
#include "BKE_linestyle.h"
@@ -715,6 +716,10 @@ void BKE_libblock_free_data(Main *UNUSED(bmain), ID *id)
IDP_FreeProperty(id->properties);
MEM_freeN(id->properties);
}
+
+ if (id->override) {
+ BKE_override_free(&id->override);
+ }
}
/**
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 146263c..b57b720 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -2174,13 +2174,20 @@ static void lib_link_id(FileData *fd, Main *main)
}
}
-static void direct_link_id_override_data_cb(FileData *fd, void *datav)
+static void direct_link_id_override_property_operation_cb(FileData *fd, void *data)
{
- IDOverrideData *data = datav;
+ IDOverridePropertyOperation *opop = data;
- data->rna_path = newdataadr(fd, data->rna_path);
- data->subitem_reference_name = newdataadr(fd, data->subitem_reference_name);
- data->subitem_local_name = newdataadr(fd, data->subitem_local_name);
+ opop->subitem_reference_name = newdataadr(fd, opop->subitem_reference_name);
+ opop->subitem_local_name = newdataadr(fd, opop->subitem_local_name);
+}
+
+static void direct_link_id_override_property_cb(FileData *fd, void *data)
+{
+ IDOverrideProperty *op = data;
+
+ op->rna_path = newdataadr(fd, op->rna_path);
+ link_list_ex(fd, &op->operations, direct_link_id_override_property_operation_cb);
}
static void direct_link_id(FileData *fd, ID *id)
@@ -2195,7 +2202,7 @@ static void direct_link_id(FileData *fd, ID *id)
/* Link direct data of overrides
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list