package chess.view.DDDrender; import static org.lwjgl.opengl.GL11.GL_DEPTH_COMPONENT; import static org.lwjgl.opengl.GL11.GL_RGB; import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D; import static org.lwjgl.opengl.GL11.GL_UNSIGNED_BYTE; import static org.lwjgl.opengl.GL11.GL_UNSIGNED_INT; import static org.lwjgl.opengl.GL11.glBindTexture; import static org.lwjgl.opengl.GL11.glTexImage2D; import java.io.Closeable; import java.io.IOException; import java.nio.IntBuffer; import org.joml.Matrix4f; import org.joml.Vector3f; import org.lwjgl.opengl.GL30; import chess.view.DDDrender.opengl.VertexArray; import chess.view.DDDrender.shader.BoardShader; import chess.view.DDDrender.shader.PieceShader; import chess.view.DDDrender.shader.ShaderProgram; public class Renderer implements Closeable { private BoardShader boardShader; private PieceShader pieceShader; public Renderer() { this.boardShader = new BoardShader(); this.pieceShader = new PieceShader(); } public void Init() { boardShader.LoadShader(); pieceShader.LoadShader(); // The frame buffer int fbo = GL30.glGenFramebuffers(); GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); // The texture int renderTexture = GL30.glGenTextures(); glBindTexture(GL_TEXTURE_2D, renderTexture); System.out.println(renderTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 800, 800, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); GL30.glTexParameteri(GL_TEXTURE_2D, GL30.GL_TEXTURE_MAG_FILTER, GL30.GL_NEAREST); GL30.glTexParameteri(GL_TEXTURE_2D, GL30.GL_TEXTURE_MIN_FILTER, GL30.GL_NEAREST); // The depth buffer int depthBuffer = GL30.glGenRenderbuffers(); GL30.glBindRenderbuffer(GL30.GL_RENDERBUFFER, depthBuffer); GL30.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL_DEPTH_COMPONENT, 800, 800); GL30.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL30.GL_RENDERBUFFER, depthBuffer); // Set "renderedTexture" as our colour attachement #0 GL30.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderTexture, 0); // Set the list of draw buffers. int[] drawBuffers = { GL30.GL_COLOR_ATTACHMENT0 }; GL30.glDrawBuffers(drawBuffers); } public void Update(Camera cam) { this.boardShader.Start(); this.boardShader.SetCamMatrix(cam); this.pieceShader.Start(); this.pieceShader.SetCamMatrix(cam); } public void Render(DDDModel model, Vector3f color, Vector3f position, float rotation) { this.pieceShader.Start(); this.pieceShader.setModelColor(color); this.pieceShader.setModelTransform(new Matrix4f().translate(position).rotate(rotation, new Vector3f(0, 1, 0))); Render(model); } public void Render(DDDModel model) { for (int i = 0; i < model.getVaos().size(); i++) { VertexArray vao = model.getVaos().get(i); RenderVao(this.pieceShader, vao); } } public void RenderVao(ShaderProgram shader, VertexArray vertexArray) { shader.Start(); vertexArray.Bind(); GL30.glDrawElements(GL30.GL_TRIANGLES, vertexArray.GetVertexCount(), GL_UNSIGNED_INT, 0); vertexArray.Unbind(); } public BoardShader getBoardShader() { return boardShader; } @Override public void close() throws IOException { this.boardShader.close(); this.pieceShader.close(); } }