Resize frame buffer method added
This commit is contained in:
parent
787681d320
commit
bafe6a7f43
6 changed files with 66 additions and 13 deletions
|
|
@ -65,7 +65,7 @@ Render::Render(Vec2F renderResolution) :
|
||||||
|
|
||||||
Render::~Render() {}
|
Render::~Render() {}
|
||||||
|
|
||||||
uint4 Render::getRenderBuffer() { return mRenderBuffer.texId(); }
|
uint4 Render::getRenderBufferID() { return mRenderBuffer.texId(); }
|
||||||
|
|
||||||
Vec2F Render::getBufferSize() { return mRenderBuffer.getSize(); }
|
Vec2F Render::getBufferSize() { return mRenderBuffer.getSize(); }
|
||||||
|
|
||||||
|
|
@ -77,7 +77,7 @@ void Render::render(const Scene& geometry, Vec2F size) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mRenderBuffer.mClearCol = { 0.0f, 0.0f, 0.0f, 0.f };
|
mRenderBuffer.mClearCol = { 0.0f, 0.0f, 0.0f, 1.f };
|
||||||
|
|
||||||
mRenderBuffer.beginDraw();
|
mRenderBuffer.beginDraw();
|
||||||
mRenderBuffer.clear();
|
mRenderBuffer.clear();
|
||||||
|
|
@ -108,3 +108,5 @@ void Render::render(const Scene& geometry, Vec2F size) {
|
||||||
|
|
||||||
mRenderBuffer.endDraw();
|
mRenderBuffer.endDraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RenderBuffer* Render::getRenderBuffer() { return &mRenderBuffer; }
|
||||||
|
|
|
||||||
|
|
@ -9,14 +9,18 @@ namespace tp {
|
||||||
explicit ViewportWidget(Canvas* canvas, Scene* geometry, Vec2F renderResolution) :
|
explicit ViewportWidget(Canvas* canvas, Scene* geometry, Vec2F renderResolution) :
|
||||||
mRender(renderResolution) {
|
mRender(renderResolution) {
|
||||||
|
|
||||||
mImage = canvas->createImageFromTextId(mRender.getRenderBuffer(), mRender.getBufferSize());
|
mImage = canvas->createImageFromTextId(mRender.getRenderBufferID(), { 0, 0 });
|
||||||
mGeometry = geometry;
|
mGeometry = geometry;
|
||||||
mCanvas = canvas;
|
mCanvas = canvas;
|
||||||
}
|
}
|
||||||
|
|
||||||
~ViewportWidget() { mCanvas->deleteImageHandle(mImage); }
|
~ViewportWidget() { mCanvas->deleteImageHandle(mImage); }
|
||||||
|
|
||||||
void eventProcess(const Events& events) override { mGeometry->mCamera.rotate(0.01f, 0.0); }
|
void eventProcess(const Events& events) override {
|
||||||
|
mRender.getRenderBuffer()->resize(this->mArea.size);
|
||||||
|
mGeometry->mCamera.rotate(0.01f, 0.0);
|
||||||
|
mGeometry->mCamera.setRatio(this->mArea.w / this->mArea.z);
|
||||||
|
}
|
||||||
|
|
||||||
void eventDraw(Canvas& canvas) override {
|
void eventDraw(Canvas& canvas) override {
|
||||||
mRender.render(*mGeometry, this->mArea.size);
|
mRender.render(*mGeometry, this->mArea.size);
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,8 @@ namespace tp {
|
||||||
~Render();
|
~Render();
|
||||||
|
|
||||||
void render(const Scene& geometry, Vec2F size);
|
void render(const Scene& geometry, Vec2F size);
|
||||||
uint4 getRenderBuffer();
|
uint4 getRenderBufferID();
|
||||||
|
RenderBuffer* getRenderBuffer();
|
||||||
Vec2F getBufferSize();
|
Vec2F getBufferSize();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
||||||
|
|
@ -125,6 +125,7 @@ void Canvas::drawImage(const RectF& rec, ImageHandle* image, halnf angle, halnf
|
||||||
#ifdef ENV_OS_ANDROID
|
#ifdef ENV_OS_ANDROID
|
||||||
return { (ualni) nvglCreateImageFromHandleGLES3(mContext->vg, id, size.x, size.y, 0) };
|
return { (ualni) nvglCreateImageFromHandleGLES3(mContext->vg, id, size.x, size.y, 0) };
|
||||||
#else
|
#else
|
||||||
|
//return { (ualni) nvglCreateImageFromHandleGL3(mContext->vg, id, size.x, size.y, 0) };
|
||||||
return { (ualni) nvglCreateImageFromHandleGL3(mContext->vg, id, size.x, size.y, 0) };
|
return { (ualni) nvglCreateImageFromHandleGL3(mContext->vg, id, size.x, size.y, 0) };
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,10 @@
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
void glerr(GLenum type) { printf("GL ERROR\n"); }
|
void glerr(GLenum type) {
|
||||||
|
printf("GL ERROR - %i\n", type);
|
||||||
|
}
|
||||||
|
|
||||||
#define AssertGL(x) \
|
#define AssertGL(x) \
|
||||||
{ \
|
{ \
|
||||||
x; \
|
x; \
|
||||||
|
|
@ -15,7 +18,8 @@ void glerr(GLenum type) { printf("GL ERROR\n"); }
|
||||||
using namespace tp;
|
using namespace tp;
|
||||||
|
|
||||||
RenderBuffer::RenderBuffer(const Vec2F& size) :
|
RenderBuffer::RenderBuffer(const Vec2F& size) :
|
||||||
mSize(size) {
|
mSize(size), mSamples(0)
|
||||||
|
{
|
||||||
|
|
||||||
mDrawBuffers[0] = { GL_COLOR_ATTACHMENT0 };
|
mDrawBuffers[0] = { GL_COLOR_ATTACHMENT0 };
|
||||||
|
|
||||||
|
|
@ -47,7 +51,8 @@ RenderBuffer::RenderBuffer(const Vec2F& size) :
|
||||||
}
|
}
|
||||||
|
|
||||||
RenderBuffer::RenderBuffer(const Vec2F& size, tp::uint1 samples) :
|
RenderBuffer::RenderBuffer(const Vec2F& size, tp::uint1 samples) :
|
||||||
mSize(size) {
|
mSize(size), mSamples(samples)
|
||||||
|
{
|
||||||
|
|
||||||
mDrawBuffers[0] = { GL_COLOR_ATTACHMENT0 };
|
mDrawBuffers[0] = { GL_COLOR_ATTACHMENT0 };
|
||||||
|
|
||||||
|
|
@ -115,3 +120,40 @@ RenderBuffer::~RenderBuffer() {
|
||||||
uint4 RenderBuffer::texId() const { return mTextureId; }
|
uint4 RenderBuffer::texId() const { return mTextureId; }
|
||||||
|
|
||||||
const Vec2F& RenderBuffer::getSize() const { return mSize; }
|
const Vec2F& RenderBuffer::getSize() const { return mSize; }
|
||||||
|
|
||||||
|
void RenderBuffer::resize(const Vec2F& size) {
|
||||||
|
if (size == mSize) return;
|
||||||
|
|
||||||
|
// Update size
|
||||||
|
mSize = size;
|
||||||
|
|
||||||
|
// Bind framebuffer
|
||||||
|
AssertGL(glBindFramebuffer(GL_FRAMEBUFFER, mFrameBufferID));
|
||||||
|
|
||||||
|
// Resize color texture
|
||||||
|
if (mSamples) {
|
||||||
|
AssertGL(glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, mTextureId));
|
||||||
|
AssertGL(glTexImage2DMultisample(
|
||||||
|
GL_TEXTURE_2D_MULTISAMPLE, mSamples, GL_RGBA, (GLsizei)size.x, (GLsizei)size.y, GL_TRUE
|
||||||
|
));
|
||||||
|
AssertGL(glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0));
|
||||||
|
} else {
|
||||||
|
AssertGL(glBindTexture(GL_TEXTURE_2D, mTextureId));
|
||||||
|
AssertGL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)size.x, (GLsizei)size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0));
|
||||||
|
AssertGL(glBindTexture(GL_TEXTURE_2D, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Resize depth renderbuffer
|
||||||
|
if (mSamples) {
|
||||||
|
AssertGL(glBindRenderbuffer(GL_RENDERBUFFER, mDepthBufferID));
|
||||||
|
AssertGL(glRenderbufferStorageMultisample(
|
||||||
|
GL_RENDERBUFFER, mSamples, GLW_CONTEXT_DEPTH_COMPONENT, (GLsizei)size.x, (GLsizei)size.y
|
||||||
|
));
|
||||||
|
} else {
|
||||||
|
AssertGL(glBindRenderbuffer(GL_RENDERBUFFER, mDepthBufferID));
|
||||||
|
AssertGL(glRenderbufferStorage(GL_RENDERBUFFER, GLW_CONTEXT_DEPTH_COMPONENT, (GLsizei)size.x, (GLsizei)size.y));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unbind framebuffer
|
||||||
|
AssertGL(glBindFramebuffer(GL_FRAMEBUFFER, 0));
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
namespace tp {
|
namespace tp {
|
||||||
class RenderBuffer {
|
class RenderBuffer {
|
||||||
public:
|
public:
|
||||||
RenderBuffer(const Vec2F& size);
|
explicit RenderBuffer(const Vec2F& size);
|
||||||
RenderBuffer(const Vec2F& size, tp::uint1 samples);
|
RenderBuffer(const Vec2F& size, tp::uint1 samples);
|
||||||
~RenderBuffer();
|
~RenderBuffer();
|
||||||
|
|
||||||
|
|
@ -16,10 +16,12 @@ namespace tp {
|
||||||
void clear();
|
void clear();
|
||||||
void endDraw();
|
void endDraw();
|
||||||
|
|
||||||
uint4 texId() const;
|
[[nodiscard]] uint4 texId() const;
|
||||||
uint4 buffId() const;
|
[[nodiscard]] uint4 buffId() const;
|
||||||
|
|
||||||
const Vec2F& getSize() const;
|
void resize(const Vec2F& size);
|
||||||
|
|
||||||
|
[[nodiscard]] const Vec2F& getSize() const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
RGBA mClearCol = 0.f;
|
RGBA mClearCol = 0.f;
|
||||||
|
|
@ -28,7 +30,8 @@ namespace tp {
|
||||||
uint4 mFrameBufferID = 0; // regroups 0, 1, or more textures, and 0 or 1 depth buffer.
|
uint4 mFrameBufferID = 0; // regroups 0, 1, or more textures, and 0 or 1 depth buffer.
|
||||||
uint4 mTextureId = 0; // texture we're going to render to ( colour attachement #0 )
|
uint4 mTextureId = 0; // texture we're going to render to ( colour attachement #0 )
|
||||||
uint4 mDepthBufferID = 0;
|
uint4 mDepthBufferID = 0;
|
||||||
uint4 mDrawBuffers[1];
|
uint4 mDrawBuffers[1] = { 0 };
|
||||||
Vec2F mSize;
|
Vec2F mSize;
|
||||||
|
ualni mSamples = 0;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
Loading…
Add table
Add a link
Reference in a new issue