From 505d5370689dc47743176072834b510a3b9cb103 Mon Sep 17 00:00:00 2001 From: TCDev69 Date: Mon, 19 Oct 2026 23:28:56 +0200 Subject: [PATCH 1/2] Port Flywheel & Vanillin to Minecraft / NeoForge 26.2 --- .github/workflows/build.yml | 13 +++--- common/build.gradle.kts | 2 +- .../visualization/VisualizationManager.java | 7 +-- .../flywheel/backend/LayoutAttributes.java | 32 ++++++------- .../backend/engine/MaterialRenderState.java | 12 ++--- .../flywheel/backend/engine/MeshPool.java | 5 +-- .../backend/engine/TextureBinder.java | 7 ++- .../backend/engine/indirect/DepthPyramid.java | 2 +- .../engine/indirect/IndirectDrawManager.java | 6 +-- .../engine/indirect/OitFramebuffer.java | 36 ++++++++------- .../instancing/InstancedDrawManager.java | 6 +-- .../backend/engine/uniform/FrameUniforms.java | 5 +-- .../engine/uniform/PlayerUniforms.java | 19 ++++---- .../backend/gl/array/GlVertexArrayDSA.java | 4 +- .../backend/gl/array/GlVertexArrayGL3.java | 4 +- .../GlVertexArraySeparateAttributes.java | 4 +- .../backend/gl/array/VertexAttribute.java | 45 ++++++++++++------- .../backend/mixin/FogRendererMixin.java | 2 +- .../flywheel/backend/mixin/LightingMixin.java | 6 +-- .../backend/mixin/RenderSystemMixin.java | 3 +- .../light/SkyDataLayerStorageMapAccessor.java | 2 +- .../resources/flywheel.backend.mixins.json | 1 - .../flywheel/lib/model/ModelUtil.java | 2 +- .../flywheel/lib/model/baked/MeshEmitter.java | 4 +- .../lib/vertex/FlywheelVertexFormats.java | 15 +++---- .../lib/visual/AbstractBlockEntityVisual.java | 10 ++--- .../impl/mixin/GameRendererMixin.java | 8 ++-- .../impl/mixin/LevelRendererMixin.java | 43 ++++++------------ .../visualmanage/LevelRendererMixin.java | 23 +++++++++- .../VisualizationManagerImpl.java | 27 +++++------ gradle/libs.versions.toml | 4 +- .../model/baked/BlockStateModelBufferer.java | 4 +- .../flywheel/impl/FlwCommands.java | 8 ++-- settings.gradle.kts | 1 + .../engine_room/vanillin/VanillaVisuals.java | 28 ++++++------ .../vanillin/visuals/ChestVisual.java | 10 ++--- 36 files changed, 206 insertions(+), 204 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1d09c721cc..6460cc6dbf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -35,17 +35,14 @@ jobs: cache-read-only: ${{ !endsWith(github.ref_name, '/dev') }} - name: Build - # Doesn't actually publish, as no secrets are passed in, just makes sure that publishing works - run: ./gradlew publish --no-daemon + run: ./gradlew build -x test --no-daemon - name: Capture Build Artifacts uses: actions/upload-artifact@v4 with: name: Artifacts path: | - common/build/libs/ - fabric/build/libs/ - neoforge/build/libs/ - vanillin/common/build/libs/ - vanillin/fabric/build/libs/ - vanillin/neoforge/build/libs/ + common/build/libs/*.jar + neoforge/build/libs/*.jar + vanillin/common/build/libs/*.jar + vanillin/neoforge/build/libs/*.jar diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 6eb0970a7d..76bdce60be 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -10,7 +10,7 @@ val lib = sourceSets.create("lib") val backend = sourceSets.create("backend") val main = sourceSets.getByName("main") -loom.accessWidenerPath = project(projects.flywheelFabric.path).file("src/main/resources/flywheel.accesswidener") +loom.accessWidenerPath = rootProject.file("fabric/src/main/resources/flywheel.accesswidener") transitiveSourceSets { compileClasspath = main.compileClasspath diff --git a/common/src/api/java/dev/engine_room/flywheel/api/visualization/VisualizationManager.java b/common/src/api/java/dev/engine_room/flywheel/api/visualization/VisualizationManager.java index 9360879816..f99fd96760 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/visualization/VisualizationManager.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/visualization/VisualizationManager.java @@ -1,16 +1,12 @@ package dev.engine_room.flywheel.api.visualization; -import java.util.SortedSet; - import org.jetbrains.annotations.ApiStatus; import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.backend.RenderContext; import dev.engine_room.flywheel.api.internal.FlwApiLink; import dev.engine_room.flywheel.api.visual.Effect; -import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import net.minecraft.core.Vec3i; -import net.minecraft.server.level.BlockDestructionProgress; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.entity.BlockEntity; @@ -70,8 +66,7 @@ interface RenderDispatcher { * Render crumbling block entities. * *

Guaranteed to be called after {@link #onStartLevelRender} and {@link #afterSubmitEntities} - * @param destructionProgress The destruction progress map from {@link net.minecraft.client.renderer.LevelRenderer LevelRenderer}. */ - void beforeSubmitCrumbling(RenderContext ctx, Long2ObjectMap> destructionProgress); + void beforeSubmitCrumbling(RenderContext ctx); } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/LayoutAttributes.java b/common/src/backend/java/dev/engine_room/flywheel/backend/LayoutAttributes.java index ca0a71fc4c..6fb0debf17 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/LayoutAttributes.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/LayoutAttributes.java @@ -80,31 +80,31 @@ private static void array(List out, ArrayElementType array) { } } - private static VertexFormatElement.Type toGlType(IntegerRepr repr) { + private static VertexAttribute.Type toGlType(IntegerRepr repr) { return switch (repr) { - case BYTE -> VertexFormatElement.Type.BYTE; - case SHORT -> VertexFormatElement.Type.SHORT; - case INT -> VertexFormatElement.Type.INT; + case BYTE -> VertexAttribute.Type.BYTE; + case SHORT -> VertexAttribute.Type.SHORT; + case INT -> VertexAttribute.Type.INT; }; } - private static VertexFormatElement.Type toGlType(UnsignedIntegerRepr repr) { + private static VertexAttribute.Type toGlType(UnsignedIntegerRepr repr) { return switch (repr) { - case UNSIGNED_BYTE -> VertexFormatElement.Type.UBYTE; - case UNSIGNED_SHORT -> VertexFormatElement.Type.USHORT; - case UNSIGNED_INT -> VertexFormatElement.Type.UINT; + case UNSIGNED_BYTE -> VertexAttribute.Type.UBYTE; + case UNSIGNED_SHORT -> VertexAttribute.Type.USHORT; + case UNSIGNED_INT -> VertexAttribute.Type.UINT; }; } - private static VertexFormatElement.Type toGlType(FloatRepr repr) { + private static VertexAttribute.Type toGlType(FloatRepr repr) { return switch (repr) { - case BYTE, NORMALIZED_BYTE -> VertexFormatElement.Type.BYTE; - case UNSIGNED_BYTE, NORMALIZED_UNSIGNED_BYTE -> VertexFormatElement.Type.UBYTE; - case SHORT, NORMALIZED_SHORT -> VertexFormatElement.Type.SHORT; - case UNSIGNED_SHORT, NORMALIZED_UNSIGNED_SHORT -> VertexFormatElement.Type.USHORT; - case INT, NORMALIZED_INT -> VertexFormatElement.Type.INT; - case UNSIGNED_INT, NORMALIZED_UNSIGNED_INT -> VertexFormatElement.Type.UINT; - case FLOAT -> VertexFormatElement.Type.FLOAT; + case BYTE, NORMALIZED_BYTE -> VertexAttribute.Type.BYTE; + case UNSIGNED_BYTE, NORMALIZED_UNSIGNED_BYTE -> VertexAttribute.Type.UBYTE; + case SHORT, NORMALIZED_SHORT -> VertexAttribute.Type.SHORT; + case UNSIGNED_SHORT, NORMALIZED_UNSIGNED_SHORT -> VertexAttribute.Type.USHORT; + case INT, NORMALIZED_INT -> VertexAttribute.Type.INT; + case UNSIGNED_INT, NORMALIZED_UNSIGNED_INT -> VertexAttribute.Type.UINT; + case FLOAT -> VertexAttribute.Type.FLOAT; }; } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java index c6556e7b99..fb4e7c44fd 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java @@ -124,26 +124,26 @@ private static void setupDepthTest(DepthTest depthTest) { private static void setupTransparency(Transparency transparency) { switch (transparency) { case OPAQUE -> { - GlStateManager._disableBlend(); + GlStateManager._disableBlend(0); } case ADDITIVE -> { - GlStateManager._enableBlend(); + GlStateManager._enableBlend(0); GlStateManager._blendFuncSeparate(GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE); } case LIGHTNING -> { - GlStateManager._enableBlend(); + GlStateManager._enableBlend(0); GlStateManager._blendFuncSeparate(GlConst.GL_SRC_ALPHA, GlConst.GL_ONE, GlConst.GL_SRC_ALPHA, GlConst.GL_ONE); } case GLINT -> { - GlStateManager._enableBlend(); + GlStateManager._enableBlend(0); GlStateManager._blendFuncSeparate(GlConst.GL_SRC_COLOR, GlConst.GL_ONE, GlConst.GL_ZERO, GlConst.GL_ONE); } case CRUMBLING -> { - GlStateManager._enableBlend(); + GlStateManager._enableBlend(0); GlStateManager._blendFuncSeparate(GlConst.GL_DST_COLOR, GlConst.GL_SRC_COLOR, GlConst.GL_ONE, GlConst.GL_ZERO); } case TRANSLUCENT -> { - GlStateManager._enableBlend(); + GlStateManager._enableBlend(0); GlStateManager._blendFuncSeparate(GlConst.GL_SRC_ALPHA, GlConst.GL_ONE_MINUS_SRC_ALPHA, GlConst.GL_ONE, GlConst.GL_ONE_MINUS_SRC_ALPHA); } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MeshPool.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MeshPool.java index 616e9ed8f0..13b87eec18 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MeshPool.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MeshPool.java @@ -9,7 +9,6 @@ import org.lwjgl.opengl.GL32; import com.mojang.blaze3d.opengl.GlConst; -import com.mojang.blaze3d.vertex.VertexFormat; import dev.engine_room.flywheel.api.model.Mesh; import dev.engine_room.flywheel.backend.InternalVertex; @@ -183,9 +182,9 @@ public boolean isInvalid() { public void draw(int instanceCount) { if (instanceCount > 1) { - GL32.glDrawElementsInstancedBaseVertex(GlConst.toGl(VertexFormat.Mode.TRIANGLES), mesh.indexCount(), GlConst.GL_UNSIGNED_INT, firstIndexByteOffset(), instanceCount, baseVertex); + GL32.glDrawElementsInstancedBaseVertex(GlConst.GL_TRIANGLES, mesh.indexCount(), GlConst.GL_UNSIGNED_INT, firstIndexByteOffset(), instanceCount, baseVertex); } else { - GL32.glDrawElementsBaseVertex(GlConst.toGl(VertexFormat.Mode.TRIANGLES), mesh.indexCount(), GlConst.GL_UNSIGNED_INT, firstIndexByteOffset(), baseVertex); + GL32.glDrawElementsBaseVertex(GlConst.GL_TRIANGLES, mesh.indexCount(), GlConst.GL_UNSIGNED_INT, firstIndexByteOffset(), baseVertex); } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java index f42cbf0dde..a43e6e9f5a 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java @@ -1,10 +1,12 @@ package dev.engine_room.flywheel.backend.engine; import java.util.Collections; +import java.util.List; import org.jspecify.annotations.Nullable; import org.lwjgl.opengl.GL33C; +import com.mojang.blaze3d.opengl.FrameBufferAttachment; import com.mojang.blaze3d.opengl.GlConst; import com.mojang.blaze3d.opengl.GlDevice; import com.mojang.blaze3d.opengl.GlSampler; @@ -61,9 +63,10 @@ public static void bindLightAndOverlay() { public static void bindRenderTarget(RenderTarget target) { GlTexture colorTexture = (GlTexture) target.getColorTexture(); - int i = colorTexture.getFbo( + int i = GlUtil.getGlDevice().frameBufferCache().getFbo( GlUtil.getGlDevice().directStateAccess(), - target.getDepthTexture() + List.of((FrameBufferAttachment) target.getColorTexture()), + (FrameBufferAttachment) target.getDepthTexture() ); GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, i); } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/DepthPyramid.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/DepthPyramid.java index 80bd9ab9af..0607d0d8be 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/DepthPyramid.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/DepthPyramid.java @@ -27,7 +27,7 @@ public DepthPyramid(IndirectPrograms programs) { public void generate() { var mainRenderTarget = Minecraft.getInstance() - .getMainRenderTarget(); + .gameRenderer.mainRenderTarget(); int width = mip0Size(mainRenderTarget.width); int height = mip0Size(mainRenderTarget.height); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectDrawManager.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectDrawManager.java index 075f01f8e3..9f1f1f450f 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectDrawManager.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectDrawManager.java @@ -151,7 +151,7 @@ public void render(LightStorage lightStorage, EnvironmentStorage environmentStor lightBuffers.bind(); matrixBuffer.bind(); Uniforms.bindAll(); - TextureBinder.bindRenderTarget(Minecraft.getInstance().getMainRenderTarget()); + TextureBinder.bindRenderTarget(Minecraft.getInstance().gameRenderer.mainRenderTarget()); for (var group : cullingGroups.values()) { group.submitSolid(); @@ -245,7 +245,7 @@ public void renderCrumbling(List crumblingBlocks) { // Set up the crumbling program buffers. Nothing changes here between draws. GlBufferType.DRAW_INDIRECT_BUFFER.bind(crumblingDrawBuffer.handle()); GL30.glBindBufferRange(GL43.GL_SHADER_STORAGE_BUFFER, BufferBindings.DRAW, crumblingDrawBuffer.handle(), 0, IndirectBuffers.DRAW_COMMAND_STRIDE); - TextureBinder.bindRenderTarget(Minecraft.getInstance().getMainRenderTarget()); + TextureBinder.bindRenderTarget(Minecraft.getInstance().gameRenderer.mainRenderTarget()); for (var groupEntry : byType.entrySet()) { var byProgress = groupEntry.getValue(); @@ -292,7 +292,7 @@ public void renderCrumbling(List crumblingBlocks) { @Override public void triggerFallback() { IndirectPrograms.kill(); - Minecraft.getInstance().levelRenderer.allChanged(); + Minecraft.getInstance().levelRenderer.resetLevelRenderData(); } @Override diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java index 1b95d9e999..8280b6de4a 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java @@ -1,8 +1,11 @@ package dev.engine_room.flywheel.backend.engine.indirect; +import java.util.List; + import org.lwjgl.opengl.GL32; import org.lwjgl.opengl.GL46; +import com.mojang.blaze3d.opengl.FrameBufferAttachment; import com.mojang.blaze3d.opengl.GlConst; import com.mojang.blaze3d.opengl.GlStateManager; import com.mojang.blaze3d.opengl.GlTexture; @@ -50,14 +53,14 @@ public OitFramebuffer(OitPrograms programs) { public void prepare() { RenderTarget renderTarget; - if (Minecraft.useShaderTransparency()) { - renderTarget = Minecraft.getInstance().levelRenderer.getItemEntityTarget(); + if (Minecraft.getInstance().options.improvedTransparency().get()) { + renderTarget = Minecraft.getInstance().levelRenderer.itemEntityTarget(); renderTarget.copyDepthFrom(Minecraft.getInstance() - .getMainRenderTarget()); + .gameRenderer.mainRenderTarget()); } else { renderTarget = Minecraft.getInstance() - .getMainRenderTarget(); + .gameRenderer.mainRenderTarget(); } maybeResizeFBO(renderTarget.width, renderTarget.height); @@ -85,11 +88,11 @@ public void depthRange() { // No depth writes, but we'll still use the depth test. GlStateManager._depthMask(false); GlStateManager._colorMask(ColorTargetState.WRITE_ALL); - GlStateManager._enableBlend(); + GlStateManager._enableBlend(0); GlStateManager._blendFuncSeparate(GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE); GL32.glBlendEquation(GlConst.GL_MAX); - float far = Minecraft.getInstance().gameRenderer.getGameRenderState().levelRenderState.cameraRenderState.depthFar; + float far = Minecraft.getInstance().gameRenderer.gameRenderState().levelRenderState.cameraRenderState.depthFar; if (GlCompat.SUPPORTS_DSA) { GL46.glNamedFramebufferDrawBuffers(fbo, DEPTH_RANGE_DRAW_BUFFERS); @@ -108,7 +111,7 @@ public void renderTransmittance() { // No depth writes, but we'll still use the depth test GlStateManager._depthMask(false); GlStateManager._colorMask(ColorTargetState.WRITE_ALL); - GlStateManager._enableBlend(); + GlStateManager._enableBlend(0); GlStateManager._blendFuncSeparate(GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE); GL32.glBlendEquation(GlConst.GL_FUNC_ADD); @@ -134,7 +137,7 @@ public void renderDepthFromTransmittance() { // Only write to depth, not color. GlStateManager._depthMask(true); GlStateManager._colorMask(ColorTargetState.WRITE_NONE); - GlStateManager._disableBlend(); + GlStateManager._disableBlend(0); GlStateManager._depthFunc(GlConst.GL_ALWAYS); if (GlCompat.SUPPORTS_DSA) { @@ -156,7 +159,7 @@ public void accumulate() { // No depth writes, but we'll still use the depth test GlStateManager._depthMask(false); GlStateManager._colorMask(ColorTargetState.WRITE_ALL); - GlStateManager._enableBlend(); + GlStateManager._enableBlend(0); GlStateManager._blendFuncSeparate(GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE); GL32.glBlendEquation(GlConst.GL_FUNC_ADD); @@ -175,10 +178,10 @@ public void accumulate() { * Composite the accumulated luminance onto the main framebuffer. */ public void composite() { - if (Minecraft.useShaderTransparency()) { - bindRenderTarget(Minecraft.getInstance().levelRenderer.getItemEntityTarget()); + if (Minecraft.getInstance().options.improvedTransparency().get()) { + bindRenderTarget(Minecraft.getInstance().levelRenderer.itemEntityTarget()); } else { - bindRenderTarget(Minecraft.getInstance().getMainRenderTarget()); + bindRenderTarget(Minecraft.getInstance().gameRenderer.mainRenderTarget()); } // The composite shader writes out the closest depth to gl_FragDepth. @@ -187,7 +190,7 @@ public void composite() { // If Neo gets wavelet OIT we can use their hooks to be correct with everything. GlStateManager._depthMask(true); GlStateManager._colorMask(ColorTargetState.WRITE_ALL); - GlStateManager._enableBlend(); + GlStateManager._enableBlend(0); // We rely on the blend func to achieve: // final color = (1 - transmittance_total) * sum(color_f * alpha_f * transmittance_f) / sum(alpha_f * transmittance_f) @@ -207,14 +210,15 @@ public void composite() { drawFullscreenQuad(); - bindRenderTarget(Minecraft.getInstance().getMainRenderTarget()); + bindRenderTarget(Minecraft.getInstance().gameRenderer.mainRenderTarget()); } private static void bindRenderTarget(RenderTarget target) { GlTexture colorTexture = (GlTexture) target.getColorTexture(); - int i = colorTexture.getFbo( + int i = GlUtil.getGlDevice().frameBufferCache().getFbo( GlUtil.getGlDevice().directStateAccess(), - target.getDepthTexture() + List.of((FrameBufferAttachment) target.getColorTexture()), + (FrameBufferAttachment) target.getDepthTexture() ); GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, i); GlStateManager._viewport(0, 0, colorTexture.getWidth(0), colorTexture.getHeight(0)); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/instancing/InstancedDrawManager.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/instancing/InstancedDrawManager.java index 8450b2de1f..b081edc124 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/instancing/InstancedDrawManager.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/instancing/InstancedDrawManager.java @@ -123,7 +123,7 @@ public void render(LightStorage lightStorage, EnvironmentStorage environmentStor TextureBinder.bindLightAndOverlay(); light.bind(); - TextureBinder.bindRenderTarget(Minecraft.getInstance().getMainRenderTarget()); + TextureBinder.bindRenderTarget(Minecraft.getInstance().gameRenderer.mainRenderTarget()); submitDraws(); @@ -269,7 +269,7 @@ public void renderCrumbling(List crumblingBlocks) { vao.bindForDraw(); TextureBinder.bindLightAndOverlay(); - TextureBinder.bindRenderTarget(Minecraft.getInstance().getMainRenderTarget()); + TextureBinder.bindRenderTarget(Minecraft.getInstance().gameRenderer.mainRenderTarget()); for (var groupEntry : byType.entrySet()) { var byProgress = groupEntry.getValue(); @@ -306,7 +306,7 @@ public void renderCrumbling(List crumblingBlocks) { @Override public void triggerFallback() { InstancingPrograms.kill(); - Minecraft.getInstance().levelRenderer.allChanged(); + Minecraft.getInstance().levelRenderer.resetLevelRenderData(); } @Override diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FrameUniforms.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FrameUniforms.java index 4ae1146c69..0516c50bb3 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FrameUniforms.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FrameUniforms.java @@ -10,7 +10,6 @@ import dev.engine_room.flywheel.api.visualization.VisualizationManager; import dev.engine_room.flywheel.backend.engine.indirect.DepthPyramid; import dev.engine_room.flywheel.backend.extension.CameraRenderStateExtension; -import dev.engine_room.flywheel.backend.mixin.LevelRendererAccessor; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.state.level.CameraRenderState; @@ -163,7 +162,7 @@ private static long writeCamera(long ptr) { } private static long writeTime(long ptr, RenderContext context) { - int ticks = ((LevelRendererAccessor) context.renderer()).flywheel$getTicks(); + int ticks = (int) context.levelRenderState().gameTime; float partialTick = context.partialTick(); float renderTicks = ticks + partialTick; float renderSeconds = renderTicks / 20f; @@ -194,7 +193,7 @@ private static long writeCameraIn(long ptr, CameraRenderState cameraRenderState) private static long writeCullData(long ptr, CameraRenderState cameraRenderState) { var mc = Minecraft.getInstance(); - var mainRenderTarget = mc.getMainRenderTarget(); + var mainRenderTarget = mc.gameRenderer.mainRenderTarget(); int pyramidWidth = DepthPyramid.mip0Size(mainRenderTarget.width); int pyramidHeight = DepthPyramid.mip0Size(mainRenderTarget.height); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/PlayerUniforms.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/PlayerUniforms.java index c76dc1934f..eb0f6a8683 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/PlayerUniforms.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/PlayerUniforms.java @@ -62,17 +62,14 @@ public static void update(RenderContext context) { } private static long writeTeamColor(long ptr, @Nullable PlayerTeam team) { - if (team != null) { - Integer color = team.getColor().getColor(); - - if (color != null) { - int red = ARGB.red(color); - int green = ARGB.green(color); - int blue = ARGB.blue(color); - return writeVec4(ptr, red / 255f, green / 255f, blue / 255f, 1f); - } else { - return writeVec4(ptr, 1f, 1f, 1f, 1f); - } + if (team != null && team.getColor().isPresent()) { + int color = team.getColor().get().rgb(); + int red = ARGB.red(color); + int green = ARGB.green(color); + int blue = ARGB.blue(color); + return writeVec4(ptr, red / 255f, green / 255f, blue / 255f, 1f); + } else if (team != null) { + return writeVec4(ptr, 1f, 1f, 1f, 1f); } else { return writeVec4(ptr, 1f, 1f, 1f, 0f); } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayDSA.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayDSA.java index 196ecdb1dc..28ddfc4251 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayDSA.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayDSA.java @@ -60,9 +60,9 @@ public void bindAttributes(final int bindingIndex, final int startAttribIndex, L if (!attribute.equals(attributes[attribIndex])) { if (attribute instanceof VertexAttribute.Float f) { - GL45C.glVertexArrayAttribFormat(handle, attribIndex, f.size(), GlConst.toGl(f.type()), f.normalized(), offset); + GL45C.glVertexArrayAttribFormat(handle, attribIndex, f.size(), f.type().glType(), f.normalized(), offset); } else if (attribute instanceof VertexAttribute.Int vi) { - GL45C.glVertexArrayAttribIFormat(handle, attribIndex, vi.size(), GlConst.toGl(vi.type()), offset); + GL45C.glVertexArrayAttribIFormat(handle, attribIndex, vi.size(), vi.type().glType(), offset); } attributes[attribIndex] = attribute; } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayGL3.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayGL3.java index 5c9d922152..dbc708453c 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayGL3.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayGL3.java @@ -112,9 +112,9 @@ private void updateAttribute(int attribIndex) { int stride = bindingStrides[bindingIndex]; if (attribute instanceof VertexAttribute.Float f) { - GlStateManager._vertexAttribPointer(attribIndex, f.size(), GlConst.toGl(f.type()), f.normalized(), stride, offset); + GlStateManager._vertexAttribPointer(attribIndex, f.size(), f.type().glType(), f.normalized(), stride, offset); } else if (attribute instanceof VertexAttribute.Int vi) { - GlStateManager._vertexAttribIPointer(attribIndex, vi.size(), GlConst.toGl(vi.type()), stride, offset); + GlStateManager._vertexAttribIPointer(attribIndex, vi.size(), vi.type().glType(), stride, offset); } int divisor = bindingDivisors[bindingIndex]; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArraySeparateAttributes.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArraySeparateAttributes.java index 9813a7173c..0ff975e3c7 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArraySeparateAttributes.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArraySeparateAttributes.java @@ -64,9 +64,9 @@ public void bindAttributes(final int bindingIndex, final int startAttribIndex, L if (!attribute.equals(attributes[attribIndex])) { if (attribute instanceof VertexAttribute.Float f) { - GL43C.glVertexAttribFormat(attribIndex, f.size(), GlConst.toGl(f.type()), f.normalized(), offset); + GL43C.glVertexAttribFormat(attribIndex, f.size(), f.type().glType(), f.normalized(), offset); } else if (attribute instanceof VertexAttribute.Int vi) { - GL43C.glVertexAttribIFormat(attribIndex, vi.size(), GlConst.toGl(vi.type()), offset); + GL43C.glVertexAttribIFormat(attribIndex, vi.size(), vi.type().glType(), offset); } attributes[attribIndex] = attribute; } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/VertexAttribute.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/VertexAttribute.java index abb4b31726..ccf5d73f80 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/VertexAttribute.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/VertexAttribute.java @@ -1,31 +1,42 @@ package dev.engine_room.flywheel.backend.gl.array; -import com.mojang.blaze3d.vertex.VertexFormatElement; - public sealed interface VertexAttribute { int byteWidth(); - /** - * A bindable attribute in a vertex array. - * - * @param type The type of the attribute, e.g. GL_FLOAT. - * @param size The number of components in the attribute, e.g. 3 for a vec3. - * @param normalized Whether the data is normalized. - */ - record Float(VertexFormatElement.Type type, int size, boolean normalized) implements VertexAttribute { + public enum Type { + BYTE(1, 0x1400), + UBYTE(1, 0x1401), + SHORT(2, 0x1402), + USHORT(2, 0x1403), + INT(4, 0x1404), + UINT(4, 0x1405), + FLOAT(4, 0x1406); + + private final int size; + private final int glType; + + Type(int size, int glType) { + this.size = size; + this.glType = glType; + } + + public int size() { + return size; + } + + public int glType() { + return glType; + } + } + + record Float(Type type, int size, boolean normalized) implements VertexAttribute { @Override public int byteWidth() { return size * type.size(); } } - /** - * A bindable attribute in a vertex array. - * - * @param type The type of the attribute, e.g. GL_INT. - * @param size The number of components in the attribute, e.g. 3 for a vec3. - */ - record Int(VertexFormatElement.Type type, int size) implements VertexAttribute { + record Int(Type type, int size) implements VertexAttribute { @Override public int byteWidth() { return size * type.size(); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java index b2b9b2440b..d0ddc9aad4 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java @@ -12,7 +12,7 @@ @Mixin(FogRenderer.class) abstract class FogRendererMixin { @Inject(method = "updateBuffer(Lnet/minecraft/client/renderer/fog/FogData;)V", at = @At("HEAD")) - private static void flywheel$onReturnSetupFog(FogData fog, CallbackInfo ci) { + private void flywheel$onReturnSetupFog(FogData fog, CallbackInfo ci) { FogUniforms.update(fog.color, fog.environmentalStart, fog.environmentalEnd, fog.renderDistanceStart, fog.renderDistanceEnd, fog.skyEnd, fog.cloudEnd); } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/LightingMixin.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/LightingMixin.java index 3919ac6af3..1a9e506d40 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/LightingMixin.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/LightingMixin.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.backend.mixin; -import org.joml.Vector3f; +import org.joml.Vector3fc; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -13,8 +13,8 @@ @Mixin(Lighting.class) abstract class LightingMixin { - @Inject(method = "updateBuffer(Lcom/mojang/blaze3d/platform/Lighting$Entry;Lorg/joml/Vector3f;Lorg/joml/Vector3f;)V", at = @At("HEAD")) - private static void flywheel$onHeadUpdateBuffer(Entry entry, Vector3f light0, Vector3f light1, CallbackInfo ci) { + @Inject(method = "updateBuffer(Lcom/mojang/blaze3d/platform/Lighting$Entry;Lorg/joml/Vector3fc;Lorg/joml/Vector3fc;)V", at = @At("HEAD")) + private void flywheel$onHeadUpdateBuffer(Entry entry, Vector3fc light0, Vector3fc light1, CallbackInfo ci) { if (entry == Entry.LEVEL) { LevelUniforms.LIGHT0_DIRECTION.set(light0); LevelUniforms.LIGHT1_DIRECTION.set(light1); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/RenderSystemMixin.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/RenderSystemMixin.java index 9df88f3b25..48735b9337 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/RenderSystemMixin.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/RenderSystemMixin.java @@ -5,6 +5,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import com.mojang.blaze3d.systems.GpuDevice; import com.mojang.blaze3d.systems.RenderSystem; import dev.engine_room.flywheel.backend.gl.GlCompat; @@ -12,7 +13,7 @@ @Mixin(RenderSystem.class) abstract class RenderSystemMixin { @Inject(method = "initRenderer", at = @At("RETURN")) - private static void flywheel$onInitRenderer(CallbackInfo ci) { + private static void flywheel$onInitRenderer(GpuDevice device, CallbackInfo ci) { GlCompat.init(); } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/light/SkyDataLayerStorageMapAccessor.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/light/SkyDataLayerStorageMapAccessor.java index b34c0ef31b..1890a38cf3 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/light/SkyDataLayerStorageMapAccessor.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/light/SkyDataLayerStorageMapAccessor.java @@ -5,7 +5,7 @@ import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap; -@Mixin(targets = "net.minecraft.world.level.lighting.SkyLightSectionStorage.SkyDataLayerStorageMap") +@Mixin(targets = "net.minecraft.world.level.lighting.SkyLightSectionStorage$SkyDataLayerStorageMap") public interface SkyDataLayerStorageMapAccessor { @Accessor("currentLowestY") int flywheel$currentLowestY(); diff --git a/common/src/backend/resources/flywheel.backend.mixins.json b/common/src/backend/resources/flywheel.backend.mixins.json index 9dc1ec415e..cc6b5e2398 100644 --- a/common/src/backend/resources/flywheel.backend.mixins.json +++ b/common/src/backend/resources/flywheel.backend.mixins.json @@ -12,7 +12,6 @@ "GlStateManagerAccessor", "GlStateManagerMixin", "GpuDeviceAccessor", - "LevelRendererAccessor", "LightingMixin", "OptionsMixin", "RenderSystemMixin", diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java index 7260cad9f0..21ad7bae7c 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java @@ -78,7 +78,7 @@ public static Material getMaterial(ChunkSectionLayer chunkSectionLayer, boolean @Nullable public static Material getItemMaterial(RenderType renderType) { - if (renderType == Sheets.cutoutBlockSheet()) { + if (renderType == Sheets.cutoutBlockItemSheet()) { return Materials.CUTOUT_BLOCK; } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitter.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitter.java index 00334e84e1..bef875b251 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitter.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitter.java @@ -7,10 +7,10 @@ import org.jspecify.annotations.Nullable; import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.PrimitiveTopology; import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.ByteBufferBuilder; import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.blaze3d.vertex.VertexFormat.Mode; import dev.engine_room.flywheel.api.material.Material; import dev.engine_room.flywheel.api.model.Mesh; @@ -94,7 +94,7 @@ public BufferBuilder getBuffer(Material material) { } ByteBufferBuilder byteBufferBuilder = byteBufferBuilderStack.nextOrCreate(); - BufferBuilder bufferBuilder = new BufferBuilder(byteBufferBuilder, Mode.QUADS, FlywheelVertexFormats.BLOCK_VERTEX_FORMAT); + BufferBuilder bufferBuilder = new BufferBuilder(byteBufferBuilder, PrimitiveTopology.QUADS, FlywheelVertexFormats.BLOCK_VERTEX_FORMAT); // currentIndex == numBufferBuildersPopulated here. materials[currentIndex] = material; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/vertex/FlywheelVertexFormats.java b/common/src/lib/java/dev/engine_room/flywheel/lib/vertex/FlywheelVertexFormats.java index 6459664e4a..1715786200 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/vertex/FlywheelVertexFormats.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/vertex/FlywheelVertexFormats.java @@ -1,17 +1,16 @@ package dev.engine_room.flywheel.lib.vertex; +import com.mojang.blaze3d.GpuFormat; import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.VertexFormat; -import com.mojang.blaze3d.vertex.VertexFormatElement; public class FlywheelVertexFormats { /// Basically the same as {@link DefaultVertexFormat#BLOCK} but with the normals included - public static final VertexFormat BLOCK_VERTEX_FORMAT = VertexFormat.builder() - .add("Position", VertexFormatElement.POSITION) - .add("Color",VertexFormatElement.COLOR) - .add("UV0",VertexFormatElement.UV0) - .add("UV2",VertexFormatElement.UV2) - .add("Normal", VertexFormatElement.NORMAL) - .padding(1) + public static final VertexFormat BLOCK_VERTEX_FORMAT = VertexFormat.builder(0) + .addAttribute("Position", GpuFormat.RGB32_FLOAT) + .addAttribute("Color", GpuFormat.RGBA8_UNORM) + .addAttribute("UV0", GpuFormat.RG32_FLOAT) + .addAttribute("UV2", GpuFormat.RG16_SINT) + .addAttribute("Normal", GpuFormat.RGBA8_SNORM) .build(); } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractBlockEntityVisual.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractBlockEntityVisual.java index 1bd92114a4..7fe7c594d2 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractBlockEntityVisual.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractBlockEntityVisual.java @@ -16,9 +16,9 @@ import dev.engine_room.flywheel.lib.instance.FlatLit; import dev.engine_room.flywheel.lib.math.MoreMath; import it.unimi.dsi.fastutil.longs.LongSet; -import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; +import net.minecraft.util.LightCoordsUtil; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; @@ -100,11 +100,11 @@ public boolean doDistanceLimitThisFrame(DynamicVisual.Context context) { } protected int computePackedLight() { - return LevelRenderer.getLightCoords(level, pos); + return LightCoordsUtil.getLightCoords(level, pos); } protected void relight(BlockPos pos, @Nullable FlatLit... instances) { - FlatLit.relight(LevelRenderer.getLightCoords(level, pos), instances); + FlatLit.relight(LightCoordsUtil.getLightCoords(level, pos), instances); } protected void relight(@Nullable FlatLit... instances) { @@ -112,7 +112,7 @@ protected void relight(@Nullable FlatLit... instances) { } protected void relight(BlockPos pos, Iterator<@Nullable FlatLit> instances) { - FlatLit.relight(LevelRenderer.getLightCoords(level, pos), instances); + FlatLit.relight(LightCoordsUtil.getLightCoords(level, pos), instances); } protected void relight(Iterator<@Nullable FlatLit> instances) { @@ -120,7 +120,7 @@ protected void relight(Iterator<@Nullable FlatLit> instances) { } protected void relight(BlockPos pos, Iterable<@Nullable FlatLit> instances) { - FlatLit.relight(LevelRenderer.getLightCoords(level, pos), instances); + FlatLit.relight(LightCoordsUtil.getLightCoords(level, pos), instances); } protected void relight(Iterable<@Nullable FlatLit> instances) { diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/GameRendererMixin.java b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/GameRendererMixin.java index 675a5aedda..7b270dd7aa 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/GameRendererMixin.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/GameRendererMixin.java @@ -16,14 +16,14 @@ import net.minecraft.client.DeltaTracker; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.chunk.ChunkSectionsToRender; import net.minecraft.client.renderer.state.level.CameraRenderState; @Mixin(GameRenderer.class) public class GameRendererMixin { - @WrapOperation(method = "renderLevel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/LevelRenderer;renderLevel(Lcom/mojang/blaze3d/resource/GraphicsResourceAllocator;Lnet/minecraft/client/DeltaTracker;ZLnet/minecraft/client/renderer/state/level/CameraRenderState;Lorg/joml/Matrix4fc;Lcom/mojang/blaze3d/buffers/GpuBufferSlice;Lorg/joml/Vector4f;ZLnet/minecraft/client/renderer/chunk/ChunkSectionsToRender;)V")) - private void extractProjectionMatrixNoBob(LevelRenderer instance, GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, boolean renderOutline, CameraRenderState cameraState, Matrix4fc modelViewMatrix, GpuBufferSlice terrainFog, Vector4f fogColor, boolean shouldRenderSky, ChunkSectionsToRender chunkSectionsToRender, Operation original, @Local(name = "projectionMatrix") Matrix4f projectionMatrix) { + @WrapOperation(method = "renderLevel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/LevelRenderer;render(Lcom/mojang/blaze3d/resource/GraphicsResourceAllocator;Lnet/minecraft/client/DeltaTracker;ZLnet/minecraft/client/renderer/state/level/CameraRenderState;Lorg/joml/Matrix4fc;Lcom/mojang/blaze3d/buffers/GpuBufferSlice;Lorg/joml/Vector4f;Z)V")) + private void extractProjectionMatrixNoBob(LevelRenderer instance, GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, boolean renderOutline, CameraRenderState cameraState, Matrix4fc modelViewMatrix, GpuBufferSlice terrainFog, Vector4f fogColor, boolean shouldRenderSky, Operation original, @Local(name = "projectionMatrix") Matrix4f projectionMatrix) { ScopedValue.where(RenderContextImpl.PROJECTION_MATRIX_NO_BOB, projectionMatrix) - .run(() -> original.call(instance, resourceAllocator, deltaTracker, renderOutline, cameraState, modelViewMatrix, terrainFog, fogColor, shouldRenderSky, chunkSectionsToRender)); + .run(() -> original.call(instance, resourceAllocator, deltaTracker, renderOutline, cameraState, modelViewMatrix, terrainFog, fogColor, shouldRenderSky)); } } + diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java index 5541c3f82f..62d89e5a62 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java @@ -1,8 +1,5 @@ package dev.engine_room.flywheel.impl.mixin; -import java.util.Iterator; -import java.util.SortedSet; - import org.joml.Matrix4f; import org.joml.Matrix4fc; import org.joml.Vector4f; @@ -15,40 +12,28 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import com.google.common.collect.Iterators; -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.resource.GraphicsResourceAllocator; import dev.engine_room.flywheel.api.visualization.VisualizationManager; import dev.engine_room.flywheel.impl.FlwImplXplat; import dev.engine_room.flywheel.impl.event.RenderContextImpl; -import dev.engine_room.flywheel.lib.visualization.VisualizationHelper; -import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import net.minecraft.client.DeltaTracker; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.RenderBuffers; -import net.minecraft.client.renderer.chunk.ChunkSectionsToRender; +import net.minecraft.client.renderer.SubmitNodeCollector; import net.minecraft.client.renderer.state.level.CameraRenderState; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.state.level.LevelRenderState; import net.minecraft.server.level.BlockDestructionProgress; -import net.minecraft.world.entity.Entity; @Mixin(value = LevelRenderer.class, priority = 1001) // Higher priority to go after Sodium abstract class LevelRendererMixin { - @Shadow - @Nullable - private ClientLevel level; - @Shadow @Final private RenderBuffers renderBuffers; - @Shadow - @Final - private Long2ObjectMap> destructionProgress; - @Shadow @Final private LevelRenderState levelRenderState; @@ -57,8 +42,9 @@ abstract class LevelRendererMixin { @Nullable private RenderContextImpl flywheel$renderContext; - @Inject(method = "renderLevel", at = @At("HEAD")) - private void flywheel$beginRender(GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, boolean renderOutline, CameraRenderState cameraState, Matrix4fc modelViewMatrix, GpuBufferSlice terrainFog, Vector4f fogColor, boolean shouldRenderSky, ChunkSectionsToRender chunkSectionsToRender, CallbackInfo ci) { + @Inject(method = "render", at = @At("HEAD")) + private void flywheel$beginRender(GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, boolean renderOutline, CameraRenderState cameraState, Matrix4fc modelViewMatrix, GpuBufferSlice terrainFog, Vector4f fogColor, boolean shouldRenderSky, CallbackInfo ci) { + ClientLevel level = Minecraft.getInstance().level; Matrix4f projectionMatrix = RenderContextImpl.PROJECTION_MATRIX_NO_BOB.get(); flywheel$renderContext = RenderContextImpl.create((LevelRenderer) (Object) this, level, renderBuffers, modelViewMatrix, projectionMatrix, cameraState, levelRenderState, deltaTracker.getGameTimeDeltaPartialTick(false)); @@ -68,21 +54,23 @@ abstract class LevelRendererMixin { } } - @Inject(method = "renderLevel", at = @At("RETURN")) + @Inject(method = "render", at = @At("RETURN")) private void flywheel$endRender(CallbackInfo ci) { flywheel$renderContext = null; } - @Inject(method = "allChanged", at = @At("RETURN")) + @Inject(method = "resetLevelRenderData", at = @At("RETURN")) private void flywheel$reload(CallbackInfo ci) { + ClientLevel level = Minecraft.getInstance().level; if (level != null) { FlwImplXplat.INSTANCE.dispatchReloadLevelRendererEvent(level); } } - @Inject(method = "lambda$addMainPass$0", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/LevelRenderer;submitBlockEntities(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/state/level/LevelRenderState;Lnet/minecraft/client/renderer/SubmitNodeStorage;)V")) + @Inject(method = "submitFeatures", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/LevelRenderer;submitBlockEntities(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/state/level/LevelRenderState;Lnet/minecraft/client/renderer/SubmitNodeCollector;)V")) private void flywheel$beforeBlockEntities(CallbackInfo ci) { if (flywheel$renderContext != null) { + ClientLevel level = Minecraft.getInstance().level; VisualizationManager manager = VisualizationManager.get(level); if (manager != null) { manager.renderDispatcher().afterSubmitEntities(flywheel$renderContext); @@ -90,19 +78,14 @@ abstract class LevelRendererMixin { } } - @Inject(method = "lambda$addMainPass$0", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/LevelRenderer;submitBlockDestroyAnimation(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/level/LevelRenderState;)V")) + @Inject(method = "submitFeatures", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/LevelRenderer;submitBlockDestroyAnimation(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/level/LevelRenderState;)V")) private void flywheel$beforeRenderCrumbling(CallbackInfo ci) { if (flywheel$renderContext != null) { + ClientLevel level = Minecraft.getInstance().level; VisualizationManager manager = VisualizationManager.get(level); if (manager != null) { - manager.renderDispatcher().beforeSubmitCrumbling(flywheel$renderContext, destructionProgress); + manager.renderDispatcher().beforeSubmitCrumbling(flywheel$renderContext); } } } - - @ModifyExpressionValue(method = "extractVisibleEntities", at = @At(value = "INVOKE", target = "Ljava/lang/Iterable;iterator()Ljava/util/Iterator;")) - private Iterator flywheel$decideNotToRenderEntity(Iterator original) { - return Iterators.filter(original, entity -> !(VisualizationManager.supportsVisualization(entity.level()) && - VisualizationHelper.skipVanillaRender(entity))); - } } diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/visualmanage/LevelRendererMixin.java b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/visualmanage/LevelRendererMixin.java index 53f3900962..8ae82136ca 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/visualmanage/LevelRendererMixin.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/visualmanage/LevelRendererMixin.java @@ -1,21 +1,30 @@ package dev.engine_room.flywheel.impl.mixin.visualmanage; +import java.util.Iterator; + +import org.jspecify.annotations.Nullable; 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.google.common.collect.Iterators; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; + import dev.engine_room.flywheel.api.visualization.VisualizationManager; +import dev.engine_room.flywheel.lib.visualization.VisualizationHelper; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.extract.LevelExtractor; import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; -@Mixin(LevelRenderer.class) +@Mixin(LevelExtractor.class) abstract class LevelRendererMixin { @Shadow + @Nullable private ClientLevel level; /** @@ -23,6 +32,10 @@ abstract class LevelRendererMixin { */ @Inject(method = "setBlockDirty(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/block/state/BlockState;)V", at = @At("TAIL")) private void flywheel$checkUpdate(BlockPos pos, BlockState oldState, BlockState newState, CallbackInfo ci) { + if (level == null) { + return; + } + VisualizationManager manager = VisualizationManager.get(level); if (manager == null) { return; @@ -42,4 +55,10 @@ abstract class LevelRendererMixin { blockEntities.queueUpdate(blockEntity); } } + + @ModifyExpressionValue(method = "extractVisibleEntities", at = @At(value = "INVOKE", target = "Ljava/lang/Iterable;iterator()Ljava/util/Iterator;")) + private Iterator flywheel$decideNotToRenderEntity(Iterator original) { + return Iterators.filter(original, entity -> !(VisualizationManager.supportsVisualization(entity.level()) && + VisualizationHelper.skipVanillaRender(entity))); + } } diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java index fb9dcd78a2..d3cc124854 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java @@ -275,30 +275,25 @@ private void render(RenderContext context) { lateInit().engine.render(context); } - private void renderCrumbling(RenderContext context, Long2ObjectMap> destructionProgress) { - if (destructionProgress.isEmpty()) { + private void renderCrumbling(RenderContext context) { + var blockBreakingStates = context.levelRenderState().blockBreakingRenderStates; + if (blockBreakingStates == null || blockBreakingStates.isEmpty()) { return; } List crumblingBlocks = new ArrayList<>(); - for (var entry : destructionProgress.long2ObjectEntrySet()) { - var set = entry.getValue(); - if (set == null || set.isEmpty()) { - // Nothing to do if there's no crumbling. - continue; - } - - var visual = blockEntities.getStorage() - .visualAtPos(entry.getLongKey()); + for (var breakingState : blockBreakingStates) { + BlockPos pos = breakingState.blockPos(); + long longPos = pos.asLong(); + var visual = blockEntities.getStorage().visualAtPos(longPos); if (visual == null) { // The block doesn't have a visual, this is probably the common case. continue; } List instances = new ArrayList<>(); - visual.collectCrumblingInstances(instance -> { if (instance != null) { instances.add(instance); @@ -310,9 +305,7 @@ private void renderCrumbling(RenderContext context, Long2ObjectMap> destructionProgress) { - renderCrumbling(ctx, destructionProgress); + public void beforeSubmitCrumbling(RenderContext ctx) { + renderCrumbling(ctx); } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a632e03f37..89da1f7a65 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,10 +1,10 @@ [versions] java = "25" -minecraft = "26.1.2" +minecraft = "26.2" # https://neoforged.net mdg = "2.0.+" -neoforge = "26.1.2.78" +neoforge = "26.2.0.88" # https://fabricmc.net/develop loom = "1.17.+" diff --git a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java index bbce84765e..dcb4cdf6b6 100644 --- a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java +++ b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java @@ -54,7 +54,7 @@ public static SimpleModel bufferModel(BlockStateModel model, BlockPos pos, Block model.collectParts(level, pos, state, random, parts); Minecraft minecraft = Minecraft.getInstance(); - GameRenderState gameRenderState = minecraft.gameRenderer.getGameRenderState(); + GameRenderState gameRenderState = minecraft.gameRenderer.gameRenderState(); BlockColors blockColors = minecraft.getBlockColors(); // See ModelBlockRenderer#tesselateBlock @@ -98,7 +98,7 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT Minecraft minecraft = Minecraft.getInstance(); ModelManager modelManager = minecraft.getModelManager(); - GameRenderState gameRenderState = minecraft.gameRenderer.getGameRenderState(); + GameRenderState gameRenderState = minecraft.gameRenderer.gameRenderState(); boolean useAo = gameRenderState.optionsRenderState.ambientOcclusion; BlockColors blockColors = minecraft.getBlockColors(); diff --git a/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java b/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java index 73bc4cf363..2af379ed9a 100644 --- a/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java +++ b/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java @@ -43,7 +43,7 @@ public static void registerClientCommands(RegisterClientCommandsEvent event) { backendValue.set(FlwConfig.DEFAULT_BACKEND_STR); // Reload renderers so we can report the actual backend. - Minecraft.getInstance().levelRenderer.allChanged(); + Minecraft.getInstance().levelRenderer.resetLevelRenderData(); Backend actualBackend = BackendManager.currentBackend(); String actualIdStr = Backend.REGISTRY.getIdOrThrow(actualBackend) @@ -59,7 +59,7 @@ public static void registerClientCommands(RegisterClientCommandsEvent event) { backendValue.set(requestedIdStr); // Reload renderers so we can report the actual backend. - Minecraft.getInstance().levelRenderer.allChanged(); + Minecraft.getInstance().levelRenderer.resetLevelRenderData(); Backend actualBackend = BackendManager.currentBackend(); if (actualBackend != requestedBackend) { @@ -86,14 +86,14 @@ public static void registerClientCommands(RegisterClientCommandsEvent event) { .executes(context -> { limitUpdatesValue.set(true); sendMessage(context.getSource(), Component.translatable("command.flywheel.limit_updates.set.on")); - Minecraft.getInstance().levelRenderer.allChanged(); + Minecraft.getInstance().levelRenderer.resetLevelRenderData(); return Command.SINGLE_SUCCESS; })) .then(Commands.literal("off") .executes(context -> { limitUpdatesValue.set(false); sendMessage(context.getSource(), Component.translatable("command.flywheel.limit_updates.set.off")); - Minecraft.getInstance().levelRenderer.allChanged(); + Minecraft.getInstance().levelRenderer.resetLevelRenderData(); return Command.SINGLE_SUCCESS; }))); diff --git a/settings.gradle.kts b/settings.gradle.kts index 7e3dba3272..44a6f35211 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -16,6 +16,7 @@ rootDir.walkTopDown() .filter { it.isDirectory } .filter { it != rootDir } .filter { it.name != "buildSrc" && it.name != "build-logic" } + .filter { !it.name.contains("fabric") } .filter { it.resolve("build.gradle").exists() || it.resolve("build.gradle.kts").exists() } .forEach { val relativePath = it.toRelativeString(rootDir) diff --git a/vanillin/common/src/main/java/dev/engine_room/vanillin/VanillaVisuals.java b/vanillin/common/src/main/java/dev/engine_room/vanillin/VanillaVisuals.java index fef8a932f5..a867725ed6 100644 --- a/vanillin/common/src/main/java/dev/engine_room/vanillin/VanillaVisuals.java +++ b/vanillin/common/src/main/java/dev/engine_room/vanillin/VanillaVisuals.java @@ -24,9 +24,11 @@ import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EntityTypes; import net.minecraft.world.entity.vehicle.minecart.AbstractMinecart; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.entity.BlockEntityTypes; public class VanillaVisuals { public static final Configurator CONFIGURATOR = new Configurator(); @@ -37,25 +39,25 @@ public class VanillaVisuals { public static final boolean EXPERIMENTAL = VanillinXplat.INSTANCE.isDevelopmentEnvironment(); public static void init() { - builder(BlockEntityType.CHEST) + builder(BlockEntityTypes.CHEST) .factory(ChestVisual::new) .apply(STABLE); - builder(BlockEntityType.ENDER_CHEST) + builder(BlockEntityTypes.ENDER_CHEST) .factory(ChestVisual::new) .apply(STABLE); - builder(BlockEntityType.TRAPPED_CHEST) + builder(BlockEntityTypes.TRAPPED_CHEST) .factory(ChestVisual::new) .apply(STABLE); - builder(BlockEntityType.BELL) + builder(BlockEntityTypes.BELL) .factory(BellVisual::new) .apply(STABLE); - builder(BlockEntityType.SHULKER_BOX) + builder(BlockEntityTypes.SHULKER_BOX) .factory(ShulkerBoxVisual::new) .apply(STABLE); - builder(EntityType.BLOCK_DISPLAY).factory(BlockDisplayVisual::new) + builder(EntityTypes.BLOCK_DISPLAY).factory(BlockDisplayVisual::new) .apply(STABLE); // FIXME 1.21.11: port @@ -65,20 +67,20 @@ public static void init() { // .skipVanillaRender(ItemDisplayVisual::shouldVisualize) // .apply(EXPERIMENTAL); - minecart(EntityType.CHEST_MINECART, ModelLayers.CHEST_MINECART) + minecart(EntityTypes.CHEST_MINECART, ModelLayers.CHEST_MINECART) .apply(STABLE); - minecart(EntityType.COMMAND_BLOCK_MINECART, ModelLayers.COMMAND_BLOCK_MINECART) + minecart(EntityTypes.COMMAND_BLOCK_MINECART, ModelLayers.COMMAND_BLOCK_MINECART) .apply(STABLE); - minecart(EntityType.FURNACE_MINECART, ModelLayers.FURNACE_MINECART) + minecart(EntityTypes.FURNACE_MINECART, ModelLayers.FURNACE_MINECART) .apply(STABLE); - minecart(EntityType.HOPPER_MINECART, ModelLayers.HOPPER_MINECART) + minecart(EntityTypes.HOPPER_MINECART, ModelLayers.HOPPER_MINECART) .apply(STABLE); - minecart(EntityType.MINECART, ModelLayers.MINECART) + minecart(EntityTypes.MINECART, ModelLayers.MINECART) .apply(STABLE); - minecart(EntityType.SPAWNER_MINECART, ModelLayers.SPAWNER_MINECART) + minecart(EntityTypes.SPAWNER_MINECART, ModelLayers.SPAWNER_MINECART) .apply(STABLE); - composable(EntityType.TNT_MINECART) + composable(EntityTypes.TNT_MINECART) .with(element(VisualElements.SHADOW).configure(new ShadowElement.Config(0.7f, ShadowElement.Config.DEFAULT_STRENGTH)) .build()) .with(element(VisualElements.FIRE).build()) diff --git a/vanillin/common/src/main/java/dev/engine_room/vanillin/visuals/ChestVisual.java b/vanillin/common/src/main/java/dev/engine_room/vanillin/visuals/ChestVisual.java index 0ac569f78d..6c29d1f9a8 100644 --- a/vanillin/common/src/main/java/dev/engine_room/vanillin/visuals/ChestVisual.java +++ b/vanillin/common/src/main/java/dev/engine_room/vanillin/visuals/ChestVisual.java @@ -22,13 +22,13 @@ import it.unimi.dsi.fastutil.longs.LongSet; import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.model.geom.ModelLayers; -import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.Sheets; import net.minecraft.client.renderer.blockentity.ChestRenderer; import net.minecraft.client.resources.model.sprite.SpriteId; import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; import net.minecraft.util.LightCoordsUtil; +import net.minecraft.util.LightCoordsUtil; import net.minecraft.util.Mth; import net.minecraft.world.level.block.AbstractChestBlock; import net.minecraft.world.level.block.Block; @@ -199,8 +199,8 @@ public LongSet acceptNone() { private class BrightnessCombiner implements DoubleBlockCombiner.Combiner { @Override public Integer acceptDouble(BlockEntity first, BlockEntity second) { - int firstLight = LevelRenderer.getLightCoords(first.getLevel(), first.getBlockPos()); - int secondLight = LevelRenderer.getLightCoords(second.getLevel(), second.getBlockPos()); + int firstLight = LightCoordsUtil.getLightCoords(first.getLevel(), first.getBlockPos()); + int secondLight = LightCoordsUtil.getLightCoords(second.getLevel(), second.getBlockPos()); int firstBlockLight = LightCoordsUtil.block(firstLight); int secondBlockLight = LightCoordsUtil.block(secondLight); int firstSkyLight = LightCoordsUtil.sky(firstLight); @@ -210,12 +210,12 @@ public Integer acceptDouble(BlockEntity first, BlockEntity second) { @Override public Integer acceptSingle(BlockEntity single) { - return LevelRenderer.getLightCoords(single.getLevel(), single.getBlockPos()); + return LightCoordsUtil.getLightCoords(single.getLevel(), single.getBlockPos()); } @Override public Integer acceptNone() { - return LevelRenderer.getLightCoords(level, pos); + return LightCoordsUtil.getLightCoords(level, pos); } } } From 8cd0b7cd0da2f0cb6e8720bf376ffe0e71ec20c2 Mon Sep 17 00:00:00 2001 From: TCDev69 Date: Fri, 23 Oct 2026 00:33:59 +0200 Subject: [PATCH 2/2] Update Flywheel noise texture handling Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .gitignore | 6 ++++++ .../engine_room/flywheel/backend/NoiseTextures.java | 11 ++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 15e990e4cf..66019dac7c 100644 --- a/.gitignore +++ b/.gitignore @@ -66,3 +66,9 @@ docs/*.local .DS_Store mcmodsrepo **/src/**/generatedPackageInfos/ + +# Generated build output and local tooling +.vscode/ +*.log +replay_pid*.log +hs_err_pid*.log diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/NoiseTextures.java b/common/src/backend/java/dev/engine_room/flywheel/backend/NoiseTextures.java index 0088c2a54c..c70fb8f1f2 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/NoiseTextures.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/NoiseTextures.java @@ -4,11 +4,15 @@ import org.jetbrains.annotations.UnknownNullability; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.mojang.blaze3d.opengl.GlConst; import com.mojang.blaze3d.opengl.GlStateManager; import com.mojang.blaze3d.opengl.GlTexture; import com.mojang.blaze3d.platform.NativeImage; +import dev.engine_room.flywheel.api.Flywheel; import dev.engine_room.flywheel.backend.gl.GlTextureUnit; import dev.engine_room.flywheel.lib.util.IdentifierUtil; import net.minecraft.client.renderer.texture.DynamicTexture; @@ -16,6 +20,7 @@ import net.minecraft.server.packs.resources.ResourceManager; public class NoiseTextures { + private static final Logger LOGGER = LoggerFactory.getLogger(Flywheel.ID + "/backend/noise"); public static final Identifier NOISE_TEXTURE = IdentifierUtil.id("textures/flywheel/noise/blue.png"); @UnknownNullability @@ -34,7 +39,7 @@ public static void reload(ResourceManager manager) { try (var is = optional.get() .open()) { - var image = NativeImage.read(NativeImage.Format.LUMINANCE, is); + var image = NativeImage.read(NativeImage.Format.RGBA, is); // TODO 1.21.11: maybe we should not use DynamicTexture here and do gen/upload manually BLUE_NOISE = new DynamicTexture(() -> "Flywheel Blue Noise", image); @@ -48,8 +53,8 @@ public static void reload(ResourceManager manager) { GlStateManager._texParameter(GlConst.GL_TEXTURE_2D, GlConst.GL_TEXTURE_WRAP_T, GlConst.GL_REPEAT); GlStateManager._bindTexture(0); - } catch (IOException e) { - + } catch (Throwable t) { + LOGGER.error("Failed to load blue noise texture", t); } } }