Init render data by DivaGL

This commit is contained in:
korenkonder
2024-04-02 23:51:10 +03:00
parent 17e78dd81f
commit e5418a847b
9 changed files with 566 additions and 2 deletions
+180
View File
@@ -44,6 +44,9 @@ static void draw_pass_3d_translucent_has_objects(bool* arr, mdl::ObjType type);
static void blur_filter_apply(RenderTexture* dst, RenderTexture* src,
blur_filter_mode filter, const vec2 res_scale, const vec4 scale, const vec4 offset);
static void render_manager_free_render_textures();
static void render_manager_init_render_textures(int32_t multisample);
extern render_context* rctx;
RenderTexture* litproj_shadow = (RenderTexture*)0x0000000141194DA0;
@@ -51,6 +54,26 @@ RenderTexture* litproj_texture = (RenderTexture*)0x0000000141194E00;
rndr::RenderManager* render_manager = (rndr::RenderManager*)0x00000001411AD320;
namespace rndr {
struct RenderTextureData {
GLenum type;
int32_t width;
int32_t height;
int32_t max_level;
GLenum color_format;
GLenum depth_format;
};
static const RenderTextureData render_manager_render_texture_data_array[] = {
{ GL_TEXTURE_2D, 0x200, 0x100, 0, GL_RGBA8 , GL_DEPTH_COMPONENT24 },
{ GL_TEXTURE_2D, 0x200, 0x100, 0, GL_RGBA16F, GL_DEPTH_COMPONENT24 },
{ GL_TEXTURE_2D, 0x400, 0x400, 0, GL_RGBA8 , GL_ZERO },
{ GL_TEXTURE_2D, 0x400, 0x400, 0, GL_RGBA8 , GL_ZERO },
{ GL_TEXTURE_2D, 0x400, 0x400, 0, GL_RGBA8 , GL_ZERO },
{ GL_TEXTURE_2D, 0x100, 0x100, 0, GL_RGBA8 , GL_ZERO },
{ GL_TEXTURE_2D, 0x100, 0x100, 0, GL_RGBA32F, GL_ZERO },
{ GL_TEXTURE_2D, 0x100, 0x100, 0, GL_RGBA8 , GL_ZERO },
};
static const int32_t render_manager_render_texture_index_array[][3] = {
{ 1, 1, 1 },
{ 0, 0, 0 },
@@ -81,6 +104,65 @@ namespace rndr {
return render_textures[render_manager_render_texture_index_array[index][tex_index[index]]];
}
void RenderManager::reset() {
for (int32_t i = 0; i < RND_PASSID_NUM; i++) {
pass_sw[i] = true;
cpu_time[i] = 0.0;
gpu_time[i] = 0.0;
}
set_pass_sw(RND_PASSID_2, 0);
set_pass_sw(RND_PASSID_REFLECT, 0);
set_pass_sw(RND_PASSID_REFRACT, 0);
set_pass_sw(RND_PASSID_PRE_PROCESS, 0);
set_pass_sw(RND_PASSID_SHOW_VECTOR, 0);
shadow_ptr = 0;
sync_gpu = false;
time.get_timestamp();
shadow = true;
opaque_z_sort = true;
alpha_z_sort = true;
field_11F = false;
field_120 = false;
reflect_blur_num = 1;
reflect_blur_filter = BLUR_FILTER_4;
show_ref_map = false;
reflect_type = STAGE_DATA_REFLECT_DISABLE;
check_state = false;
show_vector_flags = 0;
show_vector_length = 0.05f;
show_vector_z_offset = 0.0f;
show_stage_shadow = false;
effect_texture = 0;
reflect = false;
refract = false;
npr_param = 0;
field_31C = false;
field_31D = false;
field_31E = false;
field_31F = false;
field_320 = false;
for (bool& i : draw_pass_3d)
i = true;
field_11E = false;
clear = false;
width = 0;
height = 0;
multisample_framebuffer = 0;
multisample_renderbuffer = 0;
multisample = true;
npr = false;
}
void RenderManager::resize(int32_t width, int32_t height) {
if (this->width == width && this->height == height)
return;
@@ -1093,6 +1175,15 @@ HOOK(void, FASTCALL, render_manager_init_render_textures, 0x0000000140502560, in
gl_state_bind_framebuffer(0);
}
HOOK(void, FASTCALL, render_manager_free_data, 0x0000000140502770) {
render_manager_free_render_textures();
render_manager->render->free();
shadow_ptr_free();
sss_data_get()->free();
}
HOOK(void, FASTCALL, render_manager_free_render_textures, 0x00000001405027A0) {
rndr::RenderManager& render_manager = *::render_manager;
@@ -1110,9 +1201,40 @@ HOOK(void, FASTCALL, render_manager_free_render_textures, 0x00000001405027A0) {
i.Free();
}
HOOK(void, FASTCALL, render_manager_init_data, 0x0000000140502A10, int32_t ssaa, int32_t hd_res, int32_t ss_alpha_mask, bool npr) {
rndr::RenderManager& render_manager = *::render_manager;
render_manager.reset();
render_manager.npr = npr;
render_texture_counter_reset();
resolution_struct* res_wind = res_window_get();
resolution_struct* res_wind_int = res_window_internal_get();
render_manager.render = render_get();
render_manager.render->init_render_buffers(res_wind_int->width, res_wind_int->height, ssaa, hd_res, ss_alpha_mask);
render_manager.render->set_screen_res(res_wind_int->x_offset,
res_wind_int->y_offset, res_wind_int->width, res_wind_int->height);
render_manager.width = res_wind->width;
render_manager.height = res_wind->height;
render_manager_init_render_textures(1);
render_manager.render->init_tone_map_buffers();
shadow_ptr_init();
render_manager.shadow_ptr = shadow_ptr_get();
render_manager.shadow_ptr->init();
sss_data_get()->init();
void(FASTCALL * sub_1403B6CC0)() = (void(FASTCALL*)())0x00000001403B6CC0;
sub_1403B6CC0();
glGetErrorDLL();
}
void render_manager_patch() {
INSTALL_HOOK(render_manager_init_render_textures);
INSTALL_HOOK(render_manager_free_render_textures);
INSTALL_HOOK(render_manager_init_data);
}
static void draw_pass_shadow_begin_make_shadowmap(Shadow* shad, int32_t index, int32_t a3) {
@@ -1790,3 +1912,61 @@ static void blur_filter_apply(RenderTexture* dst, RenderTexture* src,
gl_state_bind_sampler(0, rctx->render_samplers[0]);
shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, (GLint)(filter * 4LL), 4);
}
static void render_manager_free_render_textures() {
rndr::RenderManager& render_manager = *::render_manager;
if (render_manager.multisample_renderbuffer) {
glDeleteRenderbuffers(1, &render_manager.multisample_renderbuffer);
render_manager.multisample_renderbuffer = 0;
}
if (render_manager.multisample_framebuffer) {
glDeleteFramebuffers(1, &render_manager.multisample_framebuffer);
render_manager.multisample_framebuffer = 0;
}
for (RenderTexture& i : render_manager.render_textures)
i.Free();
}
static void render_manager_init_render_textures(int32_t multisample) {
rndr::RenderManager& render_manager = *::render_manager;
if (multisample) {
glGenFramebuffers(1, &render_manager.multisample_framebuffer);
glGenRenderbuffers(1, &render_manager.multisample_renderbuffer);
gl_state_bind_framebuffer(render_manager.multisample_framebuffer);
glBindRenderbuffer(GL_RENDERBUFFER, render_manager.multisample_renderbuffer);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 8,
GL_RGBA8, render_manager.width, render_manager.height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_RENDERBUFFER, render_manager.multisample_renderbuffer);
glDrawBufferDLL(GL_COLOR_ATTACHMENT0);
glDrawBufferDLL(GL_COLOR_ATTACHMENT0);
gl_state_bind_framebuffer(0);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
if (glGetErrorDLL()) {
glDeleteRenderbuffers(1, &render_manager.multisample_renderbuffer);
render_manager.multisample_renderbuffer = 0;
glDeleteFramebuffers(1, &render_manager.multisample_framebuffer);
render_manager.multisample_framebuffer = 0;
}
}
for (int32_t i = 0; i < 9; i++) {
const rndr::RenderTextureData* tex_data = &rndr::render_manager_render_texture_data_array[i];
if (tex_data->type != GL_TEXTURE_2D)
continue;
RenderTexture& rt = render_manager.render_textures[i];
rt.Init(tex_data->width, tex_data->height, tex_data->max_level,
tex_data->color_format, tex_data->depth_format);
rt.Bind();
glClearColorDLL(0.0f, 0.0f, 0.0f, 0.0f);
glClearDLL(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
gl_state_bind_framebuffer(0);
}