[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