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