载入中...
搜索中...
未找到
Crowd.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
5#include "common/Module.h"
6#include "crowd/CrowdField.h"
7
8#include <cstdint>
9#include <memory>
10#include <string>
11#include <vector>
12
13namespace eve::crowd {
14
19struct AgentState {
20 float x = 0.f;
21 float y = 0.f;
22 float heading = 0.f;
23 float speed = 0.f;
24 float vx = 0.f;
25 float vy = 0.f;
26 int action = -1;
27 int data = 0;
29};
30
32struct FlowVec {
33 float x = 0.f;
34 float y = 0.f;
35};
36
38struct StepReport {
39 std::int64_t avoidanceChecks = 0;
41 int substeps = 0;
44 float maxPenetration = 0.f;
45};
46
49 bool enabled = false;
50 float horizon = 2.f;
51 float margin = 0.05f;
52 int maxNeighbors = 32;
53};
54
57 float pushability = 1.f;
58 bool holdPosition = false;
59 int layer = 1;
60 int mask = 0x7fffffff;
61};
62
65
68 std::string stableId;
69 float x = 0.f, y = 0.f, heading = 0.f, radius = 1.f;
71};
72
77struct SpawnBatch {
78 std::vector<SpawnRequest> agents;
80 float maxDistance = 64.f;
81 float searchSpacing = 1.f;
82 int maxPasses = 64;
83 int maxChecks = 1000000;
84};
85
88 std::string stableId;
89 float x = 0.f, y = 0.f;
90};
91
97 std::vector<SpawnPlacement> created;
99 int checks = 0;
100};
101
117public:
120 Crowd();
122 ~Crowd() override;
123
124 // --- 流场(内部持有一个 CrowdField) ---
126 void resizeField(int width, int height, float cellSize, float originX, float originY);
128 void setBlocked(int cx, int cy, bool blocked);
130 void setCellCost(int cx, int cy, float cost);
132 float getCellCost(int cx, int cy) const;
134 void buildFlowField(int gx, int gy);
136 void addFlowGoal(int gx, int gy);
138 void clearFlowGoals();
140 void build();
142 bool isFieldBuilt() const;
144 bool isReachable(int cx, int cy) const;
146 int getFieldWidth() const;
148 int getFieldHeight() const;
150 float getCellSize() const;
152 float getFieldOriginX() const;
154 float getFieldOriginY() const;
155
157 FlowVec flowAtWorld(float wx, float wy) const;
159 float costAtWorld(float wx, float wy) const;
161 FlowVec flowAtCell(int cx, int cy) const;
162
163 // --- 单位 ---
172 int addAgent(float x, float y, float heading, float radius);
181 int addNamedAgent(const std::string &stableId, float x, float y, float heading, float radius);
186 bool hasNamedAgent(const std::string &stableId) const;
191 int getNamedAgentIndex(const std::string &stableId) const;
196 std::string getAgentStableId(int index) const;
201 bool removeNamedAgent(const std::string &stableId);
203 bool removeAgent(int id);
205 void clearAgents();
207 int getAgentCount() const;
209 void setMaxAgents(int maxAgents);
211 int getMaxAgents() const;
212
214 bool setAgentAction(int id, const std::string &action);
216 std::string getAgentAction(int id) const;
218 bool setAgentTarget(int id, float tx, float ty);
220 bool clearAgentTarget(int id);
222 bool setAgentSpeed(int id, float speed);
224 bool setAgentAccel(int id, float accel);
226 bool setAgentTurnRate(int id, float radPerSec);
228 bool setAgentRadius(int id, float radius);
230 bool setAgentData(int id, int data);
232 int getAgentData(int id) const;
235 [[nodiscard]] Result<void> setAgentAvoidancePriority(int id, int priority);
237 int getAgentAvoidancePriority(int id) const;
249 [[nodiscard]] Result<void> setAgentInteraction(int id, AgentInteraction policy);
254 [[nodiscard]] Result<AgentInteraction> getAgentInteraction(int id) const;
275 [[nodiscard]] Result<SpawnReceipt> applySpawnBatch(const SpawnBatch &batch);
277 bool setAgentPosition(int id, float x, float y);
279 AgentState getAgentState(int id) const;
280
281 // --- 群体参数 ---
283 void setDefaultSpeed(float speed);
285 void setDefaultRadius(float radius);
287 void setDefaultTurnRate(float radPerSec);
289 void setArriveRadius(float radius);
291 void setSeparationRadius(float radius);
293 void setPerceptionRadius(float radius);
295 void setSeparationWeight(float weight);
297 void setAlignmentWeight(float weight);
299 void setCohesionWeight(float weight);
301 void setWanderWeight(float weight);
303 void setGoalWeight(float weight);
305 void setResolveOverlaps(bool enable);
307 void setClampToField(bool enable);
317 [[nodiscard]] Result<void> configureAvoidance(AvoidanceSettings settings);
319 AvoidanceSettings getAvoidanceSettings() const;
320
346 [[nodiscard]] Result<StepReport> advance(float dt);
347
354 void step(float dt);
355
356private:
357 struct Impl;
358 std::unique_ptr<Impl> impl_;
359};
360
361} // namespace eve::crowd
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
int priority
float cx
Definition CardTypes.cpp:33
float cy
Definition CardTypes.cpp:34
eve::resource::CostSpec cost
#define EVENGINE_API_FOUNDATION
每个链接组(link group)各自的导出宏。
Definition Export.h:106
std::uint32_t height
std::uint32_t width
float radius
std::string action
Definition PlayHost.cpp:117
TerrainThermalSettings settings
float step
Definition TreeMesh.cpp:314
V3 heading
Definition TreeMesh.cpp:292
uint32_t index
float wx
float wy
EVENGINE_API_FOUNDATION public API.
Definition Module.h:46
Move-only operation result carrying either a value or Status.
Definition Result.h:155
群体行为模块:连续流场寻路 + 海量单位移动/转向/行动 + Boids 鸟群。
Definition Crowd.h:116
~Crowd() override
Crowd.
SpawnPolicy
Placement policy for an atomic spawn batch.
Definition Crowd.h:64
Independent local interaction policy, copied into Crowd storage.
Definition Crowd.h:56
float pushability
Relative contact mobility in [0,1]; zero cannot be pushed by agents.
Definition Crowd.h:57
int mask
Both agents must accept the other's layer for interaction.
Definition Crowd.h:60
int layer
Non-negative membership bit mask; zero disables agent interaction.
Definition Crowd.h:59
bool holdPosition
Suppress locomotion and agent pushes; terrain constraints still apply.
Definition Crowd.h:58
单个单位的状态快照(脚本 getAgentState 返回值)。 action: 0=idle, 1=flow, 2=seek, 3=boids。
Definition Crowd.h:19
float vx
速度 X
Definition Crowd.h:24
float heading
朝向(弧度,0=+X)
Definition Crowd.h:22
int action
行动枚举(-1=非法 id)
Definition Crowd.h:26
int avoidancePriority
Higher-priority agents yield less during overlap resolution.
Definition Crowd.h:28
float x
世界 X
Definition Crowd.h:20
float vy
速度 Y
Definition Crowd.h:25
float y
世界 Y
Definition Crowd.h:21
float speed
当前速度大小
Definition Crowd.h:23
int data
游戏自定义标记
Definition Crowd.h:27
Optional bounded velocity sampling for RTS local avoidance.
Definition Crowd.h:48
bool enabled
Opt in independently of legacy Boids steering.
Definition Crowd.h:49
float horizon
Positive prediction seconds, at most ten.
Definition Crowd.h:50
float margin
Non-negative extra pair clearance in world units.
Definition Crowd.h:51
int maxNeighbors
Nearest interacting neighbors considered, in [1,128].
Definition Crowd.h:52
Private crowd runtime storage. @cost Linear in agent count for SOA vectors and transient broadphase/a...
流场采样结果(脚本 flowAtWorld / flowAtCell 返回值)。
Definition Crowd.h:32
float y
方向 Y
Definition Crowd.h:34
float x
方向 X
Definition Crowd.h:33
Caller-built transaction; positive budgets bound search and relaxation. @cost Linear in requested age...
Definition Crowd.h:77
int maxChecks
Combined candidate/neighbor work budget, at most ten million.
Definition Crowd.h:83
float searchSpacing
NearestFree samples concentric rings at this spacing.
Definition Crowd.h:81
float maxDistance
Maximum relocation from each requested/original position.
Definition Crowd.h:80
std::vector< SpawnRequest > agents
Definition Crowd.h:78
int maxPasses
Contact relaxation limit, at most 256.
Definition Crowd.h:82
SpawnPolicy policy
Definition Crowd.h:79
Owning placement result, independent of compact slots and subsequent removal.
Definition Crowd.h:87
std::string stableId
Definition Crowd.h:88
Observations from a committed spawn transaction. @cost Linear in created placement count; returned by...
Definition Crowd.h:96
std::vector< SpawnPlacement > created
Definition Crowd.h:97
One named agent to create; all fields are owned values.
Definition Crowd.h:67
AgentInteraction interaction
Definition Crowd.h:70
std::string stableId
Definition Crowd.h:68
Owning observations of one completed advance; simulation-thread only.
Definition Crowd.h:38
int avoidanceTruncations
Agent/substep queries exceeding the configured neighbor limit.
Definition Crowd.h:40
int unresolvedWalls
Final agents violating terrain or field bounds.
Definition Crowd.h:43
std::int64_t avoidanceChecks
Candidate-neighbor predictions across all substeps.
Definition Crowd.h:39
int unresolvedContacts
Final overlapping pairs deeper than 0.001 world units.
Definition Crowd.h:42
float maxPenetration
Largest remaining pair penetration in world units.
Definition Crowd.h:44
int substeps
Number of bounded integration intervals consumed.
Definition Crowd.h:41