|
MayaFlux 0.5.0
Digital-First Multimedia Processing Framework
|
Visually swallows absorbed particles into their survivor, which grows and heats up with how much it has swallowed. More...
#include <MutationClaimProcessor.hpp>
Inheritance diagram for MayaFlux::Buffers::ClaimSwallowProcessor:
Collaboration diagram for MayaFlux::Buffers::ClaimSwallowProcessor:Classes | |
| struct | Params |
Public Member Functions | |
| ClaimSwallowProcessor (const MutationConfig &config, std::shared_ptr< Nodes::Network::GpuFieldOperator > particle_op, bool transfer_on_claim=false) | |
Public Member Functions inherited from MayaFlux::Buffers::NetworkStateFieldProcessor | |
| const std::shared_ptr< NetworkGeometryBuffer > & | get_network_buffer () const |
| The attached buffer, or null if attachment failed validation. | |
Public Member Functions inherited from MayaFlux::Buffers::ComputeProcessor | |
| ComputeProcessor (const Portal::Graphics::ShaderSpec &spec) | |
| Construct processor from a generated ShaderSpec. | |
| ComputeProcessor (const std::string &shader_path, uint32_t workgroup_x=256) | |
| Construct processor with shader path. | |
| const ShaderDispatchConfig & | get_dispatch_config () const |
| Get current dispatch configuration. | |
| uint32_t | get_iteration_count () const |
| Dispatches recorded per execute cycle. | |
| bool | is_pipeline_ready () const |
| Check if pipeline is created. | |
| void | set_custom_dispatch (std::function< std::array< uint32_t, 3 >(const std::shared_ptr< VKBuffer > &)> calculator) |
| Set custom dispatch calculator. | |
| void | set_dispatch_mode (ShaderDispatchConfig::DispatchMode mode) |
| Set dispatch mode. | |
| void | set_iteration_count (uint32_t count) |
| Set how many dispatches are recorded per execute cycle. | |
| void | set_manual_dispatch (uint32_t x, uint32_t y=1, uint32_t z=1) |
| Set manual dispatch group counts. | |
| void | set_workgroup_size (uint32_t x, uint32_t y=1, uint32_t z=1) |
| Set workgroup size (should match shader local_size) | |
Public Member Functions inherited from MayaFlux::Buffers::ShaderProcessor | |
| void | add_binding (const std::string &descriptor_name, const ShaderBinding &binding) |
| Add descriptor binding configuration. | |
| bool | are_bindings_complete () const |
| Check if all required bindings are satisfied. | |
| bool | are_descriptors_ready () const |
| Check if descriptors are initialized. | |
| void | auto_bind_buffer (const std::shared_ptr< VKBuffer > &buffer) |
| Auto-bind buffer based on attachment order. | |
| void | bind_buffer (const std::string &descriptor_name, const std::shared_ptr< VKBuffer > &buffer) |
| Bind a VKBuffer to a named shader descriptor. | |
| void | clear_specialization_constants () |
| Clear all specialization constants. | |
| template<typename T > | |
| bool | download_bound (const std::string &descriptor_name, std::vector< T > &data) const |
| bool | download_bound (const std::string &descriptor_name, void *data, size_t size, const std::shared_ptr< VKBuffer > &staging=nullptr) const |
| Download the buffer currently bound to a named descriptor. | |
| void | feed (const std::string &name, FeedSource source) |
| Supply a shader input from a callable, resolved by name. | |
| void | feed (const std::string &name, FeedSource source, uint32_t offset, size_t size=sizeof(float)) |
| Supply a push constant from a callable at an explicit offset. | |
| std::vector< std::string > | get_binding_names () const |
| Get all configured descriptor names. | |
| std::shared_ptr< VKBuffer > | get_bound_buffer (const std::string &descriptor_name) const |
| Get bound buffer for a descriptor name. | |
| size_t | get_bound_buffer_count () const |
| Get number of bound buffers. | |
| virtual BufferUsageHint | get_buffer_usage_hint (const std::string &descriptor_name) const |
| Get buffer usage hint for a descriptor. | |
| const ShaderConfig & | get_config () const |
| Get current configuration. | |
| std::vector< std::string > | get_feed_names () const |
| Names of every registered feed. | |
| virtual std::shared_ptr< VKBuffer > | get_output_buffer () const |
| Get the output buffer after compute dispatch. | |
| std::vector< uint8_t > & | get_push_constant_data () |
| const std::vector< uint8_t > & | get_push_constant_data () const |
| Get current push constant data. | |
| const std::string & | get_shader_path () const |
| Get current shader path. | |
| bool | has_binding (const std::string &descriptor_name) const |
| Check if a descriptor binding exists. | |
| virtual bool | has_executed () const |
| Check if compute has been executed at least once. | |
| bool | has_feed (const std::string &name) const |
| Whether a feed of this name is registered. | |
| bool | hot_reload_shader () |
| Hot-reload shader from ShaderFoundry. | |
| bool | is_compatible_with (const std::shared_ptr< Buffer > &buffer) const override |
| Checks if this processor can handle the specified buffer type. | |
| bool | is_deferred_submission () const |
| Whether this processor submits asynchronously. | |
| bool | is_dispatch_pending () const |
| True while an asynchronous submission is outstanding. | |
| virtual bool | is_in_place_operation (const std::string &descriptor_name) const |
| Check if shader modifies a specific buffer in-place. | |
| bool | is_shader_loaded () const |
| Check if shader is loaded. | |
| void | on_attach (const std::shared_ptr< Buffer > &buffer) override |
| Called when this processor is attached to a buffer. | |
| void | on_detach (const std::shared_ptr< Buffer > &buffer) override |
| Called when this processor is detached from a buffer. | |
| void | processing_function (const std::shared_ptr< Buffer > &buffer) override |
| The core processing function that must be implemented by derived classes. | |
| void | remove_feed (const std::string &name) |
| Remove a feed. | |
| bool | resolve_pending_dispatch (bool block) |
| Resolve an outstanding asynchronous submission. | |
| void | set_config (const ShaderConfig &config) |
| Update entire configuration. | |
| void | set_deferred_submission (bool deferred) |
| Submit asynchronously and resolve at the top of a later cycle. | |
| template<typename T > | |
| void | set_push_constant_data (const T &data) |
| Update push constant data (type-safe) | |
| virtual void | set_push_constant_data_raw (const void *data, size_t size) |
| Update push constant data (raw bytes) | |
| template<typename T > | |
| void | set_push_constant_size () |
| Set push constant size from type. | |
| void | set_push_constant_size (size_t size) |
| Set push constant size. | |
| void | set_shader (const std::string &shader_path) |
| Update shader path and reload. | |
| void | set_specialization_constant (uint32_t constant_id, uint32_t value) |
| Set specialization constant. | |
| ShaderProcessor (const std::string &shader_path) | |
| Construct processor with shader path. | |
| ShaderProcessor (ShaderConfig config) | |
| Construct processor with full configuration. | |
| void | unbind_buffer (const std::string &descriptor_name) |
| Unbind a buffer from a descriptor. | |
| ~ShaderProcessor () override | |
Public Member Functions inherited from MayaFlux::Buffers::BufferProcessor | |
| virtual ProcessingToken | get_processing_token () const |
| Gets the current processing token for this buffer. | |
| void | process (const std::shared_ptr< Buffer > &buffer) |
| Applies a computational transformation to the data in the provided buffer. | |
| virtual void | set_processing_token (ProcessingToken token) |
| Gets the preferred processing backend for this processor. | |
| virtual | ~BufferProcessor ()=default |
| Virtual destructor for proper cleanup of derived classes. | |
Protected Member Functions | |
| bool | on_before_execute (Portal::Graphics::CommandBufferID cmd_id, const std::shared_ptr< VKBuffer > &buffer) override |
| Called before each process callback. | |
| void | on_buffer_ready () override |
| Hook for subclass setup, called at the end of on_attach. | |
Protected Member Functions inherited from MayaFlux::Buffers::NetworkStateFieldProcessor | |
| template<typename T > | |
| void | dispatch_one_thread_per (uint32_t element_count, const T ¶ms) |
| Configure manual dispatch for one thread per element, and stage the given push constant data. | |
| template<typename F > | |
| bool | guard_and_resync (Portal::Graphics::CommandBufferID cmd_id, const std::shared_ptr< VKBuffer > &buffer, uint64_t current_revision, uint64_t &built_revision, F &&reload) |
| Base on_before_execute guard, then a revision-gated tuning reload. | |
| NetworkStateFieldProcessor (std::vector< FieldBinding > bindings, const Portal::Graphics::ShaderSpec &spec) | |
| Construct from a generated ShaderSpec. | |
| void | on_attach (const std::shared_ptr< Buffer > &buffer) override |
| Cache and validate the buffer, then call on_buffer_ready. | |
| bool | on_before_execute (Portal::Graphics::CommandBufferID cmd_id, const std::shared_ptr< VKBuffer > &buffer) override |
| Reject buffers that are not the validated NetworkGeometryBuffer. | |
| void | on_descriptors_created () override |
| Write every binding in the table for the current buffer state. | |
| void | processing_function (const std::shared_ptr< Buffer > &buffer) override |
| Rewrite field descriptors, then run the shader. | |
Protected Member Functions inherited from MayaFlux::Buffers::ComputeProcessor | |
| virtual std::array< uint32_t, 3 > | calculate_dispatch_size (const std::shared_ptr< VKBuffer > &buffer) |
| Calculate dispatch size from buffer. | |
| void | cleanup () override |
| void | initialize_descriptors (const std::shared_ptr< VKBuffer > &buffer) override |
| void | initialize_pipeline (const std::shared_ptr< VKBuffer > &buffer) override |
| virtual bool | on_iteration (Portal::Graphics::CommandBufferID cmd_id, const std::shared_ptr< VKBuffer > &buffer, uint32_t index) |
| Called before each iteration's push constants and dispatch. | |
| virtual void | on_iteration_barrier (Portal::Graphics::CommandBufferID cmd_id, const std::shared_ptr< VKBuffer > &buffer, uint32_t index) |
| Called after each iteration except the last. | |
Protected Member Functions inherited from MayaFlux::Buffers::ShaderProcessor | |
| virtual void | on_after_execute (Portal::Graphics::CommandBufferID cmd_id, const std::shared_ptr< VKBuffer > &buffer) |
| Called after each process callback. | |
| virtual void | on_before_compile (const std::string &shader_path) |
| Called before shader compilation. | |
| virtual void | on_before_descriptors_create () |
| Called before descriptor sets are created. | |
| virtual void | on_before_pipeline_create (Portal::Graphics::ComputePipelineID pipeline_id) |
| Called before pipeline creation. | |
| virtual void | on_dispatch_complete (const std::shared_ptr< VKBuffer > &buffer) |
| Called once when an asynchronous submission is observed complete. | |
| virtual void | on_pipeline_created (Portal::Graphics::ComputePipelineID pipeline_id) |
| Called after pipeline is created. | |
| virtual void | on_shader_loaded (Portal::Graphics::ShaderID shader_id) |
| Called after shader is loaded. | |
| void | pump_feeds () |
| Pull every feed and write its result. | |
| std::optional< uint32_t > | resolve_ds_index (uint32_t set) const |
| Resolve logical descriptor set index to actual index. | |
| size_t | resolve_push_constant_size (const std::shared_ptr< VKBuffer > &buffer) const |
| Byte width of this processor's push constant block, extended to cover any fragment staged on the buffer. | |
| std::vector< uint8_t > | resolve_push_constants (const std::shared_ptr< VKBuffer > &buffer) const |
| This processor's push constant data with buffer-staged fragments overlaid at their declared offsets. | |
| void | submit_recorded (Portal::Graphics::CommandBufferID cmd_id, const std::shared_ptr< VKBuffer > &buffer) |
| Submit a recorded command buffer honoring the submission mode. | |
| virtual void | update_descriptors (const std::shared_ptr< VKBuffer > &buffer) |
Protected Member Functions inherited from MayaFlux::Buffers::VKBufferProcessor | |
| void | ensure_initialized (const std::shared_ptr< VKBuffer > &buffer) |
| void | initialize_buffer_service () |
| void | initialize_compute_service () |
Private Attributes | |
| uint64_t | m_built_revision |
| Params | m_params |
| std::shared_ptr< Nodes::Network::GpuFieldOperator > | m_particle_op |
Visually swallows absorbed particles into their survivor, which grows and heats up with how much it has swallowed.
One thread per particle. Colour and size share one underlying quantity rather than being independent choices: size is base_size grown by swallow_count[root] (clamped at max_size), and colour is the same ember-to-white-hot ramp HashDensityColorProcessor uses, driven by how far that size sits between base_size and max_size. A cluster that has swallowed nothing stays base-size and ember-cool; one near the ceiling glows white-hot. This ties "how much has this cluster grown" to a single visible signal instead of an arbitrary per-cluster hue that carries no information about the cluster itself.
A survivor (claimed_by[i] == i) keeps its own position and takes the heat colour at full brightness. An absorbed particle (claimed_by[i] != i) reads its root's current position directly out of the same vertex buffer and overwrites its own position with it, then takes its root's heat colour (computed from the root's own swallow_count, not its own) at a fraction of its brightness, so it still reads as "belongs to that cluster" while visibly dimmer than the survivor it vanished into.
Safe to read another particle's position and swallow_count in the same dispatch that writes positions and colours: only an absorbed particle's own slot is ever written here, a root's position and swallow_count are written by nobody in this kernel (swallow_count was already finalised by ClaimAccumulateProcessor's own, earlier dispatch), so there is no read/write hazard between threads.
Still no compaction: nothing is removed from the buffer and no mass actually transfers to the survivor, only its rendered size. Every absorbed particle collapses onto its root's position freshly each cycle, since ClaimInitProcessor resets the whole claim graph and PhysicsOperator keeps simulating every particle underneath this regardless of whether it was absorbed last cycle. The visible effect is a live, continuously re-evaluated swallow rather than a permanent one: particles that drift back out of absorb_radius reappear at their own simulated position and size next cycle instead of staying merged.
Must run after ClaimAccumulateProcessor.
Reads swallow_base_size/swallow_growth_rate/swallow_max_size/ swallow_dim_factor from the owning GpuFieldOperator fresh whenever its revision() changes (checked in on_before_execute, the same hook VertexFieldProcessor::sync_revision() uses), so the matching setters on GpuFieldOperator take effect on this processor's next dispatch with no rebuild.
Definition at line 375 of file MutationClaimProcessor.hpp.