pass the object wire color along to drawing functions, too many places would use glGetFloatv(GL_CURRENT_COLOR, curcol), which also become confusing to debug if in some cases the color was set beforehand.

This commit is contained in:
Campbell Barton
2012-06-06 18:00:08 +00:00
parent 47c96b6e40
commit b53b03ac1c
5 changed files with 180 additions and 154 deletions

View File

@@ -215,4 +215,11 @@ MINLINE void rgba_char_args_test_set(char col[4], const char r, const char g, co
} }
} }
MINLINE void cpack_cpy_3ub(unsigned char r_col[3], const unsigned int pack)
{
r_col[0] = ((pack) >> 0) & 0xFF;
r_col[1] = ((pack) >> 8) & 0xFF;
r_col[2] = ((pack) >> 16) & 0xFF;
}
#endif /* __MATH_COLOR_INLINE_C__ */ #endif /* __MATH_COLOR_INLINE_C__ */

View File

@@ -1656,7 +1656,8 @@ static void bone_matrix_translate_y(float mat[][4], float y)
} }
/* assumes object is Armature with pose */ /* assumes object is Armature with pose */
static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base, int dt, 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 is_ghost, const short is_outline)
{ {
RegionView3D *rv3d = ar->regiondata; RegionView3D *rv3d = ar->regiondata;
@@ -1833,14 +1834,7 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
else if (arm->flag & ARM_POSEMODE) else if (arm->flag & ARM_POSEMODE)
set_pchan_colorset(ob, pchan); set_pchan_colorset(ob, pchan);
else { else {
if ((scene->basact) == base) { glColor3ubv(ob_wire_col);
if (base->flag & (SELECT + BA_WAS_SEL)) UI_ThemeColor(TH_ACTIVE);
else UI_ThemeColor(TH_WIRE);
}
else {
if (base->flag & (SELECT + BA_WAS_SEL)) UI_ThemeColor(TH_SELECT);
else UI_ThemeColor(TH_WIRE);
}
} }
/* catch exception for bone with hidden parent */ /* catch exception for bone with hidden parent */
@@ -2353,7 +2347,7 @@ static void draw_ghost_poses_range(Scene *scene, View3D *v3d, ARegion *ar, Base
BKE_animsys_evaluate_animdata(scene, &ob->id, adt, (float)CFRA, ADT_RECALC_ALL); BKE_animsys_evaluate_animdata(scene, &ob->id, adt, (float)CFRA, ADT_RECALC_ALL);
BKE_pose_where_is(scene, ob); BKE_pose_where_is(scene, ob);
draw_pose_bones(scene, v3d, ar, base, OB_WIRE, TRUE, FALSE); draw_pose_bones(scene, v3d, ar, base, OB_WIRE, NULL, TRUE, FALSE);
} }
glDisable(GL_BLEND); glDisable(GL_BLEND);
if (v3d->zbuf) glEnable(GL_DEPTH_TEST); if (v3d->zbuf) glEnable(GL_DEPTH_TEST);
@@ -2432,7 +2426,7 @@ static void draw_ghost_poses_keys(Scene *scene, View3D *v3d, ARegion *ar, Base *
BKE_animsys_evaluate_animdata(scene, &ob->id, adt, (float)CFRA, ADT_RECALC_ALL); BKE_animsys_evaluate_animdata(scene, &ob->id, adt, (float)CFRA, ADT_RECALC_ALL);
BKE_pose_where_is(scene, ob); BKE_pose_where_is(scene, ob);
draw_pose_bones(scene, v3d, ar, base, OB_WIRE, TRUE, FALSE); draw_pose_bones(scene, v3d, ar, base, OB_WIRE, NULL, TRUE, FALSE);
} }
glDisable(GL_BLEND); glDisable(GL_BLEND);
if (v3d->zbuf) glEnable(GL_DEPTH_TEST); if (v3d->zbuf) glEnable(GL_DEPTH_TEST);
@@ -2502,7 +2496,7 @@ static void draw_ghost_poses(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
if (CFRA != cfrao) { if (CFRA != cfrao) {
BKE_animsys_evaluate_animdata(scene, &ob->id, adt, (float)CFRA, ADT_RECALC_ALL); BKE_animsys_evaluate_animdata(scene, &ob->id, adt, (float)CFRA, ADT_RECALC_ALL);
BKE_pose_where_is(scene, ob); BKE_pose_where_is(scene, ob);
draw_pose_bones(scene, v3d, ar, base, OB_WIRE, TRUE, FALSE); draw_pose_bones(scene, v3d, ar, base, OB_WIRE, NULL, TRUE, FALSE);
} }
} }
@@ -2517,7 +2511,7 @@ static void draw_ghost_poses(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
if (CFRA != cfrao) { if (CFRA != cfrao) {
BKE_animsys_evaluate_animdata(scene, &ob->id, adt, (float)CFRA, ADT_RECALC_ALL); BKE_animsys_evaluate_animdata(scene, &ob->id, adt, (float)CFRA, ADT_RECALC_ALL);
BKE_pose_where_is(scene, ob); BKE_pose_where_is(scene, ob);
draw_pose_bones(scene, v3d, ar, base, OB_WIRE, TRUE, FALSE); draw_pose_bones(scene, v3d, ar, base, OB_WIRE, NULL, TRUE, FALSE);
} }
} }
} }
@@ -2537,8 +2531,11 @@ static void draw_ghost_poses(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
/* ********************************** Armature Drawing - Main ************************* */ /* ********************************** Armature Drawing - Main ************************* */
/* called from drawobject.c, return 1 if nothing was drawn */ /* called from drawobject.c, return 1 if nothing was drawn
int draw_armature(Scene *scene, View3D *v3d, ARegion *ar, Base *base, int dt, int flag, const short is_outline) * (ob_wire_col == NULL) when drawing ghost */
int draw_armature(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
int dt, int flag, const unsigned char ob_wire_col[4],
const short is_outline)
{ {
Object *ob = base->object; Object *ob = base->object;
bArmature *arm = ob->data; bArmature *arm = ob->data;
@@ -2605,7 +2602,7 @@ int draw_armature(Scene *scene, View3D *v3d, ARegion *ar, Base *base, int dt, in
} }
} }
} }
draw_pose_bones(scene, v3d, ar, base, dt, FALSE, is_outline); draw_pose_bones(scene, v3d, ar, base, dt, ob_wire_col, FALSE, is_outline);
arm->flag &= ~ARM_POSEMODE; arm->flag &= ~ARM_POSEMODE;
if (ob->mode & OB_MODE_POSE) if (ob->mode & OB_MODE_POSE)

View File

@@ -1189,14 +1189,17 @@ static void draw_transp_spot_volume(Lamp *la, float x, float z)
glCullFace(GL_BACK); glCullFace(GL_BACK);
} }
static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, int dt, int flag) static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
int dt, int flag, const unsigned char ob_wire_col[4])
{ {
Object *ob = base->object; Object *ob = base->object;
const float pixsize = ED_view3d_pixel_size(rv3d, ob->obmat[3]); const float pixsize = ED_view3d_pixel_size(rv3d, ob->obmat[3]);
Lamp *la = ob->data; Lamp *la = ob->data;
float vec[3], lvec[3], vvec[3], circrad, x, y, z; float vec[3], lvec[3], vvec[3], circrad, x, y, z;
float lampsize; float lampsize;
float imat[4][4], curcol[4]; float imat[4][4];
unsigned char curcol[4];
unsigned char col[4]; unsigned char col[4];
/* cone can't be drawn for duplicated lamps, because duplilist would be freed to */ /* cone can't be drawn for duplicated lamps, because duplilist would be freed to */
/* the moment of view3d_draw_transp() call */ /* the moment of view3d_draw_transp() call */
@@ -1230,10 +1233,12 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
copy_v3_v3(vec, ob->obmat[3]); copy_v3_v3(vec, ob->obmat[3]);
/* for AA effects */ /* for AA effects */
glGetFloatv(GL_CURRENT_COLOR, curcol); curcol[0] = ob_wire_col[0];
curcol[3] = 0.6; curcol[1] = ob_wire_col[1];
glColor4fv(curcol); curcol[2] = ob_wire_col[2];
curcol[3] = 154;
glColor4ubv(curcol);
if (lampsize > 0.0f) { if (lampsize > 0.0f) {
if (ob->id.us > 1) { if (ob->id.us > 1) {
@@ -1249,7 +1254,7 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
/* restore */ /* restore */
if (ob->id.us > 1) if (ob->id.us > 1)
glColor4fv(curcol); glColor4ubv(curcol);
/* Outer circle */ /* Outer circle */
circrad = 3.0f * lampsize; circrad = 3.0f * lampsize;
@@ -1482,7 +1487,7 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
glDisable(GL_BLEND); glDisable(GL_BLEND);
/* restore for drawing extra stuff */ /* restore for drawing extra stuff */
glColor3fv(curcol); glColor3ubv(ob_wire_col);
} }
@@ -1516,7 +1521,7 @@ static void draw_focus_cross(float dist, float size)
} }
#ifdef VIEW3D_CAMERA_BORDER_HACK #ifdef VIEW3D_CAMERA_BORDER_HACK
float view3d_camera_border_hack_col[4]; unsigned char view3d_camera_border_hack_col[3];
short view3d_camera_border_hack_test = FALSE; short view3d_camera_border_hack_test = FALSE;
#endif #endif
@@ -1701,11 +1706,11 @@ static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D
} }
static void draw_viewport_reconstruction(Scene *scene, Base *base, View3D *v3d, MovieClip *clip, static void draw_viewport_reconstruction(Scene *scene, Base *base, View3D *v3d, MovieClip *clip,
int flag, int draw_selected) int flag, const unsigned char ob_wire_col[4],
int draw_selected)
{ {
MovieTracking *tracking = &clip->tracking; MovieTracking *tracking = &clip->tracking;
MovieTrackingObject *tracking_object; MovieTrackingObject *tracking_object;
float curcol[4];
int global_track_index = 1; int global_track_index = 1;
if ((v3d->flag2 & V3D_SHOW_RECONSTRUCTION) == 0) if ((v3d->flag2 & V3D_SHOW_RECONSTRUCTION) == 0)
@@ -1714,8 +1719,6 @@ static void draw_viewport_reconstruction(Scene *scene, Base *base, View3D *v3d,
if (v3d->flag2 & V3D_RENDER_OVERRIDE) if (v3d->flag2 & V3D_RENDER_OVERRIDE)
return; return;
glGetFloatv(GL_CURRENT_COLOR, curcol);
glEnable(GL_LIGHTING); glEnable(GL_LIGHTING);
glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE); glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
glEnable(GL_COLOR_MATERIAL); glEnable(GL_COLOR_MATERIAL);
@@ -1734,14 +1737,15 @@ static void draw_viewport_reconstruction(Scene *scene, Base *base, View3D *v3d,
glDisable(GL_COLOR_MATERIAL); glDisable(GL_COLOR_MATERIAL);
glDisable(GL_LIGHTING); glDisable(GL_LIGHTING);
glColor4fv(curcol); glColor3ubv(ob_wire_col);
if (flag & DRAW_PICKING) if (flag & DRAW_PICKING)
glLoadName(base->selcol); glLoadName(base->selcol);
} }
/* flag similar to draw_object() */ /* flag similar to draw_object() */
static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, int flag) static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
int flag, const unsigned char ob_wire_col[4])
{ {
/* a standing up pyramid with (0,0,0) as top */ /* a standing up pyramid with (0,0,0) as top */
Camera *cam; Camera *cam;
@@ -1755,13 +1759,15 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base
/* draw data for movie clip set as active for scene */ /* draw data for movie clip set as active for scene */
if (clip) { if (clip) {
draw_viewport_reconstruction(scene, base, v3d, clip, flag, FALSE); draw_viewport_reconstruction(scene, base, v3d, clip, flag, ob_wire_col, FALSE);
draw_viewport_reconstruction(scene, base, v3d, clip, flag, TRUE); draw_viewport_reconstruction(scene, base, v3d, clip, flag, ob_wire_col, TRUE);
} }
#ifdef VIEW3D_CAMERA_BORDER_HACK #ifdef VIEW3D_CAMERA_BORDER_HACK
if (is_view && !(G.f & G_PICKSEL)) { if (is_view && !(G.f & G_PICKSEL)) {
glGetFloatv(GL_CURRENT_COLOR, view3d_camera_border_hack_col); view3d_camera_border_hack_col[0] = ob_wire_col[0];
view3d_camera_border_hack_col[1] = ob_wire_col[1];
view3d_camera_border_hack_col[2] = ob_wire_col[2];
view3d_camera_border_hack_test = TRUE; view3d_camera_border_hack_test = TRUE;
return; return;
} }
@@ -3778,17 +3784,15 @@ static int drawDispListwire(ListBase *dlbase)
return 0; return 0;
} }
static void drawDispListsolid(ListBase *lb, Object *ob, int glsl) static void drawDispListsolid(ListBase *lb, Object *ob,
const unsigned char ob_wire_col[4], int use_glsl)
{ {
DispList *dl; DispList *dl;
GPUVertexAttribs gattribs; GPUVertexAttribs gattribs;
float *data, curcol[4]; float *data;
float *ndata; float *ndata;
if (lb == NULL) return; if (lb == NULL) return;
/* for drawing wire */
glGetFloatv(GL_CURRENT_COLOR, curcol);
glEnable(GL_LIGHTING); glEnable(GL_LIGHTING);
glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_VERTEX_ARRAY);
@@ -3811,7 +3815,7 @@ static void drawDispListsolid(ListBase *lb, Object *ob, int glsl)
int nr; int nr;
glDisable(GL_LIGHTING); glDisable(GL_LIGHTING);
glColor3fv(curcol); glColor3ubv(ob_wire_col);
// glVertexPointer(3, GL_FLOAT, 0, dl->verts); // glVertexPointer(3, GL_FLOAT, 0, dl->verts);
// glDrawArrays(GL_LINE_STRIP, 0, dl->nr); // glDrawArrays(GL_LINE_STRIP, 0, dl->nr);
@@ -3845,7 +3849,7 @@ static void drawDispListsolid(ListBase *lb, Object *ob, int glsl)
case DL_SURF: case DL_SURF:
if (dl->index) { if (dl->index) {
GPU_enable_material(dl->col + 1, (glsl) ? &gattribs : NULL); GPU_enable_material(dl->col + 1, (use_glsl) ? &gattribs : NULL);
if (dl->rt & CU_SMOOTH) glShadeModel(GL_SMOOTH); if (dl->rt & CU_SMOOTH) glShadeModel(GL_SMOOTH);
else glShadeModel(GL_FLAT); else glShadeModel(GL_FLAT);
@@ -3859,7 +3863,7 @@ static void drawDispListsolid(ListBase *lb, Object *ob, int glsl)
break; break;
case DL_INDEX3: case DL_INDEX3:
GPU_enable_material(dl->col + 1, (glsl) ? &gattribs : NULL); GPU_enable_material(dl->col + 1, (use_glsl) ? &gattribs : NULL);
glVertexPointer(3, GL_FLOAT, 0, dl->verts); glVertexPointer(3, GL_FLOAT, 0, dl->verts);
@@ -3879,7 +3883,7 @@ static void drawDispListsolid(ListBase *lb, Object *ob, int glsl)
break; break;
case DL_INDEX4: case DL_INDEX4:
GPU_enable_material(dl->col + 1, (glsl) ? &gattribs : NULL); GPU_enable_material(dl->col + 1, (use_glsl) ? &gattribs : NULL);
glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_NORMAL_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, dl->verts); glVertexPointer(3, GL_FLOAT, 0, dl->verts);
@@ -3937,7 +3941,8 @@ static int drawCurveDerivedMesh(Scene *scene, View3D *v3d, RegionView3D *rv3d, B
} }
/* returns 1 when nothing was drawn */ /* returns 1 when nothing was drawn */
static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, int dt) static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
int dt, const unsigned char ob_wire_col[4])
{ {
Object *ob = base->object; Object *ob = base->object;
ListBase *lb = NULL; ListBase *lb = NULL;
@@ -3985,12 +3990,12 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas
else { else {
if (draw_glsl_material(scene, ob, v3d, dt)) { if (draw_glsl_material(scene, ob, v3d, dt)) {
GPU_begin_object_materials(v3d, rv3d, scene, ob, 1, NULL); GPU_begin_object_materials(v3d, rv3d, scene, ob, 1, NULL);
drawDispListsolid(lb, ob, 1); drawDispListsolid(lb, ob, ob_wire_col, TRUE);
GPU_end_object_materials(); GPU_end_object_materials();
} }
else { else {
GPU_begin_object_materials(v3d, rv3d, scene, ob, 0, NULL); GPU_begin_object_materials(v3d, rv3d, scene, ob, 0, NULL);
drawDispListsolid(lb, ob, 0); drawDispListsolid(lb, ob, ob_wire_col, FALSE);
GPU_end_object_materials(); GPU_end_object_materials();
} }
if (cu->editnurb && cu->bevobj == NULL && cu->taperobj == NULL && cu->ext1 == 0.0f && cu->ext2 == 0.0f) { if (cu->editnurb && cu->bevobj == NULL && cu->taperobj == NULL && cu->ext1 == 0.0f && cu->ext2 == 0.0f) {
@@ -4022,12 +4027,12 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas
if (draw_glsl_material(scene, ob, v3d, dt)) { if (draw_glsl_material(scene, ob, v3d, dt)) {
GPU_begin_object_materials(v3d, rv3d, scene, ob, 1, NULL); GPU_begin_object_materials(v3d, rv3d, scene, ob, 1, NULL);
drawDispListsolid(lb, ob, 1); drawDispListsolid(lb, ob, ob_wire_col, TRUE);
GPU_end_object_materials(); GPU_end_object_materials();
} }
else { else {
GPU_begin_object_materials(v3d, rv3d, scene, ob, 0, NULL); GPU_begin_object_materials(v3d, rv3d, scene, ob, 0, NULL);
drawDispListsolid(lb, ob, 0); drawDispListsolid(lb, ob, ob_wire_col, FALSE);
GPU_end_object_materials(); GPU_end_object_materials();
} }
} }
@@ -4046,12 +4051,12 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas
if (draw_glsl_material(scene, ob, v3d, dt)) { if (draw_glsl_material(scene, ob, v3d, dt)) {
GPU_begin_object_materials(v3d, rv3d, scene, ob, 1, NULL); GPU_begin_object_materials(v3d, rv3d, scene, ob, 1, NULL);
drawDispListsolid(lb, ob, 1); drawDispListsolid(lb, ob, ob_wire_col, TRUE);
GPU_end_object_materials(); GPU_end_object_materials();
} }
else { else {
GPU_begin_object_materials(v3d, rv3d, scene, ob, 0, NULL); GPU_begin_object_materials(v3d, rv3d, scene, ob, 0, NULL);
drawDispListsolid(lb, ob, 0); drawDispListsolid(lb, ob, ob_wire_col, FALSE);
GPU_end_object_materials(); GPU_end_object_materials();
} }
} }
@@ -5563,7 +5568,8 @@ static void draw_editnurb(Object *ob, Nurb *nurb, int sel)
} }
} }
static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, Nurb *nurb, int dt) static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, Nurb *nurb,
int dt, const unsigned char ob_wire_col[4])
{ {
ToolSettings *ts = scene->toolsettings; ToolSettings *ts = scene->toolsettings;
Object *ob = base->object; Object *ob = base->object;
@@ -5572,10 +5578,13 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
BevList *bl; BevList *bl;
short hide_handles = (cu->drawflag & CU_HIDE_HANDLES); short hide_handles = (cu->drawflag & CU_HIDE_HANDLES);
int index; int index;
unsigned char wire_col[3];
/* DispList */ /* DispList */
UI_ThemeColor(TH_WIRE); UI_GetThemeColor3ubv(TH_WIRE, wire_col);
drawDispList(scene, v3d, rv3d, base, dt); glColor3ubv(wire_col);
drawDispList(scene, v3d, rv3d, base, dt, ob_wire_col);
if (v3d->zbuf) glDisable(GL_DEPTH_TEST); if (v3d->zbuf) glDisable(GL_DEPTH_TEST);
@@ -5887,7 +5896,8 @@ static void drawcone(const float vec[3], float radius, float height, float tmat[
glEnd(); glEnd();
} }
/* return 1 if nothing was drawn */ /* return 1 if nothing was drawn */
static int drawmball(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, int dt) static int drawmball(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
int dt, const unsigned char ob_wire_col[4])
{ {
Object *ob = base->object; Object *ob = base->object;
MetaBall *mb; MetaBall *mb;
@@ -5898,13 +5908,19 @@ static int drawmball(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
mb = ob->data; mb = ob->data;
if (mb->editelems) { if (mb->editelems) {
UI_ThemeColor(TH_WIRE); if ((G.f & G_PICKSEL) == 0) {
if ((G.f & G_PICKSEL) == 0) drawDispList(scene, v3d, rv3d, base, dt); unsigned char wire_col[3];
UI_GetThemeColor3ubv(TH_WIRE, wire_col);
glColor3ubv(wire_col);
drawDispList(scene, v3d, rv3d, base, dt, wire_col);
}
ml = mb->editelems->first; ml = mb->editelems->first;
} }
else { else {
if ((base->flag & OB_FROMDUPLI) == 0) if ((base->flag & OB_FROMDUPLI) == 0) {
drawDispList(scene, v3d, rv3d, base, dt); drawDispList(scene, v3d, rv3d, base, dt, ob_wire_col);
}
ml = mb->elems.first; ml = mb->elems.first;
} }
@@ -6276,7 +6292,8 @@ static void drawtexspace(Object *ob)
} }
/* draws wire outline */ /* draws wire outline */
static void drawObjectSelect(Scene *scene, View3D *v3d, ARegion *ar, Base *base) static void drawObjectSelect(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
const unsigned char ob_wire_col[4])
{ {
RegionView3D *rv3d = ar->regiondata; RegionView3D *rv3d = ar->regiondata;
Object *ob = base->object; Object *ob = base->object;
@@ -6315,7 +6332,7 @@ static void drawObjectSelect(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
} }
else if (ob->type == OB_ARMATURE) { else if (ob->type == OB_ARMATURE) {
if (!(ob->mode & OB_MODE_POSE && base == scene->basact)) if (!(ob->mode & OB_MODE_POSE && base == scene->basact))
draw_armature(scene, v3d, ar, base, OB_WIRE, FALSE, TRUE); draw_armature(scene, v3d, ar, base, OB_WIRE, FALSE, ob_wire_col, TRUE);
} }
glLineWidth(1.0); glLineWidth(1.0);
@@ -6407,19 +6424,13 @@ static void draw_hooks(Object *ob)
} }
} }
static void drawRBpivot(bRigidBodyJointConstraint *data) static void drawRBpivot(bRigidBodyJointConstraint *data, const unsigned char ob_wire_col[4])
{ {
const char *axis_str[3] = {"px", "py", "pz"}; const char *axis_str[3] = {"px", "py", "pz"};
int axis; int axis;
float mat[4][4]; float mat[4][4];
/* color */ /* color */
float curcol[4];
unsigned char tcol[4];
glGetFloatv(GL_CURRENT_COLOR, curcol);
rgb_float_to_uchar(tcol, curcol);
tcol[3] = 255;
eul_to_mat4(mat, &data->axX); eul_to_mat4(mat, &data->axX);
glLineWidth(4.0f); glLineWidth(4.0f);
@@ -6438,12 +6449,87 @@ static void drawRBpivot(bRigidBodyJointConstraint *data)
glVertex3fv(v); glVertex3fv(v);
glEnd(); glEnd();
view3d_cached_text_draw_add(v, axis_str[axis], 0, V3D_CACHE_TEXT_ASCII, tcol); view3d_cached_text_draw_add(v, axis_str[axis], 0, V3D_CACHE_TEXT_ASCII, ob_wire_col);
} }
glLineWidth(1.0f); glLineWidth(1.0f);
setlinestyle(0); setlinestyle(0);
} }
static void draw_object_wire_color(Scene *scene, Base *base, unsigned char r_ob_wire_col[4],
const int warning_recursive)
{
Object *ob = base->object;
int colindex = 0;
/* confusing logic here, there are 2 methods of setting the color
* 'colortab[colindex]' and 'theme_id', colindex overrides theme_id.
*
* note: no theme yet for 'colindex' */
int theme_id = TH_WIRE;
int theme_shade = 0;
if ((scene->obedit == NULL) &&
(G.moving & G_TRANSFORM_OBJ) &&
(base->flag & (SELECT + BA_WAS_SEL)))
{
theme_id = TH_TRANSFORM;
}
else {
/* Sets the 'colindex' */
if (ob->id.lib) {
colindex = (base->flag & (SELECT + BA_WAS_SEL)) ? 4 : 3;
}
else if (warning_recursive == 1) {
if (base->flag & (SELECT + BA_WAS_SEL)) {
colindex = (scene->basact == base) ? 8 : 7;
}
else {
colindex = 6;
}
}
/* Sets the 'theme_id' or fallback to wire */
else {
if (ob->flag & OB_FROMGROUP) {
if (base->flag & (SELECT + BA_WAS_SEL)) {
/* uses darker active color for non-active + selected*/
theme_id = TH_GROUP_ACTIVE;
if (scene->basact != base) {
theme_shade = -16;
}
}
else {
theme_id = TH_GROUP;
}
}
else {
if (base->flag & (SELECT + BA_WAS_SEL)) {
theme_id = scene->basact == base ? TH_ACTIVE : TH_SELECT;
}
else {
if (ob->type == OB_LAMP) theme_id = TH_LAMP;
else if (ob->type == OB_SPEAKER) theme_id = TH_SPEAKER;
else if (ob->type == OB_CAMERA) theme_id = TH_CAMERA;
else if (ob->type == OB_EMPTY) theme_id = TH_EMPTY;
/* fallback to TH_WIRE */
}
}
}
}
/* finally set the color */
if (colindex == 0) {
if (theme_shade == 0) UI_GetThemeColor3ubv(theme_id, r_ob_wire_col);
else UI_GetThemeColorShade3ubv(theme_id, theme_shade, r_ob_wire_col);
}
else {
cpack_cpy_3ub(r_ob_wire_col, colortab[colindex]);
}
/* no reason to use this but some functions take col[4] */
r_ob_wire_col[3] = 255;
}
/* flag can be DRAW_PICKING and/or DRAW_CONSTCOLOR, DRAW_SCENESET */ /* flag can be DRAW_PICKING and/or DRAW_CONSTCOLOR, DRAW_SCENESET */
void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
{ {
@@ -6454,7 +6540,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
RegionView3D *rv3d = ar->regiondata; RegionView3D *rv3d = ar->regiondata;
float vec1[3], vec2[3]; float vec1[3], vec2[3];
unsigned int col = 0; unsigned int col = 0;
int /*sel, drawtype,*/ colindex = 0; unsigned char ob_wire_col[4];
int i, selstart, selend, empty_object = 0; int i, selstart, selend, empty_object = 0;
short dt, dtx, zbufoff = 0; short dt, dtx, zbufoff = 0;
const short is_obact = (ob == OBACT); const short is_obact = (ob == OBACT);
@@ -6515,73 +6601,12 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
/* which wire color */ /* which wire color */
if ((flag & DRAW_CONSTCOLOR) == 0) { if ((flag & DRAW_CONSTCOLOR) == 0) {
/* confusing logic here, there are 2 methods of setting the color
* 'colortab[colindex]' and 'theme_id', colindex overrides theme_id.
*
* note: no theme yet for 'colindex' */
int theme_id = TH_WIRE;
int theme_shade = 0;
project_short(ar, ob->obmat[3], &base->sx); project_short(ar, ob->obmat[3], &base->sx);
if ((scene->obedit == NULL) && draw_object_wire_color(scene, base, ob_wire_col, warning_recursive);
(G.moving & G_TRANSFORM_OBJ) &&
(base->flag & (SELECT + BA_WAS_SEL)))
{
theme_id = TH_TRANSFORM;
}
else {
/* Sets the 'colindex' */
if (ob->id.lib) {
colindex = (base->flag & (SELECT + BA_WAS_SEL)) ? 4 : 3;
}
else if (warning_recursive == 1) {
if (base->flag & (SELECT + BA_WAS_SEL)) {
colindex = (scene->basact == base) ? 8 : 7;
}
else {
colindex = 6;
}
}
/* Sets the 'theme_id' or fallback to wire */
else {
if (ob->flag & OB_FROMGROUP) {
if (base->flag & (SELECT + BA_WAS_SEL)) {
/* uses darker active color for non-active + selected*/
theme_id = TH_GROUP_ACTIVE;
if (scene->basact != base) {
theme_shade = -16;
}
}
else {
theme_id = TH_GROUP;
}
}
else {
if (base->flag & (SELECT + BA_WAS_SEL)) {
theme_id = scene->basact == base ? TH_ACTIVE : TH_SELECT;
}
else {
if (ob->type == OB_LAMP) theme_id = TH_LAMP;
else if (ob->type == OB_SPEAKER) theme_id = TH_SPEAKER;
else if (ob->type == OB_CAMERA) theme_id = TH_CAMERA;
else if (ob->type == OB_EMPTY) theme_id = TH_EMPTY;
/* fallback to TH_WIRE */
}
}
}
}
/* finally set the color */ glColor3ubv(ob_wire_col);
if (colindex == 0) {
if (theme_shade == 0) UI_ThemeColor(theme_id);
else UI_ThemeColorShade(theme_id, theme_shade);
}
else {
col = colortab[colindex];
cpack(col);
}
} }
/* maximum drawtype */ /* maximum drawtype */
@@ -6642,7 +6667,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
if (dt > OB_WIRE && (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)) { if (!(ob->dtx & OB_DRAWWIRE) && (ob->flag & SELECT) && !(flag & DRAW_PICKING)) {
drawObjectSelect(scene, v3d, ar, base); drawObjectSelect(scene, v3d, ar, base, ob_wire_col);
} }
} }
} }
@@ -6661,11 +6686,11 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
if (cu->flag & CU_FAST) { if (cu->flag & CU_FAST) {
cpack(0xFFFFFF); cpack(0xFFFFFF);
set_inverted_drawing(1); set_inverted_drawing(1);
drawDispList(scene, v3d, rv3d, base, OB_WIRE); drawDispList(scene, v3d, rv3d, base, OB_WIRE, ob_wire_col);
set_inverted_drawing(0); set_inverted_drawing(0);
} }
else { else {
drawDispList(scene, v3d, rv3d, base, dt); drawDispList(scene, v3d, rv3d, base, dt, ob_wire_col);
} }
if (cu->linewidth != 0.0f) { if (cu->linewidth != 0.0f) {
@@ -6740,7 +6765,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
} }
} }
else if (ED_view3d_boundbox_clip(rv3d, ob->obmat, ob->bb ? ob->bb : cu->bb)) { else if (ED_view3d_boundbox_clip(rv3d, ob->obmat, ob->bb ? ob->bb : cu->bb)) {
empty_object = drawDispList(scene, v3d, rv3d, base, dt); empty_object = drawDispList(scene, v3d, rv3d, base, dt, ob_wire_col);
} }
break; break;
@@ -6750,7 +6775,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
if (cu->editnurb) { if (cu->editnurb) {
ListBase *nurbs = BKE_curve_editNurbs_get(cu); ListBase *nurbs = BKE_curve_editNurbs_get(cu);
drawnurb(scene, v3d, rv3d, base, nurbs->first, dt); drawnurb(scene, v3d, rv3d, base, nurbs->first, dt, ob_wire_col);
} }
else if (dt == OB_BOUNDBOX) { else if (dt == OB_BOUNDBOX) {
if (((v3d->flag2 & V3D_RENDER_OVERRIDE) && (v3d->drawtype >= OB_WIRE)) == 0) { if (((v3d->flag2 & V3D_RENDER_OVERRIDE) && (v3d->drawtype >= OB_WIRE)) == 0) {
@@ -6758,7 +6783,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
} }
} }
else if (ED_view3d_boundbox_clip(rv3d, ob->obmat, ob->bb ? ob->bb : cu->bb)) { else if (ED_view3d_boundbox_clip(rv3d, ob->obmat, ob->bb ? ob->bb : cu->bb)) {
empty_object = drawDispList(scene, v3d, rv3d, base, dt); empty_object = drawDispList(scene, v3d, rv3d, base, dt, ob_wire_col);
//XXX old animsys if (cu->path) //XXX old animsys if (cu->path)
// curve_draw_speed(scene, ob); // curve_draw_speed(scene, ob);
@@ -6769,14 +6794,14 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
MetaBall *mb = ob->data; MetaBall *mb = ob->data;
if (mb->editelems) if (mb->editelems)
drawmball(scene, v3d, rv3d, base, dt); drawmball(scene, v3d, rv3d, base, dt, ob_wire_col);
else if (dt == OB_BOUNDBOX) { else if (dt == OB_BOUNDBOX) {
if (((v3d->flag2 & V3D_RENDER_OVERRIDE) && (v3d->drawtype >= OB_WIRE)) == 0) { if (((v3d->flag2 & V3D_RENDER_OVERRIDE) && (v3d->drawtype >= OB_WIRE)) == 0) {
draw_bounding_volume(scene, ob, ob->boundtype); draw_bounding_volume(scene, ob, ob->boundtype);
} }
} }
else else
empty_object = drawmball(scene, v3d, rv3d, base, dt); empty_object = drawmball(scene, v3d, rv3d, base, dt, ob_wire_col);
break; break;
} }
case OB_EMPTY: case OB_EMPTY:
@@ -6791,7 +6816,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
break; break;
case OB_LAMP: case OB_LAMP:
if ((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) { if ((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) {
drawlamp(scene, v3d, rv3d, base, dt, flag); drawlamp(scene, v3d, rv3d, base, dt, flag, ob_wire_col);
if (dtx || (base->flag & SELECT)) glMultMatrixf(ob->obmat); if (dtx || (base->flag & SELECT)) glMultMatrixf(ob->obmat);
} }
break; break;
@@ -6799,7 +6824,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
if ((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0 || if ((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0 ||
(rv3d->persp == RV3D_CAMOB && v3d->camera == ob)) /* special exception for active camera */ (rv3d->persp == RV3D_CAMOB && v3d->camera == ob)) /* special exception for active camera */
{ {
drawcamera(scene, v3d, rv3d, base, flag); drawcamera(scene, v3d, rv3d, base, flag, ob_wire_col);
break; break;
} }
case OB_SPEAKER: case OB_SPEAKER:
@@ -6822,7 +6847,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
else { else {
if (dt > OB_WIRE) if (dt > OB_WIRE)
GPU_enable_material(0, NULL); /* we use default material */ GPU_enable_material(0, NULL); /* we use default material */
empty_object = draw_armature(scene, v3d, ar, base, dt, flag, FALSE); empty_object = draw_armature(scene, v3d, ar, base, dt, flag, ob_wire_col, FALSE);
if (dt > OB_WIRE) if (dt > OB_WIRE)
GPU_disable_material(); GPU_disable_material();
} }
@@ -7026,7 +7051,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
if (con->type == CONSTRAINT_TYPE_RIGIDBODYJOINT) { if (con->type == CONSTRAINT_TYPE_RIGIDBODYJOINT) {
bRigidBodyJointConstraint *data = (bRigidBodyJointConstraint *)con->data; bRigidBodyJointConstraint *data = (bRigidBodyJointConstraint *)con->data;
if (data->flag & CONSTRAINT_DRAW_PIVOT) if (data->flag & CONSTRAINT_DRAW_PIVOT)
drawRBpivot(data); drawRBpivot(data, ob_wire_col);
} }
} }
@@ -7054,13 +7079,8 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
/* patch for several 3d cards (IBM mostly) that crash on GL_SELECT with text drawing */ /* patch for several 3d cards (IBM mostly) that crash on GL_SELECT with text drawing */
/* but, we also don't draw names for sets or duplicators */ /* but, we also don't draw names for sets or duplicators */
if (flag == 0) { if (flag == 0) {
float zero[3] = {0, 0, 0}; const float zero[3] = {0, 0, 0};
float curcol[4]; view3d_cached_text_draw_add(zero, ob->id.name + 2, 10, 0, ob_wire_col);
unsigned char tcol[4];
glGetFloatv(GL_CURRENT_COLOR, curcol);
rgb_float_to_uchar(tcol, curcol);
tcol[3] = 255;
view3d_cached_text_draw_add(zero, ob->id.name + 2, 10, 0, tcol);
} }
} }
/*if (dtx & OB_DRAWIMAGE) drawDispListwire(&ob->disp);*/ /*if (dtx & OB_DRAWIMAGE) drawDispListwire(&ob->disp);*/

View File

@@ -1127,7 +1127,7 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d)
#ifdef VIEW3D_CAMERA_BORDER_HACK #ifdef VIEW3D_CAMERA_BORDER_HACK
if (view3d_camera_border_hack_test == TRUE) { if (view3d_camera_border_hack_test == TRUE) {
glColor4fv(view3d_camera_border_hack_col); glColor3ubv(view3d_camera_border_hack_col);
glRectf(x1i + 1, y1i + 1, x2i - 1, y2i - 1); glRectf(x1i + 1, y1i + 1, x2i - 1, y2i - 1);
view3d_camera_border_hack_test = FALSE; view3d_camera_border_hack_test = FALSE;
} }

View File

@@ -128,7 +128,9 @@ void view3d_cached_text_draw_end(View3D * v3d, ARegion * ar, int depth_write, fl
#define V3D_CACHE_TEXT_LOCALCLIP (1 << 4) #define V3D_CACHE_TEXT_LOCALCLIP (1 << 4)
/* drawarmature.c */ /* drawarmature.c */
int draw_armature(Scene *scene, View3D *v3d, ARegion *ar, Base *base, int dt, int flag, const short is_outline); int draw_armature(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
int dt, int flag, const unsigned char ob_wire_col[4],
const short is_outline);
/* drawmesh.c */ /* drawmesh.c */
void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d,
@@ -211,7 +213,7 @@ void draw_volume(struct ARegion *ar, struct GPUTexture *tex, float min[3], float
* any direction it starts to fail */ * any direction it starts to fail */
#define VIEW3D_CAMERA_BORDER_HACK #define VIEW3D_CAMERA_BORDER_HACK
#ifdef VIEW3D_CAMERA_BORDER_HACK #ifdef VIEW3D_CAMERA_BORDER_HACK
extern float view3d_camera_border_hack_col[4]; extern unsigned char view3d_camera_border_hack_col[3];
extern short view3d_camera_border_hack_test; extern short view3d_camera_border_hack_test;
#endif #endif