framebuffer stores size, and can be resized
This commit is contained in:
parent
2521a52ba6
commit
3102e1c909
|
@ -9,11 +9,40 @@ import static org.lwjgl.opengl.GL32.glFramebufferTexture;
|
||||||
public class Framebuffer {
|
public class Framebuffer {
|
||||||
private final int framebuffer;
|
private final int framebuffer;
|
||||||
private final int framebufferTex;
|
private final int framebufferTex;
|
||||||
|
private Vec2i size;
|
||||||
|
|
||||||
public Framebuffer(Vec2i size) {
|
public Framebuffer(Vec2i size) {
|
||||||
framebuffer = glGenFramebuffers();
|
framebuffer = glGenFramebuffers();
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
|
|
||||||
framebufferTex = glGenTextures();
|
framebufferTex = glGenTextures();
|
||||||
|
setSize(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void bind() {
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void bindTexture() {
|
||||||
|
glBindTexture(GL_TEXTURE_2D, framebufferTex);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void unbind() {
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vec2i getSize() {
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSize(Vec2i size) {
|
||||||
|
this.size = size;
|
||||||
|
if(framebuffer != 0) {
|
||||||
|
glDeleteFramebuffers(framebuffer);
|
||||||
|
}
|
||||||
|
if(framebufferTex != 0) {
|
||||||
|
glDeleteTextures(framebufferTex);
|
||||||
|
}
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
|
||||||
glBindTexture(GL_TEXTURE_2D, framebufferTex);
|
glBindTexture(GL_TEXTURE_2D, framebufferTex);
|
||||||
glTexImage2D(GL_TEXTURE_2D,
|
glTexImage2D(GL_TEXTURE_2D,
|
||||||
0,
|
0,
|
||||||
|
@ -53,17 +82,4 @@ public class Framebuffer {
|
||||||
0
|
0
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void bind() {
|
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void bindTexture() {
|
|
||||||
glBindTexture(GL_TEXTURE_2D, framebufferTex);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void unbind() {
|
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,13 +39,11 @@ public class Pipeline2D extends BasePipeline<RenderContext, IRenderContext> impl
|
||||||
""";
|
""";
|
||||||
private final TextureAtlas atlas;
|
private final TextureAtlas atlas;
|
||||||
private boolean debug;
|
private boolean debug;
|
||||||
private Vec2i size;
|
|
||||||
private final Framebuffer framebuffer;
|
private final Framebuffer framebuffer;
|
||||||
|
|
||||||
public Pipeline2D(Vec2i size, Framebuffer framebuffer, TextureAtlas atlas) {
|
public Pipeline2D(Framebuffer framebuffer, TextureAtlas atlas) {
|
||||||
super(new Program(vertexSource, fragmentSource));
|
super(new Program(vertexSource, fragmentSource));
|
||||||
this.size = size;
|
renderContext = new RenderContext(program, framebuffer.getSize());
|
||||||
renderContext = new RenderContext(program, size);
|
|
||||||
this.atlas = atlas;
|
this.atlas = atlas;
|
||||||
this.framebuffer = framebuffer;
|
this.framebuffer = framebuffer;
|
||||||
debug = false;
|
debug = false;
|
||||||
|
@ -54,7 +52,7 @@ public class Pipeline2D extends BasePipeline<RenderContext, IRenderContext> impl
|
||||||
@Override
|
@Override
|
||||||
public void finishFrame() {
|
public void finishFrame() {
|
||||||
if(debug) {
|
if(debug) {
|
||||||
renderContext.drawTextureRectangle(new Recti(Vec2i.ZERO, size),
|
renderContext.drawTextureRectangle(new Recti(Vec2i.ZERO, framebuffer.getSize()),
|
||||||
atlas.getAtlasTexture(),
|
atlas.getAtlasTexture(),
|
||||||
false
|
false
|
||||||
);
|
);
|
||||||
|
@ -71,6 +69,7 @@ public class Pipeline2D extends BasePipeline<RenderContext, IRenderContext> impl
|
||||||
use();
|
use();
|
||||||
atlas.bind();
|
atlas.bind();
|
||||||
framebuffer.bind();
|
framebuffer.bind();
|
||||||
|
var size = framebuffer.getSize();
|
||||||
glViewport(0, 0, size.getX(), size.getY());
|
glViewport(0, 0, size.getX(), size.getY());
|
||||||
atlas.update();
|
atlas.update();
|
||||||
glClear(GL_DEPTH_BUFFER_BIT);
|
glClear(GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
|
@ -34,15 +34,13 @@ public class Pipeline3D extends BasePipeline<RenderContext3D, IRenderContext3D>
|
||||||
}
|
}
|
||||||
""";
|
""";
|
||||||
|
|
||||||
private Vec2i size;
|
|
||||||
private final Framebuffer framebuffer;
|
private final Framebuffer framebuffer;
|
||||||
private final TextureAtlas atlas;
|
private final TextureAtlas atlas;
|
||||||
|
|
||||||
public Pipeline3D(Vec2i size, Framebuffer framebuffer, TextureAtlas atlas) {
|
public Pipeline3D(Framebuffer framebuffer, TextureAtlas atlas) {
|
||||||
super(new Program(vertexSource, fragmentSource));
|
super(new Program(vertexSource, fragmentSource));
|
||||||
renderContext = new RenderContext3D(program);
|
renderContext = new RenderContext3D(program);
|
||||||
renderContext.setTextureAtlas(atlas);
|
renderContext.setTextureAtlas(atlas);
|
||||||
this.size = size;
|
|
||||||
this.framebuffer = framebuffer;
|
this.framebuffer = framebuffer;
|
||||||
this.atlas = atlas;
|
this.atlas = atlas;
|
||||||
}
|
}
|
||||||
|
@ -57,6 +55,7 @@ public class Pipeline3D extends BasePipeline<RenderContext3D, IRenderContext3D>
|
||||||
use();
|
use();
|
||||||
atlas.bind();
|
atlas.bind();
|
||||||
framebuffer.bind();
|
framebuffer.bind();
|
||||||
|
var size = framebuffer.getSize();
|
||||||
glViewport(0, 0, size.getX(), size.getY());
|
glViewport(0, 0, size.getX(), size.getY());
|
||||||
atlas.update();
|
atlas.update();
|
||||||
glClear(GL_DEPTH_BUFFER_BIT);
|
glClear(GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
|
@ -47,13 +47,13 @@ public class Window extends BaseWindow {
|
||||||
}
|
}
|
||||||
""";
|
""";
|
||||||
private final Framebuffer framebuffer;
|
private final Framebuffer framebuffer;
|
||||||
|
private final Framebuffer framebuffer2;
|
||||||
private final Program programScaler;
|
private final Program programScaler;
|
||||||
private final Vec2i size;
|
private final Vec2i size;
|
||||||
private final boolean[] stateMouseClicked;
|
private final boolean[] stateMouseClicked;
|
||||||
private final boolean[] stateMouseDown;
|
private final boolean[] stateMouseDown;
|
||||||
private final TextureAtlas textureAtlas;
|
private final TextureAtlas textureAtlas;
|
||||||
private final long window;
|
private final long window;
|
||||||
private boolean debug;
|
|
||||||
private boolean shouldClose;
|
private boolean shouldClose;
|
||||||
private Vec2i windowSize;
|
private Vec2i windowSize;
|
||||||
private final Pipeline2D pipeline2D;
|
private final Pipeline2D pipeline2D;
|
||||||
|
@ -66,7 +66,6 @@ public class Window extends BaseWindow {
|
||||||
"Unable to initialize GLFW");
|
"Unable to initialize GLFW");
|
||||||
|
|
||||||
glfwDefaultWindowHints();
|
glfwDefaultWindowHints();
|
||||||
debug = false;
|
|
||||||
this.size = size;
|
this.size = size;
|
||||||
windowSize = size;
|
windowSize = size;
|
||||||
|
|
||||||
|
@ -94,11 +93,12 @@ public class Window extends BaseWindow {
|
||||||
glfwSetMouseButtonCallback(window, this::mouseButtonCallback);
|
glfwSetMouseButtonCallback(window, this::mouseButtonCallback);
|
||||||
|
|
||||||
framebuffer = new Framebuffer(size);
|
framebuffer = new Framebuffer(size);
|
||||||
|
framebuffer2 = new Framebuffer(size);
|
||||||
textureAtlas = new TextureAtlas();
|
textureAtlas = new TextureAtlas();
|
||||||
programScaler = new Program(vertexSourceScaler, fragmentSourceScaler);
|
programScaler = new Program(vertexSourceScaler, fragmentSourceScaler);
|
||||||
|
|
||||||
pipeline2D = new Pipeline2D(size, framebuffer, textureAtlas);
|
pipeline2D = new Pipeline2D(framebuffer, textureAtlas);
|
||||||
pipeline3D = new Pipeline3D(size, framebuffer, textureAtlas);
|
pipeline3D = new Pipeline3D(framebuffer, textureAtlas);
|
||||||
|
|
||||||
|
|
||||||
glProgramUniform2f(programScaler.getProgram(),
|
glProgramUniform2f(programScaler.getProgram(),
|
||||||
|
@ -238,7 +238,8 @@ public class Window extends BaseWindow {
|
||||||
//glEnd();
|
//glEnd();
|
||||||
|
|
||||||
|
|
||||||
Framebuffer.unbind();
|
//Framebuffer.unbind();
|
||||||
|
framebuffer2.bind();
|
||||||
glViewport(0, 0, windowSize.getX(), windowSize.getY());
|
glViewport(0, 0, windowSize.getX(), windowSize.getY());
|
||||||
|
|
||||||
programScaler.use();
|
programScaler.use();
|
||||||
|
@ -313,11 +314,39 @@ public class Window extends BaseWindow {
|
||||||
glVertex2i(tlx2, tly2);
|
glVertex2i(tlx2, tly2);
|
||||||
|
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
|
Framebuffer.unbind();
|
||||||
|
framebuffer2.bindTexture();
|
||||||
|
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
|
tlx1 = 0;
|
||||||
|
tly1 = 0;
|
||||||
|
tlx2 = windowSize.getX();
|
||||||
|
tly2 = windowSize.getY();
|
||||||
|
glBegin(GL_TRIANGLES);
|
||||||
|
//counterclockwise triangles
|
||||||
|
glVertexAttrib2f(texCoordIndex, 0, 1);
|
||||||
|
glVertex2i(tlx1, tly2);
|
||||||
|
glVertexAttrib2f(texCoordIndex, 1, 0);
|
||||||
|
glVertex2i(tlx2, tly1);
|
||||||
|
glVertexAttrib2f(texCoordIndex, 0, 0);
|
||||||
|
glVertex2i(tlx1, tly1);
|
||||||
|
|
||||||
|
glVertexAttrib2f(texCoordIndex, 1, 0);
|
||||||
|
glVertex2i(tlx2, tly1);
|
||||||
|
glVertexAttrib2f(texCoordIndex, 0, 1);
|
||||||
|
glVertex2i(tlx1, tly2);
|
||||||
|
glVertexAttrib2f(texCoordIndex, 1, 1);
|
||||||
|
glVertex2i(tlx2, tly2);
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setDebug(boolean on) {
|
public void setDebug(boolean on) {
|
||||||
debug = on;
|
pipeline2D.setDebug(on);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Reference in New Issue