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();
}
}
}引用的其他类
-
- 引用位置:
字段/构造调用 - 关联成员:
PoseStack()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
SheetedDecalTextureGenerator()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置: