6 constexpr size_t k_tail_offset = 32;
7 constexpr size_t k_param_size = 64;
24 static_assert(k_tail_offset +
sizeof(BuoyancyTail) == k_param_size);
28 const std::string& temperature_field,
29 const std::string& density_field,
30 const std::string& velocity_field)
33 { .name =
"temperature_in", .binding = 0, .field = temperature_field, .access =
FieldAccess::READ },
34 { .name =
"density_in", .binding = 1, .field = density_field, .access =
FieldAccess::READ },
35 { .name =
"velocity_in", .binding = 2, .field = velocity_field, .access =
FieldAccess::READ },
36 { .name =
"velocity_out", .binding = 3, .field = velocity_field, .access =
FieldAccess::WRITE },
41 std::string temperature_field,
42 std::string density_field,
43 std::string velocity_field,
44 const glm::vec3& direction,
45 const std::string& shader_path)
47 make_bindings(temperature_field, density_field, velocity_field), shader_path)
48 , m_temperature_field(
std::move(temperature_field))
49 , m_density_field(
std::move(density_field))
50 , m_velocity_field(
std::move(velocity_field))
51 , m_direction(direction)
57 std::string temperature_field,
58 std::string density_field,
59 std::string velocity_field,
60 const glm::vec3& direction,
63 make_bindings(temperature_field, density_field, velocity_field), spec)
64 , m_temperature_field(
std::move(temperature_field))
65 , m_density_field(
std::move(density_field))
66 , m_velocity_field(
std::move(velocity_field))
67 , m_direction(direction)
83 const BuoyancyTail tail {
void set_density_gain(float gain)
Set the coefficient on the density value.
void set_time_step(float dt)
Set the integration step passed to the shader each cycle.
void set_ambient(float ambient)
Set the temperature at which the rise term vanishes.
void set_temperature_gain(float gain)
Set the coefficient on the temperature difference.
void write_tail()
Write every parameter past the shared prefix.
static std::vector< FieldBinding > make_bindings(const std::string &temperature_field, const std::string &density_field, const std::string &velocity_field)
Build the binding table for the three field names.
void on_volume_ready() override
Raise the parameter block and write the tail.
BuoyancyProcessor(std::string temperature_field, std::string density_field, std::string velocity_field, const glm::vec3 &direction, const std::string &shader_path)
Construct a buoyancy stage.
std::string m_velocity_field
void set_direction(const glm::vec3 &direction)
Set the force axis and magnitude.
void write_param_tail(size_t offset, const void *data, size_t size)
Write subclass parameters past the shared prefix.
void reserve_param_size(size_t size)
Raise the push constant block to at least this size.
void write_lattice_word7(float value)
Write word seven of the parameter prefix, at byte offset 28.
@ READ
Resolves to VolumeGridBuffer::read_handle.
@ WRITE
Resolves to VolumeGridBuffer::write_handle.
void write_lattice_params()
Write the lattice dimensions and cell size into the staged push constant block, preserving word three...
const std::shared_ptr< VolumeGridBuffer > & get_volume() const
The attached volume, or null if attachment failed validation.
void add_swap_field(std::string field)
Register a field to swap after each dispatch.
ComputeProcessor operating on named fields of a VolumeGridBuffer.
Complete declarative description of a generated compute shader.