diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/instance/TransformedInstance.java b/common/src/lib/java/dev/engine_room/flywheel/lib/instance/TransformedInstance.java index 8bab28975..ffab518eb 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/instance/TransformedInstance.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/instance/TransformedInstance.java @@ -1,5 +1,6 @@ package dev.engine_room.flywheel.lib.instance; +import org.joml.AxisAngle4f; import org.joml.Matrix4f; import org.joml.Matrix4fc; import org.joml.Quaternionfc; @@ -9,6 +10,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import dev.engine_room.flywheel.api.instance.InstanceHandle; import dev.engine_room.flywheel.api.instance.InstanceType; import dev.engine_room.flywheel.lib.transform.Affine; +import net.minecraft.core.Direction; public class TransformedInstance extends ColoredLitInstance implements Affine { public final Matrix4f pose = new Matrix4f(); @@ -17,12 +19,6 @@ public class TransformedInstance extends ColoredLitInstance implements Affine> extends Translate, Rotate, Scale { default Self rotateAround(Quaternionfc quaternion, float x, float y, float z) { @@ -15,19 +16,18 @@ public interface Affine> extends Translate, Rota } default Self rotateAround(Quaternionfc quaternion, Vector3fc vec) { - return translate(vec.x(), vec.y(), vec.z()).rotate(quaternion) - .translateBack(vec.x(), vec.y(), vec.z()); + return rotateAround(quaternion, vec.x(), vec.y(), vec.z()); } default Self rotateCentered(Quaternionfc q) { return rotateAround(q, CENTER, CENTER, CENTER); } - default Self rotateCentered(float radians, Vector3fc axis) { + default Self rotateCentered(float radians, float axisX, float axisY, float axisZ) { if (radians == 0) { return self(); } - return rotateCentered(new Quaternionf().setAngleAxis(radians, axis.x(), axis.y(), axis.z())); + return rotateCentered(new Quaternionf().setAngleAxis(radians, axisX, axisY, axisZ)); } default Self rotateCentered(float radians, Axis axis) { @@ -37,10 +37,59 @@ public interface Affine> extends Translate, Rota return rotateCentered(axis.rotation(radians)); } + default Self rotateCentered(float radians, Vector3fc axis) { + return rotateCentered(radians, axis.x(), axis.y(), axis.z()); + } + + default Self rotateCentered(float radians, Direction.Axis axis) { + return rotateCentered(radians, Direction.fromAxisAndDirection(axis, Direction.AxisDirection.POSITIVE)); + } + default Self rotateCentered(float radians, Direction axis) { - if (radians == 0) { - return self(); - } - return rotateCentered(radians, axis.step()); + return rotateCentered(radians, axis.getStepX(), axis.getStepY(), axis.getStepZ()); + } + + default Self rotateCenteredDegrees(float degrees, float axisX, float axisY, float axisZ) { + return rotateCentered(Mth.DEG_TO_RAD * degrees, axisX, axisY, axisZ); + } + + default Self rotateCenteredDegrees(float degrees, Axis axis) { + return rotateCentered(Mth.DEG_TO_RAD * degrees, axis); + } + + default Self rotateCenteredDegrees(float degrees, Vector3fc axis) { + return rotateCentered(Mth.DEG_TO_RAD * degrees, axis); + } + + default Self rotateCenteredDegrees(float degrees, Direction axis) { + return rotateCentered(Mth.DEG_TO_RAD * degrees, axis); + } + + default Self rotateCenteredDegrees(float degrees, Direction.Axis axis) { + return rotateCentered(Mth.DEG_TO_RAD * degrees, axis); + } + + default Self rotateXCentered(float radians) { + return rotateCentered(radians, Axis.XP); + } + + default Self rotateYCentered(float radians) { + return rotateCentered(radians, Axis.YP); + } + + default Self rotateZCentered(float radians) { + return rotateCentered(radians, Axis.ZP); + } + + default Self rotateXCenteredDegrees(float degrees) { + return rotateXCentered(Mth.DEG_TO_RAD * degrees); + } + + default Self rotateYCenteredDegrees(float degrees) { + return rotateYCentered(Mth.DEG_TO_RAD * degrees); + } + + default Self rotateZCenteredDegrees(float degrees) { + return rotateZCentered(Mth.DEG_TO_RAD * degrees); } } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/transform/Rotate.java b/common/src/lib/java/dev/engine_room/flywheel/lib/transform/Rotate.java index 8684abd46..56b8b7f6e 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/transform/Rotate.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/transform/Rotate.java @@ -8,6 +8,7 @@ import org.joml.Vector3fc; import com.mojang.math.Axis; import net.minecraft.core.Direction; +import net.minecraft.util.Mth; public interface Rotate> { Self rotate(Quaternionfc quaternion); @@ -16,11 +17,12 @@ public interface Rotate> { return rotate(new Quaternionf(axisAngle)); } - default Self rotate(float radians, Vector3fc axis) { + default Self rotate(float radians, float axisX, float axisY, float axisZ) { if (radians == 0) { return self(); } - return rotate(new Quaternionf().setAngleAxis(radians, axis.x(), axis.y(), axis.z())); + return rotate(new Quaternionf().setAngleAxis(radians, axisX, axisY, axisZ)); + } default Self rotate(float radians, Axis axis) { @@ -30,47 +32,36 @@ public interface Rotate> { return rotate(axis.rotation(radians)); } + default Self rotate(float radians, Vector3fc axis) { + return rotate(radians, axis.x(), axis.y(), axis.z()); + } + default Self rotate(float radians, Direction axis) { - if (radians == 0) { - return self(); - } - return rotate(radians, axis.step()); + return rotate(radians, axis.getStepX(), axis.getStepY(), axis.getStepZ()); } default Self rotate(float radians, Direction.Axis axis) { - return switch (axis) { - case X -> rotateX(radians); - case Y -> rotateY(radians); - case Z -> rotateZ(radians); - }; + return rotate(radians, Direction.fromAxisAndDirection(axis, Direction.AxisDirection.POSITIVE)); } - default Self rotateDegrees(float degrees, Vector3fc axis) { - if (degrees == 0) { - return self(); - } - return rotate((float) Math.toRadians(degrees), axis); + default Self rotateDegrees(float degrees, float axisX, float axisY, float axisZ) { + return rotate(Mth.DEG_TO_RAD * degrees, axisX, axisY, axisZ); } default Self rotateDegrees(float degrees, Axis axis) { - if (degrees == 0) { - return self(); - } - return rotate(axis.rotationDegrees(degrees)); + return rotate(Mth.DEG_TO_RAD * degrees, axis); + } + + default Self rotateDegrees(float degrees, Vector3fc axis) { + return rotate(Mth.DEG_TO_RAD * degrees, axis); } default Self rotateDegrees(float degrees, Direction axis) { - if (degrees == 0) { - return self(); - } - return rotate((float) Math.toRadians(degrees), axis); + return rotate(Mth.DEG_TO_RAD * degrees, axis); } default Self rotateDegrees(float degrees, Direction.Axis axis) { - if (degrees == 0) { - return self(); - } - return rotate((float) Math.toRadians(degrees), axis); + return rotate(Mth.DEG_TO_RAD * degrees, axis); } default Self rotateX(float radians) { @@ -86,15 +77,15 @@ public interface Rotate> { } default Self rotateXDegrees(float degrees) { - return rotateDegrees(degrees, Axis.XP); + return rotateX(Mth.DEG_TO_RAD * degrees); } default Self rotateYDegrees(float degrees) { - return rotateDegrees(degrees, Axis.YP); + return rotateY(Mth.DEG_TO_RAD * degrees); } default Self rotateZDegrees(float degrees) { - return rotateDegrees(degrees, Axis.ZP); + return rotateZ(Mth.DEG_TO_RAD * degrees); } default Self rotateToFace(Direction facing) { @@ -108,6 +99,10 @@ public interface Rotate> { }; } + default Self rotateTo(Vector3fc from, Vector3fc to) { + return rotate(new Quaternionf().rotateTo(from, to)); + } + @SuppressWarnings("unchecked") default Self self() { return (Self) this;