Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FF7: Fix 3D model drawn over UI on BATTLE mode if lighting enabled #508

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions src/ff7/battle/menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,14 @@ namespace ff7::battle
void battle_menu_enter()
{
*ff7_externals.g_do_render_menu = 0;
if(!enable_lighting)
newRenderer.clearDepthBuffer();
battle_depth_clear();
}

void battle_depth_clear()
{
if(gl_defer_battle_depth_clear()) return;

newRenderer.clearDepthBuffer();
}

void update_battle_menu()
Expand Down
1 change: 1 addition & 0 deletions src/ff7/battle/menu.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,5 @@ namespace ff7::battle
void display_cait_sith_slots_handler();
void display_battle_arena_menu_handler();
void delay_battle_target_pointer_animation_type();
void battle_depth_clear();
}
2 changes: 2 additions & 0 deletions src/gl.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ enum DrawCallType
DCT_BLIT,
DCT_DRAW,
DCT_DRAW_MOVIE,
DCT_BATTLE_DEPTH_CLEAR,
DCT_ZOOM
};

Expand Down Expand Up @@ -118,6 +119,7 @@ uint32_t gl_defer_sorted_draw(uint32_t primitivetype, uint32_t vertextype, struc
uint32_t gl_defer_blit_framebuffer(struct texture_set *texture_set, struct tex_header *tex_header);
uint32_t gl_defer_clear_buffer(uint32_t clear_color, uint32_t clear_depth, struct game_obj *game_object);
uint32_t gl_defer_yuv_frame(uint32_t buffer_index);
uint32_t gl_defer_battle_depth_clear();
uint32_t gl_defer_zoom();
void gl_draw_deferred(draw_field_shadow_callback shadow_callback);
struct boundingbox calculateSceneAabb();
Expand Down
42 changes: 41 additions & 1 deletion src/gl/deferred.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include "../log.h"
#include "../common.h"
#include "../video/movies.h"
#include "../ff7/battle/menu.h"

#include "ff7/widescreen.h"

Expand Down Expand Up @@ -273,7 +274,41 @@ uint32_t gl_defer_zoom()

num_deferred++;

if (trace_all) ffnx_trace("gl_defer_yuv_frame: return true\n");
if (trace_all) ffnx_trace("gl_defer_zoom: return true\n");

return true;
}

uint32_t gl_defer_battle_depth_clear()
{
if (ff8 || !enable_lighting)
{
return false;
}

if (trace_all) ffnx_trace("gl_defer_battle_depth_clear");

if (!deferred_draws) deferred_draws = (deferred_draw*)driver_calloc(sizeof(*deferred_draws), DEFERRED_MAX);

// global disable
if (nodefer) {
if (trace_all) ffnx_trace("gl_defer_battle_depth_clear: nodefer true\n");
return false;
}

if (num_deferred + 1 > DEFERRED_MAX)
{
if (trace_all) ffnx_trace("gl_defer_battle_depth_clear: deferred draw queue overflow - num_deferred: %u - count: 1 - DEFERRED_MAX: %u\n", num_deferred, DEFERRED_MAX);
return false;
}

uint32_t defer = num_deferred;

deferred_draws[defer].draw_call_type = DCT_BATTLE_DEPTH_CLEAR;

num_deferred++;

if (trace_all) ffnx_trace("gl_defer_battle_depth_clear: return true\n");

return true;
}
Expand Down Expand Up @@ -477,6 +512,11 @@ void gl_draw_deferred(draw_field_shadow_callback shadow_callback)
ff7_field_draw_gray_quads_sub_644E90();
continue;
}
else if(deferred_draws[i].draw_call_type == DCT_BATTLE_DEPTH_CLEAR)
{
ff7::battle::battle_depth_clear();
continue;
}

if (deferred_draws[i].vertices == nullptr)
{
Expand Down