/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package tests.gl_320.draw; import com.jogamp.opengl.GL; import static com.jogamp.opengl.GL2ES3.*; import com.jogamp.opengl.GL3; import com.jogamp.opengl.util.GLBuffers; import com.jogamp.opengl.util.glsl.ShaderCode; import com.jogamp.opengl.util.glsl.ShaderProgram; import glm.glm; import glm.mat._4.Mat4; import framework.BufferUtils; import framework.Profile; import framework.Semantic; import framework.Test; import glm.vec._2.Vec2; import java.nio.ByteBuffer; import java.nio.FloatBuffer; import java.nio.IntBuffer; import java.nio.ShortBuffer; /** * * @author GBarbieri */ public class Gl_320_draw_range_elements extends Test { public static void main(String[] args) { Gl_320_draw_range_elements gl_320_draw_range_elements = new Gl_320_draw_range_elements(); } public Gl_320_draw_range_elements() { super("gl-320-draw-range-elements", Profile.CORE, 3, 2); } private final String SHADERS_SOURCE = "draw-range-elements"; private final String SHADERS_ROOT = "src/data/gl_320/draw"; private int vertexCount = 8; private int vertexSize = vertexCount * Vec2.SIZE; private float[] vertexData = { -0.4f, -0.6f, +0.5f, -0.4f, +0.6f, 0.4f, -0.5f, 0.5f, -0.5f, -0.5f, +0.5f, -0.5f, +0.5f, 0.5f, -0.5f, 0.5f}; private int elementCount = 12; private int elementSize = elementCount * Short.BYTES; private short[] elementData = { 0, 1, 2, 2, 3, 0, 4, 5, 6, 6, 7, 4 }; private class Buffer { public static final int VERTEX = 0; public static final int ELEMENT = 1; public static final int TRANSFORM = 2; public static final int MAX = 3; } private IntBuffer bufferName = GLBuffers.newDirectIntBuffer(Buffer.MAX), vertexArrayName = GLBuffers.newDirectIntBuffer(1); private int programName, uniformTransform; @Override protected boolean begin(GL gl) { GL3 gl3 = (GL3) gl; boolean validated = true; if (validated) { validated = initTest(gl3); } if (validated) { validated = initProgram(gl3); } if (validated) { validated = initBuffer(gl3); } if (validated) { validated = initVertexArray(gl3); } return validated && checkError(gl3, "begin"); } private boolean initTest(GL3 gl3) { boolean validated = true; gl3.glEnable(GL3.GL_DEPTH_TEST); return validated & checkError(gl3, "initTest"); } private boolean initProgram(GL3 gl3) { boolean validated = true; // Create program if (validated) { ShaderCode vertShader = ShaderCode.create(gl3, GL_VERTEX_SHADER, this.getClass(), SHADERS_ROOT, null, SHADERS_SOURCE, "vert", null, true); ShaderCode fragShader = ShaderCode.create(gl3, GL_FRAGMENT_SHADER, this.getClass(), SHADERS_ROOT, null, SHADERS_SOURCE, "frag", null, true); ShaderProgram program = new ShaderProgram(); program.add(vertShader); program.add(fragShader); program.init(gl3); programName = program.program(); gl3.glBindAttribLocation(programName, Semantic.Attr.POSITION, "position"); gl3.glBindFragDataLocation(programName, Semantic.Frag.COLOR, "color"); program.link(gl3, System.out); } // Get variables locations if (validated) { uniformTransform = gl3.glGetUniformBlockIndex(programName, "Transform"); gl3.glUniformBlockBinding(programName, uniformTransform, Semantic.Uniform.TRANSFORM0); } return validated & checkError(gl3, "initProgram"); } private boolean initBuffer(GL3 gl3) { ShortBuffer elementBuffer = GLBuffers.newDirectShortBuffer(elementData); FloatBuffer vertexBuffer = GLBuffers.newDirectFloatBuffer(vertexData); IntBuffer uniformBufferOffset = GLBuffers.newDirectIntBuffer(1); gl3.glGenBuffers(Buffer.MAX, bufferName); gl3.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferName.get(Buffer.ELEMENT)); gl3.glBufferData(GL_ELEMENT_ARRAY_BUFFER, elementSize, elementBuffer, GL_STATIC_DRAW); gl3.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); gl3.glBindBuffer(GL_ARRAY_BUFFER, bufferName.get(Buffer.VERTEX)); gl3.glBufferData(GL_ARRAY_BUFFER, vertexSize, vertexBuffer, GL_STATIC_DRAW); gl3.glBindBuffer(GL_ARRAY_BUFFER, 0); gl3.glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, uniformBufferOffset); int uniformBlockSize = Math.max(Mat4.SIZE, uniformBufferOffset.get(0)); gl3.glBindBuffer(GL_UNIFORM_BUFFER, bufferName.get(Buffer.TRANSFORM)); gl3.glBufferData(GL_UNIFORM_BUFFER, uniformBlockSize, null, GL_DYNAMIC_DRAW); gl3.glBindBuffer(GL_UNIFORM_BUFFER, 0); BufferUtils.destroyDirectBuffer(elementBuffer); BufferUtils.destroyDirectBuffer(vertexBuffer); BufferUtils.destroyDirectBuffer(uniformBufferOffset); return checkError(gl3, "initBuffer"); } private boolean initVertexArray(GL3 gl3) { gl3.glGenVertexArrays(1, vertexArrayName); gl3.glBindVertexArray(vertexArrayName.get(0)); { gl3.glBindBuffer(GL_ARRAY_BUFFER, bufferName.get(Buffer.VERTEX)); gl3.glVertexAttribPointer(Semantic.Attr.POSITION, 2, GL_FLOAT, false, 0, 0); gl3.glEnableVertexAttribArray(Semantic.Attr.POSITION); gl3.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferName.get(Buffer.ELEMENT)); } gl3.glBindVertexArray(0); return checkError(gl3, "initVertexArray"); } @Override protected boolean render(GL gl) { GL3 gl3 = (GL3) gl; { gl3.glBindBuffer(GL_UNIFORM_BUFFER, bufferName.get(Buffer.TRANSFORM)); ByteBuffer pointer = gl3.glMapBufferRange(GL_UNIFORM_BUFFER, 0, Mat4.SIZE, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); Mat4 projection = glm.perspective_((float) Math.PI * 0.25f, windowSize.x / 3.0f / windowSize.y, 0.1f, 100.0f); Mat4 model = new Mat4(1.0f); pointer.asFloatBuffer().put(projection.mul(viewMat4()).mul(model).toFa_()); gl3.glUnmapBuffer(GL_UNIFORM_BUFFER); } gl3.glViewport(0, 0, windowSize.x, windowSize.y); float[] depth = {1.0f}; gl3.glClearBufferfv(GL_DEPTH, 0, depth, 0); gl3.glClearBufferfv(GL_COLOR, 0, new float[]{1.0f, 1.0f, 1.0f, 1.0f}, 0); gl3.glUseProgram(programName); gl3.glBindBufferBase(GL_UNIFORM_BUFFER, Semantic.Uniform.TRANSFORM0, bufferName.get(Buffer.TRANSFORM)); gl3.glBindVertexArray(vertexArrayName.get(0)); gl3.glViewport(windowSize.x * 0 / 3, 0, windowSize.x / 3, windowSize.y); gl3.glDrawElements(GL_TRIANGLES, elementCount / 2, GL_UNSIGNED_SHORT, 0); gl3.glViewport(windowSize.x * 1 / 3, 0, windowSize.x / 3, windowSize.y); gl3.glDrawElementsInstancedBaseVertex(GL_TRIANGLES, elementCount / 2, GL_UNSIGNED_SHORT, Short.BYTES * elementCount / 2, 1, 0); gl3.glViewport(windowSize.x * 2 / 3, 0, windowSize.x / 3, windowSize.y); gl3.glDrawElementsInstancedBaseVertex(GL_TRIANGLES, elementCount / 2, GL_UNSIGNED_SHORT, 0, 1, vertexCount / 2); return true; } @Override protected boolean end(GL gl) { GL3 gl3 = (GL3) gl; gl3.glDeleteBuffers(Buffer.MAX, bufferName); gl3.glDeleteProgram(programName); gl3.glDeleteVertexArrays(1, vertexArrayName); BufferUtils.destroyDirectBuffer(bufferName); BufferUtils.destroyDirectBuffer(vertexArrayName); return true; } }