[Bf-blender-cvs] [a3ee3b8f245] draw-colormanagement: Overlay: Move Alt+B clipping bounds display from workbench to overlay

Clément Foucault noreply at git.blender.org
Fri Jan 31 04:22:22 CET 2020


Commit: a3ee3b8f245e5fda257b10281efc7361287137a4
Author: Clément Foucault
Date:   Wed Jan 29 04:02:17 2020 +0100
Branches: draw-colormanagement
https://developer.blender.org/rBa3ee3b8f245e5fda257b10281efc7361287137a4

Overlay: Move Alt+B clipping bounds display from workbench to overlay

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/overlay/overlay_background.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/clipbound_vert.glsl
M	source/blender/draw/engines/workbench/workbench_data.c
M	source/blender/draw/engines/workbench/workbench_deferred.c
M	source/blender/draw/engines/workbench/workbench_forward.c
M	source/blender/draw/engines/workbench/workbench_private.h
M	source/blender/draw/intern/draw_cache.c
M	source/blender/draw/intern/draw_common.c
M	source/blender/draw/intern/draw_common.h
M	source/blender/draw/intern/draw_view.c
M	source/blender/draw/intern/draw_view.h
M	source/blender/draw/intern/shaders/common_globals_lib.glsl

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index a7aedbc7192..458f85d892a 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -329,6 +329,7 @@ data_to_c_simple(engines/overlay/shaders/armature_stick_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/armature_wire_frag.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/armature_wire_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/background_frag.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/clipbound_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/depth_only_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/edit_curve_handle_geom.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/edit_curve_handle_vert.glsl SRC)
diff --git a/source/blender/draw/engines/overlay/overlay_background.c b/source/blender/draw/engines/overlay/overlay_background.c
index 37767bb3b76..13654544a64 100644
--- a/source/blender/draw/engines/overlay/overlay_background.c
+++ b/source/blender/draw/engines/overlay/overlay_background.c
@@ -25,6 +25,7 @@
 #include "UI_resources.h"
 
 #include "overlay_private.h"
+#include "draw_manager_text.h"
 
 #define BG_SOLID 0
 #define BG_GRADIENT 1
@@ -33,30 +34,52 @@
 void OVERLAY_background_cache_init(OVERLAY_Data *vedata)
 {
   OVERLAY_PassList *psl = vedata->psl;
+  OVERLAY_PrivateData *pd = vedata->stl->pd;
   DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+  const DRWContextState *draw_ctx = DRW_context_state_get();
+  const RegionView3D *rv3d = draw_ctx->rv3d;
+  const BoundBox *bb = rv3d->clipbb;
+  bool draw_clipping_bounds = (pd->clipping_state != 0);
 
-  int background_type;
+  {
+    int background_type;
+    if (!DRW_state_draw_background()) {
+      background_type = BG_CHECKER;
+    }
+    else if (UI_GetThemeValue(TH_SHOW_BACK_GRAD)) {
+      background_type = BG_GRADIENT;
+    }
+    else {
+      background_type = BG_SOLID;
+    }
 
-  if (!DRW_state_draw_background()) {
-    background_type = BG_CHECKER;
+    DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_BACKGROUND;
+    DRW_PASS_CREATE(psl->background_ps, state);
+
+    GPUShader *sh = OVERLAY_shader_background();
+    DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->background_ps);
+    DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
+    DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &dtxl->color);
+    DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
+    DRW_shgroup_uniform_int_copy(grp, "bgType", background_type);
+    DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
   }
-  else if (UI_GetThemeValue(TH_SHOW_BACK_GRAD)) {
-    background_type = BG_GRADIENT;
+
+  if (draw_clipping_bounds) {
+    DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA | DRW_STATE_CULL_BACK;
+    DRW_PASS_CREATE(psl->clipping_frustum_ps, state);
+
+    GPUShader *sh = OVERLAY_shader_clipbound();
+    DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->clipping_frustum_ps);
+    DRW_shgroup_uniform_vec4_copy(grp, "color", G_draw.block.colorClippingBorder);
+    DRW_shgroup_uniform_vec3(grp, "boundbox", &bb->vec[0][0], 8);
+
+    struct GPUBatch *cube = DRW_cache_cube_get();
+    DRW_shgroup_call(grp, cube, NULL);
   }
   else {
-    background_type = BG_SOLID;
+    psl->clipping_frustum_ps = NULL;
   }
-
-  DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_BACKGROUND;
-  DRW_PASS_CREATE(psl->background_ps, state);
-
-  GPUShader *sh = OVERLAY_shader_background();
-  DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->background_ps);
-  DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
-  DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &dtxl->color);
-  DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
-  DRW_shgroup_uniform_int_copy(grp, "bgType", background_type);
-  DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
 }
 
 void OVERLAY_background_draw(OVERLAY_Data *vedata)
@@ -64,6 +87,10 @@ void OVERLAY_background_draw(OVERLAY_Data *vedata)
   OVERLAY_PassList *psl = vedata->psl;
 
   if (DRW_state_is_fbo()) {
+    if (psl->clipping_frustum_ps) {
+      DRW_draw_pass(psl->clipping_frustum_ps);
+    }
+
     DRW_draw_pass(psl->background_ps);
   }
 }
diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h
index 7a1ec41c485..2bce6c5e78d 100644
--- a/source/blender/draw/engines/overlay/overlay_private.h
+++ b/source/blender/draw/engines/overlay/overlay_private.h
@@ -56,6 +56,7 @@ typedef struct OVERLAY_PassList {
   DRWPass *armature_bone_select_ps;
   DRWPass *armature_transp_ps;
   DRWPass *background_ps;
+  DRWPass *clipping_frustum_ps;
   DRWPass *edit_curve_wire_ps[2];
   DRWPass *edit_curve_handle_ps;
   DRWPass *edit_lattice_ps;
@@ -530,6 +531,7 @@ GPUShader *OVERLAY_shader_armature_sphere(bool use_outline);
 GPUShader *OVERLAY_shader_armature_stick(void);
 GPUShader *OVERLAY_shader_armature_wire(void);
 GPUShader *OVERLAY_shader_background(void);
+GPUShader *OVERLAY_shader_clipbound(void);
 GPUShader *OVERLAY_shader_depth_only(void);
 GPUShader *OVERLAY_shader_edit_curve_handle(void);
 GPUShader *OVERLAY_shader_edit_curve_point(void);
diff --git a/source/blender/draw/engines/overlay/overlay_shader.c b/source/blender/draw/engines/overlay/overlay_shader.c
index 9d61f0125de..6b8c5b23e58 100644
--- a/source/blender/draw/engines/overlay/overlay_shader.c
+++ b/source/blender/draw/engines/overlay/overlay_shader.c
@@ -48,6 +48,7 @@ extern char datatoc_armature_stick_vert_glsl[];
 extern char datatoc_armature_wire_frag_glsl[];
 extern char datatoc_armature_wire_vert_glsl[];
 extern char datatoc_background_frag_glsl[];
+extern char datatoc_clipbound_vert_glsl[];
 extern char datatoc_depth_only_vert_glsl[];
 extern char datatoc_edit_curve_handle_geom_glsl[];
 extern char datatoc_edit_curve_handle_vert_glsl[];
@@ -131,6 +132,7 @@ typedef struct OVERLAY_Shaders {
   GPUShader *armature_stick;
   GPUShader *armature_wire;
   GPUShader *background;
+  GPUShader *clipbound;
   GPUShader *depth_only;
   GPUShader *edit_curve_handle;
   GPUShader *edit_curve_point;
@@ -213,6 +215,18 @@ GPUShader *OVERLAY_shader_background(void)
   return sh_data->background;
 }
 
+GPUShader *OVERLAY_shader_clipbound(void)
+{
+  OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
+  if (!sh_data->clipbound) {
+    sh_data->clipbound = GPU_shader_create_from_arrays({
+        .vert = (const char *[]){datatoc_common_view_lib_glsl, datatoc_clipbound_vert_glsl, NULL},
+        .frag = (const char *[]){datatoc_gpu_shader_uniform_color_frag_glsl, NULL},
+    });
+  }
+  return sh_data->clipbound;
+}
+
 GPUShader *OVERLAY_shader_depth_only(void)
 {
   const DRWContextState *draw_ctx = DRW_context_state_get();
diff --git a/source/blender/draw/engines/overlay/shaders/clipbound_vert.glsl b/source/blender/draw/engines/overlay/shaders/clipbound_vert.glsl
new file mode 100644
index 00000000000..1bfa5dadc32
--- /dev/null
+++ b/source/blender/draw/engines/overlay/shaders/clipbound_vert.glsl
@@ -0,0 +1,13 @@
+
+uniform vec3 boundbox[8];
+
+void main()
+{
+  vec3 world_pos = boundbox[gl_VertexID];
+  gl_Position = point_world_to_ndc(world_pos);
+
+  /* Result in a position at 1.0 (far plane). Small epsilon to avoid precision issue.
+   * This mimics the effect of infinite projection matrix
+   * (see http://www.terathon.com/gdc07_lengyel.pdf). */
+  gl_Position.z = gl_Position.w - 2.4e-7;
+}
diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c
index f07b21ebcc2..051a1c9240a 100644
--- a/source/blender/draw/engines/workbench/workbench_data.c
+++ b/source/blender/draw/engines/workbench/workbench_data.c
@@ -197,13 +197,6 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
   /* Will be NULL when rendering. */
   if (RV3D_CLIPPING_ENABLED(v3d, rv3d)) {
     wpd->world_clip_planes = rv3d->clip;
-    UI_GetThemeColor4fv(TH_V3D_CLIPPING_BORDER, wpd->world_clip_planes_color);
-    if (wpd->use_color_management) {
-      srgb_to_linearrgb_v3_v3(wpd->world_clip_planes_color, wpd->world_clip_planes_color);
-    }
-    else {
-      copy_v3_v3(wpd->world_clip_planes_color, wpd->world_clip_planes_color);
-    }
   }
   else {
     wpd->world_clip_planes = NULL;
@@ -298,5 +291,4 @@ void workbench_private_data_free(WORKBENCH_PrivateData *wpd)
   }
 
   DRW_UBO_FREE_SAFE(wpd->dof_ubo);
-  GPU_BATCH_DISCARD_SAFE(wpd->world_clip_planes_batch);
 }
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c
index 4c86ffc74d8..393f6009379 100644
--- a/source/blender/draw/engines/workbench/workbench_deferred.c
+++ b/source/blender/draw/engines/workbench/workbench_deferred.c
@@ -726,14 +726,6 @@ void workbench_deferred_cache_init(WORKBENCH_Data *vedata)
       DRW_shgroup_uniform_texture_ref(grp, "objectId", &e_data.object_id_tx);
     }
     DRW_shgroup_call(grp, DRW_cache_fullscreen_quad_get(), NULL);
-
-    if (RV3D_CLIPPING_ENABLED(draw_ctx->v3d, draw_ctx->rv3d)) {
-      GPUShader *shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR_BACKGROUND);
-      grp = DRW_shgroup_create(shader, psl->background_pass);
-      wpd->world_clip_planes_batch = DRW_draw_background_clipping_batch_from_rv3d(draw_ctx->rv3d);
-      DRW_shgroup_call(grp, wpd->world_clip_planes_batch, NULL);
-      DRW_shgroup_uniform_vec4(grp, "color", &wpd->world_clip_planes_color[0], 1);
-    }
   }
 
   /* Deferred Mix Pass */
diff --git a/source/blender/draw/engines/workbench/workbench_forward.c b/source/blender/draw/engines/workbench/workbench_forward.c
index 19ccf072f21..a09d295a4c6 100644
--- a/source/blender/draw/engines/workbench/workbench_forward.c
+++ b/source/blender/draw/engines/workbench/workbench_forward.c
@@ -431,19 +431,6 @@ void workbench_forward_engine_init(WORKBENCH_Data *vedata)
     DRW_shgroup_call(grp, DRW_cache_fullscreen_quad_get(), NULL);
   }
 
-  /* TODO(campbell): displays but masks geometry,
-   * only use with wire or solid-without-xray for now. */
-  if ((wpd->shading.type != OB_WIRE && !XRAY_FLAG_ENABLED(wpd)) &&
-      RV3D_CLIPPING_ENA

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list