CustomFeatureRenderer.java

net.minecraft.client.renderer.feature.CustomFeatureRenderer

信息

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

    TODO

字段/常量

内部类/嵌套类型

  • net.minecraft.client.renderer.feature.CustomFeatureRenderer.Storage
    • 类型: class
    • 修饰符: public static
    • 源码定位: L47
    • 说明:

      TODO

构造器

方法

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

public void renderSolid(SubmitNodeCollection nodeCollection, MultiBufferSource.BufferSource bufferSource) @ L22

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

参数:

  • nodeCollection: SubmitNodeCollection
  • bufferSource: MultiBufferSource.BufferSource

说明:

TODO

public void renderTranslucent(SubmitNodeCollection nodeCollection, MultiBufferSource.BufferSource bufferSource) @ L34

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

参数:

  • nodeCollection: SubmitNodeCollection
  • bufferSource: MultiBufferSource.BufferSource

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class CustomFeatureRenderer {
    public void renderSolid(SubmitNodeCollection nodeCollection, MultiBufferSource.BufferSource bufferSource) {
        CustomFeatureRenderer.Storage storage = nodeCollection.getCustomGeometrySubmits();
 
        for (Entry<RenderType, List<SubmitNodeStorage.CustomGeometrySubmit>> entry : storage.solidCustomGeometrySubmits.entrySet()) {
            VertexConsumer buffer = bufferSource.getBuffer(entry.getKey());
 
            for (SubmitNodeStorage.CustomGeometrySubmit customGeometrySubmit : entry.getValue()) {
                customGeometrySubmit.customGeometryRenderer().render(customGeometrySubmit.pose(), buffer);
            }
        }
    }
 
    public void renderTranslucent(SubmitNodeCollection nodeCollection, MultiBufferSource.BufferSource bufferSource) {
        CustomFeatureRenderer.Storage storage = nodeCollection.getCustomGeometrySubmits();
 
        for (Entry<RenderType, List<SubmitNodeStorage.CustomGeometrySubmit>> entry : storage.translucentCustomGeometrySubmits.entrySet()) {
            VertexConsumer buffer = bufferSource.getBuffer(entry.getKey());
 
            for (SubmitNodeStorage.CustomGeometrySubmit customGeometrySubmit : entry.getValue()) {
                customGeometrySubmit.customGeometryRenderer().render(customGeometrySubmit.pose(), buffer);
            }
        }
    }
 
    @OnlyIn(Dist.CLIENT)
    public static class Storage {
        private final Map<RenderType, List<SubmitNodeStorage.CustomGeometrySubmit>> solidCustomGeometrySubmits = new HashMap<>();
        private final Map<RenderType, List<SubmitNodeStorage.CustomGeometrySubmit>> translucentCustomGeometrySubmits = new HashMap<>();
        private final Set<RenderType> solidCustomGeometrySubmitsUsage = new ObjectOpenHashSet<>();
        private final Set<RenderType> translucentCustomGeometrySubmitsUsage = new ObjectOpenHashSet<>();
 
        public void add(PoseStack poseStack, RenderType renderType, SubmitNodeCollector.CustomGeometryRenderer customGeometryRenderer) {
            SubmitNodeStorage.CustomGeometrySubmit submit = new SubmitNodeStorage.CustomGeometrySubmit(poseStack.last().copy(), customGeometryRenderer);
            if (!renderType.hasBlending()) {
                this.solidCustomGeometrySubmits.computeIfAbsent(renderType, rt -> new ArrayList<>()).add(submit);
            } else {
                this.translucentCustomGeometrySubmits.computeIfAbsent(renderType, rt -> new ArrayList<>()).add(submit);
            }
        }
 
        public void clear() {
            for (Entry<RenderType, List<SubmitNodeStorage.CustomGeometrySubmit>> entry : this.solidCustomGeometrySubmits.entrySet()) {
                if (!entry.getValue().isEmpty()) {
                    this.solidCustomGeometrySubmitsUsage.add(entry.getKey());
                    entry.getValue().clear();
                }
            }
 
            for (Entry<RenderType, List<SubmitNodeStorage.CustomGeometrySubmit>> entryx : this.translucentCustomGeometrySubmits.entrySet()) {
                if (!entryx.getValue().isEmpty()) {
                    this.translucentCustomGeometrySubmitsUsage.add(entryx.getKey());
                    entryx.getValue().clear();
                }
            }
        }
 
        public void endFrame() {
            this.solidCustomGeometrySubmits.keySet().removeIf(renderType -> !this.solidCustomGeometrySubmitsUsage.contains(renderType));
            this.solidCustomGeometrySubmitsUsage.clear();
            this.translucentCustomGeometrySubmits.keySet().removeIf(renderType -> !this.translucentCustomGeometrySubmitsUsage.contains(renderType));
            this.translucentCustomGeometrySubmitsUsage.clear();
        }
    }
}

引用的其他类