diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2017-04-29 21:12:30 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2017-04-29 21:12:30 +0300 |
commit | 74f9d3140934c5dea01821caaba9a0527579ef2a (patch) | |
tree | 35fa242859e332fb14ec9efffcdf854ba73a8e0f /source/blender/editors/uvedit | |
parent | 785950c18ade28fc6313872e67b6cc194ee67aa3 (diff) |
Getting rid of setlinestyle: UV editor drawing.
Diffstat (limited to 'source/blender/editors/uvedit')
-rw-r--r-- | source/blender/editors/uvedit/uvedit_draw.c | 161 |
1 files changed, 94 insertions, 67 deletions
diff --git a/source/blender/editors/uvedit/uvedit_draw.c b/source/blender/editors/uvedit/uvedit_draw.c index 16d430c9421..53b2bd1ae67 100644 --- a/source/blender/editors/uvedit/uvedit_draw.c +++ b/source/blender/editors/uvedit/uvedit_draw.c @@ -71,7 +71,8 @@ #include "uvedit_intern.h" -static void draw_uvs_lineloop_bmface(BMFace *efa, const int cd_loop_uv_offset, unsigned int pos); +static void draw_uvs_lineloop_bmface( + BMFace *efa, const int cd_loop_uv_offset, uint shdr_pos, const bool use_dashed, uint shdr_dashed_origin); void ED_image_draw_cursor(ARegion *ar, const float cursor[2]) { @@ -85,67 +86,69 @@ void ED_image_draw_cursor(ARegion *ar, const float cursor[2]) gpuTranslate2fv(cursor); - unsigned int pos = VertexFormat_add_attrib(immVertexFormat(), "pos", COMP_F32, 2, KEEP_FLOAT); - - immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); + VertexFormat *format = immVertexFormat(); + uint shdr_dashed_pos = VertexFormat_add_attrib(format, "pos", COMP_F32, 2, KEEP_FLOAT); + uint shdr_dashed_origin = VertexFormat_add_attrib(format, "line_origin", COMP_F32, 2, KEEP_FLOAT); - imm_cpack(0xFFFFFF); + immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_COLOR); - immBegin(PRIM_LINE_LOOP, 4); - immVertex2f(pos, -0.05f * x_fac, 0.0f); - immVertex2f(pos, 0.0f, 0.05f * y_fac); - immVertex2f(pos, 0.05f * x_fac, 0.0f); - immVertex2f(pos, 0.0f, -0.05f * y_fac); - immEnd(); + float viewport_size[4]; + glGetFloatv(GL_VIEWPORT, viewport_size); + immUniform2f("viewport_size", viewport_size[2] / UI_DPI_FAC, viewport_size[3] / UI_DPI_FAC); - setlinestyle(4); - imm_cpack(0xFF); + immUniform4f("color1", 1.0f, 0.0f, 0.0f, 1.0f); + immUniform4f("color2", 1.0f, 1.0f, 1.0f, 1.0f); + immUniform1f("dash_width", 8.0f); + immUniform1f("dash_width_on", 4.0f); - /* drawing individual segments, because the stipple pattern - * gets messed up when drawing a continuous loop */ immBegin(PRIM_LINES, 8); - immVertex2f(pos, -0.05f * x_fac, 0.0f); - immVertex2f(pos, 0.0f, 0.05f * y_fac); - immVertex2f(pos, 0.0f, 0.05f * y_fac); - immVertex2f(pos, 0.05f * x_fac, 0.0f); - immVertex2f(pos, 0.05f * x_fac, 0.0f); - immVertex2f(pos, 0.0f, -0.05f * y_fac); - immVertex2f(pos, 0.0f, -0.05f * y_fac); - immVertex2f(pos, -0.05f * x_fac, 0.0f); - immEnd(); - setlinestyle(0); - imm_cpack(0x0); + immAttrib2f(shdr_dashed_origin, -0.05f * x_fac, 0.0f); + immVertex2f(shdr_dashed_pos, -0.05f * x_fac, 0.0f); + immVertex2f(shdr_dashed_pos, 0.0f, 0.05f * y_fac); + + immAttrib2f(shdr_dashed_origin, 0.0f, 0.05f * y_fac); + immVertex2f(shdr_dashed_pos, 0.0f, 0.05f * y_fac); + immVertex2f(shdr_dashed_pos, 0.05f * x_fac, 0.0f); + + immAttrib2f(shdr_dashed_origin, 0.05f * x_fac, 0.0f); + immVertex2f(shdr_dashed_pos, 0.05f * x_fac, 0.0f); + immVertex2f(shdr_dashed_pos, 0.0f, -0.05f * y_fac); + + immAttrib2f(shdr_dashed_origin, 0.0f, -0.05f * y_fac); + immVertex2f(shdr_dashed_pos, 0.0f, -0.05f * y_fac); + immVertex2f(shdr_dashed_pos, -0.05f * x_fac, 0.0f); - immBegin(PRIM_LINES, 8); - immVertex2f(pos, -0.020f * x_fac, 0.0f); - immVertex2f(pos, -0.1f * x_fac, 0.0f); - immVertex2f(pos, 0.1f * x_fac, 0.0f); - immVertex2f(pos, 0.020f * x_fac, 0.0f); - immVertex2f(pos, 0.0f, -0.020f * y_fac); - immVertex2f(pos, 0.0f, -0.1f * y_fac); - immVertex2f(pos, 0.0f, 0.1f * y_fac); - immVertex2f(pos, 0.0f, 0.020f * y_fac); immEnd(); - setlinestyle(1); - imm_cpack(0xFFFFFF); + immUniform4f("color1", 1.0f, 1.0f, 1.0f, 1.0f); + immUniform4f("color2", 0.0f, 0.0f, 0.0f, 1.0f); + immUniform1f("dash_width", 2.0f); + immUniform1f("dash_width_on", 1.0f); immBegin(PRIM_LINES, 8); - immVertex2f(pos, -0.020f * x_fac, 0.0f); - immVertex2f(pos, -0.1f * x_fac, 0.0f); - immVertex2f(pos, 0.1f * x_fac, 0.0f); - immVertex2f(pos, 0.020f * x_fac, 0.0f); - immVertex2f(pos, 0.0f, -0.020f * y_fac); - immVertex2f(pos, 0.0f, -0.1f * y_fac); - immVertex2f(pos, 0.0f, 0.1f * y_fac); - immVertex2f(pos, 0.0f, 0.020f * y_fac); + + immAttrib2f(shdr_dashed_origin, -0.020f * x_fac, 0.0f); + immVertex2f(shdr_dashed_pos, -0.020f * x_fac, 0.0f); + immVertex2f(shdr_dashed_pos, -0.1f * x_fac, 0.0f); + + immAttrib2f(shdr_dashed_origin, 0.1f * x_fac, 0.0f); + immVertex2f(shdr_dashed_pos, 0.1f * x_fac, 0.0f); + immVertex2f(shdr_dashed_pos, 0.020f * x_fac, 0.0f); + + immAttrib2f(shdr_dashed_origin, 0.0f, -0.020f * y_fac); + immVertex2f(shdr_dashed_pos, 0.0f, -0.020f * y_fac); + immVertex2f(shdr_dashed_pos, 0.0f, -0.1f * y_fac); + + immAttrib2f(shdr_dashed_origin, 0.0f, 0.1f * y_fac); + immVertex2f(shdr_dashed_pos, 0.0f, 0.1f * y_fac); + immVertex2f(shdr_dashed_pos, 0.0f, 0.020f * y_fac); + immEnd(); immUnbindProgram(); gpuTranslate2f(-cursor[0], -cursor[1]); - setlinestyle(0); } static int draw_uvs_face_check(Scene *scene) @@ -182,7 +185,7 @@ static void draw_uvs_shadow(Object *obedit) immUniformThemeColor(TH_UV_SHADOW); BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) { - draw_uvs_lineloop_bmface(efa, cd_loop_uv_offset, pos); + draw_uvs_lineloop_bmface(efa, cd_loop_uv_offset, pos, false, 0); } immUnbindProgram(); @@ -397,17 +400,37 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe BLI_buffer_free(&tf_uvorig_buf); } -static void draw_uvs_lineloop_bmface(BMFace *efa, const int cd_loop_uv_offset, unsigned int pos) +static void draw_uvs_lineloop_bmface( + BMFace *efa, const int cd_loop_uv_offset, uint shdr_pos, const bool use_dashed, uint shdr_dashed_origin) { BMIter liter; BMLoop *l; MLoopUV *luv; - immBegin(PRIM_LINE_LOOP, efa->len); + if (use_dashed) { + immBegin(PRIM_LINES, efa->len * 2); + + const float *prev_uv = NULL; + BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { + if (prev_uv == NULL) { + luv = BM_ELEM_CD_GET_VOID_P(l->prev, cd_loop_uv_offset); + prev_uv = luv->uv; + } + luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset); + + immAttrib2fv(shdr_dashed_origin, prev_uv); + immVertex2fv(shdr_pos, prev_uv); + immVertex2fv(shdr_pos, luv->uv); + prev_uv = luv->uv; + } + } + else { + immBegin(PRIM_LINE_LOOP, efa->len); - BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { - luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset); - immVertex2fv(pos, luv->uv); + BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { + luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset); + immVertex2fv(shdr_pos, luv->uv); + } } immEnd(); @@ -746,9 +769,21 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, SceneLayer *sl, Object *obe switch (sima->dt_uv) { case SI_UVDT_DASH: - pos = VertexFormat_add_attrib(immVertexFormat(), "pos", COMP_F32, 2, KEEP_FLOAT); + { + VertexFormat *format = immVertexFormat(); + uint shdr_dashed_pos = VertexFormat_add_attrib(format, "pos", COMP_F32, 2, KEEP_FLOAT); + uint shdr_dashed_origin = VertexFormat_add_attrib(format, "line_origin", COMP_F32, 2, KEEP_FLOAT); - immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); + immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_COLOR); + + float viewport_size[4]; + glGetFloatv(GL_VIEWPORT, viewport_size); + immUniform2f("viewport_size", viewport_size[2] / UI_DPI_FAC, viewport_size[3] / UI_DPI_FAC); + + immUniform4f("color1", 0.56f, 0.56f, 0.56f, 1.0f); + immUniform4f("color2", 0.07f, 0.07f, 0.07f, 1.0f); + immUniform1f("dash_width", 4.0f); + immUniform1f("dash_width_on", 2.0f); BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) { if (!BM_elem_flag_test(efa, BM_ELEM_TAG)) @@ -756,22 +791,14 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, SceneLayer *sl, Object *obe tf = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset); if (tf) { - imm_cpack(0x111111); - - draw_uvs_lineloop_bmface(efa, cd_loop_uv_offset, pos); - - setlinestyle(2); - imm_cpack(0x909090); - - draw_uvs_lineloop_bmface(efa, cd_loop_uv_offset, pos); - - setlinestyle(0); + draw_uvs_lineloop_bmface(efa, cd_loop_uv_offset, shdr_dashed_pos, true, shdr_dashed_origin); } } immUnbindProgram(); break; + } case SI_UVDT_BLACK: /* black/white */ case SI_UVDT_WHITE: pos = VertexFormat_add_attrib(immVertexFormat(), "pos", COMP_F32, 2, KEEP_FLOAT); @@ -789,7 +816,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, SceneLayer *sl, Object *obe if (!BM_elem_flag_test(efa, BM_ELEM_TAG)) continue; - draw_uvs_lineloop_bmface(efa, cd_loop_uv_offset, pos); + draw_uvs_lineloop_bmface(efa, cd_loop_uv_offset, pos, false, 0); } immUnbindProgram(); @@ -807,7 +834,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, SceneLayer *sl, Object *obe if (!BM_elem_flag_test(efa, BM_ELEM_TAG)) continue; - draw_uvs_lineloop_bmface(efa, cd_loop_uv_offset, pos); + draw_uvs_lineloop_bmface(efa, cd_loop_uv_offset, pos, false, 0); } immUnbindProgram(); @@ -886,7 +913,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, SceneLayer *sl, Object *obe if (!BM_elem_flag_test(efa, BM_ELEM_TAG)) continue; - draw_uvs_lineloop_bmface(efa, cd_loop_uv_offset, pos); + draw_uvs_lineloop_bmface(efa, cd_loop_uv_offset, pos, false, 0); } immUnbindProgram(); |