From d925d697cc8dbe888906ce853ff520f9fd20c0af Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Tue, 9 Jan 2024 12:28:25 -0800 Subject: [PATCH] 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. --- build.gradle | 7 ++ .../render/ContraptionProgram.java | 49 ++++---- .../render/ContraptionRenderDispatcher.java | 18 ++- .../render/ContraptionRenderInfo.java | 7 +- .../contraptions/render/FlwContraption.java | 2 +- .../render/SBBContraptionManager.java | 12 +- .../BracketedKineticBlockModel.java | 1 + .../cannon/SchematicannonRenderer.java | 1 + .../schematics/client/SchematicRenderer.java | 112 +++++++++--------- .../gui/element/GuiGameElement.java | 1 + .../ponder/element/WorldSectionElement.java | 109 +++++++++-------- .../render/BakedModelRenderHelper.java | 23 +++- .../create/foundation/render/ModelUtil.java | 13 ++ .../foundation/render/SuperByteBuffer.java | 36 +++--- .../utility/ghost/GhostBlockRenderer.java | 1 + 15 files changed, 208 insertions(+), 184 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/render/ModelUtil.java diff --git a/build.gradle b/build.gradle index b2acfbc94..e68a3a0d5 100644 --- a/build.gradle +++ b/build.gradle @@ -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}" diff --git a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionProgram.java b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionProgram.java index 9bc438ea9..542ed9431 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionProgram.java +++ b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionProgram.java @@ -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); +// } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderDispatcher.java index bb82dd94d..c9dc08ec0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderDispatcher.java @@ -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 values = c.getRenderedBlocks(); - var build = new MultiBlockModelBuilder(values).renderWorld(renderWorld) - .modelDataMap(c.modelData) - .build(); - SuperByteBuffer sbb = new SuperByteBuffer(data); - data.release(); - return sbb; +// Collection 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) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderInfo.java b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderInfo.java index dcf4e658c..e8301b0d6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderInfo.java +++ b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderInfo.java @@ -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() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/render/FlwContraption.java b/src/main/java/com/simibubi/create/content/contraptions/render/FlwContraption.java index 50e2f9ae3..62846edbd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/render/FlwContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/render/FlwContraption.java @@ -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; diff --git a/src/main/java/com/simibubi/create/content/contraptions/render/SBBContraptionManager.java b/src/main/java/com/simibubi/create/content/contraptions/render/SBBContraptionManager.java index 2972ab03b..f407d6582 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/render/SBBContraptionManager.java +++ b/src/main/java/com/simibubi/create/content/contraptions/render/SBBContraptionManager.java @@ -22,12 +22,12 @@ public class SBBContraptionManager extends ContraptionRenderingWorld 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 diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockModel.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockModel.java index 7605ab748..c0816a6af 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockModel.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockModel.java @@ -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; diff --git a/src/main/java/com/simibubi/create/content/schematics/cannon/SchematicannonRenderer.java b/src/main/java/com/simibubi/create/content/schematics/cannon/SchematicannonRenderer.java index 0e22f8564..bb38ca3c4 100644 --- a/src/main/java/com/simibubi/create/content/schematics/cannon/SchematicannonRenderer.java +++ b/src/main/java/com/simibubi/create/content/schematics/cannon/SchematicannonRenderer.java @@ -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; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java index 5fe24465a..e1d7cc6c9 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java @@ -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); } diff --git a/src/main/java/com/simibubi/create/foundation/gui/element/GuiGameElement.java b/src/main/java/com/simibubi/create/foundation/gui/element/GuiGameElement.java index f2fa2fcbb..c4f4e9435 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/element/GuiGameElement.java +++ b/src/main/java/com/simibubi/create/foundation/gui/element/GuiGameElement.java @@ -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; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/element/WorldSectionElement.java b/src/main/java/com/simibubi/create/foundation/ponder/element/WorldSectionElement.java index 5035a645f..e289df0d8 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/element/WorldSectionElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/element/WorldSectionElement.java @@ -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); } diff --git a/src/main/java/com/simibubi/create/foundation/render/BakedModelRenderHelper.java b/src/main/java/com/simibubi/create/foundation/render/BakedModelRenderHelper.java index f617e962f..007aa18c4 100644 --- a/src/main/java/com/simibubi/create/foundation/render/BakedModelRenderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/render/BakedModelRenderHelper.java @@ -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; } } diff --git a/src/main/java/com/simibubi/create/foundation/render/ModelUtil.java b/src/main/java/com/simibubi/create/foundation/render/ModelUtil.java new file mode 100644 index 000000000..b54c7324e --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/ModelUtil.java @@ -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 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)); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java b/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java index 86dbcdf83..94afa4465 100644 --- a/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java @@ -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 { +public class SuperByteBuffer implements TransformStack { + private final MemoryBlock backingStore; private final VertexList template; private final IntPredicate shadedPredicate; @@ -67,26 +71,16 @@ public class SuperByteBuffer implements Transform { // 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 { } public void delete() { - template.delete(); + backingStore.free(); } public PoseStack getTransforms() { @@ -272,11 +266,13 @@ public class SuperByteBuffer implements Transform { return this; } + @Override public SuperByteBuffer pushPose() { transforms.pushPose(); return this; } + @Override public SuperByteBuffer popPose() { transforms.popPose(); return this; diff --git a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java index 38c3aa527..c8e167093 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java @@ -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;