From bec82326630fedb16821d1f3bd1a196974dd7d05 Mon Sep 17 00:00:00 2001 From: techno-sam <77073745+techno-sam@users.noreply.github.com> Date: Sat, 4 Apr 2026 16:33:31 +0200 Subject: [PATCH] Porting I --- .../crystalline_sky/CrystallineSkyClient.java | 8 +- .../compat/sodium/SkyShaderInterface.java | 46 +++--- .../content/blocks/WeepingSkyLightBlock.java | 24 +-- .../content/items/WeepingSkyBlockItem.java | 5 +- .../CrystallineSkyBlockTagProvider.java | 4 +- .../CrystallineSkyModelProvider.java | 38 ++--- .../extenders_cove/BlockRenderLayerExt.java | 11 -- .../BlockRenderLayerGroupExt.java | 8 - .../CrystallineSkyEarlyRiser.java | 16 -- .../CrystallineSkyEarlyRiserClient.java | 38 ----- .../infrastructure/MutableWeepingScanner.java | 14 +- .../mixin/client/BlockRenderLayerMixin.java | 28 ---- .../mixin/client/DebugRendererMixin.java | 3 +- .../client/DefaultFramebufferSetMixin.java | 49 ------ .../mixin/client/FramebufferMixin.java | 25 ++-- .../mixin/client/GameRendererMixin.java | 35 +++++ .../mixin/client/RenderLayerMixin.java | 21 +++ .../mixin/client/WorldRendererAccessor.java | 12 -- .../mixin/client/WorldRendererMixin.java | 141 ++++++++++-------- .../client/WorldRenderer_NoSodium_Mixin.java | 38 ++--- ...verrider_AxiomChunkOverrideLayerMixin.java | 10 +- .../compat/sodium/DefaultMaterialsMixin.java | 12 +- .../DefaultTerrainRenderPassesMixin.java | 4 +- .../sodium/ShaderChunkRendererMixin.java | 4 +- .../sodium/SodiumWorldRendererMixin.java | 11 +- .../sodium/TerrainRenderPassAccessor.java | 4 +- .../client/DefaultFramebufferSet_Duck.java | 13 -- .../client/WorldRenderer_Duck.java | 7 + .../registry/CrystallineBlocks.java | 2 +- .../CrystallineDataComponentTypes.java | 3 +- .../registry/CrystallineItems.java | 15 +- .../client/CrystallineRenderLayers.java | 44 ++++++ .../client/CrystallineRenderPipelines.java | 19 --- .../client/CrystallineShaderPrograms.java | 14 ++ .../resources/crystalline_sky.mixins.json | 5 +- src/main/resources/fabric.mod.json | 3 - 36 files changed, 352 insertions(+), 382 deletions(-) delete mode 100644 src/main/java/io/github/slimeistdev/crystalline_sky/extenders_cove/BlockRenderLayerExt.java delete mode 100644 src/main/java/io/github/slimeistdev/crystalline_sky/extenders_cove/BlockRenderLayerGroupExt.java delete mode 100644 src/main/java/io/github/slimeistdev/crystalline_sky/extenders_cove/CrystallineSkyEarlyRiser.java delete mode 100644 src/main/java/io/github/slimeistdev/crystalline_sky/extenders_cove/CrystallineSkyEarlyRiserClient.java delete mode 100644 src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/BlockRenderLayerMixin.java delete mode 100644 src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/DefaultFramebufferSetMixin.java create mode 100644 src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/GameRendererMixin.java create mode 100644 src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/RenderLayerMixin.java delete mode 100644 src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/WorldRendererAccessor.java delete mode 100644 src/main/java/io/github/slimeistdev/crystalline_sky/mixin_ducks/client/DefaultFramebufferSet_Duck.java create mode 100644 src/main/java/io/github/slimeistdev/crystalline_sky/mixin_ducks/client/WorldRenderer_Duck.java create mode 100644 src/main/java/io/github/slimeistdev/crystalline_sky/registry/client/CrystallineRenderLayers.java delete mode 100644 src/main/java/io/github/slimeistdev/crystalline_sky/registry/client/CrystallineRenderPipelines.java create mode 100644 src/main/java/io/github/slimeistdev/crystalline_sky/registry/client/CrystallineShaderPrograms.java diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/CrystallineSkyClient.java b/src/main/java/io/github/slimeistdev/crystalline_sky/CrystallineSkyClient.java index f79e4d4..b790e0e 100644 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/CrystallineSkyClient.java +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/CrystallineSkyClient.java @@ -1,12 +1,12 @@ package io.github.slimeistdev.crystalline_sky; -import io.github.slimeistdev.crystalline_sky.extenders_cove.BlockRenderLayerExt; import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.DebugRenderer_Duck; import io.github.slimeistdev.crystalline_sky.registry.CrystallineBlocks; +import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderLayers; import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; -import net.fabricmc.fabric.api.client.rendering.v1.BlockRenderLayerMap; import net.minecraft.client.option.KeyBinding; import net.minecraft.client.util.InputUtil; import net.minecraft.screen.ScreenTexts; @@ -17,8 +17,8 @@ import org.lwjgl.glfw.GLFW; public class CrystallineSkyClient implements ClientModInitializer { @Override public void onInitializeClient() { - BlockRenderLayerMap.putBlock(CrystallineBlocks.SKY, BlockRenderLayerExt.CRYSTALLINE_SKY_SKY); - BlockRenderLayerMap.putBlock(CrystallineBlocks.WEEPING_SKY, BlockRenderLayerExt.CRYSTALLINE_SKY_SKY); + BlockRenderLayerMap.INSTANCE.putBlock(CrystallineBlocks.SKY, CrystallineRenderLayers.SKY); + BlockRenderLayerMap.INSTANCE.putBlock(CrystallineBlocks.WEEPING_SKY, CrystallineRenderLayers.SKY); var weepingSkyKeybind = KeyBindingHelper.registerKeyBinding(new KeyBinding( "crystalline_sky.key.toggle_weeping_sky_debug", diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/compat/sodium/SkyShaderInterface.java b/src/main/java/io/github/slimeistdev/crystalline_sky/compat/sodium/SkyShaderInterface.java index 028e98f..b320a40 100644 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/compat/sodium/SkyShaderInterface.java +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/compat/sodium/SkyShaderInterface.java @@ -1,17 +1,18 @@ package io.github.slimeistdev.crystalline_sky.compat.sodium; -import com.mojang.blaze3d.opengl.GlStateManager; -import com.mojang.blaze3d.textures.GpuTextureView; +import com.mojang.blaze3d.platform.GlStateManager; import io.github.slimeistdev.crystalline_sky.registry.CrystallineItems; import net.caffeinemc.mods.sodium.client.gl.shader.uniform.GlUniformFloat3v; import net.caffeinemc.mods.sodium.client.gl.shader.uniform.GlUniformFloat4v; import net.caffeinemc.mods.sodium.client.gl.shader.uniform.GlUniformInt; import net.caffeinemc.mods.sodium.client.gl.shader.uniform.GlUniformMatrix4f; -import net.caffeinemc.mods.sodium.client.render.chunk.shader.*; -import net.caffeinemc.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; -import net.caffeinemc.mods.sodium.client.util.FogParameters; +import net.caffeinemc.mods.sodium.client.render.chunk.shader.ChunkShaderFogComponent; +import net.caffeinemc.mods.sodium.client.render.chunk.shader.ChunkShaderInterface; +import net.caffeinemc.mods.sodium.client.render.chunk.shader.ChunkShaderOptions; +import net.caffeinemc.mods.sodium.client.render.chunk.shader.ChunkShaderTextureSlot; +import net.caffeinemc.mods.sodium.client.render.chunk.shader.ShaderBindingContext; +import net.caffeinemc.mods.sodium.client.util.TextureUtil; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.texture.GlTexture; import net.minecraft.util.math.MathHelper; import org.joml.Matrix4fc; import org.lwjgl.opengl.GL32C; @@ -31,6 +32,8 @@ public class SkyShaderInterface implements ChunkShaderInterface { // The fog shader component used by this program in order to set up the appropriate GL state private final ChunkShaderFogComponent fogShader; + private final float[] colorModulator = new float[] {1.0f, 1.0f, 1.0f, 1.0f}; + public SkyShaderInterface(ShaderBindingContext context, ChunkShaderOptions options) { this.uniformModelViewMatrix = context.bindUniform("u_ModelViewMatrix", GlUniformMatrix4f::new); this.uniformProjectionMatrix = context.bindUniform("u_ProjectionMatrix", GlUniformMatrix4f::new); @@ -43,9 +46,9 @@ public class SkyShaderInterface implements ChunkShaderInterface { this.fogShader = options.fog().getFactory().apply(context); } - @Override // the shader interface should not modify pipeline state - public void setupState(TerrainRenderPass pass, FogParameters parameters) { - this.bindTexture(ChunkShaderTextureSlot.BLOCK, pass.getAtlas()); + @Override + public void setupState() { + this.bindTexture(ChunkShaderTextureSlot.BLOCK, TextureUtil.getBlockTextureId()); MinecraftClient client = MinecraftClient.getInstance(); if (client.world != null @@ -55,17 +58,18 @@ public class SkyShaderInterface implements ChunkShaderInterface { || client.player.getMainHandStack().isOf(CrystallineItems.WEEPING_SKY) || client.player.getOffHandStack().isOf(CrystallineItems.WEEPING_SKY))) { - float f = client.world.getTime() + client.getRenderTickCounter().getTickProgress(true); + float f = client.world.getTime() + client.getRenderTickCounter().getTickDelta(true); float alpha = (MathHelper.sin(f / 10.0f) + 1.0f) / 2.0f; // remap alpha from [0, 1] to [0, 0.75] float maxAlpha = 1.0f - 0.25f; alpha = alpha * maxAlpha; - this.uniformColorModulator.set(1.0f, 1.0f, 1.0f, alpha); + colorModulator[3] = alpha; } else { - this.uniformColorModulator.set(1.0f, 1.0f, 1.0f, 1.0f); + colorModulator[3] = 1.0f; } + this.uniformColorModulator.set(colorModulator); - this.fogShader.setup(parameters); + this.fogShader.setup(); } @Override // the shader interface should not modify pipeline state @@ -73,16 +77,14 @@ public class SkyShaderInterface implements ChunkShaderInterface { // This is used by alternate implementations. } - @Deprecated(forRemoval = true) // should be handled properly in GFX instead. - private void bindTexture(ChunkShaderTextureSlot slot, GpuTextureView textureView) { - GlTexture tex = (GlTexture) textureView.texture(); + /** @deprecated */ + @Deprecated( + forRemoval = true + ) + private void bindTexture(ChunkShaderTextureSlot slot, int textureId) { GlStateManager._activeTexture(GL32C.GL_TEXTURE0 + slot.ordinal()); - GlStateManager._bindTexture(tex.getGlId()); - GlStateManager._texParameter(GL32C.GL_TEXTURE_2D, 33084, textureView.baseMipLevel()); - GlStateManager._texParameter(GL32C.GL_TEXTURE_2D, 33085, textureView.baseMipLevel() + textureView.mipLevels() - 1); - tex.checkDirty(GL32C.GL_TEXTURE_2D); - - var uniform = this.uniformTextures.get(slot); + GlStateManager._bindTexture(textureId); + GlUniformInt uniform = this.uniformTextures.get(slot); uniform.setInt(slot.ordinal()); } diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/content/blocks/WeepingSkyLightBlock.java b/src/main/java/io/github/slimeistdev/crystalline_sky/content/blocks/WeepingSkyLightBlock.java index 4720cd4..ecf56ad 100644 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/content/blocks/WeepingSkyLightBlock.java +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/content/blocks/WeepingSkyLightBlock.java @@ -1,7 +1,11 @@ package io.github.slimeistdev.crystalline_sky.content.blocks; import io.github.slimeistdev.crystalline_sky.registry.CrystallineItems; -import net.minecraft.block.*; +import net.minecraft.block.Block; +import net.minecraft.block.BlockRenderType; +import net.minecraft.block.BlockState; +import net.minecraft.block.ShapeContext; +import net.minecraft.block.Waterloggable; import net.minecraft.fluid.FluidState; import net.minecraft.fluid.Fluids; import net.minecraft.state.StateManager; @@ -9,12 +13,10 @@ import net.minecraft.state.property.BooleanProperty; import net.minecraft.state.property.Properties; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; -import net.minecraft.util.math.random.Random; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; import net.minecraft.world.BlockView; -import net.minecraft.world.WorldView; -import net.minecraft.world.tick.ScheduledTickView; +import net.minecraft.world.WorldAccess; public class WeepingSkyLightBlock extends Block implements Waterloggable { public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; @@ -35,7 +37,7 @@ public class WeepingSkyLightBlock extends Block implements Waterloggable { } @Override - protected boolean isTransparent(BlockState state) { + protected boolean isTransparent(BlockState state, BlockView world, BlockPos pos) { return state.getFluidState().isEmpty(); } @@ -52,19 +54,17 @@ public class WeepingSkyLightBlock extends Block implements Waterloggable { @Override protected BlockState getStateForNeighborUpdate( BlockState state, - WorldView world, - ScheduledTickView tickView, - BlockPos pos, Direction direction, - BlockPos neighborPos, BlockState neighborState, - Random random + WorldAccess world, + BlockPos pos, + BlockPos neighborPos ) { if (state.get(WATERLOGGED)) { - tickView.scheduleFluidTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + world.scheduleFluidTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); } - return super.getStateForNeighborUpdate(state, world, tickView, pos, direction, neighborPos, neighborState, random); + return super.getStateForNeighborUpdate(state, direction, neighborState, world, pos, neighborPos); } @Override diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/content/items/WeepingSkyBlockItem.java b/src/main/java/io/github/slimeistdev/crystalline_sky/content/items/WeepingSkyBlockItem.java index 7dc1c62..bf9aa7a 100644 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/content/items/WeepingSkyBlockItem.java +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/content/items/WeepingSkyBlockItem.java @@ -8,6 +8,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUsageContext; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; +import net.minecraft.util.TypedActionResult; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ColumnPos; import net.minecraft.world.World; @@ -32,13 +33,13 @@ public class WeepingSkyBlockItem extends BlockItem { } @Override - public ActionResult use(World world, PlayerEntity user, Hand hand) { + public TypedActionResult use(World world, PlayerEntity user, Hand hand) { ItemStack stack = user.getStackInHand(hand); if (stack.get(CrystallineDataComponentTypes.WEEPING_SKY_DEBUG_COLUMN_TOOL) != null) { if (world.isClient) { WeepingSkyBlockItemClient.setSelectedColumn(null); } - return ActionResult.SUCCESS; + return TypedActionResult.success(stack); } return super.use(world, user, hand); diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/datagen/providers/CrystallineSkyBlockTagProvider.java b/src/main/java/io/github/slimeistdev/crystalline_sky/datagen/providers/CrystallineSkyBlockTagProvider.java index 21e6521..915ce8f 100644 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/datagen/providers/CrystallineSkyBlockTagProvider.java +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/datagen/providers/CrystallineSkyBlockTagProvider.java @@ -18,13 +18,13 @@ public class CrystallineSkyBlockTagProvider extends FabricTagProvider.BlockTagPr @Override protected void configure(RegistryWrapper.WrapperLookup wrapperLookup) { - valueLookupBuilder(TagKey.of(RegistryKeys.BLOCK, CrystallineSky.id("sky_light_emitters"))) + getOrCreateTagBuilder(TagKey.of(RegistryKeys.BLOCK, CrystallineSky.id("sky_light_emitters"))) .add(CrystallineBlocks.SKY) .add(CrystallineBlocks.SKY_LIGHT) .add(CrystallineBlocks.WEEPING_SKY) .add(CrystallineBlocks.WEEPING_SKY_LIGHT); - valueLookupBuilder(BlockTags.CRYSTAL_SOUND_BLOCKS) + getOrCreateTagBuilder(BlockTags.CRYSTAL_SOUND_BLOCKS) .add(CrystallineBlocks.SKY) .add(CrystallineBlocks.WEEPING_SKY); } diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/datagen/providers/CrystallineSkyModelProvider.java b/src/main/java/io/github/slimeistdev/crystalline_sky/datagen/providers/CrystallineSkyModelProvider.java index 949104b..742bdbe 100644 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/datagen/providers/CrystallineSkyModelProvider.java +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/datagen/providers/CrystallineSkyModelProvider.java @@ -2,22 +2,25 @@ package io.github.slimeistdev.crystalline_sky.datagen.providers; import io.github.slimeistdev.crystalline_sky.registry.CrystallineBlocks; import io.github.slimeistdev.crystalline_sky.registry.CrystallineItems; -import net.fabricmc.fabric.api.client.datagen.v1.provider.FabricModelProvider; import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; +import net.fabricmc.fabric.api.datagen.v1.provider.FabricModelProvider; import net.minecraft.block.Block; -import net.minecraft.block.LightBlock; -import net.minecraft.client.data.*; -import net.minecraft.client.render.item.model.ItemModel; -import net.minecraft.client.render.model.json.WeightedVariant; +import net.minecraft.data.client.BlockStateModelGenerator; +import net.minecraft.data.client.BlockStateVariant; +import net.minecraft.data.client.BlockStateVariantMap; +import net.minecraft.data.client.ItemModelGenerator; +import net.minecraft.data.client.ModelIds; +import net.minecraft.data.client.Models; +import net.minecraft.data.client.TextureMap; +import net.minecraft.data.client.VariantSettings; +import net.minecraft.data.client.VariantsBlockStateSupplier; import net.minecraft.item.Item; import net.minecraft.state.property.Properties; import net.minecraft.util.Identifier; -import java.util.HashMap; import java.util.Locale; -import java.util.Map; -import static net.minecraft.client.data.BlockStateModelGenerator.createWeightedVariant; +//import static net.minecraft.client.data.BlockStateModelGenerator.createWeightedVariant; @SuppressWarnings("SameParameterValue") public class CrystallineSkyModelProvider extends FabricModelProvider { @@ -41,26 +44,25 @@ public class CrystallineSkyModelProvider extends FabricModelProvider { } private void registerSkyLightBlock(BlockStateModelGenerator gen, Block block, Item item) { - ItemModel.Unbaked fallback = ItemModels.basic(gen.uploadItemModel(item)); - Map itemModels = new HashMap<>(16); - BlockStateVariantMap.SingleProperty levelProp = BlockStateVariantMap.models(Properties.LEVEL_15); + BlockStateVariantMap.SingleProperty singleProperty = BlockStateVariantMap.create(Properties.LEVEL_15); for (int level = 0; level <= 15; level++) { String suffix = String.format(Locale.ROOT, "_%02d", level); Identifier texture = TextureMap.getSubId(item, suffix); - levelProp.register(level, createWeightedVariant(Models.PARTICLE.upload(block, suffix, TextureMap.particle(texture), gen.modelCollector))); - - ItemModel.Unbaked levelItemModel = ItemModels.basic(Models.GENERATED.upload( + singleProperty.register(level, BlockStateVariant.create().put( + VariantSettings.MODEL, + Models.PARTICLE.upload(block, suffix, TextureMap.particle(texture), gen.modelCollector)) + ); + Models.GENERATED.upload( ModelIds.getItemSubModelId(item, suffix), TextureMap.layer0(texture), gen.modelCollector - )); - itemModels.put(level, levelItemModel); + ); } - gen.itemModelOutput.accept(item, ItemModels.select(LightBlock.LEVEL_15, fallback, itemModels)); - gen.blockStateCollector.accept(VariantsBlockModelDefinitionCreator.of(block).with(levelProp)); + // TODO generate root-level item model itself + gen.blockStateCollector.accept(VariantsBlockStateSupplier.create(block).coordinate(singleProperty)); } @Override diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/extenders_cove/BlockRenderLayerExt.java b/src/main/java/io/github/slimeistdev/crystalline_sky/extenders_cove/BlockRenderLayerExt.java deleted file mode 100644 index ee62f4c..0000000 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/extenders_cove/BlockRenderLayerExt.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.github.slimeistdev.crystalline_sky.extenders_cove; - -import com.chocohead.mm.api.ClassTinkerers; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.render.BlockRenderLayer; - -public class BlockRenderLayerExt { - @Environment(EnvType.CLIENT) - public static final BlockRenderLayer CRYSTALLINE_SKY_SKY = ClassTinkerers.getEnum(BlockRenderLayer.class, "CRYSTALLINE_SKY_SKY"); -} diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/extenders_cove/BlockRenderLayerGroupExt.java b/src/main/java/io/github/slimeistdev/crystalline_sky/extenders_cove/BlockRenderLayerGroupExt.java deleted file mode 100644 index 1dfd7b4..0000000 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/extenders_cove/BlockRenderLayerGroupExt.java +++ /dev/null @@ -1,8 +0,0 @@ -package io.github.slimeistdev.crystalline_sky.extenders_cove; - -import com.chocohead.mm.api.ClassTinkerers; -import net.minecraft.client.render.BlockRenderLayerGroup; - -public class BlockRenderLayerGroupExt { - public static final BlockRenderLayerGroup CRYSTALLINE_SKY_SKY = ClassTinkerers.getEnum(BlockRenderLayerGroup.class, "CRYSTALLINE_SKY_SKY"); -} diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/extenders_cove/CrystallineSkyEarlyRiser.java b/src/main/java/io/github/slimeistdev/crystalline_sky/extenders_cove/CrystallineSkyEarlyRiser.java deleted file mode 100644 index ecd4ead..0000000 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/extenders_cove/CrystallineSkyEarlyRiser.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.github.slimeistdev.crystalline_sky.extenders_cove; - -import net.fabricmc.api.EnvType; -import net.fabricmc.loader.api.FabricLoader; - -import java.util.function.Supplier; - -public class CrystallineSkyEarlyRiser implements Runnable { - @Override - @SuppressWarnings({"Convert2MethodRef", "TrivialFunctionalExpressionUsage"}) - public void run() { - if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { - ((Supplier) (() -> () -> CrystallineSkyEarlyRiserClient.runClient())).get().run(); - } - } -} diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/extenders_cove/CrystallineSkyEarlyRiserClient.java b/src/main/java/io/github/slimeistdev/crystalline_sky/extenders_cove/CrystallineSkyEarlyRiserClient.java deleted file mode 100644 index cd0953c..0000000 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/extenders_cove/CrystallineSkyEarlyRiserClient.java +++ /dev/null @@ -1,38 +0,0 @@ -package io.github.slimeistdev.crystalline_sky.extenders_cove; - -import com.chocohead.mm.api.ClassTinkerers; -import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderPipelines; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.fabricmc.loader.api.FabricLoader; -import net.fabricmc.loader.api.MappingResolver; -import net.minecraft.client.render.BlockRenderLayer; - -class CrystallineSkyEarlyRiserClient { - @Environment(EnvType.CLIENT) - static void runClient() { - MappingResolver remapper = FabricLoader.getInstance().getMappingResolver(); - - // net.minecraft.client.render.BlockRenderLayer - String blockRenderLayer = remapper.mapClassName("intermediary", "net.minecraft.class_11515"); - - // RenderPipeline is not obfuscated - ClassTinkerers.enumBuilder(blockRenderLayer, "Lcom/mojang/blaze3d/pipeline/RenderPipeline;", "I", "Z", "Z") - .addEnum("CRYSTALLINE_SKY_SKY", () -> new Object[]{ - CrystallineRenderPipelines.SKY_PIPELINE, - 1536, - false, - false - }) - .build(); - - // net.minecraft.client.render.BlockRenderLayerGroup - String blockRenderLayerGroup = remapper.mapClassName("intermediary", "net.minecraft.class_11531"); - - ClassTinkerers.enumBuilder(blockRenderLayerGroup, "[L"+blockRenderLayer+";") - .addEnum("CRYSTALLINE_SKY_SKY", () -> new Object[] { - new BlockRenderLayer[] {BlockRenderLayerExt.CRYSTALLINE_SKY_SKY} - }) - .build(); - } -} diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/infrastructure/MutableWeepingScanner.java b/src/main/java/io/github/slimeistdev/crystalline_sky/infrastructure/MutableWeepingScanner.java index fe58067..82a1717 100644 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/infrastructure/MutableWeepingScanner.java +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/infrastructure/MutableWeepingScanner.java @@ -54,7 +54,7 @@ public class MutableWeepingScanner implements WeepingStorage.WeepingScanner { while (bottomPos.getY() >= minY) { BlockState bottomState = blockView.getBlockState(bottomPos); - if (faceBlocksLight(topState, bottomState)) { + if (faceBlocksLight(blockView, topState, bottomState, topPos, bottomPos)) { return transformOutputY(bottomPos.getY()); } @@ -85,7 +85,7 @@ public class MutableWeepingScanner implements WeepingStorage.WeepingScanner { return transformOutputY(bottomPos.getY()); } - if (faceBlocksLight(topState, bottomState)) { + if (faceBlocksLight(blockView, topState, bottomState, topPos, bottomPos)) { return -1; } @@ -107,15 +107,15 @@ public class MutableWeepingScanner implements WeepingStorage.WeepingScanner { BlockState upper = blockView.getBlockState(reusablePos1); BlockState lower = blockView.getBlockState(reusablePos2); - return faceBlocksLight(upper, lower); + return faceBlocksLight(blockView, upper, lower, reusablePos1, reusablePos2); } - private static boolean faceBlocksLight(BlockState upper, BlockState lower) { - if (lower.getOpacity() != 0) { + private static boolean faceBlocksLight(BlockView world, BlockState upper, BlockState lower, BlockPos upperPos, BlockPos lowerPos) { + if (lower.getOpacity(world, lowerPos) != 0) { return true; } else { - VoxelShape voxelShape = ChunkLightProvider.getOpaqueShape(upper, Direction.DOWN); - VoxelShape voxelShape2 = ChunkLightProvider.getOpaqueShape(lower, Direction.UP); + VoxelShape voxelShape = ChunkLightProvider.getOpaqueShape(world, upperPos, upper, Direction.DOWN); + VoxelShape voxelShape2 = ChunkLightProvider.getOpaqueShape(world, lowerPos, lower, Direction.UP); return VoxelShapes.unionCoversFullCube(voxelShape, voxelShape2); } } diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/BlockRenderLayerMixin.java b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/BlockRenderLayerMixin.java deleted file mode 100644 index 78fec1a..0000000 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/BlockRenderLayerMixin.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.github.slimeistdev.crystalline_sky.mixin.client; - -import com.mojang.blaze3d.textures.GpuTextureView; -import io.github.slimeistdev.crystalline_sky.extenders_cove.BlockRenderLayerExt; -import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.DefaultFramebufferSet_Duck; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gl.Framebuffer; -import net.minecraft.client.render.BlockRenderLayer; -import net.minecraft.client.render.DefaultFramebufferSet; -import net.minecraft.client.util.Handle; -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.CallbackInfoReturnable; - -@Mixin(BlockRenderLayer.class) -public class BlockRenderLayerMixin { - @Inject(method = "getTextureView", at = @At("HEAD"), cancellable = true) - private void shatterTheSky(CallbackInfoReturnable cir) { - if (((Object) this) == BlockRenderLayerExt.CRYSTALLINE_SKY_SKY) { - MinecraftClient mc = MinecraftClient.getInstance(); - DefaultFramebufferSet framebuffers = ((WorldRendererAccessor) mc.worldRenderer).crystalline_sky$getFramebufferSet(); - Handle skyFramebuffer = ((DefaultFramebufferSet_Duck) framebuffers).crystalline_sky$getSkyFramebuffer(); - - cir.setReturnValue(skyFramebuffer.get().getColorAttachmentView()); - } - } -} diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/DebugRendererMixin.java b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/DebugRendererMixin.java index e2b9d26..044755f 100644 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/DebugRendererMixin.java +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/DebugRendererMixin.java @@ -3,7 +3,6 @@ package io.github.slimeistdev.crystalline_sky.mixin.client; import io.github.slimeistdev.crystalline_sky.infrastructure.client.WeepingSkyDebugRenderer; import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.DebugRenderer_Duck; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.Frustum; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.debug.DebugRenderer; import net.minecraft.client.util.math.MatrixStack; @@ -42,7 +41,7 @@ public class DebugRendererMixin implements DebugRenderer_Duck { } @Inject(method = "render", at = @At("RETURN")) - private void render(MatrixStack matrices, Frustum frustum, VertexConsumerProvider.Immediate vertexConsumers, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) { + private void render(MatrixStack matrices, VertexConsumerProvider.Immediate vertexConsumers, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) { if (crystalline_sky$weepingSkyMode != 0) { crystalline_sky$weepingSkyDebugRenderer.setLitMode(crystalline_sky$weepingSkyMode == 1); crystalline_sky$weepingSkyDebugRenderer.render(matrices, vertexConsumers, cameraX, cameraY, cameraZ); diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/DefaultFramebufferSetMixin.java b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/DefaultFramebufferSetMixin.java deleted file mode 100644 index c1de328..0000000 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/DefaultFramebufferSetMixin.java +++ /dev/null @@ -1,49 +0,0 @@ -package io.github.slimeistdev.crystalline_sky.mixin.client; - -import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.DefaultFramebufferSet_Duck; -import net.minecraft.client.gl.Framebuffer; -import net.minecraft.client.render.DefaultFramebufferSet; -import net.minecraft.client.util.Handle; -import net.minecraft.util.Identifier; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -@Mixin(DefaultFramebufferSet.class) -public class DefaultFramebufferSetMixin implements DefaultFramebufferSet_Duck { - @Unique - private Handle crystalline_sky$skyFramebuffer = Handle.empty(); - - @Override - public Handle crystalline_sky$getSkyFramebuffer() { - return crystalline_sky$skyFramebuffer; - } - - @Override - public void crystalline_sky$setSkyFramebuffer(Handle framebuffer) { - crystalline_sky$skyFramebuffer = framebuffer; - } - - @Inject(method = "set", at = @At("HEAD"), cancellable = true) - private void setSky(Identifier id, Handle framebuffer, CallbackInfo ci) { - if (id.equals(crystalline_sky$SKY_FRAMEBUFFER)) { - crystalline_sky$skyFramebuffer = framebuffer; - ci.cancel(); - } - } - - @Inject(method = "get", at = @At("HEAD"), cancellable = true) - private void getSky(Identifier id, CallbackInfoReturnable> cir) { - if (id.equals(crystalline_sky$SKY_FRAMEBUFFER)) { - cir.setReturnValue(crystalline_sky$skyFramebuffer); - } - } - - @Inject(method = "clear", at = @At("HEAD")) - private void clearSky(CallbackInfo ci) { - crystalline_sky$skyFramebuffer = Handle.empty(); - } -} diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/FramebufferMixin.java b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/FramebufferMixin.java index 6b24c3f..76a277e 100644 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/FramebufferMixin.java +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/FramebufferMixin.java @@ -1,18 +1,17 @@ package io.github.slimeistdev.crystalline_sky.mixin.client; +import com.mojang.blaze3d.platform.GlConst; +import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.textures.GpuTexture; import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.Framebuffer_Duck; import net.minecraft.client.gl.Framebuffer; -import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(Framebuffer.class) public class FramebufferMixin implements Framebuffer_Duck { @Shadow - @Nullable - protected GpuTexture colorAttachment; + protected int colorAttachment; @Shadow public int textureWidth; @@ -20,17 +19,25 @@ public class FramebufferMixin implements Framebuffer_Duck { @Shadow public int textureHeight; + @Shadow + public int fbo; + @Override public void crystalline_sky$copyColorFrom(Framebuffer framebuffer) { RenderSystem.assertOnRenderThread(); - if (this.colorAttachment == null) { + if (this.colorAttachment == -1) { throw new IllegalStateException("Trying to copy color texture to a RenderTarget without a color texture"); - } else if (framebuffer.getColorAttachment() == null) { + } else if (framebuffer.getColorAttachment() == -1) { throw new IllegalStateException("Trying to copy color texture from a RenderTarget without a color texture"); } else { - RenderSystem.getDevice() - .createCommandEncoder() - .copyTextureToTexture(framebuffer.getColorAttachment(), this.colorAttachment, 0, 0, 0, 0, 0, this.textureWidth, this.textureHeight); + GlStateManager._glBindFramebuffer(GlConst.GL_READ_FRAMEBUFFER, framebuffer.fbo); + GlStateManager._glBindFramebuffer(GlConst.GL_DRAW_FRAMEBUFFER, this.fbo); + GlStateManager._glBlitFrameBuffer( + 0, 0, framebuffer.textureWidth, framebuffer.textureHeight, + 0, 0, this.textureWidth, this.textureHeight, + 256, GlConst.GL_NEAREST + ); + GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, 0); } } } diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/GameRendererMixin.java b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/GameRendererMixin.java new file mode 100644 index 0000000..093c7a3 --- /dev/null +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/GameRendererMixin.java @@ -0,0 +1,35 @@ +package io.github.slimeistdev.crystalline_sky.mixin.client; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.mojang.datafixers.util.Pair; +import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineShaderPrograms; +import net.minecraft.client.gl.ShaderProgram; +import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.render.VertexFormats; +import net.minecraft.resource.ResourceFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import java.io.IOException; +import java.util.List; +import java.util.function.Consumer; + +@Mixin(GameRenderer.class) +public class GameRendererMixin { + @SuppressWarnings("InvalidInjectorMethodSignature") + @WrapOperation(method = "loadPrograms", at = @At(value = "INVOKE", target = "Ljava/util/List;add(Ljava/lang/Object;)Z", ordinal = 0)) + private >> boolean loadSkyProgram( + List instance, + E e, + Operation original, + ResourceFactory factory + ) throws IOException { + original.call(instance, Pair.of(new ShaderProgram( + factory, + "crystalline_sky_rendertype_sky", + VertexFormats.POSITION_COLOR_TEXTURE_LIGHT_NORMAL + ), (Consumer) program -> CrystallineShaderPrograms.renderTypeSkyProgram = program)); + return original.call(instance, e); + } +} diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/RenderLayerMixin.java b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/RenderLayerMixin.java new file mode 100644 index 0000000..2fa7eed --- /dev/null +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/RenderLayerMixin.java @@ -0,0 +1,21 @@ +package io.github.slimeistdev.crystalline_sky.mixin.client; + +import com.google.common.collect.ImmutableList; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderLayers; +import net.minecraft.client.render.RenderLayer; +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(RenderLayer.class) +public class RenderLayerMixin { + @WrapOperation(method = "", at = @At(value = "FIELD", target = "Lnet/minecraft/client/render/RenderLayer;BLOCK_LAYERS:Lcom/google/common/collect/ImmutableList;", opcode = Opcodes.PUTSTATIC)) + private static void addSkyToBlockLayers(ImmutableList value, Operation original) { + original.call(ImmutableList.builder() + .addAll(value) + .add(CrystallineRenderLayers.SKY) + .build()); + } +} diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/WorldRendererAccessor.java b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/WorldRendererAccessor.java deleted file mode 100644 index f16e6fe..0000000 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/WorldRendererAccessor.java +++ /dev/null @@ -1,12 +0,0 @@ -package io.github.slimeistdev.crystalline_sky.mixin.client; - -import net.minecraft.client.render.DefaultFramebufferSet; -import net.minecraft.client.render.WorldRenderer; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(WorldRenderer.class) -public interface WorldRendererAccessor { - @Accessor("framebufferSet") - DefaultFramebufferSet crystalline_sky$getFramebufferSet(); -} diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/WorldRendererMixin.java b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/WorldRendererMixin.java index 969ab05..104475b 100644 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/WorldRendererMixin.java +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/WorldRendererMixin.java @@ -1,22 +1,22 @@ package io.github.slimeistdev.crystalline_sky.mixin.client; -import com.llamalad7.mixinextras.sugar.Local; -import com.mojang.blaze3d.buffers.GpuBufferSlice; -import io.github.slimeistdev.crystalline_sky.extenders_cove.BlockRenderLayerGroupExt; -import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.DefaultFramebufferSet_Duck; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.Framebuffer_Duck; +import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.WorldRenderer_Duck; +import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderLayers; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gl.Framebuffer; -import net.minecraft.client.gl.SimpleFramebufferFactory; -import net.minecraft.client.option.CloudRenderMode; -import net.minecraft.client.render.*; -import net.minecraft.client.util.Handle; -import net.minecraft.client.util.ObjectAllocator; +import net.minecraft.client.gl.SimpleFramebuffer; +import net.minecraft.client.render.Camera; +import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.render.LightmapTextureManager; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.RenderTickCounter; +import net.minecraft.client.render.WorldRenderer; import net.minecraft.client.world.ClientWorld; -import net.minecraft.util.profiler.Profiler; import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; -import org.joml.Vector4f; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -25,14 +25,8 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.Optional; - @Mixin(WorldRenderer.class) -public abstract class WorldRendererMixin { - @Shadow - @Final - private DefaultFramebufferSet framebufferSet; - +public abstract class WorldRendererMixin implements WorldRenderer_Duck { @Shadow @Final private MinecraftClient client; @@ -43,33 +37,73 @@ public abstract class WorldRendererMixin { @Shadow private int ticks; - @Shadow - @Final - private CloudRenderer cloudRenderer; - @Shadow protected abstract boolean hasBlindnessOrDarkness(Camera camera); - @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;getTransparencyPostEffectProcessor()Lnet/minecraft/client/gl/PostEffectProcessor;")) - private void setupSkyBuffer(ObjectAllocator allocator, RenderTickCounter tickCounter, boolean renderBlockOutline, - Camera camera, Matrix4f positionMatrix, Matrix4f projectionMatrix, GpuBufferSlice fog, - Vector4f fogColor, boolean shouldRenderSky, CallbackInfo ci, - @Local FrameGraphBuilder frameGraphBuilder, - @Local SimpleFramebufferFactory factory) { - Handle framebuffer = frameGraphBuilder.createResourceHandle("crystalline_sky:sky_framebuffer", factory); - ((DefaultFramebufferSet_Duck) framebufferSet).crystalline_sky$setSkyFramebuffer(framebuffer); - } + @Shadow + protected abstract void renderLayer(RenderLayer renderLayer, double x, double y, double z, Matrix4f matrix4f, Matrix4f positionMatrix); @Unique - private Handle crystalline_sky$transferSkyBuffer(FramePass pass) { - Handle skyFramebuffer = pass.transfer( - ((DefaultFramebufferSet_Duck) framebufferSet).crystalline_sky$getSkyFramebuffer()); - ((DefaultFramebufferSet_Duck) framebufferSet).crystalline_sky$setSkyFramebuffer(skyFramebuffer); - return skyFramebuffer; + @Nullable + private Framebuffer crystalline_sky$skyBuffer;// = new SimpleFramebuffer(0, 0, false, MinecraftClient.IS_SYSTEM_MAC); + + @Override + public Framebuffer crystalline_sky$getSkyFramebuffer() { + if (crystalline_sky$skyBuffer == null) { + var fb = client.getFramebuffer(); + crystalline_sky$skyBuffer = new SimpleFramebuffer(fb.textureWidth, fb.textureHeight, false, MinecraftClient.IS_SYSTEM_MAC); + } + return crystalline_sky$skyBuffer; } - @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;renderMain(Lnet/minecraft/client/render/FrameGraphBuilder;Lnet/minecraft/client/render/Frustum;Lnet/minecraft/client/render/Camera;Lorg/joml/Matrix4f;Lcom/mojang/blaze3d/buffers/GpuBufferSlice;ZZLnet/minecraft/client/render/RenderTickCounter;Lnet/minecraft/util/profiler/Profiler;)V")) - private void copyAfterSky(ObjectAllocator allocator, RenderTickCounter tickCounter, boolean renderBlockOutline, + @Inject( + method = "render", + at = @At( + value = "INVOKE_STRING", + target = "Lnet/minecraft/util/profiler/Profiler;swap(Ljava/lang/String;)V", + args = "ldc=clear", + shift = At.Shift.AFTER + ) + ) + private void setupSkyBuffer(RenderTickCounter tickCounter, boolean renderBlockOutline, Camera camera, + GameRenderer gameRenderer, LightmapTextureManager lightmapTextureManager, + Matrix4f matrix4f, Matrix4f matrix4f2, CallbackInfo ci) { + crystalline_sky$getSkyFramebuffer(); + } + + @Inject(method = "onResized", at = @At("RETURN")) + private void resizeSkyBuffer(int width, int height, CallbackInfo ci) { + if (crystalline_sky$skyBuffer != null) { + crystalline_sky$skyBuffer.resize(width, height, MinecraftClient.IS_SYSTEM_MAC); + } + } + + @Inject(method = "close", at = @At("RETURN")) + private void closeSkyBuffer(CallbackInfo ci) { + if (crystalline_sky$skyBuffer != null) { + crystalline_sky$skyBuffer.delete(); + crystalline_sky$skyBuffer = null; + } + } + + @Inject( + method = "render", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/render/WorldRenderer;renderSky(Lorg/joml/Matrix4f;Lorg/joml/Matrix4f;FLnet/minecraft/client/render/Camera;ZLjava/lang/Runnable;)V", + shift = At.Shift.AFTER + ) + ) + private void copyAfterSky(RenderTickCounter tickCounter, boolean renderBlockOutline, Camera camera, + GameRenderer gameRenderer, LightmapTextureManager lightmapTextureManager, + Matrix4f matrix4f, Matrix4f matrix4f2, CallbackInfo ci) { + var skyBuffer = crystalline_sky$getSkyFramebuffer(); + ((Framebuffer_Duck) skyBuffer).crystalline_sky$copyColorFrom(client.getFramebuffer()); + // TODO: render clouds + } + +/* @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;renderMain(Lnet/minecraft/client/render/FrameGraphBuilder;Lnet/minecraft/client/render/Frustum;Lnet/minecraft/client/render/Camera;Lorg/joml/Matrix4f;Lcom/mojang/blaze3d/buffers/GpuBufferSlice;ZZLnet/minecraft/client/render/RenderTickCounter;Lnet/minecraft/util/profiler/Profiler;)V")) + private void copyAfterSky2(ObjectAllocator allocator, RenderTickCounter tickCounter, boolean renderBlockOutline, Camera camera, Matrix4f positionMatrix, Matrix4f projectionMatrix, GpuBufferSlice fog, Vector4f fogColor, boolean shouldRenderSky, CallbackInfo ci, @Local FrameGraphBuilder frameGraphBuilder) { @@ -111,31 +145,20 @@ public abstract class WorldRendererMixin { } } } - } + }*/ - @Inject(method = "renderMain", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/FramePass;transfer(Lnet/minecraft/client/util/Handle;)Lnet/minecraft/client/util/Handle;", ordinal = 0)) - private void transferCrystallineSky(FrameGraphBuilder frameGraphBuilder, Frustum frustum, Camera camera, - Matrix4f positionMatrix, GpuBufferSlice fog, boolean renderBlockOutline, - boolean renderEntityOutline, RenderTickCounter tickCounter, Profiler profiler, - CallbackInfo ci, @Local FramePass framePass) { - crystalline_sky$transferSkyBuffer(framePass); - } - - // renderMain : framePass.setRenderer(@{() -> ...}); - @Inject( - method = "method_62214", + // after solid, cutoutMipped, and cutout + @WrapOperation( + method = "render", at = @At( value = "INVOKE", - target = "Lnet/minecraft/client/render/SectionRenderState;renderSection(Lnet/minecraft/client/render/BlockRenderLayerGroup;)V", - ordinal = 0, - shift = At.Shift.AFTER + target = "Lnet/minecraft/client/render/WorldRenderer;renderLayer(Lnet/minecraft/client/render/RenderLayer;DDDLorg/joml/Matrix4f;Lorg/joml/Matrix4f;)V", + ordinal = 2 ) ) - private void renderCrystallineSky(GpuBufferSlice fog, RenderTickCounter tickCounter, Camera camera, - Profiler profiler, Matrix4f positionMatrix, Handle itemEntityFramebuffer, - Handle entityOutlineFramebuffer, boolean renderBlockOutline, Frustum frustum, - Handle translucentFramebuffer, Handle mainFramebuffer, CallbackInfo ci, - @Local SectionRenderState sectionRenderState) { - sectionRenderState.renderSection(BlockRenderLayerGroupExt.CRYSTALLINE_SKY_SKY); + private void renderCrystallineSky(WorldRenderer instance, RenderLayer renderLayer, double x, double y, double z, + Matrix4f matrix4f, Matrix4f positionMatrix, Operation original) { + original.call(instance, renderLayer, x, y, z, matrix4f, positionMatrix); + renderLayer(CrystallineRenderLayers.SKY, x, y, z, matrix4f, positionMatrix); } } diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/WorldRenderer_NoSodium_Mixin.java b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/WorldRenderer_NoSodium_Mixin.java index 5e9a7d3..8d77f04 100644 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/WorldRenderer_NoSodium_Mixin.java +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/WorldRenderer_NoSodium_Mixin.java @@ -2,20 +2,19 @@ package io.github.slimeistdev.crystalline_sky.mixin.client; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import com.llamalad7.mixinextras.sugar.Local; +import com.mojang.blaze3d.systems.RenderSystem; import io.github.slimeistdev.crystalline_sky.annotation.mixin.ConditionalMixin; import io.github.slimeistdev.crystalline_sky.compat.Mods; -import io.github.slimeistdev.crystalline_sky.extenders_cove.BlockRenderLayerExt; import io.github.slimeistdev.crystalline_sky.registry.CrystallineItems; +import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderLayers; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gl.DynamicUniforms; -import net.minecraft.client.render.BlockRenderLayer; +import net.minecraft.client.gl.ShaderProgram; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexFormat; import net.minecraft.client.render.WorldRenderer; +import net.minecraft.client.util.Window; import net.minecraft.util.math.MathHelper; -import org.joml.Matrix4fc; -import org.joml.Vector3fc; -import org.joml.Vector4f; -import org.joml.Vector4fc; +import org.joml.Matrix4f; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -31,26 +30,29 @@ public class WorldRenderer_NoSodium_Mixin { @Shadow private int ticks; - @WrapOperation(method = "renderBlockLayers", at = @At(value = "NEW", target = "net/minecraft/client/gl/DynamicUniforms$UniformValue")) - private DynamicUniforms.UniformValue tintSkyBlocks(Matrix4fc modelView, Vector4fc colorModulator, - Vector3fc modelOffset, Matrix4fc textureMatrix, float lineWidth, - Operation original, - @Local BlockRenderLayer blockRenderLayer) { - if (blockRenderLayer == BlockRenderLayerExt.CRYSTALLINE_SKY_SKY + @WrapOperation(method = "renderLayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/ShaderProgram;initializeUniforms(Lnet/minecraft/client/render/VertexFormat$DrawMode;Lorg/joml/Matrix4f;Lorg/joml/Matrix4f;Lnet/minecraft/client/util/Window;)V")) + private void tintSkyBlocks(ShaderProgram instance, VertexFormat.DrawMode drawMode, Matrix4f viewMatrix, + Matrix4f projectionMatrix, Window window, Operation original, + RenderLayer renderLayer) { + original.call(instance, drawMode, viewMatrix, projectionMatrix, window); + + if (renderLayer == CrystallineRenderLayers.SKY + && instance.colorModulator != null && client.player != null && (client.player.getMainHandStack().isOf(CrystallineItems.SKY) || client.player.getOffHandStack().isOf(CrystallineItems.SKY) || client.player.getMainHandStack().isOf(CrystallineItems.WEEPING_SKY) || client.player.getOffHandStack().isOf(CrystallineItems.WEEPING_SKY))) { - float f = ticks + client.getRenderTickCounter().getTickProgress(true); + float f = ticks + client.getRenderTickCounter().getTickDelta(true); float alpha = (MathHelper.sin(f / 10.0f) + 1.0f) / 2.0f; // remap alpha from [0, 1] to [0, 0.75] float maxAlpha = 1.0f - 0.25f; alpha = alpha * maxAlpha; - colorModulator = new Vector4f(1.0f, 1.0f, 1.0f, alpha).mul(colorModulator); - } - return original.call(modelView, colorModulator, modelOffset, textureMatrix, lineWidth); + float[] colorModulator = RenderSystem.getShaderColor().clone(); + colorModulator[3] *= alpha; + instance.colorModulator.set(colorModulator); + } } } diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/compat/axiom/ChunkRenderOverrider_AxiomChunkOverrideLayerMixin.java b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/compat/axiom/ChunkRenderOverrider_AxiomChunkOverrideLayerMixin.java index 36f5030..cbcaf6f 100644 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/compat/axiom/ChunkRenderOverrider_AxiomChunkOverrideLayerMixin.java +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/compat/axiom/ChunkRenderOverrider_AxiomChunkOverrideLayerMixin.java @@ -3,8 +3,8 @@ package io.github.slimeistdev.crystalline_sky.mixin.client.compat.axiom; import com.moulberry.axiom.render.ChunkRenderOverrider; import io.github.slimeistdev.crystalline_sky.annotation.mixin.ConditionalMixin; import io.github.slimeistdev.crystalline_sky.compat.Mods; -import io.github.slimeistdev.crystalline_sky.extenders_cove.BlockRenderLayerExt; -import net.minecraft.client.render.BlockRenderLayer; +import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderLayers; +import net.minecraft.client.render.RenderLayer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -13,9 +13,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @ConditionalMixin(mods = Mods.AXIOM) @Mixin(ChunkRenderOverrider.AxiomChunkOverrideLayer.class) public class ChunkRenderOverrider_AxiomChunkOverrideLayerMixin { - @Inject(method = "fromVanilla", at = @At(value = "NEW", target = "()Ljava/lang/IncompatibleClassChangeError;"), cancellable = true) - private static void unexplodeSky(BlockRenderLayer layer, CallbackInfoReturnable cir) { - if (layer == BlockRenderLayerExt.CRYSTALLINE_SKY_SKY) { + @Inject(method = "fromVanilla", at = @At("HEAD"), cancellable = true) + private static void unexplodeSky(RenderLayer layer, CallbackInfoReturnable cir) { + if (layer == CrystallineRenderLayers.SKY) { cir.setReturnValue(ChunkRenderOverrider.AxiomChunkOverrideLayer.CUTOUT_MIPPED); } } diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/compat/sodium/DefaultMaterialsMixin.java b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/compat/sodium/DefaultMaterialsMixin.java index 9c8787b..cbb9883 100644 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/compat/sodium/DefaultMaterialsMixin.java +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/compat/sodium/DefaultMaterialsMixin.java @@ -1,13 +1,13 @@ package io.github.slimeistdev.crystalline_sky.mixin.client.compat.sodium; import io.github.slimeistdev.crystalline_sky.annotation.mixin.ConditionalMixin; -import io.github.slimeistdev.crystalline_sky.extenders_cove.BlockRenderLayerExt; import io.github.slimeistdev.crystalline_sky.compat.Mods; +import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderLayers; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.material.DefaultMaterials; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.material.Material; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.material.parameters.AlphaCutoffParameter; -import net.minecraft.client.render.BlockRenderLayer; +import net.minecraft.client.render.RenderLayer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -23,16 +23,16 @@ public class DefaultMaterialsMixin { @SuppressWarnings("OptionalGetWithoutIsPresent") private static final Material crystalline_sky$SKY = new Material( Arrays.stream(DefaultTerrainRenderPasses.ALL) - .filter(pass -> ((TerrainRenderPassAccessor) pass).crystalline_sky$getRenderLayer() == BlockRenderLayerExt.CRYSTALLINE_SKY_SKY) + .filter(pass -> ((TerrainRenderPassAccessor) pass).crystalline_sky$getRenderLayer() == CrystallineRenderLayers.SKY) .findFirst() .get(), AlphaCutoffParameter.ZERO, false ); - @Inject(method = "forChunkLayer", at = @At(value = "NEW", target = "(Ljava/lang/String;Ljava/lang/Throwable;)Ljava/lang/MatchException;"), cancellable = true) - private static void addCrystallineSkyMaterial(BlockRenderLayer layer, CallbackInfoReturnable cir) { - if (layer == BlockRenderLayerExt.CRYSTALLINE_SKY_SKY) { + @Inject(method = "forRenderLayer", at = @At(value = "NEW", target = "(Ljava/lang/String;)Ljava/lang/IllegalArgumentException;"), cancellable = true) + private static void addCrystallineSkyMaterial(RenderLayer layer, CallbackInfoReturnable cir) { + if (layer == CrystallineRenderLayers.SKY) { cir.setReturnValue(crystalline_sky$SKY); } } diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/compat/sodium/DefaultTerrainRenderPassesMixin.java b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/compat/sodium/DefaultTerrainRenderPassesMixin.java index 30229f4..64a4e9c 100644 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/compat/sodium/DefaultTerrainRenderPassesMixin.java +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/compat/sodium/DefaultTerrainRenderPassesMixin.java @@ -1,8 +1,8 @@ package io.github.slimeistdev.crystalline_sky.mixin.client.compat.sodium; import io.github.slimeistdev.crystalline_sky.annotation.mixin.ConditionalMixin; -import io.github.slimeistdev.crystalline_sky.extenders_cove.BlockRenderLayerExt; import io.github.slimeistdev.crystalline_sky.compat.Mods; +import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderLayers; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; import org.spongepowered.asm.mixin.Final; @@ -25,7 +25,7 @@ public class DefaultTerrainRenderPassesMixin { private static void addCrystallineSkyPass(CallbackInfo ci) { var ALL$ = new TerrainRenderPass[ALL.length + 1]; System.arraycopy(ALL, 0, ALL$, 0, ALL.length); - ALL$[ALL.length] = new TerrainRenderPass(BlockRenderLayerExt.CRYSTALLINE_SKY_SKY, false, true); + ALL$[ALL.length] = new TerrainRenderPass(CrystallineRenderLayers.SKY, false, true); ALL = ALL$; } } diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/compat/sodium/ShaderChunkRendererMixin.java b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/compat/sodium/ShaderChunkRendererMixin.java index 3164046..8c4d43c 100644 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/compat/sodium/ShaderChunkRendererMixin.java +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/compat/sodium/ShaderChunkRendererMixin.java @@ -5,7 +5,7 @@ import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import io.github.slimeistdev.crystalline_sky.annotation.mixin.ConditionalMixin; import io.github.slimeistdev.crystalline_sky.compat.Mods; import io.github.slimeistdev.crystalline_sky.compat.sodium.SkyShaderInterface; -import io.github.slimeistdev.crystalline_sky.extenders_cove.BlockRenderLayerExt; +import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderLayers; import net.caffeinemc.mods.sodium.client.gl.shader.GlProgram; import net.caffeinemc.mods.sodium.client.render.chunk.ShaderChunkRenderer; import net.caffeinemc.mods.sodium.client.render.chunk.shader.ChunkShaderInterface; @@ -23,7 +23,7 @@ import java.util.function.Function; public class ShaderChunkRendererMixin { @WrapOperation(method = "compileProgram", at = @At(value = "INVOKE", target = "Lnet/caffeinemc/mods/sodium/client/render/chunk/ShaderChunkRenderer;createShader(Ljava/lang/String;Lnet/caffeinemc/mods/sodium/client/render/chunk/shader/ChunkShaderOptions;)Lnet/caffeinemc/mods/sodium/client/gl/shader/GlProgram;"), remap = false) private GlProgram createSkyShader(ShaderChunkRenderer instance, String path, ChunkShaderOptions options, Operation> original) { - if (options.pass() == DefaultMaterials.forChunkLayer(BlockRenderLayerExt.CRYSTALLINE_SKY_SKY).pass) { + if (options.pass() == DefaultMaterials.forRenderLayer(CrystallineRenderLayers.SKY).pass) { return original.call(instance, "sodium_compat/block_layer_sky", options); } diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/compat/sodium/SodiumWorldRendererMixin.java b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/compat/sodium/SodiumWorldRendererMixin.java index dc5f2ff..94a9982 100644 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/compat/sodium/SodiumWorldRendererMixin.java +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/compat/sodium/SodiumWorldRendererMixin.java @@ -1,14 +1,13 @@ package io.github.slimeistdev.crystalline_sky.mixin.client.compat.sodium; import io.github.slimeistdev.crystalline_sky.annotation.mixin.ConditionalMixin; -import io.github.slimeistdev.crystalline_sky.extenders_cove.BlockRenderLayerExt; -import io.github.slimeistdev.crystalline_sky.extenders_cove.BlockRenderLayerGroupExt; import io.github.slimeistdev.crystalline_sky.compat.Mods; +import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderLayers; import net.caffeinemc.mods.sodium.client.render.SodiumWorldRenderer; import net.caffeinemc.mods.sodium.client.render.chunk.ChunkRenderMatrices; import net.caffeinemc.mods.sodium.client.render.chunk.RenderSectionManager; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.material.DefaultMaterials; -import net.minecraft.client.render.BlockRenderLayerGroup; +import net.minecraft.client.render.RenderLayer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -22,9 +21,9 @@ public class SodiumWorldRendererMixin { private RenderSectionManager renderSectionManager; @Inject(method = "drawChunkLayer", at = @At("RETURN")) - private void drawCrystallineLayer(BlockRenderLayerGroup group, ChunkRenderMatrices matrices, double x, double y, double z, CallbackInfo ci) { - if (group != BlockRenderLayerGroupExt.CRYSTALLINE_SKY_SKY) return; + private void drawCrystallineLayer(RenderLayer renderLayer, ChunkRenderMatrices matrices, double x, double y, double z, CallbackInfo ci) { + if (renderLayer != CrystallineRenderLayers.SKY) return; - renderSectionManager.renderLayer(matrices, DefaultMaterials.forChunkLayer(BlockRenderLayerExt.CRYSTALLINE_SKY_SKY).pass, x, y, z); + renderSectionManager.renderLayer(matrices, DefaultMaterials.forRenderLayer(CrystallineRenderLayers.SKY).pass, x, y, z); } } diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/compat/sodium/TerrainRenderPassAccessor.java b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/compat/sodium/TerrainRenderPassAccessor.java index 4c3f9a6..a697e1b 100644 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/compat/sodium/TerrainRenderPassAccessor.java +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/compat/sodium/TerrainRenderPassAccessor.java @@ -3,7 +3,7 @@ package io.github.slimeistdev.crystalline_sky.mixin.client.compat.sodium; import io.github.slimeistdev.crystalline_sky.annotation.mixin.ConditionalMixin; import io.github.slimeistdev.crystalline_sky.compat.Mods; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; -import net.minecraft.client.render.BlockRenderLayer; +import net.minecraft.client.render.RenderLayer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; @@ -11,5 +11,5 @@ import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(TerrainRenderPass.class) public interface TerrainRenderPassAccessor { @Accessor("renderType") - BlockRenderLayer crystalline_sky$getRenderLayer(); + RenderLayer crystalline_sky$getRenderLayer(); } diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin_ducks/client/DefaultFramebufferSet_Duck.java b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin_ducks/client/DefaultFramebufferSet_Duck.java deleted file mode 100644 index bc7dabd..0000000 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin_ducks/client/DefaultFramebufferSet_Duck.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.github.slimeistdev.crystalline_sky.mixin_ducks.client; - -import io.github.slimeistdev.crystalline_sky.CrystallineSky; -import net.minecraft.client.gl.Framebuffer; -import net.minecraft.client.util.Handle; -import net.minecraft.util.Identifier; - -public interface DefaultFramebufferSet_Duck { - Identifier crystalline_sky$SKY_FRAMEBUFFER = CrystallineSky.id("sky"); - - Handle crystalline_sky$getSkyFramebuffer(); - void crystalline_sky$setSkyFramebuffer(Handle framebuffer); -} diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin_ducks/client/WorldRenderer_Duck.java b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin_ducks/client/WorldRenderer_Duck.java new file mode 100644 index 0000000..0ed72cb --- /dev/null +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin_ducks/client/WorldRenderer_Duck.java @@ -0,0 +1,7 @@ +package io.github.slimeistdev.crystalline_sky.mixin_ducks.client; + +import net.minecraft.client.gl.Framebuffer; + +public interface WorldRenderer_Duck { + Framebuffer crystalline_sky$getSkyFramebuffer(); +} diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/registry/CrystallineBlocks.java b/src/main/java/io/github/slimeistdev/crystalline_sky/registry/CrystallineBlocks.java index da9b157..4cbea24 100644 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/registry/CrystallineBlocks.java +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/registry/CrystallineBlocks.java @@ -54,7 +54,7 @@ public class CrystallineBlocks { private static T register(String id, Function factory, Settings settings) { RegistryKey key = CrystallineSky.key(RegistryKeys.BLOCK, id); - return Registry.register(Registries.BLOCK, key, factory.apply(settings.registryKey(key))); + return Registry.register(Registries.BLOCK, key, factory.apply(settings)); } public static boolean isCrystallineSky(BlockState state) { diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/registry/CrystallineDataComponentTypes.java b/src/main/java/io/github/slimeistdev/crystalline_sky/registry/CrystallineDataComponentTypes.java index 8188a04..2f3d3eb 100644 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/registry/CrystallineDataComponentTypes.java +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/registry/CrystallineDataComponentTypes.java @@ -2,6 +2,7 @@ package io.github.slimeistdev.crystalline_sky.registry; import io.github.slimeistdev.crystalline_sky.CrystallineSky; import net.minecraft.component.ComponentType; +import net.minecraft.network.codec.PacketCodec; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; import net.minecraft.util.Unit; @@ -12,7 +13,7 @@ public class CrystallineDataComponentTypes { public static final ComponentType WEEPING_SKY_DEBUG_COLUMN_TOOL = register( "weeping_sky_debug_column_tool", b -> b - .packetCodec(Unit.PACKET_CODEC) + .packetCodec(PacketCodec.unit(Unit.INSTANCE)) .codec(Unit.CODEC) ); diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/registry/CrystallineItems.java b/src/main/java/io/github/slimeistdev/crystalline_sky/registry/CrystallineItems.java index 8b4d24c..70ad8cd 100644 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/registry/CrystallineItems.java +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/registry/CrystallineItems.java @@ -3,14 +3,20 @@ package io.github.slimeistdev.crystalline_sky.registry; import io.github.slimeistdev.crystalline_sky.content.blocks.SkyLightBlock; import io.github.slimeistdev.crystalline_sky.content.items.WeepingSkyBlockItem; import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents; +import net.minecraft.block.Block; import net.minecraft.block.LightBlock; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.BlockStateComponent; -import net.minecraft.item.*; +import net.minecraft.item.BlockItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemGroups; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.util.Rarity; import java.util.ArrayList; import java.util.List; +import java.util.function.BiFunction; public class CrystallineItems { public static final Item SKY = Items.register( @@ -18,7 +24,7 @@ public class CrystallineItems { settings -> settings.rarity(Rarity.EPIC) ); - public static final Item WEEPING_SKY = Items.register( + public static final Item WEEPING_SKY = register( CrystallineBlocks.WEEPING_SKY, (block, settings) -> new WeepingSkyBlockItem(block, settings.rarity(Rarity.EPIC)) ); @@ -34,6 +40,11 @@ public class CrystallineItems { settings -> settings.rarity(Rarity.EPIC) ); + @SuppressWarnings("SameParameterValue") + private static Item register(Block block, BiFunction factory) { + return Items.register(factory.apply(block, new Item.Settings())); + } + public static void init() { ItemGroupEvents.modifyEntriesEvent(ItemGroups.OPERATOR).register(entries -> { if (!entries.getContext().hasPermissions()) return; diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/registry/client/CrystallineRenderLayers.java b/src/main/java/io/github/slimeistdev/crystalline_sky/registry/client/CrystallineRenderLayers.java new file mode 100644 index 0000000..dfe54d7 --- /dev/null +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/registry/client/CrystallineRenderLayers.java @@ -0,0 +1,44 @@ +package io.github.slimeistdev.crystalline_sky.registry.client; + +import com.mojang.blaze3d.systems.RenderSystem; +import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.WorldRenderer_Duck; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.RenderPhase; +import net.minecraft.client.render.VertexFormat; +import net.minecraft.client.render.VertexFormats; + +import static net.minecraft.client.render.RenderLayer.of; +import static net.minecraft.client.render.RenderPhase.ENABLE_LIGHTMAP; + +@Environment(EnvType.CLIENT) +public class CrystallineRenderLayers { + private static final RenderPhase.TextureBase SKY_TEXTURE = new SkyBufferTexture(); + private static final RenderPhase.ShaderProgram SKY_PROGRAM = new RenderPhase.ShaderProgram(CrystallineShaderPrograms::getRenderTypeSkyProgram); + + public static final RenderLayer SKY = of( + "crystalline_sky_sky", + VertexFormats.POSITION_COLOR_TEXTURE_LIGHT_NORMAL, + VertexFormat.DrawMode.QUADS, + 4194304, + true, + false, + RenderLayer.MultiPhaseParameters.builder() + .lightmap(ENABLE_LIGHTMAP) + .program(SKY_PROGRAM) + .texture(SKY_TEXTURE) + .build(true) + ); + + private static class SkyBufferTexture extends RenderPhase.TextureBase { + public SkyBufferTexture() { + super(() -> { + MinecraftClient mc = MinecraftClient.getInstance(); + var fb = ((WorldRenderer_Duck) mc.worldRenderer).crystalline_sky$getSkyFramebuffer(); + RenderSystem.setShaderTexture(0, fb.getColorAttachment()); + }, () -> {}); + } + } +} diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/registry/client/CrystallineRenderPipelines.java b/src/main/java/io/github/slimeistdev/crystalline_sky/registry/client/CrystallineRenderPipelines.java deleted file mode 100644 index 7d61671..0000000 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/registry/client/CrystallineRenderPipelines.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.github.slimeistdev.crystalline_sky.registry.client; - -import com.mojang.blaze3d.pipeline.RenderPipeline; -import io.github.slimeistdev.crystalline_sky.CrystallineSky; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.gl.RenderPipelines; - -@Environment(EnvType.CLIENT) -public class CrystallineRenderPipelines { - public static final RenderPipeline SKY_PIPELINE = RenderPipelines.register( - RenderPipeline.builder(RenderPipelines.TERRAIN_SNIPPET) - .withFragmentShader(CrystallineSky.id("core/terrain_sky")) - .withVertexShader(CrystallineSky.id("core/terrain_sky")) - .withLocation(CrystallineSky.id("pipeline/sky")) - .withShaderDefine("BAYER_BIAS", 0.03125f) - .build() - ); -} diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/registry/client/CrystallineShaderPrograms.java b/src/main/java/io/github/slimeistdev/crystalline_sky/registry/client/CrystallineShaderPrograms.java new file mode 100644 index 0000000..17c7b63 --- /dev/null +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/registry/client/CrystallineShaderPrograms.java @@ -0,0 +1,14 @@ +package io.github.slimeistdev.crystalline_sky.registry.client; + +import net.minecraft.client.gl.ShaderProgram; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; + +public class CrystallineShaderPrograms { + @ApiStatus.Internal + public static @Nullable ShaderProgram renderTypeSkyProgram; + + public static @Nullable ShaderProgram getRenderTypeSkyProgram() { + return renderTypeSkyProgram; + } +} diff --git a/src/main/resources/crystalline_sky.mixins.json b/src/main/resources/crystalline_sky.mixins.json index 87e2ba0..7642747 100644 --- a/src/main/resources/crystalline_sky.mixins.json +++ b/src/main/resources/crystalline_sky.mixins.json @@ -15,13 +15,12 @@ "SkyLightStorageAccessor" ], "client": [ - "client.BlockRenderLayerMixin", "client.ClientWorldMixin", "client.DebugRendererMixin", - "client.DefaultFramebufferSetMixin", "client.FramebufferMixin", + "client.GameRendererMixin", + "client.RenderLayerMixin", "client.WorldRenderer_NoSodium_Mixin", - "client.WorldRendererAccessor", "client.WorldRendererMixin", "client.compat.axiom.ChunkRenderOverrider_AxiomChunkOverrideLayerMixin", "client.compat.sodium.DefaultMaterialsMixin", diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index cc22e16..e4da7c8 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -36,9 +36,6 @@ ], "fabric-datagen": [ "io.github.slimeistdev.crystalline_sky.datagen.CrystallineSkyDataGenerator" - ], - "mm:early_risers": [ - "io.github.slimeistdev.crystalline_sky.extenders_cove.CrystallineSkyEarlyRiser" ] } }