Merge with -r 22620:23107.
[blender.git] / source / blender / editors / space_view3d / drawobject.c
index 53630b2bee0c31dfd73409be83dccd19b510f555..7ed029f3eaf0506a684b443268ccdf4f6628a98c 100644 (file)
@@ -37,7 +37,7 @@
 #include "IMB_imbuf.h"
 
 
-#include "MTC_matrixops.h"
+
 
 #include "DNA_armature_types.h"
 #include "DNA_boid_types.h"
@@ -59,6 +59,7 @@
 #include "DNA_space_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_screen_types.h"
+#include "DNA_smoke_types.h"
 #include "DNA_userdef_types.h"
 #include "DNA_view3d_types.h"
 #include "DNA_world_types.h"
 #include "BKE_mball.h"
 #include "BKE_modifier.h"
 #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"
 #include "BKE_utildefines.h"
+#include "smoke_API.h"
 
 #include "BIF_gl.h"
 #include "BIF_glutil.h"
@@ -208,11 +214,10 @@ int draw_glsl_material(Scene *scene, Object *ob, View3D *v3d, int dt)
                return 0;
        if(!CHECK_OB_DRAWTEXTURE(v3d, dt))
                return 0;
-       if(ob==OBACT && (G.f & G_WEIGHTPAINT))
+       if(ob==OBACT && (ob && ob->mode & OB_MODE_WEIGHT_PAINT))
                return 0;
        
-       return ((G.fileflags & G_FILE_GAME_MAT) &&
-          (G.fileflags & G_FILE_GAME_MAT_GLSL) && (dt >= OB_SHADED));
+       return (scene->gm.matmode == GAME_MAT_GLSL) && (dt >= OB_SHADED);
 }
 
 static int check_material_alpha(Base *base, Mesh *me, int glsl)
@@ -1119,7 +1124,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) {
@@ -1132,7 +1137,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);
                }
        }
 }
@@ -1193,7 +1198,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);
@@ -1387,12 +1392,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]);
@@ -1846,7 +1852,7 @@ static void draw_em_fancy_edges(Scene *scene, View3D *v3d, Mesh *me, DerivedMesh
        }
 }      
 
-static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, EditMesh *em)
+static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, EditMesh *em, UnitSettings *unit)
 {
        Mesh *me= ob->data;
        EditEdge *eed;
@@ -1856,18 +1862,20 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
        char val[32]; /* Stores the measurement display text here */
        char conv_float[5]; /* Use a float conversion matching the grid size */
        float area, col[3]; /* area of the face,  color of the text to draw */
-       
+       float grid= unit->system ? unit->scale_length : v3d->grid;
+       int do_split= unit->flag & USER_UNIT_OPT_SPLIT;
        if(G.f & (G_RENDER_OGL|G_RENDER_SHADOW))
                return;
 
        /* make the precission of the pronted value proportionate to the gridsize */
-       if ((v3d->grid) < 0.01)
+
+       if (grid < 0.01f)
                strcpy(conv_float, "%.6f");
-       else if ((v3d->grid) < 0.1)
+       else if (grid < 0.1f)
                strcpy(conv_float, "%.5f");
-       else if ((v3d->grid) < 1.0)
+       else if (grid < 1.0f)
                strcpy(conv_float, "%.4f");
-       else if ((v3d->grid) < 10.0)
+       else if (grid < 10.0f)
                strcpy(conv_float, "%.3f");
        else
                strcpy(conv_float, "%.2f");
@@ -1876,13 +1884,13 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
        if(v3d->zbuf && (v3d->flag & V3D_ZBUF_SELECT)==0)
                glDisable(GL_DEPTH_TEST);
 
-       if(v3d->zbuf) bglPolygonOffset(rv3d->dist, 5.0);
+       if(v3d->zbuf) bglPolygonOffset(rv3d->dist, 5.0f);
        
        if(me->drawflag & ME_DRAW_EDGELEN) {
                UI_GetThemeColor3fv(TH_TEXT, col);
                /* make color a bit more red */
-               if(col[0]> 0.5) {col[1]*=0.7; col[2]*= 0.7;}
-               else col[0]= col[0]*0.7 + 0.3;
+               if(col[0]> 0.5f) {col[1]*=0.7f; col[2]*= 0.7f;}
+               else col[0]= col[0]*0.7f + 0.3f;
                glColor3fv(col);
                
                for(eed= em->edges.first; eed; eed= eed->next) {
@@ -1891,16 +1899,19 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
                                VECCOPY(v1, eed->v1->co);
                                VECCOPY(v2, eed->v2->co);
                                
-                               x= 0.5*(v1[0]+v2[0]);
-                               y= 0.5*(v1[1]+v2[1]);
-                               z= 0.5*(v1[2]+v2[2]);
+                               x= 0.5f*(v1[0]+v2[0]);
+                               y= 0.5f*(v1[1]+v2[1]);
+                               z= 0.5f*(v1[2]+v2[2]);
                                
                                if(v3d->flag & V3D_GLOBAL_STATS) {
                                        Mat4MulVecfl(ob->obmat, v1);
                                        Mat4MulVecfl(ob->obmat, v2);
                                }
+                               if(unit->system)
+                                       bUnit_AsString(val, sizeof(val), VecLenf(v1, v2)*unit->scale_length, 3, unit->system, B_UNIT_LENGTH, do_split, FALSE);
+                               else
+                                       sprintf(val, conv_float, VecLenf(v1, v2));
                                
-                               sprintf(val, conv_float, VecLenf(v1, v2));
                                view3d_object_text_draw_add(x, y, z, val, 0);
                        }
                }
@@ -1911,8 +1922,8 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
                
                UI_GetThemeColor3fv(TH_TEXT, col);
                /* make color a bit more green */
-               if(col[1]> 0.5) {col[0]*=0.7; col[2]*= 0.7;}
-               else col[1]= col[1]*0.7 + 0.3;
+               if(col[1]> 0.5f) {col[0]*=0.7f; col[2]*= 0.7f;}
+               else col[1]= col[1]*0.7f + 0.3f;
                glColor3fv(col);
                
                for(efa= em->faces.first; efa; efa= efa->next) {
@@ -1935,7 +1946,11 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
                                else
                                        area = AreaT3Dfl(v1, v2, v3);
 
-                               sprintf(val, conv_float, area);
+                               if(unit->system)
+                                       bUnit_AsString(val, sizeof(val), area*unit->scale_length, 3, unit->system, B_UNIT_LENGTH, do_split, FALSE); // XXX should be B_UNIT_AREA
+                               else
+                                       sprintf(val, conv_float, area);
+
                                view3d_object_text_draw_add(efa->cent[0], efa->cent[1], efa->cent[2], val, 0);
                        }
                }
@@ -1946,8 +1961,8 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
                
                UI_GetThemeColor3fv(TH_TEXT, col);
                /* make color a bit more blue */
-               if(col[2]> 0.5) {col[0]*=0.7; col[1]*= 0.7;}
-               else col[2]= col[2]*0.7 + 0.3;
+               if(col[2]> 0.5f) {col[0]*=0.7f; col[1]*= 0.7f;}
+               else col[2]= col[2]*0.7f + 0.3f;
                glColor3fv(col);
                
                for(efa= em->faces.first; efa; efa= efa->next) {
@@ -1977,13 +1992,13 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
                        if( (e4->f & e1->f & SELECT) || (G.moving && (efa->v1->f & SELECT)) ) {
                                /* Vec 1 */
                                sprintf(val,"%.3f", VecAngle3(v4, v1, v2));
-                               VecLerpf(fvec, efa->cent, efa->v1->co, 0.8);
+                               VecLerpf(fvec, efa->cent, efa->v1->co, 0.8f);
                                view3d_object_text_draw_add(efa->cent[0], efa->cent[1], efa->cent[2], val, 0);
                        }
                        if( (e1->f & e2->f & SELECT) || (G.moving && (efa->v2->f & SELECT)) ) {
                                /* Vec 2 */
                                sprintf(val,"%.3f", VecAngle3(v1, v2, v3));
-                               VecLerpf(fvec, efa->cent, efa->v2->co, 0.8);
+                               VecLerpf(fvec, efa->cent, efa->v2->co, 0.8f);
                                view3d_object_text_draw_add(fvec[0], fvec[1], fvec[2], val, 0);
                        }
                        if( (e2->f & e3->f & SELECT) || (G.moving && (efa->v3->f & SELECT)) ) {
@@ -1992,14 +2007,14 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
                                        sprintf(val,"%.3f", VecAngle3(v2, v3, v4));
                                else
                                        sprintf(val,"%.3f", VecAngle3(v2, v3, v1));
-                               VecLerpf(fvec, efa->cent, efa->v3->co, 0.8);
+                               VecLerpf(fvec, efa->cent, efa->v3->co, 0.8f);
                                view3d_object_text_draw_add(fvec[0], fvec[1], fvec[2], val, 0);
                        }
                                /* Vec 4 */
                        if(efa->v4) {
                                if( (e3->f & e4->f & SELECT) || (G.moving && (efa->v4->f & SELECT)) ) {
                                        sprintf(val,"%.3f", VecAngle3(v3, v4, v1));
-                                       VecLerpf(fvec, efa->cent, efa->v4->co, 0.8);
+                                       VecLerpf(fvec, efa->cent, efa->v4->co, 0.8f);
                                        view3d_object_text_draw_add(fvec[0], fvec[1], fvec[2], val, 0);
                                }
                        }
@@ -2008,7 +2023,7 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
        
        if(v3d->zbuf) {
                glEnable(GL_DEPTH_TEST);
-               bglPolygonOffset(rv3d->dist, 0.0);
+               bglPolygonOffset(rv3d->dist, 0.0f);
        }
 }
 
@@ -2093,7 +2108,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object
                }
        }
        
-       if((me->drawflag & (ME_DRAWFACES)) || FACESEL_PAINT_TEST) {     /* transp faces */
+       if((me->drawflag & (ME_DRAWFACES)) || paint_facesel_test(ob)) { /* transp faces */
                unsigned char col1[4], col2[4], col3[4];
                        
                UI_GetThemeColor4ubv(TH_FACE, (char *)col1);
@@ -2181,7 +2196,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object
                }
 
                if(me->drawflag & (ME_DRAW_EDGELEN|ME_DRAW_FACEAREA|ME_DRAW_EDGEANG))
-                       draw_em_measure_stats(v3d, rv3d, ob, em);
+                       draw_em_measure_stats(v3d, rv3d, ob, em, &scene->unit);
        }
 
        if(dt>OB_WIRE) {
@@ -2252,7 +2267,7 @@ static void draw_mesh_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base
                glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
 
                // Unwanted combination.
-       if (ob==OBACT && FACESEL_PAINT_TEST) draw_wire = 0;
+       if (ob==OBACT && paint_facesel_test(ob)) draw_wire = 0;
 
        if(dt==OB_BOUNDBOX) {
                draw_bounding_volume(scene, ob);
@@ -2265,12 +2280,12 @@ static void draw_mesh_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base
        else if(dt==OB_WIRE || totface==0) {
                draw_wire = 1; /* draw wire only, no depth buffer stuff  */
        }
-       else if(        (ob==OBACT && (G.f & G_TEXTUREPAINT || FACESEL_PAINT_TEST)) ||
+       else if(        (ob==OBACT && (ob->mode & OB_MODE_TEXTURE_PAINT || paint_facesel_test(ob))) ||
                                CHECK_OB_DRAWTEXTURE(v3d, dt))
        {
-               int faceselect= (ob==OBACT && FACESEL_PAINT_TEST);
+               int faceselect= (ob==OBACT && paint_facesel_test(ob));
 
-               if ((v3d->flag&V3D_SELECT_OUTLINE) && (base->flag&SELECT) && !(G.f&G_PICKSEL || FACESEL_PAINT_TEST) && !draw_wire) {
+               if ((v3d->flag&V3D_SELECT_OUTLINE) && (base->flag&SELECT) && !(G.f&G_PICKSEL || paint_facesel_test(ob)) && !draw_wire) {
                        draw_mesh_object_outline(v3d, ob, dm);
                }
 
@@ -2324,7 +2339,7 @@ static void draw_mesh_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base
                
                if(ob==OBACT) {
                        do_draw= 0;
-                       if( (G.f & G_WEIGHTPAINT)) {
+                       if(ob && ob->mode & OB_MODE_WEIGHT_PAINT) {
                                /* enforce default material settings */
                                GPU_enable_material(0, NULL);
                                
@@ -2344,12 +2359,13 @@ static void draw_mesh_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base
 
                                GPU_disable_material();
                        }
-                       else if((G.f & (G_VERTEXPAINT+G_TEXTUREPAINT)) && me->mcol) {
-                               dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 1);
-                       }
-                       else if(G.f & (G_VERTEXPAINT+G_TEXTUREPAINT)) {
-                               glColor3f(1.0f, 1.0f, 1.0f);
-                               dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 0);
+                       else if(ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_TEXTURE_PAINT)) {
+                               if(me->mcol)
+                                       dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 1);
+                               else {
+                                       glColor3f(1.0f, 1.0f, 1.0f);
+                                       dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 0);
+                               }
                        }
                        else do_draw= 1;
                }
@@ -2782,7 +2798,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;
                        
@@ -2823,7 +2839,7 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas
                }
                break;
        case OB_SURF:
-       
+
                lb= &((Curve *)ob->data)->disp;
                
                if(solid) {
@@ -3124,6 +3140,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;
@@ -3152,9 +3169,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;
@@ -3358,8 +3374,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;
 
@@ -3394,8 +3411,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];
@@ -3509,7 +3528,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
                                        }
 
                                        if((part->draw&PART_DRAW_NUM || part->draw&PART_DRAW_HEALTH) && !(G.f & G_RENDER_SHADOW)){
-                                               strcpy(val, "");
+                                               val[0]= '\0';
                                                
                                                if(part->draw&PART_DRAW_NUM)
                                                        sprintf(val, " %i", a);
@@ -3695,33 +3714,27 @@ 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(psys->pathcache==0)
+       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)
@@ -3737,129 +3750,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);
-       }
-       else {
-               /* flat wire color */
-               glDisableClientState(GL_NORMAL_ARRAY);
-               glDisable(GL_LIGHTING);
-               UI_ThemeColor(TH_WIRE);
-       }
+       glEnable(GL_COLOR_MATERIAL);
+       glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
 
-       /* only draw child paths with lighting */
-       if(dt > OB_WIRE)
-               glEnable(GL_LIGHTING);
+       cache=edit->pathcache;
+       for(i=0; i<totpoint; i++){
+               path = cache[i];
+               glVertexPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->co);
 
-       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);
-                                       }
                                }
                        }
                }
@@ -3879,18 +3878,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;
 
@@ -3930,7 +3929,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;
@@ -3947,13 +3946,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]);
@@ -3988,7 +3987,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;
@@ -4085,6 +4084,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);
 
@@ -4096,23 +4096,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);             
@@ -4147,7 +4149,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); 
@@ -4396,7 +4398,7 @@ static int drawmball(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
        if(ml==NULL) return 1;
        
        /* in case solid draw, reset wire colors */
-       if(mb->editelems && (ob->flag & SELECT)) {
+       if(ob->flag & SELECT) {
                if(ob==OBACT) UI_ThemeColor(TH_ACTIVE);
                else UI_ThemeColor(TH_SELECT);
        }
@@ -4773,7 +4775,7 @@ static void drawSolidSelect(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base
                        drawDispListwire(&ob->disp);
        }
        else if(ob->type==OB_ARMATURE) {
-               if(!(ob->flag & OB_POSEMODE))
+               if(!(ob->mode & OB_MODE_POSE))
                        draw_armature(scene, v3d, rv3d, base, OB_WIRE, 0);
        }
 
@@ -4898,6 +4900,7 @@ void drawRBpivot(bRigidBodyJointConstraint *data)
 void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
 {
        static int warning_recursive= 0;
+       ModifierData *md = NULL;
        Object *ob;
        Curve *cu;
        RegionView3D *rv3d= ar->regiondata;
@@ -4921,7 +4924,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
        /* xray delay? */
        if((flag & DRAW_PICKING)==0 && (base->flag & OB_FROMDUPLI)==0) {
                /* don't do xray in particle mode, need the z-buffer */
-               if(!(G.f & G_PARTICLEEDIT)) {
+               if(!(ob->mode & OB_MODE_PARTICLE_EDIT)) {
                        /* xray and transp are set when it is drawing the 2nd/3rd pass */
                        if(!v3d->xray && !v3d->transp && (ob->dtx & OB_DRAWXRAY) && !(ob->dtx & OB_DRAWTRANSP)) {
                                add_view3d_after(v3d, base, V3D_XRAY, flag);
@@ -5008,6 +5011,9 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
 
        /* patch? children objects with a timeoffs change the parents. How to solve! */
        /* if( ((int)ob->ctime) != F_(scene->r.cfra)) where_is_object(scene, ob); */
+       
+       /* draw paths... */
+       // TODO...
 
        /* multiply view with object matrix */
        wmMultMatrix(ob->obmat);
@@ -5067,7 +5073,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
        dtx= 0;
 
        /* faceselect exception: also draw solid when dt==wire, except in editmode */
-       if(ob==OBACT && (G.f & (G_VERTEXPAINT+G_TEXTUREPAINT+G_WEIGHTPAINT))) {
+       if(ob==OBACT && (ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT))) {
                if(ob->type==OB_MESH) {
 
                        if(ob==scene->obedit);
@@ -5280,11 +5286,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(G.f & G_PARTICLEEDIT && 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);
@@ -5292,6 +5293,81 @@ 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)))
+       {
+               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))
+                       {
+                               smd->domain->tex = NULL;
+                               GPU_create_smoke(smd, 0);
+                               draw_volume(scene, ar, v3d, base, smd->domain->tex, smd->domain->res, smd->domain->dx, smd->domain->tex_shadow);
+                               GPU_free_smoke(smd);
+                       }
+                       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->res_wt, smd->domain->dx_wt, smd->domain->tex_shadow);
+                               GPU_free_smoke(smd);
+                       }
+               }
+       }
 
        {
                bConstraint *con;
@@ -5351,7 +5427,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
        if(G.f & G_RENDER_SHADOW) return;
 
        /* object centers, need to be drawn in viewmat space for speed, but OK for picking select */
-       if(ob!=OBACT || (G.f & (G_VERTEXPAINT|G_TEXTUREPAINT|G_WEIGHTPAINT))==0) {
+       if(ob!=OBACT || !(ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT))) {
                int do_draw_center= -1; /* defines below are zero or positive... */
 
                if((scene->basact)==base)