From 3dd295afa1f87d48fd2eceec7a52065c825db4ea Mon Sep 17 00:00:00 2001 From: korenkonder Date: Sat, 3 Aug 2024 13:22:00 +0300 Subject: [PATCH] `Glitter`: Fixed regression caused by inappropriate flags --- src/DivaGL/Glitter/effect.cpp | 2 +- src/DivaGL/Glitter/effect_inst.cpp | 134 ++++++++++++++-------------- src/DivaGL/Glitter/file_reader.cpp | 4 +- src/DivaGL/Glitter/glitter.hpp | 32 +++---- src/DivaGL/Glitter/render_group.cpp | 7 +- 5 files changed, 90 insertions(+), 89 deletions(-) diff --git a/src/DivaGL/Glitter/effect.cpp b/src/DivaGL/Glitter/effect.cpp index 7d8dad4..329fd27 100644 --- a/src/DivaGL/Glitter/effect.cpp +++ b/src/DivaGL/Glitter/effect.cpp @@ -7,7 +7,7 @@ namespace Glitter { EffectX::Data::Data() : appear_time(), life_time(), start_time(), - ext_anim(), flags(), emission(), seed(), ext_anim_scale_start_time() { + ext_anim(), flags(), emission(), seed(), ext_anim_end_time() { color = 0xFFFFFFFF; name_hash = hash_murmurhash_empty; } diff --git a/src/DivaGL/Glitter/effect_inst.cpp b/src/DivaGL/Glitter/effect_inst.cpp index 155ce39..00ade7f 100644 --- a/src/DivaGL/Glitter/effect_inst.cpp +++ b/src/DivaGL/Glitter/effect_inst.cpp @@ -75,11 +75,13 @@ namespace Glitter { random_shared.value = random; if (!(eff->data.flags & EFFECT_LOCAL) && data.ext_anim) { - EffectInstX::ExtAnim* inst_ext_anim = new EffectInstX::ExtAnim; + InitExtAnim(); + + EffectInstX::ExtAnim* inst_ext_anim = this->ext_anim; if (inst_ext_anim) { EffectX::ExtAnim* ext_anim = data.ext_anim; if (ext_anim->flags & EFFECT_EXT_ANIM_SET_ONCE) - enum_or(flags, EFFECT_INST_SET_EXT_ANIM_ONCE); + enum_or(flags, EFFECT_INST_EXT_ANIM_SET_ONCE); if (ext_anim->flags & EFFECT_EXT_ANIM_TRANS_ONLY) enum_or(flags, EFFECT_INST_EXT_ANIM_TRANS_ONLY); if (ext_anim->flags & EFFECT_EXT_ANIM_NO_TRANS_X) @@ -89,12 +91,12 @@ namespace Glitter { if (ext_anim->flags & EFFECT_EXT_ANIM_NO_TRANS_Z) enum_or(flags, EFFECT_INST_NO_EXT_ANIM_TRANS_Z); if (ext_anim->flags & EFFECT_EXT_ANIM_GET_THEN_UPDATE) - enum_or(flags, EFFECT_INST_GET_EXT_ANIM_THEN_UPDATE); + enum_or(flags, EFFECT_INST_EXT_ANIM_GET_THEN_UPDATE); - if (ext_anim->flags & EFFECT_EXT_ANIM_CHARA_ANIM) { + if (ext_anim->flags & EFFECT_EXT_ANIM_CHARA) { inst_ext_anim->chara_index = ext_anim->chara_index; inst_ext_anim->bone_index = ext_anim->bone_index; - enum_or(flags, EFFECT_INST_CHARA_ANIM); + enum_or(flags, EFFECT_INST_EXT_ANIM_CHARA); } else { inst_ext_anim->object = ext_anim->object; @@ -107,10 +109,10 @@ namespace Glitter { else inst_ext_anim->mesh_name = 0; } - ext_anim = inst_ext_anim; - enum_or(flags, EFFECT_INST_HAS_EXT_ANIM); - enum_or(flags, EFFECT_INST_HAS_EXT_ANIM_NON_INIT); - enum_or(flags, EFFECT_INST_GET_EXT_ANIM_MAT); + + enum_or(flags, EFFECT_INST_EXT_ANIM); + enum_or(flags, EFFECT_INST_EXT_ANIM_NON_INIT); + enum_or(flags, EFFECT_INST_EXT_ANIM_AUTH); } emitters.reserve(eff->emitters.size()); @@ -138,30 +140,30 @@ namespace Glitter { render_scene.CalcDisp(); } - void EffectInstX::CheckDataDependency() { - bool depends_on_ext_data = false; - if (ext_anim) - if (!(flags & EFFECT_INST_SET_EXT_ANIM_MAT) && !(flags & EFFECT_INST_HAS_EXT_ANIM) - || (flags & EFFECT_INST_HAS_EXT_ANIM_SCALE) - || (flags & EFFECT_INST_SET_EXT_ANIM_ONCE) && (flags & EFFECT_INST_HAS_EXT_ANIM_TRANS)) - depends_on_ext_data = true; + void EffectInstX::CheckUpdate() { + CheckUseCamera(); + render_scene.CheckUseCamera(); + } - if (!depends_on_ext_data) + void EffectInstX::CheckUseCamera() { + bool use_camera = false; + if (ext_anim) + if (!(flags & EFFECT_INST_EXT_ANIM) && !(flags & EFFECT_INST_EXT_ANIM_MAT) + || (flags & EFFECT_INST_EXT_ANIM_END) + || (flags & EFFECT_INST_EXT_ANIM_SET_ONCE) && (flags & EFFECT_INST_EXT_ANIM_TRANS)) + use_camera = true; + + if (!use_camera) for (EmitterInstX*& i : emitters) if (i->CheckUseCamera()) { - depends_on_ext_data = true; + use_camera = true; break; } - if (depends_on_ext_data) - enum_or(flags, EFFECT_INST_DEPENDS_ON_EXT_DATA); + if (use_camera) + enum_or(flags, EFFECT_INST_CAMERA); else - enum_and(flags, ~EFFECT_INST_DEPENDS_ON_EXT_DATA); - } - - void EffectInstX::CheckUpdate() { - CheckDataDependency(); - render_scene.CheckUseCamera(); + enum_and(flags, ~EFFECT_INST_CAMERA); } void EffectInstX::Copy(EffectInstX* dst, float_t emission) { @@ -187,7 +189,7 @@ namespace Glitter { void EffectInstX::Ctrl(float_t delta_frame) { GetExtAnim(); - if (flags & EFFECT_INST_GET_EXT_ANIM_THEN_UPDATE) + if (flags & EFFECT_INST_EXT_ANIM_GET_THEN_UPDATE) return; GetValue(); @@ -231,10 +233,10 @@ namespace Glitter { frame0 += delta_frame; - if ((flags & EFFECT_INST_HAS_EXT_ANIM) && !(flags & EFFECT_INST_HAS_EXT_ANIM_SCALE)) { - if (data.ext_anim_scale_start_time >= 0.0f && (flags & EFFECT_INST_HAS_EXT_ANIM_TRANS) - && frame0 >= data.ext_anim_scale_start_time) - enum_or(flags, EFFECT_INST_HAS_EXT_ANIM_SCALE); + if ((flags & EFFECT_INST_EXT_ANIM) && !(flags & EFFECT_INST_EXT_ANIM_END)) { + if ((flags & EFFECT_INST_EXT_ANIM_TRANS) + && data.ext_anim_end_time >= 0.0f && frame0 >= data.ext_anim_end_time) + enum_or(flags, EFFECT_INST_EXT_ANIM_END); } float_t life_time = (float_t)data.life_time; @@ -280,7 +282,7 @@ namespace Glitter { } void EffectInstX::Emit(float_t delta_frame, float_t emission) { - if (flags & EFFECT_INST_GET_EXT_ANIM_THEN_UPDATE) + if (flags & EFFECT_INST_EXT_ANIM_GET_THEN_UPDATE) return; else if (flags & EFFECT_INST_NOT_ENDED) { if (!(data.flags & EFFECT_LOOP)) { @@ -350,7 +352,7 @@ namespace Glitter { if (ext_anim) { EffectX::ExtAnim* ext_anim = data.ext_anim; if (ext_anim->flags & EFFECT_EXT_ANIM_SET_ONCE) - enum_or(flags, EFFECT_INST_SET_EXT_ANIM_ONCE); + enum_or(flags, EFFECT_INST_EXT_ANIM_SET_ONCE); if (ext_anim->flags & EFFECT_EXT_ANIM_TRANS_ONLY) enum_or(flags, EFFECT_INST_EXT_ANIM_TRANS_ONLY); if (ext_anim->flags & EFFECT_EXT_ANIM_NO_TRANS_X) @@ -360,13 +362,13 @@ namespace Glitter { if (ext_anim->flags & EFFECT_EXT_ANIM_NO_TRANS_Z) enum_or(flags, EFFECT_INST_NO_EXT_ANIM_TRANS_Z); if (ext_anim->flags & EFFECT_EXT_ANIM_GET_THEN_UPDATE) - enum_or(flags, EFFECT_INST_GET_EXT_ANIM_THEN_UPDATE); - if (ext_anim->flags & EFFECT_EXT_ANIM_CHARA_ANIM) - enum_or(flags, EFFECT_INST_CHARA_ANIM); + enum_or(flags, EFFECT_INST_EXT_ANIM_GET_THEN_UPDATE); + if (ext_anim->flags & EFFECT_EXT_ANIM_CHARA) + enum_or(flags, EFFECT_INST_EXT_ANIM_CHARA); } - enum_or(flags, EFFECT_INST_HAS_EXT_ANIM); - enum_or(flags, EFFECT_INST_HAS_EXT_ANIM_NON_INIT); - enum_or(flags, EFFECT_INST_GET_EXT_ANIM_MAT); + enum_or(flags, EFFECT_INST_EXT_ANIM); + enum_or(flags, EFFECT_INST_EXT_ANIM_NON_INIT); + enum_or(flags, EFFECT_INST_EXT_ANIM_AUTH); } for (EmitterInstX*& i : emitters) @@ -496,17 +498,17 @@ namespace Glitter { if (!ext_anim) return; - if (!(flags & EFFECT_INST_SET_EXT_ANIM_MAT) && !(flags & EFFECT_INST_HAS_EXT_ANIM) - || (flags & EFFECT_INST_HAS_EXT_ANIM_SCALE) - || (flags & EFFECT_INST_SET_EXT_ANIM_ONCE) && (flags & EFFECT_INST_HAS_EXT_ANIM_TRANS)) + if (!(flags & EFFECT_INST_EXT_ANIM) && !(flags & EFFECT_INST_EXT_ANIM_MAT) + || (flags & EFFECT_INST_EXT_ANIM_END) + || (flags & EFFECT_INST_EXT_ANIM_SET_ONCE) && (flags & EFFECT_INST_EXT_ANIM_TRANS)) return; bool set_flags = false; - if (data.ext_anim->flags & EFFECT_INST_CHARA_ANIM) - enum_or(flags, EFFECT_INST_HAS_EXT_ANIM_NON_INIT); + if (data.ext_anim->flags & EFFECT_INST_EXT_ANIM_CHARA) + enum_or(flags, EFFECT_INST_EXT_ANIM_NON_INIT); - if (flags & EFFECT_INST_CHARA_ANIM) { + if (flags & EFFECT_INST_EXT_ANIM_CHARA) { size_t rob_chara_smth = get_rob_chara_smth(); rob_chara* rob_chr = rob_chara_array_get(rob_chara_smth, ext_anim->chara_index); if (!rob_chr) @@ -519,7 +521,7 @@ namespace Glitter { mat4_get_scale(&mat, &scale); ext_anim_scale = scale - 1.0f; ext_anim_scale.z = 0.0f; - enum_or(flags, EFFECT_INST_HAS_EXT_ANIM_SCALE); + enum_or(flags, EFFECT_INST_EXT_SCALE); if (rob_chara_array_check_visibility(rob_chara_smth, ext_anim->chara_index) || !(data.ext_anim->flags & EFFECT_EXT_ANIM_NO_DRAW_IF_NO_DATA)) @@ -536,7 +538,7 @@ namespace Glitter { else SetExtAnim(&mat, 0, 0, set_flags); } - else if (flags & EFFECT_INST_GET_EXT_ANIM_MAT) { + else if (flags & EFFECT_INST_EXT_ANIM_AUTH) { const mat4* obj_mat = 0; if (ext_anim->a3da_id != -1) obj_mat = ((auth_3d_id*)&ext_anim->a3da_id)->get_auth_3d_object_mat( @@ -567,7 +569,7 @@ namespace Glitter { mat4_get_scale(&mat, &scale); ext_anim_scale = scale - 1.0f; ext_anim_scale.z = 0.0f; - enum_or(flags, EFFECT_INST_HAS_EXT_ANIM_SCALE); + enum_or(flags, EFFECT_INST_EXT_SCALE); } } @@ -606,7 +608,7 @@ namespace Glitter { } bool EffectInstX::GetExtAnimMat(mat4* mat) { - if (!(flags & EFFECT_INST_HAS_EXT_ANIM_TRANS) || !ext_anim) + if (!(flags & EFFECT_INST_EXT_ANIM_TRANS) || !ext_anim) return false; mat4_mul_translate(&ext_anim->mat, &ext_anim->translation, mat); @@ -617,7 +619,7 @@ namespace Glitter { if (!(flags & EFFECT_INST_EXT_COLOR)) return; - if (flags & EFFECT_INST_SET_EXT_COLOR) { + if (flags & EFFECT_INST_EXT_COLOR_SET) { if (ext_color.x >= 0.0f) r = ext_color.x; if (ext_color.y >= 0.0f) @@ -656,7 +658,7 @@ namespace Glitter { } bool EffectInstX::GetUseCamera() { - return !!(flags & EFFECT_INST_DEPENDS_ON_EXT_DATA); + return !!(flags & EFFECT_INST_CAMERA); } void EffectInstX::GetValue() { @@ -716,7 +718,7 @@ namespace Glitter { } bool EffectInstX::GetExtAnimScale(vec3* ext_anim_scale, float_t* ext_scale) { - if (!(flags & EFFECT_INST_HAS_EXT_ANIM_SCALE)) + if (!(flags & EFFECT_INST_EXT_SCALE)) return false; if (ext_anim_scale) @@ -767,12 +769,12 @@ namespace Glitter { ext_anim->translation.z = trans->z; if (set_flags) { - if (flags & EFFECT_INST_GET_EXT_ANIM_THEN_UPDATE) - enum_and(flags, ~EFFECT_INST_GET_EXT_ANIM_THEN_UPDATE); - if (flags & EFFECT_INST_HAS_EXT_ANIM_NON_INIT) - enum_and(flags, ~EFFECT_INST_HAS_EXT_ANIM_NON_INIT); + if (flags & EFFECT_INST_EXT_ANIM_GET_THEN_UPDATE) + enum_and(flags, ~EFFECT_INST_EXT_ANIM_GET_THEN_UPDATE); + if (flags & EFFECT_INST_EXT_ANIM_NON_INIT) + enum_and(flags, ~EFFECT_INST_EXT_ANIM_NON_INIT); } - enum_or(flags, EFFECT_INST_HAS_EXT_ANIM_TRANS); + enum_or(flags, EFFECT_INST_EXT_ANIM_TRANS); this->flags = flags; } @@ -784,13 +786,13 @@ namespace Glitter { ext_anim->mat = *mat; ext_anim->translation = 0.0f; - if ((flags & EFFECT_INST_HAS_EXT_ANIM_NON_INIT)) - enum_and(flags, ~EFFECT_INST_HAS_EXT_ANIM_NON_INIT); - if (!(flags & EFFECT_INST_HAS_EXT_ANIM_TRANS)) - enum_or(flags, EFFECT_INST_HAS_EXT_ANIM_TRANS); + if ((flags & EFFECT_INST_EXT_ANIM_NON_INIT)) + enum_and(flags, ~EFFECT_INST_EXT_ANIM_NON_INIT); + if (!(flags & EFFECT_INST_EXT_ANIM_TRANS)) + enum_or(flags, EFFECT_INST_EXT_ANIM_TRANS); - enum_and(flags, ~(EFFECT_INST_GET_EXT_ANIM_MAT | EFFECT_INST_CHARA_ANIM)); - enum_or(flags, EFFECT_INST_SET_EXT_ANIM_MAT); + enum_and(flags, ~(EFFECT_INST_EXT_ANIM_AUTH | EFFECT_INST_EXT_ANIM_CHARA)); + enum_or(flags, EFFECT_INST_EXT_ANIM_MAT); } void EffectInstX::SetExtColor(float_t r, float_t g, float_t b, float_t a, bool set) { @@ -799,14 +801,14 @@ namespace Glitter { ext_color.z = b; ext_color.w = a; if (set) - enum_or(flags, EFFECT_INST_SET_EXT_COLOR); + enum_or(flags, EFFECT_INST_EXT_COLOR_SET); else - enum_and(flags, ~EFFECT_INST_SET_EXT_COLOR); + enum_and(flags, ~EFFECT_INST_EXT_COLOR_SET); enum_or(flags, EFFECT_INST_EXT_COLOR); } void EffectInstX::SetExtScale(float_t scale) { ext_scale = scale; - enum_or(flags, EFFECT_INST_HAS_EXT_SCALE); + enum_or(flags, EFFECT_INST_EXT_SCALE); } } diff --git a/src/DivaGL/Glitter/file_reader.cpp b/src/DivaGL/Glitter/file_reader.cpp index a9edf94..c2aced3 100644 --- a/src/DivaGL/Glitter/file_reader.cpp +++ b/src/DivaGL/Glitter/file_reader.cpp @@ -660,7 +660,7 @@ namespace Glitter { eff->data.emission = *(float_t*)d; eff->data.seed = *(int32_t*)(d + 4); - eff->data.ext_anim_scale_start_time = *(float_t*)(d + 8); + eff->data.ext_anim_end_time = *(float_t*)(d + 8); d += 12; if (eff->version != 8) @@ -686,7 +686,7 @@ namespace Glitter { int32_t node_index = * (int32_t*)(d + 8); ext_anim->bone_index = GetEffectExtAnimBoneIndex((EffectExtAnimCharaNode)node_index); - enum_or(ext_anim->flags, EFFECT_EXT_ANIM_CHARA_ANIM); + enum_or(ext_anim->flags, EFFECT_EXT_ANIM_CHARA); } } else if (type == 3) { diff --git a/src/DivaGL/Glitter/glitter.hpp b/src/DivaGL/Glitter/glitter.hpp index 00e27be..a0d017a 100644 --- a/src/DivaGL/Glitter/glitter.hpp +++ b/src/DivaGL/Glitter/glitter.hpp @@ -96,7 +96,7 @@ namespace Glitter { EFFECT_EXT_ANIM_NO_TRANS_Z = 0x00010, EFFECT_EXT_ANIM_NO_DRAW_IF_NO_DATA = 0x00020, EFFECT_EXT_ANIM_GET_THEN_UPDATE = 0x00040, - EFFECT_EXT_ANIM_CHARA_ANIM = 0x10000, + EFFECT_EXT_ANIM_CHARA = 0x10000, }; enum EffectExtAnimCharaNode { @@ -145,26 +145,26 @@ namespace Glitter { EFFECT_INST_NONE = 0x0000000, EFFECT_INST_FREE = 0x0000001, EFFECT_INST_RESET_INIT = 0x0000002, - EFFECT_INST_HAS_EXT_ANIM = 0x0000004, - EFFECT_INST_HAS_EXT_ANIM_TRANS = 0x0000008, - EFFECT_INST_HAS_EXT_ANIM_NON_INIT = 0x0000010, - EFFECT_INST_CHARA_ANIM = 0x0000020, - EFFECT_INST_GET_EXT_ANIM_MAT = 0x0000040, - EFFECT_INST_SET_EXT_ANIM_ONCE = 0x0000080, - EFFECT_INST_SET_EXT_COLOR = 0x0000100, + EFFECT_INST_EXT_ANIM = 0x0000004, + EFFECT_INST_EXT_ANIM_TRANS = 0x0000008, + EFFECT_INST_EXT_ANIM_NON_INIT = 0x0000010, + EFFECT_INST_EXT_ANIM_CHARA = 0x0000020, + EFFECT_INST_EXT_ANIM_AUTH = 0x0000040, + EFFECT_INST_EXT_ANIM_SET_ONCE = 0x0000080, + EFFECT_INST_EXT_COLOR_SET = 0x0000100, EFFECT_INST_EXT_COLOR = 0x0000200, - EFFECT_INST_HAS_EXT_SCALE = 0x0000400, - EFFECT_INST_HAS_EXT_ANIM_SCALE = 0x0000800, + EFFECT_INST_EXT_SCALE = 0x0000400, + EFFECT_INST_EXT_ANIM_END = 0x0000800, EFFECT_INST_NO_EXT_ANIM_TRANS_X = 0x0001000, EFFECT_INST_NO_EXT_ANIM_TRANS_Y = 0x0002000, EFFECT_INST_NO_EXT_ANIM_TRANS_Z = 0x0004000, EFFECT_INST_EXT_ANIM_TRANS_ONLY = 0x0008000, EFFECT_INST_FLAG_17 = 0x0010000, - EFFECT_INST_GET_EXT_ANIM_THEN_UPDATE = 0x0020000, - EFFECT_INST_SET_EXT_ANIM_MAT = 0x0040000, + EFFECT_INST_EXT_ANIM_GET_THEN_UPDATE = 0x0020000, + EFFECT_INST_EXT_ANIM_MAT = 0x0040000, EFFECT_INST_DISP = 0x0080000, - EFFECT_INST_DEPENDS_ON_EXT_DATA = 0x0100000, - EFFECT_INST_HAS_MESH = 0x0200000, + EFFECT_INST_CAMERA = 0x0100000, + EFFECT_INST_MESH = 0x0200000, EFFECT_INST_FLAG_23 = 0x0400000, EFFECT_INST_JUST_INIT = 0x0800000, EFFECT_INST_NOT_ENDED = 0x1000000, @@ -522,7 +522,7 @@ namespace Glitter { EffectFlag flags; float_t emission; int32_t seed; - float_t ext_anim_scale_start_time; + float_t ext_anim_end_time; Data(); }; @@ -714,8 +714,8 @@ namespace Glitter { virtual ~EffectInstX(); void CalcDisp(); - void CheckDataDependency(); void CheckUpdate(); + void CheckUseCamera(); void Copy(EffectInstX* dst, float_t emission); void Ctrl(float_t delta_frame); void CtrlFlags(float_t delta_frame); diff --git a/src/DivaGL/Glitter/render_group.cpp b/src/DivaGL/Glitter/render_group.cpp index d254523..47a157f 100644 --- a/src/DivaGL/Glitter/render_group.cpp +++ b/src/DivaGL/Glitter/render_group.cpp @@ -206,13 +206,12 @@ namespace Glitter { } bool RenderGroupX::CannotDisp() { - EffectInstX* effect; if (!particle) return true; else if (particle->data.effect) - return (particle->data.effect->flags & EFFECT_INST_HAS_EXT_ANIM_NON_INIT) != 0; - else if ((particle = particle->data.parent) && (effect = particle->data.effect)) - return (effect->flags & EFFECT_INST_HAS_EXT_ANIM_NON_INIT) != 0; + return (particle->data.effect->flags & EFFECT_INST_EXT_ANIM_NON_INIT) != 0; + else if ((particle = particle->data.parent) && (particle->data.effect)) + return (particle->data.effect->flags & EFFECT_INST_EXT_ANIM_NON_INIT) != 0; else return true; }