diff options
author | Ton Roosendaal <ton@blender.org> | 2005-12-11 17:28:22 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2005-12-11 17:28:22 +0300 |
commit | d3113b51841486f24a22e257d803dac77132e040 (patch) | |
tree | 67db338df65d8adeb0a12bbf8fa8a468bd427fad /source | |
parent | feb14b9b663f38e74db9c99fbeec8e3ccf68e4c1 (diff) |
Orange: made duplicators work for dynamic particle systems. Meaning; a
particle generator can be duplicated.
Note that the particles are only generated once, on the original, and just
get duplicated.
For static particles it worked already OK.
Added note for previous grouping commit; group-duplicators should support
fully all animation systems, including modifiers and particles.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/intern/depsgraph.c | 25 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/effect.c | 1 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_effect_types.h | 1 | ||||
-rw-r--r-- | source/blender/renderconverter/intern/convertBlenderScene.c | 19 | ||||
-rw-r--r-- | source/blender/src/drawobject.c | 9 |
5 files changed, 34 insertions, 21 deletions
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c index 18c8de24feb..cdc3bb506c1 100644 --- a/source/blender/blenkernel/intern/depsgraph.c +++ b/source/blender/blenkernel/intern/depsgraph.c @@ -1582,17 +1582,22 @@ static void dag_object_time_update_flags(Object *ob) ob->shapeflag &= ~OB_SHAPE_TEMPLOCK; } } - else if(ob->effect.first) { - Effect *eff= ob->effect.first; - if(eff->type==EFF_WAVE) ob->recalc |= OB_RECALC_DATA; - } - if((ob->fluidsimFlag & OB_FLUIDSIM_ENABLE) && (ob->fluidsimSettings)) { - // fluidsimSettings might not be initialized during load... - if(ob->fluidsimSettings->type & OB_FLUIDSIM_DOMAIN) { - ob->recalc |= OB_RECALC_DATA; // NT - } + else if(ob->effect.first) { + Effect *eff= ob->effect.first; + PartEff *paf= give_parteff(ob); + + if(eff->type==EFF_WAVE) + ob->recalc |= OB_RECALC_DATA; + if(paf && paf->keys==NULL) + ob->recalc |= OB_RECALC_DATA; + } + if((ob->fluidsimFlag & OB_FLUIDSIM_ENABLE) && (ob->fluidsimSettings)) { + // fluidsimSettings might not be initialized during load... + if(ob->fluidsimSettings->type & OB_FLUIDSIM_DOMAIN) { + ob->recalc |= OB_RECALC_DATA; // NT } - break; + } + break; case OB_CURVE: case OB_SURF: cu= ob->data; diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c index 1660eec2111..fc27de989dc 100644 --- a/source/blender/blenkernel/intern/effect.c +++ b/source/blender/blenkernel/intern/effect.c @@ -1652,6 +1652,7 @@ void build_particle_system(Object *ob) /* matrix invert for static too */ Mat4Invert(ob->imat, ob->obmat); + Mat4CpyMat4(paf->imat, ob->imat); /* used for duplicators */ /* new random generator */ rng = rng_new(paf->seed); diff --git a/source/blender/makesdna/DNA_effect_types.h b/source/blender/makesdna/DNA_effect_types.h index 86ffb0fc4ad..571f87ae33f 100644 --- a/source/blender/makesdna/DNA_effect_types.h +++ b/source/blender/makesdna/DNA_effect_types.h @@ -126,6 +126,7 @@ typedef struct PartEff { short disp, vertgroup_v; char vgroupname[32], vgroupname_v[32]; + float imat[4][4]; /* inverse matrix of parent Object */ Particle *keys; struct Group *group; diff --git a/source/blender/renderconverter/intern/convertBlenderScene.c b/source/blender/renderconverter/intern/convertBlenderScene.c index 4bef6f890d0..0f200a9e0e1 100644 --- a/source/blender/renderconverter/intern/convertBlenderScene.c +++ b/source/blender/renderconverter/intern/convertBlenderScene.c @@ -889,7 +889,7 @@ static void render_particle_system(Object *ob, PartEff *paf) Particle *pa=0; HaloRen *har=0; Material *ma=0; - float xn, yn, zn, imat[3][3], mat[4][4], hasize, stime, ptime, ctime, vec[3], vec1[3], view[3], nor[3]; + float xn, yn, zn, imat[3][3], tmat[4][4], mat[4][4], hasize, stime, ptime, ctime, vec[3], vec1[3], view[3], nor[3]; int a, mat_nr=1, seed; pa= paf->keys; @@ -900,12 +900,16 @@ static void render_particle_system(Object *ob, PartEff *paf) } ma= give_render_material(ob, paf->omat); - + MTC_Mat4MulMat4(mat, ob->obmat, R.viewmat); MTC_Mat4Invert(ob->imat, mat); /* this is correct, for imat texture */ - MTC_Mat4Invert(mat, R.viewmat); /* particles do not have a ob transform anymore */ - MTC_Mat3CpyMat4(imat, mat); + /* enable duplicators to work */ + Mat4MulMat4(tmat, paf->imat, ob->obmat); + MTC_Mat4MulMat4(mat, tmat, R.viewmat); + + MTC_Mat4Invert(tmat, mat); + MTC_Mat3CpyMat4(imat, tmat); R.flag |= R_HALO; @@ -935,13 +939,13 @@ static void render_particle_system(Object *ob, PartEff *paf) /* watch it: also calculate the normal of a particle */ if(paf->stype==PAF_VECT || ma->mode & MA_HALO_SHADE) { where_is_particle(paf, pa, stime, vec); - MTC_Mat4MulVecfl(R.viewmat, vec); + MTC_Mat4MulVecfl(mat, vec); where_is_particle(paf, pa, ptime, vec1); - MTC_Mat4MulVecfl(R.viewmat, vec1); + MTC_Mat4MulVecfl(mat, vec1); } else { where_is_particle(paf, pa, ctime, vec); - MTC_Mat4MulVecfl(R.viewmat, vec); + MTC_Mat4MulVecfl(mat, vec); } if(pa->mat_nr != mat_nr) { @@ -1492,7 +1496,6 @@ static void init_render_mesh(Object *ob) if(need_orco) orco = get_object_orco(ob); - /* duplicators don't call modifier stack */ dm = mesh_create_derived_render(ob); dm_needsfree= 1; diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c index b4bdd066ed4..9cbd22b781e 100644 --- a/source/blender/src/drawobject.c +++ b/source/blender/src/drawobject.c @@ -2470,17 +2470,19 @@ static int drawDispList(Base *base, int dt) static void draw_particle_system(Object *ob, PartEff *paf) { Particle *pa; - float ptime, ctime, vec[3], vec1[3]; + float ptime, ctime, vec[3], vec1[3], mat[4][4]; int a, totpart; pa= paf->keys; - if(pa==0) { + if(pa==NULL) { build_particle_system(ob); pa= paf->keys; - if(pa==0) return; + if(pa==NULL) return; } myloadmatrix(G.vd->viewmat); + Mat4MulMat4(mat, paf->imat, ob->obmat); + mymultmatrix(mat); if(ob->ipoflag & OB_OFFS_PARTICLE) ptime= ob->sf; else ptime= 0.0; @@ -2517,6 +2519,7 @@ static void draw_particle_system(Object *ob, PartEff *paf) } if(paf->stype!=PAF_VECT) glEnd(); + myloadmatrix(G.vd->viewmat); mymultmatrix(ob->obmat); // bring back local matrix for dtx } |