[Bf-blender-cvs] [d16c0501bda] tmp-overlay-engine: Overlay Engine: More Extra overlays

Clément Foucault noreply at git.blender.org
Fri Nov 15 01:35:12 CET 2019


Commit: d16c0501bdab772e2bc4bf2c7d4c7c4a11d26fd2
Author: Clément Foucault
Date:   Fri Nov 8 22:50:39 2019 +0100
Branches: tmp-overlay-engine
https://developer.blender.org/rBd16c0501bdab772e2bc4bf2c7d4c7c4a11d26fd2

Overlay Engine: More Extra overlays

- Stippled Relationship Lines (without geometry shader)
- Object centers
- Objects Names
- Bounds
- A bit of code reorganisation

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

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
A	source/blender/draw/engines/overlay/shaders/extra_point_vert.glsl
M	source/blender/draw/engines/overlay/shaders/extra_wire_frag.glsl
M	source/blender/draw/engines/overlay/shaders/extra_wire_vert.glsl
M	source/blender/draw/intern/draw_common.c
M	source/blender/draw/intern/draw_common.h
M	source/blender/draw/modes/shaders/common_globals_lib.glsl

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 3ef8ccdd575..7f370219b0f 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -397,6 +397,7 @@ 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/extra_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/extra_groundline_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)
 data_to_c_simple(engines/overlay/shaders/facing_frag.glsl SRC)
diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c
index 49c1d34604e..d45eae4c56c 100644
--- a/source/blender/draw/engines/overlay/overlay_engine.c
+++ b/source/blender/draw/engines/overlay/overlay_engine.c
@@ -195,6 +195,10 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob)
                              (pd->v3d_flag & V3D_SELECT_OUTLINE) &&
                              ((ob->base_flag & BASE_SELECTED) ||
                               (DRW_state_is_select() && ob->type == OB_LIGHTPROBE));
+  const bool draw_extras =
+      ((pd->overlay.flag & V3D_OVERLAY_HIDE_OBJECT_XTRAS) == 0) ||
+      /* Show if this is the camera we're looking through since it's useful for selecting. */
+      ((draw_ctx->rv3d->persp == RV3D_CAMOB) && ((ID *)draw_ctx->v3d->camera == ob->id.orig_id));
 
   bool init;
   OVERLAY_DupliData *dupli = OVERLAY_duplidata_get(ob, vedata, &init);
@@ -240,7 +244,7 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob)
   //     OVERLAY_wireframe_cache_populate();
   //   }
   // }
-  /* Non-Meshes */
+
   switch (ob->type) {
     // case OB_ARMATURE:
     //   OVERLAY_armature_cache_populate();
@@ -251,17 +255,30 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob)
     // case OB_FONT:
     //   OVERLAY_font_cache_populate();
     //   break;
-    case OB_EMPTY:
-    case OB_LAMP:
-    case OB_CAMERA:
-    case OB_SPEAKER:
-    case OB_LIGHTPROBE:
-      OVERLAY_extra_cache_populate(vedata, ob, dupli, init);
+    case OB_GPENCIL:
+      OVERLAY_gpencil_cache_populate(vedata, ob);
       break;
   }
-  // if (draw_extra) {
-  //   OVERLAY_extra_cache_populate();
-  // }
+  /* Non-Meshes */
+  if (draw_extras) {
+    switch (ob->type) {
+      case OB_EMPTY:
+        OVERLAY_empty_cache_populate(vedata, ob);
+        break;
+      case OB_LAMP:
+        OVERLAY_light_cache_populate(vedata, ob);
+        break;
+      case OB_CAMERA:
+        OVERLAY_camera_cache_populate(vedata, ob);
+        break;
+      case OB_SPEAKER:
+      case OB_LIGHTPROBE:
+        break;
+    }
+  }
+
+  /* Relationship, object center, bounbox ... */
+  OVERLAY_extra_cache_populate(vedata, ob);
 
   if (dupli) {
     dupli->base_flag = ob->base_flag;
diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index f175e4bf11e..eedc6986f2a 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -25,11 +25,20 @@
 #include "UI_resources.h"
 
 #include "BKE_camera.h"
+#include "BKE_constraint.h"
+#include "BKE_curve.h"
+#include "BKE_mball.h"
+#include "BKE_mesh.h"
 #include "BKE_movieclip.h"
 #include "BKE_object.h"
 #include "BKE_tracking.h"
 
 #include "DNA_camera_types.h"
+#include "DNA_constraint_types.h"
+#include "DNA_gpencil_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meta_types.h"
+#include "DNA_rigidbody_types.h"
 
 #include "DEG_depsgraph_query.h"
 
@@ -45,9 +54,11 @@ void OVERLAY_extra_cache_init(OVERLAY_Data *vedata)
   OVERLAY_PassList *psl = vedata->psl;
   OVERLAY_PrivateData *pd = vedata->stl->pd;
 
+  DRW_PASS_CREATE(psl->extra_blend_ps, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA);
+  DRW_PASS_CREATE(psl->extra_centers_ps, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA);
+
   for (int i = 0; i < 2; i++) {
     /* Non Meshes Pass (Camera, empties, lights ...) */
-    // struct GPUBatch *geom;
     struct GPUShader *sh;
     struct GPUVertFormat *format;
     DRWShadingGroup *grp, *grp_sub;
@@ -230,7 +241,7 @@ void OVERLAY_extra_cache_init(OVERLAY_Data *vedata)
     }
     {
       format = formats->instance_pos;
-      sh = OVERLAY_shader_extra_grounline();
+      sh = OVERLAY_shader_extra_groundline();
 
       grp = DRW_shgroup_create(sh, extra_ps);
       DRW_shgroup_uniform_float_copy(grp, "pixel_size", pixelsize);
@@ -245,12 +256,38 @@ void OVERLAY_extra_cache_init(OVERLAY_Data *vedata)
 
       grp = DRW_shgroup_create(sh, extra_ps);
       DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
+      DRW_shgroup_uniform_vec2(grp, "viewport_size", DRW_viewport_size_get(), 1);
+
+      cb->extra_dashed_lines = BUF_LINE(grp, formats->wire_dashed_extra);
+      cb->extra_lines = BUF_LINE(grp, formats->wire_extra);
+    }
+    {
+      format = formats->pos;
+      sh = OVERLAY_shader_extra_point();
+
+      grp = DRW_shgroup_create(sh, psl->extra_centers_ps);
+      DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
+
+      grp_sub = DRW_shgroup_create_sub(grp);
+      DRW_shgroup_uniform_vec4_copy(grp_sub, "color", G_draw.block.colorActive);
+      cb->center_active = BUF_POINT(grp_sub, format);
+
+      grp_sub = DRW_shgroup_create_sub(grp);
+      DRW_shgroup_uniform_vec4_copy(grp_sub, "color", G_draw.block.colorSelect);
+      cb->center_selected = BUF_POINT(grp_sub, format);
+
+      grp_sub = DRW_shgroup_create_sub(grp);
+      DRW_shgroup_uniform_vec4_copy(grp_sub, "color", G_draw.block.colorDeselect);
+      cb->center_deselected = BUF_POINT(grp_sub, format);
 
-      /* This one is suboptimal (gl_lines instead of gl_line_strip)
-       * but we keep this for simplicity */
-      cb->camera_path = DRW_shgroup_call_buffer(grp, formats->wire_extra, GPU_PRIM_LINES);
+      grp_sub = DRW_shgroup_create_sub(grp);
+      DRW_shgroup_uniform_vec4_copy(grp_sub, "color", G_draw.block.colorLibrarySelect);
+      cb->center_selected_lib = BUF_POINT(grp_sub, format);
+
+      grp_sub = DRW_shgroup_create_sub(grp);
+      DRW_shgroup_uniform_vec4_copy(grp_sub, "color", G_draw.block.colorLibrary);
+      cb->center_deselected_lib = BUF_POINT(grp_sub, format);
     }
-    // sh = OVERLAY_shader_extra_points();
 
 #if 0
     /* -------- STIPPLES ------- */
@@ -287,15 +324,40 @@ void OVERLAY_extra_cache_init(OVERLAY_Data *vedata)
   }
 }
 
+static void OVERLAY_extra_line_dashed(OVERLAY_ExtraCallBuffers *cb,
+                                      const float start[3],
+                                      const float end[3],
+                                      const float color[4])
+{
+  DRW_buffer_add_entry(cb->extra_dashed_lines, start, start, color);
+  DRW_buffer_add_entry(cb->extra_dashed_lines, end, start, color);
+}
+
+static void OVERLAY_extra_line(OVERLAY_ExtraCallBuffers *cb,
+                               const float start[3],
+                               const float end[3],
+                               const int color_id)
+{
+  DRW_buffer_add_entry(cb->extra_lines, start, &color_id);
+  DRW_buffer_add_entry(cb->extra_lines, end, &color_id);
+}
+
+static OVERLAY_ExtraCallBuffers *OVERLAY_extra_call_buffer_get(OVERLAY_Data *vedata, Object *ob)
+{
+  bool do_in_front = (ob->dtx & OB_DRAWXRAY) != 0;
+  OVERLAY_PrivateData *pd = vedata->stl->pd;
+  return &pd->extra_call_buffers[do_in_front];
+}
+
 /* -------------------------------------------------------------------- */
 /** \name Empties
  * \{ */
 
-static void DRW_shgroup_empty_ex(OVERLAY_ExtraCallBuffers *cb,
-                                 const float mat[4][4],
-                                 const float *draw_size,
-                                 char draw_type,
-                                 const float color[4])
+static void OVERLAY_empty_shape(OVERLAY_ExtraCallBuffers *cb,
+                                const float mat[4][4],
+                                const float *draw_size,
+                                char draw_type,
+                                const float color[4])
 {
   float instdata[4][4];
   copy_m4_m4(instdata, mat);
@@ -329,13 +391,17 @@ static void DRW_shgroup_empty_ex(OVERLAY_ExtraCallBuffers *cb,
   }
 }
 
-static void DRW_shgroup_empty(OVERLAY_ExtraCallBuffers *cb, Object *ob, ViewLayer *view_layer)
+void OVERLAY_empty_cache_populate(OVERLAY_Data *vedata, Object *ob)
 {
   if (((ob->base_flag & BASE_FROM_DUPLI) != 0) && ((ob->transflag & OB_DUPLICOLLECTION) != 0) &&
       ob->instance_collection) {
     return;
   }
 
+  OVERLAY_ExtraCallBuffers *cb = OVERLAY_extra_call_buffer_get(vedata, ob);
+  const DRWContextState *draw_ctx = DRW_context_state_get();
+  ViewLayer *view_layer = draw_ctx->view_layer;
+
   float *color;
   DRW_object_wire_theme_get(ob, view_layer, &color);
 
@@ -347,7 +413,7 @@ static void DRW_shgroup_empty(OVERLAY_ExtraCallBuffers *cb, Object *ob, ViewLaye
     case OB_EMPTY_SPHERE:
     case OB_EMPTY_CONE:
     case OB_ARROWS:
-      DRW_shgroup_empty_ex(cb, ob->obmat, &ob->empty_drawsize, ob->empty_drawtype, color);
+      OVERLAY_empty_shape(cb, ob->obmat, &ob->empty_drawsize, ob->empty_drawtype, color);
       break;
     case OB_EMPTY_IMAGE:
       // DRW_shgroup_empty_image(sh_data, sgl, ob, color, rv3d, sh_cfg);
@@ -355,14 +421,170 @@ static void DRW_shgroup_empty(OVERLAY_ExtraCallBuffers *cb, Object *ob, ViewLaye
   }
 }
 
+static void OVERLAY_bounds(
+    OVERLAY_ExtraCallBuffers *cb, Object *ob, int theme_id, char boundtype, bool around_origin)
+{
+  float color[4], center[3], size[3], tmp[4][4], final_mat[4][4];
+  BoundBox bb_local;
+
+  if (ob->type == OB_MBALL && !BKE_mball_is_basis(ob)) {
+    return;
+  }
+
+  BoundBox *bb = BKE_object_boundbox_get(ob);
+
+  if (!ELEM(ob->type,
+            OB_MESH,
+            OB_CURVE,
+            OB_SURF,
+            OB_FONT,
+            OB_MBALL,
+            OB_ARMATURE,
+            OB_LATTICE,
+        

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list