fix(camera): port retail offset adjustment laws
This commit is contained in:
parent
cb22691beb
commit
90eba0ec3c
7 changed files with 212 additions and 61 deletions
|
|
@ -177,7 +177,7 @@ public sealed class CameraPointerInputControllerTests
|
|||
}
|
||||
|
||||
[Fact]
|
||||
public void ChaseMouseWheel_RetainsExtendedZoomOutRange()
|
||||
public void ChaseMouseWheel_UsesRetailMultiplicativeZoomAndComponentLimit()
|
||||
{
|
||||
var fixture = Create([new RawSurface()]);
|
||||
var legacy = new ChaseCamera();
|
||||
|
|
@ -187,21 +187,24 @@ public sealed class CameraPointerInputControllerTests
|
|||
fixture.Chase.Retail = retail;
|
||||
fixture.Camera.EnterChaseMode(legacy, retail);
|
||||
|
||||
float before = CameraDiagnostics.UseRetailChaseCamera
|
||||
? retail.Distance
|
||||
: legacy.Distance;
|
||||
fixture.Owner.HandleScroll(InputAction.ScrollDown);
|
||||
float afterOne = CameraDiagnostics.UseRetailChaseCamera
|
||||
? retail.Distance
|
||||
: legacy.Distance;
|
||||
for (int i = 0; i < 100; i++)
|
||||
bool savedRetail = CameraDiagnostics.UseRetailChaseCamera;
|
||||
try
|
||||
{
|
||||
CameraDiagnostics.UseRetailChaseCamera = true;
|
||||
float before = retail.Distance;
|
||||
fixture.Owner.HandleScroll(InputAction.ScrollDown);
|
||||
float afterMany = CameraDiagnostics.UseRetailChaseCamera
|
||||
? retail.Distance
|
||||
: legacy.Distance;
|
||||
float afterOne = retail.Distance;
|
||||
for (int i = 0; i < 100; i++)
|
||||
fixture.Owner.HandleScroll(InputAction.ScrollDown);
|
||||
|
||||
Assert.Equal(before + 0.8f, afterOne, 5);
|
||||
Assert.Equal(40f, afterMany, 5);
|
||||
Assert.Equal(before * (1f + 0.8f * RetailChaseCamera.OffsetScalePerAdjustment), afterOne, 5);
|
||||
Assert.True(retail.Distance < 10.5f);
|
||||
Assert.True(retail.Distance > 8f);
|
||||
}
|
||||
finally
|
||||
{
|
||||
CameraDiagnostics.UseRetailChaseCamera = savedRetail;
|
||||
}
|
||||
}
|
||||
|
||||
private static Fixture Create(IReadOnlyList<RawSurface> surfaces)
|
||||
|
|
|
|||
|
|
@ -537,14 +537,50 @@ public class RetailChaseCameraTests
|
|||
}
|
||||
|
||||
[Fact]
|
||||
public void AdjustDistance_ClampsToRange()
|
||||
public void AdjustDistance_UsesRetailMultiplicativeScale()
|
||||
{
|
||||
var cam = new RetailChaseCamera { Distance = 5f };
|
||||
cam.AdjustDistance(-100f);
|
||||
Assert.Equal(RetailChaseCamera.DistanceMin, cam.Distance);
|
||||
cam.AdjustDistance(+1f);
|
||||
Assert.Equal(6f, cam.Distance, 5);
|
||||
|
||||
cam.AdjustDistance(+200f);
|
||||
Assert.Equal(RetailChaseCamera.DistanceMax, cam.Distance);
|
||||
cam.AdjustDistance(-1f);
|
||||
Assert.Equal(4.8f, cam.Distance, 5);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AdjustDistance_RefusesWholeWriteAtRetailComponentAndNearLimits()
|
||||
{
|
||||
var far = new RetailChaseCamera
|
||||
{
|
||||
Distance = 9.9f,
|
||||
Pitch = 0f,
|
||||
YawOffset = 0f,
|
||||
};
|
||||
far.AdjustDistance(+1f);
|
||||
Assert.Equal(9.9f, far.Distance, 5);
|
||||
|
||||
var near = new RetailChaseCamera
|
||||
{
|
||||
Distance = 0.55f,
|
||||
Pitch = 0f,
|
||||
};
|
||||
near.AdjustDistance(-1f);
|
||||
Assert.Equal(0.55f, near.Distance, 5);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AdjustDistance_DiagonalOrbitUsesIndependentRetailXAndYLimits()
|
||||
{
|
||||
var cam = new RetailChaseCamera
|
||||
{
|
||||
Distance = 12f,
|
||||
Pitch = 0f,
|
||||
YawOffset = MathF.PI / 4f,
|
||||
};
|
||||
|
||||
cam.AdjustDistance(+0.5f);
|
||||
|
||||
Assert.Equal(13.2f, cam.Distance, 5);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
|
@ -579,18 +615,37 @@ public class RetailChaseCameraTests
|
|||
cam.AdjustDistance(1f);
|
||||
|
||||
Assert.False(cam.IsInHead);
|
||||
Assert.Equal(RetailChaseCamera.DistanceMin + 1f, cam.Distance);
|
||||
Assert.Equal(MathF.Sqrt(0.6f * 0.6f + 0.5f * 0.5f), cam.Distance, 5);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AdjustPitch_ClampsToRange()
|
||||
public void AdjustPitch_UsesRetailEightDegreeRotationAndPreservesLength()
|
||||
{
|
||||
var cam = new RetailChaseCamera { Pitch = 0f };
|
||||
cam.AdjustPitch(-10f);
|
||||
Assert.Equal(RetailChaseCamera.PitchMin, cam.Pitch);
|
||||
var cam = new RetailChaseCamera { Distance = 5f, Pitch = 0f };
|
||||
cam.AdjustPitch(+1f);
|
||||
|
||||
cam.AdjustPitch(+10f);
|
||||
Assert.Equal(RetailChaseCamera.PitchMax, cam.Pitch);
|
||||
Assert.Equal(RetailChaseCamera.OffsetAngleRadians, cam.Pitch, 6);
|
||||
Assert.Equal(5f, cam.Distance, 6);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AdjustPitch_RefusesWholeWriteBelowRetailVerticalLimit()
|
||||
{
|
||||
var cam = new RetailChaseCamera { Distance = 3f, Pitch = -0.55f };
|
||||
float before = cam.Pitch;
|
||||
|
||||
cam.AdjustPitch(-1f);
|
||||
|
||||
Assert.Equal(before, cam.Pitch);
|
||||
Assert.Equal(3f, cam.Distance);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AdjustYaw_UsesRetailEightDegreeRotationUnit()
|
||||
{
|
||||
var cam = new RetailChaseCamera();
|
||||
cam.AdjustYaw(+1f);
|
||||
Assert.Equal(RetailChaseCamera.OffsetAngleRadians, cam.YawOffset, 6);
|
||||
}
|
||||
|
||||
// ── Camera collision (A8.F) ───────────────────────────────────────
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue