[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [30274] trunk/blender/source/blender: - fix for eternal loop with metaballs in set scenes.

Campbell Barton ideasman42 at gmail.com
Tue Jul 13 18:06:51 CEST 2010


Revision: 30274
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30274
Author:   campbellbarton
Date:     2010-07-13 18:06:51 +0200 (Tue, 13 Jul 2010)

Log Message:
-----------
- fix for eternal loop with metaballs in set scenes.
- next_object() now loops through all set scenes, not just the first one.
- removed F_SET, rather them having a mode for looping on a set, just use the set when the first scene ends.
- metaballs can now glob between scenes however there are still some depsgraph issues that existed before.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_scene.h
    trunk/blender/source/blender/blenkernel/intern/mball.c
    trunk/blender/source/blender/blenkernel/intern/scene.c
    trunk/blender/source/blender/makesdna/DNA_scene_types.h

Modified: trunk/blender/source/blender/blenkernel/BKE_scene.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_scene.h	2010-07-13 15:52:32 UTC (rev 30273)
+++ trunk/blender/source/blender/blenkernel/BKE_scene.h	2010-07-13 16:06:51 UTC (rev 30274)
@@ -63,7 +63,7 @@
 struct Scene *copy_scene(struct Main *bmain, struct Scene *sce, int type);
 void unlink_scene(struct Main *bmain, struct Scene *sce, struct Scene *newsce);
 
-int next_object(struct Scene *scene, int val, struct Base **base, struct Object **ob);
+int next_object(struct Scene **scene, int val, struct Base **base, struct Object **ob);
 struct Object *scene_find_camera(struct Scene *sc);
 struct Object *scene_camera_switch_find(struct Scene *scene); // DURIAN_CAMERA_SWITCH
 int scene_camera_switch_update(struct Scene *scene);

Modified: trunk/blender/source/blender/blenkernel/intern/mball.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mball.c	2010-07-13 15:52:32 UTC (rev 30273)
+++ trunk/blender/source/blender/blenkernel/intern/mball.c	2010-07-13 16:06:51 UTC (rev 30274)
@@ -296,6 +296,7 @@
  * because this metaball influence polygonisation of metaballs. */
 void copy_mball_properties(Scene *scene, Object *active_object)
 {
+	Scene *sce_iter= scene;
 	Base *base;
 	Object *ob;
 	MetaBall *active_mball = (MetaBall*)active_object->data;
@@ -305,10 +306,10 @@
 	splitIDname(active_object->id.name+2, basisname, &basisnr);
 
 	/* XXX recursion check, see scene.c, just too simple code this next_object() */
-	if(F_ERROR==next_object(scene, 0, 0, 0))
+	if(F_ERROR==next_object(&sce_iter, 0, 0, 0))
 		return;
 	
-	while(next_object(scene, 1, &base, &ob)) {
+	while(next_object(&sce_iter, 1, &base, &ob)) {
 		if (ob->type==OB_MBALL) {
 			if(ob!=active_object){
 				splitIDname(ob->id.name+2, obname, &obnr);
@@ -338,6 +339,7 @@
  */
 Object *find_basis_mball(Scene *scene, Object *basis)
 {
+	Scene *sce_iter= scene;
 	Base *base;
 	Object *ob,*bob= basis;
 	MetaElem *ml=NULL;
@@ -348,10 +350,10 @@
 	totelem= 0;
 
 	/* XXX recursion check, see scene.c, just too simple code this next_object() */
-	if(F_ERROR==next_object(scene, 0, 0, 0))
+	if(F_ERROR==next_object(&sce_iter, 0, 0, 0))
 		return NULL;
 	
-	while(next_object(scene, 1, &base, &ob)) {
+	while(next_object(&sce_iter, 1, &base, &ob)) {
 		
 		if (ob->type==OB_MBALL) {
 			if(ob==bob){
@@ -1507,6 +1509,7 @@
 
 float init_meta(Scene *scene, Object *ob)	/* return totsize */
 {
+	Scene *sce_iter= scene;
 	Base *base;
 	Object *bob;
 	MetaBall *mb;
@@ -1523,9 +1526,8 @@
 	splitIDname(ob->id.name+2, obname, &obnr);
 	
 	/* make main array */
-	
-	next_object(scene, 0, 0, 0);
-	while(next_object(scene, 1, &base, &bob)) {
+	next_object(&sce_iter, 0, 0, 0);
+	while(next_object(&sce_iter, 1, &base, &bob)) {
 
 		if(bob->type==OB_MBALL) {
 			zero_size= 0;

Modified: trunk/blender/source/blender/blenkernel/intern/scene.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/scene.c	2010-07-13 15:52:32 UTC (rev 30273)
+++ trunk/blender/source/blender/blenkernel/intern/scene.c	2010-07-13 16:06:51 UTC (rev 30274)
@@ -593,7 +593,7 @@
 /* used by metaballs
  * doesnt return the original duplicated object, only dupli's
  */
-int next_object(Scene *scene, int val, Base **base, Object **ob)
+int next_object(Scene **scene, int val, Base **base, Object **ob)
 {
 	static ListBase *duplilist= NULL;
 	static DupliObject *dupob;
@@ -622,17 +622,21 @@
 
 			/* the first base */
 			if(fase==F_START) {
-				*base= scene->base.first;
+				*base= (*scene)->base.first;
 				if(*base) {
 					*ob= (*base)->object;
 					fase= F_SCENE;
 				}
 				else {
 					/* exception: empty scene */
-					if(scene->set && scene->set->base.first) {
-						*base= scene->set->base.first;
-						*ob= (*base)->object;
-						fase= F_SET;
+					while((*scene)->set) {
+						(*scene)= (*scene)->set;
+						if((*scene)->base.first) {
+							*base= (*scene)->base.first;
+							*ob= (*base)->object;
+							fase= F_SCENE;
+							break;
+						}
 					}
 				}
 			}
@@ -642,11 +646,14 @@
 					if(*base) *ob= (*base)->object;
 					else {
 						if(fase==F_SCENE) {
-							/* scene is finished, now do the set */
-							if(scene->set && scene->set->base.first) {
-								*base= scene->set->base.first;
-								*ob= (*base)->object;
-								fase= F_SET;
+							/* (*scene) is finished, now do the set */
+							while((*scene)->set) {
+								(*scene)= (*scene)->set;
+								if((*scene)->base.first) {
+									*base= (*scene)->base.first;
+									*ob= (*base)->object;
+									break;
+								}
 							}
 						}
 					}
@@ -661,7 +668,7 @@
 						this enters eternal loop because of 
 						makeDispListMBall getting called inside of group_duplilist */
 						if((*base)->object->dup_group == NULL) {
-							duplilist= object_duplilist(scene, (*base)->object);
+							duplilist= object_duplilist((*scene), (*base)->object);
 							
 							dupob= duplilist->first;
 
@@ -697,6 +704,10 @@
 		}
 	}
 	
+	/* if(ob && *ob) {
+		printf("Scene: '%s', '%s'\n", (*scene)->id.name+2, (*ob)->id.name+2);
+	} */
+
 	/* reset recursion test */
 	in_next_object= 0;
 	

Modified: trunk/blender/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_scene_types.h	2010-07-13 15:52:32 UTC (rev 30273)
+++ trunk/blender/source/blender/makesdna/DNA_scene_types.h	2010-07-13 16:06:51 UTC (rev 30274)
@@ -1093,7 +1093,6 @@
 #define F_ERROR			-1
 #define F_START			0
 #define F_SCENE			1
-#define F_SET			2
 #define F_DUPLI			3
 
 /* audio->flag */





More information about the Bf-blender-cvs mailing list