diff --git a/src/java/org/lwjgl/input/Controller.java b/src/java/org/lwjgl/input/Controller.java index 2bd621b2..9635a142 100644 --- a/src/java/org/lwjgl/input/Controller.java +++ b/src/java/org/lwjgl/input/Controller.java @@ -219,6 +219,21 @@ public class Controller { return buttons[button]; } + /** + * @return true if the controller is buffered + */ + public static boolean isBuffered() { + return false; + } + + /** + * Read the controller's input buffer. This is not yet implemented in LWJGL so + * it always throws a RuntimeException. + */ + public static void read() { + throw new RuntimeException("Buffering is not implemented for Controllers."); + } + /** * Gets a button's name * @param button The button diff --git a/src/java/org/lwjgl/input/Keyboard.java b/src/java/org/lwjgl/input/Keyboard.java index 5b6f6635..fefe0246 100644 --- a/src/java/org/lwjgl/input/Keyboard.java +++ b/src/java/org/lwjgl/input/Keyboard.java @@ -422,6 +422,20 @@ public class Keyboard { assert created : "The keyboard has not been created."; return keyDownBuffer.get(key) != 0; } + + /** + * @return true if buffering is enabled + */ + public static boolean isBuffered() { + return readBuffer != null; + } + + /** + * @return true if translation is enabled + */ + public static boolean isTranslationEnabled() { + return translationEnabled; + } /** * Checks whether one of the state keys are "active" diff --git a/src/java/org/lwjgl/input/Mouse.java b/src/java/org/lwjgl/input/Mouse.java index 5011f547..581d080f 100644 --- a/src/java/org/lwjgl/input/Mouse.java +++ b/src/java/org/lwjgl/input/Mouse.java @@ -169,7 +169,7 @@ public class Mouse { currentCursor = cursor; if (currentCursor != null) { nSetNativeCursor(currentCursor.getHandle()); - currentCursor.setTimeout(); + currentCursor.setTimeout(); } else { nSetNativeCursor(0); } @@ -273,6 +273,13 @@ public class Mouse { public static boolean isCreated() { return created; } + + /** + * @return true if buffering is enabled + */ + public static boolean isBuffered() { + return readBuffer != null; + } /** * "Destroy" the mouse. Remember to reset the native cursor if @@ -515,7 +522,7 @@ public class Mouse { /** * Updates the cursor, so that animation can be changed if needed. - * This method is called automatically by the window on its update. + * This method is called automatically by the window on its update. */ public static void updateCursor() { if(currentCursor != null && currentCursor.hasTimedOut()) { diff --git a/src/java/org/lwjgl/opengl/Window.java b/src/java/org/lwjgl/opengl/Window.java index 5225b088..2c3eeb3a 100644 --- a/src/java/org/lwjgl/opengl/Window.java +++ b/src/java/org/lwjgl/opengl/Window.java @@ -273,6 +273,7 @@ public final class Window { * Create a fullscreen window that matches the current display depth. Default common values are chosen * for common OpenGL rendering operations: you will get at least a 16-bit depth buffer, an 8 bit stencil * buffer, probably no alpha buffer, and probably no multisampling. + *

The window created will be set up in orthographic 2D projection, with 1:1 pixel ratio with GL coordinates. * @param title * @throws Exception */ @@ -284,7 +285,7 @@ public final class Window { * Create a fullscreen window. If the underlying OS does not * support fullscreen mode, then a window will be created instead. If this * fails too then an Exception will be thrown. - * + *

The window created will be set up in orthographic 2D projection, with 1:1 pixel ratio with GL coordinates. * @param title The title of the window * @param bpp Minimum bits per pixel * @param alpha Minimum bits per pixel in alpha buffer @@ -301,7 +302,7 @@ public final class Window { * Create a fullscreen window. If the underlying OS does not * support fullscreen mode, then a window will be created instead. If this * fails too then an Exception will be thrown. - * + *

The window created will be set up in orthographic 2D projection, with 1:1 pixel ratio with GL coordinates. * @param title The title of the window * @param bpp Minimum bits per pixel * @param alpha Minimum bits per pixel in alpha buffer @@ -329,7 +330,7 @@ public final class Window { * display will be created instead. If this fails too then an Exception will be thrown. * If the window is created fullscreen, then its size may not match the specified size * here. - * + *

The window created will be set up in orthographic 2D projection, with 1:1 pixel ratio with GL coordinates. * @param title The title of the window * @param x The position of the window on the x axis. May be ignored. * @param y The position of the window on the y axis. May be ignored. @@ -352,7 +353,7 @@ public final class Window { * display will be created instead. If this fails too then an Exception will be thrown. * If the window is created fullscreen, then its size may not match the specified size * here. - * + *

The window created will be set up in orthographic 2D projection, with 1:1 pixel ratio with GL coordinates. * @param title The title of the window * @param x The position of the window on the x axis. May be ignored. * @param y The position of the window on the y axis. May be ignored. @@ -402,7 +403,16 @@ public final class Window { nCreate(title, x, y, width, height, fullscreen, bpp, alpha, depth, stencil, samples); context = new Window(); makeCurrent(); - + + // Put the window into orthographic projection mode with 1:1 pixel ratio. + // We haven't used GLU here to do this to avoid an unnecessary dependency. + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + GL11.glOrtho(0.0, (double) width, 0.0, (double) height, -1.0, 1.0); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + GL11.glViewport(0, 0, width, height); + // Automatically create mouse, keyboard and controller if (!Mouse.isCreated()) { try { diff --git a/src/java/org/lwjgl/test/opengl/FullScreenWindowedTest.java b/src/java/org/lwjgl/test/opengl/FullScreenWindowedTest.java index 0ab5ecee..2880b477 100644 --- a/src/java/org/lwjgl/test/opengl/FullScreenWindowedTest.java +++ b/src/java/org/lwjgl/test/opengl/FullScreenWindowedTest.java @@ -41,293 +41,232 @@ import org.lwjgl.vector.Vector2f; /** * $Id$ - * + * * Tests switching between windowed and fullscreen - * + * * @author Brian Matzon * @version $Revision$ */ public class FullScreenWindowedTest { + /** Intended deiplay mode */ + private DisplayMode mode; + /** our quad moving around */ + private Vector2f quadPosition; + /** our quadVelocity */ + private Vector2f quadVelocity; + /** angle of quad */ + private float angle; + /** degrees to rotate per frame */ + private float angleRotation = 1.0f; + /** Max speed of all changable attributes */ + private static final float MAX_SPEED = 20.0f; - /** Intended deiplay mode */ - private DisplayMode mode; - - /** our quad moving around */ - private Vector2f quadPosition; - - /** our quadVelocity */ - private Vector2f quadVelocity; - - /** angle of quad */ - private float angle; - - /** degrees to rotate per frame */ - private float angleRotation = 1.0f; - - /** Max speed of all changable attributes */ - private static final float MAX_SPEED = 20.0f; - - /** - * Creates a FullScreenWindowedTest - */ - public FullScreenWindowedTest() { - } - - /** - * Executes the test - */ - public void execute() { - initialize(); - - mainLoop(); - - cleanup(); - } - - /** - * Initializes the test - */ - private void initialize() { - try { - //find displaymode - mode = findDisplayMode(800, 600, 16); - - // start of in windowed mode - Window.create("Test", 50, 50, mode.width, mode.height, mode.bpp, 0, 0, 0, 0); - - glInit(); - - Keyboard.create(); - - quadPosition = new Vector2f(100f, 100f); - quadVelocity = new Vector2f(1.0f, 1.0f); - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** - * Runs the main loop of the "test" - */ - private void mainLoop() { - while (!Keyboard.isKeyDown(Keyboard.KEY_ESCAPE) - && !Window.isCloseRequested()) { - // allow subsystem to get a chance to run too - Window.update(); - - if (!Window.isMinimized()) { - // check keyboard input - processKeyboard(); - - // do "game" logic, and render it - logic(); - render(); - - // paint window - Window.paint(); - } else { - - // no need to render/paint if nothing has changed (ie. window dragged over) - if (Window.isDirty()) { - render(); - Window.paint(); - } - - // don't waste cpu time, sleep more - try { - Thread.sleep(100); - } catch (InterruptedException inte) { - } - } - } - Display.resetDisplayMode(); - } - - /** - * Performs the logic - */ - private void logic() { - angle += angleRotation; - if (angle > 90.0f) { - angle = 0.0f; - } - - quadPosition.x += quadVelocity.x; - quadPosition.y += quadVelocity.y; - - //check colision with vertical border border - if (quadPosition.x + 50 >= mode.width || quadPosition.x - 50 <= 0) { - quadVelocity.x *= -1; - } - - //check collision with horizontal border - if (quadPosition.y + 50 >= mode.height || quadPosition.y - 50 <= 0) { - quadVelocity.y *= -1; - } - } - - private void render() { - //clear background - GL11.glClear(GL11.GL_COLOR_BUFFER_BIT); - - // draw white quad - GL11.glPushMatrix(); - { - GL11.glTranslatef(quadPosition.x, quadPosition.y, 0); - GL11.glRotatef(angle, 0.0f, 0.0f, 1.0f); - GL11.glColor3f(1.0f, 1.0f, 1.0f); - GL11.glBegin(GL11.GL_QUADS); - { - GL11.glVertex2i(-50, -50); - GL11.glVertex2i(50, -50); - GL11.glVertex2i(50, 50); - GL11.glVertex2i(-50, 50); - } - GL11.glEnd(); - } - GL11.glPopMatrix(); - } - - /** - * Processes keyboard input - */ - private void processKeyboard() { - Keyboard.poll(); - - //check for fullscreen key - if (Keyboard.isKeyDown(Keyboard.KEY_F)) { - - try { - Keyboard.destroy(); - Window.destroy(); - - Display.setDisplayMode(mode); - Window.create("Test", mode.bpp, 0, 0, 0, 0); - - glInit(); - - Keyboard.create(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - //check for window key - if (Keyboard.isKeyDown(Keyboard.KEY_W)) { - try { - Keyboard.destroy(); - Window.destroy(); - - Display.resetDisplayMode(); - Window.create("Test", 50, 50, mode.width, mode.height, mode.bpp, 0, 0, 0, 0); - - glInit(); - - Keyboard.create(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - //check for speed changes - if (Keyboard.isKeyDown(Keyboard.KEY_UP)) { - quadVelocity.y += 0.1f; - } - if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) { - quadVelocity.y -= 0.1f; - } - if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) { - quadVelocity.x += 0.1f; - } - if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) { - quadVelocity.x -= 0.1f; - } - - if (Keyboard.isKeyDown(Keyboard.KEY_ADD)) { - angleRotation += 0.1f; - } - if (Keyboard.isKeyDown(Keyboard.KEY_SUBTRACT)) { - angleRotation -= 0.1f; - } - - //throttle - if (quadVelocity.x < -MAX_SPEED) { - quadVelocity.x = -MAX_SPEED; - } - if (quadVelocity.x > MAX_SPEED) { - quadVelocity.x = MAX_SPEED; - } - if (quadVelocity.y < -MAX_SPEED) { - quadVelocity.y = -MAX_SPEED; - } - if (quadVelocity.y > MAX_SPEED) { - quadVelocity.y = MAX_SPEED; - } - - if (angleRotation < 0.0f) { - angleRotation = 0.0f; - } - if (angleRotation > MAX_SPEED) { - angleRotation = MAX_SPEED; - } - } - - /** - * Cleans up the test - */ - private void cleanup() { - Keyboard.destroy(); - Window.destroy(); - } - - /** - * Retrieves a displaymode, if one such is available - * - * @param width Required width - * @param height Required height - * @param bpp Minimum required bits per pixel - * @return - */ - private DisplayMode findDisplayMode(int width, int height, int bpp) { - DisplayMode[] modes = Display.getAvailableDisplayModes(); - for (int i = 0; i < modes.length; i++) { - if (modes[i].width == width - && modes[i].height == height - && modes[i].bpp >= bpp && modes[i].freq <= 60) { - return modes[i]; - } - } - return null; - } - - /** - * Initializes OGL - */ - private void glInit() { - // Go into orthographic projection mode. - GL11.glMatrixMode(GL11.GL_PROJECTION); - GL11.glLoadIdentity(); - GLU.gluOrtho2D(0, mode.width, 0, mode.height); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - GL11.glLoadIdentity(); - GL11.glViewport(0, 0, mode.width, mode.height); - - //set clear color to black - GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - - //sync frame (only works on windows) - Window.setVSyncEnabled(true); - } - - /** - * Test entry point - */ - public static void main(String[] args) { - System.out.println( - "Change between fullscreen and windowed mode, by pressing F and W respectively"); - System.out.println( - "Move quad using arrowkeys, and change rotation using +/-"); - FullScreenWindowedTest fswTest = new FullScreenWindowedTest(); - fswTest.execute(); - } + /** + * Creates a FullScreenWindowedTest + */ + public FullScreenWindowedTest() { + } + /** + * Executes the test + */ + public void execute() { + initialize(); + mainLoop(); + cleanup(); + } + /** + * Initializes the test + */ + private void initialize() { + try { + //find displaymode + mode = findDisplayMode(800, 600, 16); + // start of in windowed mode + Window.create("Test", 50, 50, mode.width, mode.height, mode.bpp, 0, 0, 0, 0); + glInit(); + quadPosition = new Vector2f(100f, 100f); + quadVelocity = new Vector2f(1.0f, 1.0f); + } catch (Exception e) { + e.printStackTrace(); + } + } + /** + * Runs the main loop of the "test" + */ + private void mainLoop() { + while (!Keyboard.isKeyDown(Keyboard.KEY_ESCAPE) && !Window.isCloseRequested()) { + if (!Window.isMinimized()) { + // check keyboard input + processKeyboard(); + // do "game" logic, and render it + logic(); + render(); + } else { + // no need to render/paint if nothing has changed (ie. window + // dragged over) + if (Window.isDirty()) { + render(); + } + // don't waste cpu time, sleep more + try { + Thread.sleep(100); + } catch (InterruptedException inte) { + } + } + // Update window + Window.update(); + } + } + /** + * Performs the logic + */ + private void logic() { + angle += angleRotation; + if (angle > 90.0f) { + angle = 0.0f; + } + quadPosition.x += quadVelocity.x; + quadPosition.y += quadVelocity.y; + //check colision with vertical border border + if (quadPosition.x + 50 >= mode.width || quadPosition.x - 50 <= 0) { + quadVelocity.x *= -1; + } + //check collision with horizontal border + if (quadPosition.y + 50 >= mode.height || quadPosition.y - 50 <= 0) { + quadVelocity.y *= -1; + } + } + private void render() { + //clear background + GL11.glClear(GL11.GL_COLOR_BUFFER_BIT); + // draw white quad + GL11.glPushMatrix(); + { + GL11.glTranslatef(quadPosition.x, quadPosition.y, 0); + GL11.glRotatef(angle, 0.0f, 0.0f, 1.0f); + GL11.glColor3f(1.0f, 1.0f, 1.0f); + GL11.glBegin(GL11.GL_QUADS); + { + GL11.glVertex2i(-50, -50); + GL11.glVertex2i(50, -50); + GL11.glVertex2i(50, 50); + GL11.glVertex2i(-50, 50); + } + GL11.glEnd(); + } + GL11.glPopMatrix(); + } + /** + * Processes keyboard input + */ + private void processKeyboard() { + //check for fullscreen key + if (Keyboard.isKeyDown(Keyboard.KEY_F)) { + try { + Display.setDisplayMode(mode); + Window.create("Test", mode.bpp, 0, 0, 0, 0); + glInit(); + } catch (Exception e) { + e.printStackTrace(); + } + } + //check for window key + if (Keyboard.isKeyDown(Keyboard.KEY_W)) { + try { + Display.resetDisplayMode(); + Window.create("Test", 50, 50, mode.width, mode.height, mode.bpp, 0, 0, 0, 0); + glInit(); + } catch (Exception e) { + e.printStackTrace(); + } + } + //check for speed changes + if (Keyboard.isKeyDown(Keyboard.KEY_UP)) { + quadVelocity.y += 0.1f; + } + if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) { + quadVelocity.y -= 0.1f; + } + if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) { + quadVelocity.x += 0.1f; + } + if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) { + quadVelocity.x -= 0.1f; + } + if (Keyboard.isKeyDown(Keyboard.KEY_ADD)) { + angleRotation += 0.1f; + } + if (Keyboard.isKeyDown(Keyboard.KEY_SUBTRACT)) { + angleRotation -= 0.1f; + } + //throttle + if (quadVelocity.x < -MAX_SPEED) { + quadVelocity.x = -MAX_SPEED; + } + if (quadVelocity.x > MAX_SPEED) { + quadVelocity.x = MAX_SPEED; + } + if (quadVelocity.y < -MAX_SPEED) { + quadVelocity.y = -MAX_SPEED; + } + if (quadVelocity.y > MAX_SPEED) { + quadVelocity.y = MAX_SPEED; + } + if (angleRotation < 0.0f) { + angleRotation = 0.0f; + } + if (angleRotation > MAX_SPEED) { + angleRotation = MAX_SPEED; + } + } + /** + * Cleans up the test + */ + private void cleanup() { + } + /** + * Retrieves a displaymode, if one such is available + * + * @param width + * Required width + * @param height + * Required height + * @param bpp + * Minimum required bits per pixel + * @return + */ + private DisplayMode findDisplayMode(int width, int height, int bpp) { + DisplayMode[] modes = Display.getAvailableDisplayModes(); + for (int i = 0; i < modes.length; i++) { + if (modes[i].width == width && modes[i].height == height && modes[i].bpp >= bpp && modes[i].freq <= 60) { + return modes[i]; + } + } + return null; + } + /** + * Initializes OGL + */ + private void glInit() { + // Go into orthographic projection mode. + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + GLU.gluOrtho2D(0, mode.width, 0, mode.height); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + GL11.glViewport(0, 0, mode.width, mode.height); + //set clear color to black + GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + //sync frame (only works on windows) + Window.setVSyncEnabled(true); + } + /** + * Test entry point + */ + public static void main(String[] args) { + System.out.println("Change between fullscreen and windowed mode, by pressing F and W respectively"); + System.out.println("Move quad using arrowkeys, and change rotation using +/-"); + FullScreenWindowedTest fswTest = new FullScreenWindowedTest(); + fswTest.execute(); + } } diff --git a/src/native/common/org_lwjgl_opengl_Window.h b/src/native/common/org_lwjgl_opengl_Window.h index bc39a422..553a67a1 100644 --- a/src/native/common/org_lwjgl_opengl_Window.h +++ b/src/native/common/org_lwjgl_opengl_Window.h @@ -108,7 +108,7 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_nDestroy /* * Class: org_lwjgl_opengl_Window - * Method: update + * Method: nUpdate * Signature: ()V */ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_nUpdate diff --git a/src/native/linux/org_lwjgl_opengl_Window.cpp b/src/native/linux/org_lwjgl_opengl_Window.cpp index 4a23f8ea..f6c348a8 100644 --- a/src/native/linux/org_lwjgl_opengl_Window.cpp +++ b/src/native/linux/org_lwjgl_opengl_Window.cpp @@ -257,7 +257,7 @@ int getWindowHeight(void) { /* * Class: org_lwjgl_Window - * Method: update + * Method: nUpdate * Signature: ()V */ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_nUpdate