[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55608] trunk/blender/source/blender/ blenkernel: move FOREACH_NODETREE internal checks into functions.

Campbell Barton ideasman42 at gmail.com
Tue Mar 26 23:37:43 CET 2013


Revision: 55608
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55608
Author:   campbellbarton
Date:     2013-03-26 22:37:41 +0000 (Tue, 26 Mar 2013)
Log Message:
-----------
move FOREACH_NODETREE internal checks into functions.
  BKE_node_tree_iter_init,step()

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_node.h
    trunk/blender/source/blender/blenkernel/intern/node.c

Modified: trunk/blender/source/blender/blenkernel/BKE_node.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_node.h	2013-03-26 21:34:39 UTC (rev 55607)
+++ trunk/blender/source/blender/blenkernel/BKE_node.h	2013-03-26 22:37:41 UTC (rev 55608)
@@ -641,57 +641,33 @@
  * FOREACH_NODETREE_END
  */
 
+/* should be an opaque type, only for internal use by BKE_node_tree_iter_*** */
+struct NodeTreeIterStore {
+	bNodeTree *ngroup;
+	Scene *scene;
+	Material *mat;
+	Tex *tex;
+	Lamp *lamp;
+	World *world;
+};
+
+void BKE_node_tree_iter_init(struct NodeTreeIterStore *ntreeiter, struct Main *bmain);
+bool BKE_node_tree_iter_step(struct NodeTreeIterStore *ntreeiter,
+                             struct bNodeTree **r_nodetree, struct ID **r_id);
+
 #define FOREACH_NODETREE(bmain, _nodetree, _id) \
 { \
+	struct NodeTreeIterStore _nstore; \
 	bNodeTree *_nodetree; \
 	ID *_id; \
-	bNodeTree *_ngroup = bmain->nodetree.first; \
-	Scene *_scene = bmain->scene.first; \
-	Material *_mat = bmain->mat.first; \
-	Tex *_tex = bmain->tex.first; \
-	Lamp *_lamp = bmain->lamp.first; \
-	World *_world = bmain->world.first; \
 	/* avoid compiler warning about unused variables */ \
-	(void)_id; \
-	(void)_nodetree; \
-	do { \
-		if (_ngroup) { \
-			_nodetree = _ngroup; \
-			_id = (ID *)_ngroup; \
-			_ngroup = _ngroup->id.next; \
-		} \
-		else if (_scene) { \
-			_nodetree = _scene->nodetree; \
-			_id = (ID *)_scene; \
-			_scene = _scene->id.next; \
-		} \
-		else if (_mat) { \
-			_nodetree = _mat->nodetree; \
-			_id = (ID *)_mat; \
-			_mat = _mat->id.next; \
-		} \
-		else if (_tex) { \
-			_nodetree = _tex->nodetree; \
-			_id = (ID *)_tex; \
-			_tex = _tex->id.next; \
-		} \
-		else if (_lamp) { \
-			_nodetree = _lamp->nodetree; \
-			_id = (ID *)_lamp; \
-			_lamp = _lamp->id.next; \
-		} \
-		else if (_world) { \
-			_nodetree = _world->nodetree; \
-			_id = (ID *)_world; \
-			_world = _world->id.next; \
-		} \
-		else \
-			break; \
+	BKE_node_tree_iter_init(&_nstore, bmain); \
+	while (BKE_node_tree_iter_step(&_nstore, &_nodetree, &_id) == true) { \
 		if (_nodetree) {
 
 #define FOREACH_NODETREE_END \
 		} \
-	} while (TRUE); \
+	} \
 }
 
 /* ************** SHADER NODES *************** */

Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c	2013-03-26 21:34:39 UTC (rev 55607)
+++ trunk/blender/source/blender/blenkernel/intern/node.c	2013-03-26 22:37:41 UTC (rev 55608)
@@ -3593,3 +3593,56 @@
 		}
 	}
 }
+
+
+/* -------------------------------------------------------------------- */
+/* NodeTree Iterator Helpers (FOREACH_NODETREE) */
+
+void BKE_node_tree_iter_init(struct NodeTreeIterStore *ntreeiter, struct Main *bmain)
+{
+	ntreeiter->ngroup = bmain->nodetree.first;
+	ntreeiter->scene = bmain->scene.first;
+	ntreeiter->mat = bmain->mat.first;
+	ntreeiter->tex = bmain->tex.first;
+	ntreeiter->lamp = bmain->lamp.first;
+	ntreeiter->world = bmain->world.first;
+}
+bool BKE_node_tree_iter_step(struct NodeTreeIterStore *ntreeiter,
+                             bNodeTree **r_nodetree, struct ID **r_id)
+{
+	if (ntreeiter->ngroup) {
+		*r_nodetree =       ntreeiter->ngroup;
+		*r_id       = (ID *)ntreeiter->ngroup;
+		ntreeiter->ngroup = ntreeiter->ngroup->id.next;
+	}
+	else if (ntreeiter->scene) {
+		*r_nodetree =       ntreeiter->scene->nodetree;
+		*r_id       = (ID *)ntreeiter->scene;
+		ntreeiter->scene =  ntreeiter->scene->id.next;
+	}
+	else if (ntreeiter->mat) {
+		*r_nodetree =       ntreeiter->mat->nodetree;
+		*r_id       = (ID *)ntreeiter->mat;
+		ntreeiter->mat =    ntreeiter->mat->id.next;
+	}
+	else if (ntreeiter->tex) {
+		*r_nodetree =       ntreeiter->tex->nodetree;
+		*r_id       = (ID *)ntreeiter->tex;
+		ntreeiter->tex =    ntreeiter->tex->id.next;
+	}
+	else if (ntreeiter->lamp) {
+		*r_nodetree =       ntreeiter->lamp->nodetree;
+		*r_id       = (ID *)ntreeiter->lamp;
+		ntreeiter->lamp =   ntreeiter->lamp->id.next;
+	}
+	else if (ntreeiter->world) {
+		*r_nodetree =       ntreeiter->world->nodetree;
+		*r_id       = (ID *)ntreeiter->world;
+		ntreeiter->world  = ntreeiter->world->id.next;
+	}
+	else {
+		return false;
+	}
+
+	return true;
+}




More information about the Bf-blender-cvs mailing list