[Bf-blender-cvs] [1552dd3f16b] tmp-overlay-engine: Overlay Mode: Fix infront depth sorting

Clément Foucault noreply at git.blender.org
Sun Nov 24 02:03:05 CET 2019


Commit: 1552dd3f16bda362d7c6c18294f35c210180f3f2
Author: Clément Foucault
Date:   Fri Nov 22 17:39:59 2019 +0100
Branches: tmp-overlay-engine
https://developer.blender.org/rB1552dd3f16bda362d7c6c18294f35c210180f3f2

Overlay Mode: Fix infront depth sorting

This is an improvement to 2.81. In front objects and extras are correctly
depth sorted.

The approach is to share an in-front depth buffer between all engines
so that workbench fill it with the infront objects depth. Then the overlay
engine can use it again to draw in front objects overlays correctly
occluded by the other "in front" objects surfaces.

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

M	source/blender/draw/DRW_engine.h
M	source/blender/draw/engines/overlay/overlay_armature.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_paint.c
M	source/blender/draw/engines/overlay/overlay_private.h
M	source/blender/draw/engines/overlay/overlay_wireframe.c
M	source/blender/draw/engines/workbench/workbench_deferred.c
M	source/blender/draw/intern/DRW_render.h
M	source/blender/gpu/intern/gpu_viewport.c

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

diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h
index 34d3ae1d207..c5ee4e12b40 100644
--- a/source/blender/draw/DRW_engine.h
+++ b/source/blender/draw/DRW_engine.h
@@ -48,6 +48,7 @@ struct rcti;
 /* Buffer and textures used by the viewport by default */
 typedef struct DefaultFramebufferList {
   struct GPUFrameBuffer *default_fb;
+  struct GPUFrameBuffer *in_front_fb;
   struct GPUFrameBuffer *color_only_fb;
   struct GPUFrameBuffer *depth_only_fb;
   struct GPUFrameBuffer *multisample_fb;
@@ -56,6 +57,7 @@ typedef struct DefaultFramebufferList {
 typedef struct DefaultTextureList {
   struct GPUTexture *color;
   struct GPUTexture *depth;
+  struct GPUTexture *depth_in_front;
   struct GPUTexture *multisample_color;
   struct GPUTexture *multisample_depth;
 } DefaultTextureList;
diff --git a/source/blender/draw/engines/overlay/overlay_armature.c b/source/blender/draw/engines/overlay/overlay_armature.c
index 46347b57993..5338698fa80 100644
--- a/source/blender/draw/engines/overlay/overlay_armature.c
+++ b/source/blender/draw/engines/overlay/overlay_armature.c
@@ -2317,7 +2317,11 @@ void OVERLAY_pose_draw(OVERLAY_Data *vedata)
 
     DRW_draw_pass(psl->armature_bone_select_ps);
 
-    GPU_framebuffer_clear_depth(dfbl->default_fb, 1.0f);
+    if (DRW_state_is_fbo()) {
+      GPU_framebuffer_clear_depth(dfbl->default_fb, 1.0f);
+    }
+    /* Selection still works because we are drawing only the pose bones in this case. */
+
     DRW_draw_pass(psl->armature_ps[1]);
   }
 }
\ No newline at end of file
diff --git a/source/blender/draw/engines/overlay/overlay_edit_mesh.c b/source/blender/draw/engines/overlay/overlay_edit_mesh.c
index 7955017732b..396fb0ec865 100644
--- a/source/blender/draw/engines/overlay/overlay_edit_mesh.c
+++ b/source/blender/draw/engines/overlay/overlay_edit_mesh.c
@@ -40,20 +40,12 @@
 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();
-  DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
 
   pd->edit_mesh.do_zbufclip = XRAY_FLAG_ENABLED(draw_ctx->v3d);
 
-  if (pd->edit_mesh.do_zbufclip) {
-    DRW_texture_ensure_fullscreen_2d(&txl->temp_depth_tx, GPU_DEPTH_COMPONENT24, 0);
-    GPU_framebuffer_ensure_config(
-        &fbl->edit_mesh_occlude_wire_fb,
-        {GPU_ATTACHMENT_TEXTURE(txl->temp_depth_tx), GPU_ATTACHMENT_TEXTURE(dtxl->color)});
-  }
-  else {
+  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);
   }
@@ -373,7 +365,6 @@ void OVERLAY_edit_mesh_draw(OVERLAY_Data *vedata)
 {
   OVERLAY_PassList *psl = vedata->psl;
   OVERLAY_PrivateData *pd = vedata->stl->pd;
-  OVERLAY_FramebufferList *fbl = vedata->fbl;
   DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
 
   DRW_draw_pass(psl->edit_mesh_weight_ps);
@@ -393,8 +384,8 @@ void OVERLAY_edit_mesh_draw(OVERLAY_Data *vedata)
 
     DRW_view_set_active(NULL);
 
-    GPU_framebuffer_bind(fbl->edit_mesh_occlude_wire_fb);
-    GPU_framebuffer_clear_depth(fbl->edit_mesh_occlude_wire_fb, 1.0f);
+    GPU_framebuffer_bind(dfbl->in_front_fb);
+    GPU_framebuffer_clear_depth(dfbl->in_front_fb, 1.0f);
     DRW_draw_pass(psl->edit_mesh_normals_ps);
 
     DRW_view_set_active(pd->view_edit_edges);
@@ -420,7 +411,7 @@ void OVERLAY_edit_mesh_draw(OVERLAY_Data *vedata)
       GPU_framebuffer_clear_depth(dfbl->default_fb, 1.0f);
     }
 
-    DRW_draw_pass(psl->edit_mesh_depth_ps[1]);
+    DRW_draw_pass(psl->edit_mesh_depth_ps[IN_FRONT]);
     overlay_edit_mesh_draw_components(psl, pd, true);
   }
 }
diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c
index 2107e318c87..7f406ce73de 100644
--- a/source/blender/draw/engines/overlay/overlay_engine.c
+++ b/source/blender/draw/engines/overlay/overlay_engine.c
@@ -91,6 +91,7 @@ static void OVERLAY_cache_init(void *vedata)
   pd->clipping_state = (rv3d->rflag & RV3D_CLIPPING) ? DRW_STATE_CLIP_PLANES : 0;
   pd->xray_enabled = XRAY_ACTIVE(v3d);
   pd->xray_enabled_and_not_wire = pd->xray_enabled && v3d->shading.type > OB_WIRE;
+  pd->clear_in_front = (v3d->shading.type != OB_SOLID);
 
   switch (pd->ctx_mode) {
     case CTX_MODE_EDIT_MESH:
@@ -328,6 +329,7 @@ static void OVERLAY_draw_scene(void *vedata)
 {
   OVERLAY_Data *data = vedata;
   OVERLAY_PrivateData *pd = data->stl->pd;
+  DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
 
   OVERLAY_image_draw(vedata);
   OVERLAY_facing_draw(vedata);
@@ -340,17 +342,34 @@ static void OVERLAY_draw_scene(void *vedata)
   OVERLAY_grid_draw(vedata);
   OVERLAY_outline_draw(vedata);
 
+  if (DRW_state_is_fbo()) {
+    GPU_framebuffer_bind(dfbl->in_front_fb);
+
+    /* If we are not in solid shading mode, we clear the depth. */
+    if (pd->clear_in_front) {
+      /* TODO(fclem) This clear should be done in a global place. */
+      GPU_framebuffer_clear_depth(dfbl->in_front_fb, 1.0f);
+    }
+  }
+  else if (DRW_state_is_select()) {
+    /* TODO fix in_front selectability */
+  }
+
   OVERLAY_wireframe_in_front_draw(vedata);
   OVERLAY_armature_in_front_draw(vedata);
   OVERLAY_extra_in_front_draw(vedata);
   OVERLAY_image_in_front_draw(vedata);
 
+  if (DRW_state_is_fbo()) {
+    GPU_framebuffer_bind(dfbl->default_fb);
+  }
+
   OVERLAY_motion_path_draw(vedata);
   OVERLAY_extra_centers_draw(vedata);
 
   switch (pd->ctx_mode) {
     case CTX_MODE_EDIT_MESH:
-      OVERLAY_edit_mesh_draw(vedata); /* Clear depth for xray */
+      OVERLAY_edit_mesh_draw(vedata);
       break;
     case CTX_MODE_EDIT_SURFACE:
     case CTX_MODE_EDIT_CURVE:
@@ -364,7 +383,7 @@ static void OVERLAY_draw_scene(void *vedata)
       break;
     case CTX_MODE_POSE:
       OVERLAY_paint_draw(vedata);
-      OVERLAY_pose_draw(vedata); /* Clear depth for xray */
+      OVERLAY_pose_draw(vedata);
       break;
     case CTX_MODE_PAINT_WEIGHT:
     case CTX_MODE_PAINT_VERTEX:
diff --git a/source/blender/draw/engines/overlay/overlay_paint.c b/source/blender/draw/engines/overlay/overlay_paint.c
index dae371728a9..d9e85ea1152 100644
--- a/source/blender/draw/engines/overlay/overlay_paint.c
+++ b/source/blender/draw/engines/overlay/overlay_paint.c
@@ -42,6 +42,7 @@ void OVERLAY_paint_cache_init(OVERLAY_Data *vedata)
   float opacity = 0.0f;
 
   switch (pd->ctx_mode) {
+    case CTX_MODE_POSE:
     case CTX_MODE_PAINT_WEIGHT: {
       opacity = pd->overlay.weight_paint_mode_opacity;
       if (opacity > 0.0f) {
diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h
index 03e89f01bba..cabc3365cbb 100644
--- a/source/blender/draw/engines/overlay/overlay_private.h
+++ b/source/blender/draw/engines/overlay/overlay_private.h
@@ -32,7 +32,6 @@
 typedef struct OVERLAY_FramebufferList {
   struct GPUFrameBuffer *outlines_prepass_fb;
   struct GPUFrameBuffer *outlines_process_fb[2];
-  struct GPUFrameBuffer *edit_mesh_occlude_wire_fb;
 } OVERLAY_FramebufferList;
 
 typedef struct OVERLAY_TextureList {
@@ -259,7 +258,7 @@ typedef struct OVERLAY_PrivateData {
 
   View3DOverlay overlay;
   enum eContextObjectMode ctx_mode;
-  bool clear_stencil;
+  bool clear_in_front;
   bool xray_enabled;
   bool xray_enabled_and_not_wire;
   short v3d_flag;
diff --git a/source/blender/draw/engines/overlay/overlay_wireframe.c b/source/blender/draw/engines/overlay/overlay_wireframe.c
index 35d83f7dea3..9e43e50ed3b 100644
--- a/source/blender/draw/engines/overlay/overlay_wireframe.c
+++ b/source/blender/draw/engines/overlay/overlay_wireframe.c
@@ -52,7 +52,6 @@ void OVERLAY_wireframe_cache_init(OVERLAY_Data *vedata)
 
   View3DShading *shading = &draw_ctx->v3d->shading;
 
-  pd->clear_stencil = (shading->type > OB_SOLID);
   pd->shdata.wire_step_param = pd->overlay.wireframe_threshold - 254.0f / 255.0f;
 
   bool is_wire_shmode = (shading->type == OB_WIRE);
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c
index 2e8b952f234..0505ff37f49 100644
--- a/source/blender/draw/engines/workbench/workbench_deferred.c
+++ b/source/blender/draw/engines/workbench/workbench_deferred.c
@@ -74,7 +74,6 @@ static struct {
   /* TODO(fclem) move everything below to wpd and custom viewlayer data. */
   struct GPUTexture *oit_accum_tx;        /* ref only, not alloced */
   struct GPUTexture *oit_revealage_tx;    /* ref only, not alloced */
-  struct GPUTexture *ghost_depth_tx;      /* ref only, not alloced */
   struct GPUTexture *object_id_tx;        /* ref only, not alloced */
   struct GPUTexture *color_buffer_tx;     /* ref only, not alloced */
   struct GPUTexture *cavity_buffer_tx;    /* ref only, not alloced */
@@ -508,6 +507,13 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata)
                                       GPU_ATTACHMENT_TEXTURE(e_data.object_id_tx),
                                       GPU_ATTACHMENT_TEXTURE(e_data.normal_buffer_tx),
                                   });
+    GPU_framebuffer_ensure_config(&fbl->ghost_prepass_fb,
+                                  {
+                                      GPU_ATTACHMENT_TEXTURE(dtxl->depth_in_front),
+                                      GPU_ATTACHMENT_TEXTURE(e_data.color_buffer_tx),
+                                      GPU_ATTACHMENT_TEXTURE(e_data.object_id_tx),
+                                      GPU_ATTACHMENT_TEXTURE(e_data.normal_buffer_tx),
+                                  });
     GPU_framebuffer_ensure_config(&fbl->cavity_fb,
                                   {
                                       GPU_ATTACHMENT_NONE,
@@ -582,7 +588,7 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata)
     psl->ghost_resolve_pass = DRW_pass_create("Resolve Ghost Depth",
                                               DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_ALWAYS);
     grp = DRW_shgroup_create(e_data.ghost_resolve_sh, psl->ghost_resolve_pass);
-    DRW_shgrou

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list