fix for error in previous commit.
authorCampbell Barton <ideasman42@gmail.com>
Thu, 7 Jun 2012 08:02:48 +0000 (08:02 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 7 Jun 2012 08:02:48 +0000 (08:02 +0000)
- dupli-group armatures with pose bone objects set would draw with uninitialized color
- also fix old bug - armature were over-riding the constcolor option - so drawing dupli-groups for eg - would ignore the DRAW_CONSTCOLOR flag.

source/blender/editors/space_view3d/drawarmature.c
source/blender/editors/space_view3d/drawobject.c

index cb8b309dc7200f9f41b17fee145a8e3589819730..cf8b84b5a560bf18cabd197aeba004e61f5dc412 100644 (file)
@@ -1658,7 +1658,7 @@ static void bone_matrix_translate_y(float mat[][4], float y)
 /* assumes object is Armature with pose */
 static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
                             int dt, const unsigned char ob_wire_col[4],
-                            const short is_ghost, const short is_outline)
+                            const short do_const_color, const short is_outline)
 {
        RegionView3D *rv3d = ar->regiondata;
        Object *ob = base->object;
@@ -1828,10 +1828,10 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
                                                        }
                                                        
                                                        /* prepare colors */
-                                                       if (is_ghost) {
+                                                       if (do_const_color) {
                                                                /* 13 October 2009, Disabled this to make ghosting show the right colors (Aligorith) */
                                                        }
-                                                       else if (arm->flag & ARM_POSEMODE)      
+                                                       else if (arm->flag & ARM_POSEMODE)
                                                                set_pchan_colorset(ob, pchan);
                                                        else {
                                                                glColor3ubv(ob_wire_col);
@@ -1993,12 +1993,22 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
                /* patch for several 3d cards (IBM mostly) that crash on GL_SELECT with text drawing */
                if ((G.f & G_PICKSEL) == 0) {
                        float vec[3];
-                       
+
                        unsigned char col[4];
-                       col[0] = ob_wire_col[0];
-                       col[1] = ob_wire_col[1];
-                       col[2] = ob_wire_col[2];
-                       col[3] = 255;
+
+                       if (do_const_color) {
+                               /* so we can draw bone names in current const color */
+                               float tcol[4];
+                               glGetFloatv(GL_CURRENT_COLOR, tcol);
+                               rgb_float_to_uchar(col, tcol);
+                               col[3] = 255;
+                       }
+                       else {
+                               col[0] = ob_wire_col[0];
+                               col[1] = ob_wire_col[1];
+                               col[2] = ob_wire_col[2];
+                               col[3] = 255;
+                       }
                        
                        if (v3d->zbuf) glDisable(GL_DEPTH_TEST);
                        
@@ -2602,7 +2612,7 @@ int draw_armature(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
                                        }
                                }       
                        }
-                       draw_pose_bones(scene, v3d, ar, base, dt, ob_wire_col, FALSE, is_outline);
+                       draw_pose_bones(scene, v3d, ar, base, dt, ob_wire_col, (flag & DRAW_CONSTCOLOR), is_outline);
                        arm->flag &= ~ARM_POSEMODE; 
                        
                        if (ob->mode & OB_MODE_POSE)
index 73d941f62ce884c23facaec5264301eb3e2d5a5f..51985a2860f05bcc89bbc579a3e68afc5f8f7e02 100644 (file)
@@ -1231,19 +1231,23 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
 
        /* lamp center */
        copy_v3_v3(vec, ob->obmat[3]);
-       
-       /* for AA effects */
-       curcol[0] = ob_wire_col[0];
-       curcol[1] = ob_wire_col[1];
-       curcol[2] = ob_wire_col[2];
-       curcol[3] = 154;
-       glColor4ubv(curcol);
+
+       if ((flag & DRAW_CONSTCOLOR) == 0) {
+               /* for AA effects */
+               curcol[0] = ob_wire_col[0];
+               curcol[1] = ob_wire_col[1];
+               curcol[2] = ob_wire_col[2];
+               curcol[3] = 154;
+               glColor4ubv(curcol);
+       }
 
        if (lampsize > 0.0f) {
 
-               if (ob->id.us > 1) {
-                       if (ob == OBACT || (ob->flag & SELECT)) glColor4ub(0x88, 0xFF, 0xFF, 155);
-                       else glColor4ub(0x77, 0xCC, 0xCC, 155);
+               if ((flag & DRAW_CONSTCOLOR) == 0) {
+                       if (ob->id.us > 1) {
+                               if (ob == OBACT || (ob->flag & SELECT)) glColor4ub(0x88, 0xFF, 0xFF, 155);
+                               else glColor4ub(0x77, 0xCC, 0xCC, 155);
+                       }
                }
                
                /* Inner Circle */
@@ -1253,8 +1257,10 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
                drawcircball(GL_POLYGON, vec, lampsize, imat);
                
                /* restore */
-               if (ob->id.us > 1)
-                       glColor4ubv(curcol);
+               if ((flag & DRAW_CONSTCOLOR) == 0) {
+                       if (ob->id.us > 1)
+                               glColor4ubv(curcol);
+               }
 
                /* Outer circle */
                circrad = 3.0f * lampsize;
@@ -1486,9 +1492,10 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
        
        glDisable(GL_BLEND);
        
-       /* restore for drawing extra stuff */
-       glColor3ubv(ob_wire_col);
-
+       if ((flag & DRAW_CONSTCOLOR) == 0) {
+               /* restore for drawing extra stuff */
+               glColor3ubv(ob_wire_col);
+       }
 }
 
 static void draw_limit_line(float sta, float end, unsigned int col)
@@ -6540,7 +6547,8 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
        RegionView3D *rv3d = ar->regiondata;
        float vec1[3], vec2[3];
        unsigned int col = 0;
-       unsigned char ob_wire_col[4];
+       unsigned char _ob_wire_col[4];      /* dont initialize this */
+       unsigned char *ob_wire_col = NULL;  /* dont initialize this, use NULL crashes as a way to find invalid use */
        int i, selstart, selend, empty_object = 0;
        short dt, dtx, zbufoff = 0;
        const short is_obact = (ob == OBACT);
@@ -6601,7 +6609,8 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
 
                project_short(ar, ob->obmat[3], &base->sx);
 
-               draw_object_wire_color(scene, base, ob_wire_col, warning_recursive);
+               draw_object_wire_color(scene, base, _ob_wire_col, warning_recursive);
+               ob_wire_col = _ob_wire_col;
 
                glColor3ubv(ob_wire_col);
        }