载入中...
搜索中...
未找到
ArchSpaceDocument.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
6#include "common/Result.h"
7
8#include <string>
9#include <unordered_map>
10#include <vector>
11
12namespace eve::archspace {
13
23public:
25 Document() = default;
26
28 [[nodiscard]] const std::string& rootId() const noexcept { return rootId_; }
29 [[nodiscard]] const std::unordered_map<std::string, Node>& nodes() const noexcept { return nodes_; }
31 [[nodiscard]] std::size_t nodeCount() const noexcept { return nodes_.size(); }
32
38 [[nodiscard]] const Node* find(const std::string& id) const;
44 [[nodiscard]] Node* findMutable(const std::string& id);
45
50 [[nodiscard]] eve::Result<void> insert(Node node);
55 [[nodiscard]] eve::Result<void> replace(Node node);
60 [[nodiscard]] eve::Result<void> eraseCascade(const std::string& id);
62 void clear();
63
68 [[nodiscard]] eve::Result<void> bootstrap(const std::string& siteId, const std::string& buildingId,
69 const std::string& levelId, double levelHeight = 3.0);
70
76 [[nodiscard]] eve::Result<void> createRoom(const std::string& levelId, const std::string& roomId,
77 std::string roomName, std::vector<Vec2> polygon, double wallHeight,
78 double wallThickness, double slabThickness);
79
84 [[nodiscard]] eve::Result<void> createWall(const std::string& levelId, const std::string& wallId,
85 std::string wallName, Vec2 start, Vec2 end, double height,
86 double thickness);
87
92 [[nodiscard]] eve::Result<void> createOpening(const std::string& wallId, const std::string& openingId,
93 std::string openingName, OpeningKind kind, double t, double width,
94 double height, double sill = 0.0);
95
100 [[nodiscard]] eve::Result<void> placeItem(const std::string& levelId, const std::string& itemId,
101 std::string itemName, std::string catalogId, Vec3 position,
102 double yawDegrees = 0.0);
103
105 [[nodiscard]] std::vector<std::string> diagnostics() const;
106
110 [[nodiscard]] MeshBake bakeMesh() const;
111
113 [[nodiscard]] MeshArrays bakeMeshArrays() const { return toMeshArrays(bakeMesh()); }
114
115private:
116 [[nodiscard]] bool canParent(NodeKind child, const std::string& parentId) const;
117 [[nodiscard]] bool validateNode(const Node& node) const;
118 void unlinkFromParent(const std::string& id);
119 void collectDescendants(const std::string& id, std::vector<std::string>& out) const;
120
121 std::string rootId_;
122 std::unordered_map<std::string, Node> nodes_;
123};
124
125} // namespace eve::archspace
Duration start
LogicalId itemId
float thickness
Definition CaveMesh.cpp:83
std::uint64_t parentId
#define EVENGINE_API_WORLD
Definition Export.h:109
std::uint32_t height
std::uint32_t width
TokenKind kind
std::array< float, 3 > position
float t
Move-only, checked operation results for the common layer.
const RoadNode * node
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Authoritative architectural space document (Pascal-like node graph).
Document()=default
Document.
const std::unordered_map< std::string, Node > & nodes() const noexcept
MeshArrays bakeMeshArrays() const
Bake and pack into GPU-upload float arrays with per-triangle normals.
const std::string & rootId() const noexcept
Root id.
std::size_t nodeCount() const noexcept
Node count.
MeshArrays toMeshArrays(const MeshBake &bake)
Convert a MeshBake into flat arrays with per-triangle normals.
OpeningKind
Opening semantic used by doors and windows hosted on walls.
NodeKind
Stable node kind discriminator for the architectural document.
Interleaved GPU-upload arrays derived from MeshBake.
Renderer-neutral triangle mesh rebuilt from the document.
One authored architectural node. Only fields for the active kind are meaningful.
Metres on the level XZ plane.
Metres in world/level space.