Skip to content

Commit 37e70a6

Browse files
committed
Added a simple on hit audio component. Cleanup some other stuff
1 parent 0023d4a commit 37e70a6

12 files changed

Lines changed: 175 additions & 51 deletions

File tree

engine/benches/my_benchmark.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@ use engine::render::render_body_resource::RenderBodyResource;
66
use std::hint::black_box;
77

88
use engine::physics::physics_resource::{CollisionFrameData, PhysicsResource};
9-
use engine::{
10-
CollisionLayer, CollisionSystem, ConvexCollider, TimeResource,
11-
TransformComponent,
12-
};
9+
use engine::{CollisionLayer, CollisionSystem, ConvexCollider, TimeResource, TransformComponent};
1310
use glam::{Quat, Vec3};
1411

1512
fn spawn_convex_grid(world: &mut World, count: usize, spacing: f32, radius: f32) {

engine/src/audio/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
pub mod audio_command_queue;
22
pub mod audio_command_queue_system;
33
pub mod audio_mixer;
4+
pub mod simple_phys_audio_system;
45
pub mod spatial_audio_system;
56
pub mod track;
67
pub mod voice;
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
use bevy_ecs::prelude::*;
2+
use glam::Vec3;
3+
4+
use crate::{
5+
TransformComponent,
6+
audio::audio_command_queue::{AudioCommand, AudioCommandQueue},
7+
components::simple_on_hit_audio_component::SimpleOnHitAudioComponent,
8+
physics::{
9+
collision_system::ordered_pair, physics_event::PhysicsEventType,
10+
physics_resource::CollisionFrameData,
11+
},
12+
};
13+
14+
pub struct SimplePhysAudioSystem {}
15+
16+
impl SimplePhysAudioSystem {
17+
pub fn on_hit_audio_system(
18+
query: Query<(&SimpleOnHitAudioComponent, &TransformComponent)>,
19+
collision_frame_data: Res<CollisionFrameData>,
20+
mut audio_command_queue: ResMut<AudioCommandQueue>,
21+
) {
22+
for manifold_entry in collision_frame_data.manifolds.iter() {
23+
let pair = ordered_pair(manifold_entry.entity_a, manifold_entry.entity_b);
24+
let event_type = if collision_frame_data.previous_manifolds.get(pair).is_some() {
25+
PhysicsEventType::Stay
26+
} else {
27+
PhysicsEventType::Hit
28+
};
29+
30+
match event_type {
31+
PhysicsEventType::Hit => {
32+
if query.get(manifold_entry.entity_a).is_ok() {
33+
let volume = query.get(manifold_entry.entity_a).unwrap().0.volume;
34+
let force_modifier = query
35+
.get(manifold_entry.entity_a)
36+
.unwrap()
37+
.0
38+
.force_volume_scale;
39+
let contact_force = manifold_entry
40+
.manifold
41+
.contacts
42+
.iter()
43+
.map(|c| c.penetration)
44+
.sum::<f32>();
45+
let final_volume =
46+
volume * (contact_force * force_modifier).clamp(0.0, 1.0);
47+
dbg!(final_volume);
48+
let sound_position = manifold_entry
49+
.manifold
50+
.contacts
51+
.iter()
52+
.map(|c| c.contact_point)
53+
.sum::<Vec3>()
54+
/ manifold_entry.manifold.contacts.len() as f32;
55+
audio_command_queue
56+
.queue
57+
.push(AudioCommand::PlaySoundAtLocation {
58+
track: 0,
59+
sound: query.get(manifold_entry.entity_a).unwrap().0.sound_handle,
60+
volume: final_volume,
61+
looping: false,
62+
location: sound_position,
63+
});
64+
}
65+
66+
if query.get(manifold_entry.entity_b).is_ok() {
67+
let volume = query.get(manifold_entry.entity_b).unwrap().0.volume;
68+
let force_modifier = query
69+
.get(manifold_entry.entity_b)
70+
.unwrap()
71+
.0
72+
.force_volume_scale;
73+
let contact_force = manifold_entry
74+
.manifold
75+
.contacts
76+
.iter()
77+
.map(|c| c.penetration)
78+
.sum::<f32>();
79+
let final_volume =
80+
volume * (contact_force * force_modifier).clamp(0.0, 1.0);
81+
dbg!(final_volume);
82+
let sound_position = manifold_entry
83+
.manifold
84+
.contacts
85+
.iter()
86+
.map(|c| c.contact_point)
87+
.sum::<Vec3>()
88+
/ manifold_entry.manifold.contacts.len() as f32;
89+
audio_command_queue
90+
.queue
91+
.push(AudioCommand::PlaySoundAtLocation {
92+
track: 0,
93+
sound: query.get(manifold_entry.entity_b).unwrap().0.sound_handle,
94+
volume: final_volume,
95+
looping: false,
96+
location: sound_position,
97+
});
98+
}
99+
}
100+
PhysicsEventType::Stay => continue,
101+
}
102+
}
103+
}
104+
}

engine/src/audio/voice.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ use glam::Vec3;
55

66
use crate::audio::audio_mixer::ListenerInfo;
77

8-
const ITD_DELAY_BUFFER_SIZE: usize = 64; // Must be a power of two
8+
const ITD_DELAY_BUFFER_SIZE: usize = 128;
99
const DEFAULT_SAMPLE_RATE_HZ: f32 = 44_100.0;
1010
const PAN_SMOOTH_TIME_SECONDS: f32 = 0.05;
1111
const BACK_LPF_MIX_MULT: f32 = 0.8;
12-
const LPF_CUTOFF_HZ: f32 = 200.0;
12+
const LPF_CUTOFF_HZ: f32 = 400.0;
1313

1414
#[derive(Debug)]
1515
pub(crate) struct Voice {
@@ -157,6 +157,7 @@ impl Voice {
157157
// Even though one side will always have a 0 sample delay let's just do the math for both sides to avoid
158158
// doing a ton of if statement evaluations each frame.
159159
let delay_signed = self.pan_smoothed * self.itd_delay.range as f32;
160+
// let delay_signed:f32 = 0.0;
160161
let left_delay = delay_signed.max(0.0);
161162
let right_delay = (-delay_signed).max(0.0);
162163
let itd_range_f32 = self.itd_delay.range as f32;

engine/src/components/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ pub mod material_component;
55
pub mod physics_component;
66
pub mod physics_event_listener_component;
77
pub mod render_body_component;
8+
pub mod simple_on_hit_audio_component;
89
pub mod single_audio_listener_component;
910
pub mod sleep_component;
1011
pub mod transform_component;
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
use bevy_ecs::prelude::*;
2+
3+
use crate::SoundHandle;
4+
5+
#[derive(Component)]
6+
pub struct SimpleOnHitAudioComponent {
7+
pub sound_handle: SoundHandle,
8+
pub volume: f32,
9+
pub pitch: f32,
10+
pub force_volume_scale: f32,
11+
}

engine/src/lib.rs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,15 @@ use glam::{Mat4, Vec3};
2323
use glow::HasContext;
2424

2525
use crate::{
26-
assets::{material_resource::MaterialResource, mesh_resource::MeshResource, shader_resource::ShaderResource, sound_resource::SoundResource, texture_resource::TextureResource},
26+
assets::{
27+
material_resource::MaterialResource, mesh_resource::MeshResource,
28+
shader_resource::ShaderResource, sound_resource::SoundResource,
29+
texture_resource::TextureResource,
30+
},
2731
audio::{
2832
audio_command_queue::AudioCommandQueue,
2933
audio_command_queue_system::AudioCommandQueueSystem, audio_mixer::AudioMixer,
30-
spatial_audio_system::SpatialAudioSystem,
34+
simple_phys_audio_system::SimplePhysAudioSystem, spatial_audio_system::SpatialAudioSystem,
3135
},
3236
components::physics_component::PhysicsComponent,
3337
input::InputStateResource,
@@ -38,7 +42,10 @@ use crate::{
3842
physics_system::PhysicsSystem,
3943
},
4044
render::{
41-
render_body_resource::RenderBodyResource, render_queue::RenderQueue, render_system::RenderSystem, renderer::{CameraRenderData, RenderParams, Renderer}
45+
render_body_resource::RenderBodyResource,
46+
render_queue::RenderQueue,
47+
render_system::RenderSystem,
48+
renderer::{CameraRenderData, RenderParams, Renderer},
4249
},
4350
utils::scope_timer::ScopeTimer,
4451
};
@@ -124,6 +131,7 @@ impl Engine {
124131
AudioCommandQueueSystem::build_command_queue,
125132
SpatialAudioSystem::update_listener_position,
126133
SpatialAudioSystem::update_source_positions,
134+
SimplePhysAudioSystem::on_hit_audio_system,
127135
)
128136
.chain(),
129137
);
@@ -253,10 +261,10 @@ impl Engine {
253261

254262
self.renderer.render(
255263
render_params,
256-
&mesh_resource,
257-
&material_resource,
258-
&texture_resource,
259-
&shader_resource,
264+
mesh_resource,
265+
material_resource,
266+
texture_resource,
267+
shader_resource,
260268
camera_data,
261269
);
262270
}

engine/src/physics/collision_system.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,11 @@ impl CollisionSystem {
4747
for (entity, transform, convex_collider, mesh_collider) in &query {
4848
// --- 1. Compute world AABB ---
4949
let world_aabb = if let Some(mesh_collider) = mesh_collider {
50-
if let Some(local_aabb) =
51-
render_body_local_aabb(mesh_collider.render_body_id, &render_body_resource, &mesh_resource)
52-
{
50+
if let Some(local_aabb) = render_body_local_aabb(
51+
mesh_collider.render_body_id,
52+
&render_body_resource,
53+
&mesh_resource,
54+
) {
5355
transform_aabb(local_aabb, transform)
5456
} else {
5557
continue;
@@ -112,8 +114,11 @@ impl CollisionSystem {
112114
) {
113115
for (entity, transform, convex_collider, mesh_collider) in &query {
114116
if let Some(mesh_collider) = mesh_collider
115-
&& let Some(local_aabb) =
116-
render_body_local_aabb(mesh_collider.render_body_id, &render_body_resource, &mesh_resource)
117+
&& let Some(local_aabb) = render_body_local_aabb(
118+
mesh_collider.render_body_id,
119+
&render_body_resource,
120+
&mesh_resource,
121+
)
117122
{
118123
let world_aabb = transform_aabb(local_aabb, transform);
119124
phys.world_aabbs.insert(entity, world_aabb);

engine/src/render/render_system.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ use crate::{
55
render_body_component::RenderBodyComponent, transform_component::TransformComponent,
66
},
77
render::{
8-
render_body_resource::RenderBodyResource, render_instance::RenderInstance, render_queue::RenderQueue
8+
render_body_resource::RenderBodyResource, render_instance::RenderInstance,
9+
render_queue::RenderQueue,
910
},
1011
};
1112

engine/src/render/renderer.rs

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@ use crate::{
1818
texture,
1919
texture_resource::TextureResource,
2020
},
21-
render::{
22-
frustum::Frustum, render_body_resource::RenderBodyResource, render_instance::RenderInstance,
23-
},
21+
render::{frustum::Frustum, render_instance::RenderInstance},
2422
};
2523

2624
pub struct Renderer {
@@ -503,9 +501,7 @@ impl Renderer {
503501
}
504502

505503
if !mesh_render_data.contains_key(mesh) {
506-
let mesh_data = mesh_resource
507-
.get_mesh(mesh)
508-
.expect("Mesh not found");
504+
let mesh_data = mesh_resource.get_mesh(mesh).expect("Mesh not found");
509505
Self::upload_mesh_to_gpu(gl, mesh_data, mesh, mesh_render_data);
510506
}
511507

@@ -529,11 +525,7 @@ impl Renderer {
529525
None
530526
};
531527

532-
for attrib in &shader_resource
533-
.get_shader(*shader)
534-
.unwrap()
535-
.attributes
536-
{
528+
for attrib in &shader_resource.get_shader(*shader).unwrap().attributes {
537529
let location = attrib.location;
538530
let divisor = match attrib.rate {
539531
PerVertex => 0,

0 commit comments

Comments
 (0)