[Bf-blender-cvs] [a9c8eab4b64] tmp-overlay-engine: Overlay Engine: Loose Edges/Verts

Clément Foucault noreply at git.blender.org
Tue Nov 19 00:45:31 CET 2019


Commit: a9c8eab4b64e08ead7d9bdfb35a32ce023eedaac
Author: Clément Foucault
Date:   Mon Nov 18 23:05:39 2019 +0100
Branches: tmp-overlay-engine
https://developer.blender.org/rBa9c8eab4b64e08ead7d9bdfb35a32ce023eedaac

Overlay Engine: Loose Edges/Verts

===================================================================

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/overlay/overlay_engine.c
M	source/blender/draw/engines/overlay/overlay_extra.c
M	source/blender/draw/engines/overlay/overlay_private.h
M	source/blender/draw/engines/overlay/overlay_shader.c
M	source/blender/draw/engines/overlay/overlay_wireframe.c
A	source/blender/draw/engines/overlay/shaders/extra_loose_point_frag.glsl
A	source/blender/draw/engines/overlay/shaders/extra_loose_point_vert.glsl

===================================================================

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index ec823c92358..d433b7f1811 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -409,6 +409,8 @@ data_to_c_simple(engines/overlay/shaders/edit_particle_strand_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/edit_particle_point_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/extra_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/extra_groundline_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/extra_loose_point_frag.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/extra_loose_point_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/extra_point_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/extra_wire_frag.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/extra_wire_vert.glsl SRC)
diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c
index d1093ce28e2..7efd8943eee 100644
--- a/source/blender/draw/engines/overlay/overlay_engine.c
+++ b/source/blender/draw/engines/overlay/overlay_engine.c
@@ -178,10 +178,10 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob)
   const bool in_paint_mode = (ob == draw_ctx->obact) &&
                              (draw_ctx->object_mode & OB_MODE_ALL_PAINT);
   const bool in_sculpt_mode = (ob == draw_ctx->obact) && (ob->sculpt != NULL);
+  const bool has_surface = ELEM(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_MBALL, OB_FONT);
   const bool draw_surface = !((ob->dt < OB_WIRE) || (!renderable && (ob->dt != OB_WIRE)));
   const bool draw_facing = draw_surface && (pd->overlay.flag & V3D_OVERLAY_FACE_ORIENTATION);
-  const bool draw_wires = draw_surface && ((pd->overlay.flag & V3D_OVERLAY_WIREFRAMES) ||
-                                           (ob->dtx & OB_DRAWWIRE) || (ob->dt == OB_WIRE));
+  const bool draw_wires = draw_surface && has_surface;
   const bool draw_outlines = !in_edit_mode && !in_paint_mode && renderable &&
                              (pd->v3d_flag & V3D_SELECT_OUTLINE) &&
                              ((ob->base_flag & BASE_SELECTED) ||
diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index d73c22f28fe..cb0b06c3acb 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -203,6 +203,12 @@ void OVERLAY_extra_cache_init(OVERLAY_Data *vedata)
       cb->extra_wire = grp = DRW_shgroup_create(sh, extra_ps);
       DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
     }
+    {
+      sh = OVERLAY_shader_extra_loose_point();
+
+      cb->extra_loose_points = grp = DRW_shgroup_create(sh, extra_ps);
+      DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
+    }
     {
       format = formats->pos;
       sh = OVERLAY_shader_extra_point();
@@ -258,6 +264,20 @@ OVERLAY_ExtraCallBuffers *OVERLAY_extra_call_buffer_get(OVERLAY_Data *vedata, Ob
   return &pd->extra_call_buffers[do_in_front];
 }
 
+void OVERLAY_extra_loose_points(OVERLAY_ExtraCallBuffers *cb,
+                                struct GPUBatch *geom,
+                                const float mat[4][4],
+                                const float color[4])
+{
+  float draw_mat[4][4];
+  copy_m4_m4(draw_mat, mat);
+  draw_mat[0][3] = color[0];
+  draw_mat[1][3] = color[1];
+  draw_mat[2][3] = color[2];
+  draw_mat[3][3] = color[3];
+  DRW_shgroup_call_obmat(cb->extra_loose_points, geom, draw_mat);
+}
+
 void OVERLAY_extra_wire(OVERLAY_ExtraCallBuffers *cb,
                         struct GPUBatch *geom,
                         const float mat[4][4],
diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h
index 566901ec65b..d7650612468 100644
--- a/source/blender/draw/engines/overlay/overlay_private.h
+++ b/source/blender/draw/engines/overlay/overlay_private.h
@@ -164,6 +164,7 @@ typedef struct OVERLAY_ExtraCallBuffers {
   DRWCallBuffer *speaker;
 
   DRWShadingGroup *extra_wire;
+  DRWShadingGroup *extra_loose_points;
 } OVERLAY_ExtraCallBuffers;
 
 typedef struct OVERLAY_ArmatureCallBuffers {
@@ -404,6 +405,10 @@ void OVERLAY_empty_shape(OVERLAY_ExtraCallBuffers *cb,
                          const float draw_size,
                          const char draw_type,
                          const float color[4]);
+void OVERLAY_extra_loose_points(OVERLAY_ExtraCallBuffers *cb,
+                                struct GPUBatch *geom,
+                                const float mat[4][4],
+                                const float color[4]);
 void OVERLAY_extra_wire(OVERLAY_ExtraCallBuffers *cb,
                         struct GPUBatch *geom,
                         const float mat[4][4],
@@ -490,6 +495,7 @@ GPUShader *OVERLAY_shader_edit_particle_point(void);
 GPUShader *OVERLAY_shader_extra(void);
 GPUShader *OVERLAY_shader_extra_groundline(void);
 GPUShader *OVERLAY_shader_extra_wire(bool use_object);
+GPUShader *OVERLAY_shader_extra_loose_point(void);
 GPUShader *OVERLAY_shader_extra_point(void);
 GPUShader *OVERLAY_shader_facing(void);
 GPUShader *OVERLAY_shader_grid(void);
diff --git a/source/blender/draw/engines/overlay/overlay_shader.c b/source/blender/draw/engines/overlay/overlay_shader.c
index 0c7bb917f7f..d916467073a 100644
--- a/source/blender/draw/engines/overlay/overlay_shader.c
+++ b/source/blender/draw/engines/overlay/overlay_shader.c
@@ -64,6 +64,8 @@ extern char datatoc_edit_particle_strand_vert_glsl[];
 extern char datatoc_edit_particle_point_vert_glsl[];
 extern char datatoc_extra_vert_glsl[];
 extern char datatoc_extra_groundline_vert_glsl[];
+extern char datatoc_extra_loose_point_vert_glsl[];
+extern char datatoc_extra_loose_point_frag_glsl[];
 extern char datatoc_extra_point_vert_glsl[];
 extern char datatoc_extra_wire_frag_glsl[];
 extern char datatoc_extra_wire_vert_glsl[];
@@ -146,6 +148,7 @@ typedef struct OVERLAY_Shaders {
   GPUShader *extra_groundline;
   GPUShader *extra_wire[2];
   GPUShader *extra_point;
+  GPUShader *extra_loose_point;
   GPUShader *facing;
   GPUShader *grid;
   GPUShader *image;
@@ -786,6 +789,27 @@ GPUShader *OVERLAY_shader_extra_wire(bool use_object)
   return sh_data->extra_wire[use_object];
 }
 
+GPUShader *OVERLAY_shader_extra_loose_point(void)
+{
+  const DRWContextState *draw_ctx = DRW_context_state_get();
+  const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg];
+  OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
+  if (!sh_data->extra_loose_point) {
+    sh_data->extra_loose_point = GPU_shader_create_from_arrays({
+        .vert = (const char *[]){sh_cfg->lib,
+                                 datatoc_common_globals_lib_glsl,
+                                 datatoc_common_view_lib_glsl,
+                                 datatoc_extra_loose_point_vert_glsl,
+                                 NULL},
+        .frag = (const char *[]){datatoc_common_globals_lib_glsl,
+                                 datatoc_extra_loose_point_frag_glsl,
+                                 NULL},
+        .defs = (const char *[]){sh_cfg->def, NULL},
+    });
+  }
+  return sh_data->extra_loose_point;
+}
+
 GPUShader *OVERLAY_shader_extra_point(void)
 {
   const DRWContextState *draw_ctx = DRW_context_state_get();
diff --git a/source/blender/draw/engines/overlay/overlay_wireframe.c b/source/blender/draw/engines/overlay/overlay_wireframe.c
index 57347598088..7717d803df9 100644
--- a/source/blender/draw/engines/overlay/overlay_wireframe.c
+++ b/source/blender/draw/engines/overlay/overlay_wireframe.c
@@ -167,9 +167,14 @@ void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata,
   OVERLAY_Data *data = vedata;
   OVERLAY_StorageList *stl = data->stl;
   OVERLAY_PrivateData *pd = stl->pd;
-  const bool use_wire = (pd->overlay.flag & V3D_OVERLAY_WIREFRAMES) != 0;
   const DRWContextState *draw_ctx = DRW_context_state_get();
   View3D *v3d = draw_ctx->v3d;
+  const bool all_wires = (ob->dtx & OB_DRAW_ALL_EDGES);
+  const bool is_wire = (ob->dt < OB_SOLID);
+  const bool is_xray = (ob->dtx & OB_DRAWXRAY);
+  const bool is_mesh = ob->type == OB_MESH;
+  const bool use_wire = (pd->overlay.flag & V3D_OVERLAY_WIREFRAMES) || (ob->dtx & OB_DRAWWIRE) ||
+                        (ob->dt == OB_WIRE);
 
   /* Fast path for duplis. */
   if (dupli && !init_dupli) {
@@ -187,7 +192,7 @@ void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata,
 
   const bool is_edit_mode = BKE_object_is_in_editmode(ob);
   bool has_edit_mesh_cage = false;
-  if (ob->type == OB_MESH) {
+  if (is_mesh && is_edit_mode) {
     /* TODO: Should be its own function. */
     Mesh *me = (Mesh *)ob->data;
     BMEditMesh *embm = me->edit_mesh;
@@ -197,13 +202,9 @@ void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata,
   }
 
   /* Don't do that in edit Mesh mode, unless there is a modifier preview. */
-  if (!use_wire || (((ob != draw_ctx->object_edit) && !is_edit_mode) || has_edit_mesh_cage) ||
-      ob->type != OB_MESH) {
+  if (use_wire && (!is_mesh || (!is_edit_mode || has_edit_mesh_cage))) {
     const bool use_sculpt_pbvh = BKE_sculptsession_use_pbvh_draw(ob, draw_ctx->v3d) &&
                                  !DRW_state_is_image_render();
-    const bool all_wires = (ob->dtx & OB_DRAW_ALL_EDGES);
-    const bool is_wire = (ob->dt < OB_SOLID);
-    const bool is_xray = (ob->dtx & OB_DRAWXRAY);
     const bool use_coloring = (use_wire && !is_edit_mode && !use_sculpt_pbvh &&
                                !has_edit_mesh_cage);
     DRWShadingGroup *shgrp = NULL;
@@ -245,6 +246,26 @@ void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata,
       dupli->wire_geom = geom;
     }
   }
+  else if (is_mesh && (!is_edit_mode || has_edit_mesh_cage)) {
+    OVERLAY_ExtraCallBuffers *cb = OVERLAY_extra_call_buffer_get(vedata, ob);
+    Mesh *me = ob->data;
+    float *color;
+    DRW_object_wire_theme_get(ob, draw_ctx->view_layer, &color);
+
+    /* Draw loose geometry. */
+    if (me->totedge > 0 || has_edit_mesh_cage) {
+      struct GPUBatch *geom = DRW_cache_mesh_loose_edges_get(ob);
+      if (geom) 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list