279{
280 std::visit([&](
const auto&
ptr) {
281 using T = std::decay_t<
decltype(*ptr)>;
282
283 if constexpr (std::is_same_v<T, Emitter>) {
284 ptr->follow_attachment();
285 InfluenceContext ctx;
286 if (
ptr->m_position.has_value()) {
287 ctx.position = *
ptr->m_position;
288 }
289 ctx.intensity =
ptr->m_intensity;
290 ctx.radius =
ptr->m_radius;
291 ctx.color =
ptr->m_color;
292 ctx.size =
ptr->m_size;
293 ctx.cursor_pos = reg.pending_cursor;
295
296 } else if constexpr (std::is_same_v<T, Sensor>) {
297 PerceptionContext ctx;
298 ctx.radius =
ptr->m_query_radius;
299 if (
ptr->m_position.has_value()) {
300 ctx.position = *
ptr->m_position;
301 auto results =
m_index->within_radius(*
ptr->m_position,
ptr->m_query_radius);
302 ctx.spatial_results = std::span(results);
303 }
305
306 } else if constexpr (std::is_same_v<T, Agent>) {
307 ptr->follow_attachment();
308 if (
ptr->m_position.has_value()) {
309 auto results =
m_index->within_radius(*
ptr->m_position,
ptr->m_query_radius);
310 PerceptionContext pctx;
311 pctx.position = *
ptr->m_position;
312 pctx.radius =
ptr->m_query_radius;
313 pctx.orientation =
ptr->m_orientation;
314 pctx.spatial_results = std::span(results);
315 ptr->invoke_perception(pctx);
316
317 InfluenceContext ictx;
318 ictx.position = *
ptr->m_position;
319 ictx.orientation =
ptr->m_orientation;
320 ictx.intensity =
ptr->m_intensity;
321 ictx.radius =
ptr->m_radius;
322 ictx.color =
ptr->m_color;
323 ictx.size =
ptr->m_size;
324 ictx.cursor_pos = reg.pending_cursor;
325 ptr->invoke_influence(ictx);
326 } else {
327 PerceptionContext pctx;
328 pctx.radius =
ptr->m_query_radius;
329 pctx.orientation =
ptr->m_orientation;
330 ptr->invoke_perception(pctx);
331 InfluenceContext ictx;
332 ictx.orientation =
ptr->m_orientation;
333 ictx.intensity =
ptr->m_intensity;
334 ictx.radius =
ptr->m_radius;
335 ictx.color =
ptr->m_color;
336 ictx.size =
ptr->m_size;
337 ptr->invoke_influence(ictx);
338 }
339 }
340 },
341 reg.member);
342}
std::unique_ptr< Kinesis::SpatialIndex3D > m_index