MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
WalkOperator.cpp
Go to the documentation of this file.
1#include "WalkOperator.hpp"
2
4
5WalkOperator::WalkOperator(std::shared_ptr<Kinesis::Stochastic::Weights> table, Pick pick,
6 uint32_t every_n_blocks, size_t starting_index)
7 : m_table(std::move(table))
8 , m_pick(std::move(pick))
9 , m_current(starting_index)
10 , m_blocks_until(every_n_blocks)
11{
12 m_every_n_blocks.store(every_n_blocks, std::memory_order_relaxed);
13}
14
16{
17 if (m_established) {
18 return;
19 }
20 auto all = slots();
21 if (all.empty()) {
22 return;
23 }
24 const size_t here = m_current.load(std::memory_order_relaxed);
25 for (size_t i = 0; i < all.size(); ++i) {
26 all[i].set_active(i == here);
27 }
28 m_established = true;
29}
30
31void WalkOperator::process(float /*frames*/)
32{
34
35 const uint32_t every = m_every_n_blocks.load(std::memory_order_relaxed);
36 if (every == 0) {
37 return;
38 }
39 if (m_blocks_until == 0) {
40 m_blocks_until = every;
41 }
43 if (m_blocks_until == 0) {
44 advance();
45 }
46}
47
48void WalkOperator::set_every_n_blocks(uint32_t every_n_blocks) noexcept
49{
50 m_every_n_blocks.store(every_n_blocks, std::memory_order_relaxed);
51 m_blocks_until = every_n_blocks;
52}
53
55{
57
58 const size_t here = m_current.load(std::memory_order_relaxed);
59 auto row = m_table->row(here);
60
62 if (next >= row.size()) {
63 return here;
64 }
65
66 jump(next);
67 return next;
68}
69
71{
73
74 auto all = slots();
75 if (index >= all.size() || index >= m_table->rows()) {
76 return;
77 }
78
79 const size_t here = m_current.load(std::memory_order_relaxed);
80 if (index == here) {
81 return;
82 }
83
84 all[here].set_active(false);
85 all[index].set_active(true);
86 m_current.store(index, std::memory_order_relaxed);
87}
88
89void WalkOperator::set_parameter(std::string_view param, double value)
90{
91 if (param == "current") {
92 const auto index = static_cast<size_t>(value);
93 if (index != m_current.load(std::memory_order_relaxed)) {
94 jump(index);
95 }
96 }
97}
98
99std::optional<double> WalkOperator::query_state(std::string_view query) const
100{
101 if (query == "current") {
102 return static_cast<double>(current());
103 }
104 return std::nullopt;
105}
106
107} // namespace MayaFlux::Nodes::Network
glm::vec3 value
uint32_t index
Definition VKDevice.cpp:122
static size_t weighted_pick(std::span< const double > weights, Stochastic &generator)
Weighted random draw over a row of nonnegative weights.
Definition Weights.hpp:252
std::span< RelationSlot > slots() const noexcept
std::function< size_t(std::span< const double > row)> Pick
Chooses a successor from a row of weights.
void ensure_established()
Activate slot m_current and deactivate every other slot that currently exists.
void jump(size_t index)
Make a slot the active one.
void set_parameter(std::string_view param, double value) override
Set operator parameter.
void set_every_n_blocks(uint32_t every_n_blocks) noexcept
Change or disable the self-contained step rate.
void process(float frames) override
Self-contained step.
WalkOperator(std::shared_ptr< Kinesis::Stochastic::Weights > table, Pick pick={}, uint32_t every_n_blocks=0, size_t starting_index=0)
std::atomic< uint32_t > m_every_n_blocks
std::shared_ptr< Kinesis::Stochastic::Weights > m_table
Kinesis::Stochastic::Stochastic m_generator
std::optional< double > query_state(std::string_view query) const override
Query walk state.