From 66918b3add4dfc90a8074f4bdc1c797ae9bf1371 Mon Sep 17 00:00:00 2001 From: Janne Karhu Date: Sat, 4 Jul 2009 03:50:12 +0000 Subject: A bunch of fun stuff now possible because of new pointcache code: * Baked normal particles can now use the "Path" visualization. * Path "max length" & "abs length" are now history: - New option to set path start & end times + random variation to length. - Much more flexible (and calculated better) than previous options. - This works with parents, children, hair & normal particles unlike old length option. - Only known issue for now is that children from faces don't get calculated correctly when using path start time. * New option "trails" for "halo", "line" and "billboard" visualizations: - Draws user controllable number of particle instances along particles path backwards from current position. - Works with children too for cool/weird visualizations that weren't possible before. * Normal particle children's velocities are now approximated better when needed so that "line" visualization trails will look nice. * New particle instance modifier options: - "path"-option works better and has controllable (max)position along path (with random variation possible). - "keep shape"-option for hair, keyed, or baked particles allows to place the instances to a single point (with random variation possible) along particle path. - "axis" option to make rotation handling better (still not perfect, but will have to do for now). Some fixes & cleanup done along the way: * Random path length didn't work for non-child particles. * Cached & unborn particles weren't reset to emit locations. * Particle numbers weren't drawn in the correct place. * Setting proper render & draw visualizations was lost somewhere when initializing new particle settings. * Changing child mode wasn't working correctly. * Some cleanup & modularization of particle child effector code and particle drawing & rendering code. * Object & group visualizations didn't work. * Child simplification didn't work. --- source/blender/editors/space_view3d/drawobject.c | 549 +++++++++++++++-------- 1 file changed, 361 insertions(+), 188 deletions(-) (limited to 'source/blender/editors/space_view3d/drawobject.c') diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 05490e2fce1..b38575b5ceb 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -2941,6 +2941,228 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas return retval; } +/* *********** text drawing for particles ************* */ +static ListBase pstrings= {NULL, NULL}; + +typedef struct ViewParticleString { + struct ViewParticleString *next, *prev; + float vec[3], col[4]; + char str[128]; + short mval[2]; + short xoffs; +} ViewParticleString; + + +void view3d_particle_text_draw_add(float x, float y, float z, char *str, short xoffs) +{ + ViewObjectString *vos= MEM_callocN(sizeof(ViewObjectString), "ViewObjectString"); + + BLI_addtail(&pstrings, vos); + BLI_strncpy(vos->str, str, 128); + vos->vec[0]= x; + vos->vec[1]= y; + vos->vec[2]= z; + glGetFloatv(GL_CURRENT_COLOR, vos->col); + vos->xoffs= xoffs; +} + +static void view3d_particle_text_draw(View3D *v3d, ARegion *ar) +{ + ViewObjectString *vos; + int tot= 0; + + /* project first and test */ + for(vos= pstrings.first; vos; vos= vos->next) { + project_short(ar, vos->vec, vos->mval); + if(vos->mval[0]!=IS_CLIPPED) + tot++; + } + + if(tot) { + RegionView3D *rv3d= ar->regiondata; + int a; + + if(rv3d->rflag & RV3D_CLIPPING) + for(a=0; a<6; a++) + glDisable(GL_CLIP_PLANE0+a); + + wmPushMatrix(); + ED_region_pixelspace(ar); + + if(v3d->zbuf) glDepthMask(0); + + for(vos= pstrings.first; vos; vos= vos->next) { + if(vos->mval[0]!=IS_CLIPPED) { + glColor3fv(vos->col); + BLF_draw_default((float)vos->mval[0]+vos->xoffs, (float)vos->mval[1], 2.0, vos->str); + } + } + + if(v3d->zbuf) glDepthMask(1); + + wmPopMatrix(); + + if(rv3d->rflag & RV3D_CLIPPING) + for(a=0; a<6; a++) + glEnable(GL_CLIP_PLANE0+a); + } + + if(pstrings.first) + BLI_freelistN(&pstrings); +} +typedef struct ParticleDrawData { + float *vdata, *vd; + float *ndata, *nd; + float *cdata, *cd; + float *vedata, *ved; + float *ma_r, *ma_g, *ma_b; +} ParticleDrawData; +static void draw_particle(ParticleKey *state, int draw_as, short draw, float pixsize, float imat[4][4], float *draw_line, ParticleBillboardData *bb, ParticleDrawData *pdd) +{ + float vec[3], vec2[3]; + float *vd = pdd->vd; + float *nd = pdd->nd; + float *cd = pdd->cd; + float ma_r; + float ma_g; + float ma_b; + + if(pdd->ma_r) { + ma_r = *pdd->ma_r; + ma_g = *pdd->ma_g; + ma_b = *pdd->ma_b; + } + + switch(draw_as){ + case PART_DRAW_DOT: + { + if(vd) { + VECCOPY(vd,state->co) pdd->vd+=3; + } + if(cd) { + cd[0]=ma_r; + cd[1]=ma_g; + cd[2]=ma_b; + pdd->cd+=3; + } + break; + } + case PART_DRAW_CROSS: + case PART_DRAW_AXIS: + { + vec[0]=2.0f*pixsize; + vec[1]=vec[2]=0.0; + QuatMulVecf(state->rot,vec); + if(draw_as==PART_DRAW_AXIS) { + cd[1]=cd[2]=cd[4]=cd[5]=0.0; + cd[0]=cd[3]=1.0; + cd[6]=cd[8]=cd[9]=cd[11]=0.0; + cd[7]=cd[10]=1.0; + cd[13]=cd[12]=cd[15]=cd[16]=0.0; + cd[14]=cd[17]=1.0; + cd+=18; + + VECCOPY(vec2,state->co); + } + else { + if(cd) { + cd[0]=cd[3]=cd[6]=cd[9]=cd[12]=cd[15]=ma_r; + cd[1]=cd[4]=cd[7]=cd[10]=cd[13]=cd[16]=ma_g; + cd[2]=cd[5]=cd[8]=cd[11]=cd[14]=cd[17]=ma_b; + pdd->cd+=18; + } + VECSUB(vec2,state->co,vec); + } + + VECADD(vec,state->co,vec); + VECCOPY(pdd->vd,vec); pdd->vd+=3; + VECCOPY(pdd->vd,vec2); pdd->vd+=3; + + vec[1]=2.0f*pixsize; + vec[0]=vec[2]=0.0; + QuatMulVecf(state->rot,vec); + if(draw_as==PART_DRAW_AXIS){ + VECCOPY(vec2,state->co); + } + else VECSUB(vec2,state->co,vec); + + VECADD(vec,state->co,vec); + VECCOPY(pdd->vd,vec); pdd->vd+=3; + VECCOPY(pdd->vd,vec2); pdd->vd+=3; + + vec[2]=2.0f*pixsize; + vec[0]=vec[1]=0.0; + QuatMulVecf(state->rot,vec); + if(draw_as==PART_DRAW_AXIS){ + VECCOPY(vec2,state->co); + } + else VECSUB(vec2,state->co,vec); + + VECADD(vec,state->co,vec); + + VECCOPY(pdd->vd,vec); pdd->vd+=3; + VECCOPY(pdd->vd,vec2); pdd->vd+=3; + break; + } + case PART_DRAW_LINE: + { + VECCOPY(vec,state->vel); + Normalize(vec); + if(draw & PART_DRAW_VEL_LENGTH) + VecMulf(vec,VecLength(state->vel)); + VECADDFAC(pdd->vd,state->co,vec,-draw_line[0]); pdd->vd+=3; + VECADDFAC(pdd->vd,state->co,vec,draw_line[1]); pdd->vd+=3; + if(cd) { + cd[0]=cd[3]=ma_r; + cd[1]=cd[4]=ma_g; + cd[2]=cd[5]=ma_b; + pdd->cd+=6; + } + break; + } + case PART_DRAW_CIRC: + { + if(pdd->ma_r) + glColor3f(ma_r,ma_g,ma_b); + drawcircball(GL_LINE_LOOP, state->co, pixsize, imat); + break; + } + case PART_DRAW_BB: + { + float xvec[3], yvec[3], zvec[3], bb_center[3]; + if(cd) { + cd[0]=cd[3]=cd[6]=cd[9]=ma_r; + cd[1]=cd[4]=cd[7]=cd[10]=ma_g; + cd[2]=cd[5]=cd[8]=cd[11]=ma_b; + pdd->cd+=12; + } + + + VECCOPY(bb->vec, state->co); + VECCOPY(bb->vel, state->vel); + + psys_make_billboard(bb, xvec, yvec, zvec, bb_center); + + VECADD(pdd->vd,bb_center,xvec); + VECADD(pdd->vd,pdd->vd,yvec); pdd->vd+=3; + + VECSUB(pdd->vd,bb_center,xvec); + VECADD(pdd->vd,pdd->vd,yvec); pdd->vd+=3; + + VECSUB(pdd->vd,bb_center,xvec); + VECSUB(pdd->vd,pdd->vd,yvec); pdd->vd+=3; + + VECADD(pdd->vd,bb_center,xvec); + VECSUB(pdd->vd,pdd->vd,yvec); pdd->vd+=3; + + VECCOPY(pdd->nd, zvec); pdd->nd+=3; + VECCOPY(pdd->nd, zvec); pdd->nd+=3; + VECCOPY(pdd->nd, zvec); pdd->nd+=3; + VECCOPY(pdd->nd, zvec); pdd->nd+=3; + break; + } + } +} /* unified drawing of all new particle systems draw types except dupli ob & group */ /* mostly tries to use vertex arrays for speed */ @@ -2951,7 +3173,7 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas /* 5. start filling the arrays */ /* 6. draw the arrays */ /* 7. clean up */ -static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, ParticleSystem *psys, int dt) +static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, ParticleSystem *psys, int ob_dt) { Object *ob=base->object; ParticleSystemModifierData *psmd; @@ -2959,14 +3181,15 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv ParticleData *pars, *pa; ParticleKey state, *states=0; ParticleBillboardData bb; + ParticleDrawData pdd; Material *ma; - float vel[3], vec[3], vec2[3], imat[4][4], bb_center[3]; - float timestep, pixsize=1.0, pa_size, pa_time, r_tilt; + float vel[3], imat[4][4]; + float timestep, pixsize=1.0, pa_size, r_tilt, r_length; + float pa_time, pa_birthtime, pa_dietime; float cfra= bsystem_time(scene, ob,(float)CFRA,0.0); - float *vdata=0, *vedata=0, *cdata=0, *ndata=0, *vd=0, *ved=0, *cd=0, *nd=0, xvec[3], yvec[3], zvec[3]; float ma_r=0.0f, ma_g=0.0f, ma_b=0.0f; - int a, totpart, totpoint=0, draw_as, totchild=0; - int select=ob->flag&SELECT, create_cdata=0; + int a, totpart, totpoint=0, totve=0, drawn, draw_as, totchild=0; + int select=ob->flag&SELECT, create_cdata=0, need_v=0; GLint polygonmode[2]; char val[32]; @@ -3015,13 +3238,9 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv else totchild=psys->totchild*part->disp/100; - ma= give_current_material(ob,part->omat); + memset(&pdd, 0, sizeof(ParticleDrawData)); - if(ma) { - ma_r = ma->r; - ma_g = ma->g; - ma_b = ma->b; - } + ma= give_current_material(ob,part->omat); if(v3d->zbuf) glDepthMask(1); @@ -3029,6 +3248,15 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv cpack(0xFFFFFF); else if((ma) && (part->draw&PART_DRAW_MAT_COL)) { glColor3f(ma->r,ma->g,ma->b); + + ma_r = ma->r; + ma_g = ma->g; + ma_b = ma->b; + + pdd.ma_r = &ma_r; + pdd.ma_g = &ma_g; + pdd.ma_b = &ma_b; + create_cdata = 1; } else @@ -3038,8 +3266,6 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv timestep= psys_get_timestep(part); - wmLoadMatrix(rv3d->viewmat); - if( (base->flag & OB_FROMDUPLI) && (ob->flag & OB_FROMGROUP) ) { float mat[4][4]; Mat4MulMat4(mat, psys->imat, ob->obmat); @@ -3119,6 +3345,9 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv break; case PART_DRAW_PATH: break; + case PART_DRAW_LINE: + need_v=1; + break; } if(part->draw & PART_DRAW_SIZE && part->draw_as!=PART_DRAW_CIRC){ Mat4CpyMat4(imat, rv3d->viewinv); @@ -3129,40 +3358,45 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv /* 4. */ if(draw_as && draw_as!=PART_DRAW_PATH) { int tot_vec_size = (totpart + totchild) * 3 * sizeof(float); + + if(part->draw_as == PART_DRAW_REND && part->trail_count > 1) + tot_vec_size *= part->trail_count; if(draw_as!=PART_DRAW_CIRC) { switch(draw_as) { case PART_DRAW_AXIS: case PART_DRAW_CROSS: if(draw_as != PART_DRAW_CROSS || create_cdata) - cdata = MEM_callocN(tot_vec_size * 6, "particle_cdata"); - vdata = MEM_callocN(tot_vec_size * 6, "particle_vdata"); + pdd.cdata = MEM_callocN(tot_vec_size * 6, "particle_cdata"); + pdd.vdata = MEM_callocN(tot_vec_size * 6, "particle_vdata"); break; case PART_DRAW_LINE: if(create_cdata) - cdata = MEM_callocN(tot_vec_size * 2, "particle_cdata"); - vdata = MEM_callocN(tot_vec_size * 2, "particle_vdata"); + pdd.cdata = MEM_callocN(tot_vec_size * 2, "particle_cdata"); + pdd.vdata = MEM_callocN(tot_vec_size * 2, "particle_vdata"); break; case PART_DRAW_BB: if(create_cdata) - cdata = MEM_callocN(tot_vec_size * 4, "particle_cdata"); - vdata = MEM_callocN(tot_vec_size * 4, "particle_vdata"); - ndata = MEM_callocN(tot_vec_size * 4, "particle_vdata"); + pdd.cdata = MEM_callocN(tot_vec_size * 4, "particle_cdata"); + pdd.vdata = MEM_callocN(tot_vec_size * 4, "particle_vdata"); + pdd.ndata = MEM_callocN(tot_vec_size * 4, "particle_vdata"); break; default: if(create_cdata) - cdata=MEM_callocN(tot_vec_size, "particle_cdata"); - vdata=MEM_callocN(tot_vec_size, "particle_vdata"); + pdd.cdata=MEM_callocN(tot_vec_size, "particle_cdata"); + pdd.vdata=MEM_callocN(tot_vec_size, "particle_vdata"); } } - if(part->draw & PART_DRAW_VEL && draw_as != PART_DRAW_LINE) - vedata = MEM_callocN(tot_vec_size * 2, "particle_vedata"); + if(part->draw & PART_DRAW_VEL && draw_as != PART_DRAW_LINE) { + pdd.vedata = MEM_callocN(tot_vec_size * 2, "particle_vedata"); + need_v = 1; + } - vd=vdata; - ved=vedata; - cd=cdata; - nd=ndata; + pdd.vd= pdd.vdata; + pdd.ved= pdd.vedata; + pdd.cd= pdd.cdata; + pdd.nd= pdd.ndata; psys->lattice= psys_get_lattice(scene, ob, psys); } @@ -3176,6 +3410,8 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv if(pa->flag & PARS_NO_DISP || pa->flag & PARS_UNEXIST) continue; pa_time=(cfra-pa->time)/pa->lifetime; + pa_birthtime=pa->time; + pa_dietime = pa->dietime; pa_size=pa->size; if((part->flag&PART_ABS_TIME)==0){ @@ -3209,12 +3445,13 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv #endif // XXX old animation system } - r_tilt=1.0f+pa->r_ave[0]; + r_tilt = 1.0f + pa->r_ave[0]; + r_length = 0.5f * (1.0f + pa->r_ave[1]); } else{ ChildParticle *cpa= &psys->child[a-totpart]; - pa_time=psys_get_child_time(psys,cpa,cfra); + pa_time=psys_get_child_time(psys,cpa,cfra,&pa_birthtime,&pa_dietime); if((part->flag&PART_ABS_TIME)==0) { if(ma && ma->ipo){ @@ -3238,148 +3475,80 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv pa_size=psys_get_child_size(psys,cpa,cfra,0); - r_tilt=2.0f*cpa->rand[2]; + r_tilt = 2.0f * cpa->rand[2]; + r_length = cpa->rand[1]; } if(draw_as!=PART_DRAW_PATH){ - state.time=cfra; - if(psys_get_particle_state(scene,ob,psys,a,&state,0)){ - if(psys->parent) - Mat4MulVecfl(psys->parent->obmat, state.co); - - /* create actiual particle data */ - switch(draw_as){ - case PART_DRAW_DOT: - if(vd){ - VECCOPY(vd,state.co) vd+=3; - } - if(cd) { - cd[0]=ma_r; - cd[1]=ma_g; - cd[2]=ma_b; - cd+=3; - } - break; - case PART_DRAW_CROSS: - case PART_DRAW_AXIS: - vec[0]=2.0f*pixsize; - vec[1]=vec[2]=0.0; - QuatMulVecf(state.rot,vec); - if(draw_as==PART_DRAW_AXIS){ - cd[1]=cd[2]=cd[4]=cd[5]=0.0; - cd[0]=cd[3]=1.0; - cd[6]=cd[8]=cd[9]=cd[11]=0.0; - cd[7]=cd[10]=1.0; - cd[13]=cd[12]=cd[15]=cd[16]=0.0; - cd[14]=cd[17]=1.0; - cd+=18; - - VECCOPY(vec2,state.co); - } - else { - if(cd) { - cd[0]=cd[3]=cd[6]=cd[9]=cd[12]=cd[15]=ma_r; - cd[1]=cd[4]=cd[7]=cd[10]=cd[13]=cd[16]=ma_g; - cd[2]=cd[5]=cd[8]=cd[11]=cd[14]=cd[17]=ma_b; - cd+=18; - } - VECSUB(vec2,state.co,vec); - } + drawn = 0; + if(part->draw_as == PART_DRAW_REND && part->trail_count > 1) { + float length = part->path_end * (1.0 - part->randlength * r_length); + int trail_count = part->trail_count * (1.0 - part->randlength * r_length); + float ct = ((part->draw & PART_ABS_PATH_TIME) ? cfra : pa_time) - length; + float dt = length / (trail_count ? (float)trail_count : 1.0f); + int i=0; + + ct+=dt; + for(i=0; i < trail_count; i++, ct += dt) { + if(part->draw & PART_ABS_PATH_TIME) { + if(ct < pa_birthtime || ct > pa_dietime) + continue; + } + else if(ct < 0.0f || ct > 1.0f) + continue; - VECADD(vec,state.co,vec); - VECCOPY(vd,vec); vd+=3; - VECCOPY(vd,vec2); vd+=3; - - vec[1]=2.0f*pixsize; - vec[0]=vec[2]=0.0; - QuatMulVecf(state.rot,vec); - if(draw_as==PART_DRAW_AXIS){ - VECCOPY(vec2,state.co); - } - else VECSUB(vec2,state.co,vec); - - VECADD(vec,state.co,vec); - VECCOPY(vd,vec); vd+=3; - VECCOPY(vd,vec2); vd+=3; - - vec[2]=2.0f*pixsize; - vec[0]=vec[1]=0.0; - QuatMulVecf(state.rot,vec); - if(draw_as==PART_DRAW_AXIS){ - VECCOPY(vec2,state.co); - } - else VECSUB(vec2,state.co,vec); - - VECADD(vec,state.co,vec); - - VECCOPY(vd,vec); vd+=3; - VECCOPY(vd,vec2); vd+=3; - break; - case PART_DRAW_LINE: - VECCOPY(vec,state.vel); - Normalize(vec); - if(part->draw & PART_DRAW_VEL_LENGTH) - VecMulf(vec,VecLength(state.vel)); - VECADDFAC(vd,state.co,vec,-part->draw_line[0]); vd+=3; - VECADDFAC(vd,state.co,vec,part->draw_line[1]); vd+=3; - if(cd) { - cd[0]=cd[3]=ma_r; - cd[1]=cd[4]=ma_g; - cd[2]=cd[5]=ma_b; - cd+=3; - } - break; - case PART_DRAW_CIRC: - if(create_cdata) - glColor3f(ma_r,ma_g,ma_b); - drawcircball(GL_LINE_LOOP, state.co, pixsize, imat); - break; - case PART_DRAW_BB: - if(cd) { - cd[0]=cd[3]=cd[6]=cd[9]=ma_r; - cd[1]=cd[4]=cd[7]=cd[10]=ma_g; - cd[2]=cd[5]=cd[8]=cd[11]=ma_b; - cd+=12; - } + state.time = (part->draw & PART_ABS_PATH_TIME) ? -ct : ct; + psys_get_particle_on_path(scene,ob,psys,a,&state,need_v); + + if(psys->parent) + Mat4MulVecfl(psys->parent->obmat, state.co); + /* create actiual particle data */ + if(draw_as == PART_DRAW_BB) { bb.size = pa_size; bb.tilt = part->bb_tilt * (1.0f - part->bb_rand_tilt * r_tilt); - bb.time = pa_time; - VECCOPY(bb.vec, state.co); - VECCOPY(bb.vel, state.vel); - - psys_make_billboard(&bb, xvec, yvec, zvec, bb_center); - - VECADD(vd,bb_center,xvec); - VECADD(vd,vd,yvec); vd+=3; + bb.time = ct; + } - VECSUB(vd,bb_center,xvec); - VECADD(vd,vd,yvec); vd+=3; + draw_particle(&state, draw_as, part->draw, pixsize, imat, part->draw_line, &bb, &pdd); - VECSUB(vd,bb_center,xvec); - VECSUB(vd,vd,yvec); vd+=3; + totpoint++; + drawn = 1; + } + } + else + { + state.time=cfra; + if(psys_get_particle_state(scene,ob,psys,a,&state,0)){ + if(psys->parent) + Mat4MulVecfl(psys->parent->obmat, state.co); + + /* create actiual particle data */ + if(draw_as == PART_DRAW_BB) { + bb.size = pa_size; + bb.tilt = part->bb_tilt * (1.0f - part->bb_rand_tilt * r_tilt); + bb.time = pa_time; + } - VECADD(vd,bb_center,xvec); - VECSUB(vd,vd,yvec); vd+=3; + draw_particle(&state, draw_as, part->draw, pixsize, imat, part->draw_line, &bb, &pdd); - VECCOPY(nd, zvec); nd+=3; - VECCOPY(nd, zvec); nd+=3; - VECCOPY(nd, zvec); nd+=3; - VECCOPY(nd, zvec); nd+=3; - break; + totpoint++; + drawn = 1; } + } - totpoint++; - + if(drawn) { /* additional things to draw for each particle */ /* (velocity, size and number) */ - if(vedata){ - VECCOPY(ved,state.co); - ved+=3; + if(pdd.vedata){ + VECCOPY(pdd.ved,state.co); + pdd.ved+=3; VECCOPY(vel,state.vel); VecMulf(vel,timestep); - VECADD(ved,state.co,vel); - ved+=3; + VECADD(pdd.ved,state.co,vel); + pdd.ved+=3; + + totve++; } if(part->draw & PART_DRAW_SIZE){ @@ -3391,7 +3560,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv if(part->draw&PART_DRAW_NUM && !(G.f & G_RENDER_SHADOW)){ /* in path drawing state.co is the end point */ sprintf(val," %i",a); - view3d_object_text_draw_add(state.co[0], state.co[1], state.co[2], val, 0); + view3d_particle_text_draw_add(state.co[0], state.co[1], state.co[2], val, 0); } } } @@ -3408,7 +3577,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv glEnableClientState(GL_VERTEX_ARRAY); /* setup gl flags */ - if(dt > OB_WIRE) { + if(ob_dt > OB_WIRE) { glEnableClientState(GL_NORMAL_ARRAY); if(part->draw&PART_DRAW_MAT_COL) @@ -3436,7 +3605,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv if(path->steps > 0) { glVertexPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->co); - if(dt > OB_WIRE) { + if(ob_dt > OB_WIRE) { glNormalPointer(GL_FLOAT, sizeof(ParticleCacheKey), path->vel); if(part->draw&PART_DRAW_MAT_COL) glColorPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->col); @@ -3452,7 +3621,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv path=cache[a]; glVertexPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->co); - if(dt > OB_WIRE) { + if(ob_dt > OB_WIRE) { glNormalPointer(GL_FLOAT, sizeof(ParticleCacheKey), path->vel); if(part->draw&PART_DRAW_MAT_COL) glColorPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->col); @@ -3463,7 +3632,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv /* restore & clean up */ - if(dt > OB_WIRE) { + if(ob_dt > OB_WIRE) { if(part->draw&PART_DRAW_MAT_COL) glDisable(GL_COLOR_ARRAY); glDisable(GL_COLOR_MATERIAL); @@ -3479,16 +3648,17 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv glDisableClientState(GL_COLOR_ARRAY); /* setup created data arrays */ - if(vdata){ + if(pdd.vdata){ glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(3, GL_FLOAT, 0, vdata); + glVertexPointer(3, GL_FLOAT, 0, pdd.vdata); } else glDisableClientState(GL_VERTEX_ARRAY); - if(ndata && dt>OB_WIRE){ + /* billboards are drawn this way */ + if(pdd.ndata && ob_dt>OB_WIRE){ glEnableClientState(GL_NORMAL_ARRAY); - glNormalPointer(GL_FLOAT, 0, ndata); + glNormalPointer(GL_FLOAT, 0, pdd.ndata); glEnable(GL_LIGHTING); } else{ @@ -3496,9 +3666,9 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv glDisable(GL_LIGHTING); } - if(cdata){ + if(pdd.cdata){ glEnableClientState(GL_COLOR_ARRAY); - glColorPointer(3, GL_FLOAT, 0, cdata); + glColorPointer(3, GL_FLOAT, 0, pdd.cdata); } /* draw created data arrays */ @@ -3511,7 +3681,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv glDrawArrays(GL_LINES, 0, 2*totpoint); break; case PART_DRAW_BB: - if(dt<=OB_WIRE) + if(ob_dt<=OB_WIRE) glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glDrawArrays(GL_QUADS, 0, 4*totpoint); @@ -3522,14 +3692,14 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv } } - if(vedata){ + if(pdd.vedata){ glDisableClientState(GL_COLOR_ARRAY); cpack(0xC0C0C0); glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(3, GL_FLOAT, 0, vedata); + glVertexPointer(3, GL_FLOAT, 0, pdd.vedata); - glDrawArrays(GL_LINES, 0, 2*totpoint); + glDrawArrays(GL_LINES, 0, 2*totve); } glPolygonMode(GL_FRONT, polygonmode[0]); @@ -3544,14 +3714,14 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv if(states) MEM_freeN(states); - if(vdata) - MEM_freeN(vdata); - if(vedata) - MEM_freeN(vedata); - if(cdata) - MEM_freeN(cdata); - if(ndata) - MEM_freeN(ndata); + if(pdd.vdata) + MEM_freeN(pdd.vdata); + if(pdd.vedata) + MEM_freeN(pdd.vedata); + if(pdd.cdata) + MEM_freeN(pdd.cdata); + if(pdd.ndata) + MEM_freeN(pdd.ndata); psys->flag &= ~PSYS_DRAWING; @@ -3560,8 +3730,8 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv psys->lattice= NULL; } - wmLoadMatrix(rv3d->viewmat); - wmMultMatrix(ob->obmat); // bring back local matrix for dtx + if( (base->flag & OB_FROMDUPLI) && (ob->flag & OB_FROMGROUP) ) + wmLoadMatrix(rv3d->viewmat); } static void draw_particle_edit(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, ParticleSystem *psys, int dt) @@ -3596,8 +3766,6 @@ static void draw_particle_edit(Scene *scene, View3D *v3d, RegionView3D *rv3d, Ob if((v3d->flag & V3D_ZBUF_SELECT)==0) glDisable(GL_DEPTH_TEST); - wmLoadMatrix(rv3d->viewmat); - /* get selection theme colors */ UI_GetThemeColor3ubv(TH_VERTEX_SELECT, sel); UI_GetThemeColor3ubv(TH_VERTEX, nosel); @@ -3706,7 +3874,7 @@ static void draw_particle_edit(Scene *scene, View3D *v3d, RegionView3D *rv3d, Ob if(key->flag & PEK_HIDE) continue; sprintf(val," %.1f",*key->time); - view3d_object_text_draw_add(key->world_co[0], key->world_co[1], key->world_co[2], val, 0); + view3d_particle_text_draw_add(key->world_co[0], key->world_co[1], key->world_co[2], val, 0); } } } @@ -3729,7 +3897,7 @@ static void draw_particle_edit(Scene *scene, View3D *v3d, RegionView3D *rv3d, Ob if((pset->flag & PE_SHOW_TIME) && !(G.f & G_RENDER_SHADOW)){ sprintf(val," %.1f",*key->time); - view3d_object_text_draw_add(key->world_co[0], key->world_co[1], key->world_co[2], val, 0); + view3d_particle_text_draw_add(key->world_co[0], key->world_co[1], key->world_co[2], val, 0); } } } @@ -3744,7 +3912,6 @@ static void draw_particle_edit(Scene *scene, View3D *v3d, RegionView3D *rv3d, Ob glEnable(GL_DEPTH_TEST); glLineWidth(1.0f); - wmMultMatrix(ob->obmat); // bring back local matrix for dtx glPointSize(1.0); } @@ -5145,7 +5312,9 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) ) { ParticleSystem *psys; if(col || (ob->flag & SELECT)) cpack(0xFFFFFF); /* for visibility, also while wpaint */ - glDepthMask(GL_FALSE); + //glDepthMask(GL_FALSE); + + wmLoadMatrix(rv3d->viewmat); for(psys=ob->particlesystem.first; psys; psys=psys->next) draw_new_particle_system(scene, v3d, rv3d, base, psys, dt); @@ -5155,7 +5324,11 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) if(psys && !scene->obedit && psys_in_edit_mode(scene, psys)) draw_particle_edit(scene, v3d, rv3d, ob, psys, dt); } - glDepthMask(GL_TRUE); + view3d_particle_text_draw(v3d, ar); + + wmMultMatrix(ob->obmat); + + //glDepthMask(GL_TRUE); if(col) cpack(col); } -- cgit v1.2.3