载入中...
搜索中...
未找到
LegacyAnimationImporter.cpp
浏览该文件的文档.
40 for (unsigned shift = 0; shift < 32; shift += 8) out.push_back(static_cast<std::uint8_t>(value >> shift));
42void putFloat(std::vector<std::uint8_t>& out, float value) { put32(out, std::bit_cast<std::uint32_t>(value)); }
59 DiagnosticCode::InvalidArgument, "animation fixture exceeds source budget", {}, {}, "asset.import"));
86 Diagnostic::error(DiagnosticCode::ParseError, "invalid skeleton count", path, {}, "asset.import"));
98 Diagnostic::error(DiagnosticCode::ParseError, "invalid bone hierarchy", path, {}, "asset.import"));
110 Diagnostic::error(DiagnosticCode::ParseError, "invalid bind transform", path, {}, "asset.import"));
118 if (!(line >> result.duration) || !complete(line) || !finite(result.duration) || result.duration < 0)
120 Diagnostic::error(DiagnosticCode::ParseError, "invalid clip duration", path, {}, "asset.import"));
124 Diagnostic::error(DiagnosticCode::ParseError, "invalid sample rate", path, {}, "asset.import"));
135 Diagnostic::error(DiagnosticCode::ParseError, "invalid sync marker", path, {}, "asset.import"));
146 if (!(line >> value.bone >> value.expectedPosition >> value.expectedRotation >> value.expectedScale) ||
149 Diagnostic::error(DiagnosticCode::ParseError, "invalid track header", path, {}, "asset.import"));
157 !complete(line) || !finite(key.time) || !finite(key.value[0]) || !finite(key.value[1]) || !finite(key.value[2]))
163 if (!track || !(line >> key.time >> key.value[0] >> key.value[1] >> key.value[2] >> key.value[3]) ||
167 Diagnostic::error(DiagnosticCode::ParseError, "invalid rotation key", path, {}, "asset.import"));
179 if (!magic || !ended || result.bones.size() != declaredBones || result.clipName.empty() || result.rate <= 0)
181 Diagnostic::error(DiagnosticCode::ParseError, "animation fixture is incomplete", {}, {}, "asset.import"));
185 Diagnostic::error(DiagnosticCode::ParseError, "bone bind is missing", bone.name, {}, "asset.import"));
187 if (value.position.size() != value.expectedPosition || value.rotation.size() != value.expectedRotation ||
190 DiagnosticCode::ParseError, "track key count does not match declaration", {}, {}, "asset.import"));
205 DiagnosticCode::Conflict, "tracks must be unique and key times canonical", {}, {}, "asset.import"));
210 DiagnosticCode::InvalidArgument, "animation key data exceeds decoded budget", {}, {}, "asset.import"));
218Result<PreparedAssetImport> prepareLegacyAnimationImport(const LegacyAnimationImportRequest& request) {
234 put32(skeletonBlob, static_cast<std::uint32_t>(bone.parent)); putString(skeletonBlob, bone.name);
242 putFloat(clipBlob, fixture.duration); putFloat(clipBlob, fixture.rate); put32(clipBlob, fixture.loop ? 1 : 0);
245 for (const auto& marker : fixture.markers) { putFloat(clipBlob, marker.time); putString(clipBlob, marker.name); }
251 for (auto key : track.position) { putFloat(clipBlob, key.time); putFloat(clipBlob, key.value[0] * .01f); putFloat(clipBlob, key.value[1] * .01f); putFloat(clipBlob, -key.value[2] * .01f); }
252 for (auto key : track.rotation) { putFloat(clipBlob, key.time); putFloat(clipBlob, -key.value[0]); putFloat(clipBlob, -key.value[1]); putFloat(clipBlob, key.value[2]); putFloat(clipBlob, key.value[3]); }
253 for (auto key : track.scale) { putFloat(clipBlob, key.time); for (float value : key.value) putFloat(clipBlob, value); }
257 Value::Object skeletonDefinition{{"schema", Value("eve.skeleton")}, {"schemaVersion", Value(std::int64_t(1))},
258 {"boneCount", Value(static_cast<std::int64_t>(fixture.bones.size()))}, {"coordinateSystem", Value("right-handed-x-right-y-up-minus-z-forward")},
260 Value::Object clipDefinition{{"schema", Value("eve.animation-clip")}, {"schemaVersion", Value(std::int64_t(1))},
264 auto skeletonJson = Value(std::move(skeletonDefinition)).toJson(); auto clipJson = Value(std::move(clipDefinition)).toJson();
267 output.manifest.assets.push_back({skeletonRef.value(), "eve.skeleton", SchemaVersion(1), skeletonRoot + "asset.json",
268 detail::sha256(std::span<const std::uint8_t>(reinterpret_cast<const std::uint8_t*>(skeletonJson.value().data()), skeletonJson.value().size())), {"animation", "skeleton"}});
269 output.manifest.assets.push_back({clipRef.value(), "eve.animation-clip", SchemaVersion(1), clipRoot + "asset.json",
270 detail::sha256(std::span<const std::uint8_t>(reinterpret_cast<const std::uint8_t*>(clipJson.value().data()), clipJson.value().size())), {"animation", "clip"}});
271 output.manifest.dependencies.push_back({clipRef.value(), skeletonRef.value(), asset::EvaDependencyKind::RuntimeRequired,
275 output.manifest.provenance["sourceHash"] = Value(detail::sha256(std::span<const std::uint8_t>(reinterpret_cast<const std::uint8_t*>(request.text.data()), request.text.size())));
276 output.manifest.provenance["sourceTransform"] = Value("centimeter,+Z-forward -> meter,-Z-forward");
277 output.entries = {{skeletonRoot + "asset.json", {skeletonJson.value().begin(), skeletonJson.value().end()}},
282 output.sourceMappings.push_back({request.sourceName + "#clip:" + fixture.clipName, clipRef.value()});
283 output.findings.push_back({request.sourceName, "EVA 1 animation fixture", ImportDisposition::Translated,
285 auto report = detail::finalizeImportReport(output, request.package, "legacy-animation-text", "EVA 1");
Migration of legacy `*.anim.txt` fixtures to `.eva`.
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
Result< std::string > toJson() const
Serialize this value as deterministic compact JSON.
Definition Value.cpp:67
Id128 child(std::string_view role) const noexcept
Derives a deterministic child UUID for a hierarchical identity.
Definition Identity.h:192
EVENGINE_API_PLATFORM Result< void > finalizeImportReport(PreparedAssetImport &prepared, const ImportPackageIdentity &package, std::string_view sourceEngine, std::string_view sourceVersion, Value::Object options={})
Append the deterministic mandatory import report and bind it from provenance.
Definition ImportReport.cpp:21
Result< asset::EvaManifest > baseManifest(const ImportPackageIdentity &package, std::string_view importer)
Base manifest.
Definition ImportCommon.h:31
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 > prepareLegacyAnimationImport(const LegacyAnimationImportRequest &request)
Convert a legacy text fixture into canonical skeleton and animation-clip assets.
Definition LegacyAnimationImporter.cpp:218
@ Translated
@ RuntimeRequired
@ InvalidArgument
@ UnknownVersion
@ ParseError
@ Conflict
detail::StrongUint64< detail::SchemaVersionTag > SchemaVersion
Persistent data-format version; not a runtime replacement generation.
Definition SchemaVersion.h:13
std::uint32_t maximumAssets
Definition AssetImporter.h:20
std::uint64_t maximumDecodedBytes
Definition AssetImporter.h:19
std::uint64_t maximumSourceBytes
Definition AssetImporter.h:18
std::uint32_t maximumStringBytes
Definition AssetImporter.h:23
ImportPackageIdentity package
Definition AssetImporter.h:55
PersistentId packageId
Definition AssetImporter.h:34
Owning request for the non-production EVA 1 animation text fixture.
Definition LegacyAnimationImporter.h:12
Owning, validated source archive candidate not yet published to disk/database.
Definition AssetImporter.h:90
asset::EvaManifest manifest
Definition AssetImporter.h:91