Skybox II

better fabric model loading, clean up shaders
This commit is contained in:
techno-sam
2026-04-25 13:27:28 +02:00
parent bad5f29b4e
commit e130a9d47c
15 changed files with 160 additions and 57 deletions
@@ -1,4 +1,4 @@
// 1.21.1 2026-04-25T02:02:19.160711408 Crystalline Sky/Model Definitions // 1.21.1 2026-04-25T13:07:32.974736053 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,7 +13,7 @@ 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
9f63a1dc282986e15f9b22bee0ab0a2eaf4f994d assets/crystalline_sky/models/block/skybox_test.json e3a94ee688f28874452b8862359916adfdcf223e 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
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 508ffb97ee711b53767b9d33659596197f69ee20 assets/crystalline_sky/models/block/weeping_sky_light.json
@@ -1,3 +1,3 @@
// 1.21.1 2026-04-25T02:02:19.159567873 Crystalline Sky/Tags for minecraft:block // 1.21.1 2026-04-25T13:07:32.974065609 Crystalline Sky/Tags for minecraft:block
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-04-25T02:02:19.161914767 Crystalline Sky/Block Loot Tables // 1.21.1 2026-04-25T13:07:32.975380176 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
@@ -3,6 +3,7 @@
"crystalline_sky:atlas": "crystalline_sky:textures/atlas/skyboxes.png", "crystalline_sky:atlas": "crystalline_sky:textures/atlas/skyboxes.png",
"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",
"particle": "crystalline_sky:block/skybox_test"
} }
} }
@@ -1,22 +1,50 @@
package io.github.slimeistdev.crystalline_sky.mixin.client; package io.github.slimeistdev.crystalline_sky.mixin.client;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
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 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.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 net.minecraft.resources.ResourceLocation;
import org.objectweb.asm.Opcodes;
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;
@Mixin(BlockModel.Deserializer.class) @Mixin(BlockModel.Deserializer.class)
public class BlockModelDeserializerMixin { public class BlockModelDeserializerMixin {
@WrapOperation(method = "getTextureMap", at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/texture/TextureAtlas;LOCATION_BLOCKS:Lnet/minecraft/resources/ResourceLocation;", opcode = Opcodes.GETSTATIC)) @WrapOperation(method = "getTextureMap", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/block/model/BlockModel$Deserializer;parseTextureLocationOrReference(Lnet/minecraft/resources/ResourceLocation;Ljava/lang/String;)Lcom/mojang/datafixers/util/Either;"))
private ResourceLocation modifyAtlas(Operation<ResourceLocation> original, JsonObject json) { private Either<Material, String> modifyAtlas(ResourceLocation location, String name,
if (json.has("crystalline_sky:atlas")) { Operation<Either<Material, String>> original, JsonObject json,
return ResourceLocation.parse(json.get("crystalline_sky:atlas").getAsString()); @Local(name = "entry") Map.Entry<String, JsonElement> entry) {
} else { if (!entry.getKey().equals("particle") && json.has("crystalline_sky:atlas")) {
return original.call(); location = ResourceLocation.parse(json.get("crystalline_sky:atlas").getAsString());
} }
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;
} }
} }
@@ -0,0 +1,36 @@
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;
}
}
@@ -0,0 +1,22 @@
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;
}
}
@@ -0,0 +1,6 @@
package io.github.slimeistdev.crystalline_sky.mixin_ducks.client;
public interface BlockModel_Duck {
boolean crystalline_sky$isSkybox();
void crystalline_sky$setSkybox();
}
@@ -0,0 +1,6 @@
package io.github.slimeistdev.crystalline_sky.mixin_ducks.client;
public interface SimpleBakedModel_Duck {
boolean crystalline_sky$isSkybox();
void crystalline_sky$setSkybox();
}
@@ -10,7 +10,6 @@ uniform float FogEnd;
uniform vec4 FogColor; uniform vec4 FogColor;
in float vertexDistance; in float vertexDistance;
//in vec4 texProj0;
in vec2 uv0; in vec2 uv0;
in vec2 uv1; in vec2 uv1;
in vec3 vPos; in vec3 vPos;
@@ -25,6 +24,8 @@ out vec4 fragColor;
#define SCALE 1 #define SCALE 1
#endif #endif
#define FACE_DBG 0
const mat4x4 bayerMatrix4x4 = mat4x4( const mat4x4 bayerMatrix4x4 = mat4x4(
0.0, 8.0, 2.0, 10.0, 0.0, 8.0, 2.0, 10.0,
12.0, 4.0, 14.0, 6.0, 12.0, 4.0, 14.0, 6.0,
@@ -44,37 +45,52 @@ void main() {
vec3 dir = normalize(vPos); vec3 dir = normalize(vPos);
vec3 dabs = abs(dir); vec3 dabs = abs(dir);
float dmax = max(dabs.x, max(dabs.y, dabs.z)); float dmax = max(dabs.x, max(dabs.y, dabs.z));
vec3 col;
bool positive; bool positive;
#if FACE_DBG
vec3 col;
#else
vec2 uv; vec2 uv;
vec2 section; vec2 section;
#endif
if (dabs.x == dmax) { if (dabs.x == dmax) {
col = vec3(1.0, 0.0, 0.0);
positive = dir.x > 0; positive = dir.x > 0;
#if FACE_DBG
col = vec3(1.0, 0.0, 0.0);
#else
uv = positive ? -dir.zy : vec2(dir.z, -dir.y); uv = positive ? -dir.zy : vec2(dir.z, -dir.y);
section = vec2(positive ? 2.0 : 0.0, 1.0); section = vec2(positive ? 2.0 : 0.0, 1.0);
#endif
} else if (dabs.y == dmax) { } else if (dabs.y == dmax) {
col = vec3(0.0, 1.0, 0.0);
positive = dir.y > 0; positive = dir.y > 0;
#if FACE_DBG
col = vec3(0.0, 1.0, 0.0);
#else
uv = positive ? dir.xz : vec2(dir.x, -dir.z); uv = positive ? dir.xz : vec2(dir.x, -dir.z);
section = vec2(positive ? 1.0 : 2.0, 0.0); section = vec2(positive ? 1.0 : 2.0, 0.0);
#endif
} else { } else {
col = vec3(0.0, 0.0, 1.0);
positive = dir.z > 0; positive = dir.z > 0;
#if FACE_DBG
col = vec3(0.0, 0.0, 1.0);
#else
uv = positive ? vec2(dir.x, -dir.y) : -dir.xy; uv = positive ? vec2(dir.x, -dir.y) : -dir.xy;
section = vec2(positive ? 1.0 : 3.0, 1.0); section = vec2(positive ? 1.0 : 3.0, 1.0);
#endif
} }
#if FACE_DBG
col *= positive ? 1.0 : 0.5;
vec4 color = vec4(col, 1.0) * vec4(ColorModulator.rgb, 1.0);
#else
uv = (uv / dmax + 1.0) / 2.0; uv = (uv / dmax + 1.0) / 2.0;
uv = clamp(uv, vec2(0.0), vec2(1.0)); uv = clamp(uv, vec2(0.0), vec2(1.0));
uv = (uv + section) / vec2(4.0, 2.0); uv = (uv + section) / vec2(4.0, 2.0);
col *= positive ? 1.0 : 0.5;
//col = vec3(uv, 0.0);
vec2 uvR = uv0 + uv * (uv1 - uv0); vec2 uvR = uv0 + uv * (uv1 - uv0);
//vec4 color = vec4(col, 1.0) * vec4(ColorModulator.rgb, 1.0);
vec4 color = texture(Sampler0, uvR) * vec4(ColorModulator.rgb, 1.0); vec4 color = texture(Sampler0, uvR) * vec4(ColorModulator.rgb, 1.0);
#endif
fragColor = linear_fog(color, vertexDistance, FogStart, FogEnd, FogColor); fragColor = linear_fog(color, vertexDistance, FogStart, FogEnd, FogColor);
} }
@@ -17,12 +17,14 @@
], ],
"client": [ "client": [
"client.BlockModelDeserializerMixin", "client.BlockModelDeserializerMixin",
"client.BlockModelMixin",
"client.ClientLevelMixin", "client.ClientLevelMixin",
"client.DebugRendererMixin", "client.DebugRendererMixin",
"client.GameRendererMixin", "client.GameRendererMixin",
"client.LevelRenderer_NoSodium_Mixin", "client.LevelRenderer_NoSodium_Mixin",
"client.LevelRendererMixin", "client.LevelRendererMixin",
"client.RenderTargetMixin", "client.RenderTargetMixin",
"client.SimpleBakedModelMixin",
"client.compat.sodium.DefaultMaterialsMixin", "client.compat.sodium.DefaultMaterialsMixin",
"client.compat.sodium.DefaultTerrainRenderPassesMixin", "client.compat.sodium.DefaultTerrainRenderPassesMixin",
"client.compat.sodium.ShaderChunkRendererMixin", "client.compat.sodium.ShaderChunkRendererMixin",
@@ -2,7 +2,7 @@ package io.github.slimeistdev.crystalline_sky.fabric;
import io.github.slimeistdev.crystalline_sky.CrystallineSkyClient; import io.github.slimeistdev.crystalline_sky.CrystallineSkyClient;
import io.github.slimeistdev.crystalline_sky.fabric.events.RegisterMaterialAtlasesEvent; import io.github.slimeistdev.crystalline_sky.fabric.events.RegisterMaterialAtlasesEvent;
import io.github.slimeistdev.crystalline_sky.fabric.render_tmp.SkyboxModelLoadingPlugin; import io.github.slimeistdev.crystalline_sky.fabric.skybox_model.SkyboxModelLoadingPlugin;
import io.github.slimeistdev.crystalline_sky.multiloader.fabric.ItemGroupRegistrationEventImpl; import io.github.slimeistdev.crystalline_sky.multiloader.fabric.ItemGroupRegistrationEventImpl;
import io.github.slimeistdev.crystalline_sky.registry.CrystallineBlocks; import io.github.slimeistdev.crystalline_sky.registry.CrystallineBlocks;
import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineAtlases; import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineAtlases;
@@ -16,8 +16,10 @@ import net.minecraft.data.models.blockstates.PropertyDispatch;
import net.minecraft.data.models.blockstates.Variant; import net.minecraft.data.models.blockstates.Variant;
import net.minecraft.data.models.blockstates.VariantProperties; import net.minecraft.data.models.blockstates.VariantProperties;
import net.minecraft.data.models.model.ModelLocationUtils; import net.minecraft.data.models.model.ModelLocationUtils;
import net.minecraft.data.models.model.ModelTemplate;
import net.minecraft.data.models.model.ModelTemplates; import net.minecraft.data.models.model.ModelTemplates;
import net.minecraft.data.models.model.TextureMapping; import net.minecraft.data.models.model.TextureMapping;
import net.minecraft.data.models.model.TextureSlot;
import net.minecraft.data.models.model.TexturedModel; import net.minecraft.data.models.model.TexturedModel;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
@@ -25,7 +27,9 @@ import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import java.util.Locale; import java.util.Locale;
import java.util.Optional;
import static net.minecraft.data.models.model.TextureMapping.getBlockTexture;
import static net.minecraft.data.models.model.TexturedModel.createDefault; import static net.minecraft.data.models.model.TexturedModel.createDefault;
@SuppressWarnings("SameParameterValue") @SuppressWarnings("SameParameterValue")
@@ -35,9 +39,16 @@ public class CrystallineSkyModelProvider extends FabricModelProvider {
return resourceLocation.withPrefix("crystalline_sky_skybox/"); return resourceLocation.withPrefix("crystalline_sky_skybox/");
} }
private static ModelTemplate create(String blockModelLocation, TextureSlot... requiredSlots) {
return new ModelTemplate(Optional.of(ResourceLocation.withDefaultNamespace("block/" + blockModelLocation)), Optional.empty(), requiredSlots);
}
private static final ModelTemplate CUBE_ALL_PARTICLE = create("cube_all", TextureSlot.ALL, TextureSlot.PARTICLE);
private static final TexturedModel.Provider SKYBOX_CUBE = createDefault( private static final TexturedModel.Provider SKYBOX_CUBE = createDefault(
block -> TextureMapping.cube(getSkyboxBlockTexture(block)), block -> TextureMapping.cube(getSkyboxBlockTexture(block))
ModelTemplates.CUBE_ALL .put(TextureSlot.PARTICLE, getBlockTexture(block)),
CUBE_ALL_PARTICLE
); );
public CrystallineSkyModelProvider(FabricDataOutput output) { public CrystallineSkyModelProvider(FabricDataOutput output) {
@@ -1,4 +1,4 @@
package io.github.slimeistdev.crystalline_sky.fabric.render_tmp; package io.github.slimeistdev.crystalline_sky.fabric.skybox_model;
import net.fabricmc.fabric.api.renderer.v1.Renderer; import net.fabricmc.fabric.api.renderer.v1.Renderer;
import net.fabricmc.fabric.api.renderer.v1.RendererAccess; import net.fabricmc.fabric.api.renderer.v1.RendererAccess;
@@ -61,25 +61,6 @@ public class SkyboxBakedModel extends ForwardingBakedModel {
// copied from net.fabricmc.fabric.impl.renderer.VanillaModelEncoder.emitBlockQuads // copied from net.fabricmc.fabric.impl.renderer.VanillaModelEncoder.emitBlockQuads
@Override @Override
public void emitBlockQuads(BlockAndTintGetter blockView, BlockState state, BlockPos pos, Supplier<RandomSource> randomSupplier, RenderContext context) { public void emitBlockQuads(BlockAndTintGetter blockView, BlockState state, BlockPos pos, Supplier<RandomSource> randomSupplier, RenderContext context) {
/*TextureAtlasSprite sprite = getParticleIcon();
float u0 = sprite.getU0();
float v0 = sprite.getV0();
int u1 = (int) (sprite.getU1() * 0xffff);
int v1 = (int) (sprite.getV1() * 0xffff);
int color = (u1 << 16) | v1;
var emitter = context.getEmitter()
.square(Direction.UP, 0, 0, 1, 1, 0)
.material(FULLBRIGHT_MATERIAL);
for (int i = 0; i < 4; i++) {
emitter
.color(i, color)
.lightmap(i, LightTexture.FULL_BRIGHT)
.normal(i, 0, 1, 0)
.uv(i, u0, v0);
}
emitter.emit();*/
QuadEmitter emitter = context.getEmitter(); QuadEmitter emitter = context.getEmitter();
for (int i = 0; i <= ModelHelper.NULL_FACE_ID; i++) { for (int i = 0; i <= ModelHelper.NULL_FACE_ID; i++) {
@@ -93,7 +74,7 @@ public class SkyboxBakedModel extends ForwardingBakedModel {
final List<BakedQuad> quads = getQuads(state, cullFace, randomSupplier.get()); final List<BakedQuad> quads = getQuads(state, cullFace, randomSupplier.get());
for (final BakedQuad q : quads) { for (final BakedQuad q : quads) {
emitter.fromVanilla(q, FULL_BRIGHT_MATERIAL, cullFace); // fixme view bobbing breaks projection, use TextureMatrix to pass a view projection matrix along :) emitter.fromVanilla(q, FULL_BRIGHT_MATERIAL, cullFace);
TextureAtlasSprite sprite = q.getSprite(); TextureAtlasSprite sprite = q.getSprite();
float u0 = sprite.getU0(); float u0 = sprite.getU0();
float v0 = sprite.getV0(); float v0 = sprite.getV0();
@@ -1,8 +1,7 @@
package io.github.slimeistdev.crystalline_sky.fabric.render_tmp; package io.github.slimeistdev.crystalline_sky.fabric.skybox_model;
import io.github.slimeistdev.crystalline_sky.CrystallineSky; import io.github.slimeistdev.crystalline_sky.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;
import net.minecraft.resources.ResourceLocation;
public class SkyboxModelLoadingPlugin implements ModelLoadingPlugin { public class SkyboxModelLoadingPlugin implements ModelLoadingPlugin {
private SkyboxModelLoadingPlugin() {} private SkyboxModelLoadingPlugin() {}
@@ -10,15 +9,10 @@ public class SkyboxModelLoadingPlugin implements ModelLoadingPlugin {
@Override @Override
public void onInitializeModelLoader(Context pluginContext) { public void onInitializeModelLoader(Context pluginContext) {
pluginContext.modifyModelAfterBake().register((model, ctx) -> { pluginContext.modifyModelAfterBake().register((model, ctx) -> {
if (model == null) return null; if (model instanceof SimpleBakedModel_Duck duck && duck.crystalline_sky$isSkybox())
return new SkyboxBakedModel(model);
ResourceLocation id = ctx.resourceId(); return model;
if (id == null) {
id = ctx.topLevelId().id();
}
if (!id.equals(CrystallineSky.id("block/skybox_test"))) return model;
return new SkyboxBakedModel(model);
}); });
} }