[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