mirror of
https://github.com/storytold/storyteller-bevy.git
synced 2026-10-18 00:23:14 +00:00
commit before changing some things
This commit is contained in:
@@ -689,6 +689,12 @@ impl Bvh {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_joint_by_name(&self, name: &str) -> Option<&JointData> {
|
||||
self.joints
|
||||
.iter()
|
||||
.find(|joint| joint.name_str().unwrap_or_default() == name)
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for Bvh {
|
||||
|
||||
+202
-86
@@ -8,8 +8,10 @@ use bevy::{
|
||||
},
|
||||
gltf::Gltf,
|
||||
prelude::*,
|
||||
render::INSTANCE_INDEX_SHADER_HANDLE,
|
||||
scene,
|
||||
transform::commands,
|
||||
ui::debug::print_ui_layout_tree,
|
||||
utils::hashbrown::HashMap,
|
||||
};
|
||||
use bevy_inspector_egui::egui::TextBuffer;
|
||||
@@ -20,7 +22,10 @@ use studio_bvh::{frames::Frame, joint};
|
||||
mod error;
|
||||
mod loader;
|
||||
|
||||
use crate::{debug::print_mat3, scene::SceneState};
|
||||
use crate::{
|
||||
debug::print_mat3,
|
||||
scene::{ActiveScene, SceneState},
|
||||
};
|
||||
|
||||
use self::loader::BvhLoader;
|
||||
|
||||
@@ -160,7 +165,6 @@ fn apply_frame<T: ReadOnlyWorldQuery>(
|
||||
.map(Entity::clone)
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
drop(joint_data);
|
||||
drop(joint_entity);
|
||||
|
||||
for child in children {
|
||||
@@ -195,7 +199,7 @@ pub trait CommandsSpawnBvhExt {
|
||||
|
||||
fn spawn_skined_bvh_with_transform(
|
||||
&mut self,
|
||||
asset: &Handle<Bvh>,
|
||||
asset: Handle<Bvh>,
|
||||
scene: Handle<Scene>,
|
||||
retarget_map: RetargetMap,
|
||||
transform: Transform,
|
||||
@@ -222,24 +226,18 @@ impl<'w, 's> CommandsSpawnBvhExt for Commands<'w, 's> {
|
||||
|
||||
fn spawn_skined_bvh_with_transform(
|
||||
&mut self,
|
||||
asset: &Handle<Bvh>,
|
||||
asset: Handle<Bvh>,
|
||||
scene: Handle<Scene>,
|
||||
retarget_map: RetargetMap,
|
||||
transform: Transform,
|
||||
) -> Entity {
|
||||
let entity = self.spawn_empty().id();
|
||||
let skinned_model = self
|
||||
.spawn(SceneBundle {
|
||||
scene,
|
||||
..Default::default()
|
||||
})
|
||||
.id();
|
||||
|
||||
self.add(SpawnBvhCommand(
|
||||
entity,
|
||||
asset.clone(),
|
||||
asset,
|
||||
transform,
|
||||
Some((skinned_model, retarget_map)),
|
||||
Some((scene, retarget_map)),
|
||||
));
|
||||
entity
|
||||
}
|
||||
@@ -249,10 +247,11 @@ pub struct SpawnBvhCommand(
|
||||
Entity,
|
||||
Handle<Bvh>,
|
||||
Transform,
|
||||
Option<(Entity, RetargetMap)>,
|
||||
Option<(Handle<Scene>, RetargetMap)>,
|
||||
);
|
||||
|
||||
impl Command for SpawnBvhCommand {
|
||||
//TODO: This loading process with have to be async eventually.
|
||||
fn apply(self, world: &mut World) {
|
||||
let bvh = {
|
||||
let Some(bvh) = world.get_resource::<Assets<Bvh>>().unwrap().get(&self.1) else {
|
||||
@@ -268,25 +267,60 @@ impl Command for SpawnBvhCommand {
|
||||
panic!("Could not create the BVH entity because the bvh file has no root joint")
|
||||
};
|
||||
|
||||
if let Some((skinned_model, retarget_map)) = self.3 {
|
||||
world.entity_mut(skinned_model).insert((
|
||||
BvhAnim {
|
||||
bvh: self.1,
|
||||
frame: 0,
|
||||
last_frame: 0,
|
||||
retarget: Some(retarget_map),
|
||||
should_play: true,
|
||||
timer: Timer::from_seconds(
|
||||
bvh.0.frame_time().as_secs_f32(),
|
||||
TimerMode::Repeating,
|
||||
),
|
||||
},
|
||||
Name::new("BVH Anim"),
|
||||
));
|
||||
if let Some((scene_handle, retarget_map)) = self.3 {
|
||||
println!("Starting Scene Spawn");
|
||||
let mut scene_spawner = SceneSpawner::from_world(world);
|
||||
|
||||
world.send_event(UpdateBVHAnim {
|
||||
entity: skinned_model,
|
||||
let id = match scene_spawner.spawn_sync(world, scene_handle.id()) {
|
||||
Ok(val) => val,
|
||||
Err(err) => {
|
||||
println!("There was an Error: {:?}", err);
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
for entity in scene_spawner.iter_instance_entities(id) {
|
||||
println!("Bone {:?}", entity);
|
||||
|
||||
let Ok(potential_bone_name) = world.query::<&Name>().get(&world, entity) else {
|
||||
continue;
|
||||
};
|
||||
let Some(mapped_bone_name) = retarget_map.map.get(potential_bone_name.as_str())
|
||||
else {
|
||||
continue;
|
||||
};
|
||||
let Some(bone_data) = bvh.0.get_joint_by_name(&mapped_bone_name) else {
|
||||
continue;
|
||||
};
|
||||
|
||||
println!("Bone Index {}", bone_data.index());
|
||||
|
||||
world.entity_mut(entity).insert(BvhJoint(bone_data.index()));
|
||||
}
|
||||
|
||||
world.insert_resource(ActiveScene {
|
||||
instance: id,
|
||||
source: scene_handle,
|
||||
});
|
||||
|
||||
// world.entity_mut(skinned_model).insert((
|
||||
// BvhAnim {
|
||||
// bvh: self.1,
|
||||
// frame: 0,
|
||||
// last_frame: 0,
|
||||
// retarget: Some(retarget_map),
|
||||
// should_play: true,
|
||||
// timer: Timer::from_seconds(
|
||||
// bvh.0.frame_time().as_secs_f32(),
|
||||
// TimerMode::Repeating,
|
||||
// ),
|
||||
// },
|
||||
// Name::new("BVH Anim"),
|
||||
// ));
|
||||
|
||||
// world.send_event(UpdateBVHAnim {
|
||||
// entity: skinned_model,
|
||||
// });
|
||||
} else {
|
||||
let entity = world.spawn_empty().id();
|
||||
spawn_bvh_recursive(world, &entity, root);
|
||||
@@ -323,8 +357,9 @@ pub struct UpdateBVHAnim {
|
||||
|
||||
fn update_bvh_anim(
|
||||
mut commands: Commands,
|
||||
mut bvh_anims: Query<(Entity, &BvhAnim, Option<&Children>)>,
|
||||
mut update_events: EventReader<UpdateBVHAnim>,
|
||||
bvh_anims: Query<(Entity, &BvhAnim, Option<&Children>)>,
|
||||
skinned_model_nodes: Query<(&Name, Option<&Children>)>,
|
||||
bvh_assets: Res<Assets<Bvh>>,
|
||||
) {
|
||||
for event in update_events.read() {
|
||||
@@ -338,11 +373,36 @@ fn update_bvh_anim(
|
||||
let Some(bvh) = bvh_assets.get(bvh_anim.1.bvh.id()) else {
|
||||
continue;
|
||||
};
|
||||
|
||||
println!("Children {:?}", bvh_anim.2);
|
||||
|
||||
if let Some(children) = bvh_anim.2 {
|
||||
for child in children {
|
||||
update_bvh_recursive(child, &mut commands, &bvh, &skinned_model_nodes);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
fn update_bvh_recursive(current_node: Entity, commands: &mut Commands, bvh_anim: &Bvh) {}
|
||||
fn update_bvh_recursive(
|
||||
current_node: &Entity,
|
||||
commands: &mut Commands,
|
||||
bvh_anim: &Bvh,
|
||||
skinned_model_nodes: &Query<(&Name, Option<&Children>)>,
|
||||
) {
|
||||
println!("Called Function");
|
||||
|
||||
let Ok((current_name, current_children)) = skinned_model_nodes.get(*current_node) else {
|
||||
return;
|
||||
};
|
||||
|
||||
if let Some(children) = current_children {
|
||||
for child in children.iter() {
|
||||
update_bvh_recursive(child, commands, bvh_anim, skinned_model_nodes);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
// Utility Functions
|
||||
@@ -411,61 +471,117 @@ pub struct RetargetMap {
|
||||
impl RetargetMap {
|
||||
pub fn mocap_to_rigify() -> RetargetMap {
|
||||
RetargetMap {
|
||||
// map: [
|
||||
// ("hip", "DEF-spine"),
|
||||
// ("abdomen", "DEF-spine.002"),
|
||||
// ("chest", "DEF-spine.003"),
|
||||
// ("neck", "DEF-spine.004"),
|
||||
// ("neck1", "DEF-spine.005"),
|
||||
// ("head", "DEF-spine.006"),
|
||||
// ("rCollar", "DEF-shoulder.R"),
|
||||
// ("rShldr", "DEF-upper_arm.R"),
|
||||
// ("rForeArm", "DEF-forearm.R"),
|
||||
// ("rHand", "DEF-hand.R"),
|
||||
// ("metacarpal1.r", "DEF-palm.01.R"),
|
||||
// ("finger2-1.r", "DEF-f_index.01.R"),
|
||||
// ("finger3-2.r", "DEF-f_middle.02.R"),
|
||||
// ("finger3-3.r", "DEF-f_middle.03.R"),
|
||||
// ("metacarpal3.r", "DEF-palm.03.R"),
|
||||
// ("finger4-1.r", "DEF-f_ring.01.R"),
|
||||
// ("finger4-2.r", "DEF-f_ring.02.R"),
|
||||
// ("finger4-3.r", "DEF-f_ring.03.R"),
|
||||
// ("metacarpal4.r", "DEF-palm.04.R"),
|
||||
// ("finger5-1.r", "DEF-f_pinky.01.R"),
|
||||
// ("finger5-2.r", "DEF-f_pinky.02.R"),
|
||||
// ("finger5-3.r", "DEF-f_pinky.03.R"),
|
||||
// ("rthumb", "DEF-thumb.01.R"),
|
||||
// ("finger1-2.r", "DEF-thumb.02.R"),
|
||||
// ("finger1-3.r", "DEF-thumb.03.R"),
|
||||
// ("rThigh", "DEF-thumb.03.R"),
|
||||
// ("rShin", "DEF-shin.R"),
|
||||
// ("rFoot", "DEF-foot.R"),
|
||||
// ("lCollar", "DEF-shoulder.L"),
|
||||
// ("lShldr", "DEF-upper_arm.L"),
|
||||
// ("lForeArm", "DEF-forearm.L"),
|
||||
// ("lHand", "DEF-hand.L"),
|
||||
// ("metacarpal1.l", "DEF-palm.01.L"),
|
||||
// ("finger2-1.l", "DEF-f_index.01.L"),
|
||||
// ("finger2-2.l", "DEF-f_index.02.L"),
|
||||
// ("finger2-3.l", "DEF-f_index.03.L"),
|
||||
// ("metacarpal2.l", "DEF-palm.02.L"),
|
||||
// ("finger3-1.l", "DEF-f_middle.01.L"),
|
||||
// ("finger3-2.l", "DEF-f_middle.02.L"),
|
||||
// ("finger3-3.l", "DEF-f_middle.03.L"),
|
||||
// ("metacarpal3.l", "DEF-palm.03.L"),
|
||||
// ("finger4-1.l", "DEF-f_ring.01.L"),
|
||||
// ("finger4-2.l", "DEF-f_ring.02.L"),
|
||||
// ("finger4-3.l", "DEF-f_ring.03.L"),
|
||||
// ("metacarpal4.l", "DEF-palm.04.L"),
|
||||
// ("finger5-1.l", "DEF-f_pinky.01.L"),
|
||||
// ("finger5-2.l", "DEF-f_pinky.02.L"),
|
||||
// ("finger5-3.l", "DEF-f_pinky.03.L"),
|
||||
// ("lthumb", "DEF-thumb.01.L"),
|
||||
// ("finger1-2.l", "DEF-thumb.02.L"),
|
||||
// ("finger1-3.l", "DEF-thumb.03.L"),
|
||||
// ("lThigh", "DEF-thigh.L"),
|
||||
// ("lShin", "DEF-shin.L"),
|
||||
// ("lFoot", "DEF-foot.L"),
|
||||
// ]
|
||||
map: [
|
||||
("hip", "DEF-spine"),
|
||||
("abdomen", "DEF-spine.002"),
|
||||
("chest", "DEF-spine.003"),
|
||||
("neck", "DEF-spine.004"),
|
||||
("neck1", "DEF-spine.005"),
|
||||
("head", "DEF-spine.006"),
|
||||
("rCollar", "DEF-shoulder.R"),
|
||||
("rShldr", "DEF-upper_arm.R"),
|
||||
("rForeArm", "DEF-forearm.R"),
|
||||
("rHand", "DEF-hand.R"),
|
||||
("metacarpal1.r", "DEF-palm.01.R"),
|
||||
("finger2-1.r", "DEF-f_index.01.R"),
|
||||
("finger3-2.r", "DEF-f_middle.02.R"),
|
||||
("finger3-3.r", "DEF-f_middle.03.R"),
|
||||
("metacarpal3.r", "DEF-palm.03.R"),
|
||||
("finger4-1.r", "DEF-f_ring.01.R"),
|
||||
("finger4-2.r", "DEF-f_ring.02.R"),
|
||||
("finger4-3.r", "DEF-f_ring.03.R"),
|
||||
("metacarpal4.r", "DEF-palm.04.R"),
|
||||
("finger5-1.r", "DEF-f_pinky.01.R"),
|
||||
("finger5-2.r", "DEF-f_pinky.02.R"),
|
||||
("finger5-3.r", "DEF-f_pinky.03.R"),
|
||||
("rthumb", "DEF-thumb.01.R"),
|
||||
("finger1-2.r", "DEF-thumb.02.R"),
|
||||
("finger1-3.r", "DEF-thumb.03.R"),
|
||||
("rThigh", "DEF-thumb.03.R"),
|
||||
("rShin", "DEF-shin.R"),
|
||||
("rFoot", "DEF-foot.R"),
|
||||
("lCollar", "DEF-shoulder.L"),
|
||||
("lShldr", "DEF-upper_arm.L"),
|
||||
("lForeArm", "DEF-forearm.L"),
|
||||
("lHand", "DEF-hand.L"),
|
||||
("metacarpal1.l", "DEF-palm.01.L"),
|
||||
("finger2-1.l", "DEF-f_index.01.L"),
|
||||
("finger2-2.l", "DEF-f_index.02.L"),
|
||||
("finger2-3.l", "DEF-f_index.03.L"),
|
||||
("metacarpal2.l", "DEF-palm.02.L"),
|
||||
("finger3-1.l", "DEF-f_middle.01.L"),
|
||||
("finger3-2.l", "DEF-f_middle.02.L"),
|
||||
("finger3-3.l", "DEF-f_middle.03.L"),
|
||||
("metacarpal3.l", "DEF-palm.03.L"),
|
||||
("finger4-1.l", "DEF-f_ring.01.L"),
|
||||
("finger4-2.l", "DEF-f_ring.02.L"),
|
||||
("finger4-3.l", "DEF-f_ring.03.L"),
|
||||
("metacarpal4.l", "DEF-palm.04.L"),
|
||||
("finger5-1.l", "DEF-f_pinky.01.L"),
|
||||
("finger5-2.l", "DEF-f_pinky.02.L"),
|
||||
("finger5-3.l", "DEF-f_pinky.03.L"),
|
||||
("lthumb", "DEF-thumb.01.L"),
|
||||
("finger1-2.l", "DEF-thumb.02.L"),
|
||||
("finger1-3.l", "DEF-thumb.03.L"),
|
||||
("lThigh", "DEF-thigh.L"),
|
||||
("lShin", "DEF-shin.L"),
|
||||
("lFoot", "DEF-foot.L"),
|
||||
("DEF-spine", "hip"),
|
||||
("DEF-spine.002", "abdomen"),
|
||||
("DEF-spine.003", "chest"),
|
||||
("DEF-spine.004", "neck"),
|
||||
("DEF-spine.005", "neck1"),
|
||||
("DEF-spine.006", "head"),
|
||||
("DEF-shoulder.R", "rCollar"),
|
||||
("DEF-upper_arm.R", "rShldr"),
|
||||
("DEF-forearm.R", "rForeArm"),
|
||||
("DEF-hand.R", "rHand"),
|
||||
("DEF-palm.01.R", "metacarpal1.r"),
|
||||
("DEF-f_index.01.R", "finger2-1.r"),
|
||||
("DEF-f_middle.02.R", "finger3-2.r"),
|
||||
("DEF-f_middle.03.R", "finger3-3.r"),
|
||||
("DEF-palm.03.R", "metacarpal3.r"),
|
||||
("DEF-f_ring.01.R", "finger4-1.r"),
|
||||
("DEF-f_ring.02.R", "finger4-2.r"),
|
||||
("DEF-f_ring.03.R", "finger4-3.r"),
|
||||
("DEF-palm.04.R", "metacarpal4.r"),
|
||||
("DEF-f_pinky.01.R", "finger5-1.r"),
|
||||
("DEF-f_pinky.02.R", "finger5-2.r"),
|
||||
("DEF-f_pinky.03.R", "finger5-3.r"),
|
||||
("DEF-thumb.01.R", "rthumb"),
|
||||
("DEF-thumb.02.R", "finger1-2.r"),
|
||||
("DEF-thumb.03.R", "finger1-3.r"),
|
||||
("DEF-thumb.03.R", "rThigh"),
|
||||
("DEF-shin.R", "rShin"),
|
||||
("DEF-foot.R", "rFoot"),
|
||||
("DEF-shoulder.L", "lCollar"),
|
||||
("DEF-upper_arm.L", "lShldr"),
|
||||
("DEF-forearm.L", "lForeArm"),
|
||||
("DEF-hand.L", "lHand"),
|
||||
("DEF-palm.01.L", "metacarpal1.l"),
|
||||
("DEF-f_index.01.L", "finger2-1.l"),
|
||||
("DEF-f_index.02.L", "finger2-2.l"),
|
||||
("DEF-f_index.03.L", "finger2-3.l"),
|
||||
("DEF-palm.02.L", "metacarpal2.l"),
|
||||
("DEF-f_middle.01.L", "finger3-1.l"),
|
||||
("DEF-f_middle.02.L", "finger3-2.l"),
|
||||
("DEF-f_middle.03.L", "finger3-3.l"),
|
||||
("DEF-palm.03.L", "metacarpal3.l"),
|
||||
("DEF-f_ring.01.L", "finger4-1.l"),
|
||||
("DEF-f_ring.02.L", "finger4-2.l"),
|
||||
("DEF-f_ring.03.L", "finger4-3.l"),
|
||||
("DEF-palm.04.L", "metacarpal4.l"),
|
||||
("DEF-f_pinky.01.L", "finger5-1.l"),
|
||||
("DEF-f_pinky.02.L", "finger5-2.l"),
|
||||
("DEF-f_pinky.03.L", "finger5-3.l"),
|
||||
("DEF-thumb.01.L", "lthumb"),
|
||||
("DEF-thumb.02.L", "finger1-2.l"),
|
||||
("DEF-thumb.03.L", "finger1-3.l"),
|
||||
("DEF-thigh.L", "lThigh"),
|
||||
("DEF-shin.L", "lShin"),
|
||||
("DEF-foot.L", "lFoot"),
|
||||
]
|
||||
.iter()
|
||||
.map(|v| (v.0.to_string(), v.1.to_string()))
|
||||
|
||||
+1
-1
@@ -87,7 +87,7 @@ pub fn init(viewport_size: ViewportSize) {
|
||||
Startup,
|
||||
(move |mut cmd: Commands, mut ew: EventWriter<LoadSceneEvent>| {
|
||||
cmd.insert_resource(SkyboxId("gum_trees_4k".to_string()));
|
||||
ew.send(LoadSceneEvent("Alien".to_string()));
|
||||
ew.send(LoadSceneEvent("base-human-female".to_string()));
|
||||
})
|
||||
)
|
||||
// .add_systems(
|
||||
|
||||
+73
-66
@@ -11,6 +11,7 @@ use bevy::{
|
||||
prelude::*,
|
||||
render::{mesh::skinning::SkinnedMesh, primitives::Aabb, view::NoFrustumCulling},
|
||||
scene::InstanceId,
|
||||
transform::commands,
|
||||
};
|
||||
|
||||
#[cfg(feature = "wasm")]
|
||||
@@ -88,13 +89,13 @@ pub enum SceneState {
|
||||
}
|
||||
|
||||
#[derive(Resource, Deref, DerefMut)]
|
||||
struct PendingScene(pub Handle<Gltf>);
|
||||
struct PendingScene(pub Handle<Scene>);
|
||||
|
||||
#[derive(Resource, Deref)]
|
||||
pub struct ActiveScene {
|
||||
#[deref]
|
||||
pub instance: InstanceId,
|
||||
pub source: Handle<Gltf>,
|
||||
pub source: Handle<Scene>,
|
||||
}
|
||||
|
||||
#[derive(Event, Deref)]
|
||||
@@ -150,7 +151,7 @@ fn initialize(mut cmd: Commands, r_assets: Res<AssetServer>) {
|
||||
));
|
||||
|
||||
// TODO
|
||||
cmd.insert_resource(TestBvh(r_assets.load("mocap/shuffle.bvh")));
|
||||
cmd.insert_resource(TestBvh(r_assets.load("mocap/scott.bvh")));
|
||||
}
|
||||
|
||||
// TODO
|
||||
@@ -160,19 +161,19 @@ fn spawn_test_bvh(
|
||||
r_bvh: Res<TestBvh>,
|
||||
mut asset_server: ResMut<AssetServer>,
|
||||
) {
|
||||
for event in er_bvh_events.read() {
|
||||
if matches!(event, AssetEvent::LoadedWithDependencies { .. }) {
|
||||
commands.spawn_skined_bvh_with_transform(
|
||||
&r_bvh.0,
|
||||
asset_server.load("gltf/base-human-female.gltf#Scene0"),
|
||||
RetargetMap::mocap_to_rigify(),
|
||||
Transform::from_scale(Vec3::splat(1.0))
|
||||
.with_translation(Vec3::new(0., 1.0, -0.024)),
|
||||
);
|
||||
// for event in er_bvh_events.read() {
|
||||
// if matches!(event, AssetEvent::LoadedWithDependencies { .. }) {
|
||||
// commands.spawn_skined_bvh_with_transform(
|
||||
// &r_bvh.0,
|
||||
// asset_server.load("gltf/base-human-female.gltf#Scene0"),
|
||||
// RetargetMap::mocap_to_rigify(),
|
||||
// Transform::from_scale(Vec3::splat(1.0))
|
||||
// .with_translation(Vec3::new(0., 1.0, -0.024)),
|
||||
// );
|
||||
|
||||
commands.spawn_bvh_with_transform(&r_bvh.0, Transform::from_xyz(0.0, 1.0, -0.024));
|
||||
}
|
||||
}
|
||||
// commands.spawn_bvh_with_transform(&r_bvh.0, Transform::from_xyz(0.0, 1.0, -0.024));
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
fn init_scene_loading(
|
||||
@@ -184,7 +185,7 @@ fn init_scene_loading(
|
||||
) {
|
||||
if let Some(id) = er.read().last() {
|
||||
let name = &**id;
|
||||
let path = format!("gltf/{name}.glb");
|
||||
let path = format!("gltf/{name}.gltf#Scene0");
|
||||
|
||||
// Avoid trying to re-load this scene if it's already active
|
||||
if let Some(active_scene_path) =
|
||||
@@ -208,17 +209,14 @@ fn despawn_previous_scene(mut cmd: Commands, q_scene_root: Query<Entity, With<Sc
|
||||
|
||||
fn tick_scene_loading(
|
||||
r_pending_scene: Res<PendingScene>,
|
||||
ra_gltfs: Res<Assets<Gltf>>,
|
||||
ra_gltfs: Res<Assets<Scene>>,
|
||||
mut er_scene_events: EventReader<AssetEvent<Scene>>,
|
||||
mut st_next: ResMut<NextState<SceneState>>,
|
||||
) {
|
||||
for event in er_scene_events.read() {
|
||||
if let AssetEvent::LoadedWithDependencies { id } = event {
|
||||
let gltf = ra_gltfs.get(&**r_pending_scene).unwrap();
|
||||
if gltf.default_scene.is_some() && gltf.default_scene.as_ref().unwrap().id() == *id {
|
||||
st_next.set(SceneState::Spawning);
|
||||
break;
|
||||
}
|
||||
st_next.set(SceneState::Spawning);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -227,30 +225,39 @@ fn spawn_next_scene(
|
||||
mut cmd: Commands,
|
||||
ra_gltfs: Res<Assets<Gltf>>,
|
||||
r_pending_scene: Res<PendingScene>,
|
||||
test_bvh: Res<TestBvh>,
|
||||
mut asset_server: ResMut<AssetServer>,
|
||||
mut r_scene_spawner: ResMut<SceneSpawner>,
|
||||
) {
|
||||
let gltf = ra_gltfs.get(&**r_pending_scene).unwrap();
|
||||
let scene = gltf
|
||||
.default_scene
|
||||
.as_ref()
|
||||
.expect("Expected glTF to include a default scene");
|
||||
println!("Spawning Scene");
|
||||
cmd.spawn_skined_bvh_with_transform(
|
||||
test_bvh.0.clone(),
|
||||
r_pending_scene.0.clone(),
|
||||
RetargetMap::mocap_to_rigify(),
|
||||
Transform::default(),
|
||||
);
|
||||
// let gltf = ra_gltfs.get(&**r_pending_scene).unwrap();
|
||||
// let scene = gltf
|
||||
// .default_scene
|
||||
// .as_ref()
|
||||
// .expect("Expected glTF to include a default scene");
|
||||
|
||||
let parent = cmd
|
||||
.spawn((
|
||||
Name::new("Scene"),
|
||||
SceneRoot,
|
||||
SceneElement,
|
||||
SpatialBundle::default(),
|
||||
))
|
||||
.id();
|
||||
// let parent = cmd
|
||||
// .spawn((
|
||||
// Name::new("Scene"),
|
||||
// SceneRoot,
|
||||
// SceneElement,
|
||||
// SpatialBundle::default(),
|
||||
// ))
|
||||
// .id();
|
||||
|
||||
let instance = r_scene_spawner.spawn_as_child(scene.clone(), parent);
|
||||
// let instance = r_scene_spawner.spawn_as_child(scene.clone(), parent);
|
||||
|
||||
cmd.remove_resource::<PendingScene>();
|
||||
cmd.insert_resource(ActiveScene {
|
||||
instance,
|
||||
source: r_pending_scene.clone(),
|
||||
});
|
||||
// cmd.remove_resource::<PendingScene>();
|
||||
// cmd.insert_resource(ActiveScene {
|
||||
// instance,
|
||||
// source: r_pending_scene.clone(),
|
||||
// });
|
||||
}
|
||||
|
||||
fn tick_scene_spawning(
|
||||
@@ -270,7 +277,7 @@ fn tag_scene_elements(
|
||||
mut cmd: Commands,
|
||||
r_scene_spawner: Res<SceneSpawner>,
|
||||
r_active_scene: Res<ActiveScene>,
|
||||
ra_gltfs: Res<Assets<Gltf>>,
|
||||
ra_gltfs: Res<Assets<Scene>>,
|
||||
// A "glTF mesh" is actually a container for one or more "glTF primitives",
|
||||
// which is basically a bundle of vertices paired with the material used to
|
||||
// shade them. It's those "sub-meshes" that carry the actual mesh handles,
|
||||
@@ -281,33 +288,33 @@ fn tag_scene_elements(
|
||||
q_named_non_primitives: Query<&Name, Without<Handle<Mesh>>>,
|
||||
q_skinned_meshes: Query<&SkinnedMesh>,
|
||||
) {
|
||||
let gltf = ra_gltfs.get(&r_active_scene.source).unwrap();
|
||||
// let gltf = ra_gltfs.get(&r_active_scene.source).unwrap();
|
||||
|
||||
for (ent, name) in r_scene_spawner
|
||||
.iter_instance_entities(**r_active_scene)
|
||||
.filter_map(|ent| match q_named_non_primitives.get(ent) {
|
||||
Ok(name) => Some((ent, name)),
|
||||
_ => None,
|
||||
})
|
||||
{
|
||||
if gltf.named_nodes.contains_key(&**name) {
|
||||
cmd.entity(ent).insert(SceneElement);
|
||||
}
|
||||
}
|
||||
// for (ent, name) in r_scene_spawner
|
||||
// .iter_instance_entities(**r_active_scene)
|
||||
// .filter_map(|ent| match q_named_non_primitives.get(ent) {
|
||||
// Ok(name) => Some((ent, name)),
|
||||
// _ => None,
|
||||
// })
|
||||
// {
|
||||
// if gltf.named_nodes.contains_key(&**name) {
|
||||
// cmd.entity(ent).insert(SceneElement);
|
||||
// }
|
||||
// }
|
||||
|
||||
for (ent, skinned_mesh) in r_scene_spawner
|
||||
.iter_instance_entities(**r_active_scene)
|
||||
.filter_map(|ent| match q_skinned_meshes.get(ent) {
|
||||
Ok(skinned_mesh) => Some((ent, skinned_mesh)),
|
||||
_ => None,
|
||||
})
|
||||
{
|
||||
cmd.entity(ent).insert(NoFrustumCulling);
|
||||
// for (ent, skinned_mesh) in r_scene_spawner
|
||||
// .iter_instance_entities(**r_active_scene)
|
||||
// .filter_map(|ent| match q_skinned_meshes.get(ent) {
|
||||
// Ok(skinned_mesh) => Some((ent, skinned_mesh)),
|
||||
// _ => None,
|
||||
// })
|
||||
// {
|
||||
// cmd.entity(ent).insert(NoFrustumCulling);
|
||||
|
||||
for &joint in skinned_mesh.joints.iter() {
|
||||
cmd.entity(joint).insert(SkeletalJoint(Color::BLACK));
|
||||
}
|
||||
}
|
||||
// for &joint in skinned_mesh.joints.iter() {
|
||||
// cmd.entity(joint).insert(SkeletalJoint(Color::BLACK));
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
fn spawn_main_scene_light(
|
||||
|
||||
Reference in New Issue
Block a user