minecraft-src/net/minecraft/client/animation/AnimationChannel.java
2025-07-04 01:41:11 +03:00

48 lines
1.9 KiB
Java

package net.minecraft.client.animation;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.util.Mth;
import org.joml.Vector3f;
@Environment(EnvType.CLIENT)
public record AnimationChannel(AnimationChannel.Target target, Keyframe... keyframes) {
@Environment(EnvType.CLIENT)
public interface Interpolation {
Vector3f apply(Vector3f vector3f, float f, Keyframe[] keyframes, int i, int j, float g);
}
@Environment(EnvType.CLIENT)
public static class Interpolations {
public static final AnimationChannel.Interpolation LINEAR = (vector3f, f, keyframes, i, j, g) -> {
Vector3f vector3f2 = keyframes[i].target();
Vector3f vector3f3 = keyframes[j].target();
return vector3f2.lerp(vector3f3, f, vector3f).mul(g);
};
public static final AnimationChannel.Interpolation CATMULLROM = (vector3f, f, keyframes, i, j, g) -> {
Vector3f vector3f2 = keyframes[Math.max(0, i - 1)].target();
Vector3f vector3f3 = keyframes[i].target();
Vector3f vector3f4 = keyframes[j].target();
Vector3f vector3f5 = keyframes[Math.min(keyframes.length - 1, j + 1)].target();
vector3f.set(
Mth.catmullrom(f, vector3f2.x(), vector3f3.x(), vector3f4.x(), vector3f5.x()) * g,
Mth.catmullrom(f, vector3f2.y(), vector3f3.y(), vector3f4.y(), vector3f5.y()) * g,
Mth.catmullrom(f, vector3f2.z(), vector3f3.z(), vector3f4.z(), vector3f5.z()) * g
);
return vector3f;
};
}
@Environment(EnvType.CLIENT)
public interface Target {
void apply(ModelPart modelPart, Vector3f vector3f);
}
@Environment(EnvType.CLIENT)
public static class Targets {
public static final AnimationChannel.Target POSITION = ModelPart::offsetPos;
public static final AnimationChannel.Target ROTATION = ModelPart::offsetRotation;
public static final AnimationChannel.Target SCALE = ModelPart::offsetScale;
}
}