diff --git a/game/graphics/opengl_renderer/foreground/Generic2.h b/game/graphics/opengl_renderer/foreground/Generic2.h index c6c19214f3..ed2848cc55 100644 --- a/game/graphics/opengl_renderer/foreground/Generic2.h +++ b/game/graphics/opengl_renderer/foreground/Generic2.h @@ -42,6 +42,7 @@ class Generic2 : public BucketRenderer { ScopedProfilerNode& prof, DrawMode::AlphaBlend alpha, bool hud); + void do_hud_draws(SharedRenderState* render_state, ScopedProfilerNode& prof); bool check_for_end_of_generic_data(DmaFollower& dma, u32 next_bucket); void final_vertex_update(); bool handle_bucket_setup_dma(DmaFollower& dma, u32 next_bucket); diff --git a/game/graphics/opengl_renderer/foreground/Generic2_Build.cpp b/game/graphics/opengl_renderer/foreground/Generic2_Build.cpp index 6f0cd36036..10cce737d7 100644 --- a/game/graphics/opengl_renderer/foreground/Generic2_Build.cpp +++ b/game/graphics/opengl_renderer/foreground/Generic2_Build.cpp @@ -51,6 +51,13 @@ void Generic2::determine_draw_modes() { auto& frag = m_fragments[m_adgifs[i].frag]; m_adgifs[i].uses_hud = frag.uses_hud; + // the header contains the giftag which might set fogging based on pre. + GifTag tag(frag.header + (4 * 16)); + if (tag.pre()) { + GsPrim prim(tag.prim()); + m_gs.set_fog_flag(prim.fge()); + } + // ADGIF 0 ASSERT((u8)ad.tex0_addr == (u32)GsRegisterAddress::TEX0_1); if (ad.tex0_data != tex0.data) { @@ -203,13 +210,13 @@ void Generic2::draws_to_buckets() { std::unordered_map draw_key_to_bucket; for (u32 i = 0; i < m_next_free_adgif; i++) { auto& ad = m_adgifs[i]; - u64 key = ad.key(); - const auto& bucket_it = draw_key_to_bucket.find(key); - if (bucket_it == draw_key_to_bucket.end()) { - // new bucket! + if (ad.uses_hud) { + // put all hud draws in separate buckets. + // there's some really weird messed up draws for the orbs that fly up to the corner when + // breaking a crate on a zoomer. u32 bucket_idx = m_next_free_bucket++; ASSERT(bucket_idx < m_buckets.size()); - draw_key_to_bucket[key] = bucket_idx; + draw_key_to_bucket[ad.key()] = bucket_idx; auto& bucket = m_buckets[bucket_idx]; bucket.tbp = ad.tbp; bucket.mode = ad.mode; @@ -217,11 +224,26 @@ void Generic2::draws_to_buckets() { bucket.last = i; ad.next = UINT32_MAX; } else { - // existing bucket! - auto& bucket = m_buckets[bucket_it->second]; - m_adgifs[bucket.last].next = i; - ad.next = UINT32_MAX; - bucket.last = i; + u64 key = ad.key(); + const auto& bucket_it = draw_key_to_bucket.find(key); + if (bucket_it == draw_key_to_bucket.end()) { + // new bucket! + u32 bucket_idx = m_next_free_bucket++; + ASSERT(bucket_idx < m_buckets.size()); + draw_key_to_bucket[key] = bucket_idx; + auto& bucket = m_buckets[bucket_idx]; + bucket.tbp = ad.tbp; + bucket.mode = ad.mode; + bucket.start = i; + bucket.last = i; + ad.next = UINT32_MAX; + } else { + // existing bucket! + auto& bucket = m_buckets[bucket_it->second]; + m_adgifs[bucket.last].next = i; + ad.next = UINT32_MAX; + bucket.last = i; + } } } } diff --git a/game/graphics/opengl_renderer/foreground/Generic2_OpenGL.cpp b/game/graphics/opengl_renderer/foreground/Generic2_OpenGL.cpp index 95a07849ae..b65b2c7e28 100644 --- a/game/graphics/opengl_renderer/foreground/Generic2_OpenGL.cpp +++ b/game/graphics/opengl_renderer/foreground/Generic2_OpenGL.cpp @@ -266,6 +266,22 @@ void Generic2::do_draws_for_alpha(SharedRenderState* render_state, } } +void Generic2::do_hud_draws(SharedRenderState* render_state, ScopedProfilerNode& prof) { + for (u32 i = 0; i < m_next_free_bucket; i++) { + auto& bucket = m_buckets[i]; + auto& first = m_adgifs[bucket.start]; + if (first.uses_hud) { + setup_opengl_for_draw_mode(first.mode, first.fix, render_state); + setup_opengl_tex(0, first.tbp, first.mode.get_filt_enable(), first.mode.get_clamp_s_enable(), + first.mode.get_clamp_t_enable(), render_state); + glDrawElements(GL_TRIANGLE_STRIP, bucket.idx_count, GL_UNSIGNED_INT, + (void*)(sizeof(u32) * bucket.idx_idx)); + prof.add_draw_call(); + prof.add_tri(bucket.tri_count); + } + } +} + void Generic2::do_draws(SharedRenderState* render_state, ScopedProfilerNode& prof) { glBindVertexArray(m_ogl.vao); glBindBuffer(GL_ARRAY_BUFFER, m_ogl.vertex_buffer); @@ -297,10 +313,6 @@ void Generic2::do_draws(SharedRenderState* render_state, ScopedProfilerNode& pro glUniform1f(m_ogl.mat_32, m_drawing_config.hud_mat_32); glUniform1f(m_ogl.mat_33, m_drawing_config.hud_mat_33); - for (int i = 0; i < ALPHA_MODE_COUNT; i++) { - if (m_alpha_draw_enable[i]) { - do_draws_for_alpha(render_state, prof, alpha_order[i], true); - } - } + do_hud_draws(render_state, prof); } } \ No newline at end of file