From 6b9fb3fc21b34a66782dcc0d96bcd83d0ac31467 Mon Sep 17 00:00:00 2001 From: Su5eD Date: Sun, 12 Jul 2026 18:45:02 +0200 Subject: [PATCH] Support FRAPI on NeoForge --- .../sodium/client/services/FRAPIProvider.java | 14 -------------- .../sodium/client/services/FRAPIRegistrar.java | 14 ++++++++++++++ .../services/FRAPIRegistrarProvider.java | 4 ++++ .../client/services/PlatformModelEmitter.java | 2 +- .../services/PlatformModelEmitterProvider.java | 4 ++++ .../client/services/ServiceProvider.java | 7 +++++++ .../mods/sodium/client/services/Services.java | 11 +++++++++++ .../mods/sodium/fabric/SodiumFabricMod.java | 4 ++-- .../render/frapi/FRAPIEmitterProvider.java | 18 ++++++++++++++++++ ...odiumProvider.java => SodiumRegistrar.java} | 5 ++--- .../render/frapi/SodiumRegistrarProvider.java | 18 ++++++++++++++++++ ...c.mods.sodium.client.services.FRAPIProvider | 1 - ...dium.client.services.FRAPIRegistrarProvider | 1 + ...sodium.client.services.PlatformModelEmitter | 1 - ...lient.services.PlatformModelEmitterProvider | 1 + neoforge/build.gradle.kts | 16 ++++++++++++++++ .../mods/sodium/neoforge/SodiumForgeMod.java | 4 ++-- .../mod/resources/META-INF/neoforge.mods.toml | 7 +++++-- 18 files changed, 106 insertions(+), 26 deletions(-) delete mode 100644 common/src/main/java/net/caffeinemc/mods/sodium/client/services/FRAPIProvider.java create mode 100644 common/src/main/java/net/caffeinemc/mods/sodium/client/services/FRAPIRegistrar.java create mode 100644 common/src/main/java/net/caffeinemc/mods/sodium/client/services/FRAPIRegistrarProvider.java create mode 100644 common/src/main/java/net/caffeinemc/mods/sodium/client/services/PlatformModelEmitterProvider.java create mode 100644 common/src/main/java/net/caffeinemc/mods/sodium/client/services/ServiceProvider.java create mode 100644 frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/FRAPIEmitterProvider.java rename frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/{SodiumProvider.java => SodiumRegistrar.java} (60%) create mode 100644 frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/SodiumRegistrarProvider.java delete mode 100644 frapi/src/main/resources/META-INF/services/net.caffeinemc.mods.sodium.client.services.FRAPIProvider create mode 100644 frapi/src/main/resources/META-INF/services/net.caffeinemc.mods.sodium.client.services.FRAPIRegistrarProvider delete mode 100644 frapi/src/main/resources/META-INF/services/net.caffeinemc.mods.sodium.client.services.PlatformModelEmitter create mode 100644 frapi/src/main/resources/META-INF/services/net.caffeinemc.mods.sodium.client.services.PlatformModelEmitterProvider diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/services/FRAPIProvider.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/services/FRAPIProvider.java deleted file mode 100644 index 361d342561..0000000000 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/services/FRAPIProvider.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.caffeinemc.mods.sodium.client.services; - -public interface FRAPIProvider { - FRAPIProvider INSTANCE = Services.loadOr(FRAPIProvider.class, () -> () -> {}); // Returns a no-op implementation if the platform does not support FRAPI - - static FRAPIProvider getInstance() { - return INSTANCE; - } - - /** - * Registers the FRAPI provider. This should only be called once, and should be called during mod initialization. - */ - void register(); -} diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/services/FRAPIRegistrar.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/services/FRAPIRegistrar.java new file mode 100644 index 0000000000..bec5dcbbfd --- /dev/null +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/services/FRAPIRegistrar.java @@ -0,0 +1,14 @@ +package net.caffeinemc.mods.sodium.client.services; + +public interface FRAPIRegistrar { + FRAPIRegistrar INSTANCE = Services.loadConditionalOr(FRAPIRegistrarProvider.class, () -> () -> {}); // Returns a no-op implementation if the platform does not support FRAPI + + static FRAPIRegistrar getInstance() { + return INSTANCE; + } + + /** + * Registers the FRAPI provider. This should only be called once, and should be called during mod initialization. + */ + void register(); +} diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/services/FRAPIRegistrarProvider.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/services/FRAPIRegistrarProvider.java new file mode 100644 index 0000000000..ea8df05c88 --- /dev/null +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/services/FRAPIRegistrarProvider.java @@ -0,0 +1,4 @@ +package net.caffeinemc.mods.sodium.client.services; + +public interface FRAPIRegistrarProvider extends ServiceProvider { +} diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/services/PlatformModelEmitter.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/services/PlatformModelEmitter.java index e5d5f3f6c6..479b33eeb0 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/services/PlatformModelEmitter.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/services/PlatformModelEmitter.java @@ -13,7 +13,7 @@ import java.util.function.Predicate; public interface PlatformModelEmitter { - PlatformModelEmitter INSTANCE = Services.loadOr(PlatformModelEmitter.class, DefaultModelEmitter::new); + PlatformModelEmitter INSTANCE = Services.loadConditionalOr(PlatformModelEmitterProvider.class, DefaultModelEmitter::new); static PlatformModelEmitter getInstance() { return INSTANCE; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/services/PlatformModelEmitterProvider.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/services/PlatformModelEmitterProvider.java new file mode 100644 index 0000000000..f3e3834845 --- /dev/null +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/services/PlatformModelEmitterProvider.java @@ -0,0 +1,4 @@ +package net.caffeinemc.mods.sodium.client.services; + +public interface PlatformModelEmitterProvider extends ServiceProvider { +} diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/services/ServiceProvider.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/services/ServiceProvider.java new file mode 100644 index 0000000000..1d7e39fd7f --- /dev/null +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/services/ServiceProvider.java @@ -0,0 +1,7 @@ +package net.caffeinemc.mods.sodium.client.services; + +public interface ServiceProvider { + boolean isEnabled(); + + T get(); +} diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/services/Services.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/services/Services.java index e4b7ff4fbe..9a2b8b7f60 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/services/Services.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/services/Services.java @@ -27,4 +27,15 @@ public static T loadOr(Class clazz, Supplier supplier) { LOGGER.debug("Loaded {} for service {}", loadedService, clazz); return loadedService; } + + public static , U> U loadConditionalOr(Class clazz, Supplier supplier) { + final U loadedService = ServiceLoader.load(clazz).stream() + .map(ServiceLoader.Provider::get) + .filter(ServiceProvider::isEnabled) + .map(ServiceProvider::get) + .findFirst() + .orElseGet(supplier); + LOGGER.debug("Loaded {} for service {}", loadedService, clazz); + return loadedService; + } } diff --git a/fabric/src/main/java/net/caffeinemc/mods/sodium/fabric/SodiumFabricMod.java b/fabric/src/main/java/net/caffeinemc/mods/sodium/fabric/SodiumFabricMod.java index 6157d4fab2..e770bbf721 100644 --- a/fabric/src/main/java/net/caffeinemc/mods/sodium/fabric/SodiumFabricMod.java +++ b/fabric/src/main/java/net/caffeinemc/mods/sodium/fabric/SodiumFabricMod.java @@ -2,7 +2,7 @@ import net.caffeinemc.mods.sodium.client.SodiumClientMod; import net.caffeinemc.mods.sodium.client.config.ConfigManager; -import net.caffeinemc.mods.sodium.client.services.FRAPIProvider; +import net.caffeinemc.mods.sodium.client.services.FRAPIRegistrar; import net.caffeinemc.mods.sodium.client.util.FlawlessFrames; import net.caffeinemc.mods.sodium.fabric.config.ConfigLoaderFabric; import net.fabricmc.api.ClientModInitializer; @@ -27,6 +27,6 @@ public void onInitializeClient() { .getEntrypoints("frex_flawless_frames", Consumer.class) .forEach(api -> api.accept(FlawlessFrames.getProvider())); - FRAPIProvider.getInstance().register(); + FRAPIRegistrar.getInstance().register(); } } diff --git a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/FRAPIEmitterProvider.java b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/FRAPIEmitterProvider.java new file mode 100644 index 0000000000..f87eaa8604 --- /dev/null +++ b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/FRAPIEmitterProvider.java @@ -0,0 +1,18 @@ +package net.caffeinemc.mods.sodium.client.render.frapi; + +import net.caffeinemc.mods.sodium.client.services.PlatformModelEmitter; +import net.caffeinemc.mods.sodium.client.services.PlatformModelEmitterProvider; +import net.caffeinemc.mods.sodium.client.services.PlatformRuntimeInformation; + +public class FRAPIEmitterProvider implements PlatformModelEmitterProvider { + @Override + public boolean isEnabled() { + return PlatformRuntimeInformation.getInstance().isModInLoadingList("fabric-renderer-api-v1") + || PlatformRuntimeInformation.getInstance().isModInLoadingList("fabric_renderer_api_v1"); + } + + @Override + public PlatformModelEmitter get() { + return new FRAPIEmitter(); + } +} diff --git a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/SodiumProvider.java b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/SodiumRegistrar.java similarity index 60% rename from frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/SodiumProvider.java rename to frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/SodiumRegistrar.java index c814183d68..e94013282c 100644 --- a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/SodiumProvider.java +++ b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/SodiumRegistrar.java @@ -1,10 +1,9 @@ package net.caffeinemc.mods.sodium.client.render.frapi; -import net.caffeinemc.mods.sodium.client.services.FRAPIProvider; +import net.caffeinemc.mods.sodium.client.services.FRAPIRegistrar; import net.fabricmc.fabric.api.client.renderer.v1.Renderer; -public class SodiumProvider implements FRAPIProvider { - @Override +public class SodiumRegistrar implements FRAPIRegistrar { public void register() { Renderer.register(SodiumRenderer.INSTANCE); } diff --git a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/SodiumRegistrarProvider.java b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/SodiumRegistrarProvider.java new file mode 100644 index 0000000000..313998afed --- /dev/null +++ b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/SodiumRegistrarProvider.java @@ -0,0 +1,18 @@ +package net.caffeinemc.mods.sodium.client.render.frapi; + +import net.caffeinemc.mods.sodium.client.services.FRAPIRegistrar; +import net.caffeinemc.mods.sodium.client.services.FRAPIRegistrarProvider; +import net.caffeinemc.mods.sodium.client.services.PlatformRuntimeInformation; + +public class SodiumRegistrarProvider implements FRAPIRegistrarProvider { + @Override + public boolean isEnabled() { + return PlatformRuntimeInformation.getInstance().isModInLoadingList("fabric-renderer-api-v1") + || PlatformRuntimeInformation.getInstance().isModInLoadingList("fabric_renderer_api_v1"); + } + + @Override + public FRAPIRegistrar get() { + return new SodiumRegistrar(); + } +} diff --git a/frapi/src/main/resources/META-INF/services/net.caffeinemc.mods.sodium.client.services.FRAPIProvider b/frapi/src/main/resources/META-INF/services/net.caffeinemc.mods.sodium.client.services.FRAPIProvider deleted file mode 100644 index b948f38490..0000000000 --- a/frapi/src/main/resources/META-INF/services/net.caffeinemc.mods.sodium.client.services.FRAPIProvider +++ /dev/null @@ -1 +0,0 @@ -net.caffeinemc.mods.sodium.client.render.frapi.SodiumProvider \ No newline at end of file diff --git a/frapi/src/main/resources/META-INF/services/net.caffeinemc.mods.sodium.client.services.FRAPIRegistrarProvider b/frapi/src/main/resources/META-INF/services/net.caffeinemc.mods.sodium.client.services.FRAPIRegistrarProvider new file mode 100644 index 0000000000..0aec0ba4e8 --- /dev/null +++ b/frapi/src/main/resources/META-INF/services/net.caffeinemc.mods.sodium.client.services.FRAPIRegistrarProvider @@ -0,0 +1 @@ +net.caffeinemc.mods.sodium.client.render.frapi.SodiumRegistrarProvider \ No newline at end of file diff --git a/frapi/src/main/resources/META-INF/services/net.caffeinemc.mods.sodium.client.services.PlatformModelEmitter b/frapi/src/main/resources/META-INF/services/net.caffeinemc.mods.sodium.client.services.PlatformModelEmitter deleted file mode 100644 index cb341dac30..0000000000 --- a/frapi/src/main/resources/META-INF/services/net.caffeinemc.mods.sodium.client.services.PlatformModelEmitter +++ /dev/null @@ -1 +0,0 @@ -net.caffeinemc.mods.sodium.client.render.frapi.FRAPIEmitter \ No newline at end of file diff --git a/frapi/src/main/resources/META-INF/services/net.caffeinemc.mods.sodium.client.services.PlatformModelEmitterProvider b/frapi/src/main/resources/META-INF/services/net.caffeinemc.mods.sodium.client.services.PlatformModelEmitterProvider new file mode 100644 index 0000000000..5543ffb0b6 --- /dev/null +++ b/frapi/src/main/resources/META-INF/services/net.caffeinemc.mods.sodium.client.services.PlatformModelEmitterProvider @@ -0,0 +1 @@ +net.caffeinemc.mods.sodium.client.render.frapi.FRAPIEmitterProvider \ No newline at end of file diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index 06a318c568..36c686103f 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -47,16 +47,25 @@ val configurationCommonServiceResources: Configuration = configurations.create(" isCanBeResolved = true } +val configurationFrapiModJava: Configuration = configurations.create("frapiJava") { + isCanBeResolved = true +} +val configurationFrapiModResources: Configuration = configurations.create("frapiResources") { + isCanBeResolved = true +} + dependencies { configurationCommonModJava(project(path = ":common", configuration = "commonMainJava")) configurationCommonApiJava(project(path = ":common", configuration = "commonApiJava")) configurationCommonServiceJava(project(path = ":common", configuration = "commonBootJava")) + if (BuildConfig.SUPPORT_FRAPI) configurationFrapiModJava(project(path = ":frapi", configuration = "frapiMainJava")) configurationCommonApiSources(project(path = ":common", configuration = "commonApiSources")) configurationCommonModResources(project(path = ":common", configuration = "commonMainResources")) configurationCommonModResources(project(path = ":common", configuration = "commonApiResources")) configurationCommonServiceResources(project(path = ":common", configuration = "commonBootResources")) + if (BuildConfig.SUPPORT_FRAPI) configurationFrapiModResources(project(path = ":frapi", configuration = "frapiMainResources")) fun addEmbeddedFabricModule(dependency: String) { dependencies.implementation(dependency) @@ -72,6 +81,10 @@ val modJar = tasks.register("modJar") { from(configurationCommonModJava) from(configurationCommonApiJava) from(configurationCommonModResources) + if (BuildConfig.SUPPORT_FRAPI) { + from(configurationFrapiModJava) + from(configurationFrapiModResources) + } from(sourceSets["mod"].output) @@ -151,6 +164,9 @@ neoForge { sourceSet(sourceSets["mod"]) sourceSet(project(":common").sourceSets["main"]) sourceSet(project(":common").sourceSets["api"]) + if (BuildConfig.SUPPORT_FRAPI) { + sourceSet(project(":frapi").sourceSets["main"]) + } } create("sodium-service") { diff --git a/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/SodiumForgeMod.java b/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/SodiumForgeMod.java index 5f055d7e23..0c57883458 100644 --- a/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/SodiumForgeMod.java +++ b/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/SodiumForgeMod.java @@ -1,7 +1,7 @@ package net.caffeinemc.mods.sodium.neoforge; import net.caffeinemc.mods.sodium.client.gui.VideoSettingsScreen; -import net.caffeinemc.mods.sodium.client.services.FRAPIProvider; +import net.caffeinemc.mods.sodium.client.services.FRAPIRegistrar; import net.caffeinemc.mods.sodium.client.util.FlawlessFrames; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.IEventBus; @@ -36,6 +36,6 @@ public SodiumForgeMod(IEventBus bus, ModContainer modContainer) { } } - FRAPIProvider.getInstance().register(); + FRAPIRegistrar.getInstance().register(); } } \ No newline at end of file diff --git a/neoforge/src/mod/resources/META-INF/neoforge.mods.toml b/neoforge/src/mod/resources/META-INF/neoforge.mods.toml index 43137d650a..7a63f51398 100644 --- a/neoforge/src/mod/resources/META-INF/neoforge.mods.toml +++ b/neoforge/src/mod/resources/META-INF/neoforge.mods.toml @@ -18,10 +18,9 @@ description = ''' Sodium is a powerful rendering engine for Minecraft which improves frame rates and reduces lag spikes. ''' -provides = ["indium"] - [modproperties.sodium] "fabric-renderer-api-v1:contains_renderer" = true +"fabric:provides" = ["indium"] [[mixins]] config = "sodium-common.mixins.json" @@ -29,6 +28,10 @@ config = "sodium-common.mixins.json" [[mixins]] config = "sodium-neoforge.mixins.json" +[[mixins]] +config = "sodium-frapi.mixins.json" +requiredMods = ["fabric_renderer_api_v1"] + [[dependencies.sodium]] modId = "neoforge" type = "required"