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 bevy_readback;
71mod canonical;
72mod clip_boundary;
73mod error;
74mod import_advice;
75mod prediction;
76mod provenance;
77mod registry;
78mod resolver;
79mod root_motion;
80mod track_support;
81mod types;
82mod unit_scale;
83
84pub use canonical::{project_engine_profile_v2, project_resolved_engine_settings_v3};
85
86pub use addressability::{
87    GLTF_ANIMATION_ADDRESSABILITY_COMMAND, GLTF_ANIMATION_ADDRESSABILITY_SCHEMA_VERSION,
88    GLTF_ANIMATION_ADDRESSABILITY_V1_ID, GLTF_ANIMATION_ADDRESSABILITY_V1_MAX_REPORT_BYTES,
89    GltfAnimationAddressabilityAnimationSetV1, GltfAnimationAddressabilityAnimationV1,
90    GltfAnimationAddressabilityBevyAdapterV1, GltfAnimationAddressabilityBevyReadbackV1,
91    GltfAnimationAddressabilityChannelSetV1, GltfAnimationAddressabilityChannelV1,
92    GltfAnimationAddressabilityCheckReadbackV1, GltfAnimationAddressabilityError,
93    GltfAnimationAddressabilityIdentityV1, GltfAnimationAddressabilityInput,
94    GltfAnimationAddressabilityInventoryV1, GltfAnimationAddressabilityReadError,
95    GltfAnimationAddressabilityReadbackV1, GltfAnimationAddressabilityToolReadbackV1,
96    GltfAnimationAddressabilityV1, GltfAnimationChannelPropertyV1, GltfAnimationCoverageStateV1,
97    GltfAnimationCoverageV1, GltfAnimationObservationV1, GltfAnimationTargetKindV1,
98    GltfAnimationTargetV1, GltfAnimationUnavailableReasonV1,
99};
100pub use addressability_v2::{
101    BevyAddressabilityRuleSourceV1, BevyAnimationTargetIdError, BevyGltfAddressabilityProjectionV2,
102    BevyGltfAddressabilityRulesV1, BevyGltfAddressabilitySettingsV2, BevyNamedMapDuplicatePolicyV1,
103    GLTF_ADDRESSABILITY_V2_ID, GLTF_ADDRESSABILITY_V2_MAX_DOMAIN_ROWS,
104    GLTF_ADDRESSABILITY_V2_MAX_EVALUATED_SCOPES, GLTF_ADDRESSABILITY_V2_MAX_PATH_BYTES,
105    GLTF_ADDRESSABILITY_V2_MAX_PATH_SEGMENTS, GLTF_ADDRESSABILITY_V2_MAX_REPORT_BYTES,
106    GLTF_ADDRESSABILITY_V2_MAX_SEGMENT_BYTES, GLTF_ADDRESSABILITY_V2_MAX_STRUCTURAL_REFERENCES,
107    GLTF_ADDRESSABILITY_V2_MAX_TOTAL_TEXT_BYTES, GLTF_ADDRESSABILITY_V2_SCHEMA_VERSION,
108    GltfAddressabilityBevyAdapterV2, GltfAddressabilityBevyReadbackV2,
109    GltfAddressabilityCheckReadbackV2, GltfAddressabilityInventoryV2,
110    GltfAddressabilityNamedMapKindV2, GltfAddressabilityNamedMapV2,
111    GltfAddressabilityNamedMapWinnerV2, GltfAddressabilityProjectionV2,
112    GltfAddressabilityReadErrorV2, GltfAddressabilityReadbackV2, GltfAddressabilitySceneV2,
113    GltfAddressabilitySettingOriginV2, GltfAddressabilitySkinV2, GltfAddressabilityTargetChannelV2,
114    GltfAddressabilityTargetV2, GltfAddressabilityTargetValueV2,
115    GltfAddressabilityUnavailableReasonV2, GltfAddressabilityV2, GltfAddressabilityV2Error,
116    TargetPointerWidth, bevy_animation_target_id_v1, build_bevy_addressability_adapter_v2,
117};
118pub use bevy_readback::{
119    BEVY_READBACK_V1_ID, BEVY_READBACK_V1_LOCK_BYTES, BEVY_READBACK_V1_LOCK_SHA256,
120    BEVY_READBACK_V1_MAX_REPORT_BYTES, BEVY_READBACK_V1_MAX_ROWS, BEVY_READBACK_V1_MAX_UPDATES,
121    BEVY_READBACK_V1_MAX_WORK, BEVY_READBACK_V1_RUSTC, BEVY_READBACK_V1_SCHEMA_VERSION,
122    BevyAnimationTargetV1, BevyConformanceCodeV1, BevyConformanceV1, BevyHarnessIdentityV1,
123    BevyIndexedLabelV1, BevyLoadErrorCodeV1, BevyNamedWinnerV1, BevyObservationV1,
124    BevyPredictionReferenceV1, BevyReadbackV1, BevyReadbackV1Error, BevyTerminalStateV1,
125    BevyWarningV1, compare_bevy_readback_v1, validate_bevy_readback_prediction_v1,
126    validate_bevy_readback_v1,
127};
128pub use clip_boundary::{ENGINE_CLIP_BOUNDARY_CHECK_ID, EngineClipBoundaryCheck};
129pub use error::{
130    InvalidSettingReason, PredictionRuleError, RegistryValidationError, ResolutionError,
131    SettingLocation,
132};
133pub use import_advice::{
134    ENGINE_IMPORT_ADVICE_COMMAND, ENGINE_IMPORT_ADVICE_SCHEMA_VERSION, ENGINE_IMPORT_ADVICE_V1_ID,
135    ENGINE_IMPORT_ADVICE_V1_MAX_REPORT_BYTES, ENGINE_IMPORT_ADVICE_V2_ID,
136    ENGINE_IMPORT_ADVICE_V2_MAX_REPORT_BYTES, ENGINE_IMPORT_ADVICE_V2_SCHEMA_VERSION,
137    EngineImportAdviceClipEvidenceV1, EngineImportAdviceClipV1, EngineImportAdviceError,
138    EngineImportAdviceIdentityV1, EngineImportAdviceIdentityV2, EngineImportAdviceInput,
139    EngineImportAdviceInputV2, EngineImportAdviceMovementOwnerV1, EngineImportAdvicePayloadV1,
140    EngineImportAdviceProjectionFieldV2, EngineImportAdviceProjectionV2,
141    EngineImportAdviceProjectionValueV2, EngineImportAdviceReadError, EngineImportAdviceReadbackV1,
142    EngineImportAdviceReadbackV2, EngineImportAdviceRefusalReasonV1,
143    EngineImportAdviceRefusalReasonV2, EngineImportAdviceSourceNameV1,
144    EngineImportAdviceSourceUnavailableReasonV1, EngineImportAdviceStateV1,
145    EngineImportAdviceStateV2, EngineImportAdviceToolReadbackV1, EngineImportAdviceV1,
146    EngineImportAdviceV2, UnityClipAdviceV1, UnityDocumentAdviceV1,
147};
148pub use prediction::{
149    BevyAnimationAssetLabelError, BevyAnimationAssetLabelV1, ENGINE_ADDRESSABILITY_CHECK_ID,
150    ENGINE_CHECK_IDS_V1, ENGINE_CHECK_IDS_V2, EngineAddressabilityCheck,
151    EngineAddressabilityCheckV2, EngineAddressabilityCheckV3,
152    GltfAnimationAddressabilityAdapterError, build_bevy_animation_addressability_adapter_v1,
153};
154pub use provenance::{
155    PredictionProvenanceProjectionError, project_prediction_provenance_v1,
156    project_prediction_provenance_v2, project_prediction_provenance_v3,
157    project_prediction_provenance_v4, project_prediction_provenance_v5,
158    project_prediction_provenance_v6,
159};
160pub use registry::{
161    RegistryValidationErrorV2, profiles_v1, profiles_v2, validate_registry_v1, validate_registry_v2,
162};
163pub use resolver::{
164    RESOLVED_ENGINE_SETTINGS_V2_MAX_CLIPS, ResolutionErrorV2, ResolvedClipCoverageReasonV2,
165    ResolvedClipCoverageV2, ResolvedClipSettings, ResolvedClipSettingsV2,
166    ResolvedEngineSettingsWorkV2, ResolvedProfile, ResolvedProfileSettingsV2, ResolvedProfileV2,
167    SOURCE_TRANSFORM_PATH_MAX_BYTES, StaticResolution, StaticResolutionV2, lookup_profile,
168    lookup_profile_v2, resolve_static, resolve_static_v2,
169};
170pub use root_motion::{ENGINE_ROOT_MOTION_CHECK_ID, EngineRootMotionCheck};
171pub use track_support::{ENGINE_TRACK_SUPPORT_CHECK_ID, EngineTrackSupportCheck};
172pub use types::{
173    AnimationAddressability, BakeOrExtract, BevyGltfHandlerEnvironmentV2, BevyLoadMeshesStateV2,
174    ConversionControl, CoordinateBasis, DefaultStatus, EngineDeclaration, EngineDeclarationV2,
175    EngineProfile, EngineProfileV2, FactId, FactState, FactValue, ForwardAxis, Handedness,
176    ImportHandling, LinearUnit, PrimarySource, PrimarySourceV2, ProfileFact, ProfileSelection,
177    ResolvedSettingOriginV2, ResolvedSettingV2, RootMotionAddressability, SettingApplicability,
178    SettingDefaultV2, SettingDescriptor, SettingDescriptorV2, SettingDomain, SettingDomainV2,
179    SettingId, SettingIdV2, SettingMap, SettingMapV2, SettingScope, SettingValue, SettingValueV2,
180    TargetAddressability, UnityAnimationTypeV2, UnityAvatarSetupV2, UnrealSampleRateV2, UpAxis,
181};
182pub use unit_scale::{ENGINE_UNIT_SCALE_CHECK_ID, EngineUnitScaleCheck};
183
184/// Runtime kind of one closed [`SettingValue`] variant.
185#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
186pub enum SettingValueKind {
187    /// Boolean value.
188    Boolean,
189    /// Bake-or-extract value.
190    BakeOrExtract,
191    /// Source-transform path value.
192    SourceTransformPath,
193}