Sweeping things under the rug

- Comment out some stuff to get it to compile.
- Pull in ModelUtil virtual stuffs from old flywheel.
- Update build.gradle to always download sources/javadoc in IDEA.
This commit is contained in:
Jozufozu 2024-01-09 12:28:25 -08:00
parent 8d54e9268a
commit d925d697cc
15 changed files with 208 additions and 184 deletions

View file

@ -41,6 +41,13 @@ mixin {
debug.export = true
}
idea {
module {
downloadJavadoc = true
downloadSources = true
}
}
minecraft {
if (Boolean.parseBoolean(use_parchment)) {
mappings channel: 'parchment', version: "${parchment_version}-${minecraft_version}"

View file

@ -3,38 +3,35 @@ package com.simibubi.create.content.contraptions.render;
import org.joml.Matrix4f;
import org.lwjgl.opengl.GL20;
import com.jozufozu.flywheel.gl.shader.GlProgram;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.phys.AABB;
public class ContraptionProgram extends GlProgram {
protected final int uLightBoxSize;
protected final int uLightBoxMin;
protected final int uModel;
protected int uLightVolume;
public ContraptionProgram(ResourceLocation name, int handle) {
//super(name, handle);
super(handle);
uLightBoxSize = getUniformLocation("uLightBoxSize");
uLightBoxMin = getUniformLocation("uLightBoxMin");
uModel = getUniformLocation("uModel");
}
public class ContraptionProgram {
// protected final int uLightBoxSize;
// protected final int uLightBoxMin;
// protected final int uModel;
//
// protected int uLightVolume;
//
// public ContraptionProgram(ResourceLocation name, int handle) {
// super(handle);
// uLightBoxSize = getUniformLocation("uLightBoxSize");
// uLightBoxMin = getUniformLocation("uLightBoxMin");
// uModel = getUniformLocation("uModel");
// }
//
// @Override
// protected void registerSamplers() {
// super.registerSamplers();
// uLightVolume = setSamplerBinding("uLightVolume", 4);
// }
public void bind(Matrix4f model, AABB lightVolume) {
double sizeX = lightVolume.maxX - lightVolume.minX;
double sizeY = lightVolume.maxY - lightVolume.minY;
double sizeZ = lightVolume.maxZ - lightVolume.minZ;
GL20.glUniform3f(uLightBoxSize, (float) sizeX, (float) sizeY, (float) sizeZ);
GL20.glUniform3f(uLightBoxMin, (float) lightVolume.minX, (float) lightVolume.minY, (float) lightVolume.minZ);
// uploadMatrixUniform(uModel, model);
}
//
// public void bind(Matrix4f model, AABB lightVolume) {
// double sizeX = lightVolume.maxX - lightVolume.minX;
// double sizeY = lightVolume.maxY - lightVolume.minY;
// double sizeZ = lightVolume.maxZ - lightVolume.minZ;
// GL20.glUniform3f(uLightBoxSize, (float) sizeX, (float) sizeY, (float) sizeZ);
// GL20.glUniform3f(uLightBoxMin, (float) lightVolume.minX, (float) lightVolume.minY, (float) lightVolume.minZ);
// // uploadMatrixUniform(uModel, model);
// }
}

View file

@ -7,10 +7,8 @@ import org.apache.commons.lang3.tuple.Pair;
import com.jozufozu.flywheel.api.event.BeginFrameEvent;
import com.jozufozu.flywheel.api.event.ReloadLevelRendererEvent;
import com.jozufozu.flywheel.api.event.RenderStageEvent;
import com.jozufozu.flywheel.gl.error.GlError;
import com.jozufozu.flywheel.lib.model.baked.BlockModelBuilder;
import com.jozufozu.flywheel.backend.gl.error.GlError;
import com.jozufozu.flywheel.lib.model.baked.MultiBlockModelBuilder;
import com.jozufozu.flywheel.lib.model.baked.TessellatedModel;
import com.jozufozu.flywheel.lib.transform.TransformStack;
import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllMovementBehaviours;
@ -165,13 +163,13 @@ public class ContraptionRenderDispatcher {
public static SuperByteBuffer buildStructureBuffer(VirtualRenderWorld renderWorld, Contraption c,
RenderType layer) {
Collection<StructureTemplate.StructureBlockInfo> values = c.getRenderedBlocks();
var build = new MultiBlockModelBuilder(values).renderWorld(renderWorld)
.modelDataMap(c.modelData)
.build();
SuperByteBuffer sbb = new SuperByteBuffer(data);
data.release();
return sbb;
// Collection<StructureTemplate.StructureBlockInfo> values = c.getRenderedBlocks();
// var build = new MultiBlockModelBuilder(values).renderWorld(renderWorld)
// .modelDataMap(c.modelData)
// .build();
// SuperByteBuffer sbb = new SuperByteBuffer(data);
// build.delete();
return null;
}
public static int getLight(Level world, float lx, float ly, float lz) {

View file

@ -34,9 +34,10 @@ public class ContraptionRenderInfo {
AbstractContraptionEntity entity = contraption.entity;
visible = event.getFrustum()
.isVisible(entity.getBoundingBoxForCulling()
.inflate(2));
visible = false;
// visible = event.getFrustum()
// .isVisible(entity.getBoundingBoxForCulling()
// .inflate(2));
}
public boolean isVisible() {

View file

@ -4,7 +4,7 @@ import org.joml.Matrix4f;
import com.jozufozu.flywheel.api.event.BeginFrameEvent;
import com.jozufozu.flywheel.api.event.RenderStageEvent;
import com.jozufozu.flywheel.gl.GlStateTracker;
import com.jozufozu.flywheel.backend.gl.GlStateTracker;
import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.content.contraptions.AbstractContraptionEntity;
import com.simibubi.create.content.contraptions.Contraption;

View file

@ -22,12 +22,12 @@ public class SBBContraptionManager extends ContraptionRenderingWorld<Contraption
@Override
public void renderLayer(RenderStageEvent event) {
super.renderLayer(event);
RenderType type = event.getType();
VertexConsumer consumer = event.buffers.bufferSource()
.getBuffer(type);
visible.forEach(info -> renderContraptionLayerSBB(info, type, consumer));
event.buffers.bufferSource().endBatch(type);
// RenderType type = event.getType();
// VertexConsumer consumer = event.buffers.bufferSource()
// .getBuffer(type);
// visible.forEach(info -> renderContraptionLayerSBB(info, type, consumer));
//
// event.buffers.bufferSource().endBatch(type);
}
@Override

View file

@ -5,6 +5,7 @@ import java.util.List;
import com.simibubi.create.content.decoration.bracket.BracketedBlockEntityBehaviour;
import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour;
import com.simibubi.create.foundation.render.ModelUtil;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.RenderType;

View file

@ -11,6 +11,7 @@ import com.simibubi.create.content.schematics.cannon.LaunchedItem.ForBlockState;
import com.simibubi.create.content.schematics.cannon.LaunchedItem.ForEntity;
import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer;
import com.simibubi.create.foundation.render.CachedBufferer;
import com.simibubi.create.foundation.render.ModelUtil;
import com.simibubi.create.foundation.render.SuperByteBuffer;
import net.minecraft.client.Minecraft;

View file

@ -3,11 +3,8 @@ package com.simibubi.create.content.schematics.client;
import java.util.LinkedHashMap;
import java.util.Map;
import com.jozufozu.flywheel.core.model.ModelUtil;
import com.jozufozu.flywheel.core.model.ShadeSeparatedBufferedData;
import com.jozufozu.flywheel.core.model.ShadeSeparatingVertexConsumer;
import com.jozufozu.flywheel.lib.model.baked.MultiBlockModelBuilder;
import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexFormat;
import com.simibubi.create.content.schematics.SchematicWorld;
@ -92,58 +89,59 @@ public class SchematicRenderer {
}
protected SuperByteBuffer drawLayer(RenderType layer) {
BlockRenderDispatcher dispatcher = ModelUtil.VANILLA_RENDERER;
ModelBlockRenderer renderer = dispatcher.getModelRenderer();
ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get();
PoseStack poseStack = objects.poseStack;
RandomSource random = objects.random;
BlockPos.MutableBlockPos mutableBlockPos = objects.mutableBlockPos;
SchematicWorld renderWorld = schematic;
renderWorld.renderMode = true;
BoundingBox bounds = renderWorld.getBounds();
ShadeSeparatingVertexConsumer shadeSeparatingWrapper = objects.shadeSeparatingWrapper;
BufferBuilder shadedBuilder = objects.shadedBuilder;
BufferBuilder unshadedBuilder = objects.unshadedBuilder;
shadedBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK);
unshadedBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK);
shadeSeparatingWrapper.prepare(shadedBuilder, unshadedBuilder);
ModelBlockRenderer.enableCaching();
for (BlockPos localPos : BlockPos.betweenClosed(bounds.minX(), bounds.minY(), bounds.minZ(), bounds.maxX(), bounds.maxY(), bounds.maxZ())) {
BlockPos pos = mutableBlockPos.setWithOffset(localPos, anchor);
BlockState state = renderWorld.getBlockState(pos);
if (state.getRenderShape() == RenderShape.MODEL) {
BakedModel model = dispatcher.getBlockModel(state);
BlockEntity blockEntity = renderWorld.getBlockEntity(localPos);
ModelData modelData = blockEntity != null ? blockEntity.getModelData() : ModelData.EMPTY;
modelData = model.getModelData(renderWorld, pos, state, modelData);
long seed = state.getSeed(pos);
random.setSeed(seed);
if (model.getRenderTypes(state, random, modelData).contains(layer)) {
poseStack.pushPose();
poseStack.translate(localPos.getX(), localPos.getY(), localPos.getZ());
renderer.tesselateBlock(renderWorld, model, state, pos, poseStack, shadeSeparatingWrapper, true,
random, seed, OverlayTexture.NO_OVERLAY, modelData, layer);
poseStack.popPose();
}
}
}
ModelBlockRenderer.clearCache();
shadeSeparatingWrapper.clear();
ShadeSeparatedBufferedData bufferedData = ModelUtil.endAndCombine(shadedBuilder, unshadedBuilder);
renderWorld.renderMode = false;
SuperByteBuffer sbb = new SuperByteBuffer(bufferedData);
bufferedData.release();
return sbb;
// FIXME: use flywheel buffering utilities?
// BlockRenderDispatcher dispatcher = ModelUtil.VANILLA_RENDERER;
// ModelBlockRenderer renderer = dispatcher.getModelRenderer();
// ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get();
//
// PoseStack poseStack = objects.poseStack;
// RandomSource random = objects.random;
// BlockPos.MutableBlockPos mutableBlockPos = objects.mutableBlockPos;
// SchematicWorld renderWorld = schematic;
// renderWorld.renderMode = true;
// BoundingBox bounds = renderWorld.getBounds();
//
// ShadeSeparatingVertexConsumer shadeSeparatingWrapper = objects.shadeSeparatingWrapper;
// BufferBuilder shadedBuilder = objects.shadedBuilder;
// BufferBuilder unshadedBuilder = objects.unshadedBuilder;
//
// shadedBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK);
// unshadedBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK);
// shadeSeparatingWrapper.prepare(shadedBuilder, unshadedBuilder);
//
// ModelBlockRenderer.enableCaching();
// for (BlockPos localPos : BlockPos.betweenClosed(bounds.minX(), bounds.minY(), bounds.minZ(), bounds.maxX(), bounds.maxY(), bounds.maxZ())) {
// BlockPos pos = mutableBlockPos.setWithOffset(localPos, anchor);
// BlockState state = renderWorld.getBlockState(pos);
//
// if (state.getRenderShape() == RenderShape.MODEL) {
// BakedModel model = dispatcher.getBlockModel(state);
// BlockEntity blockEntity = renderWorld.getBlockEntity(localPos);
// ModelData modelData = blockEntity != null ? blockEntity.getModelData() : ModelData.EMPTY;
// modelData = model.getModelData(renderWorld, pos, state, modelData);
// long seed = state.getSeed(pos);
// random.setSeed(seed);
// if (model.getRenderTypes(state, random, modelData).contains(layer)) {
// poseStack.pushPose();
// poseStack.translate(localPos.getX(), localPos.getY(), localPos.getZ());
//
// renderer.tesselateBlock(renderWorld, model, state, pos, poseStack, shadeSeparatingWrapper, true,
// random, seed, OverlayTexture.NO_OVERLAY, modelData, layer);
//
// poseStack.popPose();
// }
// }
// }
// ModelBlockRenderer.clearCache();
//
// shadeSeparatingWrapper.clear();
// ShadeSeparatedBufferedData bufferedData = ModelUtil.endAndCombine(shadedBuilder, unshadedBuilder);
//
// renderWorld.renderMode = false;
//
// SuperByteBuffer sbb = new SuperByteBuffer(bufferedData);
// bufferedData.release();
return null;
}
private static int getLayerCount() {
@ -155,7 +153,7 @@ public class SchematicRenderer {
public final PoseStack poseStack = new PoseStack();
public final RandomSource random = RandomSource.createNewThreadLocalInstance();
public final BlockPos.MutableBlockPos mutableBlockPos = new BlockPos.MutableBlockPos();
public final ShadeSeparatingVertexConsumer shadeSeparatingWrapper = new ShadeSeparatingVertexConsumer();
// public final ShadeSeparatingVertexConsumer shadeSeparatingWrapper = new ShadeSeparatingVertexConsumer();
public final BufferBuilder shadedBuilder = new BufferBuilder(512);
public final BufferBuilder unshadedBuilder = new BufferBuilder(512);
}

View file

@ -13,6 +13,7 @@ import com.mojang.math.Axis;
import com.simibubi.create.foundation.fluid.FluidRenderer;
import com.simibubi.create.foundation.gui.ILightingSettings;
import com.simibubi.create.foundation.gui.UIRenderHelper;
import com.simibubi.create.foundation.render.ModelUtil;
import com.simibubi.create.foundation.utility.Color;
import com.simibubi.create.foundation.utility.VecHelper;

View file

@ -6,9 +6,6 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.function.Consumer;
import com.jozufozu.flywheel.core.model.ModelUtil;
import com.jozufozu.flywheel.core.model.ShadeSeparatedBufferedData;
import com.jozufozu.flywheel.core.model.ShadeSeparatingVertexConsumer;
import com.jozufozu.flywheel.lib.transform.TransformStack;
import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
@ -344,8 +341,8 @@ public class WorldSectionElement extends AnimatedSceneElement {
ms.pushPose();
ms.translate(pos.getX(), pos.getY(), pos.getZ());
ModelUtil.VANILLA_RENDERER
.renderBreakingTexture(world.getBlockState(pos), pos, world, ms, builder, ModelData.EMPTY);
// ModelUtil.VANILLA_RENDERER
// .renderBreakingTexture(world.getBlockState(pos), pos, world, ms, builder, ModelData.EMPTY);
ms.popPose();
}
@ -408,62 +405,62 @@ public class WorldSectionElement extends AnimatedSceneElement {
}
private SuperByteBuffer buildStructureBuffer(PonderWorld world, RenderType layer) {
BlockRenderDispatcher dispatcher = ModelUtil.VANILLA_RENDERER;
ModelBlockRenderer renderer = dispatcher.getModelRenderer();
ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get();
PoseStack poseStack = objects.poseStack;
RandomSource random = objects.random;
ShadeSeparatingVertexConsumer shadeSeparatingWrapper = objects.shadeSeparatingWrapper;
BufferBuilder shadedBuilder = objects.shadedBuilder;
BufferBuilder unshadedBuilder = objects.unshadedBuilder;
shadedBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK);
unshadedBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK);
shadeSeparatingWrapper.prepare(shadedBuilder, unshadedBuilder);
world.setMask(this.section);
ModelBlockRenderer.enableCaching();
section.forEach(pos -> {
BlockState state = world.getBlockState(pos);
FluidState fluidState = world.getFluidState(pos);
poseStack.pushPose();
poseStack.translate(pos.getX(), pos.getY(), pos.getZ());
if (state.getRenderShape() == RenderShape.MODEL) {
BakedModel model = dispatcher.getBlockModel(state);
BlockEntity blockEntity = world.getBlockEntity(pos);
ModelData modelData = blockEntity != null ? blockEntity.getModelData() : ModelData.EMPTY;
modelData = model.getModelData(world, pos, state, modelData);
long seed = state.getSeed(pos);
random.setSeed(seed);
if (model.getRenderTypes(state, random, modelData).contains(layer)) {
renderer.tesselateBlock(world, model, state, pos, poseStack, shadeSeparatingWrapper, true,
random, seed, OverlayTexture.NO_OVERLAY, modelData, layer);
}
}
if (!fluidState.isEmpty() && ItemBlockRenderTypes.getRenderLayer(fluidState) == layer)
dispatcher.renderLiquid(pos, world, shadedBuilder, state, fluidState);
poseStack.popPose();
});
ModelBlockRenderer.clearCache();
world.clearMask();
shadeSeparatingWrapper.clear();
ShadeSeparatedBufferedData bufferedData = ModelUtil.endAndCombine(shadedBuilder, unshadedBuilder);
SuperByteBuffer sbb = new SuperByteBuffer(bufferedData);
bufferedData.release();
return sbb;
// BlockRenderDispatcher dispatcher = ModelUtil.VANILLA_RENDERER;
// ModelBlockRenderer renderer = dispatcher.getModelRenderer();
// ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get();
//
// PoseStack poseStack = objects.poseStack;
// RandomSource random = objects.random;
// ShadeSeparatingVertexConsumer shadeSeparatingWrapper = objects.shadeSeparatingWrapper;
// BufferBuilder shadedBuilder = objects.shadedBuilder;
// BufferBuilder unshadedBuilder = objects.unshadedBuilder;
//
// shadedBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK);
// unshadedBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK);
// shadeSeparatingWrapper.prepare(shadedBuilder, unshadedBuilder);
//
// world.setMask(this.section);
// ModelBlockRenderer.enableCaching();
// section.forEach(pos -> {
// BlockState state = world.getBlockState(pos);
// FluidState fluidState = world.getFluidState(pos);
//
// poseStack.pushPose();
// poseStack.translate(pos.getX(), pos.getY(), pos.getZ());
//
// if (state.getRenderShape() == RenderShape.MODEL) {
// BakedModel model = dispatcher.getBlockModel(state);
// BlockEntity blockEntity = world.getBlockEntity(pos);
// ModelData modelData = blockEntity != null ? blockEntity.getModelData() : ModelData.EMPTY;
// modelData = model.getModelData(world, pos, state, modelData);
// long seed = state.getSeed(pos);
// random.setSeed(seed);
// if (model.getRenderTypes(state, random, modelData).contains(layer)) {
// renderer.tesselateBlock(world, model, state, pos, poseStack, shadeSeparatingWrapper, true,
// random, seed, OverlayTexture.NO_OVERLAY, modelData, layer);
// }
// }
//
// if (!fluidState.isEmpty() && ItemBlockRenderTypes.getRenderLayer(fluidState) == layer)
// dispatcher.renderLiquid(pos, world, shadedBuilder, state, fluidState);
//
// poseStack.popPose();
// });
// ModelBlockRenderer.clearCache();
// world.clearMask();
//
// shadeSeparatingWrapper.clear();
// ShadeSeparatedBufferedData bufferedData = ModelUtil.endAndCombine(shadedBuilder, unshadedBuilder);
//
// SuperByteBuffer sbb = new SuperByteBuffer(bufferedData);
// bufferedData.release();
return null;
}
private static class ThreadLocalObjects {
public final PoseStack poseStack = new PoseStack();
public final RandomSource random = RandomSource.createNewThreadLocalInstance();
public final ShadeSeparatingVertexConsumer shadeSeparatingWrapper = new ShadeSeparatingVertexConsumer();
//public final ShadeSeparatingVertexConsumer shadeSeparatingWrapper = new ShadeSeparatingVertexConsumer();
public final BufferBuilder shadedBuilder = new BufferBuilder(512);
public final BufferBuilder unshadedBuilder = new BufferBuilder(512);
}

View file

@ -1,5 +1,9 @@
package com.simibubi.create.foundation.render;
import com.jozufozu.flywheel.api.model.Mesh;
import com.jozufozu.flywheel.lib.model.Models;
import com.jozufozu.flywheel.lib.model.baked.BakedModelBuilder;
import com.jozufozu.flywheel.lib.model.baked.TessellatedModel;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.Minecraft;
@ -19,11 +23,20 @@ public class BakedModelRenderHelper {
return standardModelRender(model, referenceState, new PoseStack());
}
public static SuperByteBuffer standardModelRender(BakedModel model, BlockState referenceState, PoseStack ms) {
ShadeSeparatedBufferedData data = ModelUtil.getBufferedData(model, referenceState, ms);
SuperByteBuffer sbb = new SuperByteBuffer(data);
data.release();
return sbb;
public static SuperByteBuffer standardModelRender(BakedModel bakedModel, BlockState referenceState, PoseStack ms) {
var model = new BakedModelBuilder(bakedModel).blockState(referenceState)
.poseStack(ms)
.disableShadeSeparation()
.build();
SuperByteBuffer out = null;
for (Mesh value : model.meshes()
.values()) {
out = new SuperByteBuffer(value);
break;
}
model.delete();
return out;
}
}

View file

@ -0,0 +1,13 @@
package com.simibubi.create.foundation.render;
import net.minecraftforge.client.model.data.ModelData;
import net.minecraftforge.client.model.data.ModelProperty;
public class ModelUtil {
public static final ModelProperty<Boolean> VIRTUAL_PROPERTY = new ModelProperty<>();
public static final ModelData VIRTUAL_DATA = ModelData.builder().with(VIRTUAL_PROPERTY, true).build();
public static boolean isVirtual(ModelData data) {
return data.has(ModelUtil.VIRTUAL_PROPERTY) && Boolean.TRUE.equals(data.get(ModelUtil.VIRTUAL_PROPERTY));
}
}

View file

@ -10,12 +10,15 @@ import org.joml.Quaternionf;
import org.joml.Vector3f;
import org.joml.Vector4f;
import com.jozufozu.flywheel.api.model.Mesh;
import com.jozufozu.flywheel.api.vertex.VertexList;
import com.jozufozu.flywheel.lib.math.DiffuseLightCalculator;
import com.jozufozu.flywheel.lib.math.RenderMath;
import com.jozufozu.flywheel.lib.memory.MemoryBlock;
import com.jozufozu.flywheel.lib.transform.Transform;
import com.jozufozu.flywheel.lib.transform.TransformStack;
import com.jozufozu.flywheel.lib.util.ShadersModHandler;
import com.jozufozu.flywheel.lib.vertex.FullVertexView;
import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
@ -33,8 +36,9 @@ import net.minecraft.core.Direction;
import net.minecraft.util.Mth;
import net.minecraft.world.level.Level;
public class SuperByteBuffer implements Transform<SuperByteBuffer> {
public class SuperByteBuffer implements TransformStack<SuperByteBuffer> {
private final MemoryBlock backingStore;
private final VertexList template;
private final IntPredicate shadedPredicate;
@ -67,26 +71,16 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer> {
// Temporary
private static final Long2IntMap WORLD_LIGHT_CACHE = new Long2IntOpenHashMap();
public SuperByteBuffer(ByteBuffer vertexBuffer, BufferBuilder.DrawState drawState, int unshadedStartVertex) {
int vertexCount = drawState.vertexCount();
int stride = drawState.format().getVertexSize();
public SuperByteBuffer(Mesh mesh) {
var template = new FullVertexView();
backingStore = MemoryBlock.malloc(mesh.vertexCount() * FullVertexView.STRIDE);
template.ptr(backingStore.ptr());
template.vertexCount(mesh.vertexCount());
mesh.write(template);
ShadedVertexList template = new BlockVertexList.Shaded(vertexBuffer, vertexCount, stride, unshadedStartVertex);
shadedPredicate = template::isShaded;
this.template = template;
transforms.pushPose();
}
public SuperByteBuffer(ShadeSeparatedBufferedData data) {
this(data.vertexBuffer(), data.drawState(), data.unshadedStartVertex());
}
public SuperByteBuffer(ByteBuffer vertexBuffer, BufferBuilder.DrawState drawState) {
int vertexCount = drawState.vertexCount();
int stride = drawState.format().getVertexSize();
template = new BlockVertexList(vertexBuffer, vertexCount, stride);
shadedPredicate = index -> true;
transforms.pushPose();
@ -247,7 +241,7 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer> {
}
public void delete() {
template.delete();
backingStore.free();
}
public PoseStack getTransforms() {
@ -272,11 +266,13 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer> {
return this;
}
@Override
public SuperByteBuffer pushPose() {
transforms.pushPose();
return this;
}
@Override
public SuperByteBuffer popPose() {
transforms.popPose();
return this;

View file

@ -7,6 +7,7 @@ import javax.annotation.Nullable;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import com.simibubi.create.foundation.placement.PlacementHelpers;
import com.simibubi.create.foundation.render.ModelUtil;
import com.simibubi.create.foundation.render.SuperRenderTypeBuffer;
import net.minecraft.client.Minecraft;