mirror of
https://github.com/open-goal/jak-project
synced 2026-07-09 06:53:45 -04:00
fix envmap bugs in generic2 (#1229)
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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<u64, u32> 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user