mirror of
https://github.com/wisplite/crystalline-sky.git
synced 2026-10-30 13:32:18 -05:00
Skybox II
better fabric model loading, clean up shaders
This commit is contained in:
@@ -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
|
||||
0ac5351c3a01e0f9e76517452918e12770b3b54b assets/crystalline_sky/models/block/sky_light_14.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
|
||||
59463cef438e58b137e5ce27402acf42a3a0ae87 assets/crystalline_sky/models/block/sky_light_02.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
|
||||
008a0d0a76a34d8f375fa355452a5d0f93f9af3b assets/crystalline_sky/models/item/sky.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
|
||||
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
|
||||
6a9b7a08424cbd3d699dfd3252d432517254aa45 data/crystalline_sky/loot_table/blocks/sky.json
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
"crystalline_sky:atlas": "crystalline_sky:textures/atlas/skyboxes.png",
|
||||
"render_type": "crystalline_sky:skybox",
|
||||
"textures": {
|
||||
"all": "crystalline_sky:crystalline_sky_skybox/skybox_test"
|
||||
"all": "crystalline_sky:crystalline_sky_skybox/skybox_test",
|
||||
"particle": "crystalline_sky:block/skybox_test"
|
||||
}
|
||||
}
|
||||
+35
-7
@@ -1,22 +1,50 @@
|
||||
package io.github.slimeistdev.crystalline_sky.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.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.objectweb.asm.Opcodes;
|
||||
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 = "getTextureMap", at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/texture/TextureAtlas;LOCATION_BLOCKS:Lnet/minecraft/resources/ResourceLocation;", opcode = Opcodes.GETSTATIC))
|
||||
private ResourceLocation modifyAtlas(Operation<ResourceLocation> original, JsonObject json) {
|
||||
if (json.has("crystalline_sky:atlas")) {
|
||||
return ResourceLocation.parse(json.get("crystalline_sky:atlas").getAsString());
|
||||
} else {
|
||||
return original.call();
|
||||
@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 Either<Material, String> modifyAtlas(ResourceLocation location, String name,
|
||||
Operation<Either<Material, String>> original, JsonObject json,
|
||||
@Local(name = "entry") Map.Entry<String, JsonElement> entry) {
|
||||
if (!entry.getKey().equals("particle") && json.has("crystalline_sky:atlas")) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
+36
@@ -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;
|
||||
}
|
||||
}
|
||||
+22
@@ -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;
|
||||
}
|
||||
}
|
||||
+6
@@ -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();
|
||||
}
|
||||
+6
@@ -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();
|
||||
}
|
||||
+26
-10
@@ -10,7 +10,6 @@ uniform float FogEnd;
|
||||
uniform vec4 FogColor;
|
||||
|
||||
in float vertexDistance;
|
||||
//in vec4 texProj0;
|
||||
in vec2 uv0;
|
||||
in vec2 uv1;
|
||||
in vec3 vPos;
|
||||
@@ -25,6 +24,8 @@ out vec4 fragColor;
|
||||
#define SCALE 1
|
||||
#endif
|
||||
|
||||
#define FACE_DBG 0
|
||||
|
||||
const mat4x4 bayerMatrix4x4 = mat4x4(
|
||||
0.0, 8.0, 2.0, 10.0,
|
||||
12.0, 4.0, 14.0, 6.0,
|
||||
@@ -44,37 +45,52 @@ void main() {
|
||||
vec3 dir = normalize(vPos);
|
||||
vec3 dabs = abs(dir);
|
||||
float dmax = max(dabs.x, max(dabs.y, dabs.z));
|
||||
vec3 col;
|
||||
|
||||
bool positive;
|
||||
#if FACE_DBG
|
||||
vec3 col;
|
||||
#else
|
||||
vec2 uv;
|
||||
vec2 section;
|
||||
#endif
|
||||
|
||||
if (dabs.x == dmax) {
|
||||
col = vec3(1.0, 0.0, 0.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);
|
||||
section = vec2(positive ? 2.0 : 0.0, 1.0);
|
||||
#endif
|
||||
} else if (dabs.y == dmax) {
|
||||
col = vec3(0.0, 1.0, 0.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);
|
||||
section = vec2(positive ? 1.0 : 2.0, 0.0);
|
||||
#endif
|
||||
} else {
|
||||
col = vec3(0.0, 0.0, 1.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;
|
||||
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 = clamp(uv, vec2(0.0), vec2(1.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);
|
||||
|
||||
//vec4 color = vec4(col, 1.0) * vec4(ColorModulator.rgb, 1.0);
|
||||
vec4 color = texture(Sampler0, uvR) * vec4(ColorModulator.rgb, 1.0);
|
||||
#endif
|
||||
|
||||
fragColor = linear_fog(color, vertexDistance, FogStart, FogEnd, FogColor);
|
||||
}
|
||||
|
||||
@@ -17,12 +17,14 @@
|
||||
],
|
||||
"client": [
|
||||
"client.BlockModelDeserializerMixin",
|
||||
"client.BlockModelMixin",
|
||||
"client.ClientLevelMixin",
|
||||
"client.DebugRendererMixin",
|
||||
"client.GameRendererMixin",
|
||||
"client.LevelRenderer_NoSodium_Mixin",
|
||||
"client.LevelRendererMixin",
|
||||
"client.RenderTargetMixin",
|
||||
"client.SimpleBakedModelMixin",
|
||||
"client.compat.sodium.DefaultMaterialsMixin",
|
||||
"client.compat.sodium.DefaultTerrainRenderPassesMixin",
|
||||
"client.compat.sodium.ShaderChunkRendererMixin",
|
||||
|
||||
Reference in New Issue
Block a user