Files
pgs/Assets/Plugins/Febucci/Text Animator/Effects/Appearance Effects/Presets/PresetAppearance.cs
2026-02-21 16:58:22 -08:00

206 lines
5.9 KiB
C#

using UnityEngine;
namespace Febucci.UI.Core
{
[UnityEngine.Scripting.Preserve]
[EffectInfo(tag: "")]
class PresetAppearance : AppearanceBase
{
bool enabled;
//management
Matrix4x4 matrix;
Vector3 offset;
Quaternion rotationQua;
bool hasTransformEffects;
ThreeAxisEffector movement;
ThreeAxisEffector rotation;
TwoAxisEffector scale;
bool setColor;
Color32 color;
ColorCurve colorCurve;
public override void SetDefaultValues(AppearanceDefaultValues data)
{
effectDuration = 0;
enabled = false;
void AssignValues(PresetAppearanceValues result)
{
enabled = SetPreset(
true,
result,
ref movement,
ref effectDuration,
ref rotation,
ref scale,
ref rotationQua,
ref hasTransformEffects,
ref setColor,
ref colorCurve);
}
PresetAppearanceValues values;
//searches for local presets first, which override global presets
if (TAnimBuilder.GetPresetFromArray(effectTag, data.presets, out values))
{
AssignValues(values);
return;
}
//global presets
if (TAnimBuilder.TryGetGlobalPresetAppearance(effectTag, out values))
{
AssignValues(values);
return;
}
}
#region Effector classes
internal abstract class Effector
{
protected abstract Vector3 _EvaluateEffect(float passedTime, int charInde);
public Vector3 EvaluateEffect(float passedTime, int charIndex)
{
return _EvaluateEffect(passedTime, charIndex);
}
}
internal sealed class ThreeAxisEffector : Effector
{
EffectEvaluator x;
EffectEvaluator y;
EffectEvaluator z;
public ThreeAxisEffector(EffectEvaluator x, EffectEvaluator y, EffectEvaluator z)
{
this.x = x;
this.y = y;
this.z = z;
}
protected override Vector3 _EvaluateEffect(float passedTime, int charIndex)
{
return new Vector3(
x.Evaluate(passedTime, charIndex),
y.Evaluate(passedTime, charIndex),
z.Evaluate(passedTime, charIndex)
);
}
}
internal sealed class TwoAxisEffector : Effector
{
EffectEvaluator x;
EffectEvaluator y;
public TwoAxisEffector(EffectEvaluator x, EffectEvaluator y)
{
this.x = x;
this.y = y;
}
protected override Vector3 _EvaluateEffect(float passedTime, int charIndex)
{
return new Vector3(
x.Evaluate(passedTime, charIndex),
y.Evaluate(passedTime, charIndex),
1
);
}
}
#endregion
public static bool SetPreset<T>(
bool isAppearance,
T values,
ref ThreeAxisEffector movement,
ref float showDuration,
ref ThreeAxisEffector rotation,
ref TwoAxisEffector scale,
ref Quaternion rotationQua,
ref bool hasTransformEffects,
ref bool setColor,
ref ColorCurve colorCurve
) where T : PresetBaseValues
{
values.Initialize(isAppearance);
showDuration = values.GetMaxDuration();
movement = new ThreeAxisEffector(
values.movementX,
values.movementY,
values.movementZ);
scale = new TwoAxisEffector(
values.scaleX,
values.scaleY
);
rotation = new ThreeAxisEffector(
values.rotX,
values.rotY,
values.rotZ
);
rotationQua = Quaternion.identity;
hasTransformEffects = values.movementX.enabled || values.movementY.enabled || values.movementZ.enabled
|| values.rotX.enabled || values.rotY.enabled || values.rotZ.enabled
|| values.scaleX.enabled || values.scaleY.enabled;
setColor = values.color.enabled;
if (setColor)
{
colorCurve = values.color;
colorCurve.Initialize(isAppearance);
}
return hasTransformEffects || setColor;
}
public override void ApplyEffect(ref CharacterData data, int charIndex)
{
if (!enabled)
return;
if (hasTransformEffects)
{
offset = (data.vertices[0] + data.vertices[2]) / 2f;
rotationQua.eulerAngles = rotation.EvaluateEffect(data.passedTime, charIndex);
matrix.SetTRS(
movement.EvaluateEffect(data.passedTime, charIndex) * uniformIntensity,
rotationQua,
scale.EvaluateEffect(data.passedTime, charIndex));
for (byte i = 0; i < data.vertices.Length; i++)
{
data.vertices[i] -= offset;
data.vertices[i] = matrix.MultiplyPoint3x4(data.vertices[i]);
data.vertices[i] += offset;
}
}
if (setColor)
{
color = colorCurve.GetColor(data.passedTime, charIndex);
data.colors.LerpUnclamped(color, 1 - data.passedTime / effectDuration);
}
}
}
}