载入中...
搜索中...
未找到
EvpackPointGraphLoader.cpp
浏览该文件的文档.
2
3#include "common/Value.h"
7
8namespace eve::asset_procgen {
9namespace {
10
11const Value* field(const Value::Object& object, std::string_view name) {
12 const auto found = object.find(std::string(name));
13 return found == object.end() ? nullptr : &found->second;
14}
15
16} // namespace
17
19 const AssetRef& graphRef, const asset::EvpackCapabilities& capabilities,
20 const procgen::SpatialData& terrain, std::uint64_t maximumDecodedBytes) const {
21 auto payload = reader_.read(graphRef, "eve.pcg-graph/1", capabilities, maximumDecodedBytes);
23 const asset::RuntimeAssetChunk* definition = nullptr;
24 const asset::RuntimeAssetChunk* plan = nullptr;
25 for (const auto& chunk : payload.value().chunks) {
26 if (chunk.kind == asset::EvpackChunkKind::Definition) {
27 if (definition)
29 DiagnosticCode::Conflict, "PCG asset has duplicate definitions", {}, {}, "asset.procgen"));
30 definition = &chunk;
31 } else if (chunk.kind == asset::EvpackChunkKind::Bulk) {
32 if (plan)
34 DiagnosticCode::Conflict, "PCG asset has duplicate execution plans", {}, {}, "asset.procgen"));
35 plan = &chunk;
36 }
37 }
38 if (!definition || !plan || plan->chunkId != 1)
40 DiagnosticCode::ParseError, "PCG definition or execution plan is missing", {}, {}, "asset.procgen"));
41 asset::RuntimeDefinitionLimits definitionLimits;
42 definitionLimits.maximumBytes = maximumDecodedBytes;
43 auto metadata = asset::decodeRuntimeDefinition(definition->bytes, definitionLimits);
44 if (!metadata) return Result<LoadedPointGraph>::failure(metadata.status());
45 const auto* root = metadata.value().getIf<Value::Object>();
46 const Value* schema = root ? field(*root, "schema") : nullptr;
47 const Value* version = root ? field(*root, "schemaVersion") : nullptr;
48 const Value* planReference = root ? field(*root, "executionPlan") : nullptr;
49 const Value* format = root ? field(*root, "executionPlanFormat") : nullptr;
50 const Value* output = root ? field(*root, "outputNode") : nullptr;
51 const Value* slotsValue = root ? field(*root, "spatialSlots") : nullptr;
52 const auto* slots = slotsValue ? slotsValue->getIf<Value::Array>() : nullptr;
53 if (!schema || !schema->isString() || schema->asString() != "eve.pcg-graph" ||
54 !version || !version->isInt64() || version->asInt() != 1 || !planReference ||
55 !planReference->isString() || planReference->asString() != "chunk:1" || !format ||
56 !format->isString() || format->asString() != "EVPCG_POINT_GRAPH/1" ||
57 !output || !output->isString() || output->asString().empty() || !slots || slots->empty())
59 Diagnostic::error(DiagnosticCode::ParseError, "PCG runtime metadata is invalid", {}, {}, "asset.procgen"));
60 auto graph = std::make_unique<procgen::PointGraph>();
61 const std::string planText(reinterpret_cast<const char*>(plan->bytes.data()), plan->bytes.size());
62 if (!graph->deserializeDefinition(planText))
64 Diagnostic::error(DiagnosticCode::ParseError, "PCG execution plan is invalid: " + graph->getError(), {}, {},
65 "asset.procgen"));
66 if (!graph->hasNode(output->asString()))
68 DiagnosticCode::ParseError, "PCG output node does not exist", "$.outputNode", {}, "asset.procgen"));
69 procgen::SpatialData terrainCopy = terrain;
70 for (std::size_t i = 0; i < slots->size(); ++i) {
71 const auto* slot = (*slots)[i].getIf<Value::Object>();
72 const Value* node = slot ? field(*slot, "node") : nullptr;
73 const Value* role = slot ? field(*slot, "role") : nullptr;
74 if (!node || !node->isString() || !role || !role->isString() ||
75 role->asString() != "terrain" ||
76 !graph->setNodeSpatial(node->asString(), &terrainCopy))
78 Diagnostic::error(DiagnosticCode::ParseError, "PCG spatial slot is invalid",
79 "$.spatialSlots[" + std::to_string(i) + "]", {}, "asset.procgen"));
80 }
81 if (!graph->validate())
83 DiagnosticCode::ParseError, "bound PCG graph is invalid: " + graph->getError(), {}, {}, "asset.procgen"));
85 {graphRef, std::move(graph), output->asString(), std::move(payload).takeValue().variant});
86}
87
88} // namespace eve::asset_procgen
Value::Object payload
int root
Definition AnimSmr.cpp:119
std::string output
std::string terrain
Runtime binding for compiled PCG assets.
std::string name
std::map< std::string, std::vector< std::string > > graph
Definition Package.cpp:59
const RoadNode * node
bool found
JSON-free versioned runtime metadata codec.
LocalPageCacheEntry slots[ShadowConfig::kLocalSlots]
Owning, renderer-independent dynamic values.
Stable asset identity backed by PersistentId.
Definition ResourceRef.h:53
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
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result success(T value)
Construct a successful result owning value.
Definition Result.h:164
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
The canonical owning dynamic value used by data-facing protocols.
Definition Value.h:31
const std::string & asString() const
Return the string payload; the caller must have checked the kind.
Definition Value.cpp:87
bool isInt64() const noexcept
Return true when this value is an Int64.
Definition Value.h:91
std::map< std::string, Value > Object
Definition Value.h:34
bool isString() const noexcept
Return true when this value is a string.
Definition Value.h:95
std::int64_t asInt() const
Return the Int64 payload; the caller must have checked the kind.
Definition Value.cpp:69
std::vector< Value > Array
Definition Value.h:33
const T * getIf() const noexcept
Return a typed pointer, or nullptr when the kind differs.
Definition Value.h:180
Result< RuntimeAssetPayload > read(const AssetRef &asset, std::string_view expectedType, const EvpackCapabilities &capabilities, std::uint64_t maximumDecodedBytes) const
Resolve, type-check, variant-select and decode a canonical runtime asset.
Result< LoadedPointGraph > load(const AssetRef &graph, const asset::EvpackCapabilities &capabilities, const procgen::SpatialData &terrain, std::uint64_t maximumDecodedBytes=64ull *1024ull *1024ull) const
Load, validate and bind every declared terrain slot transactionally.
Queryable spatial input for procedural pipelines.
Definition SpatialData.h:35
Result< Value > decodeRuntimeDefinition(std::span< const std::uint8_t > bytes, const RuntimeDefinitionLimits &limits)
Decode a bounded EVDEF\0\1 metadata tree without a JSON parser.
std::variant< std::monostate, std::int64_t, double, std::string, bool > Value
Definition Database.h:26
const EditorValue * field(const EditorValue &value, const char *name)
Actual runtime device capabilities used for variant selection.
Definition Evpack.h:92
One decoded runtime chunk with its admitted semantic metadata.
std::vector< std::uint8_t > bytes
Structural and allocation limits for untrusted EVDEF metadata.