9d2b167f70
Add a RenderTarget resource so the scene can render offscreen instead of straight to the swapchain. The editor uses it to show the scene inside the Viewport panel. - Rename AssetRegistry to ResourceRegistry (AssetTraits -> ResourceTraits, assets() -> resources()) and move the pools from engine/src/assets to engine/src/resources. It now covers non-asset GPU resources as well. - Replace loadMesh() with create<T>(...), and add create<RenderTarget>(), requestResize(), getExtent() and isAlive(). - Add RenderTarget and RenderTargetPool with RenderTargetHandle. Resizes are deferred and applied at the start of the next frame, when the GPU is idle. - Add Application::setSceneTarget(). With no target set, the scene still renders to the swapchain. With a target set, the scene renders offscreen and the swapchain receives only the UI. Frame extent and camera projection follow the target's size. - Add sophia::UI (Application::ui()) with image() and getTextureId() to draw a render target in an ImGui window, sizing the target to the available space. ImGuiRenderer now registers the target textures for this. - ViewportPanel takes the UI and a target, and draws the scene image in place of the flat background fill. - Update the testbed, the boids example, and the glossary for the rename.
36 lines
837 B
C++
36 lines
837 B
C++
#include <imgui.h>
|
|
|
|
#include <sophia/application.hpp>
|
|
#include <sophia/frame_info.hpp>
|
|
#include <sophia/ui/panel.hpp>
|
|
|
|
class Viewport : public sophia::Panel {
|
|
public:
|
|
Viewport(sophia::UI& ui, sophia::RenderTargetHandle target)
|
|
: Panel{{.name = "Viewport"}}, ui{ui}, target{target} {}
|
|
|
|
void onUpdate(const sophia::FrameInfo&) override {
|
|
ImGui::Text("Test ViewPort");
|
|
|
|
ui.image(target);
|
|
}
|
|
|
|
private:
|
|
sophia::UI& ui;
|
|
sophia::RenderTargetHandle target;
|
|
};
|
|
|
|
class Testbed : public sophia::Application {
|
|
public:
|
|
Testbed() : Application{{.width = 750, .height = 1000, .name = "Testbed"}} {}
|
|
|
|
void onCreate() override {
|
|
sophia::RenderTargetHandle target =
|
|
resources().create<sophia::RenderTarget>();
|
|
setSceneTarget(target);
|
|
panels().emplace<Viewport>(ui(), target);
|
|
}
|
|
};
|
|
|
|
SOPHIA_MAIN(Testbed)
|