载入中...
搜索中...
未找到
TerrainImporter.cpp
浏览该文件的文档.
16 for (unsigned shift = 0; shift != 32; shift += 8) bytes.push_back(static_cast<std::uint8_t>(value >> shift));
19void putFloat(std::vector<std::uint8_t>& bytes, float value) { put32(bytes, std::bit_cast<std::uint32_t>(value)); }
26Result<void> addAsset(PreparedAssetImport& output, PersistentId id, std::string type, Value::Object definition,
39 detail::sha256(std::span<const std::uint8_t>(reinterpret_cast<const std::uint8_t*>(text.data()), text.size())),
55 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain dimensions, spacing or height count is invalid",
57 const std::uint64_t heightBytes = std::uint64_t(terrain.heightsMeters.size()) * sizeof(float) + 24;
59 terrain.scatterRules.size() > limits.maximumAssets || terrain.detailPrototypes.size() > limits.maximumAssets ||
66 DiagnosticCode::ParseError, "terrain height contains a non-finite value", {}, {}, "asset.import"));
94 if (!terrain.layers.empty()) terrainDefinition["material"] = Value("asset://" + materialId.format());
95 if (!terrain.scatterRules.empty()) terrainDefinition["pcg"] = Value("asset://" + pcgId.format());
96 if (!terrain.instances.empty()) terrainDefinition["instances"] = Value("asset://" + instancesId.format());
97 auto addedTerrain = addAsset(output, terrainId, "eve.terrain", std::move(terrainDefinition), std::move(heights),
122 DiagnosticCode::InvalidArgument, "terrain layer scale is invalid", layer.name, {}, "asset.import"));
123 for (const auto* image : {&layer.diffuseAsset, &layer.normalAsset, &layer.weightAsset, &layer.maskAsset})
179 DiagnosticCode::InvalidArgument, "terrain bounds multiplier is invalid", {}, {}, "asset.import"));
181 auto added = addAsset(output, materialId, "eve.terrain-material", std::move(definition), {}, {},
195 DiagnosticCode::InvalidArgument, "terrain scatter rule is invalid", rule.id, {}, "asset.import"));
211 auto added = addAsset(output, pcgId, "eve.pcg-graph", std::move(definition), {}, {}, {"terrain", "pcg"});
224 DiagnosticCode::InvalidArgument, "terrain instance prototype is invalid", {}, {}, "asset.import"));
226 std::sqrt(instance.rotation[0] * instance.rotation[0] + instance.rotation[1] * instance.rotation[1] +
231 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain instance rotation or scale is invalid",
255 DiagnosticCode::InvalidArgument, "terrain instance blob exceeds budget", {}, {}, "asset.import"));
261 const bool validWavingGrass = std::isfinite(terrain.wavingGrassAmount) && terrain.wavingGrassAmount >= 0.f &&
268 DiagnosticCode::InvalidArgument, "terrain waving grass settings are invalid", {}, {}, "asset.import"));
280 const bool validMode = prototype.renderMode == "GrassBillboard" || prototype.renderMode == "Grass" ||
294 prototype.minWidth <= 0 || prototype.maxWidth < prototype.minWidth || prototype.minHeight <= 0 ||
295 prototype.maxHeight < prototype.minHeight || prototype.noiseSpread < 0 || prototype.density < 0 ||
298 prototype.holeEdgePadding < 0 || prototype.holeEdgePadding > 1 || prototype.resourceAsset.empty() ||
317 {"healthyColor", Value(Value::Array{Value(double(prototype.healthyColor[0])), Value(double(prototype.healthyColor[1])), Value(double(prototype.healthyColor[2])), Value(double(prototype.healthyColor[3]))})},
318 {"dryColor", Value(Value::Array{Value(double(prototype.dryColor[0])), Value(double(prototype.dryColor[1])), Value(double(prototype.dryColor[2])), Value(double(prototype.dryColor[3]))})},
332 auto added = addAsset(output, instancesId, "eve.instance-set", std::move(definition), std::move(instances),
Shared canonical terrain inputs used by Unreal and Unity adapters.
Strict allocation-free UTF-8 validation.
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
std::string format() const
Formats the ID in lower-case canonical UUID text.
Definition Identity.h:173
Id128 child(std::string_view role) const noexcept
Derives a deterministic child UUID for a hierarchical identity.
Definition Identity.h:192
void put32(std::vector< std::uint8_t > &bytes, std::uint32_t value)
Append little-endian uint32 to owned storage.
Definition GltfDecode.cpp:27
void putFloat(std::vector< std::uint8_t > &bytes, float value)
Append IEEE FLOAT to owned storage.
Definition GltfDecode.cpp:31
Definition AssetImporter.h:14
Result< PreparedAssetImport > prepareCanonicalTerrainImport(const ImportPackageIdentity &package, const CanonicalTerrainInput &terrain, std::string_view importer, const AssetImportLimits &limits)
Build eve.terrain, terrain material, PCG and instance assets from canonical input.
Definition TerrainImporter.cpp:48
std::variant< std::monostate, std::int64_t, double, std::string, bool > Value
Definition Database.h:26
StrongUuid< detail::PersistentIdTag > PersistentId
Stable instance identity for persistence, networking and process boundaries.
Definition Identity.h:254
detail::StrongUint64< detail::SchemaVersionTag > SchemaVersion
Persistent data-format version; not a runtime replacement generation.
Definition SchemaVersion.h:13
bool isValidUtf8(std::string_view text, Utf8NullPolicy nullPolicy) noexcept
Validate shortest-form UTF-8, Unicode scalar range and optional NUL exclusion.
Definition Utf8Validation.cpp:5
Parser and allocation budgets applied to untrusted importer inputs.
Definition AssetImporter.h:17
Fully parsed source terrain ready for canonical archive construction.
Definition TerrainImporter.h:78
Common stable package metadata supplied by an import transaction.
Definition AssetImporter.h:33
PersistentId packageId
Definition AssetImporter.h:34
Owning, validated source archive candidate not yet published to disk/database.
Definition AssetImporter.h:90
asset::EvaManifest manifest
Definition AssetImporter.h:91