ModelPartFeatureRenderer.java

net.minecraft.client.renderer.feature.ModelPartFeatureRenderer

信息

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

    TODO

字段/常量

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

      TODO

内部类/嵌套类型

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

      TODO

构造器

方法

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

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

  • 方法名:renderSolid
  • 源码定位:L26
  • 返回类型: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) @ L36

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

参数:

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

说明:

TODO

private void render(Map<RenderType,List<SubmitNodeStorage.ModelPartSubmit>> modelPartSubmitsMap, MultiBufferSource.BufferSource bufferSource, OutlineBufferSource outlineBufferSource, MultiBufferSource.BufferSource crumblingBufferSource) @ L46

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

参数:

  • modelPartSubmitsMap: Map<RenderType,List<SubmitNodeStorage.ModelPartSubmit>>
  • bufferSource: MultiBufferSource.BufferSource
  • outlineBufferSource: OutlineBufferSource
  • crumblingBufferSource: MultiBufferSource.BufferSource

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class ModelPartFeatureRenderer {
    private final PoseStack poseStack = new PoseStack();
 
    public void renderSolid(
        SubmitNodeCollection nodeCollection,
        MultiBufferSource.BufferSource bufferSource,
        OutlineBufferSource outlineBufferSource,
        MultiBufferSource.BufferSource crumblingBufferSource
    ) {
        ModelPartFeatureRenderer.Storage storage = nodeCollection.getModelPartSubmits();
        this.render(storage.solidModelPartSubmits, bufferSource, outlineBufferSource, crumblingBufferSource);
    }
 
    public void renderTranslucent(
        SubmitNodeCollection nodeCollection,
        MultiBufferSource.BufferSource bufferSource,
        OutlineBufferSource outlineBufferSource,
        MultiBufferSource.BufferSource crumblingBufferSource
    ) {
        ModelPartFeatureRenderer.Storage storage = nodeCollection.getModelPartSubmits();
        this.render(storage.translucentModelPartSubmits, bufferSource, outlineBufferSource, crumblingBufferSource);
    }
 
    private void render(
        Map<RenderType, List<SubmitNodeStorage.ModelPartSubmit>> modelPartSubmitsMap,
        MultiBufferSource.BufferSource bufferSource,
        OutlineBufferSource outlineBufferSource,
        MultiBufferSource.BufferSource crumblingBufferSource
    ) {
        for (Entry<RenderType, List<SubmitNodeStorage.ModelPartSubmit>> entry : modelPartSubmitsMap.entrySet()) {
            RenderType renderType = entry.getKey();
            List<SubmitNodeStorage.ModelPartSubmit> modelPartSubmits = entry.getValue();
            VertexConsumer buffer = bufferSource.getBuffer(renderType);
 
            for (SubmitNodeStorage.ModelPartSubmit modelPartSubmit : modelPartSubmits) {
                VertexConsumer actualBuffer;
                if (modelPartSubmit.sprite() != null) {
                    if (modelPartSubmit.hasFoil()) {
                        actualBuffer = modelPartSubmit.sprite()
                            .wrap(ItemFeatureRenderer.getFoilBuffer(bufferSource, renderType, modelPartSubmit.sheeted(), true));
                    } else {
                        actualBuffer = modelPartSubmit.sprite().wrap(buffer);
                    }
                } else if (modelPartSubmit.hasFoil()) {
                    actualBuffer = ItemFeatureRenderer.getFoilBuffer(bufferSource, renderType, modelPartSubmit.sheeted(), true);
                } else {
                    actualBuffer = buffer;
                }
 
                this.poseStack.last().set(modelPartSubmit.pose());
                modelPartSubmit.modelPart()
                    .render(this.poseStack, actualBuffer, modelPartSubmit.lightCoords(), modelPartSubmit.overlayCoords(), modelPartSubmit.tintedColor());
                if (modelPartSubmit.outlineColor() != 0 && (renderType.outline().isPresent() || renderType.isOutline())) {
                    outlineBufferSource.setColor(modelPartSubmit.outlineColor());
                    VertexConsumer outlineBuffer = outlineBufferSource.getBuffer(renderType);
                    modelPartSubmit.modelPart()
                        .render(
                            this.poseStack,
                            modelPartSubmit.sprite() == null ? outlineBuffer : modelPartSubmit.sprite().wrap(outlineBuffer),
                            modelPartSubmit.lightCoords(),
                            modelPartSubmit.overlayCoords(),
                            modelPartSubmit.tintedColor()
                        );
                }
 
                if (modelPartSubmit.crumblingOverlay() != null) {
                    VertexConsumer breakingBuffer = new SheetedDecalTextureGenerator(
                        crumblingBufferSource.getBuffer(ModelBakery.DESTROY_TYPES.get(modelPartSubmit.crumblingOverlay().progress())),
                        modelPartSubmit.crumblingOverlay().cameraPose(),
                        1.0F
                    );
                    modelPartSubmit.modelPart()
                        .render(this.poseStack, breakingBuffer, modelPartSubmit.lightCoords(), modelPartSubmit.overlayCoords(), modelPartSubmit.tintedColor());
                }
            }
        }
    }
 
    @OnlyIn(Dist.CLIENT)
    public static class Storage {
        private final Map<RenderType, List<SubmitNodeStorage.ModelPartSubmit>> solidModelPartSubmits = new HashMap<>();
        private final Map<RenderType, List<SubmitNodeStorage.ModelPartSubmit>> translucentModelPartSubmits = new HashMap<>();
        private final Set<RenderType> solidModelPartSubmitsUsage = new ObjectOpenHashSet<>();
        private final Set<RenderType> translucentModelPartSubmitsUsage = new ObjectOpenHashSet<>();
 
        public void add(RenderType renderType, SubmitNodeStorage.ModelPartSubmit submit) {
            if (!renderType.hasBlending()) {
                this.solidModelPartSubmits.computeIfAbsent(renderType, ignored -> new ArrayList<>()).add(submit);
            } else {
                this.translucentModelPartSubmits.computeIfAbsent(renderType, ignored -> new ArrayList<>()).add(submit);
            }
        }
 
        public void clear() {
            for (Entry<RenderType, List<SubmitNodeStorage.ModelPartSubmit>> entry : this.solidModelPartSubmits.entrySet()) {
                if (!entry.getValue().isEmpty()) {
                    this.solidModelPartSubmitsUsage.add(entry.getKey());
                    entry.getValue().clear();
                }
            }
 
            for (Entry<RenderType, List<SubmitNodeStorage.ModelPartSubmit>> entryx : this.translucentModelPartSubmits.entrySet()) {
                if (!entryx.getValue().isEmpty()) {
                    this.translucentModelPartSubmitsUsage.add(entryx.getKey());
                    entryx.getValue().clear();
                }
            }
        }
 
        public void endFrame() {
            this.solidModelPartSubmits.keySet().removeIf(renderType -> !this.solidModelPartSubmitsUsage.contains(renderType));
            this.solidModelPartSubmitsUsage.clear();
            this.translucentModelPartSubmits.keySet().removeIf(renderType -> !this.translucentModelPartSubmitsUsage.contains(renderType));
            this.translucentModelPartSubmitsUsage.clear();
        }
    }
}

引用的其他类