Files
korenkonder_ReDIVA/src/CRE/Glitter/effect_group.cpp
T

84 lines
2.0 KiB
C++

/*
by korenkonder
GitHub/GitLab: korenkonder
*/
#include "glitter.hpp"
#include "../../KKdLib/prj/algorithm.hpp"
#include "../object.hpp"
#include "../texture.hpp"
namespace Glitter {
EffectGroup::EffectGroup(GLT) : load_count(), resources_count(),
resources(), scene(), not_loaded(), scene_init(), buffer_init(), hash() {
emission = 1.0f;
version = GLT_VAL == Glitter::X ? 0x0C : 0x09;
type = GLT_VAL;
#if SHARED_GLITTER_BUFFER
buffer = 0;
#endif
}
EffectGroup::~EffectGroup() {
#if SHARED_GLITTER_BUFFER
ebo.Destroy();
vbo.Destroy();
free_def(buffer);
#endif
for (Mesh& i : meshes)
if (i.object_set_hash != hash_murmurhash_empty) {
objset_info_storage_unload_set(i.object_set_hash);
i.load = false;
}
meshes.clear();
if (resources) {
texture_array_free(resources);
resources = 0;
}
for (Effect*& i : effects)
if (i) {
delete i;
i = 0;
}
effects.clear();
if (scene) {
delete scene;
scene = 0;
}
}
void EffectGroup::GetStartEndFrame(int32_t& start_frame, int32_t& end_frame) {
start_frame = INT32_MAX;
end_frame = 0;
for (Effect*& i : effects) {
if (!i)
continue;
Effect* effect = i;
int32_t life_time = effect->data.life_time;
start_frame = min_def(start_frame, effect->data.appear_time);
for (Emitter*& j : effect->emitters) {
if (!j)
continue;
Emitter* emitter = j;
life_time = max_def(life_time, emitter->data.life_time);
}
life_time += effect->data.appear_time;
end_frame = max_def(end_frame, life_time);
}
start_frame = min_def(start_frame, end_frame);
}
}