Glitter: Fixed regression caused by inappropriate flags

This commit is contained in:
korenkonder
2024-08-03 13:22:00 +03:00
parent 5e83b67648
commit 3dd295afa1
5 changed files with 90 additions and 89 deletions
+1 -1
View File
@@ -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;
}
+68 -66
View File
@@ -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);
}
}
+2 -2
View File
@@ -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) {
+16 -16
View File
@@ -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);
+3 -4
View File
@@ -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;
}