mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-13 07:06:06 +09:00
added sources for Slick
Former-commit-id: 1647fa32ef6894bd7db44f741f07c2f4dcdf9054 Former-commit-id: 0e5810dcfbe1fd59b13e7cabe9f1e93c5542da2d
This commit is contained in:
122
lib/slick-source/org/newdawn/slick/opengl/SlickCallable.java
Normal file
122
lib/slick-source/org/newdawn/slick/opengl/SlickCallable.java
Normal file
@@ -0,0 +1,122 @@
|
||||
package org.newdawn.slick.opengl;
|
||||
|
||||
import org.lwjgl.opengl.GL11;
|
||||
import org.newdawn.slick.SlickException;
|
||||
import org.newdawn.slick.opengl.renderer.Renderer;
|
||||
|
||||
/**
|
||||
* A utility to allow performing GL operations without contaminating the
|
||||
* Slick OpenGL state. Note this will not protect you from OpenGL programming errors
|
||||
* like a glBegin() without a glEnd(), or glPush() without glPop() etc.
|
||||
*
|
||||
* Expected usage:
|
||||
*
|
||||
* <code>
|
||||
* SlickCallable callable = new SlickCallable() {
|
||||
* public performGLOperations() throws SlickException {
|
||||
* GL.glTranslate(0,0,1);
|
||||
* glBegin(GL.GL_POLYGONS);
|
||||
* glVertex(..);
|
||||
* ...
|
||||
* glEnd();
|
||||
* }
|
||||
* }
|
||||
* callable.call();
|
||||
* </code>
|
||||
*
|
||||
* Alternatively you can use the static methods directly
|
||||
*
|
||||
* <code>
|
||||
* SlickCallable.enterSafeBlock();
|
||||
*
|
||||
* GL.glTranslate(0,0,1);
|
||||
* glBegin(GL.GL_POLYGONS);
|
||||
* glVertex(..);
|
||||
* ...
|
||||
* glEnd();
|
||||
*
|
||||
* SlickCallable.leaveSafeBlock();
|
||||
* </code>
|
||||
*
|
||||
* @author kevin
|
||||
*/
|
||||
public abstract class SlickCallable {
|
||||
/** The last texture used */
|
||||
private static Texture lastUsed;
|
||||
/** True if we're in a safe block */
|
||||
private static boolean inSafe = false;
|
||||
|
||||
|
||||
/**
|
||||
* Enter a safe block ensuring that all the OpenGL state that slick
|
||||
* uses is safe before touching the GL state directly.
|
||||
*/
|
||||
public static void enterSafeBlock()
|
||||
{
|
||||
if (inSafe) {
|
||||
return;
|
||||
}
|
||||
|
||||
Renderer.get().flush();
|
||||
lastUsed = TextureImpl.getLastBind();
|
||||
TextureImpl.bindNone();
|
||||
GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
|
||||
GL11.glPushClientAttrib(GL11.GL_ALL_CLIENT_ATTRIB_BITS);
|
||||
GL11.glMatrixMode(GL11.GL_MODELVIEW);
|
||||
GL11.glPushMatrix();
|
||||
GL11.glMatrixMode(GL11.GL_PROJECTION);
|
||||
GL11.glPushMatrix();
|
||||
GL11.glMatrixMode(GL11.GL_MODELVIEW);
|
||||
|
||||
inSafe = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Leave a safe block ensuring that all of Slick's OpenGL state is
|
||||
* restored since the last enter.
|
||||
*/
|
||||
public static void leaveSafeBlock()
|
||||
{
|
||||
if (!inSafe) {
|
||||
return;
|
||||
}
|
||||
|
||||
GL11.glMatrixMode(GL11.GL_PROJECTION);
|
||||
GL11.glPopMatrix();
|
||||
GL11.glMatrixMode(GL11.GL_MODELVIEW);
|
||||
GL11.glPopMatrix();
|
||||
GL11.glPopClientAttrib();
|
||||
GL11.glPopAttrib();
|
||||
|
||||
if (lastUsed != null) {
|
||||
lastUsed.bind();
|
||||
} else {
|
||||
TextureImpl.bindNone();
|
||||
}
|
||||
|
||||
inSafe = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Cause this callable to perform it's GL operations (@see performGLOperations()). This
|
||||
* method will block until the GL operations have been performed.
|
||||
*
|
||||
* @throws SlickException Indicates a failure while performing the GL operations or
|
||||
* maintaing SlickState
|
||||
*/
|
||||
public final void call() throws SlickException {
|
||||
enterSafeBlock();
|
||||
|
||||
performGLOperations();
|
||||
|
||||
leaveSafeBlock();
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform the GL operations that this callable is intended to. This operations should
|
||||
* not effect the slick OpenGL state.
|
||||
*
|
||||
* @throws SlickException Indicates a failure of some sort. This is user exception
|
||||
*/
|
||||
protected abstract void performGLOperations() throws SlickException;
|
||||
}
|
||||
Reference in New Issue
Block a user