mirror of
https://github.com/wisplite/crystalline-sky.git
synced 2026-10-30 13:32:18 -05:00
Skybox IX
neoforge
This commit is contained in:
@@ -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
|
e832366c216102270b75085db7a7169881b853b3 assets/crystalline_sky/blockstates/sky.json
|
||||||
0ac5351c3a01e0f9e76517452918e12770b3b54b assets/crystalline_sky/models/block/sky_light_14.json
|
0ac5351c3a01e0f9e76517452918e12770b3b54b assets/crystalline_sky/models/block/sky_light_14.json
|
||||||
ee9cb7604922cdb2ad71d021a593ca82f0baf493 assets/crystalline_sky/models/block/sky_light_03.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
|
ef5afdbcc8401a27029b6f0a29fa1117761c620d assets/crystalline_sky/models/item/sky_light.json
|
||||||
59463cef438e58b137e5ce27402acf42a3a0ae87 assets/crystalline_sky/models/block/sky_light_02.json
|
59463cef438e58b137e5ce27402acf42a3a0ae87 assets/crystalline_sky/models/block/sky_light_02.json
|
||||||
2763952a1919802e34f0976b023fc7b486456b91 assets/crystalline_sky/models/item/skybox_test.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
|
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
|
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
|
9b3d01168a1cc29b99cf69fe225ad69b0923c9fe assets/crystalline_sky/blockstates/weeping_sky_light.json
|
||||||
9c6ba4d90f2c4f2a9beb910c1b32023e49445749 assets/crystalline_sky/models/block/sky_light_10.json
|
9c6ba4d90f2c4f2a9beb910c1b32023e49445749 assets/crystalline_sky/models/block/sky_light_10.json
|
||||||
9c6c61b7f805a614d2d15d8dde390ed068913182 assets/crystalline_sky/models/item/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
|
e2c7bebd9eca446bb06fff866ec4d4996917e7e4 assets/crystalline_sky/models/block/sky_light_12.json
|
||||||
04f1e4eba184b8e7b1669fc61006e3d00e09d164 assets/crystalline_sky/models/item/sky_light_11.json
|
04f1e4eba184b8e7b1669fc61006e3d00e09d164 assets/crystalline_sky/models/item/sky_light_11.json
|
||||||
58349dc5dedb8016fb0bc958fcd4a9ccde13a1cd assets/crystalline_sky/models/item/sky_light_14.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
|
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
|
7c7d944714b5bcbee6a7e8014599ade8fbc5e804 assets/crystalline_sky/models/block/weeping_sky.json
|
||||||
dff33a68a694de0f3ef177886c002204ffe49a8c assets/crystalline_sky/models/item/sky_light_07.json
|
dff33a68a694de0f3ef177886c002204ffe49a8c assets/crystalline_sky/models/item/sky_light_07.json
|
||||||
b29c14f77a08da7a6994cff4c6801d6f04b12ec0 assets/crystalline_sky/models/item/sky_light_03.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
|
1f45861c594d9441dfe16f1c8b41a9f0013278ed data/crystalline_sky/tags/block/rendering/cubemap.json
|
||||||
1389c0b812f7a6e4d5dd00edac1dc07beb5f9552 data/crystalline_sky/tags/block/sky_light_emitters.json
|
1389c0b812f7a6e4d5dd00edac1dc07beb5f9552 data/crystalline_sky/tags/block/sky_light_emitters.json
|
||||||
606477607a09045ff2830cbc036e744d6a728bbd data/minecraft/tags/block/crystal_sound_blocks.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
|
337de0acfc1b9b86adde0705e342ed1d4b5c9c4e data/crystalline_sky/loot_table/blocks/weeping_sky.json
|
||||||
6a9b7a08424cbd3d699dfd3252d432517254aa45 data/crystalline_sky/loot_table/blocks/sky.json
|
6a9b7a08424cbd3d699dfd3252d432517254aa45 data/crystalline_sky/loot_table/blocks/sky.json
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"parent": "minecraft:block/cube_all",
|
"parent": "minecraft:block/cube_all",
|
||||||
"crystalline_sky:atlas": "crystalline_sky:textures/atlas/skyboxes.png",
|
"crystalline_sky:atlas": "crystalline_sky:textures/atlas/skyboxes.png",
|
||||||
|
"loader": "crystalline_sky:skybox",
|
||||||
"render_type": "crystalline_sky:skybox",
|
"render_type": "crystalline_sky:skybox",
|
||||||
"textures": {
|
"textures": {
|
||||||
"all": "crystalline_sky:crystalline_sky_skybox/skybox_test",
|
"all": "crystalline_sky:crystalline_sky_skybox/skybox_test",
|
||||||
|
|||||||
+30
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
-21
@@ -6,18 +6,12 @@ import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
|
|||||||
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
|
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
|
||||||
import com.llamalad7.mixinextras.sugar.Local;
|
import com.llamalad7.mixinextras.sugar.Local;
|
||||||
import com.mojang.datafixers.util.Either;
|
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.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.client.resources.model.Material;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@Mixin(BlockModel.Deserializer.class)
|
@Mixin(BlockModel.Deserializer.class)
|
||||||
@@ -32,19 +26,4 @@ public class BlockModelDeserializerMixin {
|
|||||||
|
|
||||||
return original.call(location, name);
|
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-20
@@ -6,15 +6,11 @@ import com.mojang.blaze3d.pipeline.RenderTarget;
|
|||||||
import com.mojang.blaze3d.pipeline.TextureTarget;
|
import com.mojang.blaze3d.pipeline.TextureTarget;
|
||||||
import com.mojang.blaze3d.vertex.PoseStack;
|
import com.mojang.blaze3d.vertex.PoseStack;
|
||||||
import io.github.slimeistdev.crystalline_sky.compat.Mods;
|
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.compat.iris.IrisHelpers;
|
||||||
import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.IrisRenderingPipeline_Duck;
|
|
||||||
import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.LevelRenderer_Duck;
|
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.mixin_ducks.client.RenderTarget_Duck;
|
||||||
import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderTypes;
|
import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderTypes;
|
||||||
import io.github.slimeistdev.crystalline_sky.util.SharedRenderVariables;
|
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.Camera;
|
||||||
import net.minecraft.client.CloudStatus;
|
import net.minecraft.client.CloudStatus;
|
||||||
import net.minecraft.client.DeltaTracker;
|
import net.minecraft.client.DeltaTracker;
|
||||||
@@ -108,21 +104,7 @@ public abstract class LevelRendererMixin implements LevelRenderer_Duck {
|
|||||||
Matrix4f matrix4f, Matrix4f matrix4f2, CallbackInfo ci) {
|
Matrix4f matrix4f, Matrix4f matrix4f2, CallbackInfo ci) {
|
||||||
var skyBuffer = crystalline_sky$getSkyFramebuffer();
|
var skyBuffer = crystalline_sky$getSkyFramebuffer();
|
||||||
skyBuffer.clear(Minecraft.ON_OSX);
|
skyBuffer.clear(Minecraft.ON_OSX);
|
||||||
var copiedFromIris = Mods.IRIS.runIfInstalled(() -> () -> {
|
var copiedFromIris = Mods.IRIS.runIfInstalled(() -> () -> IrisHelpers.copySkyToBuffer(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;
|
|
||||||
});
|
|
||||||
if (!copiedFromIris.orElse(false))
|
if (!copiedFromIris.orElse(false))
|
||||||
((RenderTarget_Duck) skyBuffer).crystalline_sky$copyColorFrom(minecraft.getMainRenderTarget());
|
((RenderTarget_Duck) skyBuffer).crystalline_sky$copyColorFrom(minecraft.getMainRenderTarget());
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -13,9 +13,10 @@ import org.spongepowered.asm.mixin.injection.At;
|
|||||||
|
|
||||||
@Mixin(ModelBlockRenderer.class)
|
@Mixin(ModelBlockRenderer.class)
|
||||||
public class ModelBlockRendererMixin {
|
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"))
|
@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,
|
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))
|
if (bakedQuad.getSprite().atlasLocation().equals(CrystallineAtlases.SKYBOXES.texture))
|
||||||
return 1.0f;
|
return 1.0f;
|
||||||
return original.call(instance, direction, shade);
|
return original.call(instance, direction, shade);
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
],
|
],
|
||||||
"client": [
|
"client": [
|
||||||
"client.BlockModelDeserializerMixin",
|
"client.BlockModelDeserializerMixin",
|
||||||
"client.BlockModelMixin",
|
|
||||||
"client.ClientLevelMixin",
|
"client.ClientLevelMixin",
|
||||||
"client.DebugRendererMixin",
|
"client.DebugRendererMixin",
|
||||||
"client.GameRendererMixin",
|
"client.GameRendererMixin",
|
||||||
@@ -25,7 +24,6 @@
|
|||||||
"client.LevelRendererMixin",
|
"client.LevelRendererMixin",
|
||||||
"client.ModelBlockRendererMixin",
|
"client.ModelBlockRendererMixin",
|
||||||
"client.RenderTargetMixin",
|
"client.RenderTargetMixin",
|
||||||
"client.SimpleBakedModelMixin",
|
|
||||||
"client.compat.iris.ExtendedShaderMixin",
|
"client.compat.iris.ExtendedShaderMixin",
|
||||||
"client.compat.iris.IrisRenderingPipelineAccessor",
|
"client.compat.iris.IrisRenderingPipelineAccessor",
|
||||||
"client.compat.iris.IrisRenderingPipelineMixin",
|
"client.compat.iris.IrisRenderingPipelineMixin",
|
||||||
|
|||||||
+1
@@ -89,6 +89,7 @@ public class CrystallineSkyModelProvider extends FabricModelProvider {
|
|||||||
JsonObject root = json.get().getAsJsonObject();
|
JsonObject root = json.get().getAsJsonObject();
|
||||||
root.addProperty("render_type", CrystallineSky.id("skybox").toString());
|
root.addProperty("render_type", CrystallineSky.id("skybox").toString());
|
||||||
root.addProperty(CrystallineSky.id("atlas").toString(), CrystallineAtlases.SKYBOXES.texture.toString());
|
root.addProperty(CrystallineSky.id("atlas").toString(), CrystallineAtlases.SKYBOXES.texture.toString());
|
||||||
|
root.addProperty("loader", CrystallineSky.id("skybox").toString());
|
||||||
return root;
|
return root;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
+38
@@ -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<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;
|
||||||
|
}
|
||||||
|
}
|
||||||
+3
-3
@@ -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.Operation;
|
||||||
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
|
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
|
||||||
import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.BlockModel_Duck;
|
import io.github.slimeistdev.crystalline_sky.fabric.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.SimpleBakedModel_Duck;
|
||||||
import net.minecraft.client.renderer.block.model.BlockModel;
|
import net.minecraft.client.renderer.block.model.BlockModel;
|
||||||
import net.minecraft.client.resources.model.BakedModel;
|
import net.minecraft.client.resources.model.BakedModel;
|
||||||
import net.minecraft.client.resources.model.SimpleBakedModel;
|
import net.minecraft.client.resources.model.SimpleBakedModel;
|
||||||
+2
-2
@@ -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 net.minecraft.client.resources.model.SimpleBakedModel;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Unique;
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
+1
-1
@@ -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 {
|
public interface BlockModel_Duck {
|
||||||
boolean crystalline_sky$isSkybox();
|
boolean crystalline_sky$isSkybox();
|
||||||
+1
-1
@@ -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 {
|
public interface SimpleBakedModel_Duck {
|
||||||
boolean crystalline_sky$isSkybox();
|
boolean crystalline_sky$isSkybox();
|
||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
package io.github.slimeistdev.crystalline_sky.fabric.skybox_model;
|
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;
|
import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin;
|
||||||
|
|
||||||
public class SkyboxModelLoadingPlugin implements ModelLoadingPlugin {
|
public class SkyboxModelLoadingPlugin implements ModelLoadingPlugin {
|
||||||
|
|||||||
@@ -10,8 +10,11 @@
|
|||||||
"mixins": [
|
"mixins": [
|
||||||
],
|
],
|
||||||
"client": [
|
"client": [
|
||||||
|
"client.BlockModelDeserializerMixin",
|
||||||
|
"client.BlockModelMixin",
|
||||||
"client.ModelManagerMixin",
|
"client.ModelManagerMixin",
|
||||||
"client.RenderTypeMixin",
|
"client.RenderTypeMixin",
|
||||||
|
"client.SimpleBakedModelMixin",
|
||||||
"client.compat.axiom.ChunkRenderOverrider_AxiomChunkOverrideLayerMixin"
|
"client.compat.axiom.ChunkRenderOverrider_AxiomChunkOverrideLayerMixin"
|
||||||
],
|
],
|
||||||
"server": [
|
"server": [
|
||||||
|
|||||||
+2
-2
@@ -26,6 +26,6 @@ modVersion=0.1.2
|
|||||||
compatibleVersions=1.21.1
|
compatibleVersions=1.21.1
|
||||||
|
|
||||||
# mod compat
|
# mod compat
|
||||||
enable_sodium=true
|
enable_sodium=false
|
||||||
enable_iris=true
|
enable_iris=false
|
||||||
enable_axiom=false
|
enable_axiom=false
|
||||||
|
|||||||
+7
@@ -3,6 +3,7 @@ package io.github.slimeistdev.crystalline_sky.neoforge;
|
|||||||
import io.github.slimeistdev.crystalline_sky.CrystallineSky;
|
import io.github.slimeistdev.crystalline_sky.CrystallineSky;
|
||||||
import io.github.slimeistdev.crystalline_sky.CrystallineSkyClient;
|
import io.github.slimeistdev.crystalline_sky.CrystallineSkyClient;
|
||||||
import io.github.slimeistdev.crystalline_sky.multiloader.neoforge.ItemGroupRegistrationEventImpl;
|
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.CrystallineItems;
|
||||||
import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineAtlases;
|
import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineAtlases;
|
||||||
import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderTypes;
|
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.bus.api.SubscribeEvent;
|
||||||
import net.neoforged.fml.common.EventBusSubscriber;
|
import net.neoforged.fml.common.EventBusSubscriber;
|
||||||
import net.neoforged.neoforge.client.event.ClientTickEvent;
|
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.RegisterKeyMappingsEvent;
|
||||||
import net.neoforged.neoforge.client.event.RegisterMaterialAtlasesEvent;
|
import net.neoforged.neoforge.client.event.RegisterMaterialAtlasesEvent;
|
||||||
import net.neoforged.neoforge.client.event.RegisterNamedRenderTypesEvent;
|
import net.neoforged.neoforge.client.event.RegisterNamedRenderTypesEvent;
|
||||||
@@ -49,4 +51,9 @@ public class CrystallineSkyClientImpl {
|
|||||||
public static void registerAtlases(RegisterMaterialAtlasesEvent event) {
|
public static void registerAtlases(RegisterMaterialAtlasesEvent event) {
|
||||||
CrystallineAtlases.register(event::register);
|
CrystallineAtlases.register(event::register);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
|
public static void registerGeometryLoaders(RegisterGeometryLoaders event) {
|
||||||
|
event.register(CrystallineSky.id("skybox"), new SkyboxGeometryLoader());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+101
@@ -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<T extends BakedModel> extends BakedModelWrapper<T> {
|
||||||
|
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<CacheKey, List<BakedQuad>> 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<BakedQuad> process(List<BakedQuad> inputs) {
|
||||||
|
return inputs.stream().map(SkyboxBakedModel::copyFullBright).peek(TRANSFORMER::processInPlace).toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction side, RandomSource rand) {
|
||||||
|
CacheKey key = new CacheKey(state, side);
|
||||||
|
return quadCache.computeIfAbsent(key, $ -> {
|
||||||
|
SharedRenderVariables.pushShadeFullBright();
|
||||||
|
|
||||||
|
List<BakedQuad> quads = super.getQuads(state, side, rand);
|
||||||
|
List<BakedQuad> out = process(quads);
|
||||||
|
|
||||||
|
SharedRenderVariables.popShadeFullBright();
|
||||||
|
return out;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction side, RandomSource rand, ModelData extraData, @Nullable RenderType renderType) {
|
||||||
|
return getQuads(state, side, rand);
|
||||||
|
}
|
||||||
|
}
|
||||||
+21
@@ -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<SkyboxWrappingGeometry<BlockModel>> {
|
||||||
|
@Override
|
||||||
|
public SkyboxWrappingGeometry<BlockModel> read(JsonObject jsonObject, JsonDeserializationContext context) throws JsonParseException {
|
||||||
|
jsonObject.remove("loader");
|
||||||
|
BlockModel base = context.deserialize(jsonObject, BlockModel.class);
|
||||||
|
return new SkyboxWrappingGeometry<>(base);
|
||||||
|
}
|
||||||
|
}
|
||||||
+37
@@ -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<T extends UnbakedModel> implements IUnbakedGeometry<SkyboxWrappingGeometry<T>> {
|
||||||
|
private final T wrapped;
|
||||||
|
|
||||||
|
public SkyboxWrappingGeometry(T wrapped) {
|
||||||
|
this.wrapped = wrapped;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, Function<Material, TextureAtlasSprite> spriteGetter, ModelState modelState, ItemOverrides overrides) {
|
||||||
|
return new SkyboxBakedModel<>(Objects.requireNonNull(wrapped.bake(baker, spriteGetter, modelState)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resolveParents(Function<ResourceLocation, UnbakedModel> modelGetter, IGeometryBakingContext context) {
|
||||||
|
wrapped.resolveParents(modelGetter);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user