diff options
Diffstat (limited to 'source/blender/editors/space_view3d/drawobject.c')
-rw-r--r-- | source/blender/editors/space_view3d/drawobject.c | 402 |
1 files changed, 249 insertions, 153 deletions
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 9c7aed86072..482b4718504 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -37,7 +37,7 @@ #include "IMB_imbuf.h" -#include "MTC_matrixops.h" + #include "DNA_armature_types.h" #include "DNA_boid_types.h" @@ -89,6 +89,7 @@ #include "BKE_object.h" #include "BKE_paint.h" #include "BKE_particle.h" +#include "BKE_pointcache.h" #include "BKE_property.h" #include "BKE_smoke.h" #include "BKE_unit.h" @@ -1125,7 +1126,7 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob Mat4Ortho(vec); wmMultMatrix(vec); - MTC_Mat4SwapMat4(rv3d->persmat, tmat); + Mat4SwapMat4(rv3d->persmat, tmat); wmGetSingleMatrix(rv3d->persmat); if(cam->flag & CAM_SHOWLIMITS) { @@ -1138,7 +1139,7 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob if(cam->flag & CAM_SHOWMIST) if(wrld) draw_limit_line(wrld->miststa, wrld->miststa+wrld->mistdist, 0xFFFFFF); - MTC_Mat4SwapMat4(rv3d->persmat, tmat); + Mat4SwapMat4(rv3d->persmat, tmat); } } } @@ -1199,7 +1200,7 @@ static void drawlattice__point(Lattice *lt, DispList *dl, int u, int v, int w, i if(use_wcol) { float col[3]; - MDeformWeight *mdw= get_defweight (lt->dvert+index, use_wcol-1); + MDeformWeight *mdw= ED_vgroup_weight_get (lt->dvert+index, use_wcol-1); weight_to_rgb(mdw?mdw->weight:0.0f, col, col+1, col+2); glColor3fv(col); @@ -1289,7 +1290,7 @@ static void mesh_foreachScreenVert__mapFunc(void *userData, int index, float *co VECCOPY(co2, co); - MTC_Mat4MulVecfl(data->vc.obedit->obmat, co2); + Mat4MulVecfl(data->vc.obedit->obmat, co2); if (data->clipVerts) { project_short(data->vc.ar, co2, s); @@ -1329,8 +1330,8 @@ static void mesh_foreachScreenEdge__mapFunc(void *userData, int index, float *v0 VECCOPY(v1_co, v0co); VECCOPY(v2_co, v1co); - MTC_Mat4MulVecfl(data->vc.obedit->obmat, v1_co); - MTC_Mat4MulVecfl(data->vc.obedit->obmat, v2_co); + Mat4MulVecfl(data->vc.obedit->obmat, v1_co); + Mat4MulVecfl(data->vc.obedit->obmat, v2_co); if (!BM_TestHFlag(eed, BM_HIDDEN)) { if (data->clipVerts==1) { @@ -1377,7 +1378,7 @@ static void mesh_foreachScreenFace__mapFunc(void *userData, int index, float *ce VECCOPY(cent2, cent); if (efa && !BM_TestHFlag(efa, BM_HIDDEN)) { - MTC_Mat4MulVecfl(data->vc.obedit->obmat, cent2); + Mat4MulVecfl(data->vc.obedit->obmat, cent2); project_short(data->vc.ar, cent2, s); data->func(data->userData, efa, s[0], s[1], index); @@ -1408,12 +1409,13 @@ void nurbs_foreachScreenVert(ViewContext *vc, void (*func)(void *userData, Nurb int i; for (nu= cu->editnurb->first; nu; nu=nu->next) { - if((nu->type & 7)==CU_BEZIER) { + if(nu->type == CU_BEZIER) { for (i=0; i<nu->pntsu; i++) { BezTriple *bezt = &nu->bezt[i]; if(bezt->hide==0) { - if (G.f & G_HIDDENHANDLES) { + + if(cu->drawflag & CU_HIDE_HANDLES) { view3d_project_short_clip(vc->ar, bezt->vec[1], s); if (s[0] != IS_CLIPPED) func(userData, nu, NULL, bezt, 1, s[0], s[1]); @@ -2981,7 +2983,7 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas if(solid) { dl= lb->first; if(dl==NULL) return 1; - + if(dl->nors==0) addnormalsDispList(ob, lb); index3_nors_incr= 0; @@ -3022,7 +3024,7 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas } break; case OB_SURF: - + lb= &((Curve *)ob->data)->disp; if(solid) { @@ -3323,6 +3325,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv { Object *ob=base->object; ParticleSystemModifierData *psmd; + ParticleEditSettings *pset = PE_settings(scene); ParticleSettings *part; ParticleData *pars, *pa; ParticleKey state, *states=0; @@ -3351,9 +3354,8 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv if(pars==0) return; - // XXX what logic is this? - if(!scene->obedit && psys_in_edit_mode(scene, psys) - && psys->flag & PSYS_HAIR_DONE && part->draw_as==PART_DRAW_PATH) + /* don't draw normal paths in edit mode */ + if(psys_in_edit_mode(scene, psys) && (pset->flag & PE_DRAW_PART)==0) return; if(part->draw_as==PART_DRAW_NOT) return; @@ -3557,8 +3559,9 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv pa_birthtime=pa->time; pa_dietime = pa->dietime; pa_size=pa->size; - if(part->phystype==PART_PHYS_BOIDS) - pa_health = pa->boid->health; + if(part->phystype==PART_PHYS_BOIDS) { + pa_health = pa->boid->data.health; + } else pa_health = -1.0; @@ -3593,8 +3596,10 @@ 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_length = 0.5f * (1.0f + pa->r_ave[1]); + BLI_srandom(psys->seed+a); + + r_tilt = 2.0f*(BLI_frand() - 0.5f); + r_length = BLI_frand(); } else{ ChildParticle *cpa= &psys->child[a-totpart]; @@ -3894,33 +3899,33 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv wmLoadMatrix(rv3d->viewmat); } -static void draw_particle_edit(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, ParticleSystem *psys, int dt) +static void draw_ptcache_edit(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, PTCacheEdit *edit, int dt) { - ParticleEdit *edit = psys->edit; - ParticleData *pa; - ParticleCacheKey **path; - ParticleEditKey *key; + ParticleCacheKey **cache, *path, *pkey; + PTCacheEditPoint *point; + PTCacheEditKey *key; ParticleEditSettings *pset = PE_settings(scene); - int i, k, totpart = psys->totpart, totchild=0, timed = pset->draw_timed; + int i, k, totpoint = edit->totpoint, timed = pset->flag & PE_FADE_TIME ? pset->fade_frames : 0; + int steps; char nosel[4], sel[4]; float sel_col[3]; float nosel_col[3]; - char val[32]; + float *pathcol = NULL, *pcol; - /* create path and child path cache if it doesn't exist already */ - if(psys->pathcache==0){ - PE_hide_keys_time(scene, psys,CFRA); - psys_cache_paths(scene, ob, psys, CFRA,0); + + if(edit->psys && edit->psys->flag & PSYS_HAIR_UPDATED) { + PE_update_object(scene, ob, 0); + edit->psys->flag &= ~PSYS_HAIR_UPDATED; } - if(psys->pathcache==0) + + /* create path and child path cache if it doesn't exist already */ + if(edit->pathcache==0) + psys_cache_edit_paths(scene, ob, edit, CFRA); + + if(edit->pathcache==0) return; - if(pset->flag & PE_SHOW_CHILD && psys->part->draw_as == PART_DRAW_PATH) { - if(psys->childcache==0) - psys_cache_child_paths(scene, ob, psys, CFRA, 0); - } - else if(!(pset->flag & PE_SHOW_CHILD) && psys->childcache) - free_child_path_cache(psys); + PE_hide_keys_time(scene, edit, CFRA); /* opengl setup */ if((v3d->flag & V3D_ZBUF_SELECT)==0) @@ -3936,129 +3941,115 @@ static void draw_particle_edit(Scene *scene, View3D *v3d, RegionView3D *rv3d, Ob nosel_col[1]=(float)nosel[1]/255.0f; nosel_col[2]=(float)nosel[2]/255.0f; - if(psys->childcache) - totchild = psys->totchildcache; - /* draw paths */ - if(timed) + if(timed) { glEnable(GL_BLEND); + steps = (*edit->pathcache)->steps + 1; + pathcol = MEM_callocN(steps*4*sizeof(float), "particle path color data"); + } glEnableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); - if(dt > OB_WIRE) { - /* solid shaded with lighting */ - glEnableClientState(GL_NORMAL_ARRAY); - glEnableClientState(GL_COLOR_ARRAY); + glEnable(GL_COLOR_MATERIAL); + glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE); - glEnable(GL_COLOR_MATERIAL); - glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE); - } - else { - /* flat wire color */ - glDisableClientState(GL_NORMAL_ARRAY); - glDisable(GL_LIGHTING); - UI_ThemeColor(TH_WIRE); - } + cache=edit->pathcache; + for(i=0; i<totpoint; i++){ + path = cache[i]; + glVertexPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->co); - /* only draw child paths with lighting */ - if(dt > OB_WIRE) - glEnable(GL_LIGHTING); - - if(psys->part->draw_as == PART_DRAW_PATH) { - for(i=0, path=psys->childcache; i<totchild; i++,path++){ - glVertexPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), (*path)->co); - if(dt > OB_WIRE) { - glNormalPointer(GL_FLOAT, sizeof(ParticleCacheKey), (*path)->vel); - glColorPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), (*path)->col); + if(timed) { + for(k=0, pcol=pathcol, pkey=path; k<steps; k++, pkey++, pcol+=4){ + VECCOPY(pcol, pkey->col); + pcol[3] = 1.0f - fabs((float)CFRA - pkey->time)/(float)pset->fade_frames; } - glDrawArrays(GL_LINE_STRIP, 0, (int)(*path)->steps + 1); + glColorPointer(4, GL_FLOAT, 4*sizeof(float), pathcol); } - } - - if(dt > OB_WIRE) - glDisable(GL_LIGHTING); + else + glColorPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->col); - if(pset->brushtype == PE_BRUSH_WEIGHT) { - glLineWidth(2.0f); - glEnableClientState(GL_COLOR_ARRAY); - glDisable(GL_LIGHTING); + glDrawArrays(GL_LINE_STRIP, 0, path->steps + 1); } - /* draw parents last without lighting */ - for(i=0, pa=psys->particles, path = psys->pathcache; i<totpart; i++, pa++, path++){ - glVertexPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), (*path)->co); - if(dt > OB_WIRE) - glNormalPointer(GL_FLOAT, sizeof(ParticleCacheKey), (*path)->vel); - if(dt > OB_WIRE || pset->brushtype == PE_BRUSH_WEIGHT) - glColorPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), (*path)->col); + if(pathcol) { MEM_freeN(pathcol); pathcol = pcol = NULL; } - glDrawArrays(GL_LINE_STRIP, 0, (int)(*path)->steps + 1); - } /* draw edit vertices */ if(pset->selectmode!=SCE_SELECT_PATH){ - glDisableClientState(GL_NORMAL_ARRAY); - glEnableClientState(GL_COLOR_ARRAY); - glDisable(GL_LIGHTING); glPointSize(UI_GetThemeValuef(TH_VERTEX_SIZE)); if(pset->selectmode==SCE_SELECT_POINT){ + float *pd=0,*pdata=0; float *cd=0,*cdata=0; - cd=cdata=MEM_callocN(edit->totkeys*(timed?4:3)*sizeof(float), "particle edit color data"); + int totkeys = 0; + + for (i=0, point=edit->points; i<totpoint; i++, point++) + if(!(point->flag & PEP_HIDE)) + totkeys += point->totkey; + + if(!(edit->points->keys->flag & PEK_USE_WCO)) + pd=pdata=MEM_callocN(totkeys*3*sizeof(float), "particle edit point data"); + cd=cdata=MEM_callocN(totkeys*(timed?4:3)*sizeof(float), "particle edit color data"); + + for(i=0, point=edit->points; i<totpoint; i++, point++){ + if(point->flag & PEP_HIDE) + continue; + + for(k=0, key=point->keys; k<point->totkey; k++, key++){ + if(pd) { + VECCOPY(pd, key->co); + pd += 3; + } - for(i=0, pa=psys->particles; i<totpart; i++, pa++){ - for(k=0, key=edit->keys[i]; k<pa->totkey; k++, key++){ if(key->flag&PEK_SELECT){ VECCOPY(cd,sel_col); } else{ VECCOPY(cd,nosel_col); } + if(timed) - *(cd+3) = (key->flag&PEK_HIDE)?0.0f:1.0f; + *(cd+3) = 1.0f - fabs((float)CFRA - *key->time)/(float)pset->fade_frames; + cd += (timed?4:3); } } cd=cdata; - for(i=0, pa=psys->particles; i<totpart; i++, pa++){ - if((pa->flag & PARS_HIDE)==0){ - glVertexPointer(3, GL_FLOAT, sizeof(ParticleEditKey), edit->keys[i]->world_co); - glColorPointer((timed?4:3), GL_FLOAT, (timed?4:3)*sizeof(float), cd); - glDrawArrays(GL_POINTS, 0, pa->totkey); - } - cd += (timed?4:3) * pa->totkey; + pd=pdata; + for(i=0, point=edit->points; i<totpoint; i++, point++){ + if(point->flag & PEP_HIDE) + continue; - if((pset->flag&PE_SHOW_TIME) && (pa->flag&PARS_HIDE)==0 && !(G.f & G_RENDER_SHADOW)){ - for(k=0, key=edit->keys[i]+k; k<pa->totkey; k++, key++){ - if(key->flag & PEK_HIDE) continue; + if(point->keys->flag & PEK_USE_WCO) + glVertexPointer(3, GL_FLOAT, sizeof(PTCacheEditKey), point->keys->world_co); + else + glVertexPointer(3, GL_FLOAT, 3*sizeof(float), pd); - sprintf(val," %.1f",*key->time); - view3d_particle_text_draw_add(key->world_co[0], key->world_co[1], key->world_co[2], val, 0); - } - } + glColorPointer((timed?4:3), GL_FLOAT, (timed?4:3)*sizeof(float), cd); + + glDrawArrays(GL_POINTS, 0, point->totkey); + + pd += pd ? 3 * point->totkey : 0; + cd += (timed?4:3) * point->totkey; } - if(cdata) - MEM_freeN(cdata); - cd=cdata=0; + if(pdata) { MEM_freeN(pdata); pd=pdata=0; } + if(cdata) { MEM_freeN(cdata); cd=cdata=0; } } else if(pset->selectmode == SCE_SELECT_END){ - for(i=0, pa=psys->particles; i<totpart; i++, pa++){ - if((pa->flag & PARS_HIDE)==0){ - key = edit->keys[i] + pa->totkey - 1; + for(i=0, point=edit->points; i<totpoint; i++, point++){ + if((point->flag & PEP_HIDE)==0){ + key = point->keys + point->totkey - 1; if(key->flag & PEK_SELECT) glColor3fv(sel_col); else glColor3fv(nosel_col); /* has to be like this.. otherwise selection won't work, have try glArrayElement later..*/ glBegin(GL_POINTS); - glVertex3fv(key->world_co); + glVertex3fv(key->flag & PEK_USE_WCO ? key->world_co : key->co); glEnd(); - - if((pset->flag & PE_SHOW_TIME) && !(G.f & G_RENDER_SHADOW)){ - sprintf(val," %.1f",*key->time); - view3d_particle_text_draw_add(key->world_co[0], key->world_co[1], key->world_co[2], val, 0); - } } } } @@ -4078,18 +4069,18 @@ static void draw_particle_edit(Scene *scene, View3D *v3d, RegionView3D *rv3d, Ob unsigned int nurbcol[8]= { 0, 0x9090, 0x409030, 0x603080, 0, 0x40fff0, 0x40c033, 0xA090F0 }; -static void tekenhandlesN(Nurb *nu, short sel) +static void tekenhandlesN(Nurb *nu, short sel, short hide_handles) { BezTriple *bezt; float *fp; unsigned int *col; int a; - if(nu->hide || (G.f & G_HIDDENHANDLES)) return; + if(nu->hide || hide_handles) return; glBegin(GL_LINES); - if( (nu->type & 7)==CU_BEZIER) { + if(nu->type == CU_BEZIER) { if(sel) col= nurbcol+4; else col= nurbcol; @@ -4129,7 +4120,7 @@ static void tekenhandlesN(Nurb *nu, short sel) glEnd(); } -static void tekenvertsN(Nurb *nu, short sel) +static void tekenvertsN(Nurb *nu, short sel, short hide_handles) { BezTriple *bezt; BPoint *bp; @@ -4146,13 +4137,13 @@ static void tekenvertsN(Nurb *nu, short sel) bglBegin(GL_POINTS); - if((nu->type & 7)==CU_BEZIER) { + if(nu->type == CU_BEZIER) { bezt= nu->bezt; a= nu->pntsu; while(a--) { if(bezt->hide==0) { - if (G.f & G_HIDDENHANDLES) { + if (hide_handles) { if((bezt->f2 & SELECT)==sel) bglVertex3fv(bezt->vec[1]); } else { if((bezt->f1 & SELECT)==sel) bglVertex3fv(bezt->vec[0]); @@ -4187,7 +4178,7 @@ static void draw_editnurb(Object *ob, Nurb *nurb, int sel) nu= nurb; while(nu) { if(nu->hide==0) { - switch(nu->type & 7) { + switch(nu->type) { case CU_POLY: cpack(nurbcol[3]); bp= nu->bp; @@ -4284,6 +4275,7 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, Curve *cu = ob->data; Nurb *nu; BevList *bl; + short hide_handles = (cu->drawflag & CU_HIDE_HANDLES); // XXX retopo_matrix_update(v3d); @@ -4295,23 +4287,25 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, /* first non-selected handles */ for(nu=nurb; nu; nu=nu->next) { - if((nu->type & 7)==CU_BEZIER) { - tekenhandlesN(nu, 0); + if(nu->type == CU_BEZIER) { + tekenhandlesN(nu, 0, hide_handles); } } draw_editnurb(ob, nurb, 0); draw_editnurb(ob, nurb, 1); /* selected handles */ for(nu=nurb; nu; nu=nu->next) { - if((nu->type & 7)==1) tekenhandlesN(nu, 1); - tekenvertsN(nu, 0); + if(nu->type == CU_BEZIER && (cu->drawflag & CU_HIDE_HANDLES)==0) + tekenhandlesN(nu, 1, hide_handles); + tekenvertsN(nu, 0, hide_handles); } if(v3d->zbuf) glEnable(GL_DEPTH_TEST); /* direction vectors for 3d curve paths when at its lowest, dont render normals */ - if(cu->flag & CU_3D && ts->normalsize > 0.0015) { + if(cu->flag & CU_3D && ts->normalsize > 0.0015 && (cu->drawflag & CU_HIDE_NORMALS)==0) { + UI_ThemeColor(TH_WIRE); for (bl=cu->bev.first,nu=nurb; nu && bl; bl=bl->next,nu=nu->next) { BevPoint *bevp= (BevPoint *)(bl+1); @@ -4320,21 +4314,21 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, while (nr-->0) { /* accounts for empty bevel lists */ float fac= bevp->radius * ts->normalsize; - float ox,oy,oz; // Offset perpendicular to the curve - float dx,dy,dz; // Delta along the curve + float vec_a[3] = { fac,0, 0}; // Offset perpendicular to the curve + float vec_b[3] = {-fac,0, 0}; // Delta along the curve + + QuatMulVecf(bevp->quat, vec_a); + QuatMulVecf(bevp->quat, vec_b); + VecAddf(vec_a, vec_a, bevp->vec); + VecAddf(vec_b, vec_b, bevp->vec); - ox = fac*bevp->mat[0][0]; - oy = fac*bevp->mat[0][1]; - oz = fac*bevp->mat[0][2]; - - dx = fac*bevp->mat[2][0]; - dy = fac*bevp->mat[2][1]; - dz = fac*bevp->mat[2][2]; + VECSUBFAC(vec_a, vec_a, bevp->dir, fac); + VECSUBFAC(vec_b, vec_b, bevp->dir, fac); glBegin(GL_LINE_STRIP); - glVertex3f(bevp->x - ox - dx, bevp->y - oy - dy, bevp->z - oz - dz); - glVertex3f(bevp->x, bevp->y, bevp->z); - glVertex3f(bevp->x + ox - dx, bevp->y + oy - dy, bevp->z + oz - dz); + glVertex3fv(vec_a); + glVertex3fv(bevp->vec); + glVertex3fv(vec_b); glEnd(); bevp += skip+1; @@ -4346,7 +4340,7 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, if(v3d->zbuf) glDisable(GL_DEPTH_TEST); for(nu=nurb; nu; nu=nu->next) { - tekenvertsN(nu, 1); + tekenvertsN(nu, 1, hide_handles); } if(v3d->zbuf) glEnable(GL_DEPTH_TEST); @@ -4737,13 +4731,13 @@ static void draw_forcefield(Scene *scene, Object *ob) /*path end*/ setlinestyle(3); - where_on_path(ob, 1.0f, guidevec1, guidevec2); + where_on_path(ob, 1.0f, guidevec1, guidevec2, NULL, NULL); UI_ThemeColorBlend(curcol, TH_BACK, 0.5); drawcircball(GL_LINE_LOOP, guidevec1, mindist, imat); /*path beginning*/ setlinestyle(0); - where_on_path(ob, 0.0f, guidevec1, guidevec2); + where_on_path(ob, 0.0f, guidevec1, guidevec2, NULL, NULL); UI_ThemeColorBlend(curcol, TH_BACK, 0.5); drawcircball(GL_LINE_LOOP, guidevec1, mindist, imat); @@ -5483,11 +5477,6 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) for(psys=ob->particlesystem.first; psys; psys=psys->next) draw_new_particle_system(scene, v3d, rv3d, base, psys, dt); - if(ob->mode & OB_MODE_PARTICLE_EDIT && ob==OBACT) { - psys= PE_get_current(scene, ob); - if(psys && !scene->obedit && psys_in_edit_mode(scene, psys)) - draw_particle_edit(scene, v3d, rv3d, ob, psys, dt); - } view3d_particle_text_draw(v3d, ar); wmMultMatrix(ob->obmat); @@ -5495,15 +5484,122 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) //glDepthMask(GL_TRUE); if(col) cpack(col); } + + if( (warning_recursive==0) && + (flag & DRAW_PICKING)==0 && + (!scene->obedit) + ) { + + if(ob->mode & OB_MODE_PARTICLE_EDIT && ob==OBACT) { + PTCacheEdit *edit = PE_get_current(scene, ob); + if(edit) { + wmLoadMatrix(rv3d->viewmat); + draw_ptcache_edit(scene, v3d, rv3d, ob, edit, dt); + wmMultMatrix(ob->obmat); + } + } + } /* draw code for smoke */ + if((md = modifiers_findByType(ob, eModifierType_Smoke))) { - md = modifiers_findByType(ob, eModifierType_Smoke); - if (md) { - SmokeModifierData *smd = (SmokeModifierData *)md; - if(smd->type & MOD_SMOKE_TYPE_DOMAIN && smd->domain && smd->domain->fluid) { - GPU_create_smoke(smd); - draw_volume(scene, ar, v3d, base, smd->domain->tex, smd->domain->res); + SmokeModifierData *smd = (SmokeModifierData *)md; + + // draw collision objects + if((smd->type & MOD_SMOKE_TYPE_COLL) && smd->coll) + { + /*SmokeCollSettings *scs = smd->coll; + if(scs->points) + { + size_t i; + + wmLoadMatrix(rv3d->viewmat); + + if(col || (ob->flag & SELECT)) cpack(0xFFFFFF); + glDepthMask(GL_FALSE); + glEnable(GL_BLEND); + + + // glPointSize(3.0); + bglBegin(GL_POINTS); + + for(i = 0; i < scs->numpoints; i++) + { + bglVertex3fv(&scs->points[3*i]); + } + + bglEnd(); + glPointSize(1.0); + + wmMultMatrix(ob->obmat); + glDisable(GL_BLEND); + glDepthMask(GL_TRUE); + if(col) cpack(col); + + } + */ + } + + // only draw domains + if(smd->domain && smd->domain->fluid) + { + if(!smd->domain->wt || !(smd->domain->viewsettings & MOD_SMOKE_VIEW_SHOWBIG)) + { +// #if 0 + smd->domain->tex = NULL; + GPU_create_smoke(smd, 0); + draw_volume(scene, ar, v3d, base, smd->domain->tex, smd->domain->p0, smd->domain->p1, smd->domain->res, smd->domain->dx, smd->domain->tex_shadow); + GPU_free_smoke(smd); +// #endif +#if 0 + int x, y, z; + float *density = smoke_get_density(smd->domain->fluid); + + wmLoadMatrix(rv3d->viewmat); + // wmMultMatrix(ob->obmat); + + if(col || (ob->flag & SELECT)) cpack(0xFFFFFF); + glDepthMask(GL_FALSE); + glEnable(GL_BLEND); + + + // glPointSize(3.0); + bglBegin(GL_POINTS); + + for(x = 0; x < smd->domain->res[0]; x++) + for(y = 0; y < smd->domain->res[1]; y++) + for(z = 0; z < smd->domain->res[2]; z++) + { + float tmp[3]; + int index = smoke_get_index(x, smd->domain->res[0], y, smd->domain->res[1], z); + + if(density[index] > FLT_EPSILON) + { + float color[3]; + VECCOPY(tmp, smd->domain->p0); + tmp[0] += smd->domain->dx * x + smd->domain->dx * 0.5; + tmp[1] += smd->domain->dx * y + smd->domain->dx * 0.5; + tmp[2] += smd->domain->dx * z + smd->domain->dx * 0.5; + color[0] = color[1] = color[2] = density[index]; + glColor3fv(color); + bglVertex3fv(tmp); + } + } + + bglEnd(); + glPointSize(1.0); + + wmMultMatrix(ob->obmat); + glDisable(GL_BLEND); + glDepthMask(GL_TRUE); + if(col) cpack(col); +#endif + } + else if(smd->domain->wt && (smd->domain->viewsettings & MOD_SMOKE_VIEW_SHOWBIG)) + { + smd->domain->tex = NULL; + GPU_create_smoke(smd, 1); + draw_volume(scene, ar, v3d, base, smd->domain->tex, smd->domain->p0, smd->domain->p1, smd->domain->res_wt, smd->domain->dx_wt, smd->domain->tex_shadow); GPU_free_smoke(smd); } } |