CuboidRotation.java

net.minecraft.client.resources.model.cuboid.CuboidRotation

信息

  • 全限定名:net.minecraft.client.resources.model.cuboid.CuboidRotation
  • 类型:public record
  • 包:net.minecraft.client.resources.model.cuboid
  • 源码路径:src/main/java/net/minecraft/client/resources/model/cuboid/CuboidRotation.java
  • 起始行号:L14
  • 职责:

    TODO

字段/常量

内部类/嵌套类型

  • net.minecraft.client.resources.model.cuboid.CuboidRotation.EulerXYZRotation

    • 类型: record
    • 修饰符: public
    • 源码定位: L48
    • 说明:

      TODO

  • net.minecraft.client.resources.model.cuboid.CuboidRotation.RotationValue

    • 类型: interface
    • 修饰符: public
    • 源码定位: L59
    • 说明:

      TODO

  • net.minecraft.client.resources.model.cuboid.CuboidRotation.SingleAxisRotation

    • 类型: record
    • 修饰符: public
    • 源码定位: L64
    • 说明:

      TODO

构造器

public CuboidRotation(Vector3fc origin, CuboidRotation.RotationValue value, boolean rescale) @ L15

  • 构造器名:CuboidRotation
  • 源码定位:L15
  • 修饰符:public

参数:

  • origin: Vector3fc
  • value: CuboidRotation.RotationValue
  • rescale: boolean

说明:

TODO

方法

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

private static Matrix4f computeTransform(CuboidRotation.RotationValue value, boolean rescale) @ L19

  • 方法名:computeTransform
  • 源码定位:L19
  • 返回类型:Matrix4f
  • 修饰符:private static

参数:

  • value: CuboidRotation.RotationValue
  • rescale: boolean

说明:

TODO

private static Vector3fc computeRescale(Matrix4fc rotation) @ L29

  • 方法名:computeRescale
  • 源码定位:L29
  • 返回类型:Vector3fc
  • 修饰符:private static

参数:

  • rotation: Matrix4fc

说明:

TODO

private static float scaleFactorForAxis(Matrix4fc rotation, Direction.Axis axis, Vector3f scratch) @ L37

  • 方法名:scaleFactorForAxis
  • 源码定位:L37
  • 返回类型:float
  • 修饰符:private static

参数:

  • rotation: Matrix4fc
  • axis: Direction.Axis
  • scratch: Vector3f

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public record CuboidRotation(Vector3fc origin, CuboidRotation.RotationValue value, boolean rescale, Matrix4fc transform) {
    public CuboidRotation(Vector3fc origin, CuboidRotation.RotationValue value, boolean rescale) {
        this(origin, value, rescale, computeTransform(value, rescale));
    }
 
    private static Matrix4f computeTransform(CuboidRotation.RotationValue value, boolean rescale) {
        Matrix4f result = value.transformation();
        if (rescale && !MatrixUtil.isIdentity(result)) {
            Vector3fc scale = computeRescale(result);
            result.scale(scale);
        }
 
        return result;
    }
 
    private static Vector3fc computeRescale(Matrix4fc rotation) {
        Vector3f scratch = new Vector3f();
        float scaleX = scaleFactorForAxis(rotation, Direction.Axis.X, scratch);
        float scaleY = scaleFactorForAxis(rotation, Direction.Axis.Y, scratch);
        float scaleZ = scaleFactorForAxis(rotation, Direction.Axis.Z, scratch);
        return scratch.set(scaleX, scaleY, scaleZ);
    }
 
    private static float scaleFactorForAxis(Matrix4fc rotation, Direction.Axis axis, Vector3f scratch) {
        Vector3f axisUnit = scratch.set(axis.getPositive().getUnitVec3f());
        Vector3f transformedAxisUnit = rotation.transformDirection(axisUnit);
        float absX = Math.abs(transformedAxisUnit.x);
        float absY = Math.abs(transformedAxisUnit.y);
        float absZ = Math.abs(transformedAxisUnit.z);
        float maxComponent = Math.max(Math.max(absX, absY), absZ);
        return 1.0F / maxComponent;
    }
 
    @OnlyIn(Dist.CLIENT)
    public record EulerXYZRotation(float x, float y, float z) implements CuboidRotation.RotationValue {
        @Override
        public Matrix4f transformation() {
            return new Matrix4f()
                .rotationZYX(
                    this.z * (float) (java.lang.Math.PI / 180.0), this.y * (float) (java.lang.Math.PI / 180.0), this.x * (float) (java.lang.Math.PI / 180.0)
                );
        }
    }
 
    @OnlyIn(Dist.CLIENT)
    public interface RotationValue {
        Matrix4f transformation();
    }
 
    @OnlyIn(Dist.CLIENT)
    public record SingleAxisRotation(Direction.Axis axis, float angle) implements CuboidRotation.RotationValue {
        @Override
        public Matrix4f transformation() {
            Matrix4f result = new Matrix4f();
            if (this.angle == 0.0F) {
                return result;
            } else {
                Vector3fc rotateAround = this.axis.getPositive().getUnitVec3f();
                result.rotation(this.angle * (float) (java.lang.Math.PI / 180.0), rotateAround);
                return result;
            }
        }
    }
}

引用的其他类

  • MatrixUtil

    • 引用位置: 方法调用
    • 关联成员: MatrixUtil.isIdentity()
  • Direction

    • 引用位置: 参数