[Bf-blender-cvs] [bd0809da61c] greasepencil-refactor: GPencil: Refactor: Fix depth sorting with workbench render

Clément Foucault noreply at git.blender.org
Fri Jan 10 17:11:36 CET 2020


Commit: bd0809da61c55221e340056f387cad3d037c4d23
Author: Clément Foucault
Date:   Fri Jan 10 17:11:06 2020 +0100
Branches: greasepencil-refactor
https://developer.blender.org/rBbd0809da61c55221e340056f387cad3d037c4d23

GPencil: Refactor: Fix depth sorting with workbench render

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

M	source/blender/draw/engines/workbench/workbench_render.c

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

diff --git a/source/blender/draw/engines/workbench/workbench_render.c b/source/blender/draw/engines/workbench/workbench_render.c
index 899fbdc9b71..26f37b764be 100644
--- a/source/blender/draw/engines/workbench/workbench_render.c
+++ b/source/blender/draw/engines/workbench/workbench_render.c
@@ -117,6 +117,60 @@ static bool workbench_render_framebuffers_init(void)
   return ok;
 }
 
+static void workbench_render_result_z(struct RenderLayer *rl,
+                                      const char *viewname,
+                                      const rcti *rect)
+{
+  DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
+  const DRWContextState *draw_ctx = DRW_context_state_get();
+  ViewLayer *view_layer = draw_ctx->view_layer;
+
+  if ((view_layer->passflag & SCE_PASS_Z) != 0) {
+    RenderPass *rp = RE_pass_find_by_name(rl, RE_PASSNAME_Z, viewname);
+
+    GPU_framebuffer_bind(dfbl->default_fb);
+    GPU_framebuffer_read_depth(dfbl->default_fb,
+                               rect->xmin,
+                               rect->ymin,
+                               BLI_rcti_size_x(rect),
+                               BLI_rcti_size_y(rect),
+                               rp->rect);
+
+    float winmat[4][4];
+    DRW_view_winmat_get(NULL, winmat, false);
+
+    int pix_ct = BLI_rcti_size_x(rect) * BLI_rcti_size_y(rect);
+
+    /* Convert ogl depth [0..1] to view Z [near..far] */
+    if (DRW_view_is_persp_get(NULL)) {
+      for (int i = 0; i < pix_ct; i++) {
+        if (rp->rect[i] == 1.0f) {
+          rp->rect[i] = 1e10f; /* Background */
+        }
+        else {
+          rp->rect[i] = rp->rect[i] * 2.0f - 1.0f;
+          rp->rect[i] = winmat[3][2] / (rp->rect[i] + winmat[2][2]);
+        }
+      }
+    }
+    else {
+      /* Keep in mind, near and far distance are negatives. */
+      float near = DRW_view_near_distance_get(NULL);
+      float far = DRW_view_far_distance_get(NULL);
+      float range = fabsf(far - near);
+
+      for (int i = 0; i < pix_ct; i++) {
+        if (rp->rect[i] == 1.0f) {
+          rp->rect[i] = 1e10f; /* Background */
+        }
+        else {
+          rp->rect[i] = -rp->rect[i] * range + near;
+        }
+      }
+    }
+  }
+}
+
 static void workbench_render_framebuffers_finish(void)
 {
 }
@@ -197,8 +251,8 @@ void workbench_render(WORKBENCH_Data *data,
   const char *viewname = RE_GetActiveRenderView(engine->re);
   RenderPass *rp = RE_pass_find_by_name(render_layer, RE_PASSNAME_COMBINED, viewname);
 
-  GPU_framebuffer_bind(dfbl->color_only_fb);
-  GPU_framebuffer_read_color(dfbl->color_only_fb,
+  GPU_framebuffer_bind(dfbl->default_fb);
+  GPU_framebuffer_read_color(dfbl->default_fb,
                              rect->xmin,
                              rect->ymin,
                              BLI_rcti_size_x(rect),
@@ -207,6 +261,8 @@ void workbench_render(WORKBENCH_Data *data,
                              0,
                              rp->rect);
 
+  workbench_render_result_z(render_layer, viewname, rect);
+
   workbench_render_framebuffers_finish();
 }



More information about the Bf-blender-cvs mailing list