Compare commits
4 Commits
32b0cb6ea3
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 9dfe1cde73 | |||
| f45e06d292 | |||
| 2b51e93714 | |||
| 14d35e9a3e |
68
.junie/guidelines.md
Normal file
68
.junie/guidelines.md
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
# Project Guidelines
|
||||||
|
|
||||||
|
## Project overview
|
||||||
|
SteamAudioGodot is a Godot 4 GDExtension that integrates Valve’s Steam Audio SDK to provide physically based spatial audio (HRTF, occlusion, reflections, ray‑traced propagation). The repository builds a shared native library that Godot loads via a `.gdextension` manifest located under the demo addon.
|
||||||
|
|
||||||
|
- Language/tech: C++17, CMake, Godot 4 GDExtension, Steam Audio SDK, `godot-cpp` bindings
|
||||||
|
- Primary library target: `SteamAudioGodot` (shared library)
|
||||||
|
- Bindings target: `godot-cpp`
|
||||||
|
- Helper targets: `templates`, `generate_bindings`
|
||||||
|
- Entry point symbol: `steam_audio_library_init` (see `src/register_types.cpp`)
|
||||||
|
- Example registered classes: `SteamAudio`, `SteamAudioListener`, `SteamAudioSource`, `SteamAudioStaticMesh`, `SteamAudioDynamicMesh`, server singleton `SteamAudioServer`
|
||||||
|
|
||||||
|
### Repository layout (high level)
|
||||||
|
- `src/` — C++ sources for the GDExtension
|
||||||
|
- `extern/godot-cpp/` — Godot C++ bindings (submodule)
|
||||||
|
- `extern/steam-audio/` — Steam Audio SDK
|
||||||
|
- `support_files/lib/<platform>/` — Prebuilt runtime libs staged next to the built extension
|
||||||
|
- `demo/` — Example Godot project with the addon under `addons/SteamAudioGodot`
|
||||||
|
- `templates/` — CMake templates and supplemental files
|
||||||
|
- `Writerside/` — Documentation sources (JetBrains Writerside)
|
||||||
|
|
||||||
|
See also the detailed overview in `README.md` (sections: Overview, Building, Installing into a Godot project, Project structure).
|
||||||
|
|
||||||
|
## How Junie should build and verify
|
||||||
|
- Use the existing CLion CMake profile only.
|
||||||
|
- Active profile: `Debug`
|
||||||
|
- Build directory: `cmake-build-debug`
|
||||||
|
- Toolchain: local MinGW
|
||||||
|
- When a build is required, prefer building a specific target:
|
||||||
|
- Main target: `SteamAudioGodot`
|
||||||
|
- Example command (run via CLion profile environment): `cmake --build cmake-build-debug --target SteamAudioGodot`
|
||||||
|
- In this environment, always use the special CMake-profile execution tool when issuing build commands (not raw shell).
|
||||||
|
- Do not create new CMake build directories or presets unless explicitly requested.
|
||||||
|
- For documentation‑only or comments‑only changes: do not build.
|
||||||
|
- For native code or CMake changes: build `SteamAudioGodot` in Debug to smoke‑check.
|
||||||
|
|
||||||
|
### Build outputs (typical)
|
||||||
|
- Artifacts are written under the CMake build directory, e.g.: `cmake-build-debug/SteamAudioGodot/lib/<Platform-Arch>/`
|
||||||
|
- Runtime Steam Audio binaries are staged next to the built library after build.
|
||||||
|
|
||||||
|
## Tests policy
|
||||||
|
- There are currently no automated tests in this repository.
|
||||||
|
- Do not create or run tests unless explicitly requested for a task.
|
||||||
|
|
||||||
|
## Code style and contribution guidance
|
||||||
|
- Follow existing file/module style: indentation, naming, include order, and comments.
|
||||||
|
- C++ standard: C++17.
|
||||||
|
- Keep changes minimal and localized; avoid sweeping refactors unless requested.
|
||||||
|
- When renaming any code element (class/function/variable), use the project’s rename mechanism that updates all references consistently.
|
||||||
|
- Match Windows path separators (`\`) in paths and adapt shell commands to PowerShell when needed.
|
||||||
|
|
||||||
|
## Quick reference: CMake targets
|
||||||
|
- `SteamAudioGodot` — main shared library (GDExtension)
|
||||||
|
- `godot-cpp` — bindings library (dependency)
|
||||||
|
- `generate_bindings` — bindings generator (from `godot-cpp`)
|
||||||
|
- `templates` — installs helper files/templates
|
||||||
|
|
||||||
|
## When to run the application
|
||||||
|
- This repository produces a library to be loaded by Godot. Running the editor/project is generally outside the scope of routine CI checks here.
|
||||||
|
- To try the addon, open the `demo/` folder in Godot 4 after building and ensure the addon is present under `demo/addons/SteamAudioGodot`.
|
||||||
|
|
||||||
|
## Troubleshooting pointers
|
||||||
|
- Missing `godot-cpp` submodule: run `git submodule update --init --recursive`.
|
||||||
|
- Godot cannot load the extension: verify the `.gdextension` file library paths and that required runtime DLLs/SOs exist under `addons/SteamAudioGodot/lib/<Platform-Arch>/`.
|
||||||
|
|
||||||
|
## External API Documentation
|
||||||
|
- Steam Audio SDK: https://valvesoftware.github.io/steam-audio/doc/capi/index.html
|
||||||
|
- Godot GDExtension: https://docs.godotengine.org/en/stable
|
||||||
2
extern/godot-cpp
vendored
2
extern/godot-cpp
vendored
Submodule extern/godot-cpp updated: 449e37fa21...abe94570a1
2
extern/steam-audio
vendored
2
extern/steam-audio
vendored
Submodule extern/steam-audio updated: f398d69fa5...045a22238e
@@ -12,6 +12,8 @@ void initialize_steam_audio(ModuleInitializationLevel p_level) {
|
|||||||
if (p_level == MODULE_INITIALIZATION_LEVEL_SERVERS) {
|
if (p_level == MODULE_INITIALIZATION_LEVEL_SERVERS) {
|
||||||
GDREGISTER_CLASS(SteamAudioServer);
|
GDREGISTER_CLASS(SteamAudioServer);
|
||||||
srv = memnew(SteamAudioServer);
|
srv = memnew(SteamAudioServer);
|
||||||
|
Engine::get_singleton()->register_singleton("SteamAudioServer", srv);
|
||||||
|
srv->initialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p_level == MODULE_INITIALIZATION_LEVEL_SCENE) {
|
if (p_level == MODULE_INITIALIZATION_LEVEL_SCENE) {
|
||||||
@@ -28,6 +30,7 @@ void initialize_steam_audio(ModuleInitializationLevel p_level) {
|
|||||||
void uninitialize_steam_audio(ModuleInitializationLevel p_level) {
|
void uninitialize_steam_audio(ModuleInitializationLevel p_level) {
|
||||||
if (p_level == MODULE_INITIALIZATION_LEVEL_SERVERS) {
|
if (p_level == MODULE_INITIALIZATION_LEVEL_SERVERS) {
|
||||||
memdelete(srv);
|
memdelete(srv);
|
||||||
|
srv = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,15 +38,15 @@ void SteamAudioListener::_notification(int p_what) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SteamAudioListener::update_listener(IPLSimulator iplSim, IPLSimulationSharedInputs iplSimInputs) {
|
void SteamAudioListener::update_listener(IPLSimulator iplSim, IPLSimulationSharedInputs iplSimInputs) {
|
||||||
needs_update=false;
|
needs_update = false;
|
||||||
|
|
||||||
Transform3D transform = get_global_transform();
|
Transform3D transform = get_global_transform();
|
||||||
|
|
||||||
IPLCoordinateSpace3 space = SteamAudio::godot_to_ipl_space(transform);
|
IPLCoordinateSpace3 space = SteamAudio::godot_to_ipl_space(transform);
|
||||||
|
|
||||||
iplSimInputs.listener=space;
|
iplSimInputs.listener = space;
|
||||||
|
|
||||||
iplSimulatorSetSharedInputs(iplSim,IPL_SIMULATIONFLAGS_DIRECT,&iplSimInputs);
|
iplSimulatorSetSharedInputs(iplSim, IPL_SIMULATIONFLAGS_DIRECT, &iplSimInputs);
|
||||||
iplSimulatorSetSharedInputs(iplSim,IPL_SIMULATIONFLAGS_PATHING,&iplSimInputs);
|
iplSimulatorSetSharedInputs(iplSim, IPL_SIMULATIONFLAGS_PATHING, &iplSimInputs);
|
||||||
iplSimulatorSetSharedInputs(iplSim,IPL_SIMULATIONFLAGS_REFLECTIONS,&iplSimInputs);
|
iplSimulatorSetSharedInputs(iplSim, IPL_SIMULATIONFLAGS_REFLECTIONS, &iplSimInputs);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,11 +3,10 @@
|
|||||||
using namespace godot;
|
using namespace godot;
|
||||||
|
|
||||||
SteamAudioServer::SteamAudioServer() {
|
SteamAudioServer::SteamAudioServer() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SteamAudioServer::~SteamAudioServer() {
|
SteamAudioServer::~SteamAudioServer() {
|
||||||
shutdown();
|
shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Core Godot Methods
|
// Core Godot Methods
|
||||||
@@ -17,10 +16,13 @@ void SteamAudioServer::_bind_methods() {
|
|||||||
void SteamAudioServer::initialize() {
|
void SteamAudioServer::initialize() {
|
||||||
if (Engine::get_singleton()->is_editor_hint())
|
if (Engine::get_singleton()->is_editor_hint())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
IPLerror err = iplContextCreate(&ctxSettings,&ctx);
|
IPLerror err = iplContextCreate(&ctxSettings,&ctx);
|
||||||
|
|
||||||
if (err!=IPL_STATUS_SUCCESS) {
|
if (err!=IPL_STATUS_SUCCESS) {
|
||||||
ERR_PRINT("Failed to create IPL context");
|
ERR_PRINT("Failed to create IPL context");
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (static_cast<int>(proj_settings->get_setting("steam_audio/ray_tracer/RayTracer"))){
|
switch (static_cast<int>(proj_settings->get_setting("steam_audio/ray_tracer/RayTracer"))){
|
||||||
case 0:
|
case 0:
|
||||||
break;
|
break;
|
||||||
@@ -60,6 +62,8 @@ void SteamAudioServer::_notification(int p_what) {
|
|||||||
|
|
||||||
directThread->start(callable_mp(this,&SteamAudioServer::start_direct_thread),Thread::PRIORITY_NORMAL);
|
directThread->start(callable_mp(this,&SteamAudioServer::start_direct_thread),Thread::PRIORITY_NORMAL);
|
||||||
indirectThread->start(callable_mp(this,&SteamAudioServer::start_indirect_thread),Thread::PRIORITY_NORMAL);
|
indirectThread->start(callable_mp(this,&SteamAudioServer::start_indirect_thread),Thread::PRIORITY_NORMAL);
|
||||||
|
default:
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void SteamAudioServer::start_direct_thread() {
|
void SteamAudioServer::start_direct_thread() {
|
||||||
|
|||||||
@@ -1,21 +1,22 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <godot_cpp/classes/audio_frame.hpp>
|
#include <godot_cpp/classes/audio_frame.hpp>
|
||||||
|
#include <godot_cpp/classes/mutex.hpp>
|
||||||
#include <godot_cpp/classes/scene_tree.hpp>
|
#include <godot_cpp/classes/scene_tree.hpp>
|
||||||
|
#include <godot_cpp/classes/thread.hpp>
|
||||||
#include <godot_cpp/classes/wrapped.hpp>
|
#include <godot_cpp/classes/wrapped.hpp>
|
||||||
#include <godot_cpp/core/class_db.hpp>
|
#include <godot_cpp/core/class_db.hpp>
|
||||||
#include <godot_cpp/godot.hpp>
|
#include <godot_cpp/godot.hpp>
|
||||||
#include <godot_cpp/classes/thread.hpp>
|
|
||||||
#include <godot_cpp/classes/mutex.hpp>
|
|
||||||
#include <phonon.h>
|
#include <phonon.h>
|
||||||
#include <steam_audio.hpp>
|
#include <steam_audio.hpp>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
#include "steam_audio_dynamic_mesh.hpp"
|
#include "steam_audio_dynamic_mesh.hpp"
|
||||||
#include "steam_audio_source.hpp"
|
#include "steam_audio_source.hpp"
|
||||||
#include "steam_audio_static_mesh.hpp"
|
#include "steam_audio_static_mesh.hpp"
|
||||||
|
|
||||||
using namespace godot;
|
using namespace godot;
|
||||||
|
|
||||||
|
|
||||||
class SteamAudioServer : public Object {
|
class SteamAudioServer : public Object {
|
||||||
GDCLASS(SteamAudioServer, Object) // Godot class declaration macro
|
GDCLASS(SteamAudioServer, Object) // Godot class declaration macro
|
||||||
private:
|
private:
|
||||||
@@ -27,7 +28,7 @@ private:
|
|||||||
bool needs_processing = false;
|
bool needs_processing = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::unordered_map<SteamAudioSource*,AudioSourceData> audio_sources;
|
std::unordered_map<SteamAudioSource *, AudioSourceData> audio_sources;
|
||||||
Ref<Mutex> audio_mutex;
|
Ref<Mutex> audio_mutex;
|
||||||
IPLContext ctx=nullptr;
|
IPLContext ctx=nullptr;
|
||||||
IPLContextSettings ctxSettings;
|
IPLContextSettings ctxSettings;
|
||||||
@@ -47,8 +48,8 @@ private:
|
|||||||
Ref<Thread> indirectThread;
|
Ref<Thread> indirectThread;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SteamAudioServer(); // Constructor
|
SteamAudioServer();
|
||||||
~SteamAudioServer() override; // Destructor
|
~SteamAudioServer() override;
|
||||||
void _notification(int p_what);
|
void _notification(int p_what);
|
||||||
void register_audio_source(SteamAudioSource *source);
|
void register_audio_source(SteamAudioSource *source);
|
||||||
void unregister_audio_source(SteamAudioSource *source);
|
void unregister_audio_source(SteamAudioSource *source);
|
||||||
@@ -57,8 +58,11 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
|
|
||||||
|
public:
|
||||||
void initialize();
|
void initialize();
|
||||||
void shutdown();
|
void shutdown();
|
||||||
void start_direct_thread();
|
void start_direct_thread();
|
||||||
void start_indirect_thread();
|
void start_indirect_thread();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user