KeyframeTrack.java

net.minecraft.util.KeyframeTrack

信息

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

    TODO

字段/常量

内部类/嵌套类型

  • net.minecraft.util.KeyframeTrack.Builder
    • 类型: class
    • 修饰符: public static
    • 源码定位: L77
    • 说明:

      TODO

构造器

public KeyframeTrack(List<Keyframe<T>> keyframes, EasingType easingType) @ L15

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

参数:

  • keyframes: List<Keyframe>
  • easingType: EasingType

说明:

TODO

方法

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

public static <T> MapCodec<KeyframeTrack<T>> mapCodec(Codec<T> valueCodec) @ L24

  • 方法名:mapCodec
  • 源码定位:L24
  • 返回类型: MapCodec<KeyframeTrack>
  • 修饰符:public static

参数:

  • valueCodec: Codec

说明:

TODO

private static <T> DataResult<List<Keyframe<T>>> validateKeyframes(List<Keyframe<T>> keyframes) @ L35

  • 方法名:validateKeyframes
  • 源码定位:L35
  • 返回类型: DataResult<List<Keyframe>>
  • 修饰符:private static

参数:

  • keyframes: List<Keyframe>

说明:

TODO

public static DataResult<KeyframeTrack<?>> validatePeriod(KeyframeTrack<?> track, int periodTicks) @ L62

  • 方法名:validatePeriod
  • 源码定位:L62
  • 返回类型:DataResult<KeyframeTrack<?>>
  • 修饰符:public static

参数:

  • track: KeyframeTrack<?>
  • periodTicks: int

说明:

TODO

public KeyframeTrackSampler<T> bakeSampler(Optional<Integer> periodTicks, LerpFunction<T> lerp) @ L73

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

参数:

  • periodTicks: Optional
  • lerp: LerpFunction

说明:

TODO

代码

public record KeyframeTrack<T>(List<Keyframe<T>> keyframes, EasingType easingType) {
    public KeyframeTrack(List<Keyframe<T>> keyframes, EasingType easingType) {
        if (keyframes.isEmpty()) {
            throw new IllegalArgumentException("Track has no keyframes");
        } else {
            this.keyframes = keyframes;
            this.easingType = easingType;
        }
    }
 
    public static <T> MapCodec<KeyframeTrack<T>> mapCodec(Codec<T> valueCodec) {
        Codec<List<Keyframe<T>>> keyframesCodec = Keyframe.codec(valueCodec).listOf().validate(KeyframeTrack::validateKeyframes);
        return RecordCodecBuilder.mapCodec(
            i -> i.group(
                    keyframesCodec.fieldOf("keyframes").forGetter(KeyframeTrack::keyframes),
                    EasingType.CODEC.optionalFieldOf("ease", EasingType.LINEAR).forGetter(KeyframeTrack::easingType)
                )
                .apply(i, KeyframeTrack::new)
        );
    }
 
    private static <T> DataResult<List<Keyframe<T>>> validateKeyframes(List<Keyframe<T>> keyframes) {
        if (keyframes.isEmpty()) {
            return DataResult.error(() -> "Keyframes must not be empty");
        } else if (!Comparators.isInOrder(keyframes, Comparator.comparingInt(Keyframe::ticks))) {
            return DataResult.error(() -> "Keyframes must be ordered by ticks field");
        } else {
            if (keyframes.size() > 1) {
                int repeatCount = 0;
                int lastTicks = keyframes.getLast().ticks();
 
                for (Keyframe<T> keyframe : keyframes) {
                    if (keyframe.ticks() == lastTicks) {
                        if (++repeatCount > 2) {
                            return DataResult.error(() -> "More than 2 keyframes on same tick: " + keyframe.ticks());
                        }
                    } else {
                        repeatCount = 0;
                    }
 
                    lastTicks = keyframe.ticks();
                }
            }
 
            return DataResult.success(keyframes);
        }
    }
 
    public static DataResult<KeyframeTrack<?>> validatePeriod(KeyframeTrack<?> track, int periodTicks) {
        for (Keyframe<?> keyframe : track.keyframes()) {
            int tick = keyframe.ticks();
            if (tick < 0 || tick > periodTicks) {
                return DataResult.error(() -> "Keyframe at tick " + keyframe.ticks() + " must be in range [0; " + periodTicks + "]");
            }
        }
 
        return DataResult.success(track);
    }
 
    public KeyframeTrackSampler<T> bakeSampler(Optional<Integer> periodTicks, LerpFunction<T> lerp) {
        return new KeyframeTrackSampler<>(this, periodTicks, lerp);
    }
 
    public static class Builder<T> {
        private final ImmutableList.Builder<Keyframe<T>> keyframes = ImmutableList.builder();
        private EasingType easing = EasingType.LINEAR;
 
        public KeyframeTrack.Builder<T> addKeyframe(int ticks, T value) {
            this.keyframes.add(new Keyframe<>(ticks, value));
            return this;
        }
 
        public KeyframeTrack.Builder<T> setEasing(EasingType easing) {
            this.easing = easing;
            return this;
        }
 
        public KeyframeTrack<T> build() {
            List<Keyframe<T>> keyframes = KeyframeTrack.validateKeyframes(this.keyframes.build()).getOrThrow();
            return new KeyframeTrack<>(keyframes, this.easing);
        }
    }
}

引用的其他类