SDEngine
Game Engine
Loading...
Searching...
No Matches
View.hpp
Go to the documentation of this file.
1// TODO(docs): Add file-level Doxygen header
2// - @file View.hpp
3// - @brief View class - represents a renderable viewport/window content
4// - Relationship to Layer, LayerList, and VulkanWindow
5// - Aspect ratio and render mode handling
6#pragma once
7
8#include <imgui.h>
9#include <memory>
10#include <string>
11#include <vector>
12#include <vk_mem_alloc.h>
13
15#include "SD/core/LayerList.hpp"
16#include "SD/core/id_types.hpp"
19#include "VLA/Matrix.hpp"
20
21namespace sd {
22
23// TODO(docs): Document ViewError enum
24// - Each error code's meaning
25// - How errors are propagated (std::expected)
31
32// TODO(docs): Document AspectMode enum
33// - Each mode's behavior
34// - When to use which mode
35enum class AspectMode {
36 FIXED_HEIGHT, // -aspect to +aspect
37 FIXED_WIDTH, // -1 to +1
38 BEST_FIT // Auto switch based on aspect
39};
40
41// TODO(docs): Document RenderMode enum
42enum class RenderMode {
43 SHADED,
45};
46
47// TODO(docs): Document View class thoroughly
48// - Purpose: A renderable region with its own layers and Vulkan resources
49// - Ownership model (layers, Vulkan resources)
50// - Integration with ImGui for viewport windows
51// - Aspect ratio management
52// - Render pass and framebuffer management
53// - Example: Creating a custom view with layers
55public:
56 View(const std::string& name, const EngineServices& services) :
57 m_name(name), m_vulkan_ctx(services.vulkan), m_imgui_ctx(services.imgui) {
58 m_camera_view_projection = VLA::Matrix4x4f::Ortho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f);
59 }
60 virtual ~View();
61
62 void on_update(float dt) { m_layers.update(dt); }
63 virtual void on_gui_render();
64
65 virtual void on_event(Event& e) { m_layers.on_event(e); }
66 virtual void on_render(vk::CommandBuffer cmd);
67 virtual void on_fixed_update(double dt) { m_layers.on_fixed_update(dt); }
68
69 // --- Layer management ---
70 template<typename T, typename... Args>
71 requires std::is_base_of_v<Layer, T>
72 T& push_layer(Args&&... args) {
73 return m_layers.push_layer<T>(std::forward<Args>(args)...);
74 }
75
76 template<typename T, typename... Args>
77 requires std::is_base_of_v<Layer, T>
79 auto layer = std::make_unique<T>(std::forward<Args>(args)...);
80 layer->m_stage_id = stageOrder;
81 layer->m_view_id = m_view_id;
82 layer->m_view = this;
83
84 if (static_cast<size_t>(stageOrder) >= m_layers_by_stage.size()) {
85 m_layers_by_stage.resize(stageOrder + 1);
86 }
87 assert(layer != nullptr);
88 m_layers_by_stage[stageOrder] = std::move(layer);
89 return static_cast<T&>(*m_layers_by_stage[stageOrder]);
90 }
91
92 // --- Identity ---
93 const std::string& get_name() const { return m_name; }
94 [[nodiscard]] ViewId get_view_id() const { return m_view_id; }
95 [[nodiscard]] bool is_open() const { return m_open; }
96 void set_open(bool open) { m_open = open; }
97
98 // --- Layers ---
99 LayerList& get_layers() { return m_layers; }
100 const LayerList& get_layers() const { return m_layers; }
101
102 // --- Viewport state ---
103 VkExtent2D get_extent() const { return m_extent; }
104 void resize(VkExtent2D extent);
105
106 AspectMode get_aspect_mode() const { return m_aspect_mode; }
108 m_aspect_mode = mode;
109 resize(m_extent);
110 }
111
112 RenderMode get_render_mode() const { return m_render_mode; }
113 void set_render_mode(RenderMode mode) { m_render_mode = mode; }
114
115 const VLA::Matrix4x4f& get_projection() const { return m_camera_view_projection; }
116
119 bool changed = m_extent_changed;
120 m_extent_changed = false;
121 return changed;
122 }
123
124 // --- Diagnostics (ImGui region tracking) ---
125 ImVec2 get_content_region_pos() const { return m_content_region_pos; }
126 ImVec2 get_content_region_extent() const { return m_content_region_extent; }
127
128 // --- Rendering setup ---
129 VkExtent2D get_im_gui_extent();
130 VkFormat find_depth_format();
131 [[nodiscard]] vk::RenderPass get_layered_render_pass() const { return m_layered_rp.get(); }
132 Layer* get_layer_by_stage(u32 stage);
133
134 void setup_layered_render(u32 maxStages, VkExtent2D initialExtent = {1280, 720});
135 void cleanup_layered_render();
136
137private:
138 void create_vulkan_resources();
139
140 std::string m_name;
142 bool m_open = true;
144
147 // ImGui content region (updated each frame in OnGuiRender)
148 ImVec2 m_content_region_pos{0, 0};
149 ImVec2 m_content_region_extent{0, 0};
150
151 // Vulkan rendering resources
152 vk::UniqueRenderPass m_layered_rp;
153
154 VkImage m_color_image = VK_NULL_HANDLE;
155 VmaAllocation m_color_allocation = VK_NULL_HANDLE;
156 vk::UniqueImageView m_color_view;
157
158 VkImage m_depth_image = VK_NULL_HANDLE;
159 VmaAllocation m_depth_allocation = VK_NULL_HANDLE;
160 vk::UniqueImageView m_depth_view;
161
162 VkDescriptorSet m_display_tex_ds = VK_NULL_HANDLE; // imgui::image
163
164 vk::UniqueFramebuffer m_layered_framebuffer;
165
166 std::vector<std::unique_ptr<Layer>> m_layers_by_stage;
168 VkExtent2D m_extent = {1280, 720};
169 bool m_extent_changed = false;
170
171 AspectMode m_aspect_mode = AspectMode::BEST_FIT;
172 RenderMode m_render_mode = RenderMode::SHADED;
173
174 friend class Application; // needs mViewId assignment
175 friend class ViewManager;
176};
177
178
179} // namespace sd
Definition Application.hpp:58
Definition Event.hpp:56
Definition LayerList.hpp:21
Base class for all layers. Prefer using System, RenderStage, or Panel instead.
Definition Layer.hpp:28
Definition SDImGuiContext.hpp:27
Definition ViewManager.hpp:26
Definition View.hpp:54
bool is_open() const
Definition View.hpp:95
const LayerList & get_layers() const
Definition View.hpp:100
VulkanContext & m_vulkan_ctx
Definition View.hpp:145
RenderMode get_render_mode() const
Definition View.hpp:112
VkExtent2D get_extent() const
Definition View.hpp:103
virtual void on_fixed_update(double dt)
Definition View.hpp:67
T & push_layer(Args &&... args)
Definition View.hpp:72
void set_aspect_mode(AspectMode mode)
Definition View.hpp:107
std::string m_name
Definition View.hpp:140
vk::UniqueRenderPass m_layered_rp
Definition View.hpp:152
const VLA::Matrix4x4f & get_projection() const
Definition View.hpp:115
vk::RenderPass get_layered_render_pass() const
Definition View.hpp:131
VLA::Matrix4x4f m_camera_view_projection
Definition View.hpp:167
ImVec2 get_content_region_extent() const
Definition View.hpp:126
std::vector< std::unique_ptr< Layer > > m_layers_by_stage
Definition View.hpp:166
LayerList m_layers
Definition View.hpp:141
vk::UniqueFramebuffer m_layered_framebuffer
Definition View.hpp:164
T & push_layer(int stageOrder, Args &&... args)
Definition View.hpp:78
ViewId get_view_id() const
Definition View.hpp:94
View(const std::string &name, const EngineServices &services)
Definition View.hpp:56
bool consume_extent_changed()
Returns true (once) if the extent changed since the last call.
Definition View.hpp:118
const std::string & get_name() const
Definition View.hpp:93
vk::UniqueImageView m_depth_view
Definition View.hpp:160
AspectMode get_aspect_mode() const
Definition View.hpp:106
void set_render_mode(RenderMode mode)
Definition View.hpp:113
virtual void on_event(Event &e)
Definition View.hpp:65
ViewId m_view_id
Definition View.hpp:143
void on_update(float dt)
Definition View.hpp:62
vk::UniqueImageView m_color_view
Definition View.hpp:156
void set_open(bool open)
Definition View.hpp:96
SDImGuiContext & m_imgui_ctx
Definition View.hpp:146
ImVec2 get_content_region_pos() const
Definition View.hpp:125
LayerList & get_layers()
Definition View.hpp:99
Definition VulkanContext.hpp:22
Definition Application.hpp:28
AspectMode
Definition View.hpp:35
RenderMode
Definition View.hpp:42
ViewError
Definition View.hpp:26
@ VIEW_DOES_NOT_EXIST
Definition View.hpp:29
@ SUCCESS
Definition View.hpp:28
@ NAME_ALREADY_EXISTS
Definition View.hpp:27
Definition EngineServices.hpp:10
Definition id_types.hpp:7
std::uint32_t u32
Definition types.hpp:15
constexpr T g_type_max
Definition types.hpp:21