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]");
}
}
}
}引用的其他类
- ExtraCodecs
- 引用位置:
字段
- 引用位置: