diff --git a/assets/character/main_character.glb b/assets/character/main_character.glb index 869408d..42f7cc6 100644 Binary files a/assets/character/main_character.glb and b/assets/character/main_character.glb differ diff --git a/src/comps/core/markers/proxy/physics/rapier.rs b/src/comps/core/markers/proxy/physics/rapier.rs index 54c9708..40db6fc 100644 --- a/src/comps/core/markers/proxy/physics/rapier.rs +++ b/src/comps/core/markers/proxy/physics/rapier.rs @@ -1,4 +1,5 @@ use bevy::prelude::*; +use bevy_rapier3d::dynamics::RigidBody as RapierRigidBody; // use bevy::render::primitives::Aabb; use bevy_rapier3d::geometry::Collider as RapierCollider; use bevy_rapier3d::prelude::{ActiveEvents, ComputedColliderShape}; @@ -15,6 +16,14 @@ pub enum Collider { Mesh, } +#[derive(Component, Reflect, Default, Debug)] +#[reflect(Component)] +pub enum RigidBody { + #[default] + Fixed, + Dynamic, +} + #[derive(Component, Reflect, Default, Debug)] #[reflect(Component)] pub enum AutoAABBCollider { @@ -32,6 +41,10 @@ pub fn physics_replace_proxies( (Entity, &Collider, &Name, &mut Visibility), (Without, Added), >, + proxy_rigidbodies: Query< + (Entity, &RigidBody), + (Without, Added), + >, // needed for tri meshes children: Query<&Children>, @@ -71,20 +84,19 @@ pub fn physics_replace_proxies( ; } Collider::Mesh => { - println!("proxy: mesh"); + for (_, collider_mesh) in Mesh::search_in_children(entity, &children, &meshes, &mesh_handles) { + println!("Mesh"); rapier_collider = RapierCollider::from_bevy_mesh( collider_mesh, - &ComputedColliderShape::TriMesh, + &ComputedColliderShape::ConvexHull, ) .unwrap(); commands .entity(entity) .insert(rapier_collider); - // FIXME: this is just for demo purposes !!!; - //.insert(ActiveEvents::COLLISION_EVENTS); // .insert(ActiveEvents::COLLISION_EVENTS) // break; @@ -92,4 +104,14 @@ pub fn physics_replace_proxies( } } } + for (entity, proxy_rigidbody) in proxy_rigidbodies.iter() { + let rapier_rigidbody: RapierRigidBody; + match proxy_rigidbody { + RigidBody::Fixed => rapier_rigidbody = RapierRigidBody::Fixed, + RigidBody::Dynamic => rapier_rigidbody = RapierRigidBody::Dynamic, + } + commands + .entity(entity) + .insert(rapier_rigidbody); + } } \ No newline at end of file diff --git a/src/comps/core/markers/proxy/plugin.rs b/src/comps/core/markers/proxy/plugin.rs index f8209e2..d567ecc 100644 --- a/src/comps/core/markers/proxy/plugin.rs +++ b/src/comps/core/markers/proxy/plugin.rs @@ -22,6 +22,7 @@ impl Plugin for ProxyComponentsPlugin { // Physics app.register_type::(); app.register_type::(); + app.register_type::(); app.add_systems(Update, (physics_replace_proxies, update_game_load_state)); } } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 7d9be37..e8950dd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -31,13 +31,13 @@ fn setup_plugins(application: &mut App) { .add_plugins(DefaultPlugins.set(AssetPlugin::default())) //.add_plugins(DefaultInspectorConfigPlugin) .add_plugins(RapierPhysicsPlugin::::default()) + .add_plugins(RapierDebugRenderPlugin::default()) .add_plugins(ComponentsFromGltfPlugin) //.add_plugins(bevy_egui::EguiPlugin) //.add_plugins(WorldInspectorPlugin::new()) .add_plugins(proxy::plugin::ProxyComponentsPlugin) .add_plugins(MainGameUIPlugin) - .add_plugins(MainEditorUiPlugin) - ;//.add_plugins(RapierDebugRenderPlugin::default()); + .add_plugins(MainEditorUiPlugin); } fn load(application: &mut App) { diff --git a/src/setup/load_state.rs b/src/setup/load_state.rs index 8042fc9..d8de3ed 100644 --- a/src/setup/load_state.rs +++ b/src/setup/load_state.rs @@ -23,7 +23,7 @@ pub fn update_game_load_state( mut asset_event_reader: EventReader>, gltf_assets: Res, ) { - if let Some(asset_event) = asset_event_reader.read().next() { + for asset_event in asset_event_reader.read() { match asset_event { AssetEvent::Added { id } => { game_state.loaded_assets.push(*id);