Glitter: Fixed Local particles

This commit is contained in:
korenkonder
2024-08-29 10:01:44 +03:00
parent 6fa084f67c
commit 1cd4f8e39d
5 changed files with 46 additions and 81 deletions
+9 -7
View File
@@ -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;
-12
View File
@@ -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;
+1 -22
View File
@@ -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)
+30 -30
View File
@@ -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)
+6 -10
View File
@@ -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