From e8001cd95bc0bea19947b179fb1e74f7a06723d2 Mon Sep 17 00:00:00 2001 From: IlyaShurupov Date: Tue, 18 Jun 2024 19:36:47 +0300 Subject: [PATCH] 3D editor stable with path tracer --- 3DEditor/private/Editor.cpp | 85 ++++++++++++++++++++++++++-- 3DEditor/public/Editor.hpp | 16 +++++- 3DEditor/public/EditorWidget.hpp | 36 +++++++++++- 3DEditor/rsc/scene/script.lua | 4 +- Containers/public/Buffer2D.hpp | 2 +- Graphics/private/Canvas.cpp | 8 +++ Graphics/public/Graphics.hpp | 2 + Math/public/Color.hpp | 4 +- RasterRender/private/Render.cpp | 2 +- RasterRender/public/RasterRender.hpp | 2 +- Widgets/public/ButtonWidget.hpp | 2 +- 11 files changed, 144 insertions(+), 19 deletions(-) diff --git a/3DEditor/private/Editor.cpp b/3DEditor/private/Editor.cpp index 94e82e9..e2de4e3 100644 --- a/3DEditor/private/Editor.cpp +++ b/3DEditor/private/Editor.cpp @@ -1,24 +1,97 @@ #include "Editor.hpp" +#include "GraphicsApi.hpp" + using namespace tp; -void Editor::loadDefaults() { - mScene.load("rsc/scene/script.lua"); -} +Editor::Editor() { -uint4 Editor::getViewportTexID() { - return mRasterRenderer.getRenderBufferID(); + { // create path tracer gpu texture + glGenTextures(1, &mPathRenderTexture); + glBindTexture(GL_TEXTURE_2D, mPathRenderTexture); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 100, 100, 0, GL_RGBA, GL_FLOAT, nullptr); + glBindTexture(GL_TEXTURE_2D, 0); + } } void Editor::renderViewport() { - mRasterRenderer.render(mScene, mViewportSize); + switch (mRenderType) { + case RenderType::RASTER: + mRasterRenderer.render(mScene, mScene.mRenderSettings.size); + break; + + case RenderType::PATH_TRACER: + { + // TODO : include in render viewport method + // renderPathFrame(); + break; + } + + default: + break; + } +} + +uint4 Editor::getViewportTexID() { + switch (mRenderType) { + case RenderType::PATH_TRACER: + return mPathRenderTexture; + + case RenderType::RASTER: + return mRasterRenderer.getRenderBufferID(); + + default: + return 0; + } +} + +void Editor::loadDefaults() { + mScene.load("rsc/scene/script.lua"); } void Editor::setViewportSize(const Vec2F& size) { // TODO remove mScene.mCamera.rotate(0.01f, 0.0); + mScene.mRenderSettings.size = size; + mRasterRenderer.getRenderBuffer()->resize(size); mScene.mCamera.setRatio(size.y / size.x); } + +Editor::~Editor() { + glDeleteTextures(1, &mPathRenderTexture); +} + +void Editor::renderPathFrame() { + mPathRenderer.render(mScene, mPathTracerBuffers, mScene.mRenderSettings); + + { + glBindTexture(GL_TEXTURE_2D, mPathRenderTexture); + const auto size = mPathTracerBuffers.color.size(); + glTexImage2D( + GL_TEXTURE_2D, + 0, + GL_RGBA32F, + (GLsizei) size.x, + (GLsizei) size.y, + 0, + GL_RGBA, + GL_FLOAT, + mPathTracerBuffers.color.getBuff() + ); + glBindTexture(GL_TEXTURE_2D, 0); + + } +} + +void Editor::setRenderType(Editor::RenderType type) { + mRenderType = type; +} diff --git a/3DEditor/public/Editor.hpp b/3DEditor/public/Editor.hpp index ff0aa8e..f907051 100644 --- a/3DEditor/public/Editor.hpp +++ b/3DEditor/public/Editor.hpp @@ -6,21 +6,31 @@ namespace tp { class Editor { public: - Editor() = default; + enum class RenderType { RASTER, PATH_TRACER }; + + public: + Editor(); + ~Editor(); void loadDefaults(); uint4 getViewportTexID(); + void setViewportSize(const Vec2F& size); void renderViewport(); + void renderPathFrame(); + void setRenderType(RenderType type); + private: Scene mScene; + RenderType mRenderType = RenderType::RASTER; + RasterRender mRasterRenderer; RayTracer mPathRenderer; - // TODO move inside the scene - Vec2F mViewportSize; + RayTracer::OutputBuffers mPathTracerBuffers; + uint4 mPathRenderTexture = 0; }; } \ No newline at end of file diff --git a/3DEditor/public/EditorWidget.hpp b/3DEditor/public/EditorWidget.hpp index 177e5c9..55cd39f 100644 --- a/3DEditor/public/EditorWidget.hpp +++ b/3DEditor/public/EditorWidget.hpp @@ -21,6 +21,8 @@ namespace tp { void eventDraw(Canvas& canvas) override { mEditor->renderViewport(); + + canvas.updateTextureID(mImage, mEditor->getViewportTexID()); canvas.drawImage(this->mArea, &mImage, PI); } @@ -37,16 +39,38 @@ namespace tp { EditorWidget(Canvas* canvas, Editor* editor) : mViewport(canvas, editor) { + mEditor = editor; + this->mChildWidgets.pushBack(&mViewport); this->mChildWidgets.pushBack(&mSplitView); + this->mChildWidgets.pushBack(&mSettingsWidget); + + mRenderPathTracer.mLabel.mLabel = "Render with Path Tracer"; + mRenderRaster.mLabel.mLabel = "Render with Raster"; + + mSettingsWidget.addWidget(&mRenderPathTracer); + mSettingsWidget.addWidget(&mRenderRaster); } void eventProcess(const Events& events) override { mSplitView.setArea(this->mArea); + mViewport.setArea(mSplitView.getFirst()); + mSettingsWidget.setArea(mSplitView.getSecond()); + + if (mRenderPathTracer.isFired()) { + mEditor->renderPathFrame(); + mEditor->setRenderType(Editor::RenderType::PATH_TRACER); + } + + if (mRenderRaster.isFired()) { + mEditor->setRenderType(Editor::RenderType::RASTER); + } } - void eventDraw(Canvas& canvas) override { canvas.rect(this->mArea, mBaseColor); } + void eventDraw(Canvas& canvas) override { + canvas.rect(this->mArea, mBaseColor); + } void eventUpdateConfiguration(WidgetManager& wm) override { wm.setActiveId("3DEditor"); @@ -54,9 +78,17 @@ namespace tp { } public: - ViewportWidget mViewport; + Editor* mEditor = nullptr; + SplitView mSplitView; + ViewportWidget mViewport; + + // Controls + ScrollableWindow mSettingsWidget; + ButtonWidget mRenderPathTracer; + ButtonWidget mRenderRaster; + RGBA mBaseColor; }; } \ No newline at end of file diff --git a/3DEditor/rsc/scene/script.lua b/3DEditor/rsc/scene/script.lua index f0146f9..ef6d484 100644 --- a/3DEditor/rsc/scene/script.lua +++ b/3DEditor/rsc/scene/script.lua @@ -20,6 +20,6 @@ Lights = { RenderSettings = { depth = 1, - spray = 3, - multisampling = 16, + spray = 1, + multisampling = 1, } \ No newline at end of file diff --git a/Containers/public/Buffer2D.hpp b/Containers/public/Buffer2D.hpp index e3d8e23..cff02f1 100644 --- a/Containers/public/Buffer2D.hpp +++ b/Containers/public/Buffer2D.hpp @@ -40,7 +40,7 @@ namespace tp { void allocateBuffer(Index2D size) { deleteBuffer(); mBuff = (tType*) mAlloc.allocate(sizeof(tType) * size.x * size.y); - for (ualni i = 0; i < mSize.x * mSize.y; i++) { + for (ualni i = 0; i < size.x * size.y; i++) { new (mBuff + i) tType(); } } diff --git a/Graphics/private/Canvas.cpp b/Graphics/private/Canvas.cpp index 42926d4..2346b9d 100644 --- a/Graphics/private/Canvas.cpp +++ b/Graphics/private/Canvas.cpp @@ -130,6 +130,14 @@ void Canvas::drawImage(const RectF& rec, ImageHandle* image, halnf angle, halnf #endif } +void Canvas::updateTextureID(ImageHandle handle, ualni id) { + auto nvgl = (GLNVGcontext*) nvgInternalParams(mContext->vg)->userPtr; + auto glhandle = nvglImageHandleGL3(mContext->vg, handle.id); + + auto tex = glnvg__findTexture(nvgl, handle.id); + tex->tex = id; +} + void Canvas::deleteImageHandle(ImageHandle image) { if (image.id) { nvgDeleteImage(mContext->vg, image.id); diff --git a/Graphics/public/Graphics.hpp b/Graphics/public/Graphics.hpp index 4d35595..dfa1650 100644 --- a/Graphics/public/Graphics.hpp +++ b/Graphics/public/Graphics.hpp @@ -61,6 +61,8 @@ namespace tp { void text(const char*, const RectF&, halnf size, Align, halnf padding, const RGBA&); ImageHandle createImageFromTextId(ualni id, Vec2F size); + void updateTextureID(ImageHandle handle, ualni id); + void deleteImageHandle(ImageHandle image); void drawImage(const RectF& rec, ImageHandle* image, halnf angle = 0, halnf alpha = 1.f, halnf rounding = 0.f); diff --git a/Math/public/Color.hpp b/Math/public/Color.hpp index f7d46cc..2c3dce7 100644 --- a/Math/public/Color.hpp +++ b/Math/public/Color.hpp @@ -80,8 +80,6 @@ namespace tp { bool operator==(const RGBA& in) const { return r == in.r && g == in.g && b == in.b && a == in.a; } public: - flt4 a; - union { RGB rgbs; @@ -91,6 +89,8 @@ namespace tp { flt4 b; }; }; + + flt4 a; }; class HSVA { diff --git a/RasterRender/private/Render.cpp b/RasterRender/private/Render.cpp index 46e57a6..4c3429e 100644 --- a/RasterRender/private/Render.cpp +++ b/RasterRender/private/Render.cpp @@ -15,7 +15,7 @@ uint4 RasterRender::getRenderBufferID() { return mRenderBuffer.texId(); } Vec2F RasterRender::getBufferSize() { return mRenderBuffer.getSize(); } -void RasterRender::render(const Scene& geometry, Vec2F size) { +void RasterRender::render(const Scene& geometry, const Vec2& size) { for (auto object : geometry.mObjects) { if (!object->mGUPBuffers) { diff --git a/RasterRender/public/RasterRender.hpp b/RasterRender/public/RasterRender.hpp index 49b2f8f..229029d 100644 --- a/RasterRender/public/RasterRender.hpp +++ b/RasterRender/public/RasterRender.hpp @@ -12,7 +12,7 @@ namespace tp { RasterRender(); ~RasterRender(); - void render(const Scene& geometry, Vec2F size); + void render(const Scene& geometry, const Vec2& size); uint4 getRenderBufferID(); RenderBuffer* getRenderBuffer(); Vec2F getBufferSize(); diff --git a/Widgets/public/ButtonWidget.hpp b/Widgets/public/ButtonWidget.hpp index 5585668..9d64a6d 100644 --- a/Widgets/public/ButtonWidget.hpp +++ b/Widgets/public/ButtonWidget.hpp @@ -8,7 +8,7 @@ namespace tp { class ButtonWidget : public Widget { public: ButtonWidget() { - this->setArea({ 0, 0, 100, 100 }); + this->setArea({ 0, 0, 100, 30 }); this->mChildWidgets.pushBack(&mLabel); }