载入中...
搜索中...
未找到
BuildingTarget.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
8
9#include <array>
10#include <map>
11#include <string>
12#include <vector>
13
14namespace eve::building {
15class PlacementWorld;
16}
17
18namespace eve::building_editing {
26
29 std::string id;
30 std::string type;
31 std::vector<std::string> tags;
32};
33
36 int instanceId = 0;
37 std::string buildingId;
39 std::string placementKind = "cell";
41 int edgeX = 0;
42 int edgeY = 0;
44 std::string edgeAxis = "horizontal";
46 int cornerX = 0;
47 int cornerY = 0;
49 double freeRadius = 0.0;
51 double freeHalfWidth = 0.0;
53 double freeHalfHeight = 0.0;
55 std::vector<double> freeFootprintVertices;
56 int cellX = 0;
57 int cellY = 0;
59 int level = 0;
60 double worldX = 0.0;
61 double worldY = 0.0;
62 double elevation = 0.0;
64 std::string surfaceId;
66 std::uint64_t surfaceRevision = 0;
68 double surfaceNormalX = 0.0;
69 double surfaceNormalY = 1.0;
70 double surfaceNormalZ = 0.0;
72 double surfaceTangentX = 1.0;
73 double surfaceTangentY = 0.0;
74 double surfaceTangentZ = 0.0;
80 double surfaceHeightDelta = 0.0;
81 double rotationDegrees = 0.0;
82 std::string channel;
83 std::map<std::string, std::string> properties;
84 std::vector<std::string> tags;
85 std::vector<BuildingGarrisonMemberRecord> garrison;
86 std::uint64_t garrisonRevision = 0;
87};
88
91 int x = 0;
92 int y = 0;
93 bool inBounds = false;
94 int occupant = 0;
95 int terrain = 0;
96};
97
100 int x = 0;
101 int y = 0;
102};
103
106 double x = 0.0;
107 double y = 0.0;
108};
109
112 int x = 0;
113 int y = 0;
114 std::string axis;
115};
116
119 double worldX = 0.0;
120 double worldY = 0.0;
121 double worldZ = 0.0;
122 double normalX = 0.0;
123 double normalY = 1.0;
124 double normalZ = 0.0;
125};
126
129 EditorStatus status = EditorStatus::Failed;
131 std::vector<BuildingEdgeCurvePoint> controlPoints;
132 std::vector<BuildingEdgePathVertex> sampledVertices;
133 std::vector<BuildingEdgeCurvePreviewEdge> edges;
135 std::string surfaceId;
136 std::uint64_t surfaceRevision = 0;
137 std::vector<BuildingEdgeCurveSurfaceSample> surfaceSamples;
138 std::vector<EditorDiagnostic> diagnostics;
139};
140
143 EditorStatus status = EditorStatus::Failed;
147 double snappedWorldX = 0.0;
148 double snappedWorldY = 0.0;
149 double elevation = 0.0;
150 double normalizedRotation = 0.0;
151 std::vector<BuildingFootprintCell> cells;
152 std::vector<EditorDiagnostic> diagnostics;
153};
154
157 public virtual IEditableTarget,
160public:
162 static CapabilityId editorCapabilityId() { return CapabilityId("eve.editor.target.building-placement"); }
186 TargetId targetId() const override { return TargetId(id_); }
188 TargetDescriptor describe() const override;
190 void* queryCapability(const CapabilityId& capability) override;
192 Result<void> applyDomainOperation(const DomainOperation& operation) override;
194 std::unique_ptr<IDomainOperationTarget> cloneDomainState() const override;
196 Result<void> commitDomainState(std::unique_ptr<IDomainOperationTarget> candidate) override;
197
199 Result<BuildingInstanceSnapshot> instance(int instanceId) const;
201 int nextAvailableInstanceId() const;
203 BuildingPlacementPreview preview(const std::string& buildingId, double worldX, double worldY,
204 double elevation, double rotationDegrees,
205 int excludeInstanceId = 0) const;
209 Result<DomainOperation> makeMove(int instanceId, int cellX, int cellY,
210 double rotationDegrees) const;
212 Result<DomainOperation> makeMoveFree(int instanceId, double worldX, double worldY,
213 double elevation,
214 double rotationDegrees) const;
216 Result<DomainOperation> makeReplace(int instanceId,
217 const std::string& replacementBuildingId) const;
219 Result<DomainOperation> makeRectangle(const std::string& buildingId, int minCellX,
220 int minCellY, int maxCellX, int maxCellY,
221 double rotationDegrees) const;
223 Result<DomainOperation> makeBrush(const std::string& buildingId, int centerCellX,
224 int centerCellY, int radius,
225 double rotationDegrees) const;
228 makeEdgePath(const std::string& buildingId,
229 const std::vector<BuildingEdgePathVertex>& vertices) const;
232 makeEdgeCubicBezier(const std::string& buildingId,
233 const std::vector<BuildingEdgeCurvePoint>& controlPoints,
234 int subdivisions) const;
236 Result<DomainOperation> makeEdgeCubicBezierOnSurface(
237 const std::string& buildingId,
238 const std::vector<BuildingEdgeCurvePoint>& controlPoints, int subdivisions,
239 const std::string& surfaceName) const;
241 BuildingEdgeCurvePreview previewEdgeCubicBezier(
242 const std::string& buildingId,
243 const std::vector<BuildingEdgeCurvePoint>& controlPoints, int subdivisions,
244 int replacingMemberInstanceId = 0, const std::string& surfaceName = {}) const;
246 editing::GizmoSnapshot edgeCubicBezierGizmo(
247 const std::string& buildingId,
248 const std::vector<BuildingEdgeCurvePoint>& controlPoints, int subdivisions,
249 int level = 0, int replacingMemberInstanceId = 0,
250 const std::string& surfaceName = {}) const;
252 Result<DomainOperation> makeUpdateEdgeCubicBezier(
253 int memberInstanceId, const std::vector<BuildingEdgeCurvePoint>& controlPoints,
254 int subdivisions) const;
256 Result<BuildingEdgeCurvePoint> curveLogicalPointFromWorld(
257 double worldX, double worldY, double worldZ) const;
259 Result<DomainOperation> makeRemove(int instanceId) const;
261 EditorValue snapshotValue() const;
262
263private:
265 BuildingPlacementTarget(std::string id, std::unique_ptr<building::PlacementWorld> world,
266 unsigned long long revision);
267 std::string id_;
268 building::PlacementWorld* world_ = nullptr;
269 std::unique_ptr<building::PlacementWorld> ownedWorld_;
270};
271
280
287public:
290 int memberInstanceId,
291 std::vector<BuildingEdgeCurvePoint> controlPoints,
292 int subdivisions, std::string surfaceName = {});
295 double rayOriginX, double rayOriginY, double rayOriginZ,
296 double rayDirectionX, double rayDirectionY, double rayDirectionZ);
299 double rayOriginX, double rayOriginY, double rayOriginZ,
300 double rayDirectionX, double rayDirectionY, double rayDirectionZ);
302 Result<DomainOperation> finishDrag();
304 void cancelDrag();
306 bool isDragging() const { return dragging_; }
308 int activeControlPointIndex() const { return activeControlPointIndex_; }
309
310private:
311 Result<BuildingEdgeCurveDragPreview> previewCurrent() const;
312 BuildingPlacementTarget* target_ = nullptr;
313 std::string buildingId_;
314 int memberInstanceId_ = 0;
315 std::vector<BuildingEdgeCurvePoint> controls_;
316 int subdivisions_ = 0;
317 std::string surfaceName_;
318 Revision baseRevision_ = 0;
319 int activeControlPointIndex_ = -1;
320 std::array<double, 3> dragPlanePoint_{0.0, 0.0, 0.0};
321 std::array<double, 3> dragPlaneNormal_{0.0, 0.0, 1.0};
322 bool dragging_ = false;
323 bool lastPreviewValid_ = false;
324};
325
326} // namespace eve::building_editing
LogicalId target
ActionParameterOperation operation
float rotationDegrees
#define EVENGINE_API_DOMAINS
Definition Export.h:110
float elevation
int level
World3D * world
std::uint64_t revision
std::vector< Point > vertices
float radius
std::uint32_t targetId
bool placed
A structured explanation of a failed, degraded, or noteworthy result.
Definition Diagnostic.h:94
Move-only operation result carrying either a value or Status.
Definition Result.h:155
UUID-backed identifier adapter for legacy textual boundaries.
Definition Identity.h:314
格子型建筑放置世界(脚本可直接操作)。
UI-neutral ray picking and drag state for one existing cubic building curve. @ownership Borrows the t...
int activeControlPointIndex() const
Active control point index.
Live PlacementWorld target with reversible place/move/remove operations.
static CapabilityId editorCapabilityId()
Stable capability id for placement preview and mutation.
BuildingPlacementTarget(BuildingPlacementTarget &&) noexcept
Out-of-line special members; ownedWorld_ holds a forward-declared building::PlacementWorld.
Dirty region and revision shared by every editable document target.
Optional candidate/publish capability for atomic domain operations.
Editable-target capability that applies owning domain operations.
IEditableTarget public API.
Deterministic owning value tree shared by authoring hosts.
editing::Revision Revision
建筑放置模块入口:定义 / 放置世界 / 鬼影 / 变更事件的脚本绑定点。 设计文档:docs/dev/建筑放置系统设计.md
Definition Building.cpp:7
eve::Severity DiagnosticSeverity
std::uint64_t Revision
StrongId< TargetIdTag > TargetId
Definition EditingIds.h:57
eve::Diagnostic Diagnostic
StrongId< RuleIdTag > RuleId
Definition EditingIds.h:60
eve::StatusCode Status
StrongId< CapabilityIdTag > CapabilityId
Definition EditingIds.h:61
StatusCode
Stable outcome category for an operation.
Definition Status.h:27
Severity
Stable severity of a diagnostic, independent of its display text.
Definition Diagnostic.h:20
Immutable result of one curve-handle pointer update.
Runtime-neutral cubic Bezier control point in logical grid-vertex space.
One canonical edge emitted by a curve draft preview.
Immutable revision-tagged result for one interactive cubic curve draft.
std::vector< BuildingEdgeCurvePoint > controlPoints
std::vector< BuildingEdgeCurvePreviewEdge > edges
std::vector< EditorDiagnostic > diagnostics
std::vector< BuildingEdgePathVertex > sampledVertices
std::vector< BuildingEdgeCurveSurfaceSample > surfaceSamples
Owning world-space center and normal sampled for a surface curve draft.
Runtime-neutral logical vertex used to author an orthogonal edge path.
One occupied or rejected footprint cell in a placement preview.
Persistent garrison member copied through building editor undo.
Complete runtime-neutral placed-building snapshot.
double surfaceNormalX
Captured unit surface normal.
int edgeX
Canonical edge origin when placementKind is edge.
double freeRadius
Committed free-domain collision radius in world-plane units.
std::string placementKind
Placement coordinate domain: cell, edge, corner, or free.
std::string surfaceId
Stable surface provider identity captured at placement time.
std::string edgeAxis
Canonical edge axis: horizontal or vertical.
int level
Authoritative discrete floor coordinate.
int surfaceSampleCount
Number of footprint surface samples represented by this snapshot.
double surfaceTangentX
Captured unit surface tangent.
double freeHalfHeight
Committed free-domain OBB half height; zero denotes circular collision.
double freeHalfWidth
Committed free-domain OBB half width; zero denotes circular collision.
std::vector< double > freeFootprintVertices
Committed convex local polygon as world-plane x/y pairs.
std::map< std::string, std::string > properties
std::uint64_t surfaceRevision
Surface provider revision captured at placement time.
int cornerX
Grid vertex address when placementKind is corner.
double surfaceMaxSlopeDegrees
Maximum sampled footprint slope in degrees.
double surfaceHeightDelta
Sampled footprint height range.
std::vector< BuildingGarrisonMemberRecord > garrison
Structured footprint/snap preview tied to a world revision.
std::vector< BuildingFootprintCell > cells
std::vector< EditorDiagnostic > diagnostics
DomainOperation public API.
EditRegion public API.
Immutable revision-tagged overlay snapshot consumed by any viewport renderer.
Stable discovery metadata exposed by every editable target.