package javaforce.webui; /** Test WebUI / WebGL. * * @author pquiring */ import javaforce.*; import javaforce.gl.*; public class TestGLCube implements WebUIHandler { public TestGLCube() { } public static void main(String args[]) { new WebUIServer().start(new TestGLCube(), 8080, false); } public byte[] getResource(String url) { //TODO : return static images, etc needed by webpage return null; } private String vs = " attribute vec3 aVertexPosition;\n" + " attribute vec2 aTextureCoord;\n" + "\n" + " uniform mat4 uPMatrix;\n" + " uniform mat4 uMVMatrix;\n" + "\n" + " varying highp vec2 vTextureCoord;\n" + "\n" + " void main(void) {\n" + " gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\n" + " vTextureCoord = aTextureCoord;\n" + " }\n"; private String fs = " varying highp vec2 vTextureCoord;\n" + "\n" + " uniform sampler2D uSampler;" + "\n" + " void main(void) {\n" + " gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t));\n" + " }\n"; private float[] vertices = { 1.0f,-1.0f, 0.0f, -1.0f,-1.0f, 0.0f, 1.0f, 1.0f, 0.0f, -1.0f, 1.0f, 0.0f, }; private float[] textCoords = { // Front 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, // Back 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, // Top 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, // Bottom 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, // Right 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, // Left 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f }; public byte[] convertFloatArray(float m[]) { byte data[] = new byte[m.length * 4]; int off = 0; for(int a=0;a<m.length;a++) { javaforce.LE.setuint32(data, off, Float.floatToIntBits(m[a])); off += 4; } return data; } public byte[] convertIntArray(int i[]) { byte data[] = new byte[i.length * 4]; int offset = 0; for(int a=0;a<i.length;a++) { int num = i[a]; data[offset+2] = (byte)(num & 0xff); num >>= 8; data[offset+1] = (byte)(num & 0xff); num >>= 8; data[offset+0] = (byte)(num & 0xff); num >>= 8; data[offset+3] = (byte)(num & 0xff); offset += 4; } return data; } public Panel getRootPanel(WebUIClient client) { Panel panel = new Panel() { public void onLoaded(String args[]) { GLMatrix pMatrix = new GLMatrix(); pMatrix.perspective(45f, 640.0f/480.0f, 0.1f, 100.0f); GLMatrix mMatrix = new GLMatrix(); mMatrix.addTranslate(0, 0, -4.0f); Canvas canvas = (Canvas)getProperty("canvas"); //init gl resources canvas.sendEvent("initwebgl", null); canvas.sendEvent("loadvs", new String[] {"src=" + vs}); canvas.sendEvent("loadfs", new String[] {"src=" + fs}); canvas.sendEvent("link", null); canvas.sendEvent("getuniform", new String[] {"idx=0", "name=uPMatrix"}); canvas.sendEvent("getuniform", new String[] {"idx=1", "name=uMVMatrix"}); canvas.sendEvent("getattrib", new String[] {"idx=0", "name=aVertexPosition"}); canvas.sendEvent("getattrib", new String[] {"idx=1", "name=aTextureCoord"}); canvas.sendData(convertFloatArray(pMatrix.m)); canvas.sendEvent("matrix", new String[] {"idx=0"}); canvas.sendData(convertFloatArray(mMatrix.m)); canvas.sendEvent("matrix", new String[] {"idx=1"}); canvas.sendData(convertFloatArray(vertices)); canvas.sendEvent("buffer", new String[] {"idx=0"}); canvas.sendData(convertFloatArray(textCoords)); canvas.sendEvent("buffer", new String[] {"idx=1"}); JFImage img = new JFImage(); img.loadPNG("data\\opengl.png"); canvas.sendData(convertIntArray(img.getBuffer())); canvas.sendEvent("loadt", new String[] {"idx=0", "x=" + img.getWidth(), "y=" + img.getHeight()}); //setup rendering pipeline canvas.sendEvent("r_matrix", new String[] {"idx=0", "uidx=0", "midx=0"}); canvas.sendEvent("r_matrix", new String[] {"idx=1", "uidx=1", "midx=1"}); canvas.sendEvent("r_attrib", new String[] {"idx=2", "aidx=0", "bufidx=0", "cnt=3"}); canvas.sendEvent("r_attrib", new String[] {"idx=3", "aidx=1", "bufidx=1", "cnt=2"}); canvas.sendEvent("r_bindt", new String[] {"idx=4", "tidx=0"}); canvas.sendEvent("r_drawArrays", new String[] {"idx=5", "type=" + GL.GL_TRIANGLE_STRIP, "cnt=4"}); } }; Canvas canvas = new Canvas(); canvas.setWidth("640px"); canvas.setHeight("480px"); panel.add(canvas); panel.setProperty("canvas", canvas); return panel; } }