package Graphics; import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D; import static org.lwjgl.opengl.GL11.GL_TRIANGLES; import static org.lwjgl.opengl.GL11.GL_UNSIGNED_INT; import static org.lwjgl.opengl.GL11.glBindTexture; import static org.lwjgl.opengl.GL11.glDrawElements; import static org.lwjgl.opengl.GL20.GL_FRAGMENT_SHADER; import static org.lwjgl.opengl.GL20.GL_VERTEX_SHADER; import static org.lwjgl.opengl.GL20.glAttachShader; import static org.lwjgl.opengl.GL20.glCreateProgram; import static org.lwjgl.opengl.GL20.glGetAttribLocation; import static org.lwjgl.opengl.GL20.glGetUniformLocation; import static org.lwjgl.opengl.GL20.glLinkProgram; import static org.lwjgl.opengl.GL20.glUniform3f; import static org.lwjgl.opengl.GL20.glUniformMatrix4; import static org.lwjgl.opengl.GL30.glBindFragDataLocation; import static org.lwjgl.opengl.GL30.glBindVertexArray; import org.lwjgl.util.vector.Matrix4f; public class StandardShader extends Shader{ private int vert_id; private int frag_id; private int wvpMatIndex; private int camDirIndex; private Matrix4f viewProjection; protected int position_attr; protected int normal_attr; protected int texCoord_attr; public StandardShader() { active = false; vert_id = loadShader("vertexShader.glslv", GL_VERTEX_SHADER); frag_id = loadShader("fragmentShader.glslf", GL_FRAGMENT_SHADER); shaderProgram = glCreateProgram(); glAttachShader(shaderProgram, vert_id); glAttachShader(shaderProgram, frag_id); glBindFragDataLocation( shaderProgram, 0, "outColor"); glLinkProgram(shaderProgram); wvpMatIndex = glGetUniformLocation(shaderProgram, "wvpMatrix"); camDirIndex = glGetUniformLocation(shaderProgram, "camDir"); position_attr = glGetAttribLocation( shaderProgram, "position"); normal_attr = glGetAttribLocation( shaderProgram, "normal"); texCoord_attr = glGetAttribLocation( shaderProgram, "texCoord"); viewProjection = new Matrix4f(); } private void setTransform(Matrix4f mat) { glUniformMatrix4(wvpMatIndex, true, genFloatBuffer(mat)); } protected void useCam(Camera cam) { //System.out.println("Shader: setting camera"); Matrix4f camProj = new Matrix4f(cam.projection); Matrix4f camView = new Matrix4f(cam.viewMat); Matrix4f camVP = new Matrix4f(); camVP = Matrix4f.mul(camView, camProj, null); this.viewProjection = camVP; glUniform3f(camDirIndex, cam.direction.x, cam.direction.y, cam.direction.z); } protected void draw(DebugGraphicsComponent gc) { if(!active) { System.out.println("Shader has not begun"); return; } //Matrix4f.mul(viewProjection, gc.getModelMat(), transform); bindDraw(gc); for(DebugGraphicsComponent sgc : gc.subComponents) { draw(sgc); } } private void bindDraw(DebugGraphicsComponent gc) { Matrix4f transform = new Matrix4f(); Matrix4f.mul(gc.getModelMat(), viewProjection, transform); setTransform(transform); glBindVertexArray(gc.mesh.vao); glBindTexture(GL_TEXTURE_2D, gc.mesh.texId); glDrawElements(GL_TRIANGLES, gc.mesh.elementCount, GL_UNSIGNED_INT, 0); glBindTexture(GL_TEXTURE_2D, 0); glBindVertexArray(0); } }