[Bf-blender-cvs] [4705aa4fe51] master: Overlay Engine: LightProbe: Simplify drawing of irradiance grid data

Clément Foucault noreply at git.blender.org
Thu Dec 5 00:44:14 CET 2019


Commit: 4705aa4fe518ce33a9dff59a3ae1707ff28bdd08
Author: Clément Foucault
Date:   Wed Dec 4 22:24:34 2019 +0100
Branches: master
https://developer.blender.org/rB4705aa4fe518ce33a9dff59a3ae1707ff28bdd08

Overlay Engine: LightProbe: Simplify drawing of irradiance grid data

This separates it from the outline pass and fix a visibility bug
when extras were off.

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/overlay/overlay_antialiasing.c
M	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_extra.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/extra_lightprobe_grid_vert.glsl
D	source/blender/draw/engines/overlay/shaders/outline_lightprobe_grid_vert.glsl

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 88caafb0c00..931d8c058ce 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -345,6 +345,7 @@ data_to_c_simple(engines/overlay/shaders/edit_particle_point_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/extra_frag.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_lightprobe_grid_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)
@@ -363,7 +364,6 @@ data_to_c_simple(engines/overlay/shaders/outline_detect_frag.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/outline_prepass_frag.glsl SRC)
 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/paint_face_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/paint_point_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/paint_texture_frag.glsl SRC)
diff --git a/source/blender/draw/engines/overlay/overlay_antialiasing.c b/source/blender/draw/engines/overlay/overlay_antialiasing.c
index 8f357d37768..5b633bb0883 100644
--- a/source/blender/draw/engines/overlay/overlay_antialiasing.c
+++ b/source/blender/draw/engines/overlay/overlay_antialiasing.c
@@ -67,6 +67,9 @@ void OVERLAY_antialiasing_init(OVERLAY_Data *vedata)
   OVERLAY_PrivateData *pd = vedata->stl->pd;
   DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
 
+  /* Small texture which will have very small impact on rendertime. */
+  DRW_texture_ensure_2d(&txl->dummy_depth_tx, 1, 1, GPU_DEPTH_COMPONENT24, 0);
+
   if (!DRW_state_is_fbo()) {
     /* Use default view */
     pd->view_default = (DRWView *)DRW_view_default_get();
diff --git a/source/blender/draw/engines/overlay/overlay_edit_mesh.c b/source/blender/draw/engines/overlay/overlay_edit_mesh.c
index e03ed7f2d00..a0ebcacec75 100644
--- a/source/blender/draw/engines/overlay/overlay_edit_mesh.c
+++ b/source/blender/draw/engines/overlay/overlay_edit_mesh.c
@@ -39,17 +39,11 @@
 
 void OVERLAY_edit_mesh_init(OVERLAY_Data *vedata)
 {
-  OVERLAY_TextureList *txl = vedata->txl;
   OVERLAY_PrivateData *pd = vedata->stl->pd;
   const DRWContextState *draw_ctx = DRW_context_state_get();
 
   pd->edit_mesh.do_zbufclip = XRAY_FLAG_ENABLED(draw_ctx->v3d);
 
-  if (!pd->edit_mesh.do_zbufclip) {
-    /* Small texture which will have very small impact on rendertime. */
-    DRW_texture_ensure_2d(&txl->dummy_depth_tx, 1, 1, GPU_DEPTH_COMPONENT24, 0);
-  }
-
   /* Create view with depth offset */
   DRWView *default_view = (DRWView *)DRW_view_default_get();
   /* Don't use AA view (pd->view_default) because edit mode already has anti-aliasing. */
diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c
index 24e2c4441e3..561e146045c 100644
--- a/source/blender/draw/engines/overlay/overlay_engine.c
+++ b/source/blender/draw/engines/overlay/overlay_engine.c
@@ -196,10 +196,9 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob)
   const bool draw_bones = (pd->overlay.flag & V3D_OVERLAY_HIDE_BONES) == 0;
   const bool draw_wires = draw_surface && has_surface &&
                           (pd->wireframe_mode || !pd->hide_overlays);
-  const bool draw_outlines = !in_edit_mode && !in_paint_mode && renderable &&
+  const bool draw_outlines = !in_edit_mode && !in_paint_mode && renderable && has_surface &&
                              (pd->v3d_flag & V3D_SELECT_OUTLINE) &&
-                             ((ob->base_flag & BASE_SELECTED) ||
-                              (is_select && ob->type == OB_LIGHTPROBE));
+                             (ob->base_flag & BASE_SELECTED);
   const bool draw_bone_selection = (ob->type == OB_MESH) && pd->armature.do_pose_fade_geom &&
                                    !is_select;
   const bool draw_extras =
diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index f45712b04d8..500e40b08e5 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -28,6 +28,7 @@
 #include "BKE_camera.h"
 #include "BKE_constraint.h"
 #include "BKE_curve.h"
+#include "BKE_global.h"
 #include "BKE_mball.h"
 #include "BKE_mesh.h"
 #include "BKE_movieclip.h"
@@ -60,10 +61,27 @@
 void OVERLAY_extra_cache_init(OVERLAY_Data *vedata)
 {
   OVERLAY_PassList *psl = vedata->psl;
+  OVERLAY_TextureList *txl = vedata->txl;
   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);
+  DRWState state_blend = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA;
+  DRW_PASS_CREATE(psl->extra_blend_ps, state_blend | pd->clipping_state);
+  DRW_PASS_CREATE(psl->extra_centers_ps, state_blend | pd->clipping_state);
+
+  {
+    DRWState state = DRW_STATE_WRITE_COLOR;
+
+    DRW_PASS_CREATE(psl->extra_grid_ps, state | pd->clipping_state);
+    DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+    DRWShadingGroup *grp;
+    struct GPUShader *sh = OVERLAY_shader_extra_grid();
+    struct GPUTexture *tex = DRW_state_is_fbo() ? dtxl->depth : txl->dummy_depth_tx;
+
+    pd->extra_grid_grp = grp = DRW_shgroup_create(sh, psl->extra_grid_ps);
+    DRW_shgroup_uniform_texture_persistent(grp, "depthBuffer", tex);
+    DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
+    DRW_shgroup_uniform_bool_copy(grp, "isTransform", (G.moving & G_TRANSFORM_OBJ) != 0);
+  }
 
   for (int i = 0; i < 2; i++) {
     /* Non Meshes Pass (Camera, empties, lights ...) */
@@ -662,11 +680,12 @@ void OVERLAY_lightprobe_cache_populate(OVERLAY_Data *vedata, Object *ob)
   const DRWContextState *draw_ctx = DRW_context_state_get();
   ViewLayer *view_layer = draw_ctx->view_layer;
   float *color_p;
-  DRW_object_wire_theme_get(ob, view_layer, &color_p);
+  int theme_id = DRW_object_wire_theme_get(ob, view_layer, &color_p);
   const LightProbe *prb = (LightProbe *)ob->data;
   const bool show_clipping = (prb->flag & LIGHTPROBE_FLAG_SHOW_CLIP_DIST) != 0;
   const bool show_parallax = (prb->flag & LIGHTPROBE_FLAG_SHOW_PARALLAX) != 0;
   const bool show_influence = (prb->flag & LIGHTPROBE_FLAG_SHOW_INFLUENCE) != 0;
+  const bool show_data = (ob->base_flag & BASE_SELECTED) || DRW_state_is_select();
 
   union {
     float mat[4][4];
@@ -711,6 +730,31 @@ void OVERLAY_lightprobe_cache_populate(OVERLAY_Data *vedata, Object *ob)
         OVERLAY_empty_shape(cb, ob->obmat, 1.0 + prb->distinf, OB_CUBE, color_p);
         OVERLAY_empty_shape(cb, ob->obmat, 1.0 + prb->distinf * f, OB_CUBE, color_p);
       }
+
+      /* Data dots */
+      if (show_data) {
+        instdata.mat[0][3] = prb->grid_resolution_x;
+        instdata.mat[1][3] = prb->grid_resolution_y;
+        instdata.mat[2][3] = prb->grid_resolution_z;
+        /* Put theme id in matrix. */
+        if (UNLIKELY(ob->base_flag & BASE_FROM_DUPLI)) {
+          instdata.mat[3][3] = 0.0;
+        }
+        else if (theme_id == TH_ACTIVE) {
+          instdata.mat[3][3] = 1.0;
+        }
+        else /* TH_SELECT */ {
+          instdata.mat[3][3] = 2.0;
+        }
+
+        uint cell_count = prb->grid_resolution_x * prb->grid_resolution_y * prb->grid_resolution_z;
+        DRWShadingGroup *grp = DRW_shgroup_create_sub(vedata->stl->pd->extra_grid_grp);
+        DRW_shgroup_uniform_vec4_copy(grp, "gridModelMatrix[0]", instdata.mat[0]);
+        DRW_shgroup_uniform_vec4_copy(grp, "gridModelMatrix[1]", instdata.mat[1]);
+        DRW_shgroup_uniform_vec4_copy(grp, "gridModelMatrix[2]", instdata.mat[2]);
+        DRW_shgroup_uniform_vec4_copy(grp, "gridModelMatrix[3]", instdata.mat[3]);
+        DRW_shgroup_call_procedural_points(grp, NULL, cell_count);
+      }
       break;
     case LIGHTPROBE_TYPE_PLANAR:
       DRW_buffer_add_entry(cb->probe_planar, color_p, &instdata);
@@ -1581,7 +1625,17 @@ void OVERLAY_extra_in_front_draw(OVERLAY_Data *vedata)
 
 void OVERLAY_extra_centers_draw(OVERLAY_Data *vedata)
 {
+  OVERLAY_FramebufferList *fbl = vedata->fbl;
   OVERLAY_PassList *psl = vedata->psl;
 
+  if (DRW_state_is_fbo()) {
+    GPU_framebuffer_bind(fbl->overlay_color_only_fb);
+  }
+
+  DRW_draw_pass(psl->extra_grid_ps);
   DRW_draw_pass(psl->extra_centers_ps);
+
+  if (DRW_state_is_fbo()) {
+    GPU_framebuffer_bind(fbl->overlay_default_fb);
+  }
 }
diff --git a/source/blender/draw/engines/overlay/overlay_outline.c b/source/blender/draw/engines/overlay/overlay_outline.c
index 7eb942c64e4..bfef682568f 100644
--- a/source/blender/draw/engines/overlay/overlay_outline.c
+++ b/source/blender/draw/engines/overlay/overlay_outline.c
@@ -75,15 +75,10 @@ void OVERLAY_outline_cache_init(OVERLAY_Data *vedata)
     DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL;
     DRW_PASS_CREATE(psl->outlines_prepass_ps, state | pd->clipping_state);
 
-    GPUShader *sh_grid = OVERLAY_shader_outline_prepass_grid();
     GPUShader *sh_geom = OVERLAY_shader_outline_prepass(pd->xray_enabled_and_not_wire);
 
     pd->outlines_grp = grp = DRW_shgroup_create(sh_geom, psl->outlines_prepass_ps);
     DRW_shgroup_uniform_bool_copy(grp, "isTransform", (G.moving & G_TRANSFORM_OBJ) != 0);
-
-    pd->outlines_grid_grp = grp = DRW_shgroup_create(sh_grid, psl->outlines_prepass_ps);
-    DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
-    DRW_shgroup_uniform_bool_copy(grp, "isTransform", (G.moving & G_TRANSFORM_OBJ) != 0);
   }
 
   /* outlines_prepass_ps is still needed for selection of probes. */
@@ -111,51 +106,6 @@ void OVERLAY_outline_cache_init(OVERLAY_Data *vedata)
   }
 }
 
-static voi

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list