88 lines
3.4 KiB
C#
88 lines
3.4 KiB
C#
using System.Linq;
|
|
using Age.Engine.Model;
|
|
using Xunit;
|
|
|
|
public class AnimInterpolatorTests
|
|
{
|
|
private static GfxState VisibleObj(long handle)
|
|
{
|
|
var g = new GfxState();
|
|
g.SetSurface(1, resId: 5, colorKey: -1);
|
|
g.BindDraw(handle, 1, 0, 0, 64, 64, 100, 100); // one 64x64 cell, base pos (100,100)
|
|
return g;
|
|
}
|
|
|
|
[Fact]
|
|
public void PingPong_FoldsAtHalfPeriod()
|
|
{
|
|
Assert.Equal(0, BlendMath.PingPong(now: 0, start: 0, period: 1000));
|
|
Assert.Equal(500, BlendMath.PingPong(now: 500, start: 0, period: 1000)); // peak at half
|
|
Assert.Equal(0, BlendMath.PingPong(now: 1000, start: 0, period: 1000)); // back to base
|
|
}
|
|
|
|
[Fact]
|
|
public void SrcRect_StaticCell_SelectsSubRect()
|
|
{
|
|
var g = VisibleObj(0x100);
|
|
g.SetSrcRect(0x100, frameCount: 4, columns: 4, cell: 2, period: 0);
|
|
var ro = g.SnapshotVisibleObjects(0).Single();
|
|
Assert.Equal(128, ro.SrcX); // cell 2 * 64
|
|
Assert.Equal(64, ro.W);
|
|
}
|
|
|
|
[Fact]
|
|
public void SrcRect_Animated_AdvancesOneCellPerPeriodAndWraps()
|
|
{
|
|
var g = VisibleObj(0x100);
|
|
g.SetSrcRect(0x100, frameCount: 4, columns: 4, cell: 0, period: 100);
|
|
g.SnapshotVisibleObjects(0); // seeds start=0
|
|
var second = g.SnapshotVisibleObjects(100).Single();
|
|
Assert.Equal(64, second.SrcX);
|
|
var fourth = g.SnapshotVisibleObjects(300).Single();
|
|
Assert.Equal(192, fourth.SrcX);
|
|
var wrapped = g.SnapshotVisibleObjects(400).Single();
|
|
Assert.Equal(0, wrapped.SrcX);
|
|
}
|
|
|
|
[Fact]
|
|
public void ColorAnim_Mode0Textured_UsesRgbModulationAndIgnoresAlpha()
|
|
{
|
|
var g = VisibleObj(0x100);
|
|
g.SetColorAnim(0x100, period: 1000, target: GfxState.PackColor(0x80, 0xFF0000));
|
|
g.SnapshotVisibleObjects(0); // seeds start=0
|
|
var baseFrame = g.SnapshotVisibleObjects(0).Single();
|
|
var peak = g.SnapshotVisibleObjects(500).Single();
|
|
Assert.Equal((255, 0xffffffL, 0, true),
|
|
(baseFrame.Alpha, baseFrame.Tint, baseFrame.TintStrength, baseFrame.MultiplyTint));
|
|
Assert.Equal((255, 0xff0000L, 0, true),
|
|
(peak.Alpha, peak.Tint, peak.TintStrength, peak.MultiplyTint));
|
|
}
|
|
|
|
[Fact]
|
|
public void ColorAnim_Mode1_UsesSampledAlphaAsOpacity()
|
|
{
|
|
var g = VisibleObj(0x100);
|
|
g.SetStaticObjectColorResolved(0x100, mode: 1, alpha: 255, rgb: 0xffffff);
|
|
g.SetColorAnim(0x100, period: 1000, target: GfxState.PackColor(0x80, 0xffffff));
|
|
g.SnapshotVisibleObjects(0);
|
|
var peak = g.SnapshotVisibleObjects(500).Single();
|
|
Assert.Equal(0x80, peak.Alpha);
|
|
Assert.Equal(0, peak.TintStrength);
|
|
Assert.True(peak.MultiplyTint);
|
|
}
|
|
|
|
[Fact]
|
|
public void Ae001hMode0AlphaCycle_IsVisuallyInert()
|
|
{
|
|
var g = VisibleObj(0x100);
|
|
g.SetColorAnimResolved(0x100, period: 1200, alpha: 224, rgb: -1);
|
|
var start = g.SnapshotVisibleObjects(1000).Single();
|
|
var peak = g.SnapshotVisibleObjects(1600).Single();
|
|
Assert.Equal(0xe0ffffff, g.TryGet(0x100)!.ColorTarget);
|
|
Assert.Equal((255, 0xffffffL, 0, true),
|
|
(start.Alpha, start.Tint, start.TintStrength, start.MultiplyTint));
|
|
Assert.Equal((start.Alpha, start.Tint, start.TintStrength, start.MultiplyTint),
|
|
(peak.Alpha, peak.Tint, peak.TintStrength, peak.MultiplyTint));
|
|
}
|
|
}
|