[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11891] branches/particles/source/blender: *bug fixes:

Janne Karhu jhkarh at utu.fi
Thu Aug 30 17:26:00 CEST 2007


Revision: 11891
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11891
Author:   jhk
Date:     2007-08-30 17:26:00 +0200 (Thu, 30 Aug 2007)

Log Message:
-----------
*bug fixes:
	-explode didn't take object time ipo into account
	-unified baking was missing an update call that was causing hair particles to crash and do strange things if current frame wasn't 1
	-particle instance modifier didn't work
	-guide curves
		*didn't produce a proper velocity
		*didn't work for baked particles without path visualization
	-hair weights were drawn wrong
	-current bakeable system flags weren't sometimes saved correctly
*new things:
	-explode modifier
		*take particle sizes into account
		*removed "use size" from explode modifier, since it didn't always produce predictable results
		*added a "protect" vgroup
		*better face - particle indexing (no "from face" distribution needed)
	-proper separation of initial rotation, and rotation caused by angular velocity (default initial rotation is now set to "none")
	-guide curves can allow "guide free time" for particles at the end of the particle life times

Modified Paths:
--------------
    branches/particles/source/blender/blenkernel/intern/dynamics_bake.c
    branches/particles/source/blender/blenkernel/intern/modifier.c
    branches/particles/source/blender/blenkernel/intern/particle.c
    branches/particles/source/blender/blenkernel/intern/particle_system.c
    branches/particles/source/blender/blenloader/intern/readfile.c
    branches/particles/source/blender/makesdna/DNA_modifier_types.h
    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/drawobject.c

Modified: branches/particles/source/blender/blenkernel/intern/dynamics_bake.c
===================================================================
--- branches/particles/source/blender/blenkernel/intern/dynamics_bake.c	2007-08-30 01:47:14 UTC (rev 11890)
+++ branches/particles/source/blender/blenkernel/intern/dynamics_bake.c	2007-08-30 15:26:00 UTC (rev 11891)
@@ -720,9 +720,9 @@
 				if(bsys->edit->brush==EB_BRUSH_WEIGHT){
 					BakeKeyParticle *ckey=(BakeKeyParticle*)bel->custom+(key[1]-bel->keys);
 					if(k==steps)
-						VecLerpf(cstate->col,sel_col,nosel_col,ckey->weight);
+						VecLerpf(cstate->col,nosel_col,sel_col,ckey->weight);
 					else
-						VecLerpf(cstate->col,sel_col,nosel_col,(1.0-keytime)*ckey->weight+keytime*(ckey+1)->weight);
+						VecLerpf(cstate->col,nosel_col,sel_col,(1.0-keytime)*ckey->weight+keytime*(ckey+1)->weight);
 				}
 				else{
 					BakeKey *belkeys = soft?sbel.keys:bel->keys;
@@ -1776,6 +1776,8 @@
 			/* handle any pending events before baking starts */
 			if(first){
 				DB_set_baking(bsys);
+				bsys->ob->recalc |= bacc->recalc_flag|OB_RECALC_TIME;
+				step=MIN2(step,bacc->get_timestep(bsys));
 				not_baked++;
 			}
 			else{

Modified: branches/particles/source/blender/blenkernel/intern/modifier.c
===================================================================
--- branches/particles/source/blender/blenkernel/intern/modifier.c	2007-08-30 01:47:14 UTC (rev 11890)
+++ branches/particles/source/blender/blenkernel/intern/modifier.c	2007-08-30 15:26:00 UTC (rev 11891)
@@ -5146,7 +5146,7 @@
 	}
 
 	if(pimd->ob){
-		psys = BLI_findlink(&ob->particlesystem,pimd->psys-1);
+		psys = BLI_findlink(&pimd->ob->particlesystem,pimd->psys-1);
 		if(psys==0 || psys->totpart==0)
 			return derivedData;
 	}
@@ -5171,7 +5171,7 @@
 	maxvert=totvert*totpart;
 	maxface=totface*totpart;
 	
-	bsys=DB_find_bsys(&ob->bakeable,(void*)psys);
+	bsys=DB_find_bsys(&pimd->ob->bakeable,(void*)psys);
 
 	psys->lattice=psys_get_lattice(bsys);
 
@@ -5294,8 +5294,7 @@
 	ExplodeModifierData *emd= (ExplodeModifierData*) md;
 
 	emd->facepa=0;
-	emd->flag |= eExplodeFlag_PaSize+eExplodeFlag_Unborn+
-					eExplodeFlag_Alive+eExplodeFlag_Dead;
+	emd->flag |= eExplodeFlag_Unborn+eExplodeFlag_Alive+eExplodeFlag_Dead;
 }
 static void explodeModifier_freeData(ModifierData *md)
 {
@@ -5315,6 +5314,31 @@
 {
 	return 1;
 }
+CustomDataMask explodeModifier_requiredDataMask(ModifierData *md)
+{
+	ExplodeModifierData *emd= (ExplodeModifierData*) md;
+	CustomDataMask dataMask = 0;
+
+	if(emd->vgroup)
+		dataMask |= (1 << CD_MDEFORMVERT);
+
+	return dataMask;
+}
+/* this should really be put somewhere permanently */
+static float vert_weight(MDeformVert *dvert, int group)
+{
+	MDeformWeight *dw;
+	int i;
+	
+	if(dvert) {
+		dw= dvert->dw;
+		for(i= dvert->totweight; i>0; i--, dw++) {
+			if(dw->def_nr == group) return dw->weight;
+			if(i==1) break; /*otherwise dw will point to somewhere it shouldn't*/
+		}
+	}
+	return 0.0;
+}
 static void explodeModifier_createFacepa(ExplodeModifierData *emd,
 										 ParticleSystemModifierData *psmd, DerivedMesh *dm)
 {
@@ -5322,9 +5346,10 @@
 	MFace *fa=0, *mface=0;
 	MVert *mvert = 0;
 	ParticleData *pa;
-	float *orco=0, *or, *center=0, *ce;
+	KDTreeNode *tree, *cur;
+	float center[3];
 	int *facepa=0,*vertpa=0,totvert=0,totface=0,totpart=0;
-	int i,p,filling=1,v1,v2,v3,v4,no_size=1;
+	int i,p,filling=1,v1,v2,v3,v4;
 
 	mvert = dm->getVertArray(dm);
 	mface = dm->getFaceArray(dm);
@@ -5332,6 +5357,8 @@
 	totvert= dm->getNumVerts(dm);
 	totpart= psmd->psys->totpart;
 
+	BLI_srandom(psys->seed);
+
 	if(emd->facepa)
 		MEM_freeN(emd->facepa);
 
@@ -5339,115 +5366,65 @@
 
 	vertpa = MEM_callocN(sizeof(int)*totvert, "explode_vertpa");
 
-	if(emd->flag & eExplodeFlag_PaSize){
-		no_size=0;
+	/* initialize all faces & verts to no particle */
+	for(i=0; i<totface; i++)
+		facepa[i]=totpart;
 
-		orco = MEM_callocN(sizeof(float)*3*totpart, "explode_orco");
-		center = MEM_callocN(sizeof(float)*3*totface, "explode_center");
+	for (i=0; i<totvert; i++)
+		vertpa[i]=totpart;
 
-		/* get particle orcos */
-		for(p=0,pa=psys->particles,or=orco; p<totpart; p++,pa++,or+=3)
-			psys_particle_on_emitter(psmd,psys->part->from,pa->num,pa->fuv,or,0,0,0);
-
-		/* get face centers */
-		for(i=0,ce=center,fa=mface; i<totface; i++,ce+=3,fa++){
-			VecAddf(ce,mvert[fa->v1].co,mvert[fa->v2].co);
-			VecAddf(ce,ce,mvert[fa->v3].co);
-			if(fa->v4){
-				VecAddf(ce,ce,mvert[fa->v4].co);
-				VecMulf(ce,0.25);
+	/* set protected verts */
+	if(emd->vgroup){
+		MDeformVert *dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
+		float val;
+		if(dvert){
+			for(i=0; i<totvert; i++){
+				val = BLI_frand();
+				val = (1.0f-emd->protect)*val + emd->protect*0.5f;
+				if(val < vert_weight(dvert+i,emd->vgroup-1))
+					vertpa[i] = -1;
 			}
-			else
-				VecMulf(ce,0.3333f);
 		}
-
 	}
 
-	/* initialize all faces & verts to no particle */
-	for(i=0; i<totface; i++){
-		facepa[i]=totpart;
+	/* make tree of emitter locations */
+	tree=alloc_kdtree(totpart);
+	for(p=0,pa=psys->particles,cur=tree; p<totpart; p++,pa++,cur++){
+		psys_particle_on_dm(dm,psys->part->from,pa->num,pa->fuv,cur->co,0,0,0);
+		cur->nbr=p;
+		if(p) insert_into_kdtree(tree,cur);
 	}
 
-	for (i=0; i<totvert; i++)
-		vertpa[i]=totpart;
+	/* set face-particle-indexes to nearest particle to face center */
+	for(i=0,fa=mface; i<totface; i++,fa++){
+		VecAddf(center,mvert[fa->v1].co,mvert[fa->v2].co);
+		VecAddf(center,center,mvert[fa->v3].co);
+		if(fa->v4){
+			VecAddf(center,center,mvert[fa->v4].co);
+			VecMulf(center,0.25);
+		}
+		else
+			VecMulf(center,0.3333f);
 
-	/* set particle faces and face vertices that emitted a particle */
-	for(p=0, pa=psmd->psys->particles; p<totpart; p++,pa++){
-		facepa[pa->num]=p;
+		p=find_nearest_in_kdtree(tree,center);
 
-		fa=mface+pa->num;
-		vertpa[fa->v1]=vertpa[fa->v2]=vertpa[fa->v3]=p;
+		v1=vertpa[fa->v1];
+		v2=vertpa[fa->v2];
+		v3=vertpa[fa->v3];
 		if(fa->v4)
-			vertpa[fa->v4]=p;
-	}
+			v4=vertpa[fa->v4];
 
-	/* fill in unset faces & verts */
-	while(filling){
-		filling=0;
-		for (i=0,fa=mface,ce=center; i<totface; i++,fa++,ce+=3) {
-			if(facepa[i]==totpart){
-				/* fill face from verts */
-				v1=vertpa[fa->v1];
-				v2=vertpa[fa->v2];
-				v3=vertpa[fa->v3];
-				if(fa->v4){
-					v4=vertpa[fa->v4];
+		if(v1>=0 && v2>=0 && v3>=0 && (fa->v4==0 || v4>=0))
+			facepa[i]=p;
 
-					/* only fill face if an edge verts share a value */
-					if(v1!=totpart && (v1==v2 || v1==v4) && (no_size || VecLenf(ce,orco+3*v1)<=psys->particles[v1].size)){
-						facepa[i]=v1;
-						filling++;
-					}
-					else if(v3!=totpart && (v2==v3 || v3==v4) && (no_size || VecLenf(ce,orco+3*v3)<=psys->particles[v3].size)){
-						facepa[i]=v3;
-						filling++;
-					}
-				}
-				else{
-					if(v1!=totpart && (v1==v2 || v1==v3) && (no_size || VecLenf(ce,orco+3*v1)<=psys->particles[v1].size)){
-						facepa[i]=v1;
-						filling++;
-					}
-					else if(v2!=totpart && v2==v3 && (no_size || VecLenf(ce,orco+3*v2)<=psys->particles[v2].size)){
-						facepa[i]=v2;
-						filling++;
-					}							
-				}
-			}
-			else{
-				/* fill verts from face */
-				vertpa[fa->v1]=vertpa[fa->v2]=vertpa[fa->v3]=facepa[i];
-				if(fa->v4)
-					vertpa[fa->v4]=facepa[i];
-			}
-		}
+		if(v1>=0) vertpa[fa->v1]=p;
+		if(v2>=0) vertpa[fa->v2]=p;
+		if(v3>=0) vertpa[fa->v3]=p;
+		if(fa->v4 && v4>=0) vertpa[fa->v4]=p;
 	}
-	/* final check for unset faces (can happen when every */
-	/* vert in face has different particle index) */
-	for (i=0,fa=mface,ce=center; i<totface; i++,fa++,ce+=3) {
-		if(facepa[i]==totpart){
-			/* fill face from verts */
-			v1=vertpa[fa->v1];
-			v2=vertpa[fa->v2];
-			v3=vertpa[fa->v3];
-			/* only fill face if an edge verts share a value */
-			if(v1!=totpart && (no_size || VecLenf(ce,orco+3*v1)<=psys->particles[v1].size))
-				facepa[i]=v1;
-			else if(v2!=totpart && (no_size || VecLenf(ce,orco+3*v2)<=psys->particles[v2].size))
-				facepa[i]=v2;
-			else if(v3!=totpart && (no_size || VecLenf(ce,orco+3*v3)<=psys->particles[v3].size))
-				facepa[i]=v3;
-			else if(fa->v4){
-				v4=vertpa[fa->v4];
-				if(v4!=totpart && (no_size || VecLenf(ce,orco+3*v4)<=psys->particles[v4].size))
-					facepa[i]=v4;
-			}
-		}
-	}
 
 	if(vertpa) MEM_freeN(vertpa);
-	if(orco) MEM_freeN(orco);
-	if(center) MEM_freeN(center);
+	free_kdtree(tree);
 }
 static DerivedMesh * explodeModifier_splitEdges(ExplodeModifierData *emd, DerivedMesh *dm){
 	DerivedMesh *splitdm;
@@ -5928,8 +5905,8 @@
 	ParticleData *pa, *pars=psmd->psys->particles;
 	ParticleKey state;
 	float *vertco=0, imat[4][4];
-	float loc0[3], nor[3], axis_rot[4], quat1[4]={1.0,0.0,0.0,0.0};
-	float timefac, timestep, cfra=bsystem_time(ob,(float)G.scene->r.cfra,0.0);
+	float loc0[3], nor[3], ob_quat[4], quat1[4]={1.0,0.0,0.0,0.0};
+	float timefac, timestep, cfra;
 	int *facepa=emd->facepa, *vertpa=0;
 	int totdup=0,totvert=0,totface=0,totpart=0;
 	int i, j, v, mindex=0;
@@ -5940,6 +5917,11 @@
 
 	timestep= psys_get_timestep(part);
 
+	if(part->flag & PART_GLOB_TIME)
+		cfra=bsystem_time(0,(float)G.scene->r.cfra,0.0);
+	else
+		cfra=bsystem_time(ob,(float)G.scene->r.cfra,0.0);
+
 	/* table for vertice <-> particle relations (row totpart+1 is for yet unexploded verts) */
 	vertpa = MEM_callocN(sizeof(int)*(totpart+1)*totvert, "explode_vertpatab");
 	for(i=0; i<(totpart+1)*totvert; i++)
@@ -5971,60 +5953,61 @@
 	explode= CDDM_from_template(dm, totdup, 0,totface);
 	dupvert= CDDM_get_verts(explode);
 
-	/* getting to object space */
+	/* getting back to object space */
 	Mat4Invert(imat,ob->obmat);
 
 	psmd->psys->lattice=psys_get_lattice(DB_find_bsys(&ob->bakeable,psmd->psys));
 
 	/*duplicate & displace vertices*/
 	for(i=0, pa=pars; i<=totpart; i++, pa++){
-		if(i==totpart){
-			/* quat1+1 is zero vec */
-			VECCOPY(loc0,quat1+1);
-			VECCOPY(state.co,quat1+1);
-			QUATCOPY(state.rot,quat1);
-		}
-		else{
+		//if(i==totpart){
+		//	/* quat1+1 is zero vec */
+		//	VECCOPY(loc0,quat1+1);
+		//	VECCOPY(state.co,quat1+1);
+		//	QUATCOPY(state.rot,quat1);
+		//}
+		//else{
+		if(i!=totpart){
 			psys_particle_on_emitter(psmd,part->from,pa->num,pa->fuv,loc0,nor,0,0);
-			state.time=-1.0;
+			Mat4MulVecfl(ob->obmat,loc0);
+
+			state.time=cfra;
 			psys_get_particle_state(ob,psmd->psys,i,&state,1);
-			VECADD(state.vel,state.vel,state.co);
-			Mat4MulVecfl(imat,state.co);
 			//rotfac=VecLength(state.ave);
 
-			if((part->flag & PART_ROT_DYN)==0){
-				if(cfra < pa->dietime)
-					timefac=(cfra-pa->time)*timestep;
-				else

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list