MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
InstanceFieldOperator.cpp
Go to the documentation of this file.
2
4
6{
7 m_position_fields.erase(slot_index);
8 m_transform_fields[slot_index] = std::move(field);
9}
10
12{
13 m_transform_fields.erase(slot_index);
14 m_position_fields[slot_index] = std::move(field);
15}
16
17void InstanceFieldOperator::unbind(uint32_t slot_index)
18{
19 m_transform_fields.erase(slot_index);
20 m_position_fields.erase(slot_index);
21}
22
28
30 std::shared_ptr<Yantra::ShaderExecutionContext<>> executor, bool continuous)
31{
32 if (!executor) {
33 m_compute_node.reset();
34 m_executor.reset();
35 return;
36 }
37
38 m_executor = std::move(executor);
39 m_compute_node = std::make_shared<Nodes::GpuSync::GpuComputeNode>(m_executor, continuous);
40
41 m_compute_node->on_complete([this](Nodes::GpuSync::GpuComputeContext& ctx) {
42 if (!m_slots)
43 return;
44
45 const auto& primary = ctx.gpu_result.primary;
46 const size_t floats_per_slot = 16;
47
48 for (size_t i = 0; i < m_slots->size(); ++i) {
49 const size_t base = i * floats_per_slot;
50 if (base + floats_per_slot > primary.size())
51 break;
52
53 auto& slot = (*m_slots)[i];
54 std::memcpy(glm::value_ptr(slot.transform), primary.data() + base,
55 floats_per_slot * sizeof(float));
56 slot.dirty = true;
57 }
58 });
59
60 m_compute_node->set_dirty();
61}
62
64{
65 if (auto it = m_transform_fields.find(slot.index);
66 it != m_transform_fields.end() && it->second) {
67 slot.transform = it->second(slot.transform);
68 slot.dirty = true;
69 return;
70 }
71
72 if (auto it = m_position_fields.find(slot.index);
73 it != m_position_fields.end() && it->second.fn) {
74 const glm::vec3 pos { slot.transform[3] };
75 slot.transform[3] = glm::vec4(it->second(pos), 1.0F);
76 slot.dirty = true;
77 }
78}
79
81{
82 if (m_compute_node) {
83 m_compute_node->compute_frame();
84 return;
85 }
86
88}
89
90} // namespace MayaFlux::Nodes::Network
const Yantra::GpuChannelResult & gpu_result
Reference to the full dispatch result. Valid during callback only.
Context delivered to on_complete callbacks when a dispatch completes.
std::shared_ptr< Nodes::GpuSync::GpuComputeNode > m_compute_node
void process_slot(GeometrySlot &slot, float dt) override
void unbind(uint32_t slot_index)
Remove all bindings for a slot.
void bind_position(uint32_t slot_index, PositionField field)
Bind a PositionField to a slot.
std::function< glm::mat4(const glm::mat4 &)> TransformField
std::unordered_map< uint32_t, PositionField > m_position_fields
void unbind_all()
Remove all bindings for all slots.
std::shared_ptr< Yantra::ShaderExecutionContext<> > m_executor
void bind_transform(uint32_t slot_index, TransformField field)
Bind a TransformField to a slot.
std::unordered_map< uint32_t, TransformField > m_transform_fields
void set_gpu_executor(std::shared_ptr< Yantra::ShaderExecutionContext<> > executor, bool continuous=true)
Attach a GPU executor and switch to async dispatch mode.
void process(float dt) override
Process for one batch cycle.
void process(float dt) override
Process for one batch cycle.
Concrete GpuExecutionContext for a single fixed shader with fixed bindings.
Typed, composable, stateless callable from domain D to range R.
Definition Tendency.hpp:22
Peer unit within an InstanceNetwork.