diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-02-14 02:34:52 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-02-14 02:35:25 +0300 |
commit | 7fc632a8564000731779bb66c7ddd6066b6511cd (patch) | |
tree | aeecc26ce1bea50f9b5b48b67b45469a2c5e264e /source/blender/editors/space_view3d/drawarmature.c | |
parent | 22df54acb62084cf8a8409203e8656f176c28a29 (diff) |
OpenGL immediate mode: drawarmature.c (end)
No deprecated call left.
Diffstat (limited to 'source/blender/editors/space_view3d/drawarmature.c')
-rw-r--r-- | source/blender/editors/space_view3d/drawarmature.c | 556 |
1 files changed, 273 insertions, 283 deletions
diff --git a/source/blender/editors/space_view3d/drawarmature.c b/source/blender/editors/space_view3d/drawarmature.c index 1de862b72e3..c14a4f980a6 100644 --- a/source/blender/editors/space_view3d/drawarmature.c +++ b/source/blender/editors/space_view3d/drawarmature.c @@ -153,7 +153,6 @@ static void cp_shade_color3ub(unsigned char cp[3], const int offset) /* This function sets the gl-color for coloring a certain bone (based on bcolor) */ static bool set_pchan_glColor(short colCode, int boneflag, short constflag) { - /* TODO remove glColor/UI_ThemeColor functions when no longer needed */ switch (colCode) { case PCHAN_COLOR_NORMAL: { @@ -175,24 +174,19 @@ static bool set_pchan_glColor(short colCode, int boneflag, short constflag) cp_shade_color3ub(cp, -50); } - glColor3ubv(cp); rgb_uchar_to_float(fcolor, cp); } else { if ((boneflag & BONE_DRAW_ACTIVE) && (boneflag & BONE_SELECTED)) { - UI_ThemeColor(TH_BONE_POSE_ACTIVE); UI_GetThemeColor4fv(TH_BONE_POSE_ACTIVE, fcolor); } else if (boneflag & BONE_DRAW_ACTIVE) { - UI_ThemeColorBlend(TH_WIRE, TH_BONE_POSE, 0.15f); /* unselected active */ UI_GetThemeColorBlendShade4fv(TH_WIRE, TH_BONE_POSE, 0.15f, 0, fcolor); } else if (boneflag & BONE_SELECTED) { - UI_ThemeColor(TH_BONE_POSE); UI_GetThemeColor4fv(TH_BONE_POSE, fcolor); } else { - UI_ThemeColor(TH_WIRE); UI_GetThemeColor4fv(TH_WIRE, fcolor); } } @@ -202,11 +196,9 @@ static bool set_pchan_glColor(short colCode, int boneflag, short constflag) case PCHAN_COLOR_SOLID: { if (bcolor) { - glColor3ubv((unsigned char *)bcolor->solid); rgb_uchar_to_float(fcolor, (unsigned char *)bcolor->solid); } else { - UI_ThemeColor(TH_BONE_SOLID); UI_GetThemeColor4fv(TH_BONE_SOLID, fcolor); } @@ -221,7 +213,6 @@ static bool set_pchan_glColor(short colCode, int boneflag, short constflag) else if (constflag & PCHAN_HAS_SPLINEIK) rgba_char_args_set((char *)cp, 200, 255, 0, 80); else if (constflag & PCHAN_HAS_CONST) rgba_char_args_set((char *)cp, 0, 255, 120, 80); - glColor4ubv(cp); rgba_uchar_to_float(fcolor, cp); return true; @@ -243,20 +234,16 @@ static bool set_pchan_glColor(short colCode, int boneflag, short constflag) copy_v3_v3_char((char *)cp, bcolor->solid); } - glColor3ubv(cp); rgb_uchar_to_float(fcolor, cp); } else { if (boneflag & BONE_DRAW_ACTIVE) { - UI_ThemeColorShade(TH_BONE_POSE, 40); UI_GetThemeColorShade4fv(TH_BONE_POSE, 40, fcolor); } else if (boneflag & BONE_SELECTED) { - UI_ThemeColor(TH_BONE_POSE); UI_GetThemeColor4fv(TH_BONE_POSE, fcolor); } else { - UI_ThemeColor(TH_BONE_SOLID); UI_GetThemeColor4fv(TH_BONE_SOLID, fcolor); } } @@ -281,20 +268,16 @@ static bool set_pchan_glColor(short colCode, int boneflag, short constflag) cp_shade_color3ub(cp, -30); } - glColor3ubv(cp); rgb_uchar_to_float(fcolor, cp); } else { if (boneflag & BONE_DRAW_ACTIVE) { - UI_ThemeColorShade(TH_BONE_POSE, 10); UI_GetThemeColorShade4fv(TH_BONE_POSE, 10, fcolor); } else if (boneflag & BONE_SELECTED) { - UI_ThemeColorShade(TH_BONE_POSE, -30); UI_GetThemeColorShade4fv(TH_BONE_POSE, -30, fcolor); } else { - UI_ThemeColorShade(TH_BONE_SOLID, -30); UI_GetThemeColorShade4fv(TH_BONE_SOLID, -30, fcolor); } } @@ -311,18 +294,15 @@ static bool set_pchan_glColor(short colCode, int boneflag, short constflag) else if (constflag & PCHAN_HAS_CONST) rgba_char_args_set((char *)cp, 0, 255, 120, 255); else if (constflag) UI_GetThemeColor4ubv(TH_BONE_POSE, cp); /* PCHAN_HAS_ACTION */ - glColor4ubv(cp); rgb_uchar_to_float(fcolor, cp); } else { if (bcolor) { const char *cp = bcolor->solid; - glColor4ub(cp[0], cp[1], cp[2], 204); rgb_uchar_to_float(fcolor, (unsigned char *)cp); fcolor[3] = 204.f / 255.f; } else { - UI_ThemeColorShade(TH_BACK, -30); UI_GetThemeColorShade4fv(TH_BACK, -30, fcolor); } } @@ -336,21 +316,16 @@ static bool set_pchan_glColor(short colCode, int boneflag, short constflag) static void set_ebone_glColor(const unsigned int boneflag) { - /* TODO remove glColor/UI_ThemeColor functions when no longer needed */ if ((boneflag & BONE_DRAW_ACTIVE) && (boneflag & BONE_SELECTED)) { - UI_ThemeColor(TH_EDGE_SELECT); UI_GetThemeColor4fv(TH_EDGE_SELECT, fcolor); } else if (boneflag & BONE_DRAW_ACTIVE) { - UI_ThemeColorBlend(TH_WIRE_EDIT, TH_EDGE_SELECT, 0.15f); /* unselected active */ UI_GetThemeColorBlendShade4fv(TH_WIRE_EDIT, TH_EDGE_SELECT, 0.15f, 0, fcolor); } else if (boneflag & BONE_SELECTED) { - UI_ThemeColorShade(TH_EDGE_SELECT, -20); UI_GetThemeColorShade4fv(TH_EDGE_SELECT, -20, fcolor); } else { - UI_ThemeColor(TH_WIRE_EDIT); UI_GetThemeColor4fv(TH_WIRE_EDIT, fcolor); } } @@ -700,11 +675,9 @@ static void draw_bone_points(const short dt, int armflag, unsigned int boneflag, if (dt <= OB_WIRE) { if (armflag & ARM_EDITMODE) { if (boneflag & BONE_ROOTSEL) { - UI_ThemeColor(TH_VERTEX_SELECT); UI_GetThemeColor4fv(TH_VERTEX_SELECT, fcolor); } else { - UI_ThemeColor(TH_VERTEX); UI_GetThemeColor4fv(TH_VERTEX, fcolor); } } @@ -713,7 +686,6 @@ static void draw_bone_points(const short dt, int armflag, unsigned int boneflag, if (armflag & ARM_POSEMODE) set_pchan_glColor(PCHAN_COLOR_SOLID, boneflag, 0); else { - UI_ThemeColor(TH_BONE_SOLID); UI_GetThemeColor4fv(TH_BONE_SOLID, fcolor); } } @@ -731,11 +703,9 @@ static void draw_bone_points(const short dt, int armflag, unsigned int boneflag, if (dt <= OB_WIRE) { if (armflag & ARM_EDITMODE) { if (boneflag & BONE_TIPSEL) { - UI_ThemeColor(TH_VERTEX_SELECT); UI_GetThemeColor4fv(TH_VERTEX_SELECT, fcolor); } else { - UI_ThemeColor(TH_VERTEX); UI_GetThemeColor4fv(TH_VERTEX, fcolor); } } @@ -744,7 +714,6 @@ static void draw_bone_points(const short dt, int armflag, unsigned int boneflag, if (armflag & ARM_POSEMODE) set_pchan_glColor(PCHAN_COLOR_SOLID, boneflag, 0); else { - UI_ThemeColor(TH_BONE_SOLID); UI_GetThemeColor4fv(TH_BONE_SOLID, fcolor); } } @@ -944,11 +913,9 @@ static void draw_sphere_bone_wire(float smat[4][4], float imat[4][4], /* sphere root color */ if (armflag & ARM_EDITMODE) { if (boneflag & BONE_ROOTSEL) { - UI_ThemeColor(TH_VERTEX_SELECT); UI_GetThemeColor4fv(TH_VERTEX_SELECT, fcolor); } else { - UI_ThemeColor(TH_VERTEX); UI_GetThemeColor4fv(TH_VERTEX, fcolor); } } @@ -968,11 +935,9 @@ static void draw_sphere_bone_wire(float smat[4][4], float imat[4][4], /* Draw tip point */ if (armflag & ARM_EDITMODE) { if (boneflag & BONE_TIPSEL) { - UI_ThemeColor(TH_VERTEX_SELECT); UI_GetThemeColor4fv(TH_VERTEX_SELECT, fcolor); } else { - UI_ThemeColor(TH_VERTEX); UI_GetThemeColor4fv(TH_VERTEX, fcolor); } } @@ -985,11 +950,9 @@ static void draw_sphere_bone_wire(float smat[4][4], float imat[4][4], /* base */ if (armflag & ARM_EDITMODE) { if (boneflag & BONE_SELECTED){ - UI_ThemeColor(TH_SELECT); UI_GetThemeColor4fv(TH_SELECT, fcolor); } else { - UI_ThemeColor(TH_WIRE_EDIT); UI_GetThemeColor4fv(TH_WIRE_EDIT, fcolor); } } @@ -1188,19 +1151,9 @@ static void draw_sphere_bone(const short dt, int armflag, int boneflag, short co gpuMatrixEnd(); } -static GLubyte bm_dot6[] = {0x0, 0x18, 0x3C, 0x7E, 0x7E, 0x3C, 0x18, 0x0}; -static GLubyte bm_dot8[] = {0x3C, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x3C}; - -static GLubyte bm_dot5[] = {0x0, 0x0, 0x10, 0x38, 0x7c, 0x38, 0x10, 0x0}; -static GLubyte bm_dot7[] = {0x0, 0x38, 0x7C, 0xFE, 0xFE, 0xFE, 0x7C, 0x38}; - - static void draw_line_bone(int armflag, int boneflag, short constflag, unsigned int id, bPoseChannel *pchan, EditBone *ebone) { - /* call this once, avoid constant changing */ - BLI_assert(glaGetOneInt(GL_UNPACK_ALIGNMENT) == 1); - float length; if (pchan) @@ -1208,59 +1161,62 @@ static void draw_line_bone(int armflag, int boneflag, short constflag, unsigned else length = ebone->length; - glPushMatrix(); - glScalef(length, length, length); + VertexFormat *format = immVertexFormat(); + unsigned int pos = add_attrib(format, "pos", GL_FLOAT, 3, KEEP_FLOAT); + + gpuMatrixBegin3D_legacy(); + gpuPushMatrix(); + gpuScale3f(length, length, length); /* this chunk not in object mode */ if (armflag & (ARM_EDITMODE | ARM_POSEMODE)) { glLineWidth(4.0f); - if (G.f & G_PICKSEL) { - /* no bitmap in selection mode, crashes 3d cards... - * instead draw a solid point the same size */ - glPointSize(8.0f); - } + glPointSize(8.0f); if (armflag & ARM_POSEMODE) set_pchan_glColor(PCHAN_COLOR_NORMAL, boneflag, constflag); else if (armflag & ARM_EDITMODE) { - UI_ThemeColor(TH_WIRE_EDIT); + UI_GetThemeColor4fv(TH_WIRE_EDIT, fcolor); } - + + /* line */ + immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); + immUniformColor4fv(fcolor); + + if (id != -1) + GPU_select_load_id(id | BONESEL_BONE); + + immBegin(GL_LINES, 2); + immVertex3f(pos, 0.0f, 1.0f, 0.0f); + immVertex3f(pos, 0.0f, 0.0f, 0.0f); + immEnd(); + + immUnbindProgram(); + + immBindBuiltinProgram(GPU_SHADER_3D_POINT_FIXED_SIZE_UNIFORM_COLOR); + immUniformColor4fv(fcolor); + /* Draw root point if we are not connected */ if ((boneflag & BONE_CONNECTED) == 0) { - if (G.f & G_PICKSEL) { + if (G.f & G_PICKSEL) GPU_select_load_id(id | BONESEL_ROOT); - glBegin(GL_POINTS); - glVertex3f(0.0f, 0.0f, 0.0f); - glEnd(); - } - else { - glRasterPos3f(0.0f, 0.0f, 0.0f); - glBitmap(8, 8, 4, 4, 0, 0, bm_dot8); - } + + immBegin(GL_POINTS, 1); + immVertex3f(pos, 0.0f, 0.0f, 0.0f); + immEnd(); } - - if (id != -1) - GPU_select_load_id((GLuint) id | BONESEL_BONE); - - glBegin(GL_LINES); - glVertex3f(0.0f, 0.0f, 0.0f); - glVertex3f(0.0f, 1.0f, 0.0f); - glEnd(); - + /* tip */ - if (G.f & G_PICKSEL) { - /* no bitmap in selection mode, crashes 3d cards... */ + if (G.f & G_PICKSEL) GPU_select_load_id(id | BONESEL_TIP); - glBegin(GL_POINTS); - glVertex3f(0.0f, 1.0f, 0.0f); - glEnd(); - } - else { - glRasterPos3f(0.0f, 1.0f, 0.0f); - glBitmap(8, 8, 4, 4, 0, 0, bm_dot7); - } - + + immBegin(GL_POINTS, 1); + immVertex3f(pos, 0.0f, 1.0f, 0.0f); + immEnd(); + + immUnbindProgram(); + + /* further we send no names */ if (id != -1) GPU_select_load_id(id & 0xFFFF); /* object tag, for bordersel optim */ @@ -1268,43 +1224,58 @@ static void draw_line_bone(int armflag, int boneflag, short constflag, unsigned if (armflag & ARM_POSEMODE) set_pchan_glColor(PCHAN_COLOR_LINEBONE, boneflag, constflag); } - - glLineWidth(2.0); - + + /* Now draw the inner color */ + glLineWidth(2.0f); + glPointSize(5.0f); + + /* line */ + if (armflag & ARM_EDITMODE) { + if (boneflag & BONE_SELECTED) UI_GetThemeColor4fv(TH_EDGE_SELECT, fcolor); + else UI_GetThemeColorShade4fv(TH_BACK, -30, fcolor); + } + + immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); + immUniformColor4fv(fcolor); + + immBegin(GL_LINES, 2); + immVertex3f(pos, 0.0f, 1.0f, 0.0f); + immVertex3f(pos, 0.0f, 0.0f, 0.0f); + immEnd(); + + immUnbindProgram(); + + immBindBuiltinProgram(GPU_SHADER_3D_POINT_FIXED_SIZE_UNIFORM_COLOR); + /*Draw root point if we are not connected */ if ((boneflag & BONE_CONNECTED) == 0) { - if ((G.f & G_PICKSEL) == 0) { - /* no bitmap in selection mode, crashes 3d cards... */ - if (armflag & ARM_EDITMODE) { - if (boneflag & BONE_ROOTSEL) UI_ThemeColor(TH_VERTEX_SELECT); - else UI_ThemeColor(TH_VERTEX); - } - glRasterPos3f(0.0f, 0.0f, 0.0f); - glBitmap(8, 8, 4, 4, 0, 0, bm_dot6); + if (armflag & ARM_EDITMODE) { + if (boneflag & BONE_ROOTSEL) UI_GetThemeColor4fv(TH_VERTEX_SELECT, fcolor); + else UI_GetThemeColor4fv(TH_VERTEX, fcolor); } + immUniformColor4fv(fcolor); + immBegin(GL_POINTS, 1); + immVertex3f(pos, 0.0f, 0.0f, 0.0f); + immEnd(); } - - if (armflag & ARM_EDITMODE) { - if (boneflag & BONE_SELECTED) UI_ThemeColor(TH_EDGE_SELECT); - else UI_ThemeColorShade(TH_BACK, -30); - } - glBegin(GL_LINES); - glVertex3f(0.0f, 0.0f, 0.0f); - glVertex3f(0.0f, 1.0f, 0.0f); - glEnd(); - + /* tip */ if ((G.f & G_PICKSEL) == 0) { /* no bitmap in selection mode, crashes 3d cards... */ if (armflag & ARM_EDITMODE) { - if (boneflag & BONE_TIPSEL) UI_ThemeColor(TH_VERTEX_SELECT); - else UI_ThemeColor(TH_VERTEX); + if (boneflag & BONE_TIPSEL) UI_GetThemeColor4fv(TH_VERTEX_SELECT, fcolor); + else UI_GetThemeColor4fv(TH_VERTEX, fcolor); } - glRasterPos3f(0.0f, 1.0f, 0.0f); - glBitmap(8, 8, 4, 4, 0, 0, bm_dot5); + immUniformColor4fv(fcolor); + immBegin(GL_POINTS, 1); + immVertex3f(pos, 0.0f, 1.0f, 0.0f); + immEnd(); } - - glPopMatrix(); + + immUnbindProgram(); + + gpuPopMatrix(); + gpuMatrixEnd(); } /* A partial copy of b_bone_spline_setup(), with just the parts for previewing editmode curve settings @@ -1456,7 +1427,6 @@ static void draw_b_bone(const short dt, int armflag, int boneflag, short constfl set_ebone_glColor(boneflag); } else { - UI_ThemeColor(TH_BONE_SOLID); UI_GetThemeColor4fv(TH_BONE_SOLID, fcolor); } } @@ -1470,7 +1440,6 @@ static void draw_b_bone(const short dt, int armflag, int boneflag, short constfl if (armflag & ARM_POSEMODE) set_pchan_glColor(PCHAN_COLOR_SOLID, boneflag, constflag); else { - UI_ThemeColor(TH_BONE_SOLID); UI_GetThemeColor4fv(TH_BONE_SOLID, fcolor); } @@ -1502,33 +1471,45 @@ static void draw_b_bone(const short dt, int armflag, int boneflag, short constfl static void draw_wire_bone_segments(bPoseChannel *pchan, Mat4 *bbones, float length, int segments) { + VertexFormat *format = immVertexFormat(); + unsigned int pos = add_attrib(format, "pos", GL_FLOAT, 3, KEEP_FLOAT); + + immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); + immUniformColor4fv(fcolor); + + gpuMatrixBegin3D_legacy(); + if ((segments > 1) && (pchan)) { float dlen = length / (float)segments; Mat4 *bbone = bbones; int a; - + for (a = 0; a < segments; a++, bbone++) { - glPushMatrix(); - glMultMatrixf(bbone->mat); - - glBegin(GL_LINES); - glVertex3f(0.0f, 0.0f, 0.0f); - glVertex3f(0.0f, dlen, 0.0f); - glEnd(); /* GL_LINES */ - - glPopMatrix(); + gpuPushMatrix(); + gpuMultMatrix3D(bbone->mat); + + immBegin(GL_LINES, 2); + immVertex3f(pos, 0.0f, 0.0f, 0.0f); + immVertex3f(pos, 0.0f, dlen, 0.0f); + immEnd(); + + gpuPopMatrix(); } } else { - glPushMatrix(); - - glBegin(GL_LINES); - glVertex3f(0.0f, 0.0f, 0.0f); - glVertex3f(0.0f, length, 0.0f); - glEnd(); - - glPopMatrix(); + gpuPushMatrix(); + + immBegin(GL_LINES, 2); + immVertex3f(pos, 0.0f, 0.0f, 0.0f); + immVertex3f(pos, 0.0f, length, 0.0f); + immEnd(); + + gpuPopMatrix(); } + + gpuMatrixEnd(); + + immUnbindProgram(); } static void draw_wire_bone(const short dt, int armflag, int boneflag, short constflag, unsigned int id, @@ -1556,6 +1537,7 @@ static void draw_wire_bone(const short dt, int armflag, int boneflag, short cons /* move to unitspace */ glPushMatrix(); glScalef(length, length, length); + flat_color = true; draw_bone_points(dt, armflag, boneflag, id); glPopMatrix(); length *= 0.95f; /* make vertices visible */ @@ -1588,15 +1570,11 @@ static void draw_wire_bone(const short dt, int armflag, int boneflag, short cons static void draw_bone(const short dt, int armflag, int boneflag, short constflag, unsigned int id, float length) { - /* Draw a 3d octahedral bone, we use normalized space based on length, - * for display-lists */ - + /* Draw a 3d octahedral bone, we use normalized space based on length */ glScalef(length, length, length); /* set up solid drawing */ if (dt > OB_WIRE) { - GPU_basic_shader_bind(GPU_SHADER_LIGHTING | GPU_SHADER_USE_COLOR); - UI_ThemeColor(TH_BONE_SOLID); UI_GetThemeColor4fv(TH_BONE_SOLID, fcolor); flat_color = false; } @@ -1646,16 +1624,10 @@ static void draw_bone(const short dt, int armflag, int boneflag, short constflag /* solid */ if (armflag & ARM_POSEMODE) set_pchan_glColor(PCHAN_COLOR_SOLID, boneflag, constflag); - else { - UI_ThemeColor(TH_BONE_SOLID); + else UI_GetThemeColor4fv(TH_BONE_SOLID, fcolor); - } - draw_bone_solid_octahedral(); - } - /* disable solid drawing */ - if (dt > OB_WIRE) { - GPU_basic_shader_bind(GPU_SHADER_USE_COLOR); + draw_bone_solid_octahedral(); } } @@ -1674,8 +1646,8 @@ static void draw_custom_bone(Scene *scene, View3D *v3d, RegionView3D *rv3d, Obje if (id != -1) { GPU_select_load_id((GLuint) id | BONESEL_BONE); } - - draw_object_instance(scene, v3d, rv3d, ob, dt, armflag & ARM_POSEMODE); + + draw_object_instance(scene, v3d, rv3d, ob, dt, armflag & ARM_POSEMODE, fcolor); } @@ -1683,7 +1655,14 @@ static void pchan_draw_IK_root_lines(bPoseChannel *pchan, short only_temp) { bConstraint *con; bPoseChannel *parchan; - + + VertexFormat *format = immVertexFormat(); + unsigned int pos = add_attrib(format, "pos", GL_FLOAT, 3, KEEP_FLOAT); + + immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); + immUniformColor4fv(fcolor); + + setlinestyle(3); for (con = pchan->constraints.first; con; con = con->next) { if (con->enforce == 0.0f) continue; @@ -1693,47 +1672,45 @@ static void pchan_draw_IK_root_lines(bPoseChannel *pchan, short only_temp) { bKinematicConstraint *data = (bKinematicConstraint *)con->data; int segcount = 0; + float ik_tip[3]; /* if only_temp, only draw if it is a temporary ik-chain */ if ((only_temp) && !(data->flag & CONSTRAINT_IK_TEMP)) continue; - - setlinestyle(3); - glBegin(GL_LINES); - + /* exclude tip from chain? */ if ((data->flag & CONSTRAINT_IK_TIP) == 0) parchan = pchan->parent; else parchan = pchan; - glVertex3fv(parchan->pose_tail); + copy_v3_v3(ik_tip, parchan->pose_tail); /* Find the chain's root */ while (parchan->parent) { segcount++; - if (segcount == data->rootbone || segcount > 255) { - break; /* 255 is weak */ - } + /* FIXME: revise the breaking conditions */ + if (segcount == data->rootbone || segcount > 255) break; /* 255 is weak */ parchan = parchan->parent; } - if (parchan) - glVertex3fv(parchan->pose_head); + + if (parchan) { + immBegin(GL_LINES, 2); + immVertex3fv(pos, ik_tip); + immVertex3fv(pos, parchan->pose_head); + immEnd(); + } - glEnd(); - setlinestyle(0); break; } case CONSTRAINT_TYPE_SPLINEIK: { bSplineIKConstraint *data = (bSplineIKConstraint *)con->data; int segcount = 0; - - setlinestyle(3); - glBegin(GL_LINES); + float ik_tip[3]; parchan = pchan; - glVertex3fv(parchan->pose_tail); + copy_v3_v3(ik_tip, parchan->pose_tail); /* Find the chain's root */ while (parchan->parent) { @@ -1743,18 +1720,21 @@ static void pchan_draw_IK_root_lines(bPoseChannel *pchan, short only_temp) parchan = parchan->parent; } /* Only draw line in case our chain is more than one bone long! */ - if (parchan != pchan) /* XXX revise the breaking conditions to only stop at the tail? */ - glVertex3fv(parchan->pose_head); - - glEnd(); - setlinestyle(0); + if (parchan != pchan) { /* XXX revise the breaking conditions to only stop at the tail? */ + immBegin(GL_LINES, 2); + immVertex3fv(pos, ik_tip); + immVertex3fv(pos, parchan->pose_head); + immEnd(); + } break; } } } + setlinestyle(0); + immUnbindProgram(); } -static void bgl_sphere_project(float ax, float az) +static void imm_sphere_project(unsigned int pos, float ax, float az) { float dir[3], sine, q3; @@ -1765,11 +1745,13 @@ static void bgl_sphere_project(float ax, float az) dir[1] = 1.0f - 2.0f * sine; dir[2] = ax * q3; - glVertex3fv(dir); + immVertex3fv(pos, dir); } -static void draw_dof_ellipse(float ax, float az) +static void draw_dof_ellipse(unsigned int pos, float ax, float az) { + const int n = 16; + const int tri = n*n - 2*n + 1; /* Yay fancy math ! */ const float staticSine[16] = { 0.0f, 0.104528463268f, 0.207911690818f, 0.309016994375f, 0.406736643076f, 0.5f, 0.587785252292f, 0.669130606359f, @@ -1778,15 +1760,15 @@ static void draw_dof_ellipse(float ax, float az) 0.994521895368f, 1.0f }; - int i, j, n = 16; + int i, j; float x, z, px, pz; glEnable(GL_BLEND); glDepthMask(0); - glColor4ub(70, 70, 70, 50); + immUniformColor4ub(70, 70, 70, 50); - glBegin(GL_QUADS); + immBegin(GL_TRIANGLES, tri*3); pz = 0.0f; for (i = 1; i < n; i++) { z = staticSine[i]; @@ -1796,36 +1778,35 @@ static void draw_dof_ellipse(float ax, float az) x = staticSine[j]; if (j == n - i) { - glEnd(); - glBegin(GL_TRIANGLES); - bgl_sphere_project(ax * px, az * z); - bgl_sphere_project(ax * px, az * pz); - bgl_sphere_project(ax * x, az * pz); - glEnd(); - glBegin(GL_QUADS); + imm_sphere_project(pos, ax * px, az * z); + imm_sphere_project(pos, ax * px, az * pz); + imm_sphere_project(pos, ax * x, az * pz); } else { - bgl_sphere_project(ax * x, az * z); - bgl_sphere_project(ax * x, az * pz); - bgl_sphere_project(ax * px, az * pz); - bgl_sphere_project(ax * px, az * z); + imm_sphere_project(pos, ax * x, az * z); + imm_sphere_project(pos, ax * x, az * pz); + imm_sphere_project(pos, ax * px, az * pz); + + imm_sphere_project(pos, ax * px, az * pz); + imm_sphere_project(pos, ax * px, az * z); + imm_sphere_project(pos, ax * x, az * z); } px = x; } pz = z; } - glEnd(); + immEnd(); glDisable(GL_BLEND); glDepthMask(1); - glColor3ub(0, 0, 0); + immUniformColor3ub(0, 0, 0); - glBegin(GL_LINE_STRIP); + immBegin(GL_LINE_STRIP, n); for (i = 0; i < n; i++) - bgl_sphere_project(staticSine[n - i - 1] * ax, staticSine[i] * az); - glEnd(); + imm_sphere_project(pos, staticSine[n - i - 1] * ax, staticSine[i] * az); + immEnd(); } static void draw_pose_dofs(Object *ob) @@ -1833,7 +1814,13 @@ static void draw_pose_dofs(Object *ob) bArmature *arm = ob->data; bPoseChannel *pchan; Bone *bone; - + + VertexFormat *format = immVertexFormat(); + unsigned int pos = add_attrib(format, "pos", GL_FLOAT, 3, KEEP_FLOAT); + + immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); + gpuMatrixBegin3D_legacy(); + for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) { bone = pchan->bone; @@ -1847,54 +1834,54 @@ static void draw_pose_dofs(Object *ob) int a, i; /* in parent-bone pose, but own restspace */ - glPushMatrix(); + gpuPushMatrix(); copy_v3_v3(posetrans, pchan->pose_mat[3]); - glTranslate3fv(posetrans); + gpuTranslate3fv(posetrans); if (pchan->parent) { copy_m4_m4(mat, pchan->parent->pose_mat); mat[3][0] = mat[3][1] = mat[3][2] = 0.0f; - glMultMatrixf(mat); + gpuMultMatrix3D(mat); } copy_m4_m3(mat, pchan->bone->bone_mat); - glMultMatrixf(mat); + gpuMultMatrix3D(mat); scale = bone->length * pchan->size[1]; - glScalef(scale, scale, scale); + gpuScale3f(scale, scale, scale); - if (pchan->ikflag & BONE_IK_XLIMIT) { - if (pchan->ikflag & BONE_IK_ZLIMIT) { - float amin[3], amax[3]; - - for (i = 0; i < 3; i++) { - /* *0.5f here comes from M_PI/360.0f when rotations were still in degrees */ - amin[i] = sinf(pchan->limitmin[i] * 0.5f); - amax[i] = sinf(pchan->limitmax[i] * 0.5f); - } - - glScalef(1.0f, -1.0f, 1.0f); - if ((amin[0] != 0.0f) && (amin[2] != 0.0f)) - draw_dof_ellipse(amin[0], amin[2]); - if ((amin[0] != 0.0f) && (amax[2] != 0.0f)) - draw_dof_ellipse(amin[0], amax[2]); - if ((amax[0] != 0.0f) && (amin[2] != 0.0f)) - draw_dof_ellipse(amax[0], amin[2]); - if ((amax[0] != 0.0f) && (amax[2] != 0.0f)) - draw_dof_ellipse(amax[0], amax[2]); - glScalef(1.0f, -1.0f, 1.0f); + if (((pchan->ikflag & BONE_IK_XLIMIT) != 0) && + ((pchan->ikflag & BONE_IK_ZLIMIT) != 0)) + { + float amin[3], amax[3]; + + for (i = 0; i < 3; i++) { + /* *0.5f here comes from M_PI/360.0f when rotations were still in degrees */ + amin[i] = sinf(pchan->limitmin[i] * 0.5f); + amax[i] = sinf(pchan->limitmax[i] * 0.5f); } + + gpuScale3f(1.0f, -1.0f, 1.0f); + if ((amin[0] != 0.0f) && (amin[2] != 0.0f)) + draw_dof_ellipse(pos, amin[0], amin[2]); + if ((amin[0] != 0.0f) && (amax[2] != 0.0f)) + draw_dof_ellipse(pos, amin[0], amax[2]); + if ((amax[0] != 0.0f) && (amin[2] != 0.0f)) + draw_dof_ellipse(pos, amax[0], amin[2]); + if ((amax[0] != 0.0f) && (amax[2] != 0.0f)) + draw_dof_ellipse(pos, amax[0], amax[2]); + gpuScale3f(1.0f, -1.0f, 1.0f); } /* arcs */ if (pchan->ikflag & BONE_IK_ZLIMIT) { /* OpenGL requires rotations in degrees; so we're taking the average angle here */ theta = RAD2DEGF(0.5f * (pchan->limitmin[2] + pchan->limitmax[2])); - glRotatef(theta, 0.0f, 0.0f, 1.0f); + gpuRotate3f(theta, 0.0f, 0.0f, 1.0f); - glColor3ub(50, 50, 255); /* blue, Z axis limit */ - glBegin(GL_LINE_STRIP); + immUniformColor3ub(50, 50, 255); /* blue, Z axis limit */ + immBegin(GL_LINE_STRIP, 33); for (a = -16; a <= 16; a++) { /* *0.5f here comes from M_PI/360.0f when rotations were still in degrees */ float fac = ((float)a) / 16.0f * 0.5f; @@ -1905,20 +1892,20 @@ static void draw_pose_dofs(Object *ob) corner[i][0] = sinf(phi); corner[i][1] = cosf(phi); corner[i][2] = 0.0f; - glVertex3fv(corner[i]); + immVertex3fv(pos, corner[i]); } - glEnd(); + immEnd(); - glRotatef(-theta, 0.0f, 0.0f, 1.0f); + gpuRotate3f(-theta, 0.0f, 0.0f, 1.0f); } if (pchan->ikflag & BONE_IK_XLIMIT) { /* OpenGL requires rotations in degrees; so we're taking the average angle here */ theta = RAD2DEGF(0.5f * (pchan->limitmin[0] + pchan->limitmax[0])); - glRotatef(theta, 1.0f, 0.0f, 0.0f); + gpuRotate3f(theta, 1.0f, 0.0f, 0.0f); - glColor3ub(255, 50, 50); /* Red, X axis limit */ - glBegin(GL_LINE_STRIP); + immUniformColor3ub(255, 50, 50); /* Red, X axis limit */ + immBegin(GL_LINE_STRIP, 33); for (a = -16; a <= 16; a++) { /* *0.5f here comes from M_PI/360.0f when rotations were still in degrees */ float fac = ((float)a) / 16.0f * 0.5f; @@ -1928,21 +1915,23 @@ static void draw_pose_dofs(Object *ob) corner[i][0] = 0.0f; corner[i][1] = sinf(phi); corner[i][2] = cosf(phi); - glVertex3fv(corner[i]); + immVertex3fv(pos, corner[i]); } - glEnd(); + immEnd(); - glRotatef(-theta, 1.0f, 0.0f, 0.0f); + gpuRotate3f(-theta, 1.0f, 0.0f, 0.0f); } /* out of cone, out of bone */ - glPopMatrix(); + gpuPopMatrix(); } } } } } } + gpuMatrixEnd(); + immUnbindProgram(); } static void bone_matrix_translate_y(float mat[4][4], float y) @@ -1975,14 +1964,12 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, BaseLegacy * bool draw_wire = false; int flag; bool is_cull_enabled; - - /* TODO find a way to overcome this. - * used in case do_const_color is true */ - glGetFloatv(GL_CURRENT_COLOR, fcolor); /* being set below */ arm->layer_used = 0; - + + rgba_uchar_to_float(fcolor, ob_wire_col); + /* precalc inverse matrix for drawing screen aligned */ if (arm->drawtype == ARM_ENVELOPE) { /* precalc inverse matrix for drawing screen aligned */ @@ -2163,7 +2150,6 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, BaseLegacy * else if (arm->flag & ARM_POSEMODE) set_pchan_colorset(ob, pchan); else { - glColor3ubv(ob_wire_col); rgba_uchar_to_float(fcolor, ob_wire_col); } @@ -2238,16 +2224,25 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, BaseLegacy * * - only if V3D_HIDE_HELPLINES is enabled... */ if ((do_dashed & DASH_HELP_LINES) && ((bone->flag & BONE_CONNECTED) == 0)) { + VertexFormat *format = immVertexFormat(); + unsigned int pos = add_attrib(format, "pos", GL_FLOAT, 3, KEEP_FLOAT); + + immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); + if (arm->flag & ARM_POSEMODE) { GPU_select_load_id(index & 0xFFFF); /* object tag, for bordersel optim */ - UI_ThemeColor(TH_WIRE); + UI_GetThemeColor4fv(TH_WIRE, fcolor); + immUniformColor4fv(fcolor); } + setlinestyle(3); - glBegin(GL_LINES); - glVertex3fv(pchan->pose_head); - glVertex3fv(pchan->parent->pose_tail); - glEnd(); + immBegin(GL_LINES, 2); + immVertex3fv(pos, pchan->pose_head); + immVertex3fv(pos, pchan->parent->pose_tail); + immEnd(); setlinestyle(0); + + immUnbindProgram(); } /* Draw a line to IK root bone @@ -2256,8 +2251,8 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, BaseLegacy * if (arm->flag & ARM_POSEMODE) { if (constflag & PCHAN_HAS_IK) { if (bone->flag & BONE_SELECTED) { - if (constflag & PCHAN_HAS_TARGET) glColor3ub(200, 120, 0); - else glColor3ub(200, 200, 50); /* add theme! */ + if (constflag & PCHAN_HAS_TARGET) rgba_float_args_set(fcolor, 200.f/255.f, 120.f/255.f, 0.f/255.f, 1.0f); + else rgba_float_args_set(fcolor, 200.f/255.f, 200.f/255.f, 50.f/255.f, 1.0f); /* add theme! */ GPU_select_load_id(index & 0xFFFF); pchan_draw_IK_root_lines(pchan, !(do_dashed & DASH_HELP_LINES)); @@ -2265,7 +2260,7 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, BaseLegacy * } else if (constflag & PCHAN_HAS_SPLINEIK) { if (bone->flag & BONE_SELECTED) { - glColor3ub(150, 200, 50); /* add theme! */ + rgba_float_args_set(fcolor, 150.f/255.f, 200.f/255.f, 50.f/255.f, 1.0f); /* add theme! */ GPU_select_load_id(index & 0xFFFF); pchan_draw_IK_root_lines(pchan, !(do_dashed & DASH_HELP_LINES)); @@ -2348,19 +2343,10 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, BaseLegacy * float vec[3]; unsigned char col[4]; - 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; - } + 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); @@ -2538,16 +2524,23 @@ static void draw_ebones(View3D *v3d, ARegion *ar, Object *ob, const short dt) /* offset to parent */ if (eBone->parent) { - UI_ThemeColor(TH_WIRE_EDIT); + VertexFormat *format = immVertexFormat(); + unsigned int pos = add_attrib(format, "pos", GL_FLOAT, 3, KEEP_FLOAT); + GPU_select_load_id(-1); /* -1 here is OK! */ - setlinestyle(3); - - glBegin(GL_LINES); - glVertex3fv(eBone->parent->tail); - glVertex3fv(eBone->head); - glEnd(); + + immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); + UI_GetThemeColor4fv(TH_WIRE_EDIT, fcolor); + immUniformColor4fv(fcolor); + setlinestyle(3); + immBegin(GL_LINES, 2); + immVertex3fv(pos, eBone->head); + immVertex3fv(pos, eBone->parent->tail); + immEnd(); setlinestyle(0); + + immUnbindProgram(); } } } @@ -2680,6 +2673,7 @@ static void draw_ghost_poses_range(Scene *scene, View3D *v3d, ARegion *ar, BaseL bPose *posen, *poseo; float start, end, stepsize, range, colfac; int cfrao, flago; + unsigned char col[4]; start = (float)arm->ghostsf; end = (float)arm->ghostef; @@ -2712,11 +2706,11 @@ static void draw_ghost_poses_range(Scene *scene, View3D *v3d, ARegion *ar, BaseL /* draw from first frame of range to last */ for (CFRA = (int)start; CFRA <= end; CFRA += (int)stepsize) { colfac = (end - (float)CFRA) / range; - UI_ThemeColorShadeAlpha(TH_WIRE, 0, -128 - (int)(120.0f * sqrtf(colfac))); + UI_GetThemeColorShadeAlpha4ubv(TH_WIRE, 0, -128 - (int)(120.0f * sqrtf(colfac)), col); BKE_animsys_evaluate_animdata(scene, &ob->id, adt, (float)CFRA, ADT_RECALC_ALL); BKE_pose_where_is(scene, ob); - draw_pose_bones(scene, v3d, ar, base, OB_WIRE, NULL, true, false); + draw_pose_bones(scene, v3d, ar, base, OB_WIRE, col, true, false); } glDisable(GL_BLEND); if (v3d->zbuf) glEnable(GL_DEPTH_TEST); @@ -2749,6 +2743,7 @@ static void draw_ghost_poses_keys(Scene *scene, View3D *v3d, ARegion *ar, BaseLe ActKeyColumn *ak, *akn; float start, end, range, colfac, i; int cfrao, flago; + unsigned char col[4]; start = (float)arm->ghostsf; end = (float)arm->ghostef; @@ -2790,13 +2785,13 @@ static void draw_ghost_poses_keys(Scene *scene, View3D *v3d, ARegion *ar, BaseLe /* draw from first frame of range to last */ for (ak = keys.first, i = 0; ak; ak = ak->next, i++) { colfac = i / range; - UI_ThemeColorShadeAlpha(TH_WIRE, 0, -128 - (int)(120.0f * sqrtf(colfac))); + UI_GetThemeColorShadeAlpha4ubv(TH_WIRE, 0, -128 - (int)(120.0f * sqrtf(colfac)), col); CFRA = (int)ak->cfra; BKE_animsys_evaluate_animdata(scene, &ob->id, adt, (float)CFRA, ADT_RECALC_ALL); BKE_pose_where_is(scene, ob); - draw_pose_bones(scene, v3d, ar, base, OB_WIRE, NULL, true, false); + draw_pose_bones(scene, v3d, ar, base, OB_WIRE, col, true, false); } glDisable(GL_BLEND); if (v3d->zbuf) glEnable(GL_DEPTH_TEST); @@ -2827,6 +2822,7 @@ static void draw_ghost_poses(Scene *scene, View3D *v3d, ARegion *ar, BaseLegacy bPose *posen, *poseo; float cur, start, end, stepsize, range, colfac, actframe, ctime; int cfrao, flago; + unsigned char col[4]; /* pre conditions, get an action with sufficient frames */ if (ELEM(NULL, adt, adt->action)) @@ -2864,7 +2860,7 @@ static void draw_ghost_poses(Scene *scene, View3D *v3d, ARegion *ar, BaseLegacy for (cur = stepsize; cur < range; cur += stepsize) { ctime = cur - (float)fmod(cfrao, stepsize); /* ensures consistent stepping */ colfac = ctime / range; - UI_ThemeColorShadeAlpha(TH_WIRE, 0, -128 - (int)(120.0f * sqrtf(colfac))); + UI_GetThemeColorShadeAlpha4ubv(TH_WIRE, 0, -128 - (int)(120.0f * sqrtf(colfac)), col); /* only within action range */ if (actframe + ctime >= start && actframe + ctime <= end) { @@ -2873,13 +2869,13 @@ static void draw_ghost_poses(Scene *scene, View3D *v3d, ARegion *ar, BaseLegacy if (CFRA != cfrao) { BKE_animsys_evaluate_animdata(scene, &ob->id, adt, (float)CFRA, ADT_RECALC_ALL); BKE_pose_where_is(scene, ob); - draw_pose_bones(scene, v3d, ar, base, OB_WIRE, NULL, true, false); + draw_pose_bones(scene, v3d, ar, base, OB_WIRE, col, true, false); } } ctime = cur + (float)fmod((float)cfrao, stepsize) - stepsize + 1.0f; /* ensures consistent stepping */ colfac = ctime / range; - UI_ThemeColorShadeAlpha(TH_WIRE, 0, -128 - (int)(120.0f * sqrtf(colfac))); + UI_GetThemeColorShadeAlpha4ubv(TH_WIRE, 0, -128 - (int)(120.0f * sqrtf(colfac)), col); /* only within action range */ if ((actframe - ctime >= start) && (actframe - ctime <= end)) { @@ -2888,7 +2884,7 @@ static void draw_ghost_poses(Scene *scene, View3D *v3d, ARegion *ar, BaseLegacy if (CFRA != cfrao) { BKE_animsys_evaluate_animdata(scene, &ob->id, adt, (float)CFRA, ADT_RECALC_ALL); BKE_pose_where_is(scene, ob); - draw_pose_bones(scene, v3d, ar, base, OB_WIRE, NULL, true, false); + draw_pose_bones(scene, v3d, ar, base, OB_WIRE, col, true, false); } } } @@ -2924,11 +2920,7 @@ bool draw_armature(Scene *scene, SceneLayer *sl, View3D *v3d, ARegion *ar, Base if (v3d->flag2 & V3D_RENDER_OVERRIDE) return true; - /* needed for 'draw_line_bone' which draws pixel. */ - if (arm->drawtype == ARM_LINE) { - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - } - +#if 0 /* Not used until lighting is properly reimplemented */ if (dt > OB_WIRE) { /* we use color for solid lighting */ if (ELEM(arm->drawtype, ARM_LINE, ARM_WIRE)) { @@ -2943,7 +2935,8 @@ bool draw_armature(Scene *scene, SceneLayer *sl, View3D *v3d, ARegion *ar, Base glFrontFace((ob->transflag & OB_NEG_SCALE) ? GL_CW : GL_CCW); /* only for lighting... */ } } - +#endif + /* arm->flag is being used to detect mode... */ /* editmode? */ if (arm->edbo) { @@ -2998,9 +2991,10 @@ bool draw_armature(Scene *scene, SceneLayer *sl, View3D *v3d, ARegion *ar, Base } draw_pose_bones(scene, v3d, ar, base, dt, ob_wire_col, (dflag & DRAW_CONSTCOLOR), is_outline); arm->flag &= ~ARM_POSEMODE; - +#if 0 if (ob->mode & OB_MODE_POSE) UI_ThemeColor(TH_WIRE); /* restore, for extra draw stuff */ +#endif } else { retval = true; @@ -3009,9 +3003,5 @@ bool draw_armature(Scene *scene, SceneLayer *sl, View3D *v3d, ARegion *ar, Base /* restore */ glFrontFace(GL_CCW); - if (arm->drawtype == ARM_LINE) { - glPixelStorei(GL_UNPACK_ALIGNMENT, 4); - } - return retval; } |