[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60023] trunk/blender/source/blender: Fix #36327: cycles render layers exclude layers animation did not work well.

Brecht Van Lommel brechtvanlommel at pandora.be
Tue Sep 10 22:26:34 CEST 2013


Revision: 60023
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60023
Author:   blendix
Date:     2013-09-10 20:26:34 +0000 (Tue, 10 Sep 2013)
Log Message:
-----------
Fix #36327: cycles render layers exclude layers animation did not work well.
This is kind of another way to animate layers which is disabled, but add an
exception to make this case work.

Modified Paths:
--------------
    trunk/blender/source/blender/makesrna/intern/rna_access.c
    trunk/blender/source/blender/nodes/composite/node_composite_tree.c
    trunk/blender/source/blender/render/intern/source/external_engine.c

Modified: trunk/blender/source/blender/makesrna/intern/rna_access.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_access.c	2013-09-10 19:23:39 UTC (rev 60022)
+++ trunk/blender/source/blender/makesrna/intern/rna_access.c	2013-09-10 20:26:34 UTC (rev 60023)
@@ -49,6 +49,7 @@
 #include "BKE_context.h"
 #include "BKE_idcode.h"
 #include "BKE_idprop.h"
+#include "BKE_fcurve.h"
 #include "BKE_main.h"
 #include "BKE_report.h"
 
@@ -1512,14 +1513,24 @@
 	return (prop->flag & PROP_EDITABLE) != 0;
 }
 
-bool RNA_property_animated(PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop))
+bool RNA_property_animated(PointerRNA *ptr, PropertyRNA *prop)
 {
-	/* would need to ask animation system */
+	int len = 1, index;
+	bool driven;
 
+	if (!prop)
+		return false;
+
+	if (RNA_property_array_check(prop))
+		len = RNA_property_array_length(ptr, prop);
+
+	for (index = 0; index < len; index++)
+		if (rna_get_fcurve(ptr, prop, index, NULL, &driven))
+			return true;
+
 	return false;
 }
 
-
 /* this function is to check if its possible to create a valid path from the ID
  * its slow so don't call in a loop */
 bool RNA_property_path_from_ID_check(PointerRNA *ptr, PropertyRNA *prop)

Modified: trunk/blender/source/blender/nodes/composite/node_composite_tree.c
===================================================================
--- trunk/blender/source/blender/nodes/composite/node_composite_tree.c	2013-09-10 19:23:39 UTC (rev 60022)
+++ trunk/blender/source/blender/nodes/composite/node_composite_tree.c	2013-09-10 20:26:34 UTC (rev 60023)
@@ -318,38 +318,22 @@
 	lb = RNA_struct_type_properties(ptr.type);
 
 	for (link = lb->first; link; link = link->next) {
-		int len = 1, index;
-		bool driven;
 		prop = (PropertyRNA *)link;
 
-		if (RNA_property_array_check(prop))
-			len = RNA_property_array_length(&ptr, prop);
-
-		for (index = 0; index < len; index++) {
-			if (rna_get_fcurve(&ptr, prop, index, NULL, &driven)) {
-				nodeUpdate(ntree, node);
-				return 1;
-			}
+		if (RNA_property_animated(&ptr, prop)) {
+			nodeUpdate(ntree, node);
+			return 1;
 		}
 	}
 
 	/* now check node sockets */
 	for (sock = node->inputs.first; sock; sock = sock->next) {
-		int len = 1, index;
-		bool driven;
-
 		RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, sock, &ptr);
 		prop = RNA_struct_find_property(&ptr, "default_value");
-		if (prop) {
-			if (RNA_property_array_check(prop))
-				len = RNA_property_array_length(&ptr, prop);
 
-			for (index = 0; index < len; index++) {
-				if (rna_get_fcurve(&ptr, prop, index, NULL, &driven)) {
-					nodeUpdate(ntree, node);
-					return 1;
-				}
-			}
+		if (RNA_property_animated(&ptr, prop)) {
+			nodeUpdate(ntree, node);
+			return 1;
 		}
 	}
 

Modified: trunk/blender/source/blender/render/intern/source/external_engine.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/external_engine.c	2013-09-10 19:23:39 UTC (rev 60022)
+++ trunk/blender/source/blender/render/intern/source/external_engine.c	2013-09-10 20:26:34 UTC (rev 60023)
@@ -49,6 +49,8 @@
 #include "IMB_imbuf.h"
 #include "IMB_imbuf_types.h"
 
+#include "RNA_access.h"
+
 #ifdef WITH_PYTHON
 #include "BPY_extern.h"
 #endif
@@ -392,6 +394,17 @@
 
 /* Render */
 
+static bool render_layer_exclude_animated(Scene *scene, SceneRenderLayer *srl)
+{
+	PointerRNA ptr;
+	PropertyRNA *prop;
+
+	RNA_pointer_create(&scene->id, &RNA_SceneRenderLayer, srl, &ptr);
+	prop = RNA_struct_find_property(&ptr, "layers_exclude");
+
+	return RNA_property_animated(&ptr, prop);
+}
+
 int RE_engine_render(Render *re, int do_all)
 {
 	RenderEngineType *type = RE_engines_find(re->r.engine);
@@ -420,13 +433,25 @@
 
 			if (re->r.scemode & R_SINGLE_LAYER) {
 				srl = BLI_findlink(&re->r.layers, re->r.actlay);
-				if (srl)
+				if (srl) {
 					non_excluded_lay |= ~srl->lay_exclude;
+
+					/* in this case we must update all because animation for
+					 * the scene has not been updated yet, and so may not be
+					 * up to date until after BKE_scene_update_for_newframe */
+					if (render_layer_exclude_animated(re->scene, srl))
+						non_excluded_lay |= ~0;
+				}
 			}
 			else {
-				for (srl = re->r.layers.first; srl; srl = srl->next)
-					if (!(srl->layflag & SCE_LAY_DISABLE))
+				for (srl = re->r.layers.first; srl; srl = srl->next) {
+					if (!(srl->layflag & SCE_LAY_DISABLE)) {
 						non_excluded_lay |= ~srl->lay_exclude;
+
+						if (render_layer_exclude_animated(re->scene, srl))
+							non_excluded_lay |= ~0;
+					}
+				}
 			}
 
 			lay &= non_excluded_lay;




More information about the Bf-blender-cvs mailing list