EasingType.java

net.minecraft.util.EasingType

信息

  • 全限定名:net.minecraft.util.EasingType
  • 类型:public interface
  • 包:net.minecraft.util
  • 源码路径:src/main/java/net/minecraft/util/EasingType.java
  • 起始行号:L9
  • 职责:

    TODO

字段/常量

  • SIMPLE_REGISTRY

    • 类型: ExtraCodecs.LateBoundIdMapper<String,EasingType>
    • 修饰符: package-private
    • 源码定位: L10
    • 说明:

      TODO

  • CODEC

    • 类型: Codec<EasingType>
    • 修饰符: package-private
    • 源码定位: L11
    • 说明:

      TODO

  • CONSTANT

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L13
    • 说明:

      TODO

  • LINEAR

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L14
    • 说明:

      TODO

  • IN_BACK

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L15
    • 说明:

      TODO

  • IN_BOUNCE

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L16
    • 说明:

      TODO

  • IN_CIRC

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L17
    • 说明:

      TODO

  • IN_CUBIC

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L18
    • 说明:

      TODO

  • IN_ELASTIC

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L19
    • 说明:

      TODO

  • IN_EXPO

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L20
    • 说明:

      TODO

  • IN_QUAD

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L21
    • 说明:

      TODO

  • IN_QUART

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L22
    • 说明:

      TODO

  • IN_QUINT

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L23
    • 说明:

      TODO

  • IN_SINE

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L24
    • 说明:

      TODO

  • IN_OUT_BACK

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L25
    • 说明:

      TODO

  • IN_OUT_BOUNCE

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L26
    • 说明:

      TODO

  • IN_OUT_CIRC

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L27
    • 说明:

      TODO

  • IN_OUT_CUBIC

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L28
    • 说明:

      TODO

  • IN_OUT_ELASTIC

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L29
    • 说明:

      TODO

  • IN_OUT_EXPO

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L30
    • 说明:

      TODO

  • IN_OUT_QUAD

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L31
    • 说明:

      TODO

  • IN_OUT_QUART

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L32
    • 说明:

      TODO

  • IN_OUT_QUINT

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L33
    • 说明:

      TODO

  • IN_OUT_SINE

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L34
    • 说明:

      TODO

  • OUT_BACK

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L35
    • 说明:

      TODO

  • OUT_BOUNCE

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L36
    • 说明:

      TODO

  • OUT_CIRC

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L37
    • 说明:

      TODO

  • OUT_CUBIC

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L38
    • 说明:

      TODO

  • OUT_ELASTIC

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L39
    • 说明:

      TODO

  • OUT_EXPO

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L40
    • 说明:

      TODO

  • OUT_QUAD

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L41
    • 说明:

      TODO

  • OUT_QUART

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L42
    • 说明:

      TODO

  • OUT_QUINT

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L43
    • 说明:

      TODO

  • OUT_SINE

    • 类型: EasingType
    • 修饰符: package-private
    • 源码定位: L44
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.util.EasingType.CubicBezier

    • 类型: class
    • 修饰符: public static final
    • 源码定位: L61
    • 说明:

      TODO

  • net.minecraft.util.EasingType.CubicBezier.CubicCurve

    • 类型: record
    • 修饰符: private
    • 源码定位: L112
    • 说明:

      TODO

  • net.minecraft.util.EasingType.CubicBezierControls

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

      TODO

构造器

方法

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

static EasingType registerSimple(String id, EasingType easing) @ L46

  • 方法名:registerSimple
  • 源码定位:L46
  • 返回类型:EasingType
  • 修饰符:static

参数:

  • id: String
  • easing: EasingType

说明:

TODO

static EasingType cubicBezier(float x1, float y1, float x2, float y2) @ L51

  • 方法名:cubicBezier
  • 源码定位:L51
  • 返回类型:EasingType
  • 修饰符:static

参数:

  • x1: float
  • y1: float
  • x2: float
  • y2: float

说明:

TODO

static EasingType symmetricCubicBezier(float x1, float y1) @ L55

  • 方法名:symmetricCubicBezier
  • 源码定位:L55
  • 返回类型:EasingType
  • 修饰符:static

参数:

  • x1: float
  • y1: float

说明:

TODO

float apply(float x) @ L59

  • 方法名:apply
  • 源码定位:L59
  • 返回类型:float
  • 修饰符:package-private

参数:

  • x: float

说明:

TODO

代码

public interface EasingType {
    ExtraCodecs.LateBoundIdMapper<String, EasingType> SIMPLE_REGISTRY = new ExtraCodecs.LateBoundIdMapper<>();
    Codec<EasingType> CODEC = Codec.either(SIMPLE_REGISTRY.codec(Codec.STRING), EasingType.CubicBezier.CODEC)
        .xmap(Either::unwrap, easing -> easing instanceof EasingType.CubicBezier bezier ? Either.right(bezier) : Either.left(easing));
    EasingType CONSTANT = registerSimple("constant", x -> 0.0F);
    EasingType LINEAR = registerSimple("linear", x -> x);
    EasingType IN_BACK = registerSimple("in_back", Ease::inBack);
    EasingType IN_BOUNCE = registerSimple("in_bounce", Ease::inBounce);
    EasingType IN_CIRC = registerSimple("in_circ", Ease::inCirc);
    EasingType IN_CUBIC = registerSimple("in_cubic", Ease::inCubic);
    EasingType IN_ELASTIC = registerSimple("in_elastic", Ease::inElastic);
    EasingType IN_EXPO = registerSimple("in_expo", Ease::inExpo);
    EasingType IN_QUAD = registerSimple("in_quad", Ease::inQuad);
    EasingType IN_QUART = registerSimple("in_quart", Ease::inQuart);
    EasingType IN_QUINT = registerSimple("in_quint", Ease::inQuint);
    EasingType IN_SINE = registerSimple("in_sine", Ease::inSine);
    EasingType IN_OUT_BACK = registerSimple("in_out_back", Ease::inOutBack);
    EasingType IN_OUT_BOUNCE = registerSimple("in_out_bounce", Ease::inOutBounce);
    EasingType IN_OUT_CIRC = registerSimple("in_out_circ", Ease::inOutCirc);
    EasingType IN_OUT_CUBIC = registerSimple("in_out_cubic", Ease::inOutCubic);
    EasingType IN_OUT_ELASTIC = registerSimple("in_out_elastic", Ease::inOutElastic);
    EasingType IN_OUT_EXPO = registerSimple("in_out_expo", Ease::inOutExpo);
    EasingType IN_OUT_QUAD = registerSimple("in_out_quad", Ease::inOutQuad);
    EasingType IN_OUT_QUART = registerSimple("in_out_quart", Ease::inOutQuart);
    EasingType IN_OUT_QUINT = registerSimple("in_out_quint", Ease::inOutQuint);
    EasingType IN_OUT_SINE = registerSimple("in_out_sine", Ease::inOutSine);
    EasingType OUT_BACK = registerSimple("out_back", Ease::outBack);
    EasingType OUT_BOUNCE = registerSimple("out_bounce", Ease::outBounce);
    EasingType OUT_CIRC = registerSimple("out_circ", Ease::outCirc);
    EasingType OUT_CUBIC = registerSimple("out_cubic", Ease::outCubic);
    EasingType OUT_ELASTIC = registerSimple("out_elastic", Ease::outElastic);
    EasingType OUT_EXPO = registerSimple("out_expo", Ease::outExpo);
    EasingType OUT_QUAD = registerSimple("out_quad", Ease::outQuad);
    EasingType OUT_QUART = registerSimple("out_quart", Ease::outQuart);
    EasingType OUT_QUINT = registerSimple("out_quint", Ease::outQuint);
    EasingType OUT_SINE = registerSimple("out_sine", Ease::outSine);
 
    static EasingType registerSimple(String id, EasingType easing) {
        SIMPLE_REGISTRY.put(id, easing);
        return easing;
    }
 
    static EasingType cubicBezier(float x1, float y1, float x2, float y2) {
        return new EasingType.CubicBezier(new EasingType.CubicBezierControls(x1, y1, x2, y2));
    }
 
    static EasingType symmetricCubicBezier(float x1, float y1) {
        return cubicBezier(x1, y1, 1.0F - x1, 1.0F - y1);
    }
 
    float apply(float x);
 
    public static final class CubicBezier implements EasingType {
        public static final Codec<EasingType.CubicBezier> CODEC = RecordCodecBuilder.create(
            i -> i.group(EasingType.CubicBezierControls.CODEC.fieldOf("cubic_bezier").forGetter(b -> b.controls)).apply(i, EasingType.CubicBezier::new)
        );
        private static final int NEWTON_RAPHSON_ITERATIONS = 4;
        private final EasingType.CubicBezierControls controls;
        private final EasingType.CubicBezier.CubicCurve xCurve;
        private final EasingType.CubicBezier.CubicCurve yCurve;
 
        public CubicBezier(EasingType.CubicBezierControls controls) {
            this.controls = controls;
            this.xCurve = curveFromControls(controls.x1, controls.x2);
            this.yCurve = curveFromControls(controls.y1, controls.y2);
        }
 
        private static EasingType.CubicBezier.CubicCurve curveFromControls(float v1, float v2) {
            return new EasingType.CubicBezier.CubicCurve(3.0F * v1 - 3.0F * v2 + 1.0F, -6.0F * v1 + 3.0F * v2, 3.0F * v1);
        }
 
        @Override
        public float apply(float x) {
            float t = x;
 
            for (int i = 0; i < 4; i++) {
                float gradient = this.xCurve.sampleGradient(t);
                if (gradient < 1.0E-5F) {
                    break;
                }
 
                float error = this.xCurve.sample(t) - x;
                t -= error / gradient;
            }
 
            return this.yCurve.sample(t);
        }
 
        @Override
        public boolean equals(Object obj) {
            return obj instanceof EasingType.CubicBezier bezier && this.controls.equals(bezier.controls);
        }
 
        @Override
        public int hashCode() {
            return this.controls.hashCode();
        }
 
        @Override
        public String toString() {
            return "CubicBezier(" + this.controls.x1 + ", " + this.controls.y1 + ", " + this.controls.x2 + ", " + this.controls.y2 + ")";
        }
 
        private record CubicCurve(float a, float b, float c) {
            public float sample(float t) {
                return ((this.a * t + this.b) * t + this.c) * t;
            }
 
            public float sampleGradient(float t) {
                return (3.0F * this.a * t + 2.0F * this.b) * t + this.c;
            }
        }
    }
 
    public record CubicBezierControls(float x1, float y1, float x2, float y2) {
        public static final Codec<EasingType.CubicBezierControls> CODEC = Codec.FLOAT
            .listOf(4, 4)
            .xmap(
                floats -> new EasingType.CubicBezierControls(floats.get(0), floats.get(1), floats.get(2), floats.get(3)),
                controls -> List.of(controls.x1, controls.y1, controls.x2, controls.y2)
            )
            .validate(EasingType.CubicBezierControls::validate);
 
        private DataResult<EasingType.CubicBezierControls> validate() {
            if (this.x1 < 0.0F || this.x1 > 1.0F) {
                return DataResult.error(() -> "x1 must be in range [0; 1]");
            } else {
                return !(this.x2 < 0.0F) && !(this.x2 > 1.0F) ? DataResult.success(this) : DataResult.error(() -> "x2 must be in range [0; 1]");
            }
        }
    }
}

引用的其他类