Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/engines/overlay/overlay_edit_mesh.c
| Show First 20 Lines • Show All 103 Lines • ▼ Show 20 Lines | if ((tsettings->selectmode & SCE_SELECT_EDGE) == 0) { | ||||
| } | } | ||||
| else { | else { | ||||
| pd->edit_mesh.do_edges = false; | pd->edit_mesh.do_edges = false; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| float backwire_opacity = (pd->edit_mesh.do_zbufclip) ? v3d->overlay.backwire_opacity : 1.0f; | float backwire_opacity = (pd->edit_mesh.do_zbufclip) ? v3d->overlay.backwire_opacity : 1.0f; | ||||
| float backpoint_opacity = (pd->edit_mesh.do_zbufclip) ? v3d->overlay.backwire_opacity : 0.0f; | |||||
| float face_alpha = (do_occlude_wire || !pd->edit_mesh.do_faces) ? 0.0f : 1.0f; | float face_alpha = (do_occlude_wire || !pd->edit_mesh.do_faces) ? 0.0f : 1.0f; | ||||
| GPUTexture **depth_tex = (pd->edit_mesh.do_zbufclip) ? &dtxl->depth : &txl->dummy_depth_tx; | GPUTexture **depth_tex = (pd->edit_mesh.do_zbufclip) ? &dtxl->depth : &txl->dummy_depth_tx; | ||||
| if (select_face && !pd->edit_mesh.do_faces && pd->edit_mesh.do_edges) { | if (select_face && !pd->edit_mesh.do_faces && pd->edit_mesh.do_edges) { | ||||
| /* Force display of face centers in this case because that's | /* Force display of face centers in this case because that's | ||||
| * the only way to see if a face is selected. */ | * the only way to see if a face is selected. */ | ||||
| show_face_dots = true; | show_face_dots = true; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 77 Lines • ▼ Show 20 Lines | for (int i = 0; i < 2; i++) { | ||||
| grp = pd->edit_mesh_edges_grp[i] = DRW_shgroup_create(edge_sh, psl->edit_mesh_edges_ps[i]); | grp = pd->edit_mesh_edges_grp[i] = DRW_shgroup_create(edge_sh, psl->edit_mesh_edges_ps[i]); | ||||
| DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); | DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); | ||||
| DRW_shgroup_uniform_ivec4(grp, "dataMask", mask, 1); | DRW_shgroup_uniform_ivec4(grp, "dataMask", mask, 1); | ||||
| DRW_shgroup_uniform_float_copy(grp, "alpha", backwire_opacity); | DRW_shgroup_uniform_float_copy(grp, "alpha", backwire_opacity); | ||||
| DRW_shgroup_uniform_texture_ref(grp, "depthTex", depth_tex); | DRW_shgroup_uniform_texture_ref(grp, "depthTex", depth_tex); | ||||
| DRW_shgroup_uniform_bool_copy(grp, "selectEdges", pd->edit_mesh.do_edges || select_edge); | DRW_shgroup_uniform_bool_copy(grp, "selectEdges", pd->edit_mesh.do_edges || select_edge); | ||||
| /* Verts */ | /* Verts and Facedots */ | ||||
| state |= DRW_STATE_WRITE_DEPTH; | state = state_common | DRW_STATE_WRITE_DEPTH; | ||||
| DRW_PASS_CREATE(psl->edit_mesh_verts_ps[i], state | pd->clipping_state); | DRW_PASS_CREATE(psl->edit_mesh_verts_ps[i], state | pd->clipping_state); | ||||
| if (select_vert) { | if (select_vert) { | ||||
| sh = OVERLAY_shader_edit_mesh_vert(); | sh = OVERLAY_shader_edit_mesh_vert(); | ||||
| grp = pd->edit_mesh_verts_grp[i] = DRW_shgroup_create(sh, psl->edit_mesh_verts_ps[i]); | grp = pd->edit_mesh_verts_grp[i] = DRW_shgroup_create(sh, psl->edit_mesh_verts_ps[i]); | ||||
| DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); | DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); | ||||
| DRW_shgroup_uniform_float_copy(grp, "alpha", backwire_opacity); | DRW_shgroup_uniform_float_copy(grp, "alpha", backpoint_opacity); | ||||
| DRW_shgroup_uniform_texture_ref(grp, "depthTex", depth_tex); | DRW_shgroup_uniform_texture_ref(grp, "depthTex", &dtxl->depth); | ||||
| sh = OVERLAY_shader_edit_mesh_skin_root(); | sh = OVERLAY_shader_edit_mesh_skin_root(); | ||||
| grp = pd->edit_mesh_skin_roots_grp[i] = DRW_shgroup_create(sh, psl->edit_mesh_verts_ps[i]); | grp = pd->edit_mesh_skin_roots_grp[i] = DRW_shgroup_create(sh, psl->edit_mesh_verts_ps[i]); | ||||
| DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); | DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); | ||||
| } | } | ||||
| /* Facedots */ | |||||
| if (select_face && show_face_dots) { | if (select_face && show_face_dots) { | ||||
| sh = OVERLAY_shader_edit_mesh_facedot(); | sh = OVERLAY_shader_edit_mesh_facedot(); | ||||
| grp = pd->edit_mesh_facedots_grp[i] = DRW_shgroup_create(sh, psl->edit_mesh_verts_ps[i]); | grp = pd->edit_mesh_facedots_grp[i] = DRW_shgroup_create(sh, psl->edit_mesh_verts_ps[i]); | ||||
| DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); | DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); | ||||
| DRW_shgroup_uniform_float_copy(grp, "alpha", backwire_opacity); | DRW_shgroup_uniform_float_copy(grp, "alpha", backpoint_opacity); | ||||
| DRW_shgroup_uniform_texture_ref(grp, "depthTex", depth_tex); | DRW_shgroup_uniform_texture_ref(grp, "depthTex", &dtxl->depth); | ||||
| DRW_shgroup_state_enable(grp, DRW_STATE_WRITE_DEPTH); | |||||
| } | } | ||||
| else { | else { | ||||
| pd->edit_mesh_facedots_grp[i] = NULL; | pd->edit_mesh_facedots_grp[i] = NULL; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| static void overlay_edit_mesh_add_ob_to_pass(OVERLAY_PrivateData *pd, Object *ob, bool in_front) | static void overlay_edit_mesh_add_ob_to_pass(OVERLAY_PrivateData *pd, Object *ob, bool in_front) | ||||
| ▲ Show 20 Lines • Show All 110 Lines • ▼ Show 20 Lines | static void overlay_edit_mesh_draw_components(OVERLAY_PassList *psl, | ||||
| DRW_view_set_active(pd->view_edit_faces_cage); | DRW_view_set_active(pd->view_edit_faces_cage); | ||||
| DRW_draw_pass(psl->edit_mesh_faces_cage_ps[in_front]); | DRW_draw_pass(psl->edit_mesh_faces_cage_ps[in_front]); | ||||
| DRW_view_set_active(pd->view_edit_edges); | DRW_view_set_active(pd->view_edit_edges); | ||||
| DRW_draw_pass(psl->edit_mesh_edges_ps[in_front]); | DRW_draw_pass(psl->edit_mesh_edges_ps[in_front]); | ||||
| DRW_view_set_active(pd->view_edit_verts); | DRW_view_set_active(pd->view_edit_verts); | ||||
| /* Instead of disabling the depth test, change the range, | |||||
| * so selected vertices are always at the top. */ | |||||
| GPU_depth_range(0.0f, 0.1f); | |||||
| DRW_draw_pass(psl->edit_mesh_verts_ps[in_front]); | DRW_draw_pass(psl->edit_mesh_verts_ps[in_front]); | ||||
| GPU_depth_range(0.0f, 1.0f); | |||||
| } | } | ||||
| void OVERLAY_edit_mesh_draw(OVERLAY_Data *vedata) | void OVERLAY_edit_mesh_draw(OVERLAY_Data *vedata) | ||||
| { | { | ||||
| OVERLAY_PassList *psl = vedata->psl; | OVERLAY_PassList *psl = vedata->psl; | ||||
| OVERLAY_PrivateData *pd = vedata->stl->pd; | OVERLAY_PrivateData *pd = vedata->stl->pd; | ||||
| OVERLAY_FramebufferList *fbl = vedata->fbl; | OVERLAY_FramebufferList *fbl = vedata->fbl; | ||||
| Show All 21 Lines | if (pd->edit_mesh.do_zbufclip) { | ||||
| GPU_framebuffer_bind(fbl->overlay_in_front_fb); | GPU_framebuffer_bind(fbl->overlay_in_front_fb); | ||||
| GPU_framebuffer_clear_depth(fbl->overlay_in_front_fb, 1.0f); | GPU_framebuffer_clear_depth(fbl->overlay_in_front_fb, 1.0f); | ||||
| DRW_draw_pass(psl->edit_mesh_normals_ps); | DRW_draw_pass(psl->edit_mesh_normals_ps); | ||||
| DRW_view_set_active(pd->view_edit_edges); | DRW_view_set_active(pd->view_edit_edges); | ||||
| DRW_draw_pass(psl->edit_mesh_edges_ps[NOT_IN_FRONT]); | DRW_draw_pass(psl->edit_mesh_edges_ps[NOT_IN_FRONT]); | ||||
| DRW_view_set_active(pd->view_edit_verts); | DRW_view_set_active(pd->view_edit_verts); | ||||
| /* Instead of disabling the depth test, change the range, | |||||
| * so selected vertices are always at the top. */ | |||||
| GPU_depth_range(0.0f, 0.1f); | |||||
| DRW_draw_pass(psl->edit_mesh_verts_ps[NOT_IN_FRONT]); | DRW_draw_pass(psl->edit_mesh_verts_ps[NOT_IN_FRONT]); | ||||
| GPU_depth_range(0.0f, 1.0f); | |||||
| } | } | ||||
| else { | else { | ||||
| const DRWContextState *draw_ctx = DRW_context_state_get(); | const DRWContextState *draw_ctx = DRW_context_state_get(); | ||||
| View3D *v3d = draw_ctx->v3d; | View3D *v3d = draw_ctx->v3d; | ||||
| DRW_draw_pass(psl->edit_mesh_normals_ps); | DRW_draw_pass(psl->edit_mesh_normals_ps); | ||||
| overlay_edit_mesh_draw_components(psl, pd, false); | overlay_edit_mesh_draw_components(psl, pd, false); | ||||
| Show All 16 Lines | |||||