2#ifndef LIBSBX_PARTICLES_PARTICLE_TASK_HPP_
3#define LIBSBX_PARTICLES_PARTICLE_TASK_HPP_
7#include <unordered_map>
9#include <vulkan/vulkan.h>
11#include <libsbx/memory/tracking_allocator.hpp>
13#include <libsbx/core/engine.hpp>
15#include <libsbx/graphics/task.hpp>
16#include <libsbx/graphics/graphics_module.hpp>
17#include <libsbx/graphics/commands/command_buffer.hpp>
19#include <libsbx/graphics/buffers/storage_buffer.hpp>
20#include <libsbx/graphics/buffers/push_handler.hpp>
22#include <libsbx/graphics/descriptor/descriptor_handler.hpp>
24#include <libsbx/graphics/pipeline/compute_pipeline.hpp>
26#include <libsbx/scenes/scene.hpp>
28#include <libsbx/particles/particle_emitter.hpp>
30namespace sbx::particles {
34 inline static constexpr auto default_pipeline_path = std::string_view{
"engine://shaders/particles"};
38 particle_task(
const std::filesystem::path& path = default_pipeline_path);
44 auto remove_emitter(scenes::node
node) -> void;
54 struct alignas(16) emitter_params {
58 std::float_t delta_time;
60 std::float_t emission_rate;
69 std::float_t end_size_scale;
70 std::uint32_t max_particles;
71 std::uint32_t emit_count;
72 std::uint32_t random_seed;
73 std::uint32_t texture_count;
79 static_assert(
alignof(emitter_params) == 16u);
80 static_assert(
sizeof(emitter_params) % 16u == 0u);
82 struct emitter_gpu_data {
97 bool reset_requested{
true};
100 : reset_descriptor{reset_pipeline, 0u},
101 clear_descriptor{clear_pipeline, 0u},
102 emit_descriptor{emit_pipeline, 0u},
103 simulate_descriptor{simulate_pipeline, 0u},
104 prepare_indirect_descriptor{prepare_indirect_pipeline, 0u} { }
108 auto _get_or_create_gpu_data(scenes::node
node,
const particle_emitter& emitter) -> emitter_gpu_data&;
110 auto _initialize_buffers(emitter_gpu_data& gpu_data,
const particle_emitter& emitter) -> void;
112 auto _build_emitter_params(
const particle_emitter& emitter,
const math::vector3& position, std::uint32_t emit_count, std::float_t delta_time) -> emitter_params;
116 auto _dispatch_clear(
graphics::command_buffer& command_buffer, emitter_gpu_data& gpu_data,
const emitter_params& params) -> void;
118 auto _dispatch_emit(
graphics::command_buffer& command_buffer, emitter_gpu_data& gpu_data,
const emitter_params& params) -> void;
120 auto _dispatch_simulate(
graphics::command_buffer& command_buffer, emitter_gpu_data& gpu_data,
const emitter_params& params) -> void;
141 std::unordered_map<scenes::node, emitter_gpu_data> _emitter_gpu_data;
143 std::uint32_t _frame_seed{0};
Definition: command_buffer.hpp:15
Definition: compute_pipeline.hpp:18
Definition: descriptor_handler.hpp:26
Definition: push_handler.hpp:18
Definition: resource_storage.hpp:18
A vector in two-dimensional space.
Definition: vector2.hpp:28
Definition: vector3.hpp:23
RGBA color value type.
Definition: color.hpp:48
Definition: particle_task.hpp:32
Definition: particle_emitter.hpp:23