From a554ef339b23d460938a33534fcccb995d495dc9 Mon Sep 17 00:00:00 2001 From: Bigfoot71 Date: Wed, 9 Apr 2025 17:27:45 +0200 Subject: [PATCH 1/3] add `audio_sound_positionning` example --- examples/audio/audio_sound_positioning.c | 115 +++++++++++++++++++++ examples/audio/audio_sound_positioning.png | Bin 0 -> 12217 bytes 2 files changed, 115 insertions(+) create mode 100644 examples/audio/audio_sound_positioning.c create mode 100644 examples/audio/audio_sound_positioning.png diff --git a/examples/audio/audio_sound_positioning.c b/examples/audio/audio_sound_positioning.c new file mode 100644 index 000000000..4c78b66e3 --- /dev/null +++ b/examples/audio/audio_sound_positioning.c @@ -0,0 +1,115 @@ +/******************************************************************************************* +* +* raylib [audio] example - Playing spatialized 3D sound +* +* Example complexity rating: [★★☆☆] 2/4 +* +* Example originally created with raylib 5.5, last time updated with raylib 5.5 +* +* Example contributed by Le Juez Victor (@Bigfoot71) and reviewed by Ramon Santamaria (@raysan5) +* +* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified, +* BSD-like license that allows static linking with closed source software +* +* Copyright (c) 2025 Le Juez Victor (@Bigfoot71) +* +********************************************************************************************/ + +#include +#include + +//------------------------------------------------------------------------------------ +// Sound positioning function +//------------------------------------------------------------------------------------ +static void SetSoundPosition(Camera listener, Sound sound, Vector3 position, float maxDist) +{ + // Calculate direction vector and distance between listener and sound source + Vector3 direction = Vector3Subtract(position, listener.position); + float distance = Vector3Length(direction); + + // Apply logarithmic distance attenuation and clamp between 0-1 + float attenuation = 1.0f / (1.0f + (distance / maxDist)); + attenuation = Clamp(attenuation, 0.0f, 1.0f); + + // Calculate normalized vectors for spatial positioning + Vector3 normalizedDirection = Vector3Normalize(direction); + Vector3 forward = Vector3Normalize(Vector3Subtract(listener.target, listener.position)); + Vector3 right = Vector3Normalize(Vector3CrossProduct(forward, listener.up)); + + // Reduce volume for sounds behind the listener + float dotProduct = Vector3DotProduct(forward, normalizedDirection); + if (dotProduct < 0.0f) { + attenuation *= (1.0f + dotProduct * 0.5f); + } + + // Set stereo panning based on sound position relative to listener + float pan = 0.5f + 0.5f * Vector3DotProduct(normalizedDirection, right); + + // Apply final sound properties + SetSoundVolume(sound, attenuation); + SetSoundPan(sound, pan); +} + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +int main(void) +{ + // Initialization + //-------------------------------------------------------------------------------------- + InitWindow(800, 600, "Quick Spatial Sound"); + InitAudioDevice(); + + SetTargetFPS(60); + DisableCursor(); + + Sound sound = LoadSound("resources/coin.wav"); + + Camera camera = { + .position = (Vector3) { 0, 5, 5 }, + .target = (Vector3) { 0, 0, 0 }, + .up = (Vector3) { 0, 1, 0 }, + .fovy = 60, + }; + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) + { + // Update + //---------------------------------------------------------------------------------- + UpdateCamera(&camera, CAMERA_FREE); + + float th = GetTime(); + + Vector3 spherePos = { + .x = 5.0f * cosf(th), + .y = 0.0f, + .z = 5.0f * sinf(th) + }; + + SetSoundPosition(camera, sound, spherePos, 20.0f); + if (!IsSoundPlaying(sound)) PlaySound(sound); + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + { + ClearBackground(BLACK); + + BeginMode3D(camera); + DrawGrid(10, 2); + DrawSphere(spherePos, 0.5f, RED); + EndMode3D(); + } + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + UnloadSound(sound); + CloseAudioDevice(); + CloseWindow(); +} diff --git a/examples/audio/audio_sound_positioning.png b/examples/audio/audio_sound_positioning.png new file mode 100644 index 0000000000000000000000000000000000000000..3e7a8ffdd0362afc0840717bc176d30d6f1daa0a GIT binary patch literal 12217 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 bJYa+h5Z2}sQN;ecJg+48PPX!`N$~#x Date: Wed, 9 Apr 2025 18:09:32 +0200 Subject: [PATCH 2/3] update example makefiles --- examples/Makefile | 1 + examples/Makefile.Web | 1 + 2 files changed, 2 insertions(+) diff --git a/examples/Makefile b/examples/Makefile index 5f2a18c6f..be7770894 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -652,6 +652,7 @@ AUDIO = \ audio/audio_raw_stream \ audio/audio_sound_loading \ audio/audio_sound_multi \ + audio/audio_sound_positioning \ audio/audio_stream_effects OTHERS = \ diff --git a/examples/Makefile.Web b/examples/Makefile.Web index 7ec6868e2..85e25f9e7 100644 --- a/examples/Makefile.Web +++ b/examples/Makefile.Web @@ -534,6 +534,7 @@ AUDIO = \ audio/audio_raw_stream \ audio/audio_sound_loading \ audio/audio_sound_multi \ + audio/audio_sound_positioning \ audio/audio_stream_effects OTHERS = \ From 59dc53d20edf6353442322e49cafb1092441d3f7 Mon Sep 17 00:00:00 2001 From: Bigfoot71 Date: Wed, 9 Apr 2025 18:09:50 +0200 Subject: [PATCH 3/3] update readme --- examples/README.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/examples/README.md b/examples/README.md index 38daad717..055e24d3c 100644 --- a/examples/README.md +++ b/examples/README.md @@ -215,6 +215,7 @@ Examples using raylib audio functionality, including sound/music loading and pla | 146 | [audio_mixed_processor](audio/audio_mixed_processor.c) | audio_mixed_processor | ⭐️⭐️⭐️⭐️ | 4.2 | 4.2 | [hkc](https://github.com/hatkidchan) | | 147 | [audio_stream_effects](audio/audio_stream_effects.c) | audio_stream_effects | ⭐️⭐️⭐️⭐️ | 4.2 | 5.0 | [Ray](https://github.com/raysan5) | | 148 | [audio_sound_multi](audio/audio_sound_multi.c) | audio_sound_multi | ⭐️⭐️☆☆ | 4.6 | 4.6 | [Jeffery Myers](https://github.com/JeffM2501) | +| 149 | [audio_sound_positioning](audio/audio_sound_positioning.c) | audio_sound_positioning | ⭐️⭐️☆☆ | 5.5 | 5.5 | [Le Juez Victor](https://github.com/Bigfoot71) | ### category: others @@ -222,12 +223,12 @@ Examples showing raylib misc functionality that does not fit in other categories | ## | example | image | difficulty
level | version
created | last version
updated | original
developer | |----|----------|--------|:-------------------:|:------------------:|:-----------------------:|:----------------------| -| 149 | [rlgl_standalone](others/rlgl_standalone.c) | rlgl_standalone | ⭐️⭐️⭐️⭐️ | 1.6 | 4.0 | [Ray](https://github.com/raysan5) | -| 150 | [rlgl_compute_shader](others/rlgl_compute_shader.c) | rlgl_compute_shader | ⭐️⭐️⭐️⭐️ | 4.0 | 4.0 | [Teddy Astie](https://github.com/tsnake41) | -| 151 | [easings_testbed](others/easings_testbed.c) | easings_testbed | ⭐️⭐️⭐️☆ | 2.5 | 3.0 | [Juan Miguel López](https://github.com/flashback-fx) | -| 152 | [raylib_opengl_interop](others/raylib_opengl_interop.c) | raylib_opengl_interop | ⭐️⭐️⭐️⭐️ | 3.8 | 4.0 | [Stephan Soller](https://github.com/arkanis) | -| 153 | [embedded_files_loading](others/embedded_files_loading.c) | embedded_files_loading | ⭐️⭐️☆☆ | 3.0 | 3.5 | [Kristian Holmgren](https://github.com/defutura) | -| 154 | [raymath_vector_angle](others/raymath_vector_angle.c) | raymath_vector_angle | ⭐️⭐️☆☆ | 1.0 | 4.6 | [Ray](https://github.com/raysan5) | +| 150 | [rlgl_standalone](others/rlgl_standalone.c) | rlgl_standalone | ⭐️⭐️⭐️⭐️ | 1.6 | 4.0 | [Ray](https://github.com/raysan5) | +| 151 | [rlgl_compute_shader](others/rlgl_compute_shader.c) | rlgl_compute_shader | ⭐️⭐️⭐️⭐️ | 4.0 | 4.0 | [Teddy Astie](https://github.com/tsnake41) | +| 152 | [easings_testbed](others/easings_testbed.c) | easings_testbed | ⭐️⭐️⭐️☆ | 2.5 | 3.0 | [Juan Miguel López](https://github.com/flashback-fx) | +| 153 | [raylib_opengl_interop](others/raylib_opengl_interop.c) | raylib_opengl_interop | ⭐️⭐️⭐️⭐️ | 3.8 | 4.0 | [Stephan Soller](https://github.com/arkanis) | +| 154 | [embedded_files_loading](others/embedded_files_loading.c) | embedded_files_loading | ⭐️⭐️☆☆ | 3.0 | 3.5 | [Kristian Holmgren](https://github.com/defutura) | +| 155 | [raymath_vector_angle](others/raymath_vector_angle.c) | raymath_vector_angle | ⭐️⭐️☆☆ | 1.0 | 4.6 | [Ray](https://github.com/raysan5) | As always contributions are welcome, feel free to send new examples! Here is an [examples template](examples_template.c) to start with!