diff options
Diffstat (limited to 'source/blender/draw/intern/draw_view.c')
-rw-r--r-- | source/blender/draw/intern/draw_view.c | 413 |
1 files changed, 206 insertions, 207 deletions
diff --git a/source/blender/draw/intern/draw_view.c b/source/blender/draw/intern/draw_view.c index b907452dad2..1543e381d8c 100644 --- a/source/blender/draw/intern/draw_view.c +++ b/source/blender/draw/intern/draw_view.c @@ -51,264 +51,263 @@ void DRW_draw_region_info(void) { - const DRWContextState *draw_ctx = DRW_context_state_get(); - ARegion *ar = draw_ctx->ar; + const DRWContextState *draw_ctx = DRW_context_state_get(); + ARegion *ar = draw_ctx->ar; - DRW_draw_cursor(); + DRW_draw_cursor(); - view3d_draw_region_info(draw_ctx->evil_C, ar); + view3d_draw_region_info(draw_ctx->evil_C, ar); } /* ************************* Background ************************** */ void DRW_draw_background(void) { - /* Just to make sure */ - glDepthMask(GL_TRUE); - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - glStencilMask(0xFF); + /* Just to make sure */ + glDepthMask(GL_TRUE); + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + glStencilMask(0xFF); - if (UI_GetThemeValue(TH_SHOW_BACK_GRAD)) { - float m[4][4]; - unit_m4(m); + if (UI_GetThemeValue(TH_SHOW_BACK_GRAD)) { + float m[4][4]; + unit_m4(m); - /* Gradient background Color */ - glDisable(GL_DEPTH_TEST); + /* Gradient background Color */ + glDisable(GL_DEPTH_TEST); - GPUVertFormat *format = immVertexFormat(); - uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); - uint color = GPU_vertformat_attr_add(format, "color", GPU_COMP_U8, 3, GPU_FETCH_INT_TO_FLOAT_UNIT); - uchar col_hi[3], col_lo[3]; + GPUVertFormat *format = immVertexFormat(); + uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); + uint color = GPU_vertformat_attr_add( + format, "color", GPU_COMP_U8, 3, GPU_FETCH_INT_TO_FLOAT_UNIT); + uchar col_hi[3], col_lo[3]; - GPU_matrix_push(); - GPU_matrix_identity_set(); - GPU_matrix_projection_set(m); + GPU_matrix_push(); + GPU_matrix_identity_set(); + GPU_matrix_projection_set(m); - immBindBuiltinProgram(GPU_SHADER_2D_SMOOTH_COLOR_DITHER); + immBindBuiltinProgram(GPU_SHADER_2D_SMOOTH_COLOR_DITHER); - UI_GetThemeColor3ubv(TH_BACK_GRAD, col_lo); - UI_GetThemeColor3ubv(TH_BACK, col_hi); + UI_GetThemeColor3ubv(TH_BACK_GRAD, col_lo); + UI_GetThemeColor3ubv(TH_BACK, col_hi); - immBegin(GPU_PRIM_TRI_FAN, 4); - immAttr3ubv(color, col_lo); - immVertex2f(pos, -1.0f, -1.0f); - immVertex2f(pos, 1.0f, -1.0f); + immBegin(GPU_PRIM_TRI_FAN, 4); + immAttr3ubv(color, col_lo); + immVertex2f(pos, -1.0f, -1.0f); + immVertex2f(pos, 1.0f, -1.0f); - immAttr3ubv(color, col_hi); - immVertex2f(pos, 1.0f, 1.0f); - immVertex2f(pos, -1.0f, 1.0f); - immEnd(); + immAttr3ubv(color, col_hi); + immVertex2f(pos, 1.0f, 1.0f); + immVertex2f(pos, -1.0f, 1.0f); + immEnd(); - immUnbindProgram(); + immUnbindProgram(); - GPU_matrix_pop(); + GPU_matrix_pop(); - glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); - glEnable(GL_DEPTH_TEST); - } - else { - /* Solid background Color */ - UI_ThemeClearColorAlpha(TH_BACK, 1.0f); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); - } + glEnable(GL_DEPTH_TEST); + } + else { + /* Solid background Color */ + UI_ThemeClearColorAlpha(TH_BACK, 1.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + } } GPUBatch *DRW_draw_background_clipping_batch_from_rv3d(const RegionView3D *rv3d) { - const BoundBox *bb = rv3d->clipbb; - const uint clipping_index[6][4] = { - {0, 1, 2, 3}, - {0, 4, 5, 1}, - {4, 7, 6, 5}, - {7, 3, 2, 6}, - {1, 5, 6, 2}, - {7, 4, 0, 3}, - }; - GPUVertBuf *vbo; - GPUIndexBuf *el; - GPUIndexBufBuilder elb = {0}; - - /* Elements */ - GPU_indexbuf_init(&elb, GPU_PRIM_TRIS, ARRAY_SIZE(clipping_index) * 2, ARRAY_SIZE(bb->vec)); - for (int i = 0; i < ARRAY_SIZE(clipping_index); i++) { - const uint *idx = clipping_index[i]; - GPU_indexbuf_add_tri_verts(&elb, idx[0], idx[1], idx[2]); - GPU_indexbuf_add_tri_verts(&elb, idx[0], idx[2], idx[3]); - } - el = GPU_indexbuf_build(&elb); - - GPUVertFormat format = {0}; - uint pos_id = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); - - vbo = GPU_vertbuf_create_with_format(&format); - GPU_vertbuf_data_alloc(vbo, ARRAY_SIZE(bb->vec)); - GPU_vertbuf_attr_fill(vbo, pos_id, bb->vec); - - return GPU_batch_create_ex(GPU_PRIM_TRIS, vbo, el, GPU_BATCH_OWNS_VBO | GPU_BATCH_OWNS_INDEX); + const BoundBox *bb = rv3d->clipbb; + const uint clipping_index[6][4] = { + {0, 1, 2, 3}, + {0, 4, 5, 1}, + {4, 7, 6, 5}, + {7, 3, 2, 6}, + {1, 5, 6, 2}, + {7, 4, 0, 3}, + }; + GPUVertBuf *vbo; + GPUIndexBuf *el; + GPUIndexBufBuilder elb = {0}; + + /* Elements */ + GPU_indexbuf_init(&elb, GPU_PRIM_TRIS, ARRAY_SIZE(clipping_index) * 2, ARRAY_SIZE(bb->vec)); + for (int i = 0; i < ARRAY_SIZE(clipping_index); i++) { + const uint *idx = clipping_index[i]; + GPU_indexbuf_add_tri_verts(&elb, idx[0], idx[1], idx[2]); + GPU_indexbuf_add_tri_verts(&elb, idx[0], idx[2], idx[3]); + } + el = GPU_indexbuf_build(&elb); + + GPUVertFormat format = {0}; + uint pos_id = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); + + vbo = GPU_vertbuf_create_with_format(&format); + GPU_vertbuf_data_alloc(vbo, ARRAY_SIZE(bb->vec)); + GPU_vertbuf_attr_fill(vbo, pos_id, bb->vec); + + return GPU_batch_create_ex(GPU_PRIM_TRIS, vbo, el, GPU_BATCH_OWNS_VBO | GPU_BATCH_OWNS_INDEX); } - /* **************************** 3D Cursor ******************************** */ static bool is_cursor_visible(const DRWContextState *draw_ctx, Scene *scene, ViewLayer *view_layer) { - View3D *v3d = draw_ctx->v3d; - if ((v3d->flag2 & V3D_HIDE_OVERLAYS) || (v3d->overlay.flag & V3D_OVERLAY_HIDE_CURSOR)) { - return false; - } - - /* don't draw cursor in paint modes, but with a few exceptions */ - if (draw_ctx->object_mode & OB_MODE_ALL_PAINT) { - /* exception: object is in weight paint and has deforming armature in pose mode */ - if (draw_ctx->object_mode & OB_MODE_WEIGHT_PAINT) { - if (BKE_object_pose_armature_get(draw_ctx->obact) != NULL) { - return true; - } - } - /* exception: object in texture paint mode, clone brush, use_clone_layer disabled */ - else if (draw_ctx->object_mode & OB_MODE_TEXTURE_PAINT) { - const Paint *p = BKE_paint_get_active(scene, view_layer); - - if (p && p->brush && p->brush->imagepaint_tool == PAINT_TOOL_CLONE) { - if ((scene->toolsettings->imapaint.flag & IMAGEPAINT_PROJECT_LAYER_CLONE) == 0) { - return true; - } - } - } - - /* no exception met? then don't draw cursor! */ - return false; - } - else if (draw_ctx->object_mode & OB_MODE_WEIGHT_GPENCIL) { - /* grease pencil hide always in some modes */ - return false; - } - - return true; + View3D *v3d = draw_ctx->v3d; + if ((v3d->flag2 & V3D_HIDE_OVERLAYS) || (v3d->overlay.flag & V3D_OVERLAY_HIDE_CURSOR)) { + return false; + } + + /* don't draw cursor in paint modes, but with a few exceptions */ + if (draw_ctx->object_mode & OB_MODE_ALL_PAINT) { + /* exception: object is in weight paint and has deforming armature in pose mode */ + if (draw_ctx->object_mode & OB_MODE_WEIGHT_PAINT) { + if (BKE_object_pose_armature_get(draw_ctx->obact) != NULL) { + return true; + } + } + /* exception: object in texture paint mode, clone brush, use_clone_layer disabled */ + else if (draw_ctx->object_mode & OB_MODE_TEXTURE_PAINT) { + const Paint *p = BKE_paint_get_active(scene, view_layer); + + if (p && p->brush && p->brush->imagepaint_tool == PAINT_TOOL_CLONE) { + if ((scene->toolsettings->imapaint.flag & IMAGEPAINT_PROJECT_LAYER_CLONE) == 0) { + return true; + } + } + } + + /* no exception met? then don't draw cursor! */ + return false; + } + else if (draw_ctx->object_mode & OB_MODE_WEIGHT_GPENCIL) { + /* grease pencil hide always in some modes */ + return false; + } + + return true; } void DRW_draw_cursor(void) { - const DRWContextState *draw_ctx = DRW_context_state_get(); - ARegion *ar = draw_ctx->ar; - Scene *scene = draw_ctx->scene; - ViewLayer *view_layer = draw_ctx->view_layer; - - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - glDepthMask(GL_FALSE); - glDisable(GL_DEPTH_TEST); - - if (is_cursor_visible(draw_ctx, scene, view_layer)) { - int co[2]; - - /* Get cursor data into quaternion form */ - const View3DCursor *cursor = &scene->cursor; - - if (ED_view3d_project_int_global( - ar, cursor->location, co, V3D_PROJ_TEST_NOP | V3D_PROJ_TEST_CLIP_NEAR) == V3D_PROJ_RET_OK) - { - RegionView3D *rv3d = ar->regiondata; - - float cursor_quat[4]; - BKE_scene_cursor_rot_to_quat(cursor, cursor_quat); - - /* Draw nice Anti Aliased cursor. */ - GPU_line_width(1.0f); - GPU_blend(true); - GPU_line_smooth(true); - - float eps = 1e-5f; - rv3d->viewquat[0] = -rv3d->viewquat[0]; - bool is_aligned = compare_v4v4(cursor_quat, rv3d->viewquat, eps); - if (is_aligned == false) { - float tquat[4]; - rotation_between_quats_to_quat(tquat, rv3d->viewquat, cursor_quat); - is_aligned = tquat[0] - eps < -1.0f; - } - rv3d->viewquat[0] = -rv3d->viewquat[0]; - - /* Draw lines */ - if (is_aligned == false) { - uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); - immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); - immUniformThemeColor3(TH_VIEW_OVERLAY); - immBegin(GPU_PRIM_LINES, 12); - - const float scale = ED_view3d_pixel_size_no_ui_scale(rv3d, cursor->location) * U.widget_unit; + const DRWContextState *draw_ctx = DRW_context_state_get(); + ARegion *ar = draw_ctx->ar; + Scene *scene = draw_ctx->scene; + ViewLayer *view_layer = draw_ctx->view_layer; + + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + glDepthMask(GL_FALSE); + glDisable(GL_DEPTH_TEST); + + if (is_cursor_visible(draw_ctx, scene, view_layer)) { + int co[2]; + + /* Get cursor data into quaternion form */ + const View3DCursor *cursor = &scene->cursor; + + if (ED_view3d_project_int_global( + ar, cursor->location, co, V3D_PROJ_TEST_NOP | V3D_PROJ_TEST_CLIP_NEAR) == + V3D_PROJ_RET_OK) { + RegionView3D *rv3d = ar->regiondata; + + float cursor_quat[4]; + BKE_scene_cursor_rot_to_quat(cursor, cursor_quat); + + /* Draw nice Anti Aliased cursor. */ + GPU_line_width(1.0f); + GPU_blend(true); + GPU_line_smooth(true); + + float eps = 1e-5f; + rv3d->viewquat[0] = -rv3d->viewquat[0]; + bool is_aligned = compare_v4v4(cursor_quat, rv3d->viewquat, eps); + if (is_aligned == false) { + float tquat[4]; + rotation_between_quats_to_quat(tquat, rv3d->viewquat, cursor_quat); + is_aligned = tquat[0] - eps < -1.0f; + } + rv3d->viewquat[0] = -rv3d->viewquat[0]; + + /* Draw lines */ + if (is_aligned == false) { + uint pos = GPU_vertformat_attr_add( + immVertexFormat(), "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); + immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); + immUniformThemeColor3(TH_VIEW_OVERLAY); + immBegin(GPU_PRIM_LINES, 12); + + const float scale = ED_view3d_pixel_size_no_ui_scale(rv3d, cursor->location) * + U.widget_unit; #define CURSOR_VERT(axis_vec, axis, fac) \ - immVertex3f( \ - pos, \ - cursor->location[0] + axis_vec[0] * (fac), \ - cursor->location[1] + axis_vec[1] * (fac), \ - cursor->location[2] + axis_vec[2] * (fac)) - -#define CURSOR_EDGE(axis_vec, axis, sign) { \ - CURSOR_VERT(axis_vec, axis, sign 1.0f); \ - CURSOR_VERT(axis_vec, axis, sign 0.25f); \ - } ((void)0) - - for (int axis = 0; axis < 3; axis++) { - float axis_vec[3] = {0}; - axis_vec[axis] = scale; - mul_qt_v3(cursor_quat, axis_vec); - CURSOR_EDGE(axis_vec, axis, +); - CURSOR_EDGE(axis_vec, axis, -); - } + immVertex3f(pos, \ + cursor->location[0] + axis_vec[0] * (fac), \ + cursor->location[1] + axis_vec[1] * (fac), \ + cursor->location[2] + axis_vec[2] * (fac)) + +#define CURSOR_EDGE(axis_vec, axis, sign) \ + { \ + CURSOR_VERT(axis_vec, axis, sign 1.0f); \ + CURSOR_VERT(axis_vec, axis, sign 0.25f); \ + } \ + ((void)0) + + for (int axis = 0; axis < 3; axis++) { + float axis_vec[3] = {0}; + axis_vec[axis] = scale; + mul_qt_v3(cursor_quat, axis_vec); + CURSOR_EDGE(axis_vec, axis, +); + CURSOR_EDGE(axis_vec, axis, -); + } #undef CURSOR_VERT #undef CURSOR_EDGE - immEnd(); - immUnbindProgram(); - } - - float original_proj[4][4]; - GPU_matrix_projection_get(original_proj); - GPU_matrix_push(); - ED_region_pixelspace(ar); - GPU_matrix_translate_2f(co[0] + 0.5f, co[1] + 0.5f); - GPU_matrix_scale_2f(U.widget_unit, U.widget_unit); - - GPUBatch *cursor_batch = DRW_cache_cursor_get(is_aligned); - GPUShader *shader = GPU_shader_get_builtin_shader(GPU_SHADER_2D_FLAT_COLOR); - GPU_batch_program_set(cursor_batch, GPU_shader_get_program(shader), GPU_shader_get_interface(shader)); - - GPU_batch_draw(cursor_batch); - - GPU_blend(false); - GPU_line_smooth(false); - GPU_matrix_pop(); - GPU_matrix_projection_set(original_proj); - } - } + immEnd(); + immUnbindProgram(); + } + + float original_proj[4][4]; + GPU_matrix_projection_get(original_proj); + GPU_matrix_push(); + ED_region_pixelspace(ar); + GPU_matrix_translate_2f(co[0] + 0.5f, co[1] + 0.5f); + GPU_matrix_scale_2f(U.widget_unit, U.widget_unit); + + GPUBatch *cursor_batch = DRW_cache_cursor_get(is_aligned); + GPUShader *shader = GPU_shader_get_builtin_shader(GPU_SHADER_2D_FLAT_COLOR); + GPU_batch_program_set( + cursor_batch, GPU_shader_get_program(shader), GPU_shader_get_interface(shader)); + + GPU_batch_draw(cursor_batch); + + GPU_blend(false); + GPU_line_smooth(false); + GPU_matrix_pop(); + GPU_matrix_projection_set(original_proj); + } + } } /* **************************** 3D Gizmo ******************************** */ void DRW_draw_gizmo_3d(void) { - const DRWContextState *draw_ctx = DRW_context_state_get(); - ARegion *ar = draw_ctx->ar; - - /* draw depth culled gizmos - gizmos need to be updated *after* view matrix was set up */ - /* TODO depth culling gizmos is not yet supported, just drawing _3D here, should - * later become _IN_SCENE (and draw _3D separate) */ - WM_gizmomap_draw( - ar->gizmo_map, draw_ctx->evil_C, - WM_GIZMOMAP_DRAWSTEP_3D); + const DRWContextState *draw_ctx = DRW_context_state_get(); + ARegion *ar = draw_ctx->ar; + /* draw depth culled gizmos - gizmos need to be updated *after* view matrix was set up */ + /* TODO depth culling gizmos is not yet supported, just drawing _3D here, should + * later become _IN_SCENE (and draw _3D separate) */ + WM_gizmomap_draw(ar->gizmo_map, draw_ctx->evil_C, WM_GIZMOMAP_DRAWSTEP_3D); } void DRW_draw_gizmo_2d(void) { - const DRWContextState *draw_ctx = DRW_context_state_get(); - ARegion *ar = draw_ctx->ar; + const DRWContextState *draw_ctx = DRW_context_state_get(); + ARegion *ar = draw_ctx->ar; - WM_gizmomap_draw( - ar->gizmo_map, draw_ctx->evil_C, - WM_GIZMOMAP_DRAWSTEP_2D); + WM_gizmomap_draw(ar->gizmo_map, draw_ctx->evil_C, WM_GIZMOMAP_DRAWSTEP_2D); - glDepthMask(GL_TRUE); + glDepthMask(GL_TRUE); } |