pub mod body_tracking;
pub(crate) mod expressions;
pub(crate) mod gltf;
pub(crate) mod humanoid_bone;
mod initialize;
mod loader;
mod look_at;
mod mtoon;
mod node_constraint;
pub mod spring_bone;
use crate::macros::marker_component;
use crate::new_type;
use crate::system_set::VrmSystemSets;
use crate::vrm::body_tracking::BodyTrackingPlugin;
use crate::vrm::humanoid_bone::VrmHumanoidBonePlugin;
use crate::vrm::initialize::VrmInitializePlugin;
use crate::vrm::loader::{VrmAsset, VrmLoaderPlugin};
use crate::vrm::look_at::LookAtPlugin;
use crate::vrm::node_constraint::VrmNodeConstraintPlugin;
use crate::vrm::spring_bone::VrmSpringBonePlugin;
use bevy::app::{AnimationSystems, App, Plugin};
use bevy::asset::AssetApp;
use bevy::prelude::*;
use bevy::transform::systems::{propagate_parent_transforms, sync_simple_transforms};
use expressions::VrmExpressionPlugin;
use mtoon::MtoonMaterialPlugin;
use std::path::PathBuf;
pub mod prelude {
pub use crate::vrm::{
Initialized, RestGlobalTransform, RestTransform, Vrm, VrmBone, VrmExpression, VrmPath,
VrmPlugin,
body_tracking::{BodyTracking, SmoothedGaze},
expressions::{
BinaryExpression, ClearExpressions, ExpressionEntityMap, ExpressionOverride,
ExpressionOverrideSettings, ExpressionOverrideType, ModifyExpressions, SetExpressions,
},
gltf::prelude::*,
humanoid_bone::prelude::*,
loader::{VrmAsset, VrmHandle},
look_at::LookAt,
mtoon::prelude::*,
spring_bone::{SpringJointProps, SpringJoints, SpringRoot},
};
}
new_type!(
name: VrmBone,
ty: String,
);
new_type!(
name: VrmExpression,
ty: String,
);
#[derive(Debug, Component, Reflect, Copy, Clone)]
#[reflect(Component)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", reflect(Serialize, Deserialize))]
pub struct Vrm;
impl Vrm {
pub const EXPRESSIONS_ROOT: &'static str = "VRMC_vrm.expressions";
pub const ROOT_BONE: &'static str = "VRMC_vrm.root_bone";
}
#[derive(Debug, Reflect, Clone, Component)]
#[reflect(Component)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", reflect(Serialize, Deserialize))]
pub struct VrmPath(pub PathBuf);
impl VrmPath {
pub fn new(path: impl Into<PathBuf>) -> Self {
Self(path.into())
}
}
#[derive(Debug, Copy, Clone, Component, Deref, Reflect, Default)]
#[reflect(Component)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", reflect(Serialize, Deserialize))]
pub struct RestTransform(pub Transform);
#[derive(Debug, Copy, Clone, Component, Deref, Reflect, Default)]
#[reflect(Component)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", reflect(Serialize, Deserialize))]
pub struct RestGlobalTransform(pub GlobalTransform);
marker_component!(
Initialized
);
pub struct VrmPlugin;
impl Plugin for VrmPlugin {
fn build(
&self,
app: &mut App,
) {
app.init_asset::<VrmAsset>().add_plugins((
VrmLoaderPlugin,
VrmInitializePlugin,
VrmSpringBonePlugin,
VrmHumanoidBonePlugin,
VrmExpressionPlugin,
VrmNodeConstraintPlugin,
MtoonMaterialPlugin,
LookAtPlugin,
BodyTrackingPlugin,
));
app.add_systems(
PostUpdate,
(sync_simple_transforms, propagate_parent_transforms)
.chain()
.in_set(VrmSystemSets::PropagateAfterConstraints)
.after(VrmSystemSets::Constraints)
.before(VrmSystemSets::GazeControl),
);
app.add_systems(
PostUpdate,
(sync_simple_transforms, propagate_parent_transforms)
.chain()
.in_set(VrmSystemSets::PropagateAfterExpressions)
.after(VrmSystemSets::Expressions)
.before(VrmSystemSets::SpringBone),
);
app.register_type::<Vrm>()
.register_type::<VrmPath>()
.register_type::<RestTransform>()
.register_type::<RestGlobalTransform>()
.register_type::<VrmBone>()
.register_type::<VrmExpression>()
.register_type::<Initialized>();
}
}