[Bf-blender-cvs] [8cbd045a828] tmp-workbench-rewrite2: wbench next: fix shadows fail pass

Miguel Pozo noreply at git.blender.org
Mon Dec 5 19:05:01 CET 2022


Commit: 8cbd045a8280de5fa20b530b9eb30477c1439f28
Author: Miguel Pozo
Date:   Mon Dec 5 16:08:59 2022 +0100
Branches: tmp-workbench-rewrite2
https://developer.blender.org/rB8cbd045a8280de5fa20b530b9eb30477c1439f28

wbench next: fix shadows fail pass

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

M	source/blender/draw/engines/workbench/workbench_private.hh
M	source/blender/draw/engines/workbench/workbench_shadow.cc

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

diff --git a/source/blender/draw/engines/workbench/workbench_private.hh b/source/blender/draw/engines/workbench/workbench_private.hh
index 3ac514c7da5..ac92cb19eb1 100644
--- a/source/blender/draw/engines/workbench/workbench_private.hh
+++ b/source/blender/draw/engines/workbench/workbench_private.hh
@@ -260,7 +260,7 @@ struct ShadowPass {
   PassMain pass_ps = {"Shadow.Pass"};
   PassMain fail_ps = {"Shadow.Fail"};
 
-  PassMain::Sub *passes_[2][3];
+  PassMain::Sub *passes_[2][2][2] = {{{nullptr}}};
   PassMain::Sub *&get_pass_ptr(bool depth_pass, bool manifold, bool cap = false);
 
   GPUShader *shaders[2][2][2] = {{{nullptr}}};
diff --git a/source/blender/draw/engines/workbench/workbench_shadow.cc b/source/blender/draw/engines/workbench/workbench_shadow.cc
index 6071d484360..61207337d86 100644
--- a/source/blender/draw/engines/workbench/workbench_shadow.cc
+++ b/source/blender/draw/engines/workbench/workbench_shadow.cc
@@ -44,7 +44,7 @@ static void compute_parallel_lines_nor_and_dist(const float2 v1,
 
 PassMain::Sub *&ShadowPass::get_pass_ptr(bool depth_pass, bool manifold, bool cap /*= false*/)
 {
-  return passes_[depth_pass][manifold ? 0 : (cap ? 1 : 2)];
+  return passes_[depth_pass][manifold][cap];
 }
 
 GPUShader *ShadowPass::get_shader(bool depth_pass, bool manifold, bool cap /*= false*/)
@@ -94,11 +94,11 @@ void ShadowPass::init(const SceneState &scene_state, SceneResources &resources)
 
 void ShadowPass::update()
 {
-  changed = compare_v3v3(direction_ws, cached_direction, 1e-5f);
+  changed = !compare_v3v3(direction_ws, cached_direction, 1e-5f);
 
   if (changed) {
     const float3 up = {0.0f, 0.0f, 1.0f};
-    matrix = float4x4();
+    matrix = float4x4::identity();
 
     /* TODO: fix singularity. */
     copy_v3_v3(matrix[2], direction_ws);
@@ -161,31 +161,30 @@ void ShadowPass::sync()
   /* TODO(fclem): Merge into one pass with sub-passes. */
   pass_ps.init();
   pass_ps.state_set(depth_pass_state);
+  pass_ps.state_stencil(0xFF, 0xFF, 0xFF);
 
   /* TODO(Miguel Pozo) */
   pass_ps.clear_stencil(0);
 
   fail_ps.init();
   fail_ps.state_set(depth_fail_state);
+  fail_ps.state_stencil(0xFF, 0xFF, 0xFF);
 
   /* Stencil Shadow passes. */
-  for (int manifold = 0; manifold < 2; manifold++) {
-    std::string start = manifold ? "Manifold " : "Non Manifold ";
+  for (bool manifold : {false, true}) {
     {
       PassMain::Sub *&ps = get_pass_ptr(true, manifold);
-      ps = &pass_ps.sub((start + "Pass").c_str());
+      ps = &pass_ps.sub(manifold ? "manifold" : "non_manifold");
       ps->shader_set(get_shader(true, manifold));
-      ps->state_stencil(0xFF, 0xFF, 0xFF);
     }
     {
       PassMain::Sub *&ps = get_pass_ptr(false, manifold, false);
-      ps = &fail_ps.sub((start + "Fail No Caps").c_str());
+      ps = &fail_ps.sub(manifold ? "NoCaps.manifold" : "NoCaps.non_manifold");
       ps->shader_set(get_shader(false, manifold, false));
-      ps->state_stencil(0xFF, 0xFF, 0xFF);
     }
     {
       PassMain::Sub *&ps = get_pass_ptr(false, manifold, true);
-      ps = &fail_ps.sub((start + "Fail Caps").c_str());
+      ps = &fail_ps.sub(manifold ? "Caps.manifold" : "Caps.non_manifold");
       ps->shader_set(get_shader(false, manifold, true));
     }
   }
@@ -227,8 +226,8 @@ void ShadowPass::object_sync(Manager &manager,
       use_shadow_pass_technique = false;
     }
 
-    if (true || use_shadow_pass_technique) {
-      PassMain::Sub &ps = get_pass_ptr(true, is_manifold)->sub(ob->id.name);
+    if (use_shadow_pass_technique) {
+      PassMain::Sub &ps = *get_pass_ptr(true, is_manifold);
       ps.push_constant("lightDirection", object_data.direction);
       ps.push_constant("lightDistance", 1e5f);
       ResourceHandle handle = manager.resource_handle(ob_ref);
@@ -243,14 +242,14 @@ void ShadowPass::object_sync(Manager &manager,
       /* TODO(fclem): only use caps if they are in the view frustum. */
       const bool need_caps = true;
       if (need_caps) {
-        PassMain::Sub &ps = get_pass_ptr(false, is_manifold, true)->sub(ob->id.name);
+        PassMain::Sub &ps = *get_pass_ptr(false, is_manifold, true);
         ps.push_constant("lightDirection", object_data.direction);
         ps.push_constant("lightDistance", extrude_distance);
         ResourceHandle handle = manager.resource_handle(ob_ref);
-        ps.draw(geom_shadow, handle);
+        ps.draw(DRW_cache_object_surface_get(ob), handle);
       }
 
-      PassMain::Sub &ps = get_pass_ptr(false, is_manifold, false)->sub(ob->id.name);
+      PassMain::Sub &ps = *get_pass_ptr(false, is_manifold, false);
       ps.push_constant("lightDirection", object_data.direction);
       ps.push_constant("lightDistance", extrude_distance);
       ResourceHandle handle = manager.resource_handle(ob_ref);



More information about the Bf-blender-cvs mailing list