[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12937] trunk/blender/source/blender:

Brecht Van Lommel brechtvanlommel at pandora.be
Tue Dec 18 17:55:10 CET 2007


Revision: 12937
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12937
Author:   blendix
Date:     2007-12-18 17:55:09 +0100 (Tue, 18 Dec 2007)

Log Message:
-----------

Particles
=========

- The render and realtime button for the particle system modifier
  and the enabled button for particles now work seperate again,
  made a bad design decision to tie them together. Now with only
  the render button and not realtime enabled it renders.
- Fix for bug #7948: particle mode crash while constraining axis.
- Fix for bug #7945: crash loading effector groups from an old file.
- Fix for bug #7942: crash for reactor particles emitting from particles.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_particle.h
    trunk/blender/source/blender/blenkernel/intern/depsgraph.c
    trunk/blender/source/blender/blenkernel/intern/modifier.c
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/blenkernel/intern/particle.c
    trunk/blender/source/blender/blenkernel/intern/particle_system.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/makesdna/DNA_particle_types.h
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/render/intern/source/strand.c
    trunk/blender/source/blender/src/buttons_editing.c
    trunk/blender/source/blender/src/buttons_object.c
    trunk/blender/source/blender/src/drawobject.c
    trunk/blender/source/blender/src/editobject.c
    trunk/blender/source/blender/src/editparticle.c
    trunk/blender/source/blender/src/transform_conversions.c

Modified: trunk/blender/source/blender/blenkernel/BKE_particle.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_particle.h	2007-12-18 16:54:12 UTC (rev 12936)
+++ trunk/blender/source/blender/blenkernel/BKE_particle.h	2007-12-18 16:55:09 UTC (rev 12937)
@@ -169,6 +169,8 @@
 
 	int from, cfrom, distr;
 
+	struct ParticleData *tpars;
+
 	/* path caching */
 	int editupdate, between, steps;
 	int totchild, totparent;
@@ -203,15 +205,18 @@
 void psys_enable_all(struct Object *ob);
 int psys_ob_has_hair(struct Object *ob);
 int psys_in_edit_mode(struct ParticleSystem *psys);
+int psys_check_enabled(struct Object *ob, struct ParticleSystem *psys);
 
 void psys_free_settings(struct ParticleSettings *part);
 void free_child_path_cache(struct ParticleSystem *psys);
 void psys_free_path_cache(struct ParticleSystem *psys);
-void psys_free_render_memory(struct Object *ob, struct ParticleSystem *psys);
 void free_hair(struct ParticleSystem *psys);
 void free_keyed_keys(struct ParticleSystem *psys);
 void psys_free(struct Object * ob, struct ParticleSystem * psys);
 
+void psys_particles_to_render_backup(struct Object *ob, struct ParticleSystem *psys);
+void psys_render_backup_to_particles(struct Object *ob, struct ParticleSystem *psys);
+
 void clear_particles_from_cache(struct Object *ob, struct ParticleSystem *psys, int cfra);
 //void psys_remove_from_particle_list(struct Object *ob, short nbr, struct ParticleSystem *psys);
 
@@ -280,6 +285,7 @@
 void initialize_particle(struct ParticleData *pa, int p, struct Object *ob, struct ParticleSystem *psys, struct ParticleSystemModifierData *psmd);
 void reset_particle(struct ParticleData *pa, struct ParticleSystem *psys, struct ParticleSystemModifierData *psmd, struct Object *ob, float dtime, float cfra, float *vg_vel, float *vg_tan, float *vg_rot);
 
+void psys_calc_dmfaces(struct Object *ob, struct DerivedMesh *dm, struct ParticleSystem *psys);
 int psys_particle_dm_face_lookup(struct Object *ob, struct DerivedMesh *dm, int index, float *fw, struct LinkNode *node);
 
 /* ParticleEffectorCache->type */

Modified: trunk/blender/source/blender/blenkernel/intern/depsgraph.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/depsgraph.c	2007-12-18 16:54:12 UTC (rev 12936)
+++ trunk/blender/source/blender/blenkernel/intern/depsgraph.c	2007-12-18 16:55:09 UTC (rev 12937)
@@ -1900,7 +1900,7 @@
 			ParticleSystem *psys= ob->particlesystem.first;
 
 			for(; psys; psys=psys->next) {
-				if(psys->flag & PSYS_ENABLED) {
+				if(psys_check_enabled(ob, psys)) {
 					ob->recalc |= OB_RECALC_DATA;
 					break;
 				}

Modified: trunk/blender/source/blender/blenkernel/intern/modifier.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/modifier.c	2007-12-18 16:54:12 UTC (rev 12936)
+++ trunk/blender/source/blender/blenkernel/intern/modifier.c	2007-12-18 16:55:09 UTC (rev 12937)
@@ -5097,7 +5097,7 @@
 	else
 		return;
 	
-	if((psys->flag&PSYS_ENABLED)==0)
+	if(!psys_check_enabled(ob, psys))
 		return;
 
 	if(dm==0){

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c	2007-12-18 16:54:12 UTC (rev 12936)
+++ trunk/blender/source/blender/blenkernel/intern/object.c	2007-12-18 16:55:09 UTC (rev 12937)
@@ -2201,7 +2201,7 @@
 				
 				psys= ob->particlesystem.first;
 				while(psys) {
-					if(psys->flag & PSYS_ENABLED) {
+					if(psys_check_enabled(ob, psys)) {
 						particle_system_update(ob, psys);
 						psys= psys->next;
 					}

Modified: trunk/blender/source/blender/blenkernel/intern/particle.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle.c	2007-12-18 16:54:12 UTC (rev 12936)
+++ trunk/blender/source/blender/blenkernel/intern/particle.c	2007-12-18 16:55:09 UTC (rev 12937)
@@ -77,6 +77,7 @@
 #include "BKE_bad_level_calls.h"
 #include "BKE_modifier.h"
 #include "BKE_mesh.h"
+#include "BKE_cdderivedmesh.h"
 
 #include "blendef.h"
 #include "RE_render_ext.h"
@@ -248,7 +249,24 @@
 {
 	return ((G.f & G_PARTICLEEDIT) && psys==psys_get_current(OBACT) && psys->edit);
 }
+int psys_check_enabled(Object *ob, ParticleSystem *psys)
+{
+	ParticleSystemModifierData *psmd;
 
+	if(!(psys->flag & PSYS_ENABLED))
+		return 0;
+
+	psmd= psys_get_modifier(ob, psys);
+	if(G.rendering) {
+		if(!psys->renderdata || !(psmd->modifier.mode & eModifierMode_Render))
+			return 0;
+	}
+	else if(!(psmd->modifier.mode & eModifierMode_Realtime))
+		return 0;
+	
+	return 1;
+}
+
 /************************************************/
 /*			Freeing stuff						*/
 /************************************************/
@@ -301,27 +319,6 @@
 	}
 	free_child_path_cache(psys);
 }
-void psys_free_render_memory(Object *ob, ParticleSystem *psys)
-{
-	ParticleSystemModifierData *psmd;
-
-	/* this is a bad function, but saves a lot of memory rendering.
-	 * particles should really be generated on the fly with render
-	 * settings! */
-	psys_free_path_cache(psys);
-
-	if(psys->child){
-		MEM_freeN(psys->child);
-		psys->child=0;
-		psys->totchild=0;
-	}
-	
-	psmd= psys_get_modifier(ob, psys);
-	psmd->flag &= ~eParticleSystemFlag_psys_updated;
-
-	psys->recalc |= PSYS_ALLOC|PSYS_DISTR;
-	//DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
-}
 /* free everything */
 void psys_free(Object *ob, ParticleSystem * psys)
 {
@@ -366,6 +363,92 @@
 	}
 }
 
+/* these two functions move away particle data and bring it back after
+ * rendering, to make different render settings possible without
+ * removing the previous data. this should be solved properly once */
+
+typedef struct ParticleRenderDataup {
+	ChildParticle *child;
+	ParticleCacheKey **pathcache;
+	ParticleCacheKey **childcache;
+	int totchild, totcached, totchildcache;
+	DerivedMesh *dm;
+	int totdmvert, totdmedge, totdmface;
+} ParticleRenderDataup;
+
+void psys_particles_to_render_backup(Object *ob, ParticleSystem *psys)
+{
+	ParticleRenderDataup *data;
+	ParticleSystemModifierData *psmd= psys_get_modifier(ob, psys);
+
+	if(!G.rendering)
+		return;
+
+	data= MEM_callocN(sizeof(ParticleRenderDataup), "ParticleRenderDataup");
+
+	data->child= psys->child;
+	data->totchild= psys->totchild;
+	data->pathcache= psys->pathcache;
+	data->totcached= psys->totcached;
+	data->childcache= psys->childcache;
+	data->totchildcache= psys->totchildcache;
+
+	if(psmd->dm)
+		data->dm= CDDM_copy(psmd->dm);
+	data->totdmvert= psmd->totdmvert;
+	data->totdmedge= psmd->totdmedge;
+	data->totdmface= psmd->totdmface;
+
+	psys->child= NULL;
+	psys->pathcache= NULL;
+	psys->childcache= NULL;
+	psys->totchild= psys->totcached= psys->totchildcache= 0;
+
+	psys->renderdata= data;
+}
+
+void psys_render_backup_to_particles(Object *ob, ParticleSystem *psys)
+{
+	ParticleRenderDataup *data;
+	ParticleSystemModifierData *psmd= psys_get_modifier(ob, psys);
+
+	data= psys->renderdata;
+	if(!data)
+		return;
+
+	if(psmd->dm) {
+		psmd->dm->needsFree= 1;
+		psmd->dm->release(psmd->dm);
+	}
+
+	psys_free_path_cache(psys);
+
+	if(psys->child){
+		MEM_freeN(psys->child);
+		psys->child= 0;
+		psys->totchild= 0;
+	}
+	
+	psys->child= data->child;
+	psys->totchild= data->totchild;
+	psys->pathcache= data->pathcache;
+	psys->totcached= data->totcached;
+	psys->childcache= data->childcache;
+	psys->totchildcache= data->totchildcache;
+
+	psmd->dm= data->dm;
+	psmd->totdmvert= data->totdmvert;
+	psmd->totdmedge= data->totdmedge;
+	psmd->totdmface= data->totdmface;
+	psmd->flag &= ~eParticleSystemFlag_psys_updated;
+
+	if(psys->part->from==PART_FROM_FACE && psmd->dm)
+		psys_calc_dmfaces(ob, psmd->dm, psys);
+
+	MEM_freeN(data);
+	psys->renderdata= NULL;
+}
+
 /************************************************/
 /*			Interpolated Particles				*/
 /************************************************/
@@ -1407,7 +1490,7 @@
 
 	/*---start figuring out what is actually wanted---*/
 	if(psys_in_edit_mode(psys))
-		if(G.rendering==0 && (psys->edit==NULL || pset->flag & PE_SHOW_CHILD)==0)
+		if(psys->renderdata==0 && (psys->edit==NULL || pset->flag & PE_SHOW_CHILD)==0)
 			totchild=0;
 
 	if(totchild && part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES){
@@ -1416,7 +1499,7 @@
 		between=1;
 	}
 
-	if(G.rendering)
+	if(psys->renderdata)
 		steps=(int)pow(2.0,(double)part->ren_step);
 	else{
 		totchild=(int)((float)totchild*(float)part->disp/100.0f);
@@ -1871,7 +1954,7 @@
 	if((psys->flag & PSYS_HAIR_DONE)==0 && (psys->flag & PSYS_KEYED)==0)
 		return;
 
-	if(G.rendering)
+	if(psys->renderdata)
 		steps = (int)pow(2.0, (double)psys->part->ren_step);
 	else if(psys_in_edit_mode(psys)){
 		edit=psys->edit;

Modified: trunk/blender/source/blender/blenkernel/intern/particle_system.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle_system.c	2007-12-18 16:54:12 UTC (rev 12936)
+++ trunk/blender/source/blender/blenkernel/intern/particle_system.c	2007-12-18 16:55:09 UTC (rev 12937)
@@ -92,7 +92,7 @@
 {
 	ParticleSettings *part=psys->part;
 
-	if(G.rendering || (part->child_nbr && part->childtype)) 
+	if(psys->renderdata || (part->child_nbr && part->childtype)) 
 		return 100;
 
 	if(part->phystype==PART_PHYS_KEYED){
@@ -136,7 +136,7 @@
 	}
 	psys->particles=newpars;
 
-	child_nbr= (G.rendering)? psys->part->ren_child_nbr: psys->part->child_nbr;
+	child_nbr= (psys->renderdata)? psys->part->ren_child_nbr: psys->part->child_nbr;
 	if(child_nbr && psys->part->childtype){
 		if(psys->child)
 			MEM_freeN(psys->child);
@@ -155,7 +155,7 @@
 }
 
 /* only run this if from == PART_FROM_FACE */
-static void psys_calc_dmfaces(Object *ob, DerivedMesh *dm, ParticleSystem *psys)
+void psys_calc_dmfaces(Object *ob, DerivedMesh *dm, ParticleSystem *psys)
 {
 	/* use for building derived mesh face-origin info,
 	node - the allocated links - total derived mesh face count 
@@ -472,7 +472,7 @@
 	ParticleThreadContext *ctx= thread->ctx;
 	Object *ob= ctx->ob;
 	DerivedMesh *dm= ctx->dm;
-	ParticleData *tpars=0, *tpa;
+	ParticleData *tpa;
 	ParticleSettings *part= ctx->psys->part;
 	float *v1, *v2, *v3, *v4, nor[3], orco1[3], co1[3], co2[3], nor1[3], ornor1[3];
 	float cur_d, min_d;
@@ -587,7 +587,7 @@
 		//pa->verts[1]=0;
 		//pa->verts[2]=0;
 
-		tpa=tpars+ctx->index[p];

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list