MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ process()

void MayaFlux::Nodes::Network::FieldOperator::process ( float  dt)
overridevirtual

Process for one batch cycle.

Parameters
dtTime delta or sample count (operator-specific)

Implements MayaFlux::Nodes::Network::NetworkOperator.

Definition at line 59 of file FieldOperator.cpp.

60{
61 if (m_count == 0)
62 return;
63
65 std::memcpy(m_vertex_data.data(), m_reference_data.data(), m_count * k_stride);
66 }
67
68 bool has_position = !m_position_fields.empty();
69 bool has_color = !m_color_fields.empty();
70 bool has_normal = !m_normal_fields.empty();
71 bool has_tangent = !m_tangent_fields.empty();
72 bool has_scalar = !m_scalar_fields.empty();
73 bool has_uv = !m_uv_fields.empty();
74
75 for (size_t i = 0; i < m_count; ++i) {
76 glm::vec3& pos = vec3_at(i, k_position_offset);
77
78 if (has_position) {
79 glm::vec3 displacement(0.0F);
80 for (const auto& field : m_position_fields) {
81 displacement += field(pos);
82 }
83 pos += displacement;
84 }
85
86 if (has_color) {
87 glm::vec3 color(0.0F);
88 for (const auto& field : m_color_fields) {
89 color += field(pos);
90 }
92 }
93
94 if (has_normal) {
95 glm::vec3 normal(0.0F);
96 for (const auto& field : m_normal_fields) {
97 normal += field(pos);
98 }
99 float len = glm::length(normal);
100 vec3_at(i, k_normal_offset) = len > 1e-6F ? normal / len : glm::vec3(0.0F, 0.0F, 1.0F);
101 }
102
103 if (has_tangent) {
104 glm::vec3 tangent(0.0F);
105 for (const auto& field : m_tangent_fields) {
106 tangent += field(pos);
107 }
108 float len = glm::length(tangent);
109 vec3_at(i, k_tangent_offset) = len > 1e-6F ? tangent / len : glm::vec3(1.0F, 0.0F, 0.0F);
110 }
111
112 if (has_scalar) {
113 float value = 0.0F;
114 for (const auto& field : m_scalar_fields) {
115 value += field(pos);
116 }
117 float_at(i, k_scalar_offset) = value;
118 }
119
120 if (has_uv) {
121 const glm::vec3 ref = ref_position_at(i);
122 glm::vec2 uv(0.0F);
123 for (const auto& field : m_uv_fields)
124 uv += field(ref);
125 *reinterpret_cast<glm::vec2*>(
126 m_vertex_data.data() + i * k_stride + k_uv_offset) = uv;
127 }
128 }
129
130 m_dirty = true;
131}
std::optional< glm::vec3 > color
std::vector< Kinesis::VectorField > m_position_fields
std::vector< Kinesis::VectorField > m_tangent_fields
std::vector< Kinesis::SpatialField > m_scalar_fields
glm::vec3 & vec3_at(size_t i, size_t offset)
std::vector< Kinesis::VectorField > m_color_fields
std::vector< Kinesis::VectorField > m_normal_fields
float & float_at(size_t i, size_t offset)
std::vector< Kinesis::UVField > m_uv_fields
glm::vec3 ref_position_at(size_t i) const

References MayaFlux::Nodes::Network::ABSOLUTE, color, float_at(), k_color_offset, k_normal_offset, k_position_offset, k_scalar_offset, k_stride, k_tangent_offset, k_uv_offset, m_color_fields, m_count, m_dirty, m_mode, m_normal_fields, m_position_fields, m_reference_data, m_scalar_fields, m_tangent_fields, m_uv_fields, m_vertex_data, ref_position_at(), and vec3_at().

+ Here is the call graph for this function: