From e48ae247c414d3996d7058bd1ee31bd42daa16be Mon Sep 17 00:00:00 2001 From: water111 <48171810+water111@users.noreply.github.com> Date: Sun, 26 Feb 2023 09:52:04 -0500 Subject: [PATCH] [jak2] fix palace rotation and sprite glow depth test (#2269) - Disable depth test for sprite glow (VU1 programs only `sq.xy` and leaves `z` alone, which has Z_MAX from the template) - Fix tfrag/tie/shrub issues when `use-camera-other` is set. --- .../opengl_renderer/shaders/glow_draw.frag | 3 +- .../opengl_renderer/sprite/GlowRenderer.cpp | 9 ++- .../opengl_renderer/sprite/GlowRenderer.h | 1 + .../jak2/engine/gfx/background/background.gc | 64 +++++++++++++------ 4 files changed, 57 insertions(+), 20 deletions(-) diff --git a/game/graphics/opengl_renderer/shaders/glow_draw.frag b/game/graphics/opengl_renderer/shaders/glow_draw.frag index 5f371fff3b..cb657ad373 100644 --- a/game/graphics/opengl_renderer/shaders/glow_draw.frag +++ b/game/graphics/opengl_renderer/shaders/glow_draw.frag @@ -7,10 +7,11 @@ in float discard_flag; in vec2 uv_texture; layout (binding = 0) uniform sampler2D tex; +uniform float glow_boost; void main() { vec4 texture_color = texture(tex, uv_texture); - color.xyz = texture_color.xyz * fragment_color.xyz * 2.f * discard_flag / 128.f; + color.xyz = texture_color.xyz * fragment_color.xyz * 2.f * discard_flag / 128.f * glow_boost; color.w = fragment_color.w * texture_color.w; } diff --git a/game/graphics/opengl_renderer/sprite/GlowRenderer.cpp b/game/graphics/opengl_renderer/sprite/GlowRenderer.cpp index 2b05656384..351180eab6 100644 --- a/game/graphics/opengl_renderer/sprite/GlowRenderer.cpp +++ b/game/graphics/opengl_renderer/sprite/GlowRenderer.cpp @@ -492,6 +492,7 @@ void GlowRenderer::blit_depth(SharedRenderState* render_state) { void GlowRenderer::draw_debug_window() { ImGui::Checkbox("Show Probes", &m_debug.show_probes); ImGui::Checkbox("Show Copy", &m_debug.show_probe_copies); + ImGui::SliderFloat("Boost Glow", &m_debug.glow_boost, 0, 10); ImGui::Text("Count: %d", m_debug.num_sprites); } @@ -681,7 +682,12 @@ void GlowRenderer::draw_sprites(SharedRenderState* render_state, ScopedProfilerN glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); render_state->shaders[ShaderId::GLOW_DRAW].activate(); - glEnable(GL_DEPTH_TEST); + glUniform1f(glGetUniformLocation(render_state->shaders[ShaderId::GLOW_DRAW].id(), "glow_boost"), + m_debug.glow_boost); + + // on PS2's, it's enabled but all sprite z's are UINT24_MAX, so it always passes. + // this z-override is done in VU1 code and we don't replicate it here. + glDisable(GL_DEPTH_TEST); glDepthFunc(GL_GEQUAL); glEnable(GL_BLEND); // Cv = (Cs - 0) * Ad + D @@ -723,6 +729,7 @@ void GlowRenderer::draw_sprites(SharedRenderState* render_state, ScopedProfilerN prof.add_tri(2); glDrawElements(GL_TRIANGLE_STRIP, 5, GL_UNSIGNED_INT, (void*)(record.idx * sizeof(u32))); } + glEnable(GL_DEPTH_TEST); } GlowRenderer::Vertex* GlowRenderer::alloc_vtx(int num) { diff --git a/game/graphics/opengl_renderer/sprite/GlowRenderer.h b/game/graphics/opengl_renderer/sprite/GlowRenderer.h index e7e28198af..6a70862c65 100644 --- a/game/graphics/opengl_renderer/sprite/GlowRenderer.h +++ b/game/graphics/opengl_renderer/sprite/GlowRenderer.h @@ -26,6 +26,7 @@ class GlowRenderer { bool show_probes = false; bool show_probe_copies = false; int num_sprites = 0; + float glow_boost = 1.f; } m_debug; void add_sprite_pass_1(const SpriteGlowOutput& data); void add_sprite_pass_2(const SpriteGlowOutput& data, int sprite_idx); diff --git a/goal_src/jak2/engine/gfx/background/background.gc b/goal_src/jak2/engine/gfx/background/background.gc index dfc9048576..fb3cfe2f2c 100644 --- a/goal_src/jak2/engine/gfx/background/background.gc +++ b/goal_src/jak2/engine/gfx/background/background.gc @@ -615,25 +615,53 @@ ;; first 4 quadwords are planes, then itimes (let ((data-ptr (the-as (pointer uint128) (-> dma-buf base)))) - (set! (-> data-ptr 0) (-> *math-camera* plane 0 quad)) - (set! (-> data-ptr 1) (-> *math-camera* plane 1 quad)) - (set! (-> data-ptr 2) (-> *math-camera* plane 2 quad)) - (set! (-> data-ptr 3) (-> *math-camera* plane 3 quad)) - (set! (-> data-ptr 4) (-> lev mood-context itimes 0 quad)) - (set! (-> data-ptr 5) (-> lev mood-context itimes 1 quad)) - (set! (-> data-ptr 6) (-> lev mood-context itimes 2 quad)) - (set! (-> data-ptr 7) (-> lev mood-context itimes 3 quad)) - (set! (-> data-ptr 8) (-> *math-camera* camera-temp vector 0 quad)) - (set! (-> data-ptr 9) (-> *math-camera* camera-temp vector 1 quad)) - (set! (-> data-ptr 10) (-> *math-camera* camera-temp vector 2 quad)) - (set! (-> data-ptr 11) (-> *math-camera* camera-temp vector 3 quad)) - (set! (-> data-ptr 12) (-> *math-camera* hvdf-off quad)) - (let ((vec (-> (the (inline-array vector) data-ptr) 13))) - (set! (-> vec x) (-> *math-camera* pfog0)) - (set! (-> vec y) (-> *math-camera* fog-min)) - (set! (-> vec z) (-> *math-camera* fog-max)) + ;; the "use-camera-other" flag is set to "move" entire levels, + ;; like the rotating city below in the throne room. + (cond + ((-> lev info use-camera-other) + (set! (-> data-ptr 0) (-> *math-camera* plane-other 0 quad)) + (set! (-> data-ptr 1) (-> *math-camera* plane-other 1 quad)) + (set! (-> data-ptr 2) (-> *math-camera* plane-other 2 quad)) + (set! (-> data-ptr 3) (-> *math-camera* plane-other 3 quad)) + (set! (-> data-ptr 4) (-> lev mood-context itimes 0 quad)) + (set! (-> data-ptr 5) (-> lev mood-context itimes 1 quad)) + (set! (-> data-ptr 6) (-> lev mood-context itimes 2 quad)) + (set! (-> data-ptr 7) (-> lev mood-context itimes 3 quad)) + (set! (-> data-ptr 8) (-> *math-camera* camera-temp-other vector 0 quad)) + (set! (-> data-ptr 9) (-> *math-camera* camera-temp-other vector 1 quad)) + (set! (-> data-ptr 10) (-> *math-camera* camera-temp-other vector 2 quad)) + (set! (-> data-ptr 11) (-> *math-camera* camera-temp-other vector 3 quad)) + (set! (-> data-ptr 12) (-> *math-camera* hvdf-off quad)) + (let ((vec (-> (the (inline-array vector) data-ptr) 13))) + (set! (-> vec x) (-> *math-camera* pfog0)) + (set! (-> vec y) (-> *math-camera* fog-min)) + (set! (-> vec z) (-> *math-camera* fog-max)) + ) + (set! (-> data-ptr 14) (-> *math-camera* trans-other quad)) + ) + (else + (set! (-> data-ptr 0) (-> *math-camera* plane 0 quad)) + (set! (-> data-ptr 1) (-> *math-camera* plane 1 quad)) + (set! (-> data-ptr 2) (-> *math-camera* plane 2 quad)) + (set! (-> data-ptr 3) (-> *math-camera* plane 3 quad)) + (set! (-> data-ptr 4) (-> lev mood-context itimes 0 quad)) + (set! (-> data-ptr 5) (-> lev mood-context itimes 1 quad)) + (set! (-> data-ptr 6) (-> lev mood-context itimes 2 quad)) + (set! (-> data-ptr 7) (-> lev mood-context itimes 3 quad)) + (set! (-> data-ptr 8) (-> *math-camera* camera-temp vector 0 quad)) + (set! (-> data-ptr 9) (-> *math-camera* camera-temp vector 1 quad)) + (set! (-> data-ptr 10) (-> *math-camera* camera-temp vector 2 quad)) + (set! (-> data-ptr 11) (-> *math-camera* camera-temp vector 3 quad)) + (set! (-> data-ptr 12) (-> *math-camera* hvdf-off quad)) + (let ((vec (-> (the (inline-array vector) data-ptr) 13))) + (set! (-> vec x) (-> *math-camera* pfog0)) + (set! (-> vec y) (-> *math-camera* fog-min)) + (set! (-> vec z) (-> *math-camera* fog-max)) + ) + (set! (-> data-ptr 14) (-> *math-camera* trans quad)) + ) ) - (set! (-> data-ptr 14) (-> (math-camera-pos) quad)) + (charp<-string (the (pointer uint8) (&-> data-ptr 15)) (symbol->string (-> lev nickname))) ) (&+! (-> dma-buf base) (* 16 16))