Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2005-12-11 17:28:22 +0300
committerTon Roosendaal <ton@blender.org>2005-12-11 17:28:22 +0300
commitd3113b51841486f24a22e257d803dac77132e040 (patch)
tree67db338df65d8adeb0a12bbf8fa8a468bd427fad
parentfeb14b9b663f38e74db9c99fbeec8e3ccf68e4c1 (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.
-rw-r--r--source/blender/blenkernel/intern/depsgraph.c25
-rw-r--r--source/blender/blenkernel/intern/effect.c1
-rw-r--r--source/blender/makesdna/DNA_effect_types.h1
-rw-r--r--source/blender/renderconverter/intern/convertBlenderScene.c19
-rw-r--r--source/blender/src/drawobject.c9
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
}