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 debug.export = true
} }
idea {
module {
downloadJavadoc = true
downloadSources = true
}
}
minecraft { minecraft {
if (Boolean.parseBoolean(use_parchment)) { if (Boolean.parseBoolean(use_parchment)) {
mappings channel: 'parchment', version: "${parchment_version}-${minecraft_version}" 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.joml.Matrix4f;
import org.lwjgl.opengl.GL20; import org.lwjgl.opengl.GL20;
import com.jozufozu.flywheel.gl.shader.GlProgram;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
public class ContraptionProgram extends GlProgram { public class ContraptionProgram {
protected final int uLightBoxSize; // protected final int uLightBoxSize;
protected final int uLightBoxMin; // protected final int uLightBoxMin;
protected final int uModel; // protected final int uModel;
//
protected int uLightVolume; // protected int uLightVolume;
//
public ContraptionProgram(ResourceLocation name, int handle) { // public ContraptionProgram(ResourceLocation name, int handle) {
//super(name, handle); // super(handle);
super(handle); // uLightBoxSize = getUniformLocation("uLightBoxSize");
uLightBoxSize = getUniformLocation("uLightBoxSize"); // uLightBoxMin = getUniformLocation("uLightBoxMin");
uLightBoxMin = getUniformLocation("uLightBoxMin"); // uModel = getUniformLocation("uModel");
uModel = getUniformLocation("uModel"); // }
} //
// @Override // @Override
// protected void registerSamplers() { // protected void registerSamplers() {
// super.registerSamplers(); // super.registerSamplers();
// uLightVolume = setSamplerBinding("uLightVolume", 4); // uLightVolume = setSamplerBinding("uLightVolume", 4);
// } // }
//
public void bind(Matrix4f model, AABB lightVolume) { // public void bind(Matrix4f model, AABB lightVolume) {
double sizeX = lightVolume.maxX - lightVolume.minX; // double sizeX = lightVolume.maxX - lightVolume.minX;
double sizeY = lightVolume.maxY - lightVolume.minY; // double sizeY = lightVolume.maxY - lightVolume.minY;
double sizeZ = lightVolume.maxZ - lightVolume.minZ; // double sizeZ = lightVolume.maxZ - lightVolume.minZ;
GL20.glUniform3f(uLightBoxSize, (float) sizeX, (float) sizeY, (float) sizeZ); // GL20.glUniform3f(uLightBoxSize, (float) sizeX, (float) sizeY, (float) sizeZ);
GL20.glUniform3f(uLightBoxMin, (float) lightVolume.minX, (float) lightVolume.minY, (float) lightVolume.minZ); // GL20.glUniform3f(uLightBoxMin, (float) lightVolume.minX, (float) lightVolume.minY, (float) lightVolume.minZ);
// uploadMatrixUniform(uModel, model); // // 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.BeginFrameEvent;
import com.jozufozu.flywheel.api.event.ReloadLevelRendererEvent; import com.jozufozu.flywheel.api.event.ReloadLevelRendererEvent;
import com.jozufozu.flywheel.api.event.RenderStageEvent; import com.jozufozu.flywheel.api.event.RenderStageEvent;
import com.jozufozu.flywheel.gl.error.GlError; import com.jozufozu.flywheel.backend.gl.error.GlError;
import com.jozufozu.flywheel.lib.model.baked.BlockModelBuilder;
import com.jozufozu.flywheel.lib.model.baked.MultiBlockModelBuilder; 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.jozufozu.flywheel.lib.transform.TransformStack;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.AllMovementBehaviours;
@ -165,13 +163,13 @@ public class ContraptionRenderDispatcher {
public static SuperByteBuffer buildStructureBuffer(VirtualRenderWorld renderWorld, Contraption c, public static SuperByteBuffer buildStructureBuffer(VirtualRenderWorld renderWorld, Contraption c,
RenderType layer) { RenderType layer) {
Collection<StructureTemplate.StructureBlockInfo> values = c.getRenderedBlocks(); // Collection<StructureTemplate.StructureBlockInfo> values = c.getRenderedBlocks();
var build = new MultiBlockModelBuilder(values).renderWorld(renderWorld) // var build = new MultiBlockModelBuilder(values).renderWorld(renderWorld)
.modelDataMap(c.modelData) // .modelDataMap(c.modelData)
.build(); // .build();
SuperByteBuffer sbb = new SuperByteBuffer(data); // SuperByteBuffer sbb = new SuperByteBuffer(data);
data.release(); // build.delete();
return sbb; return null;
} }
public static int getLight(Level world, float lx, float ly, float lz) { 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; AbstractContraptionEntity entity = contraption.entity;
visible = event.getFrustum() visible = false;
.isVisible(entity.getBoundingBoxForCulling() // visible = event.getFrustum()
.inflate(2)); // .isVisible(entity.getBoundingBoxForCulling()
// .inflate(2));
} }
public boolean isVisible() { 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.BeginFrameEvent;
import com.jozufozu.flywheel.api.event.RenderStageEvent; 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.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.content.contraptions.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.AbstractContraptionEntity;
import com.simibubi.create.content.contraptions.Contraption; import com.simibubi.create.content.contraptions.Contraption;

View file

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

View file

@ -5,6 +5,7 @@ import java.util.List;
import com.simibubi.create.content.decoration.bracket.BracketedBlockEntityBehaviour; import com.simibubi.create.content.decoration.bracket.BracketedBlockEntityBehaviour;
import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour;
import com.simibubi.create.foundation.render.ModelUtil;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.RenderType; 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.content.schematics.cannon.LaunchedItem.ForEntity;
import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer; import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer;
import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.CachedBufferer;
import com.simibubi.create.foundation.render.ModelUtil;
import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.SuperByteBuffer;
import net.minecraft.client.Minecraft; 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.LinkedHashMap;
import java.util.Map; import java.util.Map;
import com.jozufozu.flywheel.core.model.ModelUtil; import com.jozufozu.flywheel.lib.model.baked.MultiBlockModelBuilder;
import com.jozufozu.flywheel.core.model.ShadeSeparatedBufferedData;
import com.jozufozu.flywheel.core.model.ShadeSeparatingVertexConsumer;
import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.blaze3d.vertex.VertexFormat;
import com.simibubi.create.content.schematics.SchematicWorld; import com.simibubi.create.content.schematics.SchematicWorld;
@ -92,58 +89,59 @@ public class SchematicRenderer {
} }
protected SuperByteBuffer drawLayer(RenderType layer) { protected SuperByteBuffer drawLayer(RenderType layer) {
BlockRenderDispatcher dispatcher = ModelUtil.VANILLA_RENDERER; // FIXME: use flywheel buffering utilities?
ModelBlockRenderer renderer = dispatcher.getModelRenderer(); // BlockRenderDispatcher dispatcher = ModelUtil.VANILLA_RENDERER;
ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get(); // ModelBlockRenderer renderer = dispatcher.getModelRenderer();
// ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get();
PoseStack poseStack = objects.poseStack; //
RandomSource random = objects.random; // PoseStack poseStack = objects.poseStack;
BlockPos.MutableBlockPos mutableBlockPos = objects.mutableBlockPos; // RandomSource random = objects.random;
SchematicWorld renderWorld = schematic; // BlockPos.MutableBlockPos mutableBlockPos = objects.mutableBlockPos;
renderWorld.renderMode = true; // SchematicWorld renderWorld = schematic;
BoundingBox bounds = renderWorld.getBounds(); // renderWorld.renderMode = true;
// BoundingBox bounds = renderWorld.getBounds();
ShadeSeparatingVertexConsumer shadeSeparatingWrapper = objects.shadeSeparatingWrapper; //
BufferBuilder shadedBuilder = objects.shadedBuilder; // ShadeSeparatingVertexConsumer shadeSeparatingWrapper = objects.shadeSeparatingWrapper;
BufferBuilder unshadedBuilder = objects.unshadedBuilder; // BufferBuilder shadedBuilder = objects.shadedBuilder;
// BufferBuilder unshadedBuilder = objects.unshadedBuilder;
shadedBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK); //
unshadedBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK); // shadedBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK);
shadeSeparatingWrapper.prepare(shadedBuilder, unshadedBuilder); // 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())) { // ModelBlockRenderer.enableCaching();
BlockPos pos = mutableBlockPos.setWithOffset(localPos, anchor); // for (BlockPos localPos : BlockPos.betweenClosed(bounds.minX(), bounds.minY(), bounds.minZ(), bounds.maxX(), bounds.maxY(), bounds.maxZ())) {
BlockState state = renderWorld.getBlockState(pos); // BlockPos pos = mutableBlockPos.setWithOffset(localPos, anchor);
// BlockState state = renderWorld.getBlockState(pos);
if (state.getRenderShape() == RenderShape.MODEL) { //
BakedModel model = dispatcher.getBlockModel(state); // if (state.getRenderShape() == RenderShape.MODEL) {
BlockEntity blockEntity = renderWorld.getBlockEntity(localPos); // BakedModel model = dispatcher.getBlockModel(state);
ModelData modelData = blockEntity != null ? blockEntity.getModelData() : ModelData.EMPTY; // BlockEntity blockEntity = renderWorld.getBlockEntity(localPos);
modelData = model.getModelData(renderWorld, pos, state, modelData); // ModelData modelData = blockEntity != null ? blockEntity.getModelData() : ModelData.EMPTY;
long seed = state.getSeed(pos); // modelData = model.getModelData(renderWorld, pos, state, modelData);
random.setSeed(seed); // long seed = state.getSeed(pos);
if (model.getRenderTypes(state, random, modelData).contains(layer)) { // random.setSeed(seed);
poseStack.pushPose(); // if (model.getRenderTypes(state, random, modelData).contains(layer)) {
poseStack.translate(localPos.getX(), localPos.getY(), localPos.getZ()); // 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); // renderer.tesselateBlock(renderWorld, model, state, pos, poseStack, shadeSeparatingWrapper, true,
// random, seed, OverlayTexture.NO_OVERLAY, modelData, layer);
poseStack.popPose(); //
} // poseStack.popPose();
} // }
} // }
ModelBlockRenderer.clearCache(); // }
// ModelBlockRenderer.clearCache();
shadeSeparatingWrapper.clear(); //
ShadeSeparatedBufferedData bufferedData = ModelUtil.endAndCombine(shadedBuilder, unshadedBuilder); // shadeSeparatingWrapper.clear();
// ShadeSeparatedBufferedData bufferedData = ModelUtil.endAndCombine(shadedBuilder, unshadedBuilder);
renderWorld.renderMode = false; //
// renderWorld.renderMode = false;
SuperByteBuffer sbb = new SuperByteBuffer(bufferedData); //
bufferedData.release(); // SuperByteBuffer sbb = new SuperByteBuffer(bufferedData);
return sbb; // bufferedData.release();
return null;
} }
private static int getLayerCount() { private static int getLayerCount() {
@ -155,7 +153,7 @@ public class SchematicRenderer {
public final PoseStack poseStack = new PoseStack(); public final PoseStack poseStack = new PoseStack();
public final RandomSource random = RandomSource.createNewThreadLocalInstance(); public final RandomSource random = RandomSource.createNewThreadLocalInstance();
public final BlockPos.MutableBlockPos mutableBlockPos = new BlockPos.MutableBlockPos(); 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 shadedBuilder = new BufferBuilder(512);
public final BufferBuilder unshadedBuilder = 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.fluid.FluidRenderer;
import com.simibubi.create.foundation.gui.ILightingSettings; import com.simibubi.create.foundation.gui.ILightingSettings;
import com.simibubi.create.foundation.gui.UIRenderHelper; 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.Color;
import com.simibubi.create.foundation.utility.VecHelper; 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.Map.Entry;
import java.util.function.Consumer; 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.jozufozu.flywheel.lib.transform.TransformStack;
import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.DefaultVertexFormat;
@ -344,8 +341,8 @@ public class WorldSectionElement extends AnimatedSceneElement {
ms.pushPose(); ms.pushPose();
ms.translate(pos.getX(), pos.getY(), pos.getZ()); ms.translate(pos.getX(), pos.getY(), pos.getZ());
ModelUtil.VANILLA_RENDERER // ModelUtil.VANILLA_RENDERER
.renderBreakingTexture(world.getBlockState(pos), pos, world, ms, builder, ModelData.EMPTY); // .renderBreakingTexture(world.getBlockState(pos), pos, world, ms, builder, ModelData.EMPTY);
ms.popPose(); ms.popPose();
} }
@ -408,62 +405,62 @@ public class WorldSectionElement extends AnimatedSceneElement {
} }
private SuperByteBuffer buildStructureBuffer(PonderWorld world, RenderType layer) { private SuperByteBuffer buildStructureBuffer(PonderWorld world, RenderType layer) {
BlockRenderDispatcher dispatcher = ModelUtil.VANILLA_RENDERER; // BlockRenderDispatcher dispatcher = ModelUtil.VANILLA_RENDERER;
ModelBlockRenderer renderer = dispatcher.getModelRenderer(); // ModelBlockRenderer renderer = dispatcher.getModelRenderer();
ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get(); // ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get();
//
PoseStack poseStack = objects.poseStack; // PoseStack poseStack = objects.poseStack;
RandomSource random = objects.random; // RandomSource random = objects.random;
ShadeSeparatingVertexConsumer shadeSeparatingWrapper = objects.shadeSeparatingWrapper; // ShadeSeparatingVertexConsumer shadeSeparatingWrapper = objects.shadeSeparatingWrapper;
BufferBuilder shadedBuilder = objects.shadedBuilder; // BufferBuilder shadedBuilder = objects.shadedBuilder;
BufferBuilder unshadedBuilder = objects.unshadedBuilder; // BufferBuilder unshadedBuilder = objects.unshadedBuilder;
//
shadedBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK); // shadedBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK);
unshadedBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK); // unshadedBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK);
shadeSeparatingWrapper.prepare(shadedBuilder, unshadedBuilder); // shadeSeparatingWrapper.prepare(shadedBuilder, unshadedBuilder);
//
world.setMask(this.section); // world.setMask(this.section);
ModelBlockRenderer.enableCaching(); // ModelBlockRenderer.enableCaching();
section.forEach(pos -> { // section.forEach(pos -> {
BlockState state = world.getBlockState(pos); // BlockState state = world.getBlockState(pos);
FluidState fluidState = world.getFluidState(pos); // FluidState fluidState = world.getFluidState(pos);
//
poseStack.pushPose(); // poseStack.pushPose();
poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); // poseStack.translate(pos.getX(), pos.getY(), pos.getZ());
//
if (state.getRenderShape() == RenderShape.MODEL) { // if (state.getRenderShape() == RenderShape.MODEL) {
BakedModel model = dispatcher.getBlockModel(state); // BakedModel model = dispatcher.getBlockModel(state);
BlockEntity blockEntity = world.getBlockEntity(pos); // BlockEntity blockEntity = world.getBlockEntity(pos);
ModelData modelData = blockEntity != null ? blockEntity.getModelData() : ModelData.EMPTY; // ModelData modelData = blockEntity != null ? blockEntity.getModelData() : ModelData.EMPTY;
modelData = model.getModelData(world, pos, state, modelData); // modelData = model.getModelData(world, pos, state, modelData);
long seed = state.getSeed(pos); // long seed = state.getSeed(pos);
random.setSeed(seed); // random.setSeed(seed);
if (model.getRenderTypes(state, random, modelData).contains(layer)) { // if (model.getRenderTypes(state, random, modelData).contains(layer)) {
renderer.tesselateBlock(world, model, state, pos, poseStack, shadeSeparatingWrapper, true, // renderer.tesselateBlock(world, model, state, pos, poseStack, shadeSeparatingWrapper, true,
random, seed, OverlayTexture.NO_OVERLAY, modelData, layer); // random, seed, OverlayTexture.NO_OVERLAY, modelData, layer);
} // }
} // }
//
if (!fluidState.isEmpty() && ItemBlockRenderTypes.getRenderLayer(fluidState) == layer) // if (!fluidState.isEmpty() && ItemBlockRenderTypes.getRenderLayer(fluidState) == layer)
dispatcher.renderLiquid(pos, world, shadedBuilder, state, fluidState); // dispatcher.renderLiquid(pos, world, shadedBuilder, state, fluidState);
//
poseStack.popPose(); // poseStack.popPose();
}); // });
ModelBlockRenderer.clearCache(); // ModelBlockRenderer.clearCache();
world.clearMask(); // world.clearMask();
//
shadeSeparatingWrapper.clear(); // shadeSeparatingWrapper.clear();
ShadeSeparatedBufferedData bufferedData = ModelUtil.endAndCombine(shadedBuilder, unshadedBuilder); // ShadeSeparatedBufferedData bufferedData = ModelUtil.endAndCombine(shadedBuilder, unshadedBuilder);
//
SuperByteBuffer sbb = new SuperByteBuffer(bufferedData); // SuperByteBuffer sbb = new SuperByteBuffer(bufferedData);
bufferedData.release(); // bufferedData.release();
return sbb; return null;
} }
private static class ThreadLocalObjects { private static class ThreadLocalObjects {
public final PoseStack poseStack = new PoseStack(); public final PoseStack poseStack = new PoseStack();
public final RandomSource random = RandomSource.createNewThreadLocalInstance(); 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 shadedBuilder = new BufferBuilder(512);
public final BufferBuilder unshadedBuilder = new BufferBuilder(512); public final BufferBuilder unshadedBuilder = new BufferBuilder(512);
} }

View file

@ -1,5 +1,9 @@
package com.simibubi.create.foundation.render; 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 com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
@ -19,11 +23,20 @@ public class BakedModelRenderHelper {
return standardModelRender(model, referenceState, new PoseStack()); return standardModelRender(model, referenceState, new PoseStack());
} }
public static SuperByteBuffer standardModelRender(BakedModel model, BlockState referenceState, PoseStack ms) { public static SuperByteBuffer standardModelRender(BakedModel bakedModel, BlockState referenceState, PoseStack ms) {
ShadeSeparatedBufferedData data = ModelUtil.getBufferedData(model, referenceState, ms); var model = new BakedModelBuilder(bakedModel).blockState(referenceState)
SuperByteBuffer sbb = new SuperByteBuffer(data); .poseStack(ms)
data.release(); .disableShadeSeparation()
return sbb; .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.Vector3f;
import org.joml.Vector4f; import org.joml.Vector4f;
import com.jozufozu.flywheel.api.model.Mesh;
import com.jozufozu.flywheel.api.vertex.VertexList; import com.jozufozu.flywheel.api.vertex.VertexList;
import com.jozufozu.flywheel.lib.math.DiffuseLightCalculator; import com.jozufozu.flywheel.lib.math.DiffuseLightCalculator;
import com.jozufozu.flywheel.lib.math.RenderMath; 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.Transform;
import com.jozufozu.flywheel.lib.transform.TransformStack; import com.jozufozu.flywheel.lib.transform.TransformStack;
import com.jozufozu.flywheel.lib.util.ShadersModHandler; 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.BufferBuilder;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexConsumer;
@ -33,8 +36,9 @@ import net.minecraft.core.Direction;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import net.minecraft.world.level.Level; 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 VertexList template;
private final IntPredicate shadedPredicate; private final IntPredicate shadedPredicate;
@ -67,26 +71,16 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer> {
// Temporary // Temporary
private static final Long2IntMap WORLD_LIGHT_CACHE = new Long2IntOpenHashMap(); private static final Long2IntMap WORLD_LIGHT_CACHE = new Long2IntOpenHashMap();
public SuperByteBuffer(ByteBuffer vertexBuffer, BufferBuilder.DrawState drawState, int unshadedStartVertex) { public SuperByteBuffer(Mesh mesh) {
int vertexCount = drawState.vertexCount(); var template = new FullVertexView();
int stride = drawState.format().getVertexSize();
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; 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; shadedPredicate = index -> true;
transforms.pushPose(); transforms.pushPose();
@ -247,7 +241,7 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer> {
} }
public void delete() { public void delete() {
template.delete(); backingStore.free();
} }
public PoseStack getTransforms() { public PoseStack getTransforms() {
@ -272,11 +266,13 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer> {
return this; return this;
} }
@Override
public SuperByteBuffer pushPose() { public SuperByteBuffer pushPose() {
transforms.pushPose(); transforms.pushPose();
return this; return this;
} }
@Override
public SuperByteBuffer popPose() { public SuperByteBuffer popPose() {
transforms.popPose(); transforms.popPose();
return this; return this;

View file

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