[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52039] trunk/blender/source/blender/ blenkernel: Fix #33123: lamp nodes drivers not working, now uses same hacks as material

Brecht Van Lommel brechtvanlommel at pandora.be
Fri Nov 9 14:57:10 CET 2012


Revision: 52039
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52039
Author:   blendix
Date:     2012-11-09 13:57:09 +0000 (Fri, 09 Nov 2012)
Log Message:
-----------
Fix #33123: lamp nodes drivers not working, now uses same hacks as material
to work around dependency graph limitations.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_lamp.h
    trunk/blender/source/blender/blenkernel/intern/anim_sys.c
    trunk/blender/source/blender/blenkernel/intern/depsgraph.c
    trunk/blender/source/blender/blenkernel/intern/lamp.c
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/blenkernel/intern/scene.c

Modified: trunk/blender/source/blender/blenkernel/BKE_lamp.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_lamp.h	2012-11-09 13:33:23 UTC (rev 52038)
+++ trunk/blender/source/blender/blenkernel/BKE_lamp.h	2012-11-09 13:57:09 UTC (rev 52039)
@@ -37,6 +37,7 @@
 #endif
 
 struct Lamp;
+struct Scene;
 
 struct Lamp *BKE_lamp_add(const char *name) WARN_UNUSED;
 struct Lamp *BKE_lamp_copy(struct Lamp *la) WARN_UNUSED;
@@ -44,6 +45,8 @@
 void BKE_lamp_make_local(struct Lamp *la);
 void BKE_lamp_free(struct Lamp *la);
 
+void lamp_drivers_update(struct Scene *scene, struct Lamp *la, float ctime);
+
 #ifdef __cplusplus
 }
 #endif

Modified: trunk/blender/source/blender/blenkernel/intern/anim_sys.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/anim_sys.c	2012-11-09 13:33:23 UTC (rev 52038)
+++ trunk/blender/source/blender/blenkernel/intern/anim_sys.c	2012-11-09 13:57:09 UTC (rev 52039)
@@ -781,7 +781,7 @@
 	ANIMDATA_NODETREE_IDS_CB(mainptr->tex.first, Tex);
 	
 	/* lamps */
-	ANIMDATA_IDS_CB(mainptr->lamp.first);
+	ANIMDATA_NODETREE_IDS_CB(mainptr->lamp.first, Lamp);
 	
 	/* materials */
 	ANIMDATA_NODETREE_IDS_CB(mainptr->mat.first, Material);
@@ -823,7 +823,7 @@
 	ANIMDATA_IDS_CB(mainptr->mask.first);
 	
 	/* worlds */
-	ANIMDATA_IDS_CB(mainptr->world.first);
+	ANIMDATA_NODETREE_IDS_CB(mainptr->world.first, World);
 
 	/* scenes */
 	ANIMDATA_NODETREE_IDS_CB(mainptr->scene.first, Scene);
@@ -868,7 +868,7 @@
 	RENAMEFIX_ANIM_NODETREE_IDS(mainptr->tex.first, Tex);
 	
 	/* lamps */
-	RENAMEFIX_ANIM_IDS(mainptr->lamp.first);
+	RENAMEFIX_ANIM_NODETREE_IDS(mainptr->lamp.first, Lamp);
 	
 	/* materials */
 	RENAMEFIX_ANIM_NODETREE_IDS(mainptr->mat.first, Material);
@@ -910,7 +910,7 @@
 	RENAMEFIX_ANIM_IDS(mainptr->mask.first);
 	
 	/* worlds */
-	RENAMEFIX_ANIM_IDS(mainptr->world.first);
+	RENAMEFIX_ANIM_NODETREE_IDS(mainptr->world.first, World);
 	
 	/* scenes */
 	RENAMEFIX_ANIM_NODETREE_IDS(mainptr->scene.first, Scene);

Modified: trunk/blender/source/blender/blenkernel/intern/depsgraph.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/depsgraph.c	2012-11-09 13:33:23 UTC (rev 52038)
+++ trunk/blender/source/blender/blenkernel/intern/depsgraph.c	2012-11-09 13:57:09 UTC (rev 52039)
@@ -45,6 +45,7 @@
 #include "DNA_anim_types.h"
 #include "DNA_camera_types.h"
 #include "DNA_group_types.h"
+#include "DNA_lamp_types.h"
 #include "DNA_lattice_types.h"
 #include "DNA_key_types.h"
 #include "DNA_material_types.h"
@@ -350,8 +351,8 @@
 /* XXX: forward def for material driver handling... */
 static void dag_add_material_driver_relations(DagForest *dag, DagNode *node, Material *ma);
 
-/* recursive handling for material nodetree drivers */
-static void dag_add_material_nodetree_driver_relations(DagForest *dag, DagNode *node, bNodeTree *ntree)
+/* recursive handling for shader nodetree drivers */
+static void dag_add_shader_nodetree_driver_relations(DagForest *dag, DagNode *node, bNodeTree *ntree)
 {
 	bNode *n;
 
@@ -367,7 +368,7 @@
 				dag_add_material_driver_relations(dag, node, (Material *)n->id);
 			}
 			else if (n->type == NODE_GROUP) {
-				dag_add_material_nodetree_driver_relations(dag, node, (bNodeTree *)n->id);
+				dag_add_shader_nodetree_driver_relations(dag, node, (bNodeTree *)n->id);
 			}
 		}
 	}
@@ -386,20 +387,43 @@
 		ma->id.flag |= LIB_DOIT;
 	
 	/* material itself */
-	if (ma->adt) {
+	if (ma->adt)
 		dag_add_driver_relation(ma->adt, dag, node, 1);
-	}
 
 	/* textures */
 	// TODO...
 	//dag_add_texture_driver_relations(DagForest *dag, DagNode *node, ID *id);
 
 	/* material's nodetree */
-	if (ma->nodetree) {
-		dag_add_material_nodetree_driver_relations(dag, node, ma->nodetree);
-	}
+	if (ma->nodetree)
+		dag_add_shader_nodetree_driver_relations(dag, node, ma->nodetree);
 }
 
+/* recursive handling for lamp drivers */
+static void dag_add_lamp_driver_relations(DagForest *dag, DagNode *node, Lamp *la)
+{
+	/* Prevent infinite recursion by checking (and tagging the lamp) as having been visited 
+	 * already (see build_dag()). This assumes la->id.flag & LIB_DOIT isn't set by anything else
+	 * in the meantime... [#32017]
+	 */
+	if (la->id.flag & LIB_DOIT)
+		return;
+	else
+		la->id.flag |= LIB_DOIT;
+	
+	/* lamp itself */
+	if (la->adt)
+		dag_add_driver_relation(la->adt, dag, node, 1);
+
+	/* textures */
+	// TODO...
+	//dag_add_texture_driver_relations(DagForest *dag, DagNode *node, ID *id);
+
+	/* lamp's nodetree */
+	if (la->nodetree)
+		dag_add_shader_nodetree_driver_relations(dag, node, la->nodetree);
+}
+
 static void dag_add_collision_field_relation(DagForest *dag, Scene *scene, Object *ob, DagNode *node, int skip_forcefield)
 {
 	Base *base;
@@ -647,6 +671,8 @@
 			}
 		}
 	}
+	else if(ob->type == OB_LAMP)
+		dag_add_lamp_driver_relations(dag, node, ob->data);
 	
 	/* particles */
 	psys = ob->particlesystem.first;
@@ -817,6 +843,7 @@
 	
 	/* clear "LIB_DOIT" flag from all materials, to prevent infinite recursion problems later [#32017] */
 	tag_main_idcode(bmain, ID_MA, FALSE);
+	tag_main_idcode(bmain, ID_LA, FALSE);
 	
 	/* add base node for scene. scene is always the first node in DAG */
 	scenenode = dag_add_node(dag, sce);

Modified: trunk/blender/source/blender/blenkernel/intern/lamp.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/lamp.c	2012-11-09 13:33:23 UTC (rev 52038)
+++ trunk/blender/source/blender/blenkernel/intern/lamp.c	2012-11-09 13:57:09 UTC (rev 52039)
@@ -33,9 +33,12 @@
 
 #include "MEM_guardedalloc.h"
 
+#include "DNA_anim_types.h"
 #include "DNA_lamp_types.h"
 #include "DNA_material_types.h"
+#include "DNA_node_types.h"
 #include "DNA_object_types.h"
+#include "DNA_scene_types.h"
 #include "DNA_texture_types.h"
 
 #include "BLI_listbase.h"
@@ -232,3 +235,38 @@
 	la->id.icon_id = 0;
 }
 
+/* Calculate all drivers for lamps, see material_drivers_update for why this is a bad hack */
+
+static void lamp_node_drivers_update(Scene *scene, bNodeTree *ntree, float ctime)
+{
+	bNode *node;
+
+	/* nodetree itself */
+	if (ntree->adt && ntree->adt->drivers.first)
+		BKE_animsys_evaluate_animdata(scene, &ntree->id, ntree->adt, ctime, ADT_RECALC_DRIVERS);
+	
+	/* nodes */
+	for (node = ntree->nodes.first; node; node = node->next)
+		if (node->id && node->type == NODE_GROUP)
+			lamp_node_drivers_update(scene, (bNodeTree *)node->id, ctime);
+}
+
+void lamp_drivers_update(Scene *scene, Lamp *la, float ctime)
+{
+	/* Prevent infinite recursion by checking (and tagging the lamp) as having been visited already
+	 * (see BKE_scene_update_tagged()). This assumes la->id.flag & LIB_DOIT isn't set by anything else
+	 * in the meantime... [#32017] */
+	if (la->id.flag & LIB_DOIT)
+		return;
+	else
+		la->id.flag |= LIB_DOIT;
+	
+	/* lamp itself */
+	if (la->adt && la->adt->drivers.first)
+		BKE_animsys_evaluate_animdata(scene, &la->id, la->adt, ctime, ADT_RECALC_DRIVERS);
+	
+	/* nodes */
+	if (la->nodetree)
+		lamp_node_drivers_update(scene, la->nodetree, ctime);
+}
+

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c	2012-11-09 13:33:23 UTC (rev 52038)
+++ trunk/blender/source/blender/blenkernel/intern/object.c	2012-11-09 13:57:09 UTC (rev 52039)
@@ -2654,6 +2654,8 @@
 					}
 				}
 			}
+			else if (ob->type == OB_LAMP)
+				lamp_drivers_update(scene, ob->data, ctime);
 			
 			/* particles */
 			if (ob->particlesystem.first) {

Modified: trunk/blender/source/blender/blenkernel/intern/scene.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/scene.c	2012-11-09 13:33:23 UTC (rev 52038)
+++ trunk/blender/source/blender/blenkernel/intern/scene.c	2012-11-09 13:57:09 UTC (rev 52039)
@@ -1074,6 +1074,7 @@
 	 * when trying to find materials with drivers that need evaluating [#32017] 
 	 */
 	tag_main_idcode(bmain, ID_MA, FALSE);
+	tag_main_idcode(bmain, ID_LA, FALSE);
 
 	/* update all objects: drivers, matrices, displists, etc. flags set
 	 * by depgraph or manual, no layer check here, gets correct flushed
@@ -1143,6 +1144,7 @@
 	 * when trying to find materials with drivers that need evaluating [#32017] 
 	 */
 	tag_main_idcode(bmain, ID_MA, FALSE);
+	tag_main_idcode(bmain, ID_LA, FALSE);
 
 	/* BKE_object_handle_update() on all objects, groups and sets */
 	scene_update_tagged_recursive(bmain, sce, sce);




More information about the Bf-blender-cvs mailing list