40 enum class Kind : uint8_t {
55 float cell_size = 1.0F);
67 [[nodiscard]]
const std::string&
name()
const {
return m_name; }
72 void set_name(std::string name) { m_name = std::move(name); }
77 [[nodiscard]] uint32_t
id()
const {
return m_fabric_id; }
82 void set_id(uint32_t
id) { m_fabric_id = id; }
93 [[nodiscard]]
Wiring wire(std::shared_ptr<Emitter> emitter);
100 [[nodiscard]]
Wiring wire(std::shared_ptr<Sensor> sensor);
107 [[nodiscard]]
Wiring wire(std::shared_ptr<Agent> agent);
113 void remove(uint32_t
id);
125 uint32_t add_expanse(std::shared_ptr<Expanse> expanse);
131 void remove_expanse(uint32_t
id);
150 void fire(uint32_t
id);
162 [[nodiscard]] std::vector<Kinesis::QueryResult> within_radius(
163 const glm::vec3& center,
float radius)
const;
171 [[nodiscard]] std::vector<Kinesis::QueryResult> k_nearest(
172 const glm::vec3& center, uint32_t k)
const;
180 [[nodiscard]]
const Wiring* wiring_for(uint32_t
id)
const;
185 [[nodiscard]] std::vector<uint32_t> all_ids()
const;
191 [[nodiscard]] Kind kind(uint32_t
id)
const;
197 [[nodiscard]] std::shared_ptr<Emitter> get_emitter(uint32_t
id)
const;
203 [[nodiscard]] std::shared_ptr<Sensor> get_sensor(uint32_t
id)
const;
209 [[nodiscard]] std::shared_ptr<Agent> get_agent(uint32_t
id)
const;
219 [[nodiscard]] std::shared_ptr<Emitter::InfluenceFn> resolve_influence_fn(std::string_view name)
const;
225 [[nodiscard]] std::shared_ptr<Sensor::PerceptionFn> resolve_perception_fn(std::string_view name)
const;
231 [[nodiscard]] std::shared_ptr<Expanse::ContainsFn> resolve_expanse_fn(std::string_view name)
const;
237 [[nodiscard]] std::shared_ptr<Presence::RadiateFn> resolve_radiate_fn(std::string_view name)
const;
247 [[nodiscard]] std::shared_ptr<Expanse::CrossingFn> resolve_crossing_fn(std::string_view name)
const;
256 [[nodiscard]] std::vector<uint32_t> all_expanse_ids()
const;
262 [[nodiscard]] std::shared_ptr<Expanse> get_expanse(uint32_t
id)
const;
270 std::shared_ptr<Emitter>,
271 std::shared_ptr<Sensor>,
272 std::shared_ptr<Agent>>;
279 bool commit_driven {
false };
285 uint32_t assign_id(
Member& m);
291 std::unique_ptr<Kinesis::SpatialIndex3D>
m_index;
293 std::unordered_map<uint32_t, std::shared_ptr<Expanse>>
m_expanses;
295 uint32_t m_fabric_id { 0 };
296 uint32_t m_next_id { 1 };
297 uint32_t m_next_expanse_id { 1 };
299 std::unordered_map<std::string, std::shared_ptr<Emitter::InfluenceFn>>
m_influence_fns;
301 std::unordered_map<std::string, std::shared_ptr<Expanse::ContainsFn>>
m_expanse_fns;
302 std::unordered_map<std::string, std::shared_ptr<Expanse::CrossingFn>>
m_crossing_fns;
303 std::unordered_map<std::string, std::shared_ptr<Presence::RadiateFn>>
m_radiate_fns;