Revision: 19518
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19518
Author:   jhk
Date:     2009-04-03 16:50:54 +0200 (Fri, 03 Apr 2009)

Log Message:
-----------
Major cleanup of particle render & drawing code. No new features and hopefully 
no new bugs.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_particle.h
    trunk/blender/source/blender/blenkernel/intern/particle.c
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/src/drawobject.c

Modified: trunk/blender/source/blender/blenkernel/BKE_particle.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_particle.h      2009-04-03 
14:41:31 UTC (rev 19517)
+++ trunk/blender/source/blender/blenkernel/BKE_particle.h      2009-04-03 
14:50:54 UTC (rev 19518)
@@ -188,6 +188,19 @@
        int num, tot;
 } ParticleThread;
 
+typedef struct ParticleBillboardData
+{
+       struct Object *ob;
+       float vec[3], vel[3];
+       float offset[2];
+       float size, tilt, random, time;
+       int uv[3];
+       int lock, num;
+       int totnum;
+       short align, uv_split, anim, split_offset;
+}
+ParticleBillboardData;
+
 /* ----------- functions needed outside particlesystem ---------------- */
 /* particle.c */
 int count_particles(struct ParticleSystem *psys);
@@ -260,6 +273,8 @@
 void psys_thread_distribute_particle(ParticleThread *thread, struct 
ParticleData *pa, struct ChildParticle *cpa, int p);
 void psys_thread_create_path(ParticleThread *thread, struct ChildParticle 
*cpa, ParticleCacheKey *keys, int i);
 
+void psys_make_billboard(ParticleBillboardData *bb, float xvec[3], float 
yvec[3], float zvec[3], float center[3]);
+
 /* particle_system.c */
 int psys_count_keyed_targets(struct Object *ob, struct ParticleSystem *psys);
 void psys_get_reactor_target(struct Object *ob, struct ParticleSystem *psys, 
struct Object **target_ob, struct ParticleSystem **target_psys);

Modified: trunk/blender/source/blender/blenkernel/intern/particle.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle.c   2009-04-03 
14:41:31 UTC (rev 19517)
+++ trunk/blender/source/blender/blenkernel/intern/particle.c   2009-04-03 
14:50:54 UTC (rev 19518)
@@ -3868,3 +3868,76 @@
 
        *scale= len;
 }
+
+void psys_make_billboard(ParticleBillboardData *bb, float xvec[3], float 
yvec[3], float zvec[3], float center[3])
+{
+       float onevec[3] = {0.0f,0.0f,0.0f}, tvec[3], tvec2[3];
+
+       xvec[0] = 1.0f; xvec[1] = 0.0f; xvec[2] = 0.0f;
+       yvec[0] = 0.0f; yvec[1] = 1.0f; yvec[2] = 0.0f;
+
+       if(bb->align < PART_BB_VIEW)
+               onevec[bb->align]=1.0f;
+
+       if(bb->lock && (bb->align == PART_BB_VIEW)) {
+               VECCOPY(xvec, bb->ob->obmat[0]);
+               Normalize(xvec);
+
+               VECCOPY(yvec, bb->ob->obmat[1]);
+               Normalize(yvec);
+
+               VECCOPY(zvec, bb->ob->obmat[2]);
+               Normalize(zvec);
+       }
+       else if(bb->align == PART_BB_VEL) {
+               float temp[3];
+
+               VECCOPY(temp, bb->vel);
+               Normalize(temp);
+
+               VECSUB(zvec, bb->ob->obmat[3], bb->vec);
+
+               if(bb->lock) {
+                       float fac = -Inpf(zvec, temp);
+
+                       VECADDFAC(zvec, zvec, temp, fac);
+               }
+               Normalize(zvec);
+
+               Crossf(xvec,temp,zvec);
+               Normalize(xvec);
+
+               Crossf(yvec,zvec,xvec);
+       }
+       else {
+               VECSUB(zvec, bb->ob->obmat[3], bb->vec);
+               if(bb->lock)
+                       zvec[bb->align] = 0.0f;
+               Normalize(zvec);
+
+               if(bb->align < PART_BB_VIEW)
+                       Crossf(xvec, onevec, zvec);
+               else
+                       Crossf(xvec, bb->ob->obmat[1], zvec);
+               Normalize(xvec);
+
+               Crossf(yvec,zvec,xvec);
+       }
+
+       VECCOPY(tvec, xvec);
+       VECCOPY(tvec2, yvec);
+
+       VecMulf(xvec, cos(bb->tilt * (float)M_PI));
+       VecMulf(tvec2, sin(bb->tilt * (float)M_PI));
+       VECADD(xvec, xvec, tvec2);
+
+       VecMulf(yvec, cos(bb->tilt * (float)M_PI));
+       VecMulf(tvec, -sin(bb->tilt * (float)M_PI));
+       VECADD(yvec, yvec, tvec);
+
+       VecMulf(xvec, bb->size);
+       VecMulf(yvec, bb->size);
+
+       VECADDFAC(center, bb->vec, xvec, bb->offset[0]);
+       VECADDFAC(center, center, yvec, bb->offset[1]);
+}
\ No newline at end of file

Modified: trunk/blender/source/blender/render/intern/source/convertblender.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/convertblender.c  
2009-04-03 14:41:31 UTC (rev 19517)
+++ trunk/blender/source/blender/render/intern/source/convertblender.c  
2009-04-03 14:50:54 UTC (rev 19518)
@@ -947,11 +947,17 @@
 /* ------------------------------------------------------------------------- */
 /* Particles                                                                 */
 /* ------------------------------------------------------------------------- */
-
+typedef struct ParticleStrandData
+{
+       struct MCol *mcol;
+       float *orco, *uvco, *surfnor;
+       float time, adapt_angle, adapt_pix, size;
+       int totuv, totcol;
+       int first, line, adapt, override_uv;
+}
+ParticleStrandData;
 /* future thread problem... */
-static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, 
float *orco, float *surfnor,
-                                                                  float *uvco, 
int totuv, MCol *mcol, int totcol, float *vec, float *vec1, float ctime,
-                                                                  int first, 
int line, int adapt, float adapt_angle, float adapt_pix, int override_uv)
+static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, 
ParticleStrandData *sd, float *vec, float *vec1)
 {
        static VertRen *v1= NULL, *v2= NULL;
        VlakRen *vlr;
@@ -974,11 +980,11 @@
                float fac;
                if(ma->strand_ease!=0.0f) {
                        if(ma->strand_ease<0.0f)
-                               fac= pow(ctime, 1.0+ma->strand_ease);
+                               fac= pow(sd->time, 1.0+ma->strand_ease);
                        else
-                               fac= pow(ctime, 1.0/(1.0f-ma->strand_ease));
+                               fac= pow(sd->time, 1.0/(1.0f-ma->strand_ease));
                }
-               else fac= ctime;
+               else fac= sd->time;
 
                width= ((1.0f-fac)*ma->strand_sta + (fac)*ma->strand_end);
 
@@ -1010,7 +1016,7 @@
                flag |= R_STRAND;
        
        /* single face line */
-       if(line) {
+       if(sd->line) {
                vlr= RE_findOrAddVlak(obr, obr->totvlak++);
                vlr->flag= flag;
                vlr->v1= RE_findOrAddVert(obr, obr->totvert++);
@@ -1021,25 +1027,25 @@
                VECCOPY(vlr->v1->co, vec);
                VecAddf(vlr->v1->co, vlr->v1->co, cross);
                VECCOPY(vlr->v1->n, nor);
-               vlr->v1->orco= orco;
+               vlr->v1->orco= sd->orco;
                vlr->v1->accum= -1.0f;  // accum abuse for strand texco
                
                VECCOPY(vlr->v2->co, vec);
                VecSubf(vlr->v2->co, vlr->v2->co, cross);
                VECCOPY(vlr->v2->n, nor);
-               vlr->v2->orco= orco;
+               vlr->v2->orco= sd->orco;
                vlr->v2->accum= vlr->v1->accum;
 
                VECCOPY(vlr->v4->co, vec1);
                VecAddf(vlr->v4->co, vlr->v4->co, cross);
                VECCOPY(vlr->v4->n, nor);
-               vlr->v4->orco= orco;
+               vlr->v4->orco= sd->orco;
                vlr->v4->accum= 1.0f;   // accum abuse for strand texco
                
                VECCOPY(vlr->v3->co, vec1);
                VecSubf(vlr->v3->co, vlr->v3->co, cross);
                VECCOPY(vlr->v3->n, nor);
-               vlr->v3->orco= orco;
+               vlr->v3->orco= sd->orco;
                vlr->v3->accum= vlr->v4->accum;
 
                CalcNormFloat4(vlr->v4->co, vlr->v3->co, vlr->v2->co, 
vlr->v1->co, vlr->n);
@@ -1047,23 +1053,23 @@
                vlr->mat= ma;
                vlr->ec= ME_V2V3;
 
-               if(surfnor) {
+               if(sd->surfnor) {
                        float *snor= RE_vlakren_get_surfnor(obr, vlr, 1);
-                       VECCOPY(snor, surfnor);
+                       VECCOPY(snor, sd->surfnor);
                }
 
-               if(uvco){
-                       for(i=0; i<totuv; i++){
+               if(sd->uvco){
+                       for(i=0; i<sd->totuv; i++){
                                MTFace *mtf;
                                mtf=RE_vlakren_get_tface(obr,vlr,i,NULL,1);
                                mtf->uv[0][0]=mtf->uv[1][0]=
-                               mtf->uv[2][0]=mtf->uv[3][0]=(uvco+2*i)[0];
+                               mtf->uv[2][0]=mtf->uv[3][0]=(sd->uvco+2*i)[0];
                                mtf->uv[0][1]=mtf->uv[1][1]=
-                               mtf->uv[2][1]=mtf->uv[3][1]=(uvco+2*i)[1];
+                               mtf->uv[2][1]=mtf->uv[3][1]=(sd->uvco+2*i)[1];
                        }
-                       if(override_uv>=0){
+                       if(sd->override_uv>=0){
                                MTFace *mtf;
-                               
mtf=RE_vlakren_get_tface(obr,vlr,override_uv,NULL,0);
+                               
mtf=RE_vlakren_get_tface(obr,vlr,sd->override_uv,NULL,0);
                                
                                mtf->uv[0][0]=mtf->uv[3][0]=0.0f;
                                mtf->uv[1][0]=mtf->uv[2][0]=1.0f;
@@ -1072,18 +1078,18 @@
                                mtf->uv[2][1]=mtf->uv[3][1]=1.0f;
                        }
                }
-               if(mcol){
-                       for(i=0; i<totcol; i++){
+               if(sd->mcol){
+                       for(i=0; i<sd->totcol; i++){
                                MCol *mc;
                                mc=RE_vlakren_get_mcol(obr,vlr,i,NULL,1);
-                               mc[0]=mc[1]=mc[2]=mc[3]=mcol[i];
-                               mc[0]=mc[1]=mc[2]=mc[3]=mcol[i];
+                               mc[0]=mc[1]=mc[2]=mc[3]=sd->mcol[i];
+                               mc[0]=mc[1]=mc[2]=mc[3]=sd->mcol[i];
                        }
                }
        }
        /* first two vertices of a strand */
-       else if(first) {
-               if(adapt){
+       else if(sd->first) {
+               if(sd->adapt){
                        VECCOPY(anor, nor);
                        VECCOPY(avec, vec);
                        second=1;
@@ -1095,18 +1101,18 @@
                VECCOPY(v1->co, vec);
                VecAddf(v1->co, v1->co, cross);
                VECCOPY(v1->n, nor);
-               v1->orco= orco;
+               v1->orco= sd->orco;
                v1->accum= -1.0f;       // accum abuse for strand texco
                
                VECCOPY(v2->co, vec);
                VecSubf(v2->co, v2->co, cross);
                VECCOPY(v2->n, nor);
-               v2->orco= orco;
+               v2->orco= sd->orco;
                v2->accum= v1->accum;
        }
        /* more vertices & faces to strand */
        else {
-               if(adapt==0 || second){
+               if(sd->adapt==0 || second){
                        vlr= RE_findOrAddVlak(obr, obr->totvlak++);
                        vlr->flag= flag;
                        vlr->v1= v1;
@@ -1118,14 +1124,14 @@
                        v2= vlr->v3; // cycle
 
                        
-                       if(adapt){
+                       if(sd->adapt){
                                second=0;
                                VECCOPY(anor,nor);
                                VECCOPY(avec,vec);
                        }
 
                }
-               else if(adapt){
+               else if(sd->adapt){
                        float dvec[3],pvec[3];
                        VecSubf(dvec,avec,vec);
                        Projf(pvec,dvec,vec);
@@ -1135,7 +1141,7 @@
                        dx= re->winx*dvec[0]*re->winmat[0][0]/w;
                        dy= re->winy*dvec[1]*re->winmat[1][1]/w;
                        w= sqrt(dx*dx + dy*dy);
-                       if(Inpf(anor,nor)<adapt_angle && w>adapt_pix){
+                       if(Inpf(anor,nor)<sd->adapt_angle && w>sd->adapt_pix){
                                vlr= RE_findOrAddVlak(obr, obr->totvlak++);
                                vlr->flag= flag;
                                vlr->v1= v1;
@@ -1157,13 +1163,13 @@
                VECCOPY(vlr->v4->co, vec);
                VecAddf(vlr->v4->co, vlr->v4->co, cross);
                VECCOPY(vlr->v4->n, nor);
-               vlr->v4->orco= orco;
-               vlr->v4->accum= -1.0f + 2.0f*ctime;     // accum abuse for 
strand texco
+               vlr->v4->orco= sd->orco;
+               vlr->v4->accum= -1.0f + 2.0f*sd->time;  // accum abuse for 
strand texco
                
                VECCOPY(vlr->v3->co, vec);
                VecSubf(vlr->v3->co, vlr->v3->co, cross);
                VECCOPY(vlr->v3->n, nor);
-               vlr->v3->orco= orco;
+               vlr->v3->orco= sd->orco;
                vlr->v3->accum= vlr->v4->accum;
                
                CalcNormFloat4(vlr->v4->co, vlr->v3->co, vlr->v2->co, 
vlr->v1->co, vlr->n);
@@ -1171,23 +1177,23 @@
                vlr->mat= ma;
                vlr->ec= ME_V2V3;
 
-               if(surfnor) {
+               if(sd->surfnor) {
                        float *snor= RE_vlakren_get_surfnor(obr, vlr, 1);
-                       VECCOPY(snor, surfnor);
+                       VECCOPY(snor, sd->surfnor);
                }
 
-               if(uvco){
-                       for(i=0; i<totuv; i++){
+               if(sd->uvco){
+                       for(i=0; i<sd->totuv; i++){
                                MTFace *mtf;
                                mtf=RE_vlakren_get_tface(obr,vlr,i,NULL,1);
                                mtf->uv[0][0]=mtf->uv[1][0]=
-                               mtf->uv[2][0]=mtf->uv[3][0]=(uvco+2*i)[0];
+                               mtf->uv[2][0]=mtf->uv[3][0]=(sd->uvco+2*i)[0];
                                mtf->uv[0][1]=mtf->uv[1][1]=
-                               mtf->uv[2][1]=mtf->uv[3][1]=(uvco+2*i)[1];
+                               mtf->uv[2][1]=mtf->uv[3][1]=(sd->uvco+2*i)[1];
                        }
-                       if(override_uv>=0){
+                       if(sd->override_uv>=0){
                                MTFace *mtf;
-                               
mtf=RE_vlakren_get_tface(obr,vlr,override_uv,NULL,0);
+                               
mtf=RE_vlakren_get_tface(obr,vlr,sd->override_uv,NULL,0);
                                
                                mtf->uv[0][0]=mtf->uv[3][0]=0.0f;

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to