ModelFeatureRenderer.java

net.minecraft.client.renderer.feature.ModelFeatureRenderer

信息

  • 全限定名:net.minecraft.client.renderer.feature.ModelFeatureRenderer
  • 类型:public class
  • 包:net.minecraft.client.renderer.feature
  • 源码路径:src/main/java/net/minecraft/client/renderer/feature/ModelFeatureRenderer.java
  • 起始行号:L28
  • 职责:

    TODO

字段/常量

  • poseStack
    • 类型: PoseStack
    • 修饰符: private final
    • 源码定位: L29
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.client.renderer.feature.ModelFeatureRenderer.CrumblingOverlay

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

      TODO

  • net.minecraft.client.renderer.feature.ModelFeatureRenderer.Storage

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

      TODO

构造器

方法

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

public void renderSolid(SubmitNodeCollection nodeCollection, MultiBufferSource.BufferSource bufferSource, OutlineBufferSource outlineBufferSource, MultiBufferSource.BufferSource crumblingBufferSource) @ L31

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

参数:

  • nodeCollection: SubmitNodeCollection
  • bufferSource: MultiBufferSource.BufferSource
  • outlineBufferSource: OutlineBufferSource
  • crumblingBufferSource: MultiBufferSource.BufferSource

说明:

TODO

public void renderTranslucent(SubmitNodeCollection nodeCollection, MultiBufferSource.BufferSource bufferSource, OutlineBufferSource outlineBufferSource, MultiBufferSource.BufferSource crumblingBufferSource) @ L41

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

参数:

  • nodeCollection: SubmitNodeCollection
  • bufferSource: MultiBufferSource.BufferSource
  • outlineBufferSource: OutlineBufferSource
  • crumblingBufferSource: MultiBufferSource.BufferSource

说明:

TODO

private void renderTranslucents(MultiBufferSource.BufferSource bufferSource, OutlineBufferSource outlineBufferSource, List<SubmitNodeStorage.TranslucentModelSubmit<?>> submits, MultiBufferSource.BufferSource crumblingBufferSource) @ L52

  • 方法名:renderTranslucents
  • 源码定位:L52
  • 返回类型:void
  • 修饰符:private

参数:

  • bufferSource: MultiBufferSource.BufferSource
  • outlineBufferSource: OutlineBufferSource
  • submits: List<SubmitNodeStorage.TranslucentModelSubmit<?>>
  • crumblingBufferSource: MultiBufferSource.BufferSource

说明:

TODO

private void renderBatch(MultiBufferSource.BufferSource bufferSource, OutlineBufferSource outlineBufferSource, Map<RenderType,List<SubmitNodeStorage.ModelSubmit<?>>> map, MultiBufferSource.BufferSource crumblingBufferSource) @ L63

  • 方法名:renderBatch
  • 源码定位:L63
  • 返回类型:void
  • 修饰符:private

参数:

  • bufferSource: MultiBufferSource.BufferSource
  • outlineBufferSource: OutlineBufferSource
  • map: Map<RenderType,List<SubmitNodeStorage.ModelSubmit<?>>>
  • crumblingBufferSource: MultiBufferSource.BufferSource

说明:

TODO

private <S> void renderModel(SubmitNodeStorage.ModelSubmit<S> submit, RenderType renderType, VertexConsumer buffer, OutlineBufferSource outlineBufferSource, MultiBufferSource.BufferSource crumblingBufferSource) @ L87

  • 方法名:renderModel
  • 源码定位:L87
  • 返回类型: void
  • 修饰符:private

参数:

  • submit: SubmitNodeStorage.ModelSubmit
  • renderType: RenderType
  • buffer: VertexConsumer
  • outlineBufferSource: OutlineBufferSource
  • crumblingBufferSource: MultiBufferSource.BufferSource

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class ModelFeatureRenderer {
    private final PoseStack poseStack = new PoseStack();
 
    public void renderSolid(
        SubmitNodeCollection nodeCollection,
        MultiBufferSource.BufferSource bufferSource,
        OutlineBufferSource outlineBufferSource,
        MultiBufferSource.BufferSource crumblingBufferSource
    ) {
        ModelFeatureRenderer.Storage storage = nodeCollection.getModelSubmits();
        this.renderBatch(bufferSource, outlineBufferSource, storage.solidModelSubmits, crumblingBufferSource);
    }
 
    public void renderTranslucent(
        SubmitNodeCollection nodeCollection,
        MultiBufferSource.BufferSource bufferSource,
        OutlineBufferSource outlineBufferSource,
        MultiBufferSource.BufferSource crumblingBufferSource
    ) {
        ModelFeatureRenderer.Storage storage = nodeCollection.getModelSubmits();
        storage.translucentModelSubmits.sort(Comparator.comparingDouble(submit -> -submit.position().lengthSquared()));
        this.renderTranslucents(bufferSource, outlineBufferSource, storage.translucentModelSubmits, crumblingBufferSource);
    }
 
    private void renderTranslucents(
        MultiBufferSource.BufferSource bufferSource,
        OutlineBufferSource outlineBufferSource,
        List<SubmitNodeStorage.TranslucentModelSubmit<?>> submits,
        MultiBufferSource.BufferSource crumblingBufferSource
    ) {
        for (SubmitNodeStorage.TranslucentModelSubmit<?> submit : submits) {
            this.renderModel(submit.modelSubmit(), submit.renderType(), bufferSource.getBuffer(submit.renderType()), outlineBufferSource, crumblingBufferSource);
        }
    }
 
    private void renderBatch(
        MultiBufferSource.BufferSource bufferSource,
        OutlineBufferSource outlineBufferSource,
        Map<RenderType, List<SubmitNodeStorage.ModelSubmit<?>>> map,
        MultiBufferSource.BufferSource crumblingBufferSource
    ) {
        Iterable<Entry<RenderType, List<SubmitNodeStorage.ModelSubmit<?>>>> entries;
        if (SharedConstants.DEBUG_SHUFFLE_MODELS) {
            List<Entry<RenderType, List<SubmitNodeStorage.ModelSubmit<?>>>> shuffledCopy = new ArrayList<>(map.entrySet());
            Collections.shuffle(shuffledCopy);
            entries = shuffledCopy;
        } else {
            entries = map.entrySet();
        }
 
        for (Entry<RenderType, List<SubmitNodeStorage.ModelSubmit<?>>> entry : entries) {
            VertexConsumer buffer = bufferSource.getBuffer(entry.getKey());
 
            for (SubmitNodeStorage.ModelSubmit<?> submit : entry.getValue()) {
                this.renderModel(submit, entry.getKey(), buffer, outlineBufferSource, crumblingBufferSource);
            }
        }
    }
 
    private <S> void renderModel(
        SubmitNodeStorage.ModelSubmit<S> submit,
        RenderType renderType,
        VertexConsumer buffer,
        OutlineBufferSource outlineBufferSource,
        MultiBufferSource.BufferSource crumblingBufferSource
    ) {
        this.poseStack.pushPose();
        this.poseStack.last().set(submit.pose());
        Model<? super S> model = submit.model();
        VertexConsumer wrappedBuffer = submit.sprite() == null ? buffer : submit.sprite().wrap(buffer);
        model.setupAnim(submit.state());
        model.renderToBuffer(this.poseStack, wrappedBuffer, submit.lightCoords(), submit.overlayCoords(), submit.tintedColor());
        if (submit.outlineColor() != 0 && (renderType.outline().isPresent() || renderType.isOutline())) {
            outlineBufferSource.setColor(submit.outlineColor());
            VertexConsumer outlineBuffer = outlineBufferSource.getBuffer(renderType);
            model.renderToBuffer(
                this.poseStack,
                submit.sprite() == null ? outlineBuffer : submit.sprite().wrap(outlineBuffer),
                submit.lightCoords(),
                submit.overlayCoords(),
                submit.tintedColor()
            );
        }
 
        if (submit.crumblingOverlay() != null && renderType.affectsCrumbling()) {
            VertexConsumer breakingBuffer = new SheetedDecalTextureGenerator(
                crumblingBufferSource.getBuffer(ModelBakery.DESTROY_TYPES.get(submit.crumblingOverlay().progress())),
                submit.crumblingOverlay().cameraPose(),
                1.0F
            );
            model.renderToBuffer(
                this.poseStack,
                submit.sprite() == null ? breakingBuffer : submit.sprite().wrap(breakingBuffer),
                submit.lightCoords(),
                submit.overlayCoords(),
                submit.tintedColor()
            );
        }
 
        this.poseStack.popPose();
    }
 
    @OnlyIn(Dist.CLIENT)
    public record CrumblingOverlay(int progress, PoseStack.Pose cameraPose) {
    }
 
    @OnlyIn(Dist.CLIENT)
    public static class Storage {
        private final Map<RenderType, List<SubmitNodeStorage.ModelSubmit<?>>> solidModelSubmits = new HashMap<>();
        private final List<SubmitNodeStorage.TranslucentModelSubmit<?>> translucentModelSubmits = new ArrayList<>();
        private final Set<RenderType> usedModelSubmitBuckets = new ObjectOpenHashSet<>();
 
        public void add(RenderType renderType, SubmitNodeStorage.ModelSubmit<?> modelSubmit) {
            if (!renderType.hasBlending()) {
                this.solidModelSubmits.computeIfAbsent(renderType, ignored -> new ArrayList<>()).add(modelSubmit);
            } else {
                Vector3f position = modelSubmit.pose().pose().transformPosition(new Vector3f());
                this.translucentModelSubmits.add(new SubmitNodeStorage.TranslucentModelSubmit<>(modelSubmit, renderType, position));
            }
        }
 
        public void clear() {
            this.translucentModelSubmits.clear();
 
            for (Entry<RenderType, List<SubmitNodeStorage.ModelSubmit<?>>> bucketEntry : this.solidModelSubmits.entrySet()) {
                List<SubmitNodeStorage.ModelSubmit<?>> bucket = bucketEntry.getValue();
                if (!bucket.isEmpty()) {
                    this.usedModelSubmitBuckets.add(bucketEntry.getKey());
                    bucket.clear();
                }
            }
        }
 
        public void endFrame() {
            this.solidModelSubmits.keySet().removeIf(renderType -> !this.usedModelSubmitBuckets.contains(renderType));
            this.usedModelSubmitBuckets.clear();
        }
    }
}

引用的其他类