Resize frame buffer method added

This commit is contained in:
IlyaShurupov 2024-06-18 14:48:26 +03:00 committed by Ilya Shurupov
parent bc29860385
commit 8bfe44b3cd
6 changed files with 66 additions and 13 deletions

View file

@ -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; }

View file

@ -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);

View file

@ -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:

View file

@ -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
} }

View file

@ -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));
}

View file

@ -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;
}; };
}; };