/** Create and initialize the WebGL context. */ public final boolean initWebGLContext() { if (gl == null) { gl = GL2ContextHelper.getGL2( getWidget(), new WebGLContextAttributes() { { setStencilEnable(true); } }); if (gl == null) { return false; } } float[] cc = getState().clearColor; gl.clearColor(cc[0], cc[1], cc[2], cc[3]); gl.clearDepth(1); gl.enable(EnableCap.DEPTH_TEST); gl.depthFunc(DepthFunction.LEQUAL); gl.clear(ClearBufferMask.COLOR_BUFFER_BIT, ClearBufferMask.DEPTH_BUFFER_BIT); try { shader = new AbstractShader() { @Override protected void initImpl() throws ShaderException { initProgram(getState().vertexShaderSource, getState().fragmentShaderSource); } }; shader.init(gl); shader.bind(); } catch (ShaderException e) { Window.alert(e.getMessage()); return false; } vertexPositionAttribute = shader.getAttributeLocation("aVertexPosition"); gl.enableVertexAttribArray(vertexPositionAttribute); vertexColorAttribute = shader.getAttributeLocation("aVertexColor"); gl.enableVertexAttribArray(vertexColorAttribute); PROJECTION.pushIdentity(); PROJECTION.perspective(getState().fov, 1, getState().minDist, getState().maxDist); gl.uniformMatrix(shader.getUniformLocation("uPMatrix"), PROJECTION.get()); PROJECTION.pop(); buildBuffers(getState().shapes); return true; }
@Override public void dispose() { if (shader != null) { shader.dispose(); for (WebGLBuffer b : vertices) { gl.deleteBuffer(b); } for (WebGLBuffer b : colors) { gl.deleteBuffer(b); } for (WebGLBuffer b : indices) { if (b != null) { gl.deleteBuffer(b); } } } }
private void setMatrixUniforms() { gl.uniformMatrix(shader.getUniformLocation("uMVMatrix"), MODELVIEW.get()); }