// ------------------------------------------------------------------ // This code was written by Philipp Seifried, except where // otherwise stated. // You're permitted to do whatever you want with the parts // I wrote, including modification, distribution and // removal of this notice, as long as I will not be held // responsible for any harm that results in the use of // this code. // Remember that for this to work, you will also need the // JOGL classes to be found at // https://jogl.dev.java.net/ // For instructions, refer to // http://www.repeatwhiletrue.com/p5/P5JOGL.html // Have fun! // ------------------------------------------------------------------ Frame oglFrame; // our openGL Window GLCanvas canvas; // the component openGL will render to JOGLRenderer renderer; // our custom event listener that will do the rendering boolean fullscreen; KeyInputHandler keyHandler; MouseInputHandler mouseHandler; int oglMouseX, oglMouseY, oglPMouseX, oglPMouseY; // ----------------- Add your own stuff here! float ourVariable; // We will use this one to do some fancy color warping. BImage ourTexture; // ------------------------------------------ void setup() { // ----------------- Add your own stuff here! size(320,240); ourVariable = 0; fullscreen = false; keyHandler = new KeyInputHandler(); mouseHandler = new MouseInputHandler(); ourTexture = loadImage("texture.jpg"); // ... // ... // ... // ------------------------------------------ // set up our window oglFrame = new Frame("Our very own OpenGL Window!"); oglFrame.setSize( 800, 600 ); renderer = new JOGLRenderer(); // set the properties of our openGL component... GLCapabilities glCaps = new GLCapabilities(); glCaps.setRedBits(8); // 32 bit color resolution glCaps.setBlueBits(8); glCaps.setGreenBits(8); glCaps.setAlphaBits(8); glCaps.setDoubleBuffered(true); // double buffered canvas = GLDrawableFactory.getFactory().createGLCanvas( glCaps ); // add the renderer to the component and the component to our window. canvas.addGLEventListener(renderer); canvas.addKeyListener(keyHandler); canvas.addMouseListener(mouseHandler); canvas.addMouseMotionListener(mouseHandler); oglFrame.add( canvas ); // let the program exit if our openGL window is shut down. oglFrame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { if (fullscreen) { GraphicsEnvironment ge=null; GraphicsDevice gd=null; ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); gd = ge.getDefaultScreenDevice(); if( gd.isFullScreenSupported() ) { gd.setFullScreenWindow(null); } } System.exit(0); } }); if (fullscreen) { oglFrame.setUndecorated(true); // We don't want any title bar for this window GraphicsEnvironment ge=null; GraphicsDevice gd=null; ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); gd = ge.getDefaultScreenDevice(); if( gd.isFullScreenSupported() ) { gd.setFullScreenWindow(oglFrame); } } // show our openGL window! oglFrame.setVisible(true); oglFrame.setFocusable(true); oglFrame.requestFocus(); } void loop() { // ----------------- Add your own stuff here! ourVariable += 0.1; // ... // ... // ... // ------------------------------------------ canvas.display(); } class JOGLRenderer implements GLEventListener { boolean isFirstFrame; public void init(GLDrawable drawable) { // fetch GL and GLU instances from our GLCanvas GL gl = drawable.getGL(); GLU glu = drawable.getGLU(); // ----------------- Add your own stuff here! gl.glShadeModel(GL.GL_SMOOTH); // enable smooth shading gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // set the background color gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST); // nice perspective correction gl.glEnable(GL.GL_DEPTH_TEST); // enable the z-Buffer gl.glDepthFunc(GL.GL_LEQUAL); // the z comparison function gl.glClearDepth(1.0f); // set the depth the z-Buffer will be cleared to gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT ); // clear the screen glu.gluPerspective(45.0f,(float)(800)/(float)(600),0.1f,100.0f); // and set up a perspective. makeTexture(20,ourTexture); // this converts the BImage ourTexture into the active texture on the gfx card. gl.glEnable(GL.GL_TEXTURE_2D); // ------------------------------------------ } public void display(GLDrawable drawable) { // -------- this is our render loop! GL gl = drawable.getGL(); // gl should be fetched like this in every frame... gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT ); // clear the screen // ----------------- Add your own stuff here! float a = sin(ourVariable)/2+0.5; float b = sin(ourVariable*1.3)/2+0.5; float c = sin(ourVariable*1.9)/2+0.5; gl.glBegin( GL.GL_QUADS ); // draw a triangle gl.glColor3f(a, 1, 1); gl.glTexCoord2f(0,0); gl.glVertex3f( -0.5, 0.5, -2 ); gl.glColor3f(a, b, 1); gl.glTexCoord2f(0,1); gl.glVertex3f( -0.5, -0.5, -2 ); gl.glColor3f(c, c, a); gl.glTexCoord2f(1,1); gl.glVertex3f( 0.5, -0.5, -2 ); gl.glColor3f(c, b, b); gl.glTexCoord2f(1,0); gl.glVertex3f( 0.5, 0.5, -2 ); gl.glEnd(); // ------------------------------------------ // update the "previous Mouse" positions oglPMouseX = oglMouseX; oglPMouseY = oglMouseY; } public void reshape(GLDrawable drawable, int x, int y, int width, int height) { // -------- this will be called whenever our openGL window is resized! GL gl = drawable.getGL(); // gl should be fetched like this in every frame... gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT ); // clear the screen } public void displayChanged(GLDrawable drawable, boolean modeChanged, boolean deviceChanged) { // -------- this is not implemented in JOGL yet. Best to leave it alone. } } class KeyInputHandler extends KeyAdapter { public void keyPressed(KeyEvent e) { key = e.getKeyChar(); keyPressed = true; // ----------------- Add your own stuff here! // ... // ------------------------------------------ } public void keyReleased(KeyEvent e) { key = e.getKeyChar(); keyPressed = false; // ----------------- Add your own stuff here! // ... // ------------------------------------------ } public void keyTyped(KeyEvent e) { key = e.getKeyChar(); if (e.getKeyChar() == 27) { // Escape key closes the application! if (fullscreen) { GraphicsEnvironment ge=null; GraphicsDevice gd=null; ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); gd = ge.getDefaultScreenDevice(); if( gd.isFullScreenSupported() ) { gd.setFullScreenWindow(null); } } System.exit(0); } // ----------------- Add your own stuff here! // ... // ------------------------------------------ } } class MouseInputHandler extends javax.swing.event.MouseInputAdapter { public void mouseDragged(MouseEvent e) { oglMouseX = e.getX(); oglMouseY = e.getY(); // ----------------- Add your own stuff here! // ... // ------------------------------------------ } public void mouseMoved(MouseEvent e) { oglMouseX = e.getX(); oglMouseY = e.getY(); // ----------------- Add your own stuff here! // ... // ------------------------------------------ } public void mousePressed(MouseEvent e) { oglMouseX = e.getX(); oglMouseY = e.getY(); mousePressed = true; // ----------------- Add your own stuff here! // ... // ------------------------------------------ } public void mouseReleased(MouseEvent e) { oglMouseX = e.getX(); oglMouseY = e.getY(); mousePressed = false; // ----------------- Add your own stuff here! // ... // ------------------------------------------ } public void mouseClicked(MouseEvent e) { oglMouseX = e.getX(); oglMouseY = e.getY(); // ----------------- Add your own stuff here! // ... // ------------------------------------------ } } void makeTexture(int textureID, BImage img) { makeTexture(textureID, img.pixels, img.width, img.height); } void makeTexture(int textureID, int[] imageData, int imageWidth, int imageHeight) { java.nio.ByteBuffer imgBuffer = java.nio.ByteBuffer.allocateDirect(imageHeight*imageWidth*4); // create a new direct ByteBuffer with the capacity of the BImage imgBuffer.order(java.nio.ByteOrder.nativeOrder()); // Set the byte order of our ByteBuffer java.nio.IntBuffer pixelData = imgBuffer.asIntBuffer(); // get an interpretation of the ByteBuffer as an IntBuffer pixelData.put(imageData, 0, imageData.length); GL gl = canvas.getGL(); gl.glBindTexture(GL.GL_TEXTURE_2D, textureID ); gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_REPEAT); gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_REPEAT); gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR); gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR); gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA, imageWidth, imageHeight, 0, GL.GL_BGRA, GL.GL_UNSIGNED_BYTE, imgBuffer ); }