From 7813eedf61dc3873f1903c806f4220e63bcff752 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Mon, 6 Dec 2021 21:11:51 -0800 Subject: [PATCH 01/29] Miscellaneous gl changes while debugging - Only unbind at the end of MaterialManagerImpl#render - Add GlBufferType#bind and #unbind - Make GlVertexArray#unbind static --- .../flywheel/backend/gl/GlVertexArray.java | 2 +- .../flywheel/backend/gl/buffer/GlBuffer.java | 4 ++-- .../backend/gl/buffer/GlBufferType.java | 10 ++++++++ .../backend/instancing/GPUInstancer.java | 6 +---- .../backend/material/MaterialManagerImpl.java | 6 +++++ .../backend/model/ArrayModelRenderer.java | 4 +--- .../flywheel/core/FullscreenQuad.java | 4 ++-- .../core/crumbling/CrumblingGroup.java | 24 +++++++++++-------- 8 files changed, 37 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/GlVertexArray.java b/src/main/java/com/jozufozu/flywheel/backend/gl/GlVertexArray.java index 64544c54b..0802d231f 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/GlVertexArray.java +++ b/src/main/java/com/jozufozu/flywheel/backend/gl/GlVertexArray.java @@ -11,7 +11,7 @@ public class GlVertexArray extends GlObject { Backend.getInstance().compat.vao.bindVertexArray(handle()); } - public void unbind() { + public static void unbind() { Backend.getInstance().compat.vao.bindVertexArray(0); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/GlBuffer.java b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/GlBuffer.java index 54063a15d..f764f1dec 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/GlBuffer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/GlBuffer.java @@ -40,11 +40,11 @@ public abstract class GlBuffer extends GlObject { } public void bind() { - GL20.glBindBuffer(type.glEnum, handle()); + type.bind(handle()); } public void unbind() { - GL20.glBindBuffer(type.glEnum, 0); + type.unbind(); } public void doneForThisFrame() { diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/GlBufferType.java b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/GlBufferType.java index 7ba9d0073..b2371c440 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/GlBufferType.java +++ b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/GlBufferType.java @@ -8,6 +8,8 @@ import org.lwjgl.opengl.GL40; import org.lwjgl.opengl.GL42; import org.lwjgl.opengl.GL43; +import com.mojang.blaze3d.platform.GlStateManager; + public enum GlBufferType { ARRAY_BUFFER(GL15C.GL_ARRAY_BUFFER), ELEMENT_ARRAY_BUFFER(GL15C.GL_ELEMENT_ARRAY_BUFFER), @@ -29,4 +31,12 @@ public enum GlBufferType { GlBufferType(int glEnum) { this.glEnum = glEnum; } + + public void bind(int buffer) { + GlStateManager._glBindBuffer(glEnum, buffer); + } + + public void unbind() { + GlStateManager._glBindBuffer(glEnum, 0); + } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/GPUInstancer.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/GPUInstancer.java index d80982c38..a3ea14ceb 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/GPUInstancer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/GPUInstancer.java @@ -52,7 +52,7 @@ public class GPUInstancer extends AbstractInstancer { // persistent mapping sync point instanceVBO.doneForThisFrame(); - vao.unbind(); + GlVertexArray.unbind(); GlError.pollAndThrow(() -> modelData.name() + "_unbind"); } @@ -72,16 +72,12 @@ public class GPUInstancer extends AbstractInstancer { vao.bind(); model.setupState(); - - vao.unbind(); }); vao.bind(); instanceVBO = GlBuffer.requestPersistent(GlBufferType.ARRAY_BUFFER); AttribUtil.enableArrays(model.getAttributeCount() + instanceFormat.getAttributeCount()); - - vao.unbind(); } public boolean isInitialized() { diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/MaterialManagerImpl.java b/src/main/java/com/jozufozu/flywheel/backend/material/MaterialManagerImpl.java index 3c49410fd..7e5cca536 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/material/MaterialManagerImpl.java +++ b/src/main/java/com/jozufozu/flywheel/backend/material/MaterialManagerImpl.java @@ -5,6 +5,8 @@ import java.util.HashMap; import java.util.Map; import java.util.function.Supplier; +import com.jozufozu.flywheel.backend.gl.GlVertexArray; +import com.jozufozu.flywheel.backend.gl.buffer.GlBufferType; import com.jozufozu.flywheel.backend.state.RenderLayer; import com.jozufozu.flywheel.core.WorldContext; import com.jozufozu.flywheel.core.shader.WorldProgram; @@ -89,6 +91,10 @@ public class MaterialManagerImpl

implements MaterialMana group.render(state, viewProjection, camX, camY, camZ); } + + GlBufferType.ELEMENT_ARRAY_BUFFER.unbind(); + GlBufferType.ARRAY_BUFFER.unbind(); + GlVertexArray.unbind(); } public void delete() { diff --git a/src/main/java/com/jozufozu/flywheel/backend/model/ArrayModelRenderer.java b/src/main/java/com/jozufozu/flywheel/backend/model/ArrayModelRenderer.java index 48359821c..8ac9bc906 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/model/ArrayModelRenderer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/model/ArrayModelRenderer.java @@ -22,8 +22,6 @@ public class ArrayModelRenderer extends ModelRenderer { vao.bind(); model.drawCall(); - - vao.unbind(); } @Override @@ -44,7 +42,7 @@ public class ArrayModelRenderer extends ModelRenderer { AttribUtil.enableArrays(this.model.getAttributeCount()); - vao.unbind(); + GlVertexArray.unbind(); this.model.clearState(); } diff --git a/src/main/java/com/jozufozu/flywheel/core/FullscreenQuad.java b/src/main/java/com/jozufozu/flywheel/core/FullscreenQuad.java index 19245df4f..d3635718d 100644 --- a/src/main/java/com/jozufozu/flywheel/core/FullscreenQuad.java +++ b/src/main/java/com/jozufozu/flywheel/core/FullscreenQuad.java @@ -39,14 +39,14 @@ public class FullscreenQuad { GL20.glVertexAttribPointer(0, 4, GlNumericType.FLOAT.getGlEnum(), false, 4 * 4, 0); - vao.unbind(); + GlVertexArray.unbind(); vbo.unbind(); } public void draw() { vao.bind(); GL20.glDrawArrays(GL20.GL_TRIANGLES, 0, 6); - vao.unbind(); + GlVertexArray.unbind(); } public void delete() { diff --git a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingGroup.java b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingGroup.java index 3c403ebcd..cf096be15 100644 --- a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingGroup.java +++ b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingGroup.java @@ -28,16 +28,7 @@ public class CrumblingGroup

extends MaterialGroupImp int renderTex = RenderSystem.getShaderTexture(0); - ResourceLocation texture = RenderTextures.getShaderTexture(0); - - if (texture != null) { - SheetData atlasData = AtlasInfo.getAtlasData(texture); - - width = atlasData.width; - height = atlasData.height; - } else { - width = height = 256; - } + updateAtlasSize(); type.clearRenderState(); @@ -56,6 +47,19 @@ public class CrumblingGroup

extends MaterialGroupImp CrumblingRenderer._currentLayer.clearRenderState(); } + private void updateAtlasSize() { + ResourceLocation texture = RenderTextures.getShaderTexture(0); + + if (texture != null) { + SheetData atlasData = AtlasInfo.getAtlasData(texture); + + width = atlasData.width; + height = atlasData.height; + } else { + width = height = 256; + } + } + @Override public void setup(P p) { p.setAtlasSize(width, height); From ca459dd2cacbc85a397e3c7b53901ab96397e02f Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Mon, 6 Dec 2021 21:29:21 -0800 Subject: [PATCH 02/29] Update to 1.18 --- build.gradle | 4 ++-- gradle.properties | 6 +++--- src/main/java/com/jozufozu/flywheel/backend/RenderWork.java | 4 ++-- .../com/jozufozu/flywheel/config/BooleanConfigCommand.java | 2 +- src/main/java/com/jozufozu/flywheel/config/FlwCommands.java | 4 ++-- src/main/java/com/jozufozu/flywheel/config/FlwPackets.java | 6 +++--- .../jozufozu/flywheel/config/SConfigureBooleanPacket.java | 2 +- src/main/java/com/jozufozu/flywheel/core/PartialModel.java | 4 ++-- .../java/com/jozufozu/flywheel/core/StitchedSprite.java | 4 ++-- .../java/com/jozufozu/flywheel/core/model/ModelUtil.java | 4 ++-- .../java/com/jozufozu/flywheel/mixin/RenderHooksMixin.java | 4 ++-- .../flywheel/mixin/light/NetworkLightUpdateMixin.java | 2 +- src/main/java/com/jozufozu/flywheel/util/StreamUtil.java | 3 --- src/main/resources/META-INF/mods.toml | 6 +++--- 14 files changed, 26 insertions(+), 29 deletions(-) diff --git a/build.gradle b/build.gradle index 992b17818..77e321386 100644 --- a/build.gradle +++ b/build.gradle @@ -31,11 +31,11 @@ version = "${mc_update_version}-${mod_version}" + (dev ? ".${buildnumber}" : '') group = 'com.jozufozu.flywheel' archivesBaseName = 'flywheel-forge' -java.toolchain.languageVersion = JavaLanguageVersion.of(16) +java.toolchain.languageVersion = JavaLanguageVersion.of(17) println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + '(' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch')) minecraft { - mappings channel: 'parchment', version: "${parchment_version}-${minecraft_version}" + mappings channel: 'official', version: "${minecraft_version}" // TODO: waiting for parchment 1.18 runs { client { diff --git a/gradle.properties b/gradle.properties index 58c6330b9..f267992ed 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,9 +3,9 @@ org.gradle.daemon = false # mod version info mod_version = 0.3.0 -mc_update_version = 1.17 -minecraft_version = 1.17.1 -forge_version = 37.1.0 +mc_update_version = 1.18 +minecraft_version = 1.18 +forge_version = 38.0.15 # build dependency versions forgegradle_version = 5.1.+ diff --git a/src/main/java/com/jozufozu/flywheel/backend/RenderWork.java b/src/main/java/com/jozufozu/flywheel/backend/RenderWork.java index b73eef7f1..03369f6c5 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/RenderWork.java +++ b/src/main/java/com/jozufozu/flywheel/backend/RenderWork.java @@ -4,7 +4,7 @@ import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.RenderWorldLastEvent; +import net.minecraftforge.client.event.RenderLevelLastEvent; import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @@ -15,7 +15,7 @@ public class RenderWork { @SubscribeEvent(priority = EventPriority.LOWEST) - public static void onRenderWorldLast(RenderWorldLastEvent event) { + public static void onRenderWorldLast(RenderLevelLastEvent event) { while (!runs.isEmpty()) { runs.remove() .run(); diff --git a/src/main/java/com/jozufozu/flywheel/config/BooleanConfigCommand.java b/src/main/java/com/jozufozu/flywheel/config/BooleanConfigCommand.java index fc91f3b8d..b6c0d53ad 100644 --- a/src/main/java/com/jozufozu/flywheel/config/BooleanConfigCommand.java +++ b/src/main/java/com/jozufozu/flywheel/config/BooleanConfigCommand.java @@ -6,7 +6,7 @@ import com.mojang.brigadier.builder.ArgumentBuilder; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.fmllegacy.network.PacketDistributor; +import net.minecraftforge.network.PacketDistributor; public class BooleanConfigCommand { diff --git a/src/main/java/com/jozufozu/flywheel/config/FlwCommands.java b/src/main/java/com/jozufozu/flywheel/config/FlwCommands.java index ef79eda16..31525410c 100644 --- a/src/main/java/com/jozufozu/flywheel/config/FlwCommands.java +++ b/src/main/java/com/jozufozu/flywheel/config/FlwCommands.java @@ -4,12 +4,12 @@ import com.mojang.brigadier.CommandDispatcher; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; +import net.minecraftforge.event.server.ServerStartingEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fmlserverevents.FMLServerStartingEvent; public class FlwCommands { @SubscribeEvent - public static void onServerStarting(FMLServerStartingEvent event) { + public static void onServerStarting(ServerStartingEvent event) { CommandDispatcher dispatcher = event.getServer() .getCommands() .getDispatcher(); diff --git a/src/main/java/com/jozufozu/flywheel/config/FlwPackets.java b/src/main/java/com/jozufozu/flywheel/config/FlwPackets.java index 45207b3aa..97c4a0e46 100644 --- a/src/main/java/com/jozufozu/flywheel/config/FlwPackets.java +++ b/src/main/java/com/jozufozu/flywheel/config/FlwPackets.java @@ -3,9 +3,9 @@ package com.jozufozu.flywheel.config; import com.jozufozu.flywheel.Flywheel; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.fmllegacy.network.NetworkDirection; -import net.minecraftforge.fmllegacy.network.NetworkRegistry; -import net.minecraftforge.fmllegacy.network.simple.SimpleChannel; +import net.minecraftforge.network.NetworkDirection; +import net.minecraftforge.network.NetworkRegistry; +import net.minecraftforge.network.simple.SimpleChannel; public class FlwPackets { public static final ResourceLocation CHANNEL_NAME = new ResourceLocation(Flywheel.ID, "network"); diff --git a/src/main/java/com/jozufozu/flywheel/config/SConfigureBooleanPacket.java b/src/main/java/com/jozufozu/flywheel/config/SConfigureBooleanPacket.java index 86f2562c5..19853d9db 100644 --- a/src/main/java/com/jozufozu/flywheel/config/SConfigureBooleanPacket.java +++ b/src/main/java/com/jozufozu/flywheel/config/SConfigureBooleanPacket.java @@ -4,7 +4,7 @@ package com.jozufozu.flywheel.config; import java.util.function.Supplier; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.fmllegacy.network.NetworkEvent; +import net.minecraftforge.network.NetworkEvent; /** * Thanks, @zelophed diff --git a/src/main/java/com/jozufozu/flywheel/core/PartialModel.java b/src/main/java/com/jozufozu/flywheel/core/PartialModel.java index f84693eb3..6340e8441 100644 --- a/src/main/java/com/jozufozu/flywheel/core/PartialModel.java +++ b/src/main/java/com/jozufozu/flywheel/core/PartialModel.java @@ -8,7 +8,7 @@ import net.minecraft.client.resources.model.BakedModel; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.client.event.ModelBakeEvent; import net.minecraftforge.client.event.ModelRegistryEvent; -import net.minecraftforge.client.model.ModelLoader; +import net.minecraftforge.client.model.ForgeModelBakery; /** * A helper class for loading and accessing json models. @@ -38,7 +38,7 @@ public class PartialModel { public static void onModelRegistry(ModelRegistryEvent event) { for (PartialModel partial : ALL) - ModelLoader.addSpecialModel(partial.getLocation()); + ForgeModelBakery.addSpecialModel(partial.getLocation()); tooLate = true; } diff --git a/src/main/java/com/jozufozu/flywheel/core/StitchedSprite.java b/src/main/java/com/jozufozu/flywheel/core/StitchedSprite.java index 6f6157799..a08f27ab8 100644 --- a/src/main/java/com/jozufozu/flywheel/core/StitchedSprite.java +++ b/src/main/java/com/jozufozu/flywheel/core/StitchedSprite.java @@ -29,7 +29,7 @@ public class StitchedSprite { } public static void onTextureStitchPre(TextureStitchEvent.Pre event) { - ResourceLocation atlasLocation = event.getMap().location(); + ResourceLocation atlasLocation = event.getAtlas().location(); List sprites = ALL.get(atlasLocation); if (sprites != null) { for (StitchedSprite sprite : sprites) { @@ -39,7 +39,7 @@ public class StitchedSprite { } public static void onTextureStitchPost(TextureStitchEvent.Post event) { - TextureAtlas atlas = event.getMap(); + TextureAtlas atlas = event.getAtlas(); ResourceLocation atlasLocation = atlas.location(); List sprites = ALL.get(atlasLocation); if (sprites != null) { diff --git a/src/main/java/com/jozufozu/flywheel/core/model/ModelUtil.java b/src/main/java/com/jozufozu/flywheel/core/model/ModelUtil.java index 5cc93692f..bdbb738e8 100644 --- a/src/main/java/com/jozufozu/flywheel/core/model/ModelUtil.java +++ b/src/main/java/com/jozufozu/flywheel/core/model/ModelUtil.java @@ -34,7 +34,7 @@ public class ModelUtil { BufferBuilder builder = new BufferBuilder(DefaultVertexFormat.BLOCK.getIntegerSize()); builder.begin(QUADS, DefaultVertexFormat.BLOCK); - ForgeHooksClient.setRenderLayer(layer); + ForgeHooksClient.setRenderType(layer); ModelBlockRenderer.enableCaching(); for (StructureTemplate.StructureBlockInfo info : blocks) { BlockState state = info.state; @@ -53,7 +53,7 @@ public class ModelUtil { ms.popPose(); } ModelBlockRenderer.clearCache(); - ForgeHooksClient.setRenderLayer(null); + ForgeHooksClient.setRenderType(null); builder.end(); return builder; diff --git a/src/main/java/com/jozufozu/flywheel/mixin/RenderHooksMixin.java b/src/main/java/com/jozufozu/flywheel/mixin/RenderHooksMixin.java index 7a9c82540..ca534b44d 100644 --- a/src/main/java/com/jozufozu/flywheel/mixin/RenderHooksMixin.java +++ b/src/main/java/com/jozufozu/flywheel/mixin/RenderHooksMixin.java @@ -46,8 +46,8 @@ public class RenderHooksMixin { private RenderBuffers renderBuffers; @Inject(at = @At("HEAD"), method = "setupRender") - private void setupRender(Camera info, Frustum clippingHelper, boolean p_228437_3_, int frameCount, boolean isSpectator, CallbackInfo ci) { - MinecraftForge.EVENT_BUS.post(new BeginFrameEvent(level, info, clippingHelper)); + private void setupRender(Camera camera, Frustum frustum, boolean queue, boolean isSpectator, CallbackInfo ci) { + MinecraftForge.EVENT_BUS.post(new BeginFrameEvent(level, camera, frustum)); } /** diff --git a/src/main/java/com/jozufozu/flywheel/mixin/light/NetworkLightUpdateMixin.java b/src/main/java/com/jozufozu/flywheel/mixin/light/NetworkLightUpdateMixin.java index 0992907e3..d38d18fdc 100644 --- a/src/main/java/com/jozufozu/flywheel/mixin/light/NetworkLightUpdateMixin.java +++ b/src/main/java/com/jozufozu/flywheel/mixin/light/NetworkLightUpdateMixin.java @@ -16,7 +16,7 @@ import net.minecraft.network.protocol.game.ClientboundLightUpdatePacket; @Mixin(ClientPacketListener.class) public class NetworkLightUpdateMixin { - @Inject(at = @At("TAIL"), method = "handleLightUpdatePacked") + @Inject(at = @At("TAIL"), method = "handleLightUpdatePacket") private void onLightPacket(ClientboundLightUpdatePacket packet, CallbackInfo ci) { RenderWork.enqueue(() -> { ClientLevel world = Minecraft.getInstance().level; diff --git a/src/main/java/com/jozufozu/flywheel/util/StreamUtil.java b/src/main/java/com/jozufozu/flywheel/util/StreamUtil.java index c2dcd844a..dd1b4d70a 100644 --- a/src/main/java/com/jozufozu/flywheel/util/StreamUtil.java +++ b/src/main/java/com/jozufozu/flywheel/util/StreamUtil.java @@ -11,11 +11,8 @@ import java.nio.channels.ReadableByteChannel; import org.lwjgl.system.MemoryUtil; -import com.mojang.blaze3d.systems.RenderSystem; - public class StreamUtil { public static String readToString(InputStream is) { - RenderSystem.assertThread(RenderSystem::isOnRenderThread); ByteBuffer bytebuffer = null; try { diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 7012cd059..5e2744c9f 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -1,5 +1,5 @@ modLoader = "javafml" -loaderVersion = "[37,)" +loaderVersion = "[38,)" issueTrackerURL = "https://github.com/Jozufozu/Flywheel/issues" license = "MIT" @@ -17,13 +17,13 @@ A modern engine for modded minecraft. [[dependencies.flywheel]] modId = "forge" mandatory = true -versionRange = "[37,)" +versionRange = "[38,)" ordering = "NONE" side = "BOTH" [[dependencies.flywheel]] modId = "minecraft" mandatory = true -versionRange = "[1.17,1.18)" +versionRange = "[1.18,1.19)" ordering = "NONE" side = "BOTH" From f7c45e5486e312a38857c034778aee3ed8ba60a7 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Mon, 6 Dec 2021 23:36:14 -0800 Subject: [PATCH 03/29] Get started on a batching engine - An Engine is a MaterialManager and a RenderDispatcher - Refactor InstanceManager's ctor to use the MaterialManager interface instead of the concrete type - MaterialManagerImpl -> InstancingEngine - Add skeleton for BatchingEngine - Hack in InstanceWorld to switch between the 2 - Rename/move existing MaterialManager impl to new package --- .../backend/instancing/CPUInstancer.java | 39 ++++++++++++++ .../backend/instancing/InstanceManager.java | 8 ++- .../backend/instancing/InstanceWorld.java | 36 ++++++++----- .../entity/EntityInstanceManager.java | 4 +- .../instancing/tile/TileInstanceManager.java | 4 +- .../flywheel/backend/material/Engine.java | 4 ++ .../backend/material/RenderDispatcher.java | 28 ++++++++++ .../material/batching/BatchedMaterial.java | 46 ++++++++++++++++ .../batching/BatchedMaterialGroup.java | 52 ++++++++++++++++++ .../material/batching/BatchingEngine.java | 54 +++++++++++++++++++ .../material/batching/package-info.java | 6 +++ .../InstancedMaterial.java} | 8 +-- .../InstancedMaterialGroup.java} | 30 ++++++----- .../InstancedMaterialRenderer.java} | 8 +-- .../InstancingEngine.java} | 47 +++++++++------- .../flywheel/backend/struct/Batched.java | 13 +++++ .../backend/struct/BatchingTransformer.java | 11 ++++ .../flywheel/backend/struct/StructType.java | 2 + .../core/crumbling/CrumblingGroup.java | 12 ++--- .../crumbling/CrumblingInstanceManager.java | 4 +- .../core/crumbling/CrumblingRenderer.java | 21 ++++---- .../materials/model/ModelTransformer.java | 12 +++++ .../core/materials/model/ModelType.java | 10 +++- .../core/materials/oriented/OrientedType.java | 10 +++- .../flywheel/mixin/RenderHooksMixin.java | 8 +-- 25 files changed, 388 insertions(+), 89 deletions(-) create mode 100644 src/main/java/com/jozufozu/flywheel/backend/instancing/CPUInstancer.java create mode 100644 src/main/java/com/jozufozu/flywheel/backend/material/Engine.java create mode 100644 src/main/java/com/jozufozu/flywheel/backend/material/RenderDispatcher.java create mode 100644 src/main/java/com/jozufozu/flywheel/backend/material/batching/BatchedMaterial.java create mode 100644 src/main/java/com/jozufozu/flywheel/backend/material/batching/BatchedMaterialGroup.java create mode 100644 src/main/java/com/jozufozu/flywheel/backend/material/batching/BatchingEngine.java create mode 100644 src/main/java/com/jozufozu/flywheel/backend/material/batching/package-info.java rename src/main/java/com/jozufozu/flywheel/backend/material/{MaterialImpl.java => instancing/InstancedMaterial.java} (87%) rename src/main/java/com/jozufozu/flywheel/backend/material/{MaterialGroupImpl.java => instancing/InstancedMaterialGroup.java} (52%) rename src/main/java/com/jozufozu/flywheel/backend/material/{MaterialRenderer.java => instancing/InstancedMaterialRenderer.java} (78%) rename src/main/java/com/jozufozu/flywheel/backend/material/{MaterialManagerImpl.java => instancing/InstancingEngine.java} (72%) create mode 100644 src/main/java/com/jozufozu/flywheel/backend/struct/Batched.java create mode 100644 src/main/java/com/jozufozu/flywheel/backend/struct/BatchingTransformer.java create mode 100644 src/main/java/com/jozufozu/flywheel/core/materials/model/ModelTransformer.java diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/CPUInstancer.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/CPUInstancer.java new file mode 100644 index 000000000..eadfa9db8 --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/CPUInstancer.java @@ -0,0 +1,39 @@ +package com.jozufozu.flywheel.backend.instancing; + +import com.jozufozu.flywheel.backend.struct.BatchingTransformer; +import com.jozufozu.flywheel.backend.struct.StructType; +import com.jozufozu.flywheel.core.model.IModel; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; + +public class CPUInstancer extends AbstractInstancer { + + private final BatchingTransformer renderer; + + public CPUInstancer(StructType type, IModel modelData) { + super(type, modelData); + + renderer = type.asBatched() + .getTransformer(modelData); + } + + public void drawAll(PoseStack stack, VertexConsumer buffer) { + if (renderer == null) { + return; + } + + renderSetup(); + + for (D d : data) { + renderer.draw(d, stack, buffer); + } + } + + protected void renderSetup() { + if (anyToRemove) { + removeDeletedInstances(); + } + + anyToRemove = anyToUpdate = false; + } +} diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceManager.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceManager.java index b10936ca6..cece70c00 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceManager.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceManager.java @@ -10,7 +10,7 @@ import javax.annotation.Nullable; import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.material.MaterialManager; -import com.jozufozu.flywheel.backend.material.MaterialManagerImpl; +import com.jozufozu.flywheel.backend.material.instancing.InstancingEngine; import com.jozufozu.flywheel.light.LightUpdater; import com.mojang.math.Vector3f; @@ -19,7 +19,7 @@ import net.minecraft.client.Camera; import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; -public abstract class InstanceManager implements MaterialManagerImpl.OriginShiftListener { +public abstract class InstanceManager implements InstancingEngine.OriginShiftListener { public final MaterialManager materialManager; @@ -33,7 +33,7 @@ public abstract class InstanceManager implements MaterialManagerImpl.OriginSh protected int frame; protected int tick; - public InstanceManager(MaterialManagerImpl materialManager) { + public InstanceManager(MaterialManager materialManager) { this.materialManager = materialManager; this.queuedUpdates = new HashSet<>(64); this.queuedAdditions = new HashSet<>(64); @@ -41,8 +41,6 @@ public abstract class InstanceManager implements MaterialManagerImpl.OriginSh this.dynamicInstances = new Object2ObjectOpenHashMap<>(); this.tickableInstances = new Object2ObjectOpenHashMap<>(); - - materialManager.addListener(this); } /** diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceWorld.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceWorld.java index 4f1d0f8a6..391b36824 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceWorld.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceWorld.java @@ -2,8 +2,9 @@ package com.jozufozu.flywheel.backend.instancing; import com.jozufozu.flywheel.backend.instancing.entity.EntityInstanceManager; import com.jozufozu.flywheel.backend.instancing.tile.TileInstanceManager; -import com.jozufozu.flywheel.backend.material.MaterialManager; -import com.jozufozu.flywheel.backend.material.MaterialManagerImpl; +import com.jozufozu.flywheel.backend.material.Engine; +import com.jozufozu.flywheel.backend.material.instancing.InstancingEngine; +import com.jozufozu.flywheel.backend.material.batching.BatchingEngine; import com.jozufozu.flywheel.core.Contexts; import com.jozufozu.flywheel.core.shader.WorldProgram; import com.jozufozu.flywheel.event.BeginFrameEvent; @@ -22,20 +23,29 @@ import net.minecraft.world.level.block.entity.BlockEntity; *

*/ public class InstanceWorld { - protected final MaterialManagerImpl materialManager; + protected final Engine engine; protected final InstanceManager entityInstanceManager; protected final InstanceManager tileEntityInstanceManager; public InstanceWorld() { - materialManager = MaterialManagerImpl.builder(Contexts.WORLD) - .build(); - entityInstanceManager = new EntityInstanceManager(materialManager); - tileEntityInstanceManager = new TileInstanceManager(materialManager); - } + boolean batching = false; - public MaterialManager getMaterialManager() { - return materialManager; + if (batching) { + engine = new BatchingEngine(); + entityInstanceManager = new EntityInstanceManager(engine); + tileEntityInstanceManager = new TileInstanceManager(engine); + } else { + InstancingEngine manager = InstancingEngine.builder(Contexts.WORLD) + .build(); + + entityInstanceManager = new EntityInstanceManager(manager); + tileEntityInstanceManager = new TileInstanceManager(manager); + + manager.addListener(entityInstanceManager); + manager.addListener(tileEntityInstanceManager); + engine = manager; + } } public InstanceManager getEntityInstanceManager() { @@ -50,7 +60,7 @@ public class InstanceWorld { * Free all acquired resources and invalidate this instance world. */ public void delete() { - materialManager.delete(); + engine.delete(); } /** @@ -73,7 +83,7 @@ public class InstanceWorld { *

*/ public void beginFrame(BeginFrameEvent event) { - materialManager.beginFrame(event.getInfo()); + engine.beginFrame(event.getInfo()); tileEntityInstanceManager.beginFrame(event.getInfo()); entityInstanceManager.beginFrame(event.getInfo()); @@ -99,6 +109,6 @@ public class InstanceWorld { * Draw the given layer. */ public void renderLayer(RenderLayerEvent event) { - materialManager.render(event.layer, event.viewProjection, event.camX, event.camY, event.camZ); + engine.render(event, event.buffers.bufferSource()); } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstanceManager.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstanceManager.java index db9ba49ec..cb3759e5b 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstanceManager.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstanceManager.java @@ -4,7 +4,7 @@ import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.instancing.AbstractInstance; import com.jozufozu.flywheel.backend.instancing.InstanceManager; import com.jozufozu.flywheel.backend.instancing.InstancedRenderRegistry; -import com.jozufozu.flywheel.backend.material.MaterialManagerImpl; +import com.jozufozu.flywheel.backend.material.MaterialManager; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.Entity; @@ -13,7 +13,7 @@ import net.minecraft.world.level.Level; public class EntityInstanceManager extends InstanceManager { - public EntityInstanceManager(MaterialManagerImpl materialManager) { + public EntityInstanceManager(MaterialManager materialManager) { super(materialManager); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/TileInstanceManager.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/TileInstanceManager.java index 40505b260..234c2d7cb 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/TileInstanceManager.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/TileInstanceManager.java @@ -4,7 +4,7 @@ import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.instancing.AbstractInstance; import com.jozufozu.flywheel.backend.instancing.InstanceManager; import com.jozufozu.flywheel.backend.instancing.InstancedRenderRegistry; -import com.jozufozu.flywheel.backend.material.MaterialManagerImpl; +import com.jozufozu.flywheel.backend.material.MaterialManager; import net.minecraft.core.BlockPos; import net.minecraft.world.level.BlockGetter; @@ -13,7 +13,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; public class TileInstanceManager extends InstanceManager { - public TileInstanceManager(MaterialManagerImpl materialManager) { + public TileInstanceManager(MaterialManager materialManager) { super(materialManager); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/Engine.java b/src/main/java/com/jozufozu/flywheel/backend/material/Engine.java new file mode 100644 index 000000000..215764bfb --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/backend/material/Engine.java @@ -0,0 +1,4 @@ +package com.jozufozu.flywheel.backend.material; + +public interface Engine extends RenderDispatcher, MaterialManager { +} diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/RenderDispatcher.java b/src/main/java/com/jozufozu/flywheel/backend/material/RenderDispatcher.java new file mode 100644 index 000000000..a528d0f0f --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/backend/material/RenderDispatcher.java @@ -0,0 +1,28 @@ +package com.jozufozu.flywheel.backend.material; + +import com.jozufozu.flywheel.backend.state.RenderLayer; +import com.jozufozu.flywheel.event.RenderLayerEvent; + +import net.minecraft.client.Camera; +import net.minecraft.client.renderer.MultiBufferSource; + +public interface RenderDispatcher { + /** + * Render every model for every material. + * + * @param layer Which of the 3 {@link RenderLayer render layers} is being drawn? + * @param viewProjection How do we get from camera space to clip space? + */ + void render(RenderLayerEvent event, MultiBufferSource buffers); + + /** + * Maintain the integer origin coordinate to be within a certain distance from the camera in all directions. + *

+ * This prevents floating point precision issues at high coordinates. + */ + void beginFrame(Camera info); + + default void delete() { + + } +} diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/batching/BatchedMaterial.java b/src/main/java/com/jozufozu/flywheel/backend/material/batching/BatchedMaterial.java new file mode 100644 index 000000000..96a93766a --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/backend/material/batching/BatchedMaterial.java @@ -0,0 +1,46 @@ +package com.jozufozu.flywheel.backend.material.batching; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Supplier; + +import com.jozufozu.flywheel.backend.instancing.CPUInstancer; +import com.jozufozu.flywheel.backend.instancing.InstanceData; +import com.jozufozu.flywheel.backend.instancing.Instancer; +import com.jozufozu.flywheel.backend.material.Material; +import com.jozufozu.flywheel.backend.material.MaterialSpec; +import com.jozufozu.flywheel.backend.struct.StructType; +import com.jozufozu.flywheel.core.model.IModel; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; + +public class BatchedMaterial implements Material { + + protected final Map> models; + private final StructType type; + + public BatchedMaterial(MaterialSpec spec) { + type = spec.getInstanceType(); + + this.models = new HashMap<>(); + } + + @Override + public Instancer model(Object key, Supplier modelSupplier) { + return models.computeIfAbsent(key, $ -> new CPUInstancer<>(type, modelSupplier.get())); + } + + public void render(PoseStack stack, VertexConsumer buffer) { + for (CPUInstancer instancer : models.values()) { + instancer.drawAll(stack, buffer); + } + } + + /** + * Clear all instance data without freeing resources. + */ + public void clear() { + models.values() + .forEach(CPUInstancer::clear); + } +} diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/batching/BatchedMaterialGroup.java b/src/main/java/com/jozufozu/flywheel/backend/material/batching/BatchedMaterialGroup.java new file mode 100644 index 000000000..b843897dd --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/backend/material/batching/BatchedMaterialGroup.java @@ -0,0 +1,52 @@ +package com.jozufozu.flywheel.backend.material.batching; + +import java.util.HashMap; +import java.util.Map; + +import com.jozufozu.flywheel.backend.instancing.InstanceData; +import com.jozufozu.flywheel.backend.material.MaterialGroup; +import com.jozufozu.flywheel.backend.material.MaterialSpec; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; + +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; + +public class BatchedMaterialGroup implements MaterialGroup { + + protected final RenderType state; + + private final Map, BatchedMaterial> materials = new HashMap<>(); + + public BatchedMaterialGroup(RenderType state) { + this.state = state; + } + + /** + * Get the material as defined by the given {@link MaterialSpec spec}. + * @param spec The material you want to create instances with. + * @param The type representing the per instance data. + * @return A + */ + @SuppressWarnings("unchecked") + @Override + public BatchedMaterial material(MaterialSpec spec) { + return (BatchedMaterial) materials.computeIfAbsent(spec, BatchedMaterial::new); + } + + public void render(PoseStack stack, MultiBufferSource source) { + VertexConsumer buffer = source.getBuffer(state); + + for (BatchedMaterial value : materials.values()) { + value.render(stack, buffer); + } + } + + public void clear() { + materials.values().forEach(BatchedMaterial::clear); + } + + public void delete() { + materials.clear(); + } +} diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/batching/BatchingEngine.java b/src/main/java/com/jozufozu/flywheel/backend/material/batching/BatchingEngine.java new file mode 100644 index 000000000..c7d0d3354 --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/backend/material/batching/BatchingEngine.java @@ -0,0 +1,54 @@ +package com.jozufozu.flywheel.backend.material.batching; + +import java.util.EnumMap; +import java.util.HashMap; +import java.util.Map; + +import com.jozufozu.flywheel.backend.material.Engine; +import com.jozufozu.flywheel.backend.material.MaterialGroup; +import com.jozufozu.flywheel.backend.state.RenderLayer; +import com.jozufozu.flywheel.event.RenderLayerEvent; + +import net.minecraft.client.Camera; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Vec3i; + +public class BatchingEngine implements Engine { + + protected BlockPos originCoordinate = BlockPos.ZERO; + + protected final Map> layers; + + public BatchingEngine() { + this.layers = new EnumMap<>(RenderLayer.class); + for (RenderLayer value : RenderLayer.values()) { + layers.put(value, new HashMap<>()); + } + } + + @Override + public MaterialGroup state(RenderLayer layer, RenderType state) { + return layers.get(layer).computeIfAbsent(state, BatchedMaterialGroup::new); + } + + @Override + public Vec3i getOriginCoordinate() { + return originCoordinate; + } + + @Override + public void render(RenderLayerEvent event, MultiBufferSource buffers) { + for (Map.Entry entry : layers.get(event.getLayer()).entrySet()) { + BatchedMaterialGroup group = entry.getValue(); + + group.render(event.stack, buffers); + } + } + + @Override + public void beginFrame(Camera info) { + + } +} diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/batching/package-info.java b/src/main/java/com/jozufozu/flywheel/backend/material/batching/package-info.java new file mode 100644 index 000000000..c9e565892 --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/backend/material/batching/package-info.java @@ -0,0 +1,6 @@ +@ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault +package com.jozufozu.flywheel.backend.material.batching; + +import javax.annotation.ParametersAreNonnullByDefault; + +import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/MaterialImpl.java b/src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancedMaterial.java similarity index 87% rename from src/main/java/com/jozufozu/flywheel/backend/material/MaterialImpl.java rename to src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancedMaterial.java index acef52c2c..c0704162f 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/material/MaterialImpl.java +++ b/src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancedMaterial.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.backend.material; +package com.jozufozu.flywheel.backend.material.instancing; import java.util.concurrent.ExecutionException; import java.util.function.Supplier; @@ -9,6 +9,8 @@ import com.jozufozu.flywheel.backend.RenderWork; import com.jozufozu.flywheel.backend.instancing.GPUInstancer; import com.jozufozu.flywheel.backend.instancing.InstanceData; import com.jozufozu.flywheel.backend.instancing.Instancer; +import com.jozufozu.flywheel.backend.material.Material; +import com.jozufozu.flywheel.backend.material.MaterialSpec; import com.jozufozu.flywheel.backend.model.ModelPool; import com.jozufozu.flywheel.backend.struct.StructType; import com.jozufozu.flywheel.core.model.IModel; @@ -17,13 +19,13 @@ import com.jozufozu.flywheel.core.model.IModel; * A collection of Instancers that all have the same format. * @param */ -public class MaterialImpl implements Material { +public class InstancedMaterial implements Material { final ModelPool modelPool; protected final Cache> models; protected final StructType type; - public MaterialImpl(MaterialSpec spec) { + public InstancedMaterial(MaterialSpec spec) { this.type = spec.getInstanceType(); modelPool = new ModelPool(spec.getModelFormat(), 64); diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/MaterialGroupImpl.java b/src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancedMaterialGroup.java similarity index 52% rename from src/main/java/com/jozufozu/flywheel/backend/material/MaterialGroupImpl.java rename to src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancedMaterialGroup.java index f8c8405c3..5933a97d0 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/material/MaterialGroupImpl.java +++ b/src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancedMaterialGroup.java @@ -1,10 +1,12 @@ -package com.jozufozu.flywheel.backend.material; +package com.jozufozu.flywheel.backend.material.instancing; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import com.jozufozu.flywheel.backend.instancing.InstanceData; +import com.jozufozu.flywheel.backend.material.MaterialGroup; +import com.jozufozu.flywheel.backend.material.MaterialSpec; import com.jozufozu.flywheel.core.shader.WorldProgram; import com.jozufozu.flywheel.util.TextureBinder; import com.mojang.math.Matrix4f; @@ -17,15 +19,15 @@ import net.minecraft.client.renderer.RenderType; * The children of a material group will all be rendered at the same time. * No guarantees are made about the order of draw calls. */ -public class MaterialGroupImpl

implements MaterialGroup { +public class InstancedMaterialGroup

implements MaterialGroup { - protected final MaterialManagerImpl

owner; + protected final InstancingEngine

owner; - protected final ArrayList> renderers = new ArrayList<>(); + protected final ArrayList> renderers = new ArrayList<>(); - private final Map, MaterialImpl> materials = new HashMap<>(); + private final Map, InstancedMaterial> materials = new HashMap<>(); - public MaterialGroupImpl(MaterialManagerImpl

owner) { + public InstancedMaterialGroup(InstancingEngine

owner) { this.owner = owner; } @@ -37,14 +39,14 @@ public class MaterialGroupImpl

implements MaterialGroup */ @SuppressWarnings("unchecked") @Override - public MaterialImpl material(MaterialSpec spec) { - return (MaterialImpl) materials.computeIfAbsent(spec, this::createInstanceMaterial); + public InstancedMaterial material(MaterialSpec spec) { + return (InstancedMaterial) materials.computeIfAbsent(spec, this::createInstanceMaterial); } public void render(RenderType type, Matrix4f viewProjection, double camX, double camY, double camZ) { type.setupRenderState(); TextureBinder.bindActiveTextures(); - for (MaterialRenderer

renderer : renderers) { + for (InstancedMaterialRenderer

renderer : renderers) { renderer.render(viewProjection, camX, camY, camZ); } type.clearRenderState(); @@ -55,21 +57,21 @@ public class MaterialGroupImpl

implements MaterialGroup } public void clear() { - materials.values().forEach(MaterialImpl::clear); + materials.values().forEach(InstancedMaterial::clear); } public void delete() { materials.values() - .forEach(MaterialImpl::delete); + .forEach(InstancedMaterial::delete); materials.clear(); renderers.clear(); } - private MaterialImpl createInstanceMaterial(MaterialSpec type) { - MaterialImpl material = new MaterialImpl<>(type); + private InstancedMaterial createInstanceMaterial(MaterialSpec type) { + InstancedMaterial material = new InstancedMaterial<>(type); - this.renderers.add(new MaterialRenderer<>(owner.getProgram(type.getProgramName()), material, this::setup)); + this.renderers.add(new InstancedMaterialRenderer<>(owner.getProgram(type.getProgramName()), material, this::setup)); return material; } diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/MaterialRenderer.java b/src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancedMaterialRenderer.java similarity index 78% rename from src/main/java/com/jozufozu/flywheel/backend/material/MaterialRenderer.java rename to src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancedMaterialRenderer.java index bbffa0881..ac8c64e16 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/material/MaterialRenderer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancedMaterialRenderer.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.backend.material; +package com.jozufozu.flywheel.backend.material.instancing; import java.util.Collection; import java.util.function.Consumer; @@ -8,14 +8,14 @@ import com.jozufozu.flywheel.backend.instancing.GPUInstancer; import com.jozufozu.flywheel.core.shader.WorldProgram; import com.mojang.math.Matrix4f; -public class MaterialRenderer

{ +public class InstancedMaterialRenderer

{ protected final Supplier

program; - protected final MaterialImpl material; + protected final InstancedMaterial material; protected final Consumer

setupFunc; - public MaterialRenderer(Supplier

programSupplier, MaterialImpl material, Consumer

setupFunc) { + public InstancedMaterialRenderer(Supplier

programSupplier, InstancedMaterial material, Consumer

setupFunc) { this.program = programSupplier; this.material = material; this.setupFunc = setupFunc; diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/MaterialManagerImpl.java b/src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancingEngine.java similarity index 72% rename from src/main/java/com/jozufozu/flywheel/backend/material/MaterialManagerImpl.java rename to src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancingEngine.java index 7e5cca536..25fa707c9 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/material/MaterialManagerImpl.java +++ b/src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancingEngine.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.backend.material; +package com.jozufozu.flywheel.backend.material.instancing; import java.util.EnumMap; import java.util.HashMap; @@ -7,20 +7,24 @@ import java.util.function.Supplier; import com.jozufozu.flywheel.backend.gl.GlVertexArray; import com.jozufozu.flywheel.backend.gl.buffer.GlBufferType; +import com.jozufozu.flywheel.backend.material.Engine; +import com.jozufozu.flywheel.backend.material.MaterialGroup; import com.jozufozu.flywheel.backend.state.RenderLayer; import com.jozufozu.flywheel.core.WorldContext; import com.jozufozu.flywheel.core.shader.WorldProgram; +import com.jozufozu.flywheel.event.RenderLayerEvent; import com.jozufozu.flywheel.util.WeakHashSet; import com.mojang.math.Matrix4f; import net.minecraft.client.Camera; +import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; -public class MaterialManagerImpl

implements MaterialManager { +public class InstancingEngine

implements Engine { public static int MAX_ORIGIN_DISTANCE = 100; @@ -30,19 +34,19 @@ public class MaterialManagerImpl

implements MaterialMana protected final GroupFactory

groupFactory; protected final boolean ignoreOriginCoordinate; - protected final Map>> layers; + protected final Map>> layers; private final WeakHashSet listeners; - public MaterialManagerImpl(WorldContext

context) { - this(context, MaterialGroupImpl::new, false); + public InstancingEngine(WorldContext

context) { + this(context, InstancedMaterialGroup::new, false); } public static

Builder

builder(WorldContext

context) { return new Builder<>(context); } - public MaterialManagerImpl(WorldContext

context, GroupFactory

groupFactory, boolean ignoreOriginCoordinate) { + public InstancingEngine(WorldContext

context, GroupFactory

groupFactory, boolean ignoreOriginCoordinate) { this.context = context; this.ignoreOriginCoordinate = ignoreOriginCoordinate; @@ -69,10 +73,13 @@ public class MaterialManagerImpl

implements MaterialMana /** * Render every model for every material. - * @param layer Which of the 3 {@link RenderLayer render layers} is being drawn? - * @param viewProjection How do we get from camera space to clip space? */ - public void render(RenderLayer layer, Matrix4f viewProjection, double camX, double camY, double camZ) { + @Override + public void render(RenderLayerEvent event, MultiBufferSource buffers) { + double camX = event.camX; + double camY = event.camY; + double camZ = event.camZ; + Matrix4f viewProjection = event.viewProjection; if (!ignoreOriginCoordinate) { camX -= originCoordinate.getX(); camY -= originCoordinate.getY(); @@ -85,9 +92,9 @@ public class MaterialManagerImpl

implements MaterialMana viewProjection = translate; } - for (Map.Entry> entry : layers.get(layer).entrySet()) { + for (Map.Entry> entry : layers.get(event.getLayer()).entrySet()) { RenderType state = entry.getKey(); - MaterialGroupImpl

group = entry.getValue(); + InstancedMaterialGroup

group = entry.getValue(); group.render(state, viewProjection, camX, camY, camZ); } @@ -97,10 +104,11 @@ public class MaterialManagerImpl

implements MaterialMana GlVertexArray.unbind(); } + @Override public void delete() { - for (Map> groups : layers.values()) { + for (Map> groups : layers.values()) { - groups.values().forEach(MaterialGroupImpl::delete); + groups.values().forEach(InstancedMaterialGroup::delete); } } @@ -122,6 +130,7 @@ public class MaterialManagerImpl

implements MaterialMana * * This prevents floating point precision issues at high coordinates. */ + @Override public void beginFrame(Camera info) { int cX = Mth.floor(info.getPosition().x); int cY = Mth.floor(info.getPosition().y); @@ -135,8 +144,8 @@ public class MaterialManagerImpl

implements MaterialMana originCoordinate = new BlockPos(cX, cY, cZ); - for (Map> groups : layers.values()) { - groups.values().forEach(MaterialGroupImpl::clear); + for (Map> groups : layers.values()) { + groups.values().forEach(InstancedMaterialGroup::clear); } listeners.forEach(OriginShiftListener::onOriginShift); @@ -150,12 +159,12 @@ public class MaterialManagerImpl

implements MaterialMana @FunctionalInterface public interface GroupFactory

{ - MaterialGroupImpl

create(MaterialManagerImpl

materialManager); + InstancedMaterialGroup

create(InstancingEngine

materialManager); } public static class Builder

{ protected final WorldContext

context; - protected GroupFactory

groupFactory = MaterialGroupImpl::new; + protected GroupFactory

groupFactory = InstancedMaterialGroup::new; protected boolean ignoreOriginCoordinate; public Builder(WorldContext

context) { @@ -172,8 +181,8 @@ public class MaterialManagerImpl

implements MaterialMana return this; } - public MaterialManagerImpl

build() { - return new MaterialManagerImpl<>(context, groupFactory, ignoreOriginCoordinate); + public InstancingEngine

build() { + return new InstancingEngine<>(context, groupFactory, ignoreOriginCoordinate); } } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/struct/Batched.java b/src/main/java/com/jozufozu/flywheel/backend/struct/Batched.java new file mode 100644 index 000000000..d3b1f6724 --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/backend/struct/Batched.java @@ -0,0 +1,13 @@ +package com.jozufozu.flywheel.backend.struct; + +import com.jozufozu.flywheel.core.model.IModel; + +public interface Batched extends StructType { + + BatchingTransformer getTransformer(IModel model); + + @Override + default Batched asBatched() { + return this; + } +} diff --git a/src/main/java/com/jozufozu/flywheel/backend/struct/BatchingTransformer.java b/src/main/java/com/jozufozu/flywheel/backend/struct/BatchingTransformer.java new file mode 100644 index 000000000..75f709761 --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/backend/struct/BatchingTransformer.java @@ -0,0 +1,11 @@ +package com.jozufozu.flywheel.backend.struct; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; + +public abstract class BatchingTransformer { + + public void draw(S s, PoseStack stack, VertexConsumer consumer) { + + } +} diff --git a/src/main/java/com/jozufozu/flywheel/backend/struct/StructType.java b/src/main/java/com/jozufozu/flywheel/backend/struct/StructType.java index fc1d7be41..6591a5faa 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/struct/StructType.java +++ b/src/main/java/com/jozufozu/flywheel/backend/struct/StructType.java @@ -19,4 +19,6 @@ public interface StructType { VertexFormat format(); Writeable asWriteable(); + + Batched asBatched(); } diff --git a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingGroup.java b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingGroup.java index cf096be15..58f6c4d88 100644 --- a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingGroup.java +++ b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingGroup.java @@ -1,8 +1,8 @@ package com.jozufozu.flywheel.core.crumbling; -import com.jozufozu.flywheel.backend.material.MaterialGroupImpl; -import com.jozufozu.flywheel.backend.material.MaterialManagerImpl; -import com.jozufozu.flywheel.backend.material.MaterialRenderer; +import com.jozufozu.flywheel.backend.material.instancing.InstancedMaterialGroup; +import com.jozufozu.flywheel.backend.material.instancing.InstancingEngine; +import com.jozufozu.flywheel.backend.material.instancing.InstancedMaterialRenderer; import com.jozufozu.flywheel.core.atlas.AtlasInfo; import com.jozufozu.flywheel.core.atlas.SheetData; import com.jozufozu.flywheel.util.RenderTextures; @@ -13,12 +13,12 @@ import com.mojang.math.Matrix4f; import net.minecraft.client.renderer.RenderType; import net.minecraft.resources.ResourceLocation; -public class CrumblingGroup

extends MaterialGroupImpl

{ +public class CrumblingGroup

extends InstancedMaterialGroup

{ private int width; private int height; - public CrumblingGroup(MaterialManagerImpl

owner) { + public CrumblingGroup(InstancingEngine

owner) { super(owner); } @@ -40,7 +40,7 @@ public class CrumblingGroup

extends MaterialGroupImp RenderSystem.setShaderTexture(4, breakingTex); TextureBinder.bindActiveTextures(); - for (MaterialRenderer

renderer : renderers) { + for (InstancedMaterialRenderer

renderer : renderers) { renderer.render(viewProjection, camX, camY, camZ); } diff --git a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingInstanceManager.java b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingInstanceManager.java index 814b83af6..75e75247c 100644 --- a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingInstanceManager.java +++ b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingInstanceManager.java @@ -1,13 +1,13 @@ package com.jozufozu.flywheel.core.crumbling; import com.jozufozu.flywheel.backend.instancing.tile.TileInstanceManager; -import com.jozufozu.flywheel.backend.material.MaterialManagerImpl; +import com.jozufozu.flywheel.backend.material.MaterialManager; import net.minecraft.core.BlockPos; public class CrumblingInstanceManager extends TileInstanceManager { - public CrumblingInstanceManager(MaterialManagerImpl materialManager) { + public CrumblingInstanceManager(MaterialManager materialManager) { super(materialManager); } diff --git a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingRenderer.java b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingRenderer.java index a91049aec..2844df589 100644 --- a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingRenderer.java +++ b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingRenderer.java @@ -6,17 +6,15 @@ import java.util.SortedSet; import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.gl.GlTextureUnit; -import com.jozufozu.flywheel.backend.gl.error.GlError; import com.jozufozu.flywheel.backend.instancing.InstanceManager; -import com.jozufozu.flywheel.backend.material.MaterialManagerImpl; -import com.jozufozu.flywheel.backend.state.RenderLayer; +import com.jozufozu.flywheel.backend.material.instancing.InstancingEngine; import com.jozufozu.flywheel.core.Contexts; import com.jozufozu.flywheel.event.ReloadRenderersEvent; +import com.jozufozu.flywheel.event.RenderLayerEvent; import com.jozufozu.flywheel.mixin.LevelRendererAccessor; import com.jozufozu.flywheel.util.Lazy; import com.jozufozu.flywheel.util.Pair; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.math.Matrix4f; import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; @@ -55,17 +53,17 @@ public class CrumblingRenderer { INVALIDATOR = state.getSecond(); } - public static void renderBreaking(ClientLevel world, Matrix4f viewProjection, double cameraX, double cameraY, double cameraZ) { + public static void renderBreaking(RenderLayerEvent event) { if (!Backend.getInstance() - .canUseInstancing(world)) return; + .canUseInstancing(event.getWorld())) return; - Int2ObjectMap> activeStages = getActiveStageTiles(world); + Int2ObjectMap> activeStages = getActiveStageTiles(event.getWorld()); if (activeStages.isEmpty()) return; State state = STATE.get(); InstanceManager instanceManager = state.instanceManager; - MaterialManagerImpl materials = state.materialManager; + InstancingEngine materials = state.materialManager; TextureManager textureManager = Minecraft.getInstance().getTextureManager(); Camera info = Minecraft.getInstance().gameRenderer.getMainCamera(); @@ -79,7 +77,7 @@ public class CrumblingRenderer { instanceManager.beginFrame(info); - materials.render(RenderLayer.SOLID, viewProjection, cameraX, cameraY, cameraZ); + materials.render(event, null); instanceManager.invalidate(); } @@ -133,14 +131,15 @@ public class CrumblingRenderer { } private static class State { - private final MaterialManagerImpl materialManager; + private final InstancingEngine materialManager; private final InstanceManager instanceManager; private State() { - materialManager = MaterialManagerImpl.builder(Contexts.CRUMBLING) + materialManager = InstancingEngine.builder(Contexts.CRUMBLING) .setGroupFactory(CrumblingGroup::new) .build(); instanceManager = new CrumblingInstanceManager(materialManager); + materialManager.addListener(instanceManager); } private void kill() { diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelTransformer.java b/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelTransformer.java new file mode 100644 index 000000000..941df358b --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelTransformer.java @@ -0,0 +1,12 @@ +package com.jozufozu.flywheel.core.materials.model; + +import com.jozufozu.flywheel.backend.struct.BatchingTransformer; +import com.jozufozu.flywheel.core.model.IModel; + +public class ModelTransformer extends BatchingTransformer { + public ModelTransformer(IModel model) { + + + //model.buffer(); + } +} diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelType.java b/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelType.java index 6c66b0833..9074fdf50 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelType.java +++ b/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelType.java @@ -2,12 +2,15 @@ package com.jozufozu.flywheel.core.materials.model; import com.jozufozu.flywheel.backend.gl.attrib.VertexFormat; import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer; +import com.jozufozu.flywheel.backend.struct.Batched; +import com.jozufozu.flywheel.backend.struct.BatchingTransformer; import com.jozufozu.flywheel.backend.struct.StructWriter; import com.jozufozu.flywheel.backend.struct.Writeable; import com.jozufozu.flywheel.core.Formats; import com.jozufozu.flywheel.core.materials.model.writer.UnsafeModelWriter; +import com.jozufozu.flywheel.core.model.IModel; -public class ModelType implements Writeable { +public class ModelType implements Writeable, Batched { @Override public ModelData create() { @@ -23,4 +26,9 @@ public class ModelType implements Writeable { public StructWriter getWriter(VecBuffer backing) { return new UnsafeModelWriter(backing, this); } + + @Override + public BatchingTransformer getTransformer(IModel model) { + return null; + } } diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedType.java b/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedType.java index 1d78185b9..468bbb597 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedType.java +++ b/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedType.java @@ -2,12 +2,15 @@ package com.jozufozu.flywheel.core.materials.oriented; import com.jozufozu.flywheel.backend.gl.attrib.VertexFormat; import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer; +import com.jozufozu.flywheel.backend.struct.Batched; +import com.jozufozu.flywheel.backend.struct.BatchingTransformer; import com.jozufozu.flywheel.backend.struct.StructWriter; import com.jozufozu.flywheel.backend.struct.Writeable; import com.jozufozu.flywheel.core.Formats; import com.jozufozu.flywheel.core.materials.oriented.writer.UnsafeOrientedWriter; +import com.jozufozu.flywheel.core.model.IModel; -public class OrientedType implements Writeable { +public class OrientedType implements Writeable, Batched { @Override public OrientedData create() { @@ -23,4 +26,9 @@ public class OrientedType implements Writeable { public StructWriter getWriter(VecBuffer backing) { return new UnsafeOrientedWriter(backing, this); } + + @Override + public BatchingTransformer getTransformer(IModel model) { + return null; + } } diff --git a/src/main/java/com/jozufozu/flywheel/mixin/RenderHooksMixin.java b/src/main/java/com/jozufozu/flywheel/mixin/RenderHooksMixin.java index 7a9c82540..482532474 100644 --- a/src/main/java/com/jozufozu/flywheel/mixin/RenderHooksMixin.java +++ b/src/main/java/com/jozufozu/flywheel/mixin/RenderHooksMixin.java @@ -82,13 +82,9 @@ public class RenderHooksMixin { if (!Backend.getInstance() .available()) return; - Matrix4f view = stack.last() - .pose(); - Matrix4f viewProjection = view.copy(); - viewProjection.multiplyBackward(RenderSystem.getProjectionMatrix()); - Vec3 cameraPos = info.getPosition(); - CrumblingRenderer.renderBreaking(level, viewProjection, cameraPos.x, cameraPos.y, cameraPos.z); + + CrumblingRenderer.renderBreaking(new RenderLayerEvent(level, null, stack, null, cameraPos.x, cameraPos.y, cameraPos.z)); if (!OptifineHandler.usingShaders()) GL20.glUseProgram(0); } From a90e6a1f5695deeef703fe2d50f3625b268b875a Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Tue, 7 Dec 2021 22:45:10 -0800 Subject: [PATCH 04/29] Quick fix for create's contraptions --- .../java/com/jozufozu/flywheel/backend/model/IndexedModel.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/jozufozu/flywheel/backend/model/IndexedModel.java b/src/main/java/com/jozufozu/flywheel/backend/model/IndexedModel.java index ab0de034f..d5d7ba974 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/model/IndexedModel.java +++ b/src/main/java/com/jozufozu/flywheel/backend/model/IndexedModel.java @@ -35,6 +35,7 @@ public class IndexedModel extends BufferedModel { @Override public void drawCall() { + ebo.bind(); GL20.glDrawElements(primitiveMode.glEnum, ebo.elementCount, ebo.eboIndexType.getGlEnum(), 0); } From 97949ab1da1e8a50c38631b5d91b01d73898ade9 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Tue, 7 Dec 2021 22:47:05 -0800 Subject: [PATCH 05/29] Cull legacy compat boilerplate - Minecraft is on GL32 now! --- .../jozufozu/flywheel/backend/Backend.java | 2 +- .../flywheel/backend/gl/GlVertexArray.java | 10 +-- .../backend/gl/versioned/GlCompat.java | 37 --------- .../{instancing => }/InstancedArrays.java | 4 +- .../backend/gl/versioned/RGPixelFormat.java | 77 ------------------ .../gl/versioned/framebuffer/Blit.java | 45 ----------- .../gl/versioned/framebuffer/Framebuffer.java | 57 ------------- .../gl/versioned/instancing/BaseVertex.java | 60 -------------- .../versioned/instancing/DrawInstanced.java | 76 ------------------ .../instancing/VertexArrayObject.java | 79 ------------------- .../backend/instancing/InstanceWorld.java | 4 +- .../flywheel/backend/model/BufferedModel.java | 5 +- .../flywheel/backend/model/IndexedModel.java | 4 +- .../flywheel/backend/model/ModelPool.java | 7 +- .../flywheel/light/GPULightVolume.java | 12 ++- 15 files changed, 23 insertions(+), 456 deletions(-) rename src/main/java/com/jozufozu/flywheel/backend/gl/versioned/{instancing => }/InstancedArrays.java (88%) delete mode 100644 src/main/java/com/jozufozu/flywheel/backend/gl/versioned/RGPixelFormat.java delete mode 100644 src/main/java/com/jozufozu/flywheel/backend/gl/versioned/framebuffer/Blit.java delete mode 100644 src/main/java/com/jozufozu/flywheel/backend/gl/versioned/framebuffer/Framebuffer.java delete mode 100644 src/main/java/com/jozufozu/flywheel/backend/gl/versioned/instancing/BaseVertex.java delete mode 100644 src/main/java/com/jozufozu/flywheel/backend/gl/versioned/instancing/DrawInstanced.java delete mode 100644 src/main/java/com/jozufozu/flywheel/backend/gl/versioned/instancing/VertexArrayObject.java diff --git a/src/main/java/com/jozufozu/flywheel/backend/Backend.java b/src/main/java/com/jozufozu/flywheel/backend/Backend.java index 85f332c16..84f2b753f 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/Backend.java +++ b/src/main/java/com/jozufozu/flywheel/backend/Backend.java @@ -133,7 +133,7 @@ public class Backend { compat = new GlCompat(capabilities); - instancedArrays = compat.vertexArrayObjectsSupported() && compat.drawInstancedSupported() && compat.instancedArraysSupported(); + instancedArrays = compat.instancedArraysSupported(); enabled = FlwConfig.get() .enabled() && !OptifineHandler.usingShaders(); diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/GlVertexArray.java b/src/main/java/com/jozufozu/flywheel/backend/gl/GlVertexArray.java index 0802d231f..9053539e6 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/GlVertexArray.java +++ b/src/main/java/com/jozufozu/flywheel/backend/gl/GlVertexArray.java @@ -1,21 +1,21 @@ package com.jozufozu.flywheel.backend.gl; -import com.jozufozu.flywheel.backend.Backend; +import com.mojang.blaze3d.platform.GlStateManager; public class GlVertexArray extends GlObject { public GlVertexArray() { - setHandle(Backend.getInstance().compat.vao.genVertexArrays()); + setHandle(GlStateManager._glGenVertexArrays()); } public void bind() { - Backend.getInstance().compat.vao.bindVertexArray(handle()); + GlStateManager._glBindVertexArray(handle()); } public static void unbind() { - Backend.getInstance().compat.vao.bindVertexArray(0); + GlStateManager._glBindVertexArray(0); } protected void deleteInternal(int handle) { - Backend.getInstance().compat.vao.deleteVertexArrays(handle); + GlStateManager._glDeleteVertexArrays(handle); } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/GlCompat.java b/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/GlCompat.java index b86a31489..704d85bd7 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/GlCompat.java +++ b/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/GlCompat.java @@ -9,13 +9,6 @@ import org.lwjgl.opengl.GLCapabilities; import org.lwjgl.system.MemoryStack; import org.lwjgl.system.MemoryUtil; -import com.jozufozu.flywheel.backend.gl.versioned.framebuffer.Blit; -import com.jozufozu.flywheel.backend.gl.versioned.framebuffer.Framebuffer; -import com.jozufozu.flywheel.backend.gl.versioned.instancing.BaseVertex; -import com.jozufozu.flywheel.backend.gl.versioned.instancing.DrawInstanced; -import com.jozufozu.flywheel.backend.gl.versioned.instancing.InstancedArrays; -import com.jozufozu.flywheel.backend.gl.versioned.instancing.VertexArrayObject; - /** * An instance of this class stores information about what OpenGL features are available. *
@@ -25,50 +18,20 @@ import com.jozufozu.flywheel.backend.gl.versioned.instancing.VertexArrayObject; public class GlCompat { public final MapBufferRange mapBufferRange; - public final VertexArrayObject vao; public final InstancedArrays instancedArrays; - public final DrawInstanced drawInstanced; - public final Blit blit; - public final Framebuffer fbo; public final BufferStorage bufferStorage; - public final RGPixelFormat pixelFormat; - public final BaseVertex baseVertex; - public GlCompat(GLCapabilities caps) { mapBufferRange = getLatest(MapBufferRange.class, caps); - vao = getLatest(VertexArrayObject.class, caps); instancedArrays = getLatest(InstancedArrays.class, caps); - drawInstanced = getLatest(DrawInstanced.class, caps); - baseVertex = getLatest(BaseVertex.class, caps); - blit = getLatest(Blit.class, caps); - fbo = getLatest(Framebuffer.class, caps); bufferStorage = getLatest(BufferStorage.class, caps); - - pixelFormat = getLatest(RGPixelFormat.class, caps); - } - - public boolean vertexArrayObjectsSupported() { - return vao != VertexArrayObject.UNSUPPORTED; } public boolean instancedArraysSupported() { return instancedArrays != InstancedArrays.UNSUPPORTED; } - public boolean drawInstancedSupported() { - return drawInstanced != DrawInstanced.UNSUPPORTED; - } - - public boolean fbosSupported() { - return fbo != Framebuffer.UNSUPPORTED; - } - - public boolean blitSupported() { - return blit != Blit.UNSUPPORTED; - } - public boolean bufferStorageSupported() { return bufferStorage != BufferStorage.UNSUPPORTED; } diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/instancing/InstancedArrays.java b/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/InstancedArrays.java similarity index 88% rename from src/main/java/com/jozufozu/flywheel/backend/gl/versioned/instancing/InstancedArrays.java rename to src/main/java/com/jozufozu/flywheel/backend/gl/versioned/InstancedArrays.java index 2c681d41d..b2c221d81 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/instancing/InstancedArrays.java +++ b/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/InstancedArrays.java @@ -1,11 +1,9 @@ -package com.jozufozu.flywheel.backend.gl.versioned.instancing; +package com.jozufozu.flywheel.backend.gl.versioned; import org.lwjgl.opengl.ARBInstancedArrays; import org.lwjgl.opengl.GL33; import org.lwjgl.opengl.GLCapabilities; -import com.jozufozu.flywheel.backend.gl.versioned.GlVersioned; - public enum InstancedArrays implements GlVersioned { GL33_INSTANCED_ARRAYS { @Override diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/RGPixelFormat.java b/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/RGPixelFormat.java deleted file mode 100644 index 339289894..000000000 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/RGPixelFormat.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.jozufozu.flywheel.backend.gl.versioned; - -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL30; -import org.lwjgl.opengl.GLCapabilities; - -public enum RGPixelFormat implements GlVersioned { - GL30_RG { - @Override - public boolean supported(GLCapabilities caps) { - return caps.OpenGL30; - } - - @Override - public int internalFormat() { - return GL30.GL_RG8; - } - - @Override - public int format() { - return GL30.GL_RG; - } - - @Override - public int byteCount() { - return 2; - } - }, - GL11_RGB { - @Override - public boolean supported(GLCapabilities caps) { - return caps.OpenGL11; - } - - @Override - public int internalFormat() { - return GL11.GL_RGB8; - } - - @Override - public int format() { - return GL11.GL_RGB; - } - - @Override - public int byteCount() { - return 3; - } - }, - UNSUPPORTED { - @Override - public boolean supported(GLCapabilities caps) { - return true; - } - - @Override - public int internalFormat() { - throw new UnsupportedOperationException(); - } - - @Override - public int format() { - throw new UnsupportedOperationException(); - } - - @Override - public int byteCount() { - throw new UnsupportedOperationException(); - } - }; - - public abstract int internalFormat(); - - public abstract int format(); - - public abstract int byteCount(); -} diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/framebuffer/Blit.java b/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/framebuffer/Blit.java deleted file mode 100644 index fdf5473d1..000000000 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/framebuffer/Blit.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.jozufozu.flywheel.backend.gl.versioned.framebuffer; - -import org.lwjgl.opengl.EXTFramebufferBlit; -import org.lwjgl.opengl.GL30; -import org.lwjgl.opengl.GLCapabilities; - -import com.jozufozu.flywheel.backend.gl.versioned.GlVersioned; - -public enum Blit implements GlVersioned { - CORE { - @Override - public boolean supported(GLCapabilities caps) { - return caps.OpenGL30; - } - - @Override - public void blitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter) { - GL30.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); - } - }, - EXT { - @Override - public boolean supported(GLCapabilities caps) { - return caps.GL_EXT_framebuffer_blit; - } - - @Override - public void blitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter) { - EXTFramebufferBlit.glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); - } - }, - UNSUPPORTED { - @Override - public boolean supported(GLCapabilities caps) { - return true; - } - - @Override - public void blitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter) { - throw new UnsupportedOperationException("Framebuffer blitting not supported."); - } - }; - - public abstract void blitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter); -} diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/framebuffer/Framebuffer.java b/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/framebuffer/Framebuffer.java deleted file mode 100644 index a0e2b3e1b..000000000 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/framebuffer/Framebuffer.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.jozufozu.flywheel.backend.gl.versioned.framebuffer; - -import org.lwjgl.opengl.ARBFramebufferObject; -import org.lwjgl.opengl.EXTFramebufferObject; -import org.lwjgl.opengl.GL30C; -import org.lwjgl.opengl.GLCapabilities; - -import com.jozufozu.flywheel.backend.gl.versioned.GlVersioned; - -public enum Framebuffer implements GlVersioned { - CORE { - @Override - public boolean supported(GLCapabilities caps) { - return caps.OpenGL30; - } - - @Override - public void bindFramebuffer(int target, int framebuffer) { - GL30C.glBindFramebuffer(target, framebuffer); - } - }, - ARB { - @Override - public boolean supported(GLCapabilities caps) { - return caps.GL_ARB_framebuffer_object; - } - - @Override - public void bindFramebuffer(int target, int framebuffer) { - ARBFramebufferObject.glBindFramebuffer(target, framebuffer); - } - }, - EXT { - @Override - public boolean supported(GLCapabilities caps) { - return caps.GL_EXT_framebuffer_object; - } - - @Override - public void bindFramebuffer(int target, int framebuffer) { - EXTFramebufferObject.glBindFramebufferEXT(target, framebuffer); - } - }, - UNSUPPORTED { - @Override - public boolean supported(GLCapabilities caps) { - return true; - } - - @Override - public void bindFramebuffer(int target, int framebuffer) { - throw new UnsupportedOperationException("Framebuffers not supported"); - } - }; - - public abstract void bindFramebuffer(int target, int framebuffer); -} diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/instancing/BaseVertex.java b/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/instancing/BaseVertex.java deleted file mode 100644 index 1d9b89fbd..000000000 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/instancing/BaseVertex.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.jozufozu.flywheel.backend.gl.versioned.instancing; - -import org.lwjgl.opengl.ARBDrawElementsBaseVertex; -import org.lwjgl.opengl.GL32; -import org.lwjgl.opengl.GLCapabilities; - -import com.jozufozu.flywheel.backend.gl.GlNumericType; -import com.jozufozu.flywheel.backend.gl.GlPrimitive; -import com.jozufozu.flywheel.backend.gl.versioned.GlVersioned; - -public enum BaseVertex implements GlVersioned { - GL31_CORE { - @Override - public boolean supported(GLCapabilities caps) { - return caps.OpenGL31; - } - - @Override - public void drawElementsInstancedBaseVertex(GlPrimitive mode, int elementCount, GlNumericType type, long indices, int instanceCount, int baseVertex) { - GL32.glDrawElementsInstancedBaseVertex(mode.glEnum, elementCount, type.getGlEnum(), indices, instanceCount, baseVertex); - } - - @Override - public void drawElementsBaseVertex(GlPrimitive mode, int elementCount, GlNumericType type, long indices, int baseVertex) { - GL32.glDrawElementsBaseVertex(mode.glEnum, elementCount, type.getGlEnum(), indices, baseVertex); - } - }, - ARB { - @Override - public boolean supported(GLCapabilities caps) { - return caps.GL_ARB_draw_elements_base_vertex; - } - - @Override - public void drawElementsInstancedBaseVertex(GlPrimitive mode, int elementCount, GlNumericType type, long indices, int instanceCount, int baseVertex) { - ARBDrawElementsBaseVertex.glDrawElementsInstancedBaseVertex(mode.glEnum, elementCount, type.getGlEnum(), indices, instanceCount, baseVertex); - } - - @Override - public void drawElementsBaseVertex(GlPrimitive mode, int elementCount, GlNumericType type, long indices, int baseVertex) { - ARBDrawElementsBaseVertex.glDrawElementsBaseVertex(mode.glEnum, elementCount, type.getGlEnum(), indices, baseVertex); - } - }, - UNSUPPORTED { - @Override - public boolean supported(GLCapabilities caps) { - return true; - } - }; - - - public void drawElementsInstancedBaseVertex(GlPrimitive mode, int elementCount, GlNumericType type, long indices, int instanceCount, int baseVertex) { - throw new UnsupportedOperationException(); - } - - - public void drawElementsBaseVertex(GlPrimitive mode, int elementCount, GlNumericType type, long indices, int baseVertex) { - throw new UnsupportedOperationException(); - } -} diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/instancing/DrawInstanced.java b/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/instancing/DrawInstanced.java deleted file mode 100644 index fd73c66b8..000000000 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/instancing/DrawInstanced.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.jozufozu.flywheel.backend.gl.versioned.instancing; - -import org.lwjgl.opengl.ARBDrawInstanced; -import org.lwjgl.opengl.EXTDrawInstanced; -import org.lwjgl.opengl.GL31; -import org.lwjgl.opengl.GLCapabilities; - -import com.jozufozu.flywheel.backend.gl.GlNumericType; -import com.jozufozu.flywheel.backend.gl.GlPrimitive; -import com.jozufozu.flywheel.backend.gl.versioned.GlVersioned; - -public enum DrawInstanced implements GlVersioned { - GL31_CORE { - @Override - public boolean supported(GLCapabilities caps) { - return caps.OpenGL31; - } - - @Override - public void drawArraysInstanced(GlPrimitive mode, int first, int count, int primcount) { - GL31.glDrawArraysInstanced(mode.glEnum, first, count, primcount); - } - - @Override - public void drawElementsInstanced(GlPrimitive mode, int elementCount, GlNumericType type, long indices, int primcount) { - GL31.glDrawElementsInstanced(mode.glEnum, elementCount, type.getGlEnum(), indices, primcount); - } - }, - ARB { - @Override - public boolean supported(GLCapabilities caps) { - return caps.GL_ARB_draw_instanced; - } - - @Override - public void drawArraysInstanced(GlPrimitive mode, int first, int count, int primcount) { - ARBDrawInstanced.glDrawArraysInstancedARB(mode.glEnum, first, count, primcount); - } - - @Override - public void drawElementsInstanced(GlPrimitive mode, int elementCount, GlNumericType type, long indices, int primcount) { - ARBDrawInstanced.glDrawElementsInstancedARB(mode.glEnum, elementCount, type.getGlEnum(), indices, primcount); - } - }, - EXT { - @Override - public boolean supported(GLCapabilities caps) { - return caps.GL_EXT_draw_instanced; - } - - @Override - public void drawArraysInstanced(GlPrimitive mode, int first, int count, int primcount) { - EXTDrawInstanced.glDrawArraysInstancedEXT(mode.glEnum, first, count, primcount); - } - - @Override - public void drawElementsInstanced(GlPrimitive mode, int elementCount, GlNumericType type, long indices, int primcount) { - EXTDrawInstanced.glDrawElementsInstancedEXT(mode.glEnum, elementCount, type.getGlEnum(), indices, primcount); - } - }, - UNSUPPORTED { - @Override - public boolean supported(GLCapabilities caps) { - return true; - } - }; - - - public void drawArraysInstanced(GlPrimitive mode, int first, int count, int primcount) { - throw new UnsupportedOperationException(); - } - - public void drawElementsInstanced(GlPrimitive mode, int elementCount, GlNumericType type, long indices, int primcount) { - throw new UnsupportedOperationException(); - } -} diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/instancing/VertexArrayObject.java b/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/instancing/VertexArrayObject.java deleted file mode 100644 index 4a2d13c11..000000000 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/instancing/VertexArrayObject.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.jozufozu.flywheel.backend.gl.versioned.instancing; - -import org.lwjgl.opengl.ARBVertexArrayObject; -import org.lwjgl.opengl.GL30; -import org.lwjgl.opengl.GLCapabilities; - -import com.jozufozu.flywheel.backend.gl.versioned.GlVersioned; - -public enum VertexArrayObject implements GlVersioned { - GL30_VAO { - @Override - public boolean supported(GLCapabilities caps) { - return caps.OpenGL30; - } - - @Override - public int genVertexArrays() { - return GL30.glGenVertexArrays(); - } - - @Override - public void bindVertexArray(int array) { - GL30.glBindVertexArray(array); - } - - @Override - public void deleteVertexArrays(int array) { - GL30.glDeleteVertexArrays(array); - } - }, - ARB_VAO { - @Override - public boolean supported(GLCapabilities caps) { - return caps.GL_ARB_vertex_array_object; - } - - @Override - public int genVertexArrays() { - return ARBVertexArrayObject.glGenVertexArrays(); - } - - @Override - public void bindVertexArray(int array) { - ARBVertexArrayObject.glBindVertexArray(array); - } - - @Override - public void deleteVertexArrays(int array) { - ARBVertexArrayObject.glDeleteVertexArrays(array); - } - }, - UNSUPPORTED { - @Override - public boolean supported(GLCapabilities caps) { - return true; - } - - @Override - public int genVertexArrays() { - throw new UnsupportedOperationException(); - } - - @Override - public void bindVertexArray(int array) { - throw new UnsupportedOperationException(); - } - - @Override - public void deleteVertexArrays(int array) { - throw new UnsupportedOperationException(); - } - }; - - public abstract int genVertexArrays(); - - public abstract void bindVertexArray(int array); - - public abstract void deleteVertexArrays(int array); -} diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceWorld.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceWorld.java index 95ac1a3aa..cf6042576 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceWorld.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceWorld.java @@ -3,8 +3,8 @@ package com.jozufozu.flywheel.backend.instancing; import com.jozufozu.flywheel.backend.instancing.entity.EntityInstanceManager; import com.jozufozu.flywheel.backend.instancing.tile.TileInstanceManager; import com.jozufozu.flywheel.backend.material.Engine; -import com.jozufozu.flywheel.backend.material.instancing.InstancingEngine; import com.jozufozu.flywheel.backend.material.batching.BatchingEngine; +import com.jozufozu.flywheel.backend.material.instancing.InstancingEngine; import com.jozufozu.flywheel.core.Contexts; import com.jozufozu.flywheel.core.shader.WorldProgram; import com.jozufozu.flywheel.event.BeginFrameEvent; @@ -28,7 +28,7 @@ public class InstanceWorld { protected final InstanceManager tileEntityInstanceManager; public InstanceWorld() { - + // TODO: finish impl if (false) { engine = new BatchingEngine(); diff --git a/src/main/java/com/jozufozu/flywheel/backend/model/BufferedModel.java b/src/main/java/com/jozufozu/flywheel/backend/model/BufferedModel.java index c5f552abf..7dfb48aef 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/model/BufferedModel.java +++ b/src/main/java/com/jozufozu/flywheel/backend/model/BufferedModel.java @@ -2,7 +2,8 @@ package com.jozufozu.flywheel.backend.model; import static org.lwjgl.opengl.GL11.glDrawArrays; -import com.jozufozu.flywheel.backend.Backend; +import org.lwjgl.opengl.GL31; + import com.jozufozu.flywheel.backend.gl.GlPrimitive; import com.jozufozu.flywheel.backend.gl.attrib.VertexFormat; import com.jozufozu.flywheel.backend.gl.buffer.GlBuffer; @@ -74,7 +75,7 @@ public class BufferedModel implements IBufferedModel { public void drawInstances(int instanceCount) { if (!valid()) return; - Backend.getInstance().compat.drawInstanced.drawArraysInstanced(primitiveMode, 0, getVertexCount(), instanceCount); + GL31.glDrawArraysInstanced(primitiveMode.glEnum, 0, getVertexCount(), instanceCount); } public void delete() { diff --git a/src/main/java/com/jozufozu/flywheel/backend/model/IndexedModel.java b/src/main/java/com/jozufozu/flywheel/backend/model/IndexedModel.java index d5d7ba974..678a9f468 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/model/IndexedModel.java +++ b/src/main/java/com/jozufozu/flywheel/backend/model/IndexedModel.java @@ -1,8 +1,8 @@ package com.jozufozu.flywheel.backend.model; import org.lwjgl.opengl.GL20; +import org.lwjgl.opengl.GL31; -import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.gl.GlPrimitive; import com.jozufozu.flywheel.core.model.IModel; @@ -43,6 +43,6 @@ public class IndexedModel extends BufferedModel { public void drawInstances(int instanceCount) { if (!valid()) return; - Backend.getInstance().compat.drawInstanced.drawElementsInstanced(primitiveMode, ebo.elementCount, ebo.eboIndexType, 0, instanceCount); + GL31.glDrawElementsInstanced(primitiveMode.glEnum, ebo.elementCount, ebo.eboIndexType.getGlEnum(), 0, instanceCount); } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/model/ModelPool.java b/src/main/java/com/jozufozu/flywheel/backend/model/ModelPool.java index 8f74f8658..3ad3bdba3 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/model/ModelPool.java +++ b/src/main/java/com/jozufozu/flywheel/backend/model/ModelPool.java @@ -3,7 +3,8 @@ package com.jozufozu.flywheel.backend.model; import java.util.ArrayList; import java.util.List; -import com.jozufozu.flywheel.backend.Backend; +import org.lwjgl.opengl.GL32; + import com.jozufozu.flywheel.backend.gl.GlPrimitive; import com.jozufozu.flywheel.backend.gl.attrib.VertexFormat; import com.jozufozu.flywheel.backend.gl.buffer.GlBuffer; @@ -195,7 +196,7 @@ public class ModelPool implements ModelAllocator { @Override public void drawCall() { - Backend.getInstance().compat.baseVertex.drawElementsBaseVertex(GlPrimitive.TRIANGLES, ebo.elementCount, ebo.eboIndexType, 0, first); + GL32.glDrawElementsBaseVertex(GlPrimitive.TRIANGLES.glEnum, ebo.elementCount, ebo.eboIndexType.getGlEnum(), 0, first); } @Override @@ -206,7 +207,7 @@ public class ModelPool implements ModelAllocator { //Backend.log.info(StringUtil.args("drawElementsInstancedBaseVertex", GlPrimitive.TRIANGLES, ebo.elementCount, ebo.eboIndexType, 0, instanceCount, first)); - Backend.getInstance().compat.baseVertex.drawElementsInstancedBaseVertex(GlPrimitive.TRIANGLES, ebo.elementCount, ebo.eboIndexType, 0, instanceCount, first); + GL32.glDrawElementsInstancedBaseVertex(GlPrimitive.TRIANGLES.glEnum, ebo.elementCount, ebo.eboIndexType.getGlEnum(), 0, instanceCount, first); } @Override diff --git a/src/main/java/com/jozufozu/flywheel/light/GPULightVolume.java b/src/main/java/com/jozufozu/flywheel/light/GPULightVolume.java index 5dc44ceca..80ca9292d 100644 --- a/src/main/java/com/jozufozu/flywheel/light/GPULightVolume.java +++ b/src/main/java/com/jozufozu/flywheel/light/GPULightVolume.java @@ -23,10 +23,10 @@ import static org.lwjgl.opengl.GL13.GL_TEXTURE4; import static org.lwjgl.opengl.GL13.glActiveTexture; import static org.lwjgl.opengl.GL14.GL_MIRRORED_REPEAT; -import com.jozufozu.flywheel.backend.Backend; +import org.lwjgl.opengl.GL30; + import com.jozufozu.flywheel.backend.gl.GlTexture; import com.jozufozu.flywheel.backend.gl.GlTextureUnit; -import com.jozufozu.flywheel.backend.gl.versioned.RGPixelFormat; import net.minecraft.world.level.LightLayer; @@ -35,7 +35,6 @@ public class GPULightVolume extends LightVolume { protected final GridAlignedBB sampleVolume = new GridAlignedBB(); private final GlTexture glTexture; - private final RGPixelFormat pixelFormat; private final GlTextureUnit textureUnit = GlTextureUnit.T4; protected boolean bufferDirty; @@ -43,7 +42,6 @@ public class GPULightVolume extends LightVolume { super(sampleVolume); this.sampleVolume.assign(sampleVolume); - pixelFormat = Backend.getInstance().compat.pixelFormat; glTexture = new GlTexture(GL_TEXTURE_3D); // allocate space for the texture @@ -53,7 +51,7 @@ public class GPULightVolume extends LightVolume { int sizeX = box.sizeX(); int sizeY = box.sizeY(); int sizeZ = box.sizeZ(); - glTexImage3D(GL_TEXTURE_3D, 0, pixelFormat.internalFormat(), sizeX, sizeY, sizeZ, 0, pixelFormat.format(), GL_UNSIGNED_BYTE, 0); + glTexImage3D(GL_TEXTURE_3D, 0, GL30.GL_RG8, sizeX, sizeY, sizeZ, 0, GL30.GL_RG, GL_UNSIGNED_BYTE, 0); glTexture.unbind(); glActiveTexture(GL_TEXTURE0); @@ -94,7 +92,7 @@ public class GPULightVolume extends LightVolume { int sizeY = box.sizeY(); int sizeZ = box.sizeZ(); - glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, sizeX, sizeY, sizeZ, pixelFormat.format(), GL_UNSIGNED_BYTE, lightData); + glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, sizeX, sizeY, sizeZ, GL30.GL_RG, GL_UNSIGNED_BYTE, lightData); glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // 4 is the default bufferDirty = false; @@ -150,7 +148,7 @@ public class GPULightVolume extends LightVolume { @Override protected int getStride() { - return Backend.getInstance().compat.pixelFormat.byteCount(); + return 2; } @Override From 36f32ececcb6f3463c2e9578658f217dc6f70208 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Tue, 7 Dec 2021 23:00:32 -0800 Subject: [PATCH 06/29] VAO state clearing handled in InstancingEngine#render --- .../jozufozu/flywheel/backend/instancing/GPUInstancer.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/GPUInstancer.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/GPUInstancer.java index a3ea14ceb..656741057 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/GPUInstancer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/GPUInstancer.java @@ -51,10 +51,6 @@ public class GPUInstancer extends AbstractInstancer { // persistent mapping sync point instanceVBO.doneForThisFrame(); - - GlVertexArray.unbind(); - - GlError.pollAndThrow(() -> modelData.name() + "_unbind"); } private boolean invalid() { From a70adc8bbadb1f026deb66d467d16acc7d454acd Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Tue, 7 Dec 2021 23:03:35 -0800 Subject: [PATCH 07/29] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 393a70fc7..3de6e12e7 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Logo by @voxel_dani on Twitter

Flywheel

A modern engine for modded Minecraft.
-Jenkins +Jenkins Discord Curseforge Downloads
@@ -49,7 +49,7 @@ dependencies { implementation fg.deobf("com.jozufozu.flywheel:Flywheel-Forge:${flywheel_version}") } ``` -`${flywheel_version}` gets replaced by the version of Flywheel you want to use, eg. `0.3.0.17` +`${flywheel_version}` gets replaced by the version of Flywheel you want to use, eg. `1.18-0.3.0.3` For a list of available Flywheel versions, you can check [the maven](https://maven.tterrag.com/com/jozufozu/flywheel/Flywheel-Forge/). From ef5de609a2fb8f7d6758f723e35b944182e7fd40 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Tue, 7 Dec 2021 23:40:45 -0800 Subject: [PATCH 08/29] Groups store their types again - Fix crash rendering breaking overlay --- .../instancing/InstancedMaterialGroup.java | 6 +- .../material/instancing/InstancingEngine.java | 59 +++++++++++-------- .../material/instancing/package-info.java | 6 ++ .../core/crumbling/CrumblingGroup.java | 6 +- 4 files changed, 49 insertions(+), 28 deletions(-) create mode 100644 src/main/java/com/jozufozu/flywheel/backend/material/instancing/package-info.java diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancedMaterialGroup.java b/src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancedMaterialGroup.java index 5933a97d0..5716034d0 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancedMaterialGroup.java +++ b/src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancedMaterialGroup.java @@ -22,13 +22,15 @@ import net.minecraft.client.renderer.RenderType; public class InstancedMaterialGroup

implements MaterialGroup { protected final InstancingEngine

owner; + protected final RenderType type; protected final ArrayList> renderers = new ArrayList<>(); private final Map, InstancedMaterial> materials = new HashMap<>(); - public InstancedMaterialGroup(InstancingEngine

owner) { + public InstancedMaterialGroup(InstancingEngine

owner, RenderType type) { this.owner = owner; + this.type = type; } /** @@ -43,7 +45,7 @@ public class InstancedMaterialGroup

implements MaterialG return (InstancedMaterial) materials.computeIfAbsent(spec, this::createInstanceMaterial); } - public void render(RenderType type, Matrix4f viewProjection, double camX, double camY, double camZ) { + public void render(Matrix4f viewProjection, double camX, double camY, double camZ) { type.setupRenderState(); TextureBinder.bindActiveTextures(); for (InstancedMaterialRenderer

renderer : renderers) { diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancingEngine.java b/src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancingEngine.java index 25fa707c9..05a8de155 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancingEngine.java +++ b/src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancingEngine.java @@ -4,6 +4,9 @@ import java.util.EnumMap; import java.util.HashMap; import java.util.Map; import java.util.function.Supplier; +import java.util.stream.Stream; + +import javax.annotation.Nullable; import com.jozufozu.flywheel.backend.gl.GlVertexArray; import com.jozufozu.flywheel.backend.gl.buffer.GlBufferType; @@ -60,15 +63,15 @@ public class InstancingEngine

implements Engine { } /** - * Get a material group that will render in the given layer with the given state. + * Get a material group that will render in the given layer with the given type. * * @param layer The {@link RenderLayer} you want to draw in. - * @param state The {@link RenderType} you need to draw with. + * @param type The {@link RenderType} you need to draw with. * @return A material group whose children will */ @Override - public MaterialGroup state(RenderLayer layer, RenderType state) { - return layers.get(layer).computeIfAbsent(state, $ -> groupFactory.create(this)); + public MaterialGroup state(RenderLayer layer, RenderType type) { + return layers.get(layer).computeIfAbsent(type, t -> groupFactory.create(this, t)); } /** @@ -76,34 +79,44 @@ public class InstancingEngine

implements Engine { */ @Override public void render(RenderLayerEvent event, MultiBufferSource buffers) { - double camX = event.camX; - double camY = event.camY; - double camZ = event.camZ; - Matrix4f viewProjection = event.viewProjection; + double camX; + double camY; + double camZ; + Matrix4f viewProjection; if (!ignoreOriginCoordinate) { - camX -= originCoordinate.getX(); - camY -= originCoordinate.getY(); - camZ -= originCoordinate.getZ(); + camX = event.camX - originCoordinate.getX(); + camY = event.camY - originCoordinate.getY(); + camZ = event.camZ - originCoordinate.getZ(); - Matrix4f translate = Matrix4f.createTranslateMatrix((float) -camX, (float) -camY, (float) -camZ); - - translate.multiplyBackward(viewProjection); - - viewProjection = translate; + viewProjection = Matrix4f.createTranslateMatrix((float) -camX, (float) -camY, (float) -camZ); + viewProjection.multiplyBackward(event.viewProjection); + } else { + camX = event.camX; + camY = event.camY; + camZ = event.camZ; + viewProjection = event.viewProjection; } - for (Map.Entry> entry : layers.get(event.getLayer()).entrySet()) { - RenderType state = entry.getKey(); - InstancedMaterialGroup

group = entry.getValue(); - - group.render(state, viewProjection, camX, camY, camZ); - } + getGroupsToRender(event.getLayer()).forEach(group -> group.render(viewProjection, camX, camY, camZ)); GlBufferType.ELEMENT_ARRAY_BUFFER.unbind(); GlBufferType.ARRAY_BUFFER.unbind(); GlVertexArray.unbind(); } + private Stream> getGroupsToRender(@Nullable RenderLayer layer) { + if (layer != null) { + return layers.get(layer) + .values() + .stream(); + } else { + return layers.values() + .stream() + .flatMap(it -> it.values() + .stream()); + } + } + @Override public void delete() { for (Map> groups : layers.values()) { @@ -159,7 +172,7 @@ public class InstancingEngine

implements Engine { @FunctionalInterface public interface GroupFactory

{ - InstancedMaterialGroup

create(InstancingEngine

materialManager); + InstancedMaterialGroup

create(InstancingEngine

engine, RenderType type); } public static class Builder

{ diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/instancing/package-info.java b/src/main/java/com/jozufozu/flywheel/backend/material/instancing/package-info.java new file mode 100644 index 000000000..42283d047 --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/backend/material/instancing/package-info.java @@ -0,0 +1,6 @@ +@ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault +package com.jozufozu.flywheel.backend.material.instancing; + +import javax.annotation.ParametersAreNonnullByDefault; + +import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingGroup.java b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingGroup.java index 58f6c4d88..0250bf51d 100644 --- a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingGroup.java +++ b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingGroup.java @@ -18,12 +18,12 @@ public class CrumblingGroup

extends InstancedMateria private int width; private int height; - public CrumblingGroup(InstancingEngine

owner) { - super(owner); + public CrumblingGroup(InstancingEngine

owner, RenderType type) { + super(owner, type); } @Override - public void render(RenderType type, Matrix4f viewProjection, double camX, double camY, double camZ) { + public void render(Matrix4f viewProjection, double camX, double camY, double camZ) { type.setupRenderState(); int renderTex = RenderSystem.getShaderTexture(0); From b4fe00a3148dc8485e19890bcdbc09614be67bba Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Tue, 7 Dec 2021 23:53:13 -0800 Subject: [PATCH 09/29] Fix potential nullpointer rendering breaking overlay - Should backport for #52 --- .../java/com/jozufozu/flywheel/core/atlas/AtlasInfo.java | 7 ++++++- .../jozufozu/flywheel/core/crumbling/CrumblingGroup.java | 5 ++--- .../com/jozufozu/flywheel/mixin/RenderTexturesMixin.java | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/jozufozu/flywheel/core/atlas/AtlasInfo.java b/src/main/java/com/jozufozu/flywheel/core/atlas/AtlasInfo.java index 01388512b..6b915c3a9 100644 --- a/src/main/java/com/jozufozu/flywheel/core/atlas/AtlasInfo.java +++ b/src/main/java/com/jozufozu/flywheel/core/atlas/AtlasInfo.java @@ -3,6 +3,8 @@ package com.jozufozu.flywheel.core.atlas; import java.util.HashMap; import java.util.Map; +import javax.annotation.Nullable; + import com.jozufozu.flywheel.mixin.atlas.SheetDataAccessor; import net.minecraft.client.Minecraft; @@ -24,15 +26,18 @@ public class AtlasInfo { return null; } + @Nullable public static SheetData getAtlasData(TextureAtlasSprite texture) { return getAtlasData(texture.atlas()); } + @Nullable public static SheetData getAtlasData(TextureAtlas atlas) { return getAtlasData(atlas.location()); } - public static SheetData getAtlasData(ResourceLocation loc) { + @Nullable + public static SheetData getAtlasData(@Nullable ResourceLocation loc) { return sheetData.get(loc); } diff --git a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingGroup.java b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingGroup.java index 0250bf51d..c53db3b8a 100644 --- a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingGroup.java +++ b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingGroup.java @@ -48,11 +48,10 @@ public class CrumblingGroup

extends InstancedMateria } private void updateAtlasSize() { - ResourceLocation texture = RenderTextures.getShaderTexture(0); - if (texture != null) { - SheetData atlasData = AtlasInfo.getAtlasData(texture); + SheetData atlasData = AtlasInfo.getAtlasData(RenderTextures.getShaderTexture(0)); + if (atlasData != null) { width = atlasData.width; height = atlasData.height; } else { diff --git a/src/main/java/com/jozufozu/flywheel/mixin/RenderTexturesMixin.java b/src/main/java/com/jozufozu/flywheel/mixin/RenderTexturesMixin.java index ac2b09450..5e38c5ea1 100644 --- a/src/main/java/com/jozufozu/flywheel/mixin/RenderTexturesMixin.java +++ b/src/main/java/com/jozufozu/flywheel/mixin/RenderTexturesMixin.java @@ -13,7 +13,7 @@ import net.minecraft.resources.ResourceLocation; @Mixin(RenderSystem.class) public class RenderTexturesMixin { - @Inject(method = "_setShaderTexture(ILnet/minecraft/resources/ResourceLocation;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/texture/TextureManager;getTexture(Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/renderer/texture/AbstractTexture;")) + @Inject(method = "_setShaderTexture(ILnet/minecraft/resources/ResourceLocation;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/texture/AbstractTexture;getId()I")) private static void storeTextureLoc(int pShaderTexture, ResourceLocation pTextureId, CallbackInfo ci) { RenderTextures._setShaderTexture(pShaderTexture, pTextureId); } From aaaccc47ee9e54f7775e16c027417b43ac68bbe1 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Wed, 8 Dec 2021 12:16:01 -0800 Subject: [PATCH 10/29] Add instances when chunks are built for rendering - RIP ChunkIter, may you rule over the depths of hell in peace - Fix memory leak when instance worlds get reset - Server worlds are not flywheel worlds - Nothing to do on world load anymore --- .../jozufozu/flywheel/backend/Backend.java | 2 + .../com/jozufozu/flywheel/backend/Loader.java | 2 +- .../backend/instancing/InstanceManager.java | 12 ++++- .../backend/instancing/InstanceWorld.java | 15 +----- .../instancing/InstancedRenderDispatcher.java | 7 ++- .../jozufozu/flywheel/event/ForgeEvents.java | 17 +------ .../mixin/ChunkRebuildHooksMixin.java | 14 ++++-- .../mixin/LeakChunkStorageArrayMixin.java | 39 ---------------- .../com/jozufozu/flywheel/util/ChunkIter.java | 46 ------------------- src/main/resources/flywheel.mixins.json | 3 +- 10 files changed, 31 insertions(+), 126 deletions(-) delete mode 100644 src/main/java/com/jozufozu/flywheel/mixin/LeakChunkStorageArrayMixin.java delete mode 100644 src/main/java/com/jozufozu/flywheel/util/ChunkIter.java diff --git a/src/main/java/com/jozufozu/flywheel/backend/Backend.java b/src/main/java/com/jozufozu/flywheel/backend/Backend.java index 84f2b753f..927d9498f 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/Backend.java +++ b/src/main/java/com/jozufozu/flywheel/backend/Backend.java @@ -161,6 +161,8 @@ public class Backend { public static boolean isFlywheelWorld(@Nullable LevelAccessor world) { if (world == null) return false; + if (!world.isClientSide()) return false; + if (world instanceof IFlywheelWorld && ((IFlywheelWorld) world).supportsFlywheel()) return true; return world == Minecraft.getInstance().level; diff --git a/src/main/java/com/jozufozu/flywheel/backend/Loader.java b/src/main/java/com/jozufozu/flywheel/backend/Loader.java index ced144d19..491ec3f06 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/Loader.java +++ b/src/main/java/com/jozufozu/flywheel/backend/Loader.java @@ -91,7 +91,7 @@ public class Loader implements ResourceManagerReloadListener { ClientLevel world = Minecraft.getInstance().level; if (Backend.isFlywheelWorld(world)) { // TODO: looks like it might be good to have another event here - InstancedRenderDispatcher.loadAllInWorld(world); + InstancedRenderDispatcher.resetInstanceWorld(world); CrumblingRenderer.reset(); } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceManager.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceManager.java index cece70c00..2eee2f458 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceManager.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceManager.java @@ -211,6 +211,10 @@ public abstract class InstanceManager implements InstancingEngine.OriginShift } protected void processQueuedAdditions() { + if (queuedAdditions.isEmpty()) { + return; + } + ArrayList queued; synchronized (queuedAdditions) { @@ -218,7 +222,7 @@ public abstract class InstanceManager implements InstancingEngine.OriginShift queuedAdditions.clear(); } - if (queued.size() > 0) { + if (!queued.isEmpty()) { queued.forEach(this::addInternal); } } @@ -304,4 +308,10 @@ public abstract class InstanceManager implements InstancingEngine.OriginShift invalidate(); instancedTiles.forEach(this::add); } + + public void detachLightListeners() { + for (AbstractInstance value : instances.values()) { + LightUpdater.get(value.world).removeListener(value); + } + } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceWorld.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceWorld.java index cf6042576..f35437895 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceWorld.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceWorld.java @@ -9,10 +9,8 @@ import com.jozufozu.flywheel.core.Contexts; import com.jozufozu.flywheel.core.shader.WorldProgram; import com.jozufozu.flywheel.event.BeginFrameEvent; import com.jozufozu.flywheel.event.RenderLayerEvent; -import com.jozufozu.flywheel.util.ChunkIter; import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.block.entity.BlockEntity; @@ -60,17 +58,8 @@ public class InstanceWorld { */ public void delete() { engine.delete(); - } - - /** - * Instantiate all the necessary instances to render the given world. - */ - public void loadAll(ClientLevel world) { - ChunkIter.forEachChunk(world, chunk -> { - chunk.getBlockEntities().values().forEach(tileEntityInstanceManager::add); - }); - world.entitiesForRendering() - .forEach(entityInstanceManager::add); + entityInstanceManager.detachLightListeners(); + tileEntityInstanceManager.detachLightListeners(); } /** diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstancedRenderDispatcher.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstancedRenderDispatcher.java index f380bd2d0..8e59f6f15 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstancedRenderDispatcher.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstancedRenderDispatcher.java @@ -88,13 +88,12 @@ public class InstancedRenderDispatcher { ClientLevel world = event.getWorld(); if (Backend.getInstance() .canUseInstancing() && world != null) { - loadAllInWorld(world); + resetInstanceWorld(world); } } - public static void loadAllInWorld(ClientLevel world) { - instanceWorlds.replace(world, InstanceWorld::delete) - .loadAll(world); + public static void resetInstanceWorld(ClientLevel world) { + instanceWorlds.replace(world, InstanceWorld::delete); } } diff --git a/src/main/java/com/jozufozu/flywheel/event/ForgeEvents.java b/src/main/java/com/jozufozu/flywheel/event/ForgeEvents.java index 72900ab01..c91713235 100644 --- a/src/main/java/com/jozufozu/flywheel/event/ForgeEvents.java +++ b/src/main/java/com/jozufozu/flywheel/event/ForgeEvents.java @@ -3,14 +3,10 @@ package com.jozufozu.flywheel.event; import java.util.ArrayList; import com.jozufozu.flywheel.backend.Backend; -import com.jozufozu.flywheel.backend.instancing.InstancedRenderDispatcher; import com.jozufozu.flywheel.light.LightUpdater; -import com.jozufozu.flywheel.util.ChunkIter; import com.jozufozu.flywheel.util.WorldAttached; import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.world.level.LevelAccessor; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.event.TickEvent; @@ -40,20 +36,9 @@ public class ForgeEvents { } } - @SubscribeEvent - public static void onLoadWorld(WorldEvent.Load event) { - LevelAccessor world = event.getWorld(); - - if (Backend.isFlywheelWorld(world)) { - InstancedRenderDispatcher.loadAllInWorld((ClientLevel) world); - } - } - @SubscribeEvent public static void unloadWorld(WorldEvent.Unload event) { - LevelAccessor world = event.getWorld(); - ChunkIter._unload(world); - WorldAttached.invalidateWorld(world); + WorldAttached.invalidateWorld(event.getWorld()); } @SubscribeEvent diff --git a/src/main/java/com/jozufozu/flywheel/mixin/ChunkRebuildHooksMixin.java b/src/main/java/com/jozufozu/flywheel/mixin/ChunkRebuildHooksMixin.java index e7f1dfaf6..e5a75fc54 100644 --- a/src/main/java/com/jozufozu/flywheel/mixin/ChunkRebuildHooksMixin.java +++ b/src/main/java/com/jozufozu/flywheel/mixin/ChunkRebuildHooksMixin.java @@ -8,6 +8,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.jozufozu.flywheel.backend.Backend; +import com.jozufozu.flywheel.backend.instancing.InstancedRenderDispatcher; import com.jozufozu.flywheel.backend.instancing.InstancedRenderRegistry; import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; @@ -20,11 +21,16 @@ import net.minecraftforge.api.distmarker.OnlyIn; public class ChunkRebuildHooksMixin { @Inject(method = "handleBlockEntity", at = @At("HEAD"), cancellable = true) - private void filterBlockEntity(ChunkRenderDispatcher.CompiledChunk compiledChunk, Set set, E be, CallbackInfo ci) { + private void addAndFilterBEs(ChunkRenderDispatcher.CompiledChunk compiledChunk, Set set, E be, CallbackInfo ci) { - if (Backend.getInstance().canUseInstancing() && Backend.isFlywheelWorld(be.getLevel()) && InstancedRenderRegistry.getInstance() - .shouldSkipRender(be)) { - ci.cancel(); + if (Backend.getInstance().canUseInstancing() && Backend.isFlywheelWorld(be.getLevel())) { + + InstancedRenderRegistry registry = InstancedRenderRegistry.getInstance(); + if (registry.canInstance(be.getType())) + InstancedRenderDispatcher.getTiles(be.getLevel()).queueAdd(be); + + if (registry.shouldSkipRender(be)) + ci.cancel(); } } } diff --git a/src/main/java/com/jozufozu/flywheel/mixin/LeakChunkStorageArrayMixin.java b/src/main/java/com/jozufozu/flywheel/mixin/LeakChunkStorageArrayMixin.java deleted file mode 100644 index 1a9bce762..000000000 --- a/src/main/java/com/jozufozu/flywheel/mixin/LeakChunkStorageArrayMixin.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.jozufozu.flywheel.mixin; - -import java.util.concurrent.atomic.AtomicReferenceArray; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import com.jozufozu.flywheel.util.ChunkIter; - -import net.minecraft.client.multiplayer.ClientChunkCache; -import net.minecraft.world.level.chunk.LevelChunk; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -/** - * In order to iterate over all loaded chunks, we do something absolutely foul. - * - *

- * By stealing the reference to the backing array of the chunk storage when it is constructed, we gain 0 maintenance - * access to the full array of loaded chunks. - *

- */ -@OnlyIn(Dist.CLIENT) -@Mixin(targets = "net.minecraft.client.multiplayer.ClientChunkCache$Storage") -public class LeakChunkStorageArrayMixin { - - @Shadow - @Final - AtomicReferenceArray chunks; - - @Inject(method = "", at = @At("TAIL")) - private void leakBackingArray(ClientChunkCache outer, int chunkRadius, CallbackInfo ci) { - ChunkIter._putStorageReference(outer.getLevel(), chunks); - } -} diff --git a/src/main/java/com/jozufozu/flywheel/util/ChunkIter.java b/src/main/java/com/jozufozu/flywheel/util/ChunkIter.java deleted file mode 100644 index 3174368df..000000000 --- a/src/main/java/com/jozufozu/flywheel/util/ChunkIter.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.jozufozu.flywheel.util; - -import java.util.WeakHashMap; -import java.util.concurrent.atomic.AtomicReferenceArray; -import java.util.function.Consumer; - -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.chunk.LevelChunk; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -/** - * Helper class for iterating over all loaded chunks. - */ -@OnlyIn(Dist.CLIENT) -public class ChunkIter { - - private static final WeakHashMap> storages = new WeakHashMap<>(); - - /** - * Iterate over all loaded chunks in a level. - */ - public static void forEachChunk(BlockGetter level, Consumer consumer) { - AtomicReferenceArray storage = storages.get(level); - - if (storage == null) - return; - - for (int i = 0; i < storage.length(); i++) { - LevelChunk chunk = storage.get(i); - if (chunk != null) { - consumer.accept(chunk); - } - } - } - - // INTERNAL MAINTENANCE METHODS BELOW - - public static void _putStorageReference(BlockGetter level, AtomicReferenceArray storage) { - storages.put(level, storage); - } - - public static void _unload(BlockGetter world) { - storages.remove(world); - } -} diff --git a/src/main/resources/flywheel.mixins.json b/src/main/resources/flywheel.mixins.json index 2d64420b7..537f77cd1 100644 --- a/src/main/resources/flywheel.mixins.json +++ b/src/main/resources/flywheel.mixins.json @@ -2,7 +2,7 @@ "required": true, "minVersion": "0.8", "package": "com.jozufozu.flywheel.mixin", - "compatibilityLevel": "JAVA_16", + "compatibilityLevel": "JAVA_17", "refmap": "flywheel.refmap.json", "client": [ "CancelEntityRenderMixin", @@ -10,7 +10,6 @@ "FixFabulousDepthMixin", "InstanceAddMixin", "InstanceRemoveMixin", - "LeakChunkStorageArrayMixin", "LevelRendererAccessor", "PausedPartialTickAccessor", "RenderHooksMixin", From 9fe0bae2ad954983d564e5ab436ef6e169b8a164 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Wed, 8 Dec 2021 12:28:22 -0800 Subject: [PATCH 11/29] #tick and #beginFrame on creation - Fixes weird delay in object appearance when reloading chunks --- .../flywheel/backend/instancing/IDynamicInstance.java | 4 ++-- .../flywheel/backend/instancing/ITickableInstance.java | 2 +- .../flywheel/backend/instancing/InstanceManager.java | 10 ++++++++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/IDynamicInstance.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/IDynamicInstance.java index e801d16f8..5f598022a 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/IDynamicInstance.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/IDynamicInstance.java @@ -13,9 +13,9 @@ import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance; */ public interface IDynamicInstance extends IInstance { /** - * Called every frame. + * Called every frame, and after initialization. *
- * DISPATCHED IN PARALLEL, don't attempt to mutate anything outside of this instance. + * DISPATCHED IN PARALLEL, don't attempt to mutate anything outside this instance. *
* {@link Instancer}/{@link InstanceData} creation/acquisition is safe here. */ diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/ITickableInstance.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/ITickableInstance.java index 71e5e1d8d..0e97b5327 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/ITickableInstance.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/ITickableInstance.java @@ -21,7 +21,7 @@ import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance; public interface ITickableInstance extends IInstance { /** - * Called every tick. + * Called every tick, and after initialization. *
* DISPATCHED IN PARALLEL, don't attempt to mutate anything outside of this instance. *
diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceManager.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceManager.java index 2eee2f458..535357ff3 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceManager.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceManager.java @@ -294,9 +294,15 @@ public abstract class InstanceManager implements InstancingEngine.OriginShift .addListener(renderer); instances.put(obj, renderer); - if (renderer instanceof IDynamicInstance) dynamicInstances.put(obj, (IDynamicInstance) renderer); + if (renderer instanceof ITickableInstance r) { + tickableInstances.put(obj, r); + r.tick(); + } - if (renderer instanceof ITickableInstance) tickableInstances.put(obj, ((ITickableInstance) renderer)); + if (renderer instanceof IDynamicInstance r) { + dynamicInstances.put(obj, r); + r.beginFrame(); + } } return renderer; From 47b110c48c9d6c680723312e21ce91ecff1a94ca Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Wed, 8 Dec 2021 12:48:18 -0800 Subject: [PATCH 12/29] Fix shulker box rendering --- .../java/com/jozufozu/flywheel/vanilla/ChestInstance.java | 4 +--- .../com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java index 513dbd4c6..0302fae0b 100644 --- a/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java +++ b/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java @@ -53,7 +53,7 @@ public class ChestInstance extends TileE .setPosition(getInstancePosition()); lid = lidInstance(); - if (block instanceof AbstractChestBlock) { + if (block instanceof AbstractChestBlock chestBlock) { float horizontalAngle = blockState.getValue(ChestBlock.FACING).toYRot(); @@ -61,8 +61,6 @@ public class ChestInstance extends TileE body.setRotation(baseRotation); - AbstractChestBlock chestBlock = (AbstractChestBlock) block; - DoubleBlockCombiner.NeighborCombineResult wrapper = chestBlock.combine(blockState, world, getWorldPosition(), true); this.lidProgress = wrapper.apply(ChestBlock.opennessCombiner(tile)); diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java index 824526074..5e8fb230c 100644 --- a/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java +++ b/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java @@ -86,14 +86,14 @@ public class ShulkerBoxInstance extends TileEntityInstance Date: Thu, 9 Dec 2021 00:42:27 -0800 Subject: [PATCH 13/29] Reorganize, rename, refactor, 0.4.0 - Move most user facing interfaces to flywheel.api package - Refactor InstanceData to have no package private classes - Remove 'I' prefix from many interfaces - ILightUpdateListener -> LightListener - IMultiProgram -> ContextAwareProgram - IFlatLight -> FlatLit - All materials use the same vertex format: UNLIT_MODEL --- gradle.properties | 2 +- .../jozufozu/flywheel/backend/Backend.java | 18 +++---- .../flywheel/backend/IFlywheelWorld.java | 13 ----- .../com/jozufozu/flywheel/backend/Loader.java | 2 +- .../backend/{state => }/RenderLayer.java | 2 +- ...IShaderContext.java => ShaderContext.java} | 2 +- .../FlywheelRendered.java} | 4 +- .../flywheel/backend/api/FlywheelWorld.java | 13 +++++ .../flywheel/backend/api/InstanceData.java | 41 +++++++++++++++ .../{instancing => api}/Instancer.java | 21 ++++++-- .../backend/{material => api}/Material.java | 10 ++-- .../{material => api}/MaterialGroup.java | 4 +- .../{material => api}/MaterialManager.java | 4 +- .../{material => api}/MaterialSpec.java | 12 +---- .../instance}/IDynamicInstance.java | 4 +- .../instance}/IInstance.java | 2 +- .../instance}/ITickableInstance.java | 4 +- .../instance}/package-info.java | 2 +- .../backend/{state => api}/package-info.java | 2 +- .../backend/instancing/AbstractInstance.java | 19 ++++--- .../backend/instancing/AbstractInstancer.java | 52 ++++++++----------- .../flywheel/backend/instancing/Engine.java | 6 +++ .../backend/instancing/InstanceData.java | 18 ------- .../backend/instancing/InstanceManager.java | 6 ++- .../backend/instancing/InstanceWorld.java | 7 +-- .../instancing/InstancedRenderRegistry.java | 7 +-- .../RenderDispatcher.java | 7 ++- .../batching/BatchedMaterial.java | 15 +++--- .../batching/BatchedMaterialGroup.java | 8 +-- .../batching/BatchingEngine.java | 8 +-- .../{ => batching}/CPUInstancer.java | 15 ++++-- .../batching/package-info.java | 2 +- .../instancing/entity/EntityInstance.java | 12 ++--- .../entity/EntityInstanceManager.java | 2 +- .../entity/IEntityInstanceFactory.java | 2 +- .../{ => instancing}/GPUInstancer.java | 15 ++++-- .../instancing/InstancedMaterial.java | 18 +++---- .../instancing/InstancedMaterialGroup.java | 8 +-- .../instancing/InstancedMaterialRenderer.java | 3 +- .../instancing/InstancingEngine.java | 8 +-- .../instancing/package-info.java | 2 +- .../instancing/tile/ITileInstanceFactory.java | 2 +- .../instancing/tile/TileEntityInstance.java | 8 +-- .../instancing/tile/TileInstanceManager.java | 2 +- .../flywheel/backend/material/Engine.java | 4 -- .../backend/model/ArrayModelRenderer.java | 6 +-- .../flywheel/backend/model/BufferedModel.java | 6 +-- .../backend/model/ImmediateAllocator.java | 4 +- .../flywheel/backend/model/IndexedModel.java | 4 +- .../backend/model/ModelAllocator.java | 4 +- .../flywheel/backend/model/ModelPool.java | 8 +-- .../flywheel/backend/model/ModelRenderer.java | 8 +-- ...haderPipeline.java => ShaderPipeline.java} | 6 +-- .../backend/pipeline/WorldShaderPipeline.java | 8 +-- .../flywheel/backend/struct/Batched.java | 4 +- .../com/jozufozu/flywheel/core/Contexts.java | 6 +-- .../com/jozufozu/flywheel/core/Materials.java | 6 +-- .../jozufozu/flywheel/core/WorldContext.java | 20 +++---- .../core/crumbling/CrumblingGroup.java | 7 ++- .../crumbling/CrumblingInstanceManager.java | 2 +- .../core/crumbling/CrumblingRenderer.java | 2 +- .../core/instancing/ConditionalInstance.java | 4 +- .../core/instancing/GroupInstance.java | 4 +- .../core/instancing/SelectInstance.java | 4 +- .../flywheel/core/materials/BasicData.java | 4 +- .../{IFlatLight.java => FlatLit.java} | 4 +- .../materials/model/ModelTransformer.java | 4 +- .../core/materials/model/ModelType.java | 4 +- .../core/materials/oriented/OrientedType.java | 4 +- .../flywheel/core/model/BakedModelModel.java | 2 +- .../flywheel/core/model/BlockModel.java | 2 +- .../core/model/{IModel.java => Model.java} | 2 +- .../flywheel/core/model/ModelPart.java | 2 +- .../flywheel/core/model/WorldModel.java | 2 +- ...iProgram.java => ContextAwareProgram.java} | 2 +- .../core/shader/ExtensibleGlProgram.java | 3 +- .../core/shader/GameStateProgram.java | 4 +- .../flywheel/event/RenderLayerEvent.java | 2 +- .../flywheel/light/BasicProvider.java | 15 ++---- ...eConsumer.java => CoordinateConsumer.java} | 2 +- .../flywheel/light/GridAlignedBB.java | 2 +- .../jozufozu/flywheel/light/ImmutableBox.java | 4 +- ...UpdateListener.java => LightListener.java} | 2 +- .../jozufozu/flywheel/light/LightUpdater.java | 34 ++++++------ .../jozufozu/flywheel/light/LightVolume.java | 2 +- ...ovingListener.java => MovingListener.java} | 2 +- .../flywheel/vanilla/BellInstance.java | 4 +- .../flywheel/vanilla/ChestInstance.java | 4 +- .../flywheel/vanilla/MinecartInstance.java | 10 ++-- .../flywheel/vanilla/ShulkerBoxInstance.java | 4 +- 90 files changed, 346 insertions(+), 311 deletions(-) delete mode 100644 src/main/java/com/jozufozu/flywheel/backend/IFlywheelWorld.java rename src/main/java/com/jozufozu/flywheel/backend/{state => }/RenderLayer.java (95%) rename src/main/java/com/jozufozu/flywheel/backend/{IShaderContext.java => ShaderContext.java} (90%) rename src/main/java/com/jozufozu/flywheel/backend/{instancing/IInstanceRendered.java => api/FlywheelRendered.java} (78%) create mode 100644 src/main/java/com/jozufozu/flywheel/backend/api/FlywheelWorld.java create mode 100644 src/main/java/com/jozufozu/flywheel/backend/api/InstanceData.java rename src/main/java/com/jozufozu/flywheel/backend/{instancing => api}/Instancer.java (73%) rename src/main/java/com/jozufozu/flywheel/backend/{material => api}/Material.java (79%) rename src/main/java/com/jozufozu/flywheel/backend/{material => api}/MaterialGroup.java (76%) rename src/main/java/com/jozufozu/flywheel/backend/{material => api}/MaterialManager.java (90%) rename src/main/java/com/jozufozu/flywheel/backend/{material => api}/MaterialSpec.java (61%) rename src/main/java/com/jozufozu/flywheel/backend/{instancing => api/instance}/IDynamicInstance.java (89%) rename src/main/java/com/jozufozu/flywheel/backend/{instancing => api/instance}/IInstance.java (66%) rename src/main/java/com/jozufozu/flywheel/backend/{instancing => api/instance}/ITickableInstance.java (90%) rename src/main/java/com/jozufozu/flywheel/backend/{material => api/instance}/package-info.java (76%) rename src/main/java/com/jozufozu/flywheel/backend/{state => api}/package-info.java (79%) create mode 100644 src/main/java/com/jozufozu/flywheel/backend/instancing/Engine.java delete mode 100644 src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceData.java rename src/main/java/com/jozufozu/flywheel/backend/{material => instancing}/RenderDispatcher.java (67%) rename src/main/java/com/jozufozu/flywheel/backend/{material => instancing}/batching/BatchedMaterial.java (66%) rename src/main/java/com/jozufozu/flywheel/backend/{material => instancing}/batching/BatchedMaterialGroup.java (84%) rename src/main/java/com/jozufozu/flywheel/backend/{material => instancing}/batching/BatchingEngine.java (84%) rename src/main/java/com/jozufozu/flywheel/backend/instancing/{ => batching}/CPUInstancer.java (66%) rename src/main/java/com/jozufozu/flywheel/backend/{material => instancing}/batching/package-info.java (74%) rename src/main/java/com/jozufozu/flywheel/backend/instancing/{ => instancing}/GPUInstancer.java (91%) rename src/main/java/com/jozufozu/flywheel/backend/{material => instancing}/instancing/InstancedMaterial.java (78%) rename src/main/java/com/jozufozu/flywheel/backend/{material => instancing}/instancing/InstancedMaterialGroup.java (90%) rename src/main/java/com/jozufozu/flywheel/backend/{material => instancing}/instancing/InstancedMaterialRenderer.java (91%) rename src/main/java/com/jozufozu/flywheel/backend/{material => instancing}/instancing/InstancingEngine.java (96%) rename src/main/java/com/jozufozu/flywheel/backend/{material => instancing}/instancing/package-info.java (73%) delete mode 100644 src/main/java/com/jozufozu/flywheel/backend/material/Engine.java rename src/main/java/com/jozufozu/flywheel/backend/pipeline/{IShaderPipeline.java => ShaderPipeline.java} (64%) rename src/main/java/com/jozufozu/flywheel/core/materials/{IFlatLight.java => FlatLit.java} (85%) rename src/main/java/com/jozufozu/flywheel/core/model/{IModel.java => Model.java} (98%) rename src/main/java/com/jozufozu/flywheel/core/shader/{IMultiProgram.java => ContextAwareProgram.java} (87%) rename src/main/java/com/jozufozu/flywheel/light/{ICoordinateConsumer.java => CoordinateConsumer.java} (71%) rename src/main/java/com/jozufozu/flywheel/light/{ILightUpdateListener.java => LightListener.java} (94%) rename src/main/java/com/jozufozu/flywheel/light/{IMovingListener.java => MovingListener.java} (55%) diff --git a/gradle.properties b/gradle.properties index f267992ed..2ca2551c2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs = -Xmx3G org.gradle.daemon = false # mod version info -mod_version = 0.3.0 +mod_version = 0.4.0 mc_update_version = 1.18 minecraft_version = 1.18 forge_version = 38.0.15 diff --git a/src/main/java/com/jozufozu/flywheel/backend/Backend.java b/src/main/java/com/jozufozu/flywheel/backend/Backend.java index 927d9498f..aa8b8ad65 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/Backend.java +++ b/src/main/java/com/jozufozu/flywheel/backend/Backend.java @@ -13,9 +13,10 @@ import org.apache.logging.log4j.Logger; import org.lwjgl.opengl.GL; import org.lwjgl.opengl.GLCapabilities; +import com.jozufozu.flywheel.backend.api.FlywheelWorld; import com.jozufozu.flywheel.backend.gl.versioned.GlCompat; -import com.jozufozu.flywheel.backend.instancing.InstanceData; -import com.jozufozu.flywheel.backend.material.MaterialSpec; +import com.jozufozu.flywheel.backend.api.InstanceData; +import com.jozufozu.flywheel.backend.api.MaterialSpec; import com.jozufozu.flywheel.config.FlwConfig; import com.jozufozu.flywheel.core.shader.spec.ProgramSpec; @@ -41,7 +42,7 @@ public class Backend { private boolean instancedArrays; private boolean enabled; - private final List> contexts = new ArrayList<>(); + private final List> contexts = new ArrayList<>(); private final Map> materialRegistry = new HashMap<>(); private final Map programSpecRegistry = new HashMap<>(); @@ -82,7 +83,7 @@ public class Backend { /** * Register a shader context. */ - public > C register(C spec) { + public > C register(C spec) { contexts.add(spec); return spec; } @@ -97,8 +98,7 @@ public class Backend { } materialRegistry.put(name, spec); - log.debug("registered material '" + name + "' with vertex size " + spec.getModelFormat() - .getStride() + " and instance size " + spec.getInstanceType().format().getStride()); + log.debug("registered material '" + name + "' with instance size " + spec.getInstanceType().format().getStride()); return spec; } @@ -151,7 +151,7 @@ public class Backend { return programSpecRegistry.values(); } - public Collection> allContexts() { + public Collection> allContexts() { return contexts; } @@ -163,7 +163,7 @@ public class Backend { if (!world.isClientSide()) return false; - if (world instanceof IFlywheelWorld && ((IFlywheelWorld) world).supportsFlywheel()) return true; + if (world instanceof FlywheelWorld && ((FlywheelWorld) world).supportsFlywheel()) return true; return world == Minecraft.getInstance().level; } @@ -182,7 +182,7 @@ public class Backend { public void _clearContexts() { GameStateRegistry.clear(); programSpecRegistry.clear(); - contexts.forEach(IShaderContext::delete); + contexts.forEach(ShaderContext::delete); contexts.clear(); materialRegistry.clear(); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/IFlywheelWorld.java b/src/main/java/com/jozufozu/flywheel/backend/IFlywheelWorld.java deleted file mode 100644 index 52f1712ed..000000000 --- a/src/main/java/com/jozufozu/flywheel/backend/IFlywheelWorld.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.jozufozu.flywheel.backend; - -/** - * A marker interface custom worlds can override to indicate - * that tiles inside the world should render with Flywheel. - * - * Minecraft.getInstance().world is special cased and will support Flywheel by default. - */ -public interface IFlywheelWorld { - default boolean supportsFlywheel() { - return true; - } -} diff --git a/src/main/java/com/jozufozu/flywheel/backend/Loader.java b/src/main/java/com/jozufozu/flywheel/backend/Loader.java index 491ec3f06..3d9d6b369 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/Loader.java +++ b/src/main/java/com/jozufozu/flywheel/backend/Loader.java @@ -78,7 +78,7 @@ public class Loader implements ResourceManagerReloadListener { Resolver.INSTANCE.resolve(sources); - for (IShaderContext context : backend.allContexts()) { + for (ShaderContext context : backend.allContexts()) { context.load(); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/state/RenderLayer.java b/src/main/java/com/jozufozu/flywheel/backend/RenderLayer.java similarity index 95% rename from src/main/java/com/jozufozu/flywheel/backend/state/RenderLayer.java rename to src/main/java/com/jozufozu/flywheel/backend/RenderLayer.java index 8594f1f00..615187b43 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/state/RenderLayer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/RenderLayer.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.backend.state; +package com.jozufozu.flywheel.backend; import javax.annotation.Nullable; diff --git a/src/main/java/com/jozufozu/flywheel/backend/IShaderContext.java b/src/main/java/com/jozufozu/flywheel/backend/ShaderContext.java similarity index 90% rename from src/main/java/com/jozufozu/flywheel/backend/IShaderContext.java rename to src/main/java/com/jozufozu/flywheel/backend/ShaderContext.java index 0d24963f2..66585908e 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/IShaderContext.java +++ b/src/main/java/com/jozufozu/flywheel/backend/ShaderContext.java @@ -6,7 +6,7 @@ import com.jozufozu.flywheel.backend.gl.shader.GlProgram; import net.minecraft.resources.ResourceLocation; -public interface IShaderContext

{ +public interface ShaderContext

{ default P getProgram(ResourceLocation loc) { return this.getProgramSupplier(loc) diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/IInstanceRendered.java b/src/main/java/com/jozufozu/flywheel/backend/api/FlywheelRendered.java similarity index 78% rename from src/main/java/com/jozufozu/flywheel/backend/instancing/IInstanceRendered.java rename to src/main/java/com/jozufozu/flywheel/backend/api/FlywheelRendered.java index 50073b868..82e4f47b3 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/IInstanceRendered.java +++ b/src/main/java/com/jozufozu/flywheel/backend/api/FlywheelRendered.java @@ -1,11 +1,11 @@ -package com.jozufozu.flywheel.backend.instancing; +package com.jozufozu.flywheel.backend.api; import net.minecraft.world.level.Level; /** * Something (a BlockEntity or Entity) that can be rendered using the instancing API. */ -public interface IInstanceRendered { +public interface FlywheelRendered { /** * @return true if there are parts of the renderer that cannot be implemented with Flywheel. diff --git a/src/main/java/com/jozufozu/flywheel/backend/api/FlywheelWorld.java b/src/main/java/com/jozufozu/flywheel/backend/api/FlywheelWorld.java new file mode 100644 index 000000000..0254dddef --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/backend/api/FlywheelWorld.java @@ -0,0 +1,13 @@ +package com.jozufozu.flywheel.backend.api; + +/** + * A marker interface custom worlds can override to indicate + * that tiles inside the world should render with Flywheel. + * + * {@link net.minecraft.client.Minecraft#level Minecraft#level} is special cased and will support Flywheel by default. + */ +public interface FlywheelWorld { + default boolean supportsFlywheel() { + return true; + } +} diff --git a/src/main/java/com/jozufozu/flywheel/backend/api/InstanceData.java b/src/main/java/com/jozufozu/flywheel/backend/api/InstanceData.java new file mode 100644 index 000000000..bc9b33a42 --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/backend/api/InstanceData.java @@ -0,0 +1,41 @@ +package com.jozufozu.flywheel.backend.api; + +public abstract class InstanceData { + + private Instancer owner; + + private boolean dirty; + private boolean removed; + + public final void markDirty() { + dirty = true; + owner.notifyDirty(); + } + + public final void delete() { + removed = true; + owner.notifyRemoval(); + } + + public final boolean checkDirtyAndClear() { + if (dirty) { + dirty = false; + return true; + } else { + return false; + } + } + + public final boolean isRemoved() { + return removed; + } + + public Instancer getOwner() { + return owner; + } + + public InstanceData setOwner(Instancer owner) { + this.owner = owner; + return this; + } +} diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/Instancer.java b/src/main/java/com/jozufozu/flywheel/backend/api/Instancer.java similarity index 73% rename from src/main/java/com/jozufozu/flywheel/backend/instancing/Instancer.java rename to src/main/java/com/jozufozu/flywheel/backend/api/Instancer.java index f83de1e53..2da26426b 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/Instancer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/api/Instancer.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.backend.instancing; +package com.jozufozu.flywheel.backend.api; /** * An instancer is how you interact with an instanced model. @@ -32,7 +32,22 @@ public interface Instancer { */ void stealInstance(D inOther); - void markDirty(InstanceData instanceData); + /** + * Notify the Instancer that some of its data needs updating. + * + *

+ * This might be ignored, depending on the implementation. For the GPUInstancer, this triggers a scan of all + * instances. + *

+ */ + void notifyDirty(); - void markRemoval(InstanceData instanceData); + /** + * Notify the Instances that some of its data should be removed. + * + *

+ * By the time the next frame is drawn, the instanceData passed will no longer be considered for rendering. + *

+ */ + void notifyRemoval(); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/Material.java b/src/main/java/com/jozufozu/flywheel/backend/api/Material.java similarity index 79% rename from src/main/java/com/jozufozu/flywheel/backend/material/Material.java rename to src/main/java/com/jozufozu/flywheel/backend/api/Material.java index af1e2d609..f6a1ed011 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/material/Material.java +++ b/src/main/java/com/jozufozu/flywheel/backend/api/Material.java @@ -1,12 +1,10 @@ -package com.jozufozu.flywheel.backend.material; +package com.jozufozu.flywheel.backend.api; import java.util.function.Supplier; -import com.jozufozu.flywheel.backend.instancing.InstanceData; -import com.jozufozu.flywheel.backend.instancing.Instancer; import com.jozufozu.flywheel.core.PartialModel; import com.jozufozu.flywheel.core.model.BlockModel; -import com.jozufozu.flywheel.core.model.IModel; +import com.jozufozu.flywheel.core.model.Model; import com.jozufozu.flywheel.util.Pair; import com.jozufozu.flywheel.util.RenderUtil; import com.mojang.blaze3d.vertex.PoseStack; @@ -19,10 +17,10 @@ public interface Material { * Get an instancer for the given model. Calling this method twice with the same key will return the same instancer. * * @param key An object that uniquely identifies the model. - * @param modelSupplier A factory that creates the IModel that you want to render. + * @param modelSupplier A factory that creates the Model that you want to render. * @return An instancer for the given model, capable of rendering many copies for little cost. */ - Instancer model(Object key, Supplier modelSupplier); + Instancer model(Object key, Supplier modelSupplier); default Instancer getModel(PartialModel partial, BlockState referenceState) { return model(partial, () -> new BlockModel(partial.get(), referenceState)); diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/MaterialGroup.java b/src/main/java/com/jozufozu/flywheel/backend/api/MaterialGroup.java similarity index 76% rename from src/main/java/com/jozufozu/flywheel/backend/material/MaterialGroup.java rename to src/main/java/com/jozufozu/flywheel/backend/api/MaterialGroup.java index 2e3bb81fe..9ffb32d52 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/material/MaterialGroup.java +++ b/src/main/java/com/jozufozu/flywheel/backend/api/MaterialGroup.java @@ -1,6 +1,4 @@ -package com.jozufozu.flywheel.backend.material; - -import com.jozufozu.flywheel.backend.instancing.InstanceData; +package com.jozufozu.flywheel.backend.api; public interface MaterialGroup { /** diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/MaterialManager.java b/src/main/java/com/jozufozu/flywheel/backend/api/MaterialManager.java similarity index 90% rename from src/main/java/com/jozufozu/flywheel/backend/material/MaterialManager.java rename to src/main/java/com/jozufozu/flywheel/backend/api/MaterialManager.java index 14d907e59..c825b8c80 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/material/MaterialManager.java +++ b/src/main/java/com/jozufozu/flywheel/backend/api/MaterialManager.java @@ -1,6 +1,6 @@ -package com.jozufozu.flywheel.backend.material; +package com.jozufozu.flywheel.backend.api; -import com.jozufozu.flywheel.backend.state.RenderLayer; +import com.jozufozu.flywheel.backend.RenderLayer; import net.minecraft.client.renderer.RenderType; import net.minecraft.core.Vec3i; diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/MaterialSpec.java b/src/main/java/com/jozufozu/flywheel/backend/api/MaterialSpec.java similarity index 61% rename from src/main/java/com/jozufozu/flywheel/backend/material/MaterialSpec.java rename to src/main/java/com/jozufozu/flywheel/backend/api/MaterialSpec.java index 733d98947..1350e8878 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/material/MaterialSpec.java +++ b/src/main/java/com/jozufozu/flywheel/backend/api/MaterialSpec.java @@ -1,7 +1,5 @@ -package com.jozufozu.flywheel.backend.material; +package com.jozufozu.flywheel.backend.api; -import com.jozufozu.flywheel.backend.gl.attrib.VertexFormat; -import com.jozufozu.flywheel.backend.instancing.InstanceData; import com.jozufozu.flywheel.backend.struct.StructType; import net.minecraft.resources.ResourceLocation; @@ -11,13 +9,11 @@ public class MaterialSpec { public final ResourceLocation name; private final ResourceLocation programSpec; - private final VertexFormat modelFormat; private final StructType instanceType; - public MaterialSpec(ResourceLocation name, ResourceLocation programSpec, VertexFormat modelFormat, StructType type) { + public MaterialSpec(ResourceLocation name, ResourceLocation programSpec, StructType type) { this.name = name; this.programSpec = programSpec; - this.modelFormat = modelFormat; this.instanceType = type; } @@ -25,10 +21,6 @@ public class MaterialSpec { return programSpec; } - public VertexFormat getModelFormat() { - return modelFormat; - } - public StructType getInstanceType() { return instanceType; } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/IDynamicInstance.java b/src/main/java/com/jozufozu/flywheel/backend/api/instance/IDynamicInstance.java similarity index 89% rename from src/main/java/com/jozufozu/flywheel/backend/instancing/IDynamicInstance.java rename to src/main/java/com/jozufozu/flywheel/backend/api/instance/IDynamicInstance.java index 5f598022a..c69d01994 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/IDynamicInstance.java +++ b/src/main/java/com/jozufozu/flywheel/backend/api/instance/IDynamicInstance.java @@ -1,5 +1,7 @@ -package com.jozufozu.flywheel.backend.instancing; +package com.jozufozu.flywheel.backend.api.instance; +import com.jozufozu.flywheel.backend.api.Instancer; +import com.jozufozu.flywheel.backend.api.InstanceData; import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance; /** diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/IInstance.java b/src/main/java/com/jozufozu/flywheel/backend/api/instance/IInstance.java similarity index 66% rename from src/main/java/com/jozufozu/flywheel/backend/instancing/IInstance.java rename to src/main/java/com/jozufozu/flywheel/backend/api/instance/IInstance.java index 9514740d8..7b088eab2 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/IInstance.java +++ b/src/main/java/com/jozufozu/flywheel/backend/api/instance/IInstance.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.backend.instancing; +package com.jozufozu.flywheel.backend.api.instance; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/ITickableInstance.java b/src/main/java/com/jozufozu/flywheel/backend/api/instance/ITickableInstance.java similarity index 90% rename from src/main/java/com/jozufozu/flywheel/backend/instancing/ITickableInstance.java rename to src/main/java/com/jozufozu/flywheel/backend/api/instance/ITickableInstance.java index 0e97b5327..8e72e02ce 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/ITickableInstance.java +++ b/src/main/java/com/jozufozu/flywheel/backend/api/instance/ITickableInstance.java @@ -1,5 +1,7 @@ -package com.jozufozu.flywheel.backend.instancing; +package com.jozufozu.flywheel.backend.api.instance; +import com.jozufozu.flywheel.backend.api.Instancer; +import com.jozufozu.flywheel.backend.api.InstanceData; import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance; /** diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/package-info.java b/src/main/java/com/jozufozu/flywheel/backend/api/instance/package-info.java similarity index 76% rename from src/main/java/com/jozufozu/flywheel/backend/material/package-info.java rename to src/main/java/com/jozufozu/flywheel/backend/api/instance/package-info.java index 6568fe53f..2374b554d 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/material/package-info.java +++ b/src/main/java/com/jozufozu/flywheel/backend/api/instance/package-info.java @@ -1,5 +1,5 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -package com.jozufozu.flywheel.backend.material; +package com.jozufozu.flywheel.backend.api.instance; import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/com/jozufozu/flywheel/backend/state/package-info.java b/src/main/java/com/jozufozu/flywheel/backend/api/package-info.java similarity index 79% rename from src/main/java/com/jozufozu/flywheel/backend/state/package-info.java rename to src/main/java/com/jozufozu/flywheel/backend/api/package-info.java index d769925d3..693e0fd2b 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/state/package-info.java +++ b/src/main/java/com/jozufozu/flywheel/backend/api/package-info.java @@ -1,5 +1,5 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -package com.jozufozu.flywheel.backend.state; +package com.jozufozu.flywheel.backend.api; import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstance.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstance.java index 6d67ae02e..b17e238bd 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstance.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstance.java @@ -3,10 +3,13 @@ package com.jozufozu.flywheel.backend.instancing; import java.util.Arrays; import java.util.stream.Stream; +import com.jozufozu.flywheel.backend.api.instance.IDynamicInstance; +import com.jozufozu.flywheel.backend.api.instance.IInstance; +import com.jozufozu.flywheel.backend.api.instance.ITickableInstance; import com.jozufozu.flywheel.backend.instancing.tile.TileInstanceManager; -import com.jozufozu.flywheel.backend.material.MaterialManager; -import com.jozufozu.flywheel.core.materials.IFlatLight; -import com.jozufozu.flywheel.light.ILightUpdateListener; +import com.jozufozu.flywheel.backend.api.MaterialManager; +import com.jozufozu.flywheel.core.materials.FlatLit; +import com.jozufozu.flywheel.light.LightListener; import com.jozufozu.flywheel.light.ImmutableBox; import com.jozufozu.flywheel.light.LightProvider; import com.jozufozu.flywheel.light.ListenerStatus; @@ -19,7 +22,7 @@ import net.minecraft.world.level.LightLayer; * A general interface providing information about any type of thing that could use Flywheel's instanced rendering. * Right now, that's only {@link TileInstanceManager}, but there could be an entity equivalent in the future. */ -public abstract class AbstractInstance implements IInstance, ILightUpdateListener { +public abstract class AbstractInstance implements IInstance, LightListener { protected final MaterialManager materialManager; public final Level world; @@ -84,19 +87,19 @@ public abstract class AbstractInstance implements IInstance, ILightUpdateListene updateLight(); } - protected void relight(BlockPos pos, IFlatLight... models) { + protected void relight(BlockPos pos, FlatLit... models) { relight(world.getBrightness(LightLayer.BLOCK, pos), world.getBrightness(LightLayer.SKY, pos), models); } - protected > void relight(BlockPos pos, Stream models) { + protected > void relight(BlockPos pos, Stream models) { relight(world.getBrightness(LightLayer.BLOCK, pos), world.getBrightness(LightLayer.SKY, pos), models); } - protected void relight(int block, int sky, IFlatLight... models) { + protected void relight(int block, int sky, FlatLit... models) { relight(block, sky, Arrays.stream(models)); } - protected > void relight(int block, int sky, Stream models) { + protected > void relight(int block, int sky, Stream models) { models.forEach(model -> model.setBlockLight(block) .setSkyLight(sky)); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstancer.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstancer.java index c27178984..9fb667df6 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstancer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstancer.java @@ -3,19 +3,20 @@ package com.jozufozu.flywheel.backend.instancing; import java.util.ArrayList; import java.util.BitSet; +import com.jozufozu.flywheel.backend.api.InstanceData; +import com.jozufozu.flywheel.backend.api.Instancer; import com.jozufozu.flywheel.backend.struct.StructType; -import com.jozufozu.flywheel.core.model.IModel; +import com.jozufozu.flywheel.core.model.Model; -public class AbstractInstancer implements Instancer { +public abstract class AbstractInstancer implements Instancer { protected final StructType type; - protected final IModel modelData; + protected final Model modelData; protected final ArrayList data = new ArrayList<>(); - boolean anyToRemove; - boolean anyToUpdate; + protected boolean anyToRemove; - public AbstractInstancer(StructType type, IModel modelData) { + protected AbstractInstancer(StructType type, Model modelData) { this.type = type; this.modelData = modelData; } @@ -25,9 +26,7 @@ public class AbstractInstancer implements Instancer { */ @Override public D createInstance() { - D data = type.create(); - data.owner = this; - return _add(data); + return _add(type.create()); } /** @@ -38,24 +37,17 @@ public class AbstractInstancer implements Instancer { */ @Override public void stealInstance(D inOther) { - if (inOther.owner == this) return; + if (inOther.getOwner() == this) return; - inOther.delete(); - // sike, we want to keep it, changing the owner reference will still delete it in the other - inOther.removed = false; + // Changing the owner reference will delete it in the other instancer + inOther.getOwner() + .notifyRemoval(); _add(inOther); } @Override - public void markDirty(InstanceData instanceData) { - anyToUpdate = true; - instanceData.dirty = true; - } - - @Override - public void markRemoval(InstanceData instanceData) { + public void notifyRemoval() { anyToRemove = true; - instanceData.removed = true; } /** @@ -72,10 +64,8 @@ public class AbstractInstancer implements Instancer { for (int i = 0; i < size; i++) { D element = data.get(i); - if (element.dirty) { + if (element.checkDirtyAndClear()) { dirtySet.set(i); - - element.dirty = false; } } return dirtySet; @@ -88,7 +78,7 @@ public class AbstractInstancer implements Instancer { final BitSet removeSet = new BitSet(oldSize); for (int i = 0; i < oldSize; i++) { final D element = this.data.get(i); - if (element.removed || element.owner != this) { + if (element.isRemoved() || element.getOwner() != this) { removeSet.set(i); removeCount++; } @@ -103,22 +93,22 @@ public class AbstractInstancer implements Instancer { if (i != j) { D element = data.get(i); data.set(j, element); - element.dirty = true; + // Marking the data dirty marks us dirty too. + // Perhaps there will be some wasted cycles, but the JVM should be able to + // generate code that moves the repeated segment out of the loop. + element.markDirty(); } } - anyToUpdate = true; - data.subList(newSize, oldSize) .clear(); } private D _add(D instanceData) { - instanceData.owner = this; + instanceData.setOwner(this); - instanceData.dirty = true; - anyToUpdate = true; + instanceData.markDirty(); synchronized (data) { data.add(instanceData); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/Engine.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/Engine.java new file mode 100644 index 000000000..430c7e841 --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/Engine.java @@ -0,0 +1,6 @@ +package com.jozufozu.flywheel.backend.instancing; + +import com.jozufozu.flywheel.backend.api.MaterialManager; + +public interface Engine extends RenderDispatcher, MaterialManager { +} diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceData.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceData.java deleted file mode 100644 index 5379822de..000000000 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceData.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.jozufozu.flywheel.backend.instancing; - -public abstract class InstanceData { - - Instancer owner; - - boolean dirty; - boolean removed; - - public void markDirty() { - owner.markDirty(this); - } - - public void delete() { - owner.markRemoval(this); - } - -} diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceManager.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceManager.java index 535357ff3..6e527f91a 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceManager.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceManager.java @@ -9,8 +9,10 @@ import java.util.Set; import javax.annotation.Nullable; import com.jozufozu.flywheel.backend.Backend; -import com.jozufozu.flywheel.backend.material.MaterialManager; -import com.jozufozu.flywheel.backend.material.instancing.InstancingEngine; +import com.jozufozu.flywheel.backend.api.instance.IDynamicInstance; +import com.jozufozu.flywheel.backend.api.instance.ITickableInstance; +import com.jozufozu.flywheel.backend.api.MaterialManager; +import com.jozufozu.flywheel.backend.instancing.instancing.InstancingEngine; import com.jozufozu.flywheel.light.LightUpdater; import com.mojang.math.Vector3f; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceWorld.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceWorld.java index f35437895..404ac47c8 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceWorld.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceWorld.java @@ -1,10 +1,11 @@ package com.jozufozu.flywheel.backend.instancing; +import com.jozufozu.flywheel.backend.api.instance.IDynamicInstance; +import com.jozufozu.flywheel.backend.api.instance.ITickableInstance; import com.jozufozu.flywheel.backend.instancing.entity.EntityInstanceManager; import com.jozufozu.flywheel.backend.instancing.tile.TileInstanceManager; -import com.jozufozu.flywheel.backend.material.Engine; -import com.jozufozu.flywheel.backend.material.batching.BatchingEngine; -import com.jozufozu.flywheel.backend.material.instancing.InstancingEngine; +import com.jozufozu.flywheel.backend.instancing.batching.BatchingEngine; +import com.jozufozu.flywheel.backend.instancing.instancing.InstancingEngine; import com.jozufozu.flywheel.core.Contexts; import com.jozufozu.flywheel.core.shader.WorldProgram; import com.jozufozu.flywheel.event.BeginFrameEvent; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstancedRenderRegistry.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstancedRenderRegistry.java index cbafe6398..3beaac245 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstancedRenderRegistry.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstancedRenderRegistry.java @@ -5,11 +5,12 @@ import java.util.Map; import javax.annotation.Nullable; import com.google.common.collect.Maps; +import com.jozufozu.flywheel.backend.api.FlywheelRendered; import com.jozufozu.flywheel.backend.instancing.entity.EntityInstance; import com.jozufozu.flywheel.backend.instancing.entity.IEntityInstanceFactory; import com.jozufozu.flywheel.backend.instancing.tile.ITileInstanceFactory; import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance; -import com.jozufozu.flywheel.backend.material.MaterialManager; +import com.jozufozu.flywheel.backend.api.MaterialManager; import it.unimi.dsi.fastutil.objects.Object2BooleanLinkedOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2BooleanMap; @@ -34,11 +35,11 @@ public class InstancedRenderRegistry { } public boolean shouldSkipRender(T type) { - return _skipRender(type.getType()) || ((type instanceof IInstanceRendered) && !((IInstanceRendered) type).shouldRenderNormally()); + return _skipRender(type.getType()) || ((type instanceof FlywheelRendered) && !((FlywheelRendered) type).shouldRenderNormally()); } public boolean shouldSkipRender(T type) { - return _skipRender(type.getType()) || ((type instanceof IInstanceRendered) && !((IInstanceRendered) type).shouldRenderNormally()); + return _skipRender(type.getType()) || ((type instanceof FlywheelRendered) && !((FlywheelRendered) type).shouldRenderNormally()); } public boolean canInstance(BlockEntityType type) { diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/RenderDispatcher.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/RenderDispatcher.java similarity index 67% rename from src/main/java/com/jozufozu/flywheel/backend/material/RenderDispatcher.java rename to src/main/java/com/jozufozu/flywheel/backend/instancing/RenderDispatcher.java index a528d0f0f..fd4681dd1 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/material/RenderDispatcher.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/RenderDispatcher.java @@ -1,6 +1,5 @@ -package com.jozufozu.flywheel.backend.material; +package com.jozufozu.flywheel.backend.instancing; -import com.jozufozu.flywheel.backend.state.RenderLayer; import com.jozufozu.flywheel.event.RenderLayerEvent; import net.minecraft.client.Camera; @@ -10,8 +9,8 @@ public interface RenderDispatcher { /** * Render every model for every material. * - * @param layer Which of the 3 {@link RenderLayer render layers} is being drawn? - * @param viewProjection How do we get from camera space to clip space? + * @param event Context for rendering. + * @param buffers The buffer source for which batched rendering should happen. */ void render(RenderLayerEvent event, MultiBufferSource buffers); diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/batching/BatchedMaterial.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterial.java similarity index 66% rename from src/main/java/com/jozufozu/flywheel/backend/material/batching/BatchedMaterial.java rename to src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterial.java index 96a93766a..5956ea04f 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/material/batching/BatchedMaterial.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterial.java @@ -1,16 +1,15 @@ -package com.jozufozu.flywheel.backend.material.batching; +package com.jozufozu.flywheel.backend.instancing.batching; import java.util.HashMap; import java.util.Map; import java.util.function.Supplier; -import com.jozufozu.flywheel.backend.instancing.CPUInstancer; -import com.jozufozu.flywheel.backend.instancing.InstanceData; -import com.jozufozu.flywheel.backend.instancing.Instancer; -import com.jozufozu.flywheel.backend.material.Material; -import com.jozufozu.flywheel.backend.material.MaterialSpec; +import com.jozufozu.flywheel.backend.api.InstanceData; +import com.jozufozu.flywheel.backend.api.Instancer; +import com.jozufozu.flywheel.backend.api.Material; +import com.jozufozu.flywheel.backend.api.MaterialSpec; import com.jozufozu.flywheel.backend.struct.StructType; -import com.jozufozu.flywheel.core.model.IModel; +import com.jozufozu.flywheel.core.model.Model; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; @@ -26,7 +25,7 @@ public class BatchedMaterial implements Material { } @Override - public Instancer model(Object key, Supplier modelSupplier) { + public Instancer model(Object key, Supplier modelSupplier) { return models.computeIfAbsent(key, $ -> new CPUInstancer<>(type, modelSupplier.get())); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/batching/BatchedMaterialGroup.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterialGroup.java similarity index 84% rename from src/main/java/com/jozufozu/flywheel/backend/material/batching/BatchedMaterialGroup.java rename to src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterialGroup.java index b843897dd..0226aee2b 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/material/batching/BatchedMaterialGroup.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterialGroup.java @@ -1,11 +1,11 @@ -package com.jozufozu.flywheel.backend.material.batching; +package com.jozufozu.flywheel.backend.instancing.batching; import java.util.HashMap; import java.util.Map; -import com.jozufozu.flywheel.backend.instancing.InstanceData; -import com.jozufozu.flywheel.backend.material.MaterialGroup; -import com.jozufozu.flywheel.backend.material.MaterialSpec; +import com.jozufozu.flywheel.backend.api.InstanceData; +import com.jozufozu.flywheel.backend.api.MaterialGroup; +import com.jozufozu.flywheel.backend.api.MaterialSpec; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/batching/BatchingEngine.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchingEngine.java similarity index 84% rename from src/main/java/com/jozufozu/flywheel/backend/material/batching/BatchingEngine.java rename to src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchingEngine.java index c7d0d3354..f5dc0bd12 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/material/batching/BatchingEngine.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchingEngine.java @@ -1,12 +1,12 @@ -package com.jozufozu.flywheel.backend.material.batching; +package com.jozufozu.flywheel.backend.instancing.batching; import java.util.EnumMap; import java.util.HashMap; import java.util.Map; -import com.jozufozu.flywheel.backend.material.Engine; -import com.jozufozu.flywheel.backend.material.MaterialGroup; -import com.jozufozu.flywheel.backend.state.RenderLayer; +import com.jozufozu.flywheel.backend.instancing.Engine; +import com.jozufozu.flywheel.backend.api.MaterialGroup; +import com.jozufozu.flywheel.backend.RenderLayer; import com.jozufozu.flywheel.event.RenderLayerEvent; import net.minecraft.client.Camera; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/CPUInstancer.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/CPUInstancer.java similarity index 66% rename from src/main/java/com/jozufozu/flywheel/backend/instancing/CPUInstancer.java rename to src/main/java/com/jozufozu/flywheel/backend/instancing/batching/CPUInstancer.java index eadfa9db8..6bec6f210 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/CPUInstancer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/CPUInstancer.java @@ -1,8 +1,10 @@ -package com.jozufozu.flywheel.backend.instancing; +package com.jozufozu.flywheel.backend.instancing.batching; +import com.jozufozu.flywheel.backend.instancing.AbstractInstancer; +import com.jozufozu.flywheel.backend.api.InstanceData; import com.jozufozu.flywheel.backend.struct.BatchingTransformer; import com.jozufozu.flywheel.backend.struct.StructType; -import com.jozufozu.flywheel.core.model.IModel; +import com.jozufozu.flywheel.core.model.Model; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; @@ -10,13 +12,18 @@ public class CPUInstancer extends AbstractInstancer { private final BatchingTransformer renderer; - public CPUInstancer(StructType type, IModel modelData) { + public CPUInstancer(StructType type, Model modelData) { super(type, modelData); renderer = type.asBatched() .getTransformer(modelData); } + @Override + public void notifyDirty() { + // noop + } + public void drawAll(PoseStack stack, VertexConsumer buffer) { if (renderer == null) { return; @@ -34,6 +41,6 @@ public class CPUInstancer extends AbstractInstancer { removeDeletedInstances(); } - anyToRemove = anyToUpdate = false; + anyToRemove = false; } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/batching/package-info.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/package-info.java similarity index 74% rename from src/main/java/com/jozufozu/flywheel/backend/material/batching/package-info.java rename to src/main/java/com/jozufozu/flywheel/backend/instancing/batching/package-info.java index c9e565892..0a8a7db98 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/material/batching/package-info.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/package-info.java @@ -1,5 +1,5 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -package com.jozufozu.flywheel.backend.material.batching; +package com.jozufozu.flywheel.backend.instancing.batching; import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstance.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstance.java index 76970613f..ba4dd05cb 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstance.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstance.java @@ -1,13 +1,13 @@ package com.jozufozu.flywheel.backend.instancing.entity; import com.jozufozu.flywheel.backend.instancing.AbstractInstance; -import com.jozufozu.flywheel.backend.instancing.IDynamicInstance; -import com.jozufozu.flywheel.backend.instancing.ITickableInstance; +import com.jozufozu.flywheel.backend.api.instance.IDynamicInstance; +import com.jozufozu.flywheel.backend.api.instance.ITickableInstance; import com.jozufozu.flywheel.backend.instancing.tile.TileInstanceManager; -import com.jozufozu.flywheel.backend.material.MaterialManager; +import com.jozufozu.flywheel.backend.api.MaterialManager; import com.jozufozu.flywheel.light.GridAlignedBB; -import com.jozufozu.flywheel.light.ILightUpdateListener; -import com.jozufozu.flywheel.light.IMovingListener; +import com.jozufozu.flywheel.light.LightListener; +import com.jozufozu.flywheel.light.MovingListener; import com.jozufozu.flywheel.light.LightProvider; import com.mojang.math.Vector3f; @@ -34,7 +34,7 @@ import net.minecraft.world.phys.Vec3; * * @param The type of {@link Entity} your class is an instance of. */ -public abstract class EntityInstance extends AbstractInstance implements ILightUpdateListener, IMovingListener { +public abstract class EntityInstance extends AbstractInstance implements LightListener, MovingListener { protected final E entity; protected final GridAlignedBB bounds; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstanceManager.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstanceManager.java index cb3759e5b..a9b2d87a8 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstanceManager.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstanceManager.java @@ -4,7 +4,7 @@ import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.instancing.AbstractInstance; import com.jozufozu.flywheel.backend.instancing.InstanceManager; import com.jozufozu.flywheel.backend.instancing.InstancedRenderRegistry; -import com.jozufozu.flywheel.backend.material.MaterialManager; +import com.jozufozu.flywheel.backend.api.MaterialManager; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.Entity; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/IEntityInstanceFactory.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/IEntityInstanceFactory.java index 67d5a0257..07db1b55e 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/IEntityInstanceFactory.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/IEntityInstanceFactory.java @@ -1,6 +1,6 @@ package com.jozufozu.flywheel.backend.instancing.entity; -import com.jozufozu.flywheel.backend.material.MaterialManager; +import com.jozufozu.flywheel.backend.api.MaterialManager; import net.minecraft.world.entity.Entity; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/GPUInstancer.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/GPUInstancer.java similarity index 91% rename from src/main/java/com/jozufozu/flywheel/backend/instancing/GPUInstancer.java rename to src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/GPUInstancer.java index 656741057..f4ec37828 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/GPUInstancer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/GPUInstancer.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.backend.instancing; +package com.jozufozu.flywheel.backend.instancing.instancing; import java.util.BitSet; @@ -9,11 +9,13 @@ import com.jozufozu.flywheel.backend.gl.buffer.GlBuffer; import com.jozufozu.flywheel.backend.gl.buffer.GlBufferType; import com.jozufozu.flywheel.backend.gl.buffer.MappedBuffer; import com.jozufozu.flywheel.backend.gl.error.GlError; +import com.jozufozu.flywheel.backend.instancing.AbstractInstancer; +import com.jozufozu.flywheel.backend.api.InstanceData; import com.jozufozu.flywheel.backend.model.IBufferedModel; import com.jozufozu.flywheel.backend.model.ModelAllocator; import com.jozufozu.flywheel.backend.struct.StructType; import com.jozufozu.flywheel.backend.struct.StructWriter; -import com.jozufozu.flywheel.core.model.IModel; +import com.jozufozu.flywheel.core.model.Model; import com.jozufozu.flywheel.util.AttribUtil; public class GPUInstancer extends AbstractInstancer { @@ -29,12 +31,19 @@ public class GPUInstancer extends AbstractInstancer { private boolean deleted; private boolean initialized; - public GPUInstancer(StructType type, IModel model, ModelAllocator modelAllocator) { + protected boolean anyToUpdate; + + public GPUInstancer(StructType type, Model model, ModelAllocator modelAllocator) { super(type, model); this.modelAllocator = modelAllocator; this.instanceFormat = type.format(); } + @Override + public void notifyDirty() { + anyToUpdate = true; + } + public void render() { if (invalid()) return; diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancedMaterial.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterial.java similarity index 78% rename from src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancedMaterial.java rename to src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterial.java index c0704162f..335a1bbeb 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancedMaterial.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterial.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.backend.material.instancing; +package com.jozufozu.flywheel.backend.instancing.instancing; import java.util.concurrent.ExecutionException; import java.util.function.Supplier; @@ -6,14 +6,14 @@ import java.util.function.Supplier; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.jozufozu.flywheel.backend.RenderWork; -import com.jozufozu.flywheel.backend.instancing.GPUInstancer; -import com.jozufozu.flywheel.backend.instancing.InstanceData; -import com.jozufozu.flywheel.backend.instancing.Instancer; -import com.jozufozu.flywheel.backend.material.Material; -import com.jozufozu.flywheel.backend.material.MaterialSpec; +import com.jozufozu.flywheel.backend.api.InstanceData; +import com.jozufozu.flywheel.backend.api.Instancer; +import com.jozufozu.flywheel.backend.api.Material; +import com.jozufozu.flywheel.backend.api.MaterialSpec; import com.jozufozu.flywheel.backend.model.ModelPool; import com.jozufozu.flywheel.backend.struct.StructType; -import com.jozufozu.flywheel.core.model.IModel; +import com.jozufozu.flywheel.core.Formats; +import com.jozufozu.flywheel.core.model.Model; /** * A collection of Instancers that all have the same format. @@ -28,7 +28,7 @@ public class InstancedMaterial implements Material { public InstancedMaterial(MaterialSpec spec) { this.type = spec.getInstanceType(); - modelPool = new ModelPool(spec.getModelFormat(), 64); + modelPool = new ModelPool(Formats.UNLIT_MODEL, 64); this.models = CacheBuilder.newBuilder() .removalListener(notification -> { GPUInstancer instancer = (GPUInstancer) notification.getValue(); @@ -45,7 +45,7 @@ public class InstancedMaterial implements Material { * @return An instancer for the given model, capable of rendering many copies for little cost. */ @Override - public Instancer model(Object key, Supplier modelSupplier) { + public Instancer model(Object key, Supplier modelSupplier) { try { return models.get(key, () -> new GPUInstancer<>(type, modelSupplier.get(), modelPool)); } catch (ExecutionException e) { diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancedMaterialGroup.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterialGroup.java similarity index 90% rename from src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancedMaterialGroup.java rename to src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterialGroup.java index 5716034d0..31d604fdb 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancedMaterialGroup.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterialGroup.java @@ -1,12 +1,12 @@ -package com.jozufozu.flywheel.backend.material.instancing; +package com.jozufozu.flywheel.backend.instancing.instancing; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; -import com.jozufozu.flywheel.backend.instancing.InstanceData; -import com.jozufozu.flywheel.backend.material.MaterialGroup; -import com.jozufozu.flywheel.backend.material.MaterialSpec; +import com.jozufozu.flywheel.backend.api.InstanceData; +import com.jozufozu.flywheel.backend.api.MaterialGroup; +import com.jozufozu.flywheel.backend.api.MaterialSpec; import com.jozufozu.flywheel.core.shader.WorldProgram; import com.jozufozu.flywheel.util.TextureBinder; import com.mojang.math.Matrix4f; diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancedMaterialRenderer.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterialRenderer.java similarity index 91% rename from src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancedMaterialRenderer.java rename to src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterialRenderer.java index ac8c64e16..9d52ea695 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancedMaterialRenderer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterialRenderer.java @@ -1,10 +1,9 @@ -package com.jozufozu.flywheel.backend.material.instancing; +package com.jozufozu.flywheel.backend.instancing.instancing; import java.util.Collection; import java.util.function.Consumer; import java.util.function.Supplier; -import com.jozufozu.flywheel.backend.instancing.GPUInstancer; import com.jozufozu.flywheel.core.shader.WorldProgram; import com.mojang.math.Matrix4f; diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancingEngine.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancingEngine.java similarity index 96% rename from src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancingEngine.java rename to src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancingEngine.java index 05a8de155..142531319 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/material/instancing/InstancingEngine.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancingEngine.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.backend.material.instancing; +package com.jozufozu.flywheel.backend.instancing.instancing; import java.util.EnumMap; import java.util.HashMap; @@ -10,9 +10,9 @@ import javax.annotation.Nullable; import com.jozufozu.flywheel.backend.gl.GlVertexArray; import com.jozufozu.flywheel.backend.gl.buffer.GlBufferType; -import com.jozufozu.flywheel.backend.material.Engine; -import com.jozufozu.flywheel.backend.material.MaterialGroup; -import com.jozufozu.flywheel.backend.state.RenderLayer; +import com.jozufozu.flywheel.backend.instancing.Engine; +import com.jozufozu.flywheel.backend.api.MaterialGroup; +import com.jozufozu.flywheel.backend.RenderLayer; import com.jozufozu.flywheel.core.WorldContext; import com.jozufozu.flywheel.core.shader.WorldProgram; import com.jozufozu.flywheel.event.RenderLayerEvent; diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/instancing/package-info.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/package-info.java similarity index 73% rename from src/main/java/com/jozufozu/flywheel/backend/material/instancing/package-info.java rename to src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/package-info.java index 42283d047..740e8a1a2 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/material/instancing/package-info.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/package-info.java @@ -1,5 +1,5 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -package com.jozufozu.flywheel.backend.material.instancing; +package com.jozufozu.flywheel.backend.instancing.instancing; import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/ITileInstanceFactory.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/ITileInstanceFactory.java index 3f8cdd1b8..672198098 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/ITileInstanceFactory.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/ITileInstanceFactory.java @@ -1,6 +1,6 @@ package com.jozufozu.flywheel.backend.instancing.tile; -import com.jozufozu.flywheel.backend.material.MaterialManager; +import com.jozufozu.flywheel.backend.api.MaterialManager; import net.minecraft.world.level.block.entity.BlockEntity; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/TileEntityInstance.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/TileEntityInstance.java index f79190e8f..29f8ec1d5 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/TileEntityInstance.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/TileEntityInstance.java @@ -1,10 +1,10 @@ package com.jozufozu.flywheel.backend.instancing.tile; import com.jozufozu.flywheel.backend.instancing.AbstractInstance; -import com.jozufozu.flywheel.backend.instancing.IDynamicInstance; -import com.jozufozu.flywheel.backend.instancing.ITickableInstance; -import com.jozufozu.flywheel.backend.material.Material; -import com.jozufozu.flywheel.backend.material.MaterialManager; +import com.jozufozu.flywheel.backend.api.instance.IDynamicInstance; +import com.jozufozu.flywheel.backend.api.instance.ITickableInstance; +import com.jozufozu.flywheel.backend.api.Material; +import com.jozufozu.flywheel.backend.api.MaterialManager; import com.jozufozu.flywheel.core.Materials; import com.jozufozu.flywheel.core.materials.model.ModelData; import com.jozufozu.flywheel.core.materials.oriented.OrientedData; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/TileInstanceManager.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/TileInstanceManager.java index 234c2d7cb..edfcd5d71 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/TileInstanceManager.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/TileInstanceManager.java @@ -4,7 +4,7 @@ import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.instancing.AbstractInstance; import com.jozufozu.flywheel.backend.instancing.InstanceManager; import com.jozufozu.flywheel.backend.instancing.InstancedRenderRegistry; -import com.jozufozu.flywheel.backend.material.MaterialManager; +import com.jozufozu.flywheel.backend.api.MaterialManager; import net.minecraft.core.BlockPos; import net.minecraft.world.level.BlockGetter; diff --git a/src/main/java/com/jozufozu/flywheel/backend/material/Engine.java b/src/main/java/com/jozufozu/flywheel/backend/material/Engine.java deleted file mode 100644 index 215764bfb..000000000 --- a/src/main/java/com/jozufozu/flywheel/backend/material/Engine.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.jozufozu.flywheel.backend.material; - -public interface Engine extends RenderDispatcher, MaterialManager { -} diff --git a/src/main/java/com/jozufozu/flywheel/backend/model/ArrayModelRenderer.java b/src/main/java/com/jozufozu/flywheel/backend/model/ArrayModelRenderer.java index 8ac9bc906..97cfc5da7 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/model/ArrayModelRenderer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/model/ArrayModelRenderer.java @@ -3,14 +3,14 @@ package com.jozufozu.flywheel.backend.model; import java.util.function.Supplier; import com.jozufozu.flywheel.backend.gl.GlVertexArray; -import com.jozufozu.flywheel.core.model.IModel; +import com.jozufozu.flywheel.core.model.Model; import com.jozufozu.flywheel.util.AttribUtil; public class ArrayModelRenderer extends ModelRenderer { protected GlVertexArray vao; - public ArrayModelRenderer(Supplier model) { + public ArrayModelRenderer(Supplier model) { super(model); } @@ -27,7 +27,7 @@ public class ArrayModelRenderer extends ModelRenderer { @Override protected void init() { initialized = true; - IModel model = modelSupplier.get(); + Model model = modelSupplier.get(); if (model.empty()) return; diff --git a/src/main/java/com/jozufozu/flywheel/backend/model/BufferedModel.java b/src/main/java/com/jozufozu/flywheel/backend/model/BufferedModel.java index 7dfb48aef..da8b26bc5 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/model/BufferedModel.java +++ b/src/main/java/com/jozufozu/flywheel/backend/model/BufferedModel.java @@ -10,18 +10,18 @@ import com.jozufozu.flywheel.backend.gl.buffer.GlBuffer; import com.jozufozu.flywheel.backend.gl.buffer.GlBufferType; import com.jozufozu.flywheel.backend.gl.buffer.MappedBuffer; import com.jozufozu.flywheel.backend.gl.buffer.MappedGlBuffer; -import com.jozufozu.flywheel.core.model.IModel; +import com.jozufozu.flywheel.core.model.Model; import com.jozufozu.flywheel.core.model.VecBufferConsumer; import com.jozufozu.flywheel.util.AttribUtil; public class BufferedModel implements IBufferedModel { - protected final IModel model; + protected final Model model; protected final GlPrimitive primitiveMode; protected GlBuffer vbo; protected boolean deleted; - public BufferedModel(GlPrimitive primitiveMode, IModel model) { + public BufferedModel(GlPrimitive primitiveMode, Model model) { this.model = model; this.primitiveMode = primitiveMode; diff --git a/src/main/java/com/jozufozu/flywheel/backend/model/ImmediateAllocator.java b/src/main/java/com/jozufozu/flywheel/backend/model/ImmediateAllocator.java index 7da671ca0..e290549e4 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/model/ImmediateAllocator.java +++ b/src/main/java/com/jozufozu/flywheel/backend/model/ImmediateAllocator.java @@ -1,13 +1,13 @@ package com.jozufozu.flywheel.backend.model; -import com.jozufozu.flywheel.core.model.IModel; +import com.jozufozu.flywheel.core.model.Model; public class ImmediateAllocator implements ModelAllocator { public static final ImmediateAllocator INSTANCE = new ImmediateAllocator(); @Override - public IBufferedModel alloc(IModel model, Callback allocationCallback) { + public IBufferedModel alloc(Model model, Callback allocationCallback) { IndexedModel out = new IndexedModel(model); allocationCallback.onAlloc(out); return out; diff --git a/src/main/java/com/jozufozu/flywheel/backend/model/IndexedModel.java b/src/main/java/com/jozufozu/flywheel/backend/model/IndexedModel.java index 678a9f468..f22818d32 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/model/IndexedModel.java +++ b/src/main/java/com/jozufozu/flywheel/backend/model/IndexedModel.java @@ -4,7 +4,7 @@ import org.lwjgl.opengl.GL20; import org.lwjgl.opengl.GL31; import com.jozufozu.flywheel.backend.gl.GlPrimitive; -import com.jozufozu.flywheel.core.model.IModel; +import com.jozufozu.flywheel.core.model.Model; /** * An indexed triangle model. Just what the driver ordered. @@ -15,7 +15,7 @@ public class IndexedModel extends BufferedModel { protected ElementBuffer ebo; - public IndexedModel(IModel model) { + public IndexedModel(Model model) { super(GlPrimitive.TRIANGLES, model); this.ebo = model.createEBO(); diff --git a/src/main/java/com/jozufozu/flywheel/backend/model/ModelAllocator.java b/src/main/java/com/jozufozu/flywheel/backend/model/ModelAllocator.java index afa45904a..8756f9427 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/model/ModelAllocator.java +++ b/src/main/java/com/jozufozu/flywheel/backend/model/ModelAllocator.java @@ -1,6 +1,6 @@ package com.jozufozu.flywheel.backend.model; -import com.jozufozu.flywheel.core.model.IModel; +import com.jozufozu.flywheel.core.model.Model; public interface ModelAllocator { /** @@ -9,7 +9,7 @@ public interface ModelAllocator { * @param model The model to allocate. * @return A handle to the allocated model. */ - IBufferedModel alloc(IModel model, Callback allocationCallback); + IBufferedModel alloc(Model model, Callback allocationCallback); @FunctionalInterface interface Callback { diff --git a/src/main/java/com/jozufozu/flywheel/backend/model/ModelPool.java b/src/main/java/com/jozufozu/flywheel/backend/model/ModelPool.java index 3ad3bdba3..9c64c6469 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/model/ModelPool.java +++ b/src/main/java/com/jozufozu/flywheel/backend/model/ModelPool.java @@ -11,7 +11,7 @@ import com.jozufozu.flywheel.backend.gl.buffer.GlBuffer; import com.jozufozu.flywheel.backend.gl.buffer.GlBufferType; import com.jozufozu.flywheel.backend.gl.buffer.MappedBuffer; import com.jozufozu.flywheel.backend.gl.buffer.MappedGlBuffer; -import com.jozufozu.flywheel.core.model.IModel; +import com.jozufozu.flywheel.core.model.Model; import com.jozufozu.flywheel.core.model.VecBufferConsumer; import com.jozufozu.flywheel.util.AttribUtil; @@ -49,7 +49,7 @@ public class ModelPool implements ModelAllocator { * @return A handle to the allocated model. */ @Override - public PooledModel alloc(IModel model, Callback callback) { + public PooledModel alloc(Model model, Callback callback) { PooledModel bufferedModel = new PooledModel(model, vertices); bufferedModel.callback = callback; vertices += model.vertexCount(); @@ -158,12 +158,12 @@ public class ModelPool implements ModelAllocator { private final ElementBuffer ebo; private Callback callback; - private final IModel model; + private final Model model; private int first; private boolean remove; - public PooledModel(IModel model, int first) { + public PooledModel(Model model, int first) { this.model = model; this.first = first; ebo = model.createEBO(); diff --git a/src/main/java/com/jozufozu/flywheel/backend/model/ModelRenderer.java b/src/main/java/com/jozufozu/flywheel/backend/model/ModelRenderer.java index 72a11d601..b6802caad 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/model/ModelRenderer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/model/ModelRenderer.java @@ -2,16 +2,16 @@ package com.jozufozu.flywheel.backend.model; import java.util.function.Supplier; -import com.jozufozu.flywheel.core.model.IModel; +import com.jozufozu.flywheel.core.model.Model; public class ModelRenderer { - protected Supplier modelSupplier; + protected Supplier modelSupplier; protected IBufferedModel model; protected boolean initialized; - public ModelRenderer(Supplier modelSupplier) { + public ModelRenderer(Supplier modelSupplier) { this.modelSupplier = modelSupplier; } @@ -34,7 +34,7 @@ public class ModelRenderer { protected void init() { initialized = true; - IModel model = modelSupplier.get(); + Model model = modelSupplier.get(); if (model.empty()) return; diff --git a/src/main/java/com/jozufozu/flywheel/backend/pipeline/IShaderPipeline.java b/src/main/java/com/jozufozu/flywheel/backend/pipeline/ShaderPipeline.java similarity index 64% rename from src/main/java/com/jozufozu/flywheel/backend/pipeline/IShaderPipeline.java rename to src/main/java/com/jozufozu/flywheel/backend/pipeline/ShaderPipeline.java index 370281fcd..0caa59d57 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/pipeline/IShaderPipeline.java +++ b/src/main/java/com/jozufozu/flywheel/backend/pipeline/ShaderPipeline.java @@ -1,6 +1,6 @@ package com.jozufozu.flywheel.backend.pipeline; -import com.jozufozu.flywheel.core.shader.IMultiProgram; +import com.jozufozu.flywheel.core.shader.ContextAwareProgram; import com.jozufozu.flywheel.core.shader.WorldProgram; import com.jozufozu.flywheel.core.shader.spec.ProgramSpec; @@ -8,8 +8,8 @@ import com.jozufozu.flywheel.core.shader.spec.ProgramSpec; * The main interface for compiling usable shaders from program specs. * @param

the type of the program that this pipeline compiles. */ -public interface IShaderPipeline

{ +public interface ShaderPipeline

{ - IMultiProgram

compile(ProgramSpec spec); + ContextAwareProgram

compile(ProgramSpec spec); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/pipeline/WorldShaderPipeline.java b/src/main/java/com/jozufozu/flywheel/backend/pipeline/WorldShaderPipeline.java index d961f0646..985a60ad7 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/pipeline/WorldShaderPipeline.java +++ b/src/main/java/com/jozufozu/flywheel/backend/pipeline/WorldShaderPipeline.java @@ -9,14 +9,14 @@ import com.jozufozu.flywheel.backend.source.FileResolution; import com.jozufozu.flywheel.backend.source.SourceFile; import com.jozufozu.flywheel.core.shader.ExtensibleGlProgram; import com.jozufozu.flywheel.core.shader.GameStateProgram; -import com.jozufozu.flywheel.core.shader.IMultiProgram; +import com.jozufozu.flywheel.core.shader.ContextAwareProgram; import com.jozufozu.flywheel.core.shader.WorldProgram; import com.jozufozu.flywheel.core.shader.spec.ProgramSpec; import com.jozufozu.flywheel.core.shader.spec.ProgramState; import net.minecraft.resources.ResourceLocation; -public class WorldShaderPipeline

implements IShaderPipeline

{ +public class WorldShaderPipeline

implements ShaderPipeline

{ private final ExtensibleGlProgram.Factory

factory; @@ -29,14 +29,14 @@ public class WorldShaderPipeline

implements IShaderPipel this.header = header; } - public IMultiProgram

compile(ProgramSpec spec) { + public ContextAwareProgram

compile(ProgramSpec spec) { SourceFile file = spec.getSource().getFile(); return compile(spec.name, file, spec.getStates()); } - public IMultiProgram

compile(ResourceLocation name, SourceFile file, List variants) { + public ContextAwareProgram

compile(ResourceLocation name, SourceFile file, List variants) { WorldShader shader = new WorldShader(name, template, header) .setMainSource(file); diff --git a/src/main/java/com/jozufozu/flywheel/backend/struct/Batched.java b/src/main/java/com/jozufozu/flywheel/backend/struct/Batched.java index d3b1f6724..687dd933e 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/struct/Batched.java +++ b/src/main/java/com/jozufozu/flywheel/backend/struct/Batched.java @@ -1,10 +1,10 @@ package com.jozufozu.flywheel.backend.struct; -import com.jozufozu.flywheel.core.model.IModel; +import com.jozufozu.flywheel.core.model.Model; public interface Batched extends StructType { - BatchingTransformer getTransformer(IModel model); + BatchingTransformer getTransformer(Model model); @Override default Batched asBatched() { diff --git a/src/main/java/com/jozufozu/flywheel/core/Contexts.java b/src/main/java/com/jozufozu/flywheel/core/Contexts.java index e1ee8b002..49821aaf9 100644 --- a/src/main/java/com/jozufozu/flywheel/core/Contexts.java +++ b/src/main/java/com/jozufozu/flywheel/core/Contexts.java @@ -3,7 +3,7 @@ package com.jozufozu.flywheel.core; import com.jozufozu.flywheel.Flywheel; import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.GameStateRegistry; -import com.jozufozu.flywheel.backend.pipeline.IShaderPipeline; +import com.jozufozu.flywheel.backend.pipeline.ShaderPipeline; import com.jozufozu.flywheel.backend.pipeline.InstancingTemplate; import com.jozufozu.flywheel.backend.pipeline.WorldShaderPipeline; import com.jozufozu.flywheel.backend.source.FileResolution; @@ -32,8 +32,8 @@ public class Contexts { FileResolution crumblingBuiltins = Resolver.INSTANCE.findShader(ResourceUtil.subPath(Names.CRUMBLING, ".glsl")); FileResolution worldBuiltins = Resolver.INSTANCE.findShader(ResourceUtil.subPath(Names.WORLD, ".glsl")); - IShaderPipeline crumblingPipeline = new WorldShaderPipeline<>(CrumblingProgram::new, InstancingTemplate.INSTANCE, crumblingBuiltins); - IShaderPipeline worldPipeline = new WorldShaderPipeline<>(WorldProgram::new, InstancingTemplate.INSTANCE, worldBuiltins); + ShaderPipeline crumblingPipeline = new WorldShaderPipeline<>(CrumblingProgram::new, InstancingTemplate.INSTANCE, crumblingBuiltins); + ShaderPipeline worldPipeline = new WorldShaderPipeline<>(WorldProgram::new, InstancingTemplate.INSTANCE, worldBuiltins); CRUMBLING = backend.register(WorldContext.builder(backend, Names.CRUMBLING).build(crumblingPipeline)); WORLD = backend.register(WorldContext.builder(backend, Names.WORLD).build(worldPipeline)); diff --git a/src/main/java/com/jozufozu/flywheel/core/Materials.java b/src/main/java/com/jozufozu/flywheel/core/Materials.java index 2103fe812..b5efeee81 100644 --- a/src/main/java/com/jozufozu/flywheel/core/Materials.java +++ b/src/main/java/com/jozufozu/flywheel/core/Materials.java @@ -1,6 +1,6 @@ package com.jozufozu.flywheel.core; -import com.jozufozu.flywheel.backend.material.MaterialSpec; +import com.jozufozu.flywheel.backend.api.MaterialSpec; import com.jozufozu.flywheel.backend.struct.StructType; import com.jozufozu.flywheel.core.materials.model.ModelData; import com.jozufozu.flywheel.core.materials.model.ModelType; @@ -17,8 +17,8 @@ public class Materials { public static final StructType ORIENTED_TYPE = new OrientedType(); public static final StructType TRANSFORMED_TYPE = new ModelType(); - public static final MaterialSpec ORIENTED = new MaterialSpec<>(Names.ORIENTED, Programs.ORIENTED, Formats.UNLIT_MODEL, ORIENTED_TYPE); - public static final MaterialSpec TRANSFORMED = new MaterialSpec<>(Names.MODEL, Programs.TRANSFORMED, Formats.UNLIT_MODEL, TRANSFORMED_TYPE); + public static final MaterialSpec ORIENTED = new MaterialSpec<>(Names.ORIENTED, Programs.ORIENTED, ORIENTED_TYPE); + public static final MaterialSpec TRANSFORMED = new MaterialSpec<>(Names.MODEL, Programs.TRANSFORMED, TRANSFORMED_TYPE); public static void flwInit(GatherContextEvent event) { event.getBackend() diff --git a/src/main/java/com/jozufozu/flywheel/core/WorldContext.java b/src/main/java/com/jozufozu/flywheel/core/WorldContext.java index 063d8d27a..170b9e10c 100644 --- a/src/main/java/com/jozufozu/flywheel/core/WorldContext.java +++ b/src/main/java/com/jozufozu/flywheel/core/WorldContext.java @@ -6,24 +6,24 @@ import java.util.function.Supplier; import java.util.stream.Stream; import com.jozufozu.flywheel.backend.Backend; -import com.jozufozu.flywheel.backend.IShaderContext; -import com.jozufozu.flywheel.backend.material.MaterialSpec; -import com.jozufozu.flywheel.backend.pipeline.IShaderPipeline; -import com.jozufozu.flywheel.core.shader.IMultiProgram; +import com.jozufozu.flywheel.backend.ShaderContext; +import com.jozufozu.flywheel.backend.api.MaterialSpec; +import com.jozufozu.flywheel.backend.pipeline.ShaderPipeline; +import com.jozufozu.flywheel.core.shader.ContextAwareProgram; import com.jozufozu.flywheel.core.shader.WorldProgram; import com.jozufozu.flywheel.core.shader.spec.ProgramSpec; import net.minecraft.resources.ResourceLocation; -public class WorldContext

implements IShaderContext

{ +public class WorldContext

implements ShaderContext

{ public final Backend backend; - protected final Map> programs = new HashMap<>(); + protected final Map> programs = new HashMap<>(); protected final ResourceLocation name; protected final Supplier> specStream; - public final IShaderPipeline

pipeline; + public final ShaderPipeline

pipeline; - public WorldContext(Backend backend, ResourceLocation name, Supplier> specStream, IShaderPipeline

pipeline) { + public WorldContext(Backend backend, ResourceLocation name, Supplier> specStream, ShaderPipeline

pipeline) { this.backend = backend; this.name = name; this.specStream = specStream; @@ -61,7 +61,7 @@ public class WorldContext

implements IShaderContext

{ @Override public void delete() { programs.values() - .forEach(IMultiProgram::delete); + .forEach(ContextAwareProgram::delete); programs.clear(); } @@ -84,7 +84,7 @@ public class WorldContext

implements IShaderContext

{ return this; } - public

WorldContext

build(IShaderPipeline

pipeline) { + public

WorldContext

build(ShaderPipeline

pipeline) { if (specStream == null) { specStream = () -> backend.allMaterials() .stream() diff --git a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingGroup.java b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingGroup.java index c53db3b8a..a5093fbe5 100644 --- a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingGroup.java +++ b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingGroup.java @@ -1,8 +1,8 @@ package com.jozufozu.flywheel.core.crumbling; -import com.jozufozu.flywheel.backend.material.instancing.InstancedMaterialGroup; -import com.jozufozu.flywheel.backend.material.instancing.InstancingEngine; -import com.jozufozu.flywheel.backend.material.instancing.InstancedMaterialRenderer; +import com.jozufozu.flywheel.backend.instancing.instancing.InstancedMaterialGroup; +import com.jozufozu.flywheel.backend.instancing.instancing.InstancingEngine; +import com.jozufozu.flywheel.backend.instancing.instancing.InstancedMaterialRenderer; import com.jozufozu.flywheel.core.atlas.AtlasInfo; import com.jozufozu.flywheel.core.atlas.SheetData; import com.jozufozu.flywheel.util.RenderTextures; @@ -11,7 +11,6 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.math.Matrix4f; import net.minecraft.client.renderer.RenderType; -import net.minecraft.resources.ResourceLocation; public class CrumblingGroup

extends InstancedMaterialGroup

{ diff --git a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingInstanceManager.java b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingInstanceManager.java index 75e75247c..57fde613b 100644 --- a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingInstanceManager.java +++ b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingInstanceManager.java @@ -1,7 +1,7 @@ package com.jozufozu.flywheel.core.crumbling; import com.jozufozu.flywheel.backend.instancing.tile.TileInstanceManager; -import com.jozufozu.flywheel.backend.material.MaterialManager; +import com.jozufozu.flywheel.backend.api.MaterialManager; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingRenderer.java b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingRenderer.java index 2844df589..f15d3ea91 100644 --- a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingRenderer.java +++ b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingRenderer.java @@ -7,7 +7,7 @@ import java.util.SortedSet; import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.gl.GlTextureUnit; import com.jozufozu.flywheel.backend.instancing.InstanceManager; -import com.jozufozu.flywheel.backend.material.instancing.InstancingEngine; +import com.jozufozu.flywheel.backend.instancing.instancing.InstancingEngine; import com.jozufozu.flywheel.core.Contexts; import com.jozufozu.flywheel.event.ReloadRenderersEvent; import com.jozufozu.flywheel.event.RenderLayerEvent; diff --git a/src/main/java/com/jozufozu/flywheel/core/instancing/ConditionalInstance.java b/src/main/java/com/jozufozu/flywheel/core/instancing/ConditionalInstance.java index 251b00db6..0aa08d052 100644 --- a/src/main/java/com/jozufozu/flywheel/core/instancing/ConditionalInstance.java +++ b/src/main/java/com/jozufozu/flywheel/core/instancing/ConditionalInstance.java @@ -5,8 +5,8 @@ import java.util.function.Consumer; import javax.annotation.Nullable; -import com.jozufozu.flywheel.backend.instancing.InstanceData; -import com.jozufozu.flywheel.backend.instancing.Instancer; +import com.jozufozu.flywheel.backend.api.InstanceData; +import com.jozufozu.flywheel.backend.api.Instancer; public class ConditionalInstance { diff --git a/src/main/java/com/jozufozu/flywheel/core/instancing/GroupInstance.java b/src/main/java/com/jozufozu/flywheel/core/instancing/GroupInstance.java index c9084b6c0..8bcc6e078 100644 --- a/src/main/java/com/jozufozu/flywheel/core/instancing/GroupInstance.java +++ b/src/main/java/com/jozufozu/flywheel/core/instancing/GroupInstance.java @@ -5,8 +5,8 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import com.jozufozu.flywheel.backend.instancing.InstanceData; -import com.jozufozu.flywheel.backend.instancing.Instancer; +import com.jozufozu.flywheel.backend.api.InstanceData; +import com.jozufozu.flywheel.backend.api.Instancer; public class GroupInstance extends AbstractCollection { diff --git a/src/main/java/com/jozufozu/flywheel/core/instancing/SelectInstance.java b/src/main/java/com/jozufozu/flywheel/core/instancing/SelectInstance.java index c865c4c0b..cc848b73a 100644 --- a/src/main/java/com/jozufozu/flywheel/core/instancing/SelectInstance.java +++ b/src/main/java/com/jozufozu/flywheel/core/instancing/SelectInstance.java @@ -6,8 +6,8 @@ import java.util.Optional; import javax.annotation.Nullable; -import com.jozufozu.flywheel.backend.instancing.InstanceData; -import com.jozufozu.flywheel.backend.instancing.Instancer; +import com.jozufozu.flywheel.backend.api.InstanceData; +import com.jozufozu.flywheel.backend.api.Instancer; public class SelectInstance { diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/BasicData.java b/src/main/java/com/jozufozu/flywheel/core/materials/BasicData.java index eed1208bd..77512d886 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/BasicData.java +++ b/src/main/java/com/jozufozu/flywheel/core/materials/BasicData.java @@ -1,8 +1,8 @@ package com.jozufozu.flywheel.core.materials; -import com.jozufozu.flywheel.backend.instancing.InstanceData; +import com.jozufozu.flywheel.backend.api.InstanceData; -public abstract class BasicData extends InstanceData implements IFlatLight { +public abstract class BasicData extends InstanceData implements FlatLit { public byte blockLight; public byte skyLight; diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/IFlatLight.java b/src/main/java/com/jozufozu/flywheel/core/materials/FlatLit.java similarity index 85% rename from src/main/java/com/jozufozu/flywheel/core/materials/IFlatLight.java rename to src/main/java/com/jozufozu/flywheel/core/materials/FlatLit.java index 93c90dbea..d9d4b2010 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/IFlatLight.java +++ b/src/main/java/com/jozufozu/flywheel/core/materials/FlatLit.java @@ -1,6 +1,6 @@ package com.jozufozu.flywheel.core.materials; -import com.jozufozu.flywheel.backend.instancing.InstanceData; +import com.jozufozu.flywheel.backend.api.InstanceData; /** * An interface that implementors of {@link InstanceData} should also implement @@ -10,7 +10,7 @@ import com.jozufozu.flywheel.backend.instancing.InstanceData; * * @param The name of the class that implements this interface. */ -public interface IFlatLight> { +public interface FlatLit> { /** * @param blockLight An integer in the range [0, 15] representing the * amount of block light this instance should receive. diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelTransformer.java b/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelTransformer.java index 941df358b..bfa0a1ac6 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelTransformer.java +++ b/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelTransformer.java @@ -1,10 +1,10 @@ package com.jozufozu.flywheel.core.materials.model; import com.jozufozu.flywheel.backend.struct.BatchingTransformer; -import com.jozufozu.flywheel.core.model.IModel; +import com.jozufozu.flywheel.core.model.Model; public class ModelTransformer extends BatchingTransformer { - public ModelTransformer(IModel model) { + public ModelTransformer(Model model) { //model.buffer(); diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelType.java b/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelType.java index 9074fdf50..ff99dc97b 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelType.java +++ b/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelType.java @@ -8,7 +8,7 @@ import com.jozufozu.flywheel.backend.struct.StructWriter; import com.jozufozu.flywheel.backend.struct.Writeable; import com.jozufozu.flywheel.core.Formats; import com.jozufozu.flywheel.core.materials.model.writer.UnsafeModelWriter; -import com.jozufozu.flywheel.core.model.IModel; +import com.jozufozu.flywheel.core.model.Model; public class ModelType implements Writeable, Batched { @@ -28,7 +28,7 @@ public class ModelType implements Writeable, Batched { } @Override - public BatchingTransformer getTransformer(IModel model) { + public BatchingTransformer getTransformer(Model model) { return null; } } diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedType.java b/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedType.java index 468bbb597..5019cd61d 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedType.java +++ b/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedType.java @@ -8,7 +8,7 @@ import com.jozufozu.flywheel.backend.struct.StructWriter; import com.jozufozu.flywheel.backend.struct.Writeable; import com.jozufozu.flywheel.core.Formats; import com.jozufozu.flywheel.core.materials.oriented.writer.UnsafeOrientedWriter; -import com.jozufozu.flywheel.core.model.IModel; +import com.jozufozu.flywheel.core.model.Model; public class OrientedType implements Writeable, Batched { @@ -28,7 +28,7 @@ public class OrientedType implements Writeable, Batched getTransformer(IModel model) { + public BatchingTransformer getTransformer(Model model) { return null; } } diff --git a/src/main/java/com/jozufozu/flywheel/core/model/BakedModelModel.java b/src/main/java/com/jozufozu/flywheel/core/model/BakedModelModel.java index d9ea916ec..a972704fb 100644 --- a/src/main/java/com/jozufozu/flywheel/core/model/BakedModelModel.java +++ b/src/main/java/com/jozufozu/flywheel/core/model/BakedModelModel.java @@ -23,7 +23,7 @@ import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.Direction; import net.minecraft.core.Vec3i; -public class BakedModelModel implements IModel { +public class BakedModelModel implements Model { // DOWN, UP, NORTH, SOUTH, WEST, EAST, null private static final Direction[] dirs; diff --git a/src/main/java/com/jozufozu/flywheel/core/model/BlockModel.java b/src/main/java/com/jozufozu/flywheel/core/model/BlockModel.java index efee04d5b..44d81c899 100644 --- a/src/main/java/com/jozufozu/flywheel/core/model/BlockModel.java +++ b/src/main/java/com/jozufozu/flywheel/core/model/BlockModel.java @@ -24,7 +24,7 @@ import net.minecraft.world.level.block.state.BlockState; /** * A model of a single block. */ -public class BlockModel implements IModel { +public class BlockModel implements Model { private static final PoseStack IDENTITY = new PoseStack(); private final BufferBuilderReader reader; diff --git a/src/main/java/com/jozufozu/flywheel/core/model/IModel.java b/src/main/java/com/jozufozu/flywheel/core/model/Model.java similarity index 98% rename from src/main/java/com/jozufozu/flywheel/core/model/IModel.java rename to src/main/java/com/jozufozu/flywheel/core/model/Model.java index 6db3d1135..fb8704742 100644 --- a/src/main/java/com/jozufozu/flywheel/core/model/IModel.java +++ b/src/main/java/com/jozufozu/flywheel/core/model/Model.java @@ -25,7 +25,7 @@ import com.mojang.blaze3d.vertex.VertexConsumer; * assert model.size() == final - initial; * } */ -public interface IModel { +public interface Model { /** * A name uniquely identifying this model. diff --git a/src/main/java/com/jozufozu/flywheel/core/model/ModelPart.java b/src/main/java/com/jozufozu/flywheel/core/model/ModelPart.java index 2ae657e2b..bf4498090 100644 --- a/src/main/java/com/jozufozu/flywheel/core/model/ModelPart.java +++ b/src/main/java/com/jozufozu/flywheel/core/model/ModelPart.java @@ -6,7 +6,7 @@ import com.jozufozu.flywheel.backend.gl.attrib.VertexFormat; import com.jozufozu.flywheel.core.Formats; import com.mojang.blaze3d.vertex.VertexConsumer; -public class ModelPart implements IModel { +public class ModelPart implements Model { private final List cuboids; private int vertices; diff --git a/src/main/java/com/jozufozu/flywheel/core/model/WorldModel.java b/src/main/java/com/jozufozu/flywheel/core/model/WorldModel.java index d62ef9c26..c9c355c05 100644 --- a/src/main/java/com/jozufozu/flywheel/core/model/WorldModel.java +++ b/src/main/java/com/jozufozu/flywheel/core/model/WorldModel.java @@ -13,7 +13,7 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; -public class WorldModel implements IModel { +public class WorldModel implements Model { private final BufferBuilderReader reader; private final String name; diff --git a/src/main/java/com/jozufozu/flywheel/core/shader/IMultiProgram.java b/src/main/java/com/jozufozu/flywheel/core/shader/ContextAwareProgram.java similarity index 87% rename from src/main/java/com/jozufozu/flywheel/core/shader/IMultiProgram.java rename to src/main/java/com/jozufozu/flywheel/core/shader/ContextAwareProgram.java index 924a989a5..c10affa04 100644 --- a/src/main/java/com/jozufozu/flywheel/core/shader/IMultiProgram.java +++ b/src/main/java/com/jozufozu/flywheel/core/shader/ContextAwareProgram.java @@ -10,7 +10,7 @@ import com.jozufozu.flywheel.backend.gl.shader.GlProgram; * * @param

*/ -public interface IMultiProgram

extends Supplier

{ +public interface ContextAwareProgram

extends Supplier

{ /** * Get the shader program most suited for the current game state. diff --git a/src/main/java/com/jozufozu/flywheel/core/shader/ExtensibleGlProgram.java b/src/main/java/com/jozufozu/flywheel/core/shader/ExtensibleGlProgram.java index ac64b9aab..72f642020 100644 --- a/src/main/java/com/jozufozu/flywheel/core/shader/ExtensibleGlProgram.java +++ b/src/main/java/com/jozufozu/flywheel/core/shader/ExtensibleGlProgram.java @@ -5,6 +5,7 @@ import java.util.List; import javax.annotation.Nonnull; +import com.jozufozu.flywheel.backend.ShaderContext; import com.jozufozu.flywheel.backend.gl.shader.GlProgram; import com.jozufozu.flywheel.core.shader.extension.IExtensionInstance; @@ -17,7 +18,7 @@ import net.minecraft.resources.ResourceLocation; * the caller using the program. This is used by some programs to implement the different fog modes. Other uses might * include binding extra textures to allow for blocks to have normal maps, for example. As the extensions are * per-program, this also allows for same extra specialization within a - * {@link com.jozufozu.flywheel.backend.ShaderContext ShaderContext}. + * {@link ShaderContext ShaderContext}. */ public class ExtensibleGlProgram extends GlProgram { diff --git a/src/main/java/com/jozufozu/flywheel/core/shader/GameStateProgram.java b/src/main/java/com/jozufozu/flywheel/core/shader/GameStateProgram.java index 9b67fdf37..d0591c29d 100644 --- a/src/main/java/com/jozufozu/flywheel/core/shader/GameStateProgram.java +++ b/src/main/java/com/jozufozu/flywheel/core/shader/GameStateProgram.java @@ -8,7 +8,7 @@ import com.jozufozu.flywheel.backend.gl.shader.GlProgram; import com.jozufozu.flywheel.core.shader.spec.IGameStateCondition; import com.jozufozu.flywheel.util.Pair; -public class GameStateProgram

implements IMultiProgram

{ +public class GameStateProgram

implements ContextAwareProgram

{ private final List> variants; private final P fallback; @@ -55,7 +55,7 @@ public class GameStateProgram

implements IMultiProgram

{ return this; } - public IMultiProgram

build() { + public ContextAwareProgram

build() { return new GameStateProgram<>(ImmutableList.copyOf(variants), fallback); } } diff --git a/src/main/java/com/jozufozu/flywheel/event/RenderLayerEvent.java b/src/main/java/com/jozufozu/flywheel/event/RenderLayerEvent.java index 2e1176738..f0d84bf31 100644 --- a/src/main/java/com/jozufozu/flywheel/event/RenderLayerEvent.java +++ b/src/main/java/com/jozufozu/flywheel/event/RenderLayerEvent.java @@ -2,7 +2,7 @@ package com.jozufozu.flywheel.event; import javax.annotation.Nullable; -import com.jozufozu.flywheel.backend.state.RenderLayer; +import com.jozufozu.flywheel.backend.RenderLayer; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Matrix4f; diff --git a/src/main/java/com/jozufozu/flywheel/light/BasicProvider.java b/src/main/java/com/jozufozu/flywheel/light/BasicProvider.java index 6ddc4d5fd..fb5d3b189 100644 --- a/src/main/java/com/jozufozu/flywheel/light/BasicProvider.java +++ b/src/main/java/com/jozufozu/flywheel/light/BasicProvider.java @@ -1,23 +1,16 @@ package com.jozufozu.flywheel.light; -import java.util.Map; -import java.util.WeakHashMap; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.LightLayer; +/** + * Wraps a world and minimally lowers the interface. + */ public class BasicProvider implements LightProvider { - private static final Map wrappers = new WeakHashMap<>(); - - public static BasicProvider get(BlockAndTintGetter world) { - return wrappers.computeIfAbsent(world, BasicProvider::new); - } - - private final BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(); - private final BlockAndTintGetter reader; + private final BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(); public BasicProvider(BlockAndTintGetter reader) { this.reader = reader; diff --git a/src/main/java/com/jozufozu/flywheel/light/ICoordinateConsumer.java b/src/main/java/com/jozufozu/flywheel/light/CoordinateConsumer.java similarity index 71% rename from src/main/java/com/jozufozu/flywheel/light/ICoordinateConsumer.java rename to src/main/java/com/jozufozu/flywheel/light/CoordinateConsumer.java index a4d77b32e..b6a64eb0d 100644 --- a/src/main/java/com/jozufozu/flywheel/light/ICoordinateConsumer.java +++ b/src/main/java/com/jozufozu/flywheel/light/CoordinateConsumer.java @@ -1,6 +1,6 @@ package com.jozufozu.flywheel.light; @FunctionalInterface -public interface ICoordinateConsumer { +public interface CoordinateConsumer { void consume(int x, int y, int z); } diff --git a/src/main/java/com/jozufozu/flywheel/light/GridAlignedBB.java b/src/main/java/com/jozufozu/flywheel/light/GridAlignedBB.java index 1ccdf6a81..d84dd13a4 100644 --- a/src/main/java/com/jozufozu/flywheel/light/GridAlignedBB.java +++ b/src/main/java/com/jozufozu/flywheel/light/GridAlignedBB.java @@ -385,7 +385,7 @@ public class GridAlignedBB implements ImmutableBox { } @Override - public void forEachContained(ICoordinateConsumer func) { + public void forEachContained(CoordinateConsumer func) { if (empty()) return; for (int x = minX; x < maxX; x++) { diff --git a/src/main/java/com/jozufozu/flywheel/light/ImmutableBox.java b/src/main/java/com/jozufozu/flywheel/light/ImmutableBox.java index 935a521dc..a06cabb60 100644 --- a/src/main/java/com/jozufozu/flywheel/light/ImmutableBox.java +++ b/src/main/java/com/jozufozu/flywheel/light/ImmutableBox.java @@ -107,7 +107,7 @@ public interface ImmutableBox { return this.getMinX() < maxX && this.getMaxX() > minX && this.getMinY() < maxY && this.getMaxY() > minY && this.getMinZ() < maxZ && this.getMaxZ() > minZ; } - default void forEachContained(ICoordinateConsumer func) { + default void forEachContained(CoordinateConsumer func) { if (empty()) return; for (int x = getMinX(); x < getMaxX(); x++) { @@ -119,7 +119,7 @@ public interface ImmutableBox { } } - default AABB toAABB() { + default AABB toAABB() { return new AABB(getMinX(), getMinY(), getMinZ(), getMaxX(), getMaxY(), getMaxZ()); } diff --git a/src/main/java/com/jozufozu/flywheel/light/ILightUpdateListener.java b/src/main/java/com/jozufozu/flywheel/light/LightListener.java similarity index 94% rename from src/main/java/com/jozufozu/flywheel/light/ILightUpdateListener.java rename to src/main/java/com/jozufozu/flywheel/light/LightListener.java index dbb6bbfeb..9037d3b1f 100644 --- a/src/main/java/com/jozufozu/flywheel/light/ILightUpdateListener.java +++ b/src/main/java/com/jozufozu/flywheel/light/LightListener.java @@ -2,7 +2,7 @@ package com.jozufozu.flywheel.light; import net.minecraft.world.level.LightLayer; -public interface ILightUpdateListener { +public interface LightListener { ImmutableBox getVolume(); diff --git a/src/main/java/com/jozufozu/flywheel/light/LightUpdater.java b/src/main/java/com/jozufozu/flywheel/light/LightUpdater.java index 44ac3575d..26404ab2a 100644 --- a/src/main/java/com/jozufozu/flywheel/light/LightUpdater.java +++ b/src/main/java/com/jozufozu/flywheel/light/LightUpdater.java @@ -25,12 +25,12 @@ public class LightUpdater { private final LightProvider provider; - private final WeakHashSet movingListeners = new WeakHashSet<>(); - private final WeakContainmentMultiMap sections = new WeakContainmentMultiMap<>(); - private final WeakContainmentMultiMap chunks = new WeakContainmentMultiMap<>(); + private final WeakHashSet movingListeners = new WeakHashSet<>(); + private final WeakContainmentMultiMap sections = new WeakContainmentMultiMap<>(); + private final WeakContainmentMultiMap chunks = new WeakContainmentMultiMap<>(); public LightUpdater(BlockAndTintGetter world) { - provider = BasicProvider.get(world); + provider = new BasicProvider(world); } public LightProvider getProvider() { @@ -38,7 +38,7 @@ public class LightUpdater { } public void tick() { - for (IMovingListener listener : movingListeners) { + for (MovingListener listener : movingListeners) { if (listener.update(provider)) { addListener(listener); } @@ -47,12 +47,12 @@ public class LightUpdater { /** * Add a listener. - + * * @param listener The object that wants to receive light update notifications. */ - public void addListener(ILightUpdateListener listener) { - if (listener instanceof IMovingListener) - movingListeners.add(((IMovingListener) listener)); + public void addListener(LightListener listener) { + if (listener instanceof MovingListener) + movingListeners.add(((MovingListener) listener)); ImmutableBox box = listener.getVolume(); @@ -80,18 +80,18 @@ public class LightUpdater { } } - public void removeListener(ILightUpdateListener listener) { + public void removeListener(LightListener listener) { this.sections.remove(listener); this.chunks.remove(listener); } /** - * Dispatch light updates to all registered {@link ILightUpdateListener}s. + * Dispatch light updates to all registered {@link LightListener}s. * @param type The type of light that changed. * @param sectionPos A long representing the section position where light changed. */ public void onLightUpdate(LightLayer type, long sectionPos) { - Set set = sections.get(sectionPos); + Set set = sections.get(sectionPos); if (set == null || set.isEmpty()) return; @@ -99,26 +99,26 @@ public class LightUpdater { ImmutableBox chunkBox = GridAlignedBB.from(SectionPos.of(sectionPos)); - for (ILightUpdateListener listener : set) { + for (LightListener listener : set) { listener.onLightUpdate(provider, type, chunkBox); } } /** - * Dispatch light updates to all registered {@link ILightUpdateListener}s + * Dispatch light updates to all registered {@link LightListener}s * when the server sends lighting data for an entire chunk. * */ public void onLightPacket(int chunkX, int chunkZ) { long chunkPos = SectionPos.asLong(chunkX, 0, chunkZ); - Set set = chunks.get(chunkPos); + Set set = chunks.get(chunkPos); if (set == null || set.isEmpty()) return; set.removeIf(l -> l.status().shouldRemove()); - for (ILightUpdateListener listener : set) { + for (LightListener listener : set) { listener.onLightPacket(provider, chunkX, chunkZ); } } @@ -132,7 +132,7 @@ public class LightUpdater { } public Stream getAllBoxes() { - return chunks.stream().map(ILightUpdateListener::getVolume); + return chunks.stream().map(LightListener::getVolume); } public boolean isEmpty() { diff --git a/src/main/java/com/jozufozu/flywheel/light/LightVolume.java b/src/main/java/com/jozufozu/flywheel/light/LightVolume.java index 84c1d2083..27f40f070 100644 --- a/src/main/java/com/jozufozu/flywheel/light/LightVolume.java +++ b/src/main/java/com/jozufozu/flywheel/light/LightVolume.java @@ -7,7 +7,7 @@ import org.lwjgl.system.MemoryUtil; import net.minecraft.core.BlockPos; import net.minecraft.world.level.LightLayer; -public class LightVolume implements ImmutableBox, ILightUpdateListener { +public class LightVolume implements ImmutableBox, LightListener { protected final GridAlignedBB box = new GridAlignedBB(); protected ByteBuffer lightData; diff --git a/src/main/java/com/jozufozu/flywheel/light/IMovingListener.java b/src/main/java/com/jozufozu/flywheel/light/MovingListener.java similarity index 55% rename from src/main/java/com/jozufozu/flywheel/light/IMovingListener.java rename to src/main/java/com/jozufozu/flywheel/light/MovingListener.java index 68ff331ed..388d6fdd7 100644 --- a/src/main/java/com/jozufozu/flywheel/light/IMovingListener.java +++ b/src/main/java/com/jozufozu/flywheel/light/MovingListener.java @@ -1,5 +1,5 @@ package com.jozufozu.flywheel.light; -public interface IMovingListener extends ILightUpdateListener { +public interface MovingListener extends LightListener { boolean update(LightProvider provider); } diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/BellInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/BellInstance.java index 22d771e9a..c7750f528 100644 --- a/src/main/java/com/jozufozu/flywheel/vanilla/BellInstance.java +++ b/src/main/java/com/jozufozu/flywheel/vanilla/BellInstance.java @@ -1,8 +1,8 @@ package com.jozufozu.flywheel.vanilla; -import com.jozufozu.flywheel.backend.instancing.IDynamicInstance; +import com.jozufozu.flywheel.backend.api.instance.IDynamicInstance; import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance; -import com.jozufozu.flywheel.backend.material.MaterialManager; +import com.jozufozu.flywheel.backend.api.MaterialManager; import com.jozufozu.flywheel.core.Materials; import com.jozufozu.flywheel.core.materials.oriented.OrientedData; import com.jozufozu.flywheel.core.model.ModelPart; diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java index 0302fae0b..9487aa072 100644 --- a/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java +++ b/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java @@ -4,9 +4,9 @@ import java.util.Calendar; import javax.annotation.Nonnull; -import com.jozufozu.flywheel.backend.instancing.IDynamicInstance; +import com.jozufozu.flywheel.backend.api.instance.IDynamicInstance; import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance; -import com.jozufozu.flywheel.backend.material.MaterialManager; +import com.jozufozu.flywheel.backend.api.MaterialManager; import com.jozufozu.flywheel.core.Materials; import com.jozufozu.flywheel.core.materials.model.ModelData; import com.jozufozu.flywheel.core.materials.oriented.OrientedData; diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/MinecartInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/MinecartInstance.java index ad3346a30..d758c588f 100644 --- a/src/main/java/com/jozufozu/flywheel/vanilla/MinecartInstance.java +++ b/src/main/java/com/jozufozu/flywheel/vanilla/MinecartInstance.java @@ -1,12 +1,12 @@ package com.jozufozu.flywheel.vanilla; -import com.jozufozu.flywheel.backend.instancing.IDynamicInstance; -import com.jozufozu.flywheel.backend.instancing.ITickableInstance; +import com.jozufozu.flywheel.backend.api.instance.IDynamicInstance; +import com.jozufozu.flywheel.backend.api.instance.ITickableInstance; import com.jozufozu.flywheel.backend.instancing.entity.EntityInstance; -import com.jozufozu.flywheel.backend.material.MaterialManager; +import com.jozufozu.flywheel.backend.api.MaterialManager; import com.jozufozu.flywheel.core.Materials; import com.jozufozu.flywheel.core.materials.model.ModelData; -import com.jozufozu.flywheel.core.model.IModel; +import com.jozufozu.flywheel.core.model.Model; import com.jozufozu.flywheel.core.model.ModelPart; import com.jozufozu.flywheel.util.AnimationTickHolder; import com.jozufozu.flywheel.util.transform.MatrixTransformStack; @@ -153,7 +153,7 @@ public class MinecartInstance extends EntityInstance .createInstance(); } - private IModel getBodyModel() { + private Model getBodyModel() { int y = -3; return ModelPart.builder("minecart", 64, 32) .cuboid().invertYZ().start(-10, -8, -y).size(20, 16, 2).textureOffset(0, 10).rotateZ((float) Math.PI).rotateX(((float)Math.PI / 2F)).endCuboid() diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java index 5e8fb230c..291a3c35a 100644 --- a/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java +++ b/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java @@ -1,8 +1,8 @@ package com.jozufozu.flywheel.vanilla; -import com.jozufozu.flywheel.backend.instancing.IDynamicInstance; +import com.jozufozu.flywheel.backend.api.instance.IDynamicInstance; import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance; -import com.jozufozu.flywheel.backend.material.MaterialManager; +import com.jozufozu.flywheel.backend.api.MaterialManager; import com.jozufozu.flywheel.core.Materials; import com.jozufozu.flywheel.core.materials.model.ModelData; import com.jozufozu.flywheel.core.model.ModelPart; From da55941e4fa5351094a0beba6555f8cbd6e8714e Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Thu, 9 Dec 2021 15:19:48 -0800 Subject: [PATCH 14/29] Add RecordingVertexConsumer - Very basic and untested --- .../flywheel/backend/gl/error/GlError.java | 6 +- .../core/model/RecordingVertexConsumer.java | 70 +++++++++++++++++++ .../flywheel/core/model/VertexRecording.java | 15 ++++ 3 files changed, 88 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/jozufozu/flywheel/core/model/RecordingVertexConsumer.java create mode 100644 src/main/java/com/jozufozu/flywheel/core/model/VertexRecording.java diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/error/GlError.java b/src/main/java/com/jozufozu/flywheel/backend/gl/error/GlError.java index 55355ddbc..0e133d1c8 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/error/GlError.java +++ b/src/main/java/com/jozufozu/flywheel/backend/gl/error/GlError.java @@ -42,9 +42,9 @@ public enum GlError { public static void pollAndThrow(Supplier context) { // TODO: build flag? to enable or disable this function - GlError poll = GlError.poll(); - if (poll != null) { - Flywheel.log.error("{}: {}", poll.name(), context.get()); + GlError err = GlError.poll(); + if (err != null) { + Flywheel.log.error("{}: {}", err.name(), context.get()); } } } diff --git a/src/main/java/com/jozufozu/flywheel/core/model/RecordingVertexConsumer.java b/src/main/java/com/jozufozu/flywheel/core/model/RecordingVertexConsumer.java new file mode 100644 index 000000000..127604939 --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/core/model/RecordingVertexConsumer.java @@ -0,0 +1,70 @@ +package com.jozufozu.flywheel.core.model; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.vertex.VertexConsumer; + +public class RecordingVertexConsumer implements VertexConsumer { + + List> replay = new ArrayList<>(); + + @Override + public VertexConsumer vertex(double x, double y, double z) { + replay.add(v -> v.vertex(x, y, z)); + return this; + } + + @Override + public VertexConsumer color(int r, int g, int b, int a) { + replay.add(v -> v.color(r, g, b, a)); + return this; + } + + @Override + public VertexConsumer uv(float u, float v) { + replay.add(vc -> vc.uv(u, v)); + return this; + } + + @Override + public VertexConsumer overlayCoords(int u, int v) { + replay.add(vc -> vc.overlayCoords(u, v)); + return this; + } + + @Override + public VertexConsumer uv2(int u, int v) { + replay.add(vc -> vc.uv2(u, v)); + return this; + } + + @Override + public VertexConsumer normal(float x, float y, float z) { + replay.add(v -> v.normal(x, y, z)); + return this; + } + + @Override + public void endVertex() { + replay.add(VertexConsumer::endVertex); + } + + @Override + public void defaultColor(int r, int g, int b, int a) { + replay.add(vc -> vc.defaultColor(r, g, b, a)); + } + + @Override + public void unsetDefaultColor() { + replay.add(VertexConsumer::unsetDefaultColor); + } + + public VertexRecording saveRecording() { + VertexRecording out = new VertexRecording(ImmutableList.copyOf(replay)); + replay.clear(); + return out; + } +} diff --git a/src/main/java/com/jozufozu/flywheel/core/model/VertexRecording.java b/src/main/java/com/jozufozu/flywheel/core/model/VertexRecording.java new file mode 100644 index 000000000..82df180ff --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/core/model/VertexRecording.java @@ -0,0 +1,15 @@ +package com.jozufozu.flywheel.core.model; + +import java.util.function.Consumer; + +import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.vertex.VertexConsumer; + +public record VertexRecording(ImmutableList> recording) { + + public void replay(VertexConsumer vc) { + for (Consumer consumer : recording) { + consumer.accept(vc); + } + } +} From eee9b3fb512b1ad51d23213ca9690db2892e6437 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Thu, 9 Dec 2021 15:27:56 -0800 Subject: [PATCH 15/29] Move api package --- .../flywheel/{backend => }/api/FlywheelRendered.java | 2 +- .../flywheel/{backend => }/api/FlywheelWorld.java | 2 +- .../jozufozu/flywheel/{backend => }/api/InstanceData.java | 2 +- .../jozufozu/flywheel/{backend => }/api/Instancer.java | 2 +- .../com/jozufozu/flywheel/{backend => }/api/Material.java | 2 +- .../flywheel/{backend => }/api/MaterialGroup.java | 2 +- .../flywheel/{backend => }/api/MaterialManager.java | 2 +- .../jozufozu/flywheel/{backend => }/api/MaterialSpec.java | 2 +- .../{backend => }/api/instance/IDynamicInstance.java | 6 +++--- .../flywheel/{backend => }/api/instance/IInstance.java | 2 +- .../{backend => }/api/instance/ITickableInstance.java | 6 +++--- .../flywheel/{backend => }/api/instance/package-info.java | 2 +- .../jozufozu/flywheel/{backend => }/api/package-info.java | 2 +- src/main/java/com/jozufozu/flywheel/backend/Backend.java | 6 +++--- .../flywheel/backend/instancing/AbstractInstance.java | 8 ++++---- .../flywheel/backend/instancing/AbstractInstancer.java | 4 ++-- .../com/jozufozu/flywheel/backend/instancing/Engine.java | 2 +- .../flywheel/backend/instancing/InstanceManager.java | 6 +++--- .../flywheel/backend/instancing/InstanceWorld.java | 4 ++-- .../backend/instancing/InstancedRenderRegistry.java | 4 ++-- .../backend/instancing/batching/BatchedMaterial.java | 8 ++++---- .../backend/instancing/batching/BatchedMaterialGroup.java | 6 +++--- .../backend/instancing/batching/BatchingEngine.java | 2 +- .../backend/instancing/batching/CPUInstancer.java | 2 +- .../backend/instancing/entity/EntityInstance.java | 6 +++--- .../backend/instancing/entity/EntityInstanceManager.java | 2 +- .../backend/instancing/entity/IEntityInstanceFactory.java | 2 +- .../backend/instancing/instancing/GPUInstancer.java | 2 +- .../backend/instancing/instancing/InstancedMaterial.java | 8 ++++---- .../instancing/instancing/InstancedMaterialGroup.java | 6 +++--- .../backend/instancing/instancing/InstancingEngine.java | 2 +- .../backend/instancing/tile/ITileInstanceFactory.java | 2 +- .../backend/instancing/tile/TileEntityInstance.java | 8 ++++---- .../backend/instancing/tile/TileInstanceManager.java | 2 +- src/main/java/com/jozufozu/flywheel/core/Materials.java | 2 +- .../java/com/jozufozu/flywheel/core/WorldContext.java | 2 +- .../flywheel/core/crumbling/CrumblingInstanceManager.java | 2 +- .../flywheel/core/instancing/ConditionalInstance.java | 4 ++-- .../jozufozu/flywheel/core/instancing/GroupInstance.java | 4 ++-- .../jozufozu/flywheel/core/instancing/SelectInstance.java | 4 ++-- .../com/jozufozu/flywheel/core/materials/BasicData.java | 2 +- .../com/jozufozu/flywheel/core/materials/FlatLit.java | 2 +- .../java/com/jozufozu/flywheel/vanilla/BellInstance.java | 4 ++-- .../java/com/jozufozu/flywheel/vanilla/ChestInstance.java | 4 ++-- .../com/jozufozu/flywheel/vanilla/MinecartInstance.java | 6 +++--- .../com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java | 4 ++-- 46 files changed, 83 insertions(+), 83 deletions(-) rename src/main/java/com/jozufozu/flywheel/{backend => }/api/FlywheelRendered.java (89%) rename src/main/java/com/jozufozu/flywheel/{backend => }/api/FlywheelWorld.java (88%) rename src/main/java/com/jozufozu/flywheel/{backend => }/api/InstanceData.java (93%) rename src/main/java/com/jozufozu/flywheel/{backend => }/api/Instancer.java (97%) rename src/main/java/com/jozufozu/flywheel/{backend => }/api/Material.java (97%) rename src/main/java/com/jozufozu/flywheel/{backend => }/api/MaterialGroup.java (89%) rename src/main/java/com/jozufozu/flywheel/{backend => }/api/MaterialManager.java (96%) rename src/main/java/com/jozufozu/flywheel/{backend => }/api/MaterialSpec.java (93%) rename src/main/java/com/jozufozu/flywheel/{backend => }/api/instance/IDynamicInstance.java (89%) rename src/main/java/com/jozufozu/flywheel/{backend => }/api/instance/IInstance.java (66%) rename src/main/java/com/jozufozu/flywheel/{backend => }/api/instance/ITickableInstance.java (90%) rename src/main/java/com/jozufozu/flywheel/{backend => }/api/instance/package-info.java (76%) rename src/main/java/com/jozufozu/flywheel/{backend => }/api/package-info.java (79%) diff --git a/src/main/java/com/jozufozu/flywheel/backend/api/FlywheelRendered.java b/src/main/java/com/jozufozu/flywheel/api/FlywheelRendered.java similarity index 89% rename from src/main/java/com/jozufozu/flywheel/backend/api/FlywheelRendered.java rename to src/main/java/com/jozufozu/flywheel/api/FlywheelRendered.java index 82e4f47b3..59d656edf 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/api/FlywheelRendered.java +++ b/src/main/java/com/jozufozu/flywheel/api/FlywheelRendered.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.backend.api; +package com.jozufozu.flywheel.api; import net.minecraft.world.level.Level; diff --git a/src/main/java/com/jozufozu/flywheel/backend/api/FlywheelWorld.java b/src/main/java/com/jozufozu/flywheel/api/FlywheelWorld.java similarity index 88% rename from src/main/java/com/jozufozu/flywheel/backend/api/FlywheelWorld.java rename to src/main/java/com/jozufozu/flywheel/api/FlywheelWorld.java index 0254dddef..5cfa5320b 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/api/FlywheelWorld.java +++ b/src/main/java/com/jozufozu/flywheel/api/FlywheelWorld.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.backend.api; +package com.jozufozu.flywheel.api; /** * A marker interface custom worlds can override to indicate diff --git a/src/main/java/com/jozufozu/flywheel/backend/api/InstanceData.java b/src/main/java/com/jozufozu/flywheel/api/InstanceData.java similarity index 93% rename from src/main/java/com/jozufozu/flywheel/backend/api/InstanceData.java rename to src/main/java/com/jozufozu/flywheel/api/InstanceData.java index bc9b33a42..a3471e0f7 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/api/InstanceData.java +++ b/src/main/java/com/jozufozu/flywheel/api/InstanceData.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.backend.api; +package com.jozufozu.flywheel.api; public abstract class InstanceData { diff --git a/src/main/java/com/jozufozu/flywheel/backend/api/Instancer.java b/src/main/java/com/jozufozu/flywheel/api/Instancer.java similarity index 97% rename from src/main/java/com/jozufozu/flywheel/backend/api/Instancer.java rename to src/main/java/com/jozufozu/flywheel/api/Instancer.java index 2da26426b..8ea0c3f70 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/api/Instancer.java +++ b/src/main/java/com/jozufozu/flywheel/api/Instancer.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.backend.api; +package com.jozufozu.flywheel.api; /** * An instancer is how you interact with an instanced model. diff --git a/src/main/java/com/jozufozu/flywheel/backend/api/Material.java b/src/main/java/com/jozufozu/flywheel/api/Material.java similarity index 97% rename from src/main/java/com/jozufozu/flywheel/backend/api/Material.java rename to src/main/java/com/jozufozu/flywheel/api/Material.java index f6a1ed011..edcc489d4 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/api/Material.java +++ b/src/main/java/com/jozufozu/flywheel/api/Material.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.backend.api; +package com.jozufozu.flywheel.api; import java.util.function.Supplier; diff --git a/src/main/java/com/jozufozu/flywheel/backend/api/MaterialGroup.java b/src/main/java/com/jozufozu/flywheel/api/MaterialGroup.java similarity index 89% rename from src/main/java/com/jozufozu/flywheel/backend/api/MaterialGroup.java rename to src/main/java/com/jozufozu/flywheel/api/MaterialGroup.java index 9ffb32d52..9f9c5ee98 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/api/MaterialGroup.java +++ b/src/main/java/com/jozufozu/flywheel/api/MaterialGroup.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.backend.api; +package com.jozufozu.flywheel.api; public interface MaterialGroup { /** diff --git a/src/main/java/com/jozufozu/flywheel/backend/api/MaterialManager.java b/src/main/java/com/jozufozu/flywheel/api/MaterialManager.java similarity index 96% rename from src/main/java/com/jozufozu/flywheel/backend/api/MaterialManager.java rename to src/main/java/com/jozufozu/flywheel/api/MaterialManager.java index c825b8c80..84d706504 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/api/MaterialManager.java +++ b/src/main/java/com/jozufozu/flywheel/api/MaterialManager.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.backend.api; +package com.jozufozu.flywheel.api; import com.jozufozu.flywheel.backend.RenderLayer; diff --git a/src/main/java/com/jozufozu/flywheel/backend/api/MaterialSpec.java b/src/main/java/com/jozufozu/flywheel/api/MaterialSpec.java similarity index 93% rename from src/main/java/com/jozufozu/flywheel/backend/api/MaterialSpec.java rename to src/main/java/com/jozufozu/flywheel/api/MaterialSpec.java index 1350e8878..eb39d03a2 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/api/MaterialSpec.java +++ b/src/main/java/com/jozufozu/flywheel/api/MaterialSpec.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.backend.api; +package com.jozufozu.flywheel.api; import com.jozufozu.flywheel.backend.struct.StructType; diff --git a/src/main/java/com/jozufozu/flywheel/backend/api/instance/IDynamicInstance.java b/src/main/java/com/jozufozu/flywheel/api/instance/IDynamicInstance.java similarity index 89% rename from src/main/java/com/jozufozu/flywheel/backend/api/instance/IDynamicInstance.java rename to src/main/java/com/jozufozu/flywheel/api/instance/IDynamicInstance.java index c69d01994..fdc684913 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/api/instance/IDynamicInstance.java +++ b/src/main/java/com/jozufozu/flywheel/api/instance/IDynamicInstance.java @@ -1,7 +1,7 @@ -package com.jozufozu.flywheel.backend.api.instance; +package com.jozufozu.flywheel.api.instance; -import com.jozufozu.flywheel.backend.api.Instancer; -import com.jozufozu.flywheel.backend.api.InstanceData; +import com.jozufozu.flywheel.api.Instancer; +import com.jozufozu.flywheel.api.InstanceData; import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance; /** diff --git a/src/main/java/com/jozufozu/flywheel/backend/api/instance/IInstance.java b/src/main/java/com/jozufozu/flywheel/api/instance/IInstance.java similarity index 66% rename from src/main/java/com/jozufozu/flywheel/backend/api/instance/IInstance.java rename to src/main/java/com/jozufozu/flywheel/api/instance/IInstance.java index 7b088eab2..843cfb147 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/api/instance/IInstance.java +++ b/src/main/java/com/jozufozu/flywheel/api/instance/IInstance.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.backend.api.instance; +package com.jozufozu.flywheel.api.instance; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/jozufozu/flywheel/backend/api/instance/ITickableInstance.java b/src/main/java/com/jozufozu/flywheel/api/instance/ITickableInstance.java similarity index 90% rename from src/main/java/com/jozufozu/flywheel/backend/api/instance/ITickableInstance.java rename to src/main/java/com/jozufozu/flywheel/api/instance/ITickableInstance.java index 8e72e02ce..c0d32cb29 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/api/instance/ITickableInstance.java +++ b/src/main/java/com/jozufozu/flywheel/api/instance/ITickableInstance.java @@ -1,7 +1,7 @@ -package com.jozufozu.flywheel.backend.api.instance; +package com.jozufozu.flywheel.api.instance; -import com.jozufozu.flywheel.backend.api.Instancer; -import com.jozufozu.flywheel.backend.api.InstanceData; +import com.jozufozu.flywheel.api.InstanceData; +import com.jozufozu.flywheel.api.Instancer; import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance; /** diff --git a/src/main/java/com/jozufozu/flywheel/backend/api/instance/package-info.java b/src/main/java/com/jozufozu/flywheel/api/instance/package-info.java similarity index 76% rename from src/main/java/com/jozufozu/flywheel/backend/api/instance/package-info.java rename to src/main/java/com/jozufozu/flywheel/api/instance/package-info.java index 2374b554d..aab0f0d30 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/api/instance/package-info.java +++ b/src/main/java/com/jozufozu/flywheel/api/instance/package-info.java @@ -1,5 +1,5 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -package com.jozufozu.flywheel.backend.api.instance; +package com.jozufozu.flywheel.api.instance; import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/com/jozufozu/flywheel/backend/api/package-info.java b/src/main/java/com/jozufozu/flywheel/api/package-info.java similarity index 79% rename from src/main/java/com/jozufozu/flywheel/backend/api/package-info.java rename to src/main/java/com/jozufozu/flywheel/api/package-info.java index 693e0fd2b..5dce95a6c 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/api/package-info.java +++ b/src/main/java/com/jozufozu/flywheel/api/package-info.java @@ -1,5 +1,5 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -package com.jozufozu.flywheel.backend.api; +package com.jozufozu.flywheel.api; import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/com/jozufozu/flywheel/backend/Backend.java b/src/main/java/com/jozufozu/flywheel/backend/Backend.java index aa8b8ad65..2d8edb5b7 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/Backend.java +++ b/src/main/java/com/jozufozu/flywheel/backend/Backend.java @@ -13,10 +13,10 @@ import org.apache.logging.log4j.Logger; import org.lwjgl.opengl.GL; import org.lwjgl.opengl.GLCapabilities; -import com.jozufozu.flywheel.backend.api.FlywheelWorld; +import com.jozufozu.flywheel.api.FlywheelWorld; import com.jozufozu.flywheel.backend.gl.versioned.GlCompat; -import com.jozufozu.flywheel.backend.api.InstanceData; -import com.jozufozu.flywheel.backend.api.MaterialSpec; +import com.jozufozu.flywheel.api.InstanceData; +import com.jozufozu.flywheel.api.MaterialSpec; import com.jozufozu.flywheel.config.FlwConfig; import com.jozufozu.flywheel.core.shader.spec.ProgramSpec; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstance.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstance.java index b17e238bd..1feadfa37 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstance.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstance.java @@ -3,11 +3,11 @@ package com.jozufozu.flywheel.backend.instancing; import java.util.Arrays; import java.util.stream.Stream; -import com.jozufozu.flywheel.backend.api.instance.IDynamicInstance; -import com.jozufozu.flywheel.backend.api.instance.IInstance; -import com.jozufozu.flywheel.backend.api.instance.ITickableInstance; +import com.jozufozu.flywheel.api.instance.IDynamicInstance; +import com.jozufozu.flywheel.api.instance.IInstance; +import com.jozufozu.flywheel.api.instance.ITickableInstance; import com.jozufozu.flywheel.backend.instancing.tile.TileInstanceManager; -import com.jozufozu.flywheel.backend.api.MaterialManager; +import com.jozufozu.flywheel.api.MaterialManager; import com.jozufozu.flywheel.core.materials.FlatLit; import com.jozufozu.flywheel.light.LightListener; import com.jozufozu.flywheel.light.ImmutableBox; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstancer.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstancer.java index 9fb667df6..aa3574c11 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstancer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstancer.java @@ -3,8 +3,8 @@ package com.jozufozu.flywheel.backend.instancing; import java.util.ArrayList; import java.util.BitSet; -import com.jozufozu.flywheel.backend.api.InstanceData; -import com.jozufozu.flywheel.backend.api.Instancer; +import com.jozufozu.flywheel.api.InstanceData; +import com.jozufozu.flywheel.api.Instancer; import com.jozufozu.flywheel.backend.struct.StructType; import com.jozufozu.flywheel.core.model.Model; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/Engine.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/Engine.java index 430c7e841..1e33c16db 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/Engine.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/Engine.java @@ -1,6 +1,6 @@ package com.jozufozu.flywheel.backend.instancing; -import com.jozufozu.flywheel.backend.api.MaterialManager; +import com.jozufozu.flywheel.api.MaterialManager; public interface Engine extends RenderDispatcher, MaterialManager { } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceManager.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceManager.java index 6e527f91a..ba55db9f5 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceManager.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceManager.java @@ -9,9 +9,9 @@ import java.util.Set; import javax.annotation.Nullable; import com.jozufozu.flywheel.backend.Backend; -import com.jozufozu.flywheel.backend.api.instance.IDynamicInstance; -import com.jozufozu.flywheel.backend.api.instance.ITickableInstance; -import com.jozufozu.flywheel.backend.api.MaterialManager; +import com.jozufozu.flywheel.api.instance.IDynamicInstance; +import com.jozufozu.flywheel.api.instance.ITickableInstance; +import com.jozufozu.flywheel.api.MaterialManager; import com.jozufozu.flywheel.backend.instancing.instancing.InstancingEngine; import com.jozufozu.flywheel.light.LightUpdater; import com.mojang.math.Vector3f; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceWorld.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceWorld.java index 404ac47c8..47bf41aa4 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceWorld.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstanceWorld.java @@ -1,7 +1,7 @@ package com.jozufozu.flywheel.backend.instancing; -import com.jozufozu.flywheel.backend.api.instance.IDynamicInstance; -import com.jozufozu.flywheel.backend.api.instance.ITickableInstance; +import com.jozufozu.flywheel.api.instance.IDynamicInstance; +import com.jozufozu.flywheel.api.instance.ITickableInstance; import com.jozufozu.flywheel.backend.instancing.entity.EntityInstanceManager; import com.jozufozu.flywheel.backend.instancing.tile.TileInstanceManager; import com.jozufozu.flywheel.backend.instancing.batching.BatchingEngine; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstancedRenderRegistry.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstancedRenderRegistry.java index 3beaac245..524b03e78 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/InstancedRenderRegistry.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/InstancedRenderRegistry.java @@ -5,12 +5,12 @@ import java.util.Map; import javax.annotation.Nullable; import com.google.common.collect.Maps; -import com.jozufozu.flywheel.backend.api.FlywheelRendered; +import com.jozufozu.flywheel.api.FlywheelRendered; import com.jozufozu.flywheel.backend.instancing.entity.EntityInstance; import com.jozufozu.flywheel.backend.instancing.entity.IEntityInstanceFactory; import com.jozufozu.flywheel.backend.instancing.tile.ITileInstanceFactory; import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance; -import com.jozufozu.flywheel.backend.api.MaterialManager; +import com.jozufozu.flywheel.api.MaterialManager; import it.unimi.dsi.fastutil.objects.Object2BooleanLinkedOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2BooleanMap; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterial.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterial.java index 5956ea04f..d7b24c696 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterial.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterial.java @@ -4,10 +4,10 @@ import java.util.HashMap; import java.util.Map; import java.util.function.Supplier; -import com.jozufozu.flywheel.backend.api.InstanceData; -import com.jozufozu.flywheel.backend.api.Instancer; -import com.jozufozu.flywheel.backend.api.Material; -import com.jozufozu.flywheel.backend.api.MaterialSpec; +import com.jozufozu.flywheel.api.InstanceData; +import com.jozufozu.flywheel.api.Instancer; +import com.jozufozu.flywheel.api.Material; +import com.jozufozu.flywheel.api.MaterialSpec; import com.jozufozu.flywheel.backend.struct.StructType; import com.jozufozu.flywheel.core.model.Model; import com.mojang.blaze3d.vertex.PoseStack; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterialGroup.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterialGroup.java index 0226aee2b..64aaa2a2c 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterialGroup.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterialGroup.java @@ -3,9 +3,9 @@ package com.jozufozu.flywheel.backend.instancing.batching; import java.util.HashMap; import java.util.Map; -import com.jozufozu.flywheel.backend.api.InstanceData; -import com.jozufozu.flywheel.backend.api.MaterialGroup; -import com.jozufozu.flywheel.backend.api.MaterialSpec; +import com.jozufozu.flywheel.api.InstanceData; +import com.jozufozu.flywheel.api.MaterialGroup; +import com.jozufozu.flywheel.api.MaterialSpec; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchingEngine.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchingEngine.java index f5dc0bd12..427115dde 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchingEngine.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchingEngine.java @@ -5,7 +5,7 @@ import java.util.HashMap; import java.util.Map; import com.jozufozu.flywheel.backend.instancing.Engine; -import com.jozufozu.flywheel.backend.api.MaterialGroup; +import com.jozufozu.flywheel.api.MaterialGroup; import com.jozufozu.flywheel.backend.RenderLayer; import com.jozufozu.flywheel.event.RenderLayerEvent; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/CPUInstancer.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/CPUInstancer.java index 6bec6f210..0e27115bf 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/CPUInstancer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/CPUInstancer.java @@ -1,7 +1,7 @@ package com.jozufozu.flywheel.backend.instancing.batching; import com.jozufozu.flywheel.backend.instancing.AbstractInstancer; -import com.jozufozu.flywheel.backend.api.InstanceData; +import com.jozufozu.flywheel.api.InstanceData; import com.jozufozu.flywheel.backend.struct.BatchingTransformer; import com.jozufozu.flywheel.backend.struct.StructType; import com.jozufozu.flywheel.core.model.Model; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstance.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstance.java index ba4dd05cb..f8e84e2fc 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstance.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstance.java @@ -1,10 +1,10 @@ package com.jozufozu.flywheel.backend.instancing.entity; import com.jozufozu.flywheel.backend.instancing.AbstractInstance; -import com.jozufozu.flywheel.backend.api.instance.IDynamicInstance; -import com.jozufozu.flywheel.backend.api.instance.ITickableInstance; +import com.jozufozu.flywheel.api.instance.IDynamicInstance; +import com.jozufozu.flywheel.api.instance.ITickableInstance; import com.jozufozu.flywheel.backend.instancing.tile.TileInstanceManager; -import com.jozufozu.flywheel.backend.api.MaterialManager; +import com.jozufozu.flywheel.api.MaterialManager; import com.jozufozu.flywheel.light.GridAlignedBB; import com.jozufozu.flywheel.light.LightListener; import com.jozufozu.flywheel.light.MovingListener; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstanceManager.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstanceManager.java index a9b2d87a8..95bef0093 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstanceManager.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/EntityInstanceManager.java @@ -4,7 +4,7 @@ import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.instancing.AbstractInstance; import com.jozufozu.flywheel.backend.instancing.InstanceManager; import com.jozufozu.flywheel.backend.instancing.InstancedRenderRegistry; -import com.jozufozu.flywheel.backend.api.MaterialManager; +import com.jozufozu.flywheel.api.MaterialManager; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.Entity; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/IEntityInstanceFactory.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/IEntityInstanceFactory.java index 07db1b55e..04927760a 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/IEntityInstanceFactory.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/entity/IEntityInstanceFactory.java @@ -1,6 +1,6 @@ package com.jozufozu.flywheel.backend.instancing.entity; -import com.jozufozu.flywheel.backend.api.MaterialManager; +import com.jozufozu.flywheel.api.MaterialManager; import net.minecraft.world.entity.Entity; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/GPUInstancer.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/GPUInstancer.java index f4ec37828..e0e532401 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/GPUInstancer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/GPUInstancer.java @@ -10,7 +10,7 @@ import com.jozufozu.flywheel.backend.gl.buffer.GlBufferType; import com.jozufozu.flywheel.backend.gl.buffer.MappedBuffer; import com.jozufozu.flywheel.backend.gl.error.GlError; import com.jozufozu.flywheel.backend.instancing.AbstractInstancer; -import com.jozufozu.flywheel.backend.api.InstanceData; +import com.jozufozu.flywheel.api.InstanceData; import com.jozufozu.flywheel.backend.model.IBufferedModel; import com.jozufozu.flywheel.backend.model.ModelAllocator; import com.jozufozu.flywheel.backend.struct.StructType; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterial.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterial.java index 335a1bbeb..855c993b7 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterial.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterial.java @@ -6,10 +6,10 @@ import java.util.function.Supplier; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.jozufozu.flywheel.backend.RenderWork; -import com.jozufozu.flywheel.backend.api.InstanceData; -import com.jozufozu.flywheel.backend.api.Instancer; -import com.jozufozu.flywheel.backend.api.Material; -import com.jozufozu.flywheel.backend.api.MaterialSpec; +import com.jozufozu.flywheel.api.InstanceData; +import com.jozufozu.flywheel.api.Instancer; +import com.jozufozu.flywheel.api.Material; +import com.jozufozu.flywheel.api.MaterialSpec; import com.jozufozu.flywheel.backend.model.ModelPool; import com.jozufozu.flywheel.backend.struct.StructType; import com.jozufozu.flywheel.core.Formats; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterialGroup.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterialGroup.java index 31d604fdb..178dfc4c4 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterialGroup.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterialGroup.java @@ -4,9 +4,9 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Map; -import com.jozufozu.flywheel.backend.api.InstanceData; -import com.jozufozu.flywheel.backend.api.MaterialGroup; -import com.jozufozu.flywheel.backend.api.MaterialSpec; +import com.jozufozu.flywheel.api.InstanceData; +import com.jozufozu.flywheel.api.MaterialGroup; +import com.jozufozu.flywheel.api.MaterialSpec; import com.jozufozu.flywheel.core.shader.WorldProgram; import com.jozufozu.flywheel.util.TextureBinder; import com.mojang.math.Matrix4f; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancingEngine.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancingEngine.java index 142531319..e257a381f 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancingEngine.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancingEngine.java @@ -11,7 +11,7 @@ import javax.annotation.Nullable; import com.jozufozu.flywheel.backend.gl.GlVertexArray; import com.jozufozu.flywheel.backend.gl.buffer.GlBufferType; import com.jozufozu.flywheel.backend.instancing.Engine; -import com.jozufozu.flywheel.backend.api.MaterialGroup; +import com.jozufozu.flywheel.api.MaterialGroup; import com.jozufozu.flywheel.backend.RenderLayer; import com.jozufozu.flywheel.core.WorldContext; import com.jozufozu.flywheel.core.shader.WorldProgram; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/ITileInstanceFactory.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/ITileInstanceFactory.java index 672198098..c1bdaa74b 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/ITileInstanceFactory.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/ITileInstanceFactory.java @@ -1,6 +1,6 @@ package com.jozufozu.flywheel.backend.instancing.tile; -import com.jozufozu.flywheel.backend.api.MaterialManager; +import com.jozufozu.flywheel.api.MaterialManager; import net.minecraft.world.level.block.entity.BlockEntity; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/TileEntityInstance.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/TileEntityInstance.java index 29f8ec1d5..506b220a4 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/TileEntityInstance.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/TileEntityInstance.java @@ -1,10 +1,10 @@ package com.jozufozu.flywheel.backend.instancing.tile; import com.jozufozu.flywheel.backend.instancing.AbstractInstance; -import com.jozufozu.flywheel.backend.api.instance.IDynamicInstance; -import com.jozufozu.flywheel.backend.api.instance.ITickableInstance; -import com.jozufozu.flywheel.backend.api.Material; -import com.jozufozu.flywheel.backend.api.MaterialManager; +import com.jozufozu.flywheel.api.instance.IDynamicInstance; +import com.jozufozu.flywheel.api.instance.ITickableInstance; +import com.jozufozu.flywheel.api.Material; +import com.jozufozu.flywheel.api.MaterialManager; import com.jozufozu.flywheel.core.Materials; import com.jozufozu.flywheel.core.materials.model.ModelData; import com.jozufozu.flywheel.core.materials.oriented.OrientedData; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/TileInstanceManager.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/TileInstanceManager.java index edfcd5d71..57eb8c8e9 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/TileInstanceManager.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/tile/TileInstanceManager.java @@ -4,7 +4,7 @@ import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.instancing.AbstractInstance; import com.jozufozu.flywheel.backend.instancing.InstanceManager; import com.jozufozu.flywheel.backend.instancing.InstancedRenderRegistry; -import com.jozufozu.flywheel.backend.api.MaterialManager; +import com.jozufozu.flywheel.api.MaterialManager; import net.minecraft.core.BlockPos; import net.minecraft.world.level.BlockGetter; diff --git a/src/main/java/com/jozufozu/flywheel/core/Materials.java b/src/main/java/com/jozufozu/flywheel/core/Materials.java index b5efeee81..619c52b86 100644 --- a/src/main/java/com/jozufozu/flywheel/core/Materials.java +++ b/src/main/java/com/jozufozu/flywheel/core/Materials.java @@ -1,6 +1,6 @@ package com.jozufozu.flywheel.core; -import com.jozufozu.flywheel.backend.api.MaterialSpec; +import com.jozufozu.flywheel.api.MaterialSpec; import com.jozufozu.flywheel.backend.struct.StructType; import com.jozufozu.flywheel.core.materials.model.ModelData; import com.jozufozu.flywheel.core.materials.model.ModelType; diff --git a/src/main/java/com/jozufozu/flywheel/core/WorldContext.java b/src/main/java/com/jozufozu/flywheel/core/WorldContext.java index 170b9e10c..a9a2ae14e 100644 --- a/src/main/java/com/jozufozu/flywheel/core/WorldContext.java +++ b/src/main/java/com/jozufozu/flywheel/core/WorldContext.java @@ -7,7 +7,7 @@ import java.util.stream.Stream; import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.ShaderContext; -import com.jozufozu.flywheel.backend.api.MaterialSpec; +import com.jozufozu.flywheel.api.MaterialSpec; import com.jozufozu.flywheel.backend.pipeline.ShaderPipeline; import com.jozufozu.flywheel.core.shader.ContextAwareProgram; import com.jozufozu.flywheel.core.shader.WorldProgram; diff --git a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingInstanceManager.java b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingInstanceManager.java index 57fde613b..63ee63425 100644 --- a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingInstanceManager.java +++ b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingInstanceManager.java @@ -1,7 +1,7 @@ package com.jozufozu.flywheel.core.crumbling; import com.jozufozu.flywheel.backend.instancing.tile.TileInstanceManager; -import com.jozufozu.flywheel.backend.api.MaterialManager; +import com.jozufozu.flywheel.api.MaterialManager; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/jozufozu/flywheel/core/instancing/ConditionalInstance.java b/src/main/java/com/jozufozu/flywheel/core/instancing/ConditionalInstance.java index 0aa08d052..1059f07ca 100644 --- a/src/main/java/com/jozufozu/flywheel/core/instancing/ConditionalInstance.java +++ b/src/main/java/com/jozufozu/flywheel/core/instancing/ConditionalInstance.java @@ -5,8 +5,8 @@ import java.util.function.Consumer; import javax.annotation.Nullable; -import com.jozufozu.flywheel.backend.api.InstanceData; -import com.jozufozu.flywheel.backend.api.Instancer; +import com.jozufozu.flywheel.api.InstanceData; +import com.jozufozu.flywheel.api.Instancer; public class ConditionalInstance { diff --git a/src/main/java/com/jozufozu/flywheel/core/instancing/GroupInstance.java b/src/main/java/com/jozufozu/flywheel/core/instancing/GroupInstance.java index 8bcc6e078..a6c0a86c1 100644 --- a/src/main/java/com/jozufozu/flywheel/core/instancing/GroupInstance.java +++ b/src/main/java/com/jozufozu/flywheel/core/instancing/GroupInstance.java @@ -5,8 +5,8 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import com.jozufozu.flywheel.backend.api.InstanceData; -import com.jozufozu.flywheel.backend.api.Instancer; +import com.jozufozu.flywheel.api.InstanceData; +import com.jozufozu.flywheel.api.Instancer; public class GroupInstance extends AbstractCollection { diff --git a/src/main/java/com/jozufozu/flywheel/core/instancing/SelectInstance.java b/src/main/java/com/jozufozu/flywheel/core/instancing/SelectInstance.java index cc848b73a..e516610df 100644 --- a/src/main/java/com/jozufozu/flywheel/core/instancing/SelectInstance.java +++ b/src/main/java/com/jozufozu/flywheel/core/instancing/SelectInstance.java @@ -6,8 +6,8 @@ import java.util.Optional; import javax.annotation.Nullable; -import com.jozufozu.flywheel.backend.api.InstanceData; -import com.jozufozu.flywheel.backend.api.Instancer; +import com.jozufozu.flywheel.api.InstanceData; +import com.jozufozu.flywheel.api.Instancer; public class SelectInstance { diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/BasicData.java b/src/main/java/com/jozufozu/flywheel/core/materials/BasicData.java index 77512d886..1b34a856e 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/BasicData.java +++ b/src/main/java/com/jozufozu/flywheel/core/materials/BasicData.java @@ -1,6 +1,6 @@ package com.jozufozu.flywheel.core.materials; -import com.jozufozu.flywheel.backend.api.InstanceData; +import com.jozufozu.flywheel.api.InstanceData; public abstract class BasicData extends InstanceData implements FlatLit { diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/FlatLit.java b/src/main/java/com/jozufozu/flywheel/core/materials/FlatLit.java index d9d4b2010..22031bb14 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/FlatLit.java +++ b/src/main/java/com/jozufozu/flywheel/core/materials/FlatLit.java @@ -1,6 +1,6 @@ package com.jozufozu.flywheel.core.materials; -import com.jozufozu.flywheel.backend.api.InstanceData; +import com.jozufozu.flywheel.api.InstanceData; /** * An interface that implementors of {@link InstanceData} should also implement diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/BellInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/BellInstance.java index c7750f528..1574a5fb4 100644 --- a/src/main/java/com/jozufozu/flywheel/vanilla/BellInstance.java +++ b/src/main/java/com/jozufozu/flywheel/vanilla/BellInstance.java @@ -1,8 +1,8 @@ package com.jozufozu.flywheel.vanilla; -import com.jozufozu.flywheel.backend.api.instance.IDynamicInstance; +import com.jozufozu.flywheel.api.instance.IDynamicInstance; import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance; -import com.jozufozu.flywheel.backend.api.MaterialManager; +import com.jozufozu.flywheel.api.MaterialManager; import com.jozufozu.flywheel.core.Materials; import com.jozufozu.flywheel.core.materials.oriented.OrientedData; import com.jozufozu.flywheel.core.model.ModelPart; diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java index 9487aa072..674f48255 100644 --- a/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java +++ b/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java @@ -4,9 +4,9 @@ import java.util.Calendar; import javax.annotation.Nonnull; -import com.jozufozu.flywheel.backend.api.instance.IDynamicInstance; +import com.jozufozu.flywheel.api.instance.IDynamicInstance; import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance; -import com.jozufozu.flywheel.backend.api.MaterialManager; +import com.jozufozu.flywheel.api.MaterialManager; import com.jozufozu.flywheel.core.Materials; import com.jozufozu.flywheel.core.materials.model.ModelData; import com.jozufozu.flywheel.core.materials.oriented.OrientedData; diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/MinecartInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/MinecartInstance.java index d758c588f..f14e7dfde 100644 --- a/src/main/java/com/jozufozu/flywheel/vanilla/MinecartInstance.java +++ b/src/main/java/com/jozufozu/flywheel/vanilla/MinecartInstance.java @@ -1,9 +1,9 @@ package com.jozufozu.flywheel.vanilla; -import com.jozufozu.flywheel.backend.api.instance.IDynamicInstance; -import com.jozufozu.flywheel.backend.api.instance.ITickableInstance; +import com.jozufozu.flywheel.api.instance.IDynamicInstance; +import com.jozufozu.flywheel.api.instance.ITickableInstance; import com.jozufozu.flywheel.backend.instancing.entity.EntityInstance; -import com.jozufozu.flywheel.backend.api.MaterialManager; +import com.jozufozu.flywheel.api.MaterialManager; import com.jozufozu.flywheel.core.Materials; import com.jozufozu.flywheel.core.materials.model.ModelData; import com.jozufozu.flywheel.core.model.Model; diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java index 291a3c35a..f96710d8e 100644 --- a/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java +++ b/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java @@ -1,8 +1,8 @@ package com.jozufozu.flywheel.vanilla; -import com.jozufozu.flywheel.backend.api.instance.IDynamicInstance; +import com.jozufozu.flywheel.api.instance.IDynamicInstance; import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance; -import com.jozufozu.flywheel.backend.api.MaterialManager; +import com.jozufozu.flywheel.api.MaterialManager; import com.jozufozu.flywheel.core.Materials; import com.jozufozu.flywheel.core.materials.model.ModelData; import com.jozufozu.flywheel.core.model.ModelPart; From 5374baf24156f3f18bdb7f21b49122128c4ec06b Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Thu, 9 Dec 2021 16:34:32 -0800 Subject: [PATCH 16/29] No more material spec, everything is StructType --- .../flywheel/api/FlywheelRendered.java | 4 --- .../jozufozu/flywheel/api/MaterialGroup.java | 4 ++- .../jozufozu/flywheel/api/MaterialSpec.java | 28 ------------------- .../{backend => api}/struct/Batched.java | 2 +- .../struct/BatchingTransformer.java | 2 +- .../struct/Instanced.java} | 10 +++++-- .../{backend => api}/struct/StructType.java | 4 +-- .../{backend => api}/struct/StructWriter.java | 2 +- .../flywheel/api/struct/package-info.java | 6 ++++ .../jozufozu/flywheel/backend/Backend.java | 10 +++---- .../backend/instancing/AbstractInstancer.java | 2 +- .../instancing/batching/BatchedMaterial.java | 6 ++-- .../batching/BatchedMaterialGroup.java | 5 ++-- .../instancing/batching/CPUInstancer.java | 4 +-- .../instancing/instancing/GPUInstancer.java | 8 +++--- .../instancing/InstancedMaterial.java | 6 ++-- .../instancing/InstancedMaterialGroup.java | 10 ++++--- .../flywheel/backend/struct/BufferWriter.java | 2 ++ .../backend/struct/UnsafeBufferWriter.java | 1 + .../com/jozufozu/flywheel/core/Materials.java | 17 +++++------ .../jozufozu/flywheel/core/WorldContext.java | 4 +-- .../materials/model/ModelTransformer.java | 2 +- .../core/materials/model/ModelType.java | 18 ++++++++---- .../core/materials/model/package-info.java | 6 ++++ .../model/writer/UnsafeModelWriter.java | 2 +- .../core/materials/oriented/OrientedType.java | 18 ++++++++---- .../core/materials/oriented/package-info.java | 6 ++++ .../oriented/writer/UnsafeOrientedWriter.java | 2 +- 28 files changed, 101 insertions(+), 90 deletions(-) delete mode 100644 src/main/java/com/jozufozu/flywheel/api/MaterialSpec.java rename src/main/java/com/jozufozu/flywheel/{backend => api}/struct/Batched.java (82%) rename src/main/java/com/jozufozu/flywheel/{backend => api}/struct/BatchingTransformer.java (82%) rename src/main/java/com/jozufozu/flywheel/{backend/struct/Writeable.java => api/struct/Instanced.java} (59%) rename src/main/java/com/jozufozu/flywheel/{backend => api}/struct/StructType.java (85%) rename src/main/java/com/jozufozu/flywheel/{backend => api}/struct/StructWriter.java (87%) create mode 100644 src/main/java/com/jozufozu/flywheel/api/struct/package-info.java create mode 100644 src/main/java/com/jozufozu/flywheel/core/materials/model/package-info.java create mode 100644 src/main/java/com/jozufozu/flywheel/core/materials/oriented/package-info.java diff --git a/src/main/java/com/jozufozu/flywheel/api/FlywheelRendered.java b/src/main/java/com/jozufozu/flywheel/api/FlywheelRendered.java index 59d656edf..7ccb6149c 100644 --- a/src/main/java/com/jozufozu/flywheel/api/FlywheelRendered.java +++ b/src/main/java/com/jozufozu/flywheel/api/FlywheelRendered.java @@ -1,7 +1,5 @@ package com.jozufozu.flywheel.api; -import net.minecraft.world.level.Level; - /** * Something (a BlockEntity or Entity) that can be rendered using the instancing API. */ @@ -13,6 +11,4 @@ public interface FlywheelRendered { default boolean shouldRenderNormally() { return false; } - - Level getWorld(); } diff --git a/src/main/java/com/jozufozu/flywheel/api/MaterialGroup.java b/src/main/java/com/jozufozu/flywheel/api/MaterialGroup.java index 9f9c5ee98..ba48748df 100644 --- a/src/main/java/com/jozufozu/flywheel/api/MaterialGroup.java +++ b/src/main/java/com/jozufozu/flywheel/api/MaterialGroup.java @@ -1,5 +1,7 @@ package com.jozufozu.flywheel.api; +import com.jozufozu.flywheel.api.struct.StructType; + public interface MaterialGroup { /** * Get the material as defined by the given {@link MaterialSpec spec}. @@ -8,5 +10,5 @@ public interface MaterialGroup { * @param The type representing the per instance data. * @return A material you can use to render models. */ - Material material(MaterialSpec spec); + Material material(StructType spec); } diff --git a/src/main/java/com/jozufozu/flywheel/api/MaterialSpec.java b/src/main/java/com/jozufozu/flywheel/api/MaterialSpec.java deleted file mode 100644 index eb39d03a2..000000000 --- a/src/main/java/com/jozufozu/flywheel/api/MaterialSpec.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.jozufozu.flywheel.api; - -import com.jozufozu.flywheel.backend.struct.StructType; - -import net.minecraft.resources.ResourceLocation; - -public class MaterialSpec { - - public final ResourceLocation name; - - private final ResourceLocation programSpec; - private final StructType instanceType; - - public MaterialSpec(ResourceLocation name, ResourceLocation programSpec, StructType type) { - this.name = name; - this.programSpec = programSpec; - this.instanceType = type; - } - - public ResourceLocation getProgramName() { - return programSpec; - } - - public StructType getInstanceType() { - return instanceType; - } - -} diff --git a/src/main/java/com/jozufozu/flywheel/backend/struct/Batched.java b/src/main/java/com/jozufozu/flywheel/api/struct/Batched.java similarity index 82% rename from src/main/java/com/jozufozu/flywheel/backend/struct/Batched.java rename to src/main/java/com/jozufozu/flywheel/api/struct/Batched.java index 687dd933e..ddf7e17b8 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/struct/Batched.java +++ b/src/main/java/com/jozufozu/flywheel/api/struct/Batched.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.backend.struct; +package com.jozufozu.flywheel.api.struct; import com.jozufozu.flywheel.core.model.Model; diff --git a/src/main/java/com/jozufozu/flywheel/backend/struct/BatchingTransformer.java b/src/main/java/com/jozufozu/flywheel/api/struct/BatchingTransformer.java similarity index 82% rename from src/main/java/com/jozufozu/flywheel/backend/struct/BatchingTransformer.java rename to src/main/java/com/jozufozu/flywheel/api/struct/BatchingTransformer.java index 75f709761..16280a457 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/struct/BatchingTransformer.java +++ b/src/main/java/com/jozufozu/flywheel/api/struct/BatchingTransformer.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.backend.struct; +package com.jozufozu.flywheel.api.struct; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; diff --git a/src/main/java/com/jozufozu/flywheel/backend/struct/Writeable.java b/src/main/java/com/jozufozu/flywheel/api/struct/Instanced.java similarity index 59% rename from src/main/java/com/jozufozu/flywheel/backend/struct/Writeable.java rename to src/main/java/com/jozufozu/flywheel/api/struct/Instanced.java index 869e47ed4..f09ca6bff 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/struct/Writeable.java +++ b/src/main/java/com/jozufozu/flywheel/api/struct/Instanced.java @@ -1,8 +1,10 @@ -package com.jozufozu.flywheel.backend.struct; +package com.jozufozu.flywheel.api.struct; import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer; -public interface Writeable extends StructType { +import net.minecraft.resources.ResourceLocation; + +public interface Instanced extends StructType { /** * Create a {@link StructWriter} that will consume instances of S and write them to the given buffer. * @@ -10,8 +12,10 @@ public interface Writeable extends StructType { */ StructWriter getWriter(VecBuffer backing); + ResourceLocation getProgramSpec(); + @Override - default Writeable asWriteable() { + default Instanced asInstanced() { return this; } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/struct/StructType.java b/src/main/java/com/jozufozu/flywheel/api/struct/StructType.java similarity index 85% rename from src/main/java/com/jozufozu/flywheel/backend/struct/StructType.java rename to src/main/java/com/jozufozu/flywheel/api/struct/StructType.java index 6591a5faa..999161229 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/struct/StructType.java +++ b/src/main/java/com/jozufozu/flywheel/api/struct/StructType.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.backend.struct; +package com.jozufozu.flywheel.api.struct; import com.jozufozu.flywheel.backend.gl.attrib.VertexFormat; @@ -18,7 +18,7 @@ public interface StructType { */ VertexFormat format(); - Writeable asWriteable(); + Instanced asInstanced(); Batched asBatched(); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/struct/StructWriter.java b/src/main/java/com/jozufozu/flywheel/api/struct/StructWriter.java similarity index 87% rename from src/main/java/com/jozufozu/flywheel/backend/struct/StructWriter.java rename to src/main/java/com/jozufozu/flywheel/api/struct/StructWriter.java index 7c22400f6..abebee807 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/struct/StructWriter.java +++ b/src/main/java/com/jozufozu/flywheel/api/struct/StructWriter.java @@ -1,4 +1,4 @@ -package com.jozufozu.flywheel.backend.struct; +package com.jozufozu.flywheel.api.struct; /** * StructWriters can quickly consume many instances of S and write them to some backing buffer. diff --git a/src/main/java/com/jozufozu/flywheel/api/struct/package-info.java b/src/main/java/com/jozufozu/flywheel/api/struct/package-info.java new file mode 100644 index 000000000..da8cef289 --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/api/struct/package-info.java @@ -0,0 +1,6 @@ +@ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault +package com.jozufozu.flywheel.api.struct; + +import javax.annotation.ParametersAreNonnullByDefault; + +import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/com/jozufozu/flywheel/backend/Backend.java b/src/main/java/com/jozufozu/flywheel/backend/Backend.java index 2d8edb5b7..6485843e3 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/Backend.java +++ b/src/main/java/com/jozufozu/flywheel/backend/Backend.java @@ -17,6 +17,7 @@ import com.jozufozu.flywheel.api.FlywheelWorld; import com.jozufozu.flywheel.backend.gl.versioned.GlCompat; import com.jozufozu.flywheel.api.InstanceData; import com.jozufozu.flywheel.api.MaterialSpec; +import com.jozufozu.flywheel.api.struct.StructType; import com.jozufozu.flywheel.config.FlwConfig; import com.jozufozu.flywheel.core.shader.spec.ProgramSpec; @@ -43,7 +44,7 @@ public class Backend { private boolean enabled; private final List> contexts = new ArrayList<>(); - private final Map> materialRegistry = new HashMap<>(); + private final Map> materialRegistry = new HashMap<>(); private final Map programSpecRegistry = new HashMap<>(); protected Backend() { @@ -91,14 +92,13 @@ public class Backend { /** * Register an instancing material. */ - public MaterialSpec register(MaterialSpec spec) { - ResourceLocation name = spec.name; + public StructType register(ResourceLocation name, StructType spec) { if (materialRegistry.containsKey(name)) { throw new IllegalStateException("Material spec '" + name + "' already registered."); } materialRegistry.put(name, spec); - log.debug("registered material '" + name + "' with instance size " + spec.getInstanceType().format().getStride()); + log.debug("registered material '" + name + "' with instance size " + spec.format().getStride()); return spec; } @@ -143,7 +143,7 @@ public class Backend { return canUseInstancing() && isFlywheelWorld(world); } - public Collection> allMaterials() { + public Collection> allMaterials() { return materialRegistry.values(); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstancer.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstancer.java index aa3574c11..11aec327e 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstancer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/AbstractInstancer.java @@ -5,7 +5,7 @@ import java.util.BitSet; import com.jozufozu.flywheel.api.InstanceData; import com.jozufozu.flywheel.api.Instancer; -import com.jozufozu.flywheel.backend.struct.StructType; +import com.jozufozu.flywheel.api.struct.StructType; import com.jozufozu.flywheel.core.model.Model; public abstract class AbstractInstancer implements Instancer { diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterial.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterial.java index d7b24c696..c9e022800 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterial.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterial.java @@ -8,7 +8,7 @@ import com.jozufozu.flywheel.api.InstanceData; import com.jozufozu.flywheel.api.Instancer; import com.jozufozu.flywheel.api.Material; import com.jozufozu.flywheel.api.MaterialSpec; -import com.jozufozu.flywheel.backend.struct.StructType; +import com.jozufozu.flywheel.api.struct.StructType; import com.jozufozu.flywheel.core.model.Model; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; @@ -18,8 +18,8 @@ public class BatchedMaterial implements Material { protected final Map> models; private final StructType type; - public BatchedMaterial(MaterialSpec spec) { - type = spec.getInstanceType(); + public BatchedMaterial(StructType type) { + this.type = type; this.models = new HashMap<>(); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterialGroup.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterialGroup.java index 64aaa2a2c..dc35e0f06 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterialGroup.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterialGroup.java @@ -6,6 +6,7 @@ import java.util.Map; import com.jozufozu.flywheel.api.InstanceData; import com.jozufozu.flywheel.api.MaterialGroup; import com.jozufozu.flywheel.api.MaterialSpec; +import com.jozufozu.flywheel.api.struct.StructType; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; @@ -16,7 +17,7 @@ public class BatchedMaterialGroup implements MaterialGroup { protected final RenderType state; - private final Map, BatchedMaterial> materials = new HashMap<>(); + private final Map, BatchedMaterial> materials = new HashMap<>(); public BatchedMaterialGroup(RenderType state) { this.state = state; @@ -30,7 +31,7 @@ public class BatchedMaterialGroup implements MaterialGroup { */ @SuppressWarnings("unchecked") @Override - public BatchedMaterial material(MaterialSpec spec) { + public BatchedMaterial material(StructType spec) { return (BatchedMaterial) materials.computeIfAbsent(spec, BatchedMaterial::new); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/CPUInstancer.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/CPUInstancer.java index 0e27115bf..270812f92 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/CPUInstancer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/CPUInstancer.java @@ -2,8 +2,8 @@ package com.jozufozu.flywheel.backend.instancing.batching; import com.jozufozu.flywheel.backend.instancing.AbstractInstancer; import com.jozufozu.flywheel.api.InstanceData; -import com.jozufozu.flywheel.backend.struct.BatchingTransformer; -import com.jozufozu.flywheel.backend.struct.StructType; +import com.jozufozu.flywheel.api.struct.BatchingTransformer; +import com.jozufozu.flywheel.api.struct.StructType; import com.jozufozu.flywheel.core.model.Model; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/GPUInstancer.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/GPUInstancer.java index e0e532401..556671492 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/GPUInstancer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/GPUInstancer.java @@ -13,8 +13,8 @@ import com.jozufozu.flywheel.backend.instancing.AbstractInstancer; import com.jozufozu.flywheel.api.InstanceData; import com.jozufozu.flywheel.backend.model.IBufferedModel; import com.jozufozu.flywheel.backend.model.ModelAllocator; -import com.jozufozu.flywheel.backend.struct.StructType; -import com.jozufozu.flywheel.backend.struct.StructWriter; +import com.jozufozu.flywheel.api.struct.StructType; +import com.jozufozu.flywheel.api.struct.StructWriter; import com.jozufozu.flywheel.core.model.Model; import com.jozufozu.flywheel.util.AttribUtil; @@ -161,7 +161,7 @@ public class GPUInstancer extends AbstractInstancer { if (length > 0) { MappedBuffer mapped = instanceVBO.getBuffer(offset, length); - StructWriter writer = type.asWriteable().getWriter(mapped); + StructWriter writer = type.asInstanced().getWriter(mapped); dirtySet.stream() .forEach(i -> { @@ -181,7 +181,7 @@ public class GPUInstancer extends AbstractInstancer { instanceVBO.alloc(glBufferSize); MappedBuffer buffer = instanceVBO.getBuffer(0, glBufferSize); - StructWriter writer = type.asWriteable().getWriter(buffer); + StructWriter writer = type.asInstanced().getWriter(buffer); for (D datum : data) { writer.write(datum); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterial.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterial.java index 855c993b7..675b8fd90 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterial.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterial.java @@ -11,7 +11,7 @@ import com.jozufozu.flywheel.api.Instancer; import com.jozufozu.flywheel.api.Material; import com.jozufozu.flywheel.api.MaterialSpec; import com.jozufozu.flywheel.backend.model.ModelPool; -import com.jozufozu.flywheel.backend.struct.StructType; +import com.jozufozu.flywheel.api.struct.StructType; import com.jozufozu.flywheel.core.Formats; import com.jozufozu.flywheel.core.model.Model; @@ -25,8 +25,8 @@ public class InstancedMaterial implements Material { protected final Cache> models; protected final StructType type; - public InstancedMaterial(MaterialSpec spec) { - this.type = spec.getInstanceType(); + public InstancedMaterial(StructType spec) { + this.type = spec; modelPool = new ModelPool(Formats.UNLIT_MODEL, 64); this.models = CacheBuilder.newBuilder() diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterialGroup.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterialGroup.java index 178dfc4c4..cff2ed787 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterialGroup.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterialGroup.java @@ -7,6 +7,7 @@ import java.util.Map; import com.jozufozu.flywheel.api.InstanceData; import com.jozufozu.flywheel.api.MaterialGroup; import com.jozufozu.flywheel.api.MaterialSpec; +import com.jozufozu.flywheel.api.struct.StructType; import com.jozufozu.flywheel.core.shader.WorldProgram; import com.jozufozu.flywheel.util.TextureBinder; import com.mojang.math.Matrix4f; @@ -26,7 +27,7 @@ public class InstancedMaterialGroup

implements MaterialG protected final ArrayList> renderers = new ArrayList<>(); - private final Map, InstancedMaterial> materials = new HashMap<>(); + private final Map, InstancedMaterial> materials = new HashMap<>(); public InstancedMaterialGroup(InstancingEngine

owner, RenderType type) { this.owner = owner; @@ -41,7 +42,7 @@ public class InstancedMaterialGroup

implements MaterialG */ @SuppressWarnings("unchecked") @Override - public InstancedMaterial material(MaterialSpec spec) { + public InstancedMaterial material(StructType spec) { return (InstancedMaterial) materials.computeIfAbsent(spec, this::createInstanceMaterial); } @@ -70,10 +71,11 @@ public class InstancedMaterialGroup

implements MaterialG renderers.clear(); } - private InstancedMaterial createInstanceMaterial(MaterialSpec type) { + private InstancedMaterial createInstanceMaterial(StructType type) { InstancedMaterial material = new InstancedMaterial<>(type); - this.renderers.add(new InstancedMaterialRenderer<>(owner.getProgram(type.getProgramName()), material, this::setup)); + this.renderers.add(new InstancedMaterialRenderer<>(owner.getProgram(type.asInstanced() + .getProgramSpec()), material, this::setup)); return material; } diff --git a/src/main/java/com/jozufozu/flywheel/backend/struct/BufferWriter.java b/src/main/java/com/jozufozu/flywheel/backend/struct/BufferWriter.java index 5d302f5e7..d46cbcaed 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/struct/BufferWriter.java +++ b/src/main/java/com/jozufozu/flywheel/backend/struct/BufferWriter.java @@ -1,5 +1,7 @@ package com.jozufozu.flywheel.backend.struct; +import com.jozufozu.flywheel.api.struct.StructType; +import com.jozufozu.flywheel.api.struct.StructWriter; import com.jozufozu.flywheel.backend.gl.attrib.VertexFormat; import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer; diff --git a/src/main/java/com/jozufozu/flywheel/backend/struct/UnsafeBufferWriter.java b/src/main/java/com/jozufozu/flywheel/backend/struct/UnsafeBufferWriter.java index 485d7a6f8..d5e97eeb9 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/struct/UnsafeBufferWriter.java +++ b/src/main/java/com/jozufozu/flywheel/backend/struct/UnsafeBufferWriter.java @@ -2,6 +2,7 @@ package com.jozufozu.flywheel.backend.struct; import org.lwjgl.system.MemoryUtil; +import com.jozufozu.flywheel.api.struct.StructType; import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer; /** diff --git a/src/main/java/com/jozufozu/flywheel/core/Materials.java b/src/main/java/com/jozufozu/flywheel/core/Materials.java index 619c52b86..ccae21eaf 100644 --- a/src/main/java/com/jozufozu/flywheel/core/Materials.java +++ b/src/main/java/com/jozufozu/flywheel/core/Materials.java @@ -1,7 +1,7 @@ package com.jozufozu.flywheel.core; -import com.jozufozu.flywheel.api.MaterialSpec; -import com.jozufozu.flywheel.backend.struct.StructType; +import com.jozufozu.flywheel.backend.Backend; +import com.jozufozu.flywheel.api.struct.StructType; import com.jozufozu.flywheel.core.materials.model.ModelData; import com.jozufozu.flywheel.core.materials.model.ModelType; import com.jozufozu.flywheel.core.materials.oriented.OrientedData; @@ -14,17 +14,14 @@ import net.minecraftforge.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) public class Materials { - public static final StructType ORIENTED_TYPE = new OrientedType(); - public static final StructType TRANSFORMED_TYPE = new ModelType(); - public static final MaterialSpec ORIENTED = new MaterialSpec<>(Names.ORIENTED, Programs.ORIENTED, ORIENTED_TYPE); - public static final MaterialSpec TRANSFORMED = new MaterialSpec<>(Names.MODEL, Programs.TRANSFORMED, TRANSFORMED_TYPE); + public static final StructType ORIENTED = new OrientedType(); + public static final StructType TRANSFORMED = new ModelType(); public static void flwInit(GatherContextEvent event) { - event.getBackend() - .register(ORIENTED); - event.getBackend() - .register(TRANSFORMED); + Backend backend = event.getBackend(); + backend.register(Names.ORIENTED, ORIENTED); + backend.register(Names.MODEL, TRANSFORMED); } public static class Names { diff --git a/src/main/java/com/jozufozu/flywheel/core/WorldContext.java b/src/main/java/com/jozufozu/flywheel/core/WorldContext.java index a9a2ae14e..5271003bd 100644 --- a/src/main/java/com/jozufozu/flywheel/core/WorldContext.java +++ b/src/main/java/com/jozufozu/flywheel/core/WorldContext.java @@ -7,7 +7,6 @@ import java.util.stream.Stream; import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.ShaderContext; -import com.jozufozu.flywheel.api.MaterialSpec; import com.jozufozu.flywheel.backend.pipeline.ShaderPipeline; import com.jozufozu.flywheel.core.shader.ContextAwareProgram; import com.jozufozu.flywheel.core.shader.WorldProgram; @@ -88,7 +87,8 @@ public class WorldContext

implements ShaderContext

{ if (specStream == null) { specStream = () -> backend.allMaterials() .stream() - .map(MaterialSpec::getProgramName); + .map(type -> type.asInstanced() + .getProgramSpec()); } return new WorldContext<>(backend, name, specStream, pipeline); } diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelTransformer.java b/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelTransformer.java index bfa0a1ac6..0851fbcc4 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelTransformer.java +++ b/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelTransformer.java @@ -1,6 +1,6 @@ package com.jozufozu.flywheel.core.materials.model; -import com.jozufozu.flywheel.backend.struct.BatchingTransformer; +import com.jozufozu.flywheel.api.struct.BatchingTransformer; import com.jozufozu.flywheel.core.model.Model; public class ModelTransformer extends BatchingTransformer { diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelType.java b/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelType.java index ff99dc97b..6b824890f 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelType.java +++ b/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelType.java @@ -2,15 +2,18 @@ package com.jozufozu.flywheel.core.materials.model; import com.jozufozu.flywheel.backend.gl.attrib.VertexFormat; import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer; -import com.jozufozu.flywheel.backend.struct.Batched; -import com.jozufozu.flywheel.backend.struct.BatchingTransformer; -import com.jozufozu.flywheel.backend.struct.StructWriter; -import com.jozufozu.flywheel.backend.struct.Writeable; +import com.jozufozu.flywheel.api.struct.Batched; +import com.jozufozu.flywheel.api.struct.BatchingTransformer; +import com.jozufozu.flywheel.api.struct.StructWriter; +import com.jozufozu.flywheel.api.struct.Instanced; import com.jozufozu.flywheel.core.Formats; +import com.jozufozu.flywheel.core.Programs; import com.jozufozu.flywheel.core.materials.model.writer.UnsafeModelWriter; import com.jozufozu.flywheel.core.model.Model; -public class ModelType implements Writeable, Batched { +import net.minecraft.resources.ResourceLocation; + +public class ModelType implements Instanced, Batched { @Override public ModelData create() { @@ -27,6 +30,11 @@ public class ModelType implements Writeable, Batched { return new UnsafeModelWriter(backing, this); } + @Override + public ResourceLocation getProgramSpec() { + return Programs.TRANSFORMED; + } + @Override public BatchingTransformer getTransformer(Model model) { return null; diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/model/package-info.java b/src/main/java/com/jozufozu/flywheel/core/materials/model/package-info.java new file mode 100644 index 000000000..9f136b741 --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/core/materials/model/package-info.java @@ -0,0 +1,6 @@ +@ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault +package com.jozufozu.flywheel.core.materials.model; + +import javax.annotation.ParametersAreNonnullByDefault; + +import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/model/writer/UnsafeModelWriter.java b/src/main/java/com/jozufozu/flywheel/core/materials/model/writer/UnsafeModelWriter.java index 090070cc2..f7dba06ad 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/model/writer/UnsafeModelWriter.java +++ b/src/main/java/com/jozufozu/flywheel/core/materials/model/writer/UnsafeModelWriter.java @@ -3,7 +3,7 @@ package com.jozufozu.flywheel.core.materials.model.writer; import org.lwjgl.system.MemoryUtil; import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer; -import com.jozufozu.flywheel.backend.struct.StructType; +import com.jozufozu.flywheel.api.struct.StructType; import com.jozufozu.flywheel.backend.struct.UnsafeBufferWriter; import com.jozufozu.flywheel.core.materials.model.ModelData; import com.jozufozu.flywheel.util.WriteUnsafe; diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedType.java b/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedType.java index 5019cd61d..f5203d69c 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedType.java +++ b/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedType.java @@ -2,15 +2,18 @@ package com.jozufozu.flywheel.core.materials.oriented; import com.jozufozu.flywheel.backend.gl.attrib.VertexFormat; import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer; -import com.jozufozu.flywheel.backend.struct.Batched; -import com.jozufozu.flywheel.backend.struct.BatchingTransformer; -import com.jozufozu.flywheel.backend.struct.StructWriter; -import com.jozufozu.flywheel.backend.struct.Writeable; +import com.jozufozu.flywheel.api.struct.Batched; +import com.jozufozu.flywheel.api.struct.BatchingTransformer; +import com.jozufozu.flywheel.api.struct.StructWriter; +import com.jozufozu.flywheel.api.struct.Instanced; import com.jozufozu.flywheel.core.Formats; +import com.jozufozu.flywheel.core.Programs; import com.jozufozu.flywheel.core.materials.oriented.writer.UnsafeOrientedWriter; import com.jozufozu.flywheel.core.model.Model; -public class OrientedType implements Writeable, Batched { +import net.minecraft.resources.ResourceLocation; + +public class OrientedType implements Instanced, Batched { @Override public OrientedData create() { @@ -27,6 +30,11 @@ public class OrientedType implements Writeable, Batched getTransformer(Model model) { return null; diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/oriented/package-info.java b/src/main/java/com/jozufozu/flywheel/core/materials/oriented/package-info.java new file mode 100644 index 000000000..185239e40 --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/core/materials/oriented/package-info.java @@ -0,0 +1,6 @@ +@ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault +package com.jozufozu.flywheel.core.materials.oriented; + +import javax.annotation.ParametersAreNonnullByDefault; + +import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/oriented/writer/UnsafeOrientedWriter.java b/src/main/java/com/jozufozu/flywheel/core/materials/oriented/writer/UnsafeOrientedWriter.java index b44df9a9d..b33cefa58 100644 --- a/src/main/java/com/jozufozu/flywheel/core/materials/oriented/writer/UnsafeOrientedWriter.java +++ b/src/main/java/com/jozufozu/flywheel/core/materials/oriented/writer/UnsafeOrientedWriter.java @@ -3,7 +3,7 @@ package com.jozufozu.flywheel.core.materials.oriented.writer; import org.lwjgl.system.MemoryUtil; import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer; -import com.jozufozu.flywheel.backend.struct.StructType; +import com.jozufozu.flywheel.api.struct.StructType; import com.jozufozu.flywheel.backend.struct.UnsafeBufferWriter; import com.jozufozu.flywheel.core.materials.oriented.OrientedData; From b892f602cb7f80a9f373bc89210c1dc294ec80d7 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Thu, 9 Dec 2021 16:40:01 -0800 Subject: [PATCH 17/29] Whoops remove imports --- src/main/java/com/jozufozu/flywheel/api/MaterialGroup.java | 2 +- src/main/java/com/jozufozu/flywheel/backend/Backend.java | 1 - .../flywheel/backend/instancing/batching/BatchedMaterial.java | 1 - .../backend/instancing/batching/BatchedMaterialGroup.java | 3 +-- .../backend/instancing/instancing/InstancedMaterial.java | 1 - .../backend/instancing/instancing/InstancedMaterialGroup.java | 1 - 6 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/jozufozu/flywheel/api/MaterialGroup.java b/src/main/java/com/jozufozu/flywheel/api/MaterialGroup.java index ba48748df..47908b64e 100644 --- a/src/main/java/com/jozufozu/flywheel/api/MaterialGroup.java +++ b/src/main/java/com/jozufozu/flywheel/api/MaterialGroup.java @@ -4,7 +4,7 @@ import com.jozufozu.flywheel.api.struct.StructType; public interface MaterialGroup { /** - * Get the material as defined by the given {@link MaterialSpec spec}. + * Get the material as defined by the given {@link StructType type}. * * @param spec The material you want to create instances with. * @param The type representing the per instance data. diff --git a/src/main/java/com/jozufozu/flywheel/backend/Backend.java b/src/main/java/com/jozufozu/flywheel/backend/Backend.java index 6485843e3..2be21c97e 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/Backend.java +++ b/src/main/java/com/jozufozu/flywheel/backend/Backend.java @@ -16,7 +16,6 @@ import org.lwjgl.opengl.GLCapabilities; import com.jozufozu.flywheel.api.FlywheelWorld; import com.jozufozu.flywheel.backend.gl.versioned.GlCompat; import com.jozufozu.flywheel.api.InstanceData; -import com.jozufozu.flywheel.api.MaterialSpec; import com.jozufozu.flywheel.api.struct.StructType; import com.jozufozu.flywheel.config.FlwConfig; import com.jozufozu.flywheel.core.shader.spec.ProgramSpec; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterial.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterial.java index c9e022800..2593c67bf 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterial.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterial.java @@ -7,7 +7,6 @@ import java.util.function.Supplier; import com.jozufozu.flywheel.api.InstanceData; import com.jozufozu.flywheel.api.Instancer; import com.jozufozu.flywheel.api.Material; -import com.jozufozu.flywheel.api.MaterialSpec; import com.jozufozu.flywheel.api.struct.StructType; import com.jozufozu.flywheel.core.model.Model; import com.mojang.blaze3d.vertex.PoseStack; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterialGroup.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterialGroup.java index dc35e0f06..70e092e75 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterialGroup.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMaterialGroup.java @@ -5,7 +5,6 @@ import java.util.Map; import com.jozufozu.flywheel.api.InstanceData; import com.jozufozu.flywheel.api.MaterialGroup; -import com.jozufozu.flywheel.api.MaterialSpec; import com.jozufozu.flywheel.api.struct.StructType; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; @@ -24,7 +23,7 @@ public class BatchedMaterialGroup implements MaterialGroup { } /** - * Get the material as defined by the given {@link MaterialSpec spec}. + * Get the material as defined by the given {@link StructType type}. * @param spec The material you want to create instances with. * @param The type representing the per instance data. * @return A diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterial.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterial.java index 675b8fd90..dc8678362 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterial.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterial.java @@ -9,7 +9,6 @@ import com.jozufozu.flywheel.backend.RenderWork; import com.jozufozu.flywheel.api.InstanceData; import com.jozufozu.flywheel.api.Instancer; import com.jozufozu.flywheel.api.Material; -import com.jozufozu.flywheel.api.MaterialSpec; import com.jozufozu.flywheel.backend.model.ModelPool; import com.jozufozu.flywheel.api.struct.StructType; import com.jozufozu.flywheel.core.Formats; diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterialGroup.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterialGroup.java index cff2ed787..ac7f9b36f 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterialGroup.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMaterialGroup.java @@ -6,7 +6,6 @@ import java.util.Map; import com.jozufozu.flywheel.api.InstanceData; import com.jozufozu.flywheel.api.MaterialGroup; -import com.jozufozu.flywheel.api.MaterialSpec; import com.jozufozu.flywheel.api.struct.StructType; import com.jozufozu.flywheel.core.shader.WorldProgram; import com.jozufozu.flywheel.util.TextureBinder; From 0d388b009492180a907be8c8e010e86bc802980c Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Thu, 9 Dec 2021 16:54:19 -0800 Subject: [PATCH 18/29] Update changelog --- build.gradle | 2 +- changelog.txt | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 77e321386..f59c77288 100644 --- a/build.gradle +++ b/build.gradle @@ -180,6 +180,6 @@ curseforge { changelog = file('changelog.txt') releaseType = project.curse_type mainArtifact jar - addGameVersion '1.17.1' + addGameVersion '1.18' } } diff --git a/changelog.txt b/changelog.txt index f622037ed..395b19754 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,4 +1,16 @@ -0.3.0: -Update to 1.17 -New +0.4.0: +Update to 1.18 +Fixes + - Fix potential nullpointer rendering breaking overlay + - Fix inconsistency in minecart model + - Fix memory leak when instance worlds get reset Technical/API + - No more MaterialSpec, everything is StructType + - Move most user facing interfaces to flywheel.api package + - Refactor InstanceData to have no package private fields + - Rename many interfaces + - All materials use the same vertex format: UNLIT_MODEL + - call #tick and #beginFrame on instance creation + - Fixes weird delay in object appearance when reloading chunks + - Add instances when chunks are built for rendering + - Server worlds are not flywheel worlds From 99e15cbcd9f4eec4f6de97c9221ca5c8c552a4a9 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Fri, 10 Dec 2021 00:07:52 -0800 Subject: [PATCH 19/29] Debugging changes - MapBufferRange compat layer not needed, missed that - Don't need MappedFullBuffer anymore - Add guard for size in GPULightVolume#bind - LightVolume#getStride not needed - Replace usaged of GlError#poll with #pollAndThrow - VecBufferConsumer doesn't need a format --- .../flywheel/backend/gl/GlTexture.java | 4 ++ .../backend/gl/buffer/MappedBufferRange.java | 11 ++--- .../backend/gl/buffer/MappedFullBuffer.java | 32 ------------ .../backend/gl/buffer/MappedGlBuffer.java | 11 +---- .../backend/gl/buffer/PersistentGlBuffer.java | 6 +-- .../gl/buffer/PersistentMappedBuffer.java | 10 ++-- .../flywheel/backend/gl/buffer/VecBuffer.java | 4 +- .../flywheel/backend/gl/error/GlError.java | 2 +- .../backend/gl/versioned/GlCompat.java | 3 -- .../backend/gl/versioned/MapBufferRange.java | 49 ------------------- .../flywheel/backend/model/BufferedModel.java | 4 +- .../flywheel/backend/model/ModelPool.java | 6 +-- ...fferConsumer.java => VecBufferWriter.java} | 8 +-- .../flywheel/light/GPULightVolume.java | 25 +++++----- .../jozufozu/flywheel/light/LightVolume.java | 17 ++----- 15 files changed, 42 insertions(+), 150 deletions(-) delete mode 100644 src/main/java/com/jozufozu/flywheel/backend/gl/buffer/MappedFullBuffer.java delete mode 100644 src/main/java/com/jozufozu/flywheel/backend/gl/versioned/MapBufferRange.java rename src/main/java/com/jozufozu/flywheel/core/model/{VecBufferConsumer.java => VecBufferWriter.java} (82%) diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/GlTexture.java b/src/main/java/com/jozufozu/flywheel/backend/gl/GlTexture.java index 76e637a6e..bc42e26bd 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/GlTexture.java +++ b/src/main/java/com/jozufozu/flywheel/backend/gl/GlTexture.java @@ -22,4 +22,8 @@ public class GlTexture extends GlObject { public void unbind() { GL20.glBindTexture(textureType, 0); } + + public void setParameteri(int parameter, int value) { + GL20.glTexParameteri(textureType, parameter, value); + } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/MappedBufferRange.java b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/MappedBufferRange.java index 47c6d764a..9385e3efd 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/MappedBufferRange.java +++ b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/MappedBufferRange.java @@ -1,9 +1,12 @@ package com.jozufozu.flywheel.backend.gl.buffer; +import org.lwjgl.opengl.GL30; + import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.gl.error.GlError; import com.jozufozu.flywheel.backend.gl.error.GlException; import com.jozufozu.flywheel.util.StringUtil; +import com.mojang.blaze3d.platform.GlStateManager; public class MappedBufferRange extends MappedBuffer { @@ -28,13 +31,9 @@ public class MappedBufferRange extends MappedBuffer { @Override protected void checkAndMap() { if (!mapped) { - setInternal(Backend.getInstance().compat.mapBufferRange.mapBuffer(owner.type, offset, length, access)); + setInternal(GL30.glMapBufferRange(owner.type.glEnum, offset, length, access)); - GlError error = GlError.poll(); - - if (error != null) { - throw new GlException(error, StringUtil.args("mapBufferRange", owner.type, offset, length, access)); - } + GlError.pollAndThrow(() -> StringUtil.args("mapBufferRange", owner.type, offset, length, access)); mapped = true; } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/MappedFullBuffer.java b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/MappedFullBuffer.java deleted file mode 100644 index 4ed9f1fde..000000000 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/MappedFullBuffer.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.jozufozu.flywheel.backend.gl.buffer; - -import org.lwjgl.opengl.GL15; - -import com.jozufozu.flywheel.backend.gl.error.GlError; -import com.jozufozu.flywheel.backend.gl.error.GlException; -import com.jozufozu.flywheel.util.StringUtil; - -public class MappedFullBuffer extends MappedBuffer { - - MappedBufferUsage usage; - - public MappedFullBuffer(GlBuffer buffer, MappedBufferUsage usage) { - super(buffer); - this.usage = usage; - } - - @Override - protected void checkAndMap() { - if (!mapped) { - setInternal(GL15.glMapBuffer(owner.type.glEnum, usage.glEnum)); - - GlError error = GlError.poll(); - - if (error != null) { - throw new GlException(error, StringUtil.args("mapBuffer", owner.type, usage)); - } - - mapped = true; - } - } -} diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/MappedGlBuffer.java b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/MappedGlBuffer.java index e05362a46..06ee17cfa 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/MappedGlBuffer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/MappedGlBuffer.java @@ -5,9 +5,6 @@ import java.nio.ByteBuffer; import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL30; -import com.jozufozu.flywheel.backend.Backend; -import com.jozufozu.flywheel.backend.gl.versioned.MapBufferRange; - public class MappedGlBuffer extends GlBuffer { protected final GlBufferUsage usage; @@ -30,12 +27,6 @@ public class MappedGlBuffer extends GlBuffer { } public MappedBuffer getBuffer(int offset, int length) { - if (Backend.getInstance().compat.mapBufferRange != MapBufferRange.UNSUPPORTED) { - return new MappedBufferRange(this, offset, length, GL30.GL_MAP_WRITE_BIT); - } else { - MappedFullBuffer fullBuffer = new MappedFullBuffer(this, MappedBufferUsage.WRITE_ONLY); - fullBuffer.position(offset); - return fullBuffer; - } + return new MappedBufferRange(this, offset, length, GL30.GL_MAP_WRITE_BIT); } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/PersistentGlBuffer.java b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/PersistentGlBuffer.java index 6c5188dab..e5dd4348d 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/PersistentGlBuffer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/PersistentGlBuffer.java @@ -48,11 +48,7 @@ public class PersistentGlBuffer extends GlBuffer { Backend.getInstance().compat.bufferStorage.bufferStorage(type, size, flags); - GlError error = GlError.poll(); - - if (error != null) { - throw new GlException(error, StringUtil.args("bufferStorage", type, size, flags)); - } + GlError.pollAndThrow(() -> StringUtil.args("bufferStorage", type, size, flags)); buffer = new PersistentMappedBuffer(this); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/PersistentMappedBuffer.java b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/PersistentMappedBuffer.java index e2f46728f..124c3bf58 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/PersistentMappedBuffer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/PersistentMappedBuffer.java @@ -2,6 +2,8 @@ package com.jozufozu.flywheel.backend.gl.buffer; import java.nio.ByteBuffer; +import org.lwjgl.opengl.GL30; + import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.gl.error.GlError; import com.jozufozu.flywheel.backend.gl.error.GlException; @@ -19,13 +21,9 @@ public class PersistentMappedBuffer extends MappedBuffer { offset = 0; length = owner.size; - ByteBuffer byteBuffer = Backend.getInstance().compat.mapBufferRange.mapBuffer(owner.type, offset, length, owner.flags); + ByteBuffer byteBuffer = GL30.glMapBufferRange(owner.type.glEnum, offset, length, owner.flags); - GlError error = GlError.poll(); - - if (error != null) { - throw new GlException(error, StringUtil.args("mapBuffer", owner.type, offset, length, owner.flags)); - } + GlError.pollAndThrow(() -> StringUtil.args("mapBuffer", owner.type, offset, length, owner.flags)); setInternal(byteBuffer); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/VecBuffer.java b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/VecBuffer.java index 96171c80b..9d36890f1 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/VecBuffer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/VecBuffer.java @@ -5,6 +5,8 @@ import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; +import javax.annotation.Nullable; + public class VecBuffer { protected ByteBuffer internal; @@ -22,7 +24,7 @@ public class VecBuffer { return new VecBuffer(buffer); } - protected void setInternal(ByteBuffer internal) { + protected void setInternal(@Nullable ByteBuffer internal) { this.internal = internal; } diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/error/GlError.java b/src/main/java/com/jozufozu/flywheel/backend/gl/error/GlError.java index 0e133d1c8..115ca765d 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/error/GlError.java +++ b/src/main/java/com/jozufozu/flywheel/backend/gl/error/GlError.java @@ -35,7 +35,7 @@ public enum GlError { this.glEnum = glEnum; } - + // Great for use in your debugger's expression evaluator public static GlError poll() { return errorLookup.get(GL20.glGetError()); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/GlCompat.java b/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/GlCompat.java index 704d85bd7..9abdebfed 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/GlCompat.java +++ b/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/GlCompat.java @@ -16,14 +16,11 @@ import org.lwjgl.system.MemoryUtil; * system. */ public class GlCompat { - public final MapBufferRange mapBufferRange; public final InstancedArrays instancedArrays; public final BufferStorage bufferStorage; public GlCompat(GLCapabilities caps) { - mapBufferRange = getLatest(MapBufferRange.class, caps); - instancedArrays = getLatest(InstancedArrays.class, caps); bufferStorage = getLatest(BufferStorage.class, caps); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/MapBufferRange.java b/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/MapBufferRange.java deleted file mode 100644 index 85f75bc2c..000000000 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/versioned/MapBufferRange.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.jozufozu.flywheel.backend.gl.versioned; - -import java.nio.ByteBuffer; - -import org.lwjgl.opengl.ARBMapBufferRange; -import org.lwjgl.opengl.GL30; -import org.lwjgl.opengl.GLCapabilities; - -import com.jozufozu.flywheel.backend.gl.buffer.GlBufferType; - -public enum MapBufferRange implements GlVersioned { - - GL30_RANGE { - @Override - public boolean supported(GLCapabilities caps) { - return caps.OpenGL30; - } - - @Override - public ByteBuffer mapBuffer(GlBufferType target, long offset, long length, int access) { - return GL30.glMapBufferRange(target.glEnum, offset, length, access); - } - }, - ARB_RANGE { - @Override - public boolean supported(GLCapabilities caps) { - return caps.GL_ARB_map_buffer_range; - } - - @Override - public ByteBuffer mapBuffer(GlBufferType target, long offset, long length, int access) { - return ARBMapBufferRange.glMapBufferRange(target.glEnum, offset, length, access); - } - }, - UNSUPPORTED { - @Override - public boolean supported(GLCapabilities caps) { - return true; - } - - @Override - public ByteBuffer mapBuffer(GlBufferType target, long offset, long length, int access) { - throw new UnsupportedOperationException("glMapBuffer not supported"); - } - }; - - - public abstract ByteBuffer mapBuffer(GlBufferType target, long offset, long length, int access); -} diff --git a/src/main/java/com/jozufozu/flywheel/backend/model/BufferedModel.java b/src/main/java/com/jozufozu/flywheel/backend/model/BufferedModel.java index da8b26bc5..14fe216ac 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/model/BufferedModel.java +++ b/src/main/java/com/jozufozu/flywheel/backend/model/BufferedModel.java @@ -11,7 +11,7 @@ import com.jozufozu.flywheel.backend.gl.buffer.GlBufferType; import com.jozufozu.flywheel.backend.gl.buffer.MappedBuffer; import com.jozufozu.flywheel.backend.gl.buffer.MappedGlBuffer; import com.jozufozu.flywheel.core.model.Model; -import com.jozufozu.flywheel.core.model.VecBufferConsumer; +import com.jozufozu.flywheel.core.model.VecBufferWriter; import com.jozufozu.flywheel.util.AttribUtil; public class BufferedModel implements IBufferedModel { @@ -33,7 +33,7 @@ public class BufferedModel implements IBufferedModel { // mirror it in system memory so we can write to it, and upload our model. MappedBuffer buffer = vbo.getBuffer(0, model.size()); - model.buffer(new VecBufferConsumer(buffer, model.format())); + model.buffer(new VecBufferWriter(buffer)); buffer.flush(); vbo.unbind(); diff --git a/src/main/java/com/jozufozu/flywheel/backend/model/ModelPool.java b/src/main/java/com/jozufozu/flywheel/backend/model/ModelPool.java index 9c64c6469..645858ede 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/model/ModelPool.java +++ b/src/main/java/com/jozufozu/flywheel/backend/model/ModelPool.java @@ -12,7 +12,7 @@ import com.jozufozu.flywheel.backend.gl.buffer.GlBufferType; import com.jozufozu.flywheel.backend.gl.buffer.MappedBuffer; import com.jozufozu.flywheel.backend.gl.buffer.MappedGlBuffer; import com.jozufozu.flywheel.core.model.Model; -import com.jozufozu.flywheel.core.model.VecBufferConsumer; +import com.jozufozu.flywheel.core.model.VecBufferWriter; import com.jozufozu.flywheel.util.AttribUtil; public class ModelPool implements ModelAllocator { @@ -117,7 +117,7 @@ public class ModelPool implements ModelAllocator { private void uploadAll() { MappedBuffer buffer = vbo.getBuffer(0, bufferSize); - VecBufferConsumer consumer = new VecBufferConsumer(buffer, format); + VecBufferWriter consumer = new VecBufferWriter(buffer); for (PooledModel model : models) { model.model.buffer(consumer); @@ -130,7 +130,7 @@ public class ModelPool implements ModelAllocator { private void uploadPending() { MappedBuffer buffer = vbo.getBuffer(0, bufferSize); - VecBufferConsumer consumer = new VecBufferConsumer(buffer, format); + VecBufferWriter consumer = new VecBufferWriter(buffer); int stride = format.getStride(); for (PooledModel model : pendingUpload) { diff --git a/src/main/java/com/jozufozu/flywheel/core/model/VecBufferConsumer.java b/src/main/java/com/jozufozu/flywheel/core/model/VecBufferWriter.java similarity index 82% rename from src/main/java/com/jozufozu/flywheel/core/model/VecBufferConsumer.java rename to src/main/java/com/jozufozu/flywheel/core/model/VecBufferWriter.java index 221193f06..fefc5cf80 100644 --- a/src/main/java/com/jozufozu/flywheel/core/model/VecBufferConsumer.java +++ b/src/main/java/com/jozufozu/flywheel/core/model/VecBufferWriter.java @@ -2,19 +2,15 @@ package com.jozufozu.flywheel.core.model; import static com.jozufozu.flywheel.util.RenderMath.nb; -import com.jozufozu.flywheel.backend.gl.attrib.VertexFormat; import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer; import com.mojang.blaze3d.vertex.VertexConsumer; -public class VecBufferConsumer implements VertexConsumer { - +public class VecBufferWriter implements VertexConsumer { private final VecBuffer buffer; - private final VertexFormat format; - public VecBufferConsumer(VecBuffer buffer, VertexFormat format) { + public VecBufferWriter(VecBuffer buffer) { this.buffer = buffer; - this.format = format; } @Override diff --git a/src/main/java/com/jozufozu/flywheel/light/GPULightVolume.java b/src/main/java/com/jozufozu/flywheel/light/GPULightVolume.java index 80ca9292d..d463a54d7 100644 --- a/src/main/java/com/jozufozu/flywheel/light/GPULightVolume.java +++ b/src/main/java/com/jozufozu/flywheel/light/GPULightVolume.java @@ -44,8 +44,10 @@ public class GPULightVolume extends LightVolume { glTexture = new GlTexture(GL_TEXTURE_3D); + GlTextureUnit oldState = GlTextureUnit.getActive(); + // allocate space for the texture - glActiveTexture(GL_TEXTURE4); + textureUnit.makeActive(); glTexture.bind(); int sizeX = box.sizeX(); @@ -54,7 +56,7 @@ public class GPULightVolume extends LightVolume { glTexImage3D(GL_TEXTURE_3D, 0, GL30.GL_RG8, sizeX, sizeY, sizeZ, 0, GL30.GL_RG, GL_UNSIGNED_BYTE, 0); glTexture.unbind(); - glActiveTexture(GL_TEXTURE0); + oldState.makeActive(); } @Override @@ -67,15 +69,15 @@ public class GPULightVolume extends LightVolume { public void bind() { // just in case something goes wrong, or we accidentally call this before this volume is properly disposed of. - if (lightData == null) return; + if (lightData == null || lightData.capacity() == 0) return; textureUnit.makeActive(); glTexture.bind(); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_MIRRORED_REPEAT); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT); + glTexture.setParameteri(GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexture.setParameteri(GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexture.setParameteri(GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT); + glTexture.setParameteri(GL_TEXTURE_WRAP_R, GL_MIRRORED_REPEAT); + glTexture.setParameteri(GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT); uploadTexture(); } @@ -87,7 +89,7 @@ public class GPULightVolume extends LightVolume { glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); glPixelStorei(GL_UNPACK_SKIP_IMAGES, 0); glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, 0); - glPixelStorei(GL_UNPACK_ALIGNMENT, 2); + glPixelStorei(GL_UNPACK_ALIGNMENT, 2); // we use 2 bytes per texel int sizeX = box.sizeX(); int sizeY = box.sizeY(); int sizeZ = box.sizeZ(); @@ -146,11 +148,6 @@ public class GPULightVolume extends LightVolume { bufferDirty = true; } - @Override - protected int getStride() { - return 2; - } - @Override public ImmutableBox getVolume() { return sampleVolume; diff --git a/src/main/java/com/jozufozu/flywheel/light/LightVolume.java b/src/main/java/com/jozufozu/flywheel/light/LightVolume.java index 27f40f070..16a86a345 100644 --- a/src/main/java/com/jozufozu/flywheel/light/LightVolume.java +++ b/src/main/java/com/jozufozu/flywheel/light/LightVolume.java @@ -15,7 +15,7 @@ public class LightVolume implements ImmutableBox, LightListener { public LightVolume(ImmutableBox sampleVolume) { this.setBox(sampleVolume); - this.lightData = MemoryUtil.memAlloc(this.box.volume() * getStride()); + this.lightData = MemoryUtil.memAlloc(this.box.volume() * 2); } protected void setBox(ImmutableBox box) { @@ -58,9 +58,9 @@ public class LightVolume implements ImmutableBox, LightListener { if (lightData == null) return; setBox(newSampleVolume); - int volume = box.volume(); - if (volume * 2 > lightData.capacity()) { - lightData = MemoryUtil.memRealloc(lightData, volume * 2); + int neededCapacity = box.volume() * 2; + if (neededCapacity > lightData.capacity()) { + lightData = MemoryUtil.memRealloc(lightData, neededCapacity); } initialize(world); } @@ -198,14 +198,7 @@ public class LightVolume implements ImmutableBox, LightListener { } protected int boxPosToBufferIndex(int x, int y, int z) { - return (x + box.sizeX() * (y + z * box.sizeY())) * getStride(); - } - - /** - * @return The stride of the texels, in bytes. - */ - protected int getStride() { - return 2; + return (x + box.sizeX() * (y + z * box.sizeY())) * 2; } @Override From 931fffb5f1a6f2d81c81bf1722b3f5b9c343c4c2 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Fri, 10 Dec 2021 00:28:32 -0800 Subject: [PATCH 20/29] Worlds are bigger now - Stop clamping Y in [0, 256) --- src/main/java/com/jozufozu/flywheel/light/ImmutableBox.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/jozufozu/flywheel/light/ImmutableBox.java b/src/main/java/com/jozufozu/flywheel/light/ImmutableBox.java index a06cabb60..719966424 100644 --- a/src/main/java/com/jozufozu/flywheel/light/ImmutableBox.java +++ b/src/main/java/com/jozufozu/flywheel/light/ImmutableBox.java @@ -111,7 +111,7 @@ public interface ImmutableBox { if (empty()) return; for (int x = getMinX(); x < getMaxX(); x++) { - for (int y = Math.max(getMinY(), 0); y < Math.min(getMaxY(), 255); y++) { // clamp to world height limits + for (int y = getMinY(); y < getMaxY(); y++) { for (int z = getMinZ(); z < getMaxZ(); z++) { func.consume(x, y, z); } From fd8d4366407c78c2b7dd8a444f099bf32a64684d Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Fri, 10 Dec 2021 12:31:57 -0800 Subject: [PATCH 21/29] Worlds are bigger now pt 2 - Stop clamping Y in [0, 256) --- src/main/java/com/jozufozu/flywheel/light/GridAlignedBB.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/jozufozu/flywheel/light/GridAlignedBB.java b/src/main/java/com/jozufozu/flywheel/light/GridAlignedBB.java index d84dd13a4..e96f9fbc7 100644 --- a/src/main/java/com/jozufozu/flywheel/light/GridAlignedBB.java +++ b/src/main/java/com/jozufozu/flywheel/light/GridAlignedBB.java @@ -389,7 +389,7 @@ public class GridAlignedBB implements ImmutableBox { if (empty()) return; for (int x = minX; x < maxX; x++) { - for (int y = Math.max(minY, 0); y < Math.min(maxY, 255); y++) { // clamp to world height limits + for (int y = minY; y < maxY; y++) { for (int z = minZ; z < maxZ; z++) { func.consume(x, y, z); } From 21a23d650f4e139ae5ad85b2dd19cfe9ff4438b1 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Fri, 10 Dec 2021 14:45:18 -0800 Subject: [PATCH 22/29] Mapped buffer sanity - MappedBuffer no longer abstract - Mappable interface used within MappedBuffer - MappedBuffer is mapped before ctor - No more subclasses, no more thin wrapping overrides - Use try with resources for buffer mapping - Better error handling with mapped buffers - Unimplemented exception as a procrastination method --- .../flywheel/backend/gl/buffer/Mappable.java | 14 ++ .../backend/gl/buffer/MappedBuffer.java | 132 +++--------------- .../backend/gl/buffer/MappedBufferRange.java | 40 ------ .../backend/gl/buffer/MappedGlBuffer.java | 24 +++- .../backend/gl/buffer/PersistentGlBuffer.java | 34 ++++- .../gl/buffer/PersistentMappedBuffer.java | 48 ------- .../flywheel/backend/gl/buffer/VecBuffer.java | 4 - .../backend/gl/error/GlException.java | 29 +--- .../instancing/instancing/GPUInstancer.java | 41 +++--- .../flywheel/backend/model/BufferedModel.java | 9 +- .../flywheel/backend/model/ModelPool.java | 42 +++--- .../flywheel/core/FullscreenQuad.java | 18 ++- .../jozufozu/flywheel/util/Unimplemented.java | 7 + 13 files changed, 162 insertions(+), 280 deletions(-) create mode 100644 src/main/java/com/jozufozu/flywheel/backend/gl/buffer/Mappable.java delete mode 100644 src/main/java/com/jozufozu/flywheel/backend/gl/buffer/MappedBufferRange.java delete mode 100644 src/main/java/com/jozufozu/flywheel/backend/gl/buffer/PersistentMappedBuffer.java create mode 100644 src/main/java/com/jozufozu/flywheel/util/Unimplemented.java diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/Mappable.java b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/Mappable.java new file mode 100644 index 000000000..8c5cddc42 --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/Mappable.java @@ -0,0 +1,14 @@ +package com.jozufozu.flywheel.backend.gl.buffer; + +/** + * Interface for generically dealing with mapped buffers. + */ +public interface Mappable { + GlBufferType getType(); + + /** + * Indicates that this buffer need not be #flush()'d for its contents to sync. + * @return true if this buffer is persistently mapped. + */ + boolean isPersistent(); +} diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/MappedBuffer.java b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/MappedBuffer.java index 60c5e85f8..25155a1d0 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/MappedBuffer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/MappedBuffer.java @@ -1,133 +1,45 @@ package com.jozufozu.flywheel.backend.gl.buffer; import java.nio.ByteBuffer; -import java.nio.FloatBuffer; import org.lwjgl.opengl.GL15; -import org.lwjgl.system.MemoryUtil; -public abstract class MappedBuffer extends VecBuffer implements AutoCloseable { +public class MappedBuffer extends VecBuffer implements AutoCloseable { - protected boolean mapped; - protected final GlBuffer owner; + protected final long offset; + protected final long length; + protected final Mappable owner; - public MappedBuffer(GlBuffer owner) { + public MappedBuffer(Mappable owner, ByteBuffer internal, long offset, long length) { + this.internal = internal; this.owner = owner; + this.offset = offset; + this.length = length; } - public long addr() { - return MemoryUtil.memAddress(this.internal, internal.position()); - } - - protected abstract void checkAndMap(); - /** * Make the changes in client memory available to the GPU. */ public void flush() { - if (mapped) { - GL15.glUnmapBuffer(owner.type.glEnum); - mapped = false; - setInternal(null); + if (owner.isPersistent()) return; + + if (internal == null) return; + + GL15.glUnmapBuffer(owner.getType().glEnum); + internal = null; + } + + @Override + public MappedBuffer position(int p) { + if (p < offset || p >= offset + length) { + throw new IndexOutOfBoundsException("Index " + p + " is not mapped"); } + super.position(p - (int) offset); + return this; } @Override public void close() throws Exception { flush(); } - - public MappedBuffer putFloatArray(float[] floats) { - checkAndMap(); - super.putFloatArray(floats); - return this; - } - - public MappedBuffer putByteArray(byte[] bytes) { - checkAndMap(); - super.putByteArray(bytes); - return this; - } - - public MappedBuffer put(FloatBuffer floats) { - checkAndMap(); - super.put(floats); - return this; - } - - public int position() { - checkAndMap(); - return super.position(); - } - - /** - * Position this buffer relative to the 0-index in GPU memory. - * - * @return This buffer. - */ - public MappedBuffer position(int p) { - checkAndMap(); - super.position(p); - return this; - } - - public MappedBuffer putFloat(float f) { - checkAndMap(); - super.putFloat(f); - return this; - } - - public MappedBuffer putInt(int i) { - checkAndMap(); - super.putInt(i); - return this; - } - - public MappedBuffer putShort(short s) { - checkAndMap(); - super.putShort(s); - return this; - } - - public MappedBuffer put(byte b) { - checkAndMap(); - super.put(b); - return this; - } - - public MappedBuffer put(ByteBuffer b) { - checkAndMap(); - super.put(b); - return this; - } - - public MappedBuffer putVec4(float x, float y, float z, float w) { - checkAndMap(); - super.putVec4(x, y, z, w); - return this; - } - - public MappedBuffer putVec3(float x, float y, float z) { - checkAndMap(); - super.putVec3(x, y, z); - return this; - } - - public MappedBuffer putVec2(float x, float y) { - checkAndMap(); - super.putVec2(x, y); - return this; - } - - public MappedBuffer putVec3(byte x, byte y, byte z) { - checkAndMap(); - super.putVec3(x, y, z); - return this; - } - - public MappedBuffer putVec2(byte x, byte y) { - checkAndMap(); - super.putVec2(x, y); - return this; - } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/MappedBufferRange.java b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/MappedBufferRange.java deleted file mode 100644 index 9385e3efd..000000000 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/MappedBufferRange.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.jozufozu.flywheel.backend.gl.buffer; - -import org.lwjgl.opengl.GL30; - -import com.jozufozu.flywheel.backend.Backend; -import com.jozufozu.flywheel.backend.gl.error.GlError; -import com.jozufozu.flywheel.backend.gl.error.GlException; -import com.jozufozu.flywheel.util.StringUtil; -import com.mojang.blaze3d.platform.GlStateManager; - -public class MappedBufferRange extends MappedBuffer { - - long offset, length; - int access; - - public MappedBufferRange(GlBuffer buffer, long offset, long length, int access) { - super(buffer); - this.offset = offset; - this.length = length; - this.access = access; - } - - @Override - public MappedBuffer position(int p) { - if (p < offset || p >= offset + length) { - throw new IndexOutOfBoundsException("Index " + p + " is not mapped"); - } - return super.position(p - (int) offset); - } - - @Override - protected void checkAndMap() { - if (!mapped) { - setInternal(GL30.glMapBufferRange(owner.type.glEnum, offset, length, access)); - - GlError.pollAndThrow(() -> StringUtil.args("mapBufferRange", owner.type, offset, length, access)); - mapped = true; - } - } -} diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/MappedGlBuffer.java b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/MappedGlBuffer.java index 06ee17cfa..8fe3ba243 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/MappedGlBuffer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/MappedGlBuffer.java @@ -5,7 +5,11 @@ import java.nio.ByteBuffer; import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL30; -public class MappedGlBuffer extends GlBuffer { +import com.jozufozu.flywheel.backend.gl.error.GlError; +import com.jozufozu.flywheel.backend.gl.error.GlException; +import com.jozufozu.flywheel.util.StringUtil; + +public class MappedGlBuffer extends GlBuffer implements Mappable { protected final GlBufferUsage usage; @@ -27,6 +31,22 @@ public class MappedGlBuffer extends GlBuffer { } public MappedBuffer getBuffer(int offset, int length) { - return new MappedBufferRange(this, offset, length, GL30.GL_MAP_WRITE_BIT); + ByteBuffer byteBuffer = GL30.glMapBufferRange(type.glEnum, offset, length, GL30.GL_MAP_WRITE_BIT); + + if (byteBuffer == null) { + throw new GlException(GlError.poll(), "Could not map buffer"); + } + + return new MappedBuffer(this, byteBuffer, offset, length); + } + + @Override + public GlBufferType getType() { + return type; + } + + @Override + public boolean isPersistent() { + return false; } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/PersistentGlBuffer.java b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/PersistentGlBuffer.java index e5dd4348d..1a6b6f646 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/PersistentGlBuffer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/PersistentGlBuffer.java @@ -6,16 +6,19 @@ import static org.lwjgl.opengl.GL44.GL_MAP_PERSISTENT_BIT; import java.nio.ByteBuffer; +import org.lwjgl.opengl.GL30; + import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.gl.GlFence; import com.jozufozu.flywheel.backend.gl.error.GlError; import com.jozufozu.flywheel.backend.gl.error.GlException; import com.jozufozu.flywheel.util.StringUtil; +import com.jozufozu.flywheel.util.Unimplemented; -public class PersistentGlBuffer extends GlBuffer { +public class PersistentGlBuffer extends GlBuffer implements Mappable { - private PersistentMappedBuffer buffer; + private MappedBuffer buffer; int flags; long size; @@ -48,14 +51,25 @@ public class PersistentGlBuffer extends GlBuffer { Backend.getInstance().compat.bufferStorage.bufferStorage(type, size, flags); - GlError.pollAndThrow(() -> StringUtil.args("bufferStorage", type, size, flags)); + GlError error = GlError.poll(); + if (error != null) { + // If this error is being thrown but everything seems fine, + // GlError.poll() might be returning an error from something earlier. + throw new GlException(error, StringUtil.args("bufferStorage", type, size, flags)); + } - buffer = new PersistentMappedBuffer(this); + ByteBuffer byteBuffer = GL30.glMapBufferRange(type.glEnum, 0, size, flags); + + if (byteBuffer == null) { + throw new GlException(GlError.poll(), "Could not map buffer"); + } + + buffer = new MappedBuffer(this, byteBuffer, 0, size); } @Override public void upload(ByteBuffer directBuffer) { - + throw new Unimplemented("FIXME: Nothing calls #upload on a persistent buffer as of 12/10/2021."); } @Override @@ -67,4 +81,14 @@ public class PersistentGlBuffer extends GlBuffer { return buffer; } + + @Override + public GlBufferType getType() { + return type; + } + + @Override + public boolean isPersistent() { + return true; + } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/PersistentMappedBuffer.java b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/PersistentMappedBuffer.java deleted file mode 100644 index 124c3bf58..000000000 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/PersistentMappedBuffer.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.jozufozu.flywheel.backend.gl.buffer; - -import java.nio.ByteBuffer; - -import org.lwjgl.opengl.GL30; - -import com.jozufozu.flywheel.backend.Backend; -import com.jozufozu.flywheel.backend.gl.error.GlError; -import com.jozufozu.flywheel.backend.gl.error.GlException; -import com.jozufozu.flywheel.util.StringUtil; - -public class PersistentMappedBuffer extends MappedBuffer { - - private final long offset; - private final long length; - PersistentGlBuffer owner; - - public PersistentMappedBuffer(PersistentGlBuffer buffer) { - super(buffer); - owner = buffer; - offset = 0; - length = owner.size; - - ByteBuffer byteBuffer = GL30.glMapBufferRange(owner.type.glEnum, offset, length, owner.flags); - - GlError.pollAndThrow(() -> StringUtil.args("mapBuffer", owner.type, offset, length, owner.flags)); - - setInternal(byteBuffer); - } - - @Override - public MappedBuffer position(int p) { - if (p < offset || p >= offset + length) { - throw new IndexOutOfBoundsException("Index " + p + " is not mapped"); - } - return super.position(p - (int) offset); - } - - @Override - public void flush() { - - } - - @Override - protected void checkAndMap() { - - } -} diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/VecBuffer.java b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/VecBuffer.java index 9d36890f1..ab957169c 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/VecBuffer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/VecBuffer.java @@ -24,10 +24,6 @@ public class VecBuffer { return new VecBuffer(buffer); } - protected void setInternal(@Nullable ByteBuffer internal) { - this.internal = internal; - } - public ByteBuffer unwrap() { return internal; } diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/error/GlException.java b/src/main/java/com/jozufozu/flywheel/backend/gl/error/GlException.java index 9c080382a..ac856a5f1 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/error/GlException.java +++ b/src/main/java/com/jozufozu/flywheel/backend/gl/error/GlException.java @@ -4,35 +4,12 @@ public class GlException extends RuntimeException { final GlError errorCode; - @Override - public String toString() { - String s = getClass().getName(); - String message = getLocalizedMessage(); - String withCode = s + ": " + errorCode; - return (message != null) ? (withCode + ": " + message) : withCode; - } - - public GlException(GlError errorCode) { - this.errorCode = errorCode; - } - public GlException(GlError errorCode, String message) { - super(message); + super(updateMessage(errorCode, message)); this.errorCode = errorCode; } - public GlException(GlError errorCode, String message, Throwable cause) { - super(message, cause); - this.errorCode = errorCode; - } - - public GlException(GlError errorCode, Throwable cause) { - super(cause); - this.errorCode = errorCode; - } - - public GlException(GlError errorCode, String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); - this.errorCode = errorCode; + private static String updateMessage(GlError error, String message) { + return String.format("%s: %s", error, message); } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/GPUInstancer.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/GPUInstancer.java index 556671492..efc77ce9a 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/GPUInstancer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/GPUInstancer.java @@ -2,6 +2,7 @@ package com.jozufozu.flywheel.backend.instancing.instancing; import java.util.BitSet; +import com.jozufozu.flywheel.Flywheel; import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.gl.GlVertexArray; import com.jozufozu.flywheel.backend.gl.attrib.VertexFormat; @@ -136,9 +137,11 @@ public class GPUInstancer extends AbstractInstancer { final int offset = size * instanceFormat.getStride(); final int length = glBufferSize - offset; if (length > 0) { - instanceVBO.getBuffer(offset, length) - .putByteArray(new byte[length]) - .flush(); + try (MappedBuffer buf = instanceVBO.getBuffer(offset, length)) { + buf.putByteArray(new byte[length]); + } catch (Exception e) { + Flywheel.log.error("Error clearing buffer tail:", e); + } } } @@ -159,16 +162,19 @@ public class GPUInstancer extends AbstractInstancer { final int length = (1 + lastDirty - firstDirty) * stride; if (length > 0) { - MappedBuffer mapped = instanceVBO.getBuffer(offset, length); + try (MappedBuffer mapped = instanceVBO.getBuffer(offset, length)) { - StructWriter writer = type.asInstanced().getWriter(mapped); + StructWriter writer = type.asInstanced() + .getWriter(mapped); - dirtySet.stream() - .forEach(i -> { - writer.seek(i); - writer.write(data.get(i)); - }); - mapped.flush(); + dirtySet.stream() + .forEach(i -> { + writer.seek(i); + writer.write(data.get(i)); + }); + } catch (Exception e) { + Flywheel.log.error("Error updating GPUInstancer:", e); + } } } @@ -180,12 +186,15 @@ public class GPUInstancer extends AbstractInstancer { glBufferSize = requiredSize + stride * 16; instanceVBO.alloc(glBufferSize); - MappedBuffer buffer = instanceVBO.getBuffer(0, glBufferSize); - StructWriter writer = type.asInstanced().getWriter(buffer); - for (D datum : data) { - writer.write(datum); + try (MappedBuffer buffer = instanceVBO.getBuffer(0, glBufferSize)) { + StructWriter writer = type.asInstanced() + .getWriter(buffer); + for (D datum : data) { + writer.write(datum); + } + } catch (Exception e) { + Flywheel.log.error("Error reallocating GPUInstancer:", e); } - buffer.flush(); glInstanceCount = size; diff --git a/src/main/java/com/jozufozu/flywheel/backend/model/BufferedModel.java b/src/main/java/com/jozufozu/flywheel/backend/model/BufferedModel.java index 14fe216ac..98d2ef6dc 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/model/BufferedModel.java +++ b/src/main/java/com/jozufozu/flywheel/backend/model/BufferedModel.java @@ -4,6 +4,7 @@ import static org.lwjgl.opengl.GL11.glDrawArrays; import org.lwjgl.opengl.GL31; +import com.jozufozu.flywheel.Flywheel; import com.jozufozu.flywheel.backend.gl.GlPrimitive; import com.jozufozu.flywheel.backend.gl.attrib.VertexFormat; import com.jozufozu.flywheel.backend.gl.buffer.GlBuffer; @@ -32,9 +33,11 @@ public class BufferedModel implements IBufferedModel { vbo.alloc(model.size()); // mirror it in system memory so we can write to it, and upload our model. - MappedBuffer buffer = vbo.getBuffer(0, model.size()); - model.buffer(new VecBufferWriter(buffer)); - buffer.flush(); + try (MappedBuffer buffer = vbo.getBuffer(0, model.size())) { + model.buffer(new VecBufferWriter(buffer)); + } catch (Exception e) { + Flywheel.log.error(String.format("Error uploading model '%s':", model.name()), e); + } vbo.unbind(); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/model/ModelPool.java b/src/main/java/com/jozufozu/flywheel/backend/model/ModelPool.java index 645858ede..5a1d033f6 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/model/ModelPool.java +++ b/src/main/java/com/jozufozu/flywheel/backend/model/ModelPool.java @@ -5,6 +5,7 @@ import java.util.List; import org.lwjgl.opengl.GL32; +import com.jozufozu.flywheel.Flywheel; import com.jozufozu.flywheel.backend.gl.GlPrimitive; import com.jozufozu.flywheel.backend.gl.attrib.VertexFormat; import com.jozufozu.flywheel.backend.gl.buffer.GlBuffer; @@ -115,34 +116,35 @@ public class ModelPool implements ModelAllocator { } private void uploadAll() { - MappedBuffer buffer = vbo.getBuffer(0, bufferSize); + try (MappedBuffer buffer = vbo.getBuffer(0, bufferSize)) { - VecBufferWriter consumer = new VecBufferWriter(buffer); + VecBufferWriter consumer = new VecBufferWriter(buffer); - for (PooledModel model : models) { - model.model.buffer(consumer); - if (model.callback != null) - model.callback.onAlloc(model); + for (PooledModel model : models) { + model.model.buffer(consumer); + if (model.callback != null) model.callback.onAlloc(model); + } + + } catch (Exception e) { + Flywheel.log.error("Error uploading pooled models:", e); } - - buffer.flush(); } private void uploadPending() { - MappedBuffer buffer = vbo.getBuffer(0, bufferSize); - VecBufferWriter consumer = new VecBufferWriter(buffer); + try (MappedBuffer buffer = vbo.getBuffer(0, bufferSize)) { + VecBufferWriter consumer = new VecBufferWriter(buffer); - int stride = format.getStride(); - for (PooledModel model : pendingUpload) { - int pos = model.first * stride; - buffer.position(pos); - model.model.buffer(consumer); - if (model.callback != null) - model.callback.onAlloc(model); + int stride = format.getStride(); + for (PooledModel model : pendingUpload) { + int pos = model.first * stride; + buffer.position(pos); + model.model.buffer(consumer); + if (model.callback != null) model.callback.onAlloc(model); + } + pendingUpload.clear(); + } catch (Exception e) { + Flywheel.log.error("Error uploading pooled models:", e); } - pendingUpload.clear(); - - buffer.flush(); } private void setDirty() { diff --git a/src/main/java/com/jozufozu/flywheel/core/FullscreenQuad.java b/src/main/java/com/jozufozu/flywheel/core/FullscreenQuad.java index d3635718d..a1269b613 100644 --- a/src/main/java/com/jozufozu/flywheel/core/FullscreenQuad.java +++ b/src/main/java/com/jozufozu/flywheel/core/FullscreenQuad.java @@ -1,11 +1,15 @@ package com.jozufozu.flywheel.core; +import static org.lwjgl.opengl.GL20.*; + import org.lwjgl.opengl.GL20; +import com.jozufozu.flywheel.Flywheel; import com.jozufozu.flywheel.backend.gl.GlNumericType; import com.jozufozu.flywheel.backend.gl.GlVertexArray; import com.jozufozu.flywheel.backend.gl.buffer.GlBuffer; import com.jozufozu.flywheel.backend.gl.buffer.GlBufferType; +import com.jozufozu.flywheel.backend.gl.buffer.MappedBuffer; import com.jozufozu.flywheel.backend.gl.buffer.MappedGlBuffer; import com.jozufozu.flywheel.util.Lazy; @@ -28,16 +32,18 @@ public class FullscreenQuad { vbo = new MappedGlBuffer(GlBufferType.ARRAY_BUFFER); vbo.bind(); vbo.alloc(bufferSize); - vbo.getBuffer(0, bufferSize) - .putFloatArray(vertices) - .flush(); + try (MappedBuffer buffer = vbo.getBuffer(0, bufferSize)) { + buffer.putFloatArray(vertices); + } catch (Exception e) { + Flywheel.log.error("Could not create fullscreen quad.", e); + } vao = new GlVertexArray(); vao.bind(); - GL20.glEnableVertexAttribArray(0); + glEnableVertexAttribArray(0); - GL20.glVertexAttribPointer(0, 4, GlNumericType.FLOAT.getGlEnum(), false, 4 * 4, 0); + glVertexAttribPointer(0, 4, GlNumericType.FLOAT.getGlEnum(), false, 4 * 4, 0); GlVertexArray.unbind(); vbo.unbind(); @@ -45,7 +51,7 @@ public class FullscreenQuad { public void draw() { vao.bind(); - GL20.glDrawArrays(GL20.GL_TRIANGLES, 0, 6); + glDrawArrays(GL_TRIANGLES, 0, 6); GlVertexArray.unbind(); } diff --git a/src/main/java/com/jozufozu/flywheel/util/Unimplemented.java b/src/main/java/com/jozufozu/flywheel/util/Unimplemented.java new file mode 100644 index 000000000..0743ddc4c --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/util/Unimplemented.java @@ -0,0 +1,7 @@ +package com.jozufozu.flywheel.util; + +public class Unimplemented extends RuntimeException { + public Unimplemented(String message) { + super(message); + } +} From 2207da5eedf298b1a91c6782bdc7064958ed06e9 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Fri, 10 Dec 2021 14:50:01 -0800 Subject: [PATCH 23/29] Implemented --- .../flywheel/backend/gl/buffer/PersistentGlBuffer.java | 3 +-- .../java/com/jozufozu/flywheel/util/Unimplemented.java | 7 ------- 2 files changed, 1 insertion(+), 9 deletions(-) delete mode 100644 src/main/java/com/jozufozu/flywheel/util/Unimplemented.java diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/PersistentGlBuffer.java b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/PersistentGlBuffer.java index 1a6b6f646..77dac7206 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/PersistentGlBuffer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/PersistentGlBuffer.java @@ -13,7 +13,6 @@ import com.jozufozu.flywheel.backend.gl.GlFence; import com.jozufozu.flywheel.backend.gl.error.GlError; import com.jozufozu.flywheel.backend.gl.error.GlException; import com.jozufozu.flywheel.util.StringUtil; -import com.jozufozu.flywheel.util.Unimplemented; public class PersistentGlBuffer extends GlBuffer implements Mappable { @@ -69,7 +68,7 @@ public class PersistentGlBuffer extends GlBuffer implements Mappable { @Override public void upload(ByteBuffer directBuffer) { - throw new Unimplemented("FIXME: Nothing calls #upload on a persistent buffer as of 12/10/2021."); + throw new UnsupportedOperationException("FIXME: Nothing calls #upload on a persistent buffer as of 12/10/2021."); } @Override diff --git a/src/main/java/com/jozufozu/flywheel/util/Unimplemented.java b/src/main/java/com/jozufozu/flywheel/util/Unimplemented.java deleted file mode 100644 index 0743ddc4c..000000000 --- a/src/main/java/com/jozufozu/flywheel/util/Unimplemented.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.jozufozu.flywheel.util; - -public class Unimplemented extends RuntimeException { - public Unimplemented(String message) { - super(message); - } -} From 79e61b44e56ec9fc03dd10740cf4b8ec33d1fd25 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Sat, 11 Dec 2021 14:18:43 -0800 Subject: [PATCH 24/29] 1.18.1 --- gradle.properties | 4 ++-- gradle/wrapper/gradle-wrapper.properties | 2 +- .../flywheel/backend/gl/buffer/PersistentGlBuffer.java | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/gradle.properties b/gradle.properties index 2ca2551c2..8b87c43cb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,8 +4,8 @@ org.gradle.daemon = false # mod version info mod_version = 0.4.0 mc_update_version = 1.18 -minecraft_version = 1.18 -forge_version = 38.0.15 +minecraft_version = 1.18.1 +forge_version = 39.0.0 # build dependency versions forgegradle_version = 5.1.+ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e750102e0..84d1f85fd 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/PersistentGlBuffer.java b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/PersistentGlBuffer.java index 77dac7206..86fb3adbf 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/PersistentGlBuffer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/gl/buffer/PersistentGlBuffer.java @@ -14,7 +14,6 @@ import com.jozufozu.flywheel.backend.gl.error.GlError; import com.jozufozu.flywheel.backend.gl.error.GlException; import com.jozufozu.flywheel.util.StringUtil; - public class PersistentGlBuffer extends GlBuffer implements Mappable { private MappedBuffer buffer; From ebfeff0b545a3b4d05ac64786f8085806ff883ad Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Sat, 11 Dec 2021 15:06:07 -0800 Subject: [PATCH 25/29] Fix misaligned contraption light - That was a pain to debug - Idk how that ever worked --- src/main/java/com/jozufozu/flywheel/light/LightVolume.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/jozufozu/flywheel/light/LightVolume.java b/src/main/java/com/jozufozu/flywheel/light/LightVolume.java index 16a86a345..2924277b3 100644 --- a/src/main/java/com/jozufozu/flywheel/light/LightVolume.java +++ b/src/main/java/com/jozufozu/flywheel/light/LightVolume.java @@ -95,12 +95,13 @@ public class LightVolume implements ImmutableBox, LightListener { public void initialize(LightProvider world) { if (lightData == null) return; - ImmutableBox box = getVolume(); + // the volume is indexed based on the greater bounding box int shiftX = box.getMinX(); int shiftY = box.getMinY(); int shiftZ = box.getMinZ(); - box.forEachContained((x, y, z) -> { + // ... but we only iterate over the (potentially) smaller sample volume + getVolume().forEachContained((x, y, z) -> { int blockLight = world.getLight(LightLayer.BLOCK, x, y, z); int skyLight = world.getLight(LightLayer.SKY, x, y, z); From 3cfbc97dd118d0b99a9b508a8d3b65a41010e2d9 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Sat, 11 Dec 2021 15:43:11 -0800 Subject: [PATCH 26/29] Add issue template - Read: copy issue template from Create - Thanks, caelwarner! --- .github/ISSUE_TEMPLATE/bug_report.yml | 104 ++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 000000000..bb34d1d85 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,104 @@ +name: Bug Report +description: Create a bug report to help us improve Flywheel +labels: [ "bug" ] +body: + - type: textarea + attributes: + label: Describe the Bug + description: A clear and concise description of what the bug is + validations: + required: true + - type: textarea + attributes: + label: Reproduction Steps + description: Tell us about the steps to reproduce the bug + value: | + 1. + 2. + 3. + ... + validations: + required: true + - type: textarea + attributes: + label: Expected Result + description: A clear and concise description of what you expected to happen + validations: + required: true + - type: textarea + attributes: + label: Screenshots and Videos + description: If applicable, add screenshots or videos to help explain your problem + validations: + required: false + - type: input + attributes: + label: Crash Report or Log + description: If applicable, please add a link to the crash report or log that was created when this issue occured + validations: + required: false + - type: markdown + attributes: + value: "*[Pastebin](https://pastebin.com/) is standard.*" + - type: input + attributes: + label: Operating System + description: The operating system you were using when the bug occured + placeholder: Windows 11 + validations: + required: true + - type: dropdown + attributes: + label: Mod Version + description: The version of the mod you were using when the bug occured + options: + - "0.4.1" + - "0.4.0" + - "0.3.0" + - "0.2.5" + - "0.2.4" + - "0.2.3" + - "0.2.2" + - "0.2.1" + - "0.2.0" + - "0.1.1" + - "0.1.0" + - "0.0.3" + - "0.0.2" + - "0.0.1" + validations: + required: true + - type: dropdown + attributes: + label: Minecraft Version + description: The version of Minecraft you were using when the bug occured + options: + - "1.18.1" + - "1.18" + - "1.17.1" + - "1.16.5" + - "1.16.4" + validations: + required: true + - type: input + attributes: + label: Forge Version + description: The version of Forge you were using when the bug occured + placeholder: 39.0.0 + validations: + required: true + - type: textarea + attributes: + label: Other Mods + description: Please list any other mods that were running when the crash happened + validations: + required: false + - type: textarea + attributes: + label: Additional Context + description: Add any extra context about the bug here + validations: + required: false + - type: markdown + attributes: + value: "Thank you for taking the time to make this bug report and to help improve Flywheel" From 11e5719e0da2375cd1d112d27946d82e8449c030 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Sat, 11 Dec 2021 17:31:09 -0800 Subject: [PATCH 27/29] Cylindrical fog - having the world position is very nice - mojang manages to do multiple matrix multiplications --- .../jozufozu/flywheel/light/GPULightVolume.java | 11 ++++++----- .../flywheel/shaders/context/crumbling.glsl | 2 +- .../flywheel/flywheel/shaders/context/fog.glsl | 14 ++++++++++++-- .../flywheel/flywheel/shaders/context/world.glsl | 6 +----- 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/jozufozu/flywheel/light/GPULightVolume.java b/src/main/java/com/jozufozu/flywheel/light/GPULightVolume.java index d463a54d7..cb7d3727e 100644 --- a/src/main/java/com/jozufozu/flywheel/light/GPULightVolume.java +++ b/src/main/java/com/jozufozu/flywheel/light/GPULightVolume.java @@ -55,6 +55,12 @@ public class GPULightVolume extends LightVolume { int sizeZ = box.sizeZ(); glTexImage3D(GL_TEXTURE_3D, 0, GL30.GL_RG8, sizeX, sizeY, sizeZ, 0, GL30.GL_RG, GL_UNSIGNED_BYTE, 0); + glTexture.setParameteri(GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexture.setParameteri(GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexture.setParameteri(GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT); + glTexture.setParameteri(GL_TEXTURE_WRAP_R, GL_MIRRORED_REPEAT); + glTexture.setParameteri(GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT); + glTexture.unbind(); oldState.makeActive(); } @@ -73,11 +79,6 @@ public class GPULightVolume extends LightVolume { textureUnit.makeActive(); glTexture.bind(); - glTexture.setParameteri(GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexture.setParameteri(GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexture.setParameteri(GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT); - glTexture.setParameteri(GL_TEXTURE_WRAP_R, GL_MIRRORED_REPEAT); - glTexture.setParameteri(GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT); uploadTexture(); } diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/context/crumbling.glsl b/src/main/resources/assets/flywheel/flywheel/shaders/context/crumbling.glsl index d55e86289..c9ab41cbe 100644 --- a/src/main/resources/assets/flywheel/flywheel/shaders/context/crumbling.glsl +++ b/src/main/resources/assets/flywheel/flywheel/shaders/context/crumbling.glsl @@ -18,7 +18,7 @@ void FLWFinalizeNormal(inout vec3 normal) { #if defined(VERTEX_SHADER) void FLWFinalizeWorldPos(inout vec4 worldPos) { #if defined(USE_FOG) - FragDistance = length(worldPos.xyz - uCameraPos); + FragDistance = cylindrical_distance(worldPos.xyz, uCameraPos); #endif gl_Position = uViewProjection * worldPos; diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/context/fog.glsl b/src/main/resources/assets/flywheel/flywheel/shaders/context/fog.glsl index 49380b14f..ada0be19e 100644 --- a/src/main/resources/assets/flywheel/flywheel/shaders/context/fog.glsl +++ b/src/main/resources/assets/flywheel/flywheel/shaders/context/fog.glsl @@ -1,5 +1,3 @@ -#define USE_FOG - #if defined(VERTEX_SHADER) out float FragDistance; #elif defined(FRAGMENT_SHADER) @@ -8,6 +6,18 @@ in float FragDistance; uniform vec4 uFogColor; uniform vec2 uFogRange; +float cylindrical_distance(vec3 worldPos, vec3 cameraPos) { + float distXZ = length(worldPos.xz - cameraPos.xz); + float distY = abs(worldPos.y - cameraPos.y); + return max(distXZ, distY); +} + +float cylindrical_distance(vec3 worldPos) { + float distXZ = length(worldPos.xz); + float distY = abs(worldPos.y); + return max(distXZ, distY); +} + float FLWFogFactor() { return (uFogRange.y - FragDistance) / (uFogRange.y - uFogRange.x); } diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/context/world.glsl b/src/main/resources/assets/flywheel/flywheel/shaders/context/world.glsl index f6f94ebf2..138c5aca9 100644 --- a/src/main/resources/assets/flywheel/flywheel/shaders/context/world.glsl +++ b/src/main/resources/assets/flywheel/flywheel/shaders/context/world.glsl @@ -16,9 +16,7 @@ void FLWFinalizeNormal(inout vec3 normal) { #if defined(VERTEX_SHADER) void FLWFinalizeWorldPos(inout vec4 worldPos) { - #if defined(USE_FOG) - FragDistance = length(worldPos.xyz - uCameraPos); - #endif + FragDistance = cylindrical_distance(worldPos.xyz, uCameraPos); gl_Position = uViewProjection * worldPos; } @@ -41,13 +39,11 @@ vec4 FLWBlockTexture(vec2 texCoords) { } void FLWFinalizeColor(vec4 color) { - #if defined(USE_FOG) float a = color.a; float fog = clamp(FLWFogFactor(), 0., 1.); color = mix(uFogColor, color, fog); color.a = a; - #endif #if defined(ALPHA_DISCARD) if (color.a < ALPHA_DISCARD) { From 46745ae91df968bf4a214d6251baca5445dbf402 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Sat, 11 Dec 2021 17:32:39 -0800 Subject: [PATCH 28/29] Bump version - 0.4.1 --- build.gradle | 1 + changelog.txt | 9 +++++++++ gradle.properties | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index f59c77288..d8ff50a1b 100644 --- a/build.gradle +++ b/build.gradle @@ -181,5 +181,6 @@ curseforge { releaseType = project.curse_type mainArtifact jar addGameVersion '1.18' + addGameVersion '1.18.1' } } diff --git a/changelog.txt b/changelog.txt index 395b19754..91456a3e9 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,12 @@ +0.4.1: +Update to 1.18.1 +Changes + - Use cylindrical fog to match vanilla +Fixes + - Fix crash affecting systems that don't support persistent mapping + - Fix crash when Create contraptions extend below Y=0 + - Fix Create contraptions having misaligned light when launched after world load + 0.4.0: Update to 1.18 Fixes diff --git a/gradle.properties b/gradle.properties index 8b87c43cb..eb0337376 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs = -Xmx3G org.gradle.daemon = false # mod version info -mod_version = 0.4.0 +mod_version = 0.4.1 mc_update_version = 1.18 minecraft_version = 1.18.1 forge_version = 39.0.0 From a3ee39099a1212931f9157e6e211e2dd1e0422ea Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Sat, 11 Dec 2021 22:03:52 -0800 Subject: [PATCH 29/29] Use GL_ARB_conservative_depth when possible - Allows the depth test to discard fragments before the fragment shader is run --- .../flywheel/flywheel/shaders/context/world.glsl | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/context/world.glsl b/src/main/resources/assets/flywheel/flywheel/shaders/context/world.glsl index 138c5aca9..51afad2eb 100644 --- a/src/main/resources/assets/flywheel/flywheel/shaders/context/world.glsl +++ b/src/main/resources/assets/flywheel/flywheel/shaders/context/world.glsl @@ -25,13 +25,13 @@ void FLWFinalizeWorldPos(inout vec4 worldPos) { #use "flywheel:core/lightutil.glsl" #define ALPHA_DISCARD 0.1 -// -//#if defined(ALPHA_DISCARD) -//#if defined(GL_ARB_conservative_depth) -//layout (depth_greater) out float gl_FragDepth; -//#endif -//#endif - +// optimize discard usage +#if defined(ALPHA_DISCARD) +#if defined(GL_ARB_conservative_depth) +#extension GL_ARB_conservative_depth : enable +layout (depth_greater) out float gl_FragDepth; +#endif +#endif out vec4 fragColor; vec4 FLWBlockTexture(vec2 texCoords) {