@Override public void flush() { super.flush(); if (quadCounter == 0) return; uData.bind(data, quadCounter * vec4sPerQuad()); elements.drawElements(GL20.GL_TRIANGLES, ELEMENTS_PER_QUAD*quadCounter); quadCounter = 0; }
@Override public int createTexture(boolean repeatX, boolean repeatY, boolean mipmaps) { int[] tex = new int[1]; gl.glGenTextures(1, tex, 0); gl.glBindTexture(GL_TEXTURE_2D, tex[0]); gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter); gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mipmapify(minFilter, mipmaps)); gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeatX ? GL_REPEAT : GL_CLAMP_TO_EDGE); gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeatY ? GL_REPEAT : GL_CLAMP_TO_EDGE); if (STATS_ENABLED) stats.texCreates++; return tex[0]; }
public void paint(GroupLayerGL rootLayer) { if (rootLayer.size() > 0) { checkGLError("paint"); bindFramebuffer(); gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear to transparent rootLayer.paint(rootXform, Tint.NOOP_TINT, null); // paint all the layers useShader(null); // flush any pending shader } if (STATS_ENABLED) stats.frames++; }
void drawImpl(GLShader shader, InternalTransform xform, int tex, int tint, float dx, float dy, float dw, float dh, float sl, float st, float sr, float sb) { if (tex > 0) { ctx.quadShader(shader).prepareTexture(tex, tint).addQuad( xform, dx, dy, dx + dw, dy + dh, sl, st, sr, sb); } }
@Override public void activate(int fbufWidth, int fbufHeight) { prog.bind(); uScreenSize.bind(fbufWidth, fbufHeight); // certain graphics cards (I'm looking at you, Intel) exhibit broken behavior if we bind our // attributes once during activation, so for those cards we bind every time in flush() if (!delayedBinding) bindAttribsBufs(); ctx.checkGLError("Shader.activate bind"); }
@Override public ImmediateLayer.Clipped createImmediateLayer( int width, int height, ImmediateLayer.Renderer renderer) { return new ImmediateLayerGL.Clipped(ctx(), width, height, renderer); }
@Override public Surface drawImage(Image image, float x, float y, float dw, float dh) { bindFramebuffer(); ((AbstractImageGL<?>) image).draw(shader, topTransform(), tint, x, y, dw, dh); return this; }
@Override public void glUniform3fv(int location, int count, float[] v, int offset) { bufs.setFloatBuffer(v, offset, count); glUniform3fv(location, count, bufs.floatBuffer); }
@Override public void glUniformMatrix3fv(int location, int count, boolean transpose, float[] value, int offset) { bufs.setFloatBuffer(value, offset, 3*3*count); glUniformMatrix3fv(location, count, transpose, bufs.floatBuffer); }
@Override public void glUniformMatrix4fv(int location, int count, boolean transpose, float[] value, int offset) { bufs.setFloatBuffer(value, offset, 4*4*count); glUniformMatrix4fv(location, count, transpose, bufs.floatBuffer); }
@Override public void glDeleteBuffers(int n, int[] buffers, int offset) { bufs.setIntBuffer(buffers, offset, n); glDeleteBuffers(n, bufs.intBuffer); }
@Override public void glDeleteFramebuffers(int n, int[] framebuffers, int offset) { bufs.setIntBuffer(framebuffers, offset, n); glDeleteFramebuffers(n, bufs.intBuffer); }
@Override public void glUniform1iv(int location, int count, int[] v, int offset) { bufs.setIntBuffer(v, offset, count); glUniform1iv(location, count, bufs.intBuffer); }
@Override public void glUniform3iv(int location, int count, int[] v, int offset) { bufs.setIntBuffer(v, offset, count); glUniform3iv(location, count, bufs.intBuffer); }
@Override public Surface clear() { bindFramebuffer(); ctx.clear(0, 0, 0, 0); return this; }