Skip to main content

animsmith_engine/
lib.rs

1//! Strict, immutable engine-import profile facts and deterministic settings
2//! resolution for AnimSmith.
3//!
4//! The V1 registry has exactly five version-pinned profiles. [`resolve_static`]
5//! validates a profile tuple and every declared setting before asset I/O;
6//! [`StaticResolution::resolve_input`] then checks the authoritative
7//! [`animsmith_core::SourceFormatV1`] and materializes per-clip settings.
8//! Unknown engine behavior remains [`FactState::Unknown`]. This crate performs
9//! no filesystem access, parses no TOML, and imports no format crate. Its
10//! one-way [`project_prediction_provenance_v1`] adapter publishes the already
11//! resolved profile/settings and same-load core source evidence. The borrowed
12//! [`EngineAddressabilityCheck`] uses that evidence for the single frozen Bevy
13//! 0.19.0 source-animation index-selector prediction; other engine behavior
14//! remains outside this crate unless a version-pinned rule is added.
15//! [`BevyAnimationAssetLabelV1`] is the one bounded selector formatter used by
16//! that check, while [`build_bevy_animation_addressability_adapter_v1`] runs
17//! the same check lifecycle once and packages its unchanged evaluation for the
18//! standalone glTF animation-addressability contract.
19//! [`EngineImportAdviceV1`] independently projects exact materialized Unity
20//! importer settings beside same-load provenance and bounded clip evidence;
21//! profiles without modeled settings produce a typed refusal rather than a
22//! guessed preset. [`EngineImportAdviceV2`] separately projects the exact
23//! Godot and Unreal revision-2 document settings with origin-bearing shared
24//! provenance and an advice-owned native scalar vocabulary.
25//!
26//! # Example
27//!
28//! ```
29//! use animsmith_core::SourceFormatV1;
30//! use animsmith_engine::{
31//!     BakeOrExtract, EngineDeclaration, ProfileSelection, SettingValue,
32//!     resolve_static,
33//! };
34//!
35//! let mut declaration = EngineDeclaration {
36//!     selection: Some(ProfileSelection::new(
37//!         "unity-generic", 1, "6000.3", "fbx-model-importer",
38//!     )),
39//!     document_settings: Some(Default::default()),
40//!     ..EngineDeclaration::default()
41//! };
42//! let document = declaration.document_settings.as_mut().unwrap();
43//! document.insert("convert_units".into(), SettingValue::Boolean(true));
44//! document.insert("bake_axis_conversion".into(), SettingValue::Boolean(true));
45//! document.insert(
46//!     "root_motion_source".into(),
47//!     SettingValue::SourceTransformPath("Reference/Root".into()),
48//! );
49//! declaration.clip_settings.insert(
50//!     "walk_*".into(),
51//!     [
52//!         ("root_rotation".into(), SettingValue::BakeOrExtract(BakeOrExtract::Extract)),
53//!         ("root_position_y".into(), SettingValue::BakeOrExtract(BakeOrExtract::Bake)),
54//!         ("root_position_xz".into(), SettingValue::BakeOrExtract(BakeOrExtract::Extract)),
55//!     ].into(),
56//! );
57//! let static_profile = resolve_static(declaration)?.unwrap();
58//! let resolved = static_profile.resolve_input(SourceFormatV1::Fbx, &["walk_forward".into()])?;
59//! assert_eq!(resolved.clip_settings().len(), 1);
60//! # Ok::<(), animsmith_engine::ResolutionError>(())
61//! ```
62//!
63//! The crate has no public feature flags and supports the workspace MSRV,
64//! Rust 1.88. Its Rust API is pre-1.0.
65
66#![warn(missing_docs)]
67
68mod addressability;
69mod addressability_v2;
70mod canonical;
71mod clip_boundary;
72mod error;
73mod import_advice;
74mod prediction;
75mod provenance;
76mod registry;
77mod resolver;
78mod root_motion;
79mod track_support;
80mod types;
81mod unit_scale;
82
83pub use canonical::{project_engine_profile_v2, project_resolved_engine_settings_v3};
84
85pub use addressability::{
86    GLTF_ANIMATION_ADDRESSABILITY_COMMAND, GLTF_ANIMATION_ADDRESSABILITY_SCHEMA_VERSION,
87    GLTF_ANIMATION_ADDRESSABILITY_V1_ID, GLTF_ANIMATION_ADDRESSABILITY_V1_MAX_REPORT_BYTES,
88    GltfAnimationAddressabilityAnimationSetV1, GltfAnimationAddressabilityAnimationV1,
89    GltfAnimationAddressabilityBevyAdapterV1, GltfAnimationAddressabilityBevyReadbackV1,
90    GltfAnimationAddressabilityChannelSetV1, GltfAnimationAddressabilityChannelV1,
91    GltfAnimationAddressabilityCheckReadbackV1, GltfAnimationAddressabilityError,
92    GltfAnimationAddressabilityIdentityV1, GltfAnimationAddressabilityInput,
93    GltfAnimationAddressabilityInventoryV1, GltfAnimationAddressabilityReadError,
94    GltfAnimationAddressabilityReadbackV1, GltfAnimationAddressabilityToolReadbackV1,
95    GltfAnimationAddressabilityV1, GltfAnimationChannelPropertyV1, GltfAnimationCoverageStateV1,
96    GltfAnimationCoverageV1, GltfAnimationObservationV1, GltfAnimationTargetKindV1,
97    GltfAnimationTargetV1, GltfAnimationUnavailableReasonV1,
98};
99pub use addressability_v2::{
100    BevyAddressabilityRuleSourceV1, BevyAnimationTargetIdError, BevyGltfAddressabilityProjectionV2,
101    BevyGltfAddressabilityRulesV1, BevyGltfAddressabilitySettingsV2, BevyNamedMapDuplicatePolicyV1,
102    GLTF_ADDRESSABILITY_V2_ID, GLTF_ADDRESSABILITY_V2_MAX_DOMAIN_ROWS,
103    GLTF_ADDRESSABILITY_V2_MAX_EVALUATED_SCOPES, GLTF_ADDRESSABILITY_V2_MAX_PATH_BYTES,
104    GLTF_ADDRESSABILITY_V2_MAX_PATH_SEGMENTS, GLTF_ADDRESSABILITY_V2_MAX_REPORT_BYTES,
105    GLTF_ADDRESSABILITY_V2_MAX_SEGMENT_BYTES, GLTF_ADDRESSABILITY_V2_MAX_STRUCTURAL_REFERENCES,
106    GLTF_ADDRESSABILITY_V2_MAX_TOTAL_TEXT_BYTES, GLTF_ADDRESSABILITY_V2_SCHEMA_VERSION,
107    GltfAddressabilityBevyAdapterV2, GltfAddressabilityBevyReadbackV2,
108    GltfAddressabilityCheckReadbackV2, GltfAddressabilityInventoryV2,
109    GltfAddressabilityNamedMapKindV2, GltfAddressabilityNamedMapV2,
110    GltfAddressabilityNamedMapWinnerV2, GltfAddressabilityProjectionV2,
111    GltfAddressabilityReadErrorV2, GltfAddressabilityReadbackV2, GltfAddressabilitySceneV2,
112    GltfAddressabilitySettingOriginV2, GltfAddressabilitySkinV2, GltfAddressabilityTargetChannelV2,
113    GltfAddressabilityTargetV2, GltfAddressabilityTargetValueV2,
114    GltfAddressabilityUnavailableReasonV2, GltfAddressabilityV2, GltfAddressabilityV2Error,
115    TargetPointerWidth, bevy_animation_target_id_v1, build_bevy_addressability_adapter_v2,
116};
117pub use clip_boundary::{ENGINE_CLIP_BOUNDARY_CHECK_ID, EngineClipBoundaryCheck};
118pub use error::{
119    InvalidSettingReason, PredictionRuleError, RegistryValidationError, ResolutionError,
120    SettingLocation,
121};
122pub use import_advice::{
123    ENGINE_IMPORT_ADVICE_COMMAND, ENGINE_IMPORT_ADVICE_SCHEMA_VERSION, ENGINE_IMPORT_ADVICE_V1_ID,
124    ENGINE_IMPORT_ADVICE_V1_MAX_REPORT_BYTES, ENGINE_IMPORT_ADVICE_V2_ID,
125    ENGINE_IMPORT_ADVICE_V2_MAX_REPORT_BYTES, ENGINE_IMPORT_ADVICE_V2_SCHEMA_VERSION,
126    EngineImportAdviceClipEvidenceV1, EngineImportAdviceClipV1, EngineImportAdviceError,
127    EngineImportAdviceIdentityV1, EngineImportAdviceIdentityV2, EngineImportAdviceInput,
128    EngineImportAdviceInputV2, EngineImportAdviceMovementOwnerV1, EngineImportAdvicePayloadV1,
129    EngineImportAdviceProjectionFieldV2, EngineImportAdviceProjectionV2,
130    EngineImportAdviceProjectionValueV2, EngineImportAdviceReadError, EngineImportAdviceReadbackV1,
131    EngineImportAdviceReadbackV2, EngineImportAdviceRefusalReasonV1,
132    EngineImportAdviceRefusalReasonV2, EngineImportAdviceSourceNameV1,
133    EngineImportAdviceSourceUnavailableReasonV1, EngineImportAdviceStateV1,
134    EngineImportAdviceStateV2, EngineImportAdviceToolReadbackV1, EngineImportAdviceV1,
135    EngineImportAdviceV2, UnityClipAdviceV1, UnityDocumentAdviceV1,
136};
137pub use prediction::{
138    BevyAnimationAssetLabelError, BevyAnimationAssetLabelV1, ENGINE_ADDRESSABILITY_CHECK_ID,
139    ENGINE_CHECK_IDS_V1, ENGINE_CHECK_IDS_V2, EngineAddressabilityCheck,
140    EngineAddressabilityCheckV2, EngineAddressabilityCheckV3,
141    GltfAnimationAddressabilityAdapterError, build_bevy_animation_addressability_adapter_v1,
142};
143pub use provenance::{
144    PredictionProvenanceProjectionError, project_prediction_provenance_v1,
145    project_prediction_provenance_v2, project_prediction_provenance_v3,
146    project_prediction_provenance_v4, project_prediction_provenance_v5,
147    project_prediction_provenance_v6,
148};
149pub use registry::{
150    RegistryValidationErrorV2, profiles_v1, profiles_v2, validate_registry_v1, validate_registry_v2,
151};
152pub use resolver::{
153    RESOLVED_ENGINE_SETTINGS_V2_MAX_CLIPS, ResolutionErrorV2, ResolvedClipCoverageReasonV2,
154    ResolvedClipCoverageV2, ResolvedClipSettings, ResolvedClipSettingsV2,
155    ResolvedEngineSettingsWorkV2, ResolvedProfile, ResolvedProfileSettingsV2, ResolvedProfileV2,
156    SOURCE_TRANSFORM_PATH_MAX_BYTES, StaticResolution, StaticResolutionV2, lookup_profile,
157    lookup_profile_v2, resolve_static, resolve_static_v2,
158};
159pub use root_motion::{ENGINE_ROOT_MOTION_CHECK_ID, EngineRootMotionCheck};
160pub use track_support::{ENGINE_TRACK_SUPPORT_CHECK_ID, EngineTrackSupportCheck};
161pub use types::{
162    AnimationAddressability, BakeOrExtract, BevyGltfHandlerEnvironmentV2, BevyLoadMeshesStateV2,
163    ConversionControl, CoordinateBasis, DefaultStatus, EngineDeclaration, EngineDeclarationV2,
164    EngineProfile, EngineProfileV2, FactId, FactState, FactValue, ForwardAxis, Handedness,
165    ImportHandling, LinearUnit, PrimarySource, PrimarySourceV2, ProfileFact, ProfileSelection,
166    ResolvedSettingOriginV2, ResolvedSettingV2, RootMotionAddressability, SettingApplicability,
167    SettingDefaultV2, SettingDescriptor, SettingDescriptorV2, SettingDomain, SettingDomainV2,
168    SettingId, SettingIdV2, SettingMap, SettingMapV2, SettingScope, SettingValue, SettingValueV2,
169    TargetAddressability, UnityAnimationTypeV2, UnityAvatarSetupV2, UnrealSampleRateV2, UpAxis,
170};
171pub use unit_scale::{ENGINE_UNIT_SCALE_CHECK_ID, EngineUnitScaleCheck};
172
173/// Runtime kind of one closed [`SettingValue`] variant.
174#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
175pub enum SettingValueKind {
176    /// Boolean value.
177    Boolean,
178    /// Bake-or-extract value.
179    BakeOrExtract,
180    /// Source-transform path value.
181    SourceTransformPath,
182}