mirror of
https://github.com/korenkonder/ReDIVA.git
synced 2026-10-09 06:59:47 +03:00
126 lines
4.8 KiB
C++
126 lines
4.8 KiB
C++
/*
|
|
by korenkonder
|
|
GitHub/GitLab: korenkonder
|
|
*/
|
|
|
|
#include "glitter.hpp"
|
|
|
|
namespace Glitter {
|
|
RenderElement::RenderElement() : alive(), uv_index(), disp(), frame(), life_time(), rebound_time(),
|
|
frame_step_uv(), base_speed(), speed(), deceleration(), rot_z_cos(), rot_z_sin(),
|
|
scale_all(), fade_out_frames(), fade_in_frames(), locus_history(), random(), step() {
|
|
|
|
}
|
|
|
|
void RenderElement::InitLocusHistory(GLT, F2ParticleInst* ptcl_inst, Random* random) {
|
|
if (ptcl_inst->data.data.type == PARTICLE_LOCUS) {
|
|
uint32_t locus_history_size = random->F2GetInt(GLT_VAL,
|
|
-ptcl_inst->data.data.locus_history_size_random,
|
|
ptcl_inst->data.data.locus_history_size_random)
|
|
+ ptcl_inst->data.data.locus_history_size;
|
|
locus_history = new LocusHistory(locus_history_size);
|
|
}
|
|
else
|
|
locus_history = 0;
|
|
}
|
|
|
|
void RenderElement::InitLocusHistory(XParticleInst* ptcl_inst, Random* random) {
|
|
if (ptcl_inst->data.data.type == PARTICLE_LOCUS) {
|
|
uint32_t locus_history_size = random->XGetInt(
|
|
-ptcl_inst->data.data.locus_history_size_random,
|
|
ptcl_inst->data.data.locus_history_size_random)
|
|
+ ptcl_inst->data.data.locus_history_size;
|
|
locus_history = new LocusHistory(locus_history_size);
|
|
}
|
|
else
|
|
locus_history = 0;
|
|
}
|
|
|
|
void RenderElement::InitMesh(GLT, F2EmitterInst* emit_inst,
|
|
Particle::Data* ptcl_data, int32_t index, Random* random) {
|
|
if (ptcl_data->flags & (PARTICLE_EMITTER_LOCAL | PARTICLE_ROTATE_BY_EMITTER))
|
|
base_translation = 0.0f;
|
|
else
|
|
mat4_get_translation(&emit_inst->mat, &base_translation);
|
|
|
|
vec3 direction = ptcl_data->direction;
|
|
vec3 scale;
|
|
if (ptcl_data->flags & PARTICLE_EMITTER_LOCAL)
|
|
scale = 1.0f;
|
|
else
|
|
scale = emit_inst->scale * emit_inst->scale_all;
|
|
|
|
vec3 position = 0.0f;
|
|
emit_inst->InitMesh(GLT_VAL, index, scale, position, direction, random);
|
|
|
|
if (!(ptcl_data->flags & PARTICLE_EMITTER_LOCAL))
|
|
mat4_transform_vector(&emit_inst->mat_rot, &position, &position);
|
|
|
|
base_translation += position;
|
|
translation = base_translation;
|
|
translation_prev = base_translation;
|
|
|
|
direction = vec3::normalize(direction
|
|
+ random->F2GetVec3(GLT_VAL, ptcl_data->direction_random));
|
|
|
|
if (!(ptcl_data->flags & PARTICLE_EMITTER_LOCAL))
|
|
mat4_transform_vector(&emit_inst->mat_rot, &direction, &direction);
|
|
base_direction = direction;
|
|
this->direction = direction;
|
|
|
|
float_t speed = random->F2GetFloat(GLT_VAL,
|
|
ptcl_data->speed_random) + ptcl_data->speed;
|
|
float_t deceleration = random->F2GetFloat(GLT_VAL,
|
|
ptcl_data->deceleration_random) + ptcl_data->deceleration;
|
|
this->speed = speed * 60.0f;
|
|
this->deceleration = max_def(deceleration * 60.0f, 0.0f);
|
|
|
|
this->acceleration = ptcl_data->acceleration + ptcl_data->gravity
|
|
+ random->F2GetVec3(GLT_VAL, ptcl_data->acceleration_random);
|
|
}
|
|
|
|
void RenderElement::InitMesh(XEmitterInst* emit_inst,
|
|
Particle::Data* ptcl_data, int32_t index, Random* random) {
|
|
if (ptcl_data->flags & (PARTICLE_EMITTER_LOCAL | PARTICLE_ROTATE_BY_EMITTER))
|
|
base_translation = 0.0f;
|
|
else
|
|
mat4_get_translation(&emit_inst->mat, &base_translation);
|
|
|
|
vec3 direction = ptcl_data->direction;
|
|
vec3 scale;
|
|
if (ptcl_data->flags & PARTICLE_EMITTER_LOCAL)
|
|
scale = 1.0f;
|
|
else
|
|
scale = emit_inst->scale * emit_inst->scale_all;
|
|
|
|
vec3 position = 0.0f;
|
|
emit_inst->InitMesh(index, scale, position, direction, random);
|
|
|
|
if (!(ptcl_data->flags & PARTICLE_EMITTER_LOCAL))
|
|
mat4_transform_vector(&emit_inst->mat_rot, &position, &position);
|
|
|
|
base_translation += position;
|
|
translation = base_translation;
|
|
translation_prev = base_translation;
|
|
|
|
direction = vec3::normalize(direction
|
|
+ random->XGetVec3(ptcl_data->direction_random));
|
|
|
|
if (!(ptcl_data->flags & PARTICLE_EMITTER_LOCAL))
|
|
mat4_transform_vector(&emit_inst->mat_rot, &direction, &direction);
|
|
base_direction = direction;
|
|
this->direction = direction;
|
|
|
|
float_t speed = random->XGetFloat(
|
|
ptcl_data->speed_random) + ptcl_data->speed;
|
|
float_t deceleration = random->XGetFloat(
|
|
ptcl_data->deceleration_random) + ptcl_data->deceleration;
|
|
base_speed = speed;
|
|
this->speed = speed;
|
|
this->deceleration = max_def(deceleration, 0.0f);
|
|
|
|
this->acceleration = ptcl_data->acceleration + ptcl_data->gravity
|
|
+ random->XGetVec3(ptcl_data->acceleration_random);
|
|
}
|
|
}
|