载入中...
搜索中...
未找到
GridGraph.cpp
浏览该文件的文档.
66 std::find_if(specs().begin(), specs().end(), [id](const OperationSpec& spec) { return id == spec.id; });
74bool occupied(const Grid2D& grid, int x, int y) { return grid.getCell(x, y) != int(Semantic::Empty); }
131Result<PointSet> gridToPoints(const Grid2D& grid, int semantic, float cellSize, float originX, float originZ,
145 points.add(originX + (float(x) + 0.5f) * cellSize, 0.f, originZ + (float(y) + 0.5f) * cellSize);
164 if (id.empty()) return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "node id is empty", {}, {}, "procgen.gridGraph"));
165 if (!specFor(operation)) return Result<void>::failure(Diagnostic::error(DiagnosticCode::NotFound, "unknown operation: " + operation, id, {}, "procgen.gridGraph"));
166 if (nodes_.contains(id)) return Result<void>::failure(Diagnostic::error(DiagnosticCode::Conflict, "duplicate node id: " + id, id, {}, "procgen.gridGraph"));
176Result<void> GridGraph::connect(std::string_view fromId, std::string_view toId, int inputIndex) {
180 return Result<void>::failure(Diagnostic::error(DiagnosticCode::NotFound, "connection references an unknown node", std::string(toId), {}, "procgen.gridGraph"));
183 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "input slot is outside the operation contract", std::string(toId), {}, "procgen.gridGraph"));
187 to->second.operation == "point.subgraph" ? GridGraphValueType::PointSet : GridGraphValueType::Grid;
189 return Result<void>::failure(Diagnostic::error(DiagnosticCode::TypeMismatch, "typed graph ports are incompatible", std::string(toId), {}, "procgen.gridGraph"));
198 if (found == nodes_.end()) return Result<void>::failure(Diagnostic::error(DiagnosticCode::NotFound, "unknown node", std::string(id), {}, "procgen.gridGraph"));
200 return Result<void>::failure(Diagnostic::error(DiagnosticCode::TypeMismatch, "node is not a grid.input", std::string(id), {}, "procgen.gridGraph"));
210 if (found == nodes_.end()) return Result<void>::failure(Diagnostic::error(DiagnosticCode::NotFound, "unknown node", std::string(id), {}, "procgen.gridGraph"));
212 found->second.operation.starts_with("generate.") || found->second.operation.starts_with("select.") ||
214 ((found->second.operation == "grid.expand" || found->second.operation == "grid.shrink") && key == "radius") ||
216 ((found->second.operation == "grid.invert" || found->second.operation == "convert.grid_to_points") &&
219 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "unknown integer parameter: " + key, std::string(id), {}, "procgen.gridGraph"));
228 if (found == nodes_.end()) return Result<void>::failure(Diagnostic::error(DiagnosticCode::NotFound, "unknown node", std::string(id), {}, "procgen.gridGraph"));
229 if (!found->second.operation.starts_with("generate.") && !found->second.operation.starts_with("select.") &&
232 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "unknown float parameter: " + key, std::string(id), {}, "procgen.gridGraph"));
241 if (found == nodes_.end()) return Result<void>::failure(Diagnostic::error(DiagnosticCode::NotFound, "unknown node", std::string(id), {}, "procgen.gridGraph"));
245 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "unknown string parameter: " + key, std::string(id), {}, "procgen.gridGraph"));
252Result<void> GridGraph::setNodePointSubgraph(std::string_view id, const PointGraph& graph, std::string inputNode,
255 if (found == nodes_.end()) return Result<void>::failure(Diagnostic::error(DiagnosticCode::NotFound, "unknown node", std::string(id), {}, "procgen.gridGraph"));
257 return Result<void>::failure(Diagnostic::error(DiagnosticCode::TypeMismatch, "node is not a point.subgraph", std::string(id), {}, "procgen.gridGraph"));
259 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "subgraph ports must be non-empty", std::string(id), {}, "procgen.gridGraph"));
268ResultRef<const GridGraphValue> GridGraph::evaluate(std::string_view id, std::unordered_map<std::string, int>& states) {
272 Diagnostic::error(DiagnosticCode::NotFound, "unknown node", std::string(id), {}, "procgen.gridGraph"));
277 Diagnostic::error(DiagnosticCode::Conflict, "graph contains a cycle", node.id, {}, "procgen.gridGraph"));
299 DiagnosticCode::InvalidArgument, "generate.registry requires a non-empty algorithm parameter", node.id,
314 Diagnostic::error(DiagnosticCode::NotFound, "registered generator was not found: " + algorithm->second,
327 settings.semantic = node.ints.contains("semantic") ? node.ints["semantic"] : int(Semantic::Floor);
344 const int semantic = node.ints.contains("semantic") ? node.ints["semantic"] : int(Semantic::Floor);
375 auto selected = gridgraph::select(*source, node.operation, node.ints.contains("mode") ? node.ints["mode"] : 0,
399 Diagnostic::error(DiagnosticCode::TypeMismatch, "grid inputs must have equal dimensions", node.id, {},
408 const int semantic = node.ints.contains("semantic") ? node.ints["semantic"] : int(Semantic::Floor);
452 auto points = gridToPoints(*source, node.ints.contains("semantic") ? node.ints["semantic"] : -1,
462 Diagnostic::error(DiagnosticCode::TypeMismatch, "bound PointGraph and PointSet input required", node.id,
467 Diagnostic::error(DiagnosticCode::InvalidArgument, "nested PointGraph input binding failed", node.id,
489 if (found == nodes_.end()) return Result<void>::failure(Diagnostic::error(DiagnosticCode::NotFound, "unknown node", std::string(id), {}, "procgen.gridGraph"));
491 return Result<void>::failure(Diagnostic::error(DiagnosticCode::Conflict, "graph contains a cycle", found->first, {}, "procgen.gridGraph"));
497 return Result<void>::failure(Diagnostic::error(DiagnosticCode::NotFound, "required input is disconnected", found->first, {}, "procgen.gridGraph"));
502 return Result<void>::failure(Diagnostic::error(DiagnosticCode::NotFound, "grid.input has no bound value", found->first, {}, "procgen.gridGraph"));
506 return Result<void>::failure(Diagnostic::error(DiagnosticCode::NotFound, "point.subgraph has no complete binding", found->first, {}, "procgen.gridGraph"));
543 DiagnosticCode::NotFound, "unknown operation: " + std::string(operation), {}, {}, "procgen.gridGraph"));
557 out << "INT " << std::quoted(id) << ' ' << std::quoted(key) << ' ' << node.ints.at(key) << '\n';
562 out << "FLOAT " << std::quoted(id) << ' ' << std::quoted(key) << ' ' << node.floats.at(key) << '\n';
567 out << "STRING " << std::quoted(id) << ' ' << std::quoted(key) << ' ' << std::quoted(node.strings.at(key))
586 return Result<void>::failure(Diagnostic::error(DiagnosticCode::ParseError, "invalid grid graph header", {}, {}, "procgen.gridGraph"));
603 return Result<void>::failure(Diagnostic::error(DiagnosticCode::ParseError, "invalid NODE record", {}, {}, "procgen.gridGraph"));
610 return Result<void>::failure(Diagnostic::error(DiagnosticCode::ParseError, "invalid EDGE record", {}, {}, "procgen.gridGraph"));
617 return Result<void>::failure(Diagnostic::error(DiagnosticCode::ParseError, "invalid INT record", {}, {}, "procgen.gridGraph"));
624 return Result<void>::failure(Diagnostic::error(DiagnosticCode::ParseError, "invalid FLOAT record", {}, {}, "procgen.gridGraph"));
631 return Result<void>::failure(Diagnostic::error(DiagnosticCode::ParseError, "invalid STRING record", {}, {}, "procgen.gridGraph"));
635 return Result<void>::failure(Diagnostic::error(DiagnosticCode::ParseError, "unknown grid graph record: " + kind, {}, {}, "procgen.gridGraph"));
638 if (!record.eof()) return Result<void>::failure(Diagnostic::error(DiagnosticCode::ParseError, "trailing grid graph record data", {}, {}, "procgen.gridGraph"));
640 if (!ended) return Result<void>::failure(Diagnostic::error(DiagnosticCode::ParseError, "grid graph END record is missing", {}, {}, "procgen.gridGraph"));
644 if (states[id] == 1) return Result<void>::failure(Diagnostic::error(DiagnosticCode::Conflict, "cycle in serialized graph", id, {}, "procgen.gridGraph"));
647 if (found == replacement.nodes_.end()) return Result<void>::failure(Diagnostic::error(DiagnosticCode::NotFound, "unknown node", id, {}, "procgen.gridGraph"));
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
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
static GeneratorRegistry & instance()
Return the process-wide generator registry.
Definition GeneratorRegistry.cpp:6
Intermediate 2D generation result. cells store semantic ids (see Semantic.h), not tile GIDs — convert...
Definition Grid2D.h:36
Deterministic data-flow graph for grid generation and explicit grid-to-point composition.
Definition GridGraph.h:35
Result< void > setNodeFloat(std::string_view id, std::string key, float value)
Set one floating-point parameter declared by the node operation.
Definition GridGraph.cpp:226
Result< GridGraphValue > execute(std::string_view outputId)
Validate and evaluate one output into an independent owning value.
Definition GridGraph.cpp:478
std::string serializeDefinition() const
Serialize topology and scalar parameters using the versioned EVPCG grid schema.
Definition GridGraph.cpp:547
static std::string operationId(int index)
Return a reflected operation id, or empty for an invalid index.
Definition GridGraph.cpp:535
static Result< GridGraphValueType > operationOutputType(std::string_view operation)
Return a reflected operation's output kind.
Definition GridGraph.cpp:539
Result< void > deserializeDefinition(std::string_view definition)
Atomically replace this graph from a versioned definition.
Definition GridGraph.cpp:580
Result< void > connect(std::string_view fromId, std::string_view toId, int inputIndex=0)
Connect one node output to a typed input slot.
Definition GridGraph.cpp:176
void clearCache()
Remove all cached node values while retaining topology and parameters.
Definition GridGraph.cpp:513
Result< void > setNodeGrid(std::string_view id, const Grid2D &grid)
Assign an owning copy to a grid.input node.
Definition GridGraph.cpp:196
Result< void > addNode(std::string id, std::string operation)
Add a reflected operation under a stable, non-empty node id.
Definition GridGraph.cpp:163
Result< void > setNodePointSubgraph(std::string_view id, const PointGraph &graph, std::string inputNode, std::string outputNode)
Bind an owning PointGraph copy to a point.subgraph bridge.
Definition GridGraph.cpp:252
Result< void > setNodeString(std::string_view id, std::string key, std::string value)
Set one string parameter declared by the node operation.
Definition GridGraph.cpp:239
Result< void > validate(std::string_view outputId) const
Validate topology, required inputs and cross-graph bindings without evaluating values.
Definition GridGraph.cpp:485
Result< void > setNodeInt(std::string_view id, std::string key, int value)
Set one integer parameter declared by the node operation.
Definition GridGraph.cpp:208
@ PointSet
Result< Grid2D > findPath(const Grid2D &navigation, const Grid2D &starts, const Grid2D &targets, int semantic)
Finds path.
Definition GridGraphAlgorithms.cpp:294
Result< Grid2D > generate(std::string_view operation, const GenerateSettings &settings)
Generate.
Definition GridGraphAlgorithms.cpp:154
Result< Grid2D > select(const Grid2D &input, std::string_view operation, int mode, int count, float weight, std::uint64_t seed, std::string_view rule)
Select.
Definition GridGraphAlgorithms.cpp:216
Definition EvpackPointGraphLoader.h:12
eve::Result< void > autotileOccupiedGridInPlace(Grid2D &grid)
Write an eight-neighbour occupancy mask into every non-empty cell's detail value.
Definition RoguelikeGenerator.cpp:737
std::uint64_t derivePointId(std::uint64_t namespaceId, std::uint64_t ordinal)
Deterministically derive a non-zero stable point identity.
Definition PointSet.cpp:469
WidgetDesc grid(int columns, std::vector< WidgetDesc > children, std::string id)
Fixed-column grid; children are placed in source order.
Definition Widget.cpp:687
@ InvalidArgument
@ TypeMismatch
A stable reference resolved to a different canonical domain type.
@ NotFound
@ Failed
@ ParseError
@ Conflict
Definition Container.h:602