package openmods.stencil;
import net.minecraft.client.renderer.OpenGlHelper;
import openmods.Log;
import org.lwjgl.opengl.ARBFramebufferObject;
import org.lwjgl.opengl.ContextCapabilities;
import org.lwjgl.opengl.EXTFramebufferObject;
import org.lwjgl.opengl.EXTPackedDepthStencil;
import org.lwjgl.opengl.GL30;
import org.lwjgl.opengl.GLContext;
public class FramebufferConstants {
private static final int FEATURE_UNAVAILABLE = -1;
public static int GL_STENCIL_ATTACHMENT;
public static int GL_FRAMEBUFFER_UNSUPPORTED;
public static int GL_FRAMEBUFFER_UNDEFINED;
public static int DEPTH_STENCIL_FORMAT = FEATURE_UNAVAILABLE;
private static String methodSet = "not set";
public static void init() {
ContextCapabilities capabilities = GLContext.getCapabilities();
if (capabilities.OpenGL30) {
GL_STENCIL_ATTACHMENT = GL30.GL_STENCIL_ATTACHMENT;
GL_FRAMEBUFFER_UNSUPPORTED = GL30.GL_FRAMEBUFFER_UNSUPPORTED;
GL_FRAMEBUFFER_UNDEFINED = GL30.GL_FRAMEBUFFER_UNDEFINED;
DEPTH_STENCIL_FORMAT = GL30.GL_DEPTH24_STENCIL8;
methodSet = "GL30";
} else if (capabilities.GL_ARB_framebuffer_object) {
GL_STENCIL_ATTACHMENT = ARBFramebufferObject.GL_STENCIL_ATTACHMENT;
GL_FRAMEBUFFER_UNSUPPORTED = ARBFramebufferObject.GL_FRAMEBUFFER_UNSUPPORTED;
GL_FRAMEBUFFER_UNDEFINED = ARBFramebufferObject.GL_FRAMEBUFFER_UNDEFINED;
DEPTH_STENCIL_FORMAT = ARBFramebufferObject.GL_DEPTH24_STENCIL8;
methodSet = "ARB";
} else if (capabilities.GL_EXT_framebuffer_object) {
GL_STENCIL_ATTACHMENT = EXTFramebufferObject.GL_STENCIL_ATTACHMENT_EXT;
GL_FRAMEBUFFER_UNSUPPORTED = EXTFramebufferObject.GL_FRAMEBUFFER_UNSUPPORTED_EXT;
GL_FRAMEBUFFER_UNDEFINED = FEATURE_UNAVAILABLE; // missing
if (capabilities.GL_EXT_packed_depth_stencil) {
DEPTH_STENCIL_FORMAT = EXTPackedDepthStencil.GL_DEPTH24_STENCIL8_EXT;
methodSet = "EXT (packed)";
} else {
DEPTH_STENCIL_FORMAT = FEATURE_UNAVAILABLE;
methodSet = "EXT (no packed)";
}
} else {
methodSet = "POTATO";
Log.warn("No stencil buffer capabilities available");
}
}
public static String getMethodSet() {
return methodSet;
}
public static boolean isStencilBufferEnabled() {
return DEPTH_STENCIL_FORMAT != FEATURE_UNAVAILABLE;
}
private static boolean logError(String name) {
Log.warn("FBO not complete: %s", name);
return false;
}
public static boolean checkFramebufferComplete(int fboStatus) {
if (fboStatus == OpenGlHelper.field_153202_i) return true;
if (fboStatus == OpenGlHelper.field_153203_j) return logError("GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT");
if (fboStatus == OpenGlHelper.field_153205_l) return logError("GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER");
if (fboStatus == OpenGlHelper.field_153206_m) return logError("GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER");
if (fboStatus == GL_FRAMEBUFFER_UNSUPPORTED) return logError("GL_FRAMEBUFFER_UNSUPPORTED");
if (fboStatus == GL_FRAMEBUFFER_UNDEFINED) return logError("GL_FRAMEBUFFER_UNDEFINED");
return logError(String.format("unknown 0x%04X", fboStatus));
}
}