private static void clearEnabledAttributes(final ShaderObjectsStateRecord record, final GL gl) { // go through and disable any enabled attributes if (!record.enabledAttributes.isEmpty()) { for (int i = 0, maxI = record.enabledAttributes.size(); i < maxI; i++) { final ShaderVariable var = record.enabledAttributes.get(i); if (var.getSize() == 1) { if (gl.isGL2()) { gl.getGL2().glDisableVertexAttribArrayARB(var.variableID); } else { if (gl.isGL2ES2()) { gl.getGL2ES2().glDisableVertexAttribArray(var.variableID); } } } else { for (int j = 0, maxJ = var.getSize(); j < maxJ; j++) { if (gl.isGL2()) { gl.getGL2().glDisableVertexAttribArrayARB(var.variableID + j); } else { if (gl.isGL2ES2()) { gl.getGL2ES2().glDisableVertexAttribArray(var.variableID + j); } } } } } record.enabledAttributes.clear(); } }
private static void checkLinkError(final int programId) { final GL gl = GLContext.getCurrentGL(); final JoglRenderContext context = (JoglRenderContext) ContextManager.getCurrentContext(); final IntBuffer compiled = context.getDirectNioBuffersSet().getSingleIntBuffer(); compiled.clear(); if (gl.isGL2()) { gl.getGL2().glGetObjectParameterivARB(programId, GL2ES2.GL_LINK_STATUS, compiled); } else { if (gl.isGL2ES2()) { gl.getGL2ES2().glGetProgramiv(programId, GL2ES2.GL_LINK_STATUS, compiled); } } if (compiled.get(0) == GL.GL_FALSE) { if (gl.isGL2()) { gl.getGL2().glGetObjectParameterivARB(programId, GL2ES2.GL_INFO_LOG_LENGTH, compiled); } else { if (gl.isGL2ES2()) { gl.getGL2ES2().glGetProgramiv(programId, GL2ES2.GL_INFO_LOG_LENGTH, compiled); } } final int length = compiled.get(0); String out = null; if (length > 0) { final ByteBuffer infoLogBuf = context.getDirectNioBuffersSet().getInfoLogBuffer(); final ByteBuffer infoLog; if (length <= infoLogBuf.capacity()) { infoLog = infoLogBuf; infoLogBuf.rewind().limit(length); } else { infoLog = BufferUtils.createByteBuffer(length); } if (gl.isGL2()) { gl.getGL2().glGetInfoLogARB(programId, infoLog.limit(), compiled, infoLog); } else { if (gl.isGL2ES2()) { gl.getGL2ES2().glGetProgramInfoLog(programId, infoLog.limit(), compiled, infoLog); } } final byte[] infoBytes = new byte[length]; infoLog.get(infoBytes); out = new String(infoBytes); } logger.severe(out); // throw new Ardor3dException("Error linking GLSL shader: " + out); } }
/** * Check for program errors. If an error is detected, program exits. * * @param compilerState the compiler state for a given shader * @param id shader's id */ private static void checkProgramError( final int compilerState, final int id, final String shaderName) { final GL gl = GLContext.getCurrentGL(); if (compilerState == GL.GL_FALSE) { final JoglRenderContext context = (JoglRenderContext) ContextManager.getCurrentContext(); final IntBuffer iVal = context.getDirectNioBuffersSet().getSingleIntBuffer(); iVal.clear(); if (gl.isGL2()) { gl.getGL2().glGetObjectParameterivARB(id, GL2.GL_OBJECT_INFO_LOG_LENGTH_ARB, iVal); } else { if (gl.isGL2ES2()) { gl.getGL2ES2().glGetProgramiv(id, GL2ES2.GL_INFO_LOG_LENGTH, iVal); } } final int length = iVal.get(0); String out = null; if (length > 0) { final ByteBuffer infoLogBuf = context.getDirectNioBuffersSet().getInfoLogBuffer(); final ByteBuffer infoLog; if (length <= infoLogBuf.capacity()) { infoLog = infoLogBuf; infoLogBuf.rewind().limit(length); } else { infoLog = BufferUtils.createByteBuffer(length); } if (gl.isGL2()) { gl.getGL2().glGetInfoLogARB(id, infoLog.limit(), iVal, infoLog); } else { if (gl.isGL2ES2()) { gl.getGL2ES2().glGetProgramInfoLog(id, infoLog.limit(), iVal, infoLog); } } final byte[] infoBytes = new byte[length]; infoLog.get(infoBytes); out = new String(infoBytes); } logger.severe(out); final String nameString = shaderName.equals("") ? "" : " [ " + shaderName + " ]"; throw new Ardor3dException("Error compiling GLSL shader " + nameString + ": " + out); } }
/** Removes the tessellation evaluation shader */ private static void removeTessEvalShader(final GLSLShaderObjectsState state) { final GL gl = GLContext.getCurrentGL(); if (state._tessellationEvaluationShaderID != -1) { if (gl.isGL2()) { gl.getGL2().glDetachObjectARB(state._programID, state._tessellationEvaluationShaderID); gl.getGL2().glDeleteObjectARB(state._tessellationEvaluationShaderID); } else { if (gl.isGL2ES2()) { gl.getGL2ES2().glDetachShader(state._programID, state._tessellationEvaluationShaderID); gl.getGL2ES2().glDeleteShader(state._tessellationEvaluationShaderID); } } } }
protected static void sendToGL( final GLSLShaderObjectsState state, final ContextCapabilities caps) { final GL gl = GLContext.getCurrentGL(); if (state.getVertexShader() == null && state.getFragmentShader() == null) { logger.warning("Could not find shader resources!" + "(both inputbuffers are null)"); state._needSendShader = false; return; } if (state._programID == -1) { if (gl.isGL2()) { state._programID = gl.getGL2().glCreateProgramObjectARB(); } else { if (gl.isGL2ES2()) { state._programID = gl.getGL2ES2().glCreateProgram(); } } } if (state.getVertexShader() != null) { if (state._vertexShaderID != -1) { removeVertShader(state); } if (gl.isGL2()) { state._vertexShaderID = gl.getGL2().glCreateShaderObjectARB(GL2ES2.GL_VERTEX_SHADER); } else { if (gl.isGL2ES2()) { state._vertexShaderID = gl.getGL2ES2().glCreateShader(GL2ES2.GL_VERTEX_SHADER); } } // Create the sources final byte array[] = new byte[state.getVertexShader().limit()]; state.getVertexShader().rewind(); state.getVertexShader().get(array); if (gl.isGL2()) { gl.getGL2() .glShaderSourceARB( state._vertexShaderID, 1, new String[] {new String(array)}, new int[] {array.length}, 0); } else { if (gl.isGL2ES2()) { gl.getGL2ES2() .glShaderSource( state._vertexShaderID, 1, new String[] {new String(array)}, new int[] {array.length}, 0); } } // Compile the vertex shader final JoglRenderContext context = (JoglRenderContext) ContextManager.getCurrentContext(); final IntBuffer compiled = context.getDirectNioBuffersSet().getSingleIntBuffer(); compiled.clear(); if (gl.isGL2()) { gl.getGL2().glCompileShaderARB(state._vertexShaderID); gl.getGL2() .glGetObjectParameterivARB( state._vertexShaderID, GL2.GL_OBJECT_COMPILE_STATUS_ARB, compiled); } else { if (gl.isGL2ES2()) { gl.getGL2ES2().glCompileShader(state._vertexShaderID); gl.getGL2ES2().glGetShaderiv(state._vertexShaderID, GL2ES2.GL_COMPILE_STATUS, compiled); } } checkProgramError(compiled.get(0), state._vertexShaderID, state._vertexShaderName); // Attach the program if (gl.isGL2()) { gl.getGL2().glAttachObjectARB(state._programID, state._vertexShaderID); } else { if (gl.isGL2ES2()) { gl.getGL2ES2().glAttachShader(state._programID, state._vertexShaderID); } } } else if (state._vertexShaderID != -1) { removeVertShader(state); state._vertexShaderID = -1; } if (state.getFragmentShader() != null) { if (state._fragmentShaderID != -1) { removeFragShader(state); } if (gl.isGL2()) { state._fragmentShaderID = gl.getGL2().glCreateShaderObjectARB(GL2ES2.GL_FRAGMENT_SHADER); } else { if (gl.isGL2ES2()) { state._fragmentShaderID = gl.getGL2ES2().glCreateShader(GL2ES2.GL_FRAGMENT_SHADER); } } // Create the sources final byte array[] = new byte[state.getFragmentShader().limit()]; state.getFragmentShader().rewind(); state.getFragmentShader().get(array); if (gl.isGL2()) { gl.getGL2() .glShaderSourceARB( state._fragmentShaderID, 1, new String[] {new String(array)}, new int[] {array.length}, 0); } else { if (gl.isGL2ES2()) { gl.getGL2ES2() .glShaderSource( state._fragmentShaderID, 1, new String[] {new String(array)}, new int[] {array.length}, 0); } } // Compile the fragment shader final JoglRenderContext context = (JoglRenderContext) ContextManager.getCurrentContext(); final IntBuffer compiled = context.getDirectNioBuffersSet().getSingleIntBuffer(); compiled.clear(); if (gl.isGL2()) { gl.getGL2().glCompileShaderARB(state._fragmentShaderID); gl.getGL2() .glGetObjectParameterivARB( state._fragmentShaderID, GL2.GL_OBJECT_COMPILE_STATUS_ARB, compiled); } else { if (gl.isGL2ES2()) { gl.getGL2ES2().glCompileShader(state._fragmentShaderID); gl.getGL2ES2().glGetShaderiv(state._fragmentShaderID, GL2ES2.GL_COMPILE_STATUS, compiled); } } checkProgramError(compiled.get(0), state._fragmentShaderID, state._vertexShaderName); // Attach the program if (gl.isGL2()) { gl.getGL2().glAttachObjectARB(state._programID, state._fragmentShaderID); } else { if (gl.isGL2ES2()) { gl.getGL2ES2().glAttachShader(state._programID, state._fragmentShaderID); } } } else if (state._fragmentShaderID != -1) { removeFragShader(state); state._fragmentShaderID = -1; } if (caps.isGeometryShader4Supported()) { if (state.getGeometryShader() != null) { if (state._geometryShaderID != -1) { removeGeomShader(state); } if (gl.isGL2()) { state._geometryShaderID = gl.getGL2().glCreateShaderObjectARB(GL3.GL_GEOMETRY_SHADER); } else { if (gl.isGL2ES2()) { state._geometryShaderID = gl.getGL2ES2().glCreateShader(GL3.GL_GEOMETRY_SHADER); } } // Create the sources final byte array[] = new byte[state.getGeometryShader().limit()]; state.getGeometryShader().rewind(); state.getGeometryShader().get(array); if (gl.isGL2()) { gl.getGL2() .glShaderSourceARB( state._geometryShaderID, 1, new String[] {new String(array)}, new int[] {array.length}, 0); } else { if (gl.isGL2ES2()) { gl.getGL2ES2() .glShaderSource( state._geometryShaderID, 1, new String[] {new String(array)}, new int[] {array.length}, 0); } } // Compile the geometry shader final JoglRenderContext context = (JoglRenderContext) ContextManager.getCurrentContext(); final IntBuffer compiled = context.getDirectNioBuffersSet().getSingleIntBuffer(); compiled.clear(); if (gl.isGL2()) { gl.getGL2().glCompileShaderARB(state._geometryShaderID); gl.getGL2() .glGetObjectParameterivARB( state._geometryShaderID, GL2.GL_OBJECT_COMPILE_STATUS_ARB, compiled); } else { if (gl.isGL2ES2()) { gl.getGL2ES2().glCompileShader(state._geometryShaderID); gl.getGL2ES2() .glGetShaderiv(state._geometryShaderID, GL2ES2.GL_COMPILE_STATUS, compiled); } } checkProgramError(compiled.get(0), state._geometryShaderID, state._geometryShaderName); // Attach the program if (gl.isGL2()) { gl.getGL2().glAttachObjectARB(state._programID, state._geometryShaderID); } else { if (gl.isGL2ES2()) { gl.getGL2ES2().glAttachShader(state._programID, state._geometryShaderID); } } } else if (state._geometryShaderID != -1) { removeGeomShader(state); state._geometryShaderID = -1; } } if (caps.isTessellationShadersSupported()) { if (state.getTessellationControlShader() != null) { if (state._tessellationControlShaderID != -1) { removeTessControlShader(state); } if (gl.isGL2()) { state._tessellationControlShaderID = gl.getGL2().glCreateShaderObjectARB(GL4.GL_TESS_CONTROL_SHADER); } else { if (gl.isGL2ES2()) { state._tessellationControlShaderID = gl.getGL2ES2().glCreateShader(GL4.GL_TESS_CONTROL_SHADER); } } // Create the sources final byte array[] = new byte[state.getTessellationControlShader().limit()]; state.getTessellationControlShader().rewind(); state.getTessellationControlShader().get(array); if (gl.isGL2()) { gl.getGL2() .glShaderSourceARB( state._tessellationControlShaderID, 1, new String[] {new String(array)}, new int[] {array.length}, 0); } else { if (gl.isGL2ES2()) { gl.getGL2ES2() .glShaderSource( state._tessellationControlShaderID, 1, new String[] {new String(array)}, new int[] {array.length}, 0); } } // Compile the tessellation control shader final JoglRenderContext context = (JoglRenderContext) ContextManager.getCurrentContext(); final IntBuffer compiled = context.getDirectNioBuffersSet().getSingleIntBuffer(); compiled.clear(); if (gl.isGL2()) { gl.getGL2().glCompileShaderARB(state._tessellationControlShaderID); gl.getGL2() .glGetObjectParameterivARB( state._tessellationControlShaderID, GL2.GL_OBJECT_COMPILE_STATUS_ARB, compiled); } else { if (gl.isGL2ES2()) { gl.getGL2ES2().glCompileShader(state._tessellationControlShaderID); gl.getGL2ES2() .glGetShaderiv( state._tessellationControlShaderID, GL2ES2.GL_COMPILE_STATUS, compiled); } } checkProgramError( compiled.get(0), state._tessellationControlShaderID, state._tessellationControlShaderName); // Attach the program if (gl.isGL2()) { gl.getGL2().glAttachObjectARB(state._programID, state._tessellationControlShaderID); } else { if (gl.isGL2ES2()) { gl.getGL2ES2().glAttachShader(state._programID, state._tessellationControlShaderID); } } } else if (state._tessellationControlShaderID != -1) { removeTessControlShader(state); state._tessellationControlShaderID = -1; } if (state.getTessellationEvaluationShader() != null) { if (state._tessellationEvaluationShaderID != -1) { removeTessEvalShader(state); } if (gl.isGL2()) { state._tessellationEvaluationShaderID = gl.getGL2().glCreateShaderObjectARB(GL4.GL_TESS_CONTROL_SHADER); } else { if (gl.isGL2ES2()) { state._tessellationEvaluationShaderID = gl.getGL2ES2().glCreateShader(GL4.GL_TESS_CONTROL_SHADER); } } // Create the sources final byte array[] = new byte[state.getTessellationEvaluationShader().limit()]; state.getTessellationEvaluationShader().rewind(); state.getTessellationEvaluationShader().get(array); if (gl.isGL2()) { gl.getGL2() .glShaderSourceARB( state._tessellationEvaluationShaderID, 1, new String[] {new String(array)}, new int[] {array.length}, 0); } else { if (gl.isGL2ES2()) { gl.getGL2ES2() .glShaderSource( state._tessellationEvaluationShaderID, 1, new String[] {new String(array)}, new int[] {array.length}, 0); } } // Compile the tessellation control shader final JoglRenderContext context = (JoglRenderContext) ContextManager.getCurrentContext(); final IntBuffer compiled = context.getDirectNioBuffersSet().getSingleIntBuffer(); compiled.clear(); if (gl.isGL2()) { gl.getGL2().glCompileShaderARB(state._tessellationEvaluationShaderID); gl.getGL2() .glGetObjectParameterivARB( state._tessellationEvaluationShaderID, GL2.GL_OBJECT_COMPILE_STATUS_ARB, compiled); } else { if (gl.isGL2ES2()) { gl.getGL2ES2().glCompileShader(state._tessellationEvaluationShaderID); gl.getGL2ES2() .glGetShaderiv( state._tessellationEvaluationShaderID, GL2ES2.GL_COMPILE_STATUS, compiled); } } checkProgramError( compiled.get(0), state._tessellationEvaluationShaderID, state._tessellationEvaluationShaderName); // Attach the program if (gl.isGL2()) { gl.getGL2().glAttachObjectARB(state._programID, state._tessellationEvaluationShaderID); } else { if (gl.isGL2ES2()) { gl.getGL2ES2().glAttachShader(state._programID, state._tessellationEvaluationShaderID); } } } else if (state._tessellationEvaluationShaderID != -1) { removeTessEvalShader(state); state._tessellationEvaluationShaderID = -1; } } if (gl.isGL2()) { gl.getGL2().glLinkProgramARB(state._programID); } else { if (gl.isGL2ES2()) { gl.getGL2ES2().glLinkProgram(state._programID); } } checkLinkError(state._programID); state.setNeedsRefresh(true); state._needSendShader = false; }
/** ******************************************************************* */ public void draw(GL gl, GLU glu, Camera cam) { doTransform(gl, glu, cam); applyMaterial(gl); // TODO: shall we avoid calling this @ each draw? Coord3d norm = Normal.compute(points.get(0).xyz, points.get(1).xyz, points.get(2).xyz); // Draw content of polygon if (gl.isGL2()) { if (facestatus) { gl.getGL2().glPolygonMode(GL2.GL_FRONT_AND_BACK, GL2.GL_FILL); if (wfstatus) { gl.getGL2().glEnable(GL2.GL_POLYGON_OFFSET_FILL); gl.getGL2().glPolygonOffset(1.0f, 1.0f); } gl.getGL2().glBegin(GL2.GL_POLYGON); for (Point p : points) { if (mapper != null) { Color c = mapper.getColor(p.xyz); // TODO: should store // result in the // point color gl.getGL2().glColor4f(c.r, c.g, c.b, c.a); } else gl.getGL2().glColor4f(p.rgb.r, p.rgb.g, p.rgb.b, p.rgb.a); gl.getGL2().glVertex3f(p.xyz.x, p.xyz.y, p.xyz.z); gl.getGL2().glNormal3f(norm.x, norm.y, norm.z); } gl.getGL2().glEnd(); if (wfstatus) gl.glDisable(GL2.GL_POLYGON_OFFSET_FILL); } // Draw edge of polygon if (wfstatus) { gl.getGL2().glPolygonMode(GL2.GL_FRONT_AND_BACK, GL2.GL_LINE); gl.glEnable(GL2.GL_POLYGON_OFFSET_FILL); gl.glPolygonOffset(1.0f, 1.0f); gl.getGL2().glColor4f(wfcolor.r, wfcolor.g, wfcolor.b, 1); // wfcolor.a); gl.glLineWidth(wfwidth); gl.getGL2().glBegin(GL2.GL_POLYGON); for (Point p : points) { gl.getGL2().glVertex3f(p.xyz.x, p.xyz.y, p.xyz.z); gl.getGL2().glNormal3f(norm.x, norm.y, norm.z); } gl.getGL2().glEnd(); gl.glDisable(GL2.GL_POLYGON_OFFSET_FILL); } } else { if (facestatus) { GLES2CompatUtils.glPolygonMode(GL2.GL_FRONT_AND_BACK, GL2.GL_FILL); if (wfstatus) { gl.glEnable(GL2.GL_POLYGON_OFFSET_FILL); gl.glPolygonOffset(1.0f, 1.0f); } GLES2CompatUtils.glBegin(GL2.GL_POLYGON); for (Point p : points) { if (mapper != null) { Color c = mapper.getColor(p.xyz); // TODO: should store // result in the // point color GLES2CompatUtils.glColor4f(c.r, c.g, c.b, c.a); } else GLES2CompatUtils.glColor4f(p.rgb.r, p.rgb.g, p.rgb.b, p.rgb.a); GLES2CompatUtils.glVertex3f(p.xyz.x, p.xyz.y, p.xyz.z); GLES2CompatUtils.glNormal3f(norm.x, norm.y, norm.z); } GLES2CompatUtils.glEnd(); if (wfstatus) gl.glDisable(GL2.GL_POLYGON_OFFSET_FILL); } // Draw edge of polygon if (wfstatus) { GLES2CompatUtils.glPolygonMode(GL2.GL_FRONT_AND_BACK, GL2.GL_LINE); gl.glEnable(GL2.GL_POLYGON_OFFSET_FILL); gl.glPolygonOffset(1.0f, 1.0f); GLES2CompatUtils.glColor4f(wfcolor.r, wfcolor.g, wfcolor.b, 1); // wfcolor.a); gl.glLineWidth(wfwidth); GLES2CompatUtils.glBegin(GL2.GL_POLYGON); for (Point p : points) { GLES2CompatUtils.glVertex3f(p.xyz.x, p.xyz.y, p.xyz.z); GLES2CompatUtils.glNormal3f(norm.x, norm.y, norm.z); } GLES2CompatUtils.glEnd(); gl.glDisable(GL2.GL_POLYGON_OFFSET_FILL); } } /* * // Drawbarycenter Point b = new Point(getBarycentre(), Color.BLUE); * b.setWidth(5); b.draw(gl,glu,cam); */ }