[Bf-blender-cvs] [bca4edeb14a] tmp-overlay-engine: Overlay Engine: Add Edit Mesh
Clément Foucault
noreply at git.blender.org
Wed Nov 6 03:14:17 CET 2019
Commit: bca4edeb14a77d98b2af3747169ba093fb1f1151
Author: Clément Foucault
Date: Mon Nov 4 01:30:44 2019 +0100
Branches: tmp-overlay-engine
https://developer.blender.org/rBbca4edeb14a77d98b2af3747169ba093fb1f1151
Overlay Engine: Add Edit Mesh
===================================================================
M source/blender/draw/CMakeLists.txt
A source/blender/draw/engines/overlay/overlay_edit_mesh.c
M source/blender/draw/engines/overlay/overlay_engine.c
M source/blender/draw/engines/overlay/overlay_grid.c
M source/blender/draw/engines/overlay/overlay_outline.c
M source/blender/draw/engines/overlay/overlay_private.h
M source/blender/draw/engines/overlay/overlay_shader.c
A source/blender/draw/engines/overlay/shaders/depth_only_vert.glsl
A source/blender/draw/engines/overlay/shaders/edit_mesh_analysis_frag.glsl
A source/blender/draw/engines/overlay/shaders/edit_mesh_analysis_vert.glsl
A source/blender/draw/engines/overlay/shaders/edit_mesh_common_lib.glsl
A source/blender/draw/engines/overlay/shaders/edit_mesh_facefill_frag.glsl
A source/blender/draw/engines/overlay/shaders/edit_mesh_facefill_vert.glsl
A source/blender/draw/engines/overlay/shaders/edit_mesh_frag.glsl
A source/blender/draw/engines/overlay/shaders/edit_mesh_geom.glsl
A source/blender/draw/engines/overlay/shaders/edit_mesh_ghost_clear_vert.glsl
A source/blender/draw/engines/overlay/shaders/edit_mesh_mix_occlude_frag.glsl
A source/blender/draw/engines/overlay/shaders/edit_mesh_normal_geom.glsl
A source/blender/draw/engines/overlay/shaders/edit_mesh_normal_vert.glsl
A source/blender/draw/engines/overlay/shaders/edit_mesh_skin_root_vert.glsl
A source/blender/draw/engines/overlay/shaders/edit_mesh_vert.glsl
A source/blender/draw/engines/overlay/shaders/paint_weight_frag.glsl
A source/blender/draw/engines/overlay/shaders/paint_weight_vert.glsl
M source/blender/draw/intern/draw_manager_text.c
M source/blender/draw/intern/draw_manager_text.h
===================================================================
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index d31b58fc7ad..63af356417c 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -135,6 +135,7 @@ set(SRC
engines/select/select_draw_utils.c
engines/select/select_engine.c
engines/overlay/overlay_engine.c
+ engines/overlay/overlay_edit_mesh.c
engines/overlay/overlay_facing.c
engines/overlay/overlay_grid.c
engines/overlay/overlay_outline.c
@@ -380,6 +381,20 @@ data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_wave_frag.glsl SRC)
data_to_c_simple(engines/select/shaders/selection_id_3D_vert.glsl SRC)
data_to_c_simple(engines/select/shaders/selection_id_frag.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/depth_only_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/edit_mesh_common_lib.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/edit_mesh_facefill_frag.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/edit_mesh_facefill_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/edit_mesh_frag.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/edit_mesh_geom.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/edit_mesh_normal_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/edit_mesh_normal_geom.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/edit_mesh_ghost_clear_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/edit_mesh_analysis_frag.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/edit_mesh_analysis_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/edit_mesh_mix_occlude_frag.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/edit_mesh_skin_root_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/edit_mesh_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/facing_frag.glsl SRC)
data_to_c_simple(engines/overlay/shaders/facing_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/grid_frag.glsl SRC)
@@ -391,6 +406,8 @@ data_to_c_simple(engines/overlay/shaders/outline_prepass_geom.glsl SRC)
data_to_c_simple(engines/overlay/shaders/outline_prepass_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/outline_lightprobe_grid_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/outline_resolve_frag.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/paint_weight_frag.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/paint_weight_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/wireframe_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/wireframe_geom.glsl SRC)
data_to_c_simple(engines/overlay/shaders/wireframe_frag.glsl SRC)
diff --git a/source/blender/draw/engines/overlay/overlay_edit_mesh.c b/source/blender/draw/engines/overlay/overlay_edit_mesh.c
new file mode 100644
index 00000000000..9a88f79c814
--- /dev/null
+++ b/source/blender/draw/engines/overlay/overlay_edit_mesh.c
@@ -0,0 +1,450 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Copyright 2019, Blender Foundation.
+ */
+
+/** \file
+ * \ingroup draw_engine
+ */
+
+#include "DRW_render.h"
+
+#include "ED_view3d.h"
+
+#include "DNA_mesh_types.h"
+
+#include "BKE_editmesh.h"
+
+#include "draw_cache_impl.h"
+#include "draw_manager_text.h"
+
+#include "overlay_private.h"
+
+#define OVERLAY_EDIT_TEXT \
+ (V3D_OVERLAY_EDIT_EDGE_LEN | V3D_OVERLAY_EDIT_FACE_AREA | V3D_OVERLAY_EDIT_FACE_ANG | \
+ V3D_OVERLAY_EDIT_EDGE_ANG | V3D_OVERLAY_EDIT_INDICES)
+
+void OVERLAY_edit_mesh_init(OVERLAY_Data *vedata)
+{
+ OVERLAY_TextureList *txl = vedata->txl;
+ OVERLAY_FramebufferList *fbl = vedata->fbl;
+ OVERLAY_PrivateData *pd = vedata->stl->pd;
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+
+ /* TODO only alloc if needed. */
+ DRW_texture_ensure_fullscreen_2d(&txl->temp_depth_tx, GPU_DEPTH_COMPONENT24, 0);
+ DRW_texture_ensure_fullscreen_2d(&txl->edit_mesh_occlude_wire_tx, GPU_RGBA8, 0);
+
+ GPU_framebuffer_ensure_config(&fbl->edit_mesh_occlude_wire_fb,
+ {GPU_ATTACHMENT_TEXTURE(txl->temp_depth_tx),
+ GPU_ATTACHMENT_TEXTURE(txl->edit_mesh_occlude_wire_tx)});
+
+ /* Create view with depth offset */
+ pd->view_edit_faces = (DRWView *)DRW_view_default_get();
+ pd->view_edit_faces_cage = DRW_view_create_with_zoffset(draw_ctx->rv3d, 0.5f);
+ pd->view_edit_edges = DRW_view_create_with_zoffset(draw_ctx->rv3d, 1.0f);
+ pd->view_edit_verts = DRW_view_create_with_zoffset(draw_ctx->rv3d, 1.5f);
+}
+
+void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata)
+{
+ OVERLAY_TextureList *txl = vedata->txl;
+ OVERLAY_PassList *psl = vedata->psl;
+ OVERLAY_PrivateData *pd = vedata->stl->pd;
+ OVERLAY_ShadingData *shdata = &pd->shdata;
+ DRWShadingGroup *grp = NULL;
+ GPUShader *sh = NULL;
+ DRWState state = 0;
+
+ DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ ToolSettings *tsettings = draw_ctx->scene->toolsettings;
+ View3D *v3d = draw_ctx->v3d;
+ bool select_vert = pd->edit_mesh.select_vert = (tsettings->selectmode & SCE_SELECT_VERTEX) != 0;
+ bool select_face = pd->edit_mesh.select_face = (tsettings->selectmode & SCE_SELECT_FACE) != 0;
+ bool select_edge = pd->edit_mesh.select_edge = (tsettings->selectmode & SCE_SELECT_EDGE) != 0;
+
+ pd->edit_mesh.do_zbufclip = XRAY_FLAG_ENABLED(v3d);
+
+ bool do_occlude_wire = (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_OCCLUDE_WIRE) != 0;
+ bool show_face_dots = (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_FACE_DOT) != 0 ||
+ pd->edit_mesh.do_zbufclip;
+
+ pd->edit_mesh.ghost_ob = 0;
+ pd->edit_mesh.edit_ob = 0;
+ pd->edit_mesh.do_faces = true;
+ pd->edit_mesh.do_edges = true;
+
+ int *mask = shdata->data_mask;
+ mask[0] = 0xFF; /* Face Flag */
+ mask[1] = 0xFF; /* Edge Flag */
+
+ const int flag = pd->edit_mesh.flag = v3d->overlay.edit_flag;
+
+ SET_FLAG_FROM_TEST(mask[0], flag & V3D_OVERLAY_EDIT_FACES, VFLAG_FACE_SELECTED);
+ SET_FLAG_FROM_TEST(mask[0], flag & V3D_OVERLAY_EDIT_FREESTYLE_FACE, VFLAG_FACE_FREESTYLE);
+ SET_FLAG_FROM_TEST(mask[1], flag & V3D_OVERLAY_EDIT_FREESTYLE_EDGE, VFLAG_EDGE_FREESTYLE);
+ SET_FLAG_FROM_TEST(mask[1], flag & V3D_OVERLAY_EDIT_SEAMS, VFLAG_EDGE_SEAM);
+ SET_FLAG_FROM_TEST(mask[1], flag & V3D_OVERLAY_EDIT_SHARP, VFLAG_EDGE_SHARP);
+ SET_FLAG_FROM_TEST(mask[2], flag & V3D_OVERLAY_EDIT_CREASES, 0xFF);
+ SET_FLAG_FROM_TEST(mask[3], flag & V3D_OVERLAY_EDIT_BWEIGHTS, 0xFF);
+
+ if ((flag & V3D_OVERLAY_EDIT_FACES) == 0) {
+ pd->edit_mesh.do_faces = false;
+ pd->edit_mesh.do_zbufclip = false;
+ }
+ if ((flag & V3D_OVERLAY_EDIT_EDGES) == 0) {
+ if ((tsettings->selectmode & SCE_SELECT_EDGE) == 0) {
+ if ((v3d->shading.type < OB_SOLID) || (v3d->shading.flag & V3D_SHADING_XRAY)) {
+ /* Special case, when drawing wire, draw edges, see: T67637. */
+ }
+ else {
+ pd->edit_mesh.do_edges = false;
+ }
+ }
+ }
+
+ float backwire_opacity = v3d->overlay.backwire_opacity;
+ float size_normal = v3d->overlay.normals_length;
+ float face_alpha = (do_occlude_wire || !pd->edit_mesh.do_faces) ? 0.0f : 1.0f;
+
+ if (select_face && !pd->edit_mesh.do_faces && pd->edit_mesh.do_edges) {
+ /* Force display of face centers in this case because that's
+ * the only way to see if a face is selected. */
+ show_face_dots = true;
+ }
+
+ {
+ /* TODO(fclem) Shouldn't this be going into the paint overlay? */
+ state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL;
+ DRW_PASS_CREATE(psl->edit_mesh_weight_ps, state | pd->clipping_state);
+
+ sh = OVERLAY_shader_paint_weight();
+ pd->edit_mesh_weight_grp = grp = DRW_shgroup_create(sh, psl->edit_mesh_weight_ps);
+ DRW_shgroup_uniform_float_copy(grp, "opacity", 1.0);
+ DRW_shgroup_uniform_texture(grp, "colorramp", G_draw.weight_ramp);
+ DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
+ }
+ /* Run Twice for in-front passes. */
+ for (int i = 0; i < 2; i++) {
+ /* Complementary Depth Pass */
+ state = DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_CULL_BACK;
+ DRW_PASS_CREATE(psl->edit_mesh_depth_ps[i], state | pd->clipping_state);
+
+ sh = OVERLAY_shader_depth_only();
+ pd->edit_mesh_depth_grp[i] = DRW_shgroup_create(sh, psl->edit_mesh_depth_ps[i]);
+ }
+ {
+ /* Normals */
+ state = DRW_STATE_WRITE_DEPTH | DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL;
+ DRW_PASS_CREATE(psl->edit_mesh_normals_ps, state | pd->clipping_state);
+
+ sh = OVERLAY_shader_edit_mesh_normal_face();
+ pd->edit_mesh_fnormals_grp = grp = DRW_shgroup_create(sh, psl->edit_mesh_normals_ps);
+ DRW_shgroup_uniform_float_copy(grp, "normalSize", size_normal);
+ DRW_shgroup_uniform_vec4(grp, "color", G_draw.block.colorNormal, 1);
+
+ sh = OVERLAY_shader_edit_mesh_normal_vert();
+ pd->edit_mesh_vnormals_grp = grp = DRW_shgroup_create(sh, psl->edit_mesh_normals_ps);
+ DRW_shgroup_uniform_float_copy(grp, "normalSize", size_normal);
+ DRW_shgroup_uniform_vec4(grp, "color", G_draw.block.colorVNormal, 1);
+
+ sh = OVERLAY_shader_edit_mesh_normal_loop();
+ pd->edit_mesh_lnormals_grp = grp = DRW_shgroup_create(sh, psl->edit_mesh_normals_ps);
+ DRW_shgroup_uniform_float_copy(grp, "normalSize", size_normal);
+ DRW_shgroup_uniform_vec4(grp, "color", G_draw.block.colorLNormal, 1);
+ }
+ {
+ /* Mesh Analysis Pass */
+ state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_BLEND_ALPHA;
+ DRW_PASS_CREATE(psl->edit_mes
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list