import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import javaforce.*; import javaforce.gl.*; import static javaforce.gl.GL.*; /** * * @author pquiring * * Created Sept 18, 2013 */ public class GLCode { java.util.Timer glTimer, fpsTimer; final Object fpsLock = new Object(); int fpsCounter; final int FPS = 65; GLScene scene = new GLScene(); GLRender render = new GLRender(); GLModel mod; GLObject box; boolean keys[] = new boolean[1024]; final float speedMove = 2.0f; final float speedRotate = 5.0f; float alpha = 0.5f, alphadir = -0.01f; boolean doSwap = false; public GLCode(boolean doSwap) { this.doSwap = doSwap; } //interface GLInterface public void init() { scene.texturePath = "./"; System.out.println("GL Version=" + glGetString(GL.GL_VERSION)); int glver[] = getVersion(); if (glver[0] < 2) { JF.showError("Error", "OpenGL Version < 2.0 : Detected : " + glver[0] + "." + glver[1]); System.exit(0); } createWorld(); //setup timers glTimer = new java.util.Timer(); int delay = 1000 / FPS; glTimer.scheduleAtFixedRate(new TimerTask() { public void run() { frame(); } }, delay, delay); fpsTimer = new java.util.Timer(); fpsTimer.scheduleAtFixedRate(new TimerTask() { public void run() { int cnt; synchronized(fpsLock) { cnt = fpsCounter; fpsCounter = 0; } JFLog.log("fps=" + cnt); // JFLog.log("camera=" + scene.m_camera.toString()); // JFLog.log("model=" + scene.m_model.toString()); } }, 1000, 1000); } public void render() { synchronized(fpsLock) { fpsCounter++; } processMovement(); render.render(); if (doSwap) Main.swap(); //only swap with GLCanvas, not GLJPanel } public void resize(int width, int height) { render.resize(width, height); } public void frame() { box.m.addRotate(3.0f, 1.0f, 0.0f, 0.0f); box.m.addRotate(2.0f, 0.0f, 1.0f, 0.0f); box.m.addRotate(1.0f, 0.0f, 0.0f, 1.0f); } public void createWorld() { float x, y, z; int width = 512; int height = 512; System.out.println("size=" + width + "," + height); scene.init(GLVertexShader.source, GLFragmentShader.source); render.init(scene, width, height); resetPosition(); x = -0.5f; y = -0.5f; z = -0.5f; box = new GLObject(); GLUVMap map = box.createUVMap(); map.textureIndex = 0; mod = new GLModel(); mod.addObject(box); mod.addTexture("opengl.png"); scene.addModel(mod); //create a box makeWall(x,y,z,1, box); makeWall(x,y,z,2, box); makeWall(x,y,z,3, box); makeWall(x,y,z,4, box); makeWall(x,y,z,5, box); makeWall(x,y,z,6, box); if (!scene.loadTextures()) { JFLog.log("Failed to load all textures"); System.exit(0); } box.copyBuffers(); } public GLObject makeWall(float x,float y,float z,int side,GLObject obj) { //use counter clock wise triangles float vp[]; //vertex coords (positions) vp = new float[] { (x ) * 10.0f, (y ) * 10.0f, (z ) * 10.0f, (x+1.0f) * 10.0f, (y ) * 10.0f, (z ) * 10.0f, (x ) * 10.0f, (y+1.0f) * 10.0f, (z ) * 10.0f, (x+1.0f) * 10.0f, (y+1.0f) * 10.0f, (z ) * 10.0f, (x ) * 10.0f, (y ) * 10.0f, (z+1.0f) * 10.0f, (x+1.0f) * 10.0f, (y ) * 10.0f, (z+1.0f) * 10.0f, (x ) * 10.0f, (y+1.0f) * 10.0f, (z+1.0f) * 10.0f, (x+1.0f) * 10.0f, (y+1.0f) * 10.0f, (z+1.0f) * 10.0f }; int off = obj.vpl.size() / 3; //current vertex count int pts[] = null; float uv[] = new float[8 * 2]; switch (side) { case 1: //top pts = new int[] {2,6,7,3}; break; case 2: //bottom pts = new int[] {5,4,0,1}; break; case 3: //left pts = new int[] {2,0,4,6}; break; case 4: //right pts = new int[] {7,5,1,3}; break; case 5: //front pts = new int[] {6,4,5,7}; break; case 6: //back pts = new int[] {3,1,0,2}; break; } float u = 0.0f; float v = 0.0f; for(int a=0;a<4;a++) { uv[pts[a] * 2 + 0] = u; uv[pts[a] * 2 + 1] = v; if (u == 0.0f && v == 0.0f) v = 1.0f; else if (u == 0.0f && v == 1.0f) u = 1.0f; else if (u == 1.0f && v == 1.0f) v = 0.0f; // else if (tx == 0.0f && ty == 0.0f) tx = 0.0f; //not needed - end of loop } obj.addVertex(vp, uv); obj.addPoly(new int[] {off + pts[0], off + pts[1], off + pts[2]}); obj.addPoly(new int[] {off + pts[0], off + pts[2], off + pts[3]}); return obj; } GLVector3 viewpoint = new GLVector3(); GLVector3 uppoint = new GLVector3(); GLVector3 leftpoint = new GLVector3(); GLVector3 boxCenter = new GLVector3(); public void processMovement() { viewpoint.set(0.0f, 0.0f, -1.0f); //normally looking into monitor render.m_camera.mult(viewpoint); uppoint.set(0.0f, 1.0f, 0.0f); //normally up is along y axis render.m_camera.mult(uppoint); leftpoint.set(-1.0f, 0.0f, 0.0f); //normally left is along x axis render.m_camera.mult(leftpoint); if (keys[KeyEvent.VK_LEFT]) { rotateLR(-1.0f); } if (keys[KeyEvent.VK_RIGHT]) { rotateLR(1.0f); } if (keys[KeyEvent.VK_UP]) { rotateUD(1.0f); } if (keys[KeyEvent.VK_DOWN]) { rotateUD(-1.0f); } if (keys[KeyEvent.VK_Z]) { spin(1.0f); } if (keys[KeyEvent.VK_X]) { spin(-1.0f); } if (keys[KeyEvent.VK_Q]) { resetPosition(); } if (keys[KeyEvent.VK_F1]) { render.cameraRotate(10.0f, 1.0f, 0.0f, 0.0f); } if (keys[KeyEvent.VK_F2]) { render.cameraRotate(10.0f, 0.0f, 1.0f, 0.0f); } if (keys[KeyEvent.VK_F3]) { render.cameraRotate(10.0f, 0.0f, 0.0f, 1.0f); } if (keys[KeyEvent.VK_F5]) { render.cameraRotate(-10.0f, 1.0f, 0.0f, 0.0f); } if (keys[KeyEvent.VK_F6]) { render.cameraRotate(-10.0f, 0.0f, 1.0f, 0.0f); } if (keys[KeyEvent.VK_F7]) { render.cameraRotate(-10.0f, 0.0f, 0.0f, 1.0f); } if (keys[KeyEvent.VK_9]) { render.fovy -= 10.0f; System.out.println("fovy = " + render.fovy); } if (keys[KeyEvent.VK_0]) { render.fovy += 10.0f; System.out.println("fovy = " + render.fovy); } if (keys[KeyEvent.VK_S]) { move(1); } if (keys[KeyEvent.VK_W]) { move(-1); } if (keys[KeyEvent.VK_D]) { stride(1); } if (keys[KeyEvent.VK_A]) { stride(-1); } //fade box in/out alpha += alphadir; if (alpha < 0.0f) { alpha = 0.0f; alphadir *= -1.0f; } else if (alpha > 0.5f) { alpha = 0.5f; alphadir *= -1.0f; } box.color[3] = alpha; } public void rotateLR(float dir) { render.cameraRotate(speedRotate * uppoint.v[0], dir, 0.0f, 0.0f); render.cameraRotate(speedRotate * uppoint.v[1], 0.0f, dir, 0.0f); render.cameraRotate(speedRotate * uppoint.v[2], 0.0f, 0.0f, dir); } public void rotateUD(float dir) { render.cameraRotate(speedRotate * leftpoint.v[0], dir, 0.0f, 0.0f); render.cameraRotate(speedRotate * leftpoint.v[1], 0.0f, dir, 0.0f); render.cameraRotate(speedRotate * leftpoint.v[2], 0.0f, 0.0f, dir); } public void spin(float dir) { render.cameraRotate(speedRotate * viewpoint.v[0], dir, 0.0f, 0.0f); render.cameraRotate(speedRotate * viewpoint.v[1], 0.0f, dir, 0.0f); render.cameraRotate(speedRotate * viewpoint.v[2], 0.0f, 0.0f, dir); } public void move(float dir) { render.modelTranslate( viewpoint.v[0] * speedMove * dir, viewpoint.v[1] * speedMove * dir, viewpoint.v[2] * speedMove * dir ); } public void stride(float dir) { render.modelTranslate( leftpoint.v[0] * speedMove * dir, leftpoint.v[1] * speedMove * dir, leftpoint.v[2] * speedMove * dir ); } public void resetPosition() { render.cameraReset(); render.modelReset(); render.modelTranslate(0.0f, 0.0f, -20.0f); } }