载入中...
搜索中...
未找到
ClimbingCodec.cpp
浏览该文件的文档.
53 if (!std::isfinite(number) || number < -static_cast<double>(std::numeric_limits<float>::max()) ||
64bool readOptionalInt64(const eve::Value::Object& object, std::string_view name, std::int64_t& output) {
72 if (!readOptionalInt64(object, name, value) || value < 0 || value > maximumInclusive) return false;
101bool readOptionalString(const eve::Value::Object& object, std::string_view name, std::string& output) {
179eve::Result<const eve::Value::Object*> readRoot(const eve::Value& value, std::string_view schemaId,
184 eve::DiagnosticCode::ParseError, "climbing definition must be an object", {}, {}, "climbing.codec"));
189 eve::DiagnosticCode::ParseError, "climbing definition schemaId is missing or mismatched", "schemaId", {},
193 eve::DiagnosticCode::ParseError, "climbing definition schemaVersion must be an integer", "schemaVersion",
197 eve::DiagnosticCode::UnknownVersion, "climbing definition schema version is unsupported", "schemaVersion",
202eve::Value::Object unknownFields(const eve::Value::Object& object, std::initializer_list<std::string_view> knownNames) {
274 contactValues.push_back(eve::Value::object({{"target", static_cast<std::int64_t>(contact.target)},
280 object["terminalVelocityPolicy"] = eve::Value(static_cast<std::int64_t>(action.terminalVelocityPolicy));
294 eve::DiagnosticCode::InvalidArgument, "action id must not be empty", "id", {}, "climbing.codec"));
298 eve::DiagnosticCode::InvalidArgument, "action height range must be finite, non-negative, and ordered",
304 "action speed, landing distance, and apex must be finite and non-negative", {}, {}, "climbing.codec"));
309 if (!finite(action.hangBodyOffset) || action.hangBodyOffset < 0.f || !finite(action.hangFeetBelowLedge) ||
311 !finite(action.cancelWindowStart) || !finite(action.cancelWindowEnd) || action.cancelWindowStart < 0.f ||
314 eve::DiagnosticCode::InvalidArgument, "hang geometry and cancel window must be finite and ordered", {}, {},
316 if (!finite(action.rootMotionScaleMin) || !finite(action.rootMotionScaleMax) || action.rootMotionScaleMin <= 0.f ||
325 "root-motion scale and warp budgets must be finite, positive, and bounded", "warp", {}, "climbing.codec"));
340 if (std::any_of(notifyNames.begin(), notifyNames.end(), [](const std::string& name) { return name.empty(); }) ||
343 eve::DiagnosticCode::InvalidArgument, "required animation notifies must be non-empty and unique",
351 action.maxDepth < action.minDepth || !finite(action.minDistance) || !finite(action.maxDistance) ||
353 !finite(action.minSurfaceNormalY) || action.minSurfaceNormalY < -1.f || action.minSurfaceNormalY > 1.f ||
354 !finite(action.maxSlopeRadians) || action.maxSlopeRadians < 0.f || action.maxSlopeRadians > 3.1415927f ||
376 if (std::find(action.comboTags.begin(), action.comboTags.end(), window.comboTag) == action.comboTags.end())
383 if (!finite(contact.start) || !finite(contact.end) || !finite(contact.maxWeight) || contact.start < 0.f ||
384 contact.end > 1.f || contact.end <= contact.start || contact.maxWeight < 0.f || contact.maxWeight > 1.f)
391 eve::DiagnosticCode::InvalidArgument, "action cost metadata is invalid", "cost", {}, "climbing.codec"));
396 if (!finite(profile.capsuleRadius) || !finite(profile.capsuleHeight) || profile.capsuleRadius <= 0.f ||
409 profile.maxProbeDistance <= 0.f || !finite(profile.maxObstacleHeight) || profile.maxObstacleHeight <= 0.f ||
413 eve::DiagnosticCode::InvalidArgument, "profile probe, surface, skin, and warp limits are invalid", {}, {},
415 if (!finite(profile.maxPlatformSpeed) || profile.maxPlatformSpeed <= 0.f || !finite(profile.dropInitialSpeed) ||
420 if (profile.inputBufferTicks == 0 || profile.inputBufferTicks > 1000000 || profile.coyoteTicks > 1000000)
422 eve::DiagnosticCode::InvalidArgument, "input buffer must be non-zero and tick windows must be bounded",
427 eve::DiagnosticCode::InvalidArgument, "path validation samples and pelvis deviation are invalid",
429 if (!finite(profile.groundAcceleration) || profile.groundAcceleration < 0.f || !finite(profile.groundBraking) ||
434 !finite(profile.autoAssistStrength) || profile.autoAssistStrength < 0.f || profile.autoAssistStrength > 1.f ||
445 if (weights.direction < 0 || weights.approachSpeed < 0 || weights.height < 0 || weights.distance < 0 ||
450 if (profile.staminaPolicy == ClimbingStaminaPolicy::RequireProvider && profile.staminaAdapter.empty())
452 eve::DiagnosticCode::InvalidArgument, "RequireProvider stamina policy needs a stable adapter id",
485 auto root = readRoot(value, ClimbingActionDefinition::SchemaId, ClimbingActionDefinition::SchemaVersion);
495 const auto* warpWindows = warpWindowsValue ? warpWindowsValue->getIf<eve::Value::Array>() : nullptr;
498 !readFloat(object, "maxHeight", candidate.maxHeight) || !readFloat(object, "minSpeed", candidate.minSpeed) ||
501 !readFloat(object, "apexHeight", candidate.apexHeight) || !readInt64(object, "selectionBias", selectionBias) ||
502 selectionBias < std::numeric_limits<int>::min() || selectionBias > std::numeric_limits<int>::max() ||
535 !readFloat(*valueObject, "end", window.end) || !readBool(*valueObject, "horizontal", window.horizontal) ||
536 !readBool(*valueObject, "vertical", window.vertical) || !readBool(*valueObject, "facing", window.facing))
538 eve::Diagnostic::error(eve::DiagnosticCode::ParseError, "warp window has missing or invalid fields",
573 eve::DiagnosticCode::ParseError, "climbing action has invalid v4 metadata", {}, {}, "climbing.codec"));
582 eve::DiagnosticCode::ParseError, "animation binding has missing or invalid fields", "animation", {},
680eve::Result<eve::Value> encodeClimbingProfileDefinition(const ClimbingProfileDefinition& profile) {
690 eve::Value::Object filter{{"categoryBits", eve::Value(static_cast<std::int64_t>(profile.queryFilter.categoryBits))},
709 object["pathValidationSegments"] = eve::Value(static_cast<std::int64_t>(profile.pathValidationSegments));
738eve::Result<ClimbingProfileDefinition> decodeClimbingProfileDefinition(const eve::Value& value) {
739 auto root = readRoot(value, ClimbingProfileDefinition::SchemaId, ClimbingProfileDefinition::SchemaVersion);
768 !readOptionalInt64(object, "pathValidationSegments", pathValidationSegments) || pathValidationSegments < 0 ||
788 !readOptionalString(object, "cameraCueProfile", candidate.cameraCueProfile) || !actions || !filter ||
789 !readInt64(*filter, "categoryBits", categoryBits) || !readInt64(*filter, "maskBits", maskBits) ||
791 maskBits > std::numeric_limits<std::uint32_t>::max() || !readInt64(*filter, "ignoredBodyId", ignoredBodyId) ||
792 ignoredBodyId < std::numeric_limits<int>::min() || ignoredBodyId > std::numeric_limits<int>::max() ||
793 !readInt64(*filter, "ignoredShapeId", ignoredShapeId) || ignoredShapeId < std::numeric_limits<int>::min() ||
812 !readInt64(*weights, "approachSpeed", approachSpeed) || !readInt64(*weights, "height", height) ||
818 eve::Diagnostic::error(eve::DiagnosticCode::ParseError, "scoreWeights has missing or invalid fields",
Versioned, lossless codecs for climbing definitions.
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 constexpr Duration fromNanoseconds(std::int64_t nanoseconds) noexcept
Construct an exact duration from nanoseconds.
Definition Time.h:55
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
const T * getIf() const noexcept
Return a typed pointer, or nullptr when the kind differs.
Definition Value.h:180
Result< float > readFloat(const Accessor &accessor, std::uint32_t element, std::uint32_t component)
Read one bounded finite FLOAT component.
Definition GltfDecode.cpp:221
Definition Climbing.cpp:19
@ AnchorToAnchor
eve::Result< ClimbingActionDefinition > decodeClimbingActionDefinition(const eve::Value &value)
Decode and validate one action without partially mutating a registry.
Definition ClimbingCodec.cpp:484
eve::Result< eve::Value > encodeClimbingProfileDefinition(const ClimbingProfileDefinition &profile)
Encode one validated profile and all nested actions into canonical schema v4 data.
Definition ClimbingCodec.cpp:680
eve::Result< ClimbingProfileDefinition > decodeClimbingProfileDefinition(const eve::Value &value)
Decode and validate an owning profile candidate transactionally.
Definition ClimbingCodec.cpp:738
eve::Result< eve::Value > encodeClimbingActionDefinition(const ClimbingActionDefinition &action)
Encode one validated action into canonical schema v4 data.
Definition ClimbingCodec.cpp:476
eve::Result< void > validateClimbingActionDefinition(const ClimbingActionDefinition &action)
Validate every known field of one action definition.
Definition ClimbingCodec.cpp:291
@ RequireProvider
@ UseWhenPresent
ClimbingActionKind
Data-driven action family; stable action identity remains the definition id.
Definition Climbing.h:46
@ LedgeGrab
@ ClimbDown
@ LadderMount
@ PoleSwing
@ LadderDismount
@ LadderClimb
@ CornerInner
@ BeamBalance
@ CornerOuter
@ LedgeJump
eve::Result< void > validateClimbingProfileDefinition(const ClimbingProfileDefinition &profile)
Validate every known field and nested action of one profile definition.
Definition ClimbingCodec.cpp:395
@ AnchorGraph
std::variant< std::monostate, std::int64_t, double, std::string, bool > Value
Definition Database.h:26
bool readString(const eve::Value::Object &object, const char *name, std::string &output)
Definition ArtifactProvider.cpp:20
const EditorValue * field(const EditorValue &value, const char *name)
Definition RoadNetworkEditTarget.cpp:15
WidgetDesc window(std::string title, std::vector< WidgetDesc > children, std::string id)
Top-level window widget with a title bar.
Definition Widget.cpp:292
@ InvalidArgument
@ NotFound
@ UnknownVersion
@ AlreadyExists
@ ParseError
Definition of one geometry-compatible climbing action.
Definition Climbing.h:160
float landingForward
Definition Climbing.h:171
ClimbingCommandRequirement requiredCommand
Definition Climbing.h:191
ClimbingTrajectoryKind trajectory
Definition Climbing.h:201
ClimbingSourceMode sourceModes
Definition Climbing.h:190
std::vector< ClimbingContactConstraint > contactConstraints
Definition Climbing.h:204
float cancelWindowStart
Definition Climbing.h:178
float hangFeetBelowLedge
Definition Climbing.h:176
float minSurfaceNormalY
Definition Climbing.h:197
float facingWarpBudgetRadians
Definition Climbing.h:186
std::vector< ClimbingBranchWindow > branchWindows
Definition Climbing.h:203
ClimbingAnimationBinding animation
Definition Climbing.h:202
std::vector< std::string > requiredSupportTags
Definition Climbing.h:200
float cancelWindowEnd
Definition Climbing.h:179
eve::Value::Object extensionMetadata
Unknown schema fields retained across decode and encode.
Definition Climbing.h:214
ClimbingTerminalVelocityPolicy terminalVelocityPolicy
Definition Climbing.h:206
float verticalWarpBudget
Definition Climbing.h:185
std::vector< std::string > tags
Definition Climbing.h:189
float rootMotionScaleMax
Definition Climbing.h:181
float maxYawWarpRadiansPerTick
Definition Climbing.h:183
std::vector< std::string > requiredConditionTags
Definition Climbing.h:209
std::vector< std::string > comboTags
Definition Climbing.h:207
std::int32_t repetitionPenalty
Definition Climbing.h:208
float maxSlopeRadians
Definition Climbing.h:198
std::vector< std::string > requiredNotifies
Definition Climbing.h:188
std::vector< std::string > eventMetadata
Definition Climbing.h:212
std::vector< ClimbingWarpWindow > warpWindows
Definition Climbing.h:187
ClimbingProbeRecipe probeRecipe
Definition Climbing.h:192
float horizontalWarpBudget
Definition Climbing.h:184
float rootMotionScaleMin
Definition Climbing.h:180
float maxTranslationWarpPerTick
Definition Climbing.h:182
float hangBodyOffset
Definition Climbing.h:175
static constexpr std::string_view SchemaId
Schema id emitted by the canonical action codec.
Definition Climbing.h:162
ClimbingLandingPolicy landingPolicy
Definition Climbing.h:205
std::string graphNodeId
Definition Climbing.h:102
Normalized branch interval advertising one stable combo tag.
Definition Climbing.h:108
Normalized contact interval and maximum constraint weight.
Definition Climbing.h:118
Runtime profile controlling capsule geometry and probe limits.
Definition Climbing.h:218
static constexpr std::string_view SchemaId
Schema id emitted by the canonical profile codec.
Definition Climbing.h:220
float groundAcceleration
Definition Climbing.h:238
std::vector< std::string > deniedActionTags
Definition Climbing.h:250
std::uint32_t probeSectors
Definition Climbing.h:243
eve::Value::Object extensionMetadata
Unknown schema fields retained across decode and encode.
Definition Climbing.h:257
float maxPelvisDeviation
Definition Climbing.h:237
std::vector< std::string > defaultActionIds
Definition Climbing.h:248
physics::QueryFilter3D queryFilter
Definition Climbing.h:254
ClimbingScoreWeights scoreWeights
Definition Climbing.h:246
std::uint64_t inputBufferTicks
Definition Climbing.h:234
float maxPlatformSpeed
Definition Climbing.h:232
float autoAssistStrength
Definition Climbing.h:245
std::uint64_t coyoteTicks
Definition Climbing.h:235
std::uint32_t pathValidationSegments
Definition Climbing.h:236
float maxObstacleHeight
Definition Climbing.h:229
float maxProbeDistance
Definition Climbing.h:228
std::string staminaAdapter
Definition Climbing.h:252
std::vector< ClimbingActionDefinition > actions
Definition Climbing.h:255
float maxTotalWarpBudget
Definition Climbing.h:247
std::uint32_t maxCandidates
Definition Climbing.h:244
float dropInitialSpeed
Definition Climbing.h:233
std::string cameraCueProfile
Definition Climbing.h:253
std::vector< std::string > allowedActionTags
Definition Climbing.h:249
float maxWarpResidual
Definition Climbing.h:231
float compactCapsuleHeight
Definition Climbing.h:226
ClimbingStaminaPolicy staminaPolicy
Definition Climbing.h:251
Quantized selection-cost weights stored with a profile.
Definition Climbing.h:126
std::int32_t approachSpeed
Definition Climbing.h:128
std::int32_t intentMismatch
Definition Climbing.h:133
std::int32_t warpTranslation
Definition Climbing.h:131
Normalized action interval selecting which motion-warp channels may correct authored motion.
Definition Climbing.h:151