载入中...
搜索中...
未找到
PointGraphExecution.cpp
浏览该文件的文档.
28EV_POINTGRAPH_NOINLINE ResultRef<const PointSet> nodeFailure(DiagnosticCode code, const std::string& id,
34EV_POINTGRAPH_NOINLINE Result<OptionalRef<const PointSet>> segmentFailure(DiagnosticCode code, const std::string& id,
42 std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::steady_clock::now().time_since_epoch())
46PointGraphNodeMetric makeMetric(const std::string& id, const PointSet& points, float milliseconds, bool cacheHit,
81 spatial.getKind() == "surface.heightfield" ? uint64_t(1) : axisCount(spatial.getMinY(), spatial.getMaxY());
91ResultRef<const PointSet> PointGraph::evaluate(const std::string& id, std::unordered_map<std::string, int>& states) {
135 return nodeFailure(DiagnosticCode::Cancelled, id, "execution node budget exceeded at node: " + id);
148 return nodeFailure(DiagnosticCode::InvalidArgument, id, node.operation + " requires binding: " + id);
161 return nodeFailure(DiagnosticCode::InvalidArgument, id, "get.landscape requires surface.heightfield binding: " + id);
163 return nodeFailure(DiagnosticCode::InvalidArgument, id, "get.spline requires spline binding: " + id);
166 return nodeFailure(DiagnosticCode::InvalidArgument, id, node.operation + " exceeds node point budget at node: " + id);
176 return nodeFailure(DiagnosticCode::InvalidArgument, id, "mesh.sample requires surface.mesh spatial data: " + id);
179 return nodeFailure(DiagnosticCode::InvalidArgument, id, "mesh.sample exceeds node point budget at node: " + id);
188 return nodeFailure(DiagnosticCode::InvalidArgument, id, "grid.sample requires positive width, depth, and spacing: " + id);
191 return nodeFailure(DiagnosticCode::InvalidArgument, id, "grid.sample exceeds node point budget at node: " + id);
205 return nodeFailure(DiagnosticCode::InvalidArgument, id, "poisson.sample requires non-negative width/depth/maxPoints and positive radius: " + id);
207 return nodeFailure(DiagnosticCode::InvalidArgument, id, "poisson.sample exceeds node point budget at node: " + id);
208 node.cache = poissonDiskPoints(width, depth, radius, uint32_t(intValue(node, "seed", 1)), maxPoints);
217 return nodeFailure(DiagnosticCode::InvalidArgument, id, "spatial.filter requires input and spatial data: " + id);
223 return nodeFailure(DiagnosticCode::InvalidArgument, id, "spatial.project requires input and spatial data: " + id);
229 return nodeFailure(DiagnosticCode::InvalidArgument, id, "spline.sample requires control points: " + id);
231 return nodeFailure(DiagnosticCode::InvalidArgument, id, "spline.sample spacing must be positive: " + id);
233 return nodeFailure(DiagnosticCode::InvalidArgument, id, "spline.sample needs at least two control points: " + id);
239 return nodeFailure(DiagnosticCode::InvalidArgument, id, "spline.filter.distance requires points and control inputs: " + id);
241 return nodeFailure(DiagnosticCode::InvalidArgument, id, "spline.filter.distance needs at least two control points: " + id);
243 node.cache = filterPointsBySplineDistance(*first, *second, floatValue(node, "minDistance", 0.f),
248 return nodeFailure(DiagnosticCode::InvalidArgument, id, "biome.generate requires spatial data and biome rules: " + id);
251 return nodeFailure(DiagnosticCode::InvalidArgument, id, "biome.generate exceeds node point budget at node: " + id);
254 node.spatial.get(), spacing, uint32_t(intValue(node, "seed", 1)), floatValue(node, "jitter", 0.f)));
256 return nodeFailure(DiagnosticCode::Failed, id, "biome.generate failed at " + id + ": " + node.biomeRules->getError());
262 return nodeFailure(DiagnosticCode::InvalidArgument, id, "grammar.generate requires input and shape grammar: " + id);
265 stringValue(node, "grammar"), const_cast<PointSet*>(first), uint32_t(intValue(node, "seed", 1)),
268 return nodeFailure(DiagnosticCode::Failed, id, "grammar.generate failed at " + id + ": " + node.shapeGrammar->getError());
273 const uint64_t outputCount = first && second ? uint64_t(first->getCount()) + uint64_t(second->getCount()) : 0;
277 return nodeFailure(DiagnosticCode::InvalidArgument, id, "merge exceeds node point budget at node: " + id);
283 return nodeFailure(DiagnosticCode::InvalidArgument, id, node.operation + " requires two inputs: " + id);
292 const uint64_t outputCount = first && second ? uint64_t(first->getCount()) * uint64_t(second->getCount()) : 0;
294 return nodeFailure(DiagnosticCode::InvalidArgument, id, "copy.points requires source and target inputs: " + id);
296 return nodeFailure(DiagnosticCode::InvalidArgument, id, "copy.points output exceeds maxPoints at node: " + id);
298 return nodeFailure(DiagnosticCode::InvalidArgument, id, "copy.points exceeds node point budget at node: " + id);
300 node.cache = copyPointsToTargets(*first, *second, intValue(node, "inheritTargetAttributes", 1) != 0);
307 return nodeFailure(DiagnosticCode::InvalidArgument, id, "density.remap requires a non-zero input range: " + id);
313 return nodeFailure(DiagnosticCode::InvalidArgument, id, "density.from.normal requires input: " + id);
316 densityFromNormal(*first, floatValue(node, "minDegrees", 0.f), floatValue(node, "maxDegrees", 90.f),
321 return nodeFailure(DiagnosticCode::InvalidArgument, id, node.operation + " requires input: " + id);
327 return nodeFailure(DiagnosticCode::InvalidArgument, id, "landscape.sample requires surface.heightfield: " + id);
329 return nodeFailure(DiagnosticCode::InvalidArgument, id, "texture.sample requires volume.texture_mask: " + id);
333 return nodeFailure(DiagnosticCode::InvalidArgument, id, node.operation + " has unknown float channel at node: " + id);
335 if (node.operation == "landscape.sample" && intValue(node, "project", 0) != 0) source = spatial->project(source);
336 node.cache = sampleSpatialOntoChannel(source, *spatial, attribute, floatValue(node, "inputMin", 0.f),
346 const bool operationKnown = operation == "add" || operation == "subtract" || operation == "multiply" ||
349 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.math.float requires input: " + id);
351 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.math.float requires an attribute: " + id);
353 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.math.float has unknown float channel at node: " + id);
355 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.math.float has invalid operation at node: " + id);
357 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.math.float cannot divide by zero at node: " + id);
367 (computePolicy_ == "gpu" || (computePolicy_ == "auto" && first->getCount() >= computeMinimumPoints_));
370 pointCompute_->transform(*first, node.cache, floatValue(node, "x", 0.f), floatValue(node, "y", 0.f),
400 node.cache = filterPointFloatAttribute(*first, stringValue(node, "attribute"), floatValue(node, "min", 0.f),
406 node.cache = filterPointStringAttribute(*first, stringValue(node, "attribute"), stringValue(node, "value"),
413 filterPointSlope(*first, floatValue(node, "minDegrees", 0.f), floatValue(node, "maxDegrees", 90.f));
416 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.set.float requires input: " + id);
421 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.set.float requires attribute: " + id);
433 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.set.string requires input: " + id);
438 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.set.string requires attribute: " + id);
445 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.set.int requires input: " + id);
449 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.set.int requires attribute: " + id);
454 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.set.bool requires input: " + id);
458 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.set.bool requires attribute: " + id);
463 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.set.vector requires input: " + id);
467 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.set.vector requires attribute: " + id);
473 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.copy requires input: " + id);
475 auto copied = copyPointAttribute(*first, stringValue(node, "source"), stringValue(node, "target"));
476 if (!copied.ok()) return ResultRef<const PointSet>::failure(nestedFailure(id, copied.status()));
481 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.rename requires input: " + id);
483 auto renamed = renamePointAttribute(*first, stringValue(node, "from"), stringValue(node, "to"));
484 if (!renamed.ok()) return ResultRef<const PointSet>::failure(nestedFailure(id, renamed.status()));
489 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.delete requires input: " + id);
492 if (!deleted.ok()) return ResultRef<const PointSet>::failure(nestedFailure(id, deleted.status()));
497 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.transfer requires two inputs: " + id);
508 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.compare.float requires input: " + id);
514 if (!compared.ok()) return ResultRef<const PointSet>::failure(nestedFailure(id, compared.status()));
519 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.select.float requires input: " + id);
525 if (!selected.ok()) return ResultRef<const PointSet>::failure(nestedFailure(id, selected.status()));
532 node.cache = filterPointIntAttribute(*first, stringValue(node, "attribute"), intValue(node, "min", 0),
543 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.partition requires input: " + id);
547 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.partition requires attribute: " + id);
548 node.cache = partitionPointAttribute(*first, attribute, stringValue(node, "outputAttribute", "partition"),
553 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.noise.float requires input: " + id);
562 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.math.int requires input: " + id);
566 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.math.int requires attribute: " + id);
573 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.math.vector requires input: " + id);
577 return nodeFailure(DiagnosticCode::InvalidArgument, id, "attribute.math.vector requires attribute: " + id);
579 *first, attribute, stringValue(node, "outputAttribute"), stringValue(node, "operation", "scale"),
580 floatValue(node, "operandX", 1.f), floatValue(node, "operandY", 1.f), floatValue(node, "operandZ", 1.f),
581 floatValue(node, "defaultX", 0.f), floatValue(node, "defaultY", 0.f), floatValue(node, "defaultZ", 0.f));
583 } else if (node.operation == "attribute.set.data.float" || node.operation == "attribute.set.data.int" ||
586 return nodeFailure(DiagnosticCode::InvalidArgument, id, node.operation + " requires input: " + id);
591 return nodeFailure(DiagnosticCode::InvalidArgument, id, node.operation + " requires attribute: " + id);
608 return nodeFailure(DiagnosticCode::InvalidArgument, id, "spawn.mesh requires attribute: " + id);
617 return nodeFailure(DiagnosticCode::InvalidArgument, id, "spawn.mesh requires at least one weighted mesh: " + id);
618 node.cache = assignWeightedMeshAttribute(*first, uint32_t(intValue(node, "seed", 1)), attribute, meshes,
626 densityCullPoints(*first, uint32_t(intValue(node, "seed", 1)), floatValue(node, "multiplier", 1.f));
636 node.cache = jitterPointPositions(*first, uint32_t(intValue(node, "seed", 1)), floatValue(node, "x", 0.f),
653 return nodeFailure(DiagnosticCode::InvalidArgument, id, "branch requires both selected inputs: " + id);
658 return nodeFailure(DiagnosticCode::InvalidArgument, id, "subgraph requires input and graph: " + id);
664 return nodeFailure(DiagnosticCode::InvalidArgument, id, "subgraph input is invalid: " + node.subgraphInput);
667 if (!result.ok()) return ResultRef<const PointSet>::failure(nestedFailure(id, result.status()));
675 return nodeFailure(DiagnosticCode::InvalidArgument, id, node.operation + " exceeds node point budget at node: " + id);
705 (computePolicy_ == "gpu" || (computePolicy_ == "auto" && input->getCount() >= computeMinimumPoints_));
709 return segmentFailure(DiagnosticCode::Cancelled, id, "execution node budget exceeded at node: " + id);
750Result<void> PointGraph::validateNode(const std::string& id, std::unordered_map<std::string, int>& states) const {
753 return Result<void>::failure(Diagnostic::error(DiagnosticCode::Conflict, "cycle at node: " + id, id, {}, "procgen.pointGraph"));
757 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "invalid node: " + id, id, {}, "procgen.pointGraph"));
768 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "input node has no points: " + id, id, {}, "procgen.pointGraph"));
771 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, node.operation + " requires binding: " + id, id, {}, "procgen.pointGraph"));
782 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "get.landscape requires surface.heightfield binding: " + id, id, {}, "procgen.pointGraph"));
784 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "get.spline requires spline binding: " + id, id, {}, "procgen.pointGraph"));
786 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "mesh.sample requires surface.mesh spatial data: " + id, id, {}, "procgen.pointGraph"));
787 if (node.operation == "landscape.sample" && spatial.value()->getKind() != "surface.heightfield")
788 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "landscape.sample requires surface.heightfield: " + id, id, {}, "procgen.pointGraph"));
790 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "texture.sample requires volume.texture_mask: " + id, id, {}, "procgen.pointGraph"));
794 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "grid.sample requires positive width, depth, and spacing: " + id, id, {}, "procgen.pointGraph"));
798 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "poisson.sample requires non-negative width/depth/maxPoints and positive radius: " + id, id, {}, "procgen.pointGraph"));
801 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "node has no biome rules: " + id, id, {}, "procgen.pointGraph"));
803 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "node has no shape grammar: " + id, id, {}, "procgen.pointGraph"));
805 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "subgraph is not configured: " + id, id, {}, "procgen.pointGraph"));
810 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "invalid subgraph input: " + node.subgraphInput, id, {}, "procgen.pointGraph"));
817 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, node.operation + " requires input " + std::to_string(index) + ": " + id, id, {}, "procgen.pointGraph"));
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
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
static int getOperationInputCount(const std::string &operation)
Returns the operation input count.
Definition PointGraph.cpp:735
@ PointSet
Definition EvpackPointGraphLoader.h:12
PointSet samplePolylinePoints(const PointSet &controlPoints, float spacing, uint32_t seed, float lateralJitter)
Sample polyline points.
Definition PointSet.cpp:757
PointSet densityFromNormal(const PointSet &input, float minDegrees, float maxDegrees, float outputMin, float outputMax, bool invert)
Remap surface slope (from normals) into density.
Definition PointSet.cpp:1070
PointSet filterPointStringAttribute(const PointSet &input, const std::string &name, const std::string &value, bool invert)
Select points whose named string attribute equals a value.
Definition PointSet.cpp:1047
Result< PointSet > deletePointAttribute(const PointSet &input, const std::string &name)
Delete one metadata column.
Definition PointSetAttributeOps.cpp:383
PointSet mathPointIntAttribute(const PointSet &input, const std::string &attribute, const std::string &outputAttribute, const std::string &operation, std::int64_t operand, std::int64_t defaultValue)
Apply integer math to an int metadata column.
Definition PointSetAttributeOps.cpp:686
bool isPointFloatChannel(std::string_view name) noexcept
Return whether name is a valid float channel (builtin selector or metadata name).
Definition PointSetAttributeOps.cpp:78
PointSet unionPointSets(const PointSet &first, const PointSet &second)
Stable union by non-zero point id, with legacy position-and-seed fallback.
Definition PointSet.cpp:852
PointSet transformPointSet(const PointSet &input, float translateX, float translateY, float translateZ, float yawDegrees, float scaleX, float scaleY, float scaleZ)
Apply translation, yaw rotation and non-uniform scale to points and their transforms.
Definition PointSet.cpp:886
PointSet filterPointIntAttribute(const PointSet &input, const std::string &name, std::int64_t minValue, std::int64_t maxValue, bool invert)
Select points whose named int attribute lies in an inclusive range.
Definition PointSetAttributeOps.cpp:317
Result< PointSet > copyPointAttribute(const PointSet &input, const std::string &source, const std::string &target)
Copy one float channel or typed metadata column onto another name.
Definition PointSetAttributeOps.cpp:339
EVENGINE_API_DOMAINS Result< void > setPointDataFloatAttribute(PointSet &points, const std::string &attribute, float value)
Write a float into the PointSet @Data domain.
Definition PointSetAttributeOps.cpp:604
Result< PointSet > selectPointFloatAttribute(const PointSet &input, const std::string &conditionAttribute, const std::string &trueAttribute, const std::string &falseAttribute, const std::string &outputAttribute, float trueDefault, float falseDefault)
Select between two float channels using a bool metadata condition.
Definition PointSetAttributeOps.cpp:571
PointSet filterPointSlope(const PointSet &input, float minDegrees, float maxDegrees)
Filter point slope.
Definition PointSet.cpp:621
PointSet assignWeightedMeshAttribute(const PointSet &input, uint32_t seed, const std::string &attribute, const std::string *meshes, const float *weights, int entryCount)
Deterministically assign a weighted mesh path string attribute.
Definition PointSet.cpp:1122
EVENGINE_API_DOMAINS PointSet noisePointFloatAttribute(const PointSet &input, const std::string &attribute, uint32_t seed, float frequency, float amplitude, float offset)
Write deterministic float noise into a metadata attribute.
Definition PointSetAttributeOps.cpp:674
PointSet mathPointFloatAttribute(const PointSet &input, const std::string &attribute, const std::string &outputAttribute, const std::string &operation, float operand, float defaultValue)
Apply one scalar operation to a float metadata attribute or $ selector.
Definition PointSetAttributeOps.cpp:273
PointSet poissonDiskPoints(int width, int depth, float radius, uint32_t seed, int maxPoints)
Bridson blue-noise (Poisson disk) samples in a width x depth area (XZ, y=0).
Definition PointSet.cpp:502
PointSet filterPointsBySplineDistance(const PointSet &input, const PointSet &controlPoints, float minDistance, float maxDistance)
Filter points by spline distance.
Definition PointSet.cpp:649
EVENGINE_API_DOMAINS PointSet filterPointFloatAttribute(const PointSet &input, const std::string &name, float minValue, float maxValue, bool invert)
Select points whose named float attribute or $ selector lies in an inclusive range.
Definition PointSetAttributeOps.cpp:298
PointSet mathPointVectorAttribute(const PointSet &input, const std::string &attribute, const std::string &outputAttribute, const std::string &operation, float operandX, float operandY, float operandZ, float defaultX, float defaultY, float defaultZ)
Apply vector math to a vector metadata column.
Definition PointSetAttributeOps.cpp:706
PointSet setPointIntAttribute(const PointSet &input, const std::string &attribute, std::int64_t value)
Write a constant int metadata column on every point.
Definition PointSetAttributeOps.cpp:513
EVENGINE_API_DOMAINS PointSet partitionPointAttribute(const PointSet &input, const std::string &attribute, const std::string &outputAttribute, const std::string &mode)
Assign partition indices from a string/int attribute (mode: value|hash).
Definition PointSetAttributeOps.cpp:628
Result< void > setPointDataStringAttribute(PointSet &points, const std::string &attribute, const std::string &value)
Write a string into the PointSet @Data domain.
Definition PointSetAttributeOps.cpp:620
Result< void > setPointDataIntAttribute(PointSet &points, const std::string &attribute, std::int64_t value)
Write an int into the PointSet @Data domain.
Definition PointSetAttributeOps.cpp:612
PointSet intersectPointSets(const PointSet &first, const PointSet &second)
Keep first-set points whose stable or legacy identity occurs in the second set.
Definition PointSet.cpp:864
PointSet sampleSpatialOntoChannel(const PointSet &input, const SpatialData &spatial, std::string_view channel, float inputMin, float inputMax, float outputMin, float outputMax, bool clampOutput, bool invert)
Remap SpatialData::sampleScalar onto a float channel ($Density or metadata). When inputMin equals inp...
Definition SpatialData.cpp:395
PointSet mergePointSets(const PointSet &first, const PointSet &second)
Concatenate two attributed point collections while preserving order.
Definition PointSet.cpp:795
Result< void > writePointFloatChannel(PointSet &points, int index, std::string_view name, float value)
Write a float metadata column or closed $ point-field selector.
Definition PointSetAttributeOps.cpp:148
PointSet copyPointsToTargets(const PointSet &source, const PointSet &targets, bool inheritTargetAttributes)
Instantiate source points relative to targets in stable target-major order.
Definition PointSet.cpp:926
PointSet selfPrunePoints(const PointSet &input, float radius)
Self prune points.
Definition PointSet.cpp:737
PointSet modifyPointBounds(const PointSet &input, float scaleX, float scaleY, float scaleZ, float padX, float padY, float padZ)
Scale and pad each point's local bounds about its center.
Definition PointSet.cpp:1089
PointSet densityCullPoints(const PointSet &input, uint32_t seed, float multiplier)
Deterministically keep points according to density and a root seed.
Definition PointSet.cpp:1058
Result< PointSet > transferPointAttribute(const PointSet &target, const PointSet &source, const std::string &attribute, const std::string &outputAttribute, const std::string &mode)
Transfer one attribute from source onto target points.
Definition PointSetAttributeOps.cpp:390
PointSet differencePointSets(const PointSet &first, const PointSet &second)
Remove first-set points whose stable or legacy identity occurs in the second set.
Definition PointSet.cpp:875
PointSet setPointVectorAttribute(const PointSet &input, const std::string &attribute, float x, float y, float z)
Write a constant vector metadata column on every point.
Definition PointSetAttributeOps.cpp:527
PointSet setPointBoolAttribute(const PointSet &input, const std::string &attribute, bool value)
Write a constant bool metadata column on every point.
Definition PointSetAttributeOps.cpp:520
PointSet jitterPointPositions(const PointSet &input, uint32_t seed, float amountX, float amountZ)
Jitter point positions.
Definition PointSet.cpp:724
PointSet remapPointDensity(const PointSet &input, float inputMin, float inputMax, float outputMin, float outputMax, bool clampOutput)
Linearly remap point density between ranges with optional output clamping.
Definition PointSet.cpp:1033
PointSet sampleGridPoints(int width, int depth, float spacing, uint32_t seed, float jitter)
Sample grid points.
Definition PointSet.cpp:480
Result< PointSet > renamePointAttribute(const PointSet &input, const std::string &from, const std::string &to)
Rename one metadata column.
Definition PointSetAttributeOps.cpp:376
Result< PointSet > comparePointFloatAttribute(const PointSet &input, const std::string &attribute, const std::string &comparison, float operand, const std::string &outputAttribute, float defaultValue)
Compare a float channel against an operand and write a bool metadata column.
Definition PointSetAttributeOps.cpp:534
PointSet filterPointBoolAttribute(const PointSet &input, const std::string &name, bool value, bool invert)
Select points whose named bool attribute equals a value.
Definition PointSetAttributeOps.cpp:329
@ InvalidArgument
@ NotFound
@ Cancelled
@ Failed
@ Conflict