2021-05-02 01:32:09 +02:00
|
|
|
package com.jozufozu.flywheel.backend;
|
2021-02-02 22:11:22 +01:00
|
|
|
|
2021-02-18 19:43:22 +01:00
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
|
|
import org.apache.logging.log4j.LogManager;
|
|
|
|
import org.apache.logging.log4j.Logger;
|
2021-03-24 23:48:15 +01:00
|
|
|
import org.lwjgl.opengl.GL;
|
2021-02-18 19:43:22 +01:00
|
|
|
import org.lwjgl.opengl.GLCapabilities;
|
|
|
|
|
2021-05-02 01:32:09 +02:00
|
|
|
import com.jozufozu.flywheel.backend.effects.EffectsHandler;
|
|
|
|
import com.jozufozu.flywheel.backend.gl.shader.GlProgram;
|
|
|
|
import com.jozufozu.flywheel.backend.gl.shader.IMultiProgram;
|
|
|
|
import com.jozufozu.flywheel.backend.gl.shader.ProgramSpec;
|
|
|
|
import com.jozufozu.flywheel.backend.gl.versioned.GlCompat;
|
|
|
|
import com.jozufozu.flywheel.backend.instancing.IFlywheelWorld;
|
2021-02-09 06:17:25 +01:00
|
|
|
import com.simibubi.create.foundation.config.AllConfigs;
|
2021-02-18 19:43:22 +01:00
|
|
|
|
2021-02-07 23:15:52 +01:00
|
|
|
import net.minecraft.client.Minecraft;
|
|
|
|
import net.minecraft.resources.IReloadableResourceManager;
|
|
|
|
import net.minecraft.resources.IResourceManager;
|
|
|
|
import net.minecraft.util.ResourceLocation;
|
2021-04-09 23:48:44 +02:00
|
|
|
import net.minecraft.util.math.vector.Matrix4f;
|
2021-04-08 19:22:11 +02:00
|
|
|
import net.minecraft.world.World;
|
2021-02-07 23:15:52 +01:00
|
|
|
import net.minecraftforge.resource.ISelectiveResourceReloadListener;
|
2021-02-02 22:11:22 +01:00
|
|
|
|
|
|
|
public class Backend {
|
2021-03-24 23:48:15 +01:00
|
|
|
public static final Logger log = LogManager.getLogger(Backend.class);
|
2021-04-09 23:48:44 +02:00
|
|
|
|
|
|
|
public static final ShaderLoader shaderLoader = new ShaderLoader();
|
2021-04-13 01:00:13 +02:00
|
|
|
public static EffectsHandler effects;
|
2021-04-09 23:48:44 +02:00
|
|
|
|
|
|
|
public static Matrix4f projectionMatrix = new Matrix4f();
|
|
|
|
|
2021-03-24 23:48:15 +01:00
|
|
|
public static GLCapabilities capabilities;
|
2021-04-01 05:53:02 +02:00
|
|
|
public static GlCompat compat;
|
2021-03-24 23:48:15 +01:00
|
|
|
|
|
|
|
private static boolean instancingAvailable;
|
|
|
|
private static boolean enabled;
|
|
|
|
|
|
|
|
static final Map<ResourceLocation, ProgramSpec<?>> registry = new HashMap<>();
|
2021-04-09 23:48:44 +02:00
|
|
|
static final Map<ProgramSpec<?>, IMultiProgram<?>> programs = new HashMap<>();
|
2021-03-24 23:48:15 +01:00
|
|
|
|
|
|
|
public Backend() {
|
|
|
|
throw new IllegalStateException();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Register a shader program. TODO: replace with forge registry?
|
|
|
|
*/
|
|
|
|
public static <P extends GlProgram, S extends ProgramSpec<P>> S register(S spec) {
|
|
|
|
ResourceLocation name = spec.name;
|
|
|
|
if (registry.containsKey(name)) {
|
|
|
|
throw new IllegalStateException("Program spec '" + name + "' already registered.");
|
|
|
|
}
|
|
|
|
registry.put(name, spec);
|
|
|
|
return spec;
|
|
|
|
}
|
|
|
|
|
|
|
|
@SuppressWarnings("unchecked")
|
|
|
|
public static <P extends GlProgram, S extends ProgramSpec<P>> P getProgram(S spec) {
|
2021-04-09 23:48:44 +02:00
|
|
|
return (P) programs.get(spec).get();
|
2021-03-24 23:48:15 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public static boolean isFlywheelWorld(World world) {
|
|
|
|
return world == Minecraft.getInstance().world || (world instanceof IFlywheelWorld && ((IFlywheelWorld) world).supportsFlywheel());
|
|
|
|
}
|
|
|
|
|
|
|
|
public static boolean available() {
|
|
|
|
return canUseVBOs();
|
|
|
|
}
|
|
|
|
|
|
|
|
public static boolean canUseInstancing() {
|
|
|
|
return enabled && instancingAvailable;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static boolean canUseVBOs() {
|
|
|
|
return enabled && gl20();
|
|
|
|
}
|
|
|
|
|
|
|
|
public static boolean gl33() {
|
|
|
|
return capabilities.OpenGL33;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static boolean gl20() {
|
|
|
|
return capabilities.OpenGL20;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void init() {
|
|
|
|
// Can be null when running datagenerators due to the unfortunate time we call this
|
|
|
|
Minecraft mc = Minecraft.getInstance();
|
|
|
|
if (mc == null) return;
|
|
|
|
|
|
|
|
IResourceManager manager = mc.getResourceManager();
|
|
|
|
|
|
|
|
if (manager instanceof IReloadableResourceManager) {
|
2021-04-09 23:48:44 +02:00
|
|
|
ISelectiveResourceReloadListener listener = shaderLoader::onResourceManagerReload;
|
2021-03-24 23:48:15 +01:00
|
|
|
((IReloadableResourceManager) manager).addReloadListener(listener);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void refresh() {
|
|
|
|
capabilities = GL.createCapabilities();
|
|
|
|
|
2021-04-01 05:53:02 +02:00
|
|
|
compat = new GlCompat(capabilities);
|
2021-03-24 23:48:15 +01:00
|
|
|
|
|
|
|
instancingAvailable = compat.vertexArrayObjectsSupported() &&
|
|
|
|
compat.drawInstancedSupported() &&
|
|
|
|
compat.instancedArraysSupported();
|
|
|
|
|
|
|
|
enabled = AllConfigs.CLIENT.experimentalRendering.get() && !OptifineHandler.usingShaders();
|
2021-04-13 01:00:13 +02:00
|
|
|
|
|
|
|
if (enabled) {
|
|
|
|
if (effects != null) effects.delete();
|
|
|
|
effects = new EffectsHandler();
|
|
|
|
}
|
2021-03-24 23:48:15 +01:00
|
|
|
}
|
2021-02-02 22:11:22 +01:00
|
|
|
}
|