1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2024-12-04 23:40:00 +00:00

Unify Iris integrations

Iris now has built-in support for NeoForge, so we can use the same
integration on both.

We also re-enable Forge's client tests, and test Iris there too.

Fixes #1967
This commit is contained in:
Jonathan Coates 2024-09-11 20:07:12 +01:00
parent 4f3247a0e2
commit 63181e73a1
No known key found for this signature in database
GPG Key ID: B9E431FF07C98D06
11 changed files with 84 additions and 95 deletions

View File

@ -18,6 +18,7 @@ import java.nio.file.Files
import java.util.concurrent.TimeUnit
import java.util.function.Supplier
import javax.inject.Inject
import kotlin.collections.set
import kotlin.random.Random
/**
@ -108,6 +109,23 @@ abstract class ClientJavaExec : JavaExec() {
}
}
/**
* Configure Iris to use Complementary Shaders.
*/
fun withComplementaryShaders() {
val cct = project.extensions.getByType(CCTweakedExtension::class.java)
withFileFrom(workingDir.resolve("shaderpacks/ComplementaryShaders_v4.6.zip")) {
cct.downloadFile("Complementary Shaders", "https://edge.forgecdn.net/files/3951/170/ComplementaryShaders_v4.6.zip")
}
withFileContents(workingDir.resolve("config/iris.properties")) {
"""
enableShaders=true
shaderPack=ComplementaryShaders_v4.6.zip
""".trimIndent()
}
}
@TaskAction
override fun exec() {
Files.createDirectories(workingDir.toPath())

View File

@ -38,14 +38,14 @@ nightConfig = "3.6.7"
# Minecraft mods
emi = "1.1.7+1.21"
fabricPermissions = "0.3.1"
iris = "1.6.14+1.20.4"
iris-fabric = "1.8.0-beta.3+1.21-fabric"
iris-forge = "1.8.0-beta.3+1.21-neoforge"
jei = "19.8.2.99"
modmenu = "11.0.0-rc.4"
moreRed = "4.0.0.4"
oculus = "1.2.5"
rei = "16.0.729"
rubidium = "0.6.1"
sodium = "mc1.20-0.4.10"
sodium-fabric = "mc1.21-0.6.0-beta.1-fabric"
sodium-forge = "mc1.21-0.6.0-beta.1-neoforge"
mixinExtra = "0.3.5"
create-forge = "0.5.1.f-33"
create-fabric = "0.5.1-f-build.1467+mc1.20.1"
@ -111,7 +111,8 @@ fabric-api = { module = "net.fabricmc.fabric-api:fabric-api", version.ref = "fab
fabric-junit = { module = "net.fabricmc:fabric-loader-junit", version.ref = "fabric-loader" }
fabric-loader = { module = "net.fabricmc:fabric-loader", version.ref = "fabric-loader" }
fabricPermissions = { module = "me.lucko:fabric-permissions-api", version.ref = "fabricPermissions" }
iris = { module = "maven.modrinth:iris", version.ref = "iris" }
iris-fabric = { module = "maven.modrinth:iris", version.ref = "iris-fabric" }
iris-forge = { module = "maven.modrinth:iris", version.ref = "iris-forge" }
jei-api = { module = "mezz.jei:jei-1.21-common-api", version.ref = "jei" }
jei-fabric = { module = "mezz.jei:jei-1.21-fabric", version.ref = "jei" }
jei-forge = { module = "mezz.jei:jei-1.21-neoforge", version.ref = "jei" }
@ -119,12 +120,11 @@ mixin = { module = "org.spongepowered:mixin", version.ref = "mixin" }
mixinExtra = { module = "io.github.llamalad7:mixinextras-common", version.ref = "mixinExtra" }
modmenu = { module = "com.terraformersmc:modmenu", version.ref = "modmenu" }
moreRed = { module = "commoble.morered:morered-1.20.1", version.ref = "moreRed" }
oculus = { module = "maven.modrinth:oculus", version.ref = "oculus" }
rei-api = { module = "me.shedaniel:RoughlyEnoughItems-api", version.ref = "rei" }
rei-builtin = { module = "me.shedaniel:RoughlyEnoughItems-default-plugin", version.ref = "rei" }
rei-fabric = { module = "me.shedaniel:RoughlyEnoughItems-fabric", version.ref = "rei" }
rubidium = { module = "maven.modrinth:rubidium", version.ref = "rubidium" }
sodium = { module = "maven.modrinth:sodium", version.ref = "sodium" }
sodium-fabric = { module = "maven.modrinth:sodium", version.ref = "sodium.fabric" }
sodium-forge = { module = "maven.modrinth:sodium", version.ref = "sodium.forge" }
# Testing
hamcrest = { module = "org.hamcrest:hamcrest", version.ref = "hamcrest" }
@ -184,10 +184,10 @@ annotations = ["jsr305", "checkerFramework", "jetbrainsAnnotations"]
kotlin = ["kotlin-stdlib", "kotlin-coroutines"]
# Minecraft
externalMods-common = ["jei-api", "nightConfig-core", "nightConfig-toml"]
externalMods-forge-compile = ["moreRed", "oculus", "jei-api"]
externalMods-common = ["iris-forge", "jei-api", "nightConfig-core", "nightConfig-toml"]
externalMods-forge-compile = ["moreRed", "iris-forge", "jei-api"]
externalMods-forge-runtime = ["jei-forge"]
externalMods-fabric-compile = ["fabricPermissions", "iris", "jei-api", "rei-api", "rei-builtin"]
externalMods-fabric-compile = ["fabricPermissions", "iris-fabric", "jei-api", "rei-api", "rei-builtin"]
externalMods-fabric-runtime = ["jei-fabric", "modmenu"]
# Testing

View File

@ -8,7 +8,7 @@ import com.google.auto.service.AutoService;
import com.mojang.blaze3d.vertex.VertexFormat;
import dan200.computercraft.client.render.RenderTypes;
import dan200.computercraft.client.render.text.DirectFixedWidthFontRenderer;
import net.fabricmc.loader.api.FabricLoader;
import dan200.computercraft.shared.platform.PlatformHelper;
import net.irisshaders.iris.api.v0.IrisApi;
import net.irisshaders.iris.api.v0.IrisTextVertexSink;
import net.minecraft.util.FastColor;
@ -21,7 +21,7 @@ import java.util.function.IntFunction;
public class IrisShaderMod implements ShaderMod.Provider {
@Override
public Optional<ShaderMod> get() {
return FabricLoader.getInstance().isModLoaded("iris") ? Optional.of(new Impl()) : Optional.empty();
return PlatformHelper.get().isModLoaded("iris") ? Optional.of(new Impl()) : Optional.empty();
}
private static final class Impl extends ShaderMod {

View File

@ -60,6 +60,14 @@ public interface PlatformHelper {
return instance == null ? Services.raise(PlatformHelper.class, Instance.ERROR) : instance;
}
/**
* Determine if the specified mod is loaded.
*
* @param id The id of the mod to check.
* @return Whether this mod is loaded.
*/
boolean isModLoaded(String id);
/**
* Create a new config builder.
*

View File

@ -49,6 +49,11 @@ import java.util.function.Predicate;
@AutoService({ PlatformHelper.class, ComputerCraftAPIService.class })
public class TestPlatformHelper extends AbstractComputerCraftAPI implements PlatformHelper {
@Override
public boolean isModLoaded(String id) {
return false;
}
@Override
public ConfigFile.Builder createConfigBuilder() {
throw new UnsupportedOperationException("Cannot create config file inside tests");

View File

@ -76,9 +76,9 @@ dependencies {
exclude("net.fabricmc.fabric-api")
}
"modTestWithSodium"(libs.sodium)
"modTestWithIris"(libs.iris)
"modTestWithIris"(libs.sodium)
"modTestWithSodium"(libs.sodium.fabric)
"modTestWithIris"(libs.iris.fabric)
"modTestWithIris"(libs.sodium.fabric)
"includeRuntimeOnly"(libs.cobalt)
"includeRuntimeOnly"(libs.jzlib)
@ -247,15 +247,7 @@ val runGametestClientWithIris by tasks.registering(ClientJavaExec::class) {
tags("iris")
classpath += configurations["testWithIris"]
withFileFrom(workingDir.resolve("shaderpacks/ComplementaryShaders_v4.6.zip")) {
cct.downloadFile("Complementary Shaders", "https://edge.forgecdn.net/files/3951/170/ComplementaryShaders_v4.6.zip")
}
withFileContents(workingDir.resolve("config/iris.properties")) {
"""
enableShaders=true
shaderPack=ComplementaryShaders_v4.6.zip
""".trimIndent()
}
withComplementaryShaders()
}
cct.jacoco(runGametestClientWithIris)

View File

@ -29,6 +29,7 @@ import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerType;
import net.fabricmc.fabric.api.tag.convention.v2.ConventionalItemTags;
import net.fabricmc.fabric.api.transfer.v1.item.InventoryStorage;
import net.fabricmc.fabric.api.transfer.v1.item.ItemStorage;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.commands.synchronization.ArgumentTypeInfo;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
@ -74,6 +75,11 @@ import java.util.function.Supplier;
@AutoService(PlatformHelper.class)
public class PlatformHelperImpl implements PlatformHelper {
@Override
public boolean isModLoaded(String id) {
return FabricLoader.getInstance().isModLoaded(id);
}
@Override
public ConfigFile.Builder createConfigBuilder() {
return new FabricConfigFile.Builder();

View File

@ -118,6 +118,11 @@ configurations {
// Prevent ending up with multiple versions of libraries on the classpath.
shouldResolveConsistentlyWith(minecraftLibrary.get())
}
register("testWithIris") {
isCanBeConsumed = false
isCanBeResolved = true
}
}
dependencies {
@ -160,6 +165,9 @@ dependencies {
"testMinecraftLibrary"(libs.bundles.test)
testFixturesImplementation(testFixtures(project(":core")))
"testWithIris"(libs.iris.forge)
"testWithIris"(libs.sodium.forge)
}
// Compile tasks
@ -219,18 +227,29 @@ val runGametest by tasks.registering(JavaExec::class) {
cct.jacoco(runGametest)
tasks.check { dependsOn(runGametest) }
/*val runGametestClient by tasks.registering(ClientJavaExec::class) {
val runGametestClient by tasks.registering(ClientJavaExec::class) {
description = "Runs client-side gametests with no mods"
setRunConfig(runs["testClient"])
copyFrom("runGameTestClient")
tags("client")
}
cct.jacoco(runGametestClient)
val runGametestClientWithIris by tasks.registering(ClientJavaExec::class) {
description = "Runs client-side gametests with Iris"
copyFrom("runGameTestClient")
tags("iris")
classpath += configurations["testWithIris"]
withComplementaryShaders()
}
cct.jacoco(runGametestClientWithIris)
tasks.register("checkClient") {
group = LifecycleBasePlugin.VERIFICATION_GROUP
description = "Runs all client-only checks."
dependsOn(runGametestClient)
}*/
dependsOn(runGametestClient, runGametestClientWithIris)
}
// Upload tasks

View File

@ -1,66 +0,0 @@
// SPDX-FileCopyrightText: 2022 The CC: Tweaked Developers
//
// SPDX-License-Identifier: MPL-2.0
package dan200.computercraft.client.integration;
import com.google.auto.service.AutoService;
import com.mojang.blaze3d.vertex.VertexFormat;
import dan200.computercraft.client.render.RenderTypes;
import dan200.computercraft.client.render.text.DirectFixedWidthFontRenderer;
import net.irisshaders.iris.api.v0.IrisApi;
import net.irisshaders.iris.api.v0.IrisTextVertexSink;
import net.minecraft.util.FastColor;
import net.neoforged.fml.ModList;
import java.nio.ByteBuffer;
import java.util.Optional;
import java.util.function.IntFunction;
/**
* A {@link ShaderMod} for Oculus (the Forge Iris port).
*/
@AutoService(ShaderMod.Provider.class)
public class IrisShaderMod implements ShaderMod.Provider {
@Override
public Optional<ShaderMod> get() {
return ModList.get().isLoaded("oculus") ? Optional.of(new Impl()) : Optional.empty();
}
private static final class Impl extends ShaderMod {
@Override
public boolean isRenderingShadowPass() {
return IrisApi.getInstance().isRenderingShadowPass();
}
@Override
public DirectFixedWidthFontRenderer.QuadEmitter getQuadEmitter(int vertexCount, IntFunction<ByteBuffer> makeBuffer) {
return IrisApi.getInstance().getMinorApiRevision() >= 1
? new IrisQuadEmitter(vertexCount, makeBuffer)
: super.getQuadEmitter(vertexCount, makeBuffer);
}
private static final class IrisQuadEmitter implements DirectFixedWidthFontRenderer.QuadEmitter {
private final IrisTextVertexSink sink;
private IrisQuadEmitter(int vertexCount, IntFunction<ByteBuffer> makeBuffer) {
sink = IrisApi.getInstance().createTextVertexSink(vertexCount, makeBuffer);
}
@Override
public VertexFormat format() {
return sink.getUnderlyingVertexFormat();
}
@Override
public ByteBuffer buffer() {
return sink.getUnderlyingByteBuffer();
}
@Override
public void quad(float x1, float y1, float x2, float y2, float z, int colour, float u1, float v1, float u2, float v2) {
sink.quad(x1, y1, x2, y2, z, FastColor.ABGR32.fromArgb32(colour), u1, v1, u2, v2, RenderTypes.FULL_BRIGHT_LIGHTMAP);
}
}
}
}

View File

@ -50,6 +50,7 @@ import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.Vec3;
import net.neoforged.fml.ModList;
import net.neoforged.neoforge.capabilities.BlockCapability;
import net.neoforged.neoforge.capabilities.BlockCapabilityCache;
import net.neoforged.neoforge.capabilities.Capabilities;
@ -72,6 +73,11 @@ import java.util.function.Supplier;
@AutoService(PlatformHelper.class)
public class PlatformHelperImpl implements PlatformHelper {
@Override
public boolean isModLoaded(String id) {
return ModList.get().isLoaded(id);
}
@Override
public ConfigFile.Builder createConfigBuilder() {
return new ForgeConfigFile.Builder();

View File

@ -115,6 +115,7 @@ def main():
images: list[Image] = []
for project, dir in {
"Forge": "projects/forge/build/gametest/runGametestClient",
"Forge (+Iris)": "projects/forge/build/gametest/runGametestClientWithIris",
"Fabric": "projects/fabric/build/gametest/runGametestClient",
"Fabric (+Sodium)": "projects/fabric/build/gametest/runGametestClientWithSodium",
"Fabric (+Iris)": "projects/fabric/build/gametest/runGametestClientWithIris",