lwjgl2-arm64/src/java/org/lwjgl/test/input/MouseTest.java

400 lines
9.8 KiB
Java
Raw Normal View History

2004-06-12 22:28:34 +02:00
/*
* Copyright (c) 2002-2004 LWJGL Project
2003-08-17 18:58:19 +02:00
* All rights reserved.
2004-06-12 22:28:34 +02:00
*
2003-08-17 18:58:19 +02:00
* Redistribution and use in source and binary forms, with or without
2004-06-12 22:28:34 +02:00
* modification, are permitted provided that the following conditions are
2003-08-17 18:58:19 +02:00
* met:
2004-06-12 22:28:34 +02:00
*
* * Redistributions of source code must retain the above copyright
2003-08-17 18:58:19 +02:00
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
2004-06-12 22:28:34 +02:00
* * Neither the name of 'LWJGL' nor the names of
* its contributors may be used to endorse or promote products derived
2003-08-17 18:58:19 +02:00
* from this software without specific prior written permission.
2004-06-12 22:28:34 +02:00
*
2003-08-17 18:58:19 +02:00
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2004-06-12 22:28:34 +02:00
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
2003-08-17 18:58:19 +02:00
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
2004-06-12 22:28:34 +02:00
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
2003-08-17 18:58:19 +02:00
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.lwjgl.test.input;
import org.lwjgl.input.Keyboard;
2004-02-08 21:41:00 +01:00
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.GL11;
2003-08-17 18:58:19 +02:00
import org.lwjgl.opengl.Window;
2004-04-18 22:01:28 +02:00
import org.lwjgl.util.vector.Vector2f;
import org.lwjgl.util.vector.Vector3f;
2003-08-17 18:58:19 +02:00
/**
* $Id$
* <br>
* Mouse test
*
* @author Brian Matzon <brian@matzon.dk>
* @version $Revision$
*/
public class MouseTest {
2004-02-04 21:44:58 +01:00
/** Direction mouse has moved */
private int direction;
/** Last button pressed */
private int lastButton = 0;
/** Last direction we scrolled in */
private int lastScrollDirection = -1;
/** Width of window */
private static int WINDOW_WIDTH = 640;
/** Height of window */
private static int WINDOW_HEIGHT = 640;
/** Triangle size (in <20>) */
private Vector2f triangleSize = new Vector2f(120, 100);
2003-08-17 18:58:19 +02:00
2004-02-04 21:44:58 +01:00
/** Triangle color */
private Vector3f triangleColor[] = new Vector3f[] {
new Vector3f(1,1,1),
new Vector3f(1,0,0),
new Vector3f(0,1,0),
new Vector3f(0,0,1)
};
private Vector3f quadColor[] = new Vector3f[] {
new Vector3f(1,1,1),
new Vector3f(1,0,0),
new Vector3f(0,1,0),
new Vector3f(0,0,1)
};
/** Triangles to paint */
private Vector2f[] triangles = {
new Vector2f(WINDOW_WIDTH/2, WINDOW_HEIGHT - triangleSize.y),
new Vector2f(triangleSize.y, WINDOW_HEIGHT/2),
new Vector2f(WINDOW_WIDTH/2, triangleSize.y),
new Vector2f(WINDOW_WIDTH-triangleSize.y, WINDOW_HEIGHT/2)
};
2003-08-17 18:58:19 +02:00
2004-02-04 21:44:58 +01:00
/** Whether the test is closing */
private boolean closing = false;
/** Fullscreen or not */
public static final boolean FULLSCREEN = false;
2003-08-17 18:58:19 +02:00
/** Creates a new instance of MouseTest */
public MouseTest() {
}
private void initialize() {
// create display and opengl
2004-02-04 21:44:58 +01:00
setupDisplay();
2003-08-17 18:58:19 +02:00
setupMouse();
setupKeyboard();
2003-08-17 18:58:19 +02:00
}
2004-02-04 21:44:58 +01:00
/**
* Setup display
*/
private void setupDisplay() {
2003-08-17 18:58:19 +02:00
try {
2004-02-04 21:44:58 +01:00
if (FULLSCREEN) {
2004-02-15 16:34:57 +01:00
Window.create("MouseTest", 16, 0, 0, 0, 0);
2004-02-04 21:44:58 +01:00
} else {
2004-02-15 16:34:57 +01:00
Window.create("MouseTest", 50, 50, WINDOW_WIDTH, WINDOW_HEIGHT, 16, 0, 0, 0, 0);
2004-02-04 21:44:58 +01:00
}
Window.setVSyncEnabled(true);
2003-08-17 18:58:19 +02:00
} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}
initializeOpenGL();
}
2004-02-04 21:44:58 +01:00
/**
* Initializes OpenGL
*
*/
2003-08-17 18:58:19 +02:00
private void initializeOpenGL() {
GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
2003-08-17 18:58:19 +02:00
}
2004-02-04 21:44:58 +01:00
/**
* Executes the actual test
*/
2003-08-17 18:58:19 +02:00
public void executeTest() {
initialize();
2004-02-04 21:44:58 +01:00
runTest();
2003-08-17 18:58:19 +02:00
Window.destroy();
}
2004-02-04 21:44:58 +01:00
/**
* Creates the mouse
*/
private void setupMouse() {
2004-02-04 21:44:58 +01:00
}
/**
* Creates the keyboard
*/
private void setupKeyboard() {
2004-02-04 21:44:58 +01:00
}
2003-08-17 18:58:19 +02:00
2004-02-04 21:44:58 +01:00
/**
* Runs the test
*/
private void runTest() {
// while not exiting
while (!closing) {
handleWindow();
// secondary check
if(!closing) {
2003-08-17 18:58:19 +02:00
2004-02-04 21:44:58 +01:00
// poll and check keyboard and mouse
handleKeyboard();
handleMouse();
// pause and continue if minimized
if(!Window.isVisible()) {
2004-02-04 22:43:24 +01:00
if(Window.isDirty()) {
render();
}
2004-02-04 21:44:58 +01:00
pause(100);
continue;
}
// render and flip
logic();
render();
2003-08-17 18:58:19 +02:00
}
2004-02-04 21:44:58 +01:00
Thread.yield();
}
}
2003-08-17 18:58:19 +02:00
2004-02-04 21:44:58 +01:00
/**
* Pauses the current thread for a specified time
*
* @param time milliseconds to pause
*/
private void pause(long time) {
try {
Thread.sleep(time);
} catch (InterruptedException inte) {
inte.printStackTrace();
}
}
/**
* Handles the window
*/
private void handleWindow() {
Window.update();
closing = Window.isCloseRequested();
}
/**
* handles the mouse
*/
private void handleMouse() {
readBufferedMouse();
2004-02-04 21:44:58 +01:00
}
/**
* reads a mouse in buffered mode
*/
private void readBufferedMouse() {
// iterate all events, use the last button down
while(Mouse.next()) {
if(Mouse.getEventButtonState()) {
lastButton = Mouse.getEventButton();
2003-08-17 18:58:19 +02:00
}
2004-02-04 21:44:58 +01:00
}
updateState();
}
/**
* Updates our "model"
*
*/
private void updateState() {
direction = -1;
2003-08-17 18:58:19 +02:00
int dx = Mouse.getDX();
int dy = Mouse.getDY();
int dw = Mouse.getDWheel();
2004-02-04 21:44:58 +01:00
// get out if no movement
if (dx == dy && dx == 0 && dw == 0) {
2004-02-04 21:44:58 +01:00
return;
}
2004-02-04 21:44:58 +01:00
// determine direction moved
// ============================
if(dx > 0) {
2004-02-04 21:44:58 +01:00
direction = 3;
}
if(dx < 0) {
2004-02-04 21:44:58 +01:00
direction = 1;
}
if(dy > 0) {
2004-02-04 21:44:58 +01:00
direction = 0;
}
if(dy < 0) {
2004-02-04 21:44:58 +01:00
direction = 2;
}
// ----------------------------
2004-02-04 21:44:58 +01:00
if(direction > -1) {
2003-08-17 18:58:19 +02:00
2004-02-04 21:44:58 +01:00
// based on which button was last pushed, update model
switch(lastButton) {
case -1:
break;
case 1:
triangleColor[direction].y = 1;
break;
case 2:
triangleColor[direction].z = 1;
break;
case 3:
triangleColor[direction].x = 1;
triangleColor[direction].y = 1;
triangleColor[direction].z = 1;
break;
case 0: // fall through
default:
triangleColor[direction].x = 1;
break;
}
}
// get direction to update in
if (dw > 0) {
2004-02-04 21:44:58 +01:00
lastScrollDirection++;
} else if (dw < 0) {
2004-02-04 21:44:58 +01:00
lastScrollDirection--;
} else if (dw == 0) {
2004-02-04 21:44:58 +01:00
return;
}
// over/underflow
if(lastScrollDirection < 0) {
lastScrollDirection = 3;
}
if(lastScrollDirection > 3) {
lastScrollDirection = 0;
}
// update colors
quadColor[lastScrollDirection].x = (float) Math.random();
quadColor[lastScrollDirection].y = (float) Math.random();
quadColor[lastScrollDirection].z = (float) Math.random();
}
/**
* Handles the keyboard
*/
private void handleKeyboard() {
while(Keyboard.next()) {
// closing on ESCAPE
if(Keyboard.getEventKey() == Keyboard.KEY_ESCAPE && Keyboard.getEventKeyState()) {
closing = true;
}
if(Keyboard.getEventKey() == Keyboard.KEY_SPACE && Keyboard.getEventKeyState()) {
Mouse.setGrabbed(!Mouse.isGrabbed());
}
}
2003-08-17 18:58:19 +02:00
}
2004-02-04 21:44:58 +01:00
/**
* Does the "model logic"
*/
private void logic() {
// "we fade to black"
// ===========================================
for(int i=0; i<triangleColor.length; i++) {
triangleColor[i].x -= 0.01;
triangleColor[i].y -= 0.01;
triangleColor[i].z -= 0.01;
}
for(int i=0; i<quadColor.length; i++) {
quadColor[i].x -= 0.01;
quadColor[i].y -= 0.01;
quadColor[i].z -= 0.01;
}
// -------------------------------------------
}
/**
* Render our triangles
*/
2003-08-17 18:58:19 +02:00
private void render() {
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
2003-08-17 18:58:19 +02:00
2004-02-04 21:44:58 +01:00
// for each triangle, render it at position, rotating degrees for each
for(int i=0; i<triangles.length; i++) {
GL11.glPushMatrix(); {
GL11.glTranslatef(triangles[i].x, triangles[i].y, 0);
GL11.glRotatef(i*90, 0, 0, 1);
GL11.glColor3f(triangleColor[i].x, triangleColor[i].y, triangleColor[i].z);
GL11.glBegin(GL11.GL_TRIANGLES); {
GL11.glVertex2f(0, triangleSize.y);
GL11.glVertex2f(-triangleSize.x, -triangleSize.y);
GL11.glVertex2f(+triangleSize.x, -triangleSize.y);
2003-08-17 18:58:19 +02:00
}
2004-02-04 21:44:58 +01:00
GL11.glEnd();
2003-08-17 18:58:19 +02:00
}
2004-02-04 21:44:58 +01:00
GL11.glPopMatrix();
}
// paint quad in the middle (yes, wasting cpu cycles by not precalculating)
GL11.glBegin(GL11.GL_QUADS); {
GL11.glColor3f(quadColor[0].x, quadColor[0].y, quadColor[0].z);
GL11.glVertex2f(WINDOW_WIDTH/2-triangleSize.x, WINDOW_HEIGHT/2-triangleSize.x);
GL11.glColor3f(quadColor[1].x, quadColor[1].y, quadColor[1].z);
GL11.glVertex2f(WINDOW_WIDTH/2+triangleSize.x, WINDOW_HEIGHT/2-triangleSize.x);
GL11.glColor3f(quadColor[2].x, quadColor[2].y, quadColor[2].z);
GL11.glVertex2f(WINDOW_WIDTH/2+triangleSize.x, WINDOW_HEIGHT/2+triangleSize.x);
GL11.glColor3f(quadColor[3].x, quadColor[3].y, quadColor[3].z);
GL11.glVertex2f(WINDOW_WIDTH/2-triangleSize.x, WINDOW_HEIGHT/2+triangleSize.x);
2003-08-17 18:58:19 +02:00
}
2004-02-04 21:44:58 +01:00
GL11.glEnd();
2003-08-17 18:58:19 +02:00
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
MouseTest mt = new MouseTest();
mt.executeTest();
}
}