- added GCC warning -Wstrict-prototypes
[blender.git] / source / blender / editors / space_view3d / drawobject.c
index d28813f7522b68a4fdee2019129ae9bfba9d93ab..65b621b1d7a3928289abedb1fa114e05d9d1f8ee 100644 (file)
@@ -320,8 +320,12 @@ static void draw_xyz_wire(float *c, float size, int axis)
 {
        float v1[3]= {0.f, 0.f, 0.f}, v2[3] = {0.f, 0.f, 0.f};
        float dim = size * 0.1;
-       float dx[3]={dim, 0.0, 0.0}, dy[3]={0.0, dim, 0.0}, dz[3]={0.0, 0.0, dim};
-       
+       float dx[3], dy[3], dz[3];
+
+       dx[0]=dim; dx[1]=0.f; dx[2]=0.f;
+       dy[0]=0.f; dy[1]=dim; dy[2]=0.f;
+       dz[0]=0.f; dz[1]=0.f; dz[2]=dim;
+
        switch(axis) {
                case 0:         /* x axis */
                        glBegin(GL_LINES);
@@ -398,8 +402,7 @@ static void draw_xyz_wire(float *c, float size, int axis)
        
 }
 
-/* flag is same as for draw_object */
-void drawaxes(float size, int flag, char drawtype)
+void drawaxes(float size, char drawtype)
 {
        int axis;
        float v1[3]= {0.0, 0.0, 0.0};
@@ -410,9 +413,6 @@ void drawaxes(float size, int flag, char drawtype)
        
        case OB_PLAINAXES:
                for (axis=0; axis<3; axis++) {
-                       float v1[3]= {0.0, 0.0, 0.0};
-                       float v2[3]= {0.0, 0.0, 0.0};
-                       
                        glBegin(GL_LINES);
                        
                        v1[axis]= size;
@@ -475,8 +475,6 @@ void drawaxes(float size, int flag, char drawtype)
        case OB_ARROWS:
        default:
                for (axis=0; axis<3; axis++) {
-                       float v1[3]= {0.0, 0.0, 0.0};
-                       float v2[3]= {0.0, 0.0, 0.0};
                        int arrow_axis= (axis==0)?1:0;
                        
                        glBegin(GL_LINES);
@@ -525,9 +523,7 @@ void drawcircball(int mode, float *cent, float rad, float tmat[][4])
 /* circle for object centers, special_color is for library or ob users */
 static void drawcentercircle(View3D *v3d, RegionView3D *rv3d, float *co, int selstate, int special_color)
 {
-       float vec[3]= {rv3d->persmat[0][3], rv3d->persmat[1][3], rv3d->persmat[2][3]};
-       float size= rv3d->pixsize*((float)U.obcenter_dia*0.5f);
-       size *= dot_v3v3(vec, co) + rv3d->persmat[3][3];
+       const float size= view3d_pixel_size(rv3d, co) * (float)U.obcenter_dia * 0.5f;
 
        /* using gldepthfunc guarantees that it does write z values, but not checks for it, so centers remain visible independt order of drawing */
        if(v3d->zbuf)  glDepthFunc(GL_ALWAYS);
@@ -559,10 +555,10 @@ static int CachedTextLevel= 0;
 typedef struct ViewCachedString {
        struct ViewCachedString *next, *prev;
        float vec[3], col[4];
-       char str[128]; 
        short mval[2];
        short xoffs;
        short flag;
+       /* str is allocated past the end */
 } ViewCachedString;
 
 void view3d_cached_text_draw_begin()
@@ -572,19 +568,20 @@ void view3d_cached_text_draw_begin()
        CachedTextLevel++;
 }
 
-void view3d_cached_text_draw_add(float x, float y, float z, char *str, short xoffs, short flag)
+void view3d_cached_text_draw_add(const float co[3], const char *str, short xoffs, short flag)
 {
+       int alloc_len= strlen(str) + 1;
        ListBase *strings= &CachedText[CachedTextLevel-1];
-       ViewCachedString *vos= MEM_callocN(sizeof(ViewCachedString), "ViewCachedString");
+       ViewCachedString *vos= MEM_callocN(sizeof(ViewCachedString) + alloc_len, "ViewCachedString");
 
        BLI_addtail(strings, vos);
-       BLI_strncpy(vos->str, str, 128);
-       vos->vec[0]= x;
-       vos->vec[1]= y;
-       vos->vec[2]= z;
+       copy_v3_v3(vos->vec, co);
        glGetFloatv(GL_CURRENT_COLOR, vos->col);
        vos->xoffs= xoffs;
        vos->flag= flag;
+
+       /* allocate past the end */
+       memcpy(++vos, str, alloc_len);
 }
 
 void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, float mat[][4])
@@ -638,8 +635,14 @@ void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, floa
                        }
 #endif
                        if(vos->mval[0]!=IS_CLIPPED) {
+                               const char *str= (char *)(vos+1);
                                glColor3fv(vos->col);
-                               BLF_draw_default((float)vos->mval[0]+vos->xoffs, (float)vos->mval[1], (depth_write)? 0.0f: 2.0f, vos->str);
+                               if(vos->flag & V3D_CACHE_TEXT_ASCII) {
+                                       BLF_draw_default_ascii((float)vos->mval[0]+vos->xoffs, (float)vos->mval[1], (depth_write)? 0.0f: 2.0f, str, 65535); /* XXX, use real length */
+                               }
+                               else {
+                                       BLF_draw_default((float)vos->mval[0]+vos->xoffs, (float)vos->mval[1], (depth_write)? 0.0f: 2.0f, str, 65535); /* XXX, use real length */
+                               }
                        }
                }
                
@@ -891,9 +894,10 @@ static void draw_transp_spot_volume(Lamp *la, float x, float z)
 static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, int dt, int flag)
 {
        Object *ob= base->object;
+       const float pixsize= view3d_pixel_size(rv3d, ob->obmat[3]);
        Lamp *la= ob->data;
        float vec[3], lvec[3], vvec[3], circrad, x,y,z;
-       float pixsize, lampsize;
+       float lampsize;
        float imat[4][4], curcol[4];
        char col[4];
        int drawcone= (dt>OB_WIRE && !(G.f & G_PICKSEL) && la->type == LA_SPOT && (la->mode & LA_SHOW_CONE));
@@ -909,8 +913,6 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
        glLoadMatrixf(rv3d->viewmat);
 
        /* lets calculate the scale: */
-       pixsize= rv3d->persmat[0][3]*ob->obmat[3][0]+ rv3d->persmat[1][3]*ob->obmat[3][1]+ rv3d->persmat[2][3]*ob->obmat[3][2]+ rv3d->persmat[3][3];
-       pixsize*= rv3d->pixsize;
        lampsize= pixsize*((float)U.obcenter_dia*0.5f);
 
        /* and view aligned matrix: */
@@ -1211,10 +1213,15 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob
 {
        /* a standing up pyramid with (0,0,0) as top */
        Camera *cam;
-       World *wrld;
-       float nobmat[4][4], vec[8][4], fac, facx, facy, depth, aspx, aspy, caspx, caspy;
+       float vec[8][4], facx, facy, depth, aspx, aspy, caspx, caspy, shx, shy;
        int i;
+       float drawsize;
+       const short is_view= (rv3d->persp==RV3D_CAMOB && ob==v3d->camera);
 
+       const float scax= 1.0f / len_v3(ob->obmat[0]);
+       const float scay= 1.0f / len_v3(ob->obmat[1]);
+       const float scaz= 1.0f / len_v3(ob->obmat[2]);
+       
        cam= ob->data;
        aspx= (float) scene->r.xsch*scene->r.xasp;
        aspy= (float) scene->r.ysch*scene->r.yasp;
@@ -1231,36 +1238,46 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob
        glDisable(GL_LIGHTING);
        glDisable(GL_CULL_FACE);
        
-       if(rv3d->persp>=2 && cam->type==CAM_ORTHO && ob==v3d->camera) {
-               facx= 0.5*cam->ortho_scale*caspx;
-               facy= 0.5*cam->ortho_scale*caspy;
-               depth= -cam->clipsta-0.1;
+       if(cam->type==CAM_ORTHO) {
+               facx= 0.5f * cam->ortho_scale * caspx * scax;
+               facy= 0.5f * cam->ortho_scale * caspy * scay;
+               shx= cam->shiftx * cam->ortho_scale * scax;
+               shy= cam->shifty * cam->ortho_scale * scay;
+               depth= is_view ? -((cam->clipsta * scaz) + 0.1f) : - cam->drawsize * cam->ortho_scale * scaz;
+               
+               drawsize= 0.5f * cam->ortho_scale;
        }
        else {
-               fac= cam->drawsize;
-               if(rv3d->persp>=2 && ob==v3d->camera) fac= cam->clipsta+0.1; /* that way it's always visible */
+               /* that way it's always visible - clipsta+0.1 */
+               float fac;
+               drawsize= cam->drawsize / ((scax + scay + scaz) / 3.0f);
+               fac= is_view ? (cam->clipsta + 0.1f) : drawsize;
+               depth= - fac*cam->lens/16.0 * scaz;
+               facx= fac * caspx * scax;
+               facy= fac * caspy * scay;
+               shx= cam->shiftx*fac*2 * scax;
+               shy= cam->shifty*fac*2 * scay;
                
-               depth= - fac*cam->lens/16.0;
-               facx= fac*caspx;
-               facy= fac*caspy;
        }
        
-       vec[0][0]= 0.0; vec[0][1]= 0.0; vec[0][2]= 0.001;       /* GLBUG: for picking at iris Entry (well thats old!) */
-       vec[1][0]= facx; vec[1][1]= facy; vec[1][2]= depth;
-       vec[2][0]= facx; vec[2][1]= -facy; vec[2][2]= depth;
-       vec[3][0]= -facx; vec[3][1]= -facy; vec[3][2]= depth;
-       vec[4][0]= -facx; vec[4][1]= facy; vec[4][2]= depth;
+       vec[0][0]= 0.0; vec[0][1]= 0.0; vec[0][2]= 0.0;
+       vec[1][0]= shx + facx; vec[1][1]= shy + facy; vec[1][2]= depth;
+       vec[2][0]= shx + facx; vec[2][1]= shy - facy; vec[2][2]= depth;
+       vec[3][0]= shx - facx; vec[3][1]= shy - facy; vec[3][2]= depth;
+       vec[4][0]= shx - facx; vec[4][1]= shy + facy; vec[4][2]= depth;
 
+       /* camera frame */
        glBegin(GL_LINE_LOOP);
                glVertex3fv(vec[1]); 
                glVertex3fv(vec[2]); 
                glVertex3fv(vec[3]); 
                glVertex3fv(vec[4]);
        glEnd();
-       
 
-       if(rv3d->persp>=2 && ob==v3d->camera) return;
-       
+       if(is_view)
+               return;
+
+       /* center point to camera frame */
        glBegin(GL_LINE_STRIP);
                glVertex3fv(vec[2]); 
                glVertex3fv(vec[0]);
@@ -1274,7 +1291,7 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob
        /* arrow on top */
        vec[0][2]= depth;
 
-       
+
        /* draw an outline arrow for inactive cameras and filled
         * for active cameras. We actually draw both outline+filled
         * for active cameras so the wire can be seen side-on */        
@@ -1282,16 +1299,16 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob
                if (i==0) glBegin(GL_LINE_LOOP);
                else if (i==1 && (ob == v3d->camera)) glBegin(GL_TRIANGLES);
                else break;
-               
-               vec[0][0]= -0.7 * cam->drawsize;
-               vec[0][1]= cam->drawsize * (caspy + 0.1);
+
+               vec[0][0]= shx + ((-0.7 * drawsize) * scax);
+               vec[0][1]= shy + ((drawsize * (caspy + 0.1)) * scay);
                glVertex3fv(vec[0]); /* left */
                
-               vec[0][0] *= -1.0;
+               vec[0][0]= shx + ((0.7 * drawsize) * scax);
                glVertex3fv(vec[0]); /* right */
                
-               vec[0][0]= 0.0;
-               vec[0][1]= 1.1 * cam->drawsize * (caspy + 0.7);
+               vec[0][0]= shx;
+               vec[0][1]= shy + ((1.1 * drawsize * (caspy + 0.7)) * scay);
                glVertex3fv(vec[0]); /* top */
        
                glEnd();
@@ -1299,6 +1316,9 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob
 
        if(flag==0) {
                if(cam->flag & (CAM_SHOWLIMITS+CAM_SHOWMIST)) {
+                       float nobmat[4][4];
+                       World *wrld;
+       
                        /* draw in normalized object matrix space */
                        copy_m4_m4(nobmat, ob->obmat);
                        normalize_m4(nobmat);
@@ -1463,7 +1483,7 @@ static void drawlattice(Scene *scene, View3D *v3d, Object *ob)
  * if not, ED_view3d_init_mats_rv3d() can be used for selection tools
  * but would not give correct results with dupli's for eg. which dont
  * use the object matrix in the useual way */
-static void mesh_foreachScreenVert__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s)
+static void mesh_foreachScreenVert__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
 {
        struct { void (*func)(void *userData, EditVert *eve, int x, int y, int index); void *userData; ViewContext vc; int clipVerts; } *data = userData;
        EditVert *eve = EM_get_vert_for_index(index);
@@ -1547,7 +1567,7 @@ void mesh_foreachScreenEdge(ViewContext *vc, void (*func)(void *userData, EditEd
        dm->release(dm);
 }
 
-static void mesh_foreachScreenFace__mapFunc(void *userData, int index, float *cent, float *no)
+static void mesh_foreachScreenFace__mapFunc(void *userData, int index, float *cent, float *UNUSED(no))
 {
        struct { void (*func)(void *userData, EditFace *efa, int x, int y, int index); void *userData; ViewContext vc; } *data = userData;
        EditFace *efa = EM_get_face_for_index(index);
@@ -1658,7 +1678,7 @@ static void draw_dm_face_normals(Scene *scene, DerivedMesh *dm)
        glEnd();
 }
 
-static void draw_dm_face_centers__mapFunc(void *userData, int index, float *cent, float *no)
+static void draw_dm_face_centers__mapFunc(void *userData, int index, float *cent, float *UNUSED(no))
 {
        EditFace *efa = EM_get_face_for_index(index);
        int sel = *((int*) userData);
@@ -1702,7 +1722,7 @@ static void draw_dm_vert_normals(Scene *scene, DerivedMesh *dm)
 }
 
        /* Draw verts with color set based on selection */
-static void draw_dm_verts__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s)
+static void draw_dm_verts__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
 {
        struct { int sel; EditVert *eve_act; } * data = userData;
        EditVert *eve = EM_get_vert_for_index(index);
@@ -1779,7 +1799,7 @@ static void draw_dm_edges_sel(DerivedMesh *dm, unsigned char *baseCol, unsigned
 }
 
        /* Draw edges */
-static int draw_dm_edges__setDrawOptions(void *userData, int index)
+static int draw_dm_edges__setDrawOptions(void *UNUSED(userData), int index)
 {
        return EM_get_edge_for_index(index)->h==0;
 }
@@ -1789,7 +1809,7 @@ static void draw_dm_edges(DerivedMesh *dm)
 }
 
        /* Draw edges with color interpolated based on selection */
-static int draw_dm_edges_sel_interp__setDrawOptions(void *userData, int index)
+static int draw_dm_edges_sel_interp__setDrawOptions(void *UNUSED(userData), int index)
 {
        return EM_get_edge_for_index(index)->h==0;
 }
@@ -1808,13 +1828,14 @@ static void draw_dm_edges_sel_interp__setDrawInterpOptions(void *userData, int i
 
 static void draw_dm_edges_sel_interp(DerivedMesh *dm, unsigned char *baseCol, unsigned char *selCol)
 {
-       unsigned char *cols[2] = {baseCol, selCol};
-
+       unsigned char *cols[2];
+       cols[0]= baseCol;
+       cols[1]= selCol;
        dm->drawMappedEdgesInterp(dm, draw_dm_edges_sel_interp__setDrawOptions, draw_dm_edges_sel_interp__setDrawInterpOptions, cols);
 }
 
        /* Draw only seam edges */
-static int draw_dm_edges_seams__setDrawOptions(void *userData, int index)
+static int draw_dm_edges_seams__setDrawOptions(void *UNUSED(userData), int index)
 {
        EditEdge *eed = EM_get_edge_for_index(index);
 
@@ -1826,7 +1847,7 @@ static void draw_dm_edges_seams(DerivedMesh *dm)
 }
 
        /* Draw only sharp edges */
-static int draw_dm_edges_sharp__setDrawOptions(void *userData, int index)
+static int draw_dm_edges_sharp__setDrawOptions(void *UNUSED(userData), int index)
 {
        EditEdge *eed = EM_get_edge_for_index(index);
 
@@ -1840,7 +1861,7 @@ static void draw_dm_edges_sharp(DerivedMesh *dm)
 
        /* Draw faces with color set based on selection
         * return 2 for the active face so it renders with stipple enabled */
-static int draw_dm_faces_sel__setDrawOptions(void *userData, int index, int *drawSmooth_r)
+static int draw_dm_faces_sel__setDrawOptions(void *userData, int index, int *UNUSED(drawSmooth_r))
 {
        struct { unsigned char *cols[3]; EditFace *efa_act; } * data = userData;
        EditFace *efa = EM_get_face_for_index(index);
@@ -1872,7 +1893,7 @@ static void draw_dm_faces_sel(DerivedMesh *dm, unsigned char *baseCol, unsigned
        dm->drawMappedFaces(dm, draw_dm_faces_sel__setDrawOptions, &data, 0, GPU_enable_material);
 }
 
-static int draw_dm_creases__setDrawOptions(void *userData, int index)
+static int draw_dm_creases__setDrawOptions(void *UNUSED(userData), int index)
 {
        EditEdge *eed = EM_get_edge_for_index(index);
 
@@ -1890,7 +1911,7 @@ static void draw_dm_creases(DerivedMesh *dm)
        glLineWidth(1.0);
 }
 
-static int draw_dm_bweights__setDrawOptions(void *userData, int index)
+static int draw_dm_bweights__setDrawOptions(void *UNUSED(userData), int index)
 {
        EditEdge *eed = EM_get_edge_for_index(index);
 
@@ -1901,7 +1922,7 @@ static int draw_dm_bweights__setDrawOptions(void *userData, int index)
                return 0;
        }
 }
-static void draw_dm_bweights__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s)
+static void draw_dm_bweights__mapFunc(void *UNUSED(userData), int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
 {
        EditVert *eve = EM_get_vert_for_index(index);
 
@@ -1936,7 +1957,7 @@ static void draw_dm_bweights(Scene *scene, DerivedMesh *dm)
 
 /* EditMesh drawing routines*/
 
-static void draw_em_fancy_verts(Scene *scene, View3D *v3d, Object *obedit, EditMesh *em, DerivedMesh *cageDM, EditVert *eve_act)
+static void draw_em_fancy_verts(Scene *scene, View3D *v3d, Object *obedit, DerivedMesh *cageDM, EditVert *eve_act)
 {
        ToolSettings *ts= scene->toolsettings;
        int sel;
@@ -2112,7 +2133,7 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
                                else
                                        sprintf(val, conv_float, len_v3v3(v1, v2));
                                
-                               view3d_cached_text_draw_add(vmid[0], vmid[1], vmid[2], val, 0, 0);
+                               view3d_cached_text_draw_add(vmid, val, 0, V3D_CACHE_TEXT_ASCII);
                        }
                }
        }
@@ -2151,7 +2172,7 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
                                else
                                        sprintf(val, conv_float, area);
 
-                               view3d_cached_text_draw_add(efa->cent[0], efa->cent[1], efa->cent[2], val, 0, 0);
+                               view3d_cached_text_draw_add(efa->cent, val, 0, V3D_CACHE_TEXT_ASCII);
                        }
                }
        }
@@ -2193,13 +2214,13 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
                                /* Vec 1 */
                                sprintf(val,"%.3f", RAD2DEG(angle_v3v3v3(v4, v1, v2)));
                                interp_v3_v3v3(fvec, efa->cent, efa->v1->co, 0.8f);
-                               view3d_cached_text_draw_add(fvec[0], fvec[1], fvec[2], val, 0, 0);
+                               view3d_cached_text_draw_add(fvec, val, 0, V3D_CACHE_TEXT_ASCII);
                        }
                        if( (e1->f & e2->f & SELECT) || (do_moving && (efa->v2->f & SELECT)) ) {
                                /* Vec 2 */
                                sprintf(val,"%.3f", RAD2DEG(angle_v3v3v3(v1, v2, v3)));
                                interp_v3_v3v3(fvec, efa->cent, efa->v2->co, 0.8f);
-                               view3d_cached_text_draw_add(fvec[0], fvec[1], fvec[2], val, 0, 0);
+                               view3d_cached_text_draw_add(fvec, val, 0, V3D_CACHE_TEXT_ASCII);
                        }
                        if( (e2->f & e3->f & SELECT) || (do_moving && (efa->v3->f & SELECT)) ) {
                                /* Vec 3 */
@@ -2208,14 +2229,14 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
                                else
                                        sprintf(val,"%.3f", RAD2DEG(angle_v3v3v3(v2, v3, v1)));
                                interp_v3_v3v3(fvec, efa->cent, efa->v3->co, 0.8f);
-                               view3d_cached_text_draw_add(fvec[0], fvec[1], fvec[2], val, 0, 0);
+                               view3d_cached_text_draw_add(fvec, val, 0, V3D_CACHE_TEXT_ASCII);
                        }
                                /* Vec 4 */
                        if(efa->v4) {
                                if( (e3->f & e4->f & SELECT) || (do_moving && (efa->v4->f & SELECT)) ) {
                                        sprintf(val,"%.3f", RAD2DEG(angle_v3v3v3(v3, v4, v1)));
                                        interp_v3_v3v3(fvec, efa->cent, efa->v4->co, 0.8f);
-                                       view3d_cached_text_draw_add(fvec[0], fvec[1], fvec[2], val, 0, 0);
+                                       view3d_cached_text_draw_add(fvec, val, 0, V3D_CACHE_TEXT_ASCII);
                                }
                        }
                }
@@ -2227,7 +2248,7 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
        }
 }
 
-static int draw_em_fancy__setFaceOpts(void *userData, int index, int *drawSmooth_r)
+static int draw_em_fancy__setFaceOpts(void *UNUSED(userData), int index, int *UNUSED(drawSmooth_r))
 {
        EditFace *efa = EM_get_face_for_index(index);
 
@@ -2239,7 +2260,7 @@ static int draw_em_fancy__setFaceOpts(void *userData, int index, int *drawSmooth
                return 0;
 }
 
-static int draw_em_fancy__setGLSLFaceOpts(void *userData, int index)
+static int draw_em_fancy__setGLSLFaceOpts(void *UNUSED(userData), int index)
 {
        EditFace *efa = EM_get_face_for_index(index);
 
@@ -2309,7 +2330,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object
                }
        }
        
-       if((me->drawflag & (ME_DRAWFACES)) || paint_facesel_test(ob)) { /* transp faces */
+       if(me->drawflag & ME_DRAWFACES) {       /* transp faces */
                unsigned char col1[4], col2[4], col3[4];
                        
                UI_GetThemeColor4ubv(TH_FACE, (char *)col1);
@@ -2385,7 +2406,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object
        if(em) {
 // XXX         retopo_matrix_update(v3d);
 
-               draw_em_fancy_verts(scene, v3d, ob, em, cageDM, eve_act);
+               draw_em_fancy_verts(scene, v3d, ob, cageDM, eve_act);
 
                if(me->drawflag & ME_DRAWNORMALS) {
                        UI_ThemeColor(TH_NORMAL);
@@ -2435,7 +2456,7 @@ static void draw_mesh_object_outline(View3D *v3d, Object *ob, DerivedMesh *dm)
        }
 }
 
-static int wpaint__setSolidDrawOptions(void *userData, int index, int *drawSmooth_r)
+static int wpaint__setSolidDrawOptions(void *UNUSED(userData), int UNUSED(index), int *drawSmooth_r)
 {
        *drawSmooth_r = 1;
        return 1;
@@ -2446,7 +2467,8 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
        Object *ob= base->object;
        Mesh *me = ob->data;
        Material *ma= give_current_material(ob, 1);
-       int hasHaloMat = (ma && (ma->material_type == MA_TYPE_HALO));
+       const short hasHaloMat = (ma && (ma->material_type == MA_TYPE_HALO));
+       const short is_paint_sel= (ob==OBACT && paint_facesel_test(ob));
        int draw_wire = 0;
        int totvert, totedge, totface;
        DispList *dl;
@@ -2468,7 +2490,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
                glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
 
                // Unwanted combination.
-       if (ob==OBACT && paint_facesel_test(ob)) draw_wire = 0;
+       if (is_paint_sel) draw_wire = 0;
 
        if(dt==OB_BOUNDBOX) {
                if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_WIRE)==0)
@@ -2482,11 +2504,10 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
        else if(dt==OB_WIRE || totface==0) {
                draw_wire = 1; /* draw wire only, no depth buffer stuff  */
        }
-       else if(        (ob==OBACT && (ob->mode & OB_MODE_TEXTURE_PAINT || paint_facesel_test(ob))) ||
+       else if(        (is_paint_sel || (ob==OBACT && ob->mode & OB_MODE_TEXTURE_PAINT)) ||
                                CHECK_OB_DRAWTEXTURE(v3d, dt))
        {
-               int faceselect= (ob==OBACT && paint_facesel_test(ob));
-               if ((v3d->flag&V3D_SELECT_OUTLINE) && ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) && (base->flag&SELECT) && !(G.f&G_PICKSEL || paint_facesel_test(ob)) && !draw_wire) {
+               if ((v3d->flag&V3D_SELECT_OUTLINE) && ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) && (base->flag&SELECT) && !(G.f&G_PICKSEL || is_paint_sel) && !draw_wire) {
                        draw_mesh_object_outline(v3d, ob, dm);
                }
 
@@ -2501,10 +2522,10 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
                        glFrontFace(GL_CCW);
                }
                else {
-                       draw_mesh_textured(scene, v3d, rv3d, ob, dm, faceselect);
+                       draw_mesh_textured(scene, v3d, rv3d, ob, dm, is_paint_sel);
                }
 
-               if(!faceselect) {
+               if(!is_paint_sel) {
                        if(base->flag & SELECT)
                                UI_ThemeColor((ob==OBACT)?TH_ACTIVE:TH_SELECT);
                        else
@@ -2520,24 +2541,25 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
                         * rather then the shading, this is also forced in wire view */
                        GPU_enable_material(0, NULL);
                        dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me->mface, 1, GPU_enable_material);
-
+               
                        bglPolygonOffset(rv3d->dist, 1.0);
                        glDepthMask(0); // disable write in zbuffer, selected edge wires show better
 
                        glEnable(GL_BLEND);
-                       glColor4ub(196, 196, 196, 196);
+                       glColor4ub(255, 255, 255, 96);
                        glEnable(GL_LINE_STIPPLE);
-                       glLineStipple(1, 0x8888);
+                       glLineStipple(1, 0xAAAA);
 
-                       dm->drawEdges(dm, 1, 0);
+                       dm->drawEdges(dm, 1, 1);
 
                        bglPolygonOffset(rv3d->dist, 0.0);
                        glDepthMask(1);
                        glDisable(GL_LINE_STIPPLE);
 
                        GPU_disable_material();
-
-
+                       
+                       /* since we already draw wire as wp guide, dont draw over the top */
+                       draw_wire= 0;
                }
                else {
                        Paint *p;
@@ -3253,16 +3275,22 @@ static void draw_particle_arrays(int draw_as, int totpoint, int ob_dt, int selec
 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 *cd = pdd->cd;
+       float *vd = NULL;
+       float *cd = NULL;
        float ma_r=0.0f;
        float ma_g=0.0f;
        float ma_b=0.0f;
 
-       if(pdd->ma_r) {
-               ma_r = *pdd->ma_r;
-               ma_g = *pdd->ma_g;
-               ma_b = *pdd->ma_b;
+       /* null only for PART_DRAW_CIRC */
+       if(pdd) {
+               vd = pdd->vd;
+               cd = pdd->cd;
+
+               if(pdd->ma_r) {
+                       ma_r = *pdd->ma_r;
+                       ma_g = *pdd->ma_g;
+                       ma_b = *pdd->ma_b;
+               }
        }
 
        switch(draw_as){
@@ -3354,8 +3382,6 @@ static void draw_particle(ParticleKey *state, int draw_as, short draw, float pix
                }
                case PART_DRAW_CIRC:
                {
-                       if(pdd->ma_r)
-                               glColor3f(ma_r,ma_g,ma_b);
                        drawcircball(GL_LINE_LOOP, state->co, pixsize, imat);
                        break;
                }
@@ -3414,7 +3440,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
        ParticleData *pars, *pa;
        ParticleKey state, *states=0;
        ParticleBillboardData bb;
-       ParticleSimulationData sim = {scene, ob, psys, NULL};
+       ParticleSimulationData sim= {0};
        ParticleDrawData *pdd = psys->pdd;
        Material *ma;
        float vel[3], imat[4][4];
@@ -3452,6 +3478,9 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
                return;
 
 /* 2. */
+       sim.scene= scene;
+       sim.ob= ob;
+       sim.psys= psys;
        sim.psmd = psmd = psys_get_modifier(ob,psys);
 
        if(part->phystype==PART_PHYS_KEYED){
@@ -3489,12 +3518,6 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
        else
                cpack(0);
 
-       if(pdd) {
-               pdd->ma_r = &ma_r;
-               pdd->ma_g = &ma_g;
-               pdd->ma_b = &ma_b;
-       }
-
        timestep= psys_get_timestep(&sim);
 
        if( (base->flag & OB_FROMDUPLI) && (ob->flag & OB_FROMGROUP) ) {
@@ -3530,8 +3553,8 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
                case PART_DRAW_CROSS:
                case PART_DRAW_AXIS:
                        /* lets calculate the scale: */
-                       pixsize= rv3d->persmat[0][3]*ob->obmat[3][0]+ rv3d->persmat[1][3]*ob->obmat[3][1]+ rv3d->persmat[2][3]*ob->obmat[3][2]+ rv3d->persmat[3][3];
-                       pixsize*= rv3d->pixsize;
+                       pixsize= view3d_pixel_size(rv3d, ob->obmat[3]);
+                       
                        if(part->draw_size==0.0)
                                pixsize*=2.0;
                        else
@@ -3648,11 +3671,18 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
                pdd->tot_vec_size= tot_vec_size;
        }
 
+       if(pdd) {
+               pdd->ma_r = &ma_r;
+               pdd->ma_g = &ma_g;
+               pdd->ma_b = &ma_b;
+       }
+
        psys->lattice= psys_get_lattice(&sim);
 
-       if(pdd && draw_as!=PART_DRAW_PATH){
+       /* circles don't use drawdata, so have to add a special case here */
+       if((pdd || draw_as==PART_DRAW_CIRC) && draw_as!=PART_DRAW_PATH){
 /* 5. */
-               if((pdd->flag & PARTICLE_DRAW_DATA_UPDATED)
+               if(pdd && (pdd->flag & PARTICLE_DRAW_DATA_UPDATED)
                        && (pdd->vedata || part->draw & (PART_DRAW_SIZE|PART_DRAW_NUM|PART_DRAW_HEALTH))==0) {
                        totpoint = pdd->totpoint; /* draw data is up to date */
                }
@@ -3820,16 +3850,24 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
                                        char *val_pos= val;
                                        val[0]= '\0';
 
-                                       if(part->draw&PART_DRAW_NUM)
-                                               val_pos += sprintf(val, "%i", a);
-
-                                       if((part->draw & PART_DRAW_HEALTH) && a < totpart && part->phystype==PART_PHYS_BOIDS)
-                                               sprintf(val_pos, (val_pos==val) ? "%.2f" : ":%.2f", pa_health);
+                                       if(part->draw&PART_DRAW_NUM) {
+                                               if(a < totpart && (part->draw & PART_DRAW_HEALTH) && (part->phystype==PART_PHYS_BOIDS)) {
+                                                       sprintf(val_pos, "%d:%.2f", a, pa_health);
+                                               }
+                                               else {
+                                                       sprintf(val_pos, "%d", a);
+                                               }
+                                       }
+                                       else {
+                                               if(a < totpart && (part->draw & PART_DRAW_HEALTH) && (part->phystype==PART_PHYS_BOIDS)) {
+                                                       sprintf(val_pos, "%.2f", pa_health);
+                                               }
+                                       }
 
                                        /* in path drawing state.co is the end point */
                                        /* use worldspace beause object matrix is already applied */
                                        mul_v3_m4v3(vec_txt, ob->imat, state.co);
-                                       view3d_cached_text_draw_add(vec_txt[0],  vec_txt[1],  vec_txt[2], val, 10, V3D_CACHE_TEXT_WORLDSPACE);
+                                       view3d_cached_text_draw_add(vec_txt, val, 10, V3D_CACHE_TEXT_WORLDSPACE|V3D_CACHE_TEXT_ASCII);
                                }
                        }
                }
@@ -3918,12 +3956,10 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
 
                        for(a=0, pa=psys->particles; a<totpart; a++, pa++){
                                float vec_txt[3];
-                               val[0]= '\0';
-
                                sprintf(val, "%i", a);
                                /* use worldspace beause object matrix is already applied */
                                mul_v3_m4v3(vec_txt, ob->imat, cache[a]->co);
-                               view3d_cached_text_draw_add(vec_txt[0],  vec_txt[1],  vec_txt[2], val, 10, V3D_CACHE_TEXT_WORLDSPACE);
+                               view3d_cached_text_draw_add(vec_txt, val, 10, V3D_CACHE_TEXT_WORLDSPACE|V3D_CACHE_TEXT_ASCII);
                        }
                }
        }
@@ -4029,7 +4065,7 @@ static void draw_update_ptcache_edit(Scene *scene, Object *ob, PTCacheEdit *edit
                psys_cache_edit_paths(scene, ob, edit, CFRA);
 }
 
-static void draw_ptcache_edit(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, PTCacheEdit *edit, int dt)
+static void draw_ptcache_edit(Scene *scene, View3D *v3d, PTCacheEdit *edit)
 {
        ParticleCacheKey **cache, *path, *pkey;
        PTCacheEditPoint *point;
@@ -4064,8 +4100,8 @@ static void draw_ptcache_edit(Scene *scene, View3D *v3d, RegionView3D *rv3d, Obj
        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_COLOR_ARRAY);
 
-       glEnable(GL_COLOR_MATERIAL);
        glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
+       glEnable(GL_COLOR_MATERIAL);
        glShadeModel(GL_SMOOTH);
 
        if(pset->brushtype == PE_BRUSH_WEIGHT) {
@@ -4734,9 +4770,17 @@ 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 vec_a[3] = { fac,0, 0}; // Offset perpendicular to the curve
-                               float vec_b[3] = {-fac,0, 0}; // Delta along the curve
+                               float vec_a[3]; // Offset perpendicular to the curve
+                               float vec_b[3]; // Delta along the curve
+
+                               vec_a[0]= fac;
+                               vec_a[1]= 0.0f;
+                               vec_a[2]= 0.0f;
 
+                               vec_b[0]= -fac;
+                               vec_b[1]= 0.0f;
+                               vec_b[2]= 0.0f;
+                               
                                mul_qt_v3(bevp->quat, vec_a);
                                mul_qt_v3(bevp->quat, vec_b);
                                add_v3_v3(vec_a, bevp->vec);
@@ -4823,9 +4867,9 @@ static void draw_empty_cone (float size)
 }
 
 /* draw points on curve speed handles */
+#if 0 // XXX old animation system stuff
 static void curve_draw_speed(Scene *scene, Object *ob)
 {
-#if 0 // XXX old animation system stuff
        Curve *cu= ob->data;
        IpoCurve *icu;
        BezTriple *bezt;
@@ -4851,8 +4895,8 @@ static void curve_draw_speed(Scene *scene, Object *ob)
 
        glPointSize(1.0);
        bglEnd();
-#endif // XXX old animation system stuff
 }
+#endif // XXX old animation system stuff
 
 
 static void draw_textcurs(float textcurs[][2])
@@ -5308,10 +5352,12 @@ static void draw_bounding_volume(Scene *scene, Object *ob)
                bb= ob->bb ? ob->bb : ( (Curve *)ob->data )->bb;
        }
        else if(ob->type==OB_MBALL) {
-               bb= ob->bb;
-               if(bb==0) {
-                       makeDispListMBall(scene, ob);
+               if(is_basis_mball(ob)) {
                        bb= ob->bb;
+                       if(bb==0) {
+                               makeDispListMBall(scene, ob);
+                               bb= ob->bb;
+                       }
                }
        }
        else {
@@ -5362,7 +5408,7 @@ static void drawtexspace(Object *ob)
 }
 
 /* draws wire outline */
-static void drawSolidSelect(Scene *scene, View3D *v3d, ARegion *ar, Base *base) 
+static void drawObjectSelect(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
 {
        RegionView3D *rv3d= ar->regiondata;
        Object *ob= base->object;
@@ -5391,8 +5437,10 @@ static void drawSolidSelect(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
                        draw_index_wire= 1;
                }
        } else if (ob->type==OB_MBALL) {
-               if((base->flag & OB_FROMDUPLI)==0) 
-                       drawDispListwire(&ob->disp);
+               if(is_basis_mball(ob)) {
+                       if((base->flag & OB_FROMDUPLI)==0)
+                               drawDispListwire(&ob->disp);
+               }
        }
        else if(ob->type==OB_ARMATURE) {
                if(!(ob->mode & OB_MODE_POSE))
@@ -5446,7 +5494,9 @@ static void drawWireExtra(Scene *scene, RegionView3D *rv3d, Object *ob)
                                draw_index_wire= 1;
                }
        } else if (ob->type==OB_MBALL) {
-               drawDispListwire(&ob->disp);
+               if(is_basis_mball(ob)) {
+                       drawDispListwire(&ob->disp);
+               }
        }
 
        glDepthMask(1);
@@ -5487,30 +5537,30 @@ static void draw_hooks(Object *ob)
 void drawRBpivot(bRigidBodyJointConstraint *data)
 {
        int axis;
-       float v1[3]= {data->pivX, data->pivY, data->pivZ};
-       float eu[3]= {data->axX, data->axY, data->axZ};
        float mat[4][4];
 
-       eul_to_mat4(mat,eu);
+       eul_to_mat4(mat,&data->axX);
        glLineWidth (4.0f);
        setlinestyle(2);
        for (axis=0; axis<3; axis++) {
                float dir[3] = {0,0,0};
-               float v[3]= {data->pivX, data->pivY, data->pivZ};
+               float v[3];
+
+               copy_v3_v3(v, &data->pivX);
 
                dir[axis] = 1.f;
                glBegin(GL_LINES);
                mul_m4_v3(mat,dir);
                add_v3_v3(v, dir);
-               glVertex3fv(v1);
+               glVertex3fv(&data->pivX);
                glVertex3fv(v);                 
                glEnd();
                if (axis==0)
-                       view3d_cached_text_draw_add(v[0], v[1], v[2], "px", 0, 0);
+                       view3d_cached_text_draw_add(v, "px", 0, V3D_CACHE_TEXT_ASCII);
                else if (axis==1)
-                       view3d_cached_text_draw_add(v[0], v[1], v[2], "py", 0, 0);
+                       view3d_cached_text_draw_add(v, "py", 0, V3D_CACHE_TEXT_ASCII);
                else
-                       view3d_cached_text_draw_add(v[0], v[1], v[2], "pz", 0, 0);
+                       view3d_cached_text_draw_add(v, "pz", 0, V3D_CACHE_TEXT_ASCII);
        }
        glLineWidth (1.0f);
        setlinestyle(0);
@@ -5648,13 +5698,13 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
                bAnimVizSettings *avs= &ob->avs;
                
                /* setup drawing environment for paths */
-               draw_motion_paths_init(scene, v3d, ar);
+               draw_motion_paths_init(v3d, ar);
                
                /* draw motion path for object */
-               draw_motion_path_instance(scene, v3d, ar, ob, NULL, avs, ob->mpath);
+               draw_motion_path_instance(scene, ob, NULL, avs, ob->mpath);
                
                /* cleanup after drawing */
-               draw_motion_paths_cleanup(scene, v3d, ar);
+               draw_motion_paths_cleanup(v3d);
        }
 
        /* multiply view with object matrix.
@@ -5756,12 +5806,12 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
                if (cu->disp.first==NULL) makeDispListCurveTypes(scene, ob, 0);
        }
        
-       /* draw outline for selected solid objects, mesh does itself */
+       /* draw outline for selected objects, mesh does itself */
        if((v3d->flag & V3D_SELECT_OUTLINE) && ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) && ob->type!=OB_MESH) {
-               if(dt>OB_WIRE && dt<OB_TEXTURE && (ob->mode & OB_MODE_EDIT)==0 && (flag & DRAW_SCENESET)==0) {
+               if(dt>OB_WIRE && (ob->mode & OB_MODE_EDIT)==0 && (flag & DRAW_SCENESET)==0) {
                        if (!(ob->dtx&OB_DRAWWIRE) && (ob->flag&SELECT) && !(flag&DRAW_PICKING)) {
                                
-                               drawSolidSelect(scene, v3d, ar, base);
+                               drawObjectSelect(scene, v3d, ar, base);
                        }
                }
        }
@@ -5878,9 +5928,9 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
                        }
                        else if(boundbox_clip(rv3d, ob->obmat, ob->bb ? ob->bb : cu->bb)) {
                                empty_object= drawDispList(scene, v3d, rv3d, base, dt);
-                               
-                               if(cu->path)
-                                       curve_draw_speed(scene, ob);
+
+//XXX old animsys                              if(cu->path)
+//                                                     curve_draw_speed(scene, ob);
                        }
                        break;
                case OB_MBALL:
@@ -5899,7 +5949,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
                }
                case OB_EMPTY:
                        if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0)
-                               drawaxes(ob->empty_drawsize, flag, ob->empty_drawtype);
+                               drawaxes(ob->empty_drawsize, ob->empty_drawtype);
                        break;
                case OB_LAMP:
                        if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
@@ -5925,7 +5975,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
                        break;
                default:
                        if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
-                               drawaxes(1.0, flag, OB_ARROWS);
+                               drawaxes(1.0, OB_ARROWS);
                        }
        }
 
@@ -5978,7 +6028,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
 
                        draw_new_particle_system(scene, v3d, rv3d, base, psys, dt);
                }
-               
+               invert_m4_m4(ob->imat, ob->obmat);
                view3d_cached_text_draw_end(v3d, ar, 0, NULL);
 
                glMultMatrixf(ob->obmat);
@@ -5997,7 +6047,8 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
                        PTCacheEdit *edit = PE_create_current(scene, ob);
                        if(edit) {
                                glLoadMatrixf(rv3d->viewmat);
-                               draw_ptcache_edit(scene, v3d, rv3d, ob, edit, dt);
+                               draw_update_ptcache_edit(scene, ob, edit);
+                               draw_ptcache_edit(scene, v3d, edit);
                                glMultMatrixf(ob->obmat);
                        }
                }
@@ -6051,7 +6102,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
 // #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);
+                               draw_volume(ar, 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
@@ -6102,7 +6153,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
                        {
                                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);
+                               draw_volume(ar, 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);
                        }
                }
@@ -6125,7 +6176,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
                if(dtx && (G.f & G_RENDER_OGL)==0) {
 
                        if(dtx & OB_AXIS) {
-                               drawaxes(1.0f, flag, OB_ARROWS);
+                               drawaxes(1.0f, OB_ARROWS);
                        }
                        if(dtx & OB_BOUNDBOX) {
                                if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0)
@@ -6136,7 +6187,8 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
                                /* patch for several 3d cards (IBM mostly) that crash on glSelect with text drawing */
                                /* but, we also dont draw names for sets or duplicators */
                                if(flag == 0) {
-                                       view3d_cached_text_draw_add(0.0f, 0.0f, 0.0f, ob->id.name+2, 10, 0);
+                                       float zero[3]= {0,0,0};
+                                       view3d_cached_text_draw_add(zero, ob->id.name+2, 10, 0);
                                }
                        }
                        /*if(dtx & OB_DRAWIMAGE) drawDispListwire(&ob->disp);*/
@@ -6158,6 +6210,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
        }
        
        /* return warning, this is cached text draw */
+       invert_m4_m4(ob->imat, ob->obmat);
        view3d_cached_text_draw_end(v3d, ar, 1, NULL);
 
        glLoadMatrixf(rv3d->viewmat);
@@ -6220,10 +6273,10 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
                if (list) {
                        bConstraint *curcon;
                        bConstraintOb *cob;
-                       char col[4], col2[4];
+                       char col1[4], col2[4];
                        
-                       UI_GetThemeColor3ubv(TH_GRID, col);
-                       UI_make_axis_color(col, col2, 'z');
+                       UI_GetThemeColor3ubv(TH_GRID, col1);
+                       UI_make_axis_color(col1, col2, 'z');
                        glColor3ubv((GLubyte *)col2);
                        
                        cob= constraints_make_evalob(scene, ob, NULL, CONSTRAINT_OBTYPE_OBJECT);
@@ -6265,7 +6318,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
 
 /* ***************** BACKBUF SEL (BBS) ********* */
 
-static void bbs_mesh_verts__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s)
+static void bbs_mesh_verts__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
 {
        int offset = (intptr_t) userData;
        EditVert *eve = EM_get_vert_for_index(index);
@@ -6301,7 +6354,7 @@ static void bbs_mesh_wire(DerivedMesh *dm, int offset)
        dm->drawMappedEdges(dm, bbs_mesh_wire__setDrawOptions, (void*)(intptr_t) offset);
 }              
 
-static int bbs_mesh_solid__setSolidDrawOptions(void *userData, int index, int *drawSmooth_r)
+static int bbs_mesh_solid__setSolidDrawOptions(void *userData, int index, int *UNUSED(drawSmooth_r))
 {
        if (EM_get_face_for_index(index)->h==0) {
                if (userData) {
@@ -6313,7 +6366,7 @@ static int bbs_mesh_solid__setSolidDrawOptions(void *userData, int index, int *d
        }
 }
 
-static void bbs_mesh_solid__drawCenter(void *userData, int index, float *cent, float *no)
+static void bbs_mesh_solid__drawCenter(void *UNUSED(userData), int index, float *cent, float *UNUSED(no))
 {
        EditFace *efa = EM_get_face_for_index(index);
 
@@ -6345,13 +6398,13 @@ static void bbs_mesh_solid_EM(Scene *scene, View3D *v3d, Object *ob, DerivedMesh
        }
 }
 
-static int bbs_mesh_solid__setDrawOpts(void *userData, int index, int *drawSmooth_r)
+static int bbs_mesh_solid__setDrawOpts(void *UNUSED(userData), int index, int *UNUSED(drawSmooth_r))
 {
        WM_set_framebuffer_index_color(index+1);
        return 1;
 }
 
-static int bbs_mesh_solid_hide__setDrawOpts(void *userData, int index, int *drawSmooth_r)
+static int bbs_mesh_solid_hide__setDrawOpts(void *userData, int index, int *UNUSED(drawSmooth_r))
 {
        Mesh *me = userData;
 
@@ -6498,7 +6551,7 @@ void draw_object_instance(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object
                        draw_object_mesh_instance(scene, v3d, rv3d, ob, dt, outline);
                        break;
                case OB_EMPTY:
-                       drawaxes(ob->empty_drawsize, 0, ob->empty_drawtype);
+                       drawaxes(ob->empty_drawsize, ob->empty_drawtype);
                        break;
        }
 }