From e19eb482a29ad8b54a3cdce0cd527cf171101feb Mon Sep 17 00:00:00 2001 From: korenkonder Date: Wed, 30 Apr 2025 12:03:59 +0300 Subject: [PATCH] Fixed some inconsistencies caused by previous commits --- src/CRE/Glitter/effect_inst.cpp | 8 +- src/CRE/Glitter/file_reader.cpp | 3 - src/CRE/Glitter/glitter.hpp | 19 +- src/CRE/Glitter/particle_manager.cpp | 4 +- src/CRE/Glitter/render_scene.cpp | 51 +++-- src/CRE/Glitter/scene.cpp | 4 +- src/CRE/effect.cpp | 8 +- src/CRE/mdl/disp_manager.cpp | 13 +- src/CRE/mdl/draw_object.cpp | 273 +++++++++++++-------------- src/CRE/render.cpp | 29 +-- src/CRE/render.hpp | 5 +- src/CRE/render_manager.cpp | 88 ++++----- src/CRE/renderer/transparency.cpp | 4 +- src/CRE/sprite.cpp | 4 +- src/KKdLib/vec.cpp | 2 +- 15 files changed, 245 insertions(+), 270 deletions(-) diff --git a/src/CRE/Glitter/effect_inst.cpp b/src/CRE/Glitter/effect_inst.cpp index fe611dfe..f098d1df 100644 --- a/src/CRE/Glitter/effect_inst.cpp +++ b/src/CRE/Glitter/effect_inst.cpp @@ -204,8 +204,8 @@ namespace Glitter { } } - void F2EffectInst::Disp(GPM, render_data_context& rend_data_ct, DispType disp_type) { - render_scene.Disp(GPM_VAL, rend_data_ct, disp_type); + void F2EffectInst::Disp(GPM, render_data_context& rend_data_ctx, DispType disp_type, const cam_data& cam) { + render_scene.Disp(GPM_VAL, rend_data_ctx, disp_type, cam); } void F2EffectInst::DispMesh(GPM) { @@ -784,8 +784,8 @@ namespace Glitter { } } - void XEffectInst::Disp(GPM, render_data_context& rend_data_ct, DispType disp_type) { - render_scene.Disp(GPM_VAL, rend_data_ct, disp_type); + void XEffectInst::Disp(GPM, render_data_context& rend_data_ctx, DispType disp_type, const cam_data& cam) { + render_scene.Disp(GPM_VAL, rend_data_ctx, disp_type, cam); } void XEffectInst::DispMesh(GPM) { diff --git a/src/CRE/Glitter/file_reader.cpp b/src/CRE/Glitter/file_reader.cpp index 90a0708f..b93cbcb9 100644 --- a/src/CRE/Glitter/file_reader.cpp +++ b/src/CRE/Glitter/file_reader.cpp @@ -12,9 +12,6 @@ #include "../data.hpp" #include "../gl_state.hpp" #include "../object.hpp" -#if SHARED_GLITTER_BUFFER -#include "../gl_rend_state.hpp" -#endif namespace Glitter { static void effect_group_msgpack_read(const char* path, const char* file, EffectGroup* eff_group); diff --git a/src/CRE/Glitter/glitter.hpp b/src/CRE/Glitter/glitter.hpp index 0972cdb3..457332ca 100644 --- a/src/CRE/Glitter/glitter.hpp +++ b/src/CRE/Glitter/glitter.hpp @@ -29,6 +29,7 @@ #define SHARED_GLITTER_BUFFER (1) +struct cam_data; struct render_data_context; namespace Glitter { @@ -858,8 +859,8 @@ namespace Glitter { void CalcDispQuadNormal(GPM, F2RenderGroup* rend_group, mat4* model_mat, mat4* dir_mat); void Ctrl(GLT, float_t delta_frame); - void Disp(GPM, render_data_context& rend_data_ct, DispType disp_type); - void Disp(GPM, render_data_context& rend_data_ct, F2RenderGroup* rend_group); + void Disp(GPM, render_data_context& rend_data_ctx, DispType disp_type, const cam_data& cam); + void Disp(GPM, render_data_context& rend_data_ctx, F2RenderGroup* rend_group, const cam_data& cam); }; class XRenderScene : public RenderScene { @@ -880,8 +881,8 @@ namespace Glitter { bool CanDisp(DispType disp_type, bool a3); void CheckUseCamera(); void Ctrl(float_t delta_frame, bool copy_mats); - void Disp(GPM, render_data_context& rend_data_ct, DispType disp_type); - void Disp(GPM, render_data_context& rend_data_ct, XRenderGroup* rend_group); + void Disp(GPM, render_data_context& rend_data_ctx, DispType disp_type, const cam_data& cam); + void Disp(GPM, render_data_context& rend_data_ctx, XRenderGroup* rend_group, const cam_data& cam); void DispMesh(GPM); void DispMesh(GPM, XRenderGroup* rend_group); }; @@ -914,7 +915,7 @@ namespace Glitter { virtual void CalcDisp(GPM) = 0; virtual void Copy(EffectInst* dst, float_t emission) = 0; - virtual void Disp(GPM, render_data_context& rend_data_ct, DispType disp_type) = 0; + virtual void Disp(GPM, render_data_context& rend_data_ctx, DispType disp_type, const cam_data& cam) = 0; virtual void DispMesh(GPM) = 0; virtual void Free(GPM, GLT, float_t emission, bool free) = 0; virtual size_t GetCtrlCount(ParticleType type) = 0; @@ -967,7 +968,7 @@ namespace Glitter { virtual void CalcDisp(GPM) override; virtual void Copy(EffectInst* dst, float_t emission) override; - virtual void Disp(GPM, render_data_context& rend_data_ct, DispType disp_type) override; + virtual void Disp(GPM, render_data_context& rend_data_ctx, DispType disp_type, const cam_data& cam) override; virtual void DispMesh(GPM) override; virtual void Free(GPM, GLT, float_t emission, bool free) override; virtual size_t GetCtrlCount(ParticleType type) override; @@ -1033,7 +1034,7 @@ namespace Glitter { virtual void CalcDisp(GPM) override; virtual void Copy(EffectInst* dst, float_t emission) override; - virtual void Disp(GPM, render_data_context& rend_data_ct, DispType disp_type) override; + virtual void Disp(GPM, render_data_context& rend_data_ctx, DispType disp_type, const cam_data& cam) override; virtual void DispMesh(GPM) override; virtual void Free(GPM, GLT, float_t emission, bool free) override; virtual size_t GetCtrlCount(ParticleType type) override; @@ -1625,7 +1626,7 @@ namespace Glitter { void CheckUpdate(float_t delta_frame); bool Copy(EffectInst* eff_inst, Scene* dst); void Ctrl(GPM, float_t delta_frame); - void Disp(GPM, render_data_context& rend_data_ct, DispType disp_type); + void Disp(GPM, render_data_context& rend_data_ctx, DispType disp_type, const cam_data& cam); void DispMesh(GPM); size_t GetCtrlCount(ParticleType ptcl_type); size_t GetDispCount(ParticleType ptcl_type); @@ -1689,7 +1690,7 @@ namespace Glitter { void CheckSceneHasLocalEffect(Scene* sc); void CtrlScenes(); void DecrementInitBuffersByCount(int32_t count = 1); - void DispScenes(render_data_context& rend_data_ct, DispType disp_type); + void DispScenes(render_data_context& rend_data_ctx, DispType disp_type, const cam_data& cam); void FreeEffects(); void FreeSceneEffect(SceneCounter scene_counter, bool force_kill = true); void FreeSceneEffect(uint64_t effect_group_hash, uint64_t effect_hash, bool force_kill = true); diff --git a/src/CRE/Glitter/particle_manager.cpp b/src/CRE/Glitter/particle_manager.cpp index 070ef94a..a9375a61 100644 --- a/src/CRE/Glitter/particle_manager.cpp +++ b/src/CRE/Glitter/particle_manager.cpp @@ -272,7 +272,7 @@ namespace Glitter { init_buffers = max_def(init_buffers - count, 0); } - void GltParticleManager::DispScenes(render_data_context& rend_data_ctx, DispType disp_type) { + void GltParticleManager::DispScenes(render_data_context& rend_data_ctx, DispType disp_type, const cam_data& cam) { if (flags & PARTICLE_MANAGER_NOT_DISP) return; @@ -281,7 +281,7 @@ namespace Glitter { && selected_effect_group != i->effect_group) continue; - i->Disp(this, rend_data_ctx, disp_type); + i->Disp(this, rend_data_ctx, disp_type, cam); } rend_data_ctx.state.bind_vertex_array(0); diff --git a/src/CRE/Glitter/render_scene.cpp b/src/CRE/Glitter/render_scene.cpp index 9d16b118..702a311f 100644 --- a/src/CRE/Glitter/render_scene.cpp +++ b/src/CRE/Glitter/render_scene.cpp @@ -12,9 +12,6 @@ extern render_context* rctx_ptr; -extern bool reflect_draw; -extern mat4 reflect_mat; - namespace Glitter { RenderScene::RenderScene() : ctrl_quad(), ctrl_line(), ctrl_locus(), ctrl_mesh(), disp_quad(), disp_line(), disp_locus(), disp_mesh() { @@ -310,7 +307,7 @@ namespace Glitter { rend_group->disp = disp; #if !SHARED_GLITTER_BUFFER - rend_group->vbo.WriteMemory(0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); + rend_group->vbo.WriteMemory(gl_state, 0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); #endif } @@ -461,7 +458,7 @@ namespace Glitter { rend_group->disp = disp; #if !SHARED_GLITTER_BUFFER - rend_group->vbo.WriteMemory(0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); + rend_group->vbo.WriteMemory(gl_state, 0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); #endif } @@ -655,7 +652,7 @@ namespace Glitter { rend_group->disp = disp; #if !SHARED_GLITTER_BUFFER - rend_group->vbo.WriteMemory(0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); + rend_group->vbo.WriteMemory(gl_state, 0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); #endif } @@ -878,7 +875,7 @@ namespace Glitter { rend_group->disp = disp; #if !SHARED_GLITTER_BUFFER - rend_group->vbo.WriteMemory(0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); + rend_group->vbo.WriteMemory(gl_state, 0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); #endif } @@ -908,7 +905,7 @@ namespace Glitter { } } - void F2RenderScene::Disp(GPM, render_data_context& rend_data_ctx, DispType disp_type) { + void F2RenderScene::Disp(GPM, render_data_context& rend_data_ctx, DispType disp_type, const cam_data& cam) { Effect* eff = GPM_VAL->selected_effect; Emitter* emit = GPM_VAL->selected_emitter; Particle* ptcl = GPM_VAL->selected_particle; @@ -922,11 +919,11 @@ namespace Glitter { continue; if (!GPM_VAL->draw_selected || !eff) { - Disp(GPM_VAL, rend_data_ctx, rend_group); + Disp(GPM_VAL, rend_data_ctx, rend_group, cam); } else if ((eff && ptcl) || (eff && !emit)) { if (!ptcl || rend_group->particle->particle == ptcl) - Disp(GPM_VAL, rend_data_ctx, rend_group); + Disp(GPM_VAL, rend_data_ctx, rend_group, cam); } else if (emit) for (Particle*& j : emit->particles) { @@ -935,12 +932,12 @@ namespace Glitter { Particle* particle = j; if (rend_group->particle->particle == particle) - Disp(GPM_VAL, rend_data_ctx, rend_group); + Disp(GPM_VAL, rend_data_ctx, rend_group, cam); } } } - void F2RenderScene::Disp(GPM, render_data_context& rend_data_ctx, F2RenderGroup* rend_group) { + void F2RenderScene::Disp(GPM, render_data_context& rend_data_ctx, F2RenderGroup* rend_group, const cam_data& cam) { switch (rend_group->type) { case PARTICLE_QUAD: case PARTICLE_LINE: @@ -954,8 +951,8 @@ namespace Glitter { return; mat4 mat; - mat4_mul(&rend_group->mat_draw, &rctx_ptr->camera->view, &mat); - mat4_mul(&mat, &rctx_ptr->camera->projection, &mat); + mat4_mul(&rend_group->mat_draw, &cam.get_view_mat(), &mat); + mat4_mul(&mat, &cam.get_proj_mat(), &mat); float_t emission = 1.0f; if (rend_group->flags & PARTICLE_EMISSION || rend_group->blend_mode == PARTICLE_BLEND_TYPICAL) @@ -1287,7 +1284,7 @@ namespace Glitter { rend_group->disp = disp; #if !SHARED_GLITTER_BUFFER - rend_group->vbo.WriteMemory(0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); + rend_group->vbo.WriteMemory(gl_state, 0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); #endif } @@ -1436,7 +1433,7 @@ namespace Glitter { rend_group->disp = disp; #if !SHARED_GLITTER_BUFFER - rend_group->vbo.WriteMemory(0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); + rend_group->vbo.WriteMemory(gl_state, 0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); #endif } @@ -1623,7 +1620,7 @@ namespace Glitter { rend_group->disp = disp; #if !SHARED_GLITTER_BUFFER - rend_group->vbo.WriteMemory(0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); + rend_group->vbo.WriteMemory(gl_state, 0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); #endif } @@ -1837,7 +1834,7 @@ namespace Glitter { rend_group->disp = disp; #if !SHARED_GLITTER_BUFFER - rend_group->vbo.WriteMemory(0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); + rend_group->vbo.WriteMemory(gl_state, 0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); #endif } @@ -1883,7 +1880,7 @@ namespace Glitter { } } - void XRenderScene::Disp(GPM, render_data_context& rend_data_ctx, DispType disp_type) { + void XRenderScene::Disp(GPM, render_data_context& rend_data_ctx, DispType disp_type, const cam_data& cam) { Effect* eff = GPM_VAL->selected_effect; Emitter* emit = GPM_VAL->selected_emitter; Particle* ptcl = GPM_VAL->selected_particle; @@ -1896,11 +1893,11 @@ namespace Glitter { continue; if (!GPM_VAL->draw_selected || !eff) { - Disp(GPM_VAL, rend_data_ctx, rend_group); + Disp(GPM_VAL, rend_data_ctx, rend_group, cam); } else if ((eff && ptcl) || (eff && !emit)) { if (!ptcl || rend_group->particle->particle == ptcl) - Disp(GPM_VAL, rend_data_ctx, rend_group); + Disp(GPM_VAL, rend_data_ctx, rend_group, cam); } else if (emit) for (Particle*& j : emit->particles) { @@ -1909,12 +1906,12 @@ namespace Glitter { Particle* particle = j; if (rend_group->particle->particle == particle) - Disp(GPM_VAL, rend_data_ctx, rend_group); + Disp(GPM_VAL, rend_data_ctx, rend_group, cam); } } } - void XRenderScene::Disp(GPM, render_data_context& rend_data_ctx, XRenderGroup* rend_group) { + void XRenderScene::Disp(GPM, render_data_context& rend_data_ctx, XRenderGroup* rend_group, const cam_data& cam) { switch (rend_group->type) { case PARTICLE_QUAD: case PARTICLE_LINE: @@ -1928,13 +1925,9 @@ namespace Glitter { if (!rend_group->vao || rend_group->disp < 1) return; - mat4 cam_view = rctx_ptr->camera->view; - if (reflect_draw) - mat4_mul(&reflect_mat, &cam_view, &cam_view); - mat4 mat; - mat4_mul(&rend_group->mat_draw, &cam_view, &mat); - mat4_mul(&mat, &rctx_ptr->camera->projection, &mat); + mat4_mul(&rend_group->mat_draw, &cam.get_view_mat(), &mat); + mat4_mul(&mat, &cam.get_proj_mat(), &mat); float_t emission = 1.0f; if (rend_group->flags & PARTICLE_EMISSION || rend_group->blend_mode == PARTICLE_BLEND_TYPICAL) diff --git a/src/CRE/Glitter/scene.cpp b/src/CRE/Glitter/scene.cpp index 74aaf840..e309ea3b 100644 --- a/src/CRE/Glitter/scene.cpp +++ b/src/CRE/Glitter/scene.cpp @@ -164,7 +164,7 @@ namespace Glitter { } } - void Scene::Disp(GPM, render_data_context& rend_data_ctx, DispType disp_type) { + void Scene::Disp(GPM, render_data_context& rend_data_ctx, DispType disp_type, const cam_data& cam) { if (flags & SCENE_NOT_DISP) return; @@ -174,7 +174,7 @@ namespace Glitter { && GPM_VAL->selected_effect != i.ptr->effect) continue; - i.ptr->Disp(GPM_VAL, rend_data_ctx, disp_type); + i.ptr->Disp(GPM_VAL, rend_data_ctx, disp_type, cam); } } diff --git a/src/CRE/effect.cpp b/src/CRE/effect.cpp index 7c920590..c9a9abbb 100644 --- a/src/CRE/effect.cpp +++ b/src/CRE/effect.cpp @@ -1414,14 +1414,14 @@ void snow_particle_draw(render_data_context& rend_data_ctx, const cam_data& cam) return; stage_param_snow* snow = stage_param_data_snow_current; + rend_data_ctx.set_batch_scene_camera(cam); rend_data_ctx.state.enable_blend(); rend_data_ctx.state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); rend_data_ctx.state.enable_depth_test(); rend_data_ctx.state.set_depth_mask(GL_FALSE); - float_t point_attenuation = powf(tanf((float_t)rctx_ptr->camera->get_fov() - * 0.5f * DEG_TO_RAD_FLOAT) * 3.4f, 2.0f) * 0.1f; + float_t point_attenuation = powf(tanf(cam.get_fov() * 0.5f) * 3.4f, 2.0f) * 0.1f; snow_particle_scene_shader_data snow_scene = {}; mat4 temp; @@ -1471,8 +1471,7 @@ void snow_particle_draw(render_data_context& rend_data_ctx, const cam_data& cam) rend_data_ctx.state.bind_uniform_buffer_base(0, snow_particle_scene_ubo); rend_data_ctx.state.bind_uniform_buffer_base(1, snow_particle_batch_ubo); - point_attenuation = powf(tanf((float_t)rctx_ptr->camera->get_fov() - * 0.5f * DEG_TO_RAD_FLOAT) * 3.4f, 2.0f) * 0.06f; + point_attenuation = powf(tanf(cam.get_fov() * 0.5f) * 3.4f, 2.0f) * 0.06f; snow_scene.g_state_point_attenuation = { 0.0f, 0.0f, point_attenuation, 0.0f }; snow_particle_scene_ubo.WriteMemory(rend_data_ctx.state, snow_scene); @@ -3152,6 +3151,7 @@ void EffectRipple::draw(render_data_context& rend_data_ctx, const cam_data& cam) 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()); diff --git a/src/CRE/mdl/disp_manager.cpp b/src/CRE/mdl/disp_manager.cpp index 8c317c65..3405c639 100644 --- a/src/CRE/mdl/disp_manager.cpp +++ b/src/CRE/mdl/disp_manager.cpp @@ -37,7 +37,7 @@ static const GLuint BONE_INDEX_INDEX = 15; static void object_data_get_vertex_attrib_buffer_bindings(const mdl::ObjSubMeshArgs* args, int32_t texcoord_array[2], GLuint vertex_attrib_buffer_binding[16]); -static void sub_140436760(); +static void sub_140436760(const cam_data& cam); material_list_struct::material_list_struct() : blend_color(), has_blend_color(), emission(), has_emission() { hash = (uint32_t)-1; @@ -2101,7 +2101,7 @@ namespace mdl { float_t alpha_threshold = 0.0f; bool reflect = rend_data_ctx.shader_flags.arr[U_REFLECT] == 1; void(*func)(render_data_context & rend_data_ctx, const ObjSubMeshArgs * args, - const cam_data & cam, const mat4* mat) = draw_sub_mesh_default; + const cam_data & cam, const mat4 * mat) = draw_sub_mesh_default; for (int32_t i = 0; i < 5; i++) rend_data_ctx.state.active_bind_texture_2d(i, rctx_ptr->empty_texture_2d->glid); @@ -3457,7 +3457,7 @@ namespace mdl { return; if (a3 && type == mdl::OBJ_TYPE_TRANSLUCENT) - sub_140436760(); + sub_140436760(cam); calc_obj_radius(cam, type); @@ -3703,10 +3703,7 @@ static void object_data_get_vertex_attrib_buffer_bindings(const mdl::ObjSubMeshA } } -static void sub_140436760() { - camera* cam = rctx_ptr->camera; - mat4* view = &cam->view; - +static void sub_140436760(const cam_data& cam) { for (auto& i : rctx_ptr->disp_manager->obj[mdl::OBJ_TYPE_TRANSLUCENT]) { if (i->kind != mdl::OBJ_KIND_NORMAL) continue; @@ -3738,7 +3735,7 @@ static void sub_140436760() { mat4 mat; mat4_mul_translate(&i->mat, &aabb->center, &mat); - mat4_mul(&mat, view, &mat); + mat4_mul(&mat, &cam.get_view_mat(), &mat); mat4_transpose(&mat, &mat); vec4 t; diff --git a/src/CRE/mdl/draw_object.cpp b/src/CRE/mdl/draw_object.cpp index 2c5cc72d..4ab0a1c6 100644 --- a/src/CRE/mdl/draw_object.cpp +++ b/src/CRE/mdl/draw_object.cpp @@ -14,21 +14,21 @@ static bool draw_object_blend_set(render_data_context& rend_data_ctx, static bool draw_object_blend_set_check_use_default_blend(int32_t index); static void draw_object_chara_color_fog_set(render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args, bool disable_fog); +static void draw_object_material_reset_cheap(render_data_context& rend_data_ctx); static void draw_object_material_reset_default( render_data_context& rend_data_ctx, const obj_material_data* mat_data); -static void draw_object_material_reset_cheap(render_data_context& rend_data_ctx); +static void draw_object_material_set_cheap( + render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args); static void draw_object_material_set_default(render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args, bool use_shader); static void draw_object_material_set_parameter( render_data_context& rend_data_ctx, const obj_material_data* mat_data); -static void draw_object_material_set_cheap( - render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args); static void draw_object_material_set_uniform(render_data_context& rend_data_ctx, const obj_material_data* mat_data, bool disable_color_l); -static void draw_object_vertex_attrib_reset_default( - render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args); static void draw_object_vertex_attrib_reset_cheap( render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args); +static void draw_object_vertex_attrib_reset_default( + render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args); static void draw_object_vertex_attrib_set_default( render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args); static void draw_object_vertex_attrib_set_cheap( @@ -188,9 +188,10 @@ namespace mdl { if (args->mats) { rend_data_ctx.set_skinning_data(rend_data_ctx.state, args->mats, args->mat_count); + rend_data_ctx.set_batch_worlds(mat4_identity); + rend_data_ctx.shader_flags.arr[U_SKINNING] = 1; rend_data_ctx.state.bind_vertex_array(vao); - rend_data_ctx.set_batch_worlds(mat4_identity); func(rend_data_ctx, args, cam, mat); rend_data_ctx.shader_flags.arr[U_SKINNING] = 0; } @@ -217,7 +218,6 @@ namespace mdl { void draw_sub_mesh_cheap(render_data_context& rend_data_ctx, const ObjSubMeshArgs* args, const cam_data& cam, const mat4* mat) { - const obj_material_data* material = args->material; draw_object_vertex_attrib_set_cheap(rend_data_ctx, args); obj_material_shader_lighting_type lighting_type @@ -245,7 +245,6 @@ namespace mdl { void draw_sub_mesh_cheap_reflect_map(render_data_context& rend_data_ctx, const ObjSubMeshArgs* args, const cam_data& cam, const mat4* mat) { - draw_object_vertex_attrib_set_cheap(rend_data_ctx, args); draw_object_material_set_cheap(rend_data_ctx, args); @@ -267,7 +266,6 @@ namespace mdl { void draw_sub_mesh_default(render_data_context& rend_data_ctx, const ObjSubMeshArgs* args, const cam_data& cam, const mat4* mat) { - if (args->set_blend_color) rend_data_ctx.set_batch_blend_color_offset_color(args->blend_color, 0.0f); @@ -297,7 +295,6 @@ namespace mdl { void draw_sub_mesh_default_instanced(render_data_context& rend_data_ctx, const ObjSubMeshArgs* args, const cam_data& cam, const mat4* mat) { - if (args->set_blend_color) rend_data_ctx.set_batch_blend_color_offset_color(args->blend_color, 0.0f); @@ -333,7 +330,6 @@ namespace mdl { void draw_sub_mesh_no_mat(render_data_context& rend_data_ctx, const ObjSubMeshArgs* args, const cam_data& cam, const mat4* mat) { - const obj_material_data* material = args->material; const std::vector* textures = args->textures; if (rctx_ptr->draw_state->rend_data[rend_data_ctx.index].shader_index != -1) { @@ -614,6 +610,12 @@ static void draw_object_chara_color_fog_set(render_data_context& rend_data_ctx, } } +static void draw_object_material_reset_cheap(render_data_context& rend_data_ctx) { + rend_data_ctx.state.active_bind_texture_2d(0, rctx_ptr->empty_texture_2d->glid); + rend_data_ctx.state.enable_cull_face(); + rend_data_ctx.reset_shader_flags(); +} + static void draw_object_material_reset_default( render_data_context& rend_data_ctx, const obj_material_data* mat_data) { if (mat_data) { @@ -625,10 +627,79 @@ static void draw_object_material_reset_default( rend_data_ctx.reset_shader_flags(); } -static void draw_object_material_reset_cheap(render_data_context& rend_data_ctx) { - rend_data_ctx.state.active_bind_texture_2d(0, rctx_ptr->empty_texture_2d->glid); - rend_data_ctx.state.enable_cull_face(); - rend_data_ctx.reset_shader_flags(); +static void draw_object_material_set_cheap( + render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args) { + const obj_material_data* material = args->material; + const std::vector* textures = args->textures; + if (material->material.attrib.m.double_sided) + rend_data_ctx.state.disable_cull_face(); + + const obj_material_texture_data* texdata = material->material.texdata; + for (int32_t i = 0; i < 1; i++, texdata++) { + uint32_t texture_id = texdata->tex_index; + if (texdata->tex_index == -1) + break; + + GLuint tex_id = -1; + for (int32_t j = 0; j < args->texture_pattern_count; j++) + if (args->texture_pattern_array[j].src == ::texture_id(0x00, texture_id)) { + texture* tex = texture_manager_get_texture(args->texture_pattern_array[j].dst); + if (tex) + tex_id = tex->glid; + break; + } + + if (tex_id == -1) + tex_id = (*textures)[texdata->texture_index]; + + if (tex_id == -1) + tex_id = rctx_ptr->empty_texture_2d->glid; + + rend_data_ctx.state.active_bind_texture_2d(i, tex_id); + + int32_t wrap_s; + if (texdata->attrib.m.mirror_u) + wrap_s = 2; + else if (texdata->attrib.m.repeat_u) + wrap_s = 1; + else + wrap_s = 0; + + int32_t wrap_t; + if (texdata->attrib.m.mirror_v) + wrap_t = 2; + else if (texdata->attrib.m.repeat_v) + wrap_t = 1; + else + wrap_t = 0; + + texture* tex = texture_manager_get_texture(texture_id); + rend_data_ctx.state.bind_sampler(i, rctx_ptr->samplers[(wrap_t * 3 + wrap_s) * 2 + + (!tex || tex->max_mipmap_level > 0 ? 1 : 0)]); + } + + vec4 ambient; + vec4 diffuse; + vec4 emission; + vec4 specular; + if (material->material.shader.index == -1) { + ambient = 1.0f; + diffuse = material->material.color.diffuse; + emission = 1.0f; + specular = material->material.color.specular; + } + else { + ambient = material->material.color.ambient; + diffuse = material->material.color.diffuse; + emission = args->emission; + specular = material->material.color.specular; + } + + draw_object_material_set_uniform(rend_data_ctx, material, true); + rend_data_ctx.set_shader(rctx_ptr->draw_state->rend_data[rend_data_ctx.index].shader_index); + rend_data_ctx.set_batch_material_color(diffuse, ambient, emission, + 0.0f, specular, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f); + draw_object_material_set_parameter(rend_data_ctx, args->material); } static void draw_object_material_set_default(render_data_context& rend_data_ctx, @@ -649,7 +720,8 @@ static void draw_object_material_set_default(render_data_context& rend_data_ctx, rend_data_ctx.shader_flags.arr[U_STAGE_SHADOW] = 1; rend_data_ctx.shader_flags.arr[U_CHARA_SHADOW2] = args->shadow > SHADOW_CHARA ? 1 : 0; - rend_data_ctx.shader_flags.arr[U_CHARA_SHADOW] = rctx_ptr->draw_state->rend_data[rend_data_ctx.index].self_shadow ? 1 : 0; + rend_data_ctx.shader_flags.arr[U_CHARA_SHADOW] + = rctx_ptr->draw_state->rend_data[rend_data_ctx.index].self_shadow ? 1 : 0; const obj_material_texture_data* texdata = material->material.texdata; for (int32_t i = 0, j = 0; i < 8; i++, texdata++) { @@ -884,81 +956,6 @@ static void draw_object_material_set_parameter( reflect_uv_scale, refract_uv_scale); } -static void draw_object_material_set_cheap( - render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args) { - const obj_material_data* material = args->material; - const std::vector* textures = args->textures; - if (material->material.attrib.m.double_sided) - rend_data_ctx.state.disable_cull_face(); - - const obj_material_texture_data* texdata = material->material.texdata; - for (int32_t i = 0; i < 1; i++, texdata++) { - uint32_t texture_id = texdata->tex_index; - if (texdata->tex_index == -1) - break; - - GLuint tex_id = -1; - for (int32_t j = 0; j < args->texture_pattern_count; j++) - if (args->texture_pattern_array[j].src == ::texture_id(0x00, texture_id)) { - texture* tex = texture_manager_get_texture(args->texture_pattern_array[j].dst); - if (tex) - tex_id = tex->glid; - break; - } - - if (tex_id == -1) - tex_id = (*textures)[texdata->texture_index]; - - if (tex_id == -1) - tex_id = rctx_ptr->empty_texture_2d->glid; - - rend_data_ctx.state.active_bind_texture_2d(i, tex_id); - - int32_t wrap_s; - if (texdata->attrib.m.mirror_u) - wrap_s = 2; - else if (texdata->attrib.m.repeat_u) - wrap_s = 1; - else - wrap_s = 0; - - int32_t wrap_t; - if (texdata->attrib.m.mirror_v) - wrap_t = 2; - else if (texdata->attrib.m.repeat_v) - wrap_t = 1; - else - wrap_t = 0; - - texture* tex = texture_manager_get_texture(texture_id); - rend_data_ctx.state.bind_sampler(i, rctx_ptr->samplers[(wrap_t * 3 + wrap_s) * 2 - + (!tex || tex->max_mipmap_level > 0 ? 1 : 0)]); - } - - vec4 ambient; - vec4 diffuse; - vec4 emission; - vec4 specular; - if (material->material.shader.index == -1) { - ambient = 1.0f; - diffuse = material->material.color.diffuse; - emission = 1.0f; - specular = material->material.color.specular; - } - else { - ambient = material->material.color.ambient; - diffuse = material->material.color.diffuse; - emission = args->emission; - specular = material->material.color.specular; - } - - draw_object_material_set_uniform(rend_data_ctx, material, true); - rend_data_ctx.set_shader(rctx_ptr->draw_state->rend_data[rend_data_ctx.index].shader_index); - rend_data_ctx.set_batch_material_color(diffuse, ambient, emission, - 0.0f, specular, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f); - draw_object_material_set_parameter(rend_data_ctx, args->material); -} - static void draw_object_material_set_uniform(render_data_context& rend_data_ctx, const obj_material_data* mat_data, bool disable_color_l) { obj_shader_compo_member shader_compo = mat_data->material.shader_compo.m; @@ -1013,6 +1010,22 @@ static void draw_object_material_set_uniform(render_data_context& rend_data_ctx, rend_data_ctx.shader_flags.arr[U45] = 1; } +static void draw_object_vertex_attrib_reset_cheap( + render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args) { + const obj_mesh* mesh = args->mesh; + obj_vertex_format vertex_format = mesh->vertex_format; + + if (vertex_format & OBJ_VERTEX_BONE_DATA) + rend_data_ctx.shader_flags.arr[U_SKINNING] = 0; + + if (args->morph_vertex_buffer) { + rend_data_ctx.shader_flags.arr[U_MORPH] = 0; + rend_data_ctx.shader_flags.arr[U_MORPH_COLOR] = 0; + } + + rend_data_ctx.state.active_texture(0); +} + static void draw_object_vertex_attrib_reset_default( render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args) { const obj_mesh* mesh = args->mesh; @@ -1032,20 +1045,48 @@ static void draw_object_vertex_attrib_reset_default( rend_data_ctx.state.active_texture(0); } -static void draw_object_vertex_attrib_reset_cheap( +static void draw_object_vertex_attrib_set_cheap( render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args) { const obj_mesh* mesh = args->mesh; obj_vertex_format vertex_format = mesh->vertex_format; + mat4 mats[2]; + mats[0] = mat4_identity; + mats[1] = mat4_identity; + const obj_material_data* material = args->material; + if (material->material.texdata[0].tex_index != -1) { + uint32_t tex_index = material->material.texdata[0].tex_index; + + mats[0] = material->material.texdata[0].tex_coord_mat; + if (material->material.texdata[0].shader_info.m.tex_type == OBJ_MATERIAL_TEXTURE_COLOR) + for (int32_t j = 0; j < args->texture_transform_count; j++) + if (args->texture_transform_array[j].id == tex_index) { + mats[0] = args->texture_transform_array[j].mat; + break; + } + } + + rend_data_ctx.set_batch_texcoord_transforms(mats); + if (vertex_format & OBJ_VERTEX_BONE_DATA) + rend_data_ctx.shader_flags.arr[U_SKINNING] = 1; + else rend_data_ctx.shader_flags.arr[U_SKINNING] = 0; if (args->morph_vertex_buffer) { + rend_data_ctx.shader_flags.arr[U_MORPH] = 1; + + if (vertex_format & OBJ_VERTEX_COLOR0) + rend_data_ctx.shader_flags.arr[U_MORPH_COLOR] = 1; + else + rend_data_ctx.shader_flags.arr[U_MORPH_COLOR] = 0; + + rend_data_ctx.set_batch_morph_weight(args->morph_weight); + } + else { rend_data_ctx.shader_flags.arr[U_MORPH] = 0; rend_data_ctx.shader_flags.arr[U_MORPH_COLOR] = 0; } - - rend_data_ctx.state.active_texture(0); } static void draw_object_vertex_attrib_set_default( @@ -1115,47 +1156,3 @@ static void draw_object_vertex_attrib_set_default( else rend_data_ctx.shader_flags.arr[U_INSTANCE] = 0;*/ } - -static void draw_object_vertex_attrib_set_cheap( - render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args) { - const obj_mesh* mesh = args->mesh; - obj_vertex_format vertex_format = mesh->vertex_format; - - mat4 mats[2]; - mats[0] = mat4_identity; - mats[1] = mat4_identity; - const obj_material_data* material = args->material; - if (material->material.texdata[0].tex_index != -1) { - uint32_t tex_index = material->material.texdata[0].tex_index; - - mats[0] = material->material.texdata[0].tex_coord_mat; - if (material->material.texdata[0].shader_info.m.tex_type == OBJ_MATERIAL_TEXTURE_COLOR) - for (int32_t j = 0; j < args->texture_transform_count; j++) - if (args->texture_transform_array[j].id == tex_index) { - mats[0] = args->texture_transform_array[j].mat; - break; - } - } - - rend_data_ctx.set_batch_texcoord_transforms(mats); - - if (vertex_format & OBJ_VERTEX_BONE_DATA) - rend_data_ctx.shader_flags.arr[U_SKINNING] = 1; - else - rend_data_ctx.shader_flags.arr[U_SKINNING] = 0; - - if (args->morph_vertex_buffer) { - rend_data_ctx.shader_flags.arr[U_MORPH] = 1; - - if (vertex_format & OBJ_VERTEX_COLOR0) - rend_data_ctx.shader_flags.arr[U_MORPH_COLOR] = 1; - else - rend_data_ctx.shader_flags.arr[U_MORPH_COLOR] = 0; - - rend_data_ctx.set_batch_morph_weight(args->morph_weight); - } - else { - rend_data_ctx.shader_flags.arr[U_MORPH] = 0; - rend_data_ctx.shader_flags.arr[U_MORPH_COLOR] = 0; - } -} diff --git a/src/CRE/render.cpp b/src/CRE/render.cpp index 860f5f6c..db215b99 100644 --- a/src/CRE/render.cpp +++ b/src/CRE/render.cpp @@ -403,7 +403,7 @@ namespace rndr { if (!tex) return; - float_t v5 = tanf(cam.get_fov() * 0.5f); + float_t v5 = tanf(cam.get_fov() * 0.5f * DEG_TO_RAD_FLOAT); light_set* set = &rctx_ptr->light_set[LIGHT_SET_MAIN]; light_data* data = &set->lights[LIGHT_SUN]; @@ -1104,6 +1104,12 @@ namespace rndr { rend_data_ctx.state.bind_framebuffer(0); } } + + for (int32_t i = 0; i < GL_REND_STATE_COUNT; i++) { + render_data_context rend_data_ctx((gl_rend_state_index)i); + rend_data_ctx.set_scene_framebuffer_size( + render_width[0], render_height[0], render_width[0], render_height[0]); + } } int32_t Render::render_texture_set(texture* render_texture, bool task_photo) { @@ -1196,7 +1202,6 @@ namespace rndr { gl_state.bind_texture_2d(rend_texture[0].GetDepthTex()); 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); for (int32_t i = 0; i < 3; i++) { texture_id id = taa_tex[i]->id; @@ -1226,8 +1231,6 @@ namespace rndr { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); } - gl_state.bind_texture_2d(0); - dof->resize(render_post_width[0], render_post_height[0]); for (int32_t i = 0; i < 1; i++) { @@ -1543,6 +1546,12 @@ namespace rndr { render_post_width_scale = (float_t)render_width[0] / (float_t)render_post_width[0]; render_post_height_scale = (float_t)render_height[0] / (float_t)render_post_height[0]; + for (int32_t i = 0; i < GL_REND_STATE_COUNT; i++) { + render_data_context rend_data_ctx((gl_rend_state_index)i); + rend_data_ctx.set_scene_framebuffer_size( + render_width[0], render_height[0], render_width[0], render_height[0]); + } + taa_blend = -1.0f; } @@ -1604,7 +1613,7 @@ namespace rndr { rend_data_ctx.state.begin_event("PostProcess::tone_map"); - update_tone_map_lut(); + update_tone_map_lut(rend_data_ctx.state); rend_data_ctx.shader_flags.arr[U_TONE_MAP] = (int32_t)tone_map; rend_data_ctx.shader_flags.arr[U_FLARE] = 0; @@ -1857,11 +1866,9 @@ namespace rndr { rend_data_ctx.state.active_bind_texture_2d(0, exposure_history->glid); if (reset_exposure) - rend_data_ctx.state.copy_tex_sub_image_2d(GL_TEXTURE_2D, - 0, 0, 0, 0, 0, 32, 1); + rend_data_ctx.state.copy_tex_sub_image_2d(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 32, 1); else - rend_data_ctx.state.copy_tex_sub_image_2d(GL_TEXTURE_2D, - 0, exposure_history_counter, 0, 0, 0, 1, 1); + rend_data_ctx.state.copy_tex_sub_image_2d(GL_TEXTURE_2D, 0, exposure_history_counter, 0, 0, 0, 1, 1); exposure_history_counter = (exposure_history_counter + 1) % 32; } @@ -2145,7 +2152,7 @@ namespace rndr { reduce_tex_draw = reduce_tex[0]->glid; } - void Render::update_tone_map_lut() { + void Render::update_tone_map_lut(p_gl_rend_state& p_gl_rend_st) { if (!update_lut) return; @@ -2181,7 +2188,7 @@ namespace rndr { glTextureSubImage2D(tonemap_lut_texture, 0, 0, 0, 16 * TONE_MAP_SAT_GAMMA_SAMPLES, 1, GL_RG, GL_FLOAT, tex_data); else { - gl_state.bind_texture_2d(tonemap_lut_texture); + p_gl_rend_st.bind_texture_2d(tonemap_lut_texture); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 16 * TONE_MAP_SAT_GAMMA_SAMPLES, 1, GL_RG, GL_FLOAT, tex_data); } diff --git a/src/CRE/render.hpp b/src/CRE/render.hpp index 1dae503f..76cfd63f 100644 --- a/src/CRE/render.hpp +++ b/src/CRE/render.hpp @@ -266,7 +266,8 @@ namespace rndr { void update_res(bool set, int32_t base_downsample); private: - void apply_mlaa(render_data_context& rend_data_ctx, int32_t destination, int32_t source, int32_t ss_alpha_mask); + void apply_mlaa(render_data_context& rend_data_ctx, + int32_t destination, int32_t source, int32_t ss_alpha_mask); void apply_tone_map(render_data_context& rend_data_ctx, texture* light_proj_tex, int32_t npr_param); void calc_exposure(render_data_context& rend_data_ctx, const cam_data& cam); void calc_gaussian_blur(render_data_context& rend_data_ctx, float_t start, float_t step, @@ -278,7 +279,7 @@ namespace rndr { void downsample(render_data_context& rend_data_ctx); void generate_mlaa_area_texture(); void get_blur(render_data_context& rend_data_ctx); - void update_tone_map_lut(); + void update_tone_map_lut(p_gl_rend_state& p_gl_rend_st); }; } diff --git a/src/CRE/render_manager.cpp b/src/CRE/render_manager.cpp index a6a7d012..d9964ea6 100644 --- a/src/CRE/render_manager.cpp +++ b/src/CRE/render_manager.cpp @@ -39,7 +39,8 @@ static void draw_pass_shadow_filter(render_data_context& rend_data_ctx, static void draw_pass_shadow_esm_filter(render_data_context& rend_data_ctx, RenderTexture* dst, RenderTexture* buf, RenderTexture* src); static bool draw_pass_shadow_litproj(render_data_context& rend_data_ctx, light_proj* litproj, cam_data& cam); -static void draw_pass_sss_contour(render_data_context& rend_data_ctx, render_context* rctx, rndr::Render* rend); +static void draw_pass_sss_contour(render_data_context& rend_data_ctx, + render_context* rctx, rndr::Render* rend, cam_data& cam); static void draw_pass_sss_filter(render_data_context& rend_data_ctx, render_context* rctx, sss_data* sss); static int32_t draw_pass_3d_get_translucent_count(render_context* rctx); static void draw_pass_3d_shadow_reset(render_data_context& rend_data_ctx, render_context* rctx); @@ -290,17 +291,12 @@ namespace rndr { gl_state.get(); sprite_manager_pre_draw(); - static const vec4 color_clear = 0.0f; - { render_data_context rend_data_ctx(GL_REND_STATE_PRE_3D); rend_data_ctx.state.get(); rend_data_ctx.state.bind_framebuffer(0); + static const vec4 color_clear = 0.0f; rend_data_ctx.state.clear_buffer(GL_COLOR, 0, (float_t*)&color_clear); - - rend_data_ctx.set_scene_framebuffer_size(render->render_width[0], - render->render_height[0], render->render_width[0], render->render_height[0]); - rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); rend_data_ctx.state.enable_depth_test(); rend_data_ctx.state.set_depth_func(GL_LEQUAL); @@ -573,7 +569,7 @@ namespace rndr { if (npr_param == 1) { if (sss->enable && sss->npr_contour) { rend_data_ctx.shader_flags.arr[U_NPR] = 1; - draw_pass_sss_contour(rend_data_ctx, rctx, rend); + draw_pass_sss_contour(rend_data_ctx, rctx, rend, reflect_cam); } else if (npr) { refl_tex.Bind(rend_data_ctx.state); @@ -587,7 +583,7 @@ namespace rndr { rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = -1; rend_data_ctx.state.bind_framebuffer(0); rend_data_ctx.shader_flags.arr[U_NPR] = 1; - draw_pass_sss_contour(rend_data_ctx, rctx, rend); + draw_pass_sss_contour(rend_data_ctx, rctx, rend, reflect_cam); } } @@ -626,8 +622,7 @@ namespace rndr { //if (sss->npr_contour) { rend->rend_texture[0].Bind(rend_data_ctx.state); - rend_data_ctx.state.set_viewport(0, 0, - rend->rend_texture[0].GetWidth(), rend->rend_texture[0].GetHeight()); + rend->rend_texture[0].SetViewport(rend_data_ctx.state); //} //else { // sss->textures[0].Bind(rend_data_ctx.state); @@ -660,7 +655,7 @@ namespace rndr { if (npr_param == 1) { if (sss->enable && sss->npr_contour) { rend_data_ctx.shader_flags.arr[U_NPR] = 1; - draw_pass_sss_contour(rend_data_ctx, rctx, rend); + draw_pass_sss_contour(rend_data_ctx, rctx, rend, cam); } else if (npr) { rend->rend_texture[0].Bind(rend_data_ctx.state); @@ -674,7 +669,7 @@ namespace rndr { rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = -1; rend_data_ctx.state.bind_framebuffer(0); rend_data_ctx.shader_flags.arr[U_NPR] = 1; - draw_pass_sss_contour(rend_data_ctx, rctx, rend); + draw_pass_sss_contour(rend_data_ctx, rctx, rend, cam); } } @@ -764,10 +759,6 @@ namespace rndr { reflect_draw = true; rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = -1; - int32_t render_width = refl_tex.GetWidth(); - int32_t render_height = refl_tex.GetHeight(); - rend_data_ctx.set_scene_framebuffer_size(render_width, render_height, render_width, render_height); - if (shadow) draw_pass_3d_shadow_set(rend_data_ctx, shadow_ptr, rctx); else @@ -816,9 +807,6 @@ namespace rndr { if (shadow) draw_pass_3d_shadow_reset(rend_data_ctx, rctx); - - rend_data_ctx.set_scene_framebuffer_size(render->render_width[0], - render->render_height[0], render->render_width[0], render->render_height[0]); reflect_draw = false; } else if (reflect_type == STAGE_DATA_REFLECT_REFLECT_MAP) { @@ -856,8 +844,8 @@ namespace rndr { 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)) { - texture* refr_tex = refract_texture.color_texture; - rend_data_ctx.state.set_viewport(0, 0, refr_tex->width, refr_tex->height); + refract_texture.SetViewport(rend_data_ctx.state); + rend_data_ctx.set_batch_scene_camera(cam); for (int32_t i = LIGHT_SET_MAIN; i < LIGHT_SET_MAX; i++) rctx->light_set[i].data_set(rend_data_ctx, rctx->face, (light_set_id)i); @@ -1047,7 +1035,7 @@ namespace rndr { rend_data_ctx.state.disable_depth_test(); } - Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_OPAQUE); + Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_OPAQUE, cam); rend_data_ctx.state.enable_depth_test(); rend_data_ctx.state.set_depth_mask(GL_TRUE); @@ -1076,13 +1064,13 @@ namespace rndr { rend_data_ctx.state.disable_depth_test(); rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); - Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_ALPHA); + Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_ALPHA, cam); rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); /*if (npr_param == 1) { rend_data_ctx.state.set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE); - glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - glClear(GL_COLOR_BUFFER_BIT); + 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_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); }*/ @@ -1098,7 +1086,7 @@ namespace rndr { } rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); // X - Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_TYPE_2); + Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_TYPE_2, cam); rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); rend_data_ctx.state.set_depth_mask(GL_TRUE); @@ -1109,7 +1097,7 @@ namespace rndr { rend_data_ctx.state.disable_depth_test(); rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); - Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_NORMAL); + Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_NORMAL, cam); rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); rend_data_ctx.state.enable_depth_test(); @@ -1124,6 +1112,8 @@ namespace rndr { cam_data local_cam = cam; local_cam.set_fov(32.2673416137695f); + local_cam.calc_persp_proj_mat_offset(1.0f, rctx->render.get_taa_offset()); + local_cam.calc_view_proj_mat(); rend_data_ctx.set_batch_scene_camera(local_cam); if (alpha_z_sort) @@ -1139,7 +1129,7 @@ namespace rndr { rend_data_ctx.state.disable_blend(); rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); - Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_LOCAL); + Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_LOCAL, local_cam); rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); rend_data_ctx.state.end_event(); @@ -1253,8 +1243,8 @@ namespace rndr { rctx->quad_ubo.WriteMemory(rend_data_ctx.state, quad_data); contour_params_shader_data contour_params_data = {}; - const float_t max_distance = rctx->camera->max_distance; - const float_t min_distance = rctx->camera->min_distance; + const float_t max_distance = cam.get_max_distance(); + const float_t min_distance = cam.get_min_distance(); contour_params_data.g_near_far = { (float_t)(max_distance / (max_distance - min_distance)), (float_t)(-(max_distance * min_distance) / (max_distance - min_distance)), @@ -1302,7 +1292,8 @@ namespace rndr { } } -void image_filter_scale(render_data_context& rend_data_ctx, RenderTexture* dst, texture* src, const vec4& scale) { +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) return; @@ -1421,7 +1412,6 @@ static void draw_pass_shadow_end_make_shadowmap(Shadow* shad, RenderTexture* rend_tex = shad->curr_render_textures[1 + index]; RenderTexture& rend_buf_tex = rctx_ptr->shadow_buffer; - rend_tex->Bind(rend_data_ctx.state); image_filter_scale(rend_data_ctx, rend_tex, shad->curr_render_textures[0]->color_texture); @@ -1592,7 +1582,8 @@ static bool draw_pass_shadow_litproj(render_data_context& rend_data_ctx, light_p return true; } -static void draw_pass_sss_contour(render_data_context& rend_data_ctx, render_context* rctx, rndr::Render* rend) { +static void draw_pass_sss_contour(render_data_context& rend_data_ctx, + render_context* rctx, rndr::Render* rend, cam_data& cam) { if (reflect_draw) rctx->reflect_buffer.Bind(rend_data_ctx.state); else @@ -1618,10 +1609,9 @@ static void draw_pass_sss_contour(render_data_context& rend_data_ctx, render_con } rend_data_ctx.state.active_texture(0); - camera* cam = rctx->camera; - float_t v3 = 1.0f / tanf(cam->fov * 0.5f * DEG_TO_RAD_FLOAT); + float_t v3 = 1.0f / tanf(cam.get_fov() * 0.5f); - vec3 direction = cam->interest - cam->view_point; + vec3 direction = cam.get_interest() - cam.get_view_point(); float_t length = vec3::length(direction); float_t v7 = direction.y; if (length != 0.0f) @@ -1633,8 +1623,8 @@ static void draw_pass_sss_contour(render_data_context& rend_data_ctx, render_con contour_coef_shader_data shader_data = {}; shader_data.g_contour = { v9 * 0.004f + 0.0027f, 0.003f, v3 * 0.35f, 0.0008f }; - const float_t max_distance = rctx->camera->max_distance; - const float_t min_distance = rctx->camera->min_distance; + const float_t max_distance = cam.get_max_distance(); + const float_t min_distance = cam.get_min_distance(); shader_data.g_near_far = { (float_t)(max_distance / (max_distance - min_distance)), (float_t)(-(max_distance * min_distance) / (max_distance - min_distance)), @@ -2007,10 +1997,6 @@ static void draw_pass_reflect_full(render_data_context& rend_data_ctx, rndr::Ren reflect_draw = true; rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = -1; - int32_t render_width = refl_tex.GetWidth(); - int32_t render_height = refl_tex.GetHeight(); - rend_data_ctx.set_scene_framebuffer_size(render_width, render_height, render_width, render_height); - if (render_manager->shadow) draw_pass_3d_shadow_set(rend_data_ctx, render_manager->shadow_ptr, rctx); else @@ -2052,7 +2038,7 @@ static void draw_pass_reflect_full(render_data_context& rend_data_ctx, rndr::Ren rend_data_ctx.state.disable_depth_test(); } - Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_OPAQUE); + Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_OPAQUE, cam); rend_data_ctx.state.enable_depth_test(); rend_data_ctx.state.set_depth_mask(GL_TRUE); @@ -2067,13 +2053,13 @@ static void draw_pass_reflect_full(render_data_context& rend_data_ctx, rndr::Ren rend_data_ctx.state.disable_depth_test(); rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); - Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_ALPHA); + Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_ALPHA, cam); rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); /*if (npr_param == 1) { rend_data_ctx.state.set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE); - glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - glClear(GL_COLOR_BUFFER_BIT); + 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_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); }*/ @@ -2090,12 +2076,12 @@ static void draw_pass_reflect_full(render_data_context& rend_data_ctx, rndr::Ren } rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); // X - Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_TYPE_2); + Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_TYPE_2, cam); rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); rend_data_ctx.state.disable_depth_test(); rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); - Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_NORMAL); + Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_NORMAL, cam); rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); rend_data_ctx.state.active_bind_texture_2d(14, 0); @@ -2103,10 +2089,6 @@ static void draw_pass_reflect_full(render_data_context& rend_data_ctx, rndr::Ren if (render_manager->shadow) draw_pass_3d_shadow_reset(rend_data_ctx, rctx); - - rndr::Render* render = render_manager->render; - rend_data_ctx.set_scene_framebuffer_size(render->render_width[0], - render->render_height[0], render->render_width[0], render->render_height[0]); reflect_draw = false; rend_data_ctx.state.set_cull_face_mode(GL_BACK); diff --git a/src/CRE/renderer/transparency.cpp b/src/CRE/renderer/transparency.cpp index 7e142f94..44ef1f98 100644 --- a/src/CRE/renderer/transparency.cpp +++ b/src/CRE/renderer/transparency.cpp @@ -81,8 +81,8 @@ namespace renderer { shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); rend_data_ctx.state.active_bind_texture_2d(0, texture); rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[1]); - rctx_ptr->render.draw_quad(rend_data_ctx, fbo.width, fbo.height, 1.0f, 1.0f, - 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + rctx_ptr->render.draw_quad(rend_data_ctx, fbo.width, fbo.height, + 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); rend_data_ctx.state.enable_depth_test(); } } diff --git a/src/CRE/sprite.cpp b/src/CRE/sprite.cpp index de2822b2..3b4be72e 100644 --- a/src/CRE/sprite.cpp +++ b/src/CRE/sprite.cpp @@ -191,8 +191,8 @@ namespace spr { spr::SprArgsInner& args_inner, std::vector& draw_param_buffer, std::vector& vertex_buffer, std::vector& index_buffer); static void draw_sprite(render_data_context& rend_data_ctx, - spr::SpriteManager* sprite_manager, const SprArgs& args, - const mat4& mat, int32_t x_min, int32_t y_min, int32_t x_max, int32_t y_max, texture* overlay_tex); + spr::SpriteManager* sprite_manager, const SprArgs& args, const mat4& mat, + int32_t x_min, int32_t y_min, int32_t x_max, int32_t y_max, texture* overlay_tex); static void draw_sprite_begin(render_data_context& rend_data_ctx); static void draw_sprite_copy_overlay_texture( render_data_context& rend_data_ctx, const SprArgs& args, const mat4& mat, const vec3* vtx, diff --git a/src/KKdLib/vec.cpp b/src/KKdLib/vec.cpp index d5259104..fa20ba3f 100644 --- a/src/KKdLib/vec.cpp +++ b/src/KKdLib/vec.cpp @@ -9,7 +9,7 @@ const __m128 vec2_neg = { -0.0f, -0.0f, 0.0f, 0.0f }; const __m128 vec3_neg = { -0.0f, -0.0f, -0.0f, 0.0f }; const __m128 vec4_neg = { -0.0f, -0.0f, -0.0f, -0.0f }; -extern const __m128d vec2d_neg = { -0.0, -0.0f }; +const __m128d vec2d_neg = { -0.0, -0.0f }; const __m128i vec2i_abs = { (char)0xFF, (char)0xFF, (char)0xFF, (char)0x7F,