mirror of
https://github.com/korenkonder/ReDIVA.git
synced 2026-10-02 11:47:56 +03:00
Glitter: Fixed Local particles
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user