From c9f13607fc5bc35973a0ea635995de6b6f77e329 Mon Sep 17 00:00:00 2001 From: techno-sam <77073745+techno-sam@users.noreply.github.com> Date: Thu, 14 May 2026 19:23:21 +0200 Subject: [PATCH] Skybox X neoforge sodium compat --- build.gradle.kts | 1 + .../compat/sodium/SkyboxShaderInterface.java | 6 ++-- .../mixin/client/TextureAtlasAccessor.java | 14 ++++++++++ .../crystalline_sky-common.mixins.json | 1 + gradle.properties | 2 +- libs.versions.toml | 2 ++ neoforge/build.gradle.kts | 6 ++-- .../compat/sodium/ShaderLoaderMixin.java | 27 ++++++++++++++++++ .../compat/sodium/SkyboxBakedModelMixin.java | 28 +++++++++++++++++++ .../skybox_model/SkyboxBakedModel.java | 8 +----- .../resources/crystalline_sky.mixins.json | 4 ++- 11 files changed, 85 insertions(+), 14 deletions(-) create mode 100644 common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/TextureAtlasAccessor.java create mode 100644 neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/mixin/client/compat/sodium/ShaderLoaderMixin.java create mode 100644 neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/mixin/client/compat/sodium/SkyboxBakedModelMixin.java diff --git a/build.gradle.kts b/build.gradle.kts index 8ac8ac6..5057750 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -234,6 +234,7 @@ fun Project.setupRepositories() { exclusiveMaven("https://api.modrinth.com/maven", "maven.modrinth") // Axiom, Sodium exclusiveMaven("https://maven.terraformersmc.com/", "com.terraformersmc") // Mod Menu exclusiveMaven("https://maven.parchmentmc.org", "org.parchmentmc.data") // Parchment Mappings + exclusiveMaven("https://maven.su5ed.dev/releases", "org.sinytra.forgified-fabric-api") // FFAPI, for NeoForge Sodium compat flatDir { dir("$rootDir/libs") } diff --git a/common/src/main/java/io/github/slimeistdev/crystalline_sky/compat/sodium/SkyboxShaderInterface.java b/common/src/main/java/io/github/slimeistdev/crystalline_sky/compat/sodium/SkyboxShaderInterface.java index 25166b6..fadaf99 100644 --- a/common/src/main/java/io/github/slimeistdev/crystalline_sky/compat/sodium/SkyboxShaderInterface.java +++ b/common/src/main/java/io/github/slimeistdev/crystalline_sky/compat/sodium/SkyboxShaderInterface.java @@ -1,5 +1,6 @@ package io.github.slimeistdev.crystalline_sky.compat.sodium; +import io.github.slimeistdev.crystalline_sky.mixin.client.TextureAtlasAccessor; import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineAtlases; import io.github.slimeistdev.crystalline_sky.util.SharedRenderVariables; import net.caffeinemc.mods.sodium.client.gl.device.GLRenderDevice; @@ -7,7 +8,6 @@ import net.caffeinemc.mods.sodium.client.gl.shader.uniform.GlUniformFloat2v; import net.caffeinemc.mods.sodium.client.gl.shader.uniform.GlUniformMatrix4f; import net.caffeinemc.mods.sodium.client.render.chunk.shader.ChunkShaderOptions; import net.caffeinemc.mods.sodium.client.render.chunk.shader.ShaderBindingContext; -import net.caffeinemc.mods.sodium.mixin.core.render.texture.TextureAtlasAccessor; import net.minecraft.client.Minecraft; public class SkyboxShaderInterface extends SkyShaderInterface { @@ -29,8 +29,8 @@ public class SkyboxShaderInterface extends SkyShaderInterface { double subTexelPrecision = 1 << GLRenderDevice.INSTANCE.getSubTexelPrecisionBits(); double subTexelOffset = 3.0517578E-5F; this.uniformTexCoordShrink.set( - (float) (subTexelOffset - (double) 1.0F / (double) textureAtlas.getField_43113() / subTexelPrecision), - (float) (subTexelOffset - (double) 1.0F / (double) textureAtlas.getField_43114() / subTexelPrecision) + (float) (subTexelOffset - (double) 1.0F / (double) textureAtlas.crystalline_sky$getWidth() / subTexelPrecision), + (float) (subTexelOffset - (double) 1.0F / (double) textureAtlas.crystalline_sky$getHeight() / subTexelPrecision) ); } } diff --git a/common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/TextureAtlasAccessor.java b/common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/TextureAtlasAccessor.java new file mode 100644 index 0000000..f6cf83b --- /dev/null +++ b/common/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/TextureAtlasAccessor.java @@ -0,0 +1,14 @@ +package io.github.slimeistdev.crystalline_sky.mixin.client; + +import net.minecraft.client.renderer.texture.TextureAtlas; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(TextureAtlas.class) +public interface TextureAtlasAccessor { + @Accessor("width") + int crystalline_sky$getWidth(); + + @Accessor("height") + int crystalline_sky$getHeight(); +} diff --git a/common/src/main/resources/crystalline_sky-common.mixins.json b/common/src/main/resources/crystalline_sky-common.mixins.json index 52a8396..36c34e2 100644 --- a/common/src/main/resources/crystalline_sky-common.mixins.json +++ b/common/src/main/resources/crystalline_sky-common.mixins.json @@ -24,6 +24,7 @@ "client.LevelRendererMixin", "client.ModelBlockRendererMixin", "client.RenderTargetMixin", + "client.TextureAtlasAccessor", "client.compat.iris.ExtendedShaderMixin", "client.compat.iris.IrisRenderingPipelineAccessor", "client.compat.iris.IrisRenderingPipelineMixin", diff --git a/gradle.properties b/gradle.properties index 1fa1754..e783ce3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,6 +26,6 @@ modVersion=0.1.2 compatibleVersions=1.21.1 # mod compat -enable_sodium=false +enable_sodium=true enable_iris=false enable_axiom=false diff --git a/libs.versions.toml b/libs.versions.toml index 1e31b70..aecbc48 100644 --- a/libs.versions.toml +++ b/libs.versions.toml @@ -8,6 +8,7 @@ mc = "1.21.1" parchment = "2024.11.17" fl = "0.18.6" fapi = "0.116.10+1.21.1" +ffapi-renderer = "3.4.1+9125b6dc19" nf = "21.1.215" jsr305 = "3.0.2" mixinextras = "0.5.0" @@ -34,6 +35,7 @@ parchment = { group = "org.parchmentmc.data", name = "parchment-1.21.1", version fl = { group = "net.fabricmc", name = "fabric-loader", version.ref = "fl" } fapi = { group = "net.fabricmc.fabric-api", name = "fabric-api", version.ref = "fapi" } +ffapi-renderer = { group = "org.sinytra.forgified-fabric-api", name = "fabric-renderer-api-v1", version.ref = "ffapi-renderer" } nf = { group = "net.neoforged", name = "neoforge", version.ref = "nf" } diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index a636d7d..09a777c 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -16,15 +16,17 @@ repositories { name = "NeoForged" url = uri("https://maven.neoforged.net/releases") } + } dependencies { neoForge(libs.nf) + modCompileOnly(libs.ffapi.renderer) // only for sodium compat modCompileOnly(libs.sodium.neoforge) - /*if (!inCI && "enable_sodium"().toBoolean()) { // this doesn't work, because of jar-in-jar + if (!inCI && "enable_sodium"().toBoolean()) { // this doesn't work, because of jar-in-jar modLocalRuntime(libs.sodium.neoforge) - }*/ + } modCompileOnly(libs.iris.neoforge) if (!inCI && "enable_iris"().toBoolean()) { // this doesn't work, because of jar-in-jar diff --git a/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/mixin/client/compat/sodium/ShaderLoaderMixin.java b/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/mixin/client/compat/sodium/ShaderLoaderMixin.java new file mode 100644 index 0000000..eaab59a --- /dev/null +++ b/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/mixin/client/compat/sodium/ShaderLoaderMixin.java @@ -0,0 +1,27 @@ +package io.github.slimeistdev.crystalline_sky.neoforge.mixin.client.compat.sodium; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import io.github.slimeistdev.crystalline_sky.CrystallineSky; +import io.github.slimeistdev.crystalline_sky.annotation.mixin.ConditionalMixin; +import io.github.slimeistdev.crystalline_sky.compat.Mods; +import net.caffeinemc.mods.sodium.client.gl.shader.ShaderLoader; +import net.minecraft.resources.ResourceLocation; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import java.io.InputStream; + +@ConditionalMixin(mods = Mods.SODIUM) +@Mixin(ShaderLoader.class) +public class ShaderLoaderMixin { + // thank you neoforge for making mods be in separate modules + @SuppressWarnings("NameDoesntMatchTargetClass") + @WrapOperation(method = "getShaderSource", at = @At(value = "INVOKE", target = "Ljava/lang/Class;getResourceAsStream(Ljava/lang/String;)Ljava/io/InputStream;")) + private static InputStream getShadersInProperContext(Class instance, String name, Operation original, ResourceLocation name$) { + if (name$.getNamespace().equals(CrystallineSky.ID)) + return original.call(CrystallineSky.class, name); + + return original.call(instance, name); + } +} diff --git a/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/mixin/client/compat/sodium/SkyboxBakedModelMixin.java b/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/mixin/client/compat/sodium/SkyboxBakedModelMixin.java new file mode 100644 index 0000000..ebbeb70 --- /dev/null +++ b/neoforge/src/main/java/io/github/slimeistdev/crystalline_sky/neoforge/mixin/client/compat/sodium/SkyboxBakedModelMixin.java @@ -0,0 +1,28 @@ +package io.github.slimeistdev.crystalline_sky.neoforge.mixin.client.compat.sodium; + +import io.github.slimeistdev.crystalline_sky.annotation.mixin.ConditionalMixin; +import io.github.slimeistdev.crystalline_sky.compat.Mods; +import io.github.slimeistdev.crystalline_sky.neoforge.skybox_model.SkyboxBakedModel; +import io.github.slimeistdev.crystalline_sky.util.SharedRenderVariables; +import net.caffeinemc.mods.sodium.client.render.frapi.render.AbstractBlockRenderContext; +import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; +import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.state.BlockState; +import org.spongepowered.asm.mixin.Mixin; + +import java.util.function.Supplier; + +@ConditionalMixin(mods = Mods.SODIUM) +@Mixin(SkyboxBakedModel.class) +public class SkyboxBakedModelMixin implements FabricBakedModel { + @Override + public void emitBlockQuads(BlockAndTintGetter blockView, BlockState state, BlockPos pos, Supplier randomSupplier, RenderContext context) { + SharedRenderVariables.pushShadeFullBright(); + ((AbstractBlockRenderContext) context).bufferDefaultModel((BakedModel) this, state); + SharedRenderVariables.popShadeFullBright(); + } +} 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 index 15294b1..4a60d3a 100644 --- 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 @@ -1,6 +1,5 @@ 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; @@ -84,13 +83,8 @@ public class SkyboxBakedModel extends BakedModelWrapper 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; + return process(quads); }); } diff --git a/neoforge/src/main/resources/crystalline_sky.mixins.json b/neoforge/src/main/resources/crystalline_sky.mixins.json index f787ae8..f964777 100644 --- a/neoforge/src/main/resources/crystalline_sky.mixins.json +++ b/neoforge/src/main/resources/crystalline_sky.mixins.json @@ -10,7 +10,9 @@ "mixins": [ ], "client": [ - "client.RenderTypeMixin" + "client.RenderTypeMixin", + "client.compat.sodium.ShaderLoaderMixin", + "client.compat.sodium.SkyboxBakedModelMixin" ], "server": [ ],