载入中...
搜索中...
未找到
SplinePath.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
5#include "common/Result.h"
6
7#include <cstdint>
8#include <string_view>
9#include <utility>
10#include <vector>
11
12namespace eve::procgen {
13
16 float x = 0.f, y = 0.f, z = 0.f;
17 float inX = 0.f, inY = 0.f, inZ = 0.f;
18 float outX = 0.f, outY = 0.f, outZ = 0.f;
19 float rollDegrees = 0.f;
20 float scaleX = 1.f, scaleY = 1.f;
21 bool breakBefore = false;
22 float pitchDegrees = 0.f, yawDegrees = 0.f;
23};
24
27 float x = 0.f, y = 0.f, z = 0.f;
28 float tangentX = 1.f, tangentY = 0.f, tangentZ = 0.f;
29 float normalizedDistance = 0.f;
30 float rollDegrees = 0.f;
31 float scaleX = 1.f, scaleY = 1.f;
32 int chunkIndex = 0;
33 float pitchDegrees = 0.f, yawDegrees = 0.f;
34};
35
39 float sideX = 1.f, sideY = 0.f, sideZ = 0.f;
40 float upX = 0.f, upY = 1.f, upZ = 0.f;
41 float forwardX = 0.f, forwardY = 0.f, forwardZ = 1.f;
42};
43
46public:
48 explicit SplineDistribution(std::vector<SplineFrameSample> frames = {}) : frames_(std::move(frames)) {}
50 [[nodiscard]] int count() const noexcept { return static_cast<int>(frames_.size()); }
52 [[nodiscard]] Result<SplineSample> sampleResult(int index) const;
54 [[nodiscard]] Result<SplineFrameSample> frameResult(int index) const;
55
56private:
57 std::vector<SplineFrameSample> frames_;
58};
59
62public:
64 explicit SplinePolyline(std::vector<std::vector<SplineSample>> chunks = {}, bool closed = false)
66 : chunks_(std::move(chunks)), closed_(closed) {}
68 [[nodiscard]] int count() const noexcept;
70 [[nodiscard]] Result<SplineSample> pointResult(int index) const;
72 [[nodiscard]] int chunkCount() const noexcept { return static_cast<int>(chunks_.size()); }
74 [[nodiscard]] int chunkPointCount(int chunk) const noexcept;
76 [[nodiscard]] Result<SplineSample> chunkPointResult(int chunk, int index) const;
78 [[nodiscard]] bool isClosed() const noexcept { return closed_; }
79
80private:
81 std::vector<std::vector<SplineSample>> chunks_;
82 bool closed_ = false;
83};
84
92public:
94 [[nodiscard]] Result<void> setKindResult(std::string_view kind);
96 void setClosed(bool closed);
98 [[nodiscard]] Result<void> addPointResult(const SplinePoint& point);
100 [[nodiscard]] Result<void> setPointResult(int index, const SplinePoint& point);
102 [[nodiscard]] Result<void> setPointProfileResult(int index, float rollDegrees, float scaleX, float scaleY);
104 [[nodiscard]] Result<void> setPointRotationResult(int index, float pitchDegrees, float yawDegrees,
105 float rollDegrees);
107 [[nodiscard]] Result<void> setPointChunkBreakResult(int index, bool disconnected);
109 [[nodiscard]] Result<void> removePointResult(int index);
111 void clear();
112
114 [[nodiscard]] Result<SplineSample> evaluateResult(float t) const;
116 [[nodiscard]] Result<SplineSample> evaluateDistanceResult(float distance, int samplesPerSegment = 24) const;
118 [[nodiscard]] Result<float> lengthResult(int samplesPerSegment = 24) const;
120 [[nodiscard]] Result<SplineSample> closestPointResult(float x, float y, float z, int samplesPerSegment = 32) const;
130 [[nodiscard]] Result<std::vector<SplineFrameSample>> sampleFramesResult(int sampleCount, bool uniformByDistance,
131 float rollDegrees = 0.f,
132 int samplesPerSegment = 24) const;
134 [[nodiscard]] Result<SplineSample> travelResult(float distance, std::string_view wrapMode = "clamp",
135 int samplesPerSegment = 24) const;
137 [[nodiscard]] Result<SplineFrameSample> travelFrameResult(float distance, std::string_view wrapMode = "clamp",
138 int samplesPerSegment = 24) const;
140 [[nodiscard]] Result<SplineDistribution> distributeResult(int instanceCount, bool includeEnd = true,
141 int samplesPerSegment = 24) const;
143 [[nodiscard]] Result<SplinePolyline> polylineResult(int sampleCount = 64, bool uniformByDistance = true,
144 int samplesPerSegment = 24) const;
153 [[nodiscard]] Result<void> applyShapePresetResult(std::string_view preset, int pointCount, float radius,
154 float height, float turns = 1.f);
155
157 [[nodiscard]] int pointCount() const noexcept { return static_cast<int>(points_.size()); }
159 [[nodiscard]] int segmentCount() const noexcept;
161 [[nodiscard]] int chunkCount() const noexcept;
163 [[nodiscard]] Result<SplinePath> chunkPathResult(int chunk) const;
165 [[nodiscard]] std::string_view kind() const noexcept { return kind_; }
167 [[nodiscard]] bool isClosed() const noexcept { return closed_; }
169 [[nodiscard]] std::uint64_t revision() const noexcept { return revision_; }
170
171private:
172 struct ArcEntry {
173 int segment = 0;
174 float u = 0.f;
175 float distance = 0.f;
176 };
177 [[nodiscard]] Result<void> validateReady() const;
178 [[nodiscard]] SplineSample evaluateUnchecked(float t) const;
179 [[nodiscard]] SplineSample evaluateSegmentUnchecked(int segment, float u, float normalized) const;
180 [[nodiscard]] std::vector<std::pair<int, int>> segmentEndpoints() const;
181 [[nodiscard]] Result<void> ensureArcTable(int samplesPerSegment) const;
182 void invalidate();
183
184 std::vector<SplinePoint> points_;
185 std::string kind_ = "catmullRom";
186 bool closed_ = false;
187 std::uint64_t revision_ = 0;
188 mutable std::vector<ArcEntry> arcTable_;
189 mutable int arcSamplesPerSegment_ = 0;
190};
191
192} // namespace eve::procgen
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
float z
Definition AnimClip.cpp:738
#define EVENGINE_API_DOMAINS
Definition Export.h:110
std::uint32_t instanceCount
float u
Definition Grass.cpp:233
std::uint32_t height
TokenKind kind
float distance
float radius
float t
Move-only, checked operation results for the common layer.
std::uint32_t count
uint32_t index
int turns
glm::vec3 point
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Owning uniformly distributed spline samples for instancing.
Definition SplinePath.h:45
int count() const noexcept
Return the number of independent sample values.
Definition SplinePath.h:50
SplineDistribution(std::vector< SplineFrameSample > frames={})
Construct an owning distribution from validated samples.
Definition SplinePath.h:48
Owning multi-segment 3D spline with deterministic bounded sampling.
Definition SplinePath.h:91
std::uint64_t revision() const noexcept
Return monotonic mutation revision.
Definition SplinePath.h:169
bool isClosed() const noexcept
Report whether the path is closed.
Definition SplinePath.h:167
int pointCount() const noexcept
Return point count.
Definition SplinePath.h:157
Owning sampled polyline for renderer-neutral runtime visualization adapters.
Definition SplinePath.h:61
bool isClosed() const noexcept
Report whether presentation adapters should close the last-to-first edge.
Definition SplinePath.h:78
SplinePolyline(std::vector< std::vector< SplineSample > > chunks={}, bool closed=false)
Construct from an owning sequence of sampled points.
Definition SplinePath.h:64
Evaluated spline sample with an orthonormal transported cross-section frame.
Definition SplinePath.h:37
One spline anchor with incoming and outgoing handle offsets.
Definition SplinePath.h:15
Evaluated spline position and normalized tangent.
Definition SplinePath.h:26