载入中...
搜索中...
未找到
ObjectBuildLayer.cpp
浏览该文件的文档.
21 !finiteRange(range.minScaleY, range.maxScaleY) || !finiteRange(range.minScaleZ, range.maxScaleZ))
25 if (range.minScaleX == 0.f || range.maxScaleX == 0.f || range.minScaleY == 0.f || range.maxScaleY == 0.f ||
59float orientedYaw(const ProcgenPoint& point, const PointSet& orientation, float cellSize, bool invert) {
66 {0.f, 1.f, invert ? 90.f : 270.f}, {1.f, 0.f, 0.f}, {0.f, -1.f, invert ? 270.f : 90.f}, {-1.f, 0.f, 180.f}};
69 return std::any_of(orientation.points().begin(), orientation.points().end(), [&](const ProcgenPoint& other) {
74 if (matches(point.x + direction.x * cellSize, point.z + direction.z * cellSize)) return direction.yaw;
75 const Direction diagonal[] = {{1.f, 1.f, 90.f}, {1.f, -1.f, 0.f}, {-1.f, -1.f, 180.f}, {-1.f, 1.f, 180.f}};
77 if (matches(point.x + direction.x * cellSize, point.z + direction.z * cellSize)) return direction.yaw;
81void applyRandomTransform(ProcgenPoint& point, const ObjectTransformRange& range, RandomStream& random) {
97Result<void> tagPoint(PointSet& output, int index, const std::string& asset, std::string role, std::int64_t parent) {
109 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "asset id is empty", "asset",
154Result<void> ObjectBuildLayer::setRandomRotation(float minPitch, float maxPitch, float minYaw, float maxYaw,
166Result<void> ObjectBuildLayer::setRandomScale(float minX, float maxX, float minY, float maxY, float minZ, float maxZ,
182 DiagnosticCode::InvalidArgument, "orientation cell size must be positive", {}, {}, "procgen.objectBuild"));
185 DiagnosticCode::InvalidArgument, "orientation yaw offset must be finite", {}, {}, "procgen.objectBuild"));
204 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "child asset id is empty",
208 DiagnosticCode::InvalidArgument, "child count must be non-negative", asset, {}, "procgen.objectBuild"));
219Result<void> ObjectBuildLayer::addChild(std::string asset, int count, float radius, float minScale, float maxScale,
236Result<PointSet> ObjectBuildLayer::build(const PointSet& source, const PointSet* orientation) const {
239 DiagnosticCode::InvalidArgument, "object build layer has no assets", "assets", {}, "procgen.objectBuild"));
242 DiagnosticCode::InvalidArgument, "orientation is enabled but no orientation layer was supplied", {}, {},
248 DiagnosticCode::InvalidArgument, "total asset weight is invalid", {}, {}, "procgen.objectBuild"));
283 parent.y = source.getFloatAttribute(int(sourceIndex), attribute, parent.y) + topOffset_ + offsetY_;
297 RandomStream childRandom{mix(pointKey(input, sourceIndex, seed_) ^ (std::uint64_t(ruleIndex + 1) << 32U))};
329 out << "RANDOM " << transform_.minPitch << ' ' << transform_.maxPitch << ' ' << transform_.minYaw << ' '
330 << transform_.maxYaw << ' ' << transform_.minRoll << ' ' << transform_.maxRoll << ' ' << transform_.minScaleX
331 << ' ' << transform_.maxScaleX << ' ' << transform_.minScaleY << ' ' << transform_.maxScaleY << ' '
332 << transform_.minScaleZ << ' ' << transform_.maxScaleZ << ' ' << int(transform_.uniformScale) << '\n';
333 out << "ORIENTATION " << int(orient_) << ' ' << orientationCellSize_ << ' ' << orientationYawOffset_ << ' '
336 for (const auto& asset : assets_) out << "ASSET " << std::quoted(asset.id) << ' ' << asset.weight << '\n';
339 out << "CHILD " << std::quoted(child.asset) << ' ' << child.count << ' ' << child.radius << ' ' << t.minPitch
340 << ' ' << t.maxPitch << ' ' << t.minYaw << ' ' << t.maxYaw << ' ' << t.minRoll << ' ' << t.maxRoll << ' '
354 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "invalid object layer header",
371 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "invalid SEED record",
377 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "invalid OFFSET record",
383 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "invalid SCALE record",
391 DiagnosticCode::InvalidArgument, "invalid POSITION_RADIUS record", {}, {}, "procgen.objectBuild"));
397 if (!(record >> range.minPitch >> range.maxPitch >> range.minYaw >> range.maxYaw >> range.minRoll >>
401 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "invalid RANDOM record",
422 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "invalid PLACE record",
429 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "invalid ASSET record",
438 if (!(record >> std::quoted(asset) >> count >> radius >> range.minPitch >> range.maxPitch >> range.minYaw >>
442 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "invalid CHILD record",
455 DiagnosticCode::InvalidArgument, "trailing object layer record data", {}, {}, "procgen.objectBuild"));
459 DiagnosticCode::InvalidArgument, "object layer END record is missing", {}, {}, "procgen.objectBuild"));
Stable, structured diagnostics shared by engine modules.
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
const T & value() const &
Borrow the value from a const lvalue after checking success.
Definition Result.h:308
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
Deterministic TileWorldCreator-style object build layer.
Definition ObjectBuildLayer.h:37
Result< void > setOrientation(float cellSize, float yawOffset, bool invert)
Enable orientation toward the first matching N/E/S/W then diagonal orientation point.
Definition ObjectBuildLayer.cpp:179
Result< void > deserializeDefinition(std::string_view definition)
Atomically replace settings from schema version 1; unknown records are rejected.
Definition ObjectBuildLayer.cpp:348
Result< void > setRandomTransform(const ObjectTransformRange &range)
Configure independent random Euler and scale intervals for parent objects.
Definition ObjectBuildLayer.cpp:147
Result< void > addChildRule(std::string asset, int count, float radius, const ObjectTransformRange &range)
Add a child-spawn rule with its own deterministic transform stream.
Definition ObjectBuildLayer.cpp:201
Result< void > addAsset(std::string asset, float weight)
Add a weighted asset candidate. Zero and negative weights are rejected.
Definition ObjectBuildLayer.cpp:107
std::string serializeDefinition() const
Serialize all layer settings using the versioned EVPCG object-layer schema.
Definition ObjectBuildLayer.cpp:322
Result< void > setLayerScale(float x, float y, float z)
Set fixed component-wise scale multiplier. Values must be non-zero.
Definition ObjectBuildLayer.cpp:127
void setPlaceOnTop(bool enabled, bool useLowest, float topOffset) noexcept
Project output Y to surface_lowest_y or surface_highest_y, plus offset, when present.
Definition ObjectBuildLayer.cpp:195
void setLayerOffset(float x, float y, float z) noexcept
Set fixed layer translation applied after source transforms.
Definition ObjectBuildLayer.cpp:121
Result< PointSet > build(const PointSet &source, const PointSet *orientation=nullptr) const
Build attributed object points from source points.
Definition ObjectBuildLayer.cpp:236
Result< void > setRandomScale(float minX, float maxX, float minY, float maxY, float minZ, float maxZ, bool uniform)
Update only the parent scale randomization interval.
Definition ObjectBuildLayer.cpp:166
Result< void > addChild(std::string asset, int count, float radius, float minScale, float maxScale, float minYaw, float maxYaw)
Script-friendly child rule using uniform scale and yaw ranges.
Definition ObjectBuildLayer.cpp:219
Result< void > setPositionRadius(float radius)
Set circular XZ position jitter radius.
Definition ObjectBuildLayer.cpp:138
void setSeed(std::uint32_t seed) noexcept
Set the named deterministic random stream seed.
Definition ObjectBuildLayer.cpp:120
void disableOrientation() noexcept
Definition ObjectBuildLayer.cpp:193
Result< void > setRandomRotation(float minPitch, float maxPitch, float minYaw, float maxYaw, float minRoll, float maxRoll)
Update only the parent Euler randomization interval.
Definition ObjectBuildLayer.cpp:154
void reserve(std::size_t count)
Reserve point storage without changing point or attribute row counts.
Definition PointSet.cpp:60
constexpr HexDirection next(HexDirection d) noexcept
The next direction clockwise (NW wraps to NE).
Definition HexMetrics.h:76
Definition EvpackPointGraphLoader.h:12
std::uint64_t derivePointId(std::uint64_t namespaceId, std::uint64_t ordinal)
Deterministically derive a non-zero stable point identity.
Definition PointSet.cpp:469
@ InvalidArgument
@ Asset
Random transform interval used by one object build rule.
Definition ObjectBuildLayer.h:13
One deterministic sample used by script-first procedural pipelines.
Definition PointSet.h:17