[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