From 1cd4f8e39d27741bfdaea6beeb237e64491e4985 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Thu, 29 Aug 2024 10:01:44 +0300 Subject: [PATCH] `Glitter`: Fixed `Local` particles --- src/CRE/Glitter/emitter_inst.cpp | 16 ++++--- src/CRE/Glitter/glitter.hpp | 12 ----- src/CRE/Glitter/particle_manager.cpp | 23 +--------- src/CRE/Glitter/render_scene.cpp | 60 ++++++++++++------------- src/ReDIVA/data_edit/glitter_editor.cpp | 16 +++---- 5 files changed, 46 insertions(+), 81 deletions(-) diff --git a/src/CRE/Glitter/emitter_inst.cpp b/src/CRE/Glitter/emitter_inst.cpp index 3bdf0170..4648fc36 100644 --- a/src/CRE/Glitter/emitter_inst.cpp +++ b/src/CRE/Glitter/emitter_inst.cpp @@ -6,6 +6,8 @@ #include "glitter.hpp" #include "../render_context.hpp" +extern render_context* rctx_ptr; + namespace Glitter { EmitterInst::EmitterInst(Emitter* emit, Random* random) : emission_timer(), flags(), random() { emitter = emit; @@ -146,7 +148,7 @@ namespace Glitter { mat4 dir_mat; switch (data.direction) { case DIRECTION_BILLBOARD: - mat4_from_mat3(&GPM_VAL->cam.inv_view_mat3, &dir_mat); + mat4_from_mat3(&rctx_ptr->camera->inv_view_mat3, &dir_mat); mat4_mul(&eff_inst->mat, &dir_mat, &dir_mat); mat4_clear_trans(&dir_mat, &dir_mat); break; @@ -160,7 +162,7 @@ namespace Glitter { mat4_rotate_z((float_t)-M_PI_2, &dir_mat); break; case DIRECTION_BILLBOARD_Y_AXIS: - mat4_rotate_y(GPM_VAL->cam.rotation_y, &dir_mat); + mat4_rotate_y(rctx_ptr->camera->rotation.y, &dir_mat); break; default: mult = false; @@ -565,7 +567,7 @@ namespace Glitter { switch (data.direction) { case DIRECTION_BILLBOARD: { if (eff_inst->data.flags & EFFECT_LOCAL) { - dir_mat = GPM_VAL->cam.view; + dir_mat = rctx_ptr->camera->view; mat4_clear_trans(&dir_mat, &dir_mat); mat4_mul(&dir_mat, &mat, &dir_mat); } @@ -573,7 +575,7 @@ namespace Glitter { dir_mat = mat; mat4 inv_view_mat; - mat4_from_mat3(&GPM_VAL->cam.inv_view_mat3, &inv_view_mat); + mat4_from_mat3(&rctx_ptr->camera->inv_view_mat3, &inv_view_mat); mat4_mul(&dir_mat, &inv_view_mat, &dir_mat); mat4_clear_trans(&dir_mat, &dir_mat); } break; @@ -584,7 +586,7 @@ namespace Glitter { mat4_rotate_x((float_t)-M_PI_2, &dir_mat); break; case DIRECTION_BILLBOARD_Y_AXIS: - mat4_rotate_y(GPM_VAL->cam.rotation_y, &dir_mat); + mat4_rotate_y(rctx_ptr->camera->rotation.y, &dir_mat); break; default: mult = false; @@ -679,7 +681,7 @@ namespace Glitter { mat4 dir_mat; switch (data.direction) { case DIRECTION_BILLBOARD: { - mat4_from_mat3(&GPM_VAL->cam.inv_view_mat3, &dir_mat); + mat4_from_mat3(&rctx_ptr->camera->inv_view_mat3, &dir_mat); mat4_mul(&dir_mat, &mat, &dir_mat); mat4_clear_trans(&dir_mat, &dir_mat); } break; @@ -690,7 +692,7 @@ namespace Glitter { mat4_rotate_x((float_t)-M_PI_2, &dir_mat); break; case DIRECTION_BILLBOARD_Y_AXIS: - mat4_rotate_y(GPM_VAL->cam.rotation_y, &dir_mat); + mat4_rotate_y(rctx_ptr->camera->rotation.y, &dir_mat); break; default: mult = false; diff --git a/src/CRE/Glitter/glitter.hpp b/src/CRE/Glitter/glitter.hpp index 13a69503..6f3b3133 100644 --- a/src/CRE/Glitter/glitter.hpp +++ b/src/CRE/Glitter/glitter.hpp @@ -500,17 +500,6 @@ namespace Glitter { vec4 color; }; - struct Camera { - mat4 projection; - mat4 view; - mat4 inv_view; - mat3 inv_view_mat3; - vec3 view_point; - float_t rotation_y; - - Camera(); - }; - struct Curve { struct Key { KeyType type; @@ -1644,7 +1633,6 @@ namespace Glitter { Particle* selected_particle; void* bone_data; FrameRateControl* frame_rate; - Camera cam; ParticleManagerFlag flags; int32_t scene_load_counter; int32_t init_buffers_base; diff --git a/src/CRE/Glitter/particle_manager.cpp b/src/CRE/Glitter/particle_manager.cpp index a25704b2..db570ff7 100644 --- a/src/CRE/Glitter/particle_manager.cpp +++ b/src/CRE/Glitter/particle_manager.cpp @@ -14,14 +14,9 @@ namespace Glitter { Random random; Counter counter; - Camera::Camera() : rotation_y() { - - } - GltParticleManager::GltParticleManager() : selected_effect_group(), selected_effect(), selected_emitter(), selected_particle(), - bone_data(), frame_rate(), cam(), flags(), - scene_load_counter(), texture_counter(), draw_selected() { + bone_data(), frame_rate(), flags(), scene_load_counter(), texture_counter(), draw_selected() { init_buffers_base = 5; init_buffers = 5; init_delta_frame_base = 20.0f; @@ -233,14 +228,6 @@ namespace Glitter { } void GltParticleManager::CtrlScenes() { - camera* c = rctx_ptr->camera; - cam.projection = c->projection; - cam.view = c->view; - cam.inv_view = c->inv_view; - cam.inv_view_mat3 = c->inv_view_mat3; - cam.view_point = c->view_point; - cam.rotation_y = c->rotation.y; - for (auto i = scenes.begin(); i != scenes.end();) { Scene* scene = *i; @@ -280,14 +267,6 @@ namespace Glitter { if (flags & PARTICLE_MANAGER_NOT_DISP) return; - camera* c = rctx_ptr->camera; - cam.projection = c->projection; - cam.view = c->view; - cam.inv_view = c->inv_view; - cam.inv_view_mat3 = c->inv_view_mat3; - cam.view_point = c->view_point; - cam.rotation_y = c->rotation.y; - for (Scene*& i : scenes) { if (!i || draw_selected && selected_effect_group && selected_effect_group != i->effect_group) diff --git a/src/CRE/Glitter/render_scene.cpp b/src/CRE/Glitter/render_scene.cpp index 2f0329d7..69925e1b 100644 --- a/src/CRE/Glitter/render_scene.cpp +++ b/src/CRE/Glitter/render_scene.cpp @@ -322,9 +322,9 @@ namespace Glitter { vec3 x_vec = { 1.0f, 0.0f, 0.0f }; if (rend_group->flags & PARTICLE_LOCAL) { mat4 mat; - mat4_mul(&GPM_VAL->cam.inv_view, &rend_group->mat, &mat); - mat4_mul(&GPM_VAL->cam.view, &mat, &mat); - mat4_mul(&mat, &GPM_VAL->cam.inv_view, &rend_group->mat_draw); + mat4_mul(&rctx_ptr->camera->inv_view, &rend_group->mat, &mat); + mat4_mul(&rctx_ptr->camera->view, &mat, &mat); + mat4_mul(&mat, &rctx_ptr->camera->inv_view, &rend_group->mat_draw); } else rend_group->mat_draw = mat4_identity; @@ -351,7 +351,7 @@ namespace Glitter { else model_mat = mat3_identity; - mat3_transform_vector(&GPM_VAL->cam.inv_view_mat3, &x_vec, &x_vec); + mat3_transform_vector(&rctx_ptr->camera->inv_view_mat3, &x_vec, &x_vec); Buffer* buf = (Buffer*)rend_group->vbo.MapMemory(); if (!buf) @@ -452,13 +452,13 @@ namespace Glitter { if (rend_group->flags & PARTICLE_EMITTER_LOCAL) { model_mat = rend_group->mat; mat4_normalize_rotation(&model_mat, &view_mat); - mat4_mul(&view_mat, &GPM_VAL->cam.view, &view_mat); + mat4_mul(&view_mat, &rctx_ptr->camera->view, &view_mat); mat4_invert(&view_mat, &inv_view_mat); } else { model_mat = mat4_identity; - view_mat = GPM_VAL->cam.view; - inv_view_mat = GPM_VAL->cam.inv_view; + view_mat = rctx_ptr->camera->view; + inv_view_mat = rctx_ptr->camera->inv_view; } if (rend_group->flags & PARTICLE_LOCAL) { @@ -467,7 +467,7 @@ namespace Glitter { mat4_invert(&view_mat, &inv_view_mat); } - mat4_mul(&view_mat, &GPM_VAL->cam.inv_view, &rend_group->mat_draw); + mat4_mul(&view_mat, &rctx_ptr->camera->inv_view, &rend_group->mat_draw); mat4 dir_mat; switch (rend_group->draw_type) { @@ -497,7 +497,7 @@ namespace Glitter { mat4_rotate_z((float_t)-M_PI_2, &dir_mat); break; case DIRECTION_BILLBOARD_Y_AXIS: - mat4_rotate_y(GPM_VAL->cam.rotation_y, &dir_mat); + mat4_rotate_y(rctx_ptr->camera->rotation.y, &dir_mat); break; default: dir_mat = mat4_identity; @@ -643,7 +643,7 @@ namespace Glitter { if (fabsf(rend_group->z_offset) > 0.000001f) { use_z_offset = true; mat4_get_translation(model_mat, &dist_to_cam); - dist_to_cam = GPM_VAL->cam.view_point - dist_to_cam; + dist_to_cam = rctx_ptr->camera->view_point - dist_to_cam; if (rend_group->flags & PARTICLE_EMITTER_LOCAL) { mat4_normalize_rotation(model_mat, &z_offset_inv_mat); mat4_invert(&z_offset_inv_mat, &z_offset_inv_mat); @@ -922,8 +922,8 @@ namespace Glitter { return; mat4 mat; - mat4_mul(&rend_group->mat_draw, &GPM_VAL->cam.view, &mat); - mat4_mul(&mat, &GPM_VAL->cam.projection, &mat); + mat4_mul(&rend_group->mat_draw, &rctx_ptr->camera->view, &mat); + mat4_mul(&mat, &rctx_ptr->camera->projection, &mat); float_t emission = 1.0f; if (rend_group->flags & PARTICLE_EMISSION || rend_group->blend_mode == PARTICLE_BLEND_TYPICAL) @@ -1253,9 +1253,9 @@ namespace Glitter { vec3 x_vec = { 1.0f, 0.0f, 0.0f }; if (rend_group->flags & PARTICLE_LOCAL) { mat4 mat; - mat4_mul(&GPM_VAL->cam.inv_view, &rend_group->mat, &mat); - mat4_mul(&GPM_VAL->cam.view, &mat, &mat); - mat4_mul(&mat, &GPM_VAL->cam.inv_view, &rend_group->mat_draw); + mat4_mul(&rctx_ptr->camera->inv_view, &rend_group->mat, &mat); + mat4_mul(&rctx_ptr->camera->view, &mat, &mat); + mat4_mul(&mat, &rctx_ptr->camera->inv_view, &rend_group->mat_draw); } else rend_group->mat_draw = mat4_identity; @@ -1281,7 +1281,7 @@ namespace Glitter { else model_mat = mat3_identity; - mat3_transform_vector(&GPM_VAL->cam.inv_view_mat3, &x_vec, &x_vec); + mat3_transform_vector(&rctx_ptr->camera->inv_view_mat3, &x_vec, &x_vec); Buffer* buf = (Buffer*)rend_group->vbo.MapMemory(); if (!buf) @@ -1386,7 +1386,7 @@ namespace Glitter { if (rend_group->flags & PARTICLE_EMITTER_LOCAL) { model_mat = rend_group->mat; mat4_normalize_rotation(&model_mat, &view_mat); - mat4_mul(&view_mat, &GPM_VAL->cam.view, &view_mat); + mat4_mul(&view_mat, &rctx_ptr->camera->view, &view_mat); mat4_invert(&view_mat, &inv_view_mat); emitter_local = true; @@ -1397,8 +1397,8 @@ namespace Glitter { } else { model_mat = mat4_identity; - view_mat = GPM_VAL->cam.view; - inv_view_mat = GPM_VAL->cam.inv_view; + view_mat = rctx_ptr->camera->view; + inv_view_mat = rctx_ptr->camera->inv_view; } bool local = false; @@ -1408,7 +1408,7 @@ namespace Glitter { mat4_invert(&view_mat, &inv_view_mat); local = true; } - mat4_mul(&view_mat, &GPM_VAL->cam.inv_view, &rend_group->mat_draw); + mat4_mul(&view_mat, &rctx_ptr->camera->inv_view, &rend_group->mat_draw); mat4 dir_mat = mat4_identity; vec3 up_vec = { 0.0f, 0.0f, 1.0f }; @@ -1439,7 +1439,7 @@ namespace Glitter { mat4_rotate_x((float_t)-M_PI_2, &dir_mat); break; case DIRECTION_BILLBOARD_Y_AXIS: - mat4_rotate_y(GPM_VAL->cam.rotation_y, &dir_mat); + mat4_rotate_y(rctx_ptr->camera->rotation.y, &dir_mat); break; case DIRECTION_EMITTER_ROTATION: emitter_rotation = true; @@ -1548,7 +1548,7 @@ namespace Glitter { disp_manager.set_texture_transform(tex_trans_count, tex_trans); if (local) - mat4_mul(&mat, &GPM_VAL->cam.inv_view, &mat); + mat4_mul(&mat, &rctx_ptr->camera->inv_view, &mat); elem->mat_draw = mat; if (disp_manager.entry_obj_by_object_info( @@ -1576,13 +1576,13 @@ namespace Glitter { mat4_clear_rot(&rend_group->mat, &model_mat); else mat4_normalize_rotation(&rend_group->mat, &model_mat); - mat4_mul(&model_mat, &GPM_VAL->cam.view, &view_mat); + mat4_mul(&model_mat, &rctx_ptr->camera->view, &view_mat); mat4_invert(&view_mat, &inv_view_mat); } else { model_mat = mat4_identity; - view_mat = GPM_VAL->cam.view; - inv_view_mat = GPM_VAL->cam.inv_view; + view_mat = rctx_ptr->camera->view; + inv_view_mat = rctx_ptr->camera->inv_view; } if (rend_group->flags & PARTICLE_LOCAL) { @@ -1591,7 +1591,7 @@ namespace Glitter { mat4_mul(&view_mat, &inv_view_mat, &view_mat); mat4_invert(&view_mat, &inv_view_mat); } - mat4_mul(&view_mat, &GPM_VAL->cam.inv_view, &rend_group->mat_draw); + mat4_mul(&view_mat, &rctx_ptr->camera->inv_view, &rend_group->mat_draw); mat4 dir_mat; switch (rend_group->draw_type) { @@ -1612,7 +1612,7 @@ namespace Glitter { mat4_rotate_x((float_t)-M_PI_2, &dir_mat); break; case DIRECTION_BILLBOARD_Y_AXIS: - mat4_rotate_y(GPM_VAL->cam.rotation_y, &dir_mat); + mat4_rotate_y(rctx_ptr->camera->rotation.y, &dir_mat); break; default: dir_mat = mat4_identity; @@ -1755,7 +1755,7 @@ namespace Glitter { if (fabsf(rend_group->z_offset) > 0.000001f) { use_z_offset = true; mat4_get_translation(model_mat, &dist_to_cam); - dist_to_cam = GPM_VAL->cam.view_point - dist_to_cam; + dist_to_cam = rctx_ptr->camera->view_point - dist_to_cam; if (rend_group->flags & PARTICLE_EMITTER_LOCAL) { mat4_normalize_rotation(model_mat, &z_offset_inv_mat); mat4_invert(&z_offset_inv_mat, &z_offset_inv_mat); @@ -2032,8 +2032,8 @@ namespace Glitter { return; mat4 mat; - mat4_mul(&rend_group->mat_draw, &GPM_VAL->cam.view, &mat); - mat4_mul(&mat, &GPM_VAL->cam.projection, &mat); + mat4_mul(&rend_group->mat_draw, &rctx_ptr->camera->view, &mat); + mat4_mul(&mat, &rctx_ptr->camera->projection, &mat); float_t emission = 1.0f; if (rend_group->flags & PARTICLE_EMISSION || rend_group->blend_mode == PARTICLE_BLEND_TYPICAL) diff --git a/src/ReDIVA/data_edit/glitter_editor.cpp b/src/ReDIVA/data_edit/glitter_editor.cpp index dc97551c..f564fbb2 100644 --- a/src/ReDIVA/data_edit/glitter_editor.cpp +++ b/src/ReDIVA/data_edit/glitter_editor.cpp @@ -1920,11 +1920,9 @@ static void glitter_editor_draw_emitter_type_emitter_inst_f2( mat4 mat; mat4_normalize_rotation(&emit_inst->mat, &mat); if (local) { - GPM = Glitter::glt_particle_manager; - - mat4_mul(&GPM_VAL->cam.inv_view, &emit_inst->mat, &mat); - mat4_mul(&GPM_VAL->cam.view, &mat, &mat); - mat4_mul(&mat, &GPM_VAL->cam.inv_view, &mat); + mat4_mul(&rctx_ptr->camera->inv_view, &emit_inst->mat, &mat); + mat4_mul(&rctx_ptr->camera->view, &mat, &mat); + mat4_mul(&mat, &rctx_ptr->camera->inv_view, &mat); mat4_normalize_rotation(&mat, &mat); } else @@ -1988,11 +1986,9 @@ static void glitter_editor_draw_emitter_type_emitter_inst_x( mat4 mat; mat4_normalize_rotation(&emit_inst->mat, &mat); if (local) { - GPM = Glitter::glt_particle_manager; - - mat4_mul(&GPM_VAL->cam.inv_view, &emit_inst->mat, &mat); - mat4_mul(&GPM_VAL->cam.view, &mat, &mat); - mat4_mul(&mat, &GPM_VAL->cam.inv_view, &mat); + mat4_mul(&rctx_ptr->camera->inv_view, &emit_inst->mat, &mat); + mat4_mul(&rctx_ptr->camera->view, &mat, &mat); + mat4_mul(&mat, &rctx_ptr->camera->inv_view, &mat); mat4_normalize_rotation(&mat, &mat); } else