Skip to content

Commit

Permalink
Make camera motion smoother
Browse files Browse the repository at this point in the history
  • Loading branch information
lucyydotp committed Jun 6, 2024
1 parent 4b0cda7 commit 10c3580
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 11 deletions.
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ plugins {
}

group = "me.lucyydotp"
version = "0.1.0"
version = "0.1.1-SNAPSHOT"

java.toolchain.languageVersion = JavaLanguageVersion.of(17)

Expand Down
7 changes: 7 additions & 0 deletions src/main/java/me/lucyydotp/papers/ArmorStandExt.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package me.lucyydotp.papers;

import net.minecraft.core.Rotations;

public interface ArmorStandExt {
Rotations paper$lastHeadRot();
}
16 changes: 9 additions & 7 deletions src/main/java/me/lucyydotp/papers/CameraPerspectiveMode.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.Minecraft;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.decoration.ArmorStand;
import org.jetbrains.annotations.NotNull;
import org.joml.Quaternionf;
Expand All @@ -21,7 +22,7 @@ public sealed interface CameraPerspectiveMode {
*
* @param cameraPoseStack a pose stack to mutate
*/
void transform(PoseStack cameraPoseStack);
void transform(PoseStack cameraPoseStack, float tickProgress, long time);

/**
* A perspective mode that derives rotation from an armour stand's body rotation and head pose.
Expand Down Expand Up @@ -51,12 +52,10 @@ public boolean canContinueToUse() {
}

@Override
public void transform(PoseStack cameraPoseStack) {
public void transform(PoseStack cameraPoseStack, float tickProgress, long time) {
final var player = Minecraft.getInstance().player;
if (!player.isPassenger()) return;

final var pose = armorStand.getHeadPose();

// fixme: is doing this on the render thread bad?
player.turn(
(armorStand.getYRot() - lastYRot) / 0.15,
Expand All @@ -65,11 +64,14 @@ public void transform(PoseStack cameraPoseStack) {

lastYRot = armorStand.getYRot();

final var pose = armorStand.getHeadPose();
final var lastPose = ((ArmorStandExt) armorStand).paper$lastHeadRot();

cameraPoseStack.rotateAround(
new Quaternionf()
.rotateAxis((float) Math.toRadians(pose.getZ()), player.getForward().toVector3f())
.rotateAxis((float) Math.toRadians(pose.getY()), player.getUpVector(1).toVector3f())
.rotateAxis((float) Math.toRadians(-pose.getX()), player.getForward().toVector3f().rotateY((float) (Math.PI / 2f))),
.rotateAxis((float) Math.toRadians(Mth.lerp(tickProgress, lastPose.getZ(), pose.getZ())), player.getForward().toVector3f())
.rotateAxis((float) Math.toRadians(Mth.lerp(tickProgress, lastPose.getY(), pose.getY())), player.getUpVector(1).toVector3f())
.rotateAxis((float) Math.toRadians(Mth.lerp(tickProgress, -lastPose.getX(), -pose.getX())), player.getForward().toVector3f().rotateY((float) (Math.PI / 2f))),
0,
// fixme: this might be a little low?
(float) (-player.getBbHeight() - player.getMyRidingOffset()),
Expand Down
43 changes: 41 additions & 2 deletions src/main/java/me/lucyydotp/papers/mixin/ArmorStandMixin.java
Original file line number Diff line number Diff line change
@@ -1,21 +1,55 @@
package me.lucyydotp.papers.mixin;

import com.llamalad7.mixinextras.sugar.Local;
import me.lucyydotp.papers.ArmorStandExt;
import me.lucyydotp.papers.CameraPerspectiveMode;
import me.lucyydotp.papers.PassengerPerspectiveMod;
import net.minecraft.core.Rotations;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.decoration.ArmorStand;
import net.minecraft.world.level.Level;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.*;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin(ArmorStand.class)
public abstract class ArmorStandMixin extends Entity {
public abstract class ArmorStandMixin extends Entity implements ArmorStandExt {

@Shadow
@Final
private static Rotations DEFAULT_HEAD_POSE;

@Shadow
private Rotations headPose;

@Unique
private Rotations papers$lastHeadRot = DEFAULT_HEAD_POSE;

public ArmorStandMixin(EntityType<?> entityType, Level level) {
super(entityType, level);
throw new AbstractMethodError("Mixin abstract class constructor");
}

@Inject(
method = "setHeadPose",
at = @At("HEAD")
)
public void setLastHeadPose(Rotations rotations, CallbackInfo ci) {
papers$lastHeadRot = headPose;
}

@Inject(
method = "tick",
at = @At("HEAD")
)
public void clearLastHeadPose(CallbackInfo ci, @Local(name = "rotations") Rotations rotations) {
if (this.headPose.equals(rotations)) {
papers$lastHeadRot = headPose;
}
}

/**
* Makes the current target armour stand glow.
*/
Expand All @@ -29,4 +63,9 @@ public boolean isCurrentlyGlowing() {
ash.shouldGlow((ArmorStand) (Object) this)
);
}

@Override
public Rotations paper$lastHeadRot() {
return papers$lastHeadRot;
}
}
20 changes: 19 additions & 1 deletion src/main/java/me/lucyydotp/papers/mixin/GameRendererMixin.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,30 @@
import me.lucyydotp.papers.PassengerPerspectiveMod;
import net.minecraft.client.renderer.GameRenderer;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.ModifyArg;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin(GameRenderer.class)
public class GameRendererMixin {

@Unique
private float papers$f;

@Unique
private long papers$l;

@Inject(
method = "renderLevel",
at = @At("HEAD")
)
public void setF(float f, long l, PoseStack poseStack, CallbackInfo ci) {
papers$f = f;
papers$l = l;
}

/**
* Applies the active perspective mode's camera transformation.
*/
Expand All @@ -24,7 +42,7 @@ public class GameRendererMixin {
public PoseStack addRidePerspectiveRotation(PoseStack poseStack) {
final var perspectiveMode = PassengerPerspectiveMod.getPerspectiveMode();
if (perspectiveMode != null) {
perspectiveMode.transform(poseStack);
perspectiveMode.transform(poseStack, papers$f, papers$l);
}
return poseStack;
}
Expand Down

0 comments on commit 10c3580

Please sign in to comment.