@@ -51,23 +51,27 @@ export namespace stormkit::engine {
5151
5252 private:
5353 struct Sprite {
54- std::array<SpriteVertex, 4 > vertices = {
55- SpriteVertex { { 0 .f , 0 .f }, { 0 .f , 0 .f } },
56- SpriteVertex { { 0 .f , 1 .f }, { 0 .f , 1 .f } },
57- SpriteVertex { { 1 .f , 0 .f }, { 1 .f , 0 .f } },
58- SpriteVertex { { 1 .f , 1 .f }, { 1 .f , 1 .f } },
59- };
6054 gpu::ImageView texture;
55+ gpu::Sampler sampler;
6156 };
6257
6358 auto do_init (Application&) noexcept -> gpu::Expected<void>;
59+ auto do_init_scene_data (Application&) noexcept -> gpu::Expected<void>;
60+ auto do_init_buffered_scene_data (Application&) noexcept -> gpu::Expected<void>;
61+
62+ auto insert_update_camera_task (const Renderer&, FrameBuilder&, FrameBuilder::ResourceID) noexcept -> void;
63+ auto insert_update_sprites_task (const Renderer&, FrameBuilder&) noexcept -> void;
64+ auto insert_render_sprites_task (const Renderer&,
65+ FrameBuilder&,
66+ FrameBuilder::ResourceID,
67+ FrameBuilder::ResourceID) noexcept -> void;
6468
6569 auto on_message_received (const Renderer&,
6670 const entities::EntityManager&,
6771 const entities::Message&,
6872 const entities::Entities&) noexcept -> void;
6973
70- struct RenderData {
74+ struct SceneData {
7175 DeferInit<gpu::Shader> vertex_shader;
7276 DeferInit<gpu::Shader> fragment_shader;
7377
@@ -77,20 +81,28 @@ export namespace stormkit::engine {
7781 gpu::RasterPipelineState pipeline_state;
7882 DeferInit<gpu::Pipeline> pipeline;
7983
80- DeferInit<gpu::DescriptorPool> descriptor_pool;
81- DeferInit<gpu::DescriptorSetLayout> descriptor_set_layout;
84+ DeferInit<gpu::DescriptorPool> descriptor_pool;
85+ } m_scene_data;
86+
87+ struct BufferedSceneData {
88+ DeferInit<gpu::DescriptorSetLayout> camera_descriptor_layout;
8289 DeferInit<gpu::DescriptorSet> camera_descriptor_set;
90+ DeferInit<gpu::Buffer> camera_buffer;
91+ u32 camera_current_offset = 0 ;
8392
84- DeferInit<gpu::Buffer> camera_buffer;
85- } m_render_data;
93+ DeferInit<gpu::DescriptorSetLayout> sprite_descriptor_layout;
94+ DeferInit<gpu::DescriptorSet> sprite_descriptor_set;
95+ DeferInit<gpu::Buffer> sprite_buffer;
96+ u32 sprite_current_offset = 0 ;
97+ } m_buffered_scene_data;
8698
8799 struct Camera {
88100 math::fmat4 projection = math::fmat4::identity();
89101 math::fmat4 view = math::fmat4::identity();
90102
91103 static constexpr auto layout_binding () -> gpu::DescriptorSetLayoutBinding {
92104 return { .binding = 0 ,
93- .type = gpu::DescriptorType::UNIFORM_BUFFER ,
105+ .type = gpu::DescriptorType::UNIFORM_BUFFER_DYNAMIC ,
94106 .stages = gpu::ShaderStageFlag::VERTEX,
95107 .descriptor_count = 1 };
96108 }
@@ -99,6 +111,26 @@ export namespace stormkit::engine {
99111 math::fextent2 m_viewport;
100112
101113 Locked<std::vector<std::pair<entities::Entity, Sprite>>> m_sprites;
114+
115+ struct Dirty {
116+ inline Dirty () noexcept = default;
117+ inline ~Dirty () noexcept = default ;
118+
119+ inline Dirty (Dirty&& other) noexcept : camera { other.camera .load () }, sprites { other.sprites .load () } {}
120+
121+ inline auto operator =(Dirty&& other) noexcept -> Dirty& {
122+ if (this == &other) [[unlikely]]
123+ return *this ;
124+
125+ camera.store (other.camera .load ());
126+ sprites.store (other.sprites .load ());
127+
128+ return *this ;
129+ }
130+
131+ std::atomic_bool camera = true ;
132+ std::atomic_bool sprites = true ;
133+ } m_dirty;
102134 };
103135} // namespace stormkit::engine
104136
0 commit comments