Fixed potential crash when using frame_texture

This commit is contained in:
korenkonder
2025-06-18 12:10:03 +03:00
parent e5632dc826
commit 820e4be41c
3 changed files with 60 additions and 0 deletions
+17
View File
@@ -163,11 +163,20 @@ HOOK(void, FASTCALL, rndr__Render__free, 0x00000001404AB900, rndr::Render* rend)
rend->free();
}
HOOK(void, FASTCALL, rndr__Render__frame_texture_free, 0x00000001404AE6C0, rndr::Render* rend) {
return rend->frame_texture_free();
}
HOOK(void, FASTCALL, rndr__Render__render_texture_set, 0x00000001404B1560,
rndr::Render* rend, texture* render_texture, bool task_photo) {
rend->render_texture_set(render_texture, task_photo);
}
HOOK(int32_t, FASTCALL, rndr__Render__frame_texture_load, 0x00000001404B1600,
rndr::Render* rend, int32_t slot, rndr::Render::FrameTextureType type, texture* tex) {
return rend->frame_texture_load(slot, type, tex);
}
HOOK(void, FASTCALL, rndr__Render__movie_texture_set, 0x00000001404B16A0,
rndr::Render* rend, texture* movie_texture) {
rend->movie_texture_set(movie_texture);
@@ -183,6 +192,11 @@ HOOK(void, FASTCALL, rndr__Render__movie_texture_free, 0x00000001404B18F0,
rend->movie_texture_free(movie_texture);
}
HOOK(bool, FASTCALL, rndr__Render__frame_texture_unload, 0x00000001404B30A0,
rndr::Render* rend, int32_t slot, texture* tex) {
return rend->frame_texture_unload(slot, tex);
}
HOOK(void, FASTCALL, rndr__RenderManager__rndpass_pre_proc, 0x0000000140502C90) {
render_data_context rend_data_ctx(GL_REND_STATE_PRE_3D);
rend_data_ctx.state.get();
@@ -362,10 +376,13 @@ void hook_funcs() {
INSTALL_HOOK(rndr__Render__init_post_process_buffers);
INSTALL_HOOK(rndr__Render__init_render_buffers);
INSTALL_HOOK(rndr__Render__free);
INSTALL_HOOK(rndr__Render__frame_texture_free);
INSTALL_HOOK(rndr__Render__render_texture_set);
INSTALL_HOOK(rndr__Render__frame_texture_load);
INSTALL_HOOK(rndr__Render__movie_texture_set);
INSTALL_HOOK(rndr__Render__render_texture_free);
INSTALL_HOOK(rndr__Render__movie_texture_free);
INSTALL_HOOK(rndr__Render__frame_texture_unload);
INSTALL_HOOK(rndr__RenderManager__rndpass_pre_proc);
INSTALL_HOOK(rndr__RenderManager__render_all);
+40
View File
@@ -508,6 +508,46 @@ namespace rndr {
}
}
void Render::frame_texture_free() {
for (Render::FrameTexture& i : frame_texture) {
for (Render::FrameTextureData& j : i.data) {
j.texture = 0;
j.render_texture.Free();
j.type = FRAME_TEXTURE_MAX;
}
i.capture = false;
}
}
int32_t Render::frame_texture_load(int32_t slot, Render::FrameTextureType type, texture* tex) {
if (!tex || slot < 0 || slot >= 6)
return -1;
for (Render::FrameTextureData& i : frame_texture[slot].data)
if (!i.texture) {
i.render_texture.SetColorDepthTextures(tex->glid);
i.texture = tex;
i.type = type;
return (int32_t)(&i - frame_texture[slot].data);
}
return -1;
}
bool Render::frame_texture_unload(int32_t slot, texture* tex) {
if (!tex || slot < 0 || slot >= 6)
return false;
for (Render::FrameTextureData& i : frame_texture[slot].data)
if (i.texture == tex) {
i.render_texture.Free();
i.texture = 0;
i.type = FRAME_TEXTURE_MAX;
return true;
}
return false;
}
void Render::free() {
if (transparency) {
delete transparency;
+3
View File
@@ -185,6 +185,9 @@ namespace rndr {
int32_t width, int32_t height, float_t s0, float_t t0, float_t s1, float_t t1,
float_t scale, float_t param_x, float_t param_y, float_t param_z, float_t param_w);
void draw_lens_flare(render_data_context& rend_data_ctx, const cam_data& cam);
void frame_texture_free();
int32_t frame_texture_load(int32_t slot, FrameTextureType type, texture* tex);
bool frame_texture_unload(int32_t slot, texture* tex);
void free();
vec2 get_taa_offset();
void init_render_buffers(int32_t width, int32_t height,