From 8bfe44b3cdb495163dd2abae541e7aac53493f38 Mon Sep 17 00:00:00 2001 From: IlyaShurupov Date: Tue, 18 Jun 2024 14:48:26 +0300 Subject: [PATCH] Resize frame buffer method added --- 3DEditor/private/Render.cpp | 6 ++-- 3DEditor/public/EditorWidget.hpp | 8 +++-- 3DEditor/public/Render.hpp | 3 +- Graphics/private/Canvas.cpp | 1 + RasterRender/private/FrameBuffer.cpp | 48 ++++++++++++++++++++++++++-- RasterRender/public/FrameBuffer.hpp | 13 +++++--- 6 files changed, 66 insertions(+), 13 deletions(-) diff --git a/3DEditor/private/Render.cpp b/3DEditor/private/Render.cpp index ec98be5..d0e9537 100644 --- a/3DEditor/private/Render.cpp +++ b/3DEditor/private/Render.cpp @@ -65,7 +65,7 @@ Render::Render(Vec2F renderResolution) : Render::~Render() {} -uint4 Render::getRenderBuffer() { return mRenderBuffer.texId(); } +uint4 Render::getRenderBufferID() { return mRenderBuffer.texId(); } 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.clear(); @@ -108,3 +108,5 @@ void Render::render(const Scene& geometry, Vec2F size) { mRenderBuffer.endDraw(); } + +RenderBuffer* Render::getRenderBuffer() { return &mRenderBuffer; } diff --git a/3DEditor/public/EditorWidget.hpp b/3DEditor/public/EditorWidget.hpp index 8e42738..78c9872 100644 --- a/3DEditor/public/EditorWidget.hpp +++ b/3DEditor/public/EditorWidget.hpp @@ -9,14 +9,18 @@ namespace tp { explicit ViewportWidget(Canvas* canvas, Scene* geometry, Vec2F renderResolution) : mRender(renderResolution) { - mImage = canvas->createImageFromTextId(mRender.getRenderBuffer(), mRender.getBufferSize()); + mImage = canvas->createImageFromTextId(mRender.getRenderBufferID(), { 0, 0 }); mGeometry = geometry; mCanvas = canvas; } ~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 { mRender.render(*mGeometry, this->mArea.size); diff --git a/3DEditor/public/Render.hpp b/3DEditor/public/Render.hpp index 818ffe8..8d49533 100644 --- a/3DEditor/public/Render.hpp +++ b/3DEditor/public/Render.hpp @@ -13,7 +13,8 @@ namespace tp { ~Render(); void render(const Scene& geometry, Vec2F size); - uint4 getRenderBuffer(); + uint4 getRenderBufferID(); + RenderBuffer* getRenderBuffer(); Vec2F getBufferSize(); private: diff --git a/Graphics/private/Canvas.cpp b/Graphics/private/Canvas.cpp index bd74576..42926d4 100644 --- a/Graphics/private/Canvas.cpp +++ b/Graphics/private/Canvas.cpp @@ -125,6 +125,7 @@ void Canvas::drawImage(const RectF& rec, ImageHandle* image, halnf angle, halnf #ifdef ENV_OS_ANDROID return { (ualni) nvglCreateImageFromHandleGLES3(mContext->vg, id, size.x, size.y, 0) }; #else + //return { (ualni) nvglCreateImageFromHandleGL3(mContext->vg, id, size.x, size.y, 0) }; return { (ualni) nvglCreateImageFromHandleGL3(mContext->vg, id, size.x, size.y, 0) }; #endif } diff --git a/RasterRender/private/FrameBuffer.cpp b/RasterRender/private/FrameBuffer.cpp index a500e5e..fd61110 100644 --- a/RasterRender/private/FrameBuffer.cpp +++ b/RasterRender/private/FrameBuffer.cpp @@ -4,7 +4,10 @@ #include -void glerr(GLenum type) { printf("GL ERROR\n"); } +void glerr(GLenum type) { + printf("GL ERROR - %i\n", type); +} + #define AssertGL(x) \ { \ x; \ @@ -15,7 +18,8 @@ void glerr(GLenum type) { printf("GL ERROR\n"); } using namespace tp; RenderBuffer::RenderBuffer(const Vec2F& size) : - mSize(size) { + mSize(size), mSamples(0) +{ mDrawBuffers[0] = { GL_COLOR_ATTACHMENT0 }; @@ -47,7 +51,8 @@ RenderBuffer::RenderBuffer(const Vec2F& size) : } RenderBuffer::RenderBuffer(const Vec2F& size, tp::uint1 samples) : - mSize(size) { + mSize(size), mSamples(samples) +{ mDrawBuffers[0] = { GL_COLOR_ATTACHMENT0 }; @@ -115,3 +120,40 @@ RenderBuffer::~RenderBuffer() { uint4 RenderBuffer::texId() const { return mTextureId; } 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)); +} diff --git a/RasterRender/public/FrameBuffer.hpp b/RasterRender/public/FrameBuffer.hpp index db8d130..09dc82a 100644 --- a/RasterRender/public/FrameBuffer.hpp +++ b/RasterRender/public/FrameBuffer.hpp @@ -7,7 +7,7 @@ namespace tp { class RenderBuffer { public: - RenderBuffer(const Vec2F& size); + explicit RenderBuffer(const Vec2F& size); RenderBuffer(const Vec2F& size, tp::uint1 samples); ~RenderBuffer(); @@ -16,10 +16,12 @@ namespace tp { void clear(); void endDraw(); - uint4 texId() const; - uint4 buffId() const; + [[nodiscard]] uint4 texId() const; + [[nodiscard]] uint4 buffId() const; - const Vec2F& getSize() const; + void resize(const Vec2F& size); + + [[nodiscard]] const Vec2F& getSize() const; public: 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 mTextureId = 0; // texture we're going to render to ( colour attachement #0 ) uint4 mDepthBufferID = 0; - uint4 mDrawBuffers[1]; + uint4 mDrawBuffers[1] = { 0 }; Vec2F mSize; + ualni mSamples = 0; }; }; \ No newline at end of file