mirror of
https://github.com/Jozufozu/Flywheel.git
synced 2025-02-09 19:55:02 +01:00
Platform dependent wheeling
- Use ClientPlatform to: - Dispatch events - Create iris/oculus handler - Move VisualizationEventHandler into forge project
This commit is contained in:
parent
5e7e867bcd
commit
d9c178cd6c
6 changed files with 149 additions and 35 deletions
|
@ -14,12 +14,10 @@ import org.spongepowered.asm.mixin.injection.At.Shift;
|
||||||
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.api.event.BeginFrameEvent;
|
|
||||||
import com.jozufozu.flywheel.api.event.ReloadLevelRendererEvent;
|
|
||||||
import com.jozufozu.flywheel.api.event.RenderStage;
|
import com.jozufozu.flywheel.api.event.RenderStage;
|
||||||
import com.jozufozu.flywheel.api.event.RenderStageEvent;
|
|
||||||
import com.jozufozu.flywheel.impl.event.RenderContextImpl;
|
import com.jozufozu.flywheel.impl.event.RenderContextImpl;
|
||||||
import com.jozufozu.flywheel.impl.visualization.VisualizationManagerImpl;
|
import com.jozufozu.flywheel.impl.visualization.VisualizationManagerImpl;
|
||||||
|
import com.jozufozu.flywheel.platform.ClientPlatform;
|
||||||
import com.mojang.blaze3d.vertex.PoseStack;
|
import com.mojang.blaze3d.vertex.PoseStack;
|
||||||
|
|
||||||
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
|
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
|
||||||
|
@ -30,7 +28,6 @@ import net.minecraft.client.renderer.LevelRenderer;
|
||||||
import net.minecraft.client.renderer.LightTexture;
|
import net.minecraft.client.renderer.LightTexture;
|
||||||
import net.minecraft.client.renderer.RenderBuffers;
|
import net.minecraft.client.renderer.RenderBuffers;
|
||||||
import net.minecraft.server.level.BlockDestructionProgress;
|
import net.minecraft.server.level.BlockDestructionProgress;
|
||||||
import net.minecraftforge.common.MinecraftForge;
|
|
||||||
|
|
||||||
@Mixin(value = LevelRenderer.class, priority = 1001) // Higher priority to go after Sodium
|
@Mixin(value = LevelRenderer.class, priority = 1001) // Higher priority to go after Sodium
|
||||||
abstract class LevelRendererMixin {
|
abstract class LevelRendererMixin {
|
||||||
|
@ -54,7 +51,7 @@ abstract class LevelRendererMixin {
|
||||||
private void flywheel$beginRender(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci) {
|
private void flywheel$beginRender(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci) {
|
||||||
flywheel$renderContext = RenderContextImpl.create((LevelRenderer) (Object) this, level, renderBuffers, poseStack, projectionMatrix, camera, partialTick);
|
flywheel$renderContext = RenderContextImpl.create((LevelRenderer) (Object) this, level, renderBuffers, poseStack, projectionMatrix, camera, partialTick);
|
||||||
|
|
||||||
MinecraftForge.EVENT_BUS.post(new BeginFrameEvent(flywheel$renderContext));
|
ClientPlatform.getInstance().dispatchBeginFrame(flywheel$renderContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "renderLevel", at = @At("RETURN"))
|
@Inject(method = "renderLevel", at = @At("RETURN"))
|
||||||
|
@ -64,7 +61,7 @@ abstract class LevelRendererMixin {
|
||||||
|
|
||||||
@Inject(method = "allChanged", at = @At("RETURN"))
|
@Inject(method = "allChanged", at = @At("RETURN"))
|
||||||
private void flywheel$refresh(CallbackInfo ci) {
|
private void flywheel$refresh(CallbackInfo ci) {
|
||||||
MinecraftForge.EVENT_BUS.post(new ReloadLevelRendererEvent(level));
|
ClientPlatform.getInstance().dispatchReloadLevelRenderer(level);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "renderLevel", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiling/ProfilerFiller;popPush(Ljava/lang/String;)V", args = "ldc=destroyProgress"))
|
@Inject(method = "renderLevel", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiling/ProfilerFiller;popPush(Ljava/lang/String;)V", args = "ldc=destroyProgress"))
|
||||||
|
@ -84,7 +81,7 @@ abstract class LevelRendererMixin {
|
||||||
@Unique
|
@Unique
|
||||||
private void flywheel$dispatch(RenderStage stage) {
|
private void flywheel$dispatch(RenderStage stage) {
|
||||||
if (flywheel$renderContext != null) {
|
if (flywheel$renderContext != null) {
|
||||||
MinecraftForge.EVENT_BUS.post(new RenderStageEvent(flywheel$renderContext, stage));
|
ClientPlatform.getInstance().dispatchRenderStage(flywheel$renderContext, stage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,34 +6,34 @@ import java.util.function.BooleanSupplier;
|
||||||
import org.jetbrains.annotations.ApiStatus;
|
import org.jetbrains.annotations.ApiStatus;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
|
import com.jozufozu.flywheel.platform.ClientPlatform;
|
||||||
import com.mojang.logging.LogUtils;
|
import com.mojang.logging.LogUtils;
|
||||||
|
|
||||||
import net.irisshaders.iris.api.v0.IrisApi;
|
|
||||||
import net.minecraftforge.fml.ModList;
|
|
||||||
|
|
||||||
public final class ShadersModHandler {
|
public final class ShadersModHandler {
|
||||||
private static final Logger LOGGER = LogUtils.getLogger();
|
private static final Logger LOGGER = LogUtils.getLogger();
|
||||||
|
|
||||||
private static final String OPTIFINE_ROOT_PACKAGE = "net.optifine";
|
private static final String OPTIFINE_ROOT_PACKAGE = "net.optifine";
|
||||||
|
|
||||||
private static final boolean IS_OCULUS_LOADED;
|
private static final boolean IS_IRIS_LOADED;
|
||||||
private static final boolean IS_OPTIFINE_INSTALLED;
|
private static final boolean IS_OPTIFINE_INSTALLED;
|
||||||
private static final InternalHandler INTERNAL_HANDLER;
|
private static final InternalHandler INTERNAL_HANDLER;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
Package optifinePackage = Package.getPackage(OPTIFINE_ROOT_PACKAGE);
|
Package optifinePackage = Package.getPackage(OPTIFINE_ROOT_PACKAGE);
|
||||||
IS_OPTIFINE_INSTALLED = optifinePackage != null;
|
IS_OPTIFINE_INSTALLED = optifinePackage != null;
|
||||||
IS_OCULUS_LOADED = ModList.get()
|
|
||||||
.isLoaded("oculus");
|
|
||||||
|
|
||||||
// OptiFine and Oculus are assumed to be mutually exclusive
|
var irisOculusHandler = ClientPlatform.getInstance()
|
||||||
|
.createIrisOculusHandlerIfPresent();
|
||||||
|
IS_IRIS_LOADED = irisOculusHandler != null;
|
||||||
|
|
||||||
|
// OptiFine and Iris/Oculus are assumed to be mutually exclusive
|
||||||
|
|
||||||
if (IS_OPTIFINE_INSTALLED) {
|
if (IS_OPTIFINE_INSTALLED) {
|
||||||
LOGGER.info("Optifine detected.");
|
LOGGER.info("Optifine detected.");
|
||||||
INTERNAL_HANDLER = new Optifine();
|
INTERNAL_HANDLER = new Optifine();
|
||||||
} else if (IS_OCULUS_LOADED) {
|
} else if (IS_IRIS_LOADED) {
|
||||||
LOGGER.info("Oculus detected.");
|
LOGGER.info("Iris detected.");
|
||||||
INTERNAL_HANDLER = new Oculus();
|
INTERNAL_HANDLER = irisOculusHandler;
|
||||||
} else {
|
} else {
|
||||||
LOGGER.info("No shaders mod detected.");
|
LOGGER.info("No shaders mod detected.");
|
||||||
INTERNAL_HANDLER = new InternalHandler() {};
|
INTERNAL_HANDLER = new InternalHandler() {};
|
||||||
|
@ -43,8 +43,8 @@ public final class ShadersModHandler {
|
||||||
private ShadersModHandler() {
|
private ShadersModHandler() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isOculusLoaded() {
|
public static boolean isIrisLoaded() {
|
||||||
return IS_OCULUS_LOADED;
|
return IS_IRIS_LOADED;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isOptifineInstalled() {
|
public static boolean isOptifineInstalled() {
|
||||||
|
@ -63,7 +63,8 @@ public final class ShadersModHandler {
|
||||||
public static void init() {
|
public static void init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private interface InternalHandler {
|
@ApiStatus.Internal
|
||||||
|
public interface InternalHandler {
|
||||||
default boolean isShaderPackInUse() {
|
default boolean isShaderPackInUse() {
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
@ -73,21 +74,6 @@ public final class ShadersModHandler {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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
|
// evil reflection
|
||||||
private static class Optifine implements InternalHandler {
|
private static class Optifine implements InternalHandler {
|
||||||
private final BooleanSupplier shadersEnabledSupplier;
|
private final BooleanSupplier shadersEnabledSupplier;
|
||||||
|
|
|
@ -2,6 +2,14 @@ package com.jozufozu.flywheel.platform;
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import com.jozufozu.flywheel.api.event.RenderContext;
|
||||||
|
import com.jozufozu.flywheel.api.event.RenderStage;
|
||||||
|
import com.jozufozu.flywheel.lib.util.ShadersModHandler;
|
||||||
|
|
||||||
|
import net.minecraft.client.multiplayer.ClientLevel;
|
||||||
|
|
||||||
public abstract class ClientPlatform {
|
public abstract class ClientPlatform {
|
||||||
private static final ClientPlatform INSTANCE;
|
private static final ClientPlatform INSTANCE;
|
||||||
|
|
||||||
|
@ -19,4 +27,15 @@ public abstract class ClientPlatform {
|
||||||
public static ClientPlatform getInstance() {
|
public static ClientPlatform getInstance() {
|
||||||
return INSTANCE;
|
return INSTANCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public abstract void dispatchReloadLevelRenderer(ClientLevel level);
|
||||||
|
|
||||||
|
public abstract void dispatchBeginFrame(RenderContext context);
|
||||||
|
|
||||||
|
public abstract void dispatchRenderStage(RenderContext context, RenderStage stage);
|
||||||
|
|
||||||
|
public abstract boolean isModLoaded(String modid);
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public abstract ShadersModHandler.InternalHandler createIrisOculusHandlerIfPresent();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,59 @@
|
||||||
package com.jozufozu.flywheel.platform;
|
package com.jozufozu.flywheel.platform;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import com.jozufozu.flywheel.api.event.BeginFrameCallback;
|
||||||
|
import com.jozufozu.flywheel.api.event.ReloadLevelRendererCallback;
|
||||||
|
import com.jozufozu.flywheel.api.event.RenderContext;
|
||||||
|
import com.jozufozu.flywheel.api.event.RenderStage;
|
||||||
|
import com.jozufozu.flywheel.api.event.RenderStageCallback;
|
||||||
|
import com.jozufozu.flywheel.lib.util.ShadersModHandler;
|
||||||
|
|
||||||
|
import net.fabricmc.loader.api.FabricLoader;
|
||||||
|
import net.irisshaders.iris.api.v0.IrisApi;
|
||||||
|
import net.minecraft.client.multiplayer.ClientLevel;
|
||||||
|
|
||||||
public class ClientPlatformImpl extends ClientPlatform {
|
public class ClientPlatformImpl extends ClientPlatform {
|
||||||
|
@Override
|
||||||
|
public void dispatchReloadLevelRenderer(ClientLevel level) {
|
||||||
|
ReloadLevelRendererCallback.EVENT.invoker().onReloadLevelRenderer(level);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void dispatchBeginFrame(RenderContext context) {
|
||||||
|
BeginFrameCallback.EVENT.invoker().onBeginFrame(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void dispatchRenderStage(RenderContext context, RenderStage stage) {
|
||||||
|
RenderStageCallback.EVENT.invoker().onRenderStage(context, stage);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isModLoaded(String modid) {
|
||||||
|
return FabricLoader.getInstance()
|
||||||
|
.isModLoaded(modid);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public ShadersModHandler.InternalHandler createIrisOculusHandlerIfPresent() {
|
||||||
|
if (isModLoaded("iris")) {
|
||||||
|
return new ShadersModHandler.InternalHandler() {
|
||||||
|
@Override
|
||||||
|
public boolean isShaderPackInUse() {
|
||||||
|
return IrisApi.getInstance()
|
||||||
|
.isShaderPackInUse();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isRenderingShadowPass() {
|
||||||
|
return IrisApi.getInstance()
|
||||||
|
.isRenderingShadowPass();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@ import net.minecraftforge.event.entity.EntityJoinLevelEvent;
|
||||||
import net.minecraftforge.event.entity.EntityLeaveLevelEvent;
|
import net.minecraftforge.event.entity.EntityLeaveLevelEvent;
|
||||||
import net.minecraftforge.fml.LogicalSide;
|
import net.minecraftforge.fml.LogicalSide;
|
||||||
|
|
||||||
|
// TODO: fabric event handler
|
||||||
public final class VisualizationEventHandler {
|
public final class VisualizationEventHandler {
|
||||||
private VisualizationEventHandler() {
|
private VisualizationEventHandler() {
|
||||||
}
|
}
|
|
@ -1,4 +1,60 @@
|
||||||
package com.jozufozu.flywheel.platform;
|
package com.jozufozu.flywheel.platform;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import com.jozufozu.flywheel.api.event.BeginFrameEvent;
|
||||||
|
import com.jozufozu.flywheel.api.event.ReloadLevelRendererEvent;
|
||||||
|
import com.jozufozu.flywheel.api.event.RenderContext;
|
||||||
|
import com.jozufozu.flywheel.api.event.RenderStage;
|
||||||
|
import com.jozufozu.flywheel.api.event.RenderStageEvent;
|
||||||
|
import com.jozufozu.flywheel.lib.util.ShadersModHandler;
|
||||||
|
|
||||||
|
import net.irisshaders.iris.api.v0.IrisApi;
|
||||||
|
import net.minecraft.client.multiplayer.ClientLevel;
|
||||||
|
import net.minecraftforge.common.MinecraftForge;
|
||||||
|
import net.minecraftforge.fml.ModList;
|
||||||
|
|
||||||
public class ClientPlatformImpl extends ClientPlatform {
|
public class ClientPlatformImpl extends ClientPlatform {
|
||||||
|
@Override
|
||||||
|
public void dispatchReloadLevelRenderer(ClientLevel level) {
|
||||||
|
MinecraftForge.EVENT_BUS.post(new ReloadLevelRendererEvent(level));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void dispatchBeginFrame(RenderContext context) {
|
||||||
|
MinecraftForge.EVENT_BUS.post(new BeginFrameEvent(context));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void dispatchRenderStage(RenderContext context, RenderStage stage) {
|
||||||
|
MinecraftForge.EVENT_BUS.post(new RenderStageEvent(context, stage));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isModLoaded(String modid) {
|
||||||
|
return ModList.get()
|
||||||
|
.isLoaded(modid);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public ShadersModHandler.InternalHandler createIrisOculusHandlerIfPresent() {
|
||||||
|
if (isModLoaded("oculus")) {
|
||||||
|
return new ShadersModHandler.InternalHandler() {
|
||||||
|
@Override
|
||||||
|
public boolean isShaderPackInUse() {
|
||||||
|
return IrisApi.getInstance()
|
||||||
|
.isShaderPackInUse();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isRenderingShadowPass() {
|
||||||
|
return IrisApi.getInstance()
|
||||||
|
.isRenderingShadowPass();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue