From 7006c51dfd38139a04b2b5588d34a27125fde74e Mon Sep 17 00:00:00 2001 From: Scribble Date: Thu, 22 Feb 2024 12:01:46 +0100 Subject: [PATCH] [VirtualInput] Added tests for VirtualCameraAngleInput --- .../playbackhooks/MixinEntityRenderer.java | 2 +- .../tasmod/virtual/VirtualInput.java | 4 +- .../java/tasmod/virtual/VirtualInputTest.java | 113 +++++++++++++++++- 3 files changed, 112 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/mixin/playbackhooks/MixinEntityRenderer.java b/src/main/java/com/minecrafttas/tasmod/mixin/playbackhooks/MixinEntityRenderer.java index 76699ffd..ee008ef1 100644 --- a/src/main/java/com/minecrafttas/tasmod/mixin/playbackhooks/MixinEntityRenderer.java +++ b/src/main/java/com/minecrafttas/tasmod/mixin/playbackhooks/MixinEntityRenderer.java @@ -85,7 +85,7 @@ public void playback_injectAtStartSection(float partialTicks, long nanoTime, Cal } } - @Redirect(method = "updateCameraAndRender", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/EntityPlayerSP;turn(FF)V")) + @Redirect(method = "updateCameraAndRender", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/entity/EntityPlayerSP;turn(FF)V")) public void playback_stopVanilla(EntityPlayerSP player, float deltaYaw, float deltaPitch){ if(TASmodClient.tickratechanger.ticksPerSecond == 0){ player.turn(deltaYaw, deltaPitch); diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput.java index bab47891..b51a7a87 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput.java @@ -633,7 +633,7 @@ public Float getCurrentYaw() { * @return A triple of pitch, yaw and roll, as left, middle and right respectively */ public Triple getInterpolatedState(float partialTick, float pitch, float yaw, boolean enable) { - if (!enable) { + if (!enable) { // If interpolation is not enabled, return the values of nextCameraAngle return Triple.of(nextCameraAngle.getPitch() == null ? pitch : nextCameraAngle.getPitch(), nextCameraAngle.getYaw() == null ? pitch : nextCameraAngle.getYaw() + 180, 0f); } @@ -641,7 +641,7 @@ public Triple getInterpolatedState(float partialTick, float float interpolatedYaw = 0f; if (cameraAngleInterpolationStates.size() == 1) { // If no interpolation data was specified, interpolate over 2 values - interpolatedPitch = (float) MathHelper.clampedLerp(currentCameraAngle.getPitch(), cameraAngleInterpolationStates.get(0).getPitch(), partialTick); + interpolatedPitch = (float) MathHelper.clampedLerp(cameraAngleInterpolationStates.get(0).getPitch(), currentCameraAngle.getPitch(), partialTick); interpolatedYaw = (float) MathHelper.clampedLerp(currentCameraAngle.getYaw(), cameraAngleInterpolationStates.get(0).getYaw() + 180, partialTick); } else { diff --git a/src/test/java/tasmod/virtual/VirtualInputTest.java b/src/test/java/tasmod/virtual/VirtualInputTest.java index dc6a6b2c..060ce206 100644 --- a/src/test/java/tasmod/virtual/VirtualInputTest.java +++ b/src/test/java/tasmod/virtual/VirtualInputTest.java @@ -5,8 +5,10 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; +import org.apache.commons.lang3.tuple.Triple; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; @@ -134,7 +136,7 @@ void testKeyboardAddPresses() { // Read out values from the subtick assertEquals(VirtualKey.S.getKeycode(), virtual.KEYBOARD.getEventKeyboardKey()); - assertEquals(true, virtual.KEYBOARD.getEventKeyboardState()); + assertTrue(virtual.KEYBOARD.getEventKeyboardState()); assertEquals('s', virtual.KEYBOARD.getEventKeyboardCharacter()); // Check if subtick list is empty @@ -241,10 +243,113 @@ void testMouseRemovePresses() { } /** - * Test camera angle + * Test camera angle on tick */ @Test - void testCameraAngles() { - + void testCurrentCameraAngles() { + VirtualInput virtual = new VirtualInput(LOGGER); + + virtual.CAMERA_ANGLE.setCamera(0f, 0f); + virtual.CAMERA_ANGLE.updateNextCameraAngle(10f, 20f); + virtual.CAMERA_ANGLE.updateNextCameraAngle(20f, 30f); + + virtual.CAMERA_ANGLE.nextCameraTick(); + + assertEquals(30f, virtual.CAMERA_ANGLE.getCurrentPitch()); + assertEquals(50f, virtual.CAMERA_ANGLE.getCurrentYaw()); + } + + /** + * Test interpolation but with no playback running. Returns the valuies of nextCameraAngle + */ + @Test + void testInterpolationDisabled(){ + VirtualInput virtual = new VirtualInput(LOGGER); + + virtual.CAMERA_ANGLE.setCamera(0f, 0f); + virtual.CAMERA_ANGLE.updateNextCameraAngle(10f, 20f); + virtual.CAMERA_ANGLE.updateNextCameraAngle(20f, 30f); + + Triple expected = Triple.of(30f, 50f+180f, 0f); + Triple actual = virtual.CAMERA_ANGLE.getInterpolatedState(0f, 1f, 2f, false); + + assertEquals(expected, actual); + } + + /** + * Test interpolation but with playback running. + */ + @Test + void testInterpolationEnabled(){ + VirtualInput virtual = new VirtualInput(LOGGER); + + virtual.CAMERA_ANGLE.setCamera(0f, 0f); + virtual.CAMERA_ANGLE.updateNextCameraAngle(0f, 0f); + virtual.CAMERA_ANGLE.updateNextCameraAngle(10f, 10f); + virtual.CAMERA_ANGLE.updateNextCameraAngle(10f, 10f); + virtual.CAMERA_ANGLE.updateNextCameraAngle(10f, 10f); + virtual.CAMERA_ANGLE.updateNextCameraAngle(10f, 10f); + virtual.CAMERA_ANGLE.updateNextCameraAngle(10f, 10f); + virtual.CAMERA_ANGLE.updateNextCameraAngle(10f, 10f); + virtual.CAMERA_ANGLE.updateNextCameraAngle(10f, 10f); + virtual.CAMERA_ANGLE.updateNextCameraAngle(10f, 10f); + virtual.CAMERA_ANGLE.updateNextCameraAngle(10f, 10f); + + virtual.CAMERA_ANGLE.nextCameraTick(); + + Triple expected = Triple.of(0f, 0f, 0f); + Triple actual = virtual.CAMERA_ANGLE.getInterpolatedState(0f, 0f, 0f, true); + assertEquals(expected, actual); + + expected = Triple.of(10f, 10f, 0f); + actual = virtual.CAMERA_ANGLE.getInterpolatedState(0.1f, 0f, 0f, true); + assertEquals(expected, actual); + + expected = Triple.of(10f, 10f, 0f); + actual = virtual.CAMERA_ANGLE.getInterpolatedState(0.199f, 0f, 0f, true); + assertEquals(expected, actual); + + expected = Triple.of(20f, 20f, 0f); + actual = virtual.CAMERA_ANGLE.getInterpolatedState(0.2f, 0f, 0f, true); + assertEquals(expected, actual); + + expected = Triple.of(30f, 30f, 0f); + actual = virtual.CAMERA_ANGLE.getInterpolatedState(0.3f, 0f, 0f, true); + assertEquals(expected, actual); + + expected = Triple.of(40f, 40f, 0f); + actual = virtual.CAMERA_ANGLE.getInterpolatedState(0.4f, 0f, 0f, true); + assertEquals(expected, actual); + + expected = Triple.of(50f, 50f, 0f); + actual = virtual.CAMERA_ANGLE.getInterpolatedState(0.5f, 0f, 0f, true); + assertEquals(expected, actual); + + expected = Triple.of(60f, 60f, 0f); + actual = virtual.CAMERA_ANGLE.getInterpolatedState(0.6f, 0f, 0f, true); + assertEquals(expected, actual); + } + + /** + * Test interpolation but with playback running, but there are only 2 values + */ + @Test + @Disabled + void testInterpolationEnabledLegacy(){ + VirtualInput virtual = new VirtualInput(LOGGER); + + virtual.CAMERA_ANGLE.setCamera(0f, 0f); + + virtual.CAMERA_ANGLE.updateNextCameraAngle(10f, 10f); + + virtual.CAMERA_ANGLE.nextCameraTick(); + + Triple expected = Triple.of(0f, 0f, 0f); + Triple actual = virtual.CAMERA_ANGLE.getInterpolatedState(0f, 0f, 0f, true); + assertEquals(expected, actual); + + expected = Triple.of(10f, 10f, 0f); + actual = virtual.CAMERA_ANGLE.getInterpolatedState(0.3f, 0f, 0f, true); + assertEquals(expected, actual); } }