载入中...
搜索中...
未找到
Targeting.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
15#include "common/Capability.h"
16#include "common/Identity.h"
17#include "common/Result.h"
18#include "common/SubjectRef.h"
19#include "sensing/Sensing.h"
20
21#include <cstddef>
22#include <cstdint>
23#include <functional>
24#include <limits>
25#include <map>
26#include <optional>
27#include <ostream>
28#include <span>
29#include <string>
30#include <utility>
31#include <variant>
32#include <vector>
33
34namespace eve::sensing {
35
37enum class CoordinateSpace : std::uint8_t {
38 World2D,
39 World3D,
40 Grid2D,
41 Grid3D,
42};
43
45[[nodiscard]] EVENGINE_API_PLATFORM std::string_view coordinateSpaceName(CoordinateSpace space) noexcept;
46
48inline std::ostream& operator<<(std::ostream& stream, CoordinateSpace space) {
50 return stream << coordinateSpaceName(space);
51}
52
54enum class TargetDomain : std::uint8_t {
55 Any,
56 Self,
57 Ally,
58 Enemy,
59 Neutral,
60};
61
63enum class LineOfSightMode : std::uint8_t {
66};
67
77
85public:
87 ZoneRef() = default;
88
94 [[nodiscard]] static std::optional<ZoneRef> fromLogicalId(LogicalId id);
95
97 [[nodiscard]] bool isValid() const noexcept { return id_.isValid(); }
98
100 [[nodiscard]] const LogicalId& logicalId() const noexcept { return id_; }
101
102 friend bool operator==(const ZoneRef&, const ZoneRef&) noexcept = default;
103
104private:
105 explicit ZoneRef(LogicalId id) : id_(std::move(id)) {}
106
107 LogicalId id_;
108};
109
117public:
119 WorldPoint() = default;
120
125 [[nodiscard]] static Result<WorldPoint> world2D(float x, float y);
126
131 [[nodiscard]] static Result<WorldPoint> world3D(float x, float y, float z);
132
134 [[nodiscard]] CoordinateSpace space() const noexcept { return space_; }
136 [[nodiscard]] float x() const noexcept { return x_; }
138 [[nodiscard]] float y() const noexcept { return y_; }
140 [[nodiscard]] float z() const noexcept { return z_; }
142 [[nodiscard]] bool isValid() const noexcept { return valid_; }
143
144 friend bool operator==(const WorldPoint&, const WorldPoint&) noexcept = default;
145
146private:
147 WorldPoint(CoordinateSpace space, float x, float y, float z) noexcept
148 : space_(space), x_(x), y_(y), z_(z), valid_(true) {}
149
150 CoordinateSpace space_ = CoordinateSpace::World2D;
151 float x_ = 0.f;
152 float y_ = 0.f;
153 float z_ = 0.f;
154 bool valid_ = false;
155};
156
164public:
166 GridPoint() = default;
167
169 [[nodiscard]] static GridPoint grid2D(std::int32_t x, std::int32_t y) noexcept;
171 [[nodiscard]] static GridPoint grid3D(std::int32_t x, std::int32_t y, std::int32_t z) noexcept;
172
174 [[nodiscard]] CoordinateSpace space() const noexcept { return space_; }
176 [[nodiscard]] std::int32_t x() const noexcept { return x_; }
178 [[nodiscard]] std::int32_t y() const noexcept { return y_; }
180 [[nodiscard]] std::int32_t z() const noexcept { return z_; }
182 [[nodiscard]] bool isValid() const noexcept { return valid_; }
183
184 friend bool operator==(const GridPoint&, const GridPoint&) noexcept = default;
185
186private:
187 GridPoint(CoordinateSpace space, std::int32_t x, std::int32_t y, std::int32_t z) noexcept
188 : space_(space), x_(x), y_(y), z_(z), valid_(true) {}
189
190 CoordinateSpace space_ = CoordinateSpace::Grid2D;
191 std::int32_t x_ = 0;
192 std::int32_t y_ = 0;
193 std::int32_t z_ = 0;
194 bool valid_ = false;
195};
196
198using TargetLocation = std::variant<WorldPoint, GridPoint>;
199
208public:
210 enum class Shape : std::uint8_t { Circle2D, Box2D, Sphere3D, Box3D, Cone2D };
211
213 WorldArea() = default;
215 [[nodiscard]] static Result<WorldArea> circle2D(WorldPoint center, float radius);
217 [[nodiscard]] static Result<WorldArea> box2D(WorldPoint minimum, WorldPoint maximum);
219 [[nodiscard]] static Result<WorldArea> sphere3D(WorldPoint center, float radius);
221 [[nodiscard]] static Result<WorldArea> box3D(WorldPoint minimum, WorldPoint maximum);
230 [[nodiscard]] static Result<WorldArea> cone2D(WorldPoint apex, float dirX, float dirY, float halfAngleRadians,
231 float range);
232
234 [[nodiscard]] Shape shape() const noexcept { return shape_; }
236 [[nodiscard]] CoordinateSpace space() const noexcept { return space_; }
238 [[nodiscard]] bool isValid() const noexcept { return valid_; }
240 [[nodiscard]] WorldPoint first() const noexcept { return first_; }
242 [[nodiscard]] WorldPoint second() const noexcept { return second_; }
244 [[nodiscard]] float radius() const noexcept { return radius_; }
246 [[nodiscard]] bool contains(WorldPoint point) const noexcept;
247
248private:
249 WorldArea(Shape shape, WorldPoint first, WorldPoint second, float radius, float halfAngle = 0.f) noexcept
250 : shape_(shape),
251 space_(first.space()),
252 first_(first),
253 second_(second),
254 radius_(radius),
255 halfAngle_(halfAngle),
256 valid_(true) {}
257
258 Shape shape_ = Shape::Circle2D;
259 CoordinateSpace space_ = CoordinateSpace::World2D;
260 WorldPoint first_;
261 WorldPoint second_;
262 float radius_ = 0.f;
263 float halfAngle_ = 0.f;
264 bool valid_ = false;
265};
266
274public:
276 enum class Shape : std::uint8_t { Box2D, Box3D };
277
279 GridArea() = default;
281 [[nodiscard]] static Result<GridArea> box2D(GridPoint minimum, GridPoint maximum);
283 [[nodiscard]] static Result<GridArea> box3D(GridPoint minimum, GridPoint maximum);
284
286 [[nodiscard]] Shape shape() const noexcept { return shape_; }
288 [[nodiscard]] CoordinateSpace space() const noexcept { return space_; }
290 [[nodiscard]] bool isValid() const noexcept { return valid_; }
292 [[nodiscard]] GridPoint minimum() const noexcept { return minimum_; }
294 [[nodiscard]] GridPoint maximum() const noexcept { return maximum_; }
296 [[nodiscard]] bool contains(GridPoint point) const noexcept;
297
298private:
300 : shape_(shape), space_(minimum.space()), minimum_(minimum), maximum_(maximum), valid_(true) {}
301
302 Shape shape_ = Shape::Box2D;
303 CoordinateSpace space_ = CoordinateSpace::Grid2D;
304 GridPoint minimum_;
305 GridPoint maximum_;
306 bool valid_ = false;
307};
308
316 std::uint32_t minCount = 0;
318 std::uint32_t maxCount = std::numeric_limits<std::uint32_t>::max();
326 float minRange = 0.f;
328 float maxRange = std::numeric_limits<float>::infinity();
330 std::vector<std::string> requiredTags;
332 std::vector<std::string> excludedTags;
334 std::optional<ZoneRef> zone;
336 std::optional<WorldArea> worldArea;
338 std::optional<GridArea> gridArea;
341
346 [[nodiscard]] Result<void> validate() const;
347};
348
361
380
385public:
387 [[nodiscard]] Result<void> addSubject(SubjectRef subject);
389 [[nodiscard]] Result<void> setPrimary(SubjectRef subject);
391 [[nodiscard]] Result<void> setPoint(TargetLocation point);
393 [[nodiscard]] Result<void> setArea(WorldArea area);
395 [[nodiscard]] Result<void> setArea(GridArea area);
396
398 [[nodiscard]] std::span<const SubjectRef> subjects() const noexcept { return subjects_; }
400 [[nodiscard]] const std::optional<SubjectRef>& primary() const noexcept { return primary_; }
402 [[nodiscard]] const std::optional<TargetLocation>& point() const noexcept { return point_; }
404 [[nodiscard]] const std::optional<WorldArea>& worldArea() const noexcept { return worldArea_; }
406 [[nodiscard]] const std::optional<GridArea>& gridArea() const noexcept { return gridArea_; }
407
408private:
409 std::vector<SubjectRef> subjects_;
410 std::optional<SubjectRef> primary_;
411 std::optional<TargetLocation> point_;
412 std::optional<WorldArea> worldArea_;
413 std::optional<GridArea> gridArea_;
414};
415
419 bool visible = false;
421 std::optional<SubjectRef> blocker;
422};
423
432public:
433 static constexpr const char* capabilityName = "eve.sensing.ILineOfSightQuery";
435 virtual ~ILineOfSightQuery() = default;
436
445 const TargetLocation& to) const = 0;
446};
447
455public:
456 static constexpr const char* capabilityName = "eve.sensing.ISensingCandidateProvider";
458 virtual ~ISensingCandidateProvider() = default;
459
466 [[nodiscard]] virtual Result<std::vector<TargetCandidate>> query(const TargetingQuery& query) const = 0;
467};
468
477public:
481 ~SensingCandidateProvider() override = default;
482
484 [[nodiscard]] Result<void> upsert(TargetCandidate candidate);
486 [[nodiscard]] Result<void> remove(SubjectRef subject);
488 [[nodiscard]] std::size_t size() const noexcept { return candidates_.size(); }
489
492 [[nodiscard]] Result<std::vector<TargetCandidate>> query(const TargetingQuery& query) const override;
493
494private:
495 std::map<std::string, TargetCandidate> candidates_;
496};
497
505 std::function<Result<TargetDomain>(std::string_view originFaction, std::string_view candidateFaction)>;
506
518public:
520 explicit SensingWorldCandidateProvider(SensingWorld& world) noexcept : world_(&world) {}
522 ~SensingWorldCandidateProvider() override = default;
523
525 void setFactionRelation(FactionRelationFn relation) { relation_ = std::move(relation); }
526
529 [[nodiscard]] Result<std::vector<TargetCandidate>> query(const TargetingQuery& query) const override;
530
531private:
532 SensingWorld* world_ = nullptr;
533 FactionRelationFn relation_;
534};
535
544public:
550 [[nodiscard]] Result<TargetSet> resolve(const TargetingQuery& query) const;
551};
552
562} // namespace eve::sensing
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
float z
Definition AnimClip.cpp:738
int subject
Definition AnimSmr.cpp:163
std::string from
#define EVENGINE_API_PLATFORM
Definition Export.h:107
float maximum[3]
float minimum[3]
ShaderImageInput shape
float area
Definition Grass.cpp:62
std::int32_t second
std::int32_t first
HexCoordinates to
Cell the unit walks towards on this segment.
Definition HexUnits.cpp:64
Strong identity values shared by persistence, content and logical-name APIs.
Range range
World3D * world
float radius
std::string id
Definition PlayHost.cpp:108
Move-only, checked operation results for the common layer.
Stable reference to a runtime gameplay subject.
glm::vec3 point
Human-readable, scoped identifier in the form namespace:name.
Definition Identity.h:411
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Strong, domain-neutral reference to a runtime subject.
Definition SubjectRef.h:26
An integer grid area constraint, kept separate from WorldArea.
Definition Targeting.h:273
GridArea()=default
Constructs an invalid default grid area.
bool isValid() const noexcept
Returns whether this area is valid.
Definition Targeting.h:290
GridPoint minimum() const noexcept
Return the inclusive minimum grid corner.
Definition Targeting.h:292
Shape shape() const noexcept
Returns the area shape.
Definition Targeting.h:286
GridPoint maximum() const noexcept
Return the inclusive maximum grid corner.
Definition Targeting.h:294
Shape
Shape public API.
Definition Targeting.h:276
CoordinateSpace space() const noexcept
Returns the area coordinate space.
Definition Targeting.h:288
Integer grid point tagged as Grid2D or Grid3D.
Definition Targeting.h:163
friend bool operator==(const GridPoint &, const GridPoint &) noexcept=default
std::int32_t x() const noexcept
Returns the X cell coordinate.
Definition Targeting.h:176
CoordinateSpace space() const noexcept
Returns the point coordinate space.
Definition Targeting.h:174
bool isValid() const noexcept
Returns whether the point was constructed by a grid factory.
Definition Targeting.h:182
std::int32_t z() const noexcept
Returns the Z cell coordinate; it is zero for Grid2D.
Definition Targeting.h:180
GridPoint()=default
Constructs an invalid default grid point.
std::int32_t y() const noexcept
Returns the Y cell coordinate.
Definition Targeting.h:178
Consumer-owned line-of-sight capability.
Definition Targeting.h:431
static constexpr const char * capabilityName
Definition Targeting.h:433
virtual ~ILineOfSightQuery()=default
Releases ILineOfSightQuery resources.
virtual Result< LineOfSightResult > query(const TargetLocation &from, const TargetLocation &to) const =0
Tests the segment between two same-space locations.
Candidate discovery capability consumed by TargetingResolver.
Definition Targeting.h:454
static constexpr const char * capabilityName
Definition Targeting.h:456
virtual Result< std::vector< TargetCandidate > > query(const TargetingQuery &query) const =0
Returns broad-phase candidates satisfying the coordinate and spatial constraints.
virtual ~ISensingCandidateProvider()=default
Releases ISensingCandidateProvider resources.
Pure CPU sensing candidate provider with deterministic map-backed storage.
Definition Targeting.h:476
SensingCandidateProvider()=default
Creates an empty provider; registration with capability is explicit.
~SensingCandidateProvider() override=default
Sensing candidate provider.
std::size_t size() const noexcept
Returns the number of stored candidate facts.
Definition Targeting.h:488
ISensingCandidateProvider adapter over a SensingWorld fact mirror.
Definition Targeting.h:517
void setFactionRelation(FactionRelationFn relation)
Installs optional faction→domain projection used when domain != Any.
Definition Targeting.h:525
~SensingWorldCandidateProvider() override=default
Sensing world candidate provider.
SensingWorldCandidateProvider(SensingWorld &world) noexcept
Binds a non-owning SensingWorld; capability registration remains explicit.
Definition Targeting.h:520
Gameplay-facing 2D candidate query service; it never values or selects targets.
Definition Sensing.h:151
Owning target result containing primary-independent subjects and optional geometry.
Definition Targeting.h:384
std::span< const SubjectRef > subjects() const noexcept
Returns borrowed subjects, valid until this TargetSet is mutated or destroyed.
Definition Targeting.h:398
const std::optional< SubjectRef > & primary() const noexcept
Returns the explicitly assigned primary subject, if any.
Definition Targeting.h:400
const std::optional< GridArea > & gridArea() const noexcept
Returns the optional grid-area projection.
Definition Targeting.h:406
const std::optional< TargetLocation > & point() const noexcept
Returns the optional point projection.
Definition Targeting.h:402
const std::optional< WorldArea > & worldArea() const noexcept
Returns the optional world-area projection.
Definition Targeting.h:404
Generic constraint evaluator that composes candidate and LOS capabilities.
Definition Targeting.h:543
A world-space area constraint.
Definition Targeting.h:207
WorldPoint first() const noexcept
Return the center for circle/sphere, or minimum corner for boxes.
Definition Targeting.h:240
WorldArea()=default
Constructs an invalid default area.
Shape shape() const noexcept
Returns the area shape.
Definition Targeting.h:234
WorldPoint second() const noexcept
Return the maximum corner for boxes; invalid/default for circle and sphere.
Definition Targeting.h:242
Shape
Shape public API.
Definition Targeting.h:210
float radius() const noexcept
Return circle/sphere radius; zero for boxes.
Definition Targeting.h:244
bool isValid() const noexcept
Returns whether this area is valid.
Definition Targeting.h:238
CoordinateSpace space() const noexcept
Returns the area coordinate space.
Definition Targeting.h:236
Finite world-space point tagged as either World2D or World3D.
Definition Targeting.h:116
friend bool operator==(const WorldPoint &, const WorldPoint &) noexcept=default
float x() const noexcept
Returns the X coordinate in the tagged world space.
Definition Targeting.h:136
bool isValid() const noexcept
Returns whether the point was constructed with finite coordinates.
Definition Targeting.h:142
float y() const noexcept
Returns the Y coordinate in the tagged world space.
Definition Targeting.h:138
float z() const noexcept
Returns the Z coordinate; it is zero for World2D.
Definition Targeting.h:140
WorldPoint()=default
Constructs an invalid default point; use world2D/world3D for values.
CoordinateSpace space() const noexcept
Returns the point coordinate space.
Definition Targeting.h:134
Strong reference to a named spatial zone.
Definition Targeting.h:84
friend bool operator==(const ZoneRef &, const ZoneRef &) noexcept=default
ZoneRef()=default
Constructs an invalid zone reference.
const LogicalId & logicalId() const noexcept
Returns the wrapped logical ID.
Definition Targeting.h:100
bool isValid() const noexcept
Returns whether the reference contains a valid logical ID.
Definition Targeting.h:97
std::variant< WorldPoint, GridPoint > TargetLocation
Either a world point or a grid point, with the tag retained.
Definition Targeting.h:198
CoordinateSpace
Coordinate spaces are not interchangeable, even when dimensions match.
Definition Targeting.h:37
std::string_view coordinateSpaceName(CoordinateSpace space) noexcept
Returns the stable protocol name for a coordinate space.
std::ostream & operator<<(std::ostream &stream, CoordinateSpace space)
Writes the stable coordinate-space protocol name.
Definition Targeting.h:48
TargetDomain
Stable relationship class used by generic domain constraints.
Definition Targeting.h:54
CountPolicy
How candidate-count overflow relative to maxCount is handled.
Definition Sensing.h:44
@ FailIfOutOfRange
Fail the query when the filtered set is outside [minCount, maxCount].
LineOfSightMode
Whether a candidate must be visible from the query origin.
Definition Targeting.h:63
std::function< Result< TargetDomain >(std::string_view originFaction, std::string_view candidateFaction)> FactionRelationFn
Projects faction string pairs into TargetDomain for SensingWorld adapters.
Definition Targeting.h:505
Result of one injected line-of-sight query.
Definition Targeting.h:417
std::optional< SubjectRef > blocker
Optional stable blocker identity when the provider can identify it.
Definition Targeting.h:421
bool visible
True when the complete segment is visible.
Definition Targeting.h:419
Candidate facts returned by sensing.
Definition Targeting.h:368
std::vector< std::string > tags
Stable gameplay tags used by required/excluded tag queries.
Definition Targeting.h:376
TargetLocation location
Candidate location in one of the explicitly tagged spaces.
Definition Targeting.h:372
std::vector< ZoneRef > zones
Logical zones containing this candidate.
Definition Targeting.h:378
TargetDomain domain
Relationship class supplied by the sensing/domain adapter.
Definition Targeting.h:374
SubjectRef subject
Stable subject identity.
Definition Targeting.h:370
A query passed from a domain targeting algorithm to sensing.
Definition Targeting.h:350
TargetLocation originLocation
Origin location in exactly spec.space.
Definition Targeting.h:354
Result< void > validate() const
Validates origin identity, location/spec space and spec constraints.
SubjectRef origin
Subject issuing the query; it is not implicitly selected as a result.
Definition Targeting.h:352
TargetingSpec spec
Generic constraints to apply to candidate facts.
Definition Targeting.h:356
A checked target-count and spatial constraint description.
Definition Targeting.h:310
CountPolicy countPolicy
How overflow relative to maxCount is handled. FailIfOutOfRange preserves historical Action/resolver b...
Definition Targeting.h:324
LineOfSightMode lineOfSight
Whether an injected LOS provider must confirm each candidate.
Definition Targeting.h:340
std::optional< GridArea > gridArea
Optional Grid2D/Grid3D area constraint.
Definition Targeting.h:338
Result< void > validate() const
Validates count, range, tags, zone and coordinate-space invariants.
std::vector< std::string > excludedTags
Tags that exclude a candidate when present.
Definition Targeting.h:332
float maxRange
Maximum distance, in world units or grid cells; positive infinity means unbounded.
Definition Targeting.h:328
float minRange
Minimum distance, in world units or grid cells according to space.
Definition Targeting.h:326
std::uint32_t maxCount
Maximum number of candidates accepted.
Definition Targeting.h:318
std::optional< ZoneRef > zone
Optional logical zone membership required from candidates.
Definition Targeting.h:334
std::vector< std::string > requiredTags
All tags that each candidate must contain.
Definition Targeting.h:330
CoordinateSpace space
Required coordinate space for origin, candidates and area.
Definition Targeting.h:312
std::optional< WorldArea > worldArea
Optional World2D/World3D area constraint.
Definition Targeting.h:336
std::uint32_t minCount
Minimum number of candidates required in the resolved set.
Definition Targeting.h:316
TargetDomain domain
Relationship class accepted from candidate facts.
Definition Targeting.h:314