mirror of
https://github.com/Jozufozu/Flywheel.git
synced 2024-12-28 16:06:28 +01:00
Oculus compatibility
- Rename OptifineHandler to ShadersModHandler - Rename functions to match fabric version
This commit is contained in:
parent
c3b1a43beb
commit
273c99619f
7 changed files with 200 additions and 125 deletions
15
build.gradle
15
build.gradle
|
@ -44,6 +44,8 @@ minecraft {
|
||||||
property 'forge.logging.markers', ''
|
property 'forge.logging.markers', ''
|
||||||
property 'forge.logging.console.level', 'debug'
|
property 'forge.logging.console.level', 'debug'
|
||||||
property 'mixin.debug.export', 'true'
|
property 'mixin.debug.export', 'true'
|
||||||
|
property 'mixin.env.remapRefMap', 'true'
|
||||||
|
property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg"
|
||||||
|
|
||||||
arg '-mixin.config=flywheel.mixins.json'
|
arg '-mixin.config=flywheel.mixins.json'
|
||||||
|
|
||||||
|
@ -102,12 +104,23 @@ repositories {
|
||||||
name 'tterrag maven'
|
name 'tterrag maven'
|
||||||
url 'https://maven.tterrag.com/'
|
url 'https://maven.tterrag.com/'
|
||||||
}
|
}
|
||||||
|
maven {
|
||||||
|
name = "Modrinth"
|
||||||
|
url = "https://api.modrinth.com/maven"
|
||||||
|
content {
|
||||||
|
includeGroup "maven.modrinth"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}"
|
minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}"
|
||||||
|
|
||||||
compileOnly fg.deobf("curse.maven:starlight-526854:3599856")
|
// switch to implementation for debugging
|
||||||
|
compileOnly fg.deobf("maven.modrinth:starlight-forge:1.0.2+1.18.2")
|
||||||
|
|
||||||
|
compileOnly fg.deobf("maven.modrinth:rubidium:0.5.2a")
|
||||||
|
compileOnly fg.deobf("curse.maven:oculus-581495:3821406")
|
||||||
|
|
||||||
// https://discord.com/channels/313125603924639766/725850371834118214/910619168821354497
|
// https://discord.com/channels/313125603924639766/725850371834118214/910619168821354497
|
||||||
// Prevent Mixin annotation processor from getting into IntelliJ's annotation processor settings
|
// Prevent Mixin annotation processor from getting into IntelliJ's annotation processor settings
|
||||||
|
|
|
@ -4,7 +4,7 @@ import org.apache.maven.artifact.versioning.ArtifactVersion;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.backend.Backend;
|
import com.jozufozu.flywheel.backend.Backend;
|
||||||
import com.jozufozu.flywheel.backend.OptifineHandler;
|
import com.jozufozu.flywheel.backend.ShadersModHandler;
|
||||||
import com.jozufozu.flywheel.config.BackendTypeArgument;
|
import com.jozufozu.flywheel.config.BackendTypeArgument;
|
||||||
import com.jozufozu.flywheel.config.FlwCommands;
|
import com.jozufozu.flywheel.config.FlwCommands;
|
||||||
import com.jozufozu.flywheel.config.FlwConfig;
|
import com.jozufozu.flywheel.config.FlwConfig;
|
||||||
|
@ -65,7 +65,7 @@ public class Flywheel {
|
||||||
private static void clientInit(IEventBus forgeEventBus, IEventBus modEventBus) {
|
private static void clientInit(IEventBus forgeEventBus, IEventBus modEventBus) {
|
||||||
CrashReportCallables.registerCrashCallable("Flywheel Backend", Backend::getBackendDescriptor);
|
CrashReportCallables.registerCrashCallable("Flywheel Backend", Backend::getBackendDescriptor);
|
||||||
|
|
||||||
OptifineHandler.init();
|
ShadersModHandler.init();
|
||||||
Backend.init();
|
Backend.init();
|
||||||
|
|
||||||
forgeEventBus.addListener(FlwCommands::registerClientCommands);
|
forgeEventBus.addListener(FlwCommands::registerClientCommands);
|
||||||
|
|
|
@ -96,7 +96,7 @@ public class Backend {
|
||||||
BackendType preferredChoice = FlwConfig.get()
|
BackendType preferredChoice = FlwConfig.get()
|
||||||
.getBackendType();
|
.getBackendType();
|
||||||
|
|
||||||
boolean usingShaders = OptifineHandler.isUsingShaders();
|
boolean usingShaders = ShadersModHandler.isShaderPackInUse();
|
||||||
boolean canUseEngine = switch (preferredChoice) {
|
boolean canUseEngine = switch (preferredChoice) {
|
||||||
case OFF -> true;
|
case OFF -> true;
|
||||||
case BATCHING -> !usingShaders;
|
case BATCHING -> !usingShaders;
|
||||||
|
|
|
@ -1,117 +0,0 @@
|
||||||
package com.jozufozu.flywheel.backend;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.util.function.BooleanSupplier;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
|
|
||||||
import net.minecraft.client.Camera;
|
|
||||||
import net.minecraft.client.renderer.culling.Frustum;
|
|
||||||
|
|
||||||
public final class OptifineHandler {
|
|
||||||
public static final String OPTIFINE_ROOT_PACKAGE = "net.optifine";
|
|
||||||
public static final String SHADER_PACKAGE = "net.optifine.shaders";
|
|
||||||
|
|
||||||
private static boolean isOptifineInstalled;
|
|
||||||
private static BooleanSupplier shadersEnabledSupplier;
|
|
||||||
private static BooleanSupplier shadowPassSupplier;
|
|
||||||
private static FrustumConstructor shadowFrustumConstructor;
|
|
||||||
|
|
||||||
private OptifineHandler() {
|
|
||||||
}
|
|
||||||
|
|
||||||
private static FrustumConstructor createShadowFrustumConstructor() {
|
|
||||||
try {
|
|
||||||
Class<?> ofShaders = Class.forName("net.optifine.shaders.ShadersRender");
|
|
||||||
Method method = ofShaders.getDeclaredMethod("makeShadowFrustum", Camera.class, Float.TYPE);
|
|
||||||
method.setAccessible(true);
|
|
||||||
return (cam, pt) -> {
|
|
||||||
try {
|
|
||||||
return (Frustum) method.invoke(null, cam, pt);
|
|
||||||
} catch (Exception ignored) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
} catch (Exception ignored) {
|
|
||||||
return ($, $$) -> null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static BooleanSupplier createShadowPassSupplier() {
|
|
||||||
try {
|
|
||||||
Class<?> ofShaders = Class.forName("net.optifine.shaders.Shaders");
|
|
||||||
Field field = ofShaders.getDeclaredField("isShadowPass");
|
|
||||||
field.setAccessible(true);
|
|
||||||
return () -> {
|
|
||||||
try {
|
|
||||||
return field.getBoolean(null);
|
|
||||||
} catch (IllegalAccessException ignored) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
} catch (Exception ignored) {
|
|
||||||
return () -> false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static BooleanSupplier createShadersEnabledSupplier() {
|
|
||||||
try {
|
|
||||||
Class<?> ofShaders = Class.forName("net.optifine.shaders.Shaders");
|
|
||||||
Field field = ofShaders.getDeclaredField("shaderPackLoaded");
|
|
||||||
field.setAccessible(true);
|
|
||||||
return () -> {
|
|
||||||
try {
|
|
||||||
return field.getBoolean(null);
|
|
||||||
} catch (IllegalAccessException ignored) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
} catch (Exception ignored) {
|
|
||||||
return () -> false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void init() {
|
|
||||||
Package optifinePackage = Package.getPackage(OPTIFINE_ROOT_PACKAGE);
|
|
||||||
isOptifineInstalled = optifinePackage != null;
|
|
||||||
|
|
||||||
if (isOptifineInstalled) {
|
|
||||||
Backend.LOGGER.info("Optifine detected.");
|
|
||||||
} else {
|
|
||||||
Backend.LOGGER.info("Optifine not detected.");
|
|
||||||
}
|
|
||||||
|
|
||||||
shadersEnabledSupplier = createShadersEnabledSupplier();
|
|
||||||
shadowPassSupplier = createShadowPassSupplier();
|
|
||||||
shadowFrustumConstructor = createShadowFrustumConstructor();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isOptifineInstalled() {
|
|
||||||
return isOptifineInstalled;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isUsingShaders() {
|
|
||||||
return shadersEnabledSupplier.getAsBoolean();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isShadowPass() {
|
|
||||||
return shadowPassSupplier.getAsBoolean();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public static Frustum createShadowFrustum(Camera camera, float partialTicks) {
|
|
||||||
var frustum = shadowFrustumConstructor.create(camera, partialTicks);
|
|
||||||
if (frustum != null) {
|
|
||||||
var position = camera.getPosition();
|
|
||||||
frustum.prepare(position.x, position.y, position.z);
|
|
||||||
}
|
|
||||||
return frustum;
|
|
||||||
}
|
|
||||||
|
|
||||||
@FunctionalInterface
|
|
||||||
public interface FrustumConstructor {
|
|
||||||
@Nullable
|
|
||||||
Frustum create(Camera camera, float partialTicks);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,179 @@
|
||||||
|
package com.jozufozu.flywheel.backend;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.function.BooleanSupplier;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
import net.irisshaders.iris.api.v0.IrisApi;
|
||||||
|
import net.minecraft.client.Camera;
|
||||||
|
import net.minecraft.client.renderer.culling.Frustum;
|
||||||
|
import net.minecraftforge.fml.ModList;
|
||||||
|
|
||||||
|
public final class ShadersModHandler {
|
||||||
|
public static final String OPTIFINE_ROOT_PACKAGE = "net.optifine";
|
||||||
|
public static final String SHADER_PACKAGE = "net.optifine.shaders";
|
||||||
|
|
||||||
|
private static final boolean isOculusLoaded;
|
||||||
|
private static final boolean isOptifineInstalled;
|
||||||
|
private static final InternalHandler internalHandler;
|
||||||
|
|
||||||
|
static {
|
||||||
|
Package optifinePackage = Package.getPackage(OPTIFINE_ROOT_PACKAGE);
|
||||||
|
isOptifineInstalled = optifinePackage != null;
|
||||||
|
isOculusLoaded = ModList.get()
|
||||||
|
.isLoaded("oculus");
|
||||||
|
|
||||||
|
// optfine and oculus are assumed to be mutually exclusive
|
||||||
|
|
||||||
|
if (isOptifineInstalled) {
|
||||||
|
Backend.LOGGER.info("Optifine detected.");
|
||||||
|
internalHandler = new Optifine();
|
||||||
|
} else if (isOculusLoaded) {
|
||||||
|
Backend.LOGGER.info("Oculus detected.");
|
||||||
|
internalHandler = new Oculus();
|
||||||
|
} else {
|
||||||
|
Backend.LOGGER.info("No shaders mod detected.");
|
||||||
|
internalHandler = new InternalHandler() {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ShadersModHandler() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void init() {
|
||||||
|
// noop, load statics
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isOptifineInstalled() {
|
||||||
|
return isOptifineInstalled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isOculusLoaded() {
|
||||||
|
return isOculusLoaded;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isShaderPackInUse() {
|
||||||
|
return internalHandler.isShaderPackInUse();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isRenderingShadowPass() {
|
||||||
|
return internalHandler.isRenderingShadowPass();
|
||||||
|
}
|
||||||
|
|
||||||
|
private interface InternalHandler {
|
||||||
|
default boolean isShaderPackInUse() {
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
default boolean isRenderingShadowPass() {
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// simple, lovely api calls
|
||||||
|
private static class Oculus implements InternalHandler {
|
||||||
|
@Override
|
||||||
|
public boolean isShaderPackInUse() {
|
||||||
|
return IrisApi.getInstance()
|
||||||
|
.isShaderPackInUse();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isRenderingShadowPass() {
|
||||||
|
return IrisApi.getInstance()
|
||||||
|
.isRenderingShadowPass();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// evil reflection
|
||||||
|
private static class Optifine implements InternalHandler {
|
||||||
|
private final BooleanSupplier shadersEnabledSupplier;
|
||||||
|
private final BooleanSupplier shadowPassSupplier;
|
||||||
|
private final FrustumConstructor shadowFrustumConstructor;
|
||||||
|
|
||||||
|
Optifine() {
|
||||||
|
shadersEnabledSupplier = createShadersEnabledSupplier();
|
||||||
|
shadowPassSupplier = createShadowPassSupplier();
|
||||||
|
shadowFrustumConstructor = createShadowFrustumConstructor();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isShaderPackInUse() {
|
||||||
|
return shadersEnabledSupplier.getAsBoolean();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isRenderingShadowPass() {
|
||||||
|
return shadowPassSupplier.getAsBoolean();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public Frustum createShadowFrustum(Camera camera, float partialTicks) {
|
||||||
|
var frustum = shadowFrustumConstructor.create(camera, partialTicks);
|
||||||
|
if (frustum != null) {
|
||||||
|
var position = camera.getPosition();
|
||||||
|
frustum.prepare(position.x, position.y, position.z);
|
||||||
|
}
|
||||||
|
return frustum;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static FrustumConstructor createShadowFrustumConstructor() {
|
||||||
|
try {
|
||||||
|
Class<?> ofShaders = Class.forName("net.optifine.shaders.ShadersRender");
|
||||||
|
Method method = ofShaders.getDeclaredMethod("makeShadowFrustum", Camera.class, Float.TYPE);
|
||||||
|
method.setAccessible(true);
|
||||||
|
return (cam, pt) -> {
|
||||||
|
try {
|
||||||
|
return (Frustum) method.invoke(null, cam, pt);
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
return ($, $$) -> null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static BooleanSupplier createShadowPassSupplier() {
|
||||||
|
try {
|
||||||
|
Class<?> ofShaders = Class.forName("net.optifine.shaders.Shaders");
|
||||||
|
Field field = ofShaders.getDeclaredField("isShadowPass");
|
||||||
|
field.setAccessible(true);
|
||||||
|
return () -> {
|
||||||
|
try {
|
||||||
|
return field.getBoolean(null);
|
||||||
|
} catch (IllegalAccessException ignored) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
return () -> false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static BooleanSupplier createShadersEnabledSupplier() {
|
||||||
|
try {
|
||||||
|
Class<?> ofShaders = Class.forName("net.optifine.shaders.Shaders");
|
||||||
|
Field field = ofShaders.getDeclaredField("shaderPackLoaded");
|
||||||
|
field.setAccessible(true);
|
||||||
|
return () -> {
|
||||||
|
try {
|
||||||
|
return field.getBoolean(null);
|
||||||
|
} catch (IllegalAccessException ignored) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
return () -> false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface FrustumConstructor {
|
||||||
|
@Nullable
|
||||||
|
Frustum create(Camera camera, float partialTicks);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,7 +7,7 @@ import com.jozufozu.flywheel.api.InstanceData;
|
||||||
import com.jozufozu.flywheel.api.MaterialGroup;
|
import com.jozufozu.flywheel.api.MaterialGroup;
|
||||||
import com.jozufozu.flywheel.api.struct.Batched;
|
import com.jozufozu.flywheel.api.struct.Batched;
|
||||||
import com.jozufozu.flywheel.api.struct.StructType;
|
import com.jozufozu.flywheel.api.struct.StructType;
|
||||||
import com.jozufozu.flywheel.backend.OptifineHandler;
|
import com.jozufozu.flywheel.backend.ShadersModHandler;
|
||||||
import com.jozufozu.flywheel.backend.instancing.BatchDrawingTracker;
|
import com.jozufozu.flywheel.backend.instancing.BatchDrawingTracker;
|
||||||
import com.jozufozu.flywheel.backend.instancing.TaskEngine;
|
import com.jozufozu.flywheel.backend.instancing.TaskEngine;
|
||||||
import com.jozufozu.flywheel.backend.model.DirectVertexConsumer;
|
import com.jozufozu.flywheel.backend.model.DirectVertexConsumer;
|
||||||
|
@ -56,7 +56,7 @@ public class BatchedMaterialGroup implements MaterialGroup {
|
||||||
|
|
||||||
for (BatchedMaterial<?> material : materials.values()) {
|
for (BatchedMaterial<?> material : materials.values()) {
|
||||||
for (CPUInstancer<?> instancer : material.models.values()) {
|
for (CPUInstancer<?> instancer : material.models.values()) {
|
||||||
instancer.sbb.context.outputColorDiffuse = !consumer.hasOverlay() && !OptifineHandler.isUsingShaders();
|
instancer.sbb.context.outputColorDiffuse = !consumer.hasOverlay() && !ShadersModHandler.isShaderPackInUse();
|
||||||
instancer.submitTasks(stack, pool, consumer);
|
instancer.submitTasks(stack, pool, consumer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@ import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.backend.OptifineHandler;
|
import com.jozufozu.flywheel.backend.ShadersModHandler;
|
||||||
import com.jozufozu.flywheel.core.LastActiveCamera;
|
import com.jozufozu.flywheel.core.LastActiveCamera;
|
||||||
import com.jozufozu.flywheel.event.BeginFrameEvent;
|
import com.jozufozu.flywheel.event.BeginFrameEvent;
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ public class FrustumMixin {
|
||||||
|
|
||||||
@Inject(method = "prepare", at = @At("TAIL"))
|
@Inject(method = "prepare", at = @At("TAIL"))
|
||||||
private void onPrepare(double x, double y, double z, CallbackInfo ci) {
|
private void onPrepare(double x, double y, double z, CallbackInfo ci) {
|
||||||
if (OptifineHandler.isShadowPass()) {
|
if (ShadersModHandler.isRenderingShadowPass()) {
|
||||||
MinecraftForge.EVENT_BUS.post(new BeginFrameEvent(Minecraft.getInstance().level, LastActiveCamera.getActiveCamera(), (Frustum) (Object) this));
|
MinecraftForge.EVENT_BUS.post(new BeginFrameEvent(Minecraft.getInstance().level, LastActiveCamera.getActiveCamera(), (Frustum) (Object) this));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue