Skybox IX

neoforge
This commit is contained in:
techno-sam
2026-05-14 17:32:03 +02:00
parent 4ae5ff2b7c
commit f4d0573332
22 changed files with 259 additions and 60 deletions
@@ -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
@@ -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
@@ -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
@@ -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",
@@ -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;
}
}
@@ -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<BlockElement> elements,
Map<String, Either<Material, String>> textureMap, Boolean hasAmbientOcclusion,
BlockModel.GuiLight guiLight, ItemTransforms transforms, List<ItemOverride> overrides,
Operation<BlockModel> 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;
}
}
@@ -1,36 +0,0 @@
package io.github.slimeistdev.crystalline_sky.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 net.minecraft.client.renderer.block.model.BlockModel;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.client.resources.model.SimpleBakedModel;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
@Mixin(BlockModel.class)
public class BlockModelMixin implements BlockModel_Duck {
@Unique
private boolean crystalline_sky$is_skybox = false;
@Override
public boolean crystalline_sky$isSkybox() {
return crystalline_sky$is_skybox;
}
@Override
public void crystalline_sky$setSkybox() {
crystalline_sky$is_skybox = true;
}
@WrapOperation(method = "bake(Lnet/minecraft/client/resources/model/ModelBaker;Lnet/minecraft/client/renderer/block/model/BlockModel;Ljava/util/function/Function;Lnet/minecraft/client/resources/model/ModelState;Z)Lnet/minecraft/client/resources/model/BakedModel;", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resources/model/SimpleBakedModel$Builder;build()Lnet/minecraft/client/resources/model/BakedModel;"))
private BakedModel transferSkybox(SimpleBakedModel.Builder instance, Operation<BakedModel> original) {
BakedModel out = original.call(instance);
if (crystalline_sky$isSkybox() && out instanceof SimpleBakedModel_Duck duck)
duck.crystalline_sky$setSkybox();
return out;
}
}
@@ -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());
@@ -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<Float> original, @Local(name = "bakedQuad") BakedQuad bakedQuad) {
Operation<Float> original, @Local(name = {"bakedQuad", "bakedquad"}) BakedQuad bakedQuad) {
if (bakedQuad.getSprite().atlasLocation().equals(CrystallineAtlases.SKYBOXES.texture))
return 1.0f;
return original.call(instance, direction, shade);
@@ -1,22 +0,0 @@
package io.github.slimeistdev.crystalline_sky.mixin.client;
import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.SimpleBakedModel_Duck;
import net.minecraft.client.resources.model.SimpleBakedModel;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
@Mixin(SimpleBakedModel.class)
public class SimpleBakedModelMixin implements SimpleBakedModel_Duck {
@Unique
private boolean crystalline_sky$is_skybox = false;
@Override
public boolean crystalline_sky$isSkybox() {
return crystalline_sky$is_skybox;
}
@Override
public void crystalline_sky$setSkybox() {
crystalline_sky$is_skybox = true;
}
}
@@ -1,6 +0,0 @@
package io.github.slimeistdev.crystalline_sky.mixin_ducks.client;
public interface BlockModel_Duck {
boolean crystalline_sky$isSkybox();
void crystalline_sky$setSkybox();
}
@@ -1,6 +0,0 @@
package io.github.slimeistdev.crystalline_sky.mixin_ducks.client;
public interface SimpleBakedModel_Duck {
boolean crystalline_sky$isSkybox();
void crystalline_sky$setSkybox();
}
@@ -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",