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 102 of file FieldOperator.cpp.

103{
104 if (m_count == 0)
105 return;
106
108 std::memcpy(m_vertex_data.data(), m_reference_data.data(), m_count * k_stride);
109 }
110
111 bool has_position = !m_position_fields.empty();
112 bool has_color = !m_color_fields.empty();
113 bool has_normal = !m_normal_fields.empty();
114 bool has_tangent = !m_tangent_fields.empty();
115 bool has_scalar = !m_scalar_fields.empty();
116 bool has_uv = !m_uv_fields.empty();
117
118 for (size_t i = 0; i < m_count; ++i) {
119 glm::vec3& pos = vec3_at(i, k_position_offset);
120
121 if (has_position) {
122 glm::vec3 displacement(0.0F);
123 for (const auto& field : m_position_fields) {
124 displacement += field(pos);
125 }
126 pos += displacement;
127 }
128
129 if (has_color) {
130 glm::vec3 color(0.0F);
131 for (const auto& field : m_color_fields) {
132 color += field(pos);
133 }
134 vec3_at(i, k_color_offset) = color;
135 }
136
137 if (has_normal) {
138 glm::vec3 normal(0.0F);
139 for (const auto& field : m_normal_fields) {
140 normal += field(pos);
141 }
142 float len = glm::length(normal);
143 vec3_at(i, k_normal_offset) = len > 1e-6F ? normal / len : glm::vec3(0.0F, 0.0F, 1.0F);
144 }
145
146 if (has_tangent) {
147 glm::vec3 tangent(0.0F);
148 for (const auto& field : m_tangent_fields) {
149 tangent += field(pos);
150 }
151 float len = glm::length(tangent);
152 vec3_at(i, k_tangent_offset) = len > 1e-6F ? tangent / len : glm::vec3(1.0F, 0.0F, 0.0F);
153 }
154
155 if (has_scalar) {
156 float value = 0.0F;
157 for (const auto& field : m_scalar_fields) {
158 value += field(pos);
159 }
160 float_at(i, k_scalar_offset) = value;
161 }
162
163 if (has_uv) {
164 const glm::vec3 ref = ref_position_at(i);
165 glm::vec2 uv(0.0F);
166 for (const auto& field : m_uv_fields)
167 uv += field(ref);
168 *reinterpret_cast<glm::vec2*>(
169 m_vertex_data.data() + i * k_stride + k_uv_offset) = uv;
170 }
171 }
172
173 m_dirty = true;
174}
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, 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: