From f659bf1fb3dc008b9c2d78d5fb79bebfca1be8d3 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Sun, 17 May 2026 16:31:35 +0300 Subject: [PATCH] Redid Render Texture --- src/CRE/effect.cpp | 51 ++-- src/CRE/render.cpp | 172 ++++++------- src/CRE/render.hpp | 3 +- src/CRE/render_context.cpp | 33 ++- src/CRE/render_manager.cpp | 183 +++++++------- src/CRE/render_texture.cpp | 405 +++++++++++++++++------------- src/CRE/render_texture.hpp | 96 ++++--- src/CRE/renderer/dof.cpp | 14 +- src/CRE/renderer/transparency.cpp | 12 +- src/CRE/shadow.cpp | 10 +- src/CRE/sss.cpp | 42 ++-- src/ReDIVA/app.cpp | 6 +- 12 files changed, 562 insertions(+), 465 deletions(-) diff --git a/src/CRE/effect.cpp b/src/CRE/effect.cpp index 0593b98d..7f04944f 100644 --- a/src/CRE/effect.cpp +++ b/src/CRE/effect.cpp @@ -1528,7 +1528,7 @@ void snow_particle_draw(render_data_context& rend_data_ctx, const cam_data& cam) snow_particle_batch_ubo.WriteMemory(rend_data_ctx.state, snow_batch); rend_data_ctx.state.active_bind_texture_2d(0, tex->glid); - rend_data_ctx.state.active_bind_texture_2d(1, rctx_ptr->render.rend_texture[0].GetDepthTex()); + rend_data_ctx.state.active_bind_texture_2d(1, rctx_ptr->render.rend_texture[0].get_depth_texture_glid()); rend_data_ctx.state.bind_vertex_array(rctx_ptr->common_vao); rend_data_ctx.shader_flags.arr[U_SNOW_PARTICLE] = 0; @@ -2436,16 +2436,16 @@ void EffectFogRing::draw(render_data_context& rend_data_ctx, const cam_data& cam rctx->draw_state->set_fog_height(true); RenderTexture& rt = rctx->render_manager->get_render_texture(8); - rt.Bind(rend_data_ctx.state); + rt.begin_render(rend_data_ctx.state); rend_data_ctx.state.set_viewport(0, 0, - rt.color_texture->get_width_align_mip_level(), - rt.color_texture->get_height_align_mip_level()); + rt.get_texture()->get_width_align_mip_level(), + rt.get_texture()->get_height_align_mip_level()); rend_data_ctx.state.clear_color(density_offset, density_offset, density_offset, 1.0f); rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if (rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_USER)) rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_USER, cam); - rend_data_ctx.state.bind_framebuffer(0); - rctx->render_manager->set_effect_texture(rt.color_texture); + rt.end_render(rend_data_ctx.state); + rctx->render_manager->set_effect_texture(rt.get_texture()); gl_get_error_print(); } @@ -3226,10 +3226,10 @@ void EffectRipple::clear_tex() { v5 = 0.5f; } - rt->Bind(gl_state); + rt->begin_render(gl_state); glClearColor(0.0f, 0.0f, 0.0f, v5); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - gl_state.bind_framebuffer(0); + rt->end_render(gl_state); } glClearColor(clear_color.x, clear_color.y, clear_color.z, clear_color.w); @@ -3244,11 +3244,10 @@ void EffectRipple::copy_to_ripple_tex(render_data_context& rend_data_ctx, Render if (!ripple_tex) return; - ripple_texture.SetColorDepthTextures(ripple_tex->glid); - ripple_texture.Bind(rend_data_ctx.state); - - image_filter_scale(rend_data_ctx, &ripple_texture, rt->color_texture); - rend_data_ctx.state.bind_framebuffer(0); + ripple_texture.attach_texture(ripple_tex->glid); + ripple_texture.begin_render(rend_data_ctx.state); + image_filter_scale(rend_data_ctx, &ripple_texture, rt->get_texture()); + ripple_texture.end_render(rend_data_ctx.state); } void EffectRipple::ctrl() { @@ -3305,24 +3304,24 @@ void EffectRipple::draw(render_data_context& rend_data_ctx, const cam_data& cam) if (counter >= 3) counter = 0; - rt[(counter + 1) % 3]->Bind(rend_data_ctx.state); + rt[(counter + 1) % 3]->begin_render(rend_data_ctx.state); gl_rend_state_rect viewport_rect = rend_data_ctx.state.get_viewport(); - int32_t width = rt[0]->GetWidth(); - int32_t height = rt[0]->GetHeight(); + int32_t width = rt[0]->get_width(); + int32_t height = rt[0]->get_height(); rend_data_ctx.state.set_viewport(1, 1, width - 2, height - 2); rend_data_ctx.set_batch_scene_camera(cam); rend_data_ctx.state.clear(GL_DEPTH_BUFFER_BIT); if (rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_USER)) { - rend_data_ctx.state.active_bind_texture_2d(7, rt[counter % 3]->GetColorTex()); + rend_data_ctx.state.active_bind_texture_2d(7, rt[counter % 3]->get_texture_glid()); rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_USER, cam); rend_data_ctx.state.active_bind_texture_2d(7, 0); } - rend_data_ctx.state.bind_framebuffer(0); + rt[(counter + 1) % 3]->end_render(rend_data_ctx.state); params.field_8 = 0.0005f; params.field_C = 0.97f; @@ -3345,7 +3344,7 @@ void EffectRipple::draw(render_data_context& rend_data_ctx, const cam_data& cam) v11 += 3; rctx->render_manager->set_effect_texture( - rctx->render_manager->get_render_texture(v11).color_texture); + rctx->render_manager->get_render_texture(v11).get_texture()); update = false; @@ -5806,8 +5805,8 @@ static void draw_ripple_particles(render_data_context& rend_data_ctx, RenderTexture& rt = rctx_ptr->render_manager->get_render_texture( effect_ripple->use_float_ripplemap ? 2 : 5); - int32_t width = rt.GetWidth(); - int32_t height = rt.GetHeight(); + int32_t width = rt.get_width(); + int32_t height = rt.get_height(); ripple_emit_scene_shader_data shader_data = {}; shader_data.g_size_in_projection = { @@ -6776,14 +6775,14 @@ static void water_particle_free() { // 0x1403B6ED0 static void ripple_propagate(render_data_context& rend_data_ctx, RenderTexture* dst, RenderTexture* curr, RenderTexture* prev, const EffectRipple::Params& params) { - dst->Bind(rend_data_ctx.state); - if (dst->color_texture->internal_format == GL_RGBA32F - || dst->color_texture->internal_format == GL_RGBA16F) + dst->begin_render(rend_data_ctx.state); + if (dst->get_texture()->internal_format == GL_RGBA32F + || dst->get_texture()->internal_format == GL_RGBA16F) rend_data_ctx.shader_flags.arr[U_RIPPLE] = 1; else rend_data_ctx.shader_flags.arr[U_RIPPLE] = 0; - ripple_propagate_sub(rend_data_ctx, dst->color_texture, curr->color_texture, prev->color_texture, params); - rend_data_ctx.state.bind_framebuffer(0); + ripple_propagate_sub(rend_data_ctx, dst->get_texture(), curr->get_texture(), prev->get_texture(), params); + dst->end_render(rend_data_ctx.state); } // 0x1403B6F60 diff --git a/src/CRE/render.cpp b/src/CRE/render.cpp index 865e1981..1163d78f 100644 --- a/src/CRE/render.cpp +++ b/src/CRE/render.cpp @@ -158,7 +158,7 @@ namespace rndr { if (!render_textures_data[i]) continue; - render_textures[i].Bind(rend_data_ctx.state); + render_textures[i].begin_render(rend_data_ctx.state); texture* t = render_textures_data[i]; if (render_width[0] > t->width * 2 || render_height[0] > t->height * 2) @@ -175,7 +175,7 @@ namespace rndr { 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); } - copy_to_frame_texture(rend_data_ctx, rend_texture[0].GetColorTex(), + copy_to_frame_texture(rend_data_ctx, rend_texture[0].get_texture_glid(), render_width[0], render_height[0], taa_tex[taa_texture_selector]->glid); if (taa) { @@ -201,13 +201,13 @@ namespace rndr { } taa_texture = 2; - taa_buffer[2].Bind(rend_data_ctx.state); + taa_buffer[2].begin_render(rend_data_ctx.state); rend_data_ctx.state.set_viewport(0, 0, render_width[0], render_height[0]); rend_data_ctx.state.active_bind_texture_2d(0, taa_tex[taa_texture_selector]->glid); rend_data_ctx.state.bind_sampler(0, sampler); if (blur) { - rend_data_ctx.state.active_bind_texture_2d(2, rend_texture[0].depth_texture->glid); + rend_data_ctx.state.active_bind_texture_2d(2, rend_texture[0].get_depth_texture()->glid); rend_data_ctx.state.bind_sampler(2, sampler); mat4 mat; @@ -247,7 +247,7 @@ namespace rndr { this->taa_texture_selector = taa_texture_selector; } - rctx->screen_buffer.Bind(rend_data_ctx.state); + rctx->screen_buffer.begin_render(rend_data_ctx.state); rend_data_ctx.state.set_viewport(0, 0, rctx->sprite_width, rctx->sprite_height); if (ssaa) { rend_data_ctx.state.active_bind_texture_2d(0, taa_tex[taa_texture]->glid); @@ -298,13 +298,13 @@ namespace rndr { rend_data_ctx.state.bind_sampler(i, 0); } - void Render::bind_render_texture(p_gl_rend_state& p_gl_rend_st, bool composite_back) { + void Render::begin_render(p_gl_rend_state& p_gl_rend_st, bool composite_back) { if (composite_back) { - composite_back_texture.Bind(p_gl_rend_st); + composite_back_texture.begin_render(p_gl_rend_st); this->composite_back = 1; } else - rend_texture[0].Bind(p_gl_rend_st); + rend_texture[0].begin_render(p_gl_rend_st); p_gl_rend_st.set_viewport(0, 0, render_width[0], render_height[0]); } @@ -599,26 +599,26 @@ namespace rndr { render_context* rctx = rctx_ptr; if (reflect_draw) - rctx->reflect_buffer.Bind(rend_data_ctx.state); + rctx->reflect_buffer.begin_render(rend_data_ctx.state); else - sss_contour_texture->Bind(rend_data_ctx.state); + sss_contour_texture->begin_render(rend_data_ctx.state); rend_data_ctx.state.enable_depth_test(); rend_data_ctx.state.set_depth_func(GL_ALWAYS); rend_data_ctx.state.set_depth_mask(GL_TRUE); if (reflect_draw) { RenderTexture& refl_tex = rctx->render_manager->get_render_texture(0); - rend_data_ctx.state.set_viewport(0, 0, refl_tex.GetWidth(), refl_tex.GetHeight()); - rend_data_ctx.state.active_bind_texture_2d(0, refl_tex.GetColorTex()); + rend_data_ctx.state.set_viewport(0, 0, refl_tex.get_width(), refl_tex.get_height()); + rend_data_ctx.state.active_bind_texture_2d(0, refl_tex.get_texture_glid()); rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[1]); - rend_data_ctx.state.active_bind_texture_2d(1, refl_tex.GetDepthTex()); + rend_data_ctx.state.active_bind_texture_2d(1, refl_tex.get_depth_texture_glid()); rend_data_ctx.state.bind_sampler(1, rctx->render_samplers[1]); } else { rend_data_ctx.state.set_viewport(0, 0, render_width[0], render_height[0]); - rend_data_ctx.state.active_bind_texture_2d(0, rend_texture[0].GetColorTex()); + rend_data_ctx.state.active_bind_texture_2d(0, rend_texture[0].get_texture_glid()); rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[1]); - rend_data_ctx.state.active_bind_texture_2d(1, rend_texture[0].GetDepthTex()); + rend_data_ctx.state.active_bind_texture_2d(1, rend_texture[0].get_depth_texture_glid()); rend_data_ctx.state.bind_sampler(1, rctx->render_samplers[1]); } rend_data_ctx.state.active_texture(0); @@ -651,7 +651,7 @@ namespace rndr { if (reflect_draw) { RenderTexture& refl_tex = rctx->render_manager->get_render_texture(0); - draw_quad(rend_data_ctx, refl_tex.GetWidth(), refl_tex.GetHeight(), + draw_quad(rend_data_ctx, refl_tex.get_width(), refl_tex.get_height(), 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); } else @@ -661,6 +661,10 @@ namespace rndr { 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); } + void Render::end_render(p_gl_rend_state& p_gl_rend_st) { + rend_texture->end_render(p_gl_rend_st); + } + bool Render::frame_texture_cont_capture_set(bool value) { frame_texture[0].capture = value; return true; @@ -670,7 +674,7 @@ namespace rndr { for (Render::FrameTexture& i : frame_texture) { for (Render::FrameTextureData& j : i.data) { j.texture = 0; - j.render_texture.Free(); + j.render_texture.destroy(); j.type = FRAME_TEXTURE_MAX; } @@ -684,7 +688,7 @@ namespace rndr { for (Render::FrameTextureData& i : frame_texture[slot].data) if (!i.texture) { - i.render_texture.SetColorDepthTextures(tex->glid); + i.render_texture.attach_texture(tex->glid); i.texture = tex; i.type = type; return (int32_t)(&i - frame_texture[slot].data); @@ -717,7 +721,7 @@ namespace rndr { for (Render::FrameTextureData& i : frame_texture[slot].data) if (i.texture == tex) { - i.render_texture.Free(); + i.render_texture.destroy(); i.texture = 0; i.type = FRAME_TEXTURE_MAX; return true; @@ -747,10 +751,10 @@ namespace rndr { return; for (int32_t i = 0; i < downsample_max_count; i++) - rend_texture[i].Free(); + rend_texture[i].destroy(); for (int32_t i = 0; i < 3; i++) { - taa_buffer[i].Free(); + taa_buffer[i].destroy(); if (taa_tex[i]) { texture_release(taa_tex[i]); @@ -759,7 +763,7 @@ namespace rndr { } } - composite_back_texture.Free(); + composite_back_texture.destroy(); if (composite_back_tex) { texture_release(composite_back_tex); @@ -767,16 +771,16 @@ namespace rndr { texture_counter--; } - mlaa_buffer.Free(); - temp_buffer.Free(); + mlaa_buffer.destroy(); + temp_buffer.destroy(); sss_contour_texture = 0; - downsample_texture.Free(); - field_3E8.Free(); + downsample_texture.destroy(); + field_3E8.destroy(); for (int32_t i = 0; i < 5; i++) - reduce_texture->Free(); + reduce_texture->destroy(); for (int32_t i = 0; i < 5; i++) if (reduce_tex[i]) { @@ -791,7 +795,7 @@ namespace rndr { texture_counter--; } - exposure_texture.Free(); + exposure_texture.destroy(); if (exposure_tex) { glDeleteTextures(1, &exposure_tex); @@ -988,12 +992,12 @@ namespace rndr { update_res(true, 1); - rend_texture[0].Init(render_post_width[0], render_post_height[0], 0, GL_RGBA16F, GL_DEPTH_COMPONENT24); + rend_texture[0].create_texture(render_post_width[0], render_post_height[0], 0, GL_RGBA16F, GL_DEPTH_COMPONENT24); - gl_state.bind_texture_2d(rend_texture[0].GetColorTex()); + gl_state.bind_texture_2d(rend_texture[0].get_texture_glid()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - gl_state.bind_texture_2d(rend_texture[0].GetDepthTex()); + gl_state.bind_texture_2d(rend_texture[0].get_depth_texture_glid()); GLint swizzle[] = { GL_RED, GL_RED, GL_RED, GL_ONE }; glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle); gl_state.bind_texture_2d(0); @@ -1001,39 +1005,39 @@ namespace rndr { for (int32_t i = 0; i < 3; i++) { taa_tex[i] = texture_load_tex_2d(texture_id(0x25, texture_counter++), GL_RGBA8, render_post_width[0], render_post_height[0], 0, 0, 0); - taa_buffer[i].SetColorDepthTextures(taa_tex[i]->glid, 0, rend_texture[0].GetDepthTex()); + taa_buffer[i].attach_texture(taa_tex[i]->glid, 0, rend_texture[0].get_depth_texture_glid()); } composite_back_tex = texture_load_tex_2d(texture_id(0x25, texture_counter++), GL_RGBA8, render_post_width[0], render_post_height[0], 0, 0, 0); - composite_back_texture.SetColorDepthTextures(composite_back_tex->glid, 0, rend_texture[0].GetDepthTex()); + composite_back_texture.attach_texture(composite_back_tex->glid, 0, rend_texture[0].get_depth_texture_glid()); - mlaa_buffer.Init(render_post_width[0], render_post_height[0], 0, GL_RGBA8, GL_DEPTH_COMPONENT24); - temp_buffer.Init(render_post_width[0], render_post_height[0], 0, GL_RGBA8, GL_ZERO); + mlaa_buffer.create_texture(render_post_width[0], render_post_height[0], 0, GL_RGBA8, GL_DEPTH_COMPONENT24); + temp_buffer.create_texture(render_post_width[0], render_post_height[0], 0, GL_RGBA8, GL_ZERO); sss_contour_texture = &mlaa_buffer; - gl_state.bind_texture_2d(mlaa_buffer.GetDepthTex()); + gl_state.bind_texture_2d(mlaa_buffer.get_depth_texture_glid()); glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle); gl_state.bind_texture_2d(0); for (int32_t i = 1; i < downsample_count; i++) { - rend_texture[i].Init(render_post_width[i], render_post_height[i], 0, GL_RGBA16F, GL_ZERO); + rend_texture[i].create_texture(render_post_width[i], render_post_height[i], 0, GL_RGBA16F, GL_ZERO); - gl_state.bind_texture_2d(rend_texture[i].GetColorTex()); + gl_state.bind_texture_2d(rend_texture[i].get_texture_glid()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); gl_state.bind_texture_2d(0); } - downsample_texture.Init(reduce_width[0], reduce_height[0], 0, GL_RGBA16F, GL_ZERO); + downsample_texture.create_texture(reduce_width[0], reduce_height[0], 0, GL_RGBA16F, GL_ZERO); - gl_state.bind_texture_2d(downsample_texture.GetColorTex()); + gl_state.bind_texture_2d(downsample_texture.get_texture_glid()); const vec4 border_color = 0.0f; glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, (GLfloat*)&border_color); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); gl_state.bind_texture_2d(0); - field_3E8.Init(512, 256, 0, GL_RGBA8, GL_ZERO); + field_3E8.create_texture(512, 256, 0, GL_RGBA8, GL_ZERO); dof = new renderer::DOF3(render_post_width[0], render_post_height[0]); @@ -1042,7 +1046,7 @@ namespace rndr { GL_RGBA16F, render_post_width[0], render_post_height[0], 0, 0, 0); transparency = new renderer::Transparency(transparency_tex[0]->glid, - rend_texture[0].GetDepthTex(), render_post_width[0], render_post_height[0]); + rend_texture[0].get_depth_texture_glid(), render_post_width[0], render_post_height[0]); } void Render::init_post_process_buffers() { @@ -1058,7 +1062,7 @@ namespace rndr { } gl_state.bind_texture_2d(0); - reduce_texture[0].SetColorDepthTextures(reduce_tex[0]->glid); + reduce_texture[0].attach_texture(reduce_tex[0]->glid); exposure_history = texture_load_tex_2d(texture_id(0x25, texture_counter++), GL_RGBA16F, 32, 2, 0, 0, 0); @@ -1072,7 +1076,7 @@ namespace rndr { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); gl_state.bind_texture_2d(0); - exposure_texture.SetColorDepthTextures(exposure_tex); + exposure_texture.attach_texture(exposure_tex); glGenTextures(1, &tonemap_lut_texture); gl_state.bind_texture_2d(tonemap_lut_texture); @@ -1113,7 +1117,7 @@ namespace rndr { return -1; movie_textures_data[index] = movie_texture; - movie_textures[index].SetColorDepthTextures(movie_texture->glid); + movie_textures[index].attach_texture(movie_texture->glid); return index; } @@ -1127,7 +1131,7 @@ namespace rndr { return; movie_textures_data[index] = 0; - movie_textures[index].Free(); + movie_textures[index].destroy(); } void Render::post_proc() { @@ -1172,7 +1176,7 @@ namespace rndr { extern texture* task_movie_get_texture(int32_t index = 0); texture* tex = task_movie_get_texture(); if (tex) { - movie_textures[0].Bind(rend_data_ctx.state); + movie_textures[0].begin_render(rend_data_ctx.state); rend_data_ctx.state.active_bind_texture_2d(0, tex->glid); rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[0]); rend_data_ctx.state.set_viewport(0, 0, movie_textures_data[0]->width, movie_textures_data[0]->height); @@ -1180,7 +1184,7 @@ namespace rndr { shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); draw_quad(rend_data_ctx, tex->width, tex->height, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - rend_data_ctx.state.bind_framebuffer(0); + movie_textures[0].end_render(rend_data_ctx.state); } } @@ -1204,7 +1208,7 @@ namespace rndr { return -1; render_textures_data[index] = render_texture; - render_textures[index].SetColorDepthTextures(render_texture->glid); + render_textures[index].attach_texture(render_texture->glid); return index; } @@ -1221,7 +1225,7 @@ namespace rndr { return; render_textures_data[index] = 0; - render_textures[index].Free(); + render_textures[index].destroy(); } void Render::reset_saturate_coeff(int32_t index, bool lock) { @@ -1273,12 +1277,12 @@ namespace rndr { update_res(true, 1); - rend_texture[0].Init(render_post_width[0], render_post_height[0], 0, GL_RGBA16F, GL_DEPTH_COMPONENT24); + rend_texture[0].create_texture(render_post_width[0], render_post_height[0], 0, GL_RGBA16F, GL_DEPTH_COMPONENT24); - gl_state.bind_texture_2d(rend_texture[0].GetColorTex()); + gl_state.bind_texture_2d(rend_texture[0].get_texture_glid()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - gl_state.bind_texture_2d(rend_texture[0].GetDepthTex()); + gl_state.bind_texture_2d(rend_texture[0].get_depth_texture_glid()); GLint swizzle[] = { GL_RED, GL_RED, GL_RED, GL_ONE }; glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle); @@ -1287,26 +1291,26 @@ namespace rndr { texture_release(taa_tex[i]); taa_tex[i] = texture_load_tex_2d(id, GL_RGBA8, render_post_width[0], render_post_height[0], 0, 0, 0); - taa_buffer[i].SetColorDepthTextures(taa_tex[i]->glid, 0, rend_texture[0].GetDepthTex()); + taa_buffer[i].attach_texture(taa_tex[i]->glid, 0, rend_texture[0].get_depth_texture_glid()); } texture_id composite_back_tex_id = composite_back_tex->id; texture_release(composite_back_tex); composite_back_tex = texture_load_tex_2d(composite_back_tex_id, GL_RGBA8, render_post_width[0], render_post_height[0], 0, 0, 0); - composite_back_texture.SetColorDepthTextures(composite_back_tex->glid, 0, rend_texture[0].GetDepthTex()); + composite_back_texture.attach_texture(composite_back_tex->glid, 0, rend_texture[0].get_depth_texture_glid()); - mlaa_buffer.Init(render_post_width[0], render_post_height[0], 0, GL_RGBA8, GL_DEPTH_COMPONENT24); - temp_buffer.Init(render_post_width[0], render_post_height[0], 0, GL_RGBA8, GL_ZERO); + mlaa_buffer.create_texture(render_post_width[0], render_post_height[0], 0, GL_RGBA8, GL_DEPTH_COMPONENT24); + temp_buffer.create_texture(render_post_width[0], render_post_height[0], 0, GL_RGBA8, GL_ZERO); sss_contour_texture = &mlaa_buffer; - gl_state.bind_texture_2d(mlaa_buffer.GetDepthTex()); + gl_state.bind_texture_2d(mlaa_buffer.get_depth_texture_glid()); glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle); for (int32_t i = 1; i < downsample_count; i++) { - rend_texture[i].Init(render_post_width[i], render_post_height[i], 0, GL_RGBA16F, GL_ZERO); + rend_texture[i].create_texture(render_post_width[i], render_post_height[i], 0, GL_RGBA16F, GL_ZERO); - gl_state.bind_texture_2d(rend_texture[i].GetColorTex()); + gl_state.bind_texture_2d(rend_texture[i].get_texture_glid()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); } @@ -1319,7 +1323,7 @@ namespace rndr { render_post_width[0], render_post_height[0], 0, 0, 0); } - transparency->resize(transparency_tex[0]->glid, rend_texture[0].GetDepthTex(), + transparency->resize(transparency_tex[0]->glid, rend_texture[0].get_depth_texture_glid(), render_post_width[0], render_post_height[0]); } @@ -1503,8 +1507,8 @@ namespace rndr { rend_data_ctx.shader_flags.arr[U_REDUCE] = 1; shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); for (int32_t i = 1; i < downsample_count - 1; i++) { - rend_texture[i].Bind(rend_data_ctx.state); - rend_data_ctx.state.active_bind_texture_2d(0, rend_texture[i - 1].GetColorTex()); + rend_texture[i].begin_render(rend_data_ctx.state); + rend_data_ctx.state.active_bind_texture_2d(0, rend_texture[i - 1].get_texture_glid()); rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); rend_data_ctx.state.set_viewport(0, 0, render_width[i], render_height[i]); draw_quad(rend_data_ctx, @@ -1518,15 +1522,15 @@ namespace rndr { int32_t downsample = max_def(downsample_count - 2, 0); rend_data_ctx.state.set_viewport(0, 0, reduce_width[0], reduce_height[0]); - reduce_texture[0].Bind(rend_data_ctx.state); - rend_data_ctx.state.active_bind_texture_2d(0, rend_texture[downsample].GetColorTex()); + reduce_texture[0].begin_render(rend_data_ctx.state); + rend_data_ctx.state.active_bind_texture_2d(0, rend_texture[downsample].get_texture_glid()); rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); draw_quad(rend_data_ctx, render_post_width[downsample], render_post_height[downsample], render_post_width_scale, render_post_height_scale, 0.0f, 0.0f, 1.0f, 1.1f, 1.1f, 1.1f, 0.0f); - downsample_texture.Bind(rend_data_ctx.state); + downsample_texture.begin_render(rend_data_ctx.state); rend_data_ctx.state.active_bind_texture_2d(0, reduce_tex[0]->glid); rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[2]); for (int32_t i = 1; i < 5; i++) { @@ -1558,7 +1562,7 @@ namespace rndr { } void Render::transparency_copy(render_data_context& rend_data_ctx, RenderTexture* rt) { - transparency->copy(rend_data_ctx, rt->GetColorTex()); + transparency->copy(rend_data_ctx, rt->get_texture_glid()); } void Render::update_res(bool set, int32_t base_downsample) { @@ -1638,7 +1642,7 @@ namespace rndr { int32_t destination, int32_t source, int32_t ss_alpha_mask) { rend_data_ctx.state.begin_event("PostProcess::mlaa"); if (mlaa) { - mlaa_buffer.Bind(rend_data_ctx.state); + mlaa_buffer.begin_render(rend_data_ctx.state); rend_data_ctx.state.active_bind_texture_2d(0, taa_tex[source]->glid); rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[1]); rend_data_ctx.shader_flags.arr[U_MLAA] = 0; @@ -1647,8 +1651,8 @@ namespace rndr { render_post_width_scale, render_post_height_scale, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - temp_buffer.Bind(rend_data_ctx.state); - rend_data_ctx.state.active_bind_texture_2d(0, mlaa_buffer.GetColorTex()); + temp_buffer.begin_render(rend_data_ctx.state); + rend_data_ctx.state.active_bind_texture_2d(0, mlaa_buffer.get_texture_glid()); rend_data_ctx.state.active_bind_texture_2d(1, mlaa_area_texture); rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[0]); rend_data_ctx.state.bind_sampler(1, rctx_ptr->render_samplers[3]); @@ -1659,9 +1663,9 @@ namespace rndr { render_post_width_scale, render_post_height_scale, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - taa_buffer[destination].Bind(rend_data_ctx.state); + taa_buffer[destination].begin_render(rend_data_ctx.state); rend_data_ctx.state.active_bind_texture_2d(0, taa_tex[source]->glid); - rend_data_ctx.state.active_bind_texture_2d(1, temp_buffer.GetColorTex()); + rend_data_ctx.state.active_bind_texture_2d(1, temp_buffer.get_texture_glid()); rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[1]); rend_data_ctx.state.bind_sampler(1, rctx_ptr->render_samplers[1]); rend_data_ctx.shader_flags.arr[U_MLAA] = 2; @@ -1675,7 +1679,7 @@ namespace rndr { rend_data_ctx.state.active_bind_texture_2d(1, 0); } else { - taa_buffer[destination].Bind(rend_data_ctx.state); + taa_buffer[destination].begin_render(rend_data_ctx.state); rend_data_ctx.state.active_bind_texture_2d(0, taa_tex[source]->glid); rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[1]); rend_data_ctx.shader_flags.arr[U_REDUCE] = 0; @@ -1726,11 +1730,11 @@ namespace rndr { vec2 lens_flare_pos = *(vec2*)&this->lens_flare_pos; apply_tone_map(rend_data_ctx, 0, 0, render_width[0], render_height[0], - rend_texture[0].GetColorTex(), reduce_tex_draw, composite_back_tex, litproj_tex, litproj_quality, + rend_texture[0].get_texture_glid(), reduce_tex_draw, composite_back_tex, litproj_tex, litproj_quality, inner_width, inner_height, render_post_width_scale, render_post_height_scale, exposure, tone_trans_scale[tone_trans_index], tone_trans_offset[tone_trans_index], fade_func, fade_color, tone_map, gamma, lens_flare_pos, lens_shaft_scale, lens_flare_coef, lens_shaft_coef, - sss_contour_texture->GetColorTex(), sss_contour_texture->GetDepthTex(), rend_texture[0].GetDepthTex(), + sss_contour_texture->get_texture_glid(), sss_contour_texture->get_depth_texture_glid(), rend_texture[0].get_depth_texture_glid(), npr_param == 1, false, rctx->render_manager->npr_mask); rend_data_ctx.state.end_event(); } @@ -1874,7 +1878,7 @@ namespace rndr { rctx->tone_map_ubo.WriteMemory(rend_data_ctx.state, shader_data); rend_data_ctx.state.set_viewport(0, 0, render_width, render_height); - taa_buffer[2].Bind(rend_data_ctx.state); + taa_buffer[2].begin_render(rend_data_ctx.state); shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_TONEMAP); rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->tone_map_ubo); rend_data_ctx.state.bind_vertex_array(rctx->common_vao); @@ -1990,7 +1994,7 @@ namespace rndr { rctx->exposure_measure_ubo.WriteMemory(rend_data_ctx.state, exposure_measure); rend_data_ctx.state.set_viewport(0, 0, 32, 1); - downsample_texture.Bind(rend_data_ctx.state); + downsample_texture.begin_render(rend_data_ctx.state); rend_data_ctx.shader_flags.arr[U_EXPOSURE] = 1; shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_EXPOSURE); @@ -2011,7 +2015,7 @@ namespace rndr { } rend_data_ctx.state.set_viewport(0, 0, 1, 1); - exposure_texture.Bind(rend_data_ctx.state); + exposure_texture.begin_render(rend_data_ctx.state); rend_data_ctx.shader_flags.arr[U_EXPOSURE] = 2; shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_EXPOSURE); rend_data_ctx.state.active_bind_texture_2d(0, exposure_history->glid); @@ -2086,7 +2090,7 @@ namespace rndr { continue; for (auto& j : i.data) { - if (!j.texture || j.render_texture.Bind(rend_data_ctx.state) < 0) + if (!j.texture || j.render_texture.begin_render(rend_data_ctx.state) < 0) continue; texture* dst_tex = j.texture; @@ -2098,7 +2102,7 @@ namespace rndr { shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); draw_quad(rend_data_ctx, dst_tex->width, dst_tex->height, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - rend_data_ctx.state.bind_framebuffer(0); + j.render_texture.end_render(rend_data_ctx.state); } if (&i - frame_texture) @@ -2199,7 +2203,7 @@ namespace rndr { rctx_ptr->lens_ghost_vbo.UnmapMemory(rend_data_ctx.state); rend_data_ctx.state.set_viewport(0, 0, render_width[0], render_height[0]); - rend_texture[0].Bind(rend_data_ctx.state); + rend_texture[0].begin_render(rend_data_ctx.state); rend_data_ctx.state.enable_blend(); rend_data_ctx.state.set_blend_func(GL_ONE, GL_ONE); @@ -2241,7 +2245,7 @@ namespace rndr { calc_gaussian_blur(rend_data_ctx, 1.0f, 1.0f, 7, 0.8f, 1.0f); rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->gaussian_coef_ubo); - downsample_texture.Bind(rend_data_ctx.state); + downsample_texture.begin_render(rend_data_ctx.state); for (int32_t i = 1; i < 4; i++) { rend_data_ctx.state.set_viewport(0, 0, reduce_width[i], reduce_height[i]); rend_data_ctx.state.active_bind_texture_2d(0, reduce_tex[i]->glid); @@ -2276,8 +2280,8 @@ namespace rndr { shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); rend_data_ctx.state.set_viewport(0, 0, reduce_width[0], reduce_height[0]); - reduce_texture[0].Bind(rend_data_ctx.state); - rend_data_ctx.state.active_bind_texture_2d(0, downsample_texture.GetColorTex()); + reduce_texture[0].begin_render(rend_data_ctx.state); + rend_data_ctx.state.active_bind_texture_2d(0, downsample_texture.get_texture_glid()); rend_data_ctx.state.active_bind_texture_2d(1, reduce_tex[1]->glid); rend_data_ctx.state.active_bind_texture_2d(2, reduce_tex[2]->glid); rend_data_ctx.state.active_bind_texture_2d(3, reduce_tex[3]->glid); diff --git a/src/CRE/render.hpp b/src/CRE/render.hpp index 847b4ee0..3460b3c5 100644 --- a/src/CRE/render.hpp +++ b/src/CRE/render.hpp @@ -185,13 +185,14 @@ namespace rndr { void apply_post_process(render_data_context& rend_data_ctx, const cam_data& cam, texture* light_proj_tex, int32_t npr_param); - void bind_render_texture(p_gl_rend_state& p_gl_rend_st, bool composite_back = false); + void begin_render(p_gl_rend_state& p_gl_rend_st, bool composite_back = false); void calc_exposure_chara_data(render_data_context& rend_data_ctx, const cam_data& cam); void draw_lens_flare(render_data_context& rend_data_ctx, const cam_data& cam); void draw_quad(render_data_context& rend_data_ctx, 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_sss_contour(render_data_context& rend_data_ctx, const cam_data& cam); + void end_render(p_gl_rend_state& p_gl_rend_st); bool frame_texture_cont_capture_set(bool value); void frame_texture_free(); int32_t frame_texture_load(int32_t slot, FrameTextureType type, texture* tex); diff --git a/src/CRE/render_context.cpp b/src/CRE/render_context.cpp index cd0dbb89..ed98e416 100644 --- a/src/CRE/render_context.cpp +++ b/src/CRE/render_context.cpp @@ -99,9 +99,9 @@ void draw_state::set_use_global_material(bool value) { } light_proj::light_proj(int32_t width, int32_t height) : enable(), texture_id() { - shadow_texture[0].Init(2048, 512, 0, GL_R32F, GL_DEPTH_COMPONENT32F); - shadow_texture[1].Init(2048, 512, 0, GL_R32F, GL_ZERO); - draw_texture.Init(width, height, 0, GL_RGBA8, GL_DEPTH_COMPONENT32F); + shadow_texture[0].create_texture(2048, 512, 0, GL_R32F, GL_DEPTH_COMPONENT32F); + shadow_texture[1].create_texture(2048, 512, 0, GL_R32F, GL_ZERO); + draw_texture.create_texture(width, height, 0, GL_RGBA8, GL_DEPTH_COMPONENT32F); } light_proj::~light_proj() { @@ -112,7 +112,7 @@ void light_proj::resize(int32_t width, int32_t height) { if (!this) return; - draw_texture.Init(width, height, 0, GL_RGBA8, GL_DEPTH_COMPONENT32F); + draw_texture.create_texture(width, height, 0, GL_RGBA8, GL_DEPTH_COMPONENT32F); } bool light_proj::set(render_data_context& rend_data_ctx, cam_data& cam) { @@ -122,7 +122,7 @@ bool light_proj::set(render_data_context& rend_data_ctx, cam_data& cam) { static const vec4 color_clear = 0.0f; static const GLfloat depth_clear = 1.0f; - shadow_texture[0].Bind(rend_data_ctx.state); + shadow_texture[0].begin_render(rend_data_ctx.state); rend_data_ctx.state.set_viewport(0, 0, 2048, 512); rend_data_ctx.state.enable_depth_test(); rend_data_ctx.state.set_depth_mask(GL_TRUE); @@ -135,8 +135,8 @@ bool light_proj::set(render_data_context& rend_data_ctx, cam_data& cam) { return true; } else { - draw_texture.Bind(rend_data_ctx.state); - draw_texture.SetViewport(rend_data_ctx.state); + draw_texture.begin_render(rend_data_ctx.state); + draw_texture.set_viewport(rend_data_ctx.state); rend_data_ctx.state.enable_depth_test(); rend_data_ctx.state.set_depth_mask(GL_TRUE); rend_data_ctx.state.clear_buffer(GL_COLOR, 0, (float_t*)&color_clear); @@ -1401,11 +1401,11 @@ void render_context::disp() { } void render_context::free() { - shadow_buffer.Free(); - screen_overlay_buffer.Free(); - screen_buffer.Free(); - render_buffer.Free(); - reflect_buffer.Free(); + shadow_buffer.destroy(); + screen_overlay_buffer.destroy(); + screen_buffer.destroy(); + render_buffer.destroy(); + reflect_buffer.destroy(); texture_release(empty_texture_cube_map); texture_release(empty_texture_2d); @@ -1436,9 +1436,8 @@ void render_context::init() { GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 4, 4, 0, empty_texture_cube_map_array); auto init_copy_buffer = [&](RenderTexture& src, RenderTexture& dst) { - dst.Init(src.GetWidth(), - src.GetHeight(), 0, src.color_texture->internal_format, - src.depth_texture ? src.depth_texture->internal_format : GL_ZERO); + dst.create_texture(src.get_width(), src.get_height(), 0, src.get_texture()->internal_format, + src.get_depth_texture() ? src.get_depth_texture()->internal_format : GL_ZERO); }; RenderTexture& render_buffer = render.rend_texture[0]; @@ -1448,8 +1447,8 @@ void render_context::init() { init_copy_buffer(render_buffer, this->render_buffer); init_copy_buffer(shadow_buffer, this->shadow_buffer); - screen_buffer.Init(sprite_width, sprite_height, 0, GL_RGBA8, 0); - screen_overlay_buffer.Init(sprite_width, sprite_height, 0, GL_RGBA8, 0); + screen_buffer.create_texture(sprite_width, sprite_height, 0, GL_RGBA8, 0); + screen_overlay_buffer.create_texture(sprite_width, sprite_height, 0, GL_RGBA8, 0); } void render_context::resize(int32_t render_width, int32_t render_height, diff --git a/src/CRE/render_manager.cpp b/src/CRE/render_manager.cpp index 695f86a1..7c000478 100644 --- a/src/CRE/render_manager.cpp +++ b/src/CRE/render_manager.cpp @@ -467,7 +467,7 @@ namespace rndr { rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_TRANSLUCENT, cam); rend_data_ctx.state.disable_blend(); rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = -1; - rend_data_ctx.state.bind_framebuffer(0); + rctx->litproj->draw_texture.end_render(rend_data_ctx.state); } } rend_data_ctx.state.end_event(); @@ -563,8 +563,8 @@ namespace rndr { rend->draw_sss_contour(rend_data_ctx, reflect_cam); } else if (npr) { - refl_tex.Bind(rend_data_ctx.state); - refl_tex.SetViewport(rend_data_ctx.state); + refl_tex.begin_render(rend_data_ctx.state); + refl_tex.set_viewport(rend_data_ctx.state); rend_data_ctx.state.clear(GL_DEPTH_BUFFER_BIT); rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = SHADER_FT_SSS_SKIN; rend_data_ctx.state.enable_depth_test(); @@ -572,7 +572,7 @@ namespace rndr { rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_SSS, reflect_cam); rend_data_ctx.state.disable_depth_test(); rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = -1; - rend_data_ctx.state.bind_framebuffer(0); + refl_tex.end_render(rend_data_ctx.state); rend_data_ctx.shader_flags.arr[U_NPR] = 1; rend->draw_sss_contour(rend_data_ctx, reflect_cam); } @@ -614,8 +614,8 @@ namespace rndr { rend->draw_sss_contour(rend_data_ctx, cam); } else if (npr) { - rend->rend_texture[0].Bind(rend_data_ctx.state); - rend->rend_texture[0].SetViewport(rend_data_ctx.state); + rend->rend_texture[0].begin_render(rend_data_ctx.state); + rend->rend_texture[0].set_viewport(rend_data_ctx.state); rend_data_ctx.state.clear(GL_DEPTH_BUFFER_BIT); rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = SHADER_FT_SSS_SKIN; rend_data_ctx.state.enable_depth_test(); @@ -623,7 +623,7 @@ namespace rndr { rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_SSS, cam); rend_data_ctx.state.disable_depth_test(); rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = -1; - rend_data_ctx.state.bind_framebuffer(0); + rend->rend_texture[0].end_render(rend_data_ctx.state); rend_data_ctx.shader_flags.arr[U_NPR] = 1; rend->draw_sss_contour(rend_data_ctx, cam); } @@ -648,14 +648,14 @@ namespace rndr { rend_data_ctx.state.begin_event("pass_reflect"); RenderTexture& refl_tex = get_render_texture(0); RenderTexture& refl_buf_tex = rctx->reflect_buffer; - refl_tex.Bind(rend_data_ctx.state); if (rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_OPAQUE) || rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_TRANSPARENT) || rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_TRANSLUCENT) || rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_CHARA_OPAQUE) || rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_CHARA_TRANSPARENT) || rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_CHARA_TRANSLUCENT)) { - refl_tex.SetViewport(rend_data_ctx.state); + refl_tex.begin_render(rend_data_ctx.state); + refl_tex.set_viewport(rend_data_ctx.state); rend_data_ctx.set_batch_scene_camera(cam); for (int32_t i = LIGHT_SET_MAIN; i < LIGHT_SET_MAX; i++) @@ -755,18 +755,21 @@ namespace rndr { for (int32_t i = reflect_blur_num, j = 0; i > 0; i--, j++) { apply_blur_filter_sub(rend_data_ctx, &refl_buf_tex, &refl_tex, reflect_blur_filter, 1.0f, 1.0f, 0.0f); - image_filter_scale(rend_data_ctx, &refl_tex, refl_buf_tex.color_texture); + image_filter_scale(rend_data_ctx, &refl_tex, refl_buf_tex.get_texture()); } + + shader::unbind(rend_data_ctx.state); + refl_tex.end_render(rend_data_ctx.state); } else { + refl_tex.begin_render(rend_data_ctx.state); vec4 clear_color; rend_data_ctx.state.get_clear_color(clear_color.x, clear_color.y, clear_color.z, clear_color.w); rend_data_ctx.state.clear_color(0.0f, 0.0f, 0.0f, 0.0f); rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT); rend_data_ctx.state.clear_color(clear_color.x, clear_color.y, clear_color.z, clear_color.w); + refl_tex.end_render(rend_data_ctx.state); } - shader::unbind(rend_data_ctx.state); - rend_data_ctx.state.bind_framebuffer(0); rend_data_ctx.state.end_event(); } @@ -774,11 +777,11 @@ namespace rndr { render_context* rctx = rctx_ptr; rend_data_ctx.state.begin_event("pass_refract"); RenderTexture& refract_texture = get_render_texture(1); - refract_texture.Bind(rend_data_ctx.state); if (rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFRACT_OPAQUE) || rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFRACT_TRANSPARENT) || rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFRACT_TRANSLUCENT)) { - refract_texture.SetViewport(rend_data_ctx.state); + refract_texture.begin_render(rend_data_ctx.state); + refract_texture.set_viewport(rend_data_ctx.state); rend_data_ctx.set_batch_scene_camera(cam); for (int32_t i = LIGHT_SET_MAIN; i < LIGHT_SET_MAX; i++) @@ -800,17 +803,20 @@ namespace rndr { rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_REFRACT_TRANSPARENT, cam); rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_REFRACT_TRANSLUCENT, cam); rend_data_ctx.state.disable_depth_test(); + rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = -1; + shader::unbind(rend_data_ctx.state); + refract_texture.end_render(rend_data_ctx.state); } else { + refract_texture.begin_render(rend_data_ctx.state); vec4 clear_color; rend_data_ctx.state.get_clear_color(clear_color.x, clear_color.y, clear_color.z, clear_color.w); rend_data_ctx.state.clear_color(0.0f, 0.0f, 0.0f, 0.0f); rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT); rend_data_ctx.state.clear_color(clear_color.x, clear_color.y, clear_color.z, clear_color.w); + refract_texture.end_render(rend_data_ctx.state); } - shader::unbind(rend_data_ctx.state); - rend_data_ctx.state.bind_framebuffer(0); rend_data_ctx.state.end_event(); } @@ -828,21 +834,20 @@ namespace rndr { render_context* rctx = rctx_ptr; rend_data_ctx.state.begin_event("pass_clear"); if (clear) { - rctx->screen_buffer.Bind(rend_data_ctx.state); + rctx->screen_buffer.begin_render(rend_data_ctx.state); clear_color_set_gl(rend_data_ctx.state); //rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT); - rend_data_ctx.state.bind_framebuffer(0); + rctx->screen_buffer.end_render(rend_data_ctx.state); } rndr::Render* rend = render; if (!rctx->sss_data->enable || !rctx->sss_data->downsample) { - rend->bind_render_texture(rend_data_ctx.state); + rend->begin_render(rend_data_ctx.state); if (spr::getObjListCount(spr::SPR_TARGET_BACK)) { rend_data_ctx.state.clear_color(0.0f, 0.0f, 0.0f, 0.0f); rend_data_ctx.state.clear_depth(1.0f); rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - rend_data_ctx.state.bind_framebuffer(0); } else { clear_color_set_gl(rend_data_ctx.state); @@ -851,21 +856,21 @@ namespace rndr { rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); else rend_data_ctx.state.clear(GL_DEPTH_BUFFER_BIT); - rend_data_ctx.state.bind_framebuffer(0); } + rend->end_render(rend_data_ctx.state); } else { if (spr::getObjListCount(spr::SPR_TARGET_BACK)) { - rend->bind_render_texture(rend_data_ctx.state); + rend->begin_render(rend_data_ctx.state); rend_data_ctx.state.clear_color(0.0f, 0.0f, 0.0f, 0.0f); rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT); - rend_data_ctx.state.bind_framebuffer(0); + rend->end_render(rend_data_ctx.state); } else if (clear) { - rend->bind_render_texture(rend_data_ctx.state); + rend->begin_render(rend_data_ctx.state); clear_color_set_gl(rend_data_ctx.state); rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT); - rend_data_ctx.state.bind_framebuffer(0); + rend->end_render(rend_data_ctx.state); } } @@ -881,7 +886,7 @@ namespace rndr { rend_data_ctx.state.begin_event("pass_pre_sprite"); rndr::Render* rend = render; - rend->bind_render_texture(rend_data_ctx.state, true); + rend->begin_render(rend_data_ctx.state, true); rend_data_ctx.state.clear_color(0.0f, 0.0f, 0.0f, 0.0f); rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT); rend_data_ctx.state.set_depth_mask(GL_FALSE); @@ -889,21 +894,21 @@ namespace rndr { rend_data_ctx.state.enable_blend(); rend_data_ctx.state.disable_cull_face(); spr::flush(rend_data_ctx, spr::SPR_TARGET_BACK, true, - rend->temp_buffer.color_texture, + rend->temp_buffer.get_texture(), rctx->camera->view_projection_aet_3d); rend_data_ctx.state.enable_cull_face(); rend_data_ctx.state.disable_blend(); rend_data_ctx.state.enable_depth_test(); rend_data_ctx.state.set_depth_mask(GL_TRUE); shader::unbind(rend_data_ctx.state); - rend_data_ctx.state.bind_framebuffer(0); + rend->end_render(rend_data_ctx.state); gl_get_error_print(); rend_data_ctx.state.end_event(); } void RenderManager::pass_3d(render_data_context& rend_data_ctx) { render_context* rctx = rctx_ptr; - render->bind_render_texture(rend_data_ctx.state); + render->begin_render(rend_data_ctx.state); if (!rctx->sss_data->enable || !rctx->sss_data->downsample || draw_pass_3d_get_translucent_count(rctx)) { rend_data_ctx.state.set_depth_mask(GL_TRUE); @@ -928,9 +933,11 @@ namespace rndr { else rend_data_ctx.state.active_bind_texture_2d(14, rctx->empty_texture_2d->glid); + RenderTexture* refl_tex = 0; if (pass_sw[RND_PASSID_REFLECT] && reflect) { - RenderTexture& refl_tex = get_render_texture(0); - rend_data_ctx.state.active_bind_texture_2d(15, refl_tex.GetColorTex()); + refl_tex = &get_render_texture(0); + refl_tex->bind_texture(rend_data_ctx.state, 15); + rend_data_ctx.state.active_bind_texture_2d(15, refl_tex->get_texture_glid()); rend_data_ctx.shader_flags.arr[U_WATER_REFLECT] = 1; } else { @@ -1092,11 +1099,14 @@ namespace rndr { rend_data_ctx.state.disable_depth_test(); + if (refl_tex) + refl_tex->unbind_texture(rend_data_ctx.state); + if (shadow) draw_pass_3d_shadow_reset(rend_data_ctx, rctx); pass_sprite_surf(rend_data_ctx); shader::unbind(rend_data_ctx.state); - rend_data_ctx.state.bind_framebuffer(0); + render->end_render(rend_data_ctx.state); } void RenderManager::pass_show_vector(render_data_context& rend_data_ctx) { @@ -1118,7 +1128,7 @@ namespace rndr { light_set* set = &rctx->light_set[LIGHT_SET_MAIN]; if (set->lights[LIGHT_PROJECTION].get_type() == LIGHT_SPOT && texture_manager_get_texture(litproj->texture_id)) - light_proj_tex = litproj->draw_texture.color_texture; + light_proj_tex = litproj->draw_texture.get_texture(); } render->apply_post_process(rend_data_ctx, cam, light_proj_tex, npr_param); @@ -1135,7 +1145,7 @@ namespace rndr { rend_data_ctx.state.set_viewport(0, 0, width, height); if (Vulkan::use) - rctx->screen_buffer.Bind(rend_data_ctx.state); + rctx->screen_buffer.begin_render(rend_data_ctx.state); #ifdef USE_OPENGL else if (multisample && multisample_framebuffer) { rend_data_ctx.state.bind_framebuffer(multisample_framebuffer); @@ -1144,14 +1154,14 @@ namespace rndr { rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT); } else - rctx->screen_buffer.Bind(rend_data_ctx.state); + rctx->screen_buffer.begin_render(rend_data_ctx.state); #endif rend_data_ctx.state.disable_depth_test(); rend_data_ctx.state.enable_blend(); rend_data_ctx.state.disable_cull_face(); spr::flush(rend_data_ctx, spr::SPR_TARGET_FRONT, true, - rctx->screen_overlay_buffer.color_texture, + rctx->screen_overlay_buffer.get_texture(), rctx->camera->view_projection_aet_2d); rend_data_ctx.state.enable_cull_face(); rend_data_ctx.state.disable_blend(); @@ -1159,7 +1169,7 @@ namespace rndr { #ifdef USE_OPENGL if (!Vulkan::use && multisample && multisample_framebuffer) { - rend_data_ctx.state.bind_framebuffer(rctx->screen_buffer.fbos[0]); + rend_data_ctx.state.bind_framebuffer(rctx->screen_buffer.get_fb()); rend_data_ctx.state.disable_multisample(); rend_data_ctx.state.bind_read_framebuffer(multisample_framebuffer); rend_data_ctx.state.blit_framebuffer(0, 0, width, height, @@ -1207,9 +1217,9 @@ namespace rndr { rctx->contour_params_ubo.WriteMemory(rend_data_ctx.state, contour_params_data); shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_CONTOUR_NPR); - rend_data_ctx.state.active_bind_texture_2d(14, rt->GetDepthTex()); - rend_data_ctx.state.active_bind_texture_2d(16, contour_rt->GetColorTex()); - rend_data_ctx.state.active_bind_texture_2d(17, contour_rt->GetDepthTex()); + rend_data_ctx.state.active_bind_texture_2d(14, rt->get_depth_texture_glid()); + rend_data_ctx.state.active_bind_texture_2d(16, contour_rt->get_texture_glid()); + rend_data_ctx.state.active_bind_texture_2d(17, contour_rt->get_depth_texture_glid()); rend_data_ctx.state.bind_sampler(14, rctx->render_samplers[1]); rend_data_ctx.state.bind_sampler(16, rctx->render_samplers[1]); rend_data_ctx.state.bind_sampler(17, rctx->render_samplers[1]); @@ -1241,22 +1251,22 @@ namespace rndr { rend_data_ctx.state.enable_blend(); rend_data_ctx.state.disable_cull_face(); spr::flush(rend_data_ctx, spr::SPR_TARGET_FRONT_3D_SURF, true, - rend->temp_buffer.color_texture, + rend->temp_buffer.get_texture(), rctx->camera->view_projection_aet_2d); } } void image_filter_scale(render_data_context& rend_data_ctx, RenderTexture* dst, texture* src, const vec4& scale) { - if (!dst || !dst->color_texture->glid || !dst->color_texture || !src || !src->glid) + if (!dst || !dst->get_texture() || !dst->get_texture()->glid || !src || !src->glid) return; render_context* rctx = rctx_ptr; rend_data_ctx.state.begin_event("`anonymous-namespace'::Impl::apply_no_filter_sub"); - dst->Bind(rend_data_ctx.state); - dst->SetViewport(rend_data_ctx.state); + dst->begin_render(rend_data_ctx.state); + dst->set_viewport(rend_data_ctx.state); image_filter_scene_shader_data filter_scene = {}; filter_scene.g_transform = { 1.0f, 1.0f, 0.0f, 0.0f }; @@ -1285,7 +1295,7 @@ void render_manager_init_data(int32_t ssaa, int32_t hd_res, int32_t ss_alpha_mas render_manager.reset(); render_manager.npr = npr; - render_texture_counter_reset(); + RenderTexture::init(); ScreenParam& screen_param = get_screen_param(); ScreenParam& render_screen_param = get_render_screen_param(); @@ -1319,8 +1329,8 @@ void render_manager_free_data() { static void draw_pass_shadow_begin_make_shadowmap(Shadow* shad, render_data_context& rend_data_ctx, cam_data& cam, int32_t index, int32_t a3) { render_context* rctx = rctx_ptr; - shad->curr_render_textures[0]->Bind(rend_data_ctx.state); - texture* tex = shad->curr_render_textures[0]->color_texture; + shad->curr_render_textures[0]->begin_render(rend_data_ctx.state); + texture* tex = shad->curr_render_textures[0]->get_texture(); rend_data_ctx.state.set_viewport(1, 1, tex->width - 2, tex->width - 2); rend_data_ctx.state.enable_depth_test(); rend_data_ctx.state.clear_color(1.0f, 1.0f, 1.0f, 1.0f); @@ -1368,26 +1378,26 @@ static void draw_pass_shadow_end_make_shadowmap(Shadow* shad, RenderTexture& rend_buf_tex = rctx_ptr->shadow_buffer; image_filter_scale(rend_data_ctx, rend_tex, - shad->curr_render_textures[0]->color_texture); + shad->curr_render_textures[0]->get_texture()); if (shad->blur_filter_enable[index]) { for (int32_t i = shad->near_blur, j = 0; i > 0; i--, j++) { apply_blur_filter_sub(rend_data_ctx, &rend_buf_tex, rend_tex, shad->blur_filter, 1.0f, 1.0f, 0.0f); - image_filter_scale(rend_data_ctx, rend_tex, rend_buf_tex.color_texture); + image_filter_scale(rend_data_ctx, rend_tex, rend_buf_tex.get_texture()); } } else { - rend_buf_tex.Bind(rend_data_ctx.state); + rend_buf_tex.begin_render(rend_data_ctx.state); rend_data_ctx.state.clear_color(1.0f, 1.0f, 1.0f, 1.0f); rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT); } + rend_buf_tex.end_render(rend_data_ctx.state); - rend_data_ctx.state.bind_framebuffer(0); if (GLAD_GL_VERSION_4_5) - rend_data_ctx.state.generate_texture_mipmap(rend_tex->GetColorTex()); + rend_data_ctx.state.generate_texture_mipmap(rend_tex->get_texture_glid()); else { - rend_data_ctx.state.bind_texture_2d(rend_tex->GetColorTex()); + rend_data_ctx.state.bind_texture_2d(rend_tex->get_texture_glid()); rend_data_ctx.state.generate_mipmap(GL_TEXTURE_2D); rend_data_ctx.state.bind_texture_2d(0); } @@ -1396,11 +1406,11 @@ static void draw_pass_shadow_end_make_shadowmap(Shadow* shad, static void apply_esm_filter(render_data_context& rend_data_ctx, RenderTexture* dst, RenderTexture* buf, RenderTexture* src, float_t sigma, float_t far_texel_offset, bool enable_lit_proj) { - texture* dst_tex = dst->color_texture; - texture* buf_tex = buf->color_texture; - texture* src_tex = dst->color_texture; + texture* dst_tex = dst->get_texture(); + texture* buf_tex = buf->get_texture(); + texture* src_tex = dst->get_texture(); if (src) - src_tex = src->depth_texture; + src_tex = src->get_depth_texture(); if (!dst_tex || !buf_tex || !src_tex || dst_tex->width != buf_tex->width || dst_tex->height != buf_tex->height) return; @@ -1426,7 +1436,7 @@ static void apply_esm_filter(render_data_context& rend_data_ctx, rend_data_ctx.state.set_viewport(0, 0, dst_tex->width, dst_tex->height); - buf->Bind(rend_data_ctx.state); + buf->begin_render(rend_data_ctx.state); esm_filter_batch.g_params = { 1.0f / (float_t)dst_tex->width, 0.0f, far_texel_offset, far_texel_offset }; rctx->esm_filter_batch_ubo.WriteMemory(rend_data_ctx.state, esm_filter_batch); @@ -1435,7 +1445,7 @@ static void apply_esm_filter(render_data_context& rend_data_ctx, rend_data_ctx.state.bind_vertex_array(rctx->common_vao); rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); - dst->Bind(rend_data_ctx.state); + dst->begin_render(rend_data_ctx.state); esm_filter_batch.g_params = { 0.0f, 1.0f / (float_t)dst_tex->height, far_texel_offset, far_texel_offset }; rctx->esm_filter_batch_ubo.WriteMemory(rend_data_ctx.state, esm_filter_batch); @@ -1449,9 +1459,9 @@ static void apply_esm_filter(render_data_context& rend_data_ctx, static void apply_esm_min_filter(render_data_context& rend_data_ctx, RenderTexture* dst, RenderTexture* buf, RenderTexture* src) { - texture* dst_tex = dst->color_texture; - texture* buf_tex = buf->color_texture; - texture* src_tex = src->color_texture; + texture* dst_tex = dst->get_texture(); + texture* buf_tex = buf->get_texture(); + texture* src_tex = src->get_texture(); rend_data_ctx.state.begin_event("`anonymous-namespace'::Impl::apply_esm_min_filter"); if (!dst_tex || !dst_tex->glid || !buf_tex || !buf_tex->glid || !src_tex || !src_tex->glid) { rend_data_ctx.state.end_event(); @@ -1475,7 +1485,7 @@ static void apply_esm_min_filter(render_data_context& rend_data_ctx, rend_data_ctx.state.set_viewport(0, 0, dst_tex->width, dst_tex->height); - buf->Bind(rend_data_ctx.state); + buf->begin_render(rend_data_ctx.state); esm_filter_batch.g_params = { 1.0f / (float_t)src_tex->width, 1.0f / (float_t)src_tex->height, 0.0f, 0.0f }; rctx->esm_filter_batch_ubo.WriteMemory(rend_data_ctx.state, esm_filter_batch); @@ -1489,7 +1499,7 @@ static void apply_esm_min_filter(render_data_context& rend_data_ctx, rend_data_ctx.state.end_event(); rend_data_ctx.state.begin_event("erosion"); - dst->Bind(rend_data_ctx.state); + dst->begin_render(rend_data_ctx.state); esm_filter_batch.g_params = { 0.75f / (float_t)buf_tex->width, 0.75f / (float_t)buf_tex->height, 0.0f, 0.0f }; rctx->esm_filter_batch_ubo.WriteMemory(rend_data_ctx.state, esm_filter_batch); @@ -1512,15 +1522,15 @@ static bool litproj_clear(render_data_context& rend_data_ctx, light_proj* litpro if (!tex) return false; - litproj->draw_texture.Bind(rend_data_ctx.state); - litproj->draw_texture.SetViewport(rend_data_ctx.state); + litproj->draw_texture.begin_render(rend_data_ctx.state); + litproj->draw_texture.set_viewport(rend_data_ctx.state); rend_data_ctx.state.enable_depth_test(); rend_data_ctx.state.clear_color(0.0f, 0.0f, 0.0f, 0.0f); rend_data_ctx.state.clear_depth(1.0f); rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if (!light_proj::set_mat(rend_data_ctx, cam, true)) { - rend_data_ctx.state.bind_framebuffer(0); + litproj->draw_texture.end_render(rend_data_ctx.state); return false; } @@ -1528,7 +1538,7 @@ static bool litproj_clear(render_data_context& rend_data_ctx, light_proj* litpro rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = SHADER_FT_LITPROJ; rend_data_ctx.state.active_bind_texture_2d(17, tex->glid); rend_data_ctx.state.bind_sampler(17, rctx->render_samplers[2]); - rend_data_ctx.state.active_bind_texture_2d(18, litproj->shadow_texture[0].GetColorTex()); + rend_data_ctx.state.active_bind_texture_2d(18, litproj->shadow_texture[0].get_texture_glid()); rend_data_ctx.state.bind_sampler(18, rctx->render_samplers[2]); rend_data_ctx.state.active_texture(0); return true; @@ -1558,8 +1568,8 @@ static void draw_pass_3d_shadow_reset(render_data_context& rend_data_ctx, render static void draw_pass_3d_shadow_set(render_data_context& rend_data_ctx, Shadow* shad, render_context* rctx) { float_t esm_param; if (shad->self_shadow && shad->num_shadow > 0) { - rend_data_ctx.state.active_bind_texture_2d(19, shad->render_textures[3].GetColorTex()); - rend_data_ctx.state.active_bind_texture_2d(20, shad->render_textures[5].GetColorTex()); + rend_data_ctx.state.active_bind_texture_2d(19, shad->render_textures[3].get_texture_glid()); + rend_data_ctx.state.active_bind_texture_2d(20, shad->render_textures[5].get_texture_glid()); rend_data_ctx.state.active_texture(0); esm_param = (shad->field_2D8 * shad->z_half_range * 2.0f) * 1.442695f; rend_data_ctx.set_self_shadow(true); @@ -1619,7 +1629,7 @@ static void draw_pass_3d_shadow_set(render_data_context& rend_data_ctx, Shadow* int32_t j = 0; for (int32_t i = 0; i < 2; i++) if (shad->shadow_enable[i]) { - rend_data_ctx.state.active_bind_texture_2d(6 + j, shad->curr_render_textures[1 + i]->GetColorTex()); + rend_data_ctx.state.active_bind_texture_2d(6 + j, shad->curr_render_textures[1 + i]->get_texture_glid()); j++; } @@ -1643,7 +1653,7 @@ static void draw_pass_3d_shadow_set(render_data_context& rend_data_ctx, Shadow* rctx->draw_state->rend_data[rend_data_ctx.index].shadow = false; for (int32_t i = 0; i < 2; i++) - rend_data_ctx.state.active_bind_texture_2d(6 + i, shad->curr_render_textures[1 + i]->GetColorTex()); + shad->curr_render_textures[1 + i]->bind_texture(rend_data_ctx.state, 6 + i); rend_data_ctx.state.active_texture(0); shadow_ambient = 1.0f; @@ -1809,13 +1819,13 @@ static void draw_pass_reflect_full(render_data_context& rend_data_ctx, rndr::Ren rend_data_ctx.state.begin_event("pass_reflect"); RenderTexture& refl_tex = render_manager->get_render_texture(0); RenderTexture& refl_buf_tex = rctx->reflect_buffer; - refl_tex.Bind(rend_data_ctx.state); extern bool reflect_full; if (rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_OPAQUE) || rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_TRANSPARENT) || rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_TRANSLUCENT_SORT_BY_RADIUS) || rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_TRANSLUCENT)) { - refl_tex.SetViewport(rend_data_ctx.state); + refl_tex.begin_render(rend_data_ctx.state); + refl_tex.set_viewport(rend_data_ctx.state); if (!rctx->sss_data->enable || !rctx->sss_data->downsample || draw_pass_3d_get_translucent_count(rctx)) { @@ -1947,18 +1957,21 @@ static void draw_pass_reflect_full(render_data_context& rend_data_ctx, rndr::Ren for (int32_t i = render_manager->reflect_blur_num, j = 0; i > 0; i--, j++) { apply_blur_filter_sub(rend_data_ctx, &refl_buf_tex, &refl_tex, render_manager->reflect_blur_filter, 1.0f, 1.0f, 0.0f); - image_filter_scale(rend_data_ctx, &refl_tex, refl_buf_tex.color_texture); + image_filter_scale(rend_data_ctx, &refl_tex, refl_buf_tex.get_texture()); } + + shader::unbind(rend_data_ctx.state); + refl_tex.end_render(rend_data_ctx.state); } else { + refl_tex.begin_render(rend_data_ctx.state); vec4 clear_color; rend_data_ctx.state.get_clear_color(clear_color.x, clear_color.y, clear_color.z, clear_color.w); rend_data_ctx.state.clear_color(0.0f, 0.0f, 0.0f, 0.0f); rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT); rend_data_ctx.state.clear_color(clear_color.x, clear_color.y, clear_color.z, clear_color.w); + refl_tex.end_render(rend_data_ctx.state); } - shader::unbind(rend_data_ctx.state); - rend_data_ctx.state.bind_framebuffer(0); rend_data_ctx.state.end_event(); } @@ -1971,12 +1984,12 @@ static void apply_blur_filter_sub(render_data_context& rend_data_ctx, RenderText rend_data_ctx.state.begin_event("`anonymous-namespace'::Impl::apply_blur_filter_sub"); - dst->Bind(rend_data_ctx.state); - dst->SetViewport(rend_data_ctx.state); + dst->begin_render(rend_data_ctx.state); + dst->set_viewport(rend_data_ctx.state); image_filter_scene_shader_data filter_scene = {}; - float_t w = res_scale.x / (float_t)src->GetWidth(); - float_t h = res_scale.y / (float_t)src->GetHeight(); + float_t w = res_scale.x / (float_t)src->get_width(); + float_t h = res_scale.y / (float_t)src->get_height(); filter_scene.g_transform = { w, h, 0.0f, 0.0f }; filter_scene.g_texcoord = { 1.0f, 1.0f, 0.0f, 0.0f }; rctx->image_filter_scene_ubo.WriteMemory(rend_data_ctx.state, filter_scene); @@ -1995,7 +2008,7 @@ static void apply_blur_filter_sub(render_data_context& rend_data_ctx, RenderText shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_IMGFILT); rend_data_ctx.state.bind_uniform_buffer_base(0, rctx->image_filter_scene_ubo); rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->image_filter_batch_ubo); - rend_data_ctx.state.active_bind_texture_2d(0, src->GetColorTex()); + rend_data_ctx.state.active_bind_texture_2d(0, src->get_texture_glid()); rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, (GLint)(filter * 4LL), 4); rend_data_ctx.state.end_event(); @@ -2019,7 +2032,7 @@ static void render_manager_free_render_textures() { #endif for (RenderTexture& i : render_manager.render_textures) - i.Free(); + i.destroy(); } static void render_manager_init_render_textures(int32_t multisample) { @@ -2056,9 +2069,9 @@ static void render_manager_init_render_textures(int32_t multisample) { continue; RenderTexture& rt = render_manager.render_textures[i]; - rt.Init(tex_data->width, tex_data->height, tex_data->max_level, + rt.create_texture(tex_data->width, tex_data->height, tex_data->max_level, tex_data->color_format, tex_data->depth_format); - rt.Bind(gl_state); + rt.begin_render(gl_state); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } diff --git a/src/CRE/render_texture.cpp b/src/CRE/render_texture.cpp index d0872b14..1b4967cb 100644 --- a/src/CRE/render_texture.cpp +++ b/src/CRE/render_texture.cpp @@ -9,187 +9,29 @@ #include "gl_state.hpp" #include "texture.hpp" -static uint32_t render_texture_counter; +int32_t RenderTexture::m_tex_count; -static int32_t render_texture_init_framebuffer(RenderTexture* rt, int32_t max_level); -static int32_t render_texture_set_framebuffer_texture(RenderTexture* rrt, - GLuint color_texture, int32_t level, GLuint depth_texture, bool stencil); - -RenderTexture::RenderTexture() : color_texture(), depth_texture(), -binding(), max_level(), fbos(), depth_rbo(), stencil_rbo() { - -} - -RenderTexture::~RenderTexture() { - Free(); -} - -int32_t RenderTexture::Bind(gl_state_struct& gl_st, int32_t index) { - if (index < 0 || index > max_level) +// 0x140503310 +int32_t RenderTexture::create_fbo(int32_t level) { + int32_t level_count = level + 1; + m_fb = prj::MemoryManager::alloc(prj::MemCSystem, level_count, "FBO"); + if (!m_fb) return -1; - gl_st.bind_framebuffer(fbos[index]); - if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) + glGenFramebuffers(level_count, m_fb); + return gl_get_error_print() != GL_ZERO ? -1 : 0; +} + +// 0x1405036A0 +int32_t RenderTexture::set_render_target(GLuint color, int32_t level, GLuint depth, bool stencil) { + if (level < 0 || level > m_level) return -1; - gl_get_error_print(); - return 0; -} - -int32_t RenderTexture::Bind(p_gl_rend_state& p_gl_rend_st, int32_t index) { - if (index < 0 || index > max_level) - return -1; - - p_gl_rend_st.bind_framebuffer(fbos[index]); - if (p_gl_rend_st.check_framebuffer_status(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) - return -1; - - gl_get_error_print(); - return 0; -} - -void RenderTexture::Free() { - if (depth_texture) { - texture_release(depth_texture); - depth_texture = 0; - } - - if (color_texture) { - texture_release(color_texture); - color_texture = 0; - } - - /*if (depth_rbo) { - glDeleteRenderbuffers(1, &depth_rbo); - depth_rbo = 0; - } - - if (stencil_rbo) { - glDeleteRenderbuffers(1, &stencil_rbo); - stencil_rbo = 0; - }*/ - - if (fbos) { - glDeleteFramebuffers(max_level + 1, fbos); - prj::MemoryManager::free(prj::MemCSystem, fbos); - fbos = 0; - } - max_level = 0; -} - -int32_t RenderTexture::Init(int32_t width, int32_t height, - int32_t max_level, GLenum color_format, GLenum depth_format) { - if (max_level < 0) - return -1; - - max_level = min_def(max_level, 15); - if (max_level < 0) - return 0; - Free(); - - GLuint color_texture; - if (color_format) { - this->color_texture = texture_load_tex_2d(texture_id(0x23, render_texture_counter), - color_format, width, height, max_level, 0, 0); - if (!this->color_texture) - return -1; - - render_texture_counter++; - color_texture = GetColorTex(); - if (color_format == GL_RGBA32F) { - gl_state.bind_texture_2d(color_texture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - gl_state.bind_texture_2d(0); - } - } - else { - this->color_texture = 0; - color_texture = 0; - } - - GLuint depth_texture; - bool stencil; - if (depth_format) { - this->depth_texture = texture_load_tex_2d(texture_id(0x23, render_texture_counter), - depth_format, width, height, 0, 0, 0); - if (!this->depth_texture) - return -1; - - render_texture_counter++; - depth_texture = this->GetDepthTex(); - stencil = depth_format == GL_DEPTH24_STENCIL8 || depth_format == GL_DEPTH32F_STENCIL8; - } - else { - this->depth_texture = 0; - depth_texture = 0; - stencil = false; - } - this->max_level = max_level; - - if (render_texture_init_framebuffer(this, max_level) >= 0) - for (int32_t i = 0; i <= max_level; i++) - if (render_texture_set_framebuffer_texture(this, color_texture, i, depth_texture, stencil) < 0) - return -1; - return 0; -} - -/*int32_t RenderTexture::InitDepthRenderbuffer(gl_state_struct& gl_st, - GLenum internal_format, int32_t width, int32_t height) { - gl_st.bind_framebuffer(fbos[0]); - glGenRenderbuffers(1, &depth_rbo); - glBindRenderbuffer(GL_RENDERBUFFER, depth_rbo); - glRenderbufferStorage(GL_RENDERBUFFER, internal_format, width, height); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth_rbo); - gl_st.bind_framebuffer(0); - return -(glGetError() != GL_ZERO); -} - -int32_t RenderTexture::InitStencilRenderbuffer(gl_state_struct& gl_st, - GLenum internal_format, int32_t width, int32_t height) { - gl_st.bind_framebuffer(fbos[0]); - glGenRenderbuffers(1, &stencil_rbo); - glBindRenderbuffer(GL_RENDERBUFFER, stencil_rbo); - glRenderbufferStorage(GL_RENDERBUFFER, internal_format, width, height); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, stencil_rbo); - gl_st.bind_framebuffer(0); - return -(glGetError() != GL_ZERO); -}*/ - -int32_t RenderTexture::SetColorDepthTextures(GLuint color_texture, - int32_t max_level, GLuint depth_texture, bool stencil) { - int32_t error = 0; - this->max_level = max_level; - if (!fbos) - error = render_texture_init_framebuffer(this, max_level); - render_texture_set_framebuffer_texture(this, color_texture, max_level, depth_texture, stencil); - return error; -} - -void RenderTexture::SetViewport(p_gl_rend_state& p_gl_rend_st) { - p_gl_rend_st.set_viewport(0, 0, GetWidth(), GetHeight()); -} - -void render_texture_counter_reset() { - render_texture_counter = 0; -} - -static int32_t render_texture_init_framebuffer(RenderTexture* rt, int32_t max_level) { - rt->fbos = prj::MemoryManager::alloc(prj::MemCSystem, max_level + 1LL, "FBO"); - glGenFramebuffers(max_level + 1, rt->fbos); - return -(gl_get_error_print() != GL_ZERO); -} - -static int32_t render_texture_set_framebuffer_texture(RenderTexture* rt, - GLuint color_texture, int32_t level, GLuint depth_texture, bool stencil) { - if (level < 0 || level > rt->max_level) - return -1; - - gl_state.bind_framebuffer(rt->fbos[level]); + gl_state.bind_framebuffer(m_fb[level]); gl_get_error_print(); - if (color_texture) { - glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, color_texture, level); + if (color) { + glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, color, level); gl_get_error_print(); glDrawBuffer(GL_COLOR_ATTACHMENT0); glReadBuffer(GL_COLOR_ATTACHMENT0); @@ -204,11 +46,11 @@ static int32_t render_texture_set_framebuffer_texture(RenderTexture* rt, if (!level) { GLenum attechment = stencil ? GL_DEPTH_STENCIL_ATTACHMENT : GL_DEPTH_ATTACHMENT; - if (depth_texture) - glFramebufferTexture(GL_FRAMEBUFFER, attechment, depth_texture, 0); - /*else if (rt->depth_rbo) { - glBindRenderbuffer(GL_RENDERBUFFER, rt->depth_rbo); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, attechment, GL_RENDERBUFFER, rt->depth_rbo); + if (depth) + glFramebufferTexture(GL_FRAMEBUFFER, attechment, depth, 0); + /*else if (m_rb_depth) { + glBindRenderbuffer(GL_RENDERBUFFER, m_rb_depth); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, attechment, GL_RENDERBUFFER, m_rb_depth); }*/ else glFramebufferTexture(GL_FRAMEBUFFER, attechment, 0, 0); @@ -222,3 +64,208 @@ static int32_t render_texture_set_framebuffer_texture(RenderTexture* rt, gl_get_error_print(); return ret; } + +// 0x140503260 +/*int32_t RenderTexture::create_depth_buffer(GLenum internal_format, int32_t width, int32_t height) { + glBindFramebuffer(GL_FRAMEBUFFER, m_fb[0]); + glGenRenderbuffers(1, &m_rb_depth); + glBindRenderbuffer(GL_RENDERBUFFER, m_rb_depth); + glRenderbufferStorage(GL_RENDERBUFFER, internal_format, width, height); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_rb_depth); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + return gl_get_error_print() != GL_ZERO ? -1 : 0; +}*/ + +// 0x140503370 +/*int32_t RenderTexture::create_stencil_buffer(GLenum internal_format, int32_t width, int32_t height) { + glBindFramebuffer(GL_FRAMEBUFFER, m_fb[0]); + glGenRenderbuffers(1, &m_rb_stencil); + glBindRenderbuffer(GL_RENDERBUFFER, m_rb_stencil); + glRenderbufferStorage(GL_RENDERBUFFER, internal_format, width, height); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_rb_stencil); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + return gl_get_error_print() != GL_ZERO ? -1 : 0; +}*/ + +// 0x140503680 +void RenderTexture::init() { + m_tex_count = 0; +} + +// 0x1405030C0 +RenderTexture::RenderTexture() : m_txhd_color(), m_txhd_depth(), +m_tex_unit(), m_level(), m_fb(), m_rb_depth(), m_rb_stencil() { + +} + +// 0x1405030F0 +RenderTexture::~RenderTexture() { + destroy(); +} + +// 0x140503420 +int32_t RenderTexture::create_texture(int32_t width, int32_t height, int32_t level, GLenum pixel_format, GLenum depth_format) { + if (level < 0) + return -1; + + level = min_def(level, 15); + if (level < 0) + return 0; + destroy(); + + GLuint color; + if (pixel_format) { + m_txhd_color = texture_load_tex_2d(texture_id(0x23, m_tex_count), + pixel_format, width, height, level, 0, 0); + if (!m_txhd_color) + return -1; + + m_tex_count++; + color = get_texture_glid(); + if (pixel_format == GL_RGBA32F) { + gl_state.bind_texture_2d(color); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + gl_state.bind_texture_2d(0); + } + } + else { + m_txhd_color = 0; + color = 0; + } + + GLuint depth; + bool stencil; + if (depth_format) { + m_txhd_depth = texture_load_tex_2d(texture_id(0x23, m_tex_count), + depth_format, width, height, 0, 0, 0); + if (!m_txhd_depth) + return -1; + + m_tex_count++; + depth = this->get_depth_texture_glid(); + stencil = depth_format == GL_DEPTH24_STENCIL8 || depth_format == GL_DEPTH32F_STENCIL8; + } + else { + m_txhd_depth = 0; + depth = 0; + stencil = false; + } + m_level = level; + + if (create_fbo(level) >= 0) + for (int32_t i = 0; i <= level; i++) + if (set_render_target(color, i, depth, stencil) < 0) + return -1; + return 0; +} + +// Missing +int32_t RenderTexture::attach_texture(texture* color_tex, int32_t level, texture* depth_tex, bool stencil) { + m_level = level; + + int32_t error = 0; + if (!m_fb) + error = create_fbo(level); + + m_txhd_color = color_tex; + m_txhd_depth = depth_tex; + set_render_target(color_tex ? color_tex->glid : 0, level, depth_tex ? depth_tex->glid : 0, stencil); + return error; +} + +// 0x140503130 +int32_t RenderTexture::attach_texture(GLuint color_tex, int32_t level, GLuint depth_tex, bool stencil) { + m_level = level; + + int32_t error = 0; + if (!m_fb) + error = create_fbo(level); + + set_render_target(color_tex, level, depth_tex, stencil); + return error; +} + +// 0x1405035C0 +void RenderTexture::destroy() { + if (m_txhd_depth) { + texture_release(m_txhd_depth); + m_txhd_depth = 0; + } + + if (m_txhd_color) { + texture_release(m_txhd_color); + m_txhd_color = 0; + } + + /*if (m_rb_depth) { + glDeleteRenderbuffers(1, &m_rb_depth); + m_rb_depth = 0; + } + + if (m_rb_stencil) { + glDeleteRenderbuffers(1, &m_rb_stencil); + m_rb_stencil = 0; + }*/ + + if (m_fb) { + glDeleteFramebuffers(m_level + 1, m_fb); + prj::MemoryManager::free(prj::MemCSystem, m_fb); + m_fb = 0; + } + m_level = 0; +} + +// 0x1405031A0 +int32_t RenderTexture::begin_render(gl_state_struct& gl_st, int32_t level) { + if (level < 0 || level > m_level) + return -1; + + gl_st.bind_framebuffer(m_fb[level]); + if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) + return -1; + + gl_get_error_print(); + return 0; +} + +// 0x1405031A0 +int32_t RenderTexture::begin_render(p_gl_rend_state& p_gl_rend_st, int32_t level) { + if (level < 0 || level > m_level) + return -1; + + p_gl_rend_st.bind_framebuffer(m_fb[level]); + if (p_gl_rend_st.check_framebuffer_status(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) + return -1; + + gl_get_error_print(); + return 0; +} + +// 0x140503660 +void RenderTexture::end_render(gl_state_struct& gl_st) { + gl_st.bind_framebuffer(0); + gl_get_error_print(); +} + +// 0x140503660 +void RenderTexture::end_render(p_gl_rend_state& p_gl_rend_st) { + p_gl_rend_st.bind_framebuffer(0); + gl_get_error_print(); +} + +// 0x140503200 +void RenderTexture::bind_texture(p_gl_rend_state& p_gl_rend_st, uint32_t tex_unit) { + m_tex_unit = tex_unit; + p_gl_rend_st.active_bind_texture_2d(tex_unit, m_txhd_color->glid); +} + +// 0x1405037F0 +void RenderTexture::unbind_texture(p_gl_rend_state& p_gl_rend_st) { + p_gl_rend_st.bind_texture_2d(m_tex_unit); +} + +// Added +void RenderTexture::set_viewport(p_gl_rend_state& p_gl_rend_st) { + p_gl_rend_st.set_viewport(0, 0, get_width(), get_height()); +} diff --git a/src/CRE/render_texture.hpp b/src/CRE/render_texture.hpp index abce9ff3..6d61cb31 100644 --- a/src/CRE/render_texture.hpp +++ b/src/CRE/render_texture.hpp @@ -8,44 +8,78 @@ #include "shared.hpp" #include "texture.hpp" -struct RenderTexture { - texture* color_texture; - texture* depth_texture; - int32_t binding; - int32_t max_level; - GLuint* fbos; - GLuint depth_rbo; - GLuint stencil_rbo; +class RenderTexture { +private: + static int32_t m_tex_count; + +public: + texture* m_txhd_color; + texture* m_txhd_depth; + int32_t m_tex_unit; + int32_t m_level; + GLuint* m_fb; + GLuint m_rb_depth; + GLuint m_rb_stencil; + +private: + int32_t create_fbo(int32_t level); + int32_t set_render_target(GLuint color, int32_t level, GLuint depth, bool stencil); + //int32_t create_depth_buffer(GLenum internal_format, int32_t width, int32_t height); + //int32_t create_stencil_buffer(GLenum internal_format, int32_t width, int32_t height); + +public: + static void init(); RenderTexture(); virtual ~RenderTexture(); - int32_t Bind(struct gl_state_struct& gl_st, int32_t index = 0); - int32_t Bind(struct p_gl_rend_state& p_gl_rend_st, int32_t index = 0); - void Free(); - int32_t Init(int32_t width, int32_t height, - int32_t max_level, GLenum color_format, GLenum depth_format); - /*int32_t InitDepthRenderbuffer(gl_state_struct& gl_st, GLenum internal_format, int32_t width, int32_t height); - int32_t InitStencilRenderbuffer(gl_state_struct& gl_st, GLenum internal_format, int32_t width, int32_t height);*/ - int32_t SetColorDepthTextures(GLuint color_texture, - int32_t max_level = 0, GLuint depth_texture = 0, bool stencil = false); - void SetViewport(struct p_gl_rend_state& p_gl_rend_st); + int32_t create_texture(int32_t width, int32_t height, int32_t level, GLenum pixel_format, GLenum depth_format); + int32_t attach_texture(texture* color_tex, int32_t level = 0, texture* depth_tex = 0, bool stencil = false); + int32_t attach_texture(GLuint color_tex, int32_t level = 0, GLuint depth_tex = 0, bool stencil = false); + void destroy(); + int32_t begin_render(struct gl_state_struct& gl_st, int32_t level = 0); + int32_t begin_render(struct p_gl_rend_state& p_gl_rend_st, int32_t level = 0); + void end_render(struct gl_state_struct& gl_st); + void end_render(struct p_gl_rend_state& p_gl_rend_st); + texture* get_texture(); + void bind_texture(struct p_gl_rend_state& p_gl_rend_st, uint32_t tex_unit); + void unbind_texture(struct p_gl_rend_state& p_gl_rend_st); + texture* get_depth_texture(); - inline GLuint GetColorTex() { - return color_texture->glid; - }; + void set_viewport(struct p_gl_rend_state& p_gl_rend_st); // Added - inline GLuint GetDepthTex() { - return depth_texture->glid; - }; + // Added + inline GLuint get_fb(int32_t level = 0) { + return m_fb[level]; + } - inline int32_t GetHeight() { - return color_texture->height; - }; + // Added + inline GLuint get_texture_glid() { + return m_txhd_color->glid; + } - inline int32_t GetWidth() { - return color_texture->width; - }; + // Added + inline GLuint get_depth_texture_glid() { + return m_txhd_depth->glid; + } + + // Added + inline int32_t get_width() { + return m_txhd_color->width; + } + + // Added + inline int32_t get_height() { + return m_txhd_color->height; + } }; -extern void render_texture_counter_reset(); +// Inlined +inline texture* RenderTexture::get_texture() { + return m_txhd_color; +} + +// Inlined +inline texture* RenderTexture::get_depth_texture() { + return m_txhd_depth; +} diff --git a/src/CRE/renderer/dof.cpp b/src/CRE/renderer/dof.cpp index bbc87084..23f1b3ac 100644 --- a/src/CRE/renderer/dof.cpp +++ b/src/CRE/renderer/dof.cpp @@ -97,13 +97,13 @@ namespace renderer { } focus = max_def(focus, (float_t)cam->min_distance); - apply_physical(rend_data_ctx, rt, buf_rt, rt->GetColorTex(), rt->GetDepthTex(), + apply_physical(rend_data_ctx, rt, buf_rt, rt->get_texture_glid(), rt->get_depth_texture_glid(), cam->min_distance, cam->max_distance, focus, dof_debug_data.focal_length, cam->fov * DEG_TO_RAD_FLOAT, dof_debug_data.f_number); } else { float_t fuzzing_range = max_def(dof_debug_data.f2.fuzzing_range, 0.01f); - apply_f2(rend_data_ctx, rt, buf_rt, rt->GetColorTex(), rt->GetDepthTex(), + apply_f2(rend_data_ctx, rt, buf_rt, rt->get_texture_glid(), rt->get_depth_texture_glid(), cam->min_distance, cam->max_distance, cam->fov * DEG_TO_RAD_FLOAT, dof_debug_data.f2.focus, dof_debug_data.f2.focus_range, fuzzing_range, dof_debug_data.f2.ratio); @@ -113,7 +113,7 @@ namespace renderer { } else if (dof_pv_data.enable && dof_pv_data.f2.ratio > 0.0f) { float_t fuzzing_range = max_def(dof_pv_data.f2.fuzzing_range, 0.01f); - apply_f2(rend_data_ctx, rt, buf_rt, rt->GetColorTex(), rt->GetDepthTex(), + apply_f2(rend_data_ctx, rt, buf_rt, rt->get_texture_glid(), rt->get_depth_texture_glid(), cam->min_distance, cam->max_distance, cam->fov * DEG_TO_RAD_FLOAT, dof_pv_data.f2.focus, dof_pv_data.f2.focus_range, fuzzing_range, dof_pv_data.f2.ratio); @@ -303,7 +303,7 @@ namespace renderer { RenderTexture* rt, RenderTexture* buf_rt, GLuint color_texture, GLuint depth_texture, bool f2) { rend_data_ctx.state.begin_event("renderer::DOF3::upsample"); - buf_rt->Bind(rend_data_ctx.state); + buf_rt->begin_render(rend_data_ctx.state); rend_data_ctx.state.set_viewport(0, 0, width, height); rend_data_ctx.shader_flags.arr[U_DOF_STAGE] = 4; shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_DOF); @@ -322,10 +322,10 @@ namespace renderer { if (GLAD_GL_VERSION_4_3) rend_data_ctx.state.copy_image_sub_data( - buf_rt->GetColorTex(), GL_TEXTURE_2D, 0, 0, 0, 0, - rt->GetColorTex(), GL_TEXTURE_2D, 0, 0, 0, 0, width, height, 1); + buf_rt->get_texture_glid(), GL_TEXTURE_2D, 0, 0, 0, 0, + rt->get_texture_glid(), GL_TEXTURE_2D, 0, 0, 0, 0, width, height, 1); else - fbo_blit(rend_data_ctx.state, buf_rt->fbos[0], rt->fbos[0], + fbo_blit(rend_data_ctx.state, buf_rt->get_fb(), rt->get_fb(), 0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST); rend_data_ctx.state.end_event(); diff --git a/src/CRE/renderer/transparency.cpp b/src/CRE/renderer/transparency.cpp index a1cfa84f..d7bcbce8 100644 --- a/src/CRE/renderer/transparency.cpp +++ b/src/CRE/renderer/transparency.cpp @@ -46,24 +46,24 @@ namespace renderer { rend_data_ctx.state.disable_blend(); rend_data_ctx.state.disable_depth_test(); - rctx_ptr->render_buffer.Bind(rend_data_ctx.state); + rctx_ptr->render_buffer.begin_render(rend_data_ctx.state); shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_TRANSPARENCY); rend_data_ctx.state.bind_uniform_buffer_base(0, rctx_ptr->transparency_batch_ubo); rend_data_ctx.state.active_bind_texture_2d(0, fbo.textures[0]); - rend_data_ctx.state.active_bind_texture_2d(1, rt->GetColorTex()); + rend_data_ctx.state.active_bind_texture_2d(1, rt->get_texture_glid()); rend_data_ctx.state.bind_vertex_array(vao); rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); rend_data_ctx.state.enable_depth_test(); if (GLAD_GL_VERSION_4_3) rend_data_ctx.state.copy_image_sub_data( - rctx_ptr->render_buffer.GetColorTex(), GL_TEXTURE_2D, 0, 0, 0, 0, - rt->GetColorTex(), GL_TEXTURE_2D, 0, 0, 0, 0, fbo.width, fbo.height, 1); + rctx_ptr->render_buffer.get_texture_glid(), GL_TEXTURE_2D, 0, 0, 0, 0, + rt->get_texture_glid(), GL_TEXTURE_2D, 0, 0, 0, 0, fbo.width, fbo.height, 1); else - fbo_blit(rend_data_ctx.state, rctx_ptr->render_buffer.fbos[0], rt->fbos[0], + fbo_blit(rend_data_ctx.state, rctx_ptr->render_buffer.get_fb(), rt->get_fb(), 0, 0, fbo.width, fbo.height, 0, 0, fbo.width, fbo.height, GL_COLOR_BUFFER_BIT, GL_NEAREST); - rt->Bind(rend_data_ctx.state); + rt->begin_render(rend_data_ctx.state); } void Transparency::copy(render_data_context& rend_data_ctx, GLuint texture) { diff --git a/src/CRE/shadow.cpp b/src/CRE/shadow.cpp index 215b83b5..402d5bd4 100644 --- a/src/CRE/shadow.cpp +++ b/src/CRE/shadow.cpp @@ -58,7 +58,7 @@ void Shadow::calc_proj_view_mat(cam_data& cam, const vec3& view_point, void Shadow::clear_textures(p_gl_rend_state& p_gl_rend_st) { for (int32_t i = 1; i < 3; i++) for (int32_t j = 0; j < 4; j++) { - curr_render_textures[i]->Bind(p_gl_rend_st, j); + curr_render_textures[i]->begin_render(p_gl_rend_st, j); p_gl_rend_st.clear_color(1.0f, 1.0f, 1.0f, 1.0f); p_gl_rend_st.clear(GL_COLOR_BUFFER_BIT); } @@ -93,7 +93,7 @@ void Shadow::ctrl() { void Shadow::free() { for (RenderTexture& i : render_textures) - i.Free(); + i.destroy(); reset(); } @@ -121,12 +121,12 @@ int32_t Shadow::init() { shadow_texture_init_params* init_param = init_params; for (int32_t i = 0; i < 7; i++, init_param++) - if (render_textures[i].Init(init_param->width, init_param->height, + if (render_textures[i].create_texture(init_param->width, init_param->height, init_param->max_level, init_param->color_format, init_param->depth_format) < 0) return -1; for (int32_t i = 0; i < 3; i++) { - gl_state.bind_texture_2d(render_textures[i].GetColorTex()); + gl_state.bind_texture_2d(render_textures[i].get_texture_glid()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16.0f); @@ -134,7 +134,7 @@ int32_t Shadow::init() { glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, (GLfloat*)&border_color); } - gl_state.bind_texture_2d(render_textures[0].GetDepthTex()); + gl_state.bind_texture_2d(render_textures[0].get_depth_texture_glid()); GLint swizzle[] = { GL_RED, GL_RED, GL_RED, GL_ONE }; glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle); gl_state.bind_texture_2d(0); diff --git a/src/CRE/sss.cpp b/src/CRE/sss.cpp index 8391bd17..970de1c1 100644 --- a/src/CRE/sss.cpp +++ b/src/CRE/sss.cpp @@ -45,7 +45,7 @@ void sss_data::apply_filter(struct render_data_context& rend_data_ctx) { rend_data_ctx.state.active_texture(0); if (downsample) { - textures[0].Bind(rend_data_ctx.state); + textures[0].begin_render(rend_data_ctx.state); rend_data_ctx.state.set_viewport(0, 0, 640, 360); rndr::Render* rend = &rctx->render; rend_data_ctx.shader_flags.arr[U_REDUCE] = 0; @@ -53,19 +53,19 @@ void sss_data::apply_filter(struct render_data_context& rend_data_ctx) { RenderTexture& rt = reflect_draw ? rctx->render_manager->get_render_texture(0) : rend->rend_texture[0]; - rend_data_ctx.state.bind_texture_2d(rt.GetColorTex()); + rend_data_ctx.state.bind_texture_2d(rt.get_texture_glid()); rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); - sss_draw_quad(rend_data_ctx, rt.GetWidth(), rt.GetHeight(), + sss_draw_quad(rend_data_ctx, rt.get_width(), rt.get_height(), 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f); } - textures[2].Bind(rend_data_ctx.state); + textures[2].begin_render(rend_data_ctx.state); rend_data_ctx.state.set_viewport(0, 0, 320, 180); rend_data_ctx.shader_flags.arr[U_SSS_FILTER] = 0; shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_SSS_FILT); - rend_data_ctx.state.bind_texture_2d(textures[0].GetColorTex()); + rend_data_ctx.state.bind_texture_2d(textures[0].get_texture_glid()); rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); - sss_draw_quad(rend_data_ctx, textures[0].GetWidth(), textures[0].GetHeight(), + sss_draw_quad(rend_data_ctx, textures[0].get_width(), textures[0].get_height(), 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f); sss_filter_gaussian_coef_shader_data shader_data = {}; @@ -79,14 +79,14 @@ void sss_data::apply_filter(struct render_data_context& rend_data_ctx) { 3, weights, r_radius, g_radius, b_radius, shader_data.g_coef); rctx->sss_filter_gaussian_coef_ubo.WriteMemory(rend_data_ctx.state, shader_data); - textures[reflect_draw ? 3 : 1].Bind(rend_data_ctx.state); + textures[reflect_draw ? 3 : 1].begin_render(rend_data_ctx.state); rend_data_ctx.state.set_viewport(0, 0, 320, 180); rend_data_ctx.shader_flags.arr[U_SSS_FILTER] = 3; shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_SSS_FILT); - rend_data_ctx.state.bind_texture_2d(textures[2].GetColorTex()); + rend_data_ctx.state.bind_texture_2d(textures[2].get_texture_glid()); rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->sss_filter_gaussian_coef_ubo); - sss_draw_quad(rend_data_ctx, textures[2].GetWidth(), textures[2].GetHeight(), + sss_draw_quad(rend_data_ctx, textures[2].get_width(), textures[2].get_height(), 1.0f, 1.0f, 1.0f, 0.96f, 1.0f, 0.0f); rend_data_ctx.state.bind_texture_2d(0); } @@ -95,7 +95,7 @@ void sss_data::apply_filter(struct render_data_context& rend_data_ctx) { void sss_data::free() { if (init_data) for (RenderTexture& i : textures) - i.Free(); + i.destroy(); } // 0x140641890 @@ -103,10 +103,10 @@ void sss_data::init() { if (init_data) return; - textures[0].Init(640, 360, 0, GL_RGBA16F, GL_ZERO /*GL_DEPTH_COMPONENT32F*/); - textures[1].Init(320, 180, 0, GL_RGBA16F, GL_ZERO); - textures[2].Init(320, 180, 0, GL_RGBA16F, GL_ZERO); - textures[3].Init(320, 180, 0, GL_RGBA16F, GL_ZERO); + textures[0].create_texture(640, 360, 0, GL_RGBA16F, GL_ZERO /*GL_DEPTH_COMPONENT32F*/); + textures[1].create_texture(320, 180, 0, GL_RGBA16F, GL_ZERO); + textures[2].create_texture(320, 180, 0, GL_RGBA16F, GL_ZERO); + textures[3].create_texture(320, 180, 0, GL_RGBA16F, GL_ZERO); param = { 0.0f, 0.0f, 0.0f, 1.0f }; init_data = true; @@ -191,11 +191,11 @@ bool sss_data::set(struct render_data_context& rend_data_ctx) { downsample = true; // Added if (downsample) { - rend->rend_texture[0].Bind(rend_data_ctx.state); + rend->rend_texture[0].begin_render(rend_data_ctx.state); rend_data_ctx.state.set_viewport(0, 0, (int32_t)render_width, (int32_t)render_height); } else { - textures[0].Bind(rend_data_ctx.state); + textures[0].begin_render(rend_data_ctx.state); rend_data_ctx.state.set_viewport(0, 0, 640, 360); } @@ -213,19 +213,19 @@ bool sss_data::set(struct render_data_context& rend_data_ctx, RenderTexture& rt) return false; } - float_t render_width = (float_t)rt.GetWidth(); - float_t render_height = (float_t)rt.GetHeight(); + float_t render_width = (float_t)rt.get_width(); + float_t render_height = (float_t)rt.get_height(); if (render_width > 1280.0f) downsample = false; downsample = true; // Added if (downsample) { - rt.Bind(rend_data_ctx.state); + rt.begin_render(rend_data_ctx.state); rend_data_ctx.state.set_viewport(0, 0, (int32_t)render_width, (int32_t)render_height); } else { - textures[0].Bind(rend_data_ctx.state); + textures[0].begin_render(rend_data_ctx.state); rend_data_ctx.state.set_viewport(0, 0, 640, 360); } @@ -236,7 +236,7 @@ bool sss_data::set(struct render_data_context& rend_data_ctx, RenderTexture& rt) // 0x140641190 void sss_data::set_texture(p_gl_rend_state& p_gl_rend_st, int32_t texture_index) { - p_gl_rend_st.active_bind_texture_2d(16, textures[texture_index].GetColorTex()); + p_gl_rend_st.active_bind_texture_2d(16, textures[texture_index].get_texture_glid()); p_gl_rend_st.active_texture(0); } diff --git a/src/ReDIVA/app.cpp b/src/ReDIVA/app.cpp index 4a1dc2d2..c53211a6 100644 --- a/src/ReDIVA/app.cpp +++ b/src/ReDIVA/app.cpp @@ -1267,7 +1267,7 @@ static void render_context_disp(render_context* rctx) { #endif post_rend_data_ctx.state.bind_framebuffer(0); - post_rend_data_ctx.state.active_bind_texture_2d(0, rctx->screen_buffer.GetColorTex()); + post_rend_data_ctx.state.active_bind_texture_2d(0, rctx->screen_buffer.get_texture_glid()); post_rend_data_ctx.shader_flags.arr[U_ALPHA_MASK] = 0; post_rend_data_ctx.shader_flags.arr[U_REDUCE] = 0; shaders_ft.set(post_rend_data_ctx.state, post_rend_data_ctx.shader_flags, SHADER_FT_REDUCE); @@ -1277,11 +1277,11 @@ static void render_context_disp(render_context* rctx) { #ifdef USE_OPENGL else { #if BAKE_PNG || BAKE_VIDEO - fbo_blit(post_rend_data_ctx.state, rctx->screen_buffer.fbos[0], 0, + fbo_blit(post_rend_data_ctx.state, rctx->screen_buffer.get_fb(), 0, 0, 0, rctx->sprite_width, rctx->sprite_height, 0, 0, rctx->screen_width, rctx->screen_height, GL_COLOR_BUFFER_BIT, GL_LINEAR); #else - fbo_blit(post_rend_data_ctx.state, rctx->screen_buffer.fbos[0], 0, + fbo_blit(post_rend_data_ctx.state, rctx->screen_buffer.get_fb(), 0, 0, 0, rctx->sprite_width, rctx->sprite_height, rctx->screen_x_offset, rctx->screen_y_offset, rctx->sprite_width, rctx->sprite_height, GL_COLOR_BUFFER_BIT, GL_LINEAR);