From 22d50ca4d2325099aacb803f08833763e121b9cf Mon Sep 17 00:00:00 2001 From: jellysquid3 Date: Fri, 3 Sep 2021 12:18:06 -0500 Subject: [PATCH] new: FRAPI-based rendering and the largest refactor you've ever seen Sorry, not sorry. --- build.gradle | 7 +- .../mods/sodium/client/SodiumClientMod.java | 14 +- .../config/SodiumMixinConfig.java} | 29 +- .../SodiumRenderConfig.java} | 14 +- .../config/mixin/MixinOption.java} | 6 +- .../options => config/render}/Option.java | 6 +- .../options => config/render}/OptionFlag.java | 2 +- .../render}/OptionGroup.java | 2 +- .../render}/OptionImpact.java | 3 +- .../options => config/render}/OptionImpl.java | 10 +- .../options => config/render}/OptionPage.java | 2 +- .../render}/binding/GenericBinding.java | 2 +- .../render}/binding/OptionBinding.java | 2 +- .../compat/VanillaBooleanOptionBinding.java | 4 +- .../storage/MinecraftOptionsStorage.java | 2 +- .../render}/storage/OptionStorage.java | 2 +- .../render}/storage/SodiumOptionsStorage.java | 10 +- .../sodium/client/gl/util/ElementRange.java | 6 - .../mods/sodium/client/gl/util/EnumBit.java | 5 - ...ptionsGUI.java => SodiumConfigScreen.java} | 23 +- ...ages.java => SodiumConfigScreenPages.java} | 39 +- .../sodium/client/gui/options/Control.java | 12 + .../options/{control => }/ControlElement.java | 7 +- .../{control => }/ControlValueFormatter.java | 2 +- .../options/{control => }/CyclingControl.java | 8 +- .../options/{control => }/SliderControl.java | 6 +- .../options/{control => }/TickBoxControl.java | 6 +- .../client/gui/options/control/Control.java | 12 - .../client/{util => gui/values}/Dim2i.java | 2 +- .../client/gui/widgets/FlatButtonWidget.java | 2 +- .../client/interop/fabric/SodiumRenderer.java | 74 ++ .../interop/fabric/helper/ColorHelper.java | 37 + .../interop/fabric/helper/GeometryHelper.java | 230 +++++ .../interop/fabric/helper/NormalHelper.java | 82 ++ .../interop/fabric/helper/TextureHelper.java | 109 +++ .../fabric/material/MaterialFinderImpl.java | 76 ++ .../fabric/material/RenderMaterialFlags.java | 65 ++ .../fabric/material/RenderMaterialValue.java | 41 + .../interop/fabric/mesh/EncodingFormat.java | 146 +++ .../interop/fabric/mesh/MeshBuilderImpl.java | 79 ++ .../client/interop/fabric/mesh/MeshImpl.java | 64 ++ .../fabric/mesh/MutableQuadViewImpl.java | 165 ++++ .../interop/fabric/mesh/QuadViewImpl.java | 273 ++++++ .../BufferBuilderParametersAccess.java | 2 +- .../chunk}/PackedIntegerArrayExtended.java | 2 +- .../chunk}/PalettedContainerExtended.java | 2 +- .../vanilla/colors/BlockColorsExtended.java | 8 + .../vanilla/colors}/ItemColorsExtended.java | 2 +- .../consumer}/BatchingVertexConsumer.java | 2 +- .../vanilla/cuboid}/ModelCuboidAccessor.java | 2 +- .../vanilla/glyph}/GlyphRendererBatched.java | 2 +- .../glyph}/OutlineCharacterVisitor.java | 2 +- .../vanilla/item/ItemRendererBatched.java} | 9 +- .../LightmapTextureManagerAccessor.java | 2 +- .../vanilla/matrix}/Matrix3fExtended.java | 2 +- .../vanilla/matrix}/Matrix4fExtended.java | 2 +- .../vanilla/matrix/MatrixConverter.java} | 4 +- .../vanilla/matrix}/MatrixUtil.java | 23 +- .../vanilla/quad/BakedQuadHelper.java} | 7 +- .../vanilla/quad/BakedQuadView.java} | 12 +- .../quad}/ModelQuadOverlayAdapter.java | 2 +- ...nglePreparationResourceReloaderAccess.java | 2 +- ...lePreparationResourceReloaderCallback.java | 3 +- .../vanilla}/world/ChunkStatusListener.java | 2 +- .../world/ClientChunkManagerExtended.java | 2 +- .../vanilla}/world/ClientWorldExtended.java | 2 +- .../vanilla}/world/WorldRendererExtended.java | 2 +- .../client/model/IndexBufferBuilder.java | 5 +- .../client/model/light/LightPipeline.java | 22 - .../model/light/LightPipelineProvider.java | 26 - .../client/model/light/QuadLighter.java | 14 + .../model/light/SidedBrightnessTable.java | 20 + ...taCache.java => SlicedLightDataCache.java} | 6 +- .../model/light/data/QuadLightData.java | 4 +- .../model/light/flat/FlatLightPipeline.java | 40 - .../client/model/light/smooth/AoFaceData.java | 2 +- ...htPipeline.java => SmoothQuadLighter.java} | 64 +- .../sodium/client/model/quad/ModelQuad.java | 128 --- .../model/quad/ModelQuadViewMutable.java | 64 -- ...dColorProvider.java => QuadColorizer.java} | 2 +- .../model/quad/blender/BiomeColorBlender.java | 11 +- .../quad/blender/FlatBiomeColorBlender.java | 9 +- .../quad/blender/SmoothBiomeColorBlender.java | 42 +- .../quad/properties/ModelQuadFacing.java | 12 - .../model/quad/properties/ModelQuadFlags.java | 81 -- .../model/vertex/VanillaVertexType.java | 2 +- .../vertex/buffer/VertexBufferBuilder.java | 4 +- .../model/vertex/buffer/VertexBufferView.java | 2 +- .../vertex/buffer/VertexBufferWriter.java | 2 +- .../model/vertex/formats/GlyphVertexSink.java | 4 +- .../model/vertex/formats/LineVertexSink.java | 2 +- .../vertex/formats/ModelQuadVertexSink.java | 6 +- .../formats/generic/PositionColorSink.java | 4 +- .../formats/generic/PositionTextureSink.java | 4 +- .../model/vertex/type/BufferVertexType.java | 2 +- .../model/vertex/type/CustomVertexType.java | 4 +- .../buffer => render}/IndexedVertexData.java | 6 +- .../client/render/SodiumWorldRenderer.java | 21 +- .../render/{ => batch}/ContainerBatch.java | 2 +- .../render/{ => batch}/GuiRenderBatches.java | 2 +- .../render/{ => batch}/InGameGuiBatch.java | 3 +- .../render/{ => batch}/ItemRenderBatch.java | 3 +- .../render/{ => batch}/RenderBatch.java | 2 +- .../client/render/chunk/ChunkRenderList.java | 1 + .../client/render/chunk/RenderSection.java | 17 +- .../render/chunk/RenderSectionManager.java | 22 +- .../chunk}/arena/AsyncBufferArena.java | 12 +- .../chunk}/arena/GlBufferArena.java | 6 +- .../chunk}/arena/GlBufferSegment.java | 2 +- .../arena/PendingBufferCopyCommand.java | 2 +- .../chunk}/arena/PendingUpload.java | 4 +- .../chunk}/arena/SwapBufferArena.java | 10 +- .../arena/staging/FallbackStagingBuffer.java | 10 +- .../arena/staging/MappedStagingBuffer.java | 14 +- .../chunk}/arena/staging/StagingBuffer.java | 6 +- .../chunk/compile/ChunkBuildBuffers.java | 17 +- .../render/chunk/compile/ChunkBuilder.java | 20 +- .../buffers/BakedChunkModelBuilder.java | 14 +- .../compile/buffers/ChunkModelBuilder.java | 2 - .../{ => context}/ChunkCameraContext.java | 2 +- .../{ => context}/ChunkRenderMatrices.java | 6 +- .../render/chunk/data/ChunkMeshData.java | 4 +- .../render/chunk/data/ChunkRenderBounds.java | 62 +- .../chunk/format/ChunkModelVertexFormats.java | 7 - .../{sfp => }/ModelVertexBufferWriterNio.java | 6 +- .../ModelVertexBufferWriterUnsafe.java | 6 +- .../render/chunk/format/ModelVertexSink.java | 9 +- .../format/{sfp => }/ModelVertexType.java | 10 +- .../chunk/{ => graph}/ChunkAdjacencyMap.java | 2 +- .../render/chunk/graph/ChunkGraphInfo.java | 2 +- .../MaterialCutoutFlag.java | 2 +- .../{format => material}/MaterialFlag.java | 2 +- .../render/chunk/region/RenderRegion.java | 22 +- .../chunk/region/RenderRegionManager.java | 16 +- .../{ => renderer}/ChunkGraphicsState.java | 7 +- .../chunk/{ => renderer}/ChunkRenderer.java | 7 +- .../chunk/renderer}/MultiDrawBatch.java | 3 +- .../{ => renderer}/RegionChunkRenderer.java | 31 +- .../{ => renderer}/ShaderChunkRenderer.java | 16 +- .../render/chunk/shader/ChunkFogMode.java | 1 + .../shader/ChunkShaderBindingPoints.java | 2 +- .../chunk/shader/ChunkShaderFogComponent.java | 5 +- .../chunk/shader/ChunkShaderInterface.java | 11 +- .../chunk/shader/ChunkShaderOptions.java | 2 +- .../chunk/tasks/ChunkRenderBuildTask.java | 8 +- .../tasks/ChunkRenderEmptyBuildTask.java | 4 +- .../chunk/tasks/ChunkRenderRebuildTask.java | 41 +- .../client/render/pipeline/BlockRenderer.java | 224 ----- .../render/pipeline/ChunkRenderCache.java | 12 - .../client/render/pipeline/FluidRenderer.java | 920 +++++++++--------- .../context/ChunkRenderCacheLocal.java | 57 -- .../context/ChunkRenderCacheShared.java | 68 -- .../render/renderer/AbstractRenderer.java | 360 +++++++ .../render/renderer/BlockRenderInfo.java | 110 +++ .../render/renderer/RenderContextBase.java | 32 + .../renderer/TerrainBlockRenderInfo.java | 80 ++ .../render/renderer/TerrainRenderContext.java | 85 ++ .../render/renderer/TerrainRenderer.java | 72 ++ .../util/DirectionUtil.java | 2 +- .../{common => client}/util/ListUtil.java | 2 +- .../{gui/options => util}/TextProvider.java | 2 +- .../FutureQueueDrainingIterator.java | 2 +- .../collections/QueueDrainingIterator.java | 2 +- .../sodium/client/util/color/ColorARGB.java | 36 +- .../client/util/font/BatchedGlyphRender.java | 40 - .../client/util/{ => geometry}/Norm3b.java | 4 +- .../mods/sodium/client/world/WorldSlice.java | 20 +- .../sodium/client/world/biome/BiomeCache.java | 2 +- .../world/biome/BlockColorsExtended.java | 8 - .../world/cloned/ChunkRenderContext.java | 8 +- .../world/cloned/ClonedChunkSection.java | 1 + .../mods/sodium/mixin/SodiumMixinPlugin.java | 10 +- ...ixinSinglePreparationResourceReloader.java | 2 +- .../mixin/core/matrix/MixinMatrix3f.java | 4 +- .../mixin/core/matrix/MixinMatrix4f.java | 2 +- .../mixin/core/model/MixinBlockColors.java | 12 +- .../mixin/core/model/MixinItemColors.java | 2 +- .../mixin/core/pipeline/MixinBakedQuad.java | 23 +- .../core/pipeline/MixinBufferBuilder.java | 4 +- .../core/pipeline/MixinVertexFormat.java | 2 +- .../block/MixinBlockModelRenderer.java | 7 +- .../block/MixinSignBlockEntityRenderer.java | 2 +- .../features/block/MixinWorldRenderer.java | 27 - .../fast_sort/MixinBufferBuilder.java | 2 +- .../intrinsics/MixinBufferBuilder.java | 6 +- .../intrinsics/MixinWorldRenderer.java | 8 +- .../MixinClientChunkManager.java | 4 +- .../chunk_rendering/MixinClientWorld.java | 2 +- .../MixinLightmapTextureManager.java | 2 +- .../MixinPackedIntegerArray.java | 2 +- .../MixinPalettedContainer.java | 2 +- .../chunk_rendering/MixinWorldRenderer.java | 10 +- .../mixin/features/debug/MixinDebugHud.java | 2 +- .../entity/fast_render/MixinCuboid.java | 2 +- .../entity/fast_render/MixinModelPart.java | 10 +- .../mixin/features/font/MixinFontManager.java | 2 +- .../features/font/MixinGlyphRenderer.java | 2 +- .../features/font/MixinTextRenderer.java | 8 +- .../font/MixinTextRendererDrawer.java | 2 +- .../features/gui/MixinHandledScreen.java | 6 +- .../mixin/features/item/MixinInGameHud.java | 8 +- .../features/item/MixinItemRenderer.java | 18 +- .../matrix_stack/MixinMatrixStack.java | 6 +- .../matrix_stack/MixinVertexConsumer.java | 6 +- .../features/options/MixinOptionsScreen.java | 4 +- .../client/gl => thingl}/GlObject.java | 2 +- .../gl => thingl}/array/GlVertexArray.java | 4 +- .../attribute/BufferVertexFormat.java | 2 +- .../attribute/GlVertexAttribute.java | 2 +- .../attribute/GlVertexAttributeBinding.java | 4 +- .../attribute/GlVertexAttributeFormat.java | 2 +- .../attribute/GlVertexFormat.java | 2 +- .../client/gl => thingl}/buffer/GlBuffer.java | 4 +- .../buffer/GlBufferMapFlags.java | 4 +- .../gl => thingl}/buffer/GlBufferMapping.java | 3 +- .../buffer/GlBufferStorageFlags.java | 4 +- .../gl => thingl}/buffer/GlBufferTarget.java | 3 +- .../gl => thingl}/buffer/GlBufferUsage.java | 2 +- .../buffer/GlImmutableBuffer.java | 4 +- .../gl => thingl}/buffer/GlMutableBuffer.java | 2 +- .../gl => thingl}/device/CommandList.java | 18 +- .../gl => thingl}/device/DrawCommandList.java | 4 +- .../gl => thingl}/device/GLRenderDevice.java | 18 +- .../gl => thingl}/device/RenderDevice.java | 4 +- .../functions/BufferStorageFunctions.java | 10 +- .../functions/DeviceFunctions.java | 4 +- .../gl => thingl}/shader/GlProgram.java | 10 +- .../client/gl => thingl}/shader/GlShader.java | 4 +- .../shader/ShaderBindingContext.java | 6 +- .../shader/ShaderBindingPoint.java | 2 +- .../gl => thingl}/shader/ShaderConstants.java | 2 +- .../gl => thingl}/shader/ShaderLoader.java | 2 +- .../gl => thingl}/shader/ShaderParser.java | 2 +- .../gl => thingl}/shader/ShaderType.java | 2 +- .../shader/ShaderWorkarounds.java | 2 +- .../shader/uniform/GlUniform.java | 2 +- .../shader/uniform/GlUniformBlock.java | 5 +- .../shader/uniform/GlUniformFloat.java | 2 +- .../shader/uniform/GlUniformFloat4v.java | 2 +- .../shader/uniform/GlUniformInt.java | 2 +- .../shader/uniform/GlUniformMatrix4f.java | 2 +- .../gl => thingl}/state/GlStateTracker.java | 8 +- .../client/gl => thingl}/sync/GlFence.java | 4 +- .../tessellation/GlAbstractTessellation.java | 6 +- .../tessellation/GlIndexType.java | 2 +- .../tessellation/GlPrimitiveType.java | 2 +- .../tessellation/GlTessellation.java | 4 +- .../GlVertexArrayTessellation.java | 7 +- .../tessellation/TessellationBinding.java | 8 +- .../gl => thingl}/texture/GlSampler.java | 4 +- .../gl => thingl}/texture/GlTexture.java | 4 +- .../gl => thingl}/texture/TextureData.java | 2 +- .../mods/thingl/util/ElementRange.java | 6 + .../jellysquid/mods/thingl/util/EnumBit.java | 5 + .../gl => thingl}/util/EnumBitField.java | 2 +- .../gl => thingl}/util/MemoryUtilHelper.java | 2 +- .../client => thingl}/util/NativeBuffer.java | 10 +- src/main/resources/sodium.mixins.json | 3 +- 258 files changed, 3378 insertions(+), 2080 deletions(-) rename src/main/java/me/jellysquid/mods/sodium/{common/config/SodiumConfig.java => client/config/SodiumMixinConfig.java} (91%) rename src/main/java/me/jellysquid/mods/sodium/client/{gui/SodiumGameOptions.java => config/SodiumRenderConfig.java} (92%) rename src/main/java/me/jellysquid/mods/sodium/{common/config/Option.java => client/config/mixin/MixinOption.java} (89%) rename src/main/java/me/jellysquid/mods/sodium/client/{gui/options => config/render}/Option.java (68%) rename src/main/java/me/jellysquid/mods/sodium/client/{gui/options => config/render}/OptionFlag.java (66%) rename src/main/java/me/jellysquid/mods/sodium/client/{gui/options => config/render}/OptionGroup.java (94%) rename src/main/java/me/jellysquid/mods/sodium/client/{gui/options => config/render}/OptionImpact.java (84%) rename src/main/java/me/jellysquid/mods/sodium/client/{gui/options => config/render}/OptionImpl.java (93%) rename src/main/java/me/jellysquid/mods/sodium/client/{gui/options => config/render}/OptionPage.java (93%) rename src/main/java/me/jellysquid/mods/sodium/client/{gui/options => config/render}/binding/GenericBinding.java (90%) rename src/main/java/me/jellysquid/mods/sodium/client/{gui/options => config/render}/binding/OptionBinding.java (63%) rename src/main/java/me/jellysquid/mods/sodium/client/{gui/options => config/render}/binding/compat/VanillaBooleanOptionBinding.java (80%) rename src/main/java/me/jellysquid/mods/sodium/client/{gui/options => config/render}/storage/MinecraftOptionsStorage.java (90%) rename src/main/java/me/jellysquid/mods/sodium/client/{gui/options => config/render}/storage/OptionStorage.java (53%) rename src/main/java/me/jellysquid/mods/sodium/client/{gui/options => config/render}/storage/SodiumOptionsStorage.java (72%) delete mode 100644 src/main/java/me/jellysquid/mods/sodium/client/gl/util/ElementRange.java delete mode 100644 src/main/java/me/jellysquid/mods/sodium/client/gl/util/EnumBit.java rename src/main/java/me/jellysquid/mods/sodium/client/gui/{SodiumOptionsGUI.java => SodiumConfigScreen.java} (92%) rename src/main/java/me/jellysquid/mods/sodium/client/gui/{SodiumGameOptionPages.java => SodiumConfigScreenPages.java} (92%) create mode 100644 src/main/java/me/jellysquid/mods/sodium/client/gui/options/Control.java rename src/main/java/me/jellysquid/mods/sodium/client/gui/options/{control => }/ControlElement.java (89%) rename src/main/java/me/jellysquid/mods/sodium/client/gui/options/{control => }/ControlValueFormatter.java (96%) rename src/main/java/me/jellysquid/mods/sodium/client/gui/options/{control => }/CyclingControl.java (93%) rename src/main/java/me/jellysquid/mods/sodium/client/gui/options/{control => }/SliderControl.java (97%) rename src/main/java/me/jellysquid/mods/sodium/client/gui/options/{control => }/TickBoxControl.java (94%) delete mode 100644 src/main/java/me/jellysquid/mods/sodium/client/gui/options/control/Control.java rename src/main/java/me/jellysquid/mods/sodium/client/{util => gui/values}/Dim2i.java (90%) create mode 100644 src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/SodiumRenderer.java create mode 100644 src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/helper/ColorHelper.java create mode 100644 src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/helper/GeometryHelper.java create mode 100644 src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/helper/NormalHelper.java create mode 100644 src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/helper/TextureHelper.java create mode 100644 src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/material/MaterialFinderImpl.java create mode 100644 src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/material/RenderMaterialFlags.java create mode 100644 src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/material/RenderMaterialValue.java create mode 100644 src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/mesh/EncodingFormat.java create mode 100644 src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/mesh/MeshBuilderImpl.java create mode 100644 src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/mesh/MeshImpl.java create mode 100644 src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/mesh/MutableQuadViewImpl.java create mode 100644 src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/mesh/QuadViewImpl.java rename src/main/java/me/jellysquid/mods/sodium/client/{util/geometry => interop/vanilla/buffer}/BufferBuilderParametersAccess.java (67%) rename src/main/java/me/jellysquid/mods/sodium/client/{world/cloned => interop/vanilla/chunk}/PackedIntegerArrayExtended.java (75%) rename src/main/java/me/jellysquid/mods/sodium/client/{world/cloned => interop/vanilla/chunk}/PalettedContainerExtended.java (88%) create mode 100644 src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/colors/BlockColorsExtended.java rename src/main/java/me/jellysquid/mods/sodium/client/{world/biome => interop/vanilla/colors}/ItemColorsExtended.java (74%) rename src/main/java/me/jellysquid/mods/sodium/client/{render => interop/vanilla/consumer}/BatchingVertexConsumer.java (97%) rename src/main/java/me/jellysquid/mods/sodium/client/{model => interop/vanilla/cuboid}/ModelCuboidAccessor.java (65%) rename src/main/java/me/jellysquid/mods/sodium/client/{util/font => interop/vanilla/glyph}/GlyphRendererBatched.java (88%) rename src/main/java/me/jellysquid/mods/sodium/client/{util/font => interop/vanilla/glyph}/OutlineCharacterVisitor.java (96%) rename src/main/java/me/jellysquid/mods/sodium/client/{render/ItemRendererExtended.java => interop/vanilla/item/ItemRendererBatched.java} (68%) rename src/main/java/me/jellysquid/mods/sodium/client/{render => interop/vanilla/lightmap}/LightmapTextureManagerAccessor.java (67%) rename src/main/java/me/jellysquid/mods/sodium/client/{util/math => interop/vanilla/matrix}/Matrix3fExtended.java (94%) rename src/main/java/me/jellysquid/mods/sodium/client/{util/math => interop/vanilla/matrix}/Matrix4fExtended.java (96%) rename src/main/java/me/jellysquid/mods/sodium/client/{util/math/JomlHelper.java => interop/vanilla/matrix/MatrixConverter.java} (85%) rename src/main/java/me/jellysquid/mods/sodium/client/{util/math => interop/vanilla/matrix}/MatrixUtil.java (61%) rename src/main/java/me/jellysquid/mods/sodium/client/{util/ModelQuadUtil.java => interop/vanilla/quad/BakedQuadHelper.java} (90%) rename src/main/java/me/jellysquid/mods/sodium/client/{model/quad/ModelQuadView.java => interop/vanilla/quad/BakedQuadView.java} (74%) rename src/main/java/me/jellysquid/mods/sodium/client/{render => interop/vanilla/quad}/ModelQuadOverlayAdapter.java (93%) rename src/main/java/me/jellysquid/mods/sodium/client/{util => interop/vanilla}/resource/SinglePreparationResourceReloaderAccess.java (81%) rename src/main/java/me/jellysquid/mods/sodium/client/{util/font => interop/vanilla/resource}/SinglePreparationResourceReloaderCallback.java (87%) rename src/main/java/me/jellysquid/mods/sodium/client/{ => interop/vanilla}/world/ChunkStatusListener.java (90%) rename src/main/java/me/jellysquid/mods/sodium/client/{ => interop/vanilla}/world/ClientChunkManagerExtended.java (79%) rename src/main/java/me/jellysquid/mods/sodium/client/{ => interop/vanilla}/world/ClientWorldExtended.java (71%) rename src/main/java/me/jellysquid/mods/sodium/client/{ => interop/vanilla}/world/WorldRendererExtended.java (71%) delete mode 100644 src/main/java/me/jellysquid/mods/sodium/client/model/light/LightPipeline.java delete mode 100644 src/main/java/me/jellysquid/mods/sodium/client/model/light/LightPipelineProvider.java create mode 100644 src/main/java/me/jellysquid/mods/sodium/client/model/light/QuadLighter.java create mode 100644 src/main/java/me/jellysquid/mods/sodium/client/model/light/SidedBrightnessTable.java rename src/main/java/me/jellysquid/mods/sodium/client/model/light/cache/{ArrayLightDataCache.java => SlicedLightDataCache.java} (90%) delete mode 100644 src/main/java/me/jellysquid/mods/sodium/client/model/light/flat/FlatLightPipeline.java rename src/main/java/me/jellysquid/mods/sodium/client/model/light/smooth/{SmoothLightPipeline.java => SmoothQuadLighter.java} (78%) delete mode 100644 src/main/java/me/jellysquid/mods/sodium/client/model/quad/ModelQuad.java delete mode 100644 src/main/java/me/jellysquid/mods/sodium/client/model/quad/ModelQuadViewMutable.java rename src/main/java/me/jellysquid/mods/sodium/client/model/quad/{ModelQuadColorProvider.java => QuadColorizer.java} (86%) delete mode 100644 src/main/java/me/jellysquid/mods/sodium/client/model/quad/properties/ModelQuadFlags.java rename src/main/java/me/jellysquid/mods/sodium/client/{gl/buffer => render}/IndexedVertexData.java (67%) rename src/main/java/me/jellysquid/mods/sodium/client/render/{ => batch}/ContainerBatch.java (97%) rename src/main/java/me/jellysquid/mods/sodium/client/render/{ => batch}/GuiRenderBatches.java (76%) rename src/main/java/me/jellysquid/mods/sodium/client/render/{ => batch}/InGameGuiBatch.java (94%) rename src/main/java/me/jellysquid/mods/sodium/client/render/{ => batch}/ItemRenderBatch.java (94%) rename src/main/java/me/jellysquid/mods/sodium/client/render/{ => batch}/RenderBatch.java (93%) rename src/main/java/me/jellysquid/mods/sodium/client/{gl => render/chunk}/arena/AsyncBufferArena.java (97%) rename src/main/java/me/jellysquid/mods/sodium/client/{gl => render/chunk}/arena/GlBufferArena.java (66%) rename src/main/java/me/jellysquid/mods/sodium/client/{gl => render/chunk}/arena/GlBufferSegment.java (96%) rename src/main/java/me/jellysquid/mods/sodium/client/{gl => render/chunk}/arena/PendingBufferCopyCommand.java (83%) rename src/main/java/me/jellysquid/mods/sodium/client/{gl => render/chunk}/arena/PendingUpload.java (86%) rename src/main/java/me/jellysquid/mods/sodium/client/{gl => render/chunk}/arena/SwapBufferArena.java (93%) rename src/main/java/me/jellysquid/mods/sodium/client/{gl => render/chunk}/arena/staging/FallbackStagingBuffer.java (76%) rename src/main/java/me/jellysquid/mods/sodium/client/{gl => render/chunk}/arena/staging/MappedStagingBuffer.java (91%) rename src/main/java/me/jellysquid/mods/sodium/client/{gl => render/chunk}/arena/staging/StagingBuffer.java (59%) rename src/main/java/me/jellysquid/mods/sodium/client/render/chunk/{ => context}/ChunkCameraContext.java (92%) rename src/main/java/me/jellysquid/mods/sodium/client/render/chunk/{ => context}/ChunkRenderMatrices.java (53%) delete mode 100644 src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/ChunkModelVertexFormats.java rename src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/{sfp => }/ModelVertexBufferWriterNio.java (80%) rename src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/{sfp => }/ModelVertexBufferWriterUnsafe.java (80%) rename src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/{sfp => }/ModelVertexType.java (89%) rename src/main/java/me/jellysquid/mods/sodium/client/render/chunk/{ => graph}/ChunkAdjacencyMap.java (96%) rename src/main/java/me/jellysquid/mods/sodium/client/render/chunk/{format => material}/MaterialCutoutFlag.java (80%) rename src/main/java/me/jellysquid/mods/sodium/client/render/chunk/{format => material}/MaterialFlag.java (63%) rename src/main/java/me/jellysquid/mods/sodium/client/render/chunk/{ => renderer}/ChunkGraphicsState.java (83%) rename src/main/java/me/jellysquid/mods/sodium/client/render/chunk/{ => renderer}/ChunkRenderer.java (78%) rename src/main/java/me/jellysquid/mods/sodium/client/{gl/util => render/chunk/renderer}/MultiDrawBatch.java (97%) rename src/main/java/me/jellysquid/mods/sodium/client/render/chunk/{ => renderer}/RegionChunkRenderer.java (91%) rename src/main/java/me/jellysquid/mods/sodium/client/render/chunk/{ => renderer}/ShaderChunkRenderer.java (93%) delete mode 100644 src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/BlockRenderer.java delete mode 100644 src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/ChunkRenderCache.java delete mode 100644 src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/context/ChunkRenderCacheLocal.java delete mode 100644 src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/context/ChunkRenderCacheShared.java create mode 100644 src/main/java/me/jellysquid/mods/sodium/client/render/renderer/AbstractRenderer.java create mode 100644 src/main/java/me/jellysquid/mods/sodium/client/render/renderer/BlockRenderInfo.java create mode 100644 src/main/java/me/jellysquid/mods/sodium/client/render/renderer/RenderContextBase.java create mode 100644 src/main/java/me/jellysquid/mods/sodium/client/render/renderer/TerrainBlockRenderInfo.java create mode 100644 src/main/java/me/jellysquid/mods/sodium/client/render/renderer/TerrainRenderContext.java create mode 100644 src/main/java/me/jellysquid/mods/sodium/client/render/renderer/TerrainRenderer.java rename src/main/java/me/jellysquid/mods/sodium/{common => client}/util/DirectionUtil.java (95%) rename src/main/java/me/jellysquid/mods/sodium/{common => client}/util/ListUtil.java (87%) rename src/main/java/me/jellysquid/mods/sodium/client/{gui/options => util}/TextProvider.java (64%) rename src/main/java/me/jellysquid/mods/sodium/{common => client}/util/collections/FutureQueueDrainingIterator.java (95%) rename src/main/java/me/jellysquid/mods/sodium/{common => client}/util/collections/QueueDrainingIterator.java (87%) delete mode 100644 src/main/java/me/jellysquid/mods/sodium/client/util/font/BatchedGlyphRender.java rename src/main/java/me/jellysquid/mods/sodium/client/util/{ => geometry}/Norm3b.java (96%) delete mode 100644 src/main/java/me/jellysquid/mods/sodium/client/world/biome/BlockColorsExtended.java delete mode 100644 src/main/java/me/jellysquid/mods/sodium/mixin/features/block/MixinWorldRenderer.java rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/GlObject.java (96%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/array/GlVertexArray.java (73%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/attribute/BufferVertexFormat.java (80%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/attribute/GlVertexAttribute.java (96%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/attribute/GlVertexAttributeBinding.java (86%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/attribute/GlVertexAttributeFormat.java (92%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/attribute/GlVertexFormat.java (98%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/buffer/GlBuffer.java (81%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/buffer/GlBufferMapFlags.java (84%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/buffer/GlBufferMapping.java (91%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/buffer/GlBufferStorageFlags.java (82%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/buffer/GlBufferTarget.java (91%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/buffer/GlBufferUsage.java (91%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/buffer/GlImmutableBuffer.java (73%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/buffer/GlMutableBuffer.java (89%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/device/CommandList.java (72%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/device/DrawCommandList.java (74%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/device/GLRenderDevice.java (95%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/device/RenderDevice.java (79%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/functions/BufferStorageFunctions.java (81%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/functions/DeviceFunctions.java (74%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/shader/GlProgram.java (90%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/shader/GlShader.java (92%) rename src/main/java/me/jellysquid/mods/{sodium/client/render/chunk => thingl}/shader/ShaderBindingContext.java (53%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/shader/ShaderBindingPoint.java (55%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/shader/ShaderConstants.java (97%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/shader/ShaderLoader.java (96%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/shader/ShaderParser.java (97%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/shader/ShaderType.java (84%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/shader/ShaderWorkarounds.java (97%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/shader/uniform/GlUniform.java (75%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/shader/uniform/GlUniformBlock.java (65%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/shader/uniform/GlUniformFloat.java (84%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/shader/uniform/GlUniformFloat4v.java (86%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/shader/uniform/GlUniformInt.java (84%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/shader/uniform/GlUniformMatrix4f.java (89%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/state/GlStateTracker.java (92%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/sync/GlFence.java (86%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/tessellation/GlAbstractTessellation.java (87%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/tessellation/GlIndexType.java (90%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/tessellation/GlPrimitiveType.java (80%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/tessellation/GlTessellation.java (62%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/tessellation/GlVertexArrayTessellation.java (77%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/tessellation/TessellationBinding.java (69%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/texture/GlSampler.java (87%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/texture/GlTexture.java (92%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/texture/TextureData.java (97%) create mode 100644 src/main/java/me/jellysquid/mods/thingl/util/ElementRange.java create mode 100644 src/main/java/me/jellysquid/mods/thingl/util/EnumBit.java rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/util/EnumBitField.java (94%) rename src/main/java/me/jellysquid/mods/{sodium/client/gl => thingl}/util/MemoryUtilHelper.java (94%) rename src/main/java/me/jellysquid/mods/{sodium/client => thingl}/util/NativeBuffer.java (93%) diff --git a/build.gradle b/build.gradle index e61016c5e3..86aee273f4 100644 --- a/build.gradle +++ b/build.gradle @@ -33,9 +33,12 @@ dependencies { // Fabric API modIncludeImplementation(fabricApi.module("fabric-api-base", project.fabric_version)) - modIncludeImplementation(fabricApi.module("fabric-rendering-fluids-v1", project.fabric_version)) - modIncludeImplementation(fabricApi.module("fabric-rendering-data-attachment-v1", project.fabric_version)) modIncludeImplementation(fabricApi.module("fabric-resource-loader-v0", project.fabric_version)) + modIncludeImplementation(fabricApi.module("fabric-models-v0", project.fabric_version)) + modIncludeImplementation(fabricApi.module("fabric-textures-v0", project.fabric_version)) + modIncludeImplementation(fabricApi.module("fabric-renderer-api-v1", project.fabric_version)) + modIncludeImplementation(fabricApi.module("fabric-rendering-data-attachment-v1", project.fabric_version)) + modIncludeImplementation(fabricApi.module("fabric-rendering-fluids-v1", project.fabric_version)) } if (project.use_third_party_mods) { diff --git a/src/main/java/me/jellysquid/mods/sodium/client/SodiumClientMod.java b/src/main/java/me/jellysquid/mods/sodium/client/SodiumClientMod.java index e396de1870..1998eb2cda 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/SodiumClientMod.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/SodiumClientMod.java @@ -1,14 +1,16 @@ package me.jellysquid.mods.sodium.client; -import me.jellysquid.mods.sodium.client.gui.SodiumGameOptions; +import me.jellysquid.mods.sodium.client.config.SodiumRenderConfig; import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.renderer.v1.RendererAccess; +import me.jellysquid.mods.sodium.client.interop.fabric.SodiumRenderer; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class SodiumClientMod implements ClientModInitializer { - private static SodiumGameOptions CONFIG; + private static SodiumRenderConfig CONFIG; private static Logger LOGGER; private static String MOD_VERSION; @@ -22,9 +24,11 @@ public void onInitializeClient() { MOD_VERSION = mod.getMetadata() .getVersion() .getFriendlyString(); + + RendererAccess.INSTANCE.registerRenderer(SodiumRenderer.INSTANCE); } - public static SodiumGameOptions options() { + public static SodiumRenderConfig options() { if (CONFIG == null) { CONFIG = loadConfig(); } @@ -40,8 +44,8 @@ public static Logger logger() { return LOGGER; } - private static SodiumGameOptions loadConfig() { - return SodiumGameOptions.load(FabricLoader.getInstance().getConfigDir().resolve("sodium-options.json")); + private static SodiumRenderConfig loadConfig() { + return SodiumRenderConfig.load(FabricLoader.getInstance().getConfigDir().resolve("sodium-options.json")); } public static String getVersion() { diff --git a/src/main/java/me/jellysquid/mods/sodium/common/config/SodiumConfig.java b/src/main/java/me/jellysquid/mods/sodium/client/config/SodiumMixinConfig.java similarity index 91% rename from src/main/java/me/jellysquid/mods/sodium/common/config/SodiumConfig.java rename to src/main/java/me/jellysquid/mods/sodium/client/config/SodiumMixinConfig.java index 408613e0b2..087b4d8381 100644 --- a/src/main/java/me/jellysquid/mods/sodium/common/config/SodiumConfig.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/config/SodiumMixinConfig.java @@ -1,5 +1,6 @@ -package me.jellysquid.mods.sodium.common.config; +package me.jellysquid.mods.sodium.client.config; +import me.jellysquid.mods.sodium.client.config.mixin.MixinOption; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; import net.fabricmc.loader.api.metadata.CustomValue; @@ -16,14 +17,14 @@ * Documentation of these options: https://github.com/jellysquid3/sodium-fabric/wiki/Configuration-File */ @SuppressWarnings("CanBeFinal") -public class SodiumConfig { +public class SodiumMixinConfig { private static final Logger LOGGER = LogManager.getLogger("SodiumConfig"); private static final String JSON_KEY_SODIUM_OPTIONS = "sodium:options"; - private final Map options = new HashMap<>(); + private final Map options = new HashMap<>(); - private SodiumConfig() { + private SodiumMixinConfig() { // Defines the default rules which can be configured by the user or other mods. // You must manually add a rule for any new mixins not covered by an existing package rule. this.addMixinRule("core", true); // TODO: Don't actually allow the user to disable this @@ -67,7 +68,7 @@ private SodiumConfig() { private void addMixinRule(String mixin, boolean enabled) { String name = getMixinRuleName(mixin); - if (this.options.putIfAbsent(name, new Option(name, enabled, false)) != null) { + if (this.options.putIfAbsent(name, new MixinOption(name, enabled, false)) != null) { throw new IllegalStateException("Mixin rule already defined: " + mixin); } } @@ -77,7 +78,7 @@ private void readProperties(Properties props) { String key = (String) entry.getKey(); String value = (String) entry.getValue(); - Option option = this.options.get(key); + MixinOption option = this.options.get(key); if (option == null) { LOGGER.warn("No configuration key exists with name '{}', ignoring", key); @@ -119,7 +120,7 @@ private void applyModOverrides() { } private void applyModOverride(ModMetadata meta, String name, CustomValue value) { - Option option = this.options.get(name); + MixinOption option = this.options.get(name); if (option == null) { LOGGER.warn("Mod '{}' attempted to override option '{}', which doesn't exist, ignoring", meta.getId(), name); @@ -151,16 +152,16 @@ private void applyModOverride(ModMetadata meta, String name, CustomValue value) * * @return Null if no options matched the given mixin name, otherwise the effective option for this Mixin */ - public Option getEffectiveOptionForMixin(String mixinClassName) { + public MixinOption getEffectiveOptionForMixin(String mixinClassName) { int lastSplit = 0; int nextSplit; - Option rule = null; + MixinOption rule = null; while ((nextSplit = mixinClassName.indexOf('.', lastSplit)) != -1) { String key = getMixinRuleName(mixinClassName.substring(0, nextSplit)); - Option candidate = this.options.get(key); + MixinOption candidate = this.options.get(key); if (candidate != null) { rule = candidate; @@ -180,7 +181,7 @@ public Option getEffectiveOptionForMixin(String mixinClassName) { * Loads the configuration file from the specified location. If it does not exist, a new configuration file will be * created. The file on disk will then be updated to include any new options. */ - public static SodiumConfig load(File file) { + public static SodiumMixinConfig load(File file) { if (!file.exists()) { try { writeDefaultConfig(file); @@ -188,7 +189,7 @@ public static SodiumConfig load(File file) { LOGGER.warn("Could not write default configuration file", e); } - return new SodiumConfig(); + return new SodiumMixinConfig(); } Properties props = new Properties(); @@ -199,7 +200,7 @@ public static SodiumConfig load(File file) { throw new RuntimeException("Could not load config file", e); } - SodiumConfig config = new SodiumConfig(); + SodiumMixinConfig config = new SodiumMixinConfig(); config.readProperties(props); config.applyModOverrides(); @@ -238,7 +239,7 @@ public int getOptionCount() { public int getOptionOverrideCount() { return (int) this.options.values() .stream() - .filter(Option::isOverridden) + .filter(MixinOption::isOverridden) .count(); } } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/SodiumGameOptions.java b/src/main/java/me/jellysquid/mods/sodium/client/config/SodiumRenderConfig.java similarity index 92% rename from src/main/java/me/jellysquid/mods/sodium/client/gui/SodiumGameOptions.java rename to src/main/java/me/jellysquid/mods/sodium/client/config/SodiumRenderConfig.java index 8ddecb8037..a94b69c0c1 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gui/SodiumGameOptions.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/config/SodiumRenderConfig.java @@ -1,9 +1,9 @@ -package me.jellysquid.mods.sodium.client.gui; +package me.jellysquid.mods.sodium.client.config; import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import me.jellysquid.mods.sodium.client.gui.options.TextProvider; +import me.jellysquid.mods.sodium.client.util.TextProvider; import net.minecraft.client.option.GraphicsMode; import net.minecraft.text.LiteralText; import net.minecraft.text.Text; @@ -16,7 +16,7 @@ import java.nio.file.Path; import java.nio.file.StandardCopyOption; -public class SodiumGameOptions { +public class SodiumRenderConfig { public final QualitySettings quality = new QualitySettings(); public final AdvancedSettings advanced = new AdvancedSettings(); public final NotificationSettings notifications = new NotificationSettings(); @@ -95,17 +95,17 @@ public boolean isFancy(GraphicsMode graphicsMode) { .excludeFieldsWithModifiers(Modifier.PRIVATE) .create(); - public static SodiumGameOptions load(Path path) { - SodiumGameOptions config; + public static SodiumRenderConfig load(Path path) { + SodiumRenderConfig config; if (Files.exists(path)) { try (FileReader reader = new FileReader(path.toFile())) { - config = GSON.fromJson(reader, SodiumGameOptions.class); + config = GSON.fromJson(reader, SodiumRenderConfig.class); } catch (IOException e) { throw new RuntimeException("Could not parse config", e); } } else { - config = new SodiumGameOptions(); + config = new SodiumRenderConfig(); } config.configPath = path; diff --git a/src/main/java/me/jellysquid/mods/sodium/common/config/Option.java b/src/main/java/me/jellysquid/mods/sodium/client/config/mixin/MixinOption.java similarity index 89% rename from src/main/java/me/jellysquid/mods/sodium/common/config/Option.java rename to src/main/java/me/jellysquid/mods/sodium/client/config/mixin/MixinOption.java index 79e7ccc833..74f98481a1 100644 --- a/src/main/java/me/jellysquid/mods/sodium/common/config/Option.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/config/mixin/MixinOption.java @@ -1,18 +1,18 @@ -package me.jellysquid.mods.sodium.common.config; +package me.jellysquid.mods.sodium.client.config.mixin; import java.util.Collection; import java.util.Collections; import java.util.LinkedHashSet; import java.util.Set; -public class Option { +public class MixinOption { private final String name; private Set modDefined = null; private boolean enabled; private boolean userDefined; - public Option(String name, boolean enabled, boolean userDefined) { + public MixinOption(String name, boolean enabled, boolean userDefined) { this.name = name; this.enabled = enabled; this.userDefined = userDefined; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/Option.java b/src/main/java/me/jellysquid/mods/sodium/client/config/render/Option.java similarity index 68% rename from src/main/java/me/jellysquid/mods/sodium/client/gui/options/Option.java rename to src/main/java/me/jellysquid/mods/sodium/client/config/render/Option.java index 1a0118f8e6..3146cc1caf 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/Option.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/config/render/Option.java @@ -1,7 +1,7 @@ -package me.jellysquid.mods.sodium.client.gui.options; +package me.jellysquid.mods.sodium.client.config.render; -import me.jellysquid.mods.sodium.client.gui.options.control.Control; -import me.jellysquid.mods.sodium.client.gui.options.storage.OptionStorage; +import me.jellysquid.mods.sodium.client.gui.options.Control; +import me.jellysquid.mods.sodium.client.config.render.storage.OptionStorage; import net.minecraft.text.Text; import java.util.Collection; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/OptionFlag.java b/src/main/java/me/jellysquid/mods/sodium/client/config/render/OptionFlag.java similarity index 66% rename from src/main/java/me/jellysquid/mods/sodium/client/gui/options/OptionFlag.java rename to src/main/java/me/jellysquid/mods/sodium/client/config/render/OptionFlag.java index d7ac006216..678db68587 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/OptionFlag.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/config/render/OptionFlag.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gui.options; +package me.jellysquid.mods.sodium.client.config.render; public enum OptionFlag { REQUIRES_RENDERER_RELOAD, diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/OptionGroup.java b/src/main/java/me/jellysquid/mods/sodium/client/config/render/OptionGroup.java similarity index 94% rename from src/main/java/me/jellysquid/mods/sodium/client/gui/options/OptionGroup.java rename to src/main/java/me/jellysquid/mods/sodium/client/config/render/OptionGroup.java index 97426724a7..c62aa8a1a6 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/OptionGroup.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/config/render/OptionGroup.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gui.options; +package me.jellysquid.mods.sodium.client.config.render; import com.google.common.collect.ImmutableList; import org.apache.commons.lang3.Validate; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/OptionImpact.java b/src/main/java/me/jellysquid/mods/sodium/client/config/render/OptionImpact.java similarity index 84% rename from src/main/java/me/jellysquid/mods/sodium/client/gui/options/OptionImpact.java rename to src/main/java/me/jellysquid/mods/sodium/client/config/render/OptionImpact.java index ddb1ee3416..6a233f4b16 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/OptionImpact.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/config/render/OptionImpact.java @@ -1,5 +1,6 @@ -package me.jellysquid.mods.sodium.client.gui.options; +package me.jellysquid.mods.sodium.client.config.render; +import me.jellysquid.mods.sodium.client.util.TextProvider; import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; import net.minecraft.util.Formatting; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/OptionImpl.java b/src/main/java/me/jellysquid/mods/sodium/client/config/render/OptionImpl.java similarity index 93% rename from src/main/java/me/jellysquid/mods/sodium/client/gui/options/OptionImpl.java rename to src/main/java/me/jellysquid/mods/sodium/client/config/render/OptionImpl.java index 72905ddeb5..bf6071719c 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/OptionImpl.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/config/render/OptionImpl.java @@ -1,9 +1,9 @@ -package me.jellysquid.mods.sodium.client.gui.options; +package me.jellysquid.mods.sodium.client.config.render; -import me.jellysquid.mods.sodium.client.gui.options.binding.GenericBinding; -import me.jellysquid.mods.sodium.client.gui.options.binding.OptionBinding; -import me.jellysquid.mods.sodium.client.gui.options.control.Control; -import me.jellysquid.mods.sodium.client.gui.options.storage.OptionStorage; +import me.jellysquid.mods.sodium.client.config.render.binding.GenericBinding; +import me.jellysquid.mods.sodium.client.config.render.binding.OptionBinding; +import me.jellysquid.mods.sodium.client.gui.options.Control; +import me.jellysquid.mods.sodium.client.config.render.storage.OptionStorage; import net.minecraft.text.Text; import org.apache.commons.lang3.Validate; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/OptionPage.java b/src/main/java/me/jellysquid/mods/sodium/client/config/render/OptionPage.java similarity index 93% rename from src/main/java/me/jellysquid/mods/sodium/client/gui/options/OptionPage.java rename to src/main/java/me/jellysquid/mods/sodium/client/config/render/OptionPage.java index 2aa185e35c..e284c3f35f 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/OptionPage.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/config/render/OptionPage.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gui.options; +package me.jellysquid.mods.sodium.client.config.render; import com.google.common.collect.ImmutableList; import net.minecraft.text.Text; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/binding/GenericBinding.java b/src/main/java/me/jellysquid/mods/sodium/client/config/render/binding/GenericBinding.java similarity index 90% rename from src/main/java/me/jellysquid/mods/sodium/client/gui/options/binding/GenericBinding.java rename to src/main/java/me/jellysquid/mods/sodium/client/config/render/binding/GenericBinding.java index 9e166c93ef..92398a120f 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/binding/GenericBinding.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/config/render/binding/GenericBinding.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gui.options.binding; +package me.jellysquid.mods.sodium.client.config.render.binding; import java.util.function.BiConsumer; import java.util.function.Function; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/binding/OptionBinding.java b/src/main/java/me/jellysquid/mods/sodium/client/config/render/binding/OptionBinding.java similarity index 63% rename from src/main/java/me/jellysquid/mods/sodium/client/gui/options/binding/OptionBinding.java rename to src/main/java/me/jellysquid/mods/sodium/client/config/render/binding/OptionBinding.java index 5e597a679f..7eb5692f5e 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/binding/OptionBinding.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/config/render/binding/OptionBinding.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gui.options.binding; +package me.jellysquid.mods.sodium.client.config.render.binding; public interface OptionBinding { void setValue(S storage, T value); diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/binding/compat/VanillaBooleanOptionBinding.java b/src/main/java/me/jellysquid/mods/sodium/client/config/render/binding/compat/VanillaBooleanOptionBinding.java similarity index 80% rename from src/main/java/me/jellysquid/mods/sodium/client/gui/options/binding/compat/VanillaBooleanOptionBinding.java rename to src/main/java/me/jellysquid/mods/sodium/client/config/render/binding/compat/VanillaBooleanOptionBinding.java index e7f43dfe3d..c9fb926f33 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/binding/compat/VanillaBooleanOptionBinding.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/config/render/binding/compat/VanillaBooleanOptionBinding.java @@ -1,6 +1,6 @@ -package me.jellysquid.mods.sodium.client.gui.options.binding.compat; +package me.jellysquid.mods.sodium.client.config.render.binding.compat; -import me.jellysquid.mods.sodium.client.gui.options.binding.OptionBinding; +import me.jellysquid.mods.sodium.client.config.render.binding.OptionBinding; import net.minecraft.client.option.CyclingOption; import net.minecraft.client.option.GameOptions; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/storage/MinecraftOptionsStorage.java b/src/main/java/me/jellysquid/mods/sodium/client/config/render/storage/MinecraftOptionsStorage.java similarity index 90% rename from src/main/java/me/jellysquid/mods/sodium/client/gui/options/storage/MinecraftOptionsStorage.java rename to src/main/java/me/jellysquid/mods/sodium/client/config/render/storage/MinecraftOptionsStorage.java index 30663f78db..bb0f149d16 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/storage/MinecraftOptionsStorage.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/config/render/storage/MinecraftOptionsStorage.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gui.options.storage; +package me.jellysquid.mods.sodium.client.config.render.storage; import me.jellysquid.mods.sodium.client.SodiumClientMod; import net.minecraft.client.MinecraftClient; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/storage/OptionStorage.java b/src/main/java/me/jellysquid/mods/sodium/client/config/render/storage/OptionStorage.java similarity index 53% rename from src/main/java/me/jellysquid/mods/sodium/client/gui/options/storage/OptionStorage.java rename to src/main/java/me/jellysquid/mods/sodium/client/config/render/storage/OptionStorage.java index a2e4966da2..cadf29819a 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/storage/OptionStorage.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/config/render/storage/OptionStorage.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gui.options.storage; +package me.jellysquid.mods.sodium.client.config.render.storage; public interface OptionStorage { T getData(); diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/storage/SodiumOptionsStorage.java b/src/main/java/me/jellysquid/mods/sodium/client/config/render/storage/SodiumOptionsStorage.java similarity index 72% rename from src/main/java/me/jellysquid/mods/sodium/client/gui/options/storage/SodiumOptionsStorage.java rename to src/main/java/me/jellysquid/mods/sodium/client/config/render/storage/SodiumOptionsStorage.java index ed0ea97a0a..b72648c6d4 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/storage/SodiumOptionsStorage.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/config/render/storage/SodiumOptionsStorage.java @@ -1,19 +1,19 @@ -package me.jellysquid.mods.sodium.client.gui.options.storage; +package me.jellysquid.mods.sodium.client.config.render.storage; import me.jellysquid.mods.sodium.client.SodiumClientMod; -import me.jellysquid.mods.sodium.client.gui.SodiumGameOptions; +import me.jellysquid.mods.sodium.client.config.SodiumRenderConfig; import java.io.IOException; -public class SodiumOptionsStorage implements OptionStorage { - private final SodiumGameOptions options; +public class SodiumOptionsStorage implements OptionStorage { + private final SodiumRenderConfig options; public SodiumOptionsStorage() { this.options = SodiumClientMod.options(); } @Override - public SodiumGameOptions getData() { + public SodiumRenderConfig getData() { return this.options; } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/util/ElementRange.java b/src/main/java/me/jellysquid/mods/sodium/client/gl/util/ElementRange.java deleted file mode 100644 index dd86738fbd..0000000000 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/util/ElementRange.java +++ /dev/null @@ -1,6 +0,0 @@ -package me.jellysquid.mods.sodium.client.gl.util; - -import me.jellysquid.mods.sodium.client.gl.tessellation.GlIndexType; - -public record ElementRange(int elementPointer, int elementCount, GlIndexType indexType, int baseVertex) { -} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/util/EnumBit.java b/src/main/java/me/jellysquid/mods/sodium/client/gl/util/EnumBit.java deleted file mode 100644 index 4262177102..0000000000 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/util/EnumBit.java +++ /dev/null @@ -1,5 +0,0 @@ -package me.jellysquid.mods.sodium.client.gl.util; - -public interface EnumBit { - int getBits(); -} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/SodiumOptionsGUI.java b/src/main/java/me/jellysquid/mods/sodium/client/gui/SodiumConfigScreen.java similarity index 92% rename from src/main/java/me/jellysquid/mods/sodium/client/gui/SodiumOptionsGUI.java rename to src/main/java/me/jellysquid/mods/sodium/client/gui/SodiumConfigScreen.java index 0496977957..5111333b13 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gui/SodiumOptionsGUI.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/gui/SodiumConfigScreen.java @@ -1,12 +1,13 @@ package me.jellysquid.mods.sodium.client.gui; import me.jellysquid.mods.sodium.client.SodiumClientMod; -import me.jellysquid.mods.sodium.client.gui.options.*; -import me.jellysquid.mods.sodium.client.gui.options.control.Control; -import me.jellysquid.mods.sodium.client.gui.options.control.ControlElement; -import me.jellysquid.mods.sodium.client.gui.options.storage.OptionStorage; +import me.jellysquid.mods.sodium.client.config.SodiumRenderConfig; +import me.jellysquid.mods.sodium.client.config.render.*; +import me.jellysquid.mods.sodium.client.gui.options.Control; +import me.jellysquid.mods.sodium.client.gui.options.ControlElement; +import me.jellysquid.mods.sodium.client.config.render.storage.OptionStorage; +import me.jellysquid.mods.sodium.client.gui.values.Dim2i; import me.jellysquid.mods.sodium.client.gui.widgets.FlatButtonWidget; -import me.jellysquid.mods.sodium.client.util.Dim2i; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.option.VideoOptionsScreen; @@ -26,7 +27,7 @@ import java.util.List; import java.util.stream.Stream; -public class SodiumOptionsGUI extends Screen { +public class SodiumConfigScreen extends Screen { private final List pages = new ArrayList<>(); private final List> controls = new ArrayList<>(); @@ -41,14 +42,14 @@ public class SodiumOptionsGUI extends Screen { private boolean hasPendingChanges; private ControlElement hoveredElement; - public SodiumOptionsGUI(Screen prevScreen) { + public SodiumConfigScreen(Screen prevScreen) { super(new TranslatableText("Sodium Options")); this.prevScreen = prevScreen; - this.pages.add(SodiumGameOptionPages.general()); - this.pages.add(SodiumGameOptionPages.quality()); - this.pages.add(SodiumGameOptionPages.advanced()); + this.pages.add(SodiumConfigScreenPages.general()); + this.pages.add(SodiumConfigScreenPages.quality()); + this.pages.add(SodiumConfigScreenPages.advanced()); } public void setPage(OptionPage page) { @@ -104,7 +105,7 @@ private void setDonationButtonVisibility(boolean value) { } private void hideDonationButton() { - SodiumGameOptions options = SodiumClientMod.options(); + SodiumRenderConfig options = SodiumClientMod.options(); options.notifications.hideDonationButton = true; try { diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/SodiumGameOptionPages.java b/src/main/java/me/jellysquid/mods/sodium/client/gui/SodiumConfigScreenPages.java similarity index 92% rename from src/main/java/me/jellysquid/mods/sodium/client/gui/SodiumGameOptionPages.java rename to src/main/java/me/jellysquid/mods/sodium/client/gui/SodiumConfigScreenPages.java index f2ce93a235..6733494635 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gui/SodiumGameOptionPages.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/gui/SodiumConfigScreenPages.java @@ -1,16 +1,17 @@ package me.jellysquid.mods.sodium.client.gui; import com.google.common.collect.ImmutableList; -import me.jellysquid.mods.sodium.client.gl.arena.staging.MappedStagingBuffer; -import me.jellysquid.mods.sodium.client.gl.device.RenderDevice; -import me.jellysquid.mods.sodium.client.gui.options.*; -import me.jellysquid.mods.sodium.client.gui.options.binding.compat.VanillaBooleanOptionBinding; -import me.jellysquid.mods.sodium.client.gui.options.control.ControlValueFormatter; -import me.jellysquid.mods.sodium.client.gui.options.control.CyclingControl; -import me.jellysquid.mods.sodium.client.gui.options.control.SliderControl; -import me.jellysquid.mods.sodium.client.gui.options.control.TickBoxControl; -import me.jellysquid.mods.sodium.client.gui.options.storage.MinecraftOptionsStorage; -import me.jellysquid.mods.sodium.client.gui.options.storage.SodiumOptionsStorage; +import me.jellysquid.mods.sodium.client.config.SodiumRenderConfig; +import me.jellysquid.mods.sodium.client.config.render.*; +import me.jellysquid.mods.sodium.client.render.chunk.arena.staging.MappedStagingBuffer; +import me.jellysquid.mods.thingl.device.RenderDevice; +import me.jellysquid.mods.sodium.client.config.render.binding.compat.VanillaBooleanOptionBinding; +import me.jellysquid.mods.sodium.client.gui.options.ControlValueFormatter; +import me.jellysquid.mods.sodium.client.gui.options.CyclingControl; +import me.jellysquid.mods.sodium.client.gui.options.SliderControl; +import me.jellysquid.mods.sodium.client.gui.options.TickBoxControl; +import me.jellysquid.mods.sodium.client.config.render.storage.MinecraftOptionsStorage; +import me.jellysquid.mods.sodium.client.config.render.storage.SodiumOptionsStorage; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gl.Framebuffer; import net.minecraft.client.option.Option; @@ -23,7 +24,7 @@ import java.util.ArrayList; import java.util.List; -public class SodiumGameOptionPages { +public class SodiumConfigScreenPages { private static final SodiumOptionsStorage sodiumOpts = new SodiumOptionsStorage(); private static final MinecraftOptionsStorage vanillaOpts = new MinecraftOptionsStorage(); @@ -155,10 +156,10 @@ public static OptionPage quality() { }, opts -> opts.cloudRenderMode) .setImpact(OptionImpact.LOW) .build()) - .add(OptionImpl.createBuilder(SodiumGameOptions.GraphicsQuality.class, sodiumOpts) + .add(OptionImpl.createBuilder(SodiumRenderConfig.GraphicsQuality.class, sodiumOpts) .setName(new TranslatableText("sodium.options.weather_quality.name")) .setTooltip(new TranslatableText("sodium.options.weather_quality.tooltip")) - .setControl(option -> new CyclingControl<>(option, SodiumGameOptions.GraphicsQuality.class)) + .setControl(option -> new CyclingControl<>(option, SodiumRenderConfig.GraphicsQuality.class)) .setBinding((opts, value) -> opts.quality.weatherQuality = value, opts -> opts.quality.weatherQuality) .setImpact(OptionImpact.MEDIUM) .build()) @@ -169,14 +170,6 @@ public static OptionPage quality() { .setBinding((opts, value) -> opts.particles = value, (opts) -> opts.particles) .setImpact(OptionImpact.MEDIUM) .build()) - .add(OptionImpl.createBuilder(boolean.class, vanillaOpts) - .setName(new TranslatableText("options.ao")) - .setTooltip(new TranslatableText("sodium.options.smooth_lighting.tooltip")) - .setControl(TickBoxControl::new) - .setBinding((opts, value) -> opts.ao = value ? AoMode.MAX : AoMode.OFF, opts -> opts.ao == AoMode.MAX) - .setImpact(OptionImpact.LOW) - .setFlags(OptionFlag.REQUIRES_RENDERER_RELOAD) - .build()) .add(OptionImpl.createBuilder(int.class, vanillaOpts) .setName(new TranslatableText("options.biomeBlendRadius")) .setTooltip(new TranslatableText("sodium.options.biome_blend.tooltip")) @@ -229,10 +222,10 @@ public static OptionPage advanced() { List groups = new ArrayList<>(); groups.add(OptionGroup.createBuilder() - .add(OptionImpl.createBuilder(SodiumGameOptions.ArenaMemoryAllocator.class, sodiumOpts) + .add(OptionImpl.createBuilder(SodiumRenderConfig.ArenaMemoryAllocator.class, sodiumOpts) .setName(new TranslatableText("sodium.options.chunk_memory_allocator.name")) .setTooltip(new TranslatableText("sodium.options.chunk_memory_allocator.tooltip")) - .setControl(option -> new CyclingControl<>(option, SodiumGameOptions.ArenaMemoryAllocator.class)) + .setControl(option -> new CyclingControl<>(option, SodiumRenderConfig.ArenaMemoryAllocator.class)) .setImpact(OptionImpact.HIGH) .setBinding((opts, value) -> opts.advanced.arenaMemoryAllocator = value, opts -> opts.advanced.arenaMemoryAllocator) .setFlags(OptionFlag.REQUIRES_RENDERER_RELOAD) diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/Control.java b/src/main/java/me/jellysquid/mods/sodium/client/gui/options/Control.java new file mode 100644 index 0000000000..ae4f538eb3 --- /dev/null +++ b/src/main/java/me/jellysquid/mods/sodium/client/gui/options/Control.java @@ -0,0 +1,12 @@ +package me.jellysquid.mods.sodium.client.gui.options; + +import me.jellysquid.mods.sodium.client.config.render.Option; +import me.jellysquid.mods.sodium.client.gui.values.Dim2i; + +public interface Control { + Option getOption(); + + ControlElement createElement(Dim2i dim); + + int getMaxWidth(); +} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/control/ControlElement.java b/src/main/java/me/jellysquid/mods/sodium/client/gui/options/ControlElement.java similarity index 89% rename from src/main/java/me/jellysquid/mods/sodium/client/gui/options/control/ControlElement.java rename to src/main/java/me/jellysquid/mods/sodium/client/gui/options/ControlElement.java index 7750341a6f..ead8b25f01 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/control/ControlElement.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/gui/options/ControlElement.java @@ -1,10 +1,9 @@ -package me.jellysquid.mods.sodium.client.gui.options.control; +package me.jellysquid.mods.sodium.client.gui.options; -import me.jellysquid.mods.sodium.client.gui.options.Option; +import me.jellysquid.mods.sodium.client.config.render.Option; import me.jellysquid.mods.sodium.client.gui.widgets.AbstractWidget; -import me.jellysquid.mods.sodium.client.util.Dim2i; +import me.jellysquid.mods.sodium.client.gui.values.Dim2i; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.Text; import net.minecraft.util.Formatting; public class ControlElement extends AbstractWidget { diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/control/ControlValueFormatter.java b/src/main/java/me/jellysquid/mods/sodium/client/gui/options/ControlValueFormatter.java similarity index 96% rename from src/main/java/me/jellysquid/mods/sodium/client/gui/options/control/ControlValueFormatter.java rename to src/main/java/me/jellysquid/mods/sodium/client/gui/options/ControlValueFormatter.java index 8dd3849dc5..c0fa89fe11 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/control/ControlValueFormatter.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/gui/options/ControlValueFormatter.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gui.options.control; +package me.jellysquid.mods.sodium.client.gui.options; import net.minecraft.text.TranslatableText; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/control/CyclingControl.java b/src/main/java/me/jellysquid/mods/sodium/client/gui/options/CyclingControl.java similarity index 93% rename from src/main/java/me/jellysquid/mods/sodium/client/gui/options/control/CyclingControl.java rename to src/main/java/me/jellysquid/mods/sodium/client/gui/options/CyclingControl.java index 538b736796..628ba943c3 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/control/CyclingControl.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/gui/options/CyclingControl.java @@ -1,8 +1,8 @@ -package me.jellysquid.mods.sodium.client.gui.options.control; +package me.jellysquid.mods.sodium.client.gui.options; -import me.jellysquid.mods.sodium.client.gui.options.Option; -import me.jellysquid.mods.sodium.client.gui.options.TextProvider; -import me.jellysquid.mods.sodium.client.util.Dim2i; +import me.jellysquid.mods.sodium.client.config.render.Option; +import me.jellysquid.mods.sodium.client.util.TextProvider; +import me.jellysquid.mods.sodium.client.gui.values.Dim2i; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.LiteralText; import net.minecraft.text.Text; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/control/SliderControl.java b/src/main/java/me/jellysquid/mods/sodium/client/gui/options/SliderControl.java similarity index 97% rename from src/main/java/me/jellysquid/mods/sodium/client/gui/options/control/SliderControl.java rename to src/main/java/me/jellysquid/mods/sodium/client/gui/options/SliderControl.java index 7f4d06d36f..d2f5f54590 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/control/SliderControl.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/gui/options/SliderControl.java @@ -1,7 +1,7 @@ -package me.jellysquid.mods.sodium.client.gui.options.control; +package me.jellysquid.mods.sodium.client.gui.options; -import me.jellysquid.mods.sodium.client.gui.options.Option; -import me.jellysquid.mods.sodium.client.util.Dim2i; +import me.jellysquid.mods.sodium.client.config.render.Option; +import me.jellysquid.mods.sodium.client.gui.values.Dim2i; import net.minecraft.client.util.math.Rect2i; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.math.MathHelper; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/control/TickBoxControl.java b/src/main/java/me/jellysquid/mods/sodium/client/gui/options/TickBoxControl.java similarity index 94% rename from src/main/java/me/jellysquid/mods/sodium/client/gui/options/control/TickBoxControl.java rename to src/main/java/me/jellysquid/mods/sodium/client/gui/options/TickBoxControl.java index 6dfba2584a..1d32ff0ed2 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/control/TickBoxControl.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/gui/options/TickBoxControl.java @@ -1,7 +1,7 @@ -package me.jellysquid.mods.sodium.client.gui.options.control; +package me.jellysquid.mods.sodium.client.gui.options; -import me.jellysquid.mods.sodium.client.gui.options.Option; -import me.jellysquid.mods.sodium.client.util.Dim2i; +import me.jellysquid.mods.sodium.client.config.render.Option; +import me.jellysquid.mods.sodium.client.gui.values.Dim2i; import net.minecraft.client.util.math.Rect2i; import net.minecraft.client.util.math.MatrixStack; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/control/Control.java b/src/main/java/me/jellysquid/mods/sodium/client/gui/options/control/Control.java deleted file mode 100644 index 28931db824..0000000000 --- a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/control/Control.java +++ /dev/null @@ -1,12 +0,0 @@ -package me.jellysquid.mods.sodium.client.gui.options.control; - -import me.jellysquid.mods.sodium.client.gui.options.Option; -import me.jellysquid.mods.sodium.client.util.Dim2i; - -public interface Control { - Option getOption(); - - ControlElement createElement(Dim2i dim); - - int getMaxWidth(); -} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/util/Dim2i.java b/src/main/java/me/jellysquid/mods/sodium/client/gui/values/Dim2i.java similarity index 90% rename from src/main/java/me/jellysquid/mods/sodium/client/util/Dim2i.java rename to src/main/java/me/jellysquid/mods/sodium/client/gui/values/Dim2i.java index 3ef2af1cc3..0c0f351996 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/util/Dim2i.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/gui/values/Dim2i.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.util; +package me.jellysquid.mods.sodium.client.gui.values; public record Dim2i(int x, int y, int width, int height) { public int getLimitX() { diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/widgets/FlatButtonWidget.java b/src/main/java/me/jellysquid/mods/sodium/client/gui/widgets/FlatButtonWidget.java index f638784af0..dc066b0969 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gui/widgets/FlatButtonWidget.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/gui/widgets/FlatButtonWidget.java @@ -1,6 +1,6 @@ package me.jellysquid.mods.sodium.client.gui.widgets; -import me.jellysquid.mods.sodium.client.util.Dim2i; +import me.jellysquid.mods.sodium.client.gui.values.Dim2i; import net.minecraft.client.gui.Drawable; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/SodiumRenderer.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/SodiumRenderer.java new file mode 100644 index 0000000000..ebf3df9d93 --- /dev/null +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/SodiumRenderer.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.jellysquid.mods.sodium.client.interop.fabric; + +import me.jellysquid.mods.sodium.client.interop.fabric.material.MaterialFinderImpl; +import me.jellysquid.mods.sodium.client.interop.fabric.material.RenderMaterialValue; +import net.fabricmc.fabric.api.renderer.v1.Renderer; +import net.fabricmc.fabric.api.renderer.v1.material.MaterialFinder; +import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial; +import net.fabricmc.fabric.api.renderer.v1.mesh.MeshBuilder; +import me.jellysquid.mods.sodium.client.interop.fabric.mesh.MeshBuilderImpl; +import net.minecraft.util.Identifier; + +import java.util.HashMap; + +/** + * The Fabric default renderer implementation. Supports all + * features defined in the API except shaders and offers no special materials. + */ +public class SodiumRenderer implements Renderer { + public static final SodiumRenderer INSTANCE = new SodiumRenderer(); + + public static final RenderMaterialValue MATERIAL_STANDARD = (RenderMaterialValue) INSTANCE.materialFinder().find(); + + static { + INSTANCE.registerMaterial(RenderMaterial.MATERIAL_STANDARD, MATERIAL_STANDARD); + } + + private final HashMap materialMap = new HashMap<>(); + + private SodiumRenderer() { + } + + @Override + public MeshBuilder meshBuilder() { + return new MeshBuilderImpl(); + } + + @Override + public MaterialFinder materialFinder() { + return new MaterialFinderImpl(); + } + + @Override + public RenderMaterial materialById(Identifier id) { + return this.materialMap.get(id); + } + + @Override + public boolean registerMaterial(Identifier id, RenderMaterial material) { + if (this.materialMap.containsKey(id)) { + return false; + } + + // cast to prevent acceptance of impostor implementations + this.materialMap.put(id, material); + + return true; + } +} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/helper/ColorHelper.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/helper/ColorHelper.java new file mode 100644 index 0000000000..5c2b3b96b7 --- /dev/null +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/helper/ColorHelper.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.jellysquid.mods.sodium.client.interop.fabric.helper; + +/** + * Static routines of general utility for renderer implementations. + * Renderers are not required to use these helpers, but they were + * designed to be usable without the default renderer. + */ +public abstract class ColorHelper { + private ColorHelper() { } + + /** + * Component-wise max. + */ + public static int maxBrightness(int b0, int b1) { + if (b0 == 0) return b1; + if (b1 == 0) return b0; + + return Math.max(b0 & 0x0000FFFF, b1 & 0x0000FFFF) | + Math.max(b0 & 0xFFFF0000, b1 & 0xFFFF0000); + } +} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/helper/GeometryHelper.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/helper/GeometryHelper.java new file mode 100644 index 0000000000..a6c1f564bf --- /dev/null +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/helper/GeometryHelper.java @@ -0,0 +1,230 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.jellysquid.mods.sodium.client.interop.fabric.helper; + +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView; +import net.minecraft.client.render.model.BakedQuad; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Direction.Axis; +import net.minecraft.util.math.Direction.AxisDirection; +import net.minecraft.util.math.Vec3f; +import org.jetbrains.annotations.NotNull; + +import static net.minecraft.util.math.MathHelper.approximatelyEquals; + +/** + * Static routines of general utility for renderer implementations. + * Renderers are not required to use these helpers, but they were + * designed to be usable without the default renderer. + */ +public abstract class GeometryHelper { + private GeometryHelper() { + } + + /** + * set when a quad touches all four corners of a unit cube. + */ + public static final int CUBIC_FLAG = 1; + + /** + * set when a quad is parallel to (but not necessarily on) a its light face. + */ + public static final int AXIS_ALIGNED_FLAG = CUBIC_FLAG << 1; + + /** + * set when a quad is coplanar with its light face. Implies {@link #AXIS_ALIGNED_FLAG} + */ + public static final int LIGHT_FACE_FLAG = AXIS_ALIGNED_FLAG << 1; + + /** + * how many bits quad header encoding should reserve for encoding geometry flags. + */ + public static final int FLAG_BIT_COUNT = 3; + + private static final float EPS_MIN = 0.0001f; + private static final float EPS_MAX = 1.0f - EPS_MIN; + + /** + * Analyzes the quad and returns a value with some combination + * of {@link #AXIS_ALIGNED_FLAG}, {@link #LIGHT_FACE_FLAG} and {@link #CUBIC_FLAG}. + * Intended use is to optimize lighting when the geometry is regular. + * Expects convex quads with all points co-planar. + */ + public static int computeShapeFlags(QuadView quad) { + Direction lightFace = quad.lightFace(); + int bits = 0; + + if (isQuadParallelToFace(lightFace, quad)) { + bits |= AXIS_ALIGNED_FLAG; + + if (isParallelQuadOnFace(lightFace, quad)) { + bits |= LIGHT_FACE_FLAG; + } + } + + if (isQuadCubic(lightFace, quad)) { + bits |= CUBIC_FLAG; + } + + return bits; + } + + /** + * Returns true if quad is parallel to the given face. + * Does not validate quad winding order. + * Expects convex quads with all points co-planar. + */ + public static boolean isQuadParallelToFace(Direction face, QuadView quad) { + if (face == null) { + return false; + } + + int i = face.getAxis().ordinal(); + final float val = quad.posByIndex(0, i); + return approximatelyEquals(val, quad.posByIndex(1, i)) && approximatelyEquals(val, quad.posByIndex(2, i)) && approximatelyEquals(val, quad.posByIndex(3, i)); + } + + /** + * True if quad - already known to be parallel to a face - is actually coplanar with it. + * For compatibility with vanilla resource packs, also true if quad is outside the face. + * + *

Test will be unreliable if not already parallel, use {@link #isQuadParallelToFace(Direction, QuadView)} + * for that purpose. Expects convex quads with all points co-planar. + */ + public static boolean isParallelQuadOnFace(Direction lightFace, QuadView quad) { + if (lightFace == null) return false; + + final float x = quad.posByIndex(0, lightFace.getAxis().ordinal()); + return lightFace.getDirection() == AxisDirection.POSITIVE ? x >= EPS_MAX : x <= EPS_MIN; + } + + /** + * Returns true if quad is truly a quad (not a triangle) and fills a full block cross-section. + * If known to be true, allows use of a simpler/faster AO lighting algorithm. + * + *

Does not check if quad is actually coplanar with the light face, nor does it check that all + * quad vertices are coplanar with each other. + * + *

Expects convex quads with all points co-planar. + * + * @param lightFace MUST be non-null. + */ + public static boolean isQuadCubic(@NotNull Direction lightFace, QuadView quad) { + int a, b; + + switch (lightFace) { + case EAST: + case WEST: + a = 1; + b = 2; + break; + case UP: + case DOWN: + a = 0; + b = 2; + break; + case SOUTH: + case NORTH: + a = 1; + b = 0; + break; + default: + // handle WTF case + return false; + } + + return confirmSquareCorners(a, b, quad); + } + + /** + * Used by {@link #isQuadCubic(Direction, QuadView)}. + * True if quad touches all four corners of unit square. + * + *

For compatibility with resource packs that contain models with quads exceeding + * block boundaries, considers corners outside the block to be at the corners. + */ + private static boolean confirmSquareCorners(int aCoordinate, int bCoordinate, QuadView quad) { + int flags = 0; + + for (int i = 0; i < 4; i++) { + final float a = quad.posByIndex(i, aCoordinate); + final float b = quad.posByIndex(i, bCoordinate); + + if (a <= EPS_MIN) { + if (b <= EPS_MIN) { + flags |= 1; + } else if (b >= EPS_MAX) { + flags |= 2; + } else { + return false; + } + } else if (a >= EPS_MAX) { + if (b <= EPS_MIN) { + flags |= 4; + } else if (b >= EPS_MAX) { + flags |= 8; + } else { + return false; + } + } else { + return false; + } + } + + return flags == 15; + } + + /** + * Identifies the face to which the quad is most closely aligned. + * This mimics the value that {@link BakedQuad#getFace()} returns, and is + * used in the vanilla renderer for all diffuse lighting. + * + *

Derived from the quad face normal and expects convex quads with all points co-planar. + */ + public static Direction lightFace(QuadView quad) { + final Vec3f normal = quad.faceNormal(); + return switch (GeometryHelper.longestAxis(normal)) { + case X -> normal.getX() > 0 ? Direction.EAST : Direction.WEST; + case Y -> normal.getY() > 0 ? Direction.UP : Direction.DOWN; + case Z -> normal.getZ() > 0 ? Direction.SOUTH : Direction.NORTH; + }; + } + + /** + * @see #longestAxis(float, float, float) + */ + public static Axis longestAxis(Vec3f vec) { + return longestAxis(vec.getX(), vec.getY(), vec.getZ()); + } + + /** + * Identifies the largest (max absolute magnitude) component (X, Y, Z) in the given vector. + */ + public static Axis longestAxis(float normalX, float normalY, float normalZ) { + Axis result = Axis.Y; + float longest = Math.abs(normalY); + float a = Math.abs(normalX); + + if (a > longest) { + result = Axis.X; + longest = a; + } + + return Math.abs(normalZ) > longest + ? Axis.Z : result; + } +} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/helper/NormalHelper.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/helper/NormalHelper.java new file mode 100644 index 0000000000..f9193c1c08 --- /dev/null +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/helper/NormalHelper.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.jellysquid.mods.sodium.client.interop.fabric.helper; + +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Vec3f; +import net.minecraft.util.math.Vec3i; +import org.jetbrains.annotations.NotNull; + +/** + * Static routines of general utility for renderer implementations. + * Renderers are not required to use these helpers, but they were + * designed to be usable without the default renderer. + */ +public class NormalHelper { + /** + * Computes the face normal of the given quad and saves it in the provided non-null vector. + * If {@link QuadView#nominalFace()} is set will optimize by confirming quad is parallel to that + * face and, if so, use the standard normal for that face direction. + * + *

Will work with triangles also. Assumes counter-clockwise winding order, which is the norm. + * Expects convex quads with all points co-planar. + */ + public static void computeFaceNormal(@NotNull Vec3f saveTo, QuadView q) { + final Direction nominalFace = q.nominalFace(); + + if (GeometryHelper.isQuadParallelToFace(nominalFace, q)) { + Vec3i vec = nominalFace.getVector(); + saveTo.set(vec.getX(), vec.getY(), vec.getZ()); + return; + } + + final float x0 = q.x(0); + final float y0 = q.y(0); + final float z0 = q.z(0); + final float x1 = q.x(1); + final float y1 = q.y(1); + final float z1 = q.z(1); + final float x2 = q.x(2); + final float y2 = q.y(2); + final float z2 = q.z(2); + final float x3 = q.x(3); + final float y3 = q.y(3); + final float z3 = q.z(3); + + final float dx0 = x2 - x0; + final float dy0 = y2 - y0; + final float dz0 = z2 - z0; + final float dx1 = x3 - x1; + final float dy1 = y3 - y1; + final float dz1 = z3 - z1; + + float normX = dy0 * dz1 - dz0 * dy1; + float normY = dz0 * dx1 - dx0 * dz1; + float normZ = dx0 * dy1 - dy0 * dx1; + + float l = (float) Math.sqrt(normX * normX + normY * normY + normZ * normZ); + + if (l != 0) { + normX /= l; + normY /= l; + normZ /= l; + } + + saveTo.set(normX, normY, normZ); + } +} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/helper/TextureHelper.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/helper/TextureHelper.java new file mode 100644 index 0000000000..56cb790db6 --- /dev/null +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/helper/TextureHelper.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.jellysquid.mods.sodium.client.interop.fabric.helper; + +import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; +import net.minecraft.client.texture.Sprite; +import net.minecraft.util.math.Direction; + +/** + * Handles most texture-baking use cases for model loaders and model libraries + * via {@link #bakeSprite(MutableQuadView, int, Sprite, int)}. Also used by the API + * itself to implement automatic block-breaking models for enhanced models. + */ +public class TextureHelper { + private TextureHelper() { + } + + private static final float NORMALIZER = 1f / 16f; + + /** + * Bakes textures in the provided vertex data, handling UV locking, + * rotation, interpolation, etc. Textures must not be already baked. + */ + public static void bakeSprite(MutableQuadView quad, int spriteIndex, Sprite sprite, int bakeFlags) { + if (quad.nominalFace() != null && (MutableQuadView.BAKE_LOCK_UV & bakeFlags) != 0) { + // Assigns normalized UV coordinates based on vertex positions + applyModifier(quad, spriteIndex, UVLOCKERS[quad.nominalFace().getId()]); + } else if ((MutableQuadView.BAKE_NORMALIZED & bakeFlags) == 0) { + // Scales from 0-16 to 0-1 + applyModifier(quad, spriteIndex, (q, i, t) -> q.sprite(i, t, q.spriteU(i, t) * NORMALIZER, q.spriteV(i, t) * NORMALIZER)); + } + + final int rotation = bakeFlags & 3; + + if (rotation != 0) { + // Rotates texture around the center of sprite. + // Assumes normalized coordinates. + applyModifier(quad, spriteIndex, ROTATIONS[rotation]); + } + + if ((MutableQuadView.BAKE_FLIP_U & bakeFlags) != 0) { + // Inverts U coordinates. Assumes normalized (0-1) values. + applyModifier(quad, spriteIndex, (q, i, t) -> q.sprite(i, t, 1 - q.spriteU(i, t), q.spriteV(i, t))); + } + + if ((MutableQuadView.BAKE_FLIP_V & bakeFlags) != 0) { + // Inverts V coordinates. Assumes normalized (0-1) values. + applyModifier(quad, spriteIndex, (q, i, t) -> q.sprite(i, t, q.spriteU(i, t), 1 - q.spriteV(i, t))); + } + + interpolate(quad, spriteIndex, sprite); + } + + /** + * Faster than sprite method. Sprite computes span and normalizes inputs each call, + * so we'd have to denormalize before we called, only to have the sprite renormalize immediately. + */ + private static void interpolate(MutableQuadView q, int spriteIndex, Sprite sprite) { + final float uMin = sprite.getMinU(); + final float uSpan = sprite.getMaxU() - uMin; + final float vMin = sprite.getMinV(); + final float vSpan = sprite.getMaxV() - vMin; + + for (int i = 0; i < 4; i++) { + q.sprite(i, spriteIndex, uMin + q.spriteU(i, spriteIndex) * uSpan, vMin + q.spriteV(i, spriteIndex) * vSpan); + } + } + + @FunctionalInterface + private interface VertexModifier { + void apply(MutableQuadView quad, int vertexIndex, int spriteIndex); + } + + private static void applyModifier(MutableQuadView quad, int spriteIndex, VertexModifier modifier) { + for (int i = 0; i < 4; i++) { + modifier.apply(quad, i, spriteIndex); + } + } + + private static final VertexModifier[] ROTATIONS = new VertexModifier[] { null, (q, i, t) -> q.sprite(i, t, q.spriteV(i, t), q.spriteU(i, t)), //90 + (q, i, t) -> q.sprite(i, t, 1 - q.spriteU(i, t), 1 - q.spriteV(i, t)), //180 + (q, i, t) -> q.sprite(i, t, 1 - q.spriteV(i, t), q.spriteU(i, t)) // 270 + }; + + private static final VertexModifier[] UVLOCKERS = new VertexModifier[6]; + + static { + UVLOCKERS[Direction.EAST.getId()] = (q, i, t) -> q.sprite(i, t, 1 - q.z(i), 1 - q.y(i)); + UVLOCKERS[Direction.WEST.getId()] = (q, i, t) -> q.sprite(i, t, q.z(i), 1 - q.y(i)); + UVLOCKERS[Direction.NORTH.getId()] = (q, i, t) -> q.sprite(i, t, 1 - q.x(i), 1 - q.y(i)); + UVLOCKERS[Direction.SOUTH.getId()] = (q, i, t) -> q.sprite(i, t, q.x(i), 1 - q.y(i)); + UVLOCKERS[Direction.DOWN.getId()] = (q, i, t) -> q.sprite(i, t, q.x(i), 1 - q.z(i)); + UVLOCKERS[Direction.UP.getId()] = (q, i, t) -> q.sprite(i, t, q.x(i), q.z(i)); + } +} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/material/MaterialFinderImpl.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/material/MaterialFinderImpl.java new file mode 100644 index 0000000000..db9368b1cc --- /dev/null +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/material/MaterialFinderImpl.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.jellysquid.mods.sodium.client.interop.fabric.material; + +import com.google.common.base.Preconditions; +import net.fabricmc.fabric.api.renderer.v1.material.BlendMode; +import net.fabricmc.fabric.api.renderer.v1.material.MaterialFinder; +import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial; + +public class MaterialFinderImpl extends RenderMaterialFlags implements MaterialFinder { + @Override + public RenderMaterial find() { + return RenderMaterialValue.byIndex(this.bits); + } + + @Override + public MaterialFinder clear() { + this.bits = 0; + return this; + } + + @Override + public MaterialFinder blendMode(int textureIndex, BlendMode blendMode) { + if (blendMode == null) { + blendMode = BlendMode.DEFAULT; + } + + this.bits = (this.bits & ~BLEND_MODE_MASK) | blendMode.ordinal(); + return this; + } + + @Override + public MaterialFinder disableColorIndex(int textureIndex, boolean disable) { + this.bits = disable ? (this.bits | COLOR_DISABLE_FLAG) : (this.bits & ~COLOR_DISABLE_FLAG); + return this; + } + + @Override + public MaterialFinder spriteDepth(int depth) { + Preconditions.checkArgument(depth == 1, "Unsupported sprite depth: %s", depth); + + return this; + } + + @Override + public MaterialFinder emissive(int textureIndex, boolean isEmissive) { + this.bits = isEmissive ? (this.bits | EMISSIVE_FLAG) : (this.bits & ~EMISSIVE_FLAG); + return this; + } + + @Override + public MaterialFinder disableDiffuse(int textureIndex, boolean disable) { + this.bits = disable ? (this.bits | DIFFUSE_FLAG) : (this.bits & ~DIFFUSE_FLAG); + return this; + } + + @Override + public MaterialFinder disableAo(int textureIndex, boolean disable) { + this.bits = disable ? (this.bits | AO_FLAG) : (this.bits & ~AO_FLAG); + return this; + } +} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/material/RenderMaterialFlags.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/material/RenderMaterialFlags.java new file mode 100644 index 0000000000..1815a18ec5 --- /dev/null +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/material/RenderMaterialFlags.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.jellysquid.mods.sodium.client.interop.fabric.material; + +import net.fabricmc.fabric.api.renderer.v1.material.BlendMode; +import net.minecraft.util.math.MathHelper; + +/** + * Default implementation of the standard render materials. + * The underlying representation is simply an int with bit-wise + * packing of the various material properties. This offers + * easy/fast interning via int/object hashmap. + */ +public abstract class RenderMaterialFlags { + public static final BlendMode[] BLEND_MODES = BlendMode.values(); + + public static final int BLEND_MODE_MASK = MathHelper.smallestEncompassingPowerOfTwo(BLEND_MODES.length) - 1; + + public static final int COLOR_DISABLE_FLAG = BLEND_MODE_MASK + 1; + public static final int EMISSIVE_FLAG = COLOR_DISABLE_FLAG << 1; + public static final int DIFFUSE_FLAG = EMISSIVE_FLAG << 1; + public static final int AO_FLAG = DIFFUSE_FLAG << 1; + public static final int VALUE_COUNT = (AO_FLAG << 1); + + protected int bits; + + public BlendMode blendMode(int textureIndex) { + return BLEND_MODES[this.bits & BLEND_MODE_MASK]; + } + + public boolean disableColorIndex(int textureIndex) { + return (this.bits & COLOR_DISABLE_FLAG) != 0; + } + + public int spriteDepth() { + return 1; + } + + public boolean emissive(int textureIndex) { + return (this.bits & EMISSIVE_FLAG) != 0; + } + + public boolean disableDiffuse(int textureIndex) { + return (this.bits & DIFFUSE_FLAG) != 0; + } + + public boolean disableAo(int textureIndex) { + return (this.bits & AO_FLAG) != 0; + } + +} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/material/RenderMaterialValue.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/material/RenderMaterialValue.java new file mode 100644 index 0000000000..84629d5893 --- /dev/null +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/material/RenderMaterialValue.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.jellysquid.mods.sodium.client.interop.fabric.material; + +import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial; + +public class RenderMaterialValue extends RenderMaterialFlags implements RenderMaterial { + private static final RenderMaterialValue[] VALUES = new RenderMaterialValue[VALUE_COUNT]; + + static { + for (int i = 0; i < VALUE_COUNT; i++) { + VALUES[i] = new RenderMaterialValue(i); + } + } + + RenderMaterialValue(int bits) { + this.bits = bits; + } + + public int index() { + return this.bits; + } + + public static RenderMaterialValue byIndex(int index) { + return VALUES[index]; + } +} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/mesh/EncodingFormat.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/mesh/EncodingFormat.java new file mode 100644 index 0000000000..a4e76d1dee --- /dev/null +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/mesh/EncodingFormat.java @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.jellysquid.mods.sodium.client.interop.fabric.mesh; + +import com.google.common.base.Preconditions; +import me.jellysquid.mods.sodium.client.interop.fabric.material.RenderMaterialFlags; +import me.jellysquid.mods.sodium.client.interop.fabric.material.RenderMaterialValue; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView; +import net.fabricmc.fabric.api.renderer.v1.model.ModelHelper; +import me.jellysquid.mods.sodium.client.interop.fabric.helper.GeometryHelper; +import net.minecraft.client.render.VertexFormat; +import net.minecraft.client.render.VertexFormats; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.MathHelper; + +/** + * Holds all the array offsets and bit-wise encoders/decoders for + * packing/unpacking quad data in an array of integers. + * All of this is implementation-specific - that's why it isn't a "helper" class. + */ +public abstract class EncodingFormat { + private EncodingFormat() { + } + + static final int HEADER_BITS = 0; + static final int HEADER_COLOR_INDEX = 1; + static final int HEADER_TAG = 2; + public static final int HEADER_STRIDE = 3; + + static final int VERTEX_X; + static final int VERTEX_Y; + static final int VERTEX_Z; + static final int VERTEX_COLOR; + static final int VERTEX_U; + static final int VERTEX_V; + static final int VERTEX_LIGHTMAP; + static final int VERTEX_NORMAL; + public static final int VERTEX_STRIDE; + + public static final int QUAD_STRIDE; + public static final int QUAD_STRIDE_BYTES; + public static final int TOTAL_STRIDE; + + static { + final VertexFormat format = VertexFormats.POSITION_COLOR_TEXTURE_LIGHT_NORMAL; + VERTEX_X = HEADER_STRIDE + 0; + VERTEX_Y = HEADER_STRIDE + 1; + VERTEX_Z = HEADER_STRIDE + 2; + VERTEX_COLOR = HEADER_STRIDE + 3; + VERTEX_U = HEADER_STRIDE + 4; + VERTEX_V = VERTEX_U + 1; + VERTEX_LIGHTMAP = HEADER_STRIDE + 6; + VERTEX_NORMAL = HEADER_STRIDE + 7; + VERTEX_STRIDE = format.getVertexSizeInteger(); + QUAD_STRIDE = VERTEX_STRIDE * 4; + QUAD_STRIDE_BYTES = QUAD_STRIDE * 4; + TOTAL_STRIDE = HEADER_STRIDE + QUAD_STRIDE; + + Preconditions.checkState(VERTEX_STRIDE == QuadView.VANILLA_VERTEX_STRIDE, "Indigo vertex stride (%s) mismatched with rendering API (%s)", VERTEX_STRIDE, QuadView.VANILLA_VERTEX_STRIDE); + Preconditions.checkState(QUAD_STRIDE == QuadView.VANILLA_QUAD_STRIDE, "Indigo quad stride (%s) mismatched with rendering API (%s)", QUAD_STRIDE, QuadView.VANILLA_QUAD_STRIDE); + } + + /** + * used for quick clearing of quad buffers. + */ + static final int[] EMPTY = new int[TOTAL_STRIDE]; + + private static final int DIRECTION_MASK = MathHelper.smallestEncompassingPowerOfTwo(ModelHelper.NULL_FACE_ID) - 1; + private static final int DIRECTION_BIT_COUNT = Integer.bitCount(DIRECTION_MASK); + private static final int CULL_SHIFT = 0; + private static final int CULL_INVERSE_MASK = ~(DIRECTION_MASK << CULL_SHIFT); + private static final int LIGHT_SHIFT = CULL_SHIFT + DIRECTION_BIT_COUNT; + private static final int LIGHT_INVERSE_MASK = ~(DIRECTION_MASK << LIGHT_SHIFT); + private static final int NORMALS_SHIFT = LIGHT_SHIFT + DIRECTION_BIT_COUNT; + private static final int NORMALS_COUNT = 4; + private static final int NORMALS_MASK = (1 << NORMALS_COUNT) - 1; + private static final int NORMALS_INVERSE_MASK = ~(NORMALS_MASK << NORMALS_SHIFT); + private static final int GEOMETRY_SHIFT = NORMALS_SHIFT + NORMALS_COUNT; + private static final int GEOMETRY_MASK = (1 << GeometryHelper.FLAG_BIT_COUNT) - 1; + private static final int GEOMETRY_INVERSE_MASK = ~(GEOMETRY_MASK << GEOMETRY_SHIFT); + private static final int MATERIAL_SHIFT = GEOMETRY_SHIFT + GeometryHelper.FLAG_BIT_COUNT; + private static final int MATERIAL_MASK = MathHelper.smallestEncompassingPowerOfTwo(RenderMaterialFlags.VALUE_COUNT) - 1; + private static final int MATERIAL_BIT_COUNT = Integer.bitCount(MATERIAL_MASK); + private static final int MATERIAL_INVERSE_MASK = ~(MATERIAL_MASK << MATERIAL_SHIFT); + + static { + Preconditions.checkArgument(MATERIAL_SHIFT + MATERIAL_BIT_COUNT <= 32, "Indigo header encoding bit count (%s) exceeds integer bit length)", TOTAL_STRIDE); + } + + static Direction cullFace(int bits) { + return ModelHelper.faceFromIndex((bits >> CULL_SHIFT) & DIRECTION_MASK); + } + + static int cullFace(int bits, Direction face) { + return (bits & CULL_INVERSE_MASK) | (ModelHelper.toFaceIndex(face) << CULL_SHIFT); + } + + static Direction lightFace(int bits) { + return ModelHelper.faceFromIndex((bits >> LIGHT_SHIFT) & DIRECTION_MASK); + } + + static int lightFace(int bits, Direction face) { + return (bits & LIGHT_INVERSE_MASK) | (ModelHelper.toFaceIndex(face) << LIGHT_SHIFT); + } + + /** + * indicate if vertex normal has been set - bits correspond to vertex ordinals. + */ + static int normalFlags(int bits) { + return (bits >> NORMALS_SHIFT) & NORMALS_MASK; + } + + static int normalFlags(int bits, int normalFlags) { + return (bits & NORMALS_INVERSE_MASK) | ((normalFlags & NORMALS_MASK) << NORMALS_SHIFT); + } + + static int geometryFlags(int bits) { + return (bits >> GEOMETRY_SHIFT) & GEOMETRY_MASK; + } + + static int geometryFlags(int bits, int geometryFlags) { + return (bits & GEOMETRY_INVERSE_MASK) | ((geometryFlags & GEOMETRY_MASK) << GEOMETRY_SHIFT); + } + + static RenderMaterialValue material(int bits) { + return RenderMaterialValue.byIndex((bits >> MATERIAL_SHIFT) & MATERIAL_MASK); + } + + static int material(int bits, RenderMaterialValue material) { + return (bits & MATERIAL_INVERSE_MASK) | (material.index() << MATERIAL_SHIFT); + } +} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/mesh/MeshBuilderImpl.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/mesh/MeshBuilderImpl.java new file mode 100644 index 0000000000..e601841a97 --- /dev/null +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/mesh/MeshBuilderImpl.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.jellysquid.mods.sodium.client.interop.fabric.mesh; + +import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; +import net.fabricmc.fabric.api.renderer.v1.mesh.MeshBuilder; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; + +/** + * Our implementation of {@link MeshBuilder}, used for static mesh creation and baking. + * Not much to it - mainly it just needs to grow the int[] array as quads are appended + * and maintain/provide a properly-configured {@link net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView} instance. + * All the encoding and other work is handled in the quad base classes. + * The one interesting bit is in {@link Maker#emit()}. + */ +public class MeshBuilderImpl implements MeshBuilder { + int[] data = new int[256]; + private final Maker maker = new Maker(); + int index = 0; + int limit = this.data.length; + + protected void ensureCapacity(int stride) { + if (stride > this.limit - this.index) { + this.limit *= 2; + final int[] bigger = new int[this.limit]; + System.arraycopy(this.data, 0, bigger, 0, this.index); + this.data = bigger; + this.maker.data = bigger; + } + } + + @Override + public Mesh build() { + final int[] packed = new int[this.index]; + System.arraycopy(this.data, 0, packed, 0, this.index); + this.index = 0; + this.maker.begin(this.data, this.index); + return new MeshImpl(packed); + } + + @Override + public QuadEmitter getEmitter() { + this.ensureCapacity(EncodingFormat.TOTAL_STRIDE); + this.maker.begin(this.data, this.index); + return this.maker; + } + + /** + * Our base classes are used differently so we define final + * encoding steps in subtypes. This will be a static mesh used + * at render time so we want to capture all geometry now and + * apply non-location-dependent lighting. + */ + private class Maker extends MutableQuadViewImpl implements QuadEmitter { + @Override + public Maker emit() { + this.computeGeometry(); + MeshBuilderImpl.this.index += EncodingFormat.TOTAL_STRIDE; + MeshBuilderImpl.this.ensureCapacity(EncodingFormat.TOTAL_STRIDE); + this.baseIndex = MeshBuilderImpl.this.index; + this.clear(); + return this; + } + } +} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/mesh/MeshImpl.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/mesh/MeshImpl.java new file mode 100644 index 0000000000..b2e98f9146 --- /dev/null +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/mesh/MeshImpl.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.jellysquid.mods.sodium.client.interop.fabric.mesh; + +import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView; + +import java.util.function.Consumer; + +/** + * Implementation of {@link Mesh}. + * The way we encode meshes makes it very simple. + */ +public class MeshImpl implements Mesh { + /** + * Used to satisfy external calls to {@link #forEach(Consumer)}. + */ + final ThreadLocal POOL = ThreadLocal.withInitial(QuadViewImpl::new); + + final int[] data; + + MeshImpl(int[] data) { + this.data = data; + } + + public int[] data() { + return this.data; + } + + @Override + public void forEach(Consumer consumer) { + this.forEach(consumer, this.POOL.get()); + } + + /** + * The renderer will call this with it's own cursor + * to avoid the performance hit of a thread-local lookup. + * Also means renderer can hold final references to quad buffers. + */ + void forEach(Consumer consumer, QuadViewImpl cursor) { + final int limit = this.data.length; + int index = 0; + + while (index < limit) { + cursor.load(this.data, index); + consumer.accept(cursor); + index += EncodingFormat.TOTAL_STRIDE; + } + } +} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/mesh/MutableQuadViewImpl.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/mesh/MutableQuadViewImpl.java new file mode 100644 index 0000000000..c1725a3c1c --- /dev/null +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/mesh/MutableQuadViewImpl.java @@ -0,0 +1,165 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.jellysquid.mods.sodium.client.interop.fabric.mesh; + +import com.google.common.base.Preconditions; +import me.jellysquid.mods.sodium.client.interop.fabric.material.RenderMaterialValue; +import me.jellysquid.mods.sodium.client.util.geometry.Norm3b; +import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; +import me.jellysquid.mods.sodium.client.interop.fabric.SodiumRenderer; +import me.jellysquid.mods.sodium.client.interop.fabric.helper.TextureHelper; +import net.minecraft.client.render.model.BakedQuad; +import net.minecraft.client.texture.Sprite; +import net.minecraft.util.math.Direction; + +import static me.jellysquid.mods.sodium.client.interop.fabric.mesh.EncodingFormat.*; + +/** + * Almost-concrete implementation of a mutable quad. The only missing part is {@link #emit()}, + * because that depends on where/how it is used. (Mesh encoding vs. render-time transformation). + */ +public abstract class MutableQuadViewImpl extends QuadViewImpl implements QuadEmitter { + public final void begin(int[] data, int baseIndex) { + this.data = data; + this.baseIndex = baseIndex; + this.clear(); + } + + public void clear() { + System.arraycopy(EMPTY, 0, this.data, this.baseIndex, EncodingFormat.TOTAL_STRIDE); + this.isGeometryInvalid = true; + this.nominalFace = null; + this.normalFlags(0); + this.tag(0); + this.colorIndex(-1); + this.cullFace(null); + this.material(SodiumRenderer.MATERIAL_STANDARD); + } + + @Override + public final MutableQuadViewImpl material(RenderMaterial material) { + if (material == null) { + material = SodiumRenderer.MATERIAL_STANDARD; + } + + this.data[this.baseIndex + HEADER_BITS] = EncodingFormat.material(this.data[this.baseIndex + HEADER_BITS], (RenderMaterialValue) material); + return this; + } + + @Override + public final MutableQuadViewImpl cullFace(Direction face) { + this.data[this.baseIndex + HEADER_BITS] = EncodingFormat.cullFace(this.data[this.baseIndex + HEADER_BITS], face); + this.nominalFace(face); + return this; + } + + @Override + public final MutableQuadViewImpl nominalFace(Direction face) { + this.nominalFace = face; + return this; + } + + @Override + public final MutableQuadViewImpl colorIndex(int colorIndex) { + this.data[this.baseIndex + HEADER_COLOR_INDEX] = colorIndex; + return this; + } + + @Override + public final MutableQuadViewImpl tag(int tag) { + this.data[this.baseIndex + HEADER_TAG] = tag; + return this; + } + + /** + * @deprecated will be removed in 1.17 cycle - see docs in interface + */ + @Deprecated + @Override + public final MutableQuadViewImpl fromVanilla(int[] quadData, int startIndex, boolean isItem) { + System.arraycopy(quadData, startIndex, this.data, this.baseIndex + HEADER_STRIDE, QUAD_STRIDE); + this.isGeometryInvalid = true; + return this; + } + + @Override + public final MutableQuadViewImpl fromVanilla(BakedQuad quad, RenderMaterial material, Direction cullFace) { + System.arraycopy(quad.getVertexData(), 0, this.data, this.baseIndex + HEADER_STRIDE, QUAD_STRIDE); + this.data[this.baseIndex + HEADER_BITS] = EncodingFormat.cullFace(0, cullFace); + this.nominalFace(quad.getFace()); + this.colorIndex(quad.getColorIndex()); + this.material(material); + this.tag(0); + this.shade(quad.hasShade()); + this.isGeometryInvalid = true; + return this; + } + + @Override + public MutableQuadViewImpl pos(int vertexIndex, float x, float y, float z) { + final int index = this.baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_X; + this.data[index] = Float.floatToRawIntBits(x); + this.data[index + 1] = Float.floatToRawIntBits(y); + this.data[index + 2] = Float.floatToRawIntBits(z); + this.isGeometryInvalid = true; + return this; + } + + protected void normalFlags(int flags) { + this.data[this.baseIndex + HEADER_BITS] = EncodingFormat.normalFlags(this.data[this.baseIndex + HEADER_BITS], flags); + } + + @Override + public MutableQuadViewImpl normal(int vertexIndex, float x, float y, float z) { + this.normalFlags(this.normalFlags() | (1 << vertexIndex)); + this.data[this.baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_NORMAL] = Norm3b.pack(x, y, z); + return this; + } + + @Override + public MutableQuadViewImpl lightmap(int vertexIndex, int lightmap) { + this.data[this.baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_LIGHTMAP] = lightmap; + return this; + } + + @Override + public MutableQuadViewImpl spriteColor(int vertexIndex, int spriteIndex, int color) { + Preconditions.checkArgument(spriteIndex == 0, "Unsupported sprite index: %s", spriteIndex); + + this.data[this.baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_COLOR] = color; + return this; + } + + @Override + public MutableQuadViewImpl sprite(int vertexIndex, int spriteIndex, float u, float v) { + Preconditions.checkArgument(spriteIndex == 0, "Unsupported sprite index: %s", spriteIndex); + + final int i = this.baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_U; + this.data[i] = Float.floatToRawIntBits(u); + this.data[i + 1] = Float.floatToRawIntBits(v); + return this; + } + + @Override + public MutableQuadViewImpl spriteBake(int spriteIndex, Sprite sprite, int bakeFlags) { + Preconditions.checkArgument(spriteIndex == 0, "Unsupported sprite index: %s", spriteIndex); + + TextureHelper.bakeSprite(this, spriteIndex, sprite, bakeFlags); + return this; + } +} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/mesh/QuadViewImpl.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/mesh/QuadViewImpl.java new file mode 100644 index 0000000000..3eb33f5596 --- /dev/null +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/fabric/mesh/QuadViewImpl.java @@ -0,0 +1,273 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.jellysquid.mods.sodium.client.interop.fabric.mesh; + +import com.google.common.base.Preconditions; +import me.jellysquid.mods.sodium.client.interop.fabric.material.RenderMaterialValue; +import me.jellysquid.mods.sodium.client.util.geometry.Norm3b; +import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView; +import me.jellysquid.mods.sodium.client.interop.fabric.helper.GeometryHelper; +import me.jellysquid.mods.sodium.client.interop.fabric.helper.NormalHelper; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Vec3f; + +import static me.jellysquid.mods.sodium.client.interop.fabric.mesh.EncodingFormat.*; + +/** + * Base class for all quads / quad makers. Handles the ugly bits + * of maintaining and encoding the quad state. + */ +public class QuadViewImpl implements QuadView { + protected Direction nominalFace; + /** + * True when geometry flags or light face may not match geometry. + */ + protected boolean isGeometryInvalid = true; + protected final Vec3f faceNormal = new Vec3f(); + private boolean shade = true; + + /** + * Size and where it comes from will vary in subtypes. But in all cases quad is fully encoded to array. + */ + protected int[] data; + + /** + * Beginning of the quad. Also the header index. + */ + protected int baseIndex = 0; + + /** + * Use when subtype is "attached" to a pre-existing array. + * Sets data reference and index and decodes state from array. + */ + final void load(int[] data, int baseIndex) { + this.data = data; + this.baseIndex = baseIndex; + this.load(); + } + + /** + * Like {@link #load(int[], int)} but assumes array and index already set. + * Only does the decoding part. + */ + public final void load() { + this.isGeometryInvalid = false; + this.nominalFace = this.lightFace(); + + // face normal isn't encoded + NormalHelper.computeFaceNormal(this.faceNormal, this); + } + + /** + * Reference to underlying array. Use with caution. Meant for fast renderer access + */ + public int[] data() { + return this.data; + } + + public int normalFlags() { + return EncodingFormat.normalFlags(this.data[this.baseIndex + HEADER_BITS]); + } + + /** + * True if any vertex normal has been set. + */ + public boolean hasVertexNormals() { + return this.normalFlags() != 0; + } + + /** + * gets flags used for lighting - lazily computed via {@link GeometryHelper#computeShapeFlags(QuadView)}. + */ + public int geometryFlags() { + this.computeGeometry(); + return EncodingFormat.geometryFlags(this.data[this.baseIndex + HEADER_BITS]); + } + + protected void computeGeometry() { + if (this.isGeometryInvalid) { + this.isGeometryInvalid = false; + + NormalHelper.computeFaceNormal(this.faceNormal, this); + + // depends on face normal + this.data[this.baseIndex + HEADER_BITS] = EncodingFormat.lightFace(this.data[this.baseIndex + HEADER_BITS], GeometryHelper.lightFace(this)); + + // depends on light face + this.data[this.baseIndex + HEADER_BITS] = EncodingFormat.geometryFlags(this.data[this.baseIndex + HEADER_BITS], GeometryHelper.computeShapeFlags(this)); + } + } + + @Override + public final void toVanilla(int textureIndex, int[] target, int targetIndex, boolean isItem) { + System.arraycopy(this.data, this.baseIndex + VERTEX_X, target, targetIndex, QUAD_STRIDE); + } + + @Override + public final RenderMaterialValue material() { + return EncodingFormat.material(this.data[this.baseIndex + HEADER_BITS]); + } + + @Override + public final int colorIndex() { + return this.data[this.baseIndex + HEADER_COLOR_INDEX]; + } + + @Override + public final int tag() { + return this.data[this.baseIndex + HEADER_TAG]; + } + + @Override + public final Direction lightFace() { + this.computeGeometry(); + return EncodingFormat.lightFace(this.data[this.baseIndex + HEADER_BITS]); + } + + @Override + public final Direction cullFace() { + return EncodingFormat.cullFace(this.data[this.baseIndex + HEADER_BITS]); + } + + @Override + public final Direction nominalFace() { + return this.nominalFace; + } + + @Override + public final Vec3f faceNormal() { + this.computeGeometry(); + return this.faceNormal; + } + + @Override + public void copyTo(MutableQuadView target) { + this.computeGeometry(); + + final MutableQuadViewImpl quad = (MutableQuadViewImpl) target; + // copy everything except the material + System.arraycopy(this.data, this.baseIndex + 1, quad.data, quad.baseIndex + 1, EncodingFormat.TOTAL_STRIDE - 1); + quad.faceNormal.set(this.faceNormal.getX(), this.faceNormal.getY(), this.faceNormal.getZ()); + quad.nominalFace = this.nominalFace; + quad.isGeometryInvalid = false; + } + + @Override + public Vec3f copyPos(int vertexIndex, Vec3f target) { + if (target == null) { + target = new Vec3f(); + } + + final int index = this.baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_X; + target.set(Float.intBitsToFloat(this.data[index]), Float.intBitsToFloat(this.data[index + 1]), Float.intBitsToFloat(this.data[index + 2])); + return target; + } + + @Override + public float posByIndex(int vertexIndex, int coordinateIndex) { + return Float.intBitsToFloat(this.data[this.baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_X + coordinateIndex]); + } + + @Override + public float x(int vertexIndex) { + return Float.intBitsToFloat(this.data[this.baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_X]); + } + + @Override + public float y(int vertexIndex) { + return Float.intBitsToFloat(this.data[this.baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_Y]); + } + + @Override + public float z(int vertexIndex) { + return Float.intBitsToFloat(this.data[this.baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_Z]); + } + + @Override + public boolean hasNormal(int vertexIndex) { + return (this.normalFlags() & (1 << vertexIndex)) != 0; + } + + protected final int normalIndex(int vertexIndex) { + return this.baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_NORMAL; + } + + @Override + public Vec3f copyNormal(int vertexIndex, Vec3f target) { + if (this.hasNormal(vertexIndex)) { + if (target == null) { + target = new Vec3f(); + } + + final int normal = this.data[this.normalIndex(vertexIndex)]; + target.set(Norm3b.unpackX(normal), Norm3b.unpackY(normal), Norm3b.unpackZ(normal)); + return target; + } else { + return null; + } + } + + @Override + public float normalX(int vertexIndex) { + return this.hasNormal(vertexIndex) ? Norm3b.unpackX(this.data[this.normalIndex(vertexIndex)]) : Float.NaN; + } + + @Override + public float normalY(int vertexIndex) { + return this.hasNormal(vertexIndex) ? Norm3b.unpackY(this.data[this.normalIndex(vertexIndex)]) : Float.NaN; + } + + @Override + public float normalZ(int vertexIndex) { + return this.hasNormal(vertexIndex) ? Norm3b.unpackZ(this.data[this.normalIndex(vertexIndex)]) : Float.NaN; + } + + @Override + public int lightmap(int vertexIndex) { + return this.data[this.baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_LIGHTMAP]; + } + + @Override + public int spriteColor(int vertexIndex, int spriteIndex) { + Preconditions.checkArgument(spriteIndex == 0, "Unsupported sprite index: %s", spriteIndex); + + return this.data[this.baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_COLOR]; + } + + @Override + public float spriteU(int vertexIndex, int spriteIndex) { + Preconditions.checkArgument(spriteIndex == 0, "Unsupported sprite index: %s", spriteIndex); + + return Float.intBitsToFloat(this.data[this.baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_U]); + } + + @Override + public float spriteV(int vertexIndex, int spriteIndex) { + Preconditions.checkArgument(spriteIndex == 0, "Unsupported sprite index: %s", spriteIndex); + + return Float.intBitsToFloat(this.data[this.baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_V]); + } + + public boolean hasShade() { + return this.shade && !this.material().disableDiffuse(0); + } + + public void shade(boolean shade) { + this.shade = shade; + } +} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/util/geometry/BufferBuilderParametersAccess.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/buffer/BufferBuilderParametersAccess.java similarity index 67% rename from src/main/java/me/jellysquid/mods/sodium/client/util/geometry/BufferBuilderParametersAccess.java rename to src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/buffer/BufferBuilderParametersAccess.java index afab9a44cf..d9c590e2ac 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/util/geometry/BufferBuilderParametersAccess.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/buffer/BufferBuilderParametersAccess.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.util.geometry; +package me.jellysquid.mods.sodium.client.interop.vanilla.buffer; public interface BufferBuilderParametersAccess { float[] getParametersFlat(); diff --git a/src/main/java/me/jellysquid/mods/sodium/client/world/cloned/PackedIntegerArrayExtended.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/chunk/PackedIntegerArrayExtended.java similarity index 75% rename from src/main/java/me/jellysquid/mods/sodium/client/world/cloned/PackedIntegerArrayExtended.java rename to src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/chunk/PackedIntegerArrayExtended.java index a7a5bc2cee..80297619e3 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/world/cloned/PackedIntegerArrayExtended.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/chunk/PackedIntegerArrayExtended.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.world.cloned; +package me.jellysquid.mods.sodium.client.interop.vanilla.chunk; import me.jellysquid.mods.sodium.client.world.cloned.palette.ClonedPalette; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/world/cloned/PalettedContainerExtended.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/chunk/PalettedContainerExtended.java similarity index 88% rename from src/main/java/me/jellysquid/mods/sodium/client/world/cloned/PalettedContainerExtended.java rename to src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/chunk/PalettedContainerExtended.java index 2baf1f1123..55a362945c 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/world/cloned/PalettedContainerExtended.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/chunk/PalettedContainerExtended.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.world.cloned; +package me.jellysquid.mods.sodium.client.interop.vanilla.chunk; import net.minecraft.util.collection.PackedIntegerArray; import net.minecraft.world.chunk.Palette; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/colors/BlockColorsExtended.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/colors/BlockColorsExtended.java new file mode 100644 index 0000000000..a980425adc --- /dev/null +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/colors/BlockColorsExtended.java @@ -0,0 +1,8 @@ +package me.jellysquid.mods.sodium.client.interop.vanilla.colors; + +import me.jellysquid.mods.sodium.client.model.quad.QuadColorizer; +import net.minecraft.block.BlockState; + +public interface BlockColorsExtended { + QuadColorizer getColorProvider(BlockState state); +} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/world/biome/ItemColorsExtended.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/colors/ItemColorsExtended.java similarity index 74% rename from src/main/java/me/jellysquid/mods/sodium/client/world/biome/ItemColorsExtended.java rename to src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/colors/ItemColorsExtended.java index 4bf7e47439..5e4ef2e307 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/world/biome/ItemColorsExtended.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/colors/ItemColorsExtended.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.world.biome; +package me.jellysquid.mods.sodium.client.interop.vanilla.colors; import net.minecraft.client.color.item.ItemColorProvider; import net.minecraft.item.ItemStack; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/BatchingVertexConsumer.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/consumer/BatchingVertexConsumer.java similarity index 97% rename from src/main/java/me/jellysquid/mods/sodium/client/render/BatchingVertexConsumer.java rename to src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/consumer/BatchingVertexConsumer.java index 71399f8009..077f40c786 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/BatchingVertexConsumer.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/consumer/BatchingVertexConsumer.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.render; +package me.jellysquid.mods.sodium.client.interop.vanilla.consumer; import it.unimi.dsi.fastutil.objects.*; import net.minecraft.client.render.BufferBuilder; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/ModelCuboidAccessor.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/cuboid/ModelCuboidAccessor.java similarity index 65% rename from src/main/java/me/jellysquid/mods/sodium/client/model/ModelCuboidAccessor.java rename to src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/cuboid/ModelCuboidAccessor.java index c252815ae8..d67fab094b 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/ModelCuboidAccessor.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/cuboid/ModelCuboidAccessor.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.model; +package me.jellysquid.mods.sodium.client.interop.vanilla.cuboid; import net.minecraft.client.model.ModelPart; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/util/font/GlyphRendererBatched.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/glyph/GlyphRendererBatched.java similarity index 88% rename from src/main/java/me/jellysquid/mods/sodium/client/util/font/GlyphRendererBatched.java rename to src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/glyph/GlyphRendererBatched.java index 7c00560cac..234d88fe9e 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/util/font/GlyphRendererBatched.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/glyph/GlyphRendererBatched.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.util.font; +package me.jellysquid.mods.sodium.client.interop.vanilla.glyph; import me.jellysquid.mods.sodium.client.model.vertex.formats.GlyphVertexSink; import net.minecraft.client.font.GlyphRenderer; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/util/font/OutlineCharacterVisitor.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/glyph/OutlineCharacterVisitor.java similarity index 96% rename from src/main/java/me/jellysquid/mods/sodium/client/util/font/OutlineCharacterVisitor.java rename to src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/glyph/OutlineCharacterVisitor.java index b5e65c71fe..b2a32baae6 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/util/font/OutlineCharacterVisitor.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/glyph/OutlineCharacterVisitor.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.util.font; +package me.jellysquid.mods.sodium.client.interop.vanilla.glyph; import net.minecraft.client.font.FontStorage; import net.minecraft.client.font.Glyph; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/ItemRendererExtended.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/item/ItemRendererBatched.java similarity index 68% rename from src/main/java/me/jellysquid/mods/sodium/client/render/ItemRendererExtended.java rename to src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/item/ItemRendererBatched.java index d40e04ae5f..ac14b13d21 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/ItemRendererExtended.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/item/ItemRendererBatched.java @@ -1,14 +1,15 @@ -package me.jellysquid.mods.sodium.client.render; +package me.jellysquid.mods.sodium.client.interop.vanilla.item; +import me.jellysquid.mods.sodium.client.render.batch.ItemRenderBatch; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.LivingEntity; import net.minecraft.item.ItemStack; -public interface ItemRendererExtended { - static ItemRendererExtended cast(ItemRenderer itemRenderer) { - return (ItemRendererExtended) itemRenderer; +public interface ItemRendererBatched { + static ItemRendererBatched cast(ItemRenderer itemRenderer) { + return (ItemRendererBatched) itemRenderer; } void renderItemModel(ItemRenderBatch batch, MatrixStack matrixStack, int x, int y, ItemStack stack, LivingEntity entity, int seed); diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/LightmapTextureManagerAccessor.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/lightmap/LightmapTextureManagerAccessor.java similarity index 67% rename from src/main/java/me/jellysquid/mods/sodium/client/render/LightmapTextureManagerAccessor.java rename to src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/lightmap/LightmapTextureManagerAccessor.java index 0794cd05d9..24ef92b41d 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/LightmapTextureManagerAccessor.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/lightmap/LightmapTextureManagerAccessor.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.render; +package me.jellysquid.mods.sodium.client.interop.vanilla.lightmap; import net.minecraft.client.texture.AbstractTexture; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/util/math/Matrix3fExtended.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/matrix/Matrix3fExtended.java similarity index 94% rename from src/main/java/me/jellysquid/mods/sodium/client/util/math/Matrix3fExtended.java rename to src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/matrix/Matrix3fExtended.java index 6dc1e183fc..99f6788344 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/util/math/Matrix3fExtended.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/matrix/Matrix3fExtended.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.util.math; +package me.jellysquid.mods.sodium.client.interop.vanilla.matrix; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Quaternion; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/util/math/Matrix4fExtended.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/matrix/Matrix4fExtended.java similarity index 96% rename from src/main/java/me/jellysquid/mods/sodium/client/util/math/Matrix4fExtended.java rename to src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/matrix/Matrix4fExtended.java index af0dfbd4c2..22e9cef388 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/util/math/Matrix4fExtended.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/matrix/Matrix4fExtended.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.util.math; +package me.jellysquid.mods.sodium.client.interop.vanilla.matrix; import net.minecraft.util.math.Quaternion; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/util/math/JomlHelper.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/matrix/MatrixConverter.java similarity index 85% rename from src/main/java/me/jellysquid/mods/sodium/client/util/math/JomlHelper.java rename to src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/matrix/MatrixConverter.java index d03bd2910f..5e3b054a61 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/util/math/JomlHelper.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/matrix/MatrixConverter.java @@ -1,11 +1,11 @@ -package me.jellysquid.mods.sodium.client.util.math; +package me.jellysquid.mods.sodium.client.interop.vanilla.matrix; import org.joml.Matrix4f; import org.lwjgl.system.MemoryStack; import java.nio.FloatBuffer; -public class JomlHelper { +public class MatrixConverter { public static void set(Matrix4f dst, net.minecraft.util.math.Matrix4f src) { try (MemoryStack stack = MemoryStack.stackPush()) { FloatBuffer buffer = stack.callocFloat(16); diff --git a/src/main/java/me/jellysquid/mods/sodium/client/util/math/MatrixUtil.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/matrix/MatrixUtil.java similarity index 61% rename from src/main/java/me/jellysquid/mods/sodium/client/util/math/MatrixUtil.java rename to src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/matrix/MatrixUtil.java index d5daf25c43..ed1068d1e9 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/util/math/MatrixUtil.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/matrix/MatrixUtil.java @@ -1,10 +1,7 @@ -package me.jellysquid.mods.sodium.client.util.math; +package me.jellysquid.mods.sodium.client.interop.vanilla.matrix; -import me.jellysquid.mods.sodium.client.util.Norm3b; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Matrix3f; -import net.minecraft.util.math.Matrix4f; -import net.minecraft.util.math.Vec3i; +import me.jellysquid.mods.sodium.client.util.geometry.Norm3b; +import net.minecraft.util.math.*; @SuppressWarnings("ConstantConditions") public class MatrixUtil { @@ -33,4 +30,18 @@ public static int transformNormalVector(Vec3i vector, Matrix3f matrix) { mat.transformVecZ(x, y, z) ); } + + public static int transformNormalVector(Vec3f vector, Matrix3f matrix) { + Matrix3fExtended mat = MatrixUtil.getExtendedMatrix(matrix); + + float x = vector.getX(); + float y = vector.getY(); + float z = vector.getZ(); + + return Norm3b.pack( + mat.transformVecX(x, y, z), + mat.transformVecY(x, y, z), + mat.transformVecZ(x, y, z) + ); + } } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/util/ModelQuadUtil.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/quad/BakedQuadHelper.java similarity index 90% rename from src/main/java/me/jellysquid/mods/sodium/client/util/ModelQuadUtil.java rename to src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/quad/BakedQuadHelper.java index f813edeed9..d04ce96822 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/util/ModelQuadUtil.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/quad/BakedQuadHelper.java @@ -1,6 +1,7 @@ -package me.jellysquid.mods.sodium.client.util; +package me.jellysquid.mods.sodium.client.interop.vanilla.quad; -import me.jellysquid.mods.sodium.common.util.DirectionUtil; +import me.jellysquid.mods.sodium.client.util.geometry.Norm3b; +import me.jellysquid.mods.sodium.client.util.DirectionUtil; import net.minecraft.util.math.Direction; /** @@ -17,7 +18,7 @@ * 28..30 7 Normal 3 unsigned bytes x, y, z * 31 Padding 1 byte */ -public class ModelQuadUtil { +public class BakedQuadHelper { // Integer indices for vertex attributes, useful for accessing baked quad data public static final int POSITION_INDEX = 0, COLOR_INDEX = 3, diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/quad/ModelQuadView.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/quad/BakedQuadView.java similarity index 74% rename from src/main/java/me/jellysquid/mods/sodium/client/model/quad/ModelQuadView.java rename to src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/quad/BakedQuadView.java index a69403278a..7945e2dcc0 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/quad/ModelQuadView.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/quad/BakedQuadView.java @@ -1,12 +1,11 @@ -package me.jellysquid.mods.sodium.client.model.quad; +package me.jellysquid.mods.sodium.client.interop.vanilla.quad; -import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadFlags; import net.minecraft.client.texture.Sprite; /** - * Provides a read-only view of a model quad. For mutable access to a model quad, see {@link ModelQuadViewMutable}. + * Provides a read-only view of a {@link net.minecraft.client.render.model.BakedQuad}. */ -public interface ModelQuadView { +public interface BakedQuadView { /** * @return The x-position of the vertex at index {@param idx} */ @@ -37,11 +36,6 @@ public interface ModelQuadView { */ float getTexV(int idx); - /** - * @return The integer bit flags containing the {@link ModelQuadFlags} for this quad - */ - int getFlags(); - /** * @return The lightmap texture coordinates for the vertex at index {@param idx} */ diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/ModelQuadOverlayAdapter.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/quad/ModelQuadOverlayAdapter.java similarity index 93% rename from src/main/java/me/jellysquid/mods/sodium/client/render/ModelQuadOverlayAdapter.java rename to src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/quad/ModelQuadOverlayAdapter.java index 9348e8054c..966022ba35 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/ModelQuadOverlayAdapter.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/quad/ModelQuadOverlayAdapter.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.render; +package me.jellysquid.mods.sodium.client.interop.vanilla.quad; import me.jellysquid.mods.sodium.client.model.vertex.formats.generic.PositionTextureSink; import me.jellysquid.mods.sodium.client.model.vertex.formats.ModelQuadVertexSink; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/util/resource/SinglePreparationResourceReloaderAccess.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/resource/SinglePreparationResourceReloaderAccess.java similarity index 81% rename from src/main/java/me/jellysquid/mods/sodium/client/util/resource/SinglePreparationResourceReloaderAccess.java rename to src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/resource/SinglePreparationResourceReloaderAccess.java index 349428c89f..ad0709b6d5 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/util/resource/SinglePreparationResourceReloaderAccess.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/resource/SinglePreparationResourceReloaderAccess.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.util.resource; +package me.jellysquid.mods.sodium.client.interop.vanilla.resource; import net.minecraft.resource.ResourceManager; import net.minecraft.util.profiler.Profiler; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/util/font/SinglePreparationResourceReloaderCallback.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/resource/SinglePreparationResourceReloaderCallback.java similarity index 87% rename from src/main/java/me/jellysquid/mods/sodium/client/util/font/SinglePreparationResourceReloaderCallback.java rename to src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/resource/SinglePreparationResourceReloaderCallback.java index 2284b35e13..3442537efc 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/util/font/SinglePreparationResourceReloaderCallback.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/resource/SinglePreparationResourceReloaderCallback.java @@ -1,6 +1,5 @@ -package me.jellysquid.mods.sodium.client.util.font; +package me.jellysquid.mods.sodium.client.interop.vanilla.resource; -import me.jellysquid.mods.sodium.client.util.resource.SinglePreparationResourceReloaderAccess; import net.minecraft.resource.ResourceManager; import net.minecraft.resource.SinglePreparationResourceReloader; import net.minecraft.util.profiler.Profiler; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/world/ChunkStatusListener.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/world/ChunkStatusListener.java similarity index 90% rename from src/main/java/me/jellysquid/mods/sodium/client/world/ChunkStatusListener.java rename to src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/world/ChunkStatusListener.java index 7cdbbc4c3a..e33da8f52e 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/world/ChunkStatusListener.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/world/ChunkStatusListener.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.world; +package me.jellysquid.mods.sodium.client.interop.vanilla.world; /** * Defines a listener that can be attached to a world's chunk manager to receive chunk load and unload events. diff --git a/src/main/java/me/jellysquid/mods/sodium/client/world/ClientChunkManagerExtended.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/world/ClientChunkManagerExtended.java similarity index 79% rename from src/main/java/me/jellysquid/mods/sodium/client/world/ClientChunkManagerExtended.java rename to src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/world/ClientChunkManagerExtended.java index c61624db80..2571303402 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/world/ClientChunkManagerExtended.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/world/ClientChunkManagerExtended.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.world; +package me.jellysquid.mods.sodium.client.interop.vanilla.world; import it.unimi.dsi.fastutil.longs.LongCollection; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/world/ClientWorldExtended.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/world/ClientWorldExtended.java similarity index 71% rename from src/main/java/me/jellysquid/mods/sodium/client/world/ClientWorldExtended.java rename to src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/world/ClientWorldExtended.java index 47b7fd8af4..5976380e8b 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/world/ClientWorldExtended.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/world/ClientWorldExtended.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.world; +package me.jellysquid.mods.sodium.client.interop.vanilla.world; public interface ClientWorldExtended { /** diff --git a/src/main/java/me/jellysquid/mods/sodium/client/world/WorldRendererExtended.java b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/world/WorldRendererExtended.java similarity index 71% rename from src/main/java/me/jellysquid/mods/sodium/client/world/WorldRendererExtended.java rename to src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/world/WorldRendererExtended.java index 8fa6b2ec1a..90ec442154 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/world/WorldRendererExtended.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/interop/vanilla/world/WorldRendererExtended.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.world; +package me.jellysquid.mods.sodium.client.interop.vanilla.world; import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/IndexBufferBuilder.java b/src/main/java/me/jellysquid/mods/sodium/client/model/IndexBufferBuilder.java index 0cb45c2f36..c0878c6d78 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/IndexBufferBuilder.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/model/IndexBufferBuilder.java @@ -1,12 +1,9 @@ package me.jellysquid.mods.sodium.client.model; import it.unimi.dsi.fastutil.ints.IntArrayList; -import it.unimi.dsi.fastutil.ints.IntArrays; import it.unimi.dsi.fastutil.ints.IntIterator; -import me.jellysquid.mods.sodium.client.gl.tessellation.GlIndexType; -import me.jellysquid.mods.sodium.client.gl.util.ElementRange; +import me.jellysquid.mods.thingl.tessellation.GlIndexType; import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadWinding; -import me.jellysquid.mods.sodium.client.model.vertex.buffer.VertexBufferBuilder; import java.nio.ByteBuffer; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/light/LightPipeline.java b/src/main/java/me/jellysquid/mods/sodium/client/model/light/LightPipeline.java deleted file mode 100644 index a76643f2b1..0000000000 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/light/LightPipeline.java +++ /dev/null @@ -1,22 +0,0 @@ -package me.jellysquid.mods.sodium.client.model.light; - -import me.jellysquid.mods.sodium.client.model.light.data.QuadLightData; -import me.jellysquid.mods.sodium.client.model.quad.ModelQuadView; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; - -/** - * Light pipelines allow model quads for any location in the world to be lit using various backends, including fluids - * and block entities. - */ -public interface LightPipeline { - /** - * Calculates the light data for a given block model quad, storing the result in {@param out}. - * @param quad The block model quad - * @param pos The block position of the model this quad belongs to - * @param out The data arrays which will store the calculated light data results - * @param face The pre-computed facing vector of the quad - * @param shade True if the block is shaded by ambient occlusion - */ - void calculate(ModelQuadView quad, BlockPos pos, QuadLightData out, Direction face, boolean shade); -} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/light/LightPipelineProvider.java b/src/main/java/me/jellysquid/mods/sodium/client/model/light/LightPipelineProvider.java deleted file mode 100644 index 49fb741888..0000000000 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/light/LightPipelineProvider.java +++ /dev/null @@ -1,26 +0,0 @@ -package me.jellysquid.mods.sodium.client.model.light; - -import me.jellysquid.mods.sodium.client.model.light.data.LightDataAccess; -import me.jellysquid.mods.sodium.client.model.light.flat.FlatLightPipeline; -import me.jellysquid.mods.sodium.client.model.light.smooth.SmoothLightPipeline; - -import java.util.EnumMap; - -public class LightPipelineProvider { - private final EnumMap lighters = new EnumMap<>(LightMode.class); - - public LightPipelineProvider(LightDataAccess cache) { - this.lighters.put(LightMode.SMOOTH, new SmoothLightPipeline(cache)); - this.lighters.put(LightMode.FLAT, new FlatLightPipeline(cache)); - } - - public LightPipeline getLighter(LightMode type) { - LightPipeline pipeline = this.lighters.get(type); - - if (pipeline == null) { - throw new NullPointerException("No lighter exists for mode: " + type.name()); - } - - return pipeline; - } -} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/light/QuadLighter.java b/src/main/java/me/jellysquid/mods/sodium/client/model/light/QuadLighter.java new file mode 100644 index 0000000000..e1e750c88f --- /dev/null +++ b/src/main/java/me/jellysquid/mods/sodium/client/model/light/QuadLighter.java @@ -0,0 +1,14 @@ +package me.jellysquid.mods.sodium.client.model.light; + +import me.jellysquid.mods.sodium.client.model.light.data.QuadLightData; +import me.jellysquid.mods.sodium.client.interop.fabric.mesh.MutableQuadViewImpl; + +/** + * Light pipelines allow model quads for any location in the world to be lit using various backends, including fluids + * and block entities. + */ +public interface QuadLighter { + void compute(MutableQuadViewImpl quad); + + QuadLightData getQuadLightData(); +} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/light/SidedBrightnessTable.java b/src/main/java/me/jellysquid/mods/sodium/client/model/light/SidedBrightnessTable.java new file mode 100644 index 0000000000..9156502f5a --- /dev/null +++ b/src/main/java/me/jellysquid/mods/sodium/client/model/light/SidedBrightnessTable.java @@ -0,0 +1,20 @@ +package me.jellysquid.mods.sodium.client.model.light; + +import me.jellysquid.mods.sodium.client.util.DirectionUtil; +import net.minecraft.util.math.Direction; +import net.minecraft.world.BlockRenderView; + +public class SidedBrightnessTable { + private final float[] table = new float[DirectionUtil.ALL_DIRECTIONS.length * 2]; + + public SidedBrightnessTable(BlockRenderView world) { + for (Direction dir : DirectionUtil.ALL_DIRECTIONS) { + this.table[(dir.ordinal() * 2)] = world.getBrightness(dir, false); + this.table[(dir.ordinal() * 2) + 1] = world.getBrightness(dir, true); + } + } + + public float get(Direction dir, boolean shaded) { + return this.table[(dir.ordinal() * 2) + (shaded ? 1 : 0)]; + } +} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/light/cache/ArrayLightDataCache.java b/src/main/java/me/jellysquid/mods/sodium/client/model/light/cache/SlicedLightDataCache.java similarity index 90% rename from src/main/java/me/jellysquid/mods/sodium/client/model/light/cache/ArrayLightDataCache.java rename to src/main/java/me/jellysquid/mods/sodium/client/model/light/cache/SlicedLightDataCache.java index ce9503fdf1..eb00539726 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/light/cache/ArrayLightDataCache.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/model/light/cache/SlicedLightDataCache.java @@ -12,7 +12,7 @@ * neighbors. This is considerably faster than using a hash table to lookup values for a given block position and * can be re-used by {@link WorldSlice} to avoid allocations. */ -public class ArrayLightDataCache extends LightDataAccess { +public class SlicedLightDataCache extends LightDataAccess { private static final int NEIGHBOR_BLOCK_RADIUS = 2; private static final int BLOCK_LENGTH = 16 + (NEIGHBOR_BLOCK_RADIUS * 2); @@ -20,12 +20,12 @@ public class ArrayLightDataCache extends LightDataAccess { private int xOffset, yOffset, zOffset; - public ArrayLightDataCache(BlockRenderView world) { + public SlicedLightDataCache(BlockRenderView world) { this.world = world; this.light = new long[BLOCK_LENGTH * BLOCK_LENGTH * BLOCK_LENGTH]; } - public void reset(ChunkSectionPos origin) { + public void prepare(ChunkSectionPos origin) { this.xOffset = origin.getMinX() - NEIGHBOR_BLOCK_RADIUS; this.yOffset = origin.getMinY() - NEIGHBOR_BLOCK_RADIUS; this.zOffset = origin.getMinZ() - NEIGHBOR_BLOCK_RADIUS; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/light/data/QuadLightData.java b/src/main/java/me/jellysquid/mods/sodium/client/model/light/data/QuadLightData.java index 1342e1dcf3..0d5a6b5c20 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/light/data/QuadLightData.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/model/light/data/QuadLightData.java @@ -8,10 +8,10 @@ public class QuadLightData { /** * The brightness of each vertex in the quad as normalized floats. */ - public final float[] br = new float[4]; + public final float[] shade = new float[4]; /** * The lightmap texture coordinates for each vertex in the quad. */ - public final int[] lm = new int[4]; + public final int[] texture = new int[4]; } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/light/flat/FlatLightPipeline.java b/src/main/java/me/jellysquid/mods/sodium/client/model/light/flat/FlatLightPipeline.java deleted file mode 100644 index 5a09813a33..0000000000 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/light/flat/FlatLightPipeline.java +++ /dev/null @@ -1,40 +0,0 @@ -package me.jellysquid.mods.sodium.client.model.light.flat; - -import me.jellysquid.mods.sodium.client.model.light.LightPipeline; -import me.jellysquid.mods.sodium.client.model.light.data.LightDataAccess; -import me.jellysquid.mods.sodium.client.model.light.data.QuadLightData; -import me.jellysquid.mods.sodium.client.model.quad.ModelQuadView; -import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadFlags; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; - -import java.util.Arrays; - -import static me.jellysquid.mods.sodium.client.model.light.data.LightDataAccess.unpackLM; - -/** - * A light pipeline which implements "classic-style" lighting through simply using the light value of the adjacent - * block to a face. - */ -public class FlatLightPipeline implements LightPipeline { - /** - * The cache which light data will be accessed from. - */ - private final LightDataAccess lightCache; - - public FlatLightPipeline(LightDataAccess lightCache) { - this.lightCache = lightCache; - } - - @Override - public void calculate(ModelQuadView quad, BlockPos pos, QuadLightData out, Direction face, boolean shade) { - // If the face is aligned, use the light data above it - if ((quad.getFlags() & ModelQuadFlags.IS_ALIGNED) != 0 && !this.lightCache.getWorld().getBlockState(pos).hasEmissiveLighting(this.lightCache.getWorld(), pos)) { - Arrays.fill(out.lm, unpackLM(this.lightCache.get(pos, face))); - } else { - Arrays.fill(out.lm, unpackLM(this.lightCache.get(pos))); - } - - Arrays.fill(out.br, this.lightCache.getWorld().getBrightness(face, shade)); - } -} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/light/smooth/AoFaceData.java b/src/main/java/me/jellysquid/mods/sodium/client/model/light/smooth/AoFaceData.java index b7ae756843..bcd75ba3ba 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/light/smooth/AoFaceData.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/model/light/smooth/AoFaceData.java @@ -4,7 +4,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; -import static me.jellysquid.mods.sodium.client.model.light.cache.ArrayLightDataCache.*; +import static me.jellysquid.mods.sodium.client.model.light.cache.SlicedLightDataCache.*; class AoFaceData { public final int[] lm = new int[4]; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/light/smooth/SmoothLightPipeline.java b/src/main/java/me/jellysquid/mods/sodium/client/model/light/smooth/SmoothQuadLighter.java similarity index 78% rename from src/main/java/me/jellysquid/mods/sodium/client/model/light/smooth/SmoothLightPipeline.java rename to src/main/java/me/jellysquid/mods/sodium/client/model/light/smooth/SmoothQuadLighter.java index fa904ad797..ab977da177 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/light/smooth/SmoothLightPipeline.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/model/light/smooth/SmoothQuadLighter.java @@ -1,10 +1,12 @@ package me.jellysquid.mods.sodium.client.model.light.smooth; -import me.jellysquid.mods.sodium.client.model.light.LightPipeline; +import me.jellysquid.mods.sodium.client.model.light.QuadLighter; import me.jellysquid.mods.sodium.client.model.light.data.LightDataAccess; import me.jellysquid.mods.sodium.client.model.light.data.QuadLightData; -import me.jellysquid.mods.sodium.client.model.quad.ModelQuadView; -import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadFlags; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView; +import me.jellysquid.mods.sodium.client.interop.fabric.helper.GeometryHelper; +import me.jellysquid.mods.sodium.client.interop.fabric.mesh.MutableQuadViewImpl; +import me.jellysquid.mods.sodium.client.render.renderer.BlockRenderInfo; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.util.math.MathHelper; @@ -35,7 +37,7 @@ * - Information about a given model quad is cached to enable the light pipeline to make certain assumptions and skip * unnecessary computation */ -public class SmoothLightPipeline implements LightPipeline { +public class SmoothQuadLighter implements QuadLighter { /** * The cache which light data will be accessed from. */ @@ -56,53 +58,65 @@ public class SmoothLightPipeline implements LightPipeline { */ private final float[] weights = new float[4]; - public SmoothLightPipeline(LightDataAccess cache) { + private final QuadLightData lightOutput = new QuadLightData(); + private final BlockRenderInfo blockRenderInfo; + + public SmoothQuadLighter(LightDataAccess cache, BlockRenderInfo blockRenderInfo) { this.lightCache = cache; for (int i = 0; i < this.cachedFaceData.length; i++) { this.cachedFaceData[i] = new AoFaceData(); } + + this.blockRenderInfo = blockRenderInfo; } + @Override - public void calculate(ModelQuadView quad, BlockPos pos, QuadLightData out, Direction face, boolean shade) { - this.updateCachedData(pos.asLong()); + public void compute(MutableQuadViewImpl quad) { + this.updateCachedData(this.blockRenderInfo.blockPos.asLong()); - int flags = quad.getFlags(); + int flags = quad.geometryFlags(); - final AoNeighborInfo neighborInfo = AoNeighborInfo.get(face); + final AoNeighborInfo neighborInfo = AoNeighborInfo.get(quad.lightFace()); + final QuadLightData out = this.lightOutput; // If the model quad is aligned to the block's face and covers it entirely, we can take a fast path and directly // map the corner values onto this quad's vertices. This covers most situations during rendering and provides // a modest speed-up. - if (flags == ModelQuadFlags.IS_ALIGNED) { - this.applyAlignedFullFace(neighborInfo, pos, face, out, flags); + if (flags == GeometryHelper.AXIS_ALIGNED_FLAG) { + this.applyAlignedFullFace(neighborInfo, this.blockRenderInfo.blockPos, quad.lightFace(), out, flags); } else { - this.applyComplex(neighborInfo, quad, pos, face, out, flags); + this.applyComplex(neighborInfo, quad, this.blockRenderInfo.blockPos, quad.lightFace(), out, flags); } - this.applySidedBrightness(out, face, shade); + this.applySidedBrightness(out, quad.lightFace(), quad.hasShade()); + } + + @Override + public QuadLightData getQuadLightData() { + return this.lightOutput; } private void applySidedBrightness(QuadLightData out, Direction face, boolean shade) { float brightness = this.lightCache.getWorld().getBrightness(face, shade); - float[] br = out.br; + float[] br = out.shade; for (int i = 0; i < br.length; i++) { br[i] *= brightness; } } - private void applyComplex(AoNeighborInfo neighborInfo, ModelQuadView quad, BlockPos pos, Direction dir, QuadLightData out, int flags) { + private void applyComplex(AoNeighborInfo neighborInfo, QuadView quad, BlockPos pos, Direction dir, QuadLightData out, int flags) { // If the model quad is aligned to the block face, use the corner blocks above this face // TODO: is this correct for outset faces? do we even handle that case at all? - boolean offset = ModelQuadFlags.contains(flags, ModelQuadFlags.IS_ALIGNED); + boolean offset = (flags & GeometryHelper.AXIS_ALIGNED_FLAG) != 0; for (int i = 0; i < 4; i++) { // Clamp the vertex positions to the block's boundaries to prevent weird errors in lighting - float cx = clamp(quad.getX(i)); - float cy = clamp(quad.getY(i)); - float cz = clamp(quad.getZ(i)); + float cx = clamp(quad.x(i)); + float cy = clamp(quad.y(i)); + float cz = clamp(quad.z(i)); float[] weights = this.weights; neighborInfo.calculateCornerWeights(cx, cy, cz, weights); @@ -140,8 +154,8 @@ private void applyInsetPartialFace(BlockPos pos, Direction dir, float n1d, float float sl = (n1.getBlendedSkyLight(w) * n1d) + (n2.getBlendedSkyLight(w) * n2d); float bl = (n1.getBlendedBlockLight(w) * n1d) + (n2.getBlendedBlockLight(w) * n2d); - out.br[i] = ao; - out.lm[i] = getLightMapCoord(sl, bl); + out.shade[i] = ao; + out.texture[i] = getLightMapCoord(sl, bl); } /** @@ -158,8 +172,8 @@ private void applyAlignedPartialFace(BlockPos pos, Direction dir, float[] w, int float bl = faceData.getBlendedBlockLight(w); float ao = faceData.getBlendedShade(w); - out.br[i] = ao; - out.lm[i] = getLightMapCoord(sl, bl); + out.shade[i] = ao; + out.texture[i] = getLightMapCoord(sl, bl); } /** @@ -168,8 +182,8 @@ private void applyAlignedPartialFace(BlockPos pos, Direction dir, float[] w, int * have two contributing sides. */ private void applyAlignedFullFace(AoNeighborInfo neighborInfo, BlockPos pos, Direction dir, QuadLightData out, int flags) { - AoFaceData faceData = this.getCachedFaceData(pos, dir, ModelQuadFlags.contains(flags, ModelQuadFlags.IS_ALIGNED)); - neighborInfo.mapCorners(faceData.lm, faceData.ao, out.lm, out.br); + AoFaceData faceData = this.getCachedFaceData(pos, dir, (flags & GeometryHelper.AXIS_ALIGNED_FLAG) != 0); + neighborInfo.mapCorners(faceData.lm, faceData.ao, out.texture, out.shade); } /** diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/quad/ModelQuad.java b/src/main/java/me/jellysquid/mods/sodium/client/model/quad/ModelQuad.java deleted file mode 100644 index 64d657ae1b..0000000000 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/quad/ModelQuad.java +++ /dev/null @@ -1,128 +0,0 @@ -package me.jellysquid.mods.sodium.client.model.quad; - -import net.minecraft.client.texture.Sprite; - -import static me.jellysquid.mods.sodium.client.util.ModelQuadUtil.*; - -/** - * A simple implementation of the {@link ModelQuadViewMutable} interface which can provide an on-heap scratch area - * for storing quad vertex data. - */ -public class ModelQuad implements ModelQuadViewMutable { - private final int[] data = new int[VERTEX_SIZE * 4]; - private int flags; - - private Sprite sprite; - private int colorIdx; - - @Override - public void setX(int idx, float x) { - this.data[vertexOffset(idx) + POSITION_INDEX] = Float.floatToRawIntBits(x); - } - - @Override - public void setY(int idx, float y) { - this.data[vertexOffset(idx) + POSITION_INDEX + 1] = Float.floatToRawIntBits(y); - } - - @Override - public void setZ(int idx, float z) { - this.data[vertexOffset(idx) + POSITION_INDEX + 2] = Float.floatToRawIntBits(z); - } - - @Override - public void setColor(int idx, int color) { - this.data[vertexOffset(idx) + COLOR_INDEX] = color; - } - - @Override - public void setTexU(int idx, float u) { - this.data[vertexOffset(idx) + TEXTURE_INDEX] = Float.floatToRawIntBits(u); - } - - @Override - public void setTexV(int idx, float v) { - this.data[vertexOffset(idx) + TEXTURE_INDEX + 1] = Float.floatToRawIntBits(v); - } - - @Override - public void setLight(int idx, int light) { - this.data[vertexOffset(idx) + LIGHT_INDEX] = light; - } - - @Override - public void setNormal(int idx, int norm) { - this.data[vertexOffset(idx) + NORMAL_INDEX] = norm; - } - - @Override - public void setFlags(int flags) { - this.flags = flags; - } - - @Override - public void setSprite(Sprite sprite) { - this.sprite = sprite; - } - - @Override - public void setColorIndex(int index) { - this.colorIdx = index; - } - - @Override - public int getLight(int idx) { - return this.data[vertexOffset(idx) + LIGHT_INDEX]; - } - - @Override - public int getNormal(int idx) { - return this.data[vertexOffset(idx) + NORMAL_INDEX]; - } - - @Override - public int getColorIndex() { - return this.colorIdx; - } - - @Override - public float getX(int idx) { - return Float.intBitsToFloat(this.data[vertexOffset(idx) + POSITION_INDEX]); - } - - @Override - public float getY(int idx) { - return Float.intBitsToFloat(this.data[vertexOffset(idx) + POSITION_INDEX + 1]); - } - - @Override - public float getZ(int idx) { - return Float.intBitsToFloat(this.data[vertexOffset(idx) + POSITION_INDEX + 2]); - } - - @Override - public int getColor(int idx) { - return this.data[vertexOffset(idx) + COLOR_INDEX]; - } - - @Override - public float getTexU(int idx) { - return Float.intBitsToFloat(this.data[vertexOffset(idx) + TEXTURE_INDEX]); - } - - @Override - public float getTexV(int idx) { - return Float.intBitsToFloat(this.data[vertexOffset(idx) + TEXTURE_INDEX + 1]); - } - - @Override - public int getFlags() { - return this.flags; - } - - @Override - public Sprite getSprite() { - return this.sprite; - } - -} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/quad/ModelQuadViewMutable.java b/src/main/java/me/jellysquid/mods/sodium/client/model/quad/ModelQuadViewMutable.java deleted file mode 100644 index 01579a64d5..0000000000 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/quad/ModelQuadViewMutable.java +++ /dev/null @@ -1,64 +0,0 @@ -package me.jellysquid.mods.sodium.client.model.quad; - -import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadFlags; -import net.minecraft.client.texture.Sprite; - -/** - * Provides a mutable view to a model quad. - */ -public interface ModelQuadViewMutable extends ModelQuadView { - /** - * Sets the x-position of the vertex at index {@param idx} to the value {@param x} - */ - void setX(int idx, float x); - - /** - * Sets the y-position of the vertex at index {@param idx} to the value {@param y} - */ - void setY(int idx, float y); - - /** - * Sets the z-position of the vertex at index {@param idx} to the value {@param z} - */ - void setZ(int idx, float z); - - /** - * Sets the integer-encoded color of the vertex at index {@param idx} to the value {@param color} - */ - void setColor(int idx, int color); - - /** - * Sets the texture x-coordinate of the vertex at index {@param idx} to the value {@param u} - */ - void setTexU(int idx, float u); - - /** - * Sets the texture y-coordinate of the vertex at index {@param idx} to the value {@param v} - */ - void setTexV(int idx, float v); - - /** - * Sets the light map texture coordinate of the vertex at index {@param idx} to the value {@param light} - */ - void setLight(int idx, int light); - - /** - * Sets the integer-encoded normal vector of the vertex at index {@param idx} to the value {@param light} - */ - void setNormal(int idx, int norm); - - /** - * Sets the bit-flag field which contains the {@link ModelQuadFlags} for this quad - */ - void setFlags(int flags); - - /** - * Sets the sprite used by this quad - */ - void setSprite(Sprite sprite); - - /** - * Sets the color index used by this quad - */ - void setColorIndex(int index); -} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/quad/ModelQuadColorProvider.java b/src/main/java/me/jellysquid/mods/sodium/client/model/quad/QuadColorizer.java similarity index 86% rename from src/main/java/me/jellysquid/mods/sodium/client/model/quad/ModelQuadColorProvider.java rename to src/main/java/me/jellysquid/mods/sodium/client/model/quad/QuadColorizer.java index 9310bdac7e..aea81a5407 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/quad/ModelQuadColorProvider.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/model/quad/QuadColorizer.java @@ -4,6 +4,6 @@ import net.minecraft.world.BlockRenderView; import org.jetbrains.annotations.Nullable; -public interface ModelQuadColorProvider { +public interface QuadColorizer { int getColor(T state, @Nullable BlockRenderView world, @Nullable BlockPos pos, int tintIndex); } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/quad/blender/BiomeColorBlender.java b/src/main/java/me/jellysquid/mods/sodium/client/model/quad/blender/BiomeColorBlender.java index b6567539ab..110df9a6a2 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/quad/blender/BiomeColorBlender.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/model/quad/blender/BiomeColorBlender.java @@ -1,7 +1,8 @@ package me.jellysquid.mods.sodium.client.model.quad.blender; -import me.jellysquid.mods.sodium.client.model.quad.ModelQuadView; -import me.jellysquid.mods.sodium.client.model.quad.ModelQuadColorProvider; +import me.jellysquid.mods.sodium.client.model.quad.QuadColorizer; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView; +import net.minecraft.client.MinecraftClient; import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockRenderView; @@ -18,5 +19,9 @@ public interface BiomeColorBlender { * @param state The block state being rendered * @return An array of integer colors in ABGR format */ - int[] getColors(BlockRenderView world, BlockPos origin, ModelQuadView quad, ModelQuadColorProvider colorizer, T state); + int[] getColors(BlockRenderView world, BlockPos origin, QuadView quad, QuadColorizer colorizer, T state); + + static BiomeColorBlender create(MinecraftClient client) { + return client.options.biomeBlendRadius > 0 ? new SmoothBiomeColorBlender() : new FlatBiomeColorBlender(); + } } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/quad/blender/FlatBiomeColorBlender.java b/src/main/java/me/jellysquid/mods/sodium/client/model/quad/blender/FlatBiomeColorBlender.java index c16f1bfba4..c58fcaee9d 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/quad/blender/FlatBiomeColorBlender.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/model/quad/blender/FlatBiomeColorBlender.java @@ -1,8 +1,7 @@ package me.jellysquid.mods.sodium.client.model.quad.blender; -import me.jellysquid.mods.sodium.client.model.quad.ModelQuadView; -import me.jellysquid.mods.sodium.client.model.quad.ModelQuadColorProvider; -import me.jellysquid.mods.sodium.client.util.color.ColorARGB; +import me.jellysquid.mods.sodium.client.model.quad.QuadColorizer; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView; import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockRenderView; @@ -15,8 +14,8 @@ public class FlatBiomeColorBlender implements BiomeColorBlender { private final int[] cachedRet = new int[4]; @Override - public int[] getColors(BlockRenderView world, BlockPos origin, ModelQuadView quad, ModelQuadColorProvider colorizer, T state) { - Arrays.fill(this.cachedRet, ColorARGB.toABGR(colorizer.getColor(state, world, origin, quad.getColorIndex()))); + public int[] getColors(BlockRenderView world, BlockPos origin, QuadView quad, QuadColorizer colorizer, T state) { + Arrays.fill(this.cachedRet, colorizer.getColor(state, world, origin, quad.colorIndex())); return this.cachedRet; } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/quad/blender/SmoothBiomeColorBlender.java b/src/main/java/me/jellysquid/mods/sodium/client/model/quad/blender/SmoothBiomeColorBlender.java index f504349694..bfe998b00c 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/quad/blender/SmoothBiomeColorBlender.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/model/quad/blender/SmoothBiomeColorBlender.java @@ -1,10 +1,8 @@ package me.jellysquid.mods.sodium.client.model.quad.blender; -import me.jellysquid.mods.sodium.client.model.quad.ModelQuadView; -import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadFlags; -import me.jellysquid.mods.sodium.client.model.quad.ModelQuadColorProvider; -import me.jellysquid.mods.sodium.client.util.color.ColorARGB; +import me.jellysquid.mods.sodium.client.model.quad.QuadColorizer; import me.jellysquid.mods.sodium.client.util.color.ColorMixer; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView; import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockRenderView; @@ -14,10 +12,10 @@ public class SmoothBiomeColorBlender implements BiomeColorBlender { private final BlockPos.Mutable mpos = new BlockPos.Mutable(); @Override - public int[] getColors(BlockRenderView world, BlockPos origin, ModelQuadView quad, ModelQuadColorProvider colorizer, T state) { + public int[] getColors(BlockRenderView world, BlockPos origin, QuadView quad, QuadColorizer colorizer, T state) { final int[] colors = this.cachedRet; - boolean aligned = ModelQuadFlags.contains(quad.getFlags(), ModelQuadFlags.IS_ALIGNED); + boolean aligned = true; for (int i = 0; i < 4; i++) { // If the vertex is aligned to the block grid, we do not need to interpolate @@ -31,25 +29,23 @@ public int[] getColors(BlockRenderView world, BlockPos origin, ModelQuadView return colors; } - private int getVertexColor(ModelQuadColorProvider colorizer, BlockRenderView world, T state, BlockPos origin, - ModelQuadView quad, int vertexIdx) { - final int x = origin.getX() + (int) quad.getX(vertexIdx); - final int z = origin.getZ() + (int) quad.getZ(vertexIdx); + private int getVertexColor(QuadColorizer colorizer, BlockRenderView world, T state, BlockPos origin, + QuadView quad, int vertexIdx) { + final int x = origin.getX() + (int) quad.x(vertexIdx); + final int z = origin.getZ() + (int) quad.z(vertexIdx); - final int color = this.getBlockColor(colorizer, world, state, origin, x, z, quad.getColorIndex()); - - return ColorARGB.toABGR(color); + return this.getBlockColor(colorizer, world, state, origin, x, z, quad.colorIndex()); } - private int getBlockColor(ModelQuadColorProvider colorizer, BlockRenderView world, T state, BlockPos origin, + private int getBlockColor(QuadColorizer colorizer, BlockRenderView world, T state, BlockPos origin, int x, int z, int colorIdx) { return colorizer.getColor(state, world, this.mpos.set(x, origin.getY(), z), colorIdx); } - private int getInterpolatedVertexColor(ModelQuadColorProvider colorizer, BlockRenderView world, T state, - BlockPos origin, ModelQuadView quad, int vertexIdx) { - final float x = quad.getX(vertexIdx); - final float z = quad.getZ(vertexIdx); + private int getInterpolatedVertexColor(QuadColorizer colorizer, BlockRenderView world, T state, + BlockPos origin, QuadView quad, int vertexIdx) { + final float x = quad.x(vertexIdx); + final float z = quad.z(vertexIdx); final int intX = (int) x; final int intZ = (int) z; @@ -59,10 +55,10 @@ private int getInterpolatedVertexColor(ModelQuadColorProvider colorizer, final int originZ = origin.getZ() + intZ; // Retrieve the color values for each neighbor - final int c1 = this.getBlockColor(colorizer, world, state, origin, originX, originZ, quad.getColorIndex()); - final int c2 = this.getBlockColor(colorizer, world, state, origin, originX, originZ + 1, quad.getColorIndex()); - final int c3 = this.getBlockColor(colorizer, world, state, origin, originX + 1, originZ, quad.getColorIndex()); - final int c4 = this.getBlockColor(colorizer, world, state, origin, originX + 1, originZ + 1, quad.getColorIndex()); + final int c1 = this.getBlockColor(colorizer, world, state, origin, originX, originZ, quad.colorIndex()); + final int c2 = this.getBlockColor(colorizer, world, state, origin, originX, originZ + 1, quad.colorIndex()); + final int c3 = this.getBlockColor(colorizer, world, state, origin, originX + 1, originZ, quad.colorIndex()); + final int c4 = this.getBlockColor(colorizer, world, state, origin, originX + 1, originZ + 1, quad.colorIndex()); final int result; @@ -86,7 +82,7 @@ private int getInterpolatedVertexColor(ModelQuadColorProvider colorizer, result = ColorMixer.mixARGB(r1, r2, x1, x2); } - return ColorARGB.toABGR(result); + return result; } } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/quad/properties/ModelQuadFacing.java b/src/main/java/me/jellysquid/mods/sodium/client/model/quad/properties/ModelQuadFacing.java index 092cb3bc84..aaa49b0962 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/quad/properties/ModelQuadFacing.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/model/quad/properties/ModelQuadFacing.java @@ -26,16 +26,4 @@ public static ModelQuadFacing fromDirection(Direction dir) { case EAST -> EAST; }; } - - public ModelQuadFacing getOpposite() { - return switch (this) { - case UP -> DOWN; - case DOWN -> UP; - case EAST -> WEST; - case WEST -> EAST; - case SOUTH -> NORTH; - case NORTH -> SOUTH; - default -> UNASSIGNED; - }; - } } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/quad/properties/ModelQuadFlags.java b/src/main/java/me/jellysquid/mods/sodium/client/model/quad/properties/ModelQuadFlags.java deleted file mode 100644 index 7533a0af67..0000000000 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/quad/properties/ModelQuadFlags.java +++ /dev/null @@ -1,81 +0,0 @@ -package me.jellysquid.mods.sodium.client.model.quad.properties; - -import me.jellysquid.mods.sodium.client.model.quad.ModelQuadView; -import net.minecraft.client.render.model.BakedQuad; -import net.minecraft.util.math.Direction; - -public class ModelQuadFlags { - /** - * Indicates that the quad is aligned to the block grid. - */ - public static final int IS_ALIGNED = 0b01; - - /** - * Indicates that the quad does not fully cover the given face for the model. - */ - public static final int IS_PARTIAL = 0b10; - - /** - * @return True if the bit-flag of {@link ModelQuadFlags} contains the given flag - */ - public static boolean contains(int flags, int mask) { - return (flags & mask) != 0; - } - - /** - * Calculates the properties of the given quad. This data is used later by the light pipeline in order to make - * certain optimizations. - */ - public static int getQuadFlags(BakedQuad bakedQuad) { - ModelQuadView quad = (ModelQuadView) bakedQuad; - Direction face = bakedQuad.getFace(); - - float minX = 32.0F; - float minY = 32.0F; - float minZ = 32.0F; - - float maxX = -32.0F; - float maxY = -32.0F; - float maxZ = -32.0F; - - for (int i = 0; i < 4; ++i) { - float x = quad.getX(i); - float y = quad.getY(i); - float z = quad.getZ(i); - - minX = Math.min(minX, x); - minY = Math.min(minY, y); - minZ = Math.min(minZ, z); - maxX = Math.max(maxX, x); - maxY = Math.max(maxY, y); - maxZ = Math.max(maxZ, z); - } - - boolean aligned = switch (face) { - case DOWN -> minY == maxY && minY < 0.0001f; - case UP -> minY == maxY && maxY > 0.9999F; - case NORTH -> minZ == maxZ && minZ < 0.0001f; - case SOUTH -> minZ == maxZ && maxZ > 0.9999F; - case WEST -> minX == maxX && minX < 0.0001f; - case EAST -> minX == maxX && maxX > 0.9999F; - }; - - boolean partial = switch (face.getAxis()) { - case X -> minY >= 0.0001f || minZ >= 0.0001f || maxY <= 0.9999F || maxZ <= 0.9999F; - case Y -> minX >= 0.0001f || minZ >= 0.0001f || maxX <= 0.9999F || maxZ <= 0.9999F; - case Z -> minX >= 0.0001f || minY >= 0.0001f || maxX <= 0.9999F || maxY <= 0.9999F; - }; - - int flags = 0; - - if (partial) { - flags |= IS_PARTIAL; - } - - if (aligned) { - flags |= IS_ALIGNED; - } - - return flags; - } -} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/VanillaVertexType.java b/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/VanillaVertexType.java index 4540308254..f4c2e43e93 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/VanillaVertexType.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/VanillaVertexType.java @@ -1,6 +1,6 @@ package me.jellysquid.mods.sodium.client.model.vertex; -import me.jellysquid.mods.sodium.client.gl.attribute.BufferVertexFormat; +import me.jellysquid.mods.thingl.attribute.BufferVertexFormat; import me.jellysquid.mods.sodium.client.model.vertex.buffer.VertexBufferView; import me.jellysquid.mods.sodium.client.model.vertex.type.BlittableVertexType; import me.jellysquid.mods.sodium.client.model.vertex.type.BufferVertexType; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/buffer/VertexBufferBuilder.java b/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/buffer/VertexBufferBuilder.java index 05818eb603..8cde184058 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/buffer/VertexBufferBuilder.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/buffer/VertexBufferBuilder.java @@ -1,7 +1,7 @@ package me.jellysquid.mods.sodium.client.model.vertex.buffer; -import me.jellysquid.mods.sodium.client.gl.attribute.BufferVertexFormat; -import me.jellysquid.mods.sodium.client.util.NativeBuffer; +import me.jellysquid.mods.thingl.attribute.BufferVertexFormat; +import me.jellysquid.mods.thingl.util.NativeBuffer; import org.lwjgl.system.MemoryUtil; import java.nio.ByteBuffer; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/buffer/VertexBufferView.java b/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/buffer/VertexBufferView.java index 6303760496..7bbe94e7e8 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/buffer/VertexBufferView.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/buffer/VertexBufferView.java @@ -1,6 +1,6 @@ package me.jellysquid.mods.sodium.client.model.vertex.buffer; -import me.jellysquid.mods.sodium.client.gl.attribute.BufferVertexFormat; +import me.jellysquid.mods.thingl.attribute.BufferVertexFormat; import java.nio.ByteBuffer; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/buffer/VertexBufferWriter.java b/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/buffer/VertexBufferWriter.java index c9b66e04af..7c801d43a0 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/buffer/VertexBufferWriter.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/buffer/VertexBufferWriter.java @@ -1,6 +1,6 @@ package me.jellysquid.mods.sodium.client.model.vertex.buffer; -import me.jellysquid.mods.sodium.client.gl.attribute.BufferVertexFormat; +import me.jellysquid.mods.thingl.attribute.BufferVertexFormat; import me.jellysquid.mods.sodium.client.model.vertex.VertexSink; import me.jellysquid.mods.sodium.client.model.vertex.type.BufferVertexType; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/formats/GlyphVertexSink.java b/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/formats/GlyphVertexSink.java index 93f216130a..70965a7da5 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/formats/GlyphVertexSink.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/formats/GlyphVertexSink.java @@ -7,8 +7,8 @@ import me.jellysquid.mods.sodium.client.model.vertex.buffer.VertexBufferWriterUnsafe; import me.jellysquid.mods.sodium.client.model.vertex.fallback.VertexWriterFallback; import me.jellysquid.mods.sodium.client.util.color.ColorABGR; -import me.jellysquid.mods.sodium.client.util.math.Matrix4fExtended; -import me.jellysquid.mods.sodium.client.util.math.MatrixUtil; +import me.jellysquid.mods.sodium.client.interop.vanilla.matrix.Matrix4fExtended; +import me.jellysquid.mods.sodium.client.interop.vanilla.matrix.MatrixUtil; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexFormat; import net.minecraft.client.render.VertexFormats; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/formats/LineVertexSink.java b/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/formats/LineVertexSink.java index b1c158ea6e..e75c4ef668 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/formats/LineVertexSink.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/formats/LineVertexSink.java @@ -6,7 +6,7 @@ import me.jellysquid.mods.sodium.client.model.vertex.buffer.VertexBufferWriterNio; import me.jellysquid.mods.sodium.client.model.vertex.buffer.VertexBufferWriterUnsafe; import me.jellysquid.mods.sodium.client.model.vertex.fallback.VertexWriterFallback; -import me.jellysquid.mods.sodium.client.util.Norm3b; +import me.jellysquid.mods.sodium.client.util.geometry.Norm3b; import me.jellysquid.mods.sodium.client.util.color.ColorABGR; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexFormat; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/formats/ModelQuadVertexSink.java b/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/formats/ModelQuadVertexSink.java index 610877e356..05fab622fb 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/formats/ModelQuadVertexSink.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/formats/ModelQuadVertexSink.java @@ -6,10 +6,10 @@ import me.jellysquid.mods.sodium.client.model.vertex.buffer.VertexBufferWriterNio; import me.jellysquid.mods.sodium.client.model.vertex.buffer.VertexBufferWriterUnsafe; import me.jellysquid.mods.sodium.client.model.vertex.fallback.VertexWriterFallback; -import me.jellysquid.mods.sodium.client.util.Norm3b; +import me.jellysquid.mods.sodium.client.util.geometry.Norm3b; import me.jellysquid.mods.sodium.client.util.color.ColorABGR; -import me.jellysquid.mods.sodium.client.util.math.Matrix4fExtended; -import me.jellysquid.mods.sodium.client.util.math.MatrixUtil; +import me.jellysquid.mods.sodium.client.interop.vanilla.matrix.Matrix4fExtended; +import me.jellysquid.mods.sodium.client.interop.vanilla.matrix.MatrixUtil; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexFormat; import net.minecraft.client.render.VertexFormats; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/formats/generic/PositionColorSink.java b/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/formats/generic/PositionColorSink.java index e2f2e272c3..0d5acd08c0 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/formats/generic/PositionColorSink.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/formats/generic/PositionColorSink.java @@ -7,8 +7,8 @@ import me.jellysquid.mods.sodium.client.model.vertex.buffer.VertexBufferWriterUnsafe; import me.jellysquid.mods.sodium.client.model.vertex.fallback.VertexWriterFallback; import me.jellysquid.mods.sodium.client.util.color.ColorABGR; -import me.jellysquid.mods.sodium.client.util.math.Matrix4fExtended; -import me.jellysquid.mods.sodium.client.util.math.MatrixUtil; +import me.jellysquid.mods.sodium.client.interop.vanilla.matrix.Matrix4fExtended; +import me.jellysquid.mods.sodium.client.interop.vanilla.matrix.MatrixUtil; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexFormat; import net.minecraft.client.render.VertexFormats; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/formats/generic/PositionTextureSink.java b/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/formats/generic/PositionTextureSink.java index 53da4bcdc0..cbacaab53e 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/formats/generic/PositionTextureSink.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/formats/generic/PositionTextureSink.java @@ -6,8 +6,8 @@ import me.jellysquid.mods.sodium.client.model.vertex.buffer.VertexBufferWriterNio; import me.jellysquid.mods.sodium.client.model.vertex.buffer.VertexBufferWriterUnsafe; import me.jellysquid.mods.sodium.client.model.vertex.fallback.VertexWriterFallback; -import me.jellysquid.mods.sodium.client.util.math.Matrix4fExtended; -import me.jellysquid.mods.sodium.client.util.math.MatrixUtil; +import me.jellysquid.mods.sodium.client.interop.vanilla.matrix.Matrix4fExtended; +import me.jellysquid.mods.sodium.client.interop.vanilla.matrix.MatrixUtil; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexFormat; import net.minecraft.client.render.VertexFormats; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/type/BufferVertexType.java b/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/type/BufferVertexType.java index 2a4cdaa65c..ad9dafe19a 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/type/BufferVertexType.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/type/BufferVertexType.java @@ -1,6 +1,6 @@ package me.jellysquid.mods.sodium.client.model.vertex.type; -import me.jellysquid.mods.sodium.client.gl.attribute.BufferVertexFormat; +import me.jellysquid.mods.thingl.attribute.BufferVertexFormat; import me.jellysquid.mods.sodium.client.model.vertex.VertexSink; /** diff --git a/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/type/CustomVertexType.java b/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/type/CustomVertexType.java index 980c010155..5d36827a62 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/type/CustomVertexType.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/model/vertex/type/CustomVertexType.java @@ -1,7 +1,7 @@ package me.jellysquid.mods.sodium.client.model.vertex.type; -import me.jellysquid.mods.sodium.client.gl.attribute.BufferVertexFormat; -import me.jellysquid.mods.sodium.client.gl.attribute.GlVertexFormat; +import me.jellysquid.mods.thingl.attribute.BufferVertexFormat; +import me.jellysquid.mods.thingl.attribute.GlVertexFormat; import me.jellysquid.mods.sodium.client.model.vertex.VertexSink; public interface CustomVertexType> extends BufferVertexType { diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/IndexedVertexData.java b/src/main/java/me/jellysquid/mods/sodium/client/render/IndexedVertexData.java similarity index 67% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/IndexedVertexData.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/IndexedVertexData.java index f4860996ed..50d269d338 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/IndexedVertexData.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/IndexedVertexData.java @@ -1,7 +1,7 @@ -package me.jellysquid.mods.sodium.client.gl.buffer; +package me.jellysquid.mods.sodium.client.render; -import me.jellysquid.mods.sodium.client.gl.attribute.GlVertexFormat; -import me.jellysquid.mods.sodium.client.util.NativeBuffer; +import me.jellysquid.mods.thingl.attribute.GlVertexFormat; +import me.jellysquid.mods.thingl.util.NativeBuffer; /** * Helper type for tagging the vertex format alongside the raw buffer data. diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/SodiumWorldRenderer.java b/src/main/java/me/jellysquid/mods/sodium/client/render/SodiumWorldRenderer.java index 6373c4e79d..dfa9ca669e 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/SodiumWorldRenderer.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/SodiumWorldRenderer.java @@ -3,19 +3,18 @@ import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import me.jellysquid.mods.sodium.client.SodiumClientMod; -import me.jellysquid.mods.sodium.client.gl.device.CommandList; -import me.jellysquid.mods.sodium.client.gl.device.RenderDevice; -import me.jellysquid.mods.sodium.client.render.chunk.ChunkRenderMatrices; +import me.jellysquid.mods.thingl.device.CommandList; +import me.jellysquid.mods.thingl.device.RenderDevice; +import me.jellysquid.mods.sodium.client.render.chunk.context.ChunkRenderMatrices; import me.jellysquid.mods.sodium.client.render.chunk.RenderSectionManager; import me.jellysquid.mods.sodium.client.render.chunk.data.ChunkRenderData; import me.jellysquid.mods.sodium.client.render.chunk.passes.BlockRenderPass; import me.jellysquid.mods.sodium.client.render.chunk.passes.BlockRenderPassManager; -import me.jellysquid.mods.sodium.client.render.pipeline.context.ChunkRenderCacheShared; -import me.jellysquid.mods.sodium.client.util.NativeBuffer; -import me.jellysquid.mods.sodium.client.world.ChunkStatusListener; -import me.jellysquid.mods.sodium.client.world.ClientChunkManagerExtended; -import me.jellysquid.mods.sodium.client.world.WorldRendererExtended; -import me.jellysquid.mods.sodium.common.util.ListUtil; +import me.jellysquid.mods.thingl.util.NativeBuffer; +import me.jellysquid.mods.sodium.client.interop.vanilla.world.ChunkStatusListener; +import me.jellysquid.mods.sodium.client.interop.vanilla.world.ClientChunkManagerExtended; +import me.jellysquid.mods.sodium.client.interop.vanilla.world.WorldRendererExtended; +import me.jellysquid.mods.sodium.client.util.ListUtil; import net.minecraft.block.entity.BlockEntity; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; @@ -103,8 +102,6 @@ public void setWorld(ClientWorld world) { private void loadWorld(ClientWorld world) { this.world = world; - ChunkRenderCacheShared.createRenderContext(this.world); - try (CommandList commandList = RenderDevice.INSTANCE.createCommandList()) { this.initRenderer(commandList); } @@ -113,8 +110,6 @@ private void loadWorld(ClientWorld world) { } private void unloadWorld() { - ChunkRenderCacheShared.destroyRenderContext(this.world); - if (this.renderSectionManager != null) { this.renderSectionManager.destroy(); this.renderSectionManager = null; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/ContainerBatch.java b/src/main/java/me/jellysquid/mods/sodium/client/render/batch/ContainerBatch.java similarity index 97% rename from src/main/java/me/jellysquid/mods/sodium/client/render/ContainerBatch.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/batch/ContainerBatch.java index a0466ad7c2..df3931e25b 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/ContainerBatch.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/batch/ContainerBatch.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.render; +package me.jellysquid.mods.sodium.client.render.batch; import com.mojang.blaze3d.systems.RenderSystem; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/GuiRenderBatches.java b/src/main/java/me/jellysquid/mods/sodium/client/render/batch/GuiRenderBatches.java similarity index 76% rename from src/main/java/me/jellysquid/mods/sodium/client/render/GuiRenderBatches.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/batch/GuiRenderBatches.java index 7765473a66..e3a054757f 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/GuiRenderBatches.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/batch/GuiRenderBatches.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.render; +package me.jellysquid.mods.sodium.client.render.batch; public class GuiRenderBatches { public static final InGameGuiBatch HUD = new InGameGuiBatch(); diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/InGameGuiBatch.java b/src/main/java/me/jellysquid/mods/sodium/client/render/batch/InGameGuiBatch.java similarity index 94% rename from src/main/java/me/jellysquid/mods/sodium/client/render/InGameGuiBatch.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/batch/InGameGuiBatch.java index 88578bda18..23071ba078 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/InGameGuiBatch.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/batch/InGameGuiBatch.java @@ -1,8 +1,7 @@ -package me.jellysquid.mods.sodium.client.render; +package me.jellysquid.mods.sodium.client.render.batch; import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.render.*; -import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.util.Identifier; public class InGameGuiBatch extends ItemRenderBatch { diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/ItemRenderBatch.java b/src/main/java/me/jellysquid/mods/sodium/client/render/batch/ItemRenderBatch.java similarity index 94% rename from src/main/java/me/jellysquid/mods/sodium/client/render/ItemRenderBatch.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/batch/ItemRenderBatch.java index 2669a921ff..490f4ff121 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/ItemRenderBatch.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/batch/ItemRenderBatch.java @@ -1,6 +1,7 @@ -package me.jellysquid.mods.sodium.client.render; +package me.jellysquid.mods.sodium.client.render.batch; import com.mojang.blaze3d.systems.RenderSystem; +import me.jellysquid.mods.sodium.client.interop.vanilla.consumer.BatchingVertexConsumer; import net.minecraft.client.render.*; import net.minecraft.util.math.Matrix4f; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/RenderBatch.java b/src/main/java/me/jellysquid/mods/sodium/client/render/batch/RenderBatch.java similarity index 93% rename from src/main/java/me/jellysquid/mods/sodium/client/render/RenderBatch.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/batch/RenderBatch.java index 63908d67e0..9c6d9b4e0e 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/RenderBatch.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/batch/RenderBatch.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.render; +package me.jellysquid.mods.sodium.client.render.batch; import com.mojang.blaze3d.systems.RenderSystem; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkRenderList.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkRenderList.java index 4a51892ae6..587ec33aa8 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkRenderList.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkRenderList.java @@ -1,6 +1,7 @@ package me.jellysquid.mods.sodium.client.render.chunk; import it.unimi.dsi.fastutil.objects.*; +import me.jellysquid.mods.sodium.client.render.chunk.RenderSection; import me.jellysquid.mods.sodium.client.render.chunk.region.RenderRegion; import java.util.Collections; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/RenderSection.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/RenderSection.java index f40ab94167..5bbcab7470 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/RenderSection.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/RenderSection.java @@ -7,8 +7,9 @@ import me.jellysquid.mods.sodium.client.render.chunk.data.ChunkRenderData; import me.jellysquid.mods.sodium.client.render.chunk.passes.BlockRenderPass; import me.jellysquid.mods.sodium.client.render.chunk.region.RenderRegion; +import me.jellysquid.mods.sodium.client.render.chunk.renderer.ChunkGraphicsState; import me.jellysquid.mods.sodium.client.render.texture.SpriteUtil; -import me.jellysquid.mods.sodium.common.util.DirectionUtil; +import me.jellysquid.mods.sodium.client.util.DirectionUtil; import net.minecraft.client.render.chunk.ChunkOcclusionData; import net.minecraft.client.texture.Sprite; import net.minecraft.util.math.BlockPos; @@ -30,7 +31,6 @@ public class RenderSection { private final Map graphicsStates; private final RenderRegion region; private final ChunkGraphInfo graphInfo; - private final int chunkId; private final RenderSection[] adjacent = new RenderSection[DirectionUtil.ALL_DIRECTIONS.length]; @@ -55,14 +55,7 @@ public RenderSection(SodiumWorldRenderer worldRenderer, int chunkX, int chunkY, this.graphInfo = new ChunkGraphInfo(this); - this.graphicsStates = new EnumMap<>(BlockRenderPass.class); - - int rX = this.getChunkX() & (RenderRegion.REGION_WIDTH - 1); - int rY = this.getChunkY() & (RenderRegion.REGION_HEIGHT - 1); - int rZ = this.getChunkZ() & (RenderRegion.REGION_LENGTH - 1); - - this.chunkId = RenderRegion.getChunkIndex(rX, rY, rZ); - } + this.graphicsStates = new EnumMap<>(BlockRenderPass.class);} public RenderSection getAdjacent(Direction dir) { @@ -302,10 +295,6 @@ public void onBuildFinished(ChunkBuildResult result) { this.builtDetailLevel = result.detailLevel; } - public int getChunkId() { - return this.chunkId; - } - public int getBuiltDetailLevel() { return this.builtDetailLevel; } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/RenderSectionManager.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/RenderSectionManager.java index 8cfb0a8501..4cd0a899fb 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/RenderSectionManager.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/RenderSectionManager.java @@ -9,13 +9,16 @@ import it.unimi.dsi.fastutil.objects.ObjectArrayList; import it.unimi.dsi.fastutil.objects.ObjectList; import me.jellysquid.mods.sodium.client.SodiumClientMod; -import me.jellysquid.mods.sodium.client.gl.device.CommandList; -import me.jellysquid.mods.sodium.client.gl.device.RenderDevice; +import me.jellysquid.mods.thingl.device.CommandList; +import me.jellysquid.mods.thingl.device.RenderDevice; import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer; import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildResult; import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuilder; +import me.jellysquid.mods.sodium.client.render.chunk.context.ChunkCameraContext; +import me.jellysquid.mods.sodium.client.render.chunk.context.ChunkRenderMatrices; import me.jellysquid.mods.sodium.client.render.chunk.data.ChunkRenderData; -import me.jellysquid.mods.sodium.client.render.chunk.format.ChunkModelVertexFormats; +import me.jellysquid.mods.sodium.client.render.chunk.format.ModelVertexType; +import me.jellysquid.mods.sodium.client.render.chunk.graph.ChunkAdjacencyMap; import me.jellysquid.mods.sodium.client.render.chunk.graph.ChunkGraphInfo; import me.jellysquid.mods.sodium.client.render.chunk.graph.ChunkGraphIterationQueue; import me.jellysquid.mods.sodium.client.render.chunk.passes.BlockRenderPass; @@ -23,17 +26,18 @@ import me.jellysquid.mods.sodium.client.render.chunk.region.RenderRegion; import me.jellysquid.mods.sodium.client.render.chunk.region.RenderRegionManager; import me.jellysquid.mods.sodium.client.render.chunk.region.RenderRegionVisibility; +import me.jellysquid.mods.sodium.client.render.chunk.renderer.RegionChunkRenderer; import me.jellysquid.mods.sodium.client.render.chunk.tasks.ChunkRenderBuildTask; import me.jellysquid.mods.sodium.client.render.chunk.tasks.ChunkRenderEmptyBuildTask; import me.jellysquid.mods.sodium.client.render.chunk.tasks.ChunkRenderRebuildTask; import me.jellysquid.mods.sodium.client.util.MathUtil; -import me.jellysquid.mods.sodium.client.world.ChunkStatusListener; -import me.jellysquid.mods.sodium.client.world.ClientChunkManagerExtended; +import me.jellysquid.mods.sodium.client.interop.vanilla.world.ChunkStatusListener; +import me.jellysquid.mods.sodium.client.interop.vanilla.world.ClientChunkManagerExtended; import me.jellysquid.mods.sodium.client.world.WorldSlice; import me.jellysquid.mods.sodium.client.world.cloned.ChunkRenderContext; import me.jellysquid.mods.sodium.client.world.cloned.ClonedChunkSectionCache; -import me.jellysquid.mods.sodium.common.util.DirectionUtil; -import me.jellysquid.mods.sodium.common.util.collections.FutureQueueDrainingIterator; +import me.jellysquid.mods.sodium.client.util.DirectionUtil; +import me.jellysquid.mods.sodium.client.util.collections.FutureQueueDrainingIterator; import net.minecraft.block.entity.BlockEntity; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.Camera; @@ -109,7 +113,7 @@ public RenderSectionManager(SodiumWorldRenderer worldRenderer, BlockRenderPassMa this.worldRenderer = worldRenderer; this.world = world; - this.builder = new ChunkBuilder(ChunkModelVertexFormats.DEFAULT); + this.builder = new ChunkBuilder(ModelVertexType.INSTANCE); this.builder.init(world, renderPassManager); this.needsUpdate = true; @@ -125,7 +129,7 @@ public RenderSectionManager(SodiumWorldRenderer worldRenderer, BlockRenderPassMa float detailDistance = getDetailDistance(renderDistance); this.detailFarPlane = getDetailFarPlane(detailDistance); - this.chunkRenderer = new RegionChunkRenderer(RenderDevice.INSTANCE, ChunkModelVertexFormats.DEFAULT, detailDistance); + this.chunkRenderer = new RegionChunkRenderer(RenderDevice.INSTANCE, ModelVertexType.INSTANCE, detailDistance); } private static double getDetailFarPlane(float detailDistance) { diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/arena/AsyncBufferArena.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/AsyncBufferArena.java similarity index 97% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/arena/AsyncBufferArena.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/AsyncBufferArena.java index cc46e37b8d..87d38a0fc6 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/arena/AsyncBufferArena.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/AsyncBufferArena.java @@ -1,10 +1,10 @@ -package me.jellysquid.mods.sodium.client.gl.arena; +package me.jellysquid.mods.sodium.client.render.chunk.arena; -import me.jellysquid.mods.sodium.client.gl.arena.staging.StagingBuffer; -import me.jellysquid.mods.sodium.client.gl.buffer.GlBuffer; -import me.jellysquid.mods.sodium.client.gl.buffer.GlBufferUsage; -import me.jellysquid.mods.sodium.client.gl.buffer.GlMutableBuffer; -import me.jellysquid.mods.sodium.client.gl.device.CommandList; +import me.jellysquid.mods.sodium.client.render.chunk.arena.staging.StagingBuffer; +import me.jellysquid.mods.thingl.buffer.GlBuffer; +import me.jellysquid.mods.thingl.buffer.GlBufferUsage; +import me.jellysquid.mods.thingl.buffer.GlMutableBuffer; +import me.jellysquid.mods.thingl.device.CommandList; import java.nio.ByteBuffer; import java.util.ArrayList; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/arena/GlBufferArena.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/GlBufferArena.java similarity index 66% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/arena/GlBufferArena.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/GlBufferArena.java index 90bddf2b5e..6fa0cb1068 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/arena/GlBufferArena.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/GlBufferArena.java @@ -1,7 +1,7 @@ -package me.jellysquid.mods.sodium.client.gl.arena; +package me.jellysquid.mods.sodium.client.render.chunk.arena; -import me.jellysquid.mods.sodium.client.gl.buffer.GlBuffer; -import me.jellysquid.mods.sodium.client.gl.device.CommandList; +import me.jellysquid.mods.thingl.buffer.GlBuffer; +import me.jellysquid.mods.thingl.device.CommandList; import java.util.stream.Stream; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/arena/GlBufferSegment.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/GlBufferSegment.java similarity index 96% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/arena/GlBufferSegment.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/GlBufferSegment.java index 564039dfe6..7eca94f0e9 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/arena/GlBufferSegment.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/GlBufferSegment.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gl.arena; +package me.jellysquid.mods.sodium.client.render.chunk.arena; public class GlBufferSegment { private final GlBufferArena arena; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/arena/PendingBufferCopyCommand.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/PendingBufferCopyCommand.java similarity index 83% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/arena/PendingBufferCopyCommand.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/PendingBufferCopyCommand.java index e5a090ef16..c865fbb6e3 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/arena/PendingBufferCopyCommand.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/PendingBufferCopyCommand.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gl.arena; +package me.jellysquid.mods.sodium.client.render.chunk.arena; class PendingBufferCopyCommand { public final int readOffset; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/arena/PendingUpload.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/PendingUpload.java similarity index 86% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/arena/PendingUpload.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/PendingUpload.java index 38bb8da6b9..80c7c29a36 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/arena/PendingUpload.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/PendingUpload.java @@ -1,6 +1,6 @@ -package me.jellysquid.mods.sodium.client.gl.arena; +package me.jellysquid.mods.sodium.client.render.chunk.arena; -import me.jellysquid.mods.sodium.client.util.NativeBuffer; +import me.jellysquid.mods.thingl.util.NativeBuffer; public class PendingUpload { private final NativeBuffer data; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/arena/SwapBufferArena.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/SwapBufferArena.java similarity index 93% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/arena/SwapBufferArena.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/SwapBufferArena.java index a60485eb1f..1f471ca046 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/arena/SwapBufferArena.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/SwapBufferArena.java @@ -1,11 +1,11 @@ -package me.jellysquid.mods.sodium.client.gl.arena; +package me.jellysquid.mods.sodium.client.render.chunk.arena; import it.unimi.dsi.fastutil.objects.Reference2ObjectMap; import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap; -import me.jellysquid.mods.sodium.client.gl.buffer.GlBuffer; -import me.jellysquid.mods.sodium.client.gl.buffer.GlBufferUsage; -import me.jellysquid.mods.sodium.client.gl.buffer.GlMutableBuffer; -import me.jellysquid.mods.sodium.client.gl.device.CommandList; +import me.jellysquid.mods.thingl.buffer.GlBuffer; +import me.jellysquid.mods.thingl.buffer.GlBufferUsage; +import me.jellysquid.mods.thingl.buffer.GlMutableBuffer; +import me.jellysquid.mods.thingl.device.CommandList; import org.lwjgl.system.MemoryUtil; import java.nio.ByteBuffer; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/arena/staging/FallbackStagingBuffer.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/staging/FallbackStagingBuffer.java similarity index 76% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/arena/staging/FallbackStagingBuffer.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/staging/FallbackStagingBuffer.java index 7df5902219..0e5054d818 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/arena/staging/FallbackStagingBuffer.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/staging/FallbackStagingBuffer.java @@ -1,9 +1,9 @@ -package me.jellysquid.mods.sodium.client.gl.arena.staging; +package me.jellysquid.mods.sodium.client.render.chunk.arena.staging; -import me.jellysquid.mods.sodium.client.gl.buffer.GlBuffer; -import me.jellysquid.mods.sodium.client.gl.buffer.GlBufferUsage; -import me.jellysquid.mods.sodium.client.gl.buffer.GlMutableBuffer; -import me.jellysquid.mods.sodium.client.gl.device.CommandList; +import me.jellysquid.mods.thingl.buffer.GlBuffer; +import me.jellysquid.mods.thingl.buffer.GlBufferUsage; +import me.jellysquid.mods.thingl.buffer.GlMutableBuffer; +import me.jellysquid.mods.thingl.device.CommandList; import java.nio.ByteBuffer; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/arena/staging/MappedStagingBuffer.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/staging/MappedStagingBuffer.java similarity index 91% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/arena/staging/MappedStagingBuffer.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/staging/MappedStagingBuffer.java index 365600f8f2..300c5bb977 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/arena/staging/MappedStagingBuffer.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/staging/MappedStagingBuffer.java @@ -1,13 +1,13 @@ -package me.jellysquid.mods.sodium.client.gl.arena.staging; +package me.jellysquid.mods.sodium.client.render.chunk.arena.staging; import it.unimi.dsi.fastutil.PriorityQueue; import it.unimi.dsi.fastutil.objects.ObjectArrayFIFOQueue; -import me.jellysquid.mods.sodium.client.gl.buffer.*; -import me.jellysquid.mods.sodium.client.gl.device.CommandList; -import me.jellysquid.mods.sodium.client.gl.device.RenderDevice; -import me.jellysquid.mods.sodium.client.gl.functions.BufferStorageFunctions; -import me.jellysquid.mods.sodium.client.gl.sync.GlFence; -import me.jellysquid.mods.sodium.client.gl.util.EnumBitField; +import me.jellysquid.mods.thingl.buffer.*; +import me.jellysquid.mods.thingl.device.CommandList; +import me.jellysquid.mods.thingl.device.RenderDevice; +import me.jellysquid.mods.thingl.functions.BufferStorageFunctions; +import me.jellysquid.mods.thingl.sync.GlFence; +import me.jellysquid.mods.thingl.util.EnumBitField; import me.jellysquid.mods.sodium.client.util.MathUtil; import java.nio.ByteBuffer; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/arena/staging/StagingBuffer.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/staging/StagingBuffer.java similarity index 59% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/arena/staging/StagingBuffer.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/staging/StagingBuffer.java index 82252ec5e2..549c1bce2c 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/arena/staging/StagingBuffer.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/arena/staging/StagingBuffer.java @@ -1,7 +1,7 @@ -package me.jellysquid.mods.sodium.client.gl.arena.staging; +package me.jellysquid.mods.sodium.client.render.chunk.arena.staging; -import me.jellysquid.mods.sodium.client.gl.buffer.GlBuffer; -import me.jellysquid.mods.sodium.client.gl.device.CommandList; +import me.jellysquid.mods.thingl.buffer.GlBuffer; +import me.jellysquid.mods.thingl.device.CommandList; import java.nio.ByteBuffer; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/ChunkBuildBuffers.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/ChunkBuildBuffers.java index c3371afc1f..c8888e9c46 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/ChunkBuildBuffers.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/ChunkBuildBuffers.java @@ -1,7 +1,7 @@ package me.jellysquid.mods.sodium.client.render.chunk.compile; -import me.jellysquid.mods.sodium.client.gl.buffer.IndexedVertexData; -import me.jellysquid.mods.sodium.client.gl.util.ElementRange; +import me.jellysquid.mods.sodium.client.render.IndexedVertexData; +import me.jellysquid.mods.thingl.util.ElementRange; import me.jellysquid.mods.sodium.client.model.IndexBufferBuilder; import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadFacing; import me.jellysquid.mods.sodium.client.model.vertex.buffer.VertexBufferBuilder; @@ -13,11 +13,8 @@ import me.jellysquid.mods.sodium.client.render.chunk.format.ModelVertexSink; import me.jellysquid.mods.sodium.client.render.chunk.passes.BlockRenderPass; import me.jellysquid.mods.sodium.client.render.chunk.passes.BlockRenderPassManager; -import me.jellysquid.mods.sodium.client.util.NativeBuffer; -import net.minecraft.block.BlockState; +import me.jellysquid.mods.thingl.util.NativeBuffer; import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.RenderLayers; -import net.minecraft.util.math.Vec3i; import java.util.Arrays; import java.util.EnumMap; @@ -60,7 +57,7 @@ public ChunkBuildBuffers(ChunkVertexType vertexType, BlockRenderPassManager rend } } - public void init(ChunkRenderData.Builder renderData, int chunkId) { + public void init(ChunkRenderData.Builder renderData) { for (VertexBufferBuilder vertexBuffer : this.vertexBuffers) { vertexBuffer.start(); } @@ -75,7 +72,7 @@ public void init(ChunkRenderData.Builder renderData, int chunkId) { ModelVertexSink vertexSink = this.vertexType.createBufferWriter(this.vertexBuffers[i]); IndexBufferBuilder[] indexBuffers = this.indexBuffers[i]; - this.delegates[i] = new BakedChunkModelBuilder(indexBuffers, vertexSink, renderData, chunkId); + this.delegates[i] = new BakedChunkModelBuilder(indexBuffers, vertexSink, renderData); } } @@ -83,7 +80,7 @@ public void init(ChunkRenderData.Builder renderData, int chunkId) { * Return the {@link ChunkModelBuilder} for the given {@link RenderLayer} as mapped by the * {@link BlockRenderPassManager} for this render context. */ - public ChunkModelBuilder get(RenderLayer layer) { + public ChunkModelBuilder getBuilder(RenderLayer layer) { return this.delegates[this.renderPassManager.getRenderPassId(layer)]; } @@ -140,7 +137,7 @@ public void destroy() { } } - public ChunkModelBuilder get(BlockRenderPass pass) { + public ChunkModelBuilder getBuilder(BlockRenderPass pass) { return this.delegates[pass.ordinal()]; } } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/ChunkBuilder.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/ChunkBuilder.java index 642dd370c5..fa14ae74b1 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/ChunkBuilder.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/ChunkBuilder.java @@ -3,10 +3,9 @@ import me.jellysquid.mods.sodium.client.model.vertex.type.ChunkVertexType; import me.jellysquid.mods.sodium.client.render.chunk.passes.BlockRenderPassManager; import me.jellysquid.mods.sodium.client.render.chunk.tasks.ChunkRenderBuildTask; -import me.jellysquid.mods.sodium.client.render.pipeline.context.ChunkRenderCacheLocal; import me.jellysquid.mods.sodium.client.util.task.CancellationSource; -import me.jellysquid.mods.sodium.common.util.collections.QueueDrainingIterator; -import net.minecraft.client.MinecraftClient; +import me.jellysquid.mods.sodium.client.util.collections.QueueDrainingIterator; +import me.jellysquid.mods.sodium.client.render.renderer.TerrainRenderContext; import net.minecraft.client.world.ClientWorld; import net.minecraft.world.World; import org.apache.logging.log4j.LogManager; @@ -66,13 +65,11 @@ public void startWorkers() { throw new IllegalStateException("Threads are still alive while in the STOPPED state"); } - MinecraftClient client = MinecraftClient.getInstance(); - for (int i = 0; i < this.limitThreads; i++) { ChunkBuildBuffers buffers = new ChunkBuildBuffers(this.vertexType, this.renderPassManager); - ChunkRenderCacheLocal pipeline = new ChunkRenderCacheLocal(client, this.world); + TerrainRenderContext context = new TerrainRenderContext(this.world, buffers); - WorkerRunnable worker = new WorkerRunnable(buffers, pipeline); + WorkerRunnable worker = new WorkerRunnable(buffers, context); Thread thread = new Thread(worker, "Chunk Render Task Executor #" + i); thread.setPriority(Math.max(0, Thread.NORM_PRIORITY - 2)); @@ -200,11 +197,11 @@ private class WorkerRunnable implements Runnable { // Making this thread-local provides a small boost to performance by avoiding the overhead in synchronizing // caches between different CPU cores - private final ChunkRenderCacheLocal cache; + private final TerrainRenderContext context; - public WorkerRunnable(ChunkBuildBuffers bufferCache, ChunkRenderCacheLocal cache) { + public WorkerRunnable(ChunkBuildBuffers bufferCache, TerrainRenderContext context) { this.bufferCache = bufferCache; - this.cache = cache; + this.context = context; } @Override @@ -232,10 +229,11 @@ private void processJob(WrappedTask job) { } // Perform the build task with this worker's local resources and obtain the result - result = job.task.performBuild(this.cache, this.bufferCache, job); + result = job.task.performBuild(this.context, this.bufferCache, job); } catch (Exception e) { // Propagate any exception from chunk building job.future.completeExceptionally(e); + e.printStackTrace(); return; } finally { job.task.releaseResources(); diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/buffers/BakedChunkModelBuilder.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/buffers/BakedChunkModelBuilder.java index 858715069f..cb053bcd91 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/buffers/BakedChunkModelBuilder.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/buffers/BakedChunkModelBuilder.java @@ -2,30 +2,23 @@ import me.jellysquid.mods.sodium.client.model.IndexBufferBuilder; import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadFacing; -import me.jellysquid.mods.sodium.client.render.chunk.RegionChunkRenderer; -import me.jellysquid.mods.sodium.client.render.chunk.RenderSection; import me.jellysquid.mods.sodium.client.render.chunk.data.ChunkRenderData; import me.jellysquid.mods.sodium.client.render.chunk.format.ModelVertexSink; -import me.jellysquid.mods.sodium.client.render.chunk.region.RenderRegion; import net.minecraft.client.texture.Sprite; -import net.minecraft.util.math.Vec3i; public class BakedChunkModelBuilder implements ChunkModelBuilder { private final ModelVertexSink vertexSink; private final IndexBufferBuilder[] indexBufferBuilders; private final ChunkRenderData.Builder renderData; - private final int id; public BakedChunkModelBuilder(IndexBufferBuilder[] indexBufferBuilders, ModelVertexSink vertexSink, - ChunkRenderData.Builder renderData, - int chunkId) { + ChunkRenderData.Builder renderData) { this.indexBufferBuilders = indexBufferBuilders; this.vertexSink = vertexSink; this.renderData = renderData; - this.id = chunkId; } @Override @@ -42,9 +35,4 @@ public IndexBufferBuilder getIndexBufferBuilder(ModelQuadFacing facing) { public void addSprite(Sprite sprite) { this.renderData.addSprite(sprite); } - - @Override - public int getChunkId() { - return this.id; - } } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/buffers/ChunkModelBuilder.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/buffers/ChunkModelBuilder.java index 3b917fa700..04faa9ac74 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/buffers/ChunkModelBuilder.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/buffers/ChunkModelBuilder.java @@ -11,6 +11,4 @@ public interface ChunkModelBuilder { IndexBufferBuilder getIndexBufferBuilder(ModelQuadFacing facing); void addSprite(Sprite sprite); - - int getChunkId(); } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkCameraContext.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/context/ChunkCameraContext.java similarity index 92% rename from src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkCameraContext.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/chunk/context/ChunkCameraContext.java index 943dee4e09..ec3328176e 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkCameraContext.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/context/ChunkCameraContext.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.render.chunk; +package me.jellysquid.mods.sodium.client.render.chunk.context; public class ChunkCameraContext { public final int blockX, blockY, blockZ; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkRenderMatrices.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/context/ChunkRenderMatrices.java similarity index 53% rename from src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkRenderMatrices.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/chunk/context/ChunkRenderMatrices.java index bc4e7b3f90..fe129e8802 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkRenderMatrices.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/context/ChunkRenderMatrices.java @@ -1,13 +1,13 @@ -package me.jellysquid.mods.sodium.client.render.chunk; +package me.jellysquid.mods.sodium.client.render.chunk.context; import com.mojang.blaze3d.systems.RenderSystem; -import me.jellysquid.mods.sodium.client.util.math.JomlHelper; +import me.jellysquid.mods.sodium.client.interop.vanilla.matrix.MatrixConverter; import net.minecraft.client.util.math.MatrixStack; import org.joml.Matrix4f; public record ChunkRenderMatrices(Matrix4f projection, Matrix4f modelView) { public static ChunkRenderMatrices from(MatrixStack stack) { MatrixStack.Entry entry = stack.peek(); - return new ChunkRenderMatrices(JomlHelper.copy(RenderSystem.getProjectionMatrix()), JomlHelper.copy(entry.getModel())); + return new ChunkRenderMatrices(MatrixConverter.copy(RenderSystem.getProjectionMatrix()), MatrixConverter.copy(entry.getModel())); } } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/data/ChunkMeshData.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/data/ChunkMeshData.java index cb4a59aa17..f12e3664cc 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/data/ChunkMeshData.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/data/ChunkMeshData.java @@ -1,7 +1,7 @@ package me.jellysquid.mods.sodium.client.render.chunk.data; -import me.jellysquid.mods.sodium.client.gl.buffer.IndexedVertexData; -import me.jellysquid.mods.sodium.client.gl.util.ElementRange; +import me.jellysquid.mods.sodium.client.render.IndexedVertexData; +import me.jellysquid.mods.thingl.util.ElementRange; import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadFacing; import java.util.Map; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/data/ChunkRenderBounds.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/data/ChunkRenderBounds.java index 9e933dfa96..31ff00c08e 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/data/ChunkRenderBounds.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/data/ChunkRenderBounds.java @@ -20,62 +20,12 @@ public ChunkRenderBounds(float x1, float y1, float z1, float x2, float y2, float } public ChunkRenderBounds(ChunkSectionPos origin) { - this.x1 = origin.getMinX(); - this.y1 = origin.getMinY(); - this.z1 = origin.getMinZ(); + this.x1 = origin.getMinX() - 8; + this.y1 = origin.getMinY() - 8; + this.z1 = origin.getMinZ() - 8; - this.x2 = origin.getMaxX() + 1; - this.y2 = origin.getMaxY() + 1; - this.z2 = origin.getMaxZ() + 1; - } - - public static class Builder { - // Bit-mask of the blocks set on each axis - private int x = 0, y = 0, z = 0; - - public void addBlock(int x, int y, int z) { - // Accumulate bits on each axis for the given block position. This avoids needing to - // branch multiple times trying to determine if the bounds need to grow. The min/max - // value of each axis can later be extracted by counting the trailing/leading zeroes. - this.x |= 1 << x; - this.y |= 1 << y; - this.z |= 1 << z; - } - - public ChunkRenderBounds build(ChunkSectionPos origin) { - // If no bits were set on any axis, return the default bounds - if ((this.x | this.y | this.z) == 0) { - return new ChunkRenderBounds(origin); - } - - int x1 = origin.getMinX() + leftBound(this.x); - int x2 = origin.getMinX() + rightBound(this.x); - - int y1 = origin.getMinY() + leftBound(this.y); - int y2 = origin.getMinY() + rightBound(this.y); - - int z1 = origin.getMinZ() + leftBound(this.z); - int z2 = origin.getMinZ() + rightBound(this.z); - - return new ChunkRenderBounds( - Math.max(x1, origin.getMinX()) - 0.5f, - Math.max(y1, origin.getMinY()) - 0.5f, - Math.max(z1, origin.getMinZ()) - 0.5f, - - Math.min(x2, origin.getMaxX()) + 0.5f, - Math.min(y2, origin.getMaxY()) + 0.5f, - Math.min(z2, origin.getMaxZ()) + 0.5f - ); - } - - // Return the left-bound of the bit-masked axis - private static int leftBound(int i) { - return Integer.numberOfTrailingZeros(i); - } - - // Return the right-bound of the bit-masked axis - private static int rightBound(int i) { - return 32 - Integer.numberOfLeadingZeros(i); - } + this.x2 = origin.getMaxX() + 8; + this.y2 = origin.getMaxY() + 8; + this.z2 = origin.getMaxZ() + 8; } } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/ChunkModelVertexFormats.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/ChunkModelVertexFormats.java deleted file mode 100644 index 855993b200..0000000000 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/ChunkModelVertexFormats.java +++ /dev/null @@ -1,7 +0,0 @@ -package me.jellysquid.mods.sodium.client.render.chunk.format; - -import me.jellysquid.mods.sodium.client.render.chunk.format.sfp.ModelVertexType; - -public class ChunkModelVertexFormats { - public static final ModelVertexType DEFAULT = new ModelVertexType(); -} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/sfp/ModelVertexBufferWriterNio.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/ModelVertexBufferWriterNio.java similarity index 80% rename from src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/sfp/ModelVertexBufferWriterNio.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/ModelVertexBufferWriterNio.java index 62ed42f44d..df46835c0c 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/sfp/ModelVertexBufferWriterNio.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/ModelVertexBufferWriterNio.java @@ -1,15 +1,13 @@ -package me.jellysquid.mods.sodium.client.render.chunk.format.sfp; +package me.jellysquid.mods.sodium.client.render.chunk.format; import me.jellysquid.mods.sodium.client.model.vertex.buffer.VertexBufferView; import me.jellysquid.mods.sodium.client.model.vertex.buffer.VertexBufferWriterNio; -import me.jellysquid.mods.sodium.client.render.chunk.format.ChunkModelVertexFormats; -import me.jellysquid.mods.sodium.client.render.chunk.format.ModelVertexSink; import java.nio.ByteBuffer; public class ModelVertexBufferWriterNio extends VertexBufferWriterNio implements ModelVertexSink { public ModelVertexBufferWriterNio(VertexBufferView backingBuffer) { - super(backingBuffer, ChunkModelVertexFormats.DEFAULT); + super(backingBuffer, ModelVertexType.INSTANCE); } @Override diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/sfp/ModelVertexBufferWriterUnsafe.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/ModelVertexBufferWriterUnsafe.java similarity index 80% rename from src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/sfp/ModelVertexBufferWriterUnsafe.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/ModelVertexBufferWriterUnsafe.java index 58533989f6..4329ec3689 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/sfp/ModelVertexBufferWriterUnsafe.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/ModelVertexBufferWriterUnsafe.java @@ -1,14 +1,12 @@ -package me.jellysquid.mods.sodium.client.render.chunk.format.sfp; +package me.jellysquid.mods.sodium.client.render.chunk.format; import me.jellysquid.mods.sodium.client.model.vertex.buffer.VertexBufferView; import me.jellysquid.mods.sodium.client.model.vertex.buffer.VertexBufferWriterUnsafe; -import me.jellysquid.mods.sodium.client.render.chunk.format.ChunkModelVertexFormats; -import me.jellysquid.mods.sodium.client.render.chunk.format.ModelVertexSink; import org.lwjgl.system.MemoryUtil; public class ModelVertexBufferWriterUnsafe extends VertexBufferWriterUnsafe implements ModelVertexSink { public ModelVertexBufferWriterUnsafe(VertexBufferView backingBuffer) { - super(backingBuffer, ChunkModelVertexFormats.DEFAULT); + super(backingBuffer, ModelVertexType.INSTANCE); } @Override diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/ModelVertexSink.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/ModelVertexSink.java index 22a67f8017..0760ba36cc 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/ModelVertexSink.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/ModelVertexSink.java @@ -1,7 +1,6 @@ package me.jellysquid.mods.sodium.client.render.chunk.format; import me.jellysquid.mods.sodium.client.model.vertex.VertexSink; -import net.minecraft.util.math.Vec3i; public interface ModelVertexSink extends VertexSink { /** @@ -13,13 +12,9 @@ public interface ModelVertexSink extends VertexSink { * @param u The u-texture of the vertex * @param v The y-texture of the vertex * @param light The packed light-map coordinates of the vertex - * @param chunkId - * @param bits + * @param chunkId The local index of the chunk within a chunk region + * @param bits The material bits set for the vertex */ void writeVertex(float posX, float posY, float posZ, int color, float u, float v, int light, int chunkId, int bits); - default void writeVertex(Vec3i offset, float posX, float posY, float posZ, int color, float u, float v, int light, int chunkId, int bits) { - this.writeVertex(offset.getX() + posX, offset.getY() + posY, offset.getZ() + posZ, color, u, v, light, chunkId, bits); - } - } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/sfp/ModelVertexType.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/ModelVertexType.java similarity index 89% rename from src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/sfp/ModelVertexType.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/ModelVertexType.java index 4c169c9225..9148b7f802 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/sfp/ModelVertexType.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/ModelVertexType.java @@ -1,12 +1,10 @@ -package me.jellysquid.mods.sodium.client.render.chunk.format.sfp; +package me.jellysquid.mods.sodium.client.render.chunk.format; -import me.jellysquid.mods.sodium.client.gl.attribute.GlVertexAttributeFormat; -import me.jellysquid.mods.sodium.client.gl.attribute.GlVertexFormat; +import me.jellysquid.mods.thingl.attribute.GlVertexAttributeFormat; +import me.jellysquid.mods.thingl.attribute.GlVertexFormat; import me.jellysquid.mods.sodium.client.model.vertex.buffer.VertexBufferView; import me.jellysquid.mods.sodium.client.model.vertex.type.BlittableVertexType; import me.jellysquid.mods.sodium.client.model.vertex.type.ChunkVertexType; -import me.jellysquid.mods.sodium.client.render.chunk.format.ChunkMeshAttribute; -import me.jellysquid.mods.sodium.client.render.chunk.format.ModelVertexSink; import net.minecraft.client.render.VertexConsumer; /** @@ -14,6 +12,8 @@ * coordinates. */ public class ModelVertexType implements ChunkVertexType { + public static final ModelVertexType INSTANCE = new ModelVertexType(); + public static final GlVertexFormat VERTEX_FORMAT = GlVertexFormat.builder(ChunkMeshAttribute.class, 24) .addElement(ChunkMeshAttribute.POSITION_ID, 0, GlVertexAttributeFormat.UNSIGNED_SHORT, 4, false) .addElement(ChunkMeshAttribute.COLOR, 8, GlVertexAttributeFormat.UNSIGNED_BYTE, 4, true) diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkAdjacencyMap.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/graph/ChunkAdjacencyMap.java similarity index 96% rename from src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkAdjacencyMap.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/chunk/graph/ChunkAdjacencyMap.java index abe8f06a6e..7d1a79a3dd 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkAdjacencyMap.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/graph/ChunkAdjacencyMap.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.render.chunk; +package me.jellysquid.mods.sodium.client.render.chunk.graph; import it.unimi.dsi.fastutil.longs.*; import net.minecraft.util.math.ChunkPos; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/graph/ChunkGraphInfo.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/graph/ChunkGraphInfo.java index d2ab6fe857..f3402bf743 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/graph/ChunkGraphInfo.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/graph/ChunkGraphInfo.java @@ -2,7 +2,7 @@ import me.jellysquid.mods.sodium.client.render.chunk.RenderSection; import me.jellysquid.mods.sodium.client.render.chunk.data.ChunkRenderData; -import me.jellysquid.mods.sodium.common.util.DirectionUtil; +import me.jellysquid.mods.sodium.client.util.DirectionUtil; import net.minecraft.client.render.chunk.ChunkOcclusionData; import net.minecraft.util.math.Direction; import org.joml.FrustumIntersection; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/MaterialCutoutFlag.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/material/MaterialCutoutFlag.java similarity index 80% rename from src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/MaterialCutoutFlag.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/chunk/material/MaterialCutoutFlag.java index dc1191ab83..f1b53ca774 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/MaterialCutoutFlag.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/material/MaterialCutoutFlag.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.render.chunk.format; +package me.jellysquid.mods.sodium.client.render.chunk.material; public class MaterialCutoutFlag { public static final int NONE = 0; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/MaterialFlag.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/material/MaterialFlag.java similarity index 63% rename from src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/MaterialFlag.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/chunk/material/MaterialFlag.java index ed6eb5b058..c9b9e29581 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/MaterialFlag.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/material/MaterialFlag.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.render.chunk.format; +package me.jellysquid.mods.sodium.client.render.chunk.material; public class MaterialFlag { public static final int CUTOUT = 1; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/region/RenderRegion.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/region/RenderRegion.java index ee434deaae..9effb77711 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/region/RenderRegion.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/region/RenderRegion.java @@ -2,14 +2,14 @@ import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import me.jellysquid.mods.sodium.client.SodiumClientMod; -import me.jellysquid.mods.sodium.client.gl.arena.AsyncBufferArena; -import me.jellysquid.mods.sodium.client.gl.arena.GlBufferArena; -import me.jellysquid.mods.sodium.client.gl.arena.SwapBufferArena; -import me.jellysquid.mods.sodium.client.gl.arena.staging.StagingBuffer; -import me.jellysquid.mods.sodium.client.gl.device.CommandList; -import me.jellysquid.mods.sodium.client.gl.tessellation.GlTessellation; +import me.jellysquid.mods.sodium.client.render.chunk.arena.AsyncBufferArena; +import me.jellysquid.mods.sodium.client.render.chunk.arena.GlBufferArena; +import me.jellysquid.mods.sodium.client.render.chunk.arena.SwapBufferArena; +import me.jellysquid.mods.sodium.client.render.chunk.arena.staging.StagingBuffer; +import me.jellysquid.mods.thingl.device.CommandList; +import me.jellysquid.mods.thingl.tessellation.GlTessellation; import me.jellysquid.mods.sodium.client.render.chunk.RenderSection; -import me.jellysquid.mods.sodium.client.render.chunk.format.ChunkModelVertexFormats; +import me.jellysquid.mods.sodium.client.render.chunk.format.ModelVertexType; import me.jellysquid.mods.sodium.client.render.chunk.passes.BlockRenderPass; import me.jellysquid.mods.sodium.client.util.MathUtil; import net.minecraft.util.math.ChunkSectionPos; @@ -25,9 +25,9 @@ public class RenderRegion { public static final int REGION_HEIGHT = 4; public static final int REGION_LENGTH = 8; - private static final int REGION_WIDTH_M = RenderRegion.REGION_WIDTH - 1; - private static final int REGION_HEIGHT_M = RenderRegion.REGION_HEIGHT - 1; - private static final int REGION_LENGTH_M = RenderRegion.REGION_LENGTH - 1; + public static final int REGION_WIDTH_M = RenderRegion.REGION_WIDTH - 1; + public static final int REGION_HEIGHT_M = RenderRegion.REGION_HEIGHT - 1; + public static final int REGION_LENGTH_M = RenderRegion.REGION_LENGTH - 1; private static final int REGION_WIDTH_SH = Integer.bitCount(REGION_WIDTH_M); private static final int REGION_HEIGHT_SH = Integer.bitCount(REGION_HEIGHT_M); @@ -157,7 +157,7 @@ public RenderRegionArenas(CommandList commandList, StagingBuffer stagingBuffer) int expectedVertexCount = REGION_SIZE * 756; int expectedIndexCount = (expectedVertexCount / 4) * 6; - this.vertexBuffers = createArena(commandList, expectedVertexCount * ChunkModelVertexFormats.DEFAULT.getBufferVertexFormat().getStride(), stagingBuffer); + this.vertexBuffers = createArena(commandList, expectedVertexCount * ModelVertexType.INSTANCE.getBufferVertexFormat().getStride(), stagingBuffer); this.indexBuffers = createArena(commandList, expectedIndexCount * 4, stagingBuffer); } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/region/RenderRegionManager.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/region/RenderRegionManager.java index be602a4aa0..d1916a940e 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/region/RenderRegionManager.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/region/RenderRegionManager.java @@ -3,14 +3,14 @@ import it.unimi.dsi.fastutil.longs.Long2ReferenceOpenHashMap; import it.unimi.dsi.fastutil.objects.Reference2ObjectLinkedOpenHashMap; import me.jellysquid.mods.sodium.client.SodiumClientMod; -import me.jellysquid.mods.sodium.client.gl.arena.PendingUpload; -import me.jellysquid.mods.sodium.client.gl.arena.staging.FallbackStagingBuffer; -import me.jellysquid.mods.sodium.client.gl.arena.staging.MappedStagingBuffer; -import me.jellysquid.mods.sodium.client.gl.arena.staging.StagingBuffer; -import me.jellysquid.mods.sodium.client.gl.buffer.IndexedVertexData; -import me.jellysquid.mods.sodium.client.gl.device.CommandList; -import me.jellysquid.mods.sodium.client.gl.device.RenderDevice; -import me.jellysquid.mods.sodium.client.render.chunk.ChunkGraphicsState; +import me.jellysquid.mods.sodium.client.render.chunk.arena.PendingUpload; +import me.jellysquid.mods.sodium.client.render.chunk.arena.staging.FallbackStagingBuffer; +import me.jellysquid.mods.sodium.client.render.chunk.arena.staging.MappedStagingBuffer; +import me.jellysquid.mods.sodium.client.render.chunk.arena.staging.StagingBuffer; +import me.jellysquid.mods.sodium.client.render.IndexedVertexData; +import me.jellysquid.mods.thingl.device.CommandList; +import me.jellysquid.mods.thingl.device.RenderDevice; +import me.jellysquid.mods.sodium.client.render.chunk.renderer.ChunkGraphicsState; import me.jellysquid.mods.sodium.client.render.chunk.RenderSection; import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildResult; import me.jellysquid.mods.sodium.client.render.chunk.data.ChunkMeshData; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkGraphicsState.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/renderer/ChunkGraphicsState.java similarity index 83% rename from src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkGraphicsState.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/chunk/renderer/ChunkGraphicsState.java index 55c378f692..5f5bfa8555 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkGraphicsState.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/renderer/ChunkGraphicsState.java @@ -1,8 +1,7 @@ -package me.jellysquid.mods.sodium.client.render.chunk; +package me.jellysquid.mods.sodium.client.render.chunk.renderer; -import me.jellysquid.mods.sodium.client.gl.arena.GlBufferSegment; -import me.jellysquid.mods.sodium.client.gl.tessellation.GlIndexType; -import me.jellysquid.mods.sodium.client.gl.util.ElementRange; +import me.jellysquid.mods.sodium.client.render.chunk.arena.GlBufferSegment; +import me.jellysquid.mods.thingl.util.ElementRange; import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadFacing; import me.jellysquid.mods.sodium.client.render.chunk.data.ChunkMeshData; import org.apache.commons.lang3.Validate; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkRenderer.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/renderer/ChunkRenderer.java similarity index 78% rename from src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkRenderer.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/chunk/renderer/ChunkRenderer.java index 4f0f5042fd..ffb1f5990f 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkRenderer.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/renderer/ChunkRenderer.java @@ -1,7 +1,10 @@ -package me.jellysquid.mods.sodium.client.render.chunk; +package me.jellysquid.mods.sodium.client.render.chunk.renderer; -import me.jellysquid.mods.sodium.client.gl.device.CommandList; +import me.jellysquid.mods.thingl.device.CommandList; import me.jellysquid.mods.sodium.client.model.vertex.type.ChunkVertexType; +import me.jellysquid.mods.sodium.client.render.chunk.context.ChunkCameraContext; +import me.jellysquid.mods.sodium.client.render.chunk.ChunkRenderList; +import me.jellysquid.mods.sodium.client.render.chunk.context.ChunkRenderMatrices; import me.jellysquid.mods.sodium.client.render.chunk.passes.BlockRenderPass; /** diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/util/MultiDrawBatch.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/renderer/MultiDrawBatch.java similarity index 97% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/util/MultiDrawBatch.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/chunk/renderer/MultiDrawBatch.java index 5e3e7bb9f3..bb10bb44a1 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/util/MultiDrawBatch.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/renderer/MultiDrawBatch.java @@ -1,6 +1,7 @@ -package me.jellysquid.mods.sodium.client.gl.util; +package me.jellysquid.mods.sodium.client.render.chunk.renderer; import me.jellysquid.mods.sodium.client.SodiumClientMod; +import me.jellysquid.mods.thingl.util.MemoryUtilHelper; import org.lwjgl.PointerBuffer; import org.lwjgl.system.MemoryUtil; import org.lwjgl.system.Pointer; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/RegionChunkRenderer.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/renderer/RegionChunkRenderer.java similarity index 91% rename from src/main/java/me/jellysquid/mods/sodium/client/render/chunk/RegionChunkRenderer.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/chunk/renderer/RegionChunkRenderer.java index da65705ce8..50a853ec43 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/RegionChunkRenderer.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/renderer/RegionChunkRenderer.java @@ -1,29 +1,30 @@ -package me.jellysquid.mods.sodium.client.render.chunk; +package me.jellysquid.mods.sodium.client.render.chunk.renderer; import com.google.common.collect.Lists; -import com.mojang.blaze3d.systems.RenderSystem; import me.jellysquid.mods.sodium.client.SodiumClientMod; -import me.jellysquid.mods.sodium.client.gl.attribute.GlVertexAttributeBinding; -import me.jellysquid.mods.sodium.client.gl.buffer.GlBufferUsage; -import me.jellysquid.mods.sodium.client.gl.buffer.GlMutableBuffer; -import me.jellysquid.mods.sodium.client.gl.device.CommandList; -import me.jellysquid.mods.sodium.client.gl.device.DrawCommandList; -import me.jellysquid.mods.sodium.client.gl.device.RenderDevice; -import me.jellysquid.mods.sodium.client.gl.tessellation.GlIndexType; -import me.jellysquid.mods.sodium.client.gl.tessellation.GlPrimitiveType; -import me.jellysquid.mods.sodium.client.gl.tessellation.GlTessellation; -import me.jellysquid.mods.sodium.client.gl.tessellation.TessellationBinding; -import me.jellysquid.mods.sodium.client.gl.util.ElementRange; -import me.jellysquid.mods.sodium.client.gl.util.MultiDrawBatch; +import me.jellysquid.mods.thingl.attribute.GlVertexAttributeBinding; +import me.jellysquid.mods.thingl.buffer.GlBufferUsage; +import me.jellysquid.mods.thingl.buffer.GlMutableBuffer; +import me.jellysquid.mods.thingl.device.CommandList; +import me.jellysquid.mods.thingl.device.DrawCommandList; +import me.jellysquid.mods.thingl.device.RenderDevice; +import me.jellysquid.mods.thingl.tessellation.GlIndexType; +import me.jellysquid.mods.thingl.tessellation.GlPrimitiveType; +import me.jellysquid.mods.thingl.tessellation.GlTessellation; +import me.jellysquid.mods.thingl.tessellation.TessellationBinding; +import me.jellysquid.mods.thingl.util.ElementRange; import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadFacing; import me.jellysquid.mods.sodium.client.model.vertex.type.ChunkVertexType; +import me.jellysquid.mods.sodium.client.render.chunk.*; +import me.jellysquid.mods.sodium.client.render.chunk.context.ChunkCameraContext; +import me.jellysquid.mods.sodium.client.render.chunk.ChunkRenderList; +import me.jellysquid.mods.sodium.client.render.chunk.context.ChunkRenderMatrices; import me.jellysquid.mods.sodium.client.render.chunk.data.ChunkRenderBounds; import me.jellysquid.mods.sodium.client.render.chunk.format.ChunkMeshAttribute; import me.jellysquid.mods.sodium.client.render.chunk.passes.BlockRenderPass; import me.jellysquid.mods.sodium.client.render.chunk.region.RenderRegion; import me.jellysquid.mods.sodium.client.render.chunk.shader.ChunkShaderBindingPoints; import me.jellysquid.mods.sodium.client.render.chunk.shader.ChunkShaderInterface; -import me.jellysquid.mods.sodium.client.util.math.JomlHelper; import org.joml.Matrix4f; import org.lwjgl.system.MemoryStack; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ShaderChunkRenderer.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/renderer/ShaderChunkRenderer.java similarity index 93% rename from src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ShaderChunkRenderer.java rename to src/main/java/me/jellysquid/mods/sodium/client/render/chunk/renderer/ShaderChunkRenderer.java index 7f1d747554..a645c04838 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ShaderChunkRenderer.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/renderer/ShaderChunkRenderer.java @@ -1,15 +1,15 @@ -package me.jellysquid.mods.sodium.client.render.chunk; +package me.jellysquid.mods.sodium.client.render.chunk.renderer; import com.mojang.blaze3d.systems.RenderSystem; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import me.jellysquid.mods.sodium.client.gl.attribute.GlVertexFormat; -import me.jellysquid.mods.sodium.client.gl.device.RenderDevice; -import me.jellysquid.mods.sodium.client.gl.shader.*; -import me.jellysquid.mods.sodium.client.gl.texture.GlSampler; -import me.jellysquid.mods.sodium.client.gl.texture.GlTexture; -import me.jellysquid.mods.sodium.client.gl.texture.TextureData; +import me.jellysquid.mods.thingl.attribute.GlVertexFormat; +import me.jellysquid.mods.thingl.device.RenderDevice; +import me.jellysquid.mods.thingl.shader.*; +import me.jellysquid.mods.thingl.texture.GlSampler; +import me.jellysquid.mods.thingl.texture.GlTexture; +import me.jellysquid.mods.thingl.texture.TextureData; import me.jellysquid.mods.sodium.client.model.vertex.type.ChunkVertexType; -import me.jellysquid.mods.sodium.client.render.LightmapTextureManagerAccessor; +import me.jellysquid.mods.sodium.client.interop.vanilla.lightmap.LightmapTextureManagerAccessor; import me.jellysquid.mods.sodium.client.render.chunk.format.ChunkMeshAttribute; import me.jellysquid.mods.sodium.client.render.chunk.passes.BlockRenderPass; import me.jellysquid.mods.sodium.client.render.chunk.shader.*; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ChunkFogMode.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ChunkFogMode.java index b0f202601b..d6332208b9 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ChunkFogMode.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ChunkFogMode.java @@ -1,6 +1,7 @@ package me.jellysquid.mods.sodium.client.render.chunk.shader; import com.google.common.collect.ImmutableList; +import me.jellysquid.mods.thingl.shader.ShaderBindingContext; import java.util.List; import java.util.function.Function; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ChunkShaderBindingPoints.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ChunkShaderBindingPoints.java index 4ed392041e..1c87cb117f 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ChunkShaderBindingPoints.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ChunkShaderBindingPoints.java @@ -1,6 +1,6 @@ package me.jellysquid.mods.sodium.client.render.chunk.shader; -import me.jellysquid.mods.sodium.client.gl.shader.ShaderBindingPoint; +import me.jellysquid.mods.thingl.shader.ShaderBindingPoint; public class ChunkShaderBindingPoints { public static final ShaderBindingPoint ATTRIBUTE_POSITION_ID = new ShaderBindingPoint(1); diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ChunkShaderFogComponent.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ChunkShaderFogComponent.java index df37ba7b28..12cc02fbb9 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ChunkShaderFogComponent.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ChunkShaderFogComponent.java @@ -1,8 +1,9 @@ package me.jellysquid.mods.sodium.client.render.chunk.shader; import com.mojang.blaze3d.systems.RenderSystem; -import me.jellysquid.mods.sodium.client.gl.shader.uniform.GlUniformFloat; -import me.jellysquid.mods.sodium.client.gl.shader.uniform.GlUniformFloat4v; +import me.jellysquid.mods.thingl.shader.ShaderBindingContext; +import me.jellysquid.mods.thingl.shader.uniform.GlUniformFloat; +import me.jellysquid.mods.thingl.shader.uniform.GlUniformFloat4v; /** * These shader implementations try to remain compatible with the deprecated fixed function pipeline by manually diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ChunkShaderInterface.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ChunkShaderInterface.java index 41e120f488..6f95f8ba66 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ChunkShaderInterface.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ChunkShaderInterface.java @@ -1,10 +1,11 @@ package me.jellysquid.mods.sodium.client.render.chunk.shader; -import me.jellysquid.mods.sodium.client.gl.buffer.GlMutableBuffer; -import me.jellysquid.mods.sodium.client.gl.shader.uniform.GlUniformBlock; -import me.jellysquid.mods.sodium.client.gl.shader.uniform.GlUniformFloat; -import me.jellysquid.mods.sodium.client.gl.shader.uniform.GlUniformInt; -import me.jellysquid.mods.sodium.client.gl.shader.uniform.GlUniformMatrix4f; +import me.jellysquid.mods.thingl.buffer.GlMutableBuffer; +import me.jellysquid.mods.thingl.shader.ShaderBindingContext; +import me.jellysquid.mods.thingl.shader.uniform.GlUniformBlock; +import me.jellysquid.mods.thingl.shader.uniform.GlUniformFloat; +import me.jellysquid.mods.thingl.shader.uniform.GlUniformInt; +import me.jellysquid.mods.thingl.shader.uniform.GlUniformMatrix4f; import me.jellysquid.mods.sodium.client.model.vertex.type.ChunkVertexType; import org.joml.Matrix4f; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ChunkShaderOptions.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ChunkShaderOptions.java index 8465036cd0..4ffa45ee37 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ChunkShaderOptions.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ChunkShaderOptions.java @@ -1,6 +1,6 @@ package me.jellysquid.mods.sodium.client.render.chunk.shader; -import me.jellysquid.mods.sodium.client.gl.shader.ShaderConstants; +import me.jellysquid.mods.thingl.shader.ShaderConstants; import me.jellysquid.mods.sodium.client.render.chunk.passes.BlockRenderPass; public record ChunkShaderOptions(ChunkFogMode fog, BlockRenderPass pass) { diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/tasks/ChunkRenderBuildTask.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/tasks/ChunkRenderBuildTask.java index 4fa5d7acae..324ca35532 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/tasks/ChunkRenderBuildTask.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/tasks/ChunkRenderBuildTask.java @@ -2,8 +2,8 @@ import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildBuffers; import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildResult; -import me.jellysquid.mods.sodium.client.render.pipeline.context.ChunkRenderCacheLocal; import me.jellysquid.mods.sodium.client.util.task.CancellationSource; +import me.jellysquid.mods.sodium.client.render.renderer.TerrainRenderContext; /** * Build tasks are immutable jobs (with optional prioritization) which contain all the necessary state to perform @@ -20,14 +20,14 @@ public abstract class ChunkRenderBuildTask { * Executes the given build task asynchronously from the calling thread. The implementation should be careful not * to access or modify global mutable state. * - * @param cache The render cache to use for building this chunk + * @param context The render cache to use for building this chunk * @param buffers The temporary scratch buffers for rendering block data * @param cancellationSource The cancellation source which can be used to query if the task is cancelled * @return The build result of this task, containing any data which needs to be uploaded on the main-thread, or null * if the task was cancelled. */ - public abstract ChunkBuildResult performBuild(ChunkRenderCacheLocal cache, ChunkBuildBuffers buffers, - CancellationSource cancellationSource); + public abstract ChunkBuildResult performBuild(TerrainRenderContext context, ChunkBuildBuffers buffers, + CancellationSource cancellationSource); /** * Called on the main render thread when the task's execution returns. The implementation should release any diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/tasks/ChunkRenderEmptyBuildTask.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/tasks/ChunkRenderEmptyBuildTask.java index 3a9f64ac77..4ecb3749bb 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/tasks/ChunkRenderEmptyBuildTask.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/tasks/ChunkRenderEmptyBuildTask.java @@ -4,8 +4,8 @@ import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildBuffers; import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildResult; import me.jellysquid.mods.sodium.client.render.chunk.data.ChunkRenderData; -import me.jellysquid.mods.sodium.client.render.pipeline.context.ChunkRenderCacheLocal; import me.jellysquid.mods.sodium.client.util.task.CancellationSource; +import me.jellysquid.mods.sodium.client.render.renderer.TerrainRenderContext; import java.util.Collections; @@ -27,7 +27,7 @@ public ChunkRenderEmptyBuildTask(RenderSection render, int frame, int detailLeve } @Override - public ChunkBuildResult performBuild(ChunkRenderCacheLocal cache, ChunkBuildBuffers buffers, CancellationSource cancellationSource) { + public ChunkBuildResult performBuild(TerrainRenderContext context, ChunkBuildBuffers buffers, CancellationSource cancellationSource) { return new ChunkBuildResult(this.render, ChunkRenderData.EMPTY, Collections.emptyMap(), this.frame, this.detailLevel); } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/tasks/ChunkRenderRebuildTask.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/tasks/ChunkRenderRebuildTask.java index 7c87becdcb..4721b17c09 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/tasks/ChunkRenderRebuildTask.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/tasks/ChunkRenderRebuildTask.java @@ -7,19 +7,16 @@ import me.jellysquid.mods.sodium.client.render.chunk.data.ChunkRenderBounds; import me.jellysquid.mods.sodium.client.render.chunk.data.ChunkRenderData; import me.jellysquid.mods.sodium.client.render.chunk.passes.BlockRenderPass; -import me.jellysquid.mods.sodium.client.render.pipeline.context.ChunkRenderCacheLocal; import me.jellysquid.mods.sodium.client.util.task.CancellationSource; import me.jellysquid.mods.sodium.client.world.WorldSlice; import me.jellysquid.mods.sodium.client.world.cloned.ChunkRenderContext; +import me.jellysquid.mods.sodium.client.render.renderer.TerrainRenderContext; import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.RenderLayers; import net.minecraft.client.render.block.entity.BlockEntityRenderer; import net.minecraft.client.render.chunk.ChunkOcclusionDataBuilder; -import net.minecraft.client.render.model.BakedModel; import net.minecraft.fluid.FluidState; import net.minecraft.util.math.BlockPos; @@ -47,16 +44,14 @@ public ChunkRenderRebuildTask(RenderSection render, ChunkRenderContext context, } @Override - public ChunkBuildResult performBuild(ChunkRenderCacheLocal cache, ChunkBuildBuffers buffers, CancellationSource cancellationSource) { + public ChunkBuildResult performBuild(TerrainRenderContext context, ChunkBuildBuffers buffers, CancellationSource cancellationSource) { ChunkRenderData.Builder renderData = new ChunkRenderData.Builder(); ChunkOcclusionDataBuilder occluder = new ChunkOcclusionDataBuilder(); - ChunkRenderBounds.Builder bounds = new ChunkRenderBounds.Builder(); - buffers.init(renderData, this.render.getChunkId()); + buffers.init(renderData); + context.prepare(this.context); - cache.init(this.context); - - WorldSlice slice = cache.getWorldSlice(); + WorldSlice slice = context.getWorldSlice(); int minX = this.render.getOriginX(); int minY = this.render.getOriginY(); @@ -67,7 +62,6 @@ public ChunkBuildResult performBuild(ChunkRenderCacheLocal cache, ChunkBuildBuff int maxZ = minZ + 16; BlockPos.Mutable blockPos = new BlockPos.Mutable(); - BlockPos.Mutable offset = new BlockPos.Mutable(); for (int y = minY; y < maxY; y++) { if (cancellationSource.isCancelled()) { @@ -83,29 +77,15 @@ public ChunkBuildResult performBuild(ChunkRenderCacheLocal cache, ChunkBuildBuff } blockPos.set(x, y, z); - offset.set(x & 15, y & 15, z & 15); - - boolean rendered = false; if (blockState.getRenderType() == BlockRenderType.MODEL) { - BakedModel model = cache.getBlockModels() - .getModel(blockState); - - long seed = blockState.getRenderingSeed(blockPos); - - if (cache.getBlockRenderer().renderModel(slice, blockState, blockPos, offset, model, buffers, true, seed, this.detailLevel)) { - rendered = true; - } + context.renderBlock(blockState, blockPos, this.detailLevel); } FluidState fluidState = blockState.getFluidState(); if (!fluidState.isEmpty()) { - RenderLayer layer = RenderLayers.getFluidLayer(fluidState); - - if (cache.getFluidRenderer().render(slice, fluidState, blockPos, offset, buffers.get(layer))) { - rendered = true; - } + context.renderFluid(fluidState, blockPos); } if (blockState.hasBlockEntity()) { @@ -116,7 +96,6 @@ public ChunkBuildResult performBuild(ChunkRenderCacheLocal cache, ChunkBuildBuff if (renderer != null) { renderData.addBlockEntity(entity, !renderer.rendersOutsideBoundingBox(entity)); - rendered = true; } } } @@ -124,10 +103,6 @@ public ChunkBuildResult performBuild(ChunkRenderCacheLocal cache, ChunkBuildBuff if (blockState.isOpaqueFullCube(slice, blockPos)) { occluder.markClosed(blockPos); } - - if (rendered) { - bounds.addBlock(x & 15, y & 15, z & 15); - } } } } @@ -143,7 +118,7 @@ public ChunkBuildResult performBuild(ChunkRenderCacheLocal cache, ChunkBuildBuff } renderData.setOcclusionData(occluder.build()); - renderData.setBounds(bounds.build(this.render.getChunkPos())); + renderData.setBounds(new ChunkRenderBounds(this.render.getChunkPos())); return new ChunkBuildResult(this.render, renderData.build(), meshes, this.frame, this.detailLevel); } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/BlockRenderer.java b/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/BlockRenderer.java deleted file mode 100644 index 2964ce6a6a..0000000000 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/BlockRenderer.java +++ /dev/null @@ -1,224 +0,0 @@ -package me.jellysquid.mods.sodium.client.render.pipeline; - -import me.jellysquid.mods.sodium.client.model.IndexBufferBuilder; -import me.jellysquid.mods.sodium.client.model.light.LightMode; -import me.jellysquid.mods.sodium.client.model.light.LightPipeline; -import me.jellysquid.mods.sodium.client.model.light.LightPipelineProvider; -import me.jellysquid.mods.sodium.client.model.light.data.QuadLightData; -import me.jellysquid.mods.sodium.client.model.quad.ModelQuadView; -import me.jellysquid.mods.sodium.client.model.quad.blender.BiomeColorBlender; -import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadFacing; -import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadOrientation; -import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadWinding; -import me.jellysquid.mods.sodium.client.model.quad.ModelQuadColorProvider; -import me.jellysquid.mods.sodium.client.render.chunk.ChunkDetailLevel; -import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildBuffers; -import me.jellysquid.mods.sodium.client.render.chunk.compile.buffers.ChunkModelBuilder; -import me.jellysquid.mods.sodium.client.render.chunk.format.MaterialCutoutFlag; -import me.jellysquid.mods.sodium.client.render.chunk.format.MaterialFlag; -import me.jellysquid.mods.sodium.client.render.chunk.format.ModelVertexSink; -import me.jellysquid.mods.sodium.client.render.chunk.passes.BlockRenderPass; -import me.jellysquid.mods.sodium.client.render.occlusion.BlockOcclusionCache; -import me.jellysquid.mods.sodium.client.util.color.ColorABGR; -import me.jellysquid.mods.sodium.client.util.rand.XoRoShiRoRandom; -import me.jellysquid.mods.sodium.client.world.WorldSlice; -import me.jellysquid.mods.sodium.client.world.biome.BlockColorsExtended; -import me.jellysquid.mods.sodium.common.util.DirectionUtil; -import net.minecraft.block.*; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.RenderLayers; -import net.minecraft.client.render.model.BakedModel; -import net.minecraft.client.render.model.BakedQuad; -import net.minecraft.client.texture.Sprite; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.BlockRenderView; - -import java.util.List; -import java.util.Random; - -public class BlockRenderer { - private final Random random = new XoRoShiRoRandom(); - - private final BlockColorsExtended blockColors; - private final BlockOcclusionCache occlusionCache; - - private final QuadLightData cachedQuadLightData = new QuadLightData(); - - private final BiomeColorBlender biomeColorBlender; - private final LightPipelineProvider lighters; - - private final boolean useAmbientOcclusion; - - public BlockRenderer(MinecraftClient client, LightPipelineProvider lighters, BiomeColorBlender biomeColorBlender) { - this.blockColors = (BlockColorsExtended) client.getBlockColors(); - this.biomeColorBlender = biomeColorBlender; - - this.lighters = lighters; - - this.occlusionCache = new BlockOcclusionCache(); - this.useAmbientOcclusion = MinecraftClient.isAmbientOcclusionEnabled(); - } - - public boolean renderModel(WorldSlice world, BlockState state, BlockPos pos, BlockPos origin, BakedModel model, ChunkBuildBuffers buffers, boolean cull, long seed, int level) { - RenderLayer layer = RenderLayers.getBlockLayer(state); - BlockRenderPass pass = this.getRenderPassOverride(state, buffers.getRenderPass(layer)); - - if (!this.shouldDrawBlockForDetail(state, level)) { - return false; - } - - LightPipeline lighter = this.lighters.getLighter(this.getLightingMode(state, model)); - Vec3d offset = state.getModelOffset(world, pos); - - boolean rendered = false; - int bits = 0; - - if (layer == RenderLayer.getSolid() || layer == RenderLayer.getTranslucent()) { - bits |= MaterialCutoutFlag.shift(MaterialCutoutFlag.NONE); - } else if (layer == RenderLayer.getCutout() || layer == RenderLayer.getTripwire()) { - bits |= MaterialCutoutFlag.shift(MaterialCutoutFlag.TENTH); - bits |= MaterialFlag.CUTOUT; - } else if (layer == RenderLayer.getCutoutMipped()) { - bits |= MaterialCutoutFlag.shift(MaterialCutoutFlag.HALF); - } - - for (Direction dir : DirectionUtil.ALL_DIRECTIONS) { - this.random.setSeed(seed); - - List sided = model.getQuads(state, dir, this.random); - - if (sided.isEmpty()) { - continue; - } - - if (!cull || this.occlusionCache.shouldDrawSide(state, world, pos, dir)) { - if (this.shouldDrawSideForDetail(world, state, pos, dir, level)) { - this.renderQuadList(world, state, pos, origin, lighter, offset, buffers, pass, sided, ModelQuadFacing.fromDirection(dir), bits); - rendered = true; - } - } - } - - this.random.setSeed(seed); - - List all = model.getQuads(state, null, this.random); - - if (!all.isEmpty()) { - this.renderQuadList(world, state, pos, origin, lighter, offset, buffers, pass, all, ModelQuadFacing.UNASSIGNED, bits); - - rendered = true; - } - - return rendered; - } - - private BlockRenderPass getRenderPassOverride(BlockState state, BlockRenderPass pass) { - Block block = state.getBlock(); - - if (block instanceof VineBlock || block instanceof PlantBlock || block instanceof LeavesBlock || block instanceof AbstractPlantPartBlock) { - return BlockRenderPass.OPAQUE_DETAIL; - } - - return pass; - } - - private boolean shouldDrawBlockForDetail(BlockState state, int level) { - Block block = state.getBlock(); - - if (level < ChunkDetailLevel.MAXIMUM_DETAIL) { - return !(block instanceof VineBlock) && !(block instanceof PlantBlock) && !(block instanceof AbstractPlantPartBlock); - } - - return true; - } - - private boolean shouldDrawSideForDetail(WorldSlice world, BlockState state, BlockPos pos, Direction dir, int level) { - if (state.getBlock() instanceof LeavesBlock) { - BlockState adjState = world.getBlockState(pos.getX() + dir.getOffsetX(), pos.getY() + dir.getOffsetY(), pos.getZ() + dir.getOffsetZ()); - - if (adjState.isOpaque() || adjState.getBlock() instanceof LeavesBlock) { - return level == ChunkDetailLevel.MAXIMUM_DETAIL; - } - } - - return true; - } - - private void renderQuadList(BlockRenderView world, BlockState state, BlockPos pos, BlockPos origin, LightPipeline lighter, Vec3d offset, - ChunkBuildBuffers buffers, BlockRenderPass pass, List quads, ModelQuadFacing facing, int bits) { - ChunkModelBuilder builder = buffers.get(pass); - ModelQuadColorProvider colorizer = null; - - ModelVertexSink vertices = builder.getVertexSink(); - vertices.ensureCapacity(quads.size() * 4); - - IndexBufferBuilder indices = builder.getIndexBufferBuilder(facing); - - // This is a very hot allocation, iterate over it manually - // noinspection ForLoopReplaceableByForEach - for (int i = 0, quadsSize = quads.size(); i < quadsSize; i++) { - BakedQuad quad = quads.get(i); - - QuadLightData light = this.cachedQuadLightData; - lighter.calculate((ModelQuadView) quad, pos, light, quad.getFace(), quad.hasShade()); - - if (quad.hasColor() && colorizer == null) { - colorizer = this.blockColors.getColorProvider(state); - } - - this.renderQuad(world, state, pos, origin, vertices, indices, offset, colorizer, quad, light, builder, bits); - } - - vertices.flush(); - } - - private void renderQuad(BlockRenderView world, BlockState state, BlockPos pos, BlockPos origin, ModelVertexSink vertices, IndexBufferBuilder indices, Vec3d blockOffset, - ModelQuadColorProvider colorProvider, BakedQuad bakedQuad, QuadLightData light, ChunkModelBuilder model, int bits) { - ModelQuadView src = (ModelQuadView) bakedQuad; - ModelQuadOrientation orientation = ModelQuadOrientation.orientByBrightness(light.br); - - int[] colors = null; - - if (bakedQuad.hasColor()) { - colors = this.biomeColorBlender.getColors(world, pos, src, colorProvider, state); - } - - int vertexStart = vertices.getVertexCount(); - - for (int i = 0; i < 4; i++) { - int j = orientation.getVertexIndex(i); - - float x = src.getX(j) + (float) blockOffset.getX(); - float y = src.getY(j) + (float) blockOffset.getY(); - float z = src.getZ(j) + (float) blockOffset.getZ(); - - int color = ColorABGR.mul(colors != null ? colors[j] : 0xFFFFFFFF, light.br[j]); - - float u = src.getTexU(j); - float v = src.getTexV(j); - - int lm = light.lm[j]; - - vertices.writeVertex(origin, x, y, z, color, u, v, lm, model.getChunkId(), bits); - } - - indices.add(vertexStart, ModelQuadWinding.CLOCKWISE); - - Sprite sprite = src.getSprite(); - - if (sprite != null) { - model.addSprite(sprite); - } - } - - private LightMode getLightingMode(BlockState state, BakedModel model) { - if (this.useAmbientOcclusion && model.useAmbientOcclusion() && state.getLuminance() == 0) { - return LightMode.SMOOTH; - } else { - return LightMode.FLAT; - } - } -} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/ChunkRenderCache.java b/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/ChunkRenderCache.java deleted file mode 100644 index c2ab1a1b06..0000000000 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/ChunkRenderCache.java +++ /dev/null @@ -1,12 +0,0 @@ -package me.jellysquid.mods.sodium.client.render.pipeline; - -import me.jellysquid.mods.sodium.client.model.quad.blender.BiomeColorBlender; -import me.jellysquid.mods.sodium.client.model.quad.blender.FlatBiomeColorBlender; -import me.jellysquid.mods.sodium.client.model.quad.blender.SmoothBiomeColorBlender; -import net.minecraft.client.MinecraftClient; - -public class ChunkRenderCache { - protected BiomeColorBlender createBiomeColorBlender() { - return MinecraftClient.getInstance().options.biomeBlendRadius <= 0 ? new FlatBiomeColorBlender() : new SmoothBiomeColorBlender(); - } -} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/FluidRenderer.java b/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/FluidRenderer.java index cf01fbe4ff..d70896dcc8 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/FluidRenderer.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/FluidRenderer.java @@ -1,481 +1,443 @@ package me.jellysquid.mods.sodium.client.render.pipeline; -import me.jellysquid.mods.sodium.client.model.light.LightMode; -import me.jellysquid.mods.sodium.client.model.light.LightPipeline; -import me.jellysquid.mods.sodium.client.model.light.LightPipelineProvider; -import me.jellysquid.mods.sodium.client.model.light.data.QuadLightData; -import me.jellysquid.mods.sodium.client.model.quad.ModelQuad; -import me.jellysquid.mods.sodium.client.model.quad.ModelQuadView; -import me.jellysquid.mods.sodium.client.model.quad.ModelQuadViewMutable; -import me.jellysquid.mods.sodium.client.model.quad.blender.BiomeColorBlender; -import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadFacing; -import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadFlags; -import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadWinding; -import me.jellysquid.mods.sodium.client.model.quad.ModelQuadColorProvider; -import me.jellysquid.mods.sodium.client.render.chunk.compile.buffers.ChunkModelBuilder; -import me.jellysquid.mods.sodium.client.render.chunk.format.MaterialFlag; -import me.jellysquid.mods.sodium.client.render.chunk.format.ModelVertexSink; -import me.jellysquid.mods.sodium.client.util.Norm3b; -import me.jellysquid.mods.sodium.client.util.color.ColorABGR; -import me.jellysquid.mods.sodium.common.util.DirectionUtil; -import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandler; -import net.fabricmc.fabric.impl.client.rendering.fluid.FluidRenderHandlerRegistryImpl; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.StainedGlassBlock; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.model.ModelLoader; -import net.minecraft.client.texture.Sprite; -import net.minecraft.fluid.Fluid; -import net.minecraft.fluid.FluidState; -import net.minecraft.tag.FluidTags; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockRenderView; -import org.jetbrains.annotations.Nullable; - -public class FluidRenderer { - // TODO: allow this to be changed by vertex format - // TODO: move fluid rendering to a separate render pass and control glPolygonOffset and glDepthFunc to fix this properly - private static final float EPSILON = 0.001f; - - private final BlockPos.Mutable scratchPos = new BlockPos.Mutable(); - - private final Sprite waterOverlaySprite; - - private final ModelQuadViewMutable quad = new ModelQuad(); - - private final LightPipelineProvider lighters; - private final BiomeColorBlender biomeColorBlender; - - // Cached wrapper type that adapts FluidRenderHandler to support QuadColorProvider - private final FabricFluidColorizerAdapter fabricColorProviderAdapter = new FabricFluidColorizerAdapter(); - - private final QuadLightData quadLightData = new QuadLightData(); - private final int[] quadColors = new int[4]; - - public FluidRenderer(LightPipelineProvider lighters, BiomeColorBlender biomeColorBlender) { - this.waterOverlaySprite = ModelLoader.WATER_OVERLAY.getSprite(); - - int normal = Norm3b.pack(0.0f, 1.0f, 0.0f); - - for (int i = 0; i < 4; i++) { - this.quad.setNormal(i, normal); - } - - this.lighters = lighters; - this.biomeColorBlender = biomeColorBlender; - } - - private boolean isFluidExposed(BlockRenderView world, int x, int y, int z, Direction dir, Fluid fluid) { - // Up direction is hard to test since it doesnt fill the block - if(dir != Direction.UP) { - BlockPos pos = this.scratchPos.set(x, y, z); - BlockState blockState = world.getBlockState(pos); - VoxelShape shape = blockState.getCullingShape(world, pos); - if (VoxelShapes.isSideCovered(VoxelShapes.fullCube(), shape, dir.getOpposite())) { - return false; // Fluid is in waterlogged block that self occludes - } - } - - BlockPos pos = this.scratchPos.set(x + dir.getOffsetX(), y + dir.getOffsetY(), z + dir.getOffsetZ()); - return !world.getFluidState(pos).getFluid().matchesType(fluid); - } - - private boolean isSideExposed(BlockRenderView world, int x, int y, int z, Direction dir, float height) { - BlockPos pos = this.scratchPos.set(x + dir.getOffsetX(), y + dir.getOffsetY(), z + dir.getOffsetZ()); - BlockState blockState = world.getBlockState(pos); - - if (blockState.isOpaque()) { - VoxelShape shape = blockState.getCullingShape(world, pos); - - // Hoist these checks to avoid allocating the shape below - if (shape == VoxelShapes.fullCube()) { - // The top face always be inset, so if the shape above is a full cube it can't possibly occlude - return dir == Direction.UP; - } else if (shape.isEmpty()) { - return true; - } - - VoxelShape threshold = VoxelShapes.cuboid(0.0D, 0.0D, 0.0D, 1.0D, height, 1.0D); - - return !VoxelShapes.isSideCovered(threshold, shape, dir); - } - - return true; - } - - public boolean render(BlockRenderView world, FluidState fluidState, BlockPos pos, BlockPos offset, ChunkModelBuilder buffers) { - int posX = pos.getX(); - int posY = pos.getY(); - int posZ = pos.getZ(); - - Fluid fluid = fluidState.getFluid(); - - boolean sfUp = this.isFluidExposed(world, posX, posY, posZ, Direction.UP, fluid); - boolean sfDown = this.isFluidExposed(world, posX, posY, posZ, Direction.DOWN, fluid) && - this.isSideExposed(world, posX, posY, posZ, Direction.DOWN, 0.8888889F); - boolean sfNorth = this.isFluidExposed(world, posX, posY, posZ, Direction.NORTH, fluid); - boolean sfSouth = this.isFluidExposed(world, posX, posY, posZ, Direction.SOUTH, fluid); - boolean sfWest = this.isFluidExposed(world, posX, posY, posZ, Direction.WEST, fluid); - boolean sfEast = this.isFluidExposed(world, posX, posY, posZ, Direction.EAST, fluid); - - if (!sfUp && !sfDown && !sfEast && !sfWest && !sfNorth && !sfSouth) { - return false; - } - - boolean isWater = fluidState.isIn(FluidTags.WATER); - - FluidRenderHandler handler = FluidRenderHandlerRegistryImpl.INSTANCE.getOverride(fluidState.getFluid()); - ModelQuadColorProvider colorizer = this.createColorProviderAdapter(handler); - - Sprite[] sprites = handler.getFluidSprites(world, pos, fluidState); - - boolean rendered = false; - - float h1 = this.getCornerHeight(world, posX, posY, posZ, fluidState.getFluid()); - float h2 = this.getCornerHeight(world, posX, posY, posZ + 1, fluidState.getFluid()); - float h3 = this.getCornerHeight(world, posX + 1, posY, posZ + 1, fluidState.getFluid()); - float h4 = this.getCornerHeight(world, posX + 1, posY, posZ, fluidState.getFluid()); - - float yOffset = sfDown ? EPSILON : 0.0F; - - final ModelQuadViewMutable quad = this.quad; - - LightMode lightMode = isWater && MinecraftClient.isAmbientOcclusionEnabled() ? LightMode.SMOOTH : LightMode.FLAT; - LightPipeline lighter = this.lighters.getLighter(lightMode); - - quad.setFlags(0); - - if (sfUp && this.isSideExposed(world, posX, posY, posZ, Direction.UP, Math.min(Math.min(h1, h2), Math.min(h3, h4)))) { - h1 -= EPSILON; - h2 -= EPSILON; - h3 -= EPSILON; - h4 -= EPSILON; - - Vec3d velocity = fluidState.getVelocity(world, pos); - - Sprite sprite; - ModelQuadFacing facing; - float u1, u2, u3, u4; - float v1, v2, v3, v4; - - if (velocity.x == 0.0D && velocity.z == 0.0D) { - sprite = sprites[0]; - facing = ModelQuadFacing.UP; - u1 = sprite.getFrameU(0.0D); - v1 = sprite.getFrameV(0.0D); - u2 = u1; - v2 = sprite.getFrameV(16.0D); - u3 = sprite.getFrameU(16.0D); - v3 = v2; - u4 = u3; - v4 = v1; - } else { - sprite = sprites[1]; - facing = ModelQuadFacing.UNASSIGNED; - float dir = (float) MathHelper.atan2(velocity.z, velocity.x) - (1.5707964f); - float sin = MathHelper.sin(dir) * 0.25F; - float cos = MathHelper.cos(dir) * 0.25F; - u1 = sprite.getFrameU(8.0F + (-cos - sin) * 16.0F); - v1 = sprite.getFrameV(8.0F + (-cos + sin) * 16.0F); - u2 = sprite.getFrameU(8.0F + (-cos + sin) * 16.0F); - v2 = sprite.getFrameV(8.0F + (cos + sin) * 16.0F); - u3 = sprite.getFrameU(8.0F + (cos + sin) * 16.0F); - v3 = sprite.getFrameV(8.0F + (cos - sin) * 16.0F); - u4 = sprite.getFrameU(8.0F + (cos - sin) * 16.0F); - v4 = sprite.getFrameV(8.0F + (-cos - sin) * 16.0F); - } - - float uAvg = (u1 + u2 + u3 + u4) / 4.0F; - float vAvg = (v1 + v2 + v3 + v4) / 4.0F; - float s1 = (float) sprites[0].getWidth() / (sprites[0].getMaxU() - sprites[0].getMinU()); - float s2 = (float) sprites[0].getHeight() / (sprites[0].getMaxV() - sprites[0].getMinV()); - float s3 = 4.0F / Math.max(s2, s1); - - u1 = MathHelper.lerp(s3, u1, uAvg); - u2 = MathHelper.lerp(s3, u2, uAvg); - u3 = MathHelper.lerp(s3, u3, uAvg); - u4 = MathHelper.lerp(s3, u4, uAvg); - v1 = MathHelper.lerp(s3, v1, vAvg); - v2 = MathHelper.lerp(s3, v2, vAvg); - v3 = MathHelper.lerp(s3, v3, vAvg); - v4 = MathHelper.lerp(s3, v4, vAvg); - - quad.setSprite(sprite); - - this.setVertex(quad, 0, 0.0f, h1, 0.0f, u1, v1); - this.setVertex(quad, 1, 0.0f, h2, 1.0F, u2, v2); - this.setVertex(quad, 2, 1.0F, h3, 1.0F, u3, v3); - this.setVertex(quad, 3, 1.0F, h4, 0.0f, u4, v4); - - this.calculateQuadColors(quad, world, pos, lighter, Direction.UP, 1.0F, colorizer, fluidState); - - int vertexStart = this.writeVertices(buffers, offset, quad); - - buffers.getIndexBufferBuilder(facing) - .add(vertexStart, ModelQuadWinding.CLOCKWISE); - - if (fluidState.method_15756(world, this.scratchPos.set(posX, posY + 1, posZ))) { - buffers.getIndexBufferBuilder(ModelQuadFacing.DOWN) - .add(vertexStart, ModelQuadWinding.COUNTERCLOCKWISE); - } - - rendered = true; - } - - if (sfDown) { - Sprite sprite = sprites[0]; - - float minU = sprite.getMinU(); - float maxU = sprite.getMaxU(); - float minV = sprite.getMinV(); - float maxV = sprite.getMaxV(); - quad.setSprite(sprite); - - this.setVertex(quad, 0, 0.0f, yOffset, 1.0F, minU, maxV); - this.setVertex(quad, 1, 0.0f, yOffset, 0.0f, minU, minV); - this.setVertex(quad, 2, 1.0F, yOffset, 0.0f, maxU, minV); - this.setVertex(quad, 3, 1.0F, yOffset, 1.0F, maxU, maxV); - - this.calculateQuadColors(quad, world, pos, lighter, Direction.DOWN, 1.0F, colorizer, fluidState); - - int vertexStart = this.writeVertices(buffers, offset, quad); - - buffers.getIndexBufferBuilder(ModelQuadFacing.DOWN) - .add(vertexStart, ModelQuadWinding.CLOCKWISE); - - rendered = true; - } - - this.quad.setFlags(ModelQuadFlags.IS_ALIGNED); - - for (Direction dir : DirectionUtil.HORIZONTAL_DIRECTIONS) { - float c1; - float c2; - float x1; - float z1; - float x2; - float z2; - - switch (dir) { - case NORTH: - if (!sfNorth) { - continue; - } - - c1 = h1; - c2 = h4; - x1 = 0.0f; - x2 = 1.0F; - z1 = EPSILON; - z2 = z1; - break; - case SOUTH: - if (!sfSouth) { - continue; - } - - c1 = h3; - c2 = h2; - x1 = 1.0F; - x2 = 0.0f; - z1 = 1.0f - EPSILON; - z2 = z1; - break; - case WEST: - if (!sfWest) { - continue; - } - - c1 = h2; - c2 = h1; - x1 = EPSILON; - x2 = x1; - z1 = 1.0F; - z2 = 0.0f; - break; - case EAST: - if (!sfEast) { - continue; - } - - c1 = h4; - c2 = h3; - x1 = 1.0f - EPSILON; - x2 = x1; - z1 = 0.0f; - z2 = 1.0F; - break; - default: - continue; - } - - if (this.isSideExposed(world, posX, posY, posZ, dir, Math.max(c1, c2))) { - int adjX = posX + dir.getOffsetX(); - int adjY = posY + dir.getOffsetY(); - int adjZ = posZ + dir.getOffsetZ(); - - Sprite sprite = sprites[1]; - - if (isWater) { - BlockPos posAdj = this.scratchPos.set(adjX, adjY, adjZ); - Block block = world.getBlockState(posAdj).getBlock(); - - if (block == Blocks.GLASS || block instanceof StainedGlassBlock) { - sprite = this.waterOverlaySprite; - } - } - - float u1 = sprite.getFrameU(0.0D); - float u2 = sprite.getFrameU(8.0D); - float v1 = sprite.getFrameV((1.0F - c1) * 16.0F * 0.5F); - float v2 = sprite.getFrameV((1.0F - c2) * 16.0F * 0.5F); - float v3 = sprite.getFrameV(8.0D); - - quad.setSprite(sprite); - - this.setVertex(quad, 0, x2, c2, z2, u2, v2); - this.setVertex(quad, 1, x2, yOffset, z2, u2, v3); - this.setVertex(quad, 2, x1, yOffset, z1, u1, v3); - this.setVertex(quad, 3, x1, c1, z1, u1, v1); - - float br = dir.getAxis() == Direction.Axis.Z ? 0.8F : 0.6F; - - ModelQuadFacing facing = ModelQuadFacing.fromDirection(dir); - - this.calculateQuadColors(quad, world, pos, lighter, dir, br, colorizer, fluidState); - - int vertexStart = this.writeVertices(buffers, offset, quad); - - buffers.getIndexBufferBuilder(facing) - .add(vertexStart, ModelQuadWinding.CLOCKWISE); - - if (sprite != this.waterOverlaySprite) { - buffers.getIndexBufferBuilder(facing.getOpposite()) - .add(vertexStart, ModelQuadWinding.COUNTERCLOCKWISE); - } - - rendered = true; - } - } - - return rendered; - } - - private ModelQuadColorProvider createColorProviderAdapter(FluidRenderHandler handler) { - FabricFluidColorizerAdapter adapter = this.fabricColorProviderAdapter; - adapter.setHandler(handler); - - return adapter; - } - - private void calculateQuadColors(ModelQuadView quad, BlockRenderView world, BlockPos pos, LightPipeline lighter, Direction dir, float brightness, - ModelQuadColorProvider handler, FluidState fluidState) { - QuadLightData light = this.quadLightData; - lighter.calculate(quad, pos, light, dir, false); - - int[] biomeColors = this.biomeColorBlender.getColors(world, pos, quad, handler, fluidState); - - for (int i = 0; i < 4; i++) { - this.quadColors[i] = ColorABGR.mul(biomeColors != null ? biomeColors[i] : 0xFFFFFFFF, light.br[i] * brightness); - } - } - - private int writeVertices(ChunkModelBuilder builder, BlockPos offset, ModelQuadView quad) { - ModelVertexSink vertices = builder.getVertexSink(); - vertices.ensureCapacity(4); - - int vertexStart = vertices.getVertexCount(); - - for (int i = 0; i < 4; i++) { - float x = quad.getX(i); - float y = quad.getY(i); - float z = quad.getZ(i); - - int color = this.quadColors[i]; - - float u = quad.getTexU(i); - float v = quad.getTexV(i); - - int light = this.quadLightData.lm[i]; - - vertices.writeVertex(offset, x, y, z, color, u, v, light, builder.getChunkId(), MaterialFlag.DEFAULTS); - } - - vertices.flush(); - - Sprite sprite = quad.getSprite(); - - if (sprite != null) { - builder.addSprite(sprite); - } - - return vertexStart; - } - - private void setVertex(ModelQuadViewMutable quad, int i, float x, float y, float z, float u, float v) { - quad.setX(i, x); - quad.setY(i, y); - quad.setZ(i, z); - quad.setTexU(i, u); - quad.setTexV(i, v); - } - - private float getCornerHeight(BlockRenderView world, int x, int y, int z, Fluid fluid) { - int samples = 0; - float totalHeight = 0.0F; - - for (int i = 0; i < 4; ++i) { - int x2 = x - (i & 1); - int z2 = z - (i >> 1 & 1); - - if (world.getFluidState(this.scratchPos.set(x2, y + 1, z2)).getFluid().matchesType(fluid)) { - return 1.0F; - } - - BlockPos pos = this.scratchPos.set(x2, y, z2); - - BlockState blockState = world.getBlockState(pos); - FluidState fluidState = blockState.getFluidState(); - - if (fluidState.getFluid().matchesType(fluid)) { - float height = fluidState.getHeight(world, pos); - - if (height >= 0.8F) { - totalHeight += height * 10.0F; - samples += 10; - } else { - totalHeight += height; - ++samples; - } - } else if (!blockState.getMaterial().isSolid()) { - ++samples; - } - } - - return totalHeight / (float) samples; - } - - private static class FabricFluidColorizerAdapter implements ModelQuadColorProvider { - private FluidRenderHandler handler; - - public void setHandler(FluidRenderHandler handler) { - this.handler = handler; - } - - @Override - public int getColor(FluidState state, @Nullable BlockRenderView world, @Nullable BlockPos pos, int tintIndex) { - if (this.handler == null) { - return -1; - } - - return this.handler.getFluidColor(world, pos, state); - } - } -} +// +//public class FluidRenderer { +// // TODO: allow this to be changed by vertex format +// // TODO: move fluid rendering to a separate render pass and control glPolygonOffset and glDepthFunc to fix this properly +// private static final float EPSILON = 0.001f; +// +// private final BlockPos.Mutable scratchPos = new BlockPos.Mutable(); +// +// private final Sprite waterOverlaySprite; +// +// private final ModelQuadViewMutable quad = new ModelQuad(); +// +// private final LightPipelineProvider lighters; +// private final BiomeColorBlender biomeColorBlender; +// +// // Cached wrapper type that adapts FluidRenderHandler to support QuadColorProvider +// private final FabricFluidColorizerAdapter fabricColorProviderAdapter = new FabricFluidColorizerAdapter(); +// +// private final QuadLightData quadLightData = new QuadLightData(); +// private final int[] quadColors = new int[4]; +// +// public FluidRenderer(LightPipelineProvider lighters, BiomeColorBlender biomeColorBlender) { +// this.waterOverlaySprite = ModelLoader.WATER_OVERLAY.getSprite(); +// +// int normal = Norm3b.pack(0.0f, 1.0f, 0.0f); +// +// for (int i = 0; i < 4; i++) { +// this.quad.setNormal(i, normal); +// } +// +// this.lighters = lighters; +// this.biomeColorBlender = biomeColorBlender; +// } +// +// private boolean isFluidExposed(BlockRenderView world, int x, int y, int z, Direction dir, Fluid fluid) { +// // Up direction is hard to test since it doesnt fill the block +// if(dir != Direction.UP) { +// BlockPos pos = this.scratchPos.set(x, y, z); +// BlockState blockState = world.getBlockState(pos); +// VoxelShape shape = blockState.getCullingShape(world, pos); +// if (VoxelShapes.isSideCovered(VoxelShapes.fullCube(), shape, dir.getOpposite())) { +// return false; // Fluid is in waterlogged block that self occludes +// } +// } +// +// BlockPos pos = this.scratchPos.set(x + dir.getOffsetX(), y + dir.getOffsetY(), z + dir.getOffsetZ()); +// return !world.getFluidState(pos).getFluid().matchesType(fluid); +// } +// +// private boolean isSideExposed(BlockRenderView world, int x, int y, int z, Direction dir, float height) { +// BlockPos pos = this.scratchPos.set(x + dir.getOffsetX(), y + dir.getOffsetY(), z + dir.getOffsetZ()); +// BlockState blockState = world.getBlockState(pos); +// +// if (blockState.isOpaque()) { +// VoxelShape shape = blockState.getCullingShape(world, pos); +// +// // Hoist these checks to avoid allocating the shape below +// if (shape == VoxelShapes.fullCube()) { +// // The top face always be inset, so if the shape above is a full cube it can't possibly occlude +// return dir == Direction.UP; +// } else if (shape.isEmpty()) { +// return true; +// } +// +// VoxelShape threshold = VoxelShapes.cuboid(0.0D, 0.0D, 0.0D, 1.0D, height, 1.0D); +// +// return !VoxelShapes.isSideCovered(threshold, shape, dir); +// } +// +// return true; +// } +// +// public boolean render(BlockRenderView world, FluidState fluidState, BlockPos pos, BlockPos offset, ChunkModelBuilder buffers) { +// int posX = pos.getX(); +// int posY = pos.getY(); +// int posZ = pos.getZ(); +// +// Fluid fluid = fluidState.getFluid(); +// +// boolean sfUp = this.isFluidExposed(world, posX, posY, posZ, Direction.UP, fluid); +// boolean sfDown = this.isFluidExposed(world, posX, posY, posZ, Direction.DOWN, fluid) && +// this.isSideExposed(world, posX, posY, posZ, Direction.DOWN, 0.8888889F); +// boolean sfNorth = this.isFluidExposed(world, posX, posY, posZ, Direction.NORTH, fluid); +// boolean sfSouth = this.isFluidExposed(world, posX, posY, posZ, Direction.SOUTH, fluid); +// boolean sfWest = this.isFluidExposed(world, posX, posY, posZ, Direction.WEST, fluid); +// boolean sfEast = this.isFluidExposed(world, posX, posY, posZ, Direction.EAST, fluid); +// +// if (!sfUp && !sfDown && !sfEast && !sfWest && !sfNorth && !sfSouth) { +// return false; +// } +// +// boolean isWater = fluidState.isIn(FluidTags.WATER); +// +// FluidRenderHandler handler = FluidRenderHandlerRegistryImpl.INSTANCE.getOverride(fluidState.getFluid()); +// ModelQuadColorProvider colorizer = this.createColorProviderAdapter(handler); +// +// Sprite[] sprites = handler.getFluidSprites(world, pos, fluidState); +// +// boolean rendered = false; +// +// float h1 = this.getCornerHeight(world, posX, posY, posZ, fluidState.getFluid()); +// float h2 = this.getCornerHeight(world, posX, posY, posZ + 1, fluidState.getFluid()); +// float h3 = this.getCornerHeight(world, posX + 1, posY, posZ + 1, fluidState.getFluid()); +// float h4 = this.getCornerHeight(world, posX + 1, posY, posZ, fluidState.getFluid()); +// +// float yOffset = sfDown ? EPSILON : 0.0F; +// +// final ModelQuadViewMutable quad = this.quad; +// +// LightMode lightMode = isWater && MinecraftClient.isAmbientOcclusionEnabled() ? LightMode.SMOOTH : LightMode.FLAT; +// LightPipeline lighter = this.lighters.getLighter(lightMode); +// +// quad.setFlags(0); +// +// if (sfUp && this.isSideExposed(world, posX, posY, posZ, Direction.UP, Math.min(Math.min(h1, h2), Math.min(h3, h4)))) { +// h1 -= EPSILON; +// h2 -= EPSILON; +// h3 -= EPSILON; +// h4 -= EPSILON; +// +// Vec3d velocity = fluidState.getVelocity(world, pos); +// +// Sprite sprite; +// ModelQuadFacing facing; +// float u1, u2, u3, u4; +// float v1, v2, v3, v4; +// +// if (velocity.x == 0.0D && velocity.z == 0.0D) { +// sprite = sprites[0]; +// facing = ModelQuadFacing.UP; +// u1 = sprite.getFrameU(0.0D); +// v1 = sprite.getFrameV(0.0D); +// u2 = u1; +// v2 = sprite.getFrameV(16.0D); +// u3 = sprite.getFrameU(16.0D); +// v3 = v2; +// u4 = u3; +// v4 = v1; +// } else { +// sprite = sprites[1]; +// facing = ModelQuadFacing.UNASSIGNED; +// float dir = (float) MathHelper.atan2(velocity.z, velocity.x) - (1.5707964f); +// float sin = MathHelper.sin(dir) * 0.25F; +// float cos = MathHelper.cos(dir) * 0.25F; +// u1 = sprite.getFrameU(8.0F + (-cos - sin) * 16.0F); +// v1 = sprite.getFrameV(8.0F + (-cos + sin) * 16.0F); +// u2 = sprite.getFrameU(8.0F + (-cos + sin) * 16.0F); +// v2 = sprite.getFrameV(8.0F + (cos + sin) * 16.0F); +// u3 = sprite.getFrameU(8.0F + (cos + sin) * 16.0F); +// v3 = sprite.getFrameV(8.0F + (cos - sin) * 16.0F); +// u4 = sprite.getFrameU(8.0F + (cos - sin) * 16.0F); +// v4 = sprite.getFrameV(8.0F + (-cos - sin) * 16.0F); +// } +// +// float uAvg = (u1 + u2 + u3 + u4) / 4.0F; +// float vAvg = (v1 + v2 + v3 + v4) / 4.0F; +// float s1 = (float) sprites[0].getWidth() / (sprites[0].getMaxU() - sprites[0].getMinU()); +// float s2 = (float) sprites[0].getHeight() / (sprites[0].getMaxV() - sprites[0].getMinV()); +// float s3 = 4.0F / Math.max(s2, s1); +// +// u1 = MathHelper.lerp(s3, u1, uAvg); +// u2 = MathHelper.lerp(s3, u2, uAvg); +// u3 = MathHelper.lerp(s3, u3, uAvg); +// u4 = MathHelper.lerp(s3, u4, uAvg); +// v1 = MathHelper.lerp(s3, v1, vAvg); +// v2 = MathHelper.lerp(s3, v2, vAvg); +// v3 = MathHelper.lerp(s3, v3, vAvg); +// v4 = MathHelper.lerp(s3, v4, vAvg); +// +// quad.setSprite(sprite); +// +// this.setVertex(quad, 0, 0.0f, h1, 0.0f, u1, v1); +// this.setVertex(quad, 1, 0.0f, h2, 1.0F, u2, v2); +// this.setVertex(quad, 2, 1.0F, h3, 1.0F, u3, v3); +// this.setVertex(quad, 3, 1.0F, h4, 0.0f, u4, v4); +// +// this.calculateQuadColors(quad, world, pos, lighter, Direction.UP, 1.0F, colorizer, fluidState); +// +// int vertexStart = this.writeVertices(buffers, offset, quad); +// +// buffers.getIndexBufferBuilder(facing) +// .add(vertexStart, ModelQuadWinding.CLOCKWISE); +// +// if (fluidState.method_15756(world, this.scratchPos.set(posX, posY + 1, posZ))) { +// buffers.getIndexBufferBuilder(ModelQuadFacing.DOWN) +// .add(vertexStart, ModelQuadWinding.COUNTERCLOCKWISE); +// } +// +// rendered = true; +// } +// +// if (sfDown) { +// Sprite sprite = sprites[0]; +// +// float minU = sprite.getMinU(); +// float maxU = sprite.getMaxU(); +// float minV = sprite.getMinV(); +// float maxV = sprite.getMaxV(); +// quad.setSprite(sprite); +// +// this.setVertex(quad, 0, 0.0f, yOffset, 1.0F, minU, maxV); +// this.setVertex(quad, 1, 0.0f, yOffset, 0.0f, minU, minV); +// this.setVertex(quad, 2, 1.0F, yOffset, 0.0f, maxU, minV); +// this.setVertex(quad, 3, 1.0F, yOffset, 1.0F, maxU, maxV); +// +// this.calculateQuadColors(quad, world, pos, lighter, Direction.DOWN, 1.0F, colorizer, fluidState); +// +// int vertexStart = this.writeVertices(buffers, offset, quad); +// +// buffers.getIndexBufferBuilder(ModelQuadFacing.DOWN) +// .add(vertexStart, ModelQuadWinding.CLOCKWISE); +// +// rendered = true; +// } +// +// this.quad.setFlags(ModelQuadFlags.IS_ALIGNED); +// +// for (Direction dir : DirectionUtil.HORIZONTAL_DIRECTIONS) { +// float c1; +// float c2; +// float x1; +// float z1; +// float x2; +// float z2; +// +// switch (dir) { +// case NORTH: +// if (!sfNorth) { +// continue; +// } +// +// c1 = h1; +// c2 = h4; +// x1 = 0.0f; +// x2 = 1.0F; +// z1 = EPSILON; +// z2 = z1; +// break; +// case SOUTH: +// if (!sfSouth) { +// continue; +// } +// +// c1 = h3; +// c2 = h2; +// x1 = 1.0F; +// x2 = 0.0f; +// z1 = 1.0f - EPSILON; +// z2 = z1; +// break; +// case WEST: +// if (!sfWest) { +// continue; +// } +// +// c1 = h2; +// c2 = h1; +// x1 = EPSILON; +// x2 = x1; +// z1 = 1.0F; +// z2 = 0.0f; +// break; +// case EAST: +// if (!sfEast) { +// continue; +// } +// +// c1 = h4; +// c2 = h3; +// x1 = 1.0f - EPSILON; +// x2 = x1; +// z1 = 0.0f; +// z2 = 1.0F; +// break; +// default: +// continue; +// } +// +// if (this.isSideExposed(world, posX, posY, posZ, dir, Math.max(c1, c2))) { +// int adjX = posX + dir.getOffsetX(); +// int adjY = posY + dir.getOffsetY(); +// int adjZ = posZ + dir.getOffsetZ(); +// +// Sprite sprite = sprites[1]; +// +// if (isWater) { +// BlockPos posAdj = this.scratchPos.set(adjX, adjY, adjZ); +// Block block = world.getBlockState(posAdj).getBlock(); +// +// if (block == Blocks.GLASS || block instanceof StainedGlassBlock) { +// sprite = this.waterOverlaySprite; +// } +// } +// +// float u1 = sprite.getFrameU(0.0D); +// float u2 = sprite.getFrameU(8.0D); +// float v1 = sprite.getFrameV((1.0F - c1) * 16.0F * 0.5F); +// float v2 = sprite.getFrameV((1.0F - c2) * 16.0F * 0.5F); +// float v3 = sprite.getFrameV(8.0D); +// +// quad.setSprite(sprite); +// +// this.setVertex(quad, 0, x2, c2, z2, u2, v2); +// this.setVertex(quad, 1, x2, yOffset, z2, u2, v3); +// this.setVertex(quad, 2, x1, yOffset, z1, u1, v3); +// this.setVertex(quad, 3, x1, c1, z1, u1, v1); +// +// float br = dir.getAxis() == Direction.Axis.Z ? 0.8F : 0.6F; +// +// ModelQuadFacing facing = ModelQuadFacing.fromDirection(dir); +// +// this.calculateQuadColors(quad, world, pos, lighter, dir, br, colorizer, fluidState); +// +// int vertexStart = this.writeVertices(buffers, offset, quad); +// +// buffers.getIndexBufferBuilder(facing) +// .add(vertexStart, ModelQuadWinding.CLOCKWISE); +// +// if (sprite != this.waterOverlaySprite) { +// buffers.getIndexBufferBuilder(facing.getOpposite()) +// .add(vertexStart, ModelQuadWinding.COUNTERCLOCKWISE); +// } +// +// rendered = true; +// } +// } +// +// return rendered; +// } +// +// private ModelQuadColorProvider createColorProviderAdapter(FluidRenderHandler handler) { +// FabricFluidColorizerAdapter adapter = this.fabricColorProviderAdapter; +// adapter.setHandler(handler); +// +// return adapter; +// } +// +// private void calculateQuadColors(ModelQuadView quad, BlockRenderView world, BlockPos pos, LightPipeline lighter, Direction dir, float brightness, +// ModelQuadColorProvider handler, FluidState fluidState) { +// QuadLightData light = this.quadLightData; +// lighter.calculate(quad, pos, light, dir, false); +// +// int[] biomeColors = this.biomeColorBlender.getColors(world, pos, quad, handler, fluidState); +// +// for (int i = 0; i < 4; i++) { +// this.quadColors[i] = ColorABGR.mul(biomeColors != null ? biomeColors[i] : 0xFFFFFFFF, light.br[i] * brightness); +// } +// } +// +// private int writeVertices(ChunkModelBuilder builder, BlockPos offset, ModelQuadView quad) { +// ModelVertexSink vertices = builder.getVertexSink(); +// vertices.ensureCapacity(4); +// +// int vertexStart = vertices.getVertexCount(); +// +// for (int i = 0; i < 4; i++) { +// float x = quad.getX(i); +// float y = quad.getY(i); +// float z = quad.getZ(i); +// +// int color = this.quadColors[i]; +// +// float u = quad.getTexU(i); +// float v = quad.getTexV(i); +// +// int light = this.quadLightData.lm[i]; +// +// vertices.writeVertex(offset, x, y, z, color, u, v, light, builder.getChunkId(), MaterialFlag.DEFAULTS); +// } +// +// vertices.flush(); +// +// Sprite sprite = quad.getSprite(); +// +// if (sprite != null) { +// builder.addSprite(sprite); +// } +// +// return vertexStart; +// } +// +// private void setVertex(ModelQuadViewMutable quad, int i, float x, float y, float z, float u, float v) { +// quad.setX(i, x); +// quad.setY(i, y); +// quad.setZ(i, z); +// quad.setTexU(i, u); +// quad.setTexV(i, v); +// } +// +// private float getCornerHeight(BlockRenderView world, int x, int y, int z, Fluid fluid) { +// int samples = 0; +// float totalHeight = 0.0F; +// +// for (int i = 0; i < 4; ++i) { +// int x2 = x - (i & 1); +// int z2 = z - (i >> 1 & 1); +// +// if (world.getFluidState(this.scratchPos.set(x2, y + 1, z2)).getFluid().matchesType(fluid)) { +// return 1.0F; +// } +// +// BlockPos pos = this.scratchPos.set(x2, y, z2); +// +// BlockState blockState = world.getBlockState(pos); +// FluidState fluidState = blockState.getFluidState(); +// +// if (fluidState.getFluid().matchesType(fluid)) { +// float height = fluidState.getHeight(world, pos); +// +// if (height >= 0.8F) { +// totalHeight += height * 10.0F; +// samples += 10; +// } else { +// totalHeight += height; +// ++samples; +// } +// } else if (!blockState.getMaterial().isSolid()) { +// ++samples; +// } +// } +// +// return totalHeight / (float) samples; +// } +// +// private static class FabricFluidColorizerAdapter implements ModelQuadColorProvider { +// private FluidRenderHandler handler; +// +// public void setHandler(FluidRenderHandler handler) { +// this.handler = handler; +// } +// +// @Override +// public int getColor(FluidState state, @Nullable BlockRenderView world, @Nullable BlockPos pos, int tintIndex) { +// if (this.handler == null) { +// return -1; +// } +// +// return this.handler.getFluidColor(world, pos, state); +// } +// } +//} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/context/ChunkRenderCacheLocal.java b/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/context/ChunkRenderCacheLocal.java deleted file mode 100644 index ce2fc4ec52..0000000000 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/context/ChunkRenderCacheLocal.java +++ /dev/null @@ -1,57 +0,0 @@ -package me.jellysquid.mods.sodium.client.render.pipeline.context; - -import me.jellysquid.mods.sodium.client.model.light.LightPipelineProvider; -import me.jellysquid.mods.sodium.client.model.light.cache.ArrayLightDataCache; -import me.jellysquid.mods.sodium.client.model.quad.blender.BiomeColorBlender; -import me.jellysquid.mods.sodium.client.render.pipeline.BlockRenderer; -import me.jellysquid.mods.sodium.client.render.pipeline.ChunkRenderCache; -import me.jellysquid.mods.sodium.client.render.pipeline.FluidRenderer; -import me.jellysquid.mods.sodium.client.world.WorldSlice; -import me.jellysquid.mods.sodium.client.world.cloned.ChunkRenderContext; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.block.BlockModels; -import net.minecraft.world.World; - -public class ChunkRenderCacheLocal extends ChunkRenderCache { - private final ArrayLightDataCache lightDataCache; - - private final BlockRenderer blockRenderer; - private final FluidRenderer fluidRenderer; - - private final BlockModels blockModels; - private final WorldSlice worldSlice; - - public ChunkRenderCacheLocal(MinecraftClient client, World world) { - this.worldSlice = new WorldSlice(world); - this.lightDataCache = new ArrayLightDataCache(this.worldSlice); - - LightPipelineProvider lightPipelineProvider = new LightPipelineProvider(this.lightDataCache); - BiomeColorBlender biomeColorBlender = this.createBiomeColorBlender(); - - this.blockRenderer = new BlockRenderer(client, lightPipelineProvider, biomeColorBlender); - this.fluidRenderer = new FluidRenderer(lightPipelineProvider, biomeColorBlender); - - this.blockModels = client.getBakedModelManager().getBlockModels(); - } - - public BlockModels getBlockModels() { - return this.blockModels; - } - - public BlockRenderer getBlockRenderer() { - return this.blockRenderer; - } - - public FluidRenderer getFluidRenderer() { - return this.fluidRenderer; - } - - public void init(ChunkRenderContext context) { - this.lightDataCache.reset(context.getOrigin()); - this.worldSlice.copyData(context); - } - - public WorldSlice getWorldSlice() { - return this.worldSlice; - } -} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/context/ChunkRenderCacheShared.java b/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/context/ChunkRenderCacheShared.java deleted file mode 100644 index 0a8c6f2535..0000000000 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/context/ChunkRenderCacheShared.java +++ /dev/null @@ -1,68 +0,0 @@ -package me.jellysquid.mods.sodium.client.render.pipeline.context; - -import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap; -import me.jellysquid.mods.sodium.client.model.light.LightPipelineProvider; -import me.jellysquid.mods.sodium.client.model.light.cache.HashLightDataCache; -import me.jellysquid.mods.sodium.client.model.quad.blender.BiomeColorBlender; -import me.jellysquid.mods.sodium.client.render.pipeline.BlockRenderer; -import me.jellysquid.mods.sodium.client.render.pipeline.ChunkRenderCache; -import net.minecraft.client.MinecraftClient; -import net.minecraft.world.BlockRenderView; - -import java.util.Map; - -public class ChunkRenderCacheShared extends ChunkRenderCache { - private static final Map INSTANCES = new Reference2ObjectOpenHashMap<>(); - - private final BlockRenderer blockRenderer; - private final HashLightDataCache lightCache; - - private ChunkRenderCacheShared(BlockRenderView world) { - MinecraftClient client = MinecraftClient.getInstance(); - - this.lightCache = new HashLightDataCache(world); - - BiomeColorBlender biomeColorBlender = this.createBiomeColorBlender(); - LightPipelineProvider lightPipelineProvider = new LightPipelineProvider(this.lightCache); - - this.blockRenderer = new BlockRenderer(client, lightPipelineProvider, biomeColorBlender); - } - - public BlockRenderer getBlockRenderer() { - return this.blockRenderer; - } - - private void resetCache() { - this.lightCache.clearCache(); - } - - public static ChunkRenderCacheShared getInstance(BlockRenderView world) { - ChunkRenderCacheShared instance = INSTANCES.get(world); - - if (instance == null) { - throw new IllegalStateException("No global renderer exists"); - } - - return instance; - } - - public static void destroyRenderContext(BlockRenderView world) { - if (INSTANCES.remove(world) == null) { - throw new IllegalStateException("No render context exists for world: " + world); - } - } - - public static void createRenderContext(BlockRenderView world) { - if (INSTANCES.containsKey(world)) { - throw new IllegalStateException("Render context already exists for world: " + world); - } - - INSTANCES.put(world, new ChunkRenderCacheShared(world)); - } - - public static void resetCaches() { - for (ChunkRenderCacheShared context : INSTANCES.values()) { - context.resetCache(); - } - } -} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/renderer/AbstractRenderer.java b/src/main/java/me/jellysquid/mods/sodium/client/render/renderer/AbstractRenderer.java new file mode 100644 index 0000000000..d3ded8b405 --- /dev/null +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/renderer/AbstractRenderer.java @@ -0,0 +1,360 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.jellysquid.mods.sodium.client.render.renderer; + +import me.jellysquid.mods.sodium.client.model.light.QuadLighter; +import me.jellysquid.mods.sodium.client.model.light.data.QuadLightData; +import me.jellysquid.mods.sodium.client.model.quad.QuadColorizer; +import me.jellysquid.mods.sodium.client.model.quad.blender.BiomeColorBlender; +import me.jellysquid.mods.sodium.client.interop.fabric.material.RenderMaterialValue; +import me.jellysquid.mods.sodium.client.util.color.ColorARGB; +import me.jellysquid.mods.sodium.client.util.DirectionUtil; +import net.fabricmc.fabric.api.renderer.v1.material.BlendMode; +import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; +import net.fabricmc.fabric.api.renderer.v1.render.RenderContext.QuadTransform; +import me.jellysquid.mods.sodium.client.interop.fabric.SodiumRenderer; +import me.jellysquid.mods.sodium.client.interop.fabric.helper.ColorHelper; +import me.jellysquid.mods.sodium.client.interop.fabric.helper.GeometryHelper; +import me.jellysquid.mods.sodium.client.interop.fabric.mesh.EncodingFormat; +import me.jellysquid.mods.sodium.client.interop.fabric.mesh.MeshImpl; +import me.jellysquid.mods.sodium.client.interop.fabric.mesh.MutableQuadViewImpl; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.WorldRenderer; +import net.minecraft.client.render.model.BakedModel; +import net.minecraft.client.render.model.BakedQuad; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; + +import java.util.List; +import java.util.Random; +import java.util.function.Supplier; + +import static me.jellysquid.mods.sodium.client.interop.fabric.helper.GeometryHelper.LIGHT_FACE_FLAG; + +public abstract class AbstractRenderer { + private static final int FULL_BRIGHTNESS = 0x00F000F0; + + @Deprecated(forRemoval = true) + private static final int DEFAULT_TEXTURE_INDEX = 0; + + protected final BiomeColorBlender biomeColorBlender = BiomeColorBlender.create(MinecraftClient.getInstance()); + protected final T blockInfo; + protected final QuadLighter lighter; + protected final QuadTransform transform; + + AbstractRenderer(T blockInfo, QuadLighter lighter, QuadTransform transform) { + this.blockInfo = blockInfo; + this.lighter = lighter; + this.transform = transform; + } + + private void applyQuadColorization(MutableQuadViewImpl quad, int colorIndex) { + if (colorIndex == -1) { + this.applyDefaultQuadColorization(quad); + } else { + this.applyDynamicQuadColorization(quad); + } + } + + private void applyDefaultQuadColorization(MutableQuadViewImpl quad) { + for (int i = 0; i < 4; i++) { + quad.spriteColor(i, DEFAULT_TEXTURE_INDEX, quad.spriteColor(i, DEFAULT_TEXTURE_INDEX)); + } + } + + private void applyDynamicQuadColorization(MutableQuadViewImpl quad) { + final QuadColorizer colorProvider = this.blockInfo.getColorProvider(); + final int[] colors = this.biomeColorBlender.getColors(this.blockInfo.blockView, this.blockInfo.blockPos, quad, colorProvider, this.blockInfo.blockState); + + for (int i = 0; i < 4; i++) { + quad.spriteColor(i, DEFAULT_TEXTURE_INDEX, ColorARGB.mulRGBA(colors[i], quad.spriteColor(i, DEFAULT_TEXTURE_INDEX))); + } + } + + protected abstract void emitQuad(MutableQuadViewImpl quad, BlendMode renderLayer); + + protected void tessellateSmooth(MutableQuadViewImpl quad, BlendMode blendMode, int colorIndex) { + this.applyQuadColorization(quad, colorIndex); + + QuadLightData light = this.lighter.getQuadLightData(); + + for (int i = 0; i < 4; i++) { + quad.spriteColor(i, DEFAULT_TEXTURE_INDEX, ColorARGB.mulRGB(quad.spriteColor(i, DEFAULT_TEXTURE_INDEX), light.shade[i])); + quad.lightmap(i, ColorHelper.maxBrightness(quad.lightmap(i), light.texture[i])); + } + + this.emitQuad(quad, blendMode); + } + + protected void tessellateSmoothEmissive(MutableQuadViewImpl quad, BlendMode blendMode, int colorIndex) { + this.applyQuadColorization(quad, colorIndex); + + QuadLightData data = this.lighter.getQuadLightData(); + + for (int i = 0; i < 4; i++) { + quad.spriteColor(i, DEFAULT_TEXTURE_INDEX, ColorARGB.mulRGB(quad.spriteColor(i, DEFAULT_TEXTURE_INDEX), data.shade[i])); + quad.lightmap(i, FULL_BRIGHTNESS); + } + + this.emitQuad(quad, blendMode); + } + + protected void tessellateFlat(MutableQuadViewImpl quad, BlendMode renderLayer, int colorIndex) { + this.applyQuadColorization(quad, colorIndex); + this.applyFlatShading(quad); + + final int brightness = this.applyFlatBrightness(quad, this.blockInfo.blockState, this.blockInfo.blockPos); + + for (int i = 0; i < 4; i++) { + quad.lightmap(i, ColorHelper.maxBrightness(quad.lightmap(i), brightness)); + } + + this.emitQuad(quad, renderLayer); + } + + protected void tessellateFlatEmissive(MutableQuadViewImpl quad, BlendMode renderLayer, int blockColorIndex) { + this.applyQuadColorization(quad, blockColorIndex); + this.applyFlatShading(quad); + + for (int i = 0; i < 4; i++) { + quad.lightmap(i, FULL_BRIGHTNESS); + } + + this.emitQuad(quad, renderLayer); + } + + private final BlockPos.Mutable mpos = new BlockPos.Mutable(); + + private int applyFlatBrightness(MutableQuadViewImpl quad, BlockState blockState, BlockPos pos) { + this.mpos.set(pos); + + // To mirror Vanilla's behavior, if the face has a cull-face, always sample the light value + // offset in that direction. See net.minecraft.client.render.block.BlockModelRenderer.renderQuadsFlat + // for reference. + if (quad.cullFace() != null) { + this.mpos.move(quad.cullFace()); + } else if ((quad.geometryFlags() & LIGHT_FACE_FLAG) != 0 || Block.isShapeFullCube(blockState.getCollisionShape(this.blockInfo.blockView, pos))) { + this.mpos.move(quad.lightFace()); + } + + // Unfortunately cannot use brightness cache here unless we implement one specifically for flat lighting. See #329 + return WorldRenderer.getLightmapCoordinates(this.blockInfo.blockView, blockState, this.mpos); + } + + private void applyFlatShading(MutableQuadViewImpl quad) { + final float brightness = this.blockInfo.blockView.getBrightness(quad.lightFace(), quad.hasShade()); + + if ((quad.geometryFlags() & GeometryHelper.AXIS_ALIGNED_FLAG) == 0 || quad.hasVertexNormals()) { + // Quads that aren't direction-aligned or that have vertex normals need to be shaded + // using interpolation - vanilla can't handle them. Generally only applies to modded models. + for (int i = 0; i < 4; i++) { + quad.spriteColor(i, DEFAULT_TEXTURE_INDEX, ColorARGB.mulRGB(quad.spriteColor(i, DEFAULT_TEXTURE_INDEX), this.calculateVertexShade(quad, i, brightness))); + } + } else if (brightness != 1.0f) { + for (int i = 0; i < 4; i++) { + quad.spriteColor(i, DEFAULT_TEXTURE_INDEX, ColorARGB.mulRGB(quad.spriteColor(i, DEFAULT_TEXTURE_INDEX), brightness)); + } + } + } + + private float calculateVertexShade(MutableQuadViewImpl quad, int vertexIndex, float fallbackBrightness) { + if (!quad.hasNormal(vertexIndex)) { + return fallbackBrightness; + } + + return this.calculateVertexShade(quad, vertexIndex); + } + + private float calculateVertexShade(MutableQuadViewImpl quad, int vertexIndex) { + float normalX = quad.normalX(vertexIndex); + float normalY = quad.normalY(vertexIndex); + float normalZ = quad.normalZ(vertexIndex); + + boolean shaded = quad.hasShade(); + + float sum = 0; + float div = 0; + + if (normalX > 0) { + sum += normalX * this.blockInfo.blockView.getBrightness(Direction.EAST, shaded); + div += normalX; + } else if (normalX < 0) { + sum += -normalX * this.blockInfo.blockView.getBrightness(Direction.WEST, shaded); + div -= normalX; + } + + if (normalY > 0) { + sum += normalY * this.blockInfo.blockView.getBrightness(Direction.UP, shaded); + div += normalY; + } else if (normalY < 0) { + sum += -normalY * this.blockInfo.blockView.getBrightness(Direction.DOWN, shaded); + div -= normalY; + } + + if (normalZ > 0) { + sum += normalZ * this.blockInfo.blockView.getBrightness(Direction.SOUTH, shaded); + div += normalZ; + } else if (normalZ < 0) { + sum += -normalZ * this.blockInfo.blockView.getBrightness(Direction.NORTH, shaded); + div -= normalZ; + } + + return sum / div; + } + + /** + * Where we handle all pre-buffer coloring, lighting, transformation, etc. + * Reused for all mesh quads. Fixed baking array sized to hold largest possible mesh quad. + */ + private class Maker extends MutableQuadViewImpl implements QuadEmitter { + { + this.data = new int[EncodingFormat.TOTAL_STRIDE]; + this.material(SodiumRenderer.MATERIAL_STANDARD); + } + + // only used via RenderContext.getEmitter() + @Override + public Maker emit() { + this.computeGeometry(); + AbstractRenderer.this.renderQuad(this); + this.clear(); + return this; + } + } + + private final Maker editorQuad = new Maker(); + + public void acceptFabricMesh(Mesh mesh) { + final MeshImpl m = (MeshImpl) mesh; + final int[] data = m.data(); + final int limit = data.length; + int index = 0; + + while (index < limit) { + System.arraycopy(data, index, this.editorQuad.data(), 0, EncodingFormat.TOTAL_STRIDE); + this.editorQuad.load(); + index += EncodingFormat.TOTAL_STRIDE; + this.renderQuad(this.editorQuad); + } + } + + public QuadEmitter getEmitter() { + this.editorQuad.clear(); + return this.editorQuad; + } + + private void renderQuad(MutableQuadViewImpl quad) { + if (!this.transform.transform(this.editorQuad) || this.blockInfo.shouldCullFace(quad.cullFace())) { + return; + } + + final RenderMaterialValue material = quad.material(); + + if (!material.disableAo(0) && MinecraftClient.isAmbientOcclusionEnabled()) { + // needs to happen before offsets are applied + this.lighter.compute(quad); + } + + this.tessellateQuad(quad, material, DEFAULT_TEXTURE_INDEX); + } + + /** + * Determines color index and render layer, then routes to appropriate + * tessellate routine based on material properties. + */ + private void tessellateQuad(MutableQuadViewImpl quad, RenderMaterialValue mat, int textureIndex) { + final int colorIndex = mat.disableColorIndex(textureIndex) ? -1 : quad.colorIndex(); + final BlendMode blendMode = mat.blendMode(textureIndex); + + if (this.blockInfo.getAmbientOcclusionDefault() && !mat.disableAo(textureIndex)) { + if (mat.emissive(textureIndex)) { + this.tessellateSmoothEmissive(quad, blendMode, colorIndex); + } else { + this.tessellateSmooth(quad, blendMode, colorIndex); + } + } else { + if (mat.emissive(textureIndex)) { + this.tessellateFlatEmissive(quad, blendMode, colorIndex); + } else { + this.tessellateFlat(quad, blendMode, colorIndex); + } + } + } + + private static final RenderMaterialValue MATERIAL_FLAT = (RenderMaterialValue) SodiumRenderer.INSTANCE.materialFinder().disableAo(0, true).find(); + private static final RenderMaterialValue MATERIAL_SHADED = (RenderMaterialValue) SodiumRenderer.INSTANCE.materialFinder().find(); + + public void renderVanillaModel(BakedModel model) { + final Supplier random = this.blockInfo.getRandomSupplier(); + final BlockState blockState = this.blockInfo.blockState; + + final RenderMaterialValue defaultMaterial = this.getDefaultVanillaMaterial(model); + + for (Direction cullFace : DirectionUtil.ALL_DIRECTIONS) { + this.renderVanillaModelFace(model, blockState, cullFace, random, defaultMaterial); + } + + this.renderVanillaModelFace(model, blockState, null, random, defaultMaterial); + } + + private void renderVanillaModelFace(BakedModel model, BlockState blockState, Direction cullFace, Supplier random, RenderMaterialValue defaultMaterial) { + final List quads = model.getQuads(blockState, cullFace, random.get()); + final int count = quads.size(); + + //noinspection ForLoopReplaceableByForEach + for (int j = 0; j < count; j++) { + this.renderVanillaQuad(quads.get(j), cullFace, defaultMaterial); + } + } + + private RenderMaterialValue getDefaultVanillaMaterial(BakedModel model) { + return (this.blockInfo.getAmbientOcclusionDefault() && model.useAmbientOcclusion()) ? MATERIAL_SHADED : MATERIAL_FLAT; + } + + private void renderVanillaQuad(BakedQuad quad, Direction cullFace, RenderMaterialValue defaultMaterial) { + final MutableQuadViewImpl editorQuad = this.editorQuad; + editorQuad.fromVanilla(quad, defaultMaterial, cullFace); + + if (!this.transform.transform(editorQuad)) { + return; + } + + cullFace = editorQuad.cullFace(); + + if (cullFace != null && this.blockInfo.shouldCullFace(cullFace)) { + return; + } + + if (!editorQuad.material().disableAo(0)) { + // needs to happen before offsets are applied + this.lighter.compute(editorQuad); + this.tessellateSmooth(editorQuad, this.blockInfo.getDefaultLayer(), editorQuad.colorIndex()); + } else { + // Recomputing whether the quad has a light face is only needed if it doesn't also have a cull face, + // as in those cases, the cull face will always be used to offset the light sampling position + if (cullFace == null) { + // Can't rely on lazy computation in tessellateFlat() because needs to happen before offsets are applied + editorQuad.geometryFlags(); + } + + this.tessellateFlat(editorQuad, this.blockInfo.getDefaultLayer(), editorQuad.colorIndex()); + } + } +} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/renderer/BlockRenderInfo.java b/src/main/java/me/jellysquid/mods/sodium/client/render/renderer/BlockRenderInfo.java new file mode 100644 index 0000000000..a7893d0757 --- /dev/null +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/renderer/BlockRenderInfo.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.jellysquid.mods.sodium.client.render.renderer; + +import me.jellysquid.mods.sodium.client.model.quad.QuadColorizer; +import me.jellysquid.mods.sodium.client.render.occlusion.BlockOcclusionCache; +import me.jellysquid.mods.sodium.client.interop.vanilla.colors.BlockColorsExtended; +import net.fabricmc.fabric.api.renderer.v1.material.BlendMode; +import net.minecraft.block.BlockState; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.RenderLayers; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.BlockRenderView; + +import java.util.Random; +import java.util.function.Supplier; + +/** + * Holds, manages and provides access to the block/world related state + * needed by fallback and mesh consumers. + */ +public class BlockRenderInfo { + protected final BlockColorsExtended blockColors = (BlockColorsExtended) MinecraftClient.getInstance().getBlockColors(); + protected final BlockOcclusionCache blockOcclusionCache; + + private final Random random = new Random(); + + public BlockRenderView blockView; + public BlockPos blockPos; + public BlockState blockState; + + private long seed; + private boolean defaultAo; + + private BlendMode defaultLayer; + private QuadColorizer blockColorProvider; + + private final Supplier randomSupplier = () -> { + if (this.seed == -1L) { + this.seed = this.blockState.getRenderingSeed(this.blockPos); + } + + final Random random = this.random; + random.setSeed(this.seed); + + return random; + }; + + public BlockRenderInfo(BlockOcclusionCache blockOcclusionCache) { + this.blockOcclusionCache = blockOcclusionCache; + } + + public void setBlockView(BlockRenderView blockView) { + this.blockView = blockView; + } + + public void prepareForBlock(BlockState blockState, BlockPos blockPos, boolean modelAO) { + this.blockPos = blockPos; + this.blockState = blockState; + // in the unlikely case seed actually matches this, we'll simply retrieve it more than one + this.seed = -1L; + this.defaultAo = modelAO && MinecraftClient.isAmbientOcclusionEnabled() && blockState.getLuminance() == 0; + + this.blockColorProvider = null; + this.defaultLayer = null; + } + + Supplier getRandomSupplier() { + return this.randomSupplier; + } + + BlendMode getDefaultLayer() { + if (this.defaultLayer == null) { + this.defaultLayer = BlendMode.fromRenderLayer(RenderLayers.getBlockLayer(this.blockState)); + } + + return this.defaultLayer; + } + + QuadColorizer getColorProvider() { + if (this.blockColorProvider == null) { + this.blockColorProvider = this.blockColors.getColorProvider(this.blockState); + } + + return this.blockColorProvider; + } + + boolean shouldCullFace(Direction face) { + return false; + } + + public boolean getAmbientOcclusionDefault() { + return this.defaultAo; + } +} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/renderer/RenderContextBase.java b/src/main/java/me/jellysquid/mods/sodium/client/render/renderer/RenderContextBase.java new file mode 100644 index 0000000000..7be2447a76 --- /dev/null +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/renderer/RenderContextBase.java @@ -0,0 +1,32 @@ +package me.jellysquid.mods.sodium.client.render.renderer; + +import it.unimi.dsi.fastutil.Stack; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; +import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; +import org.apache.commons.lang3.Validate; + +abstract class RenderContextBase implements RenderContext { + private final Stack transformStack = new ObjectArrayList<>(); + + protected final boolean transform(MutableQuadView q) { + if (this.transformStack.isEmpty()) { + return true; + } + + return this.transformStack.top() + .transform(q); + } + + @Override + public void pushTransform(QuadTransform transform) { + Validate.notNull(transform, "Transform must be non-null"); + + this.transformStack.push(transform); + } + + @Override + public void popTransform() { + this.transformStack.pop(); + } +} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/renderer/TerrainBlockRenderInfo.java b/src/main/java/me/jellysquid/mods/sodium/client/render/renderer/TerrainBlockRenderInfo.java new file mode 100644 index 0000000000..c145ef8f68 --- /dev/null +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/renderer/TerrainBlockRenderInfo.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.jellysquid.mods.sodium.client.render.renderer; + +import me.jellysquid.mods.sodium.client.render.occlusion.BlockOcclusionCache; +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Vec3i; + +public class TerrainBlockRenderInfo extends BlockRenderInfo { + private int cullCompletionFlags; + private int cullResultFlags; + + private final BlockPos.Mutable relativeBlockPosition = new BlockPos.Mutable(); + private int chunkId; + + public TerrainBlockRenderInfo(BlockOcclusionCache blockOcclusionCache) { + super(blockOcclusionCache); + } + + @Override + public void prepareForBlock(BlockState blockState, BlockPos blockPos, boolean modelAO) { + super.prepareForBlock(blockState, blockPos, modelAO); + + this.cullCompletionFlags = 0; + this.cullResultFlags = 0; + + this.relativeBlockPosition.set( + this.blockPos.getX() & 15, + this.blockPos.getY() & 15, + this.blockPos.getZ() & 15 + ); + } + + public void setChunkId(int chunkId) { + this.chunkId = chunkId; + } + + @Override + boolean shouldCullFace(Direction face) { + if (face == null) { + return false; + } + + final int mask = (1 << face.getId()); + + if ((this.cullCompletionFlags & mask) == 0) { + if (this.blockOcclusionCache.shouldDrawSide(this.blockState, this.blockView, this.blockPos, face)) { + this.cullResultFlags |= mask; + } + + this.cullCompletionFlags |= mask; + } + + return (this.cullResultFlags & mask) == 0; + } + + public Vec3i getRelativeBlockPosition() { + return this.relativeBlockPosition; + } + + public int getChunkId() { + return this.chunkId; + } +} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/renderer/TerrainRenderContext.java b/src/main/java/me/jellysquid/mods/sodium/client/render/renderer/TerrainRenderContext.java new file mode 100644 index 0000000000..94eac064eb --- /dev/null +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/renderer/TerrainRenderContext.java @@ -0,0 +1,85 @@ +package me.jellysquid.mods.sodium.client.render.renderer; + +import me.jellysquid.mods.sodium.client.model.light.QuadLighter; +import me.jellysquid.mods.sodium.client.model.light.cache.SlicedLightDataCache; +import me.jellysquid.mods.sodium.client.model.light.smooth.SmoothQuadLighter; +import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildBuffers; +import me.jellysquid.mods.sodium.client.render.occlusion.BlockOcclusionCache; +import me.jellysquid.mods.sodium.client.world.WorldSlice; +import me.jellysquid.mods.sodium.client.world.cloned.ChunkRenderContext; +import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; +import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; +import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; +import net.minecraft.block.BlockState; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.model.BakedModel; +import net.minecraft.fluid.FluidState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +import java.util.function.Consumer; + +public class TerrainRenderContext extends RenderContextBase implements RenderContext { + private final WorldSlice worldSlice; + private final SlicedLightDataCache lightDataCache; + private final TerrainBlockRenderInfo blockRenderInfo; + + private final Consumer meshConsumer; + private final Consumer fallbackConsumer; + + private final TerrainRenderer terrainRenderer; + + public TerrainRenderContext(World world, ChunkBuildBuffers buffers) { + this.worldSlice = new WorldSlice(world); + + this.blockRenderInfo = new TerrainBlockRenderInfo(new BlockOcclusionCache()); + this.blockRenderInfo.setBlockView(this.worldSlice); + + this.lightDataCache = new SlicedLightDataCache(this.worldSlice); + + QuadLighter lighter = new SmoothQuadLighter(this.lightDataCache, this.blockRenderInfo); + + this.terrainRenderer = new TerrainRenderer(this.blockRenderInfo, buffers, lighter, this::transform); + this.meshConsumer = this.terrainRenderer::acceptFabricMesh; + this.fallbackConsumer = this.terrainRenderer::renderVanillaModel; + } + + @Override + public Consumer meshConsumer() { + return this.meshConsumer; + } + + @Override + public Consumer fallbackConsumer() { + return this.fallbackConsumer; + } + + @Override + public QuadEmitter getEmitter() { + return this.terrainRenderer.getEmitter(); + } + + public WorldSlice getWorldSlice() { + return this.worldSlice; + } + + public void prepare(ChunkRenderContext context) { + this.worldSlice.prepare(context); + this.lightDataCache.prepare(context.getOrigin()); + this.blockRenderInfo.setChunkId(context.getRelativeChunkIndex()); + } + + public boolean renderBlock(BlockState state, BlockPos.Mutable pos, int detailLevel) { + this.blockRenderInfo.prepareForBlock(state, pos, true); + + FabricBakedModel model = (FabricBakedModel) MinecraftClient.getInstance().getBlockRenderManager().getModel(state); + model.emitBlockQuads(this.blockRenderInfo.blockView, this.blockRenderInfo.blockState, this.blockRenderInfo.blockPos, this.blockRenderInfo.getRandomSupplier(), this); + + return true; + } + + public boolean renderFluid(FluidState fluidState, BlockPos.Mutable blockPos) { + return false; + } +} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/renderer/TerrainRenderer.java b/src/main/java/me/jellysquid/mods/sodium/client/render/renderer/TerrainRenderer.java new file mode 100644 index 0000000000..60ef200e73 --- /dev/null +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/renderer/TerrainRenderer.java @@ -0,0 +1,72 @@ +package me.jellysquid.mods.sodium.client.render.renderer; + +import me.jellysquid.mods.sodium.client.model.IndexBufferBuilder; +import me.jellysquid.mods.sodium.client.model.light.QuadLighter; +import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadFacing; +import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadWinding; +import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildBuffers; +import me.jellysquid.mods.sodium.client.render.chunk.compile.buffers.ChunkModelBuilder; +import me.jellysquid.mods.sodium.client.render.chunk.material.MaterialCutoutFlag; +import me.jellysquid.mods.sodium.client.render.chunk.material.MaterialFlag; +import me.jellysquid.mods.sodium.client.render.chunk.format.ModelVertexSink; +import me.jellysquid.mods.sodium.client.interop.fabric.helper.GeometryHelper; +import me.jellysquid.mods.sodium.client.interop.fabric.mesh.MutableQuadViewImpl; +import me.jellysquid.mods.sodium.client.util.color.ColorARGB; +import net.fabricmc.fabric.api.renderer.v1.material.BlendMode; +import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.util.math.Vec3i; + +public class TerrainRenderer extends AbstractRenderer { + private final ChunkBuildBuffers buildBuffers; + + TerrainRenderer(TerrainBlockRenderInfo blockInfo, ChunkBuildBuffers buildBuffers, QuadLighter lighter, RenderContext.QuadTransform transform) { + super(blockInfo, lighter, transform); + + this.buildBuffers = buildBuffers; + } + + @Override + protected void emitQuad(MutableQuadViewImpl quad, BlendMode renderLayer) { + RenderLayer layer = renderLayer.blockRenderLayer; + + int bits = switch (renderLayer) { + case SOLID, DEFAULT, TRANSLUCENT -> MaterialCutoutFlag.shift(MaterialCutoutFlag.NONE); + case CUTOUT -> MaterialCutoutFlag.shift(MaterialCutoutFlag.TENTH) | MaterialFlag.CUTOUT; + case CUTOUT_MIPPED -> MaterialCutoutFlag.shift(MaterialCutoutFlag.HALF); + }; + + ChunkModelBuilder builder = this.buildBuffers.getBuilder(layer); + + ModelVertexSink vertexSink = builder.getVertexSink(); + vertexSink.ensureCapacity(4); + + IndexBufferBuilder indexSink = builder.getIndexBufferBuilder(getBlockFace(quad)); + int vertexStart = vertexSink.getVertexCount(); + + Vec3i relativePos = this.blockInfo.getRelativeBlockPosition(); + int chunkId = this.blockInfo.getChunkId(); + + for (int i = 0; i < 4; i++) { + vertexSink.writeVertex(quad.x(i) + relativePos.getX(), quad.y(i) + relativePos.getY(), quad.z(i) + relativePos.getZ(), + ColorARGB.toABGR(quad.spriteColor(i, 0)), + quad.spriteU(i, 0), quad.spriteV(i, 0), + quad.lightmap(i), + chunkId, + bits); + } + + indexSink.add(vertexStart, ModelQuadWinding.CLOCKWISE); + + vertexSink.flush(); + } + + private static ModelQuadFacing getBlockFace(MutableQuadViewImpl quad) { + // Model quads which are not aligned to the world grid are not eligible for plane culling + if (quad.nominalFace() == null || (quad.geometryFlags() & GeometryHelper.AXIS_ALIGNED_FLAG) == 0) { + return ModelQuadFacing.UNASSIGNED; + } + + return ModelQuadFacing.fromDirection(quad.nominalFace()); + } +} diff --git a/src/main/java/me/jellysquid/mods/sodium/common/util/DirectionUtil.java b/src/main/java/me/jellysquid/mods/sodium/client/util/DirectionUtil.java similarity index 95% rename from src/main/java/me/jellysquid/mods/sodium/common/util/DirectionUtil.java rename to src/main/java/me/jellysquid/mods/sodium/client/util/DirectionUtil.java index 09b2bb9172..1a0d6de577 100644 --- a/src/main/java/me/jellysquid/mods/sodium/common/util/DirectionUtil.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/util/DirectionUtil.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.common.util; +package me.jellysquid.mods.sodium.client.util; import net.minecraft.util.math.Direction; diff --git a/src/main/java/me/jellysquid/mods/sodium/common/util/ListUtil.java b/src/main/java/me/jellysquid/mods/sodium/client/util/ListUtil.java similarity index 87% rename from src/main/java/me/jellysquid/mods/sodium/common/util/ListUtil.java rename to src/main/java/me/jellysquid/mods/sodium/client/util/ListUtil.java index 1002fbcc95..90e0a5e0dd 100644 --- a/src/main/java/me/jellysquid/mods/sodium/common/util/ListUtil.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/util/ListUtil.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.common.util; +package me.jellysquid.mods.sodium.client.util; import java.util.Collection; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/TextProvider.java b/src/main/java/me/jellysquid/mods/sodium/client/util/TextProvider.java similarity index 64% rename from src/main/java/me/jellysquid/mods/sodium/client/gui/options/TextProvider.java rename to src/main/java/me/jellysquid/mods/sodium/client/util/TextProvider.java index adb85defce..a652eb2bc6 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gui/options/TextProvider.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/util/TextProvider.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gui.options; +package me.jellysquid.mods.sodium.client.util; import net.minecraft.text.Text; diff --git a/src/main/java/me/jellysquid/mods/sodium/common/util/collections/FutureQueueDrainingIterator.java b/src/main/java/me/jellysquid/mods/sodium/client/util/collections/FutureQueueDrainingIterator.java similarity index 95% rename from src/main/java/me/jellysquid/mods/sodium/common/util/collections/FutureQueueDrainingIterator.java rename to src/main/java/me/jellysquid/mods/sodium/client/util/collections/FutureQueueDrainingIterator.java index 78d9f1d7b6..c8cdb936b9 100644 --- a/src/main/java/me/jellysquid/mods/sodium/common/util/collections/FutureQueueDrainingIterator.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/util/collections/FutureQueueDrainingIterator.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.common.util.collections; +package me.jellysquid.mods.sodium.client.util.collections; import it.unimi.dsi.fastutil.PriorityQueue; import me.jellysquid.mods.sodium.client.SodiumClientMod; diff --git a/src/main/java/me/jellysquid/mods/sodium/common/util/collections/QueueDrainingIterator.java b/src/main/java/me/jellysquid/mods/sodium/client/util/collections/QueueDrainingIterator.java similarity index 87% rename from src/main/java/me/jellysquid/mods/sodium/common/util/collections/QueueDrainingIterator.java rename to src/main/java/me/jellysquid/mods/sodium/client/util/collections/QueueDrainingIterator.java index 4e6b9cc1d5..405be2b014 100644 --- a/src/main/java/me/jellysquid/mods/sodium/common/util/collections/QueueDrainingIterator.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/util/collections/QueueDrainingIterator.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.common.util.collections; +package me.jellysquid.mods.sodium.client.util.collections; import java.util.Iterator; import java.util.Queue; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/util/color/ColorARGB.java b/src/main/java/me/jellysquid/mods/sodium/client/util/color/ColorARGB.java index 5b996492ec..7c58a52426 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/util/color/ColorARGB.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/util/color/ColorARGB.java @@ -21,6 +21,40 @@ public static int pack(int r, int g, int b, int a) { return (a & 0xFF) << 24 | (r & 0xFF) << 16 | (g & 0xFF) << 8 | (b & 0xFF); } + /** + * Multiplies the RGB components of the packed ARGB color using the given scale factors. + * @param color The ARGB packed color to be multiplied + * @param rw The red component scale factor + * @param gw The green component scale factor + * @param bw The blue component scale factor + */ + public static int mulRGB(int color, float rw, float gw, float bw) { + float r = unpackRed(color) * rw; + float g = unpackGreen(color) * gw; + float b = unpackBlue(color) * bw; + + return pack((int) r, (int) g, (int) b, 0xFF); + } + + public static int mulRGB(int color, float w) { + return mulRGB(color, w, w, w); + } + + public static int mulRGBA(int color1, int color2) { + if (color1 == -1) { + return color2; + } else if (color2 == -1) { + return color1; + } + + final int alpha = ((color1 >> 24) & 0xFF) * ((color2 >> 24) & 0xFF) / 0xFF; + final int red = ((color1 >> 16) & 0xFF) * ((color2 >> 16) & 0xFF) / 0xFF; + final int green = ((color1 >> 8) & 0xFF) * ((color2 >> 8) & 0xFF) / 0xFF; + final int blue = (color1 & 0xFF) * (color2 & 0xFF) / 0xFF; + + return (alpha << 24) | (red << 16) | (green << 8) | blue; + } + /** * @param color The packed 32-bit ARGB color to unpack * @return The red color component in the range of 0..255 @@ -63,6 +97,4 @@ public static int toABGR(int color, int alpha) { public static int toABGR(int color) { return Integer.reverseBytes(color << 8); } - - } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/util/font/BatchedGlyphRender.java b/src/main/java/me/jellysquid/mods/sodium/client/util/font/BatchedGlyphRender.java deleted file mode 100644 index 60ec489069..0000000000 --- a/src/main/java/me/jellysquid/mods/sodium/client/util/font/BatchedGlyphRender.java +++ /dev/null @@ -1,40 +0,0 @@ -package me.jellysquid.mods.sodium.client.util.font; - -import net.minecraft.client.font.GlyphRenderer; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.util.math.Matrix4f; - -import java.util.Objects; - -public final class BatchedGlyphRender { - public final GlyphRenderer glyphRenderer; - public final boolean bold; - public final boolean italic; - public final float weight; - public final float x; - public final float y; - public final float red; - public final float green; - public final float blue; - public final float alpha; - public final int light; - - public BatchedGlyphRender(GlyphRenderer glyphRenderer, - boolean bold, boolean italic, float weight, - float x, float y, - float red, float green, float blue, float alpha, - int light) { - this.glyphRenderer = glyphRenderer; - this.bold = bold; - this.italic = italic; - this.weight = weight; - this.x = x; - this.y = y; - this.red = red; - this.green = green; - this.blue = blue; - this.alpha = alpha; - this.light = light; - } -} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/util/Norm3b.java b/src/main/java/me/jellysquid/mods/sodium/client/util/geometry/Norm3b.java similarity index 96% rename from src/main/java/me/jellysquid/mods/sodium/client/util/Norm3b.java rename to src/main/java/me/jellysquid/mods/sodium/client/util/geometry/Norm3b.java index 5df3e52c55..6c65a1c62d 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/util/Norm3b.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/util/geometry/Norm3b.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.util; +package me.jellysquid.mods.sodium.client.util.geometry; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3f; @@ -24,7 +24,7 @@ public class Norm3b { */ private static final float NORM = 1.0f / COMPONENT_RANGE; - static int pack(Vec3i norm) { + public static int pack(Vec3i norm) { return pack(norm.getX(), norm.getY(), norm.getZ()); } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/world/WorldSlice.java b/src/main/java/me/jellysquid/mods/sodium/client/world/WorldSlice.java index 72d422785f..58afa13660 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/world/WorldSlice.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/world/WorldSlice.java @@ -1,7 +1,9 @@ package me.jellysquid.mods.sodium.client.world; import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap; -import me.jellysquid.mods.sodium.client.world.cloned.PackedIntegerArrayExtended; +import me.jellysquid.mods.sodium.client.model.light.SidedBrightnessTable; +import me.jellysquid.mods.sodium.client.render.chunk.region.RenderRegion; +import me.jellysquid.mods.sodium.client.interop.vanilla.chunk.PackedIntegerArrayExtended; import me.jellysquid.mods.sodium.client.world.biome.BiomeCache; import me.jellysquid.mods.sodium.client.world.biome.BiomeColorCache; import me.jellysquid.mods.sodium.client.world.cloned.ChunkRenderContext; @@ -68,6 +70,9 @@ public class WorldSlice implements BlockRenderView, BiomeAccess.Storage, RenderA // Local Section->BlockState table. private final BlockState[][] blockStatesArrays; + // Cached lookup table for brightness used in face darkening + private final SidedBrightnessTable sidedBrightnessTable; + // Local section copies. Read-only. private ClonedChunkSection[] sections; @@ -129,11 +134,18 @@ public static ChunkRenderContext prepare(World world, ChunkSectionPos origin, Cl } } - return new ChunkRenderContext(origin, sections, volume); + int rX = origin.getX() & (RenderRegion.REGION_WIDTH - 1); + int rY = origin.getY() & (RenderRegion.REGION_HEIGHT - 1); + int rZ = origin.getZ() & (RenderRegion.REGION_LENGTH - 1); + + int chunkId = RenderRegion.getChunkIndex(rX, rY, rZ); + + return new ChunkRenderContext(origin, sections, volume, chunkId); } public WorldSlice(World world) { this.world = world; + this.sidedBrightnessTable = new SidedBrightnessTable(world); this.sections = new ClonedChunkSection[SECTION_TABLE_ARRAY_SIZE]; this.blockStatesArrays = new BlockState[SECTION_TABLE_ARRAY_SIZE][]; @@ -151,7 +163,7 @@ public WorldSlice(World world) { } } - public void copyData(ChunkRenderContext context) { + public void prepare(ChunkRenderContext context) { this.origin = context.getOrigin(); this.sections = context.getSections(); @@ -239,7 +251,7 @@ public FluidState getFluidState(BlockPos pos) { @Override public float getBrightness(Direction direction, boolean shaded) { - return this.world.getBrightness(direction, shaded); + return this.sidedBrightnessTable.get(direction, shaded); } @Override diff --git a/src/main/java/me/jellysquid/mods/sodium/client/world/biome/BiomeCache.java b/src/main/java/me/jellysquid/mods/sodium/client/world/biome/BiomeCache.java index b2fd3bc552..2a8d41b099 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/world/biome/BiomeCache.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/world/biome/BiomeCache.java @@ -1,6 +1,6 @@ package me.jellysquid.mods.sodium.client.world.biome; -import me.jellysquid.mods.sodium.client.world.ClientWorldExtended; +import me.jellysquid.mods.sodium.client.interop.vanilla.world.ClientWorldExtended; import net.minecraft.world.World; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.source.BiomeAccess; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/world/biome/BlockColorsExtended.java b/src/main/java/me/jellysquid/mods/sodium/client/world/biome/BlockColorsExtended.java deleted file mode 100644 index 2aaab746f0..0000000000 --- a/src/main/java/me/jellysquid/mods/sodium/client/world/biome/BlockColorsExtended.java +++ /dev/null @@ -1,8 +0,0 @@ -package me.jellysquid.mods.sodium.client.world.biome; - -import me.jellysquid.mods.sodium.client.model.quad.ModelQuadColorProvider; -import net.minecraft.block.BlockState; - -public interface BlockColorsExtended { - ModelQuadColorProvider getColorProvider(BlockState state); -} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/world/cloned/ChunkRenderContext.java b/src/main/java/me/jellysquid/mods/sodium/client/world/cloned/ChunkRenderContext.java index cf01165447..35373a6c6d 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/world/cloned/ChunkRenderContext.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/world/cloned/ChunkRenderContext.java @@ -7,11 +7,13 @@ public class ChunkRenderContext { private final ChunkSectionPos origin; private final ClonedChunkSection[] sections; private final BlockBox volume; + private final int chunkIndex; - public ChunkRenderContext(ChunkSectionPos origin, ClonedChunkSection[] sections, BlockBox volume) { + public ChunkRenderContext(ChunkSectionPos origin, ClonedChunkSection[] sections, BlockBox volume, int chunkIndex) { this.origin = origin; this.sections = sections; this.volume = volume; + this.chunkIndex = chunkIndex; } public ClonedChunkSection[] getSections() { @@ -34,4 +36,8 @@ public void releaseResources() { } } } + + public int getRelativeChunkIndex() { + return this.chunkIndex; + } } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/world/cloned/ClonedChunkSection.java b/src/main/java/me/jellysquid/mods/sodium/client/world/cloned/ClonedChunkSection.java index cdf65a6c23..d588d8970d 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/world/cloned/ClonedChunkSection.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/world/cloned/ClonedChunkSection.java @@ -1,6 +1,7 @@ package me.jellysquid.mods.sodium.client.world.cloned; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; +import me.jellysquid.mods.sodium.client.interop.vanilla.chunk.PalettedContainerExtended; import me.jellysquid.mods.sodium.client.world.cloned.palette.ClonedPalette; import me.jellysquid.mods.sodium.client.world.cloned.palette.ClonedPaletteFallback; import me.jellysquid.mods.sodium.client.world.cloned.palette.ClonedPalleteArray; diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/SodiumMixinPlugin.java b/src/main/java/me/jellysquid/mods/sodium/mixin/SodiumMixinPlugin.java index 8c4bec2475..89081de2de 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/SodiumMixinPlugin.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/SodiumMixinPlugin.java @@ -1,7 +1,7 @@ package me.jellysquid.mods.sodium.mixin; -import me.jellysquid.mods.sodium.common.config.Option; -import me.jellysquid.mods.sodium.common.config.SodiumConfig; +import me.jellysquid.mods.sodium.client.config.mixin.MixinOption; +import me.jellysquid.mods.sodium.client.config.SodiumMixinConfig; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.objectweb.asm.tree.ClassNode; @@ -17,12 +17,12 @@ public class SodiumMixinPlugin implements IMixinConfigPlugin { private static final String MIXIN_PACKAGE_ROOT = "me.jellysquid.mods.sodium.mixin."; private final Logger logger = LogManager.getLogger("Sodium"); - private SodiumConfig config; + private SodiumMixinConfig config; @Override public void onLoad(String mixinPackage) { try { - this.config = SodiumConfig.load(new File("./config/sodium-mixins.properties")); + this.config = SodiumMixinConfig.load(new File("./config/sodium-mixins.properties")); } catch (Exception e) { throw new RuntimeException("Could not load configuration file for Sodium", e); } @@ -46,7 +46,7 @@ public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { } String mixin = mixinClassName.substring(MIXIN_PACKAGE_ROOT.length()); - Option option = this.config.getEffectiveOptionForMixin(mixin); + MixinOption option = this.config.getEffectiveOptionForMixin(mixin); if (option == null) { this.logger.error("No rules matched mixin '{}', treating as foreign and disabling!", mixin); diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/core/MixinSinglePreparationResourceReloader.java b/src/main/java/me/jellysquid/mods/sodium/mixin/core/MixinSinglePreparationResourceReloader.java index 7cabe96104..8f69b7b7be 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/core/MixinSinglePreparationResourceReloader.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/core/MixinSinglePreparationResourceReloader.java @@ -1,6 +1,6 @@ package me.jellysquid.mods.sodium.mixin.core; -import me.jellysquid.mods.sodium.client.util.resource.SinglePreparationResourceReloaderAccess; +import me.jellysquid.mods.sodium.client.interop.vanilla.resource.SinglePreparationResourceReloaderAccess; import net.minecraft.resource.ResourceManager; import net.minecraft.resource.SinglePreparationResourceReloader; import net.minecraft.util.profiler.Profiler; diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/core/matrix/MixinMatrix3f.java b/src/main/java/me/jellysquid/mods/sodium/mixin/core/matrix/MixinMatrix3f.java index 5e41706324..0d360aac6f 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/core/matrix/MixinMatrix3f.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/core/matrix/MixinMatrix3f.java @@ -1,7 +1,7 @@ package me.jellysquid.mods.sodium.mixin.core.matrix; -import me.jellysquid.mods.sodium.client.util.Norm3b; -import me.jellysquid.mods.sodium.client.util.math.Matrix3fExtended; +import me.jellysquid.mods.sodium.client.util.geometry.Norm3b; +import me.jellysquid.mods.sodium.client.interop.vanilla.matrix.Matrix3fExtended; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Matrix3f; import net.minecraft.util.math.Quaternion; diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/core/matrix/MixinMatrix4f.java b/src/main/java/me/jellysquid/mods/sodium/mixin/core/matrix/MixinMatrix4f.java index cdfe9ee0d0..ea7696be4f 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/core/matrix/MixinMatrix4f.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/core/matrix/MixinMatrix4f.java @@ -1,6 +1,6 @@ package me.jellysquid.mods.sodium.mixin.core.matrix; -import me.jellysquid.mods.sodium.client.util.math.Matrix4fExtended; +import me.jellysquid.mods.sodium.client.interop.vanilla.matrix.Matrix4fExtended; import net.minecraft.util.math.Matrix4f; import net.minecraft.util.math.Quaternion; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/core/model/MixinBlockColors.java b/src/main/java/me/jellysquid/mods/sodium/mixin/core/model/MixinBlockColors.java index c6f86b0d35..f366960b34 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/core/model/MixinBlockColors.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/core/model/MixinBlockColors.java @@ -2,8 +2,8 @@ import it.unimi.dsi.fastutil.objects.Reference2ReferenceMap; import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; -import me.jellysquid.mods.sodium.client.model.quad.ModelQuadColorProvider; -import me.jellysquid.mods.sodium.client.world.biome.BlockColorsExtended; +import me.jellysquid.mods.sodium.client.model.quad.QuadColorizer; +import me.jellysquid.mods.sodium.client.interop.vanilla.colors.BlockColorsExtended; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.client.color.block.BlockColorProvider; @@ -15,15 +15,15 @@ @Mixin(BlockColors.class) public class MixinBlockColors implements BlockColorsExtended { - private Reference2ReferenceMap> blocksToColor; + private Reference2ReferenceMap> blocksToColor; - private static final ModelQuadColorProvider DEFAULT_PROVIDER = (state, view, pos, tint) -> -1; + private static final QuadColorizer DEFAULT_PROVIDER = (state, view, pos, tint) -> -1; @SuppressWarnings("unchecked") @Inject(method = "", at = @At("RETURN")) private void init(CallbackInfo ci) { this.blocksToColor = new Reference2ReferenceOpenHashMap<>(); - this.blocksToColor.defaultReturnValue((ModelQuadColorProvider) DEFAULT_PROVIDER); + this.blocksToColor.defaultReturnValue((QuadColorizer) DEFAULT_PROVIDER); } @Inject(method = "registerColorProvider", at = @At("HEAD")) @@ -34,7 +34,7 @@ private void preRegisterColor(BlockColorProvider provider, Block[] blocks, Callb } @Override - public ModelQuadColorProvider getColorProvider(BlockState state) { + public QuadColorizer getColorProvider(BlockState state) { return this.blocksToColor.get(state.getBlock()); } } diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/core/model/MixinItemColors.java b/src/main/java/me/jellysquid/mods/sodium/mixin/core/model/MixinItemColors.java index 3b05fe9360..19f9609b16 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/core/model/MixinItemColors.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/core/model/MixinItemColors.java @@ -2,7 +2,7 @@ import it.unimi.dsi.fastutil.objects.Reference2ReferenceMap; import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; -import me.jellysquid.mods.sodium.client.world.biome.ItemColorsExtended; +import me.jellysquid.mods.sodium.client.interop.vanilla.colors.ItemColorsExtended; import net.minecraft.client.color.item.ItemColorProvider; import net.minecraft.client.color.item.ItemColors; import net.minecraft.item.ItemConvertible; diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/core/pipeline/MixinBakedQuad.java b/src/main/java/me/jellysquid/mods/sodium/mixin/core/pipeline/MixinBakedQuad.java index 4bfd5f38d9..cd4e418f04 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/core/pipeline/MixinBakedQuad.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/core/pipeline/MixinBakedQuad.java @@ -1,21 +1,16 @@ package me.jellysquid.mods.sodium.mixin.core.pipeline; -import me.jellysquid.mods.sodium.client.model.quad.ModelQuadView; -import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadFlags; +import me.jellysquid.mods.sodium.client.interop.vanilla.quad.BakedQuadView; import net.minecraft.client.render.model.BakedQuad; import net.minecraft.client.texture.Sprite; -import net.minecraft.util.math.Direction; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import static me.jellysquid.mods.sodium.client.util.ModelQuadUtil.*; +import static me.jellysquid.mods.sodium.client.interop.vanilla.quad.BakedQuadHelper.*; @Mixin(BakedQuad.class) -public class MixinBakedQuad implements ModelQuadView { +public class MixinBakedQuad implements BakedQuadView { @Shadow @Final protected int[] vertexData; @@ -28,13 +23,6 @@ public class MixinBakedQuad implements ModelQuadView { @Final protected int colorIndex; - private int cachedFlags; - - @Inject(method = "", at = @At("RETURN")) - private void init(int[] vertexData, int colorIndex, Direction face, Sprite sprite, boolean shade, CallbackInfo ci) { - this.cachedFlags = ModelQuadFlags.getQuadFlags((BakedQuad) (Object) this); - } - @Override public float getX(int idx) { return Float.intBitsToFloat(this.vertexData[vertexOffset(idx) + POSITION_INDEX]); @@ -70,11 +58,6 @@ public float getTexV(int idx) { return Float.intBitsToFloat(this.vertexData[vertexOffset(idx) + TEXTURE_INDEX + 1]); } - @Override - public int getFlags() { - return this.cachedFlags; - } - @Override public int getLight(int idx) { return this.vertexData[vertexOffset(idx) + LIGHT_INDEX]; diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/core/pipeline/MixinBufferBuilder.java b/src/main/java/me/jellysquid/mods/sodium/mixin/core/pipeline/MixinBufferBuilder.java index f6cacf1217..e80d6fa230 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/core/pipeline/MixinBufferBuilder.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/core/pipeline/MixinBufferBuilder.java @@ -1,14 +1,14 @@ package me.jellysquid.mods.sodium.mixin.core.pipeline; import me.jellysquid.mods.sodium.client.SodiumClientMod; -import me.jellysquid.mods.sodium.client.gl.attribute.BufferVertexFormat; +import me.jellysquid.mods.thingl.attribute.BufferVertexFormat; import me.jellysquid.mods.sodium.client.model.vertex.VanillaVertexTypes; import me.jellysquid.mods.sodium.client.model.vertex.VertexDrain; import me.jellysquid.mods.sodium.client.model.vertex.VertexSink; import me.jellysquid.mods.sodium.client.model.vertex.buffer.VertexBufferView; import me.jellysquid.mods.sodium.client.model.vertex.type.BlittableVertexType; import me.jellysquid.mods.sodium.client.model.vertex.type.VertexType; -import me.jellysquid.mods.sodium.client.render.ModelQuadOverlayAdapter; +import me.jellysquid.mods.sodium.client.interop.vanilla.quad.ModelQuadOverlayAdapter; import net.minecraft.client.render.BufferBuilder; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexFormat; diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/core/pipeline/MixinVertexFormat.java b/src/main/java/me/jellysquid/mods/sodium/mixin/core/pipeline/MixinVertexFormat.java index a9766681ea..78b2901981 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/core/pipeline/MixinVertexFormat.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/core/pipeline/MixinVertexFormat.java @@ -1,6 +1,6 @@ package me.jellysquid.mods.sodium.mixin.core.pipeline; -import me.jellysquid.mods.sodium.client.gl.attribute.BufferVertexFormat; +import me.jellysquid.mods.thingl.attribute.BufferVertexFormat; import net.minecraft.client.render.VertexFormat; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/block/MixinBlockModelRenderer.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/block/MixinBlockModelRenderer.java index fada168fba..3de467e8de 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/block/MixinBlockModelRenderer.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/block/MixinBlockModelRenderer.java @@ -1,14 +1,13 @@ package me.jellysquid.mods.sodium.mixin.features.block; -import me.jellysquid.mods.sodium.client.model.quad.ModelQuadView; +import me.jellysquid.mods.sodium.client.interop.vanilla.quad.BakedQuadView; import me.jellysquid.mods.sodium.client.model.vertex.VanillaVertexTypes; import me.jellysquid.mods.sodium.client.model.vertex.VertexDrain; import me.jellysquid.mods.sodium.client.model.vertex.formats.ModelQuadVertexSink; import me.jellysquid.mods.sodium.client.render.texture.SpriteUtil; -import me.jellysquid.mods.sodium.client.util.ModelQuadUtil; import me.jellysquid.mods.sodium.client.util.color.ColorABGR; import me.jellysquid.mods.sodium.client.util.rand.XoRoShiRoRandom; -import me.jellysquid.mods.sodium.common.util.DirectionUtil; +import me.jellysquid.mods.sodium.client.util.DirectionUtil; import net.minecraft.block.BlockState; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.block.BlockModelRenderer; @@ -86,7 +85,7 @@ private static void renderQuad(MatrixStack.Entry entry, ModelQuadVertexSink drai for (BakedQuad bakedQuad : list) { int color = bakedQuad.hasColor() ? defaultColor : 0xFFFFFFFF; - ModelQuadView quad = ((ModelQuadView) bakedQuad); + BakedQuadView quad = ((BakedQuadView) bakedQuad); for (int i = 0; i < 4; i++) { drain.writeQuad(entry, quad.getX(i), quad.getY(i), quad.getZ(i), color, quad.getTexU(i), quad.getTexV(i), diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/block/MixinSignBlockEntityRenderer.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/block/MixinSignBlockEntityRenderer.java index 29439640fb..1f4025361e 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/block/MixinSignBlockEntityRenderer.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/block/MixinSignBlockEntityRenderer.java @@ -1,6 +1,6 @@ package me.jellysquid.mods.sodium.mixin.features.block; -import me.jellysquid.mods.sodium.client.render.BatchingVertexConsumer; +import me.jellysquid.mods.sodium.client.interop.vanilla.consumer.BatchingVertexConsumer; import net.minecraft.block.entity.SignBlockEntity; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.render.VertexConsumerProvider; diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/block/MixinWorldRenderer.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/block/MixinWorldRenderer.java deleted file mode 100644 index 3709ab2afc..0000000000 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/block/MixinWorldRenderer.java +++ /dev/null @@ -1,27 +0,0 @@ -package me.jellysquid.mods.sodium.mixin.features.block; - -import me.jellysquid.mods.sodium.client.render.pipeline.context.ChunkRenderCacheShared; -import net.minecraft.client.render.Camera; -import net.minecraft.client.render.GameRenderer; -import net.minecraft.client.render.LightmapTextureManager; -import net.minecraft.client.render.WorldRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.math.Matrix4f; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(WorldRenderer.class) -public class MixinWorldRenderer { - /** - * Reset any global cached state before rendering a frame. This will hopefully ensure that any world state that has - * changed is reflected in vanilla-style rendering. - */ - @Inject(method = "render", at = @At("HEAD")) - private void reset(MatrixStack matrices, float tickDelta, long limitTime, boolean renderBlockOutline, Camera camera, - GameRenderer gameRenderer, LightmapTextureManager lightmapTextureManager, Matrix4f matrix4f, - CallbackInfo ci) { - ChunkRenderCacheShared.resetCaches(); - } -} diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/buffer_builder/fast_sort/MixinBufferBuilder.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/buffer_builder/fast_sort/MixinBufferBuilder.java index 62b95294a2..948581cea5 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/buffer_builder/fast_sort/MixinBufferBuilder.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/buffer_builder/fast_sort/MixinBufferBuilder.java @@ -2,7 +2,7 @@ import it.unimi.dsi.fastutil.ints.IntConsumer; import me.jellysquid.mods.sodium.client.SodiumClientMod; -import me.jellysquid.mods.sodium.client.util.geometry.BufferBuilderParametersAccess; +import me.jellysquid.mods.sodium.client.interop.vanilla.buffer.BufferBuilderParametersAccess; import me.jellysquid.mods.sodium.client.util.geometry.GeometrySort; import net.minecraft.client.render.BufferBuilder; import net.minecraft.client.render.VertexFormat; diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/buffer_builder/intrinsics/MixinBufferBuilder.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/buffer_builder/intrinsics/MixinBufferBuilder.java index f426332d4e..c52cc7cac2 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/buffer_builder/intrinsics/MixinBufferBuilder.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/buffer_builder/intrinsics/MixinBufferBuilder.java @@ -1,12 +1,12 @@ package me.jellysquid.mods.sodium.mixin.features.buffer_builder.intrinsics; -import me.jellysquid.mods.sodium.client.model.quad.ModelQuadView; +import me.jellysquid.mods.sodium.client.interop.vanilla.quad.BakedQuadView; import me.jellysquid.mods.sodium.client.model.vertex.VanillaVertexTypes; import me.jellysquid.mods.sodium.client.model.vertex.VertexDrain; import me.jellysquid.mods.sodium.client.model.vertex.formats.ModelQuadVertexSink; import me.jellysquid.mods.sodium.client.util.color.ColorABGR; import me.jellysquid.mods.sodium.client.util.color.ColorU8; -import me.jellysquid.mods.sodium.client.util.math.MatrixUtil; +import me.jellysquid.mods.sodium.client.interop.vanilla.matrix.MatrixUtil; import net.minecraft.client.render.BufferBuilder; import net.minecraft.client.render.FixedColorVertexConsumer; import net.minecraft.client.render.model.BakedQuad; @@ -35,7 +35,7 @@ public void quad(MatrixStack.Entry matrices, BakedQuad quad, float[] brightnessT throw new IllegalStateException(); } - ModelQuadView quadView = (ModelQuadView) quad; + BakedQuadView quadView = (BakedQuadView) quad; Matrix4f modelMatrix = matrices.getModel(); Matrix3f normalMatrix = matrices.getNormal(); diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/buffer_builder/intrinsics/MixinWorldRenderer.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/buffer_builder/intrinsics/MixinWorldRenderer.java index d75519792d..4303883c3c 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/buffer_builder/intrinsics/MixinWorldRenderer.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/buffer_builder/intrinsics/MixinWorldRenderer.java @@ -3,11 +3,11 @@ import me.jellysquid.mods.sodium.client.model.vertex.VanillaVertexTypes; import me.jellysquid.mods.sodium.client.model.vertex.VertexDrain; import me.jellysquid.mods.sodium.client.model.vertex.formats.LineVertexSink; -import me.jellysquid.mods.sodium.client.util.Norm3b; +import me.jellysquid.mods.sodium.client.util.geometry.Norm3b; import me.jellysquid.mods.sodium.client.util.color.ColorABGR; -import me.jellysquid.mods.sodium.client.util.math.Matrix3fExtended; -import me.jellysquid.mods.sodium.client.util.math.Matrix4fExtended; -import me.jellysquid.mods.sodium.client.util.math.MatrixUtil; +import me.jellysquid.mods.sodium.client.interop.vanilla.matrix.Matrix3fExtended; +import me.jellysquid.mods.sodium.client.interop.vanilla.matrix.Matrix4fExtended; +import me.jellysquid.mods.sodium.client.interop.vanilla.matrix.MatrixUtil; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.WorldRenderer; import net.minecraft.client.util.math.MatrixStack; diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/chunk_rendering/MixinClientChunkManager.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/chunk_rendering/MixinClientChunkManager.java index 14f50dfc36..94ac97dacb 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/chunk_rendering/MixinClientChunkManager.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/chunk_rendering/MixinClientChunkManager.java @@ -4,8 +4,8 @@ import it.unimi.dsi.fastutil.longs.LongCollections; import it.unimi.dsi.fastutil.longs.LongIterator; import it.unimi.dsi.fastutil.longs.LongOpenHashSet; -import me.jellysquid.mods.sodium.client.world.ChunkStatusListener; -import me.jellysquid.mods.sodium.client.world.ClientChunkManagerExtended; +import me.jellysquid.mods.sodium.client.interop.vanilla.world.ChunkStatusListener; +import me.jellysquid.mods.sodium.client.interop.vanilla.world.ClientChunkManagerExtended; import net.minecraft.client.world.ClientChunkManager; import net.minecraft.nbt.NbtCompound; import net.minecraft.network.PacketByteBuf; diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/chunk_rendering/MixinClientWorld.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/chunk_rendering/MixinClientWorld.java index b0e4f61616..56735e3354 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/chunk_rendering/MixinClientWorld.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/chunk_rendering/MixinClientWorld.java @@ -1,6 +1,6 @@ package me.jellysquid.mods.sodium.mixin.features.chunk_rendering; -import me.jellysquid.mods.sodium.client.world.ClientWorldExtended; +import me.jellysquid.mods.sodium.client.interop.vanilla.world.ClientWorldExtended; import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.client.render.WorldRenderer; import net.minecraft.client.world.ClientWorld; diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/chunk_rendering/MixinLightmapTextureManager.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/chunk_rendering/MixinLightmapTextureManager.java index f7d6c27197..d79d81a0c5 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/chunk_rendering/MixinLightmapTextureManager.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/chunk_rendering/MixinLightmapTextureManager.java @@ -1,6 +1,6 @@ package me.jellysquid.mods.sodium.mixin.features.chunk_rendering; -import me.jellysquid.mods.sodium.client.render.LightmapTextureManagerAccessor; +import me.jellysquid.mods.sodium.client.interop.vanilla.lightmap.LightmapTextureManagerAccessor; import net.minecraft.client.render.LightmapTextureManager; import net.minecraft.client.texture.AbstractTexture; import net.minecraft.client.texture.NativeImageBackedTexture; diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/chunk_rendering/MixinPackedIntegerArray.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/chunk_rendering/MixinPackedIntegerArray.java index 98e91f01b1..7a0765d061 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/chunk_rendering/MixinPackedIntegerArray.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/chunk_rendering/MixinPackedIntegerArray.java @@ -1,6 +1,6 @@ package me.jellysquid.mods.sodium.mixin.features.chunk_rendering; -import me.jellysquid.mods.sodium.client.world.cloned.PackedIntegerArrayExtended; +import me.jellysquid.mods.sodium.client.interop.vanilla.chunk.PackedIntegerArrayExtended; import me.jellysquid.mods.sodium.client.world.cloned.palette.ClonedPalette; import net.minecraft.util.collection.PackedIntegerArray; import org.spongepowered.asm.mixin.Final; diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/chunk_rendering/MixinPalettedContainer.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/chunk_rendering/MixinPalettedContainer.java index a34a4cdcef..8df0dce2b7 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/chunk_rendering/MixinPalettedContainer.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/chunk_rendering/MixinPalettedContainer.java @@ -1,6 +1,6 @@ package me.jellysquid.mods.sodium.mixin.features.chunk_rendering; -import me.jellysquid.mods.sodium.client.world.cloned.PalettedContainerExtended; +import me.jellysquid.mods.sodium.client.interop.vanilla.chunk.PalettedContainerExtended; import net.minecraft.util.collection.PackedIntegerArray; import net.minecraft.world.chunk.Palette; import net.minecraft.world.chunk.PalettedContainer; diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/chunk_rendering/MixinWorldRenderer.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/chunk_rendering/MixinWorldRenderer.java index 0e9a1ff3a1..769d828392 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/chunk_rendering/MixinWorldRenderer.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/chunk_rendering/MixinWorldRenderer.java @@ -1,10 +1,10 @@ package me.jellysquid.mods.sodium.mixin.features.chunk_rendering; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; -import me.jellysquid.mods.sodium.client.gl.device.RenderDevice; +import me.jellysquid.mods.thingl.device.RenderDevice; import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer; -import me.jellysquid.mods.sodium.client.util.math.JomlHelper; -import me.jellysquid.mods.sodium.client.world.WorldRendererExtended; +import me.jellysquid.mods.sodium.client.interop.vanilla.matrix.MatrixConverter; +import me.jellysquid.mods.sodium.client.interop.vanilla.world.WorldRendererExtended; import net.minecraft.client.MinecraftClient; import net.minecraft.client.option.GameOptions; import net.minecraft.client.render.*; @@ -104,8 +104,8 @@ private void renderLayer(RenderLayer renderLayer, MatrixStack matrices, double x @Inject(method = "setupFrustum", at = @At("RETURN")) private void setupFrustum(MatrixStack matrices, Vec3d pos, Matrix4f projectionMatrix, CallbackInfo ci) { - org.joml.Matrix4f modelViewMatrix = JomlHelper.copy(projectionMatrix); - modelViewMatrix.mul(JomlHelper.copy(matrices.peek().getModel())); + org.joml.Matrix4f modelViewMatrix = MatrixConverter.copy(projectionMatrix); + modelViewMatrix.mul(MatrixConverter.copy(matrices.peek().getModel())); modelViewMatrix.translate((float) -pos.getX(), (float) -pos.getY(), (float) -pos.getZ()); this.renderer.setCullingFrustum(new FrustumIntersection(modelViewMatrix, false)); diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/debug/MixinDebugHud.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/debug/MixinDebugHud.java index cc2b6b69b1..bf7b7872e6 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/debug/MixinDebugHud.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/debug/MixinDebugHud.java @@ -3,7 +3,7 @@ import com.google.common.collect.Lists; import me.jellysquid.mods.sodium.client.SodiumClientMod; import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer; -import me.jellysquid.mods.sodium.client.util.NativeBuffer; +import me.jellysquid.mods.thingl.util.NativeBuffer; import net.minecraft.client.gui.hud.DebugHud; import net.minecraft.util.Formatting; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/entity/fast_render/MixinCuboid.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/entity/fast_render/MixinCuboid.java index b2d895cbea..5e6699c7fa 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/entity/fast_render/MixinCuboid.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/entity/fast_render/MixinCuboid.java @@ -1,6 +1,6 @@ package me.jellysquid.mods.sodium.mixin.features.entity.fast_render; -import me.jellysquid.mods.sodium.client.model.ModelCuboidAccessor; +import me.jellysquid.mods.sodium.client.interop.vanilla.cuboid.ModelCuboidAccessor; import net.minecraft.client.model.ModelPart; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/entity/fast_render/MixinModelPart.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/entity/fast_render/MixinModelPart.java index 00add8adab..d72246d866 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/entity/fast_render/MixinModelPart.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/entity/fast_render/MixinModelPart.java @@ -1,14 +1,14 @@ package me.jellysquid.mods.sodium.mixin.features.entity.fast_render; -import me.jellysquid.mods.sodium.client.model.ModelCuboidAccessor; +import me.jellysquid.mods.sodium.client.interop.vanilla.cuboid.ModelCuboidAccessor; import me.jellysquid.mods.sodium.client.model.vertex.VanillaVertexTypes; import me.jellysquid.mods.sodium.client.model.vertex.VertexDrain; import me.jellysquid.mods.sodium.client.model.vertex.formats.ModelQuadVertexSink; -import me.jellysquid.mods.sodium.client.util.Norm3b; +import me.jellysquid.mods.sodium.client.util.geometry.Norm3b; import me.jellysquid.mods.sodium.client.util.color.ColorABGR; -import me.jellysquid.mods.sodium.client.util.math.Matrix3fExtended; -import me.jellysquid.mods.sodium.client.util.math.Matrix4fExtended; -import me.jellysquid.mods.sodium.client.util.math.MatrixUtil; +import me.jellysquid.mods.sodium.client.interop.vanilla.matrix.Matrix3fExtended; +import me.jellysquid.mods.sodium.client.interop.vanilla.matrix.Matrix4fExtended; +import me.jellysquid.mods.sodium.client.interop.vanilla.matrix.MatrixUtil; import net.minecraft.client.model.ModelPart; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.util.math.MatrixStack; diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/font/MixinFontManager.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/font/MixinFontManager.java index df7402d58f..eb8bc9c566 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/font/MixinFontManager.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/font/MixinFontManager.java @@ -2,7 +2,7 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import me.jellysquid.mods.sodium.client.util.font.SinglePreparationResourceReloaderCallback; +import me.jellysquid.mods.sodium.client.interop.vanilla.resource.SinglePreparationResourceReloaderCallback; import net.minecraft.client.font.FontManager; import net.minecraft.client.font.FontStorage; import net.minecraft.client.font.TextRenderer; diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/font/MixinGlyphRenderer.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/font/MixinGlyphRenderer.java index 89b396d33e..97981f091d 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/font/MixinGlyphRenderer.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/font/MixinGlyphRenderer.java @@ -2,7 +2,7 @@ import me.jellysquid.mods.sodium.client.model.vertex.formats.GlyphVertexSink; import me.jellysquid.mods.sodium.client.util.color.ColorABGR; -import me.jellysquid.mods.sodium.client.util.font.GlyphRendererBatched; +import me.jellysquid.mods.sodium.client.interop.vanilla.glyph.GlyphRendererBatched; import net.minecraft.client.font.GlyphRenderer; import net.minecraft.util.math.Matrix4f; import org.spongepowered.asm.mixin.Final; diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/font/MixinTextRenderer.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/font/MixinTextRenderer.java index 2a99f8e7f0..4a6541a083 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/font/MixinTextRenderer.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/font/MixinTextRenderer.java @@ -1,19 +1,13 @@ package me.jellysquid.mods.sodium.mixin.features.font; -import me.jellysquid.mods.sodium.client.util.font.OutlineCharacterVisitor; -import net.minecraft.client.font.FontStorage; -import net.minecraft.client.font.Glyph; +import me.jellysquid.mods.sodium.client.interop.vanilla.glyph.OutlineCharacterVisitor; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.text.CharacterVisitor; import net.minecraft.text.OrderedText; -import net.minecraft.text.Style; import net.minecraft.util.math.Matrix4f; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(TextRenderer.class) public abstract class MixinTextRenderer { diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/font/MixinTextRendererDrawer.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/font/MixinTextRendererDrawer.java index 571fcf57b2..1639e67c6b 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/font/MixinTextRendererDrawer.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/font/MixinTextRendererDrawer.java @@ -5,7 +5,7 @@ import me.jellysquid.mods.sodium.client.model.vertex.formats.GlyphVertexSink; import me.jellysquid.mods.sodium.client.util.color.ColorABGR; import me.jellysquid.mods.sodium.client.util.color.ColorARGB; -import me.jellysquid.mods.sodium.client.util.font.GlyphRendererBatched; +import me.jellysquid.mods.sodium.client.interop.vanilla.glyph.GlyphRendererBatched; import net.minecraft.client.font.*; import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.VertexConsumer; diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/gui/MixinHandledScreen.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/gui/MixinHandledScreen.java index 57f4b5772a..ae652b6f24 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/gui/MixinHandledScreen.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/gui/MixinHandledScreen.java @@ -4,8 +4,8 @@ import me.jellysquid.mods.sodium.client.model.vertex.VanillaVertexTypes; import me.jellysquid.mods.sodium.client.model.vertex.VertexDrain; import me.jellysquid.mods.sodium.client.model.vertex.formats.generic.PositionColorSink; -import me.jellysquid.mods.sodium.client.render.GuiRenderBatches; -import me.jellysquid.mods.sodium.client.render.ItemRendererExtended; +import me.jellysquid.mods.sodium.client.render.batch.GuiRenderBatches; +import me.jellysquid.mods.sodium.client.interop.vanilla.item.ItemRendererBatched; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.client.render.*; @@ -75,7 +75,7 @@ private void replaceDrawSlotRender(MatrixStack matrices, Slot slot, CallbackInfo drawSlotOverlay(matrices.peek().getModel(), x, y, x + 16, y + 16, 0x80ffffff); } - ItemRendererExtended itemRenderer = ItemRendererExtended.cast(this.itemRenderer); + ItemRendererBatched itemRenderer = ItemRendererBatched.cast(this.itemRenderer); itemRenderer.renderItemModel(GuiRenderBatches.CONTAINER, matrices, x, y, stack, this.client.player, slot.x + slot.y * this.backgroundWidth); itemRenderer.renderItemLabel(GuiRenderBatches.CONTAINER, matrices, x, y, stack, this.textRenderer, label); itemRenderer.renderItemOverlays(GuiRenderBatches.CONTAINER, matrices, x, y, stack); diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/item/MixinInGameHud.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/item/MixinInGameHud.java index e97ed125b4..64e0e87e98 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/item/MixinInGameHud.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/item/MixinInGameHud.java @@ -3,8 +3,8 @@ import me.jellysquid.mods.sodium.client.model.vertex.VanillaVertexTypes; import me.jellysquid.mods.sodium.client.model.vertex.VertexDrain; import me.jellysquid.mods.sodium.client.model.vertex.formats.generic.PositionTextureSink; -import me.jellysquid.mods.sodium.client.render.GuiRenderBatches; -import me.jellysquid.mods.sodium.client.render.ItemRendererExtended; +import me.jellysquid.mods.sodium.client.render.batch.GuiRenderBatches; +import me.jellysquid.mods.sodium.client.interop.vanilla.item.ItemRendererBatched; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawableHelper; @@ -62,7 +62,7 @@ private void preRenderHotbar(float tickDelta, MatrixStack matrices, CallbackInfo @Redirect(method = "renderHotbar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/InGameHud;renderHotbarItem(IIFLnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/item/ItemStack;I)V")) private void redirectRenderHotbarItem(InGameHud inGameHud, int x, int y, float tickDelta, PlayerEntity player, ItemStack stack, int seed) { - this.renderBatchedHotbarItem(ItemRendererExtended.cast(this.itemRenderer), this.client.textRenderer, x, y, tickDelta, player, stack, seed); + this.renderBatchedHotbarItem(ItemRendererBatched.cast(this.itemRenderer), this.client.textRenderer, x, y, tickDelta, player, stack, seed); } @Redirect( @@ -102,7 +102,7 @@ private void postRenderHotbar(float tickDelta, MatrixStack matrices, CallbackInf } } - private void renderBatchedHotbarItem(ItemRendererExtended itemRenderer, TextRenderer textRenderer, int x, int y, + private void renderBatchedHotbarItem(ItemRendererBatched itemRenderer, TextRenderer textRenderer, int x, int y, float tickDelta, PlayerEntity player, ItemStack stack, int seed) { if (stack.isEmpty()) { return; diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/item/MixinItemRenderer.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/item/MixinItemRenderer.java index de21de0f39..80ea464b16 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/item/MixinItemRenderer.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/item/MixinItemRenderer.java @@ -1,18 +1,18 @@ package me.jellysquid.mods.sodium.mixin.features.item; -import me.jellysquid.mods.sodium.client.model.quad.ModelQuadView; +import me.jellysquid.mods.sodium.client.interop.vanilla.quad.BakedQuadView; import me.jellysquid.mods.sodium.client.model.vertex.VanillaVertexTypes; import me.jellysquid.mods.sodium.client.model.vertex.VertexDrain; import me.jellysquid.mods.sodium.client.model.vertex.formats.ModelQuadVertexSink; import me.jellysquid.mods.sodium.client.model.vertex.formats.generic.PositionColorSink; -import me.jellysquid.mods.sodium.client.render.ItemRenderBatch; -import me.jellysquid.mods.sodium.client.render.ItemRendererExtended; +import me.jellysquid.mods.sodium.client.render.batch.ItemRenderBatch; +import me.jellysquid.mods.sodium.client.interop.vanilla.item.ItemRendererBatched; import me.jellysquid.mods.sodium.client.render.texture.SpriteUtil; import me.jellysquid.mods.sodium.client.util.color.ColorABGR; import me.jellysquid.mods.sodium.client.util.color.ColorARGB; import me.jellysquid.mods.sodium.client.util.rand.XoRoShiRoRandom; -import me.jellysquid.mods.sodium.client.world.biome.ItemColorsExtended; -import me.jellysquid.mods.sodium.common.util.DirectionUtil; +import me.jellysquid.mods.sodium.client.interop.vanilla.colors.ItemColorsExtended; +import me.jellysquid.mods.sodium.client.util.DirectionUtil; import net.minecraft.client.MinecraftClient; import net.minecraft.client.color.item.ItemColorProvider; import net.minecraft.client.color.item.ItemColors; @@ -45,7 +45,7 @@ import java.util.List; @Mixin(ItemRenderer.class) -public abstract class MixinItemRenderer implements ItemRendererExtended { +public abstract class MixinItemRenderer implements ItemRendererBatched { private final XoRoShiRoRandom random = new XoRoShiRoRandom(); @Shadow @@ -109,14 +109,14 @@ private void renderBakedItemQuads(MatrixStack matrices, VertexConsumer vertexCon color = ColorARGB.toABGR((colorProvider.getColor(stack, bakedQuad.getColorIndex())), 255); } - ModelQuadView quad = ((ModelQuadView) bakedQuad); + BakedQuadView q = ((BakedQuadView) bakedQuad); for (int i = 0; i < 4; i++) { - drain.writeQuad(entry, quad.getX(i), quad.getY(i), quad.getZ(i), color, quad.getTexU(i), quad.getTexV(i), + drain.writeQuad(entry, q.getX(i), q.getY(i), q.getZ(i), color, q.getTexU(i), q.getTexV(i), light, overlay, bakedQuad.getFace()); } - SpriteUtil.markSpriteActive(quad.getSprite()); + SpriteUtil.markSpriteActive(q.getSprite()); } drain.flush(); diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/matrix_stack/MixinMatrixStack.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/matrix_stack/MixinMatrixStack.java index 18c1ad0485..afab6f3368 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/matrix_stack/MixinMatrixStack.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/matrix_stack/MixinMatrixStack.java @@ -1,8 +1,8 @@ package me.jellysquid.mods.sodium.mixin.features.matrix_stack; -import me.jellysquid.mods.sodium.client.util.math.Matrix3fExtended; -import me.jellysquid.mods.sodium.client.util.math.Matrix4fExtended; -import me.jellysquid.mods.sodium.client.util.math.MatrixUtil; +import me.jellysquid.mods.sodium.client.interop.vanilla.matrix.Matrix3fExtended; +import me.jellysquid.mods.sodium.client.interop.vanilla.matrix.Matrix4fExtended; +import me.jellysquid.mods.sodium.client.interop.vanilla.matrix.MatrixUtil; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.math.Quaternion; import org.spongepowered.asm.mixin.Final; diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/matrix_stack/MixinVertexConsumer.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/matrix_stack/MixinVertexConsumer.java index aee0f0f734..5d04a6e7a1 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/matrix_stack/MixinVertexConsumer.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/matrix_stack/MixinVertexConsumer.java @@ -1,8 +1,8 @@ package me.jellysquid.mods.sodium.mixin.features.matrix_stack; -import me.jellysquid.mods.sodium.client.util.math.Matrix3fExtended; -import me.jellysquid.mods.sodium.client.util.math.Matrix4fExtended; -import me.jellysquid.mods.sodium.client.util.math.MatrixUtil; +import me.jellysquid.mods.sodium.client.interop.vanilla.matrix.Matrix3fExtended; +import me.jellysquid.mods.sodium.client.interop.vanilla.matrix.Matrix4fExtended; +import me.jellysquid.mods.sodium.client.interop.vanilla.matrix.MatrixUtil; import net.minecraft.client.render.VertexConsumer; import net.minecraft.util.math.Matrix3f; import net.minecraft.util.math.Matrix4f; diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/options/MixinOptionsScreen.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/options/MixinOptionsScreen.java index 7ec98f866f..beb1d689ea 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/options/MixinOptionsScreen.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/options/MixinOptionsScreen.java @@ -1,6 +1,6 @@ package me.jellysquid.mods.sodium.mixin.features.options; -import me.jellysquid.mods.sodium.client.gui.SodiumOptionsGUI; +import me.jellysquid.mods.sodium.client.gui.SodiumConfigScreen; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.option.OptionsScreen; import net.minecraft.client.gui.widget.ButtonWidget; @@ -20,7 +20,7 @@ protected MixinOptionsScreen(Text title) { @Dynamic @Inject(method = "method_19828(Lnet/minecraft/client/gui/widget/ButtonWidget;)V", at = @At("HEAD"), cancellable = true) private void open(ButtonWidget widget, CallbackInfo ci) { - this.client.openScreen(new SodiumOptionsGUI(this)); + this.client.openScreen(new SodiumConfigScreen(this)); ci.cancel(); } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/GlObject.java b/src/main/java/me/jellysquid/mods/thingl/GlObject.java similarity index 96% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/GlObject.java rename to src/main/java/me/jellysquid/mods/thingl/GlObject.java index 09455bb76f..de811fbd97 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/GlObject.java +++ b/src/main/java/me/jellysquid/mods/thingl/GlObject.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gl; +package me.jellysquid.mods.thingl; /** * An abstract object used to represent objects in OpenGL code safely. This class hides the direct handle to a OpenGL diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/array/GlVertexArray.java b/src/main/java/me/jellysquid/mods/thingl/array/GlVertexArray.java similarity index 73% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/array/GlVertexArray.java rename to src/main/java/me/jellysquid/mods/thingl/array/GlVertexArray.java index 04f4cb9af8..dd22565fc1 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/array/GlVertexArray.java +++ b/src/main/java/me/jellysquid/mods/thingl/array/GlVertexArray.java @@ -1,6 +1,6 @@ -package me.jellysquid.mods.sodium.client.gl.array; +package me.jellysquid.mods.thingl.array; -import me.jellysquid.mods.sodium.client.gl.GlObject; +import me.jellysquid.mods.thingl.GlObject; import org.lwjgl.opengl.GL30C; /** diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/attribute/BufferVertexFormat.java b/src/main/java/me/jellysquid/mods/thingl/attribute/BufferVertexFormat.java similarity index 80% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/attribute/BufferVertexFormat.java rename to src/main/java/me/jellysquid/mods/thingl/attribute/BufferVertexFormat.java index 344656465a..720dca6e95 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/attribute/BufferVertexFormat.java +++ b/src/main/java/me/jellysquid/mods/thingl/attribute/BufferVertexFormat.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gl.attribute; +package me.jellysquid.mods.thingl.attribute; import net.minecraft.client.render.VertexFormat; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/attribute/GlVertexAttribute.java b/src/main/java/me/jellysquid/mods/thingl/attribute/GlVertexAttribute.java similarity index 96% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/attribute/GlVertexAttribute.java rename to src/main/java/me/jellysquid/mods/thingl/attribute/GlVertexAttribute.java index f67697baba..b59643edb7 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/attribute/GlVertexAttribute.java +++ b/src/main/java/me/jellysquid/mods/thingl/attribute/GlVertexAttribute.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gl.attribute; +package me.jellysquid.mods.thingl.attribute; public class GlVertexAttribute { private final int format; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/attribute/GlVertexAttributeBinding.java b/src/main/java/me/jellysquid/mods/thingl/attribute/GlVertexAttributeBinding.java similarity index 86% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/attribute/GlVertexAttributeBinding.java rename to src/main/java/me/jellysquid/mods/thingl/attribute/GlVertexAttributeBinding.java index 42f799d8d1..d72e276d94 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/attribute/GlVertexAttributeBinding.java +++ b/src/main/java/me/jellysquid/mods/thingl/attribute/GlVertexAttributeBinding.java @@ -1,6 +1,6 @@ -package me.jellysquid.mods.sodium.client.gl.attribute; +package me.jellysquid.mods.thingl.attribute; -import me.jellysquid.mods.sodium.client.gl.shader.ShaderBindingPoint; +import me.jellysquid.mods.thingl.shader.ShaderBindingPoint; public class GlVertexAttributeBinding extends GlVertexAttribute { private final int index; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/attribute/GlVertexAttributeFormat.java b/src/main/java/me/jellysquid/mods/thingl/attribute/GlVertexAttributeFormat.java similarity index 92% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/attribute/GlVertexAttributeFormat.java rename to src/main/java/me/jellysquid/mods/thingl/attribute/GlVertexAttributeFormat.java index ba049db9a0..5c62bcc54b 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/attribute/GlVertexAttributeFormat.java +++ b/src/main/java/me/jellysquid/mods/thingl/attribute/GlVertexAttributeFormat.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gl.attribute; +package me.jellysquid.mods.thingl.attribute; import org.lwjgl.opengl.GL20C; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/attribute/GlVertexFormat.java b/src/main/java/me/jellysquid/mods/thingl/attribute/GlVertexFormat.java similarity index 98% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/attribute/GlVertexFormat.java rename to src/main/java/me/jellysquid/mods/thingl/attribute/GlVertexFormat.java index 16ff248153..9804c59910 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/attribute/GlVertexFormat.java +++ b/src/main/java/me/jellysquid/mods/thingl/attribute/GlVertexFormat.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gl.attribute; +package me.jellysquid.mods.thingl.attribute; import java.util.EnumMap; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/GlBuffer.java b/src/main/java/me/jellysquid/mods/thingl/buffer/GlBuffer.java similarity index 81% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/GlBuffer.java rename to src/main/java/me/jellysquid/mods/thingl/buffer/GlBuffer.java index afb1538076..f7d9f1013f 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/GlBuffer.java +++ b/src/main/java/me/jellysquid/mods/thingl/buffer/GlBuffer.java @@ -1,6 +1,6 @@ -package me.jellysquid.mods.sodium.client.gl.buffer; +package me.jellysquid.mods.thingl.buffer; -import me.jellysquid.mods.sodium.client.gl.GlObject; +import me.jellysquid.mods.thingl.GlObject; import org.lwjgl.opengl.GL20C; public abstract class GlBuffer extends GlObject { diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/GlBufferMapFlags.java b/src/main/java/me/jellysquid/mods/thingl/buffer/GlBufferMapFlags.java similarity index 84% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/GlBufferMapFlags.java rename to src/main/java/me/jellysquid/mods/thingl/buffer/GlBufferMapFlags.java index 159ef82761..e1fecbbfcb 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/GlBufferMapFlags.java +++ b/src/main/java/me/jellysquid/mods/thingl/buffer/GlBufferMapFlags.java @@ -1,6 +1,6 @@ -package me.jellysquid.mods.sodium.client.gl.buffer; +package me.jellysquid.mods.thingl.buffer; -import me.jellysquid.mods.sodium.client.gl.util.EnumBit; +import me.jellysquid.mods.thingl.util.EnumBit; import org.lwjgl.opengl.GL30C; import org.lwjgl.opengl.GL44C; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/GlBufferMapping.java b/src/main/java/me/jellysquid/mods/thingl/buffer/GlBufferMapping.java similarity index 91% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/GlBufferMapping.java rename to src/main/java/me/jellysquid/mods/thingl/buffer/GlBufferMapping.java index 7849a1fda5..6ed6b1d153 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/GlBufferMapping.java +++ b/src/main/java/me/jellysquid/mods/thingl/buffer/GlBufferMapping.java @@ -1,8 +1,7 @@ -package me.jellysquid.mods.sodium.client.gl.buffer; +package me.jellysquid.mods.thingl.buffer; import org.lwjgl.system.MemoryUtil; -import java.nio.Buffer; import java.nio.ByteBuffer; public class GlBufferMapping { diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/GlBufferStorageFlags.java b/src/main/java/me/jellysquid/mods/thingl/buffer/GlBufferStorageFlags.java similarity index 82% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/GlBufferStorageFlags.java rename to src/main/java/me/jellysquid/mods/thingl/buffer/GlBufferStorageFlags.java index 403d9eeb72..812b997b4f 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/GlBufferStorageFlags.java +++ b/src/main/java/me/jellysquid/mods/thingl/buffer/GlBufferStorageFlags.java @@ -1,6 +1,6 @@ -package me.jellysquid.mods.sodium.client.gl.buffer; +package me.jellysquid.mods.thingl.buffer; -import me.jellysquid.mods.sodium.client.gl.util.EnumBit; +import me.jellysquid.mods.thingl.util.EnumBit; import org.lwjgl.opengl.GL30C; import org.lwjgl.opengl.GL44C; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/GlBufferTarget.java b/src/main/java/me/jellysquid/mods/thingl/buffer/GlBufferTarget.java similarity index 91% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/GlBufferTarget.java rename to src/main/java/me/jellysquid/mods/thingl/buffer/GlBufferTarget.java index 3aceae22d3..f300443f24 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/GlBufferTarget.java +++ b/src/main/java/me/jellysquid/mods/thingl/buffer/GlBufferTarget.java @@ -1,8 +1,7 @@ -package me.jellysquid.mods.sodium.client.gl.buffer; +package me.jellysquid.mods.thingl.buffer; import org.lwjgl.opengl.GL20C; import org.lwjgl.opengl.GL31C; -import org.lwjgl.opengl.GL40C; public enum GlBufferTarget { ARRAY_BUFFER(GL20C.GL_ARRAY_BUFFER, GL20C.GL_ARRAY_BUFFER_BINDING), diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/GlBufferUsage.java b/src/main/java/me/jellysquid/mods/thingl/buffer/GlBufferUsage.java similarity index 91% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/GlBufferUsage.java rename to src/main/java/me/jellysquid/mods/thingl/buffer/GlBufferUsage.java index f86345065f..6b3d4d4eb7 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/GlBufferUsage.java +++ b/src/main/java/me/jellysquid/mods/thingl/buffer/GlBufferUsage.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gl.buffer; +package me.jellysquid.mods.thingl.buffer; import org.lwjgl.opengl.GL20C; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/GlImmutableBuffer.java b/src/main/java/me/jellysquid/mods/thingl/buffer/GlImmutableBuffer.java similarity index 73% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/GlImmutableBuffer.java rename to src/main/java/me/jellysquid/mods/thingl/buffer/GlImmutableBuffer.java index 3d0ff747f8..e609705e54 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/GlImmutableBuffer.java +++ b/src/main/java/me/jellysquid/mods/thingl/buffer/GlImmutableBuffer.java @@ -1,6 +1,6 @@ -package me.jellysquid.mods.sodium.client.gl.buffer; +package me.jellysquid.mods.thingl.buffer; -import me.jellysquid.mods.sodium.client.gl.util.EnumBitField; +import me.jellysquid.mods.thingl.util.EnumBitField; public class GlImmutableBuffer extends GlBuffer { private final EnumBitField flags; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/GlMutableBuffer.java b/src/main/java/me/jellysquid/mods/thingl/buffer/GlMutableBuffer.java similarity index 89% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/GlMutableBuffer.java rename to src/main/java/me/jellysquid/mods/thingl/buffer/GlMutableBuffer.java index 3287f903ec..9fa1bedfa7 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/buffer/GlMutableBuffer.java +++ b/src/main/java/me/jellysquid/mods/thingl/buffer/GlMutableBuffer.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gl.buffer; +package me.jellysquid.mods.thingl.buffer; /** * A mutable buffer type which is supported with OpenGL 1.5+. The buffer's storage can be reallocated at any time diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/device/CommandList.java b/src/main/java/me/jellysquid/mods/thingl/device/CommandList.java similarity index 72% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/device/CommandList.java rename to src/main/java/me/jellysquid/mods/thingl/device/CommandList.java index afbea83eca..b3c3b2eb65 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/device/CommandList.java +++ b/src/main/java/me/jellysquid/mods/thingl/device/CommandList.java @@ -1,12 +1,12 @@ -package me.jellysquid.mods.sodium.client.gl.device; - -import me.jellysquid.mods.sodium.client.gl.array.GlVertexArray; -import me.jellysquid.mods.sodium.client.gl.buffer.*; -import me.jellysquid.mods.sodium.client.gl.sync.GlFence; -import me.jellysquid.mods.sodium.client.gl.tessellation.GlPrimitiveType; -import me.jellysquid.mods.sodium.client.gl.tessellation.GlTessellation; -import me.jellysquid.mods.sodium.client.gl.tessellation.TessellationBinding; -import me.jellysquid.mods.sodium.client.gl.util.EnumBitField; +package me.jellysquid.mods.thingl.device; + +import me.jellysquid.mods.thingl.array.GlVertexArray; +import me.jellysquid.mods.thingl.buffer.*; +import me.jellysquid.mods.thingl.sync.GlFence; +import me.jellysquid.mods.thingl.tessellation.GlPrimitiveType; +import me.jellysquid.mods.thingl.tessellation.GlTessellation; +import me.jellysquid.mods.thingl.tessellation.TessellationBinding; +import me.jellysquid.mods.thingl.util.EnumBitField; import java.nio.ByteBuffer; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/device/DrawCommandList.java b/src/main/java/me/jellysquid/mods/thingl/device/DrawCommandList.java similarity index 74% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/device/DrawCommandList.java rename to src/main/java/me/jellysquid/mods/thingl/device/DrawCommandList.java index 504e4b56d1..67d5e144b1 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/device/DrawCommandList.java +++ b/src/main/java/me/jellysquid/mods/thingl/device/DrawCommandList.java @@ -1,6 +1,6 @@ -package me.jellysquid.mods.sodium.client.gl.device; +package me.jellysquid.mods.thingl.device; -import me.jellysquid.mods.sodium.client.gl.tessellation.GlIndexType; +import me.jellysquid.mods.thingl.tessellation.GlIndexType; import org.lwjgl.PointerBuffer; import java.nio.IntBuffer; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/device/GLRenderDevice.java b/src/main/java/me/jellysquid/mods/thingl/device/GLRenderDevice.java similarity index 95% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/device/GLRenderDevice.java rename to src/main/java/me/jellysquid/mods/thingl/device/GLRenderDevice.java index b15f7a4e92..190402c3a1 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/device/GLRenderDevice.java +++ b/src/main/java/me/jellysquid/mods/thingl/device/GLRenderDevice.java @@ -1,12 +1,12 @@ -package me.jellysquid.mods.sodium.client.gl.device; - -import me.jellysquid.mods.sodium.client.gl.array.GlVertexArray; -import me.jellysquid.mods.sodium.client.gl.buffer.*; -import me.jellysquid.mods.sodium.client.gl.functions.DeviceFunctions; -import me.jellysquid.mods.sodium.client.gl.state.GlStateTracker; -import me.jellysquid.mods.sodium.client.gl.sync.GlFence; -import me.jellysquid.mods.sodium.client.gl.tessellation.*; -import me.jellysquid.mods.sodium.client.gl.util.EnumBitField; +package me.jellysquid.mods.thingl.device; + +import me.jellysquid.mods.thingl.array.GlVertexArray; +import me.jellysquid.mods.thingl.buffer.*; +import me.jellysquid.mods.thingl.functions.DeviceFunctions; +import me.jellysquid.mods.thingl.state.GlStateTracker; +import me.jellysquid.mods.thingl.sync.GlFence; +import me.jellysquid.mods.thingl.tessellation.*; +import me.jellysquid.mods.thingl.util.EnumBitField; import org.lwjgl.PointerBuffer; import org.lwjgl.opengl.*; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/device/RenderDevice.java b/src/main/java/me/jellysquid/mods/thingl/device/RenderDevice.java similarity index 79% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/device/RenderDevice.java rename to src/main/java/me/jellysquid/mods/thingl/device/RenderDevice.java index 49bcfb3d84..0bac43b15a 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/device/RenderDevice.java +++ b/src/main/java/me/jellysquid/mods/thingl/device/RenderDevice.java @@ -1,6 +1,6 @@ -package me.jellysquid.mods.sodium.client.gl.device; +package me.jellysquid.mods.thingl.device; -import me.jellysquid.mods.sodium.client.gl.functions.DeviceFunctions; +import me.jellysquid.mods.thingl.functions.DeviceFunctions; import org.lwjgl.opengl.GLCapabilities; public interface RenderDevice { diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/functions/BufferStorageFunctions.java b/src/main/java/me/jellysquid/mods/thingl/functions/BufferStorageFunctions.java similarity index 81% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/functions/BufferStorageFunctions.java rename to src/main/java/me/jellysquid/mods/thingl/functions/BufferStorageFunctions.java index 4105336b3f..08155950df 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/functions/BufferStorageFunctions.java +++ b/src/main/java/me/jellysquid/mods/thingl/functions/BufferStorageFunctions.java @@ -1,9 +1,9 @@ -package me.jellysquid.mods.sodium.client.gl.functions; +package me.jellysquid.mods.thingl.functions; -import me.jellysquid.mods.sodium.client.gl.buffer.GlBufferStorageFlags; -import me.jellysquid.mods.sodium.client.gl.buffer.GlBufferTarget; -import me.jellysquid.mods.sodium.client.gl.device.RenderDevice; -import me.jellysquid.mods.sodium.client.gl.util.EnumBitField; +import me.jellysquid.mods.thingl.buffer.GlBufferStorageFlags; +import me.jellysquid.mods.thingl.buffer.GlBufferTarget; +import me.jellysquid.mods.thingl.device.RenderDevice; +import me.jellysquid.mods.thingl.util.EnumBitField; import org.lwjgl.opengl.ARBBufferStorage; import org.lwjgl.opengl.GL44C; import org.lwjgl.opengl.GLCapabilities; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/functions/DeviceFunctions.java b/src/main/java/me/jellysquid/mods/thingl/functions/DeviceFunctions.java similarity index 74% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/functions/DeviceFunctions.java rename to src/main/java/me/jellysquid/mods/thingl/functions/DeviceFunctions.java index 5cde1a0696..bb674a7d69 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/functions/DeviceFunctions.java +++ b/src/main/java/me/jellysquid/mods/thingl/functions/DeviceFunctions.java @@ -1,6 +1,6 @@ -package me.jellysquid.mods.sodium.client.gl.functions; +package me.jellysquid.mods.thingl.functions; -import me.jellysquid.mods.sodium.client.gl.device.RenderDevice; +import me.jellysquid.mods.thingl.device.RenderDevice; public class DeviceFunctions { private final BufferStorageFunctions bufferStorageFunctions; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/GlProgram.java b/src/main/java/me/jellysquid/mods/thingl/shader/GlProgram.java similarity index 90% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/shader/GlProgram.java rename to src/main/java/me/jellysquid/mods/thingl/shader/GlProgram.java index 57f42db3b8..42bc76058e 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/GlProgram.java +++ b/src/main/java/me/jellysquid/mods/thingl/shader/GlProgram.java @@ -1,11 +1,9 @@ -package me.jellysquid.mods.sodium.client.gl.shader; +package me.jellysquid.mods.thingl.shader; import com.mojang.blaze3d.platform.GlStateManager; -import me.jellysquid.mods.sodium.client.gl.GlObject; -import me.jellysquid.mods.sodium.client.gl.shader.uniform.GlUniform; -import me.jellysquid.mods.sodium.client.gl.shader.uniform.GlUniformBlock; -import me.jellysquid.mods.sodium.client.render.chunk.shader.ChunkShaderInterface; -import me.jellysquid.mods.sodium.client.render.chunk.shader.ShaderBindingContext; +import me.jellysquid.mods.thingl.GlObject; +import me.jellysquid.mods.thingl.shader.uniform.GlUniform; +import me.jellysquid.mods.thingl.shader.uniform.GlUniformBlock; import net.minecraft.util.Identifier; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/GlShader.java b/src/main/java/me/jellysquid/mods/thingl/shader/GlShader.java similarity index 92% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/shader/GlShader.java rename to src/main/java/me/jellysquid/mods/thingl/shader/GlShader.java index 2749370580..ec0dc749cf 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/GlShader.java +++ b/src/main/java/me/jellysquid/mods/thingl/shader/GlShader.java @@ -1,7 +1,7 @@ -package me.jellysquid.mods.sodium.client.gl.shader; +package me.jellysquid.mods.thingl.shader; import com.mojang.blaze3d.platform.GlStateManager; -import me.jellysquid.mods.sodium.client.gl.GlObject; +import me.jellysquid.mods.thingl.GlObject; import net.minecraft.util.Identifier; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ShaderBindingContext.java b/src/main/java/me/jellysquid/mods/thingl/shader/ShaderBindingContext.java similarity index 53% rename from src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ShaderBindingContext.java rename to src/main/java/me/jellysquid/mods/thingl/shader/ShaderBindingContext.java index ce56cccc82..ae53a459ad 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/shader/ShaderBindingContext.java +++ b/src/main/java/me/jellysquid/mods/thingl/shader/ShaderBindingContext.java @@ -1,7 +1,7 @@ -package me.jellysquid.mods.sodium.client.render.chunk.shader; +package me.jellysquid.mods.thingl.shader; -import me.jellysquid.mods.sodium.client.gl.shader.uniform.GlUniform; -import me.jellysquid.mods.sodium.client.gl.shader.uniform.GlUniformBlock; +import me.jellysquid.mods.thingl.shader.uniform.GlUniform; +import me.jellysquid.mods.thingl.shader.uniform.GlUniformBlock; import java.util.function.IntFunction; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/ShaderBindingPoint.java b/src/main/java/me/jellysquid/mods/thingl/shader/ShaderBindingPoint.java similarity index 55% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/shader/ShaderBindingPoint.java rename to src/main/java/me/jellysquid/mods/thingl/shader/ShaderBindingPoint.java index 151704f763..5757c8b6b9 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/ShaderBindingPoint.java +++ b/src/main/java/me/jellysquid/mods/thingl/shader/ShaderBindingPoint.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gl.shader; +package me.jellysquid.mods.thingl.shader; public record ShaderBindingPoint(int genericAttributeIndex) { } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/ShaderConstants.java b/src/main/java/me/jellysquid/mods/thingl/shader/ShaderConstants.java similarity index 97% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/shader/ShaderConstants.java rename to src/main/java/me/jellysquid/mods/thingl/shader/ShaderConstants.java index 4fed6c522a..dd8c61c6be 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/ShaderConstants.java +++ b/src/main/java/me/jellysquid/mods/thingl/shader/ShaderConstants.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gl.shader; +package me.jellysquid.mods.thingl.shader; import java.util.*; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/ShaderLoader.java b/src/main/java/me/jellysquid/mods/thingl/shader/ShaderLoader.java similarity index 96% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/shader/ShaderLoader.java rename to src/main/java/me/jellysquid/mods/thingl/shader/ShaderLoader.java index b29bca96d8..a5029590ab 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/ShaderLoader.java +++ b/src/main/java/me/jellysquid/mods/thingl/shader/ShaderLoader.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gl.shader; +package me.jellysquid.mods.thingl.shader; import net.minecraft.util.Identifier; import org.apache.commons.io.IOUtils; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/ShaderParser.java b/src/main/java/me/jellysquid/mods/thingl/shader/ShaderParser.java similarity index 97% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/shader/ShaderParser.java rename to src/main/java/me/jellysquid/mods/thingl/shader/ShaderParser.java index 5bf0588672..521be3d4f7 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/ShaderParser.java +++ b/src/main/java/me/jellysquid/mods/thingl/shader/ShaderParser.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gl.shader; +package me.jellysquid.mods.thingl.shader; import net.minecraft.util.Identifier; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/ShaderType.java b/src/main/java/me/jellysquid/mods/thingl/shader/ShaderType.java similarity index 84% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/shader/ShaderType.java rename to src/main/java/me/jellysquid/mods/thingl/shader/ShaderType.java index 4791e3dc81..ccaa459be8 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/ShaderType.java +++ b/src/main/java/me/jellysquid/mods/thingl/shader/ShaderType.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gl.shader; +package me.jellysquid.mods.thingl.shader; import org.lwjgl.opengl.GL20C; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/ShaderWorkarounds.java b/src/main/java/me/jellysquid/mods/thingl/shader/ShaderWorkarounds.java similarity index 97% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/shader/ShaderWorkarounds.java rename to src/main/java/me/jellysquid/mods/thingl/shader/ShaderWorkarounds.java index 06ac2d491b..6413b6e3b0 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/ShaderWorkarounds.java +++ b/src/main/java/me/jellysquid/mods/thingl/shader/ShaderWorkarounds.java @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package me.jellysquid.mods.sodium.client.gl.shader; +package me.jellysquid.mods.thingl.shader; import java.nio.ByteBuffer; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/uniform/GlUniform.java b/src/main/java/me/jellysquid/mods/thingl/shader/uniform/GlUniform.java similarity index 75% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/shader/uniform/GlUniform.java rename to src/main/java/me/jellysquid/mods/thingl/shader/uniform/GlUniform.java index 733588d974..ba39ad1b5d 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/uniform/GlUniform.java +++ b/src/main/java/me/jellysquid/mods/thingl/shader/uniform/GlUniform.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gl.shader.uniform; +package me.jellysquid.mods.thingl.shader.uniform; public abstract class GlUniform { protected final int index; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/uniform/GlUniformBlock.java b/src/main/java/me/jellysquid/mods/thingl/shader/uniform/GlUniformBlock.java similarity index 65% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/shader/uniform/GlUniformBlock.java rename to src/main/java/me/jellysquid/mods/thingl/shader/uniform/GlUniformBlock.java index 720854e4e2..a4fe2e7e7e 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/uniform/GlUniformBlock.java +++ b/src/main/java/me/jellysquid/mods/thingl/shader/uniform/GlUniformBlock.java @@ -1,7 +1,6 @@ -package me.jellysquid.mods.sodium.client.gl.shader.uniform; +package me.jellysquid.mods.thingl.shader.uniform; -import me.jellysquid.mods.sodium.client.gl.buffer.GlBuffer; -import me.jellysquid.mods.sodium.client.gl.shader.GlProgram; +import me.jellysquid.mods.thingl.buffer.GlBuffer; import org.lwjgl.opengl.GL32C; public class GlUniformBlock { diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/uniform/GlUniformFloat.java b/src/main/java/me/jellysquid/mods/thingl/shader/uniform/GlUniformFloat.java similarity index 84% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/shader/uniform/GlUniformFloat.java rename to src/main/java/me/jellysquid/mods/thingl/shader/uniform/GlUniformFloat.java index dc7650709b..6a3d427eea 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/uniform/GlUniformFloat.java +++ b/src/main/java/me/jellysquid/mods/thingl/shader/uniform/GlUniformFloat.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gl.shader.uniform; +package me.jellysquid.mods.thingl.shader.uniform; import org.lwjgl.opengl.GL30C; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/uniform/GlUniformFloat4v.java b/src/main/java/me/jellysquid/mods/thingl/shader/uniform/GlUniformFloat4v.java similarity index 86% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/shader/uniform/GlUniformFloat4v.java rename to src/main/java/me/jellysquid/mods/thingl/shader/uniform/GlUniformFloat4v.java index c2edf0c89e..d0f555fe92 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/uniform/GlUniformFloat4v.java +++ b/src/main/java/me/jellysquid/mods/thingl/shader/uniform/GlUniformFloat4v.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gl.shader.uniform; +package me.jellysquid.mods.thingl.shader.uniform; import org.lwjgl.opengl.GL30C; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/uniform/GlUniformInt.java b/src/main/java/me/jellysquid/mods/thingl/shader/uniform/GlUniformInt.java similarity index 84% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/shader/uniform/GlUniformInt.java rename to src/main/java/me/jellysquid/mods/thingl/shader/uniform/GlUniformInt.java index 46998efaa9..d8e8f76534 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/uniform/GlUniformInt.java +++ b/src/main/java/me/jellysquid/mods/thingl/shader/uniform/GlUniformInt.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gl.shader.uniform; +package me.jellysquid.mods.thingl.shader.uniform; import org.lwjgl.opengl.GL30C; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/uniform/GlUniformMatrix4f.java b/src/main/java/me/jellysquid/mods/thingl/shader/uniform/GlUniformMatrix4f.java similarity index 89% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/shader/uniform/GlUniformMatrix4f.java rename to src/main/java/me/jellysquid/mods/thingl/shader/uniform/GlUniformMatrix4f.java index 5b276e2d56..6a3570d83f 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/uniform/GlUniformMatrix4f.java +++ b/src/main/java/me/jellysquid/mods/thingl/shader/uniform/GlUniformMatrix4f.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gl.shader.uniform; +package me.jellysquid.mods.thingl.shader.uniform; import org.joml.Matrix4f; import org.lwjgl.opengl.GL30C; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/state/GlStateTracker.java b/src/main/java/me/jellysquid/mods/thingl/state/GlStateTracker.java similarity index 92% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/state/GlStateTracker.java rename to src/main/java/me/jellysquid/mods/thingl/state/GlStateTracker.java index ab0f0f494e..23b34a3b91 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/state/GlStateTracker.java +++ b/src/main/java/me/jellysquid/mods/thingl/state/GlStateTracker.java @@ -1,8 +1,8 @@ -package me.jellysquid.mods.sodium.client.gl.state; +package me.jellysquid.mods.thingl.state; -import me.jellysquid.mods.sodium.client.gl.array.GlVertexArray; -import me.jellysquid.mods.sodium.client.gl.buffer.GlBuffer; -import me.jellysquid.mods.sodium.client.gl.buffer.GlBufferTarget; +import me.jellysquid.mods.thingl.array.GlVertexArray; +import me.jellysquid.mods.thingl.buffer.GlBuffer; +import me.jellysquid.mods.thingl.buffer.GlBufferTarget; import org.lwjgl.opengl.GL11C; import org.lwjgl.opengl.GL20C; import org.lwjgl.opengl.GL30C; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/sync/GlFence.java b/src/main/java/me/jellysquid/mods/thingl/sync/GlFence.java similarity index 86% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/sync/GlFence.java rename to src/main/java/me/jellysquid/mods/thingl/sync/GlFence.java index c16fdfa1b1..21699657bd 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/sync/GlFence.java +++ b/src/main/java/me/jellysquid/mods/thingl/sync/GlFence.java @@ -1,7 +1,5 @@ -package me.jellysquid.mods.sodium.client.gl.sync; +package me.jellysquid.mods.thingl.sync; -import me.jellysquid.mods.sodium.client.gl.GlObject; -import org.lwjgl.opengl.GL30C; import org.lwjgl.opengl.GL32C; import org.lwjgl.system.MemoryStack; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/tessellation/GlAbstractTessellation.java b/src/main/java/me/jellysquid/mods/thingl/tessellation/GlAbstractTessellation.java similarity index 87% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/tessellation/GlAbstractTessellation.java rename to src/main/java/me/jellysquid/mods/thingl/tessellation/GlAbstractTessellation.java index 6a3c183a6a..570ee9b7f7 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/tessellation/GlAbstractTessellation.java +++ b/src/main/java/me/jellysquid/mods/thingl/tessellation/GlAbstractTessellation.java @@ -1,7 +1,7 @@ -package me.jellysquid.mods.sodium.client.gl.tessellation; +package me.jellysquid.mods.thingl.tessellation; -import me.jellysquid.mods.sodium.client.gl.attribute.GlVertexAttributeBinding; -import me.jellysquid.mods.sodium.client.gl.device.CommandList; +import me.jellysquid.mods.thingl.attribute.GlVertexAttributeBinding; +import me.jellysquid.mods.thingl.device.CommandList; import org.lwjgl.opengl.GL20C; import org.lwjgl.opengl.GL33C; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/tessellation/GlIndexType.java b/src/main/java/me/jellysquid/mods/thingl/tessellation/GlIndexType.java similarity index 90% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/tessellation/GlIndexType.java rename to src/main/java/me/jellysquid/mods/thingl/tessellation/GlIndexType.java index 867bc09010..5fcf05a90d 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/tessellation/GlIndexType.java +++ b/src/main/java/me/jellysquid/mods/thingl/tessellation/GlIndexType.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gl.tessellation; +package me.jellysquid.mods.thingl.tessellation; import org.lwjgl.opengl.GL32C; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/tessellation/GlPrimitiveType.java b/src/main/java/me/jellysquid/mods/thingl/tessellation/GlPrimitiveType.java similarity index 80% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/tessellation/GlPrimitiveType.java rename to src/main/java/me/jellysquid/mods/thingl/tessellation/GlPrimitiveType.java index ba56716a64..b162c8e765 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/tessellation/GlPrimitiveType.java +++ b/src/main/java/me/jellysquid/mods/thingl/tessellation/GlPrimitiveType.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gl.tessellation; +package me.jellysquid.mods.thingl.tessellation; import org.lwjgl.opengl.GL20C; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/tessellation/GlTessellation.java b/src/main/java/me/jellysquid/mods/thingl/tessellation/GlTessellation.java similarity index 62% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/tessellation/GlTessellation.java rename to src/main/java/me/jellysquid/mods/thingl/tessellation/GlTessellation.java index cf7aeb70ac..37297c8ab7 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/tessellation/GlTessellation.java +++ b/src/main/java/me/jellysquid/mods/thingl/tessellation/GlTessellation.java @@ -1,6 +1,6 @@ -package me.jellysquid.mods.sodium.client.gl.tessellation; +package me.jellysquid.mods.thingl.tessellation; -import me.jellysquid.mods.sodium.client.gl.device.CommandList; +import me.jellysquid.mods.thingl.device.CommandList; public interface GlTessellation { void delete(CommandList commandList); diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/tessellation/GlVertexArrayTessellation.java b/src/main/java/me/jellysquid/mods/thingl/tessellation/GlVertexArrayTessellation.java similarity index 77% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/tessellation/GlVertexArrayTessellation.java rename to src/main/java/me/jellysquid/mods/thingl/tessellation/GlVertexArrayTessellation.java index aa4d09bd86..32b0df5315 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/tessellation/GlVertexArrayTessellation.java +++ b/src/main/java/me/jellysquid/mods/thingl/tessellation/GlVertexArrayTessellation.java @@ -1,8 +1,7 @@ -package me.jellysquid.mods.sodium.client.gl.tessellation; +package me.jellysquid.mods.thingl.tessellation; -import me.jellysquid.mods.sodium.client.gl.array.GlVertexArray; -import me.jellysquid.mods.sodium.client.gl.buffer.GlBuffer; -import me.jellysquid.mods.sodium.client.gl.device.CommandList; +import me.jellysquid.mods.thingl.array.GlVertexArray; +import me.jellysquid.mods.thingl.device.CommandList; public class GlVertexArrayTessellation extends GlAbstractTessellation { private final GlVertexArray array; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/tessellation/TessellationBinding.java b/src/main/java/me/jellysquid/mods/thingl/tessellation/TessellationBinding.java similarity index 69% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/tessellation/TessellationBinding.java rename to src/main/java/me/jellysquid/mods/thingl/tessellation/TessellationBinding.java index 1c66e28d86..0742c32a63 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/tessellation/TessellationBinding.java +++ b/src/main/java/me/jellysquid/mods/thingl/tessellation/TessellationBinding.java @@ -1,8 +1,8 @@ -package me.jellysquid.mods.sodium.client.gl.tessellation; +package me.jellysquid.mods.thingl.tessellation; -import me.jellysquid.mods.sodium.client.gl.attribute.GlVertexAttributeBinding; -import me.jellysquid.mods.sodium.client.gl.buffer.GlBuffer; -import me.jellysquid.mods.sodium.client.gl.buffer.GlBufferTarget; +import me.jellysquid.mods.thingl.attribute.GlVertexAttributeBinding; +import me.jellysquid.mods.thingl.buffer.GlBuffer; +import me.jellysquid.mods.thingl.buffer.GlBufferTarget; public record TessellationBinding(GlBufferTarget target, GlBuffer buffer, diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/texture/GlSampler.java b/src/main/java/me/jellysquid/mods/thingl/texture/GlSampler.java similarity index 87% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/texture/GlSampler.java rename to src/main/java/me/jellysquid/mods/thingl/texture/GlSampler.java index 48dfcf4ab9..b96348fbfc 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/texture/GlSampler.java +++ b/src/main/java/me/jellysquid/mods/thingl/texture/GlSampler.java @@ -1,6 +1,6 @@ -package me.jellysquid.mods.sodium.client.gl.texture; +package me.jellysquid.mods.thingl.texture; -import me.jellysquid.mods.sodium.client.gl.GlObject; +import me.jellysquid.mods.thingl.GlObject; import org.lwjgl.opengl.GL33C; public class GlSampler extends GlObject { diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/texture/GlTexture.java b/src/main/java/me/jellysquid/mods/thingl/texture/GlTexture.java similarity index 92% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/texture/GlTexture.java rename to src/main/java/me/jellysquid/mods/thingl/texture/GlTexture.java index 7b91724447..7d2ee9db50 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/texture/GlTexture.java +++ b/src/main/java/me/jellysquid/mods/thingl/texture/GlTexture.java @@ -1,8 +1,8 @@ -package me.jellysquid.mods.sodium.client.gl.texture; +package me.jellysquid.mods.thingl.texture; import com.mojang.blaze3d.platform.TextureUtil; import com.mojang.blaze3d.systems.RenderSystem; -import me.jellysquid.mods.sodium.client.gl.GlObject; +import me.jellysquid.mods.thingl.GlObject; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11C; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/texture/TextureData.java b/src/main/java/me/jellysquid/mods/thingl/texture/TextureData.java similarity index 97% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/texture/TextureData.java rename to src/main/java/me/jellysquid/mods/thingl/texture/TextureData.java index 30e6f62922..ff3714a931 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/texture/TextureData.java +++ b/src/main/java/me/jellysquid/mods/thingl/texture/TextureData.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gl.texture; +package me.jellysquid.mods.thingl.texture; import org.apache.commons.io.IOUtils; import org.lwjgl.stb.STBImage; diff --git a/src/main/java/me/jellysquid/mods/thingl/util/ElementRange.java b/src/main/java/me/jellysquid/mods/thingl/util/ElementRange.java new file mode 100644 index 0000000000..bc8a1be39c --- /dev/null +++ b/src/main/java/me/jellysquid/mods/thingl/util/ElementRange.java @@ -0,0 +1,6 @@ +package me.jellysquid.mods.thingl.util; + +import me.jellysquid.mods.thingl.tessellation.GlIndexType; + +public record ElementRange(int elementPointer, int elementCount, GlIndexType indexType, int baseVertex) { +} diff --git a/src/main/java/me/jellysquid/mods/thingl/util/EnumBit.java b/src/main/java/me/jellysquid/mods/thingl/util/EnumBit.java new file mode 100644 index 0000000000..183c6b6a25 --- /dev/null +++ b/src/main/java/me/jellysquid/mods/thingl/util/EnumBit.java @@ -0,0 +1,5 @@ +package me.jellysquid.mods.thingl.util; + +public interface EnumBit { + int getBits(); +} diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/util/EnumBitField.java b/src/main/java/me/jellysquid/mods/thingl/util/EnumBitField.java similarity index 94% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/util/EnumBitField.java rename to src/main/java/me/jellysquid/mods/thingl/util/EnumBitField.java index 26f8c9f4a4..495b79ab35 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/util/EnumBitField.java +++ b/src/main/java/me/jellysquid/mods/thingl/util/EnumBitField.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gl.util; +package me.jellysquid.mods.thingl.util; import java.util.Arrays; import java.util.EnumSet; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/util/MemoryUtilHelper.java b/src/main/java/me/jellysquid/mods/thingl/util/MemoryUtilHelper.java similarity index 94% rename from src/main/java/me/jellysquid/mods/sodium/client/gl/util/MemoryUtilHelper.java rename to src/main/java/me/jellysquid/mods/thingl/util/MemoryUtilHelper.java index 851b73f7f4..a2cab5103d 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/util/MemoryUtilHelper.java +++ b/src/main/java/me/jellysquid/mods/thingl/util/MemoryUtilHelper.java @@ -1,4 +1,4 @@ -package me.jellysquid.mods.sodium.client.gl.util; +package me.jellysquid.mods.thingl.util; import org.jetbrains.annotations.Nullable; import org.lwjgl.PointerBuffer; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/util/NativeBuffer.java b/src/main/java/me/jellysquid/mods/thingl/util/NativeBuffer.java similarity index 93% rename from src/main/java/me/jellysquid/mods/sodium/client/util/NativeBuffer.java rename to src/main/java/me/jellysquid/mods/thingl/util/NativeBuffer.java index 6221069792..b7d91ae00d 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/util/NativeBuffer.java +++ b/src/main/java/me/jellysquid/mods/thingl/util/NativeBuffer.java @@ -1,10 +1,8 @@ -package me.jellysquid.mods.sodium.client.util; +package me.jellysquid.mods.thingl.util; import it.unimi.dsi.fastutil.objects.Reference2ReferenceMap; import it.unimi.dsi.fastutil.objects.Reference2ReferenceMaps; import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; -import me.jellysquid.mods.sodium.client.SodiumClientMod; -import me.jellysquid.mods.sodium.client.gui.SodiumGameOptions; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.lwjgl.system.MemoryUtil; @@ -17,6 +15,9 @@ import java.util.stream.Collectors; public class NativeBuffer { + private static final boolean USE_MEMORY_TRACING = System.getProperty("thingl.memory.tracing", "false") + .equalsIgnoreCase("true"); + private static final Logger LOGGER = LogManager.getLogger(NativeBuffer.class); private static final ReferenceQueue RECLAIM_QUEUE = new ReferenceQueue<>(); @@ -87,8 +88,7 @@ public static long getTotalAllocated() { } private static StackTraceElement[] getStackTrace() { - return SodiumClientMod.options().advanced.enableMemoryTracing ? Thread.currentThread() - .getStackTrace() : null; + return USE_MEMORY_TRACING ? Thread.currentThread().getStackTrace() : null; } private static final int MAX_ALLOCATION_ATTEMPTS = 3; diff --git a/src/main/resources/sodium.mixins.json b/src/main/resources/sodium.mixins.json index 387e6d2b6a..3134d21751 100644 --- a/src/main/resources/sodium.mixins.json +++ b/src/main/resources/sodium.mixins.json @@ -15,12 +15,10 @@ "core.matrix.MixinMatrix4f", "core.model.MixinBlockColors", "core.model.MixinItemColors", - "core.pipeline.MixinBakedQuad", "core.pipeline.MixinBufferBuilder", "core.pipeline.MixinVertexConsumer", "core.pipeline.MixinVertexFormat", "features.block.MixinBlockModelRenderer", - "features.block.MixinWorldRenderer", "features.buffer_builder.fast_advance.MixinBufferBuilder", "features.buffer_builder.intrinsics.MixinBufferBuilder", "features.buffer_builder.intrinsics.MixinSpriteTexturedVertexConsumer", @@ -65,6 +63,7 @@ ], "mixins": [ "core.MixinSinglePreparationResourceReloader", + "core.pipeline.MixinBakedQuad", "features.block.MixinSignBlockEntityRenderer", "features.buffer_builder.fast_sort.MixinBufferBuilder", "features.buffer_builder.fast_sort.MixinBufferBuilder$MixinState",