104 lines
3.2 KiB
Java
104 lines
3.2 KiB
Java
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();
|
|
}
|
|
}
|