PoseStack.java

com.mojang.blaze3d.vertex.PoseStack

信息

  • 全限定名:com.mojang.blaze3d.vertex.PoseStack
  • 类型:public class
  • 包:com.mojang.blaze3d.vertex
  • 源码路径:src/main/java/com/mojang/blaze3d/vertex/PoseStack.java
  • 起始行号:L19
  • 职责:

    TODO

字段/常量

  • poses

    • 类型: List<PoseStack.Pose>
    • 修饰符: private final
    • 源码定位: L20
    • 说明:

      TODO

  • lastIndex

    • 类型: int
    • 修饰符: private
    • 源码定位: L21
    • 说明:

      TODO

内部类/嵌套类型

  • com.mojang.blaze3d.vertex.PoseStack.Pose
    • 类型: class
    • 修饰符: public static final
    • 源码定位: L90
    • 说明:

      TODO

构造器

public PoseStack() @ L23

  • 构造器名:PoseStack
  • 源码定位:L23
  • 修饰符:public

参数:

说明:

TODO

方法

下面的方法块按源码顺序生成。

public void translate(double xo, double yo, double zo) @ L27

  • 方法名:translate
  • 源码定位:L27
  • 返回类型:void
  • 修饰符:public

参数:

  • xo: double
  • yo: double
  • zo: double

说明:

TODO

public void translate(float xo, float yo, float zo) @ L31

  • 方法名:translate
  • 源码定位:L31
  • 返回类型:void
  • 修饰符:public

参数:

  • xo: float
  • yo: float
  • zo: float

说明:

TODO

public void translate(Vec3 offset) @ L35

  • 方法名:translate
  • 源码定位:L35
  • 返回类型:void
  • 修饰符:public

参数:

  • offset: Vec3

说明:

TODO

public void scale(float xScale, float yScale, float zScale) @ L39

  • 方法名:scale
  • 源码定位:L39
  • 返回类型:void
  • 修饰符:public

参数:

  • xScale: float
  • yScale: float
  • zScale: float

说明:

TODO

public void mulPose(Quaternionfc by) @ L43

  • 方法名:mulPose
  • 源码定位:L43
  • 返回类型:void
  • 修饰符:public

参数:

  • by: Quaternionfc

说明:

TODO

public void rotateAround(Quaternionfc rotation, float pivotX, float pivotY, float pivotZ) @ L47

  • 方法名:rotateAround
  • 源码定位:L47
  • 返回类型:void
  • 修饰符:public

参数:

  • rotation: Quaternionfc
  • pivotX: float
  • pivotY: float
  • pivotZ: float

说明:

TODO

public void pushPose() @ L51

  • 方法名:pushPose
  • 源码定位:L51
  • 返回类型:void
  • 修饰符:public

参数:

说明:

TODO

public void popPose() @ L61

  • 方法名:popPose
  • 源码定位:L61
  • 返回类型:void
  • 修饰符:public

参数:

说明:

TODO

public PoseStack.Pose last() @ L69

  • 方法名:last
  • 源码定位:L69
  • 返回类型:PoseStack.Pose
  • 修饰符:public

参数:

说明:

TODO

public boolean isEmpty() @ L73

  • 方法名:isEmpty
  • 源码定位:L73
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public void setIdentity() @ L77

  • 方法名:setIdentity
  • 源码定位:L77
  • 返回类型:void
  • 修饰符:public

参数:

说明:

TODO

public void mulPose(Matrix4fc matrix) @ L81

  • 方法名:mulPose
  • 源码定位:L81
  • 返回类型:void
  • 修饰符:public

参数:

  • matrix: Matrix4fc

说明:

TODO

public void mulPose(Transformation matrix) @ L85

  • 方法名:mulPose
  • 源码定位:L85
  • 返回类型:void
  • 修饰符:public

参数:

  • matrix: Transformation

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class PoseStack {
    private final List<PoseStack.Pose> poses = new ArrayList<>(16);
    private int lastIndex;
 
    public PoseStack() {
        this.poses.add(new PoseStack.Pose());
    }
 
    public void translate(double xo, double yo, double zo) {
        this.translate((float)xo, (float)yo, (float)zo);
    }
 
    public void translate(float xo, float yo, float zo) {
        this.last().translate(xo, yo, zo);
    }
 
    public void translate(Vec3 offset) {
        this.translate(offset.x, offset.y, offset.z);
    }
 
    public void scale(float xScale, float yScale, float zScale) {
        this.last().scale(xScale, yScale, zScale);
    }
 
    public void mulPose(Quaternionfc by) {
        this.last().rotate(by);
    }
 
    public void rotateAround(Quaternionfc rotation, float pivotX, float pivotY, float pivotZ) {
        this.last().rotateAround(rotation, pivotX, pivotY, pivotZ);
    }
 
    public void pushPose() {
        PoseStack.Pose lastPose = this.last();
        this.lastIndex++;
        if (this.lastIndex >= this.poses.size()) {
            this.poses.add(lastPose.copy());
        } else {
            this.poses.get(this.lastIndex).set(lastPose);
        }
    }
 
    public void popPose() {
        if (this.lastIndex == 0) {
            throw new NoSuchElementException();
        } else {
            this.lastIndex--;
        }
    }
 
    public PoseStack.Pose last() {
        return this.poses.get(this.lastIndex);
    }
 
    public boolean isEmpty() {
        return this.lastIndex == 0;
    }
 
    public void setIdentity() {
        this.last().setIdentity();
    }
 
    public void mulPose(Matrix4fc matrix) {
        this.last().mulPose(matrix);
    }
 
    public void mulPose(Transformation matrix) {
        this.last().mulPose(matrix);
    }
 
    @OnlyIn(Dist.CLIENT)
    public static final class Pose {
        private final Matrix4f pose = new Matrix4f();
        private final Matrix3f normal = new Matrix3f();
        private boolean trustedNormals = true;
 
        private void computeNormalMatrix() {
            this.normal.set(this.pose).invert().transpose();
            this.trustedNormals = false;
        }
 
        public void set(PoseStack.Pose pose) {
            this.pose.set(pose.pose);
            this.normal.set(pose.normal);
            this.trustedNormals = pose.trustedNormals;
        }
 
        public Matrix4f pose() {
            return this.pose;
        }
 
        public Matrix3f normal() {
            return this.normal;
        }
 
        public Vector3f transformNormal(Vector3fc normal, Vector3f destination) {
            return this.transformNormal(normal.x(), normal.y(), normal.z(), destination);
        }
 
        public Vector3f transformNormal(float x, float y, float z, Vector3f destination) {
            Vector3f result = this.normal.transform(x, y, z, destination);
            return this.trustedNormals ? result : result.normalize();
        }
 
        public Matrix4f translate(float xo, float yo, float zo) {
            return this.pose.translate(xo, yo, zo);
        }
 
        public void scale(float xScale, float yScale, float zScale) {
            this.pose.scale(xScale, yScale, zScale);
            if (Math.abs(xScale) == Math.abs(yScale) && Math.abs(yScale) == Math.abs(zScale)) {
                if (xScale < 0.0F || yScale < 0.0F || zScale < 0.0F) {
                    this.normal.scale(Math.signum(xScale), Math.signum(yScale), Math.signum(zScale));
                }
            } else {
                this.normal.scale(1.0F / xScale, 1.0F / yScale, 1.0F / zScale);
                this.trustedNormals = false;
            }
        }
 
        public void rotate(Quaternionfc by) {
            this.pose.rotate(by);
            this.normal.rotate(by);
        }
 
        public void rotateAround(Quaternionfc rotation, float pivotX, float pivotY, float pivotZ) {
            this.pose.rotateAround(rotation, pivotX, pivotY, pivotZ);
            this.normal.rotate(rotation);
        }
 
        public void setIdentity() {
            this.pose.identity();
            this.normal.identity();
            this.trustedNormals = true;
        }
 
        public void mulPose(Matrix4fc matrix) {
            this.pose.mul(matrix);
            if (!MatrixUtil.isPureTranslation(matrix)) {
                if (MatrixUtil.checkPropertyRaw(matrix, 16)) {
                    this.normal.mul(new Matrix3f(matrix));
                } else {
                    this.computeNormalMatrix();
                }
            }
        }
 
        public void mulPose(Transformation transformation) {
            this.mulPose(transformation.getMatrix());
        }
 
        public PoseStack.Pose copy() {
            PoseStack.Pose pose = new PoseStack.Pose();
            pose.set(this);
            return pose;
        }
    }
}

引用的其他类

  • MatrixUtil

    • 引用位置: 方法调用
    • 关联成员: MatrixUtil.checkPropertyRaw(), MatrixUtil.isPureTranslation()
  • Transformation

    • 引用位置: 参数
  • Vec3

    • 引用位置: 参数