diff options
author | Julian Eisel <eiseljulian@gmail.com> | 2017-04-07 17:02:45 +0300 |
---|---|---|
committer | Julian Eisel <eiseljulian@gmail.com> | 2017-04-07 17:04:04 +0300 |
commit | 204e067111af9346fccea9981a0a7962ec8ef906 (patch) | |
tree | 82f0bc9511ecce61328772ea55d153fb5fcfb3ba /source | |
parent | 2dd84c9570c54b5061eca1f55854674b65cfb9b1 (diff) |
Fix drawing of planar transfrom manipulators, update matrix code
Diffstat (limited to 'source')
7 files changed, 62 insertions, 64 deletions
diff --git a/source/blender/windowmanager/manipulators/intern/manipulator_library/arrow2d_manipulator.c b/source/blender/windowmanager/manipulators/intern/manipulator_library/arrow2d_manipulator.c index 310aec9cbc1..3f7dadbc9c2 100644 --- a/source/blender/windowmanager/manipulators/intern/manipulator_library/arrow2d_manipulator.c +++ b/source/blender/windowmanager/manipulators/intern/manipulator_library/arrow2d_manipulator.c @@ -44,6 +44,8 @@ #include "ED_screen.h" +#include "GPU_matrix.h" + #include "MEM_guardedalloc.h" #include "RNA_access.h" @@ -73,12 +75,12 @@ static void arrow2d_draw_geom(ArrowManipulator2D *arrow, const float origin[2]) const float len = arrow->line_len; const float draw_line_ofs = (arrow->manipulator.line_width * 0.5f) / arrow->manipulator.scale; - glPushMatrix(); - glTranslatef(UNPACK2(origin), 0.0f); - glScalef(arrow->manipulator.scale, arrow->manipulator.scale, 0.0f); - glRotatef(RAD2DEGF(arrow->angle), 0.0f, 0.0f, 1.0f); + gpuPushMatrix(); + gpuTranslate3f(UNPACK2(origin), 0.0f); + gpuScale3f(arrow->manipulator.scale, arrow->manipulator.scale, 0.0f); + gpuRotate3f(RAD2DEGF(arrow->angle), 0.0f, 0.0f, 1.0f); /* local offset */ - glTranslatef(arrow->manipulator.offset[0] + draw_line_ofs, arrow->manipulator.offset[1], 0.0f); + gpuTranslate3f(arrow->manipulator.offset[0] + draw_line_ofs, arrow->manipulator.offset[1], 0.0f); /* TODO get rid of immediate mode */ glBegin(GL_LINES); @@ -91,7 +93,7 @@ static void arrow2d_draw_geom(ArrowManipulator2D *arrow, const float origin[2]) glVertex2f(0.0f, len + size * 1.7f); glEnd(); - glPopMatrix(); + gpuPopMatrix(); } static void manipulator_arrow2d_draw(const bContext *UNUSED(C), struct wmManipulator *manipulator) diff --git a/source/blender/windowmanager/manipulators/intern/manipulator_library/arrow_manipulator.c b/source/blender/windowmanager/manipulators/intern/manipulator_library/arrow_manipulator.c index 8236d9950a2..05fa0d78c4f 100644 --- a/source/blender/windowmanager/manipulators/intern/manipulator_library/arrow_manipulator.c +++ b/source/blender/windowmanager/manipulators/intern/manipulator_library/arrow_manipulator.c @@ -101,9 +101,12 @@ static void manipulator_arrow_get_final_pos(wmManipulator *manipulator, float r_ static void arrow_draw_geom(const ArrowManipulator *arrow, const bool select, const float color[4]) { + unsigned int pos = VertexFormat_add_attrib(immVertexFormat(), "pos", COMP_F32, 3, KEEP_FLOAT); + bool unbind_shader = true; + + immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); + if (arrow->style & MANIPULATOR_ARROW_STYLE_CROSS) { - immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); - unsigned int pos = VertexFormat_add_attrib(immVertexFormat(), "pos", COMP_F32, 2, KEEP_FLOAT); immUniformColor4fv(color); immBegin(GL_LINES, 4); @@ -112,8 +115,6 @@ static void arrow_draw_geom(const ArrowManipulator *arrow, const bool select, co immVertex2f(pos, 0.f, -1.0); immVertex2f(pos, 0.f, 1.0); immEnd(); - - immUnbindProgram(); } else if (arrow->style & MANIPULATOR_ARROW_STYLE_CONE) { const float unitx = arrow->aspect[0]; @@ -125,32 +126,13 @@ static void arrow_draw_geom(const ArrowManipulator *arrow, const bool select, co {-unitx, unity, 0}, }; - unsigned int pos = VertexFormat_add_attrib(immVertexFormat(), "pos", COMP_F32, 3, KEEP_FLOAT); - - immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); - immUniformColor4fv(color); - glLineWidth(arrow->manipulator.line_width); - - const int vec_size = ARRAY_SIZE(vec); - immBegin(PRIM_LINE_STRIP, vec_size); - for (int i = 0; i < vec_size; i++) { - immVertex3fv(pos, vec[i]); - } - immEnd(); - - glLineWidth(1.0); - immUnbindProgram(); - + wm_manipulator_vec_draw(color, vec, ARRAY_SIZE(vec), pos, PRIM_LINE_STRIP); } else { #ifdef USE_MANIPULATOR_CUSTOM_ARROWS wm_manipulator_geometryinfo_draw(&wm_manipulator_geom_data_arrow, select, color); #else - unsigned int pos = VertexFormat_add_attrib(immVertexFormat(), "pos", COMP_F32, 3, KEEP_FLOAT); - - immBindBuiltinProgram(GPU_SHADER_3D_CLIPPED_UNIFORM_COLOR); - immUniformColor4fv(color); const float vec[2][3] = { {0.0f, 0.0f, 0.0f}, @@ -158,15 +140,8 @@ static void arrow_draw_geom(const ArrowManipulator *arrow, const bool select, co }; glLineWidth(arrow->manipulator.line_width); + wm_manipulator_vec_draw(color, vec, ARRAY_SIZE(vec), pos, PRIM_LINE_STRIP); - const int vec_size = ARRAY_SIZE(vec); - immBegin(PRIM_LINE_STRIP, vec_size); - for (int i = 0; i < vec_size; i++) { - immVertex3fv(pos, vec[i]); - } - immEnd(); - - glLineWidth(1.0); /* *** draw arrow head *** */ @@ -182,6 +157,7 @@ static void arrow_draw_geom(const ArrowManipulator *arrow, const bool select, co /* draw cube */ immUnbindProgram(); + unbind_shader = false; wm_manipulator_geometryinfo_draw(&wm_manipulator_geom_data_cube, select, color); } else { @@ -202,14 +178,15 @@ static void arrow_draw_geom(const ArrowManipulator *arrow, const bool select, co if (use_lighting) { glShadeModel(GL_FLAT); } - immUnbindProgram(); } gpuPopMatrix(); - - #endif /* USE_MANIPULATOR_CUSTOM_ARROWS */ } + + if (unbind_shader) { + immUnbindProgram(); + } } static void arrow_draw_intern(ArrowManipulator *arrow, const bool select, const bool highlight) diff --git a/source/blender/windowmanager/manipulators/intern/manipulator_library/cage_manipulator.c b/source/blender/windowmanager/manipulators/intern/manipulator_library/cage_manipulator.c index a22ccfa7c83..c963ede3a42 100644 --- a/source/blender/windowmanager/manipulators/intern/manipulator_library/cage_manipulator.c +++ b/source/blender/windowmanager/manipulators/intern/manipulator_library/cage_manipulator.c @@ -45,6 +45,8 @@ #include "ED_screen.h" +#include "GPU_matrix.h" + #include "MEM_guardedalloc.h" #include "RNA_access.h" @@ -187,13 +189,13 @@ static void manipulator_rect_transform_draw(const bContext *UNUSED(C), wmManipul r.xmax = half_w; r.ymax = half_h; - glPushMatrix(); - glTranslatef(manipulator->origin[0] + manipulator->offset[0], + gpuPushMatrix(); + gpuTranslate3f(manipulator->origin[0] + manipulator->offset[0], manipulator->origin[1] + manipulator->offset[1], 0.0f); if (cage->style & MANIPULATOR_RECT_TRANSFORM_STYLE_SCALE_UNIFORM) - glScalef(cage->scale[0], cage->scale[0], 1.0); + gpuScale3f(cage->scale[0], cage->scale[0], 1.0); else - glScalef(cage->scale[0], cage->scale[1], 1.0); + gpuScale3f(cage->scale[0], cage->scale[1], 1.0); if (w > h) aspx = h / w; @@ -218,7 +220,7 @@ static void manipulator_rect_transform_draw(const bContext *UNUSED(C), wmManipul w, h, cage->manipulator.line_width); glLineWidth(1.0); - glPopMatrix(); + gpuPopMatrix(); } static int manipulator_rect_transform_get_cursor(wmManipulator *manipulator) diff --git a/source/blender/windowmanager/manipulators/intern/manipulator_library/primitive_manipulator.c b/source/blender/windowmanager/manipulators/intern/manipulator_library/primitive_manipulator.c index 5a0700359d8..7dd5d199e62 100644 --- a/source/blender/windowmanager/manipulators/intern/manipulator_library/primitive_manipulator.c +++ b/source/blender/windowmanager/manipulators/intern/manipulator_library/primitive_manipulator.c @@ -38,6 +38,8 @@ #include "DNA_view3d_types.h" #include "DNA_manipulator_types.h" +#include "GPU_immediate.h" +#include "GPU_matrix.h" #include "GPU_select.h" #include "MEM_guardedalloc.h" @@ -83,19 +85,17 @@ static void manipulator_primitive_draw_geom( { float (*verts)[3]; float vert_count; + unsigned int pos = VertexFormat_add_attrib(immVertexFormat(), "pos", COMP_F32, 3, KEEP_FLOAT); if (style == MANIPULATOR_PRIMITIVE_STYLE_PLANE) { verts = verts_plane; vert_count = ARRAY_SIZE(verts_plane); } - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(3, GL_FLOAT, 0, verts); - glColor4fv(col_inner); - glDrawArrays(GL_QUADS, 0, vert_count); - glColor4fv(col_outer); - glDrawArrays(GL_LINE_LOOP, 0, vert_count); - glDisableClientState(GL_VERTEX_ARRAY); + immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); + wm_manipulator_vec_draw(col_inner, verts, vert_count, pos, PRIM_QUADS); + wm_manipulator_vec_draw(col_outer, verts, vert_count, pos, PRIM_LINE_LOOP); + immUnbindProgram(); } static void manipulator_primitive_draw_intern( @@ -120,19 +120,19 @@ static void manipulator_primitive_draw_intern( copy_v3_v3(mat[3], prim->manipulator.origin); mul_mat3_m4_fl(mat, prim->manipulator.scale); - glPushMatrix(); - glMultMatrixf(mat); + gpuPushMatrix(); + gpuMultMatrix3D(mat); manipulator_color_get(&prim->manipulator, highlight, col_outer); copy_v4_v4(col_inner, col_outer); col_inner[3] *= 0.5f; glEnable(GL_BLEND); - glTranslatef(UNPACK3(prim->manipulator.offset)); + gpuTranslate3fv(prim->manipulator.offset); manipulator_primitive_draw_geom(col_inner, col_outer, prim->style); glDisable(GL_BLEND); - glPopMatrix(); + gpuPopMatrix(); if (prim->manipulator.interaction_data) { ManipulatorInteraction *inter = prim->manipulator.interaction_data; @@ -145,15 +145,15 @@ static void manipulator_primitive_draw_intern( copy_v3_v3(mat[3], inter->init_origin); mul_mat3_m4_fl(mat, inter->init_scale); - glPushMatrix(); - glMultMatrixf(mat); + gpuPushMatrix(); + gpuMultMatrix3D(mat); glEnable(GL_BLEND); - glTranslatef(UNPACK3(prim->manipulator.offset)); + gpuTranslate3f(UNPACK3(prim->manipulator.offset)); manipulator_primitive_draw_geom(col_inner, col_outer, prim->style); glDisable(GL_BLEND); - glPopMatrix(); + gpuPopMatrix(); } } diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c index 1917c473d94..b11fad46286 100644 --- a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c +++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c @@ -41,6 +41,7 @@ #include "GPU_batch.h" #include "GPU_glew.h" +#include "GPU_immediate.h" #include "MEM_guardedalloc.h" @@ -112,6 +113,18 @@ void wm_manipulator_geometryinfo_draw(const ManipulatorGeomInfo *info, const boo Batch_discard_all(batch); } +void wm_manipulator_vec_draw( + const float color[4], const float (*verts)[3], unsigned int vert_count, + unsigned int pos, unsigned int primitive_type) +{ + immUniformColor4fv(color); + immBegin(primitive_type, vert_count); + for (int i = 0; i < vert_count; i++) { + immVertex3fv(pos, verts[i]); + } + immEnd(); +} + /* Still unused */ wmManipulator *WM_manipulator_new( void (*draw)(const bContext *C, wmManipulator *customdata), diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h b/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h index 2acc72afc95..595eb4034a4 100644 --- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h +++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h @@ -219,6 +219,9 @@ bool wm_manipulatormap_deselect_all(struct wmManipulatorMap *mmap, struct wmMani /* Manipulator drawing */ void wm_manipulator_geometryinfo_draw(const struct ManipulatorGeomInfo *info, const bool select, const float color[4]); +void wm_manipulator_vec_draw( + const float color[4], const float (*verts)[3], unsigned int vert_count, + unsigned int pos, unsigned int primitive_type); #endif /* __WM_MANIPULATOR_INTERN_H__ */ diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c b/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c index 3c3beed73fb..196f707d8d5 100644 --- a/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c +++ b/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c @@ -42,6 +42,7 @@ #include "ED_view3d.h" #include "GPU_glew.h" +#include "GPU_matrix.h" #include "GPU_select.h" #include "MEM_guardedalloc.h" @@ -256,11 +257,11 @@ static void manipulators_draw_list(const wmManipulatorMap *mmap, const bContext glEnable(GL_LIGHT0); glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE); - glPushMatrix(); - glLoadIdentity(); + gpuPushMatrix(); + gpuLoadIdentity(); glLightfv(GL_LIGHT0, GL_POSITION, lightpos); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); - glPopMatrix(); + gpuPopMatrix(); } /* draw_manipulators contains all visible manipulators - draw them */ |