[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12458] branches/particles/source/blender: Dupli Group option for group visualization, duplicates the whole group in place of all particles instead of picking single objects from the group .

Janne Karhu jhkarh at utu.fi
Fri Nov 2 17:12:12 CET 2007


Revision: 12458
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12458
Author:   jhk
Date:     2007-11-02 17:12:11 +0100 (Fri, 02 Nov 2007)

Log Message:
-----------
Dupli Group option for group visualization, duplicates the whole group in place of all particles instead of picking single objects from the group.

Softbody uses point cache now (works with hair softbody too). There are still some problems with not always clearing the cache when settings are changed, but there's always the clear cache button.

For now old softbody bakes are now just discarded, a conversion to point cache can be later implemented if considered necessary.

Some silly typos corrected and a little code cleanup here and there too.

Modified Paths:
--------------
    branches/particles/source/blender/blenkernel/BKE_particle.h
    branches/particles/source/blender/blenkernel/BKE_softbody.h
    branches/particles/source/blender/blenkernel/intern/anim.c
    branches/particles/source/blender/blenkernel/intern/object.c
    branches/particles/source/blender/blenkernel/intern/particle.c
    branches/particles/source/blender/blenkernel/intern/particle_system.c
    branches/particles/source/blender/blenkernel/intern/softbody.c
    branches/particles/source/blender/blenloader/intern/readfile.c
    branches/particles/source/blender/blenloader/intern/writefile.c
    branches/particles/source/blender/makesdna/DNA_object_force.h
    branches/particles/source/blender/makesdna/DNA_particle_types.h
    branches/particles/source/blender/src/buttons_editing.c
    branches/particles/source/blender/src/buttons_object.c
    branches/particles/source/blender/src/editparticle.c

Modified: branches/particles/source/blender/blenkernel/BKE_particle.h
===================================================================
--- branches/particles/source/blender/blenkernel/BKE_particle.h	2007-11-02 15:16:20 UTC (rev 12457)
+++ branches/particles/source/blender/blenkernel/BKE_particle.h	2007-11-02 16:12:11 UTC (rev 12458)
@@ -169,7 +169,7 @@
 int count_particles(struct ParticleSystem *psys);
 int count_particles_mod(struct ParticleSystem *psys, int totgr, int cur);
 int psys_count_keys(struct ParticleSystem *psys);
-char *psys_menu_string(struct Object *ob);
+char *psys_menu_string(struct Object *ob, int for_sb);
 
 struct ParticleSystem *psys_get_current(struct Object *ob);
 short psys_get_current_num(struct Object *ob);

Modified: branches/particles/source/blender/blenkernel/BKE_softbody.h
===================================================================
--- branches/particles/source/blender/blenkernel/BKE_softbody.h	2007-11-02 15:16:20 UTC (rev 12457)
+++ branches/particles/source/blender/blenkernel/BKE_softbody.h	2007-11-02 16:12:11 UTC (rev 12458)
@@ -55,6 +55,8 @@
 /* frees internal data and softbody itself */
 extern void				sbFree(struct SoftBody *sb);
 
+extern void				softbody_clear_cache(struct Object *ob, float framenr);
+
 /* do one simul step, reading and writing vertex locs from given array */
 extern void				sbObjectStep(struct Object *ob, float framnr, float (*vertexCos)[3], int numVerts);
 

Modified: branches/particles/source/blender/blenkernel/intern/anim.c
===================================================================
--- branches/particles/source/blender/blenkernel/intern/anim.c	2007-11-02 15:16:20 UTC (rev 12457)
+++ branches/particles/source/blender/blenkernel/intern/anim.c	2007-11-02 16:12:11 UTC (rev 12458)
@@ -700,7 +700,7 @@
 static void new_particle_duplilist(ListBase *lb, Scene *sce, Object *par, ParticleSystem *psys)
 {
 	GroupObject *go;
-	Object *ob, copyob, **oblist=0;
+	Object *ob, **oblist=0;
 	ParticleSettings *part;
 	ParticleData *pa;
 	ParticleKey state;
@@ -709,7 +709,7 @@
 	float xvec[3] = {-1.0, 0.0, 0.0}, *q;
 						
 
-	int lay, a, k, step_nbr, counter;
+	int lay, a, k, step_nbr = 0, counter;
 	int totpart, totchild, totgroup=0, pa_num;
 
 	if(psys==0) return;
@@ -732,7 +732,7 @@
 		if(psys->flag & (PSYS_HAIR_DONE|PSYS_KEYED) && part->draw & PART_DRAW_KEYS)
 			step_nbr = part->keys_step;
 		else
-			step_nbr = 1;
+			step_nbr = 0;
 
 		psys->lattice = psys_get_lattice(par, psys);
 
@@ -785,61 +785,46 @@
 			else
 				ob = part->dup_ob;
 
-			if(psys->flag & (PSYS_HAIR_DONE|PSYS_KEYED) && part->draw & PART_DRAW_KEYS) {
-				for(k=0; k<=step_nbr; k++, counter++) {
+			for(k=0; k<=step_nbr; k++, counter++) {
+				if(step_nbr) {
 					state.time = (float)k / (float)step_nbr;
 					psys_get_particle_on_path(par, psys, a, &state, 0);
+				}
+				else {
+					state.time = -1.0;
+					if(psys_get_particle_state(par, psys, a, &state, 0) == 0)
+						continue;
+				}
 
-					copyob= *ob;
+				QuatToMat3(state.rot, parotmat);
 
-					/* to give ipos in object correct offset */
-					where_is_object_time(ob, ctime - pa_time);
+				if(part->draw_as==PART_DRAW_GR && psys->part->draw & PART_DRAW_WHOLE_GR) {
+					for(go= part->dup_group->gobject.first; go; go= go->next) {
 
-					QuatToMat3(state.rot, parotmat);
-					
-					q= vectoquat(xvec, ob->trackflag, ob->upflag);
-					QuatToMat3(q, obrotmat);
+						Mat4CpyMat4(tmat, go->ob->obmat);
+						Mat4MulMat43(tmat, go->ob->obmat, parotmat);
+						Mat4MulFloat3((float *)tmat, size);
 
-					Mat3MulMat3(mat, parotmat, obrotmat);
-					Mat4CpyMat4(tmat, ob->obmat);
-					Mat4MulMat43(ob->obmat, tmat, mat);
-					Mat4MulFloat3((float *)ob->obmat, size);
+						VECADD(tmat[3], go->ob->obmat[3], state.co);
 
-					VECCOPY(ob->obmat[3], state.co);
-
-					Mat4CpyMat4(tmat, ob->obmat);
-					Mat4CpyMat4(ob->obmat, copyob.obmat);
-					new_dupli_object(lb, ob, tmat, par->lay, counter);
-
-					*ob= copyob;
+						new_dupli_object(lb, go->ob, tmat, par->lay, counter);
+					}
 				}
-			}
-			else {
-				state.time = -1.0;
-				if(psys_get_particle_state(par, psys, a, &state, 0)) {
-
-					copyob = *ob;
-
+				else {
 					/* to give ipos in object correct offset */
 					where_is_object_time(ob, ctime-pa_time);
-
-					QuatToMat3(state.rot, parotmat);
 					
 					q = vectoquat(xvec, ob->trackflag, ob->upflag);
 					QuatToMat3(q, obrotmat);
 
 					Mat3MulMat3(mat, parotmat, obrotmat);
 					Mat4CpyMat4(tmat, ob->obmat);
-					Mat4MulMat43(ob->obmat, tmat, mat);
-					Mat4MulFloat3((float *)ob->obmat, size);
+					Mat4MulMat43(tmat, ob->obmat, mat);
+					Mat4MulFloat3((float *)tmat, size);
 
-					VECCOPY(ob->obmat[3], state.co);
+					VECCOPY(tmat[3], state.co);
 
-					Mat4CpyMat4(tmat, ob->obmat);
-					Mat4CpyMat4(ob->obmat, copyob.obmat);
 					new_dupli_object(lb, ob, tmat, par->lay, counter);
-
-					*ob = copyob;
 				}
 			}
 		}

Modified: branches/particles/source/blender/blenkernel/intern/object.c
===================================================================
--- branches/particles/source/blender/blenkernel/intern/object.c	2007-11-02 15:16:20 UTC (rev 12457)
+++ branches/particles/source/blender/blenkernel/intern/object.c	2007-11-02 16:12:11 UTC (rev 12458)
@@ -253,7 +253,7 @@
 			ob->pd->tex->id.us--;
 		MEM_freeN(ob->pd);
 	}
-
+	if(ob->soft) sbFree(ob->soft);
 	if(ob->fluidsimSettings) fluidsimSettingsFree(ob->fluidsimSettings);
 }
 

Modified: branches/particles/source/blender/blenkernel/intern/particle.c
===================================================================
--- branches/particles/source/blender/blenkernel/intern/particle.c	2007-11-02 15:16:20 UTC (rev 12457)
+++ branches/particles/source/blender/blenkernel/intern/particle.c	2007-11-02 16:12:11 UTC (rev 12458)
@@ -122,7 +122,7 @@
 	return totkey;
 }
 /* remember to free the pointer returned from this! */
-char *psys_menu_string(Object *ob)
+char *psys_menu_string(Object *ob, int for_sb)
 {
 	ParticleSystem *psys;
 	DynStr *ds;
@@ -130,10 +130,10 @@
 	int i;
 
 	ds = BLI_dynstr_new();
+
+	if(for_sb)
+		BLI_dynstr_append(ds, "|Object%x-1");
 	
-	BLI_dynstr_append(ds, "|Object%x-1");
-	
-	// Fill the dynamic string with entries
 	for(i=0,psys=ob->particlesystem.first; psys; i++,psys=psys->next){
 
 		BLI_dynstr_append(ds, "|");
@@ -144,7 +144,6 @@
 		BLI_dynstr_append(ds, num);
 	}
 	
-	// Create the menu string from dyn string
 	str = BLI_dynstr_get_cstring(ds);
 
 	BLI_dynstr_free(ds);

Modified: branches/particles/source/blender/blenkernel/intern/particle_system.c
===================================================================
--- branches/particles/source/blender/blenkernel/intern/particle_system.c	2007-11-02 15:16:20 UTC (rev 12457)
+++ branches/particles/source/blender/blenkernel/intern/particle_system.c	2007-11-02 16:12:11 UTC (rev 12458)
@@ -76,9 +76,6 @@
 
 #include "BSE_headerbuttons.h"
 
-//#include "BIF_screen.h"
-//#include "BIF_editbake.h"
-
 #include "blendef.h"
 
 #include "RE_shader_ext.h"
@@ -1605,7 +1602,7 @@
 		*target_ob=0;
 }
 /************************************************/
-/*			Cache								*/
+/*			Point Cache							*/
 /************************************************/
 void clear_particles_from_cache(Object *ob, ParticleSystem *psys, int cfra)
 {
@@ -4189,12 +4186,7 @@
 
 	psmd=psys_get_modifier(ob,psys);
 
-	/* baking is always done in global time */
-	/* probably should also disable object time ipo when baking! - jahka */
-	//if(psys->part->flag & PART_GLOB_TIME || psys->flag&PSYS_BAKING)
-	//	cfra=bsystem_time(0,(float)CFRA,0.0);
-	//else
-		cfra=bsystem_time(ob,(float)CFRA,0.0);
+	cfra=bsystem_time(ob,(float)CFRA,0.0);
 
 	/* system was allready updated from modifier stack */
 	if(psmd->flag&eParticleSystemFlag_psys_updated){

Modified: branches/particles/source/blender/blenkernel/intern/softbody.c
===================================================================
--- branches/particles/source/blender/blenkernel/intern/softbody.c	2007-11-02 15:16:20 UTC (rev 12457)
+++ branches/particles/source/blender/blenkernel/intern/softbody.c	2007-11-02 16:12:11 UTC (rev 12458)
@@ -84,6 +84,7 @@
 #include "BKE_softbody.h"
 #include "BKE_utildefines.h"
 #include "BKE_DerivedMesh.h"
+#include "BKE_pointcache.h"
 
 #include  "BIF_editdeform.h"
 //#include  "BIF_editbake.h"
@@ -908,7 +909,6 @@
 	
 	sb->keys= NULL;
 	sb->totkey= 0;
-	
 }
 static void free_scratch(SoftBody *sb)
 {
@@ -3180,6 +3180,96 @@
 		}
 	}
 }
+void softbody_clear_cache(Object *ob, float framenr)
+{
+	FILE *fp = NULL;
+	SoftBody *sb = ob->soft;
+	ModifierData *md = ob->modifiers.first;
+	int stack_index = -1;
+	int a;
+
+	if(sb==NULL) return;
+
+	if(sb->particles)
+		stack_index = modifiers_indexInObject(ob,(ModifierData*)psys_get_modifier(ob,sb->particles));
+	else {
+		for(a=0; md; md=md->next, a++) {
+			if(md->type = eModifierType_Softbody) {
+				stack_index = a;
+				break;
+			}
+		}
+	}
+
+	PTCache_id_clear((ID *)ob, framenr, stack_index);
+}
+static void softbody_write_cache(Object *ob, float framenr)
+{
+	FILE *fp = NULL;
+	SoftBody *sb = ob->soft;
+	BodyPoint *bp;
+	ModifierData *md = ob->modifiers.first;
+	int stack_index = -1;
+	int a;
+
+	if(sb->totpoint == 0) return;
+
+	if(sb->particles)
+		stack_index = modifiers_indexInObject(ob,(ModifierData*)psys_get_modifier(ob,sb->particles));
+	else {
+		for(a=0; md; md=md->next, a++) {
+			if(md->type = eModifierType_Softbody) {
+				stack_index = a;
+				break;
+			}
+		}
+	}
+
+	fp = PTCache_id_fopen((ID *)ob, 'w', framenr, stack_index);
+	if(!fp) return;
+
+	for(a=0, bp=sb->bpoint; a<sb->totpoint; a++, bp++)
+		fwrite(&bp->pos, sizeof(float), 3, fp);
+	
+	fclose(fp);
+}
+static int softbody_read_cache(Object *ob, float framenr)
+{
+	FILE *fp = NULL;
+	SoftBody *sb = ob->soft;
+	BodyPoint *bp;
+	ModifierData *md = ob->modifiers.first;
+	int stack_index = -1;
+	int a, ret = 1;
+
+	if(sb->totpoint == 0) return 0;
+
+	if(sb->particles)
+		stack_index = modifiers_indexInObject(ob,(ModifierData*)psys_get_modifier(ob,sb->particles));
+	else {
+		for(a=0; md; md=md->next, a++) {
+			if(md->type = eModifierType_Softbody) {
+				stack_index = a;
+				break;
+			}
+		}
+	}
+
+	fp = fp = PTCache_id_fopen((ID *)ob, 'r', framenr, stack_index);
+	if(!fp)
+		ret = 0;
+	else {
+		for(a=0, bp=sb->bpoint; a<sb->totpoint; a++, bp++)
+			if(fread(&bp->pos, sizeof(float), 3, fp) != 3) {
+				ret = 0;
+				break;
+			}
+
+		fclose(fp);
+	}
+
+	return ret;
+}
 /* +++ ************ maintaining scratch *************** */
 void sb_new_scratch(SoftBody *sb)
 {
@@ -3283,8 +3373,8 @@

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list