载入中...
搜索中...
未找到
MeshModifierGraph.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
5#include "common/Result.h"
6#include "procgen/MeshBuild.h"
8
9#include <cstdint>
10#include <string>
11#include <string_view>
12#include <unordered_map>
13#include <vector>
14
15namespace eve::procgen {
16
19 std::string id;
20 int vertexCount = 0;
22 float milliseconds = 0.f;
23 bool cacheHit = false;
24 bool fused = false;
25};
26
29 float x = 0.f;
30 float y = 0.f;
31};
32
35 std::vector<SplineProfilePoint> points;
36 bool closed = true;
37};
38
48public:
50 [[nodiscard]] Result<void> addNode(std::string id, std::string operation);
52 [[nodiscard]] Result<void> removeNode(std::string_view id);
54 [[nodiscard]] Result<void> connect(std::string_view fromId, std::string_view toId, int inputIndex = 0);
56 [[nodiscard]] Result<void> disconnect(std::string_view toId, int inputIndex = 0);
58 [[nodiscard]] Result<void> setNodeMesh(std::string_view id, const MeshBuild& mesh);
60 [[nodiscard]] Result<void> setNodeSplinePath(std::string_view id, const SplinePath& path);
62 [[nodiscard]] Result<void> setNodeSplineProfile(std::string_view id, const SplineProfile& profile);
64 [[nodiscard]] Result<void> setNodeFloat(std::string_view id, std::string key, float value);
66 [[nodiscard]] Result<void> setNodeInt(std::string_view id, std::string key, int value);
68 [[nodiscard]] Result<void> setNodeString(std::string_view id, std::string key, std::string value);
69
74 [[nodiscard]] Result<void> validateResult() const;
80 [[nodiscard]] Result<MeshBuild> executeResult(std::string_view outputId);
81
83 void clearCache();
85 [[nodiscard]] std::uint64_t revision() const noexcept { return revision_; }
87 [[nodiscard]] std::uint64_t executionPlanBuildCount() const noexcept { return executionPlanBuildCount_; }
89 [[nodiscard]] int compiledSegmentCount() const noexcept { return compiledSegmentCount_; }
91 [[nodiscard]] int fusedOperationCount() const noexcept { return fusedOperationCount_; }
93 [[nodiscard]] const std::vector<MeshModifierNodeMetric>& metrics() const noexcept { return metrics_; }
94
96 [[nodiscard]] bool hasNode(std::string_view id) const;
98 [[nodiscard]] int nodeCount() const noexcept { return static_cast<int>(nodeOrder_.size()); }
100 [[nodiscard]] std::string nodeId(int index) const;
102 [[nodiscard]] std::string nodeOperation(std::string_view id) const;
103
105 [[nodiscard]] static int operationCount();
107 [[nodiscard]] static std::string operationId(int index);
109 [[nodiscard]] static int operationInputCount(std::string_view operation);
111 [[nodiscard]] static int operationParamCount(std::string_view operation);
113 [[nodiscard]] static std::string operationParamKey(std::string_view operation, int index);
115 [[nodiscard]] static std::string operationParamKind(std::string_view operation, int index);
117 [[nodiscard]] static std::string operationParamDefault(std::string_view operation, int index);
118
119private:
120 struct Node {
121 std::string id;
122 std::string operation;
123 std::vector<std::string> inputs;
124 std::unordered_map<std::string, float> floats;
125 std::unordered_map<std::string, int> ints;
126 std::unordered_map<std::string, std::string> strings;
127 MeshBuild inputMesh;
128 bool hasInputMesh = false;
129 SplinePath splinePath;
130 bool hasSplinePath = false;
131 SplineProfile splineProfile;
132 bool hasSplineProfile = false;
133 MeshBuild cache;
134 bool cacheValid = false;
135 };
136 struct Segment {
137 std::vector<std::string> nodes;
138 bool fusedVertexTraversal = false;
139 };
140
141 [[nodiscard]] Result<std::vector<Segment>> compilePlan(std::string_view outputId) const;
142 [[nodiscard]] Result<MeshBuild> executeNode(const Node& node,
143 const std::unordered_map<std::string, MeshBuild>& outputs) const;
144 [[nodiscard]] Result<MeshBuild> executeFused(const Segment& segment,
145 const std::unordered_map<std::string, MeshBuild>& outputs) const;
146 [[nodiscard]] Result<void> validateNode(std::string_view id, std::unordered_map<std::string, int>& states) const;
147 void invalidate();
148
149 std::unordered_map<std::string, Node> nodes_;
150 std::vector<std::string> nodeOrder_;
151 std::vector<MeshModifierNodeMetric> metrics_;
152 std::uint64_t revision_ = 0;
153 std::uint64_t executionPlanBuildCount_ = 0;
154 int compiledSegmentCount_ = 0;
155 int fusedOperationCount_ = 0;
156};
157
158} // namespace eve::procgen
ActionParameterOperation operation
double value
std::string nodeId
#define EVENGINE_API_DOMAINS
Definition Export.h:110
std::uint32_t key
int inputs
Definition GridGraph.cpp:23
std::vector< BvhNode > nodes
std::string path
Definition PlayHost.cpp:110
std::string id
Definition PlayHost.cpp:108
Mesh * mesh
Move-only, checked operation results for the common layer.
const RoadNode * node
uint32_t index
Move-only operation result carrying either a value or Status.
Definition Result.h:155
CPU triangle mesh from procedural mesh recipes (e.g. marching cubes). Positions/normals are xyz-packe...
Definition MeshBuild.h:19
Deterministic CPU data-flow graph for procedural mesh deformation and composition.
std::uint64_t executionPlanBuildCount() const noexcept
Return how many execution plans have been compiled.
int nodeCount() const noexcept
Return stable insertion-order node count.
const std::vector< MeshModifierNodeMetric > & metrics() const noexcept
Return metrics from the latest successful execution.
int fusedOperationCount() const noexcept
Return logical operations evaluated by fused vertex traversals in the latest run.
int compiledSegmentCount() const noexcept
Return segment count in the latest successful execution plan.
std::uint64_t revision() const noexcept
Return the monotonic graph mutation revision.
Owning multi-segment 3D spline with deterministic bounded sampling.
Definition SplinePath.h:91
Per-node telemetry captured by the latest successful mesh graph execution.
One vertex of an owning two-dimensional spline extrusion profile.
Owning cross-section snapshot used by mesh.splineExtrude.
std::vector< SplineProfilePoint > points