minecraft-source/src/com/mojang/blaze3d/vertex/PoseStack.java

89 lines
2.6 KiB
Java

package com.mojang.blaze3d.vertex;
import java.util.ArrayDeque;
import com.mojang.math.Quaternion;
import net.minecraft.util.Mth;
import net.minecraft.Util;
import com.mojang.math.Matrix3f;
import com.mojang.math.Matrix4f;
import com.google.common.collect.Queues;
import java.util.Deque;
public class PoseStack {
private final Deque<Pose> poseStack;
public PoseStack() {
final Matrix4f b2;
final Matrix3f a3;
this.poseStack = Util.<Deque<Pose>>make(Queues.newArrayDeque(), arrayDeque -> {
b2 = new Matrix4f();
b2.setIdentity();
a3 = new Matrix3f();
a3.setIdentity();
arrayDeque.add(new Pose(b2, a3));
});
}
public void translate(final double double1, final double double2, final double double3) {
final Pose a8 = this.poseStack.getLast();
a8.pose.multiply(Matrix4f.createTranslateMatrix((float)double1, (float)double2, (float)double3));
}
public void scale(final float float1, final float float2, final float float3) {
final Pose a5 = this.poseStack.getLast();
a5.pose.multiply(Matrix4f.createScaleMatrix(float1, float2, float3));
if (float1 == float2 && float2 == float3) {
if (float1 > 0.0f) {
return;
}
a5.normal.mul(-1.0f);
}
final float float4 = 1.0f / float1;
final float float5 = 1.0f / float2;
final float float6 = 1.0f / float3;
final float float7 = Mth.fastInvCubeRoot(float4 * float5 * float6);
a5.normal.mul(Matrix3f.createScaleMatrix(float7 * float4, float7 * float5, float7 * float6));
}
public void mulPose(final Quaternion d) {
final Pose a3 = this.poseStack.getLast();
a3.pose.multiply(d);
a3.normal.mul(d);
}
public void pushPose() {
final Pose a2 = this.poseStack.getLast();
this.poseStack.addLast(new Pose(a2.pose.copy(), a2.normal.copy()));
}
public void popPose() {
this.poseStack.removeLast();
}
public Pose last() {
return this.poseStack.getLast();
}
public boolean clear() {
return this.poseStack.size() == 1;
}
public static final class Pose {
private final Matrix4f pose;
private final Matrix3f normal;
private Pose(final Matrix4f b, final Matrix3f a) {
this.pose = b;
this.normal = a;
}
public Matrix4f pose() {
return this.pose;
}
public Matrix3f normal() {
return this.normal;
}
}
}