diff --git a/common/src/generated/resources/.cache/5790708f1bab3bc9da26dbe9791dce16c55e0cb8 b/common/src/generated/resources/.cache/5790708f1bab3bc9da26dbe9791dce16c55e0cb8 index cd66db7..6dd05b8 100644 --- a/common/src/generated/resources/.cache/5790708f1bab3bc9da26dbe9791dce16c55e0cb8 +++ b/common/src/generated/resources/.cache/5790708f1bab3bc9da26dbe9791dce16c55e0cb8 @@ -1,4 +1,4 @@ -// 1.21.1 2026-05-12T13:54:12.566569819 Crystalline Sky/Model Definitions +// 1.21.1 2026-05-13T16:34:33.411335499 Crystalline Sky/Model Definitions e832366c216102270b75085db7a7169881b853b3 assets/crystalline_sky/blockstates/sky.json 0ac5351c3a01e0f9e76517452918e12770b3b54b assets/crystalline_sky/models/block/sky_light_14.json ee9cb7604922cdb2ad71d021a593ca82f0baf493 assets/crystalline_sky/models/block/sky_light_03.json @@ -13,10 +13,10 @@ ef9e5aca345b59cb4692a7bcfaac539aed6f6889 assets/crystalline_sky/models/block/sky ef5afdbcc8401a27029b6f0a29fa1117761c620d assets/crystalline_sky/models/item/sky_light.json 59463cef438e58b137e5ce27402acf42a3a0ae87 assets/crystalline_sky/models/block/sky_light_02.json 2763952a1919802e34f0976b023fc7b486456b91 assets/crystalline_sky/models/item/skybox_test.json -e3a94ee688f28874452b8862359916adfdcf223e assets/crystalline_sky/models/block/skybox_test.json +1507d8530a97e5c3fb562b224acdce3d5551522e assets/crystalline_sky/models/block/skybox_test.json c0d693e4f78ce15c238909130382909abda4c922 assets/crystalline_sky/models/block/sky_light_08.json -508ffb97ee711b53767b9d33659596197f69ee20 assets/crystalline_sky/models/block/weeping_sky_light.json 008a0d0a76a34d8f375fa355452a5d0f93f9af3b assets/crystalline_sky/models/item/sky.json +508ffb97ee711b53767b9d33659596197f69ee20 assets/crystalline_sky/models/block/weeping_sky_light.json 9b3d01168a1cc29b99cf69fe225ad69b0923c9fe assets/crystalline_sky/blockstates/weeping_sky_light.json 9c6ba4d90f2c4f2a9beb910c1b32023e49445749 assets/crystalline_sky/models/block/sky_light_10.json 9c6c61b7f805a614d2d15d8dde390ed068913182 assets/crystalline_sky/models/item/sky_light_10.json @@ -33,8 +33,8 @@ fceb0c59b7f6d431200764ccf87596541bacb17f assets/crystalline_sky/models/block/sky e2c7bebd9eca446bb06fff866ec4d4996917e7e4 assets/crystalline_sky/models/block/sky_light_12.json 04f1e4eba184b8e7b1669fc61006e3d00e09d164 assets/crystalline_sky/models/item/sky_light_11.json 58349dc5dedb8016fb0bc958fcd4a9ccde13a1cd assets/crystalline_sky/models/item/sky_light_14.json -03e2eb768bc34fbeaabffbff8ed3a2a3044a6db1 assets/crystalline_sky/blockstates/weeping_sky.json 51fa40ff02afcec303e7a18478cbae5375dfb140 assets/crystalline_sky/models/item/sky_light_04.json +03e2eb768bc34fbeaabffbff8ed3a2a3044a6db1 assets/crystalline_sky/blockstates/weeping_sky.json 7c7d944714b5bcbee6a7e8014599ade8fbc5e804 assets/crystalline_sky/models/block/weeping_sky.json dff33a68a694de0f3ef177886c002204ffe49a8c assets/crystalline_sky/models/item/sky_light_07.json b29c14f77a08da7a6994cff4c6801d6f04b12ec0 assets/crystalline_sky/models/item/sky_light_03.json diff --git a/common/src/generated/resources/.cache/6c343772b5bbed02cb8017d08d07aa1ea684e455 b/common/src/generated/resources/.cache/6c343772b5bbed02cb8017d08d07aa1ea684e455 index 9289a55..6d56209 100644 --- a/common/src/generated/resources/.cache/6c343772b5bbed02cb8017d08d07aa1ea684e455 +++ b/common/src/generated/resources/.cache/6c343772b5bbed02cb8017d08d07aa1ea684e455 @@ -1,4 +1,4 @@ -// 1.21.1 2026-05-12T13:54:12.565540347 Crystalline Sky/Tags for minecraft:block +// 1.21.1 2026-05-13T16:34:33.410598157 Crystalline Sky/Tags for minecraft:block 1f45861c594d9441dfe16f1c8b41a9f0013278ed data/crystalline_sky/tags/block/rendering/cubemap.json 1389c0b812f7a6e4d5dd00edac1dc07beb5f9552 data/crystalline_sky/tags/block/sky_light_emitters.json 606477607a09045ff2830cbc036e744d6a728bbd data/minecraft/tags/block/crystal_sound_blocks.json diff --git a/common/src/generated/resources/.cache/dcc41341364508cf6e5f757a3f66d54c126e2c9d b/common/src/generated/resources/.cache/dcc41341364508cf6e5f757a3f66d54c126e2c9d index 5d5b97b..d7cf108 100644 --- a/common/src/generated/resources/.cache/dcc41341364508cf6e5f757a3f66d54c126e2c9d +++ b/common/src/generated/resources/.cache/dcc41341364508cf6e5f757a3f66d54c126e2c9d @@ -1,3 +1,3 @@ -// 1.21.1 2026-05-12T13:54:12.567411292 Crystalline Sky/Block Loot Tables +// 1.21.1 2026-05-13T16:34:33.411998073 Crystalline Sky/Block Loot Tables 337de0acfc1b9b86adde0705e342ed1d4b5c9c4e data/crystalline_sky/loot_table/blocks/weeping_sky.json 6a9b7a08424cbd3d699dfd3252d432517254aa45 data/crystalline_sky/loot_table/blocks/sky.json diff --git a/common/src/generated/resources/assets/crystalline_sky/models/block/skybox_test.json b/common/src/generated/resources/assets/crystalline_sky/models/block/skybox_test.json index f17cad6..edd4f85 100644 --- a/common/src/generated/resources/assets/crystalline_sky/models/block/skybox_test.json +++ b/common/src/generated/resources/assets/crystalline_sky/models/block/skybox_test.json @@ -1,6 +1,7 @@ { "parent": "minecraft:block/cube_all", "crystalline_sky:atlas": "crystalline_sky:textures/atlas/skyboxes.png", + "loader": "crystalline_sky:skybox", "render_type": "crystalline_sky:skybox", "textures": { "all": "crystalline_sky:crystalline_sky_skybox/skybox_test", diff --git a/common/src/main/java/io/github/slimeistdev/crystalline_sky/compat/iris/IrisHelpers.java b/common/src/main/java/io/github/slimeistdev/crystalline_sky/compat/iris/IrisHelpers.java new file mode 100644 index 0000000..269c461 --- /dev/null +++ b/common/src/main/java/io/github/slimeistdev/crystalline_sky/compat/iris/IrisHelpers.java @@ -0,0 +1,30 @@ +package io.github.slimeistdev.crystalline_sky.compat.iris; + +import com.mojang.blaze3d.pipeline.RenderTarget; +import io.github.slimeistdev.crystalline_sky.mixin.client.compat.iris.IrisRenderingPipelineAccessor; +import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.IrisRenderingPipeline_Duck; +import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.RenderTarget_Duck; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.irisshaders.iris.Iris; +import net.irisshaders.iris.pipeline.IrisRenderingPipeline; +import net.irisshaders.iris.targets.RenderTargets; + +@Environment(EnvType.CLIENT) +public class IrisHelpers { + public static boolean copySkyToBuffer(RenderTarget skyBuffer) { + var pipeline = Iris.getPipelineManager().getPipelineNullable(); + if (!(pipeline instanceof IrisRenderingPipeline irisPipeline)) return false; + + IrisRenderingPipelineAccessor pipelineAccessor = ((IrisRenderingPipelineAccessor) irisPipeline); + RenderTargets targets = pipelineAccessor.crystalline_sky$getRenderTargets(); + var defaultTarget = targets.get(pipelineAccessor.crystalline_sky$getPackDirectives().getFallbackTex()); + ((RenderTarget_Duck) skyBuffer).crystalline_sky$copyColorFrom( + ((IrisRenderingPipeline_Duck) irisPipeline)::crystalline_sky$bindDefaultForRead, + irisPipeline::bindDefault, + defaultTarget.getWidth(), defaultTarget.getHeight() + ); + + return true; + } +} diff --git a/common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/BlockModelDeserializerMixin.java b/common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/BlockModelDeserializerMixin.java index d05b790..36d90a1 100644 --- a/common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/BlockModelDeserializerMixin.java +++ b/common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/BlockModelDeserializerMixin.java @@ -6,18 +6,12 @@ import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.llamalad7.mixinextras.sugar.Local; import com.mojang.datafixers.util.Either; -import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.BlockModel_Duck; -import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineAtlases; -import net.minecraft.client.renderer.block.model.BlockElement; import net.minecraft.client.renderer.block.model.BlockModel; -import net.minecraft.client.renderer.block.model.ItemOverride; -import net.minecraft.client.renderer.block.model.ItemTransforms; import net.minecraft.client.resources.model.Material; import net.minecraft.resources.ResourceLocation; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import java.util.List; import java.util.Map; @Mixin(BlockModel.Deserializer.class) @@ -32,19 +26,4 @@ public class BlockModelDeserializerMixin { return original.call(location, name); } - - @WrapOperation(method = "deserialize(Lcom/google/gson/JsonElement;Ljava/lang/reflect/Type;Lcom/google/gson/JsonDeserializationContext;)Lnet/minecraft/client/renderer/block/model/BlockModel;", at = @At(value = "NEW", target = "(Lnet/minecraft/resources/ResourceLocation;Ljava/util/List;Ljava/util/Map;Ljava/lang/Boolean;Lnet/minecraft/client/renderer/block/model/BlockModel$GuiLight;Lnet/minecraft/client/renderer/block/model/ItemTransforms;Ljava/util/List;)Lnet/minecraft/client/renderer/block/model/BlockModel;")) - private BlockModel markSkybox(ResourceLocation parentLocation, List elements, - Map> textureMap, Boolean hasAmbientOcclusion, - BlockModel.GuiLight guiLight, ItemTransforms transforms, List overrides, - Operation original, JsonElement json) { - BlockModel model = original.call(parentLocation, elements, textureMap, hasAmbientOcclusion, guiLight, transforms, overrides); - JsonObject jsonObject = json.getAsJsonObject(); - if (jsonObject.has("crystalline_sky:atlas") && - ResourceLocation.parse(jsonObject.get("crystalline_sky:atlas").getAsString()) - .equals(CrystallineAtlases.SKYBOXES.texture)) { - ((BlockModel_Duck) model).crystalline_sky$setSkybox(); - } - return model; - } } diff --git a/common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/LevelRendererMixin.java b/common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/LevelRendererMixin.java index 274910e..dbead1f 100644 --- a/common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/LevelRendererMixin.java +++ b/common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/LevelRendererMixin.java @@ -6,15 +6,11 @@ import com.mojang.blaze3d.pipeline.RenderTarget; import com.mojang.blaze3d.pipeline.TextureTarget; import com.mojang.blaze3d.vertex.PoseStack; import io.github.slimeistdev.crystalline_sky.compat.Mods; -import io.github.slimeistdev.crystalline_sky.mixin.client.compat.iris.IrisRenderingPipelineAccessor; -import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.IrisRenderingPipeline_Duck; +import io.github.slimeistdev.crystalline_sky.compat.iris.IrisHelpers; import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.LevelRenderer_Duck; import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.RenderTarget_Duck; import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderTypes; import io.github.slimeistdev.crystalline_sky.util.SharedRenderVariables; -import net.irisshaders.iris.Iris; -import net.irisshaders.iris.pipeline.IrisRenderingPipeline; -import net.irisshaders.iris.targets.RenderTargets; import net.minecraft.client.Camera; import net.minecraft.client.CloudStatus; import net.minecraft.client.DeltaTracker; @@ -108,21 +104,7 @@ public abstract class LevelRendererMixin implements LevelRenderer_Duck { Matrix4f matrix4f, Matrix4f matrix4f2, CallbackInfo ci) { var skyBuffer = crystalline_sky$getSkyFramebuffer(); skyBuffer.clear(Minecraft.ON_OSX); - var copiedFromIris = Mods.IRIS.runIfInstalled(() -> () -> { - var pipeline = Iris.getPipelineManager().getPipelineNullable(); - if (!(pipeline instanceof IrisRenderingPipeline irisPipeline)) return false; - - IrisRenderingPipelineAccessor pipelineAccessor = ((IrisRenderingPipelineAccessor) irisPipeline); - RenderTargets targets = pipelineAccessor.crystalline_sky$getRenderTargets(); - var defaultTarget = targets.get(pipelineAccessor.crystalline_sky$getPackDirectives().getFallbackTex()); - ((RenderTarget_Duck) skyBuffer).crystalline_sky$copyColorFrom( - ((IrisRenderingPipeline_Duck) irisPipeline)::crystalline_sky$bindDefaultForRead, - irisPipeline::bindDefault, - defaultTarget.getWidth(), defaultTarget.getHeight() - ); - - return true; - }); + var copiedFromIris = Mods.IRIS.runIfInstalled(() -> () -> IrisHelpers.copySkyToBuffer(skyBuffer)); if (!copiedFromIris.orElse(false)) ((RenderTarget_Duck) skyBuffer).crystalline_sky$copyColorFrom(minecraft.getMainRenderTarget()); diff --git a/common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/ModelBlockRendererMixin.java b/common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/ModelBlockRendererMixin.java index c3992bd..7f3edce 100644 --- a/common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/ModelBlockRendererMixin.java +++ b/common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/ModelBlockRendererMixin.java @@ -13,9 +13,10 @@ import org.spongepowered.asm.mixin.injection.At; @Mixin(ModelBlockRenderer.class) public class ModelBlockRendererMixin { + // lucky us: fabric calls it bakedQuad, neoforge bakedquad @WrapOperation(method = "renderModelFaceFlat", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/BlockAndTintGetter;getShade(Lnet/minecraft/core/Direction;Z)F")) private float fullBrightSkybox(BlockAndTintGetter instance, Direction direction, boolean shade, - Operation original, @Local(name = "bakedQuad") BakedQuad bakedQuad) { + Operation original, @Local(name = {"bakedQuad", "bakedquad"}) BakedQuad bakedQuad) { if (bakedQuad.getSprite().atlasLocation().equals(CrystallineAtlases.SKYBOXES.texture)) return 1.0f; return original.call(instance, direction, shade); diff --git a/common/src/main/resources/crystalline_sky-common.mixins.json b/common/src/main/resources/crystalline_sky-common.mixins.json index d2bdd40..52a8396 100644 --- a/common/src/main/resources/crystalline_sky-common.mixins.json +++ b/common/src/main/resources/crystalline_sky-common.mixins.json @@ -17,7 +17,6 @@ ], "client": [ "client.BlockModelDeserializerMixin", - "client.BlockModelMixin", "client.ClientLevelMixin", "client.DebugRendererMixin", "client.GameRendererMixin", @@ -25,7 +24,6 @@ "client.LevelRendererMixin", "client.ModelBlockRendererMixin", "client.RenderTargetMixin", - "client.SimpleBakedModelMixin", "client.compat.iris.ExtendedShaderMixin", "client.compat.iris.IrisRenderingPipelineAccessor", "client.compat.iris.IrisRenderingPipelineMixin", diff --git a/fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/datagen/providers/CrystallineSkyModelProvider.java b/fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/datagen/providers/CrystallineSkyModelProvider.java index 0f93ae5..9dd3203 100644 --- a/fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/datagen/providers/CrystallineSkyModelProvider.java +++ b/fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/datagen/providers/CrystallineSkyModelProvider.java @@ -89,6 +89,7 @@ public class CrystallineSkyModelProvider extends FabricModelProvider { JsonObject root = json.get().getAsJsonObject(); root.addProperty("render_type", CrystallineSky.id("skybox").toString()); root.addProperty(CrystallineSky.id("atlas").toString(), CrystallineAtlases.SKYBOXES.texture.toString()); + root.addProperty("loader", CrystallineSky.id("skybox").toString()); return root; }); } diff --git a/fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/mixin/client/BlockModelDeserializerMixin.java b/fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/mixin/client/BlockModelDeserializerMixin.java new file mode 100644 index 0000000..b654a02 --- /dev/null +++ b/fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/mixin/client/BlockModelDeserializerMixin.java @@ -0,0 +1,38 @@ +package io.github.slimeistdev.crystalline_sky.fabric.mixin.client; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.mojang.datafixers.util.Either; +import io.github.slimeistdev.crystalline_sky.fabric.mixin_ducks.client.BlockModel_Duck; +import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineAtlases; +import net.minecraft.client.renderer.block.model.BlockElement; +import net.minecraft.client.renderer.block.model.BlockModel; +import net.minecraft.client.renderer.block.model.ItemOverride; +import net.minecraft.client.renderer.block.model.ItemTransforms; +import net.minecraft.client.resources.model.Material; +import net.minecraft.resources.ResourceLocation; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import java.util.List; +import java.util.Map; + +@Mixin(BlockModel.Deserializer.class) +public class BlockModelDeserializerMixin { + @WrapOperation(method = "deserialize(Lcom/google/gson/JsonElement;Ljava/lang/reflect/Type;Lcom/google/gson/JsonDeserializationContext;)Lnet/minecraft/client/renderer/block/model/BlockModel;", at = @At(value = "NEW", target = "(Lnet/minecraft/resources/ResourceLocation;Ljava/util/List;Ljava/util/Map;Ljava/lang/Boolean;Lnet/minecraft/client/renderer/block/model/BlockModel$GuiLight;Lnet/minecraft/client/renderer/block/model/ItemTransforms;Ljava/util/List;)Lnet/minecraft/client/renderer/block/model/BlockModel;")) + private BlockModel markSkybox(ResourceLocation parentLocation, List elements, + Map> textureMap, Boolean hasAmbientOcclusion, + BlockModel.GuiLight guiLight, ItemTransforms transforms, List overrides, + Operation original, JsonElement json) { + BlockModel model = original.call(parentLocation, elements, textureMap, hasAmbientOcclusion, guiLight, transforms, overrides); + JsonObject jsonObject = json.getAsJsonObject(); + if (jsonObject.has("crystalline_sky:atlas") && + ResourceLocation.parse(jsonObject.get("crystalline_sky:atlas").getAsString()) + .equals(CrystallineAtlases.SKYBOXES.texture)) { + ((BlockModel_Duck) model).crystalline_sky$setSkybox(); + } + return model; + } +} diff --git a/common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/BlockModelMixin.java b/fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/mixin/client/BlockModelMixin.java similarity index 85% rename from common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/BlockModelMixin.java rename to fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/mixin/client/BlockModelMixin.java index 20ac4cc..46ec502 100644 --- a/common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/BlockModelMixin.java +++ b/fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/mixin/client/BlockModelMixin.java @@ -1,9 +1,9 @@ -package io.github.slimeistdev.crystalline_sky.mixin.client; +package io.github.slimeistdev.crystalline_sky.fabric.mixin.client; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.BlockModel_Duck; -import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.SimpleBakedModel_Duck; +import io.github.slimeistdev.crystalline_sky.fabric.mixin_ducks.client.BlockModel_Duck; +import io.github.slimeistdev.crystalline_sky.fabric.mixin_ducks.client.SimpleBakedModel_Duck; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.SimpleBakedModel; diff --git a/common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/SimpleBakedModelMixin.java b/fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/mixin/client/SimpleBakedModelMixin.java similarity index 75% rename from common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/SimpleBakedModelMixin.java rename to fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/mixin/client/SimpleBakedModelMixin.java index f81759f..edfde8b 100644 --- a/common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/SimpleBakedModelMixin.java +++ b/fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/mixin/client/SimpleBakedModelMixin.java @@ -1,6 +1,6 @@ -package io.github.slimeistdev.crystalline_sky.mixin.client; +package io.github.slimeistdev.crystalline_sky.fabric.mixin.client; -import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.SimpleBakedModel_Duck; +import io.github.slimeistdev.crystalline_sky.fabric.mixin_ducks.client.SimpleBakedModel_Duck; import net.minecraft.client.resources.model.SimpleBakedModel; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; diff --git a/common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin_ducks/client/BlockModel_Duck.java b/fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/mixin_ducks/client/BlockModel_Duck.java similarity index 60% rename from common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin_ducks/client/BlockModel_Duck.java rename to fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/mixin_ducks/client/BlockModel_Duck.java index 32cc159..24c92e3 100644 --- a/common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin_ducks/client/BlockModel_Duck.java +++ b/fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/mixin_ducks/client/BlockModel_Duck.java @@ -1,4 +1,4 @@ -package io.github.slimeistdev.crystalline_sky.mixin_ducks.client; +package io.github.slimeistdev.crystalline_sky.fabric.mixin_ducks.client; public interface BlockModel_Duck { boolean crystalline_sky$isSkybox(); diff --git a/common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin_ducks/client/SimpleBakedModel_Duck.java b/fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/mixin_ducks/client/SimpleBakedModel_Duck.java similarity index 61% rename from common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin_ducks/client/SimpleBakedModel_Duck.java rename to fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/mixin_ducks/client/SimpleBakedModel_Duck.java index b6bead4..64dfad6 100644 --- a/common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin_ducks/client/SimpleBakedModel_Duck.java +++ b/fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/mixin_ducks/client/SimpleBakedModel_Duck.java @@ -1,4 +1,4 @@ -package io.github.slimeistdev.crystalline_sky.mixin_ducks.client; +package io.github.slimeistdev.crystalline_sky.fabric.mixin_ducks.client; public interface SimpleBakedModel_Duck { boolean crystalline_sky$isSkybox(); diff --git a/fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/skybox_model/SkyboxModelLoadingPlugin.java b/fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/skybox_model/SkyboxModelLoadingPlugin.java index d4fe141..cc1ae39 100644 --- a/fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/skybox_model/SkyboxModelLoadingPlugin.java +++ b/fabric/src/main/java/io/github/slimeistdev/crystalline_sky/fabric/skybox_model/SkyboxModelLoadingPlugin.java @@ -1,6 +1,6 @@ package io.github.slimeistdev.crystalline_sky.fabric.skybox_model; -import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.SimpleBakedModel_Duck; +import io.github.slimeistdev.crystalline_sky.fabric.mixin_ducks.client.SimpleBakedModel_Duck; import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin; public class SkyboxModelLoadingPlugin implements ModelLoadingPlugin { diff --git a/fabric/src/main/resources/crystalline_sky.mixins.json b/fabric/src/main/resources/crystalline_sky.mixins.json index 97f5060..7d4f7e4 100644 --- a/fabric/src/main/resources/crystalline_sky.mixins.json +++ b/fabric/src/main/resources/crystalline_sky.mixins.json @@ -10,8 +10,11 @@ "mixins": [ ], "client": [ + "client.BlockModelDeserializerMixin", + "client.BlockModelMixin", "client.ModelManagerMixin", "client.RenderTypeMixin", + "client.SimpleBakedModelMixin", "client.compat.axiom.ChunkRenderOverrider_AxiomChunkOverrideLayerMixin" ], "server": [ diff --git a/gradle.properties b/gradle.properties index d0f639a..1fa1754 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,6 +26,6 @@ modVersion=0.1.2 compatibleVersions=1.21.1 # mod compat -enable_sodium=true -enable_iris=true +enable_sodium=false +enable_iris=false enable_axiom=false diff --git a/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/CrystallineSkyClientImpl.java b/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/CrystallineSkyClientImpl.java index 5d1a44e..6295ec1 100644 --- a/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/CrystallineSkyClientImpl.java +++ b/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/CrystallineSkyClientImpl.java @@ -3,6 +3,7 @@ package io.github.slimeistdev.crystalline_sky.neoforge; import io.github.slimeistdev.crystalline_sky.CrystallineSky; import io.github.slimeistdev.crystalline_sky.CrystallineSkyClient; import io.github.slimeistdev.crystalline_sky.multiloader.neoforge.ItemGroupRegistrationEventImpl; +import io.github.slimeistdev.crystalline_sky.neoforge.skybox_model.SkyboxGeometryLoader; import io.github.slimeistdev.crystalline_sky.registry.CrystallineItems; import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineAtlases; import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderTypes; @@ -12,6 +13,7 @@ import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.ClientTickEvent; +import net.neoforged.neoforge.client.event.ModelEvent.RegisterGeometryLoaders; import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; import net.neoforged.neoforge.client.event.RegisterMaterialAtlasesEvent; import net.neoforged.neoforge.client.event.RegisterNamedRenderTypesEvent; @@ -49,4 +51,9 @@ public class CrystallineSkyClientImpl { public static void registerAtlases(RegisterMaterialAtlasesEvent event) { CrystallineAtlases.register(event::register); } + + @SubscribeEvent + public static void registerGeometryLoaders(RegisterGeometryLoaders event) { + event.register(CrystallineSky.id("skybox"), new SkyboxGeometryLoader()); + } } diff --git a/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/skybox_model/SkyboxBakedModel.java b/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/skybox_model/SkyboxBakedModel.java new file mode 100644 index 0000000..15294b1 --- /dev/null +++ b/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/skybox_model/SkyboxBakedModel.java @@ -0,0 +1,101 @@ +package io.github.slimeistdev.crystalline_sky.neoforge.skybox_model; + +import io.github.slimeistdev.crystalline_sky.util.SharedRenderVariables; +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.neoforge.client.model.BakedModelWrapper; +import net.neoforged.neoforge.client.model.IQuadTransformer; +import net.neoforged.neoforge.client.model.QuadTransformers; +import net.neoforged.neoforge.client.model.data.ModelData; +import net.neoforged.neoforge.common.util.TriState; +import org.jetbrains.annotations.Nullable; + +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class SkyboxBakedModel extends BakedModelWrapper { + private static final IQuadTransformer TRANSFORMER = QuadTransformers.settingMaxEmissivity() + .andThen(q -> { + TextureAtlasSprite sprite = q.getSprite(); + float u0 = sprite.getU0(); + float v0 = sprite.getV0(); + int u1 = (int) (sprite.getU1() * 0xffff); + int v1 = (int) (sprite.getV1() * 0xffff); + int uv1 = (u1 << 16) | v1; + + var vertices = q.getVertices(); + for (int j = 0; j < 4; j++) { + vertices[j * IQuadTransformer.STRIDE + IQuadTransformer.UV0] = Float.floatToRawIntBits(u0); + vertices[j * IQuadTransformer.STRIDE + IQuadTransformer.UV0 + 1] = Float.floatToRawIntBits(v0); + vertices[j * IQuadTransformer.STRIDE + IQuadTransformer.COLOR] = uv1; + } + }); + + private record CacheKey(@Nullable BlockState state, @Nullable Direction side) {} + private final Map> quadCache = new HashMap<>(); + + public SkyboxBakedModel(T originalModel) { + super(originalModel); + } + + @Override + public boolean useAmbientOcclusion() { + return false; + } + + @Override + public TriState useAmbientOcclusion(BlockState state, ModelData data, RenderType renderType) { + return TriState.FALSE; + } + + @Override + public boolean usesBlockLight() { + return false; + } + + private static BakedQuad copyFullBright(BakedQuad quad) { + var vertices = quad.getVertices(); + return new BakedQuad( + Arrays.copyOf(vertices, vertices.length), + -1, // no tint index + quad.getDirection(), + quad.getSprite(), + false, // no shade + false // no ao + ); + } + + private static List process(List inputs) { + return inputs.stream().map(SkyboxBakedModel::copyFullBright).peek(TRANSFORMER::processInPlace).toList(); + } + + @Override + public List getQuads(@Nullable BlockState state, @Nullable Direction side, RandomSource rand) { + CacheKey key = new CacheKey(state, side); + return quadCache.computeIfAbsent(key, $ -> { + SharedRenderVariables.pushShadeFullBright(); + + List quads = super.getQuads(state, side, rand); + List out = process(quads); + + SharedRenderVariables.popShadeFullBright(); + return out; + }); + } + + @Override + public List getQuads(@Nullable BlockState state, @Nullable Direction side, RandomSource rand, ModelData extraData, @Nullable RenderType renderType) { + return getQuads(state, side, rand); + } +} diff --git a/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/skybox_model/SkyboxGeometryLoader.java b/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/skybox_model/SkyboxGeometryLoader.java new file mode 100644 index 0000000..f17a4ce --- /dev/null +++ b/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/skybox_model/SkyboxGeometryLoader.java @@ -0,0 +1,21 @@ +package io.github.slimeistdev.crystalline_sky.neoforge.skybox_model; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.client.renderer.block.model.BlockModel; +import net.neoforged.neoforge.client.model.geometry.IGeometryLoader; + +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class SkyboxGeometryLoader implements IGeometryLoader> { + @Override + public SkyboxWrappingGeometry read(JsonObject jsonObject, JsonDeserializationContext context) throws JsonParseException { + jsonObject.remove("loader"); + BlockModel base = context.deserialize(jsonObject, BlockModel.class); + return new SkyboxWrappingGeometry<>(base); + } +} diff --git a/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/skybox_model/SkyboxWrappingGeometry.java b/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/skybox_model/SkyboxWrappingGeometry.java new file mode 100644 index 0000000..a0588e2 --- /dev/null +++ b/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/skybox_model/SkyboxWrappingGeometry.java @@ -0,0 +1,37 @@ +package io.github.slimeistdev.crystalline_sky.neoforge.skybox_model; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.client.renderer.block.model.ItemOverrides; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.resources.model.Material; +import net.minecraft.client.resources.model.ModelBaker; +import net.minecraft.client.resources.model.ModelState; +import net.minecraft.client.resources.model.UnbakedModel; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.client.model.geometry.IGeometryBakingContext; +import net.neoforged.neoforge.client.model.geometry.IUnbakedGeometry; + +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.Objects; +import java.util.function.Function; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class SkyboxWrappingGeometry implements IUnbakedGeometry> { + private final T wrapped; + + public SkyboxWrappingGeometry(T wrapped) { + this.wrapped = wrapped; + } + + @Override + public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, Function spriteGetter, ModelState modelState, ItemOverrides overrides) { + return new SkyboxBakedModel<>(Objects.requireNonNull(wrapped.bake(baker, spriteGetter, modelState))); + } + + @Override + public void resolveParents(Function modelGetter, IGeometryBakingContext context) { + wrapped.resolveParents(modelGetter); + } +}