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>2004-10-15 02:20:42 +0400
committerTon Roosendaal <ton@blender.org>2004-10-15 02:20:42 +0400
commit61f738e0f3a96dddd235655db0359ffcaa7105fb (patch)
treec35f11b72a5a0030789bd8dd7a56dade2db28876 /source/blender/renderconverter
parent9b82ff3d0014b53347d286a869894bfbfa9ae6a3 (diff)
Bug fix & new feature;
http://www.blender3d.org/cms/Particle_duplicators.443.0.html Static particle systems now can also duplicate children (Dupli Vert). Even ipo's for children are evaluated correctly then, nice stuff :)
Diffstat (limited to 'source/blender/renderconverter')
-rw-r--r--source/blender/renderconverter/intern/convertBlenderScene.c104
1 files changed, 69 insertions, 35 deletions
diff --git a/source/blender/renderconverter/intern/convertBlenderScene.c b/source/blender/renderconverter/intern/convertBlenderScene.c
index 912d44fee88..28fec81b491 100644
--- a/source/blender/renderconverter/intern/convertBlenderScene.c
+++ b/source/blender/renderconverter/intern/convertBlenderScene.c
@@ -949,6 +949,8 @@ static void render_static_particle_system(Object *ob, PartEff *paf)
Particle *pa=0;
HaloRen *har=0;
Material *ma=0;
+ VertRen *v1= NULL;
+ VlakRen *vlr;
float xn, yn, zn, imat[3][3], mat[4][4], hasize;
float mtime, ptime, ctime, vec[3], vec1[3], view[3], nor[3];
int a, mat_nr=1;
@@ -957,11 +959,11 @@ static void render_static_particle_system(Object *ob, PartEff *paf)
if(pa==NULL || (paf->flag & PAF_ANIMATED)) {
build_particle_system(ob);
pa= paf->keys;
- if(pa==0) return;
+ if(pa==NULL) return;
}
ma= give_render_material(ob, 1);
- if(ma==0) ma= &defmaterial;
+ if(ma==NULL) ma= &defmaterial;
MTC_Mat4MulMat4(mat, ob->obmat, R.viewmat);
MTC_Mat4Invert(ob->imat, mat); /* need to be that way, for imat texture */
@@ -987,7 +989,6 @@ static void render_static_particle_system(Object *ob, PartEff *paf)
/* make sure hair grows until the end.. */
if(ctime>pa->time+pa->lifetime) ctime= pa->time+pa->lifetime;
-
/* watch it: also calc the normal of a particle */
if(paf->stype==PAF_VECT || ma->mode & MA_HALO_SHADE) {
where_is_particle(paf, pa, ctime+1.0, vec);
@@ -1004,44 +1005,73 @@ static void render_static_particle_system(Object *ob, PartEff *paf)
if(ma==0) ma= &defmaterial;
}
- if(ma->ipo) {
- /* correction for lifetime */
- ptime= 100.0*(ctime-pa->time)/pa->lifetime;
- calc_ipo(ma->ipo, ptime);
- execute_ipo((ID *)ma, ma->ipo);
+ if(ma->mode & MA_WIRE) {
+ if(ctime == pa->time) {
+ v1= RE_findOrAddVert(R.totvert++);
+ VECCOPY(v1->co, vec);
+ }
+ else {
+ float cvec[3]={-1.0, 0.0, 0.0};
+
+ vlr= RE_findOrAddVlak(R.totvlak++);
+ vlr->ob= ob;
+ vlr->v1= v1;
+ vlr->v2= RE_findOrAddVert(R.totvert++);
+ vlr->v3= vlr->v2;
+ vlr->v4= NULL;
+
+ v1= vlr->v2; // cycle
+ VECCOPY(v1->co, vec);
+
+ VecSubf(vlr->n, vec, vec1);
+ Normalise(vlr->n);
+ VECCOPY(v1->n, vlr->n);
+
+ vlr->mat= ma;
+ vlr->ec= ME_V1V2;
+ vlr->lay= ob->lay;
+ }
}
+ else {
+ if(ma->ipo) {
+ /* correction for lifetime */
+ ptime= 100.0*(ctime-pa->time)/pa->lifetime;
+ calc_ipo(ma->ipo, ptime);
+ execute_ipo((ID *)ma, ma->ipo);
+ }
- hasize= ma->hasize;
+ hasize= ma->hasize;
- if(ma->mode & MA_HALOPUNO) {
- xn= pa->no[0];
- yn= pa->no[1];
- zn= pa->no[2];
+ if(ma->mode & MA_HALOPUNO) {
+ xn= pa->no[0];
+ yn= pa->no[1];
+ zn= pa->no[2];
- /* transpose ! */
- nor[0]= imat[0][0]*xn+imat[0][1]*yn+imat[0][2]*zn;
- nor[1]= imat[1][0]*xn+imat[1][1]*yn+imat[1][2]*zn;
- nor[2]= imat[2][0]*xn+imat[2][1]*yn+imat[2][2]*zn;
- Normalise(nor);
+ /* transpose ! */
+ nor[0]= imat[0][0]*xn+imat[0][1]*yn+imat[0][2]*zn;
+ nor[1]= imat[1][0]*xn+imat[1][1]*yn+imat[1][2]*zn;
+ nor[2]= imat[2][0]*xn+imat[2][1]*yn+imat[2][2]*zn;
+ Normalise(nor);
- VECCOPY(view, vec);
- Normalise(view);
+ VECCOPY(view, vec);
+ Normalise(view);
- zn= nor[0]*view[0]+nor[1]*view[1]+nor[2]*view[2];
- if(zn>=0.0) hasize= 0.0;
- else hasize*= zn*zn*zn*zn;
- }
+ zn= nor[0]*view[0]+nor[1]*view[1]+nor[2]*view[2];
+ if(zn>=0.0) hasize= 0.0;
+ else hasize*= zn*zn*zn*zn;
+ }
- if(paf->stype==PAF_VECT) har= RE_inithalo(ma, vec, vec1, pa->co, hasize, paf->vectsize);
- else {
- har= RE_inithalo(ma, vec, 0, pa->co, hasize, 0);
- if(har && (ma->mode & MA_HALO_SHADE)) {
- VecSubf(har->no, vec, vec1);
- Normalise(har->no);
- har->lay= ob->lay;
+ if(paf->stype==PAF_VECT) har= RE_inithalo(ma, vec, vec1, pa->co, hasize, paf->vectsize);
+ else {
+ har= RE_inithalo(ma, vec, 0, pa->co, hasize, 0);
+ if(har && (ma->mode & MA_HALO_SHADE)) {
+ VecSubf(har->no, vec, vec1);
+ Normalise(har->no);
+ har->lay= ob->lay;
+ }
}
}
-
+
VECCOPY(vec1, vec);
}
ma->ren->seed1++;
@@ -1254,6 +1284,7 @@ static void init_render_mesh(Object *ob)
if(paf) {
if(paf->flag & PAF_STATIC) render_static_particle_system(ob, paf);
else render_particle_system(ob, paf);
+ mesh_modifier(ob, 'e'); // end
return;
}
@@ -1261,8 +1292,11 @@ static void init_render_mesh(Object *ob)
MTC_Mat4Invert(ob->imat, mat);
MTC_Mat3CpyMat4(imat, ob->imat);
- if(me->totvert==0) return;
-
+ if(me->totvert==0) {
+ mesh_modifier(ob, 'e'); // end
+ return;
+ }
+
totvlako= R.totvlak;
totverto= R.totvert;
@@ -1743,7 +1777,7 @@ void RE_add_render_lamp(Object *ob, int doshadbuf)
lar->mode &= ~LA_SHAD_RAY;
}
}
-
+
lar->org= MEM_dupallocN(lar);
}