import java.io.File; import java.io.IOException; import java.nio.FloatBuffer; import javax.media.opengl.GL; import javax.media.opengl.GL2; import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.GLCapabilities; import javax.media.opengl.GLEventListener; import javax.media.opengl.GLProfile; import javax.media.opengl.awt.GLCanvas; import javax.swing.JFrame; import com.sun.opengl.util.BufferUtil; import com.sun.opengl.util.texture.Texture; import com.sun.opengl.util.texture.TextureIO; public class titledrawstat extends JFrame implements GLEventListener { private static final int WIDTH = 320; private static final int HEIGHT = 460; private GLCanvas canvas; Texture texture; Texture bg1texture; Texture bg2texture; Texture bg3texture; Texture bg4texture; Texture bg5texture; static FloatBuffer verticesBuf; static FloatBuffer normalsBuf; static FloatBuffer texcoordBuf; static FloatBuffer bgverticesBuf; static FloatBuffer bgnormalsBuf; static FloatBuffer bgtexcoordBuf; public titledrawstat() { canvas = new GLCanvas(new GLCapabilities(GLProfile.getDefault())); canvas.addGLEventListener(this); getContentPane().add(canvas); } public void run() { setSize(WIDTH+10, HEIGHT+30); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); canvas.requestFocusInWindow(); } public static void main(String[] args) { new titledrawstat().run(); } public void init(GLAutoDrawable drawable) { final float[] LPOSITION = {0, -20, 25, 0}; final float[] LSPECULAR = {0.5f, 0.5f, 0.5f, 0.5f}; final float[] LDIFFUSE = {.7f, .7f, .8f, 0.5f}; final float[] LAMBIENT = {0.25f, 0.25f, 0.3f, 0.5f}; final float[] MSPECULAR = {1, 1, 1, 0.5f}; final float[] MDIFFUSE = {1, 1, 1, 1f}; final float[] MAMBIENT = {1, 1, 1, 0.4f}; final float MSHININESS = 100.0f; GL2 gl = drawable.getGL().getGL2(); gl.glClearColor(.0f, .0f, .0f, 0f); gl.glEnable(GL2.GL_TEXTURE_2D); // use texturing gl.glEnable(GL.GL_DEPTH_TEST); gl.glEnable(GL.GL_CULL_FACE); gl.glEnable(GL2.GL_LIGHTING); gl.glEnable(GL2.GL_LIGHT0); gl.glEnable(GL2.GL_NORMALIZE); gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, LPOSITION, 0); gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_SPECULAR, LSPECULAR, 0); gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_DIFFUSE, LDIFFUSE, 0); gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_AMBIENT, LAMBIENT, 0); gl.glMaterialfv(GL.GL_FRONT_AND_BACK, GL2.GL_SPECULAR, MSPECULAR, 0); gl.glMaterialfv(GL.GL_FRONT_AND_BACK, GL2.GL_DIFFUSE, MDIFFUSE, 0); gl.glMaterialfv(GL.GL_FRONT_AND_BACK, GL2.GL_AMBIENT, MAMBIENT, 0); gl.glMaterialf(GL.GL_FRONT_AND_BACK, GL2.GL_SHININESS, MSHININESS); try { texture = TextureIO.newTexture(new File("butterfly.png"), true); bg1texture = TextureIO.newTexture(new File("wood1.png"), true); bg2texture = TextureIO.newTexture(new File("wood2.png"), true); bg3texture = TextureIO.newTexture(new File("wood3.png"), true); bg4texture = TextureIO.newTexture(new File("wood4.png"), true); bg5texture = TextureIO.newTexture(new File("wood5.png"), true); } catch (IOException ex) { ex.printStackTrace(); } setupPointers(gl); } public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { final float CAMERA = -8.5f; GL2 gl = drawable.getGL().getGL2(); gl.glViewport(0, 0, width, height); float ratio = (float)height / (float)width * 1.0f; gl.glMatrixMode(GL2.GL_PROJECTION); gl.glLoadIdentity(); gl.glFrustum(-1.0f, 1.0f, -ratio, ratio, 5.0f, 40.0f); gl.glMatrixMode(GL2.GL_MODELVIEW); gl.glLoadIdentity(); gl.glTranslatef(-0.1f, 0.5f, CAMERA); } public void display(GLAutoDrawable drawable) { GL2 gl = drawable.getGL().getGL2(); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); gl.glDisable(GL.GL_CULL_FACE); gl.glDisable(GL.GL_DEPTH_TEST); gl.glDisable(GL2.GL_NORMALIZE); gl.glBlendFunc(GL.GL_ONE, GL.GL_ONE_MINUS_SRC_ALPHA); gl.glEnable(GL.GL_BLEND); gl.glEnableClientState(GL2.GL_VERTEX_ARRAY); gl.glEnableClientState(GL2.GL_NORMAL_ARRAY); gl.glEnableClientState(GL2.GL_TEXTURE_COORD_ARRAY); gl.glVertexPointer(3, GL2.GL_FLOAT, 0, verticesBuf); gl.glNormalPointer(GL2.GL_FLOAT, 0, normalsBuf); gl.glTexCoordPointer(2, GL2.GL_FLOAT, 0, texcoordBuf); texture.enable(); texture.bind(); float angleX = 40.0f; gl.glPushMatrix(); gl.glTranslatef(0, -0.2f, 2); gl.glRotatef(-20, 0, 1, 0); gl.glRotatef(angleX, 1, 0, -0.5f); gl.glRotatef(45, 0, 0, 1); gl.glDrawArrays(GL2.GL_TRIANGLE_STRIP, 0, 4); gl.glRotatef(-5, 1, 0, -0.5f); gl.glRotatef(15, 0, 0, 1); gl.glDrawArrays(GL2.GL_TRIANGLE_STRIP, 4, 4); gl.glPopMatrix(); gl.glPushMatrix(); gl.glTranslatef(0, -0.2f, 2); gl.glRotatef(-20, 0, 1, 0); gl.glRotatef(-angleX-5, 1, 0, 0.5f); gl.glRotatef(15+45, 0, 0, 1); gl.glDrawArrays(GL2.GL_TRIANGLE_STRIP, 4, 4); gl.glRotatef(+5, 1, 0, -0.5f); gl.glRotatef(-15, 0, 0, 1); gl.glDrawArrays(GL2.GL_TRIANGLE_STRIP, 0, 4); gl.glPopMatrix(); texture.disable(); gl.glVertexPointer(3, GL2.GL_FLOAT, 0, bgverticesBuf); gl.glNormalPointer(GL2.GL_FLOAT, 0, bgnormalsBuf); gl.glTexCoordPointer(2, GL2.GL_FLOAT, 0, bgtexcoordBuf); float x, y, z; float xyr[]; // Confotable Clothe x=0.54f; y=-1f; z = 2f; xyr = new float[] {72.01203388576373f, -75.36967666750425f, 3.926991f, 32.011998926016474f, 110.22827536612041f, 3.141592653589793f, -101.01601074434598f, 37.22828367997014f, 2.3561946732051036f, 1.9559518724764224f, -144.77171632002987f, 0f, 12.01199892601648f, 64.22827536612041f, 0f, 16.01202663883157f, -35.77171632002983f, 3.141593f, -31.987999504758708f, 44.22827489535299f, 0f }; Texture tex[] = { bg1texture, bg5texture, bg2texture, bg3texture, bg2texture, bg4texture, bg1texture }; int ari[] = {0,3,3,6,10,14,14}; int arn[] = {3,3,3,4,4,3,3}; for (int i = 0; i < 7; i++) { tex[i].enable(); tex[i].bind(); gl.glPushMatrix(); gl.glTranslatef(-xyr[i*3]/160+x, -xyr[i*3+1]/160+y, z); gl.glRotatef(xyr[i*3+2]*180/(float)Math.PI+180, 0, 0, 1); gl.glDrawArrays(GL2.GL_TRIANGLE_STRIP, ari[i], arn[i]); gl.glPopMatrix(); tex[i].disable(); } } public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) {} public void dispose(GLAutoDrawable drawable){} private void setupPointers(GL2 gl) { float vertices[] = new float[] { 0-295,0-25,0, 350-295,0-25,0, 0-295,700-25,0, 350-295,700-25,0, 0-95, 0-30,0, 350-95, 0-30,0, 0-95, 700-30,0, 350-95, 700-30,0 }; this.verticesBuf = mkFloatBuf(vertices, 0.0030f); float normals[] = new float[] { 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1 }; this.normalsBuf = mkFloatBuf(normals, 1.0f); float texcoord[] = new float[] { 0, 0, 50, 0, 0, 100, 50, 100, 50,0, 100,0, 50,100, 100,100 }; this.texcoordBuf = mkFloatBuf(texcoord, 0.01f); vertices = new float[] { 0-28,0-28,0, 0-28,80-28,0, 80-28,0-28,0, //Mt 0-40,0-14,0, 40-40,40-14,0, 80-40,0-14,0, //St 40-40,0-40,0, 0-40,40-40,0, 80-40,40-40,0, 40-40,80-40,0, //Sq 0-20,40-60,0, 0-20,120-60,0, 40-20,0-60,0, 40-20,80-60,0, //Pa 0-56,80-80,0, 80-56,160-80,0, 80-56,0-80,0 }; //Lt this.bgverticesBuf = mkFloatBuf(vertices, 1/160f); normals = new float[] { 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1 }; this.bgnormalsBuf = mkFloatBuf(normals, 1.0f); texcoord = new float[] { 0,0, 0,80, 80,0, 0,0, 40,40, 80,0, 40,0, 0,40, 80,40, 40,80, 0,40, 0,120, 40,0, 40,80, 0,80, 80,160, 80,0 }; this.bgtexcoordBuf = mkFloatBuf(texcoord, 1/160f); } private FloatBuffer mkFloatBuf(float[] vertices, float ratio) { FloatBuffer tmpVerticesBuf = BufferUtil.newFloatBuffer(vertices.length); for (int i = 0; i < vertices.length; i++) tmpVerticesBuf.put(vertices[i] * ratio); tmpVerticesBuf.rewind(); return tmpVerticesBuf; } }