[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