[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38413] trunk/blender/source/blender: Fix for [#26712] Particle group instance 'Use Count' value gets reset on file-load.

Janne Karhu jhkarh at gmail.com
Fri Jul 15 15:32:03 CEST 2011


Revision: 38413
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38413
Author:   jhk
Date:     2011-07-15 13:32:02 +0000 (Fri, 15 Jul 2011)
Log Message:
-----------
Fix for [#26712] Particle group instance 'Use Count' value gets reset on file-load.
* New object pointers can't be loaded properly for library linked groups, so the weight groups now store an index to the group objects at save time. This index is used at load time to set the objects without relying on the old pointers.
* If the library linked group is modified the indices can be wrong, but this can't really be avoided easily as there's no way to relate objects in a linked group between loads.

Modified Paths:
--------------
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/blenloader/intern/writefile.c
    trunk/blender/source/blender/makesdna/DNA_particle_types.h

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2011-07-15 10:10:25 UTC (rev 38412)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2011-07-15 13:32:02 UTC (rev 38413)
@@ -75,6 +75,7 @@
 #include "DNA_node_types.h"
 #include "DNA_object_fluidsim.h" // NT
 #include "DNA_packedFile_types.h"
+#include "DNA_particle_types.h"
 #include "DNA_property_types.h"
 #include "DNA_text_types.h"
 #include "DNA_view3d_types.h"
@@ -3161,10 +3162,38 @@
 			if(part->effector_weights)
 				part->effector_weights->group = newlibadr(fd, part->id.lib, part->effector_weights->group);
 
-			dw = part->dupliweights.first;
-			for(; dw; dw=dw->next)
-				dw->ob = newlibadr(fd, part->id.lib, dw->ob);
+			if(part->dupliweights.first) {
+				int index_ok = 0;
+				/* check for old files without indices (all indexes 0) */
+				dw = part->dupliweights.first;
+				if(part->dupliweights.first == part->dupliweights.last) {
+					/* special case for only one object in the group */
+					index_ok = 1;
+				}
+				else { 
+					for(; dw; dw=dw->next) {
+						if(dw->index > 0) {
+							index_ok = 1;
+							break;
+						}
+					}
+				}
 
+				if(index_ok) {
+					/* if we have indexes, let's use them */
+					dw = part->dupliweights.first;
+					for(; dw; dw=dw->next) {
+						GroupObject *go = (GroupObject *)BLI_findlink(&part->dup_group->gobject, dw->index);
+						dw->ob = go ? go->ob : NULL;
+					}
+				}
+				else {
+					/* otherwise try to get objects from own library (won't work on library linked groups) */
+					for(; dw; dw=dw->next)
+						dw->ob = newlibadr(fd, part->id.lib, dw->ob);
+				}
+			}
+
 			if(part->boids) {
 				BoidState *state = part->boids->states.first;
 				BoidRule *rule;

Modified: trunk/blender/source/blender/blenloader/intern/writefile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/writefile.c	2011-07-15 10:10:25 UTC (rev 38412)
+++ trunk/blender/source/blender/blenloader/intern/writefile.c	2011-07-15 13:32:02 UTC (rev 38413)
@@ -837,6 +837,7 @@
 {
 	ParticleSettings *part;
 	ParticleDupliWeight *dw;
+	GroupObject *go;
 	int a;
 
 	part= idbase->first;
@@ -851,8 +852,16 @@
 			writestruct(wd, DATA, "EffectorWeights", 1, part->effector_weights);
 
 			dw = part->dupliweights.first;
-			for(; dw; dw=dw->next)
+			for(; dw; dw=dw->next) {
+				/* update indices */
+				dw->index = 0;
+				go = part->dup_group->gobject.first;
+				while(go && go->ob != dw->ob) {
+					go=go->next;
+					dw->index++;
+				}
 				writestruct(wd, DATA, "ParticleDupliWeight", 1, dw);
+			}
 
 			if(part->boids && part->phystype == PART_PHYS_BOIDS) {
 				BoidState *state = part->boids->states.first;

Modified: trunk/blender/source/blender/makesdna/DNA_particle_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_particle_types.h	2011-07-15 10:10:25 UTC (rev 38412)
+++ trunk/blender/source/blender/makesdna/DNA_particle_types.h	2011-07-15 13:32:02 UTC (rev 38413)
@@ -89,7 +89,8 @@
 	struct ParticleDupliWeight *next, *prev;
 	struct Object *ob;
 	short count;
-	short flag, rt[2];
+	short flag;
+	short index, rt; /* only updated on file save and used on file load */
 } ParticleDupliWeight;
 
 typedef struct ParticleData {




More information about the Bf-blender-cvs mailing list