256{
257 std::visit([&](
const auto&
ptr) {
258 using T = std::decay_t<
decltype(*ptr)>;
259
260 if constexpr (std::is_same_v<T, Emitter>) {
261 InfluenceContext ctx;
262 if (
ptr->m_position.has_value()) {
263 ctx.position = *
ptr->m_position;
264 }
265 ctx.intensity =
ptr->m_intensity;
266 ctx.radius =
ptr->m_radius;
267 ctx.color =
ptr->m_color;
268 ctx.size =
ptr->m_size;
269 ctx.render_proc =
ptr->m_influence_target;
270 ctx.cursor_pos = reg.pending_cursor;
272
273 } else if constexpr (std::is_same_v<T, Sensor>) {
274 PerceptionContext ctx;
275 if (
ptr->m_position.has_value()) {
276 ctx.position = *
ptr->m_position;
277 auto results =
m_index->within_radius(*
ptr->m_position,
ptr->m_query_radius);
278 ctx.spatial_results = std::span(results);
279 }
281
282 } else if constexpr (std::is_same_v<T, Agent>) {
283 if (
ptr->m_position.has_value()) {
284 auto results =
m_index->within_radius(*
ptr->m_position,
ptr->m_query_radius);
285 PerceptionContext pctx;
286 pctx.position = *
ptr->m_position;
287 pctx.spatial_results = std::span(results);
288 ptr->invoke_perception(pctx);
289
290 InfluenceContext ictx;
291 ictx.position = *
ptr->m_position;
292 ictx.intensity =
ptr->m_intensity;
293 ictx.radius =
ptr->m_radius;
294 ictx.color =
ptr->m_color;
295 ictx.size =
ptr->m_size;
296 ictx.cursor_pos = reg.pending_cursor;
297 ptr->invoke_influence(ictx);
298 } else {
299 ptr->invoke_perception(PerceptionContext {});
300 InfluenceContext ictx;
301 ictx.intensity =
ptr->m_intensity;
302 ictx.radius =
ptr->m_radius;
303 ictx.color =
ptr->m_color;
304 ictx.size =
ptr->m_size;
305 ptr->invoke_influence(ictx);
306 }
307 }
308 },
309 reg.member);
310}
std::unique_ptr< Kinesis::SpatialIndex3D > m_index