mod animation;
mod animation_graph;
mod animation_params;
mod app_config;
mod audio_command;
mod audio_occlusion_probe;
mod camera3d;
mod camera_probe;
mod character_rig;
mod contact_event;
mod controls_command;
mod despawn_request;
mod entity_target;
mod file;
mod frame_input;
mod gamepad_button;
mod gamepad_map;
mod geometry;
mod ground_probes;
mod input_key;
mod interact_event;
mod lifetime;
mod nav_direction;
mod play_cue;
mod post_process_config;
pub mod procedural_mesh;
mod reparent_request;
mod room;
mod root_motion_event;
mod scene_command;
mod screen_command;
mod screen_shown;
pub mod sdf_volume;
mod setting_command;
pub mod shader;
mod skeleton_pose;
mod skinned_mesh;
mod spawn_request;
mod spawner;
mod story_command;
mod visibility_request;
mod volume_event;
mod body_dynamics;
mod children;
mod collider;
mod global_transform;
mod held;
mod hidden;
mod interactable;
mod mesh_renderer;
mod model_renderer;
mod parent;
mod pickup;
mod prop_instance;
mod render_handle;
mod scene_member;
mod transform;
pub mod stored;
#[cfg(test)]
mod component_tests;
pub use animation::{Animation, AnimationTrack, Keyframe, MorphKey};
pub use animation_graph::{
AnimationBlend, AnimationBlendPoint, AnimationCondition, AnimationGraph, AnimationIkChain,
AnimationParam, AnimationState, AnimationTransition,
};
pub use animation_params::AnimationParams;
pub use app_config::AppConfig;
pub use audio_command::{AudioCommand, AudioTarget};
pub use audio_occlusion_probe::AudioOcclusionProbe;
pub use camera_probe::CameraProbe;
pub use camera3d::Camera3D;
pub use character_rig::CharacterRig;
pub use concinnity_asset::AaMode;
pub use concinnity_asset::AudioBus;
pub use concinnity_asset::AudioClip;
pub use concinnity_asset::BlockType;
pub use concinnity_asset::ColorLut;
pub use concinnity_asset::CubemapTexture;
pub use concinnity_asset::Decal;
pub use concinnity_asset::DirectionalLight;
pub use concinnity_asset::EnvironmentMap;
pub use concinnity_asset::FileKind;
pub use concinnity_asset::Font;
pub use concinnity_asset::GlassPanel;
pub use concinnity_asset::GraphicsConfig;
pub use concinnity_asset::HitRegion;
pub use concinnity_asset::IndirectLighting;
pub use concinnity_asset::KeyBinding;
pub use concinnity_asset::LoadingOverlay;
pub use concinnity_asset::Material;
pub use concinnity_asset::ParticleEmitter;
pub use concinnity_asset::PhysicsConfig;
pub use concinnity_asset::PointLight;
pub use concinnity_asset::PostProcessConfig;
pub use concinnity_asset::ProceduralMesh;
pub use concinnity_asset::Prop;
pub use concinnity_asset::PropBody;
pub use concinnity_asset::PropCollider;
pub use concinnity_asset::RectAreaLight;
pub use concinnity_asset::ReflectionBlurResolution;
pub use concinnity_asset::ReflectionProbe;
pub use concinnity_asset::RigidBody;
pub use concinnity_asset::Scene;
pub use concinnity_asset::ShadowUpdate;
pub use concinnity_asset::SpotLight;
pub use concinnity_asset::SsgiResolution;
pub use concinnity_asset::StreamingConfig;
pub use concinnity_asset::TextInput;
pub use concinnity_asset::Texture;
pub use concinnity_asset::UpscaleQuality;
pub use concinnity_asset::UpscalerBackend;
pub use concinnity_asset::VolumetricFog;
pub use concinnity_asset::VoxelChunk;
pub use concinnity_asset::VoxelWorld;
pub use concinnity_asset::{AudioCue, CueKind};
pub use concinnity_asset::{AudioEmitter, Rolloff};
pub use concinnity_asset::{
Behavior, BehaviorExpr, BehaviorLiteral, BehaviorLocal, BehaviorNode, BehaviorQuery,
BehaviorSource, VariableDecl, Variables,
};
pub use concinnity_asset::{CameraController, FollowController, FollowDrive};
pub use concinnity_asset::{
CharacterCapsule, MorphDelta, SkeletonJoint, SkinnedMesh, SkinnedVertexData,
};
pub use concinnity_asset::{CharacterShape, JointProportion, ResolvedSliders, ShapeSlider};
pub use concinnity_asset::{InstanceTransform, InstancedProp};
pub use concinnity_asset::{Justify, LabelBox, LabelPlacement, LayoutContainer, LayoutRow};
pub use concinnity_asset::{MAX_WATER_WAVES, WaterSurface, WaterWave};
pub use concinnity_asset::{Mesh, VertexData};
pub use concinnity_asset::{Model, SubMeshRef};
pub use concinnity_asset::{PhysicsJoint, PhysicsJointKind};
pub use concinnity_asset::{Screen, ScreenInput};
pub use concinnity_asset::{ScrollGroup, ScrollPanel, ScrollRow};
pub use concinnity_asset::{Sprite, SpriteFit};
pub use concinnity_asset::{
Story, StoryChoice, StoryCompareOp, StoryCondition, StoryGate, StoryImage, StoryNode, StoryOp,
StoryPage, StoryPlayback, StoryReload, StoryScaffold, StorySpeaker, StoryStage,
};
pub use concinnity_asset::{TextAlign, TextLabel};
pub use concinnity_asset::{TriggerFilter, TriggerVolume};
pub use concinnity_asset::{Window, WindowMode};
pub use contact_event::ContactEvent;
pub use controls_command::ControlsCommand;
pub use despawn_request::DespawnRequest;
pub use entity_target::EntityTarget;
pub use file::File;
pub use frame_input::FrameInput;
pub use gamepad_button::GamepadButton;
pub use gamepad_map::{GamepadAction, GamepadMap};
pub use geometry::{
GlassPanelGeometry, InstancedPropGeometry, RectAreaLightGeometry, SPOT_MAX_ANGLE_DEG,
SpotLightGeometry,
};
pub use ground_probes::{GroundProbe, GroundProbes};
pub use input_key::InputKey;
pub use interact_event::InteractEvent;
pub use lifetime::Lifetime;
pub use nav_direction::NavDirection;
pub use play_cue::PlayCue;
pub use post_process_config::PostProcessResolve;
pub use reparent_request::ReparentRequest;
pub use room::Room;
pub use root_motion_event::RootMotionEvent;
pub use scene_command::SceneCommand;
pub use screen_command::ScreenCommand;
pub use screen_shown::ScreenShown;
pub use sdf_volume::SdfVolume;
pub use setting_command::{SettingCommand, SettingOp};
pub use shader::{Shader, ShaderKind, ShaderPayload, StageSource, StageSourceExt};
pub use skeleton_pose::SkeletonPose;
pub use skinned_mesh::{SkinnedMeshGeometry, build_skeleton_from_joint_defs};
pub use spawn_request::SpawnRequest;
pub use spawner::Spawner;
pub use story_command::StoryCommand;
pub use visibility_request::VisibilityRequest;
pub use volume_event::VolumeEvent;
pub use body_dynamics::BodyDynamics;
pub use children::Children;
pub use collider::Collider;
pub use global_transform::GlobalTransform;
pub use held::Held;
pub use hidden::Hidden;
pub use interactable::Interactable;
pub use mesh_renderer::MeshRenderer;
pub use model_renderer::ModelRenderer;
pub use parent::Parent;
pub use pickup::Pickup;
pub use prop_instance::PropInstance;
pub use render_handle::RenderHandle;
pub use scene_member::SceneMember;
pub use transform::Transform;
pub use concinnity_asset::DebugHud;
pub use concinnity_asset::FpsCounter;
pub use concinnity_asset::StatHud;
pub(crate) fn path_extension(path: &str) -> Option<&str> {
let name = path.rsplit(['/', '\\']).next().unwrap_or(path);
match name.rsplit_once('.') {
Some((stem, ext)) if !stem.is_empty() => Some(ext),
_ => None,
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::ecs::asset_id::AssetId;
use crate::ecs::{Component, PayloadLocator};
fn exercise<C: Component + Default + serde::Serialize>() {
let bytes = postcard::to_allocvec(&C::default()).expect("default serializes");
let mut comp = C::from_baked(&bytes).expect("baked bytes deserialize");
comp.inject_name(AssetId::default());
comp.inject_locator(PayloadLocator {
blob_index: 0,
offset: 0,
len: 0,
});
let mut widened = bytes.clone();
widened.push(0);
assert!(
C::from_baked(&widened).is_err(),
"{} accepted a record with an unread trailing byte",
core::any::type_name::<C>()
);
}
#[test]
fn path_extension_matches_std_path_semantics() {
assert_eq!(path_extension("foo.metal"), Some("metal"));
assert_eq!(path_extension("shaders/pbr.hlsl"), Some("hlsl"));
assert_eq!(path_extension("a.b.glsl"), Some("glsl"));
assert_eq!(path_extension("plain"), None);
assert_eq!(path_extension(".bashrc"), None);
assert_eq!(path_extension("dir.v2/plain"), None);
}
#[test]
fn simple_assets_round_trip_defaults() {
exercise::<Scene>();
exercise::<Model>();
exercise::<ProceduralMesh>();
exercise::<WaterSurface>();
exercise::<Decal>();
exercise::<CharacterShape>();
exercise::<ParticleEmitter>();
exercise::<VoxelWorld>();
exercise::<VoxelChunk>();
}
}