From 23656879505b1d16aeecdf263628d87de7e71079 Mon Sep 17 00:00:00 2001 From: PepperCode1 <44146161+PepperCode1@users.noreply.github.com> Date: Thu, 11 Apr 2024 12:12:13 -0700 Subject: [PATCH] Next level - Rename all appropriate occurrences of "world" to "level" - Simplify uniform buffers - Fix indirect cull dispatch only binding frame uniforms - Fix level renderer reload resetting debug mode - Properly register backend argument --- .../java/com/jozufozu/flywheel/Flywheel.java | 11 +- .../flywheel/api/instance/Instancer.java | 4 +- .../flywheel/api/visual/LitVisual.java | 2 +- .../visualization/VisualizationContext.java | 2 +- .../flywheel/backend/engine/EngineImpl.java | 2 +- .../engine/indirect/IndirectCullingGroup.java | 2 +- .../engine/indirect/IndirectDrawManager.java | 4 +- .../instancing/InstancedDrawManager.java | 4 +- .../backend/engine/uniform/FogUniforms.java | 30 ++- .../backend/engine/uniform/FrameUniforms.java | 209 +++++++++-------- .../backend/engine/uniform/LevelUniforms.java | 89 +++----- .../engine/uniform/OptionsUniforms.java | 72 ++---- .../engine/uniform/PlayerUniforms.java | 103 ++++----- .../backend/engine/uniform/UniformBuffer.java | 51 +++-- .../engine/uniform/UniformProvider.java | 7 - .../backend/engine/uniform/UniformWriter.java | 85 +++++++ .../backend/engine/uniform/Uniforms.java | 212 ++---------------- .../flywheel/backend/gl/buffer/GlBuffer.java | 1 + .../flywheel/backend/mixin/OptionsMixin.java | 6 +- .../backend/mixin/RenderSystemMixin.java | 10 +- .../flywheel/config/BackendArgument.java | 2 + .../jozufozu/flywheel/config/FlwCommands.java | 43 ++-- .../VisualizationManagerImpl.java | 6 +- .../flywheel/lib/instance/FlatLit.java | 3 +- .../flywheel/lib/light/LightVolume.java | 34 ++- .../jozufozu/flywheel/lib/model/Models.java | 6 +- .../lib/model/baked/BakedModelBufferer.java | 20 +- .../lib/model/baked/BakedModelBuilder.java | 12 +- .../lib/model/baked/BlockModelBuilder.java | 12 +- .../model/baked/MultiBlockModelBuilder.java | 8 +- .../lib/visual/AbstractBlockEntityVisual.java | 2 +- .../lib/visual/AbstractEntityVisual.java | 6 +- .../flywheel/internal/uniforms/frame.glsl | 19 +- 33 files changed, 456 insertions(+), 623 deletions(-) delete mode 100644 src/main/java/com/jozufozu/flywheel/backend/engine/uniform/UniformProvider.java create mode 100644 src/main/java/com/jozufozu/flywheel/backend/engine/uniform/UniformWriter.java diff --git a/src/main/java/com/jozufozu/flywheel/Flywheel.java b/src/main/java/com/jozufozu/flywheel/Flywheel.java index 864f616db..f643650dd 100644 --- a/src/main/java/com/jozufozu/flywheel/Flywheel.java +++ b/src/main/java/com/jozufozu/flywheel/Flywheel.java @@ -34,7 +34,6 @@ import com.jozufozu.flywheel.vanilla.VanillaVisuals; import net.minecraft.client.Minecraft; import net.minecraft.commands.synchronization.ArgumentTypeInfos; -import net.minecraft.commands.synchronization.SingletonArgumentInfo; import net.minecraft.core.Vec3i; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; @@ -50,6 +49,8 @@ import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegisterEvent; @Mod(Flywheel.ID) public class Flywheel { @@ -69,6 +70,7 @@ public class Flywheel { IEventBus modEventBus = FMLJavaModLoadingContext.get() .getModEventBus(); modEventBus.addListener(Flywheel::onCommonSetup); + modEventBus.addListener(Flywheel::onRegister); FlwConfig.get().registerSpecs(modLoadingContext); @@ -137,8 +139,11 @@ public class Flywheel { } private static void onCommonSetup(FMLCommonSetupEvent event) { - // FIXME: argument types also need to be registered to BuiltInRegistries.COMMAND_ARGUMENT_TYPE - ArgumentTypeInfos.registerByClass(BackendArgument.class, SingletonArgumentInfo.contextFree(() -> BackendArgument.INSTANCE)); + ArgumentTypeInfos.registerByClass(BackendArgument.class, BackendArgument.INFO); + } + + private static void onRegister(RegisterEvent event) { + event.register(ForgeRegistries.Keys.COMMAND_ARGUMENT_TYPES, rl("backend"), () -> BackendArgument.INFO); } private static void addDebugInfo(CustomizeGuiOverlayEvent.DebugText event) { diff --git a/src/main/java/com/jozufozu/flywheel/api/instance/Instancer.java b/src/main/java/com/jozufozu/flywheel/api/instance/Instancer.java index 293265850..c91937404 100644 --- a/src/main/java/com/jozufozu/flywheel/api/instance/Instancer.java +++ b/src/main/java/com/jozufozu/flywheel/api/instance/Instancer.java @@ -15,8 +15,8 @@ import com.jozufozu.flywheel.api.BackendImplemented; * When you call {@link #createInstance()} you are given an Instance object that you can manipulate however * you want. The changes you make to the Instance object are automatically made visible, and persistent. * Changing the position of your Instance object every frame means that that copy of the model will be in a - * different position in the world each frame. Setting the position of your Instance once and not touching it - * again means that your model will be in the same position in the world every frame. This persistence is useful + * different position in the level each frame. Setting the position of your Instance once and not touching it + * again means that your model will be in the same position in the level every frame. This persistence is useful * because it means the properties of your model don't have to be re-evaluated every frame. *

* diff --git a/src/main/java/com/jozufozu/flywheel/api/visual/LitVisual.java b/src/main/java/com/jozufozu/flywheel/api/visual/LitVisual.java index b4f1b0a32..13b3638ab 100644 --- a/src/main/java/com/jozufozu/flywheel/api/visual/LitVisual.java +++ b/src/main/java/com/jozufozu/flywheel/api/visual/LitVisual.java @@ -7,7 +7,7 @@ import net.minecraft.core.SectionPos; /** * A visual that listens to light updates. * - *

If your visual moves around in the world at all, you should use {@link TickableVisual} or {@link DynamicVisual}, + *

If your visual moves around in the level at all, you should use {@link TickableVisual} or {@link DynamicVisual}, * and poll for light yourself along with listening for updates. When your visual moves to a different section, call * {@link Notifier#notifySectionsChanged}.

*/ diff --git a/src/main/java/com/jozufozu/flywheel/api/visualization/VisualizationContext.java b/src/main/java/com/jozufozu/flywheel/api/visualization/VisualizationContext.java index ed112f50a..c1e1f6470 100644 --- a/src/main/java/com/jozufozu/flywheel/api/visualization/VisualizationContext.java +++ b/src/main/java/com/jozufozu/flywheel/api/visualization/VisualizationContext.java @@ -18,7 +18,7 @@ public interface VisualizationContext { /** * All models render as if this position is (0, 0, 0). * - * @return The origin of the renderer as a world position. + * @return The origin of the renderer as a level position. */ Vec3i renderOrigin(); diff --git a/src/main/java/com/jozufozu/flywheel/backend/engine/EngineImpl.java b/src/main/java/com/jozufozu/flywheel/backend/engine/EngineImpl.java index 27e706754..4938c6979 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/engine/EngineImpl.java +++ b/src/main/java/com/jozufozu/flywheel/backend/engine/EngineImpl.java @@ -102,7 +102,7 @@ public class EngineImpl implements Engine { private void flush(RenderContext ctx) { try (var state = GlStateTracker.getRestoreState()) { - Uniforms.updateContext(ctx); + Uniforms.update(ctx); drawManager.flush(); environmentStorage.flush(); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/engine/indirect/IndirectCullingGroup.java b/src/main/java/com/jozufozu/flywheel/backend/engine/indirect/IndirectCullingGroup.java index 90a2e2f47..1f46b138e 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/engine/indirect/IndirectCullingGroup.java +++ b/src/main/java/com/jozufozu/flywheel/backend/engine/indirect/IndirectCullingGroup.java @@ -123,7 +123,7 @@ public class IndirectCullingGroup { return; } - Uniforms.bindFrame(); + Uniforms.bindAll(); cullProgram.bind(); environment.setupCull(cullProgram); diff --git a/src/main/java/com/jozufozu/flywheel/backend/engine/indirect/IndirectDrawManager.java b/src/main/java/com/jozufozu/flywheel/backend/engine/indirect/IndirectDrawManager.java index 5a6cf0f85..1687e5e53 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/engine/indirect/IndirectDrawManager.java +++ b/src/main/java/com/jozufozu/flywheel/backend/engine/indirect/IndirectDrawManager.java @@ -84,7 +84,7 @@ public class IndirectDrawManager extends DrawManager> { TextureBinder.bindLightAndOverlay(); vertexArray.bindForDraw(); - Uniforms.bindForDraw(); + Uniforms.bindAll(); for (var group : cullingGroups.values()) { group.submit(stage); @@ -152,7 +152,7 @@ public class IndirectDrawManager extends DrawManager> { TextureBinder.bindLightAndOverlay(); vertexArray.bindForDraw(); - Uniforms.bindForDraw(); + Uniforms.bindAll(); var crumblingMaterial = SimpleMaterial.builder(); diff --git a/src/main/java/com/jozufozu/flywheel/backend/engine/instancing/InstancedDrawManager.java b/src/main/java/com/jozufozu/flywheel/backend/engine/instancing/InstancedDrawManager.java index 017eb3726..4f6f9940c 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/engine/instancing/InstancedDrawManager.java +++ b/src/main/java/com/jozufozu/flywheel/backend/engine/instancing/InstancedDrawManager.java @@ -89,7 +89,7 @@ public class InstancedDrawManager extends DrawManager> { } try (var state = GlStateTracker.getRestoreState()) { - Uniforms.bindForDraw(); + Uniforms.bindAll(); vao.bindForDraw(); TextureBinder.bindLightAndOverlay(); @@ -154,7 +154,7 @@ public class InstancedDrawManager extends DrawManager> { var crumblingMaterial = SimpleMaterial.builder(); try (var state = GlStateTracker.getRestoreState()) { - Uniforms.bindForDraw(); + Uniforms.bindAll(); vao.bindForDraw(); TextureBinder.bindLightAndOverlay(); diff --git a/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/FogUniforms.java b/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/FogUniforms.java index ea4f3e9a6..2b398d8b3 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/FogUniforms.java +++ b/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/FogUniforms.java @@ -1,27 +1,25 @@ package com.jozufozu.flywheel.backend.engine.uniform; -import org.lwjgl.system.MemoryUtil; - import com.mojang.blaze3d.systems.RenderSystem; -public class FogUniforms implements UniformProvider { - public static final int SIZE = 28; +public final class FogUniforms extends UniformWriter { + private static final int SIZE = 4 * 7; + static final UniformBuffer BUFFER = new UniformBuffer(Uniforms.FOG_INDEX, SIZE); - public int byteSize() { - return SIZE; - } + public static void update() { + long ptr = BUFFER.ptr(); - @Override - public void write(long ptr) { var color = RenderSystem.getShaderFogColor(); - MemoryUtil.memPutFloat(ptr, color[0]); - MemoryUtil.memPutFloat(ptr + 4, color[1]); - MemoryUtil.memPutFloat(ptr + 8, color[2]); - MemoryUtil.memPutFloat(ptr + 12, color[3]); - MemoryUtil.memPutFloat(ptr + 16, RenderSystem.getShaderFogStart()); - MemoryUtil.memPutFloat(ptr + 20, RenderSystem.getShaderFogEnd()); - MemoryUtil.memPutInt(ptr + 24, RenderSystem.getShaderFogShape() + ptr = writeFloat(ptr, color[0]); + ptr = writeFloat(ptr + 4, color[1]); + ptr = writeFloat(ptr + 8, color[2]); + ptr = writeFloat(ptr + 12, color[3]); + ptr = writeFloat(ptr + 16, RenderSystem.getShaderFogStart()); + ptr = writeFloat(ptr + 20, RenderSystem.getShaderFogEnd()); + ptr = writeInt(ptr + 24, RenderSystem.getShaderFogShape() .getIndex()); + + BUFFER.markDirty(); } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/FrameUniforms.java b/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/FrameUniforms.java index 6505e185b..b9437118d 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/FrameUniforms.java +++ b/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/FrameUniforms.java @@ -1,13 +1,12 @@ package com.jozufozu.flywheel.backend.engine.uniform; -import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; import org.joml.Vector2f; import org.joml.Vector3f; -import org.lwjgl.system.MemoryUtil; import com.jozufozu.flywheel.api.event.RenderContext; import com.jozufozu.flywheel.api.visualization.VisualizationManager; +import com.jozufozu.flywheel.config.DebugMode; import com.jozufozu.flywheel.lib.math.MatrixMath; import net.minecraft.client.Camera; @@ -17,162 +16,160 @@ import net.minecraft.core.Vec3i; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; -public class FrameUniforms implements UniformProvider { - public static final int SIZE = 800; - public int debugMode; +public final class FrameUniforms extends UniformWriter { + private static final int SIZE = 96 + 64 * 9 + 16 * 4 + 8 * 2 + 8 + 4 * 10; + static final UniformBuffer BUFFER = new UniformBuffer(Uniforms.FRAME_INDEX, SIZE); - @Nullable - private RenderContext context; + private static final Matrix4f VIEW = new Matrix4f(); + private static final Matrix4f VIEW_INVERSE = new Matrix4f(); + private static final Matrix4f VIEW_PREV = new Matrix4f(); + private static final Matrix4f PROJECTION = new Matrix4f(); + private static final Matrix4f PROJECTION_INVERSE = new Matrix4f(); + private static final Matrix4f PROJECTION_PREV = new Matrix4f(); + private static final Matrix4f VIEW_PROJECTION = new Matrix4f(); + private static final Matrix4f VIEW_PROJECTION_INVERSE = new Matrix4f(); + private static final Matrix4f VIEW_PROJECTION_PREV = new Matrix4f(); - private final Matrix4f view = new Matrix4f(); - private final Matrix4f viewInverse = new Matrix4f(); - private final Matrix4f viewPrev = new Matrix4f(); - private final Matrix4f projection = new Matrix4f(); - private final Matrix4f projectionInverse = new Matrix4f(); - private final Matrix4f projectionPrev = new Matrix4f(); - private final Matrix4f viewProjection = new Matrix4f(); - private final Matrix4f viewProjectionInverse = new Matrix4f(); - private final Matrix4f viewProjectionPrev = new Matrix4f(); + private static final Vector3f CAMERA_POS = new Vector3f(); + private static final Vector3f CAMERA_POS_PREV = new Vector3f(); + private static final Vector3f CAMERA_LOOK = new Vector3f(); + private static final Vector3f CAMERA_LOOK_PREV = new Vector3f(); + private static final Vector2f CAMERA_ROT = new Vector2f(); + private static final Vector2f CAMERA_ROT_PREV = new Vector2f(); - private final Vector3f cameraPositionPrev = new Vector3f(); - private final Vector3f cameraLookPrev = new Vector3f(); - private final Vector2f cameraRotPrev = new Vector2f(); + private static boolean firstWrite = true; - private boolean lastInit = false; + private static int debugMode = DebugMode.OFF.ordinal(); + private static boolean frustumPaused = false; + private static boolean frustumCapture = false; - public int byteSize() { - return SIZE; + private FrameUniforms() { } - public void setContext(RenderContext context) { - this.context = context; + public static void debugMode(DebugMode mode) { + debugMode = mode.ordinal(); } - @Override - public void write(long ptr) { - if (context == null) { - return; - } + public static void captureFrustum() { + frustumPaused = true; + frustumCapture = true; + } + + public static void unpauseFrustum() { + frustumPaused = false; + } + + public static void update(RenderContext context) { + long ptr = BUFFER.ptr(); + setPrev(); Vec3i renderOrigin = VisualizationManager.getOrThrow(context.level()) .getRenderOrigin(); var camera = context.camera(); - Vec3 cameraPos = camera.getPosition(); var camX = (float) (cameraPos.x - renderOrigin.getX()); var camY = (float) (cameraPos.y - renderOrigin.getY()); var camZ = (float) (cameraPos.z - renderOrigin.getZ()); - view.set(context.stack().last().pose()); - view.translate(-camX, -camY, -camZ); - projection.set(context.projection()); - viewProjection.set(context.viewProjection()); - viewProjection.translate(-camX, -camY, -camZ); + VIEW.set(context.stack().last().pose()); + VIEW.translate(-camX, -camY, -camZ); + PROJECTION.set(context.projection()); + VIEW_PROJECTION.set(context.viewProjection()); + VIEW_PROJECTION.translate(-camX, -camY, -camZ); - if (!Uniforms.frustumPaused || Uniforms.frustumCapture) { - MatrixMath.writePackedFrustumPlanes(ptr, viewProjection); - Uniforms.frustumCapture = false; + CAMERA_POS.set(camX, camY, camZ); + CAMERA_LOOK.set(camera.getLookVector()); + CAMERA_ROT.set(camera.getXRot(), camera.getYRot()); + + if (firstWrite) { + setPrev(); + } + + if (firstWrite || !frustumPaused || frustumCapture) { + MatrixMath.writePackedFrustumPlanes(ptr, VIEW_PROJECTION); + frustumCapture = false; } ptr += 96; - // manage last values of matrices - if (!lastInit) { - viewPrev.set(view); - projectionPrev.set(projection); - viewProjectionPrev.set(viewProjectionPrev); - } ptr = writeMatrices(ptr); - viewPrev.set(view); - projectionPrev.set(projection); - viewProjectionPrev.set(viewProjection); - // last values for camera - if (!lastInit) { - cameraPositionPrev.set(camX, camY, camZ); - cameraLookPrev.set(camera.getLookVector()); - cameraRotPrev.set(camera.getXRot(), camera.getYRot()); - } - ptr = writeCamera(ptr, camX, camY, camZ); - cameraPositionPrev.set(camX, camY, camZ); - cameraLookPrev.set(camera.getLookVector()); - cameraRotPrev.set(camera.getXRot(), camera.getYRot()); + ptr = writeCamera(ptr); var window = Minecraft.getInstance() .getWindow(); - ptr = Uniforms.writeVec2(ptr, window.getWidth(), window.getHeight()); - + ptr = writeVec2(ptr, window.getWidth(), window.getHeight()); + ptr = writeFloat(ptr, (float) window.getWidth() / (float) window.getHeight()); // default line width: net.minecraft.client.renderer.RenderStateShard.LineStateShard - MemoryUtil.memPutFloat(ptr, Math.max(2.5F, (float) window.getWidth() / 1920.0F * 2.5F)); - ptr += 4; + ptr = writeFloat(ptr, Math.max(2.5F, (float) window.getWidth() / 1920.0F * 2.5F)); + ptr = writeFloat(ptr, Minecraft.getInstance().gameRenderer.getDepthFar()); - MemoryUtil.memPutFloat(ptr, (float) window.getWidth() / (float) window.getHeight()); - ptr += 4; + ptr = writeTime(ptr, context); - MemoryUtil.memPutFloat(ptr, Minecraft.getInstance().gameRenderer.getDepthFar()); - ptr += 4; + ptr = writeCameraIn(ptr, camera); - ptr = writeTime(ptr); + ptr = writeInt(ptr, debugMode); - ptr = writeCameraIn(ptr); - - MemoryUtil.memPutInt(ptr, debugMode); - - lastInit = true; + firstWrite = false; + BUFFER.markDirty(); } - private long writeMatrices(long ptr) { - MatrixMath.writeUnsafe(view, ptr); - MatrixMath.writeUnsafe(view.invert(viewInverse), ptr + 64); - MatrixMath.writeUnsafe(viewPrev, ptr + 64 * 2); - MatrixMath.writeUnsafe(projection, ptr + 64 * 3); - MatrixMath.writeUnsafe(projection.invert(projectionInverse), ptr + 64 * 4); - MatrixMath.writeUnsafe(projectionPrev, ptr + 64 * 5); - MatrixMath.writeUnsafe(viewProjection, ptr + 64 * 6); - MatrixMath.writeUnsafe(viewProjection.invert(viewProjectionInverse), ptr + 64 * 7); - MatrixMath.writeUnsafe(viewProjectionPrev, ptr + 64 * 8); - return ptr + 64 * 9; + private static void setPrev() { + VIEW_PREV.set(VIEW); + PROJECTION_PREV.set(PROJECTION); + VIEW_PROJECTION_PREV.set(VIEW_PROJECTION); + CAMERA_POS_PREV.set(CAMERA_POS); + CAMERA_LOOK_PREV.set(CAMERA_LOOK); + CAMERA_ROT_PREV.set(CAMERA_ROT); } - private long writeCamera(long ptr, float camX, float camY, float camZ) { - Camera camera = context.camera(); - Vector3f lookVector = camera.getLookVector(); - - ptr = Uniforms.writeVec3(ptr, camX, camY, camZ); - ptr = Uniforms.writeVec3(ptr, cameraPositionPrev.x, cameraPositionPrev.y, cameraPositionPrev.z); - - ptr = Uniforms.writeVec3(ptr, lookVector.x, lookVector.y, lookVector.z); - ptr = Uniforms.writeVec3(ptr, cameraLookPrev.x, cameraLookPrev.y, cameraLookPrev.z); - - ptr = Uniforms.writeVec2(ptr, camera.getXRot(), camera.getYRot()); - ptr = Uniforms.writeVec2(ptr, cameraRotPrev.x, cameraRotPrev.y); + private static long writeMatrices(long ptr) { + ptr = writeMat4(ptr, VIEW); + ptr = writeMat4(ptr, VIEW.invert(VIEW_INVERSE)); + ptr = writeMat4(ptr, VIEW_PREV); + ptr = writeMat4(ptr, PROJECTION); + ptr = writeMat4(ptr, PROJECTION.invert(PROJECTION_INVERSE)); + ptr = writeMat4(ptr, PROJECTION_PREV); + ptr = writeMat4(ptr, VIEW_PROJECTION); + ptr = writeMat4(ptr, VIEW_PROJECTION.invert(VIEW_PROJECTION_INVERSE)); + ptr = writeMat4(ptr, VIEW_PROJECTION_PREV); return ptr; } - private long writeTime(long ptr) { + private static long writeCamera(long ptr) { + ptr = writeVec3(ptr, CAMERA_POS.x, CAMERA_POS.y, CAMERA_POS.z); + ptr = writeVec3(ptr, CAMERA_POS_PREV.x, CAMERA_POS_PREV.y, CAMERA_POS_PREV.z); + ptr = writeVec3(ptr, CAMERA_LOOK.x, CAMERA_LOOK.y, CAMERA_LOOK.z); + ptr = writeVec3(ptr, CAMERA_LOOK_PREV.x, CAMERA_LOOK_PREV.y, CAMERA_LOOK_PREV.z); + ptr = writeVec2(ptr, CAMERA_ROT.x, CAMERA_ROT.y); + ptr = writeVec2(ptr, CAMERA_ROT_PREV.x, CAMERA_ROT_PREV.y); + return ptr; + } + + private static long writeTime(long ptr, RenderContext context) { int ticks = context.renderer() .getTicks(); float partialTick = context.partialTick(); float renderTicks = ticks + partialTick; float renderSeconds = renderTicks / 20f; - MemoryUtil.memPutInt(ptr, ticks); - MemoryUtil.memPutFloat(ptr + 4, partialTick); - MemoryUtil.memPutFloat(ptr + 8, renderTicks); - MemoryUtil.memPutFloat(ptr + 12, renderSeconds); - return ptr + 16; + ptr = writeInt(ptr, ticks); + ptr = writeFloat(ptr, partialTick); + ptr = writeFloat(ptr, renderTicks); + ptr = writeFloat(ptr, renderSeconds); + return ptr; } - private long writeCameraIn(long ptr) { - Camera camera = context.camera(); + private static long writeCameraIn(long ptr, Camera camera) { if (!camera.isInitialized()) { - MemoryUtil.memPutInt(ptr, 0); - MemoryUtil.memPutInt(ptr + 4, 0); - return ptr + 8; + ptr = writeInt(ptr, 0); + ptr = writeInt(ptr, 0); + return ptr; } + Level level = camera.getEntity().level(); BlockPos blockPos = camera.getBlockPosition(); Vec3 cameraPos = camera.getPosition(); - return Uniforms.writeInFluidAndBlock(ptr, level, blockPos, cameraPos); + return writeInFluidAndBlock(ptr, level, blockPos, cameraPos); } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/LevelUniforms.java b/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/LevelUniforms.java index 68951fa55..f02707788 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/LevelUniforms.java +++ b/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/LevelUniforms.java @@ -1,8 +1,5 @@ package com.jozufozu.flywheel.backend.engine.uniform; -import org.jetbrains.annotations.Nullable; -import org.lwjgl.system.MemoryUtil; - import com.jozufozu.flywheel.api.event.RenderContext; import net.minecraft.client.multiplayer.ClientLevel; @@ -10,72 +7,45 @@ import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; -public class LevelUniforms implements UniformProvider { - public static final int SIZE = 13 * 4 + 2 * 16; +public final class LevelUniforms extends UniformWriter { + private static final int SIZE = 16 * 2 + 4 * 13; + static final UniformBuffer BUFFER = new UniformBuffer(Uniforms.LEVEL_INDEX, SIZE); - @Nullable - private RenderContext context; - - @Override - public int byteSize() { - return SIZE; + private LevelUniforms() { } - public void setContext(RenderContext context) { - this.context = context; - } - - @Override - public void write(long ptr) { - if (context == null) { - MemoryUtil.memSet(ptr, 0, SIZE); - return; - } + public static void update(RenderContext context) { + long ptr = BUFFER.ptr(); ClientLevel level = context.level(); - float ptick = context.partialTick(); + float partialTick = context.partialTick(); - Vec3 skyColor = level.getSkyColor(context.camera().getPosition(), ptick); - ptr = Uniforms.writeVec4(ptr, (float) skyColor.x, (float) skyColor.y, (float) skyColor.z, 1f); - - Vec3 cloudColor = level.getCloudColor(ptick); - ptr = Uniforms.writeVec4(ptr, (float) cloudColor.x, (float) cloudColor.y, (float) cloudColor.z, 1f); + Vec3 skyColor = level.getSkyColor(context.camera().getPosition(), partialTick); + Vec3 cloudColor = level.getCloudColor(partialTick); + ptr = writeVec4(ptr, (float) skyColor.x, (float) skyColor.y, (float) skyColor.z, 1f); + ptr = writeVec4(ptr, (float) cloudColor.x, (float) cloudColor.y, (float) cloudColor.z, 1f); long dayTime = level.getDayTime(); long levelDay = dayTime / 24000L; - long timeOfDay = dayTime - levelDay * 24000L; - MemoryUtil.memPutInt(ptr, (int) (levelDay % 0x7FFFFFFFL)); - ptr += 4; - MemoryUtil.memPutFloat(ptr, (float) timeOfDay / 24000f); - ptr += 4; + float timeOfDay = (float) (dayTime - levelDay * 24000L) / 24000f; + ptr = writeInt(ptr, (int) (levelDay % 0x7FFFFFFFL)); + ptr = writeFloat(ptr, timeOfDay); - MemoryUtil.memPutInt(ptr, level.dimensionType().hasSkyLight() ? 1 : 0); - ptr += 4; + ptr = writeInt(ptr, level.dimensionType().hasSkyLight() ? 1 : 0); - float sunAngle = level.getSunAngle(ptick); - MemoryUtil.memPutFloat(ptr, sunAngle); - ptr += 4; + ptr = writeFloat(ptr, level.getSunAngle(partialTick)); - MemoryUtil.memPutFloat(ptr, level.getMoonBrightness()); - ptr += 4; - MemoryUtil.memPutInt(ptr, level.getMoonPhase()); - ptr += 4; + ptr = writeFloat(ptr, level.getMoonBrightness()); + ptr = writeInt(ptr, level.getMoonPhase()); - MemoryUtil.memPutInt(ptr, level.isRaining() ? 1 : 0); - ptr += 4; - MemoryUtil.memPutFloat(ptr, level.getRainLevel(ptick)); - ptr += 4; + ptr = writeInt(ptr, level.isRaining() ? 1 : 0); + ptr = writeFloat(ptr, level.getRainLevel(partialTick)); + ptr = writeInt(ptr, level.isThundering() ? 1 : 0); + ptr = writeFloat(ptr, level.getThunderLevel(partialTick)); - MemoryUtil.memPutInt(ptr, level.isThundering() ? 1 : 0); - ptr += 4; - MemoryUtil.memPutFloat(ptr, level.getThunderLevel(ptick)); - ptr += 4; + ptr = writeFloat(ptr, level.getSkyDarken(partialTick)); - MemoryUtil.memPutFloat(ptr, level.getSkyDarken(ptick)); - ptr += 4; - - MemoryUtil.memPutInt(ptr, getConstantAmbientLightFlag(context)); - ptr += 4; + ptr = writeInt(ptr, level.effects().constantAmbientLight() ? 1 : 0); // TODO: use defines for custom dimension ids int dimensionId; @@ -89,13 +59,8 @@ public class LevelUniforms implements UniformProvider { } else { dimensionId = -1; } - MemoryUtil.memPutInt(ptr, dimensionId); - } + ptr = writeInt(ptr, dimensionId); - private static int getConstantAmbientLightFlag(RenderContext context) { - var constantAmbientLight = context.level() - .effects() - .constantAmbientLight(); - return constantAmbientLight ? 1 : 0; - } + BUFFER.markDirty(); + } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/OptionsUniforms.java b/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/OptionsUniforms.java index 207a4b0c9..8fc153150 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/OptionsUniforms.java +++ b/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/OptionsUniforms.java @@ -1,61 +1,29 @@ package com.jozufozu.flywheel.backend.engine.uniform; -import org.lwjgl.system.MemoryUtil; - -import net.minecraft.client.Minecraft; import net.minecraft.client.Options; -public class OptionsUniforms implements UniformProvider { - public static final int SIZE = 4 * 14; +public final class OptionsUniforms extends UniformWriter { + private static final int SIZE = 4 * 14; + static final UniformBuffer BUFFER = new UniformBuffer(Uniforms.OPTIONS_INDEX, SIZE); - @Override - public int byteSize() { - return SIZE; - } + public static void update(Options options) { + long ptr = BUFFER.ptr(); - @Override - public void write(long ptr) { - Options options = Minecraft.getInstance().options; + ptr = writeFloat(ptr, options.gamma().get().floatValue()); + ptr = writeInt(ptr, options.fov().get()); + ptr = writeFloat(ptr, options.screenEffectScale().get().floatValue()); + ptr = writeFloat(ptr, options.glintSpeed().get().floatValue()); + ptr = writeFloat(ptr, options.glintStrength().get().floatValue()); + ptr = writeInt(ptr, options.biomeBlendRadius().get()); + ptr = writeInt(ptr, options.ambientOcclusion().get() ? 1 : 0); + ptr = writeInt(ptr, options.bobView().get() ? 1 : 0); + ptr = writeInt(ptr, options.highContrast().get() ? 1 : 0); + ptr = writeFloat(ptr, options.textBackgroundOpacity().get().floatValue()); + ptr = writeInt(ptr, options.backgroundForChatOnly().get() ? 1 : 0); + ptr = writeFloat(ptr, options.darknessEffectScale().get().floatValue()); + ptr = writeFloat(ptr, options.damageTiltStrength().get().floatValue()); + ptr = writeInt(ptr, options.hideLightningFlash().get() ? 1 : 0); - MemoryUtil.memPutFloat(ptr, options.gamma().get().floatValue()); - ptr += 4; - - MemoryUtil.memPutInt(ptr, options.fov().get()); - ptr += 4; - - MemoryUtil.memPutFloat(ptr, options.screenEffectScale().get().floatValue()); - ptr += 4; - - MemoryUtil.memPutFloat(ptr, options.glintSpeed().get().floatValue()); - ptr += 4; - - MemoryUtil.memPutFloat(ptr, options.glintStrength().get().floatValue()); - ptr += 4; - - MemoryUtil.memPutInt(ptr, options.biomeBlendRadius().get()); - ptr += 4; - - MemoryUtil.memPutInt(ptr, options.ambientOcclusion().get() ? 1 : 0); - ptr += 4; - - MemoryUtil.memPutInt(ptr, options.bobView().get() ? 1 : 0); - ptr += 4; - - MemoryUtil.memPutInt(ptr, options.highContrast().get() ? 1 : 0); - ptr += 4; - - MemoryUtil.memPutFloat(ptr, options.textBackgroundOpacity().get().floatValue()); - ptr += 4; - - MemoryUtil.memPutInt(ptr, options.backgroundForChatOnly().get() ? 1 : 0); - ptr += 4; - - MemoryUtil.memPutFloat(ptr, options.darknessEffectScale().get().floatValue()); - ptr += 4; - - MemoryUtil.memPutFloat(ptr, options.damageTiltStrength().get().floatValue()); - ptr += 4; - - MemoryUtil.memPutInt(ptr, options.hideLightningFlash().get() ? 1 : 0); + BUFFER.markDirty(); } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/PlayerUniforms.java b/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/PlayerUniforms.java index 787c8ab4f..1d976226c 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/PlayerUniforms.java +++ b/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/PlayerUniforms.java @@ -1,7 +1,6 @@ package com.jozufozu.flywheel.backend.engine.uniform; import org.jetbrains.annotations.Nullable; -import org.lwjgl.system.MemoryUtil; import com.jozufozu.flywheel.api.event.RenderContext; import com.jozufozu.flywheel.backend.mixin.AbstractClientPlayerAccessor; @@ -20,108 +19,94 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.phys.Vec3; import net.minecraft.world.scores.PlayerTeam; -public class PlayerUniforms implements UniformProvider { - public static final int SIZE = 9 * 4 + 8 + 2 * 16; +public final class PlayerUniforms extends UniformWriter { + private static final int SIZE = 16 * 2 + 8 + 4 * 9; + static final UniformBuffer BUFFER = new UniformBuffer(Uniforms.PLAYER_INDEX, SIZE); - @Nullable - private RenderContext context; - - @Override - public int byteSize() { - return SIZE; + private PlayerUniforms() { } - public void setContext(RenderContext context) { - this.context = context; - } - - @Override - public void write(long ptr) { - Minecraft mc = Minecraft.getInstance(); - LocalPlayer player = mc.player; - if (context == null || player == null) { - MemoryUtil.memSet(ptr, 0, SIZE); + public static void update(RenderContext context) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) { + BUFFER.clear(); return; } + long ptr = BUFFER.ptr(); + PlayerInfo info = ((AbstractClientPlayerAccessor) player).flywheel$getPlayerInfo(); Vec3 eyePos = player.getEyePosition(context.partialTick()); - ptr = Uniforms.writeVec3(ptr, (float) eyePos.x, (float) eyePos.y, (float) eyePos.z); + ptr = writeVec3(ptr, (float) eyePos.x, (float) eyePos.y, (float) eyePos.z); - ptr = writeTeamColor(ptr, info); + ptr = writeTeamColor(ptr, info.getTeam()); ptr = writeEyeBrightness(ptr, player); ptr = writeHeldLight(ptr, player); - ptr = writeEyeIn(ptr, player); - MemoryUtil.memPutInt(ptr, player.isCrouching() ? 1 : 0); - ptr += 4; - MemoryUtil.memPutInt(ptr, player.isSleeping() ? 1 : 0); - ptr += 4; - MemoryUtil.memPutInt(ptr, player.isSwimming() ? 1 : 0); - ptr += 4; - MemoryUtil.memPutInt(ptr, player.isFallFlying() ? 1 : 0); - ptr += 4; + ptr = writeInt(ptr, player.isCrouching() ? 1 : 0); + ptr = writeInt(ptr, player.isSleeping() ? 1 : 0); + ptr = writeInt(ptr, player.isSwimming() ? 1 : 0); + ptr = writeInt(ptr, player.isFallFlying() ? 1 : 0); - MemoryUtil.memPutInt(ptr, player.isShiftKeyDown() ? 1 : 0); - ptr += 4; + ptr = writeInt(ptr, player.isShiftKeyDown() ? 1 : 0); - MemoryUtil.memPutInt(ptr, info.getGameMode().getId()); - ptr += 4; + ptr = writeInt(ptr, info.getGameMode().getId()); + + BUFFER.markDirty(); } - private static long writeTeamColor(long ptr, PlayerInfo info) { - int red = 255, green = 255, blue = 255, alpha = 0; - PlayerTeam team = info.getTeam(); + private static long writeTeamColor(long ptr, @Nullable PlayerTeam team) { if (team != null) { - alpha = 255; Integer color = team.getColor().getColor(); - if (color != null) { - int icolor = color; - red = FastColor.ARGB32.red(icolor); - green = FastColor.ARGB32.green(icolor); - blue = FastColor.ARGB32.blue(icolor); - } - } - return Uniforms.writeVec4(ptr, (float) red / 255f, (float) blue / 255f, (float) green / 255f, - (float) alpha / 255f); + if (color != null) { + int red = FastColor.ARGB32.red(color); + int green = FastColor.ARGB32.green(color); + int blue = FastColor.ARGB32.blue(color); + return writeVec4(ptr, red / 255f, green / 255f, blue / 255f, 1f); + } else { + return writeVec4(ptr, 1f, 1f, 1f, 1f); + } + } else { + return writeVec4(ptr, 1f, 1f, 1f, 0f); + } } private static long writeEyeBrightness(long ptr, LocalPlayer player) { - int blockBrightness = player.clientLevel.getBrightness(LightLayer.BLOCK, player.blockPosition()); - int skyBrightness = player.clientLevel.getBrightness(LightLayer.SKY, player.blockPosition()); - int maxBrightness = player.clientLevel.getMaxLightLevel(); + ClientLevel level = player.clientLevel; + int blockBrightness = level.getBrightness(LightLayer.BLOCK, player.blockPosition()); + int skyBrightness = level.getBrightness(LightLayer.SKY, player.blockPosition()); + int maxBrightness = level.getMaxLightLevel(); - ptr = Uniforms.writeVec2(ptr, (float) blockBrightness / (float) maxBrightness, + return writeVec2(ptr, (float) blockBrightness / (float) maxBrightness, (float) skyBrightness / (float) maxBrightness); - return ptr; } private static long writeHeldLight(long ptr, LocalPlayer player) { - int luminance = 0; + int heldLight = 0; + for (InteractionHand hand : InteractionHand.values()) { Item handItem = player.getItemInHand(hand).getItem(); if (handItem instanceof BlockItem bitem) { Block block = bitem.getBlock(); - int blockLight = block.defaultBlockState().getLightEmission(player.clientLevel, BlockPos.ZERO); - if (luminance < blockLight) { - luminance = blockLight; + int blockLight = block.defaultBlockState().getLightEmission(player.clientLevel, player.blockPosition()); + if (heldLight < blockLight) { + heldLight = blockLight; } } } - MemoryUtil.memPutFloat(ptr, (float) luminance / 15); - return ptr + 4; + return writeFloat(ptr, (float) heldLight / 15); } private static long writeEyeIn(long ptr, LocalPlayer player) { ClientLevel level = player.clientLevel; Vec3 eyePos = player.getEyePosition(); BlockPos blockPos = BlockPos.containing(eyePos); - return Uniforms.writeInFluidAndBlock(ptr, level, blockPos, eyePos); + return writeInFluidAndBlock(ptr, level, blockPos, eyePos); } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/UniformBuffer.java b/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/UniformBuffer.java index 81dfc28a9..b1712e133 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/UniformBuffer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/UniformBuffer.java @@ -1,5 +1,6 @@ package com.jozufozu.flywheel.backend.engine.uniform; +import org.jetbrains.annotations.Nullable; import org.lwjgl.opengl.GL32; import com.jozufozu.flywheel.backend.gl.buffer.GlBuffer; @@ -7,35 +8,53 @@ import com.jozufozu.flywheel.backend.gl.buffer.GlBufferUsage; import com.jozufozu.flywheel.lib.math.MoreMath; import com.jozufozu.flywheel.lib.memory.MemoryBlock; -public class UniformBuffer { +public class UniformBuffer { private final int index; - private final GlBuffer buffer; - public final T provider; - private final MemoryBlock data; + private final MemoryBlock clientBuffer; + @Nullable + private GlBuffer buffer; + private boolean needsUpload; - public UniformBuffer(int index, T provider) { + public UniformBuffer(int index, int size) { this.index = index; - this.buffer = new GlBuffer(GlBufferUsage.DYNAMIC_DRAW); - this.provider = provider; // renderdoc complains if the size of the buffer is not 16-byte aligned, // though things work fine on my machine if we're short a few bytes - var actualBytes = MoreMath.align16(provider.byteSize()); - this.data = MemoryBlock.mallocTracked(actualBytes); - this.data.clear(); + clientBuffer = MemoryBlock.malloc(MoreMath.align16(size)); + clientBuffer.clear(); } - public void update() { - provider.write(data.ptr()); - buffer.upload(data); + public long ptr() { + return clientBuffer.ptr(); + } + + public void markDirty() { + needsUpload = true; + } + + public void clear() { + clientBuffer.clear(); + markDirty(); } public void bind() { - GL32.glBindBufferRange(GL32.GL_UNIFORM_BUFFER, index, buffer.handle(), 0, data.size()); + if (buffer == null) { + buffer = new GlBuffer(GlBufferUsage.DYNAMIC_DRAW); + needsUpload = true; + } + + if (needsUpload) { + buffer.upload(clientBuffer); + needsUpload = false; + } + + GL32.glBindBufferRange(GL32.GL_UNIFORM_BUFFER, index, buffer.handle(), 0, clientBuffer.size()); } public void delete() { - data.free(); - buffer.delete(); + if (buffer != null) { + buffer.delete(); + buffer = null; + } } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/UniformProvider.java b/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/UniformProvider.java deleted file mode 100644 index 2f65f126a..000000000 --- a/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/UniformProvider.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.jozufozu.flywheel.backend.engine.uniform; - -public interface UniformProvider { - void write(long ptr); - - int byteSize(); -} diff --git a/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/UniformWriter.java b/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/UniformWriter.java new file mode 100644 index 000000000..891b790d3 --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/UniformWriter.java @@ -0,0 +1,85 @@ +package com.jozufozu.flywheel.backend.engine.uniform; + +import org.joml.Matrix4f; +import org.lwjgl.system.MemoryUtil; + +import com.jozufozu.flywheel.lib.math.MatrixMath; + +import net.minecraft.core.BlockPos; +import net.minecraft.tags.FluidTags; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.phys.Vec3; + +class UniformWriter { + static long writeInt(long ptr, int value) { + MemoryUtil.memPutInt(ptr, value); + return ptr + 4; + } + + static long writeFloat(long ptr, float value) { + MemoryUtil.memPutFloat(ptr, value); + return ptr + 4; + } + + static long writeVec2(long ptr, float x, float y) { + MemoryUtil.memPutFloat(ptr, x); + MemoryUtil.memPutFloat(ptr + 4, y); + return ptr + 8; + } + + static long writeVec3(long ptr, float x, float y, float z) { + MemoryUtil.memPutFloat(ptr, x); + MemoryUtil.memPutFloat(ptr + 4, y); + MemoryUtil.memPutFloat(ptr + 8, z); + MemoryUtil.memPutFloat(ptr + 12, 0f); // empty component of vec4 because we don't trust std140 + return ptr + 16; + } + + static long writeVec4(long ptr, float x, float y, float z, float w) { + MemoryUtil.memPutFloat(ptr, x); + MemoryUtil.memPutFloat(ptr + 4, y); + MemoryUtil.memPutFloat(ptr + 8, z); + MemoryUtil.memPutFloat(ptr + 12, w); + return ptr + 16; + } + + static long writeMat4(long ptr, Matrix4f mat) { + MatrixMath.writeUnsafe(mat, ptr); + return ptr + 64; + } + + static long writeInFluidAndBlock(long ptr, Level level, BlockPos blockPos, Vec3 pos) { + FluidState fluidState = level.getFluidState(blockPos); + BlockState blockState = level.getBlockState(blockPos); + float height = fluidState.getHeight(level, blockPos); + + if (fluidState.isEmpty()) { + MemoryUtil.memPutInt(ptr, 0); + } else if (pos.y < blockPos.getY() + height) { + // TODO: handle custom fluids via defines + if (fluidState.is(FluidTags.WATER)) { + MemoryUtil.memPutInt(ptr, 1); + } else if (fluidState.is(FluidTags.LAVA)) { + MemoryUtil.memPutInt(ptr, 2); + } else { + MemoryUtil.memPutInt(ptr, -1); + } + } + + if (blockState.isAir()) { + MemoryUtil.memPutInt(ptr + 4, 0); + } else { + // TODO: handle custom blocks via defines + if (blockState.is(Blocks.POWDER_SNOW)) { + MemoryUtil.memPutInt(ptr + 4, 0); + } else { + MemoryUtil.memPutInt(ptr + 4, -1); + } + } + + return ptr + 8; + } +} diff --git a/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/Uniforms.java b/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/Uniforms.java index 988869125..cd11491cc 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/Uniforms.java +++ b/src/main/java/com/jozufozu/flywheel/backend/engine/uniform/Uniforms.java @@ -1,221 +1,39 @@ package com.jozufozu.flywheel.backend.engine.uniform; -import org.jetbrains.annotations.Nullable; -import org.lwjgl.system.MemoryUtil; - import com.jozufozu.flywheel.api.event.ReloadLevelRendererEvent; import com.jozufozu.flywheel.api.event.RenderContext; -import com.jozufozu.flywheel.backend.gl.GlStateTracker; -import com.jozufozu.flywheel.config.DebugMode; -import net.minecraft.core.BlockPos; -import net.minecraft.tags.FluidTags; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.FluidState; -import net.minecraft.world.phys.Vec3; - -public class Uniforms { +public final class Uniforms { public static final int FRAME_INDEX = 0; public static final int FOG_INDEX = 1; public static final int OPTIONS_INDEX = 2; public static final int PLAYER_INDEX = 3; public static final int LEVEL_INDEX = 4; - public static boolean frustumPaused = false; - public static boolean frustumCapture = false; - private static @Nullable UniformBuffer frame; - private static @Nullable UniformBuffer fog; - private static @Nullable UniformBuffer options; - private static @Nullable UniformBuffer player; - private static @Nullable UniformBuffer level; - private static boolean optionsRequiresUpdate = false; - public static UniformBuffer frame() { - if (frame == null) { - frame = new UniformBuffer<>(FRAME_INDEX, new FrameUniforms()); - } - return frame; + private static final UniformBuffer[] ALL_BUFFERS = { FrameUniforms.BUFFER, FogUniforms.BUFFER, OptionsUniforms.BUFFER, PlayerUniforms.BUFFER, LevelUniforms.BUFFER }; + + private Uniforms() { } - public static UniformBuffer fog() { - if (fog == null) { - fog = new UniformBuffer<>(FOG_INDEX, new FogUniforms()); - } - return fog; + public static void update(RenderContext context) { + FrameUniforms.update(context); + PlayerUniforms.update(context); + LevelUniforms.update(context); } - public static UniformBuffer options() { - if (options == null) { - options = new UniformBuffer<>(OPTIONS_INDEX, new OptionsUniforms()); - } - return options; - } - - public static UniformBuffer player() { - if (player == null) { - player = new UniformBuffer<>(PLAYER_INDEX, new PlayerUniforms()); - } - return player; - } - - public static UniformBuffer level() { - if (level == null) { - level = new UniformBuffer<>(LEVEL_INDEX, new LevelUniforms()); - } - return level; - } - - public static void bindForDraw() { - bindFrame(); - bindFog(); - bindOptions(); - bindPlayer(); - bindLevel(); - } - - public static void bindFrame() { - if (frame != null) { - frame.bind(); + public static void bindAll() { + for (UniformBuffer buffer : ALL_BUFFERS) { + buffer.bind(); } } - public static void bindFog() { - if (fog != null) { - fog.bind(); + private static void deleteAll() { + for (UniformBuffer buffer : ALL_BUFFERS) { + buffer.delete(); } } - public static void bindOptions() { - if (options != null) { - options.bind(); - } - } - - public static void bindPlayer() { - if (player != null) { - player.bind(); - } - } - - public static void bindLevel() { - if (level != null) { - level.bind(); - } - } - - public static void onFogUpdate() { - try (var restoreState = GlStateTracker.getRestoreState()) { - fog().update(); - } - } - - public static void onOptionsUpdate() { - // this is sometimes called too early to do an actual update - optionsRequiresUpdate = true; - } - - public static void updateContext(RenderContext ctx) { - var ubo = frame(); - ubo.provider.setContext(ctx); - ubo.update(); - - if (optionsRequiresUpdate) { - options().update(); - optionsRequiresUpdate = false; - } - - var player = player(); - player.provider.setContext(ctx); - player.update(); - - var level = level(); - level.provider.setContext(ctx); - level.update(); - } - - public static void setDebugMode(DebugMode mode) { - frame().provider.debugMode = mode.ordinal(); - } - public static void onReloadLevelRenderer(ReloadLevelRendererEvent event) { - if (frame != null) { - frame.delete(); - frame = null; - } - - if (fog != null) { - fog.delete(); - fog = null; - } - - if (options != null) { - options.delete(); - options = null; - } - - if (player != null) { - player.delete(); - player = null; - } - - if (level != null) { - level.delete(); - level = null; - } - } - - static long writeVec4(long ptr, float x, float y, float z, float w) { - MemoryUtil.memPutFloat(ptr, x); - MemoryUtil.memPutFloat(ptr + 4, y); - MemoryUtil.memPutFloat(ptr + 8, z); - MemoryUtil.memPutFloat(ptr + 12, w); - return ptr + 16; - } - - static long writeVec3(long ptr, float camX, float camY, float camZ) { - MemoryUtil.memPutFloat(ptr, camX); - MemoryUtil.memPutFloat(ptr + 4, camY); - MemoryUtil.memPutFloat(ptr + 8, camZ); - MemoryUtil.memPutFloat(ptr + 12, 0f); // empty component of vec4 because we don't trust std140 - return ptr + 16; - } - - static long writeVec2(long ptr, float camX, float camY) { - MemoryUtil.memPutFloat(ptr, camX); - MemoryUtil.memPutFloat(ptr + 4, camY); - return ptr + 8; - } - - static long writeInFluidAndBlock(long ptr, Level level, BlockPos blockPos, Vec3 pos) { - FluidState fState = level.getFluidState(blockPos); - BlockState bState = level.getBlockState(blockPos); - float height = fState.getHeight(level, blockPos); - - if (fState.isEmpty()) { - MemoryUtil.memPutInt(ptr, 0); - } else if (pos.y < blockPos.getY() + height) { - // TODO: handle custom fluids via defines - if (fState.is(FluidTags.WATER)) { - MemoryUtil.memPutInt(ptr, 1); - } else if (fState.is(FluidTags.LAVA)) { - MemoryUtil.memPutInt(ptr, 2); - } else { - MemoryUtil.memPutInt(ptr, -1); - } - } - - if (bState.isAir()) { - MemoryUtil.memPutInt(ptr + 4, 0); - } else { - // TODO: handle custom blocks via defines - if (bState.is(Blocks.POWDER_SNOW)) { - MemoryUtil.memPutInt(ptr + 4, 0); - } else { - MemoryUtil.memPutInt(ptr + 4, -1); - } - } - - return ptr + 8; + deleteAll(); } } 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 2fc185bac..86b9f70e7 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 @@ -24,6 +24,7 @@ public class GlBuffer extends GlObject { public void upload(MemoryBlock memoryBlock) { upload(memoryBlock.ptr(), memoryBlock.size()); } + public void upload(long ptr, long size) { FlwMemoryTracker._freeGPUMemory(this.size); Buffer.IMPL.data(handle(), size, ptr, usage.glEnum); diff --git a/src/main/java/com/jozufozu/flywheel/backend/mixin/OptionsMixin.java b/src/main/java/com/jozufozu/flywheel/backend/mixin/OptionsMixin.java index 9a745a7cb..e14e279df 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/mixin/OptionsMixin.java +++ b/src/main/java/com/jozufozu/flywheel/backend/mixin/OptionsMixin.java @@ -5,7 +5,7 @@ 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.backend.engine.uniform.Uniforms; +import com.jozufozu.flywheel.backend.engine.uniform.OptionsUniforms; import net.minecraft.client.Options; @@ -13,11 +13,11 @@ import net.minecraft.client.Options; public class OptionsMixin { @Inject(method = "load()V", at = @At("RETURN")) private void flywheel$onLoad(CallbackInfo ci) { - Uniforms.onOptionsUpdate(); + OptionsUniforms.update((Options) (Object) this); } @Inject(method = "save", at = @At("HEAD")) private void flywheel$onSave(CallbackInfo ci) { - Uniforms.onOptionsUpdate(); + OptionsUniforms.update((Options) (Object) this); } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/mixin/RenderSystemMixin.java b/src/main/java/com/jozufozu/flywheel/backend/mixin/RenderSystemMixin.java index 62abbfc1b..c29da817b 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/mixin/RenderSystemMixin.java +++ b/src/main/java/com/jozufozu/flywheel/backend/mixin/RenderSystemMixin.java @@ -5,7 +5,7 @@ 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.backend.engine.uniform.Uniforms; +import com.jozufozu.flywheel.backend.engine.uniform.FogUniforms; import com.jozufozu.flywheel.backend.gl.GlCompat; import com.mojang.blaze3d.systems.RenderSystem; @@ -18,21 +18,21 @@ abstract class RenderSystemMixin { @Inject(method = "setShaderFogStart(F)V", at = @At("RETURN")) private static void flywheel$onSetFogStart(CallbackInfo ci) { - Uniforms.onFogUpdate(); + FogUniforms.update(); } @Inject(method = "setShaderFogEnd(F)V", at = @At("RETURN")) private static void flywheel$onSetFogEnd(CallbackInfo ci) { - Uniforms.onFogUpdate(); + FogUniforms.update(); } @Inject(method = "setShaderFogShape(Lcom/mojang/blaze3d/shaders/FogShape;)V", at = @At("RETURN")) private static void flywheel$onSetFogShape(CallbackInfo ci) { - Uniforms.onFogUpdate(); + FogUniforms.update(); } @Inject(method = "setShaderFogColor(FFFF)V", at = @At("RETURN")) private static void flywheel$onSetFogColor(CallbackInfo ci) { - Uniforms.onFogUpdate(); + FogUniforms.update(); } } diff --git a/src/main/java/com/jozufozu/flywheel/config/BackendArgument.java b/src/main/java/com/jozufozu/flywheel/config/BackendArgument.java index 0793a6bb5..5f340ad5d 100644 --- a/src/main/java/com/jozufozu/flywheel/config/BackendArgument.java +++ b/src/main/java/com/jozufozu/flywheel/config/BackendArgument.java @@ -16,6 +16,7 @@ import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.commands.synchronization.SingletonArgumentInfo; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -27,6 +28,7 @@ public class BackendArgument implements ArgumentType { }); public static final BackendArgument INSTANCE = new BackendArgument(); + public static final SingletonArgumentInfo INFO = SingletonArgumentInfo.contextFree(() -> INSTANCE); @Override public Backend parse(StringReader reader) throws CommandSyntaxException { diff --git a/src/main/java/com/jozufozu/flywheel/config/FlwCommands.java b/src/main/java/com/jozufozu/flywheel/config/FlwCommands.java index 6fdfbae1f..d355478fa 100644 --- a/src/main/java/com/jozufozu/flywheel/config/FlwCommands.java +++ b/src/main/java/com/jozufozu/flywheel/config/FlwCommands.java @@ -4,7 +4,7 @@ import java.util.function.BiConsumer; import com.jozufozu.flywheel.api.backend.Backend; import com.jozufozu.flywheel.api.backend.BackendManager; -import com.jozufozu.flywheel.backend.engine.uniform.Uniforms; +import com.jozufozu.flywheel.backend.engine.uniform.FrameUniforms; import com.mojang.brigadier.Command; import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; @@ -78,27 +78,6 @@ public final class FlwCommands { } )); - command.then(Commands.literal("debug") - .then(Commands.argument("mode", EnumArgument.enumArgument(DebugMode.class)) - .executes(context -> { - DebugMode mode = context.getArgument("mode", DebugMode.class); - Uniforms.setDebugMode(mode); - return Command.SINGLE_SUCCESS; - }))); - - command.then(Commands.literal("frustum") - .then(Commands.literal("unpause") - .executes(context -> { - Uniforms.frustumPaused = false; - return Command.SINGLE_SUCCESS; - })) - .then(Commands.literal("capture") - .executes(context -> { - Uniforms.frustumPaused = true; - Uniforms.frustumCapture = true; - return Command.SINGLE_SUCCESS; - }))); - command.then(Commands.literal("crumbling") .then(Commands.argument("pos", BlockPosArgument.blockPos()) .then(Commands.argument("stage", IntegerArgumentType.integer(0, 9)) @@ -119,6 +98,26 @@ public final class FlwCommands { return Command.SINGLE_SUCCESS; })))); + command.then(Commands.literal("debug") + .then(Commands.argument("mode", EnumArgument.enumArgument(DebugMode.class)) + .executes(context -> { + DebugMode mode = context.getArgument("mode", DebugMode.class); + FrameUniforms.debugMode(mode); + return Command.SINGLE_SUCCESS; + }))); + + command.then(Commands.literal("frustum") + .then(Commands.literal("capture") + .executes(context -> { + FrameUniforms.captureFrustum(); + return Command.SINGLE_SUCCESS; + })) + .then(Commands.literal("unpause") + .executes(context -> { + FrameUniforms.unpauseFrustum(); + return Command.SINGLE_SUCCESS; + }))); + event.getDispatcher().register(command); } diff --git a/src/main/java/com/jozufozu/flywheel/impl/visualization/VisualizationManagerImpl.java b/src/main/java/com/jozufozu/flywheel/impl/visualization/VisualizationManagerImpl.java index 84d4e6bd9..adc6ffc2e 100644 --- a/src/main/java/com/jozufozu/flywheel/impl/visualization/VisualizationManagerImpl.java +++ b/src/main/java/com/jozufozu/flywheel/impl/visualization/VisualizationManagerImpl.java @@ -55,7 +55,7 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.entity.BlockEntity; /** - * A manager class for a single world where visualization is supported. + * A manager class for a single level where visualization is supported. */ public class VisualizationManagerImpl implements VisualizationManager { private static final LevelAttached MANAGERS = new LevelAttached<>(VisualizationManagerImpl::new, VisualizationManagerImpl::delete); @@ -212,7 +212,7 @@ public class VisualizationManagerImpl implements VisualizationManager { /** * Tick the visuals after the game has ticked: *

- * Call {@link TickableVisual#tick} on all visuals in this world. + * Call {@link TickableVisual#tick} on all visuals in this level. *

*/ public void tick() { @@ -231,7 +231,7 @@ public class VisualizationManagerImpl implements VisualizationManager { * *

Check and update the render origin. *
- * Call {@link DynamicVisual#beginFrame} on all visuals in this world.

+ * Call {@link DynamicVisual#beginFrame} on all visuals in this level.

*/ public void beginFrame(RenderContext context) { // Make sure we're done with the last tick. diff --git a/src/main/java/com/jozufozu/flywheel/lib/instance/FlatLit.java b/src/main/java/com/jozufozu/flywheel/lib/instance/FlatLit.java index bf8f0774f..472539de0 100644 --- a/src/main/java/com/jozufozu/flywheel/lib/instance/FlatLit.java +++ b/src/main/java/com/jozufozu/flywheel/lib/instance/FlatLit.java @@ -1,12 +1,13 @@ package com.jozufozu.flywheel.lib.instance; import com.jozufozu.flywheel.api.instance.Instance; +import com.jozufozu.flywheel.lib.visual.AbstractVisual; import net.minecraft.client.renderer.LightTexture; /** * An interface that implementors of {@link Instance} should also implement - * if they wish to make use of Flywheel's provided light update methods. + * if they wish to make use of the relighting utilities in {@link AbstractVisual}. */ public interface FlatLit extends Instance { /** diff --git a/src/main/java/com/jozufozu/flywheel/lib/light/LightVolume.java b/src/main/java/com/jozufozu/flywheel/lib/light/LightVolume.java index 16dfca25d..cbc953b29 100644 --- a/src/main/java/com/jozufozu/flywheel/lib/light/LightVolume.java +++ b/src/main/java/com/jozufozu/flywheel/lib/light/LightVolume.java @@ -12,7 +12,6 @@ import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.LightLayer; public class LightVolume implements Box { - protected final BlockAndTintGetter level; protected final MutableBox box = new MutableBox(); protected MemoryBlock lightData; @@ -68,7 +67,7 @@ public class LightVolume implements Box { public short getPackedLight(int x, int y, int z) { if (box.contains(x, y, z)) { - return MemoryUtil.memGetShort(worldPosToPtr(x, y, z)); + return MemoryUtil.memGetShort(levelPosToPtr(x, y, z)); } else { return 0; } @@ -106,18 +105,18 @@ public class LightVolume implements Box { } /** - * Copy all light from the world into this volume. + * Copy all light from the level into this volume. * - * @param worldVolume the region in the world to copy data from. + * @param levelVolume the region in the level to copy data from. */ - public void copyLight(Box worldVolume) { + public void copyLight(Box levelVolume) { BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(); int xShift = box.getMinX(); int yShift = box.getMinY(); int zShift = box.getMinZ(); - worldVolume.forEachContained((x, y, z) -> { + levelVolume.forEachContained((x, y, z) -> { pos.set(x, y, z); int block = this.level.getBrightness(LightLayer.BLOCK, pos); @@ -137,18 +136,18 @@ public class LightVolume implements Box { } /** - * Copy block light from the world into this volume. + * Copy block light from the level into this volume. * - * @param worldVolume the region in the world to copy data from. + * @param levelVolume the region in the level to copy data from. */ - public void copyBlock(Box worldVolume) { + public void copyBlock(Box levelVolume) { var pos = new BlockPos.MutableBlockPos(); int xShift = box.getMinX(); int yShift = box.getMinY(); int zShift = box.getMinZ(); - worldVolume.forEachContained((x, y, z) -> { + levelVolume.forEachContained((x, y, z) -> { int light = this.level.getBrightness(LightLayer.BLOCK, pos.set(x, y, z)); writeBlock(x - xShift, y - yShift, z - zShift, light); @@ -162,18 +161,18 @@ public class LightVolume implements Box { } /** - * Copy sky light from the world into this volume. + * Copy sky light from the level into this volume. * - * @param worldVolume the region in the world to copy data from. + * @param levelVolume the region in the level to copy data from. */ - public void copySky(Box worldVolume) { + public void copySky(Box levelVolume) { var pos = new BlockPos.MutableBlockPos(); int xShift = box.getMinX(); int yShift = box.getMinY(); int zShift = box.getMinZ(); - worldVolume.forEachContained((x, y, z) -> { + levelVolume.forEachContained((x, y, z) -> { int light = this.level.getBrightness(LightLayer.SKY, pos.set(x, y, z)); writeSky(x - xShift, y - yShift, z - zShift, light); @@ -186,15 +185,15 @@ public class LightVolume implements Box { MemoryUtil.memPutByte(boxPosToPtr(x, y, z) + 1, s); } - protected long worldPosToPtr(int x, int y, int z) { - return lightData.ptr() + worldPosToPtrOffset(x, y, z); + protected long levelPosToPtr(int x, int y, int z) { + return lightData.ptr() + levelPosToPtrOffset(x, y, z); } protected long boxPosToPtr(int x, int y, int z) { return lightData.ptr() + boxPosToPtrOffset(x, y, z); } - protected int worldPosToPtrOffset(int x, int y, int z) { + protected int levelPosToPtrOffset(int x, int y, int z) { x -= box.getMinX(); y -= box.getMinY(); z -= box.getMinZ(); @@ -216,5 +215,4 @@ public class LightVolume implements Box { else if (type == LightLayer.SKY) copySky(vol); markDirty(); } - } diff --git a/src/main/java/com/jozufozu/flywheel/lib/model/Models.java b/src/main/java/com/jozufozu/flywheel/lib/model/Models.java index f22ac20b3..a0dbbd72e 100644 --- a/src/main/java/com/jozufozu/flywheel/lib/model/Models.java +++ b/src/main/java/com/jozufozu/flywheel/lib/model/Models.java @@ -27,10 +27,10 @@ public final class Models { } /** - * Get a usable model for a given blockstate. + * Get a usable model for a given block state. * - * @param state The blockstate you wish to render. - * @return A model corresponding to how the given blockstate would appear in the world. + * @param state The block state you wish to render. + * @return A model corresponding to how the given block state would appear in the level. */ public static Model block(BlockState state) { return BLOCK_STATE.get(state); diff --git a/src/main/java/com/jozufozu/flywheel/lib/model/baked/BakedModelBufferer.java b/src/main/java/com/jozufozu/flywheel/lib/model/baked/BakedModelBufferer.java index de638d654..dcfa860f7 100644 --- a/src/main/java/com/jozufozu/flywheel/lib/model/baked/BakedModelBufferer.java +++ b/src/main/java/com/jozufozu/flywheel/lib/model/baked/BakedModelBufferer.java @@ -33,7 +33,7 @@ final class BakedModelBufferer { private BakedModelBufferer() { } - public static void bufferSingle(ModelBlockRenderer blockRenderer, BlockAndTintGetter renderWorld, BakedModel model, BlockState state, @Nullable PoseStack poseStack, ModelData modelData, ResultConsumer resultConsumer) { + public static void bufferSingle(ModelBlockRenderer blockRenderer, BlockAndTintGetter level, BakedModel model, BlockState state, @Nullable PoseStack poseStack, ModelData modelData, ResultConsumer resultConsumer) { ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get(); if (poseStack == null) { poseStack = objects.identityPoseStack; @@ -41,7 +41,7 @@ final class BakedModelBufferer { RandomSource random = objects.random; var consumers = objects.emitters; - modelData = model.getModelData(renderWorld, BlockPos.ZERO, state, modelData); + modelData = model.getModelData(level, BlockPos.ZERO, state, modelData); random.setSeed(42L); ChunkRenderTypeSet renderTypes = model.getRenderTypes(state, random, modelData); @@ -52,22 +52,22 @@ final class BakedModelBufferer { consumer.begin(resultConsumer); poseStack.pushPose(); - blockRenderer.tesselateBlock(renderWorld, model, state, BlockPos.ZERO, poseStack, consumer, false, random, 42L, OverlayTexture.NO_OVERLAY, modelData, renderType); + blockRenderer.tesselateBlock(level, model, state, BlockPos.ZERO, poseStack, consumer, false, random, 42L, OverlayTexture.NO_OVERLAY, modelData, renderType); poseStack.popPose(); consumer.end(); } } - public static void bufferBlock(BlockRenderDispatcher renderDispatcher, BlockAndTintGetter renderWorld, BlockState state, @Nullable PoseStack poseStack, ModelData modelData, ResultConsumer resultConsumer) { + public static void bufferBlock(BlockRenderDispatcher renderDispatcher, BlockAndTintGetter level, BlockState state, @Nullable PoseStack poseStack, ModelData modelData, ResultConsumer resultConsumer) { if (state.getRenderShape() != RenderShape.MODEL) { return; } - bufferSingle(renderDispatcher.getModelRenderer(), renderWorld, renderDispatcher.getBlockModel(state), state, poseStack, modelData, resultConsumer); + bufferSingle(renderDispatcher.getModelRenderer(), level, renderDispatcher.getBlockModel(state), state, poseStack, modelData, resultConsumer); } - public static void bufferMultiBlock(BlockRenderDispatcher renderDispatcher, Iterator posIterator, BlockAndTintGetter renderWorld, @Nullable PoseStack poseStack, Function modelDataLookup, boolean renderFluids, ResultConsumer resultConsumer) { + public static void bufferMultiBlock(BlockRenderDispatcher renderDispatcher, Iterator posIterator, BlockAndTintGetter level, @Nullable PoseStack poseStack, Function modelDataLookup, boolean renderFluids, ResultConsumer resultConsumer) { ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get(); if (poseStack == null) { poseStack = objects.identityPoseStack; @@ -86,7 +86,7 @@ final class BakedModelBufferer { while (posIterator.hasNext()) { BlockPos pos = posIterator.next(); - BlockState state = renderWorld.getBlockState(pos); + BlockState state = level.getBlockState(pos); if (renderFluids) { FluidState fluidState = state.getFluidState(); @@ -99,7 +99,7 @@ final class BakedModelBufferer { poseStack.pushPose(); poseStack.translate(pos.getX() - (pos.getX() & 0xF), pos.getY() - (pos.getY() & 0xF), pos.getZ() - (pos.getZ() & 0xF)); - renderDispatcher.renderLiquid(pos, renderWorld, transformingWrapper, state, fluidState); + renderDispatcher.renderLiquid(pos, level, transformingWrapper, state, fluidState); poseStack.popPose(); } } @@ -108,7 +108,7 @@ final class BakedModelBufferer { long seed = state.getSeed(pos); BakedModel model = renderDispatcher.getBlockModel(state); ModelData modelData = modelDataLookup.apply(pos); - modelData = model.getModelData(renderWorld, pos, state, modelData); + modelData = model.getModelData(level, pos, state, modelData); random.setSeed(seed); ChunkRenderTypeSet renderTypes = model.getRenderTypes(state, random, modelData); @@ -117,7 +117,7 @@ final class BakedModelBufferer { poseStack.pushPose(); poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); - blockRenderer.tesselateBlock(renderWorld, model, state, pos, poseStack, emitters[layerIndex], true, random, seed, OverlayTexture.NO_OVERLAY, modelData, renderType); + blockRenderer.tesselateBlock(level, model, state, pos, poseStack, emitters[layerIndex], true, random, seed, OverlayTexture.NO_OVERLAY, modelData, renderType); poseStack.popPose(); } } diff --git a/src/main/java/com/jozufozu/flywheel/lib/model/baked/BakedModelBuilder.java b/src/main/java/com/jozufozu/flywheel/lib/model/baked/BakedModelBuilder.java index 213e3bc0d..550c54cce 100644 --- a/src/main/java/com/jozufozu/flywheel/lib/model/baked/BakedModelBuilder.java +++ b/src/main/java/com/jozufozu/flywheel/lib/model/baked/BakedModelBuilder.java @@ -26,7 +26,7 @@ import net.minecraftforge.client.model.data.ModelData; public class BakedModelBuilder { private final BakedModel bakedModel; @Nullable - private BlockAndTintGetter renderWorld; + private BlockAndTintGetter level; @Nullable private BlockState blockState; @Nullable @@ -40,8 +40,8 @@ public class BakedModelBuilder { this.bakedModel = bakedModel; } - public BakedModelBuilder renderWorld(BlockAndTintGetter renderWorld) { - this.renderWorld = renderWorld; + public BakedModelBuilder level(BlockAndTintGetter level) { + this.level = level; return this; } @@ -66,8 +66,8 @@ public class BakedModelBuilder { } public SimpleModel build() { - if (renderWorld == null) { - renderWorld = VirtualEmptyBlockGetter.INSTANCE; + if (level == null) { + level = VirtualEmptyBlockGetter.INSTANCE; } if (blockState == null) { blockState = Blocks.AIR.defaultBlockState(); @@ -90,7 +90,7 @@ public class BakedModelBuilder { out.add(new Model.ConfiguredMesh(material, mesh)); } }; - BakedModelBufferer.bufferSingle(ModelUtil.VANILLA_RENDERER.getModelRenderer(), renderWorld, bakedModel, blockState, poseStack, modelData, resultConsumer); + BakedModelBufferer.bufferSingle(ModelUtil.VANILLA_RENDERER.getModelRenderer(), level, bakedModel, blockState, poseStack, modelData, resultConsumer); return new SimpleModel(out.build()); } diff --git a/src/main/java/com/jozufozu/flywheel/lib/model/baked/BlockModelBuilder.java b/src/main/java/com/jozufozu/flywheel/lib/model/baked/BlockModelBuilder.java index 8eea1d180..c0e16e7db 100644 --- a/src/main/java/com/jozufozu/flywheel/lib/model/baked/BlockModelBuilder.java +++ b/src/main/java/com/jozufozu/flywheel/lib/model/baked/BlockModelBuilder.java @@ -24,7 +24,7 @@ import net.minecraftforge.client.model.data.ModelData; public class BlockModelBuilder { private final BlockState state; @Nullable - private BlockAndTintGetter renderWorld; + private BlockAndTintGetter level; @Nullable private PoseStack poseStack; @Nullable @@ -36,8 +36,8 @@ public class BlockModelBuilder { this.state = state; } - public BlockModelBuilder renderWorld(BlockAndTintGetter renderWorld) { - this.renderWorld = renderWorld; + public BlockModelBuilder level(BlockAndTintGetter level) { + this.level = level; return this; } @@ -57,8 +57,8 @@ public class BlockModelBuilder { } public SimpleModel build() { - if (renderWorld == null) { - renderWorld = VirtualEmptyBlockGetter.INSTANCE; + if (level == null) { + level = VirtualEmptyBlockGetter.INSTANCE; } if (modelData == null) { modelData = ModelData.EMPTY; @@ -78,7 +78,7 @@ public class BlockModelBuilder { out.add(new Model.ConfiguredMesh(material, mesh)); } }; - BakedModelBufferer.bufferBlock(ModelUtil.VANILLA_RENDERER, renderWorld, state, poseStack, modelData, resultConsumer); + BakedModelBufferer.bufferBlock(ModelUtil.VANILLA_RENDERER, level, state, poseStack, modelData, resultConsumer); return new SimpleModel(out.build()); } diff --git a/src/main/java/com/jozufozu/flywheel/lib/model/baked/MultiBlockModelBuilder.java b/src/main/java/com/jozufozu/flywheel/lib/model/baked/MultiBlockModelBuilder.java index b42834fa1..f372d36ba 100644 --- a/src/main/java/com/jozufozu/flywheel/lib/model/baked/MultiBlockModelBuilder.java +++ b/src/main/java/com/jozufozu/flywheel/lib/model/baked/MultiBlockModelBuilder.java @@ -23,7 +23,7 @@ import net.minecraft.world.level.BlockAndTintGetter; import net.minecraftforge.client.model.data.ModelData; public class MultiBlockModelBuilder { - private final BlockAndTintGetter renderWorld; + private final BlockAndTintGetter level; private final Iterable positions; @Nullable private PoseStack poseStack; @@ -33,8 +33,8 @@ public class MultiBlockModelBuilder { @Nullable private BiFunction materialFunc; - public MultiBlockModelBuilder(BlockAndTintGetter renderWorld, Iterable positions) { - this.renderWorld = renderWorld; + public MultiBlockModelBuilder(BlockAndTintGetter level, Iterable positions) { + this.level = level; this.positions = positions; } @@ -77,7 +77,7 @@ public class MultiBlockModelBuilder { out.add(new Model.ConfiguredMesh(material, mesh)); } }; - BakedModelBufferer.bufferMultiBlock(ModelUtil.VANILLA_RENDERER, positions.iterator(), renderWorld, poseStack, modelDataLookup, renderFluids, resultConsumer); + BakedModelBufferer.bufferMultiBlock(ModelUtil.VANILLA_RENDERER, positions.iterator(), level, poseStack, modelDataLookup, renderFluids, resultConsumer); return new SimpleModel(out.build()); } diff --git a/src/main/java/com/jozufozu/flywheel/lib/visual/AbstractBlockEntityVisual.java b/src/main/java/com/jozufozu/flywheel/lib/visual/AbstractBlockEntityVisual.java index d314da066..d5486106e 100644 --- a/src/main/java/com/jozufozu/flywheel/lib/visual/AbstractBlockEntityVisual.java +++ b/src/main/java/com/jozufozu/flywheel/lib/visual/AbstractBlockEntityVisual.java @@ -67,7 +67,7 @@ public abstract class AbstractBlockEntityVisual extends A /** * In order to accommodate for floating point precision errors at high coordinates, * {@link VisualManager}s are allowed to arbitrarily adjust the origin, and - * shift the world matrix provided as a shader uniform accordingly. + * shift the level matrix provided as a shader uniform accordingly. * * @return The {@link BlockPos position} of the {@link BlockEntity} this visual * represents should be rendered at to appear in the correct location. diff --git a/src/main/java/com/jozufozu/flywheel/lib/visual/AbstractEntityVisual.java b/src/main/java/com/jozufozu/flywheel/lib/visual/AbstractEntityVisual.java index 9cec1d4df..0d3c2123b 100644 --- a/src/main/java/com/jozufozu/flywheel/lib/visual/AbstractEntityVisual.java +++ b/src/main/java/com/jozufozu/flywheel/lib/visual/AbstractEntityVisual.java @@ -43,7 +43,7 @@ public abstract class AbstractEntityVisual extends AbstractVis } /** - * Calculate the distance squared between this visual and the given world position. + * Calculate the distance squared between this visual and the given level position. * * @param x The x coordinate. * @param y The y coordinate. @@ -57,7 +57,7 @@ public abstract class AbstractEntityVisual extends AbstractVis /** * In order to accommodate for floating point precision errors at high coordinates, * {@link VisualizationManager}s are allowed to arbitrarily adjust the origin, and - * shift the world matrix provided as a shader uniform accordingly. + * shift the level matrix provided as a shader uniform accordingly. * * @return The position this visual should be rendered at to appear in the correct location. */ @@ -71,7 +71,7 @@ public abstract class AbstractEntityVisual extends AbstractVis /** * In order to accommodate for floating point precision errors at high coordinates, * {@link VisualizationManager}s are allowed to arbitrarily adjust the origin, and - * shift the world matrix provided as a shader uniform accordingly. + * shift the level matrix provided as a shader uniform accordingly. * * @return The position this visual should be rendered at to appear in the correct location. */ diff --git a/src/main/resources/assets/flywheel/flywheel/internal/uniforms/frame.glsl b/src/main/resources/assets/flywheel/flywheel/internal/uniforms/frame.glsl index 7e5ead7eb..5131f8ab0 100644 --- a/src/main/resources/assets/flywheel/flywheel/internal/uniforms/frame.glsl +++ b/src/main/resources/assets/flywheel/flywheel/internal/uniforms/frame.glsl @@ -1,12 +1,12 @@ struct FrustumPlanes { - vec4 xyX;// - vec4 xyY;// - vec4 xyZ;// - vec4 xyW;// - vec2 zX;// - vec2 zY;// - vec2 zZ;// - vec2 zW;// + vec4 xyX; // + vec4 xyY; // + vec4 xyZ; // + vec4 xyW; // + vec2 zX; // + vec2 zY; // + vec2 zZ; // + vec2 zW; // }; layout(std140) uniform _FlwFrameUniforms { @@ -30,13 +30,12 @@ layout(std140) uniform _FlwFrameUniforms { vec2 flw_cameraRotPrev; vec2 flw_viewportSize; - float flw_defaultLineWidth; float flw_aspectRatio; + float flw_defaultLineWidth; float flw_viewDistance; uint flw_ticks; float flw_partialTick; - float flw_renderTicks; float flw_renderSeconds;