diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml
index bd53bf4..52c8d90 100644
--- a/.github/workflows/cicd.yml
+++ b/.github/workflows/cicd.yml
@@ -17,7 +17,7 @@ on:
jobs:
build-game:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-22.04
steps:
- name: checkout
uses: actions/checkout@v4
@@ -115,7 +115,7 @@ jobs:
test-linux-build:
needs: build-game
- runs-on: ubuntu-latest
+ runs-on: ubuntu-22.04
if: ${{ !startsWith(github.ref, 'refs/tags/') }}
steps:
- name: Download Linux artifact
diff --git a/.github/workflows/discord.yml b/.github/workflows/discord.yml
index e3c34ce..e5e607a 100644
--- a/.github/workflows/discord.yml
+++ b/.github/workflows/discord.yml
@@ -5,7 +5,7 @@ on:
jobs:
notify-reviewers:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-22.04
steps:
- name: Send Discord notification
env:
diff --git a/.github/workflows/pr_comment_artifact.yml b/.github/workflows/pr_comment_artifact.yml
index 4990e7f..50e00e2 100644
--- a/.github/workflows/pr_comment_artifact.yml
+++ b/.github/workflows/pr_comment_artifact.yml
@@ -11,7 +11,7 @@ on:
jobs:
comment-on-pr:
if: github.event.workflow_run.conclusion == 'success'
- runs-on: ubuntu-latest
+ runs-on: ubuntu-22.04
steps:
- name: Get Artifact URL & PR Info
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 4695e7d..c0938dc 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -10,7 +10,7 @@ on:
jobs:
pre-commit:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v3
@@ -19,7 +19,7 @@ jobs:
# This could be a pre-commit hook but it's quite expensive, so we only run it on CI
godot-validator:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-22.04
steps:
- name: checkout
uses: actions/checkout@v4
@@ -34,7 +34,7 @@ jobs:
tests:
# The type of runner that the job will run on
- runs-on: ubuntu-latest
+ runs-on: ubuntu-22.04
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
diff --git a/src/addons/fmod/FmodManager.gd b/src/addons/fmod/FmodManager.gd
new file mode 100644
index 0000000..172b033
--- /dev/null
+++ b/src/addons/fmod/FmodManager.gd
@@ -0,0 +1,19 @@
+@tool
+extends Node
+
+var performance_display: PerformancesDisplay
+
+func _ready():
+ process_mode = PROCESS_MODE_ALWAYS
+ performance_display = PerformancesDisplay.new()
+ add_child(performance_display)
+
+func _exit_tree() -> void:
+ remove_child(performance_display)
+ performance_display.free()
+
+func _process(delta):
+ FmodServer.update()
+
+func _notification(what):
+ FmodServer.notification(what)
diff --git a/src/addons/fmod/FmodManager.gd.uid b/src/addons/fmod/FmodManager.gd.uid
new file mode 100644
index 0000000..8f9ac60
--- /dev/null
+++ b/src/addons/fmod/FmodManager.gd.uid
@@ -0,0 +1 @@
+uid://cds10pm7hwn3p
diff --git a/src/addons/fmod/FmodPlugin.gd b/src/addons/fmod/FmodPlugin.gd
new file mode 100644
index 0000000..eba98bd
--- /dev/null
+++ b/src/addons/fmod/FmodPlugin.gd
@@ -0,0 +1,78 @@
+@tool
+class_name FmodPlugin extends EditorPlugin
+
+
+const ADDON_PATH = "res://addons/fmod"
+
+
+@onready var theme = get_editor_interface().get_base_control().get_theme()
+
+
+var fmod_bank_explorer_window: PackedScene = load("res://addons/fmod/tool/ui/FmodBankExplorer.tscn")
+var bank_explorer: FmodBankExplorer
+var fmod_button: Button
+var export_plugin = FmodEditorExportPlugin.new()
+var emitter_inspector_plugin = FmodEmitterPropertyInspectorPlugin.new(self)
+var bank_loader_inspector_plugin = FmodBankLoaderPropertyInspectorPlugin.new(self)
+
+
+func _init():
+ FmodBankDatabase.reload_all_banks()
+
+ add_autoload_singleton("FmodManager", "res://addons/fmod/FmodManager.gd")
+ fmod_button = Button.new()
+ fmod_button.icon = load("res://addons/fmod/icons/fmod_icon.svg")
+ fmod_button.text = "Fmod Explorer"
+
+ fmod_button.pressed.connect(_on_project_explorer_button_clicked)
+
+ add_control_to_container(EditorPlugin.CONTAINER_TOOLBAR, fmod_button)
+
+ bank_explorer = fmod_bank_explorer_window.instantiate()
+ bank_explorer.theme = get_editor_interface().get_base_control().get_theme()
+ bank_explorer.visible = false
+ add_child(bank_explorer)
+
+ add_inspector_plugin(bank_loader_inspector_plugin)
+ add_inspector_plugin(emitter_inspector_plugin)
+
+
+func _on_project_explorer_button_clicked():
+ bank_explorer.should_display_copy_buttons = true
+ bank_explorer.should_display_select_button = false
+ _popup_project_explorer(FmodBankExplorer.ToDisplayFlags.BANKS | FmodBankExplorer.ToDisplayFlags.BUSES | FmodBankExplorer.ToDisplayFlags.VCA | FmodBankExplorer.ToDisplayFlags.EVENTS)
+
+
+func open_project_explorer_events(on_select_callable: Callable):
+ _open_project_explorer(FmodBankExplorer.ToDisplayFlags.BANKS | FmodBankExplorer.ToDisplayFlags.EVENTS, on_select_callable)
+
+
+func open_project_explorer_bank(on_select_callable: Callable):
+ _open_project_explorer(FmodBankExplorer.ToDisplayFlags.BANKS, on_select_callable)
+
+
+func _open_project_explorer(display_flag: int, on_select_callable: Callable):
+ bank_explorer.should_display_copy_buttons = false
+ bank_explorer.should_display_select_button = true
+ _popup_project_explorer(display_flag, on_select_callable)
+
+
+func _popup_project_explorer(to_display: int, callable: Callable = Callable()):
+ if bank_explorer.visible == true:
+ bank_explorer.close_window()
+ return
+ bank_explorer.regenerate_tree(to_display, callable)
+ bank_explorer.popup_centered()
+
+
+func _enter_tree():
+ add_export_plugin(export_plugin)
+
+
+func _exit_tree():
+ remove_inspector_plugin(emitter_inspector_plugin)
+ remove_inspector_plugin(bank_loader_inspector_plugin)
+
+ remove_control_from_container(EditorPlugin.CONTAINER_TOOLBAR, fmod_button)
+ fmod_button.queue_free()
+ remove_export_plugin(export_plugin)
diff --git a/src/addons/fmod/FmodPlugin.gd.uid b/src/addons/fmod/FmodPlugin.gd.uid
new file mode 100644
index 0000000..6ab96c7
--- /dev/null
+++ b/src/addons/fmod/FmodPlugin.gd.uid
@@ -0,0 +1 @@
+uid://cwsif6rhp50p5
diff --git a/src/addons/fmod/fmod.gdextension b/src/addons/fmod/fmod.gdextension
new file mode 100644
index 0000000..4f49914
--- /dev/null
+++ b/src/addons/fmod/fmod.gdextension
@@ -0,0 +1,101 @@
+[configuration]
+entry_symbol = "fmod_library_init"
+compatibility_minimum = 4.2
+
+[libraries]
+windows.editor.x86_64 = "res://addons/fmod/libs/windows/libGodotFmod.windows.editor.x86_64.dll"
+windows.debug.x86_64 = "res://addons/fmod/libs/windows/libGodotFmod.windows.template_debug.x86_64.dll"
+windows.release.x86_64 = "res://addons/fmod/libs/windows/libGodotFmod.windows.template_release.x86_64.dll"
+macos.editor = "res://addons/fmod/libs/macos/libGodotFmod.macos.editor.framework"
+macos.debug = "res://addons/fmod/libs/macos/libGodotFmod.macos.template_debug.framework"
+macos.release = "res://addons/fmod/libs/macos/libGodotFmod.macos.template_release.framework"
+linux.editor.x86_64 = "res://addons/fmod/libs/linux/libGodotFmod.linux.editor.x86_64.so"
+linux.debug.x86_64 = "res://addons/fmod/libs/linux/libGodotFmod.linux.template_debug.x86_64.so"
+linux.release.x86_64 = "res://addons/fmod/libs/linux/libGodotFmod.linux.template_release.x86_64.so"
+android.debug.x86_64 = "res://addons/fmod/libs/android/x86_64/libGodotFmod.android.template_debug.x86_64.so"
+android.release.x86_64 = "res://addons/fmod/libs/android/x86_64/libGodotFmod.android.template_release.x86_64.so"
+android.debug.arm64 = "res://addons/fmod/libs/android/arm64/libGodotFmod.android.template_debug.arm64.so"
+android.release.arm64 = "res://addons/fmod/libs/android/arm64/libGodotFmod.android.template_release.arm64.so"
+ios.debug = "res://addons/fmod/libs/ios/libGodotFmod.ios.template_debug.xcframework"
+ios.release = "res://addons/fmod/libs/ios/libGodotFmod.ios.template_release.xcframework"
+
+[icons]
+FmodEventEmitter2D = "res://addons/fmod/icons/fmod_icon.svg"
+FmodEventEmitter3D = "res://addons/fmod/icons/fmod_icon.svg"
+FmodListener2D = "res://addons/fmod/icons/fmod_icon.svg"
+FmodListener3D = "res://addons/fmod/icons/fmod_icon.svg"
+FmodBankLoader = "res://addons/fmod/icons/fmod_icon.svg"
+
+[dependencies]
+windows.editor.x86_64 = {
+"libs/windows/fmodL.dll": "",
+"libs/windows/fmodstudioL.dll": ""
+}
+windows.debug.x86_64 = {
+"libs/windows/fmodL.dll": "",
+"libs/windows/fmodstudioL.dll": ""
+}
+windows.release.x86_64 = {
+"libs/windows/fmod.dll": "",
+"libs/windows/fmodstudio.dll": ""
+}
+linux.editor.x86_64 = {
+"libs/linux/libfmodL.so": "",
+"libs/linux/libfmodL.so.14": "",
+"libs/linux/libfmodL.so.14.6": "",
+"libs/linux/libfmodstudioL.so": "",
+"libs/linux/libfmodstudioL.so.14": "",
+"libs/linux/libfmodstudioL.so.14.6": ""
+}
+linux.debug.x86_64 = {
+"libs/linux/libfmodL.so": "",
+"libs/linux/libfmodL.so.14": "",
+"libs/linux/libfmodL.so.14.6": "",
+"libs/linux/libfmodstudioL.so": "",
+"libs/linux/libfmodstudioL.so.14": "",
+"libs/linux/libfmodstudioL.so.14.6": ""
+}
+linux.release.x86_64 = {
+"libs/linux/libfmod.so": "",
+"libs/linux/libfmod.so.14": "",
+"libs/linux/libfmod.so.14.6": "",
+"libs/linux/libfmodstudio.so": "",
+"libs/linux/libfmodstudio.so.14": "",
+"libs/linux/libfmodstudio.so.14.6": ""
+}
+macos.editor = {
+"libs/macos/libfmodL.dylib": "",
+"libs/macos/libfmodstudioL.dylib": ""
+}
+macos.debug = {
+"libs/macos/libfmodL.dylib": "",
+"libs/macos/libfmodstudioL.dylib": ""
+}
+macos.release = {
+"libs/macos/libfmod.dylib": "",
+"libs/macos/libfmodstudio.dylib": ""
+}
+android.debug.x86_64 = {
+"libs/android/x86_64/libfmodL.so": "",
+"libs/android/x86_64/libfmodstudioL.so": "",
+}
+android.release.x86_64 = {
+"libs/android/x86_64/libfmod.so": "",
+"libs/android/x86_64/libfmodstudio.so": "",
+}
+android.debug.arm64 = {
+"libs/android/arm64/libfmodL.so": "",
+"libs/android/arm64/libfmodstudioL.so": "",
+}
+android.release.arm64 = {
+"libs/android/arm64/libfmod.so": "",
+"libs/android/arm64/libfmodstudio.so": "",
+}
+ios.debug = {
+"libs/ios/libfmodL_iphoneos.a": "",
+"libs/ios/libfmodstudioL_iphoneos.a": ""
+}
+ios.release = {
+"libs/ios/libfmod_iphoneos.a": "",
+"libs/ios/libfmodstudio_iphoneos.a": ""
+}
\ No newline at end of file
diff --git a/src/addons/fmod/fmod.gdextension.uid b/src/addons/fmod/fmod.gdextension.uid
new file mode 100644
index 0000000..7e95cfe
--- /dev/null
+++ b/src/addons/fmod/fmod.gdextension.uid
@@ -0,0 +1 @@
+uid://dq17s7r52klxe
diff --git a/src/addons/fmod/icons/bank_icon.svg b/src/addons/fmod/icons/bank_icon.svg
new file mode 100644
index 0000000..7aef6f3
--- /dev/null
+++ b/src/addons/fmod/icons/bank_icon.svg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6edb5ac7f7d94c70b6e2c00aea8bb1ca78bf28012a035501ee99ecd3e4c5849f
+size 1651
diff --git a/src/addons/fmod/icons/bank_icon.svg.import b/src/addons/fmod/icons/bank_icon.svg.import
new file mode 100644
index 0000000..7959a54
--- /dev/null
+++ b/src/addons/fmod/icons/bank_icon.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://o2chsr07oeqs"
+path="res://.godot/imported/bank_icon.svg-8de6c7bff09a67352e162b3c61b601de.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/fmod/icons/bank_icon.svg"
+dest_files=["res://.godot/imported/bank_icon.svg-8de6c7bff09a67352e162b3c61b601de.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/src/addons/fmod/icons/bus_icon.svg b/src/addons/fmod/icons/bus_icon.svg
new file mode 100644
index 0000000..e133361
--- /dev/null
+++ b/src/addons/fmod/icons/bus_icon.svg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1231a7aa73ad6aaf67236737c193109b728359872e82b67892c909ace105807d
+size 1649
diff --git a/src/addons/fmod/icons/bus_icon.svg.import b/src/addons/fmod/icons/bus_icon.svg.import
new file mode 100644
index 0000000..904ef45
--- /dev/null
+++ b/src/addons/fmod/icons/bus_icon.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dj1kag4aeg58t"
+path="res://.godot/imported/bus_icon.svg-f536ffd3c4893e79a9d3cb9a1b4fb50c.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/fmod/icons/bus_icon.svg"
+dest_files=["res://.godot/imported/bus_icon.svg-f536ffd3c4893e79a9d3cb9a1b4fb50c.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/src/addons/fmod/icons/c_parameter_icon.svg b/src/addons/fmod/icons/c_parameter_icon.svg
new file mode 100644
index 0000000..648e281
--- /dev/null
+++ b/src/addons/fmod/icons/c_parameter_icon.svg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9da90a559464eaab6f1699b1d1da9f4572d9e860cbb3eb620a50f6549cd5ac8c
+size 1025
diff --git a/src/addons/fmod/icons/c_parameter_icon.svg.import b/src/addons/fmod/icons/c_parameter_icon.svg.import
new file mode 100644
index 0000000..09f585b
--- /dev/null
+++ b/src/addons/fmod/icons/c_parameter_icon.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cmvcqfsl167te"
+path="res://.godot/imported/c_parameter_icon.svg-04115c2482c9a6874356ffdc09c41db0.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/fmod/icons/c_parameter_icon.svg"
+dest_files=["res://.godot/imported/c_parameter_icon.svg-04115c2482c9a6874356ffdc09c41db0.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/src/addons/fmod/icons/d_parameter_icon.svg b/src/addons/fmod/icons/d_parameter_icon.svg
new file mode 100644
index 0000000..eee7818
--- /dev/null
+++ b/src/addons/fmod/icons/d_parameter_icon.svg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ce8ec93cf51108867a96f21c6f0f11c1e3b3e30908acc4a4338fb9d3f54269d4
+size 773
diff --git a/src/addons/fmod/icons/d_parameter_icon.svg.import b/src/addons/fmod/icons/d_parameter_icon.svg.import
new file mode 100644
index 0000000..d5ef9cf
--- /dev/null
+++ b/src/addons/fmod/icons/d_parameter_icon.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dgna04txtwnyb"
+path="res://.godot/imported/d_parameter_icon.svg-d339e4e3f950ae8593b999ef51579136.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/fmod/icons/d_parameter_icon.svg"
+dest_files=["res://.godot/imported/d_parameter_icon.svg-d339e4e3f950ae8593b999ef51579136.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/src/addons/fmod/icons/event_icon.svg b/src/addons/fmod/icons/event_icon.svg
new file mode 100644
index 0000000..e290211
--- /dev/null
+++ b/src/addons/fmod/icons/event_icon.svg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9f20160ba866c11c277239ac233b451a9c3603493b493414405d2ae4ca107a43
+size 1159
diff --git a/src/addons/fmod/icons/event_icon.svg.import b/src/addons/fmod/icons/event_icon.svg.import
new file mode 100644
index 0000000..fd49058
--- /dev/null
+++ b/src/addons/fmod/icons/event_icon.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cmpgmbn3y4svl"
+path="res://.godot/imported/event_icon.svg-4e6e2103d076f95b7bef82f079e433e6.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/fmod/icons/event_icon.svg"
+dest_files=["res://.godot/imported/event_icon.svg-4e6e2103d076f95b7bef82f079e433e6.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/src/addons/fmod/icons/fmod_emitter.png b/src/addons/fmod/icons/fmod_emitter.png
new file mode 100644
index 0000000..ec46926
--- /dev/null
+++ b/src/addons/fmod/icons/fmod_emitter.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:37f711e44a8e20ef12568b84c78e0c93721c01065f36ea7544aef71ffec6ea7c
+size 535
diff --git a/src/addons/fmod/icons/fmod_emitter.png.import b/src/addons/fmod/icons/fmod_emitter.png.import
new file mode 100644
index 0000000..b12e6e8
--- /dev/null
+++ b/src/addons/fmod/icons/fmod_emitter.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cotpb54utx6d6"
+path="res://.godot/imported/fmod_emitter.png-6783a287e298e2a04e64a6deaa6fe366.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/fmod/icons/fmod_emitter.png"
+dest_files=["res://.godot/imported/fmod_emitter.png-6783a287e298e2a04e64a6deaa6fe366.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/src/addons/fmod/icons/fmod_icon.svg b/src/addons/fmod/icons/fmod_icon.svg
new file mode 100644
index 0000000..29fb87e
--- /dev/null
+++ b/src/addons/fmod/icons/fmod_icon.svg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:734e563ba529e5b4d1954297a102e810e0f05a6959b4714398168a39345cb659
+size 4481
diff --git a/src/addons/fmod/icons/fmod_icon.svg.import b/src/addons/fmod/icons/fmod_icon.svg.import
new file mode 100644
index 0000000..cd78f8b
--- /dev/null
+++ b/src/addons/fmod/icons/fmod_icon.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bwqq5q7kodk40"
+path="res://.godot/imported/fmod_icon.svg-cca7eb13231881fafaea0d598d407ea3.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/fmod/icons/fmod_icon.svg"
+dest_files=["res://.godot/imported/fmod_icon.svg-cca7eb13231881fafaea0d598d407ea3.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/src/addons/fmod/icons/snapshot_icon.svg b/src/addons/fmod/icons/snapshot_icon.svg
new file mode 100644
index 0000000..ef8c058
--- /dev/null
+++ b/src/addons/fmod/icons/snapshot_icon.svg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:16750974a44374711fea653929148cfd6f27c42d0629f1672b1595601443d620
+size 1162
diff --git a/src/addons/fmod/icons/snapshot_icon.svg.import b/src/addons/fmod/icons/snapshot_icon.svg.import
new file mode 100644
index 0000000..f06df82
--- /dev/null
+++ b/src/addons/fmod/icons/snapshot_icon.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b4jxbh86chubi"
+path="res://.godot/imported/snapshot_icon.svg-7b517248819b3685844766808fbce2a5.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/fmod/icons/snapshot_icon.svg"
+dest_files=["res://.godot/imported/snapshot_icon.svg-7b517248819b3685844766808fbce2a5.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/src/addons/fmod/icons/vca_icon.svg b/src/addons/fmod/icons/vca_icon.svg
new file mode 100644
index 0000000..54967c1
--- /dev/null
+++ b/src/addons/fmod/icons/vca_icon.svg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b4c5fb21cce10e19680f3dc9a8da863873e90b188cee302e7fc5de83fb04db07
+size 1649
diff --git a/src/addons/fmod/icons/vca_icon.svg.import b/src/addons/fmod/icons/vca_icon.svg.import
new file mode 100644
index 0000000..fb5c289
--- /dev/null
+++ b/src/addons/fmod/icons/vca_icon.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://crsj4jjaeq87a"
+path="res://.godot/imported/vca_icon.svg-def43f27fe148a7a0b18c7dcaab20c79.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/fmod/icons/vca_icon.svg"
+dest_files=["res://.godot/imported/vca_icon.svg-def43f27fe148a7a0b18c7dcaab20c79.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/src/addons/fmod/libs/android/arm64/CopyPast_Fmod_Libs_Here.txt b/src/addons/fmod/libs/android/arm64/CopyPast_Fmod_Libs_Here.txt
new file mode 100644
index 0000000..e69de29
diff --git a/src/addons/fmod/libs/android/arm64/libGodotFmod.android.editor.arm64.so b/src/addons/fmod/libs/android/arm64/libGodotFmod.android.editor.arm64.so
new file mode 100644
index 0000000..36341d4
--- /dev/null
+++ b/src/addons/fmod/libs/android/arm64/libGodotFmod.android.editor.arm64.so
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:91047f5012e3a2acdf4e8c559c4fe4496ca871f23ba1ce87b77ba4c31e656085
+size 2050144
diff --git a/src/addons/fmod/libs/android/arm64/libGodotFmod.android.template_debug.arm64.so b/src/addons/fmod/libs/android/arm64/libGodotFmod.android.template_debug.arm64.so
new file mode 100644
index 0000000..4e421e6
--- /dev/null
+++ b/src/addons/fmod/libs/android/arm64/libGodotFmod.android.template_debug.arm64.so
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ea946d3e07511effbc59697c6cb545c65059b0f1d6b11947d7f42db1902d6595
+size 1713560
diff --git a/src/addons/fmod/libs/android/arm64/libGodotFmod.android.template_release.arm64.so b/src/addons/fmod/libs/android/arm64/libGodotFmod.android.template_release.arm64.so
new file mode 100644
index 0000000..af5cf54
--- /dev/null
+++ b/src/addons/fmod/libs/android/arm64/libGodotFmod.android.template_release.arm64.so
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:267cab7a3d5aa88282ca33b571fafad5d642c9b4dffda8baaa7ebb2ba363b2ee
+size 1589152
diff --git a/src/addons/fmod/libs/android/arm64/libfmod.so b/src/addons/fmod/libs/android/arm64/libfmod.so
new file mode 100644
index 0000000..7d185e5
--- /dev/null
+++ b/src/addons/fmod/libs/android/arm64/libfmod.so
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:39b30fa72de6b9abbed0336bc8c40dc00976af9ba3804d84e3ebd49f5a7fc2d6
+size 1467600
diff --git a/src/addons/fmod/libs/android/arm64/libfmodL.so b/src/addons/fmod/libs/android/arm64/libfmodL.so
new file mode 100644
index 0000000..63614f6
--- /dev/null
+++ b/src/addons/fmod/libs/android/arm64/libfmodL.so
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1e52620c1be1b27925cb887ac48b48d71a1056930c34cc288bccd9a5645e6f12
+size 1654784
diff --git a/src/addons/fmod/libs/android/arm64/libfmodstudio.so b/src/addons/fmod/libs/android/arm64/libfmodstudio.so
new file mode 100644
index 0000000..94366c9
--- /dev/null
+++ b/src/addons/fmod/libs/android/arm64/libfmodstudio.so
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3b832388b360f29f543652cfa786cd9dde00d1e1960678c999253f7fddfed9f8
+size 1285912
diff --git a/src/addons/fmod/libs/android/arm64/libfmodstudioL.so b/src/addons/fmod/libs/android/arm64/libfmodstudioL.so
new file mode 100644
index 0000000..0580268
--- /dev/null
+++ b/src/addons/fmod/libs/android/arm64/libfmodstudioL.so
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e9e4a6c55b952e95a5138655408a6f5d59f112f15409b9ec5c200a22cfa8c85f
+size 1810168
diff --git a/src/addons/fmod/libs/iOS/CopyPast_Fmod_Libs_Here.txt b/src/addons/fmod/libs/iOS/CopyPast_Fmod_Libs_Here.txt
new file mode 100644
index 0000000..e69de29
diff --git a/src/addons/fmod/libs/iOS/libGodotFmod.ios.template_debug.xcframework/Info.plist b/src/addons/fmod/libs/iOS/libGodotFmod.ios.template_debug.xcframework/Info.plist
new file mode 100644
index 0000000..83dc063
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libGodotFmod.ios.template_debug.xcframework/Info.plist
@@ -0,0 +1,29 @@
+
+
+
+
+ AvailableLibraries
+
+
+ BinaryPath
+ libGodotFmod.ios.template_debug.universal.dylib
+ LibraryIdentifier
+ ios-arm64
+ LibraryPath
+ libGodotFmod.ios.template_debug.universal.dylib
+ SupportedArchitectures
+
+ arm64
+
+ SupportedPlatform
+ ios
+
+
+ CFBundlePackageType
+ XFWK
+ MinimumOSVersion
+ 12.0
+ XCFrameworkFormatVersion
+ 1.0
+
+
diff --git a/src/addons/fmod/libs/iOS/libGodotFmod.ios.template_debug.xcframework/ios-arm64/libGodotFmod.ios.template_debug.universal.dylib b/src/addons/fmod/libs/iOS/libGodotFmod.ios.template_debug.xcframework/ios-arm64/libGodotFmod.ios.template_debug.universal.dylib
new file mode 100644
index 0000000..06c628c
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libGodotFmod.ios.template_debug.xcframework/ios-arm64/libGodotFmod.ios.template_debug.universal.dylib
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:255cf3007b7d41189d191d3f4af50d88dcbb9f9d99a2f8d367d81ce844840208
+size 5410968
diff --git a/src/addons/fmod/libs/iOS/libGodotFmod.ios.template_release.xcframework/Info.plist b/src/addons/fmod/libs/iOS/libGodotFmod.ios.template_release.xcframework/Info.plist
new file mode 100644
index 0000000..e83cd6b
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libGodotFmod.ios.template_release.xcframework/Info.plist
@@ -0,0 +1,29 @@
+
+
+
+
+ AvailableLibraries
+
+
+ BinaryPath
+ libGodotFmod.ios.template_release.universal.dylib
+ LibraryIdentifier
+ ios-arm64
+ LibraryPath
+ libGodotFmod.ios.template_release.universal.dylib
+ SupportedArchitectures
+
+ arm64
+
+ SupportedPlatform
+ ios
+
+
+ CFBundlePackageType
+ XFWK
+ MinimumOSVersion
+ 12.0
+ XCFrameworkFormatVersion
+ 1.0
+
+
diff --git a/src/addons/fmod/libs/iOS/libGodotFmod.ios.template_release.xcframework/ios-arm64/libGodotFmod.ios.template_release.universal.dylib b/src/addons/fmod/libs/iOS/libGodotFmod.ios.template_release.xcframework/ios-arm64/libGodotFmod.ios.template_release.universal.dylib
new file mode 100644
index 0000000..89e1336
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libGodotFmod.ios.template_release.xcframework/ios-arm64/libGodotFmod.ios.template_release.universal.dylib
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8150145192cd09ce070b7cbf34d1b1e928bf875349d3b0b5df0a268fecd307d8
+size 4320056
diff --git a/src/addons/fmod/libs/iOS/libfmodL_appletvos.a b/src/addons/fmod/libs/iOS/libfmodL_appletvos.a
new file mode 100644
index 0000000..bb7978d
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libfmodL_appletvos.a
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:083d03b1659f6d329b98799a876f134087da4db7ae689a43173fc5450eecdb2b
+size 5169040
diff --git a/src/addons/fmod/libs/iOS/libfmodL_appletvsimulator.a b/src/addons/fmod/libs/iOS/libfmodL_appletvsimulator.a
new file mode 100644
index 0000000..abdb6aa
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libfmodL_appletvsimulator.a
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d984145a0a635506dc9cf670b1dd79d6343f9020316c082827acd3a6eaa7535e
+size 5649840
diff --git a/src/addons/fmod/libs/iOS/libfmodL_iphoneos.a b/src/addons/fmod/libs/iOS/libfmodL_iphoneos.a
new file mode 100644
index 0000000..9785cd4
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libfmodL_iphoneos.a
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:714d7acf79413333c62947fda8fa2a1c0fb75b34d2dba71d29a1dc41cde4ee81
+size 5169072
diff --git a/src/addons/fmod/libs/iOS/libfmodL_iphonesimulator.a b/src/addons/fmod/libs/iOS/libfmodL_iphonesimulator.a
new file mode 100644
index 0000000..ed1b81f
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libfmodL_iphonesimulator.a
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:16e304546d4137fc7865c329860360a1c2c4ea608aa185b89afe1996138f0666
+size 5649840
diff --git a/src/addons/fmod/libs/iOS/libfmodL_xros.a b/src/addons/fmod/libs/iOS/libfmodL_xros.a
new file mode 100644
index 0000000..fe4122e
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libfmodL_xros.a
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:88e20cb279a3190081f9ee2ba826320376a7790884a543fac6180088b16acf9c
+size 5226368
diff --git a/src/addons/fmod/libs/iOS/libfmodL_xrsimulator.a b/src/addons/fmod/libs/iOS/libfmodL_xrsimulator.a
new file mode 100644
index 0000000..37102da
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libfmodL_xrsimulator.a
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e76edc84d05d738318d197b28f412f349e64d86d5e453e687cf37f90aba2ab6c
+size 5716576
diff --git a/src/addons/fmod/libs/iOS/libfmod_appletvos.a b/src/addons/fmod/libs/iOS/libfmod_appletvos.a
new file mode 100644
index 0000000..f99e19d
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libfmod_appletvos.a
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4a943c3cbfa7e5235fdac7279f476c355650094fa3eb48b6f089b3ff1da473f9
+size 4176816
diff --git a/src/addons/fmod/libs/iOS/libfmod_appletvsimulator.a b/src/addons/fmod/libs/iOS/libfmod_appletvsimulator.a
new file mode 100644
index 0000000..34baec2
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libfmod_appletvsimulator.a
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:68b1459528f31eff0039cf903556149f2451fcaa498e26dbe228ae5dc08fedac
+size 4776240
diff --git a/src/addons/fmod/libs/iOS/libfmod_iphoneos.a b/src/addons/fmod/libs/iOS/libfmod_iphoneos.a
new file mode 100644
index 0000000..119690e
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libfmod_iphoneos.a
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:be71bb8678c9b843029821cf36916ca735a9577e8dc6176fab49bd67f6dd4e14
+size 4176848
diff --git a/src/addons/fmod/libs/iOS/libfmod_iphonesimulator.a b/src/addons/fmod/libs/iOS/libfmod_iphonesimulator.a
new file mode 100644
index 0000000..ea00a0e
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libfmod_iphonesimulator.a
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cd2235442556857a76d899cb6470a06aa9b12e0e5f8c1f1bd796052f06e8cbfe
+size 4776232
diff --git a/src/addons/fmod/libs/iOS/libfmod_xros.a b/src/addons/fmod/libs/iOS/libfmod_xros.a
new file mode 100644
index 0000000..7e188ab
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libfmod_xros.a
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:88806c3584349aeb6d0b3d4de2fab8b883920745df95986eb33b15be7e3c97d9
+size 4232472
diff --git a/src/addons/fmod/libs/iOS/libfmod_xrsimulator.a b/src/addons/fmod/libs/iOS/libfmod_xrsimulator.a
new file mode 100644
index 0000000..accebc7
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libfmod_xrsimulator.a
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cbc3279588f7d5656d94b91f71a2842810a737c314082065b668b2f27740648d
+size 4841888
diff --git a/src/addons/fmod/libs/iOS/libfmodstudioL_appletvos.a b/src/addons/fmod/libs/iOS/libfmodstudioL_appletvos.a
new file mode 100644
index 0000000..9f1e4d7
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libfmodstudioL_appletvos.a
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5386ceef3d237066d094c47a25c8f2035d8c3ef518c0c2be748eb2f05eb29558
+size 10622128
diff --git a/src/addons/fmod/libs/iOS/libfmodstudioL_appletvsimulator.a b/src/addons/fmod/libs/iOS/libfmodstudioL_appletvsimulator.a
new file mode 100644
index 0000000..580b922
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libfmodstudioL_appletvsimulator.a
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9262b234b74e529c97cf30cc296cb92b441137c4d49295360749839e466eb300
+size 10740856
diff --git a/src/addons/fmod/libs/iOS/libfmodstudioL_iphoneos.a b/src/addons/fmod/libs/iOS/libfmodstudioL_iphoneos.a
new file mode 100644
index 0000000..295fd7c
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libfmodstudioL_iphoneos.a
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:81d8c469b576c26554e13fffc7f20e072e3504e2411d5dfa2ae2ca0a436f6ac6
+size 10622120
diff --git a/src/addons/fmod/libs/iOS/libfmodstudioL_iphonesimulator.a b/src/addons/fmod/libs/iOS/libfmodstudioL_iphonesimulator.a
new file mode 100644
index 0000000..7688d2c
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libfmodstudioL_iphonesimulator.a
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e810d495ebff42d32728e9551b0271412a7fa0edb58a072e1a964d582eb1617f
+size 10740848
diff --git a/src/addons/fmod/libs/iOS/libfmodstudioL_xros.a b/src/addons/fmod/libs/iOS/libfmodstudioL_xros.a
new file mode 100644
index 0000000..2b960a6
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libfmodstudioL_xros.a
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f97f7495a59d19672510328ae7fc27e18b35a4a502a0c848a71d04df05158076
+size 10702968
diff --git a/src/addons/fmod/libs/iOS/libfmodstudioL_xrsimulator.a b/src/addons/fmod/libs/iOS/libfmodstudioL_xrsimulator.a
new file mode 100644
index 0000000..130822c
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libfmodstudioL_xrsimulator.a
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8dad703680bba4787e46d454e2044856004b6a1f0dabadfa3dc776b072950008
+size 10796760
diff --git a/src/addons/fmod/libs/iOS/libfmodstudio_appletvos.a b/src/addons/fmod/libs/iOS/libfmodstudio_appletvos.a
new file mode 100644
index 0000000..f39a944
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libfmodstudio_appletvos.a
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:43ab2eda08d1c09a57e1fecdd11d230622913747494f3b87a53b47dd9927c33c
+size 6056080
diff --git a/src/addons/fmod/libs/iOS/libfmodstudio_appletvsimulator.a b/src/addons/fmod/libs/iOS/libfmodstudio_appletvsimulator.a
new file mode 100644
index 0000000..b2dac53
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libfmodstudio_appletvsimulator.a
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:675e27c1346c5111df2753fcb874ea74aeac1469c301f4961b7b3c6f1e88bd0a
+size 6750736
diff --git a/src/addons/fmod/libs/iOS/libfmodstudio_iphoneos.a b/src/addons/fmod/libs/iOS/libfmodstudio_iphoneos.a
new file mode 100644
index 0000000..72963cb
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libfmodstudio_iphoneos.a
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:93c60a9ec7af616a438e657b178fbed11905a5940e1b397e5e2b5cd728744861
+size 6056072
diff --git a/src/addons/fmod/libs/iOS/libfmodstudio_iphonesimulator.a b/src/addons/fmod/libs/iOS/libfmodstudio_iphonesimulator.a
new file mode 100644
index 0000000..d7fdf59
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libfmodstudio_iphonesimulator.a
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4c046848c9ea8e5f47da575bb0a1bed581343bba4974a51261c0aaa335d8448b
+size 6750736
diff --git a/src/addons/fmod/libs/iOS/libfmodstudio_xros.a b/src/addons/fmod/libs/iOS/libfmodstudio_xros.a
new file mode 100644
index 0000000..bc2fba8
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libfmodstudio_xros.a
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8cd331bfce376e70aa563da181ee4c882b3fc5e3239a0b01f7bc3e19960340a3
+size 6125144
diff --git a/src/addons/fmod/libs/iOS/libfmodstudio_xrsimulator.a b/src/addons/fmod/libs/iOS/libfmodstudio_xrsimulator.a
new file mode 100644
index 0000000..6d71f3a
--- /dev/null
+++ b/src/addons/fmod/libs/iOS/libfmodstudio_xrsimulator.a
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0da2e4420ef5ab776f9aaa8a813f4217d71ed48d23dab386569bf6f72fd97a47
+size 6806152
diff --git a/src/addons/fmod/libs/linux/CopyPast_Fmod_Libs_Here.txt b/src/addons/fmod/libs/linux/CopyPast_Fmod_Libs_Here.txt
new file mode 100644
index 0000000..e69de29
diff --git a/src/addons/fmod/libs/linux/libGodotFmod.linux.editor.x86_64.so b/src/addons/fmod/libs/linux/libGodotFmod.linux.editor.x86_64.so
new file mode 100644
index 0000000..75a0ff0
--- /dev/null
+++ b/src/addons/fmod/libs/linux/libGodotFmod.linux.editor.x86_64.so
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e778d0870ba3ff4a8df0720203d346d936cc08a8ed040a89fa7edd475ed09ea5
+size 2274728
diff --git a/src/addons/fmod/libs/linux/libGodotFmod.linux.template_debug.x86_64.so b/src/addons/fmod/libs/linux/libGodotFmod.linux.template_debug.x86_64.so
new file mode 100644
index 0000000..7d279cd
--- /dev/null
+++ b/src/addons/fmod/libs/linux/libGodotFmod.linux.template_debug.x86_64.so
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4b655497eb7ae9b480349a1a63bff65783db666b778407ce1dfda852eec72593
+size 1922056
diff --git a/src/addons/fmod/libs/linux/libGodotFmod.linux.template_release.x86_64.so b/src/addons/fmod/libs/linux/libGodotFmod.linux.template_release.x86_64.so
new file mode 100644
index 0000000..a0aa937
--- /dev/null
+++ b/src/addons/fmod/libs/linux/libGodotFmod.linux.template_release.x86_64.so
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8a06e7139e030b7f5d4205bf502be43cbbc09e84d2e1b4cf670adfb1d584a753
+size 1839072
diff --git a/src/addons/fmod/libs/linux/libfmod.so b/src/addons/fmod/libs/linux/libfmod.so
new file mode 100644
index 0000000..52ce7be
--- /dev/null
+++ b/src/addons/fmod/libs/linux/libfmod.so
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d2abe192c8ddd8942d7a62f2c7ff674d73423ea9b1be6b087e5de0cfb30bc4bb
+size 1688248
diff --git a/src/addons/fmod/libs/linux/libfmod.so.14 b/src/addons/fmod/libs/linux/libfmod.so.14
new file mode 100644
index 0000000..52ce7be
--- /dev/null
+++ b/src/addons/fmod/libs/linux/libfmod.so.14
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d2abe192c8ddd8942d7a62f2c7ff674d73423ea9b1be6b087e5de0cfb30bc4bb
+size 1688248
diff --git a/src/addons/fmod/libs/linux/libfmod.so.14.6 b/src/addons/fmod/libs/linux/libfmod.so.14.6
new file mode 100644
index 0000000..52ce7be
--- /dev/null
+++ b/src/addons/fmod/libs/linux/libfmod.so.14.6
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d2abe192c8ddd8942d7a62f2c7ff674d73423ea9b1be6b087e5de0cfb30bc4bb
+size 1688248
diff --git a/src/addons/fmod/libs/linux/libfmodL.so b/src/addons/fmod/libs/linux/libfmodL.so
new file mode 100644
index 0000000..1e5a61b
--- /dev/null
+++ b/src/addons/fmod/libs/linux/libfmodL.so
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b6405f30b5d52cc10cdfbd554c3a86a76a3b6b95157faf8ffcd9a7d3876d8553
+size 1934704
diff --git a/src/addons/fmod/libs/linux/libfmodL.so.14 b/src/addons/fmod/libs/linux/libfmodL.so.14
new file mode 100644
index 0000000..1e5a61b
--- /dev/null
+++ b/src/addons/fmod/libs/linux/libfmodL.so.14
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b6405f30b5d52cc10cdfbd554c3a86a76a3b6b95157faf8ffcd9a7d3876d8553
+size 1934704
diff --git a/src/addons/fmod/libs/linux/libfmodL.so.14.6 b/src/addons/fmod/libs/linux/libfmodL.so.14.6
new file mode 100644
index 0000000..1e5a61b
--- /dev/null
+++ b/src/addons/fmod/libs/linux/libfmodL.so.14.6
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b6405f30b5d52cc10cdfbd554c3a86a76a3b6b95157faf8ffcd9a7d3876d8553
+size 1934704
diff --git a/src/addons/fmod/libs/linux/libfmodstudio.so b/src/addons/fmod/libs/linux/libfmodstudio.so
new file mode 100644
index 0000000..f1aca12
--- /dev/null
+++ b/src/addons/fmod/libs/linux/libfmodstudio.so
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cc7a86fd2b53028be8974b9f968040dcf32528bac9eb52c448ea0f66c842712e
+size 1622616
diff --git a/src/addons/fmod/libs/linux/libfmodstudio.so.14 b/src/addons/fmod/libs/linux/libfmodstudio.so.14
new file mode 100644
index 0000000..f1aca12
--- /dev/null
+++ b/src/addons/fmod/libs/linux/libfmodstudio.so.14
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cc7a86fd2b53028be8974b9f968040dcf32528bac9eb52c448ea0f66c842712e
+size 1622616
diff --git a/src/addons/fmod/libs/linux/libfmodstudio.so.14.6 b/src/addons/fmod/libs/linux/libfmodstudio.so.14.6
new file mode 100644
index 0000000..f1aca12
--- /dev/null
+++ b/src/addons/fmod/libs/linux/libfmodstudio.so.14.6
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cc7a86fd2b53028be8974b9f968040dcf32528bac9eb52c448ea0f66c842712e
+size 1622616
diff --git a/src/addons/fmod/libs/linux/libfmodstudioL.so b/src/addons/fmod/libs/linux/libfmodstudioL.so
new file mode 100644
index 0000000..e5f5b70
--- /dev/null
+++ b/src/addons/fmod/libs/linux/libfmodstudioL.so
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8576a8416722d4999abd6ed0c372ed58aa908c99319ee95383ac1a43aead920a
+size 2513656
diff --git a/src/addons/fmod/libs/linux/libfmodstudioL.so.14 b/src/addons/fmod/libs/linux/libfmodstudioL.so.14
new file mode 100644
index 0000000..e5f5b70
--- /dev/null
+++ b/src/addons/fmod/libs/linux/libfmodstudioL.so.14
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8576a8416722d4999abd6ed0c372ed58aa908c99319ee95383ac1a43aead920a
+size 2513656
diff --git a/src/addons/fmod/libs/linux/libfmodstudioL.so.14.6 b/src/addons/fmod/libs/linux/libfmodstudioL.so.14.6
new file mode 100644
index 0000000..e5f5b70
--- /dev/null
+++ b/src/addons/fmod/libs/linux/libfmodstudioL.so.14.6
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8576a8416722d4999abd6ed0c372ed58aa908c99319ee95383ac1a43aead920a
+size 2513656
diff --git a/src/addons/fmod/libs/macos/CopyPast_Fmod_Libs_Here.txt b/src/addons/fmod/libs/macos/CopyPast_Fmod_Libs_Here.txt
new file mode 100644
index 0000000..e69de29
diff --git a/src/addons/fmod/libs/macos/libGodotFmod.macos.editor.framework/Info.plist b/src/addons/fmod/libs/macos/libGodotFmod.macos.editor.framework/Info.plist
new file mode 100644
index 0000000..c75e412
--- /dev/null
+++ b/src/addons/fmod/libs/macos/libGodotFmod.macos.editor.framework/Info.plist
@@ -0,0 +1,26 @@
+
+
+
+
+ CFBundleExecutable
+ libGodotFmod.macos.editor
+ CFBundleIdentifier
+ com.utopia-rise.fmod-gdextension
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ libGodotFmod.macos.editor
+ CFBundlePackageType
+ FMWK
+ CFBundleShortVersionString
+ 1.0.0
+ CFBundleSupportedPlatforms
+
+ MacOSX
+
+ CFBundleVersion
+ 1.0.0
+ LSMinimumSystemVersion
+ 10.12
+
+
\ No newline at end of file
diff --git a/src/addons/fmod/libs/macos/libGodotFmod.macos.editor.framework/libGodotFmod.macos.editor b/src/addons/fmod/libs/macos/libGodotFmod.macos.editor.framework/libGodotFmod.macos.editor
new file mode 100644
index 0000000..75232db
Binary files /dev/null and b/src/addons/fmod/libs/macos/libGodotFmod.macos.editor.framework/libGodotFmod.macos.editor differ
diff --git a/src/addons/fmod/libs/macos/libGodotFmod.macos.template_debug.framework/Info.plist b/src/addons/fmod/libs/macos/libGodotFmod.macos.template_debug.framework/Info.plist
new file mode 100644
index 0000000..5fd2651
--- /dev/null
+++ b/src/addons/fmod/libs/macos/libGodotFmod.macos.template_debug.framework/Info.plist
@@ -0,0 +1,26 @@
+
+
+
+
+ CFBundleExecutable
+ libGodotFmod.macos.template_debug
+ CFBundleIdentifier
+ com.utopiarise.fmod-gdextension
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ libGodotFmod.macos.template_debug
+ CFBundlePackageType
+ FMWK
+ CFBundleShortVersionString
+ 1.0.0
+ CFBundleSupportedPlatforms
+
+ MacOSX
+
+ CFBundleVersion
+ 1.0.0
+ LSMinimumSystemVersion
+ 10.12
+
+
\ No newline at end of file
diff --git a/src/addons/fmod/libs/macos/libGodotFmod.macos.template_debug.framework/libGodotFmod.macos.template_debug b/src/addons/fmod/libs/macos/libGodotFmod.macos.template_debug.framework/libGodotFmod.macos.template_debug
new file mode 100644
index 0000000..3b91c66
--- /dev/null
+++ b/src/addons/fmod/libs/macos/libGodotFmod.macos.template_debug.framework/libGodotFmod.macos.template_debug
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ca0d20f237cfa6ff0fcea1ba0805bfc96e498319217ab13d404ab5d8b7db7d43
+size 13189520
diff --git a/src/addons/fmod/libs/macos/libGodotFmod.macos.template_release.framework/Info.plist b/src/addons/fmod/libs/macos/libGodotFmod.macos.template_release.framework/Info.plist
new file mode 100644
index 0000000..f6b580a
--- /dev/null
+++ b/src/addons/fmod/libs/macos/libGodotFmod.macos.template_release.framework/Info.plist
@@ -0,0 +1,26 @@
+
+
+
+
+ CFBundleExecutable
+ libGodotFmod.macos.template_release
+ CFBundleIdentifier
+ com.utopiarise.fmod-gdextension
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ libGodotFmod.macos.template_release
+ CFBundlePackageType
+ FMWK
+ CFBundleShortVersionString
+ 1.0.0
+ CFBundleSupportedPlatforms
+
+ MacOSX
+
+ CFBundleVersion
+ 1.0.0
+ LSMinimumSystemVersion
+ 10.12
+
+
\ No newline at end of file
diff --git a/src/addons/fmod/libs/macos/libGodotFmod.macos.template_release.framework/libGodotFmod.macos.template_release b/src/addons/fmod/libs/macos/libGodotFmod.macos.template_release.framework/libGodotFmod.macos.template_release
new file mode 100644
index 0000000..3bf2505
Binary files /dev/null and b/src/addons/fmod/libs/macos/libGodotFmod.macos.template_release.framework/libGodotFmod.macos.template_release differ
diff --git a/src/addons/fmod/libs/macos/libfmod.dylib b/src/addons/fmod/libs/macos/libfmod.dylib
new file mode 100644
index 0000000..4e675b8
--- /dev/null
+++ b/src/addons/fmod/libs/macos/libfmod.dylib
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f68033e8fcd495bd0cbbe92eeff26694515a12a0676fcd83dce95223c2e07755
+size 2586720
diff --git a/src/addons/fmod/libs/macos/libfmodL.dylib b/src/addons/fmod/libs/macos/libfmodL.dylib
new file mode 100644
index 0000000..1d9d1ec
--- /dev/null
+++ b/src/addons/fmod/libs/macos/libfmodL.dylib
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b0b61f76a199016160b6a28fd6039d260d1260c482d00b9a697538d11db69810
+size 2982176
diff --git a/src/addons/fmod/libs/macos/libfmodstudio.dylib b/src/addons/fmod/libs/macos/libfmodstudio.dylib
new file mode 100644
index 0000000..3b83a94
--- /dev/null
+++ b/src/addons/fmod/libs/macos/libfmodstudio.dylib
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:debfd45d958833f9747a722c8f997e2c07dbd9fd79f2de35b1d21d5c15eaea4b
+size 2355424
diff --git a/src/addons/fmod/libs/macos/libfmodstudioL.dylib b/src/addons/fmod/libs/macos/libfmodstudioL.dylib
new file mode 100644
index 0000000..346d557
--- /dev/null
+++ b/src/addons/fmod/libs/macos/libfmodstudioL.dylib
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cdccee0833a2525df478648e4f6c0074df8916acc06cb978a102928c30e4c72f
+size 3856672
diff --git a/src/addons/fmod/libs/windows/CopyPast_Fmod_Libs_Here.txt b/src/addons/fmod/libs/windows/CopyPast_Fmod_Libs_Here.txt
new file mode 100644
index 0000000..e69de29
diff --git a/src/addons/fmod/libs/windows/fmod.dll b/src/addons/fmod/libs/windows/fmod.dll
new file mode 100644
index 0000000..3a555a9
--- /dev/null
+++ b/src/addons/fmod/libs/windows/fmod.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7c5948d83d11406fc1a95ace03943a9b0429bf2eaa3b1ad949f51de02fbdd9c6
+size 1875968
diff --git a/src/addons/fmod/libs/windows/fmodL.dll b/src/addons/fmod/libs/windows/fmodL.dll
new file mode 100644
index 0000000..22bf28b
--- /dev/null
+++ b/src/addons/fmod/libs/windows/fmodL.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:39e345f3a59fabab994f954321cf486753e09d230a36a524596abbc72233b894
+size 2141184
diff --git a/src/addons/fmod/libs/windows/fmodL_vc.lib b/src/addons/fmod/libs/windows/fmodL_vc.lib
new file mode 100644
index 0000000..30adcb1
--- /dev/null
+++ b/src/addons/fmod/libs/windows/fmodL_vc.lib
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:63f4472aa01f0c89b76c82419da5e3abaedfb7b6e6f5c828756ca1b93a4753b4
+size 350244
diff --git a/src/addons/fmod/libs/windows/fmod_vc.lib b/src/addons/fmod/libs/windows/fmod_vc.lib
new file mode 100644
index 0000000..fa0a944
--- /dev/null
+++ b/src/addons/fmod/libs/windows/fmod_vc.lib
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2c0736b606b1b3a18d5b82e6619d82d31e266c5e9a6825a1588f73a9a380a5ff
+size 348364
diff --git a/src/addons/fmod/libs/windows/fmodstudio.dll b/src/addons/fmod/libs/windows/fmodstudio.dll
new file mode 100644
index 0000000..3d5f982
--- /dev/null
+++ b/src/addons/fmod/libs/windows/fmodstudio.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:85364e241fc04bd4c4eea93b9365ba56f37af2f1721e9413f9a36a6cffa6d44b
+size 1577984
diff --git a/src/addons/fmod/libs/windows/fmodstudioL.dll b/src/addons/fmod/libs/windows/fmodstudioL.dll
new file mode 100644
index 0000000..23ba16b
--- /dev/null
+++ b/src/addons/fmod/libs/windows/fmodstudioL.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e90720970b13f729045906e37eba5be99f4dc01d60258cbb517d6e783ac1e7de
+size 2464256
diff --git a/src/addons/fmod/libs/windows/fmodstudioL_vc.lib b/src/addons/fmod/libs/windows/fmodstudioL_vc.lib
new file mode 100644
index 0000000..cd01398
--- /dev/null
+++ b/src/addons/fmod/libs/windows/fmodstudioL_vc.lib
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3160168d75a1e415c4f1665fbf3db28850cd7e30761a8c6086e437d8e48b708b
+size 162868
diff --git a/src/addons/fmod/libs/windows/fmodstudio_vc.lib b/src/addons/fmod/libs/windows/fmodstudio_vc.lib
new file mode 100644
index 0000000..f8a90f6
--- /dev/null
+++ b/src/addons/fmod/libs/windows/fmodstudio_vc.lib
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1ce90859f8ae8c6600d48a3540ea832a4f0a04ecf569c6b4dbfe1ac368707ef4
+size 162484
diff --git a/src/addons/fmod/libs/windows/libGodotFmod.windows.editor.x86_64.dll b/src/addons/fmod/libs/windows/libGodotFmod.windows.editor.x86_64.dll
new file mode 100644
index 0000000..81afdda
--- /dev/null
+++ b/src/addons/fmod/libs/windows/libGodotFmod.windows.editor.x86_64.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:95b694f24406881f04d8d76d5751e1b9043118ed9a53504e168764f6aba8353b
+size 1295360
diff --git a/src/addons/fmod/libs/windows/libGodotFmod.windows.editor.x86_64.exp b/src/addons/fmod/libs/windows/libGodotFmod.windows.editor.x86_64.exp
new file mode 100644
index 0000000..8be19e9
Binary files /dev/null and b/src/addons/fmod/libs/windows/libGodotFmod.windows.editor.x86_64.exp differ
diff --git a/src/addons/fmod/libs/windows/libGodotFmod.windows.editor.x86_64.lib b/src/addons/fmod/libs/windows/libGodotFmod.windows.editor.x86_64.lib
new file mode 100644
index 0000000..674d234
--- /dev/null
+++ b/src/addons/fmod/libs/windows/libGodotFmod.windows.editor.x86_64.lib
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:77017a60a1f1b996fdfc3b4300640931930adad7382668c1ec53fb65df3ed11d
+size 2172
diff --git a/src/addons/fmod/libs/windows/libGodotFmod.windows.template_debug.x86_64.dll b/src/addons/fmod/libs/windows/libGodotFmod.windows.template_debug.x86_64.dll
new file mode 100644
index 0000000..1f135c1
--- /dev/null
+++ b/src/addons/fmod/libs/windows/libGodotFmod.windows.template_debug.x86_64.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:685eff2b7bcf40b24cb31b2b08b1bd10d97efeae66f5fc6600f9a01f81f3dd18
+size 1205760
diff --git a/src/addons/fmod/libs/windows/libGodotFmod.windows.template_debug.x86_64.exp b/src/addons/fmod/libs/windows/libGodotFmod.windows.template_debug.x86_64.exp
new file mode 100644
index 0000000..c6b1c37
Binary files /dev/null and b/src/addons/fmod/libs/windows/libGodotFmod.windows.template_debug.x86_64.exp differ
diff --git a/src/addons/fmod/libs/windows/libGodotFmod.windows.template_debug.x86_64.lib b/src/addons/fmod/libs/windows/libGodotFmod.windows.template_debug.x86_64.lib
new file mode 100644
index 0000000..9e063c6
--- /dev/null
+++ b/src/addons/fmod/libs/windows/libGodotFmod.windows.template_debug.x86_64.lib
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:39023e16b21a313bdbedffe668a968a9266c6447a094591d49ed2ab2ffb48f3a
+size 2276
diff --git a/src/addons/fmod/libs/windows/libGodotFmod.windows.template_release.x86_64.dll b/src/addons/fmod/libs/windows/libGodotFmod.windows.template_release.x86_64.dll
new file mode 100644
index 0000000..3ce6259
--- /dev/null
+++ b/src/addons/fmod/libs/windows/libGodotFmod.windows.template_release.x86_64.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:57ae792e0bdc16560f836f0eeaff2cd96c68300771f54dae5a311055bce63fd2
+size 969728
diff --git a/src/addons/fmod/libs/windows/libGodotFmod.windows.template_release.x86_64.exp b/src/addons/fmod/libs/windows/libGodotFmod.windows.template_release.x86_64.exp
new file mode 100644
index 0000000..15d7ffc
Binary files /dev/null and b/src/addons/fmod/libs/windows/libGodotFmod.windows.template_release.x86_64.exp differ
diff --git a/src/addons/fmod/libs/windows/libGodotFmod.windows.template_release.x86_64.lib b/src/addons/fmod/libs/windows/libGodotFmod.windows.template_release.x86_64.lib
new file mode 100644
index 0000000..fe68be7
--- /dev/null
+++ b/src/addons/fmod/libs/windows/libGodotFmod.windows.template_release.x86_64.lib
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9189b4868c6e50a3a2aebe6bfa7497e9c11ef0562d079c7e6838bac5bd748aed
+size 2302
diff --git a/src/addons/fmod/plugin.cfg b/src/addons/fmod/plugin.cfg
new file mode 100644
index 0000000..3ed6bfc
--- /dev/null
+++ b/src/addons/fmod/plugin.cfg
@@ -0,0 +1,7 @@
+[plugin]
+
+name="FMOD GDExtension"
+description="FMOD GDExtension for Godot Engine 4.4"
+author="Utopia-rise, Tristan Grespinet, Pierre-Thomas Meisels"
+version="5.0.5"
+script="FmodPlugin.gd"
diff --git a/src/addons/fmod/tool/FmodBankDatabase.gd b/src/addons/fmod/tool/FmodBankDatabase.gd
new file mode 100644
index 0000000..7042088
--- /dev/null
+++ b/src/addons/fmod/tool/FmodBankDatabase.gd
@@ -0,0 +1,44 @@
+extends Node
+
+class_name FmodBankDatabase
+
+
+static var banks := Array()
+const MASTER_STRINGS_BANK_NAME = "Master.strings.bank"
+const MASTER_BANK_NAME = "Master.bank"
+
+static func reload_all_banks():
+ banks.clear()
+
+ var banks_root = ProjectSettings.get_setting("Fmod/General/banks_path", "")
+ var master_strings_bank_path = "%s/%s" % [banks_root, MASTER_STRINGS_BANK_NAME]
+ var master_bank_path = "%s/%s" % [banks_root, MASTER_BANK_NAME]
+
+ if not FileAccess.file_exists(master_strings_bank_path):
+ push_warning("Cannot find master strings bank at %s" % master_strings_bank_path)
+ return
+
+ if not FileAccess.file_exists(master_bank_path):
+ push_warning("Cannot find master bank at %s" % master_bank_path)
+ return
+
+ banks.append(
+ FmodServer.load_bank(master_strings_bank_path, FmodServer.FMOD_STUDIO_LOAD_BANK_NORMAL)
+ )
+ banks.append(
+ FmodServer.load_bank(master_bank_path, FmodServer.FMOD_STUDIO_LOAD_BANK_NORMAL)
+ )
+
+ var dir: DirAccess = DirAccess.open(banks_root)
+ if dir:
+ dir.list_dir_begin()
+ var file_name : String = dir.get_next()
+ while file_name != "":
+ if dir.current_is_dir():
+ pass # the found item is a directory
+ elif file_name.ends_with(".bank") and file_name != MASTER_STRINGS_BANK_NAME and file_name != MASTER_BANK_NAME:
+ banks.append(
+ FmodServer.load_bank("%s/%s" % [banks_root, file_name], FmodServer.FMOD_STUDIO_LOAD_BANK_NORMAL)
+ )
+ file_name = dir.get_next()
+
diff --git a/src/addons/fmod/tool/FmodBankDatabase.gd.uid b/src/addons/fmod/tool/FmodBankDatabase.gd.uid
new file mode 100644
index 0000000..fa647d4
--- /dev/null
+++ b/src/addons/fmod/tool/FmodBankDatabase.gd.uid
@@ -0,0 +1 @@
+uid://dklrc5eyc1gp4
diff --git a/src/addons/fmod/tool/inspectors/FmodBankLoaderPropertyInspectorPlugin.gd b/src/addons/fmod/tool/inspectors/FmodBankLoaderPropertyInspectorPlugin.gd
new file mode 100644
index 0000000..e679bb9
--- /dev/null
+++ b/src/addons/fmod/tool/inspectors/FmodBankLoaderPropertyInspectorPlugin.gd
@@ -0,0 +1,20 @@
+class_name FmodBankLoaderPropertyInspectorPlugin extends EditorInspectorPlugin
+
+static var bank_icon = load("res://addons/fmod/icons/bank_icon.svg")
+
+var _open_project_explorer_callable: Callable
+
+func _init(plugin: FmodPlugin):
+ _open_project_explorer_callable = plugin.open_project_explorer_bank
+
+func _can_handle(object: Object):
+ return object is FmodBankLoader
+
+func _parse_property(object: Object, type: Variant.Type, name: String, hint_type: PropertyHint, hint_string: String, usage_flags: int, wide: bool):
+ return name == "bank_paths"
+
+func _parse_category(object: Object, category: String):
+ if category != "FmodBankLoader":
+ return
+ var editor_property := FmodBankPathEditorProperty.new(_open_project_explorer_callable)
+ add_property_editor("bank_paths", editor_property, false, "Fmod banks")
diff --git a/src/addons/fmod/tool/inspectors/FmodBankLoaderPropertyInspectorPlugin.gd.uid b/src/addons/fmod/tool/inspectors/FmodBankLoaderPropertyInspectorPlugin.gd.uid
new file mode 100644
index 0000000..6b3c0ee
--- /dev/null
+++ b/src/addons/fmod/tool/inspectors/FmodBankLoaderPropertyInspectorPlugin.gd.uid
@@ -0,0 +1 @@
+uid://tnljjxahubam
diff --git a/src/addons/fmod/tool/inspectors/FmodEmitterPropertyInspectorPlugin.gd b/src/addons/fmod/tool/inspectors/FmodEmitterPropertyInspectorPlugin.gd
new file mode 100644
index 0000000..bc58619
--- /dev/null
+++ b/src/addons/fmod/tool/inspectors/FmodEmitterPropertyInspectorPlugin.gd
@@ -0,0 +1,21 @@
+class_name FmodEmitterPropertyInspectorPlugin extends EditorInspectorPlugin
+
+var _open_project_explorer_callable: Callable
+var _event_editor_property_scene: PackedScene = load("res://addons/fmod/tool/property_editors/FmodEventEditorProperty.tscn")
+
+func _init(plugin: FmodPlugin):
+ _open_project_explorer_callable = plugin.open_project_explorer_events
+
+func _can_handle(object: Object):
+ return object is FmodEventEmitter2D or \
+ object is FmodEventEmitter3D
+
+func _parse_property(object: Object, type: Variant.Type, name: String, hint_type: PropertyHint, hint_string: String, usage_flags: int, wide: bool):
+ return name == "event_name" || name == "event_guid"
+
+func _parse_category(object: Object, category: String):
+ if category != "FmodEventEmitter2D" and category != "FmodEventEmitter3D":
+ return
+ var editor_property := _event_editor_property_scene.instantiate()
+ editor_property.initialize(_open_project_explorer_callable, "event_name", "event_guid")
+ add_property_editor_for_multiple_properties("Fmod event", PackedStringArray(["event_name", "event_guid"]), editor_property)
diff --git a/src/addons/fmod/tool/inspectors/FmodEmitterPropertyInspectorPlugin.gd.uid b/src/addons/fmod/tool/inspectors/FmodEmitterPropertyInspectorPlugin.gd.uid
new file mode 100644
index 0000000..b3f1f5e
--- /dev/null
+++ b/src/addons/fmod/tool/inspectors/FmodEmitterPropertyInspectorPlugin.gd.uid
@@ -0,0 +1 @@
+uid://co1ktq45h26wx
diff --git a/src/addons/fmod/tool/performances/PerformancesDisplay.gd b/src/addons/fmod/tool/performances/PerformancesDisplay.gd
new file mode 100644
index 0000000..35eeac5
--- /dev/null
+++ b/src/addons/fmod/tool/performances/PerformancesDisplay.gd
@@ -0,0 +1,61 @@
+class_name PerformancesDisplay extends Node
+
+
+const CORE_CPU_DSP_CATEGORY = "FMOD [Core]/Cpu DSP"
+const CORE_CPU_GEOMETRY_CATEGORY = "FMOD [Core]/Cpu Geometry"
+const CORE_CPU_STREAM_CATEGORY = "FMOD [Core]/Cpu Stream"
+const CORE_CPU_UPDATE_CATEGORY = "FMOD/[Core] Cpu Update"
+const CORE_CPU_CONVOLUTION_THREAD1_CATEGORY = "FMOD/[Core] Cpu convolution Thread 1"
+const CORE_CPU_CONVOLUTION_THREAD2_CATEGORY = "FMOD/[Core] Cpu convolution Thread 2"
+
+const STUDIO_CPU_UPDATE_CATEGORY = "FMOD/[Studio] Cpu Update"
+
+const MEMORY_CURRENTLY_ALLOCATED_CATEGORY = "FMOD/[Memory] Currently allocated"
+const MEMORY_MAX_ALLOCATED_CATEGORY = "FMOD/[Memory] Max allocated"
+
+const FILE_SAMPLE_CATEGORY = "FMOD/[File] Sample bytes read"
+const FILE_STREAM_CATEGORY = "FMOD/[File] Stream bytes read"
+const FILE_OTHER_CATEGORY = "FMOD/[File] Other bytes read"
+
+func _enter_tree():
+ var performance_data: FmodPerformanceData = FmodServer.get_performance_data()
+ add_monitor(CORE_CPU_DSP_CATEGORY, func(): return performance_data.dsp)
+ add_monitor(CORE_CPU_GEOMETRY_CATEGORY, func(): return performance_data.geometry)
+ add_monitor(CORE_CPU_STREAM_CATEGORY, func(): return performance_data.stream)
+ add_monitor(CORE_CPU_UPDATE_CATEGORY, func(): return performance_data.update)
+ add_monitor(CORE_CPU_CONVOLUTION_THREAD1_CATEGORY, func(): return performance_data.convolution1)
+ add_monitor(CORE_CPU_CONVOLUTION_THREAD2_CATEGORY, func(): return performance_data.convolution2)
+
+ add_monitor(STUDIO_CPU_UPDATE_CATEGORY, func(): return performance_data.studio)
+
+ add_monitor(MEMORY_CURRENTLY_ALLOCATED_CATEGORY, func(): return performance_data.currently_allocated)
+ add_monitor(MEMORY_MAX_ALLOCATED_CATEGORY, func(): return performance_data.max_allocated)
+
+ add_monitor(FILE_SAMPLE_CATEGORY, func(): return performance_data.sample_bytes_read)
+ add_monitor(FILE_STREAM_CATEGORY, func(): return performance_data.stream_bytes_read)
+ add_monitor(FILE_OTHER_CATEGORY, func(): return performance_data.other_bytes_read)
+
+func _exit_tree() -> void:
+ remove_monitor(CORE_CPU_DSP_CATEGORY)
+ remove_monitor(CORE_CPU_GEOMETRY_CATEGORY)
+ remove_monitor(CORE_CPU_STREAM_CATEGORY)
+ remove_monitor(CORE_CPU_UPDATE_CATEGORY)
+ remove_monitor(CORE_CPU_CONVOLUTION_THREAD1_CATEGORY)
+ remove_monitor(CORE_CPU_CONVOLUTION_THREAD2_CATEGORY)
+
+ remove_monitor(STUDIO_CPU_UPDATE_CATEGORY)
+
+ remove_monitor(MEMORY_CURRENTLY_ALLOCATED_CATEGORY)
+ remove_monitor(MEMORY_MAX_ALLOCATED_CATEGORY)
+
+ remove_monitor(FILE_SAMPLE_CATEGORY)
+ remove_monitor(FILE_STREAM_CATEGORY)
+ remove_monitor(FILE_OTHER_CATEGORY)
+
+func add_monitor(title: String, callable: Callable) -> void:
+ if not Performance.has_custom_monitor(title):
+ Performance.add_custom_monitor(title, callable)
+
+func remove_monitor(title: String) -> void:
+ if Performance.has_custom_monitor(title):
+ Performance.remove_custom_monitor(title)
diff --git a/src/addons/fmod/tool/performances/PerformancesDisplay.gd.uid b/src/addons/fmod/tool/performances/PerformancesDisplay.gd.uid
new file mode 100644
index 0000000..8013914
--- /dev/null
+++ b/src/addons/fmod/tool/performances/PerformancesDisplay.gd.uid
@@ -0,0 +1 @@
+uid://bc0uajlvc0u00
diff --git a/src/addons/fmod/tool/property_editors/FmodBankPathEditorProperty.gd b/src/addons/fmod/tool/property_editors/FmodBankPathEditorProperty.gd
new file mode 100644
index 0000000..ee61c26
--- /dev/null
+++ b/src/addons/fmod/tool/property_editors/FmodBankPathEditorProperty.gd
@@ -0,0 +1,88 @@
+class_name FmodBankPathEditorProperty extends EditorProperty
+
+var path_property_name := "bank_paths"
+
+var ui: Control
+var last_selected_index := -1
+
+func _init(open_project_explorer_callable: Callable):
+ ui = load("res://addons/fmod/tool/property_editors/FmodBankPathsPropertyEditorUi.tscn").instantiate()
+ add_child(ui)
+ var add_button: Button = ui.get_node("%AddButton")
+
+ var open_project_explorer_event = func open_project_explorer_event():
+ open_project_explorer_callable.call(self._set_path_and_guid)
+ add_button.pressed.connect(open_project_explorer_event)
+
+ var remove_button: Button = ui.get_node("%RemoveButton")
+ remove_button.pressed.connect(_on_remove_button)
+
+ var manual_add_button: Button = ui.get_node("%ManualAddButton")
+ manual_add_button.pressed.connect(_on_manual_add_button)
+
+ var up_button: Button = ui.get_node("%UpButton")
+ up_button.pressed.connect(_on_move_button.bind(false))
+
+ var down_button: Button = ui.get_node("%DownButton")
+ down_button.pressed.connect(_on_move_button.bind(true))
+
+func _update_property():
+ var bank_list: ItemList = ui.get_node("%BankList")
+ bank_list.clear()
+ var bank_paths: Array = get_edited_object()[path_property_name]
+ for path in bank_paths:
+ bank_list.add_item(path)
+
+ if last_selected_index == -1:
+ return
+ bank_list.select(last_selected_index)
+ last_selected_index = -1
+
+func _set_path_and_guid(path: String, _cancel: String):
+ var current_bank_paths: Array = get_edited_object()[path_property_name]
+
+ if current_bank_paths.has(path):
+ return
+
+ var bank_paths := Array(current_bank_paths)
+ bank_paths.append(path)
+ emit_changed(path_property_name, bank_paths)
+
+func _on_remove_button():
+ var bank_list: ItemList = ui.get_node("%BankList")
+ var current_bank_paths: Array = get_edited_object()[path_property_name]
+ var bank_paths := Array(current_bank_paths)
+ var selected_items_indexes: PackedInt32Array = bank_list.get_selected_items()
+ if selected_items_indexes.is_empty():
+ return
+ var item = bank_list.get_item_text(selected_items_indexes[0])
+ var in_list_index = bank_paths.find(item)
+ bank_paths.remove_at(in_list_index)
+ last_selected_index = in_list_index if in_list_index < bank_paths.size() else in_list_index - 1
+ emit_changed(path_property_name, bank_paths)
+
+func _on_manual_add_button():
+ var manual_add_line_edit: LineEdit = ui.get_node("%ManualAddLineEdit")
+ var to_add: String = manual_add_line_edit.text
+ if not to_add.begins_with("res://") || not to_add.ends_with(".bank"):
+ return
+ _set_path_and_guid(to_add, "")
+ manual_add_line_edit.text = ""
+
+func _on_move_button(is_down: bool):
+ var bank_list: ItemList = ui.get_node("%BankList")
+ var current_bank_paths: Array = get_edited_object()[path_property_name]
+ var bank_paths := Array(current_bank_paths)
+ var selected_items_indexes: PackedInt32Array = bank_list.get_selected_items()
+ if selected_items_indexes.is_empty():
+ return
+ var item = bank_list.get_item_text(selected_items_indexes[0])
+ var in_list_index = bank_paths.find(item)
+ var boundary = current_bank_paths.size() - 1 if is_down else 0
+ if in_list_index == boundary:
+ return
+ var new_index = in_list_index + 1 if is_down else in_list_index - 1
+ bank_paths.remove_at(in_list_index)
+ bank_paths.insert(new_index, item)
+ last_selected_index = new_index
+ emit_changed(path_property_name, bank_paths)
diff --git a/src/addons/fmod/tool/property_editors/FmodBankPathEditorProperty.gd.uid b/src/addons/fmod/tool/property_editors/FmodBankPathEditorProperty.gd.uid
new file mode 100644
index 0000000..bf989a5
--- /dev/null
+++ b/src/addons/fmod/tool/property_editors/FmodBankPathEditorProperty.gd.uid
@@ -0,0 +1 @@
+uid://cxyd4qioylvgr
diff --git a/src/addons/fmod/tool/property_editors/FmodBankPathsPropertyEditorUi.tscn b/src/addons/fmod/tool/property_editors/FmodBankPathsPropertyEditorUi.tscn
new file mode 100644
index 0000000..a4162f5
--- /dev/null
+++ b/src/addons/fmod/tool/property_editors/FmodBankPathsPropertyEditorUi.tscn
@@ -0,0 +1,60 @@
+[gd_scene load_steps=2 format=3 uid="uid://dtlwk8wdeal3h"]
+
+[ext_resource type="Texture2D" uid="uid://o2chsr07oeqs" path="res://addons/fmod/icons/bank_icon.svg" id="1_11c48"]
+
+[node name="FmodBankPathsPropertyEditorUi" type="VBoxContainer"]
+offset_right = 92.0
+offset_bottom = 43.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="HBoxContainer" type="HBoxContainer" parent="."]
+layout_mode = 2
+
+[node name="AddButton" type="Button" parent="HBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+text = "+"
+icon = ExtResource("1_11c48")
+icon_alignment = 2
+
+[node name="RemoveButton" type="Button" parent="HBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+text = "-"
+
+[node name="VSeparator" type="VSeparator" parent="HBoxContainer"]
+layout_mode = 2
+
+[node name="UpButton" type="Button" parent="HBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+text = "↑"
+
+[node name="DownButton" type="Button" parent="HBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+text = "↓"
+
+[node name="BankList" type="ItemList" parent="."]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_vertical = 3
+auto_height = true
+
+[node name="HBoxContainer2" type="HBoxContainer" parent="."]
+layout_mode = 2
+
+[node name="ManualAddLineEdit" type="LineEdit" parent="HBoxContainer2"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="ManualAddButton" type="Button" parent="HBoxContainer2"]
+unique_name_in_owner = true
+layout_mode = 2
+text = "+"
diff --git a/src/addons/fmod/tool/property_editors/FmodEventEditorProperty.gd b/src/addons/fmod/tool/property_editors/FmodEventEditorProperty.gd
new file mode 100644
index 0000000..4032b74
--- /dev/null
+++ b/src/addons/fmod/tool/property_editors/FmodEventEditorProperty.gd
@@ -0,0 +1,101 @@
+@tool class_name FmodEventEditorProperty extends FmodPathEditorProperty
+
+
+static var EVENT_PARAMETER_PREFIX_FOR_PROPERTIES = "fmod_parameters"
+
+var former_event_description: FmodEventDescription
+
+func _update_property():
+ super()
+ if get_edited_object().event_name == "":
+ return
+ _update_parameters()
+ var event_description: FmodEventDescription = FmodServer.get_event_from_guid(get_edited_object().event_guid)
+
+ if event_description == null:
+ event_description = FmodServer.get_event(get_edited_object().event_name)
+
+ former_event_description = event_description
+
+func _set_path_and_guid(path: String, guid: String):
+ super(path, guid)
+ if get_edited_object().event_name == "":
+ return
+ _update_parameters()
+ former_event_description = FmodServer.get_event_from_guid(get_edited_object().event_guid)
+
+func _update_parameters():
+ var event_description: FmodEventDescription = FmodServer.get_event_from_guid(get_edited_object().event_guid)
+
+ if event_description == null:
+ return
+
+ if former_event_description != null and event_description != former_event_description:
+ get_edited_object().tool_remove_all_parameters()
+
+ var map_to_property_name = func map_to_property_name(dict: Dictionary):
+ return dict["name"]
+ var filter_fmod_parameter_property = func filter_fmod_parameter_property(parameter_name: String):
+ return parameter_name.begins_with(EVENT_PARAMETER_PREFIX_FOR_PROPERTIES)
+
+ var filter_property_id = func filter_property_id(property: String):
+ return property.ends_with("/id")
+ var existing_property_ids = get_edited_object().get_property_list().map(map_to_property_name).filter(filter_fmod_parameter_property).filter(filter_property_id)
+
+ var map_property_name_to_parameter_name = func map_property_name_to_parameter_name(parameter: String):
+ return parameter.split("/")[1]
+ var existing_parameter_names = existing_property_ids.map(map_property_name_to_parameter_name)
+
+ var map_property_id_to_parameter_id_value = func map_property_id_to_parameter_id_value(property: String):
+ return get_edited_object()[property]
+ var existing_parameter_ids = existing_property_ids.map(map_property_id_to_parameter_id_value)
+
+ var property_matching = existing_parameter_ids.map(func(id): return false)
+
+ for param: FmodParameterDescription in event_description.get_parameters():
+ if param.is_global() or param.is_automatic() or param.is_read_only():
+ continue
+
+ var parameter_name = param.get_name()
+ var parameter_id_param = "%s/%s/id" % [EVENT_PARAMETER_PREFIX_FOR_PROPERTIES, parameter_name]
+ var parameter_value_param = "%s/%s" % [EVENT_PARAMETER_PREFIX_FOR_PROPERTIES, parameter_name]
+ var parameter_variant_type = "%s/%s/variant_type" % [EVENT_PARAMETER_PREFIX_FOR_PROPERTIES, parameter_name]
+ var parameter_labels = "%s/%s/labels" % [EVENT_PARAMETER_PREFIX_FOR_PROPERTIES, parameter_name]
+
+ var existing_property_name_index = existing_property_ids.find(parameter_id_param)
+ var are_properties_already_in_node = existing_property_name_index != -1
+
+ var parameter_id = param.get_id()
+
+ var variant_type: Variant.Type = TYPE_FLOAT
+ var default_value = param.get_default_value()
+ var minimum_value = param.get_minimum()
+ var maximum_value = param.get_maximum()
+ if param.is_labeled():
+ variant_type = TYPE_STRING
+ default_value = event_description.get_parameter_label_by_id(parameter_id, default_value)
+ minimum_value = event_description.get_parameter_label_by_id(parameter_id, minimum_value)
+ maximum_value = event_description.get_parameter_label_by_id(parameter_id, maximum_value)
+ elif param.is_discrete():
+ variant_type = TYPE_INT
+ default_value = int(default_value)
+ minimum_value = int(minimum_value)
+ maximum_value = int(maximum_value)
+
+ if are_properties_already_in_node:
+ property_matching[existing_property_name_index] = existing_parameter_ids[existing_property_name_index] == parameter_id
+
+ if not are_properties_already_in_node or get_edited_object()[parameter_id_param] == null:
+ get_edited_object()[parameter_id_param] = parameter_id
+ if not are_properties_already_in_node or get_edited_object()[parameter_value_param] == null:
+ get_edited_object()[parameter_value_param] = default_value
+ if not are_properties_already_in_node or get_edited_object()[parameter_variant_type] == null:
+ get_edited_object()[parameter_variant_type] = variant_type
+ if param.is_labeled() and (not are_properties_already_in_node or get_edited_object()[parameter_labels] == null):
+ get_edited_object()[parameter_labels] = event_description.get_parameter_labels_by_id(parameter_id)
+
+ for i in property_matching.size():
+ if not property_matching[i]:
+ get_edited_object().tool_remove_parameter(existing_parameter_ids[i])
+
+ get_edited_object().notify_property_list_changed()
diff --git a/src/addons/fmod/tool/property_editors/FmodEventEditorProperty.gd.uid b/src/addons/fmod/tool/property_editors/FmodEventEditorProperty.gd.uid
new file mode 100644
index 0000000..7afcc53
--- /dev/null
+++ b/src/addons/fmod/tool/property_editors/FmodEventEditorProperty.gd.uid
@@ -0,0 +1 @@
+uid://b32x60k0th8td
diff --git a/src/addons/fmod/tool/property_editors/FmodEventEditorProperty.tscn b/src/addons/fmod/tool/property_editors/FmodEventEditorProperty.tscn
new file mode 100644
index 0000000..2e43554
--- /dev/null
+++ b/src/addons/fmod/tool/property_editors/FmodEventEditorProperty.tscn
@@ -0,0 +1,7 @@
+[gd_scene load_steps=3 format=3 uid="uid://cowfthogh1n7i"]
+
+[ext_resource type="PackedScene" uid="uid://cujo3xq0erren" path="res://addons/fmod/tool/property_editors/FmodPathEditorProperty.tscn" id="1_xvpec"]
+[ext_resource type="Script" uid="uid://b32x60k0th8td" path="res://addons/fmod/tool/property_editors/FmodEventEditorProperty.gd" id="2_nkhkm"]
+
+[node name="FmodEventEditorProperty" instance=ExtResource("1_xvpec")]
+script = ExtResource("2_nkhkm")
diff --git a/src/addons/fmod/tool/property_editors/FmodGuidAndPathPropertyEditorUi.gd b/src/addons/fmod/tool/property_editors/FmodGuidAndPathPropertyEditorUi.gd
new file mode 100644
index 0000000..783c6b9
--- /dev/null
+++ b/src/addons/fmod/tool/property_editors/FmodGuidAndPathPropertyEditorUi.gd
@@ -0,0 +1,10 @@
+@tool class_name FmodGuidAndPathPropertyEditorUi extends HBoxContainer
+
+
+func set_callables(window_callable: Callable, path_callable: Callable, guid_callable: Callable):
+ %EventExplorerButton.pressed.connect(window_callable)
+ %PathLineEdit.text_changed.connect(path_callable)
+ %GuidLineEdit.text_changed.connect(guid_callable)
+
+func set_icon(icon: Texture2D):
+ %EventExplorerButton.icon = icon
diff --git a/src/addons/fmod/tool/property_editors/FmodGuidAndPathPropertyEditorUi.gd.uid b/src/addons/fmod/tool/property_editors/FmodGuidAndPathPropertyEditorUi.gd.uid
new file mode 100644
index 0000000..f2f083a
--- /dev/null
+++ b/src/addons/fmod/tool/property_editors/FmodGuidAndPathPropertyEditorUi.gd.uid
@@ -0,0 +1 @@
+uid://3xn18ci172v4
diff --git a/src/addons/fmod/tool/property_editors/FmodGuidAndPathPropertyEditorUi.tscn b/src/addons/fmod/tool/property_editors/FmodGuidAndPathPropertyEditorUi.tscn
new file mode 100644
index 0000000..423e4d4
--- /dev/null
+++ b/src/addons/fmod/tool/property_editors/FmodGuidAndPathPropertyEditorUi.tscn
@@ -0,0 +1,28 @@
+[gd_scene load_steps=3 format=3 uid="uid://hy04frgfhtgu"]
+
+[ext_resource type="Script" uid="uid://3xn18ci172v4" path="res://addons/fmod/tool/property_editors/FmodGuidAndPathPropertyEditorUi.gd" id="1_eao7t"]
+[ext_resource type="Texture2D" uid="uid://cmpgmbn3y4svl" path="res://addons/fmod/icons/event_icon.svg" id="1_kuu6i"]
+
+[node name="FmodGuidAndPathPropertyEditorUi" type="HBoxContainer"]
+offset_right = 1152.0
+offset_bottom = 66.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+script = ExtResource("1_eao7t")
+
+[node name="VBoxContainer" type="VBoxContainer" parent="."]
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="PathLineEdit" type="LineEdit" parent="VBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+
+[node name="GuidLineEdit" type="LineEdit" parent="VBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+
+[node name="EventExplorerButton" type="Button" parent="."]
+unique_name_in_owner = true
+layout_mode = 2
+icon = ExtResource("1_kuu6i")
diff --git a/src/addons/fmod/tool/property_editors/FmodPathEditorProperty.gd b/src/addons/fmod/tool/property_editors/FmodPathEditorProperty.gd
new file mode 100644
index 0000000..bc51780
--- /dev/null
+++ b/src/addons/fmod/tool/property_editors/FmodPathEditorProperty.gd
@@ -0,0 +1,40 @@
+@tool class_name FmodPathEditorProperty extends EditorProperty
+
+var ui: Control
+var guid_property: String
+var path_property: String
+var regex := RegEx.new()
+
+var default_line_edit_modulate: Color
+
+func initialize(open_project_explorer_callable: Callable, path_prop: String, guid_prop: String):
+ regex.compile("{\\w{8}-\\w{4}-\\w{4}-\\w{4}-\\w{12}}")
+ guid_property = guid_prop
+ path_property = path_prop
+ var guid_and_path_ui: FmodGuidAndPathPropertyEditorUi = %FmodGuidAndPathPropertyEditorUi
+
+ default_line_edit_modulate = guid_and_path_ui.get_node("%GuidLineEdit").modulate
+
+ var open_project_explorer_event = func open_project_explorer_event():
+ open_project_explorer_callable.call(self._set_path_and_guid)
+ guid_and_path_ui.set_callables(open_project_explorer_event, _set_path, _set_guid)
+
+func _update_property():
+ var guid_and_path_ui = %FmodGuidAndPathPropertyEditorUi
+ guid_and_path_ui.get_node("%PathLineEdit").text = get_edited_object()[path_property]
+ guid_and_path_ui.get_node("%GuidLineEdit").text = get_edited_object()[guid_property]
+
+func _set_path(path: String):
+ emit_changed(path_property, path)
+
+func _set_guid(guid: String):
+ var line_edit := %FmodGuidAndPathPropertyEditorUi.get_node("%GuidLineEdit") as LineEdit
+ if not regex.search(guid):
+ line_edit.modulate = Color.RED
+ return
+ line_edit.modulate = default_line_edit_modulate
+ emit_changed(guid_property, guid)
+
+func _set_path_and_guid(path: String, guid: String):
+ _set_path(path)
+ _set_guid(guid)
diff --git a/src/addons/fmod/tool/property_editors/FmodPathEditorProperty.gd.uid b/src/addons/fmod/tool/property_editors/FmodPathEditorProperty.gd.uid
new file mode 100644
index 0000000..84d9b97
--- /dev/null
+++ b/src/addons/fmod/tool/property_editors/FmodPathEditorProperty.gd.uid
@@ -0,0 +1 @@
+uid://qshng8csi2fr
diff --git a/src/addons/fmod/tool/property_editors/FmodPathEditorProperty.tscn b/src/addons/fmod/tool/property_editors/FmodPathEditorProperty.tscn
new file mode 100644
index 0000000..bab3416
--- /dev/null
+++ b/src/addons/fmod/tool/property_editors/FmodPathEditorProperty.tscn
@@ -0,0 +1,14 @@
+[gd_scene load_steps=3 format=3 uid="uid://cujo3xq0erren"]
+
+[ext_resource type="Script" uid="uid://qshng8csi2fr" path="res://addons/fmod/tool/property_editors/FmodPathEditorProperty.gd" id="1_4e4vx"]
+[ext_resource type="PackedScene" uid="uid://hy04frgfhtgu" path="res://addons/fmod/tool/property_editors/FmodGuidAndPathPropertyEditorUi.tscn" id="2_nvtqg"]
+
+[node name="FmodPathEditorProperty" type="EditorProperty"]
+script = ExtResource("1_4e4vx")
+
+[node name="VBoxContainer" type="VBoxContainer" parent="."]
+layout_mode = 2
+
+[node name="FmodGuidAndPathPropertyEditorUi" parent="VBoxContainer" instance=ExtResource("2_nvtqg")]
+unique_name_in_owner = true
+layout_mode = 2
diff --git a/src/addons/fmod/tool/ui/EventParametersDisplay.gd b/src/addons/fmod/tool/ui/EventParametersDisplay.gd
new file mode 100644
index 0000000..71c98c7
--- /dev/null
+++ b/src/addons/fmod/tool/ui/EventParametersDisplay.gd
@@ -0,0 +1,22 @@
+@tool class_name EventParametersDisplay extends ScrollContainer
+
+static var parameter_display_scene: PackedScene = load("res://addons/fmod/tool/ui/ParameterDisplay.tscn")
+
+func set_fmod_event(event: FmodEventDescription) -> bool: # returns false if there were no parameters
+ for child in %ParameterDisplaysContainer.get_children():
+ %ParameterDisplaysContainer.remove_child(child)
+ child.queue_free()
+
+ var event_parameters: Array = event.get_parameters()
+ if event_parameters:
+ show()
+ for parameter : FmodParameterDescription in event_parameters:
+ var parameter_display: ParameterDisplay = parameter_display_scene.instantiate()
+ parameter_display.set_event_description(event)
+ parameter_display.set_parameter(parameter)
+ if %ParameterDisplaysContainer.get_child_count() > 0:
+ %ParameterDisplaysContainer.add_child(HSeparator.new())
+ %ParameterDisplaysContainer.add_child(parameter_display)
+ return true # we had parameters to show!
+ else:
+ return false # no parameters to visualise
diff --git a/src/addons/fmod/tool/ui/EventParametersDisplay.gd.uid b/src/addons/fmod/tool/ui/EventParametersDisplay.gd.uid
new file mode 100644
index 0000000..3157d3f
--- /dev/null
+++ b/src/addons/fmod/tool/ui/EventParametersDisplay.gd.uid
@@ -0,0 +1 @@
+uid://7relkis52fsu
diff --git a/src/addons/fmod/tool/ui/EventParametersDisplay.tscn b/src/addons/fmod/tool/ui/EventParametersDisplay.tscn
new file mode 100644
index 0000000..f6f3049
--- /dev/null
+++ b/src/addons/fmod/tool/ui/EventParametersDisplay.tscn
@@ -0,0 +1,19 @@
+[gd_scene load_steps=2 format=3 uid="uid://cppeyr1ke5wre"]
+
+[ext_resource type="Script" uid="uid://7relkis52fsu" path="res://addons/fmod/tool/ui/EventParametersDisplay.gd" id="1_2l58q"]
+
+[node name="EventParametersDisplay" type="ScrollContainer"]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+script = ExtResource("1_2l58q")
+
+[node name="ParameterDisplaysContainer" type="VBoxContainer" parent="."]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
diff --git a/src/addons/fmod/tool/ui/EventParametersWindow.tscn b/src/addons/fmod/tool/ui/EventParametersWindow.tscn
new file mode 100644
index 0000000..2d6520b
--- /dev/null
+++ b/src/addons/fmod/tool/ui/EventParametersWindow.tscn
@@ -0,0 +1,7 @@
+[gd_scene load_steps=2 format=3 uid="uid://skp8awewyl85"]
+
+[ext_resource type="PackedScene" uid="uid://cppeyr1ke5wre" path="res://addons/fmod/tool/ui/EventParametersDisplay.tscn" id="1_clkxg"]
+
+[node name="EventParametersWindow" type="Window"]
+
+[node name="EventParametersDisplay" parent="." instance=ExtResource("1_clkxg")]
diff --git a/src/addons/fmod/tool/ui/EventPlayControls.gd b/src/addons/fmod/tool/ui/EventPlayControls.gd
new file mode 100644
index 0000000..b97c404
--- /dev/null
+++ b/src/addons/fmod/tool/ui/EventPlayControls.gd
@@ -0,0 +1,52 @@
+@tool
+extends PanelContainer
+
+@export var play_button : Button
+@export var stop_button : Button
+@export var fade_out_toggle : CheckButton
+var event_instance : FmodEvent
+
+func _ready() -> void:
+ hide()
+ play_button.icon = EditorInterface.get_editor_theme().get_icon("Play", "EditorIcons")
+ stop_button.icon = EditorInterface.get_editor_theme().get_icon("Stop", "EditorIcons")
+ play_button.pressed.connect(on_play_button_pressed)
+ stop_button.pressed.connect(on_stop_button_pressed)
+
+
+func set_fmod_event(_event_description : FmodEventDescription) -> void:
+ stop_and_release_instance() # always stop and release if a previous one is active
+ event_instance = FmodServer.create_event_instance_with_guid(_event_description.get_guid())
+ show()
+
+
+func play_event() -> void:
+ if event_instance:
+ event_instance.start()
+
+
+func stop_event() -> void:
+ if event_instance:
+ var stop_mode : int = FmodServer.FMOD_STUDIO_STOP_IMMEDIATE
+ if fade_out_toggle.button_pressed:
+ stop_mode = FmodServer.FMOD_STUDIO_STOP_ALLOWFADEOUT
+
+ event_instance.stop(stop_mode)
+
+
+func _exit_tree() -> void:
+ stop_and_release_instance()
+
+
+func stop_and_release_instance() -> void:
+ if event_instance:
+ event_instance.stop(0)
+ event_instance.release()
+
+
+func on_play_button_pressed() -> void:
+ play_event()
+
+
+func on_stop_button_pressed() -> void:
+ stop_event()
diff --git a/src/addons/fmod/tool/ui/EventPlayControls.gd.uid b/src/addons/fmod/tool/ui/EventPlayControls.gd.uid
new file mode 100644
index 0000000..4bbac12
--- /dev/null
+++ b/src/addons/fmod/tool/ui/EventPlayControls.gd.uid
@@ -0,0 +1 @@
+uid://vgmq7hfrbddw
diff --git a/src/addons/fmod/tool/ui/FmodBankExplorer.gd b/src/addons/fmod/tool/ui/FmodBankExplorer.gd
new file mode 100644
index 0000000..f358f29
--- /dev/null
+++ b/src/addons/fmod/tool/ui/FmodBankExplorer.gd
@@ -0,0 +1,237 @@
+@tool class_name FmodBankExplorer extends Window
+
+enum ToDisplayFlags {
+ BANKS = 1,
+ BUSES = 2,
+ VCA = 4,
+ EVENTS = 8
+}
+
+static var _fmod_icon = load("res://addons/fmod/icons/fmod_icon.svg")
+static var _vca_icon = load("res://addons/fmod/icons/vca_icon.svg")
+static var _bank_icon = load("res://addons/fmod/icons/bank_icon.svg")
+static var _event_icon = load("res://addons/fmod/icons/event_icon.svg")
+static var _bus_icon = load("res://addons/fmod/icons/bus_icon.svg")
+static var _snapshot_icon = load("res://addons/fmod/icons/snapshot_icon.svg")
+
+signal emit_path_and_guid(path: String, guid: String)
+
+var tree: Tree
+@onready var copy_path_button := %PathLabel.get_child(0)
+@onready var copy_guid_button := %GuidLabel.get_child(0)
+
+var should_display_copy_buttons = true
+var should_display_select_button = false
+
+var _current_select_callable: Callable
+
+var base_color: Color
+var contrast: float
+var background_color: Color
+
+var banks: Array = Array()
+
+func _ready():
+ var main_window_size = get_parent().get_window().size
+ size = main_window_size * 0.5
+
+ var copy_texture : Texture = EditorInterface.get_editor_theme().get_icon("ActionCopy", "EditorIcons")
+ copy_guid_button.icon = copy_texture
+ copy_path_button.icon = copy_texture
+ copy_guid_button.visible = false
+ copy_path_button.visible = false
+ copy_path_button.pressed.connect(_on_copy_path_button)
+ copy_guid_button.pressed.connect(_on_copy_guid_button)
+
+ var emit_path_and_guid_callable = func emit_path_and_guid_callable():
+ var selected_item = tree.get_selected()
+ if selected_item == null:
+ return
+ var selected_fmod_element = selected_item.get_metadata(0)
+ if selected_fmod_element == null:
+ return
+
+ var path = selected_fmod_element.get_godot_res_path() if selected_fmod_element is FmodBank else selected_fmod_element.get_path()
+ emit_path_and_guid.emit(path, selected_fmod_element.get_guid())
+ %SelectButton.pressed.connect(emit_path_and_guid_callable)
+ %SelectButton.pressed.connect(close_window)
+ %CloseButton.pressed.connect(close_window)
+ close_requested.connect(close_window)
+
+ tree = %Tree
+ tree.item_selected.connect(_on_item_selected)
+
+ tree.columns = 1
+ generate_tree(ToDisplayFlags.BANKS | ToDisplayFlags.BUSES | ToDisplayFlags.VCA | ToDisplayFlags.EVENTS)
+
+ %RefreshBanksButton.pressed.connect(on_refresh_banks_button_pressed)
+
+
+func regenerate_tree(to_display: int, callable: Callable = Callable()):
+ tree.clear()
+ generate_tree(to_display, callable)
+
+
+func generate_tree(to_display: int, callable: Callable = Callable()):
+ %SelectButton.visible = should_display_select_button
+ if _current_select_callable != Callable() && _current_select_callable.get_object() != null:
+ emit_path_and_guid.disconnect(_current_select_callable)
+ _current_select_callable = callable
+
+ var root_item := tree.create_item()
+ root_item.set_text(0, "Fmod objects")
+ root_item.set_icon(0, _fmod_icon)
+
+ for bank in FmodServer.get_all_banks():
+ var fmod_bank := bank as FmodBank
+
+ var bank_item := tree.create_item(root_item)
+ bank_item.set_text(0, fmod_bank.get_godot_res_path())
+ bank_item.set_icon(0, _bank_icon)
+ bank_item.set_metadata(0, bank)
+
+ if to_display & ToDisplayFlags.BUSES:
+ var buses_item := tree.create_item(bank_item)
+ buses_item.set_text(0, "Buses")
+ buses_item.set_icon(0, _bus_icon)
+
+ var buses := fmod_bank.get_bus_list()
+ buses.sort_custom(sort_by_path)
+ _add_elements_as_tree(buses, buses_item)
+
+ if to_display & ToDisplayFlags.VCA:
+ var vca_item := tree.create_item(bank_item)
+ vca_item.set_text(0, "VCAs")
+ vca_item.set_icon(0, _vca_icon)
+
+ var vcas := fmod_bank.get_vca_list()
+ vcas.sort_custom(sort_by_path)
+ _add_elements_as_tree(vcas, vca_item)
+
+ if to_display & ToDisplayFlags.EVENTS:
+ var events_item := tree.create_item(bank_item)
+ events_item.set_text(0, "Events")
+ events_item.set_icon(0, _event_icon)
+
+ var events := fmod_bank.get_description_list()
+ events.sort_custom(sort_by_path)
+ _add_elements_as_tree(events, events_item)
+
+ if copy_path_button.visible:
+ copy_path_button.visible = should_display_copy_buttons
+
+ if copy_guid_button.visible:
+ copy_guid_button.visible = should_display_copy_buttons
+
+ if _current_select_callable != Callable():
+ print(_current_select_callable)
+ emit_path_and_guid.connect(_current_select_callable)
+
+ %SelectButton.visible = should_display_select_button and %GuidLabel.text != ""
+
+
+func _add_elements_as_tree(elements: Array, parent: TreeItem):
+ var stack = Array()
+ for element in elements:
+ _add_element_to_stack(stack, parent, element)
+
+
+func _add_element_to_stack(stack: Array, parent_root: TreeItem, path_element):
+ var fmod_path: String = path_element.get_path()
+ var path_parts := fmod_path.split("/")
+ if path_parts[path_parts.size() - 1] == "":
+ path_parts.remove_at(path_parts.size() - 1)
+
+ for i in range(0, path_parts.size()):
+ var path_part = path_parts[i]
+ path_part = path_part if path_part != "bus:" else "Master"
+
+ if i >= stack.size():
+ var parent_item = parent_root if stack.is_empty() else stack[stack.size() - 1]
+ var tree_item = tree.create_item(parent_item)
+ tree_item.set_text(0, path_part)
+ if i == path_parts.size() - 1:
+ tree_item.set_metadata(0, path_element)
+ tree_item.set_icon(0, _get_icon_for_fmod_path(fmod_path))
+ stack.append(tree_item)
+ continue
+
+ if stack[i].get_text(0) != path_part:
+ for j in range(stack.size() - 1, i - 1, -1):
+ stack.remove_at(j)
+
+ var parent_item = parent_root if stack.is_empty() else stack[stack.size() - 1]
+ var tree_item = tree.create_item(parent_item)
+ tree_item.set_text(0, path_part)
+ if i == path_parts.size() - 1:
+ tree_item.set_metadata(0, path_element)
+ tree_item.set_icon(0, _get_icon_for_fmod_path(fmod_path))
+ stack.append(tree_item)
+
+
+func _on_item_selected():
+ var metadata = tree.get_selected().get_metadata(0)
+ if metadata == null or !metadata.get_guid():
+ %PathsBG.hide()
+ %EventPlayControls.hide()
+ copy_path_button.visible = false
+ copy_guid_button.visible = false
+ %SelectButton.visible = false
+ %ParametersLabel.visible = false
+ %ParametersContainer.visible = false
+ return
+ %GuidLabel.set_text(metadata.get_guid())
+ %PathLabel.set_text(metadata.get_path())
+ %PathsBG.show()
+ if should_display_copy_buttons:
+ copy_path_button.visible = true
+ copy_guid_button.visible = true
+ if should_display_select_button:
+ %SelectButton.visible = true
+
+ if metadata is FmodEventDescription:
+ %EventPlayControls.set_fmod_event(metadata)
+ var _show_parameter_controls : bool = %EventParametersDisplay.set_fmod_event(metadata)
+ %ParametersLabel.visible = _show_parameter_controls
+ %ParametersContainer.visible = _show_parameter_controls
+ return
+ %EventPlayControls.hide()
+ %EventParametersDisplay.hide()
+ %ParametersLabel.visible = false
+ %ParametersContainer.visible = false
+
+func _on_copy_path_button():
+ DisplayServer.clipboard_set(%PathLabel.text)
+
+func _on_copy_guid_button():
+ DisplayServer.clipboard_set(%GuidLabel.text)
+
+
+func on_refresh_banks_button_pressed() -> void:
+ # unload banks
+ banks.clear()
+ tree.clear()
+
+ FmodBankDatabase.reload_all_banks()
+
+ generate_tree(ToDisplayFlags.BANKS | ToDisplayFlags.BUSES | ToDisplayFlags.VCA | ToDisplayFlags.EVENTS)
+
+
+func close_window():
+ %EventPlayControls.stop_event()
+ visible = false
+
+static func _get_icon_for_fmod_path(fmod_path: String) -> Texture2D:
+ var icon: Texture2D = null
+ if fmod_path.begins_with("bus:/"):
+ icon = _bus_icon
+ elif fmod_path.begins_with("event:/"):
+ icon = _event_icon
+ elif fmod_path.begins_with("vca:/"):
+ icon = _vca_icon
+ elif fmod_path.begins_with("snapshot:/"):
+ icon = _snapshot_icon
+ return icon
+
+static func sort_by_path(a, b):
+ return a.get_path().casecmp_to(b.get_path()) < 0
diff --git a/src/addons/fmod/tool/ui/FmodBankExplorer.gd.uid b/src/addons/fmod/tool/ui/FmodBankExplorer.gd.uid
new file mode 100644
index 0000000..690c8c6
--- /dev/null
+++ b/src/addons/fmod/tool/ui/FmodBankExplorer.gd.uid
@@ -0,0 +1 @@
+uid://b5xgbibc3amtk
diff --git a/src/addons/fmod/tool/ui/FmodBankExplorer.tscn b/src/addons/fmod/tool/ui/FmodBankExplorer.tscn
new file mode 100644
index 0000000..28361c0
--- /dev/null
+++ b/src/addons/fmod/tool/ui/FmodBankExplorer.tscn
@@ -0,0 +1,348 @@
+[gd_scene load_steps=17 format=3 uid="uid://nr38urn226al"]
+
+[ext_resource type="Script" uid="uid://b5xgbibc3amtk" path="res://addons/fmod/tool/ui/FmodBankExplorer.gd" id="1_ekqus"]
+[ext_resource type="Script" uid="uid://vgmq7hfrbddw" path="res://addons/fmod/tool/ui/EventPlayControls.gd" id="2_mleop"]
+[ext_resource type="PackedScene" uid="uid://cppeyr1ke5wre" path="res://addons/fmod/tool/ui/EventParametersDisplay.tscn" id="2_uoyg8"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_wrr0m"]
+bg_color = Color(0, 0, 0, 0.247059)
+border_width_left = 1
+border_width_top = 1
+border_width_right = 1
+border_width_bottom = 1
+border_color = Color(1, 1, 1, 0.207843)
+corner_radius_top_left = 5
+corner_radius_top_right = 5
+corner_radius_bottom_right = 5
+corner_radius_bottom_left = 5
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_2pbsy"]
+
+[sub_resource type="LabelSettings" id="LabelSettings_3jkpq"]
+font_size = 18
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_0awfk"]
+bg_color = Color(0, 0, 0, 0.14902)
+border_width_left = 1
+border_width_top = 1
+border_width_right = 1
+border_width_bottom = 1
+border_color = Color(0.8, 0.8, 0.8, 0.145098)
+corner_radius_top_left = 5
+corner_radius_top_right = 5
+corner_radius_bottom_right = 5
+corner_radius_bottom_left = 5
+
+[sub_resource type="LabelSettings" id="LabelSettings_d4isr"]
+
+[sub_resource type="Image" id="Image_potss"]
+data = {
+"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 184, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 184, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 181, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 181, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 181, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_piloo"]
+image = SubResource("Image_potss")
+
+[sub_resource type="Image" id="Image_02ixt"]
+data = {
+"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 195, 224, 224, 224, 210, 224, 224, 224, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 224, 224, 224, 139, 224, 224, 224, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 215, 224, 224, 224, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 224, 224, 224, 139, 224, 224, 224, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 252, 225, 225, 225, 134, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 212, 226, 226, 226, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 252, 225, 225, 225, 134, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 225, 225, 191, 224, 224, 224, 206, 226, 226, 226, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_p4ox3"]
+image = SubResource("Image_02ixt")
+
+[sub_resource type="Image" id="Image_2s7ac"]
+data = {
+"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 225, 225, 182, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 225, 225, 182, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_26yvm"]
+image = SubResource("Image_2s7ac")
+
+[sub_resource type="InputEventKey" id="InputEventKey_w47tf"]
+device = -1
+keycode = 4194305
+
+[sub_resource type="Shortcut" id="Shortcut_rarey"]
+events = [SubResource("InputEventKey_w47tf")]
+
+[node name="FmodBankExplorer" type="Window"]
+title = "Fmod banks explorer"
+initial_position = 2
+size = Vector2i(1280, 508)
+script = ExtResource("1_ekqus")
+
+[node name="BGPanel" type="Panel" parent="."]
+unique_name_in_owner = true
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="WindowMargin" type="MarginContainer" parent="."]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_constants/margin_left = 16
+theme_override_constants/margin_top = 16
+theme_override_constants/margin_right = 16
+theme_override_constants/margin_bottom = 16
+
+[node name="VBoxContainer" type="VBoxContainer" parent="WindowMargin"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="TopPanel" type="PanelContainer" parent="WindowMargin/VBoxContainer"]
+custom_minimum_size = Vector2(0, 42.315)
+layout_mode = 2
+
+[node name="HBoxContainer" type="HBoxContainer" parent="WindowMargin/VBoxContainer/TopPanel"]
+layout_mode = 2
+alignment = 2
+
+[node name="RefreshBanksButton" type="Button" parent="WindowMargin/VBoxContainer/TopPanel/HBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+text = "Refresh Banks"
+
+[node name="BaseColorPanel" type="PanelContainer" parent="WindowMargin/VBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_vertical = 3
+theme_override_styles/panel = SubResource("StyleBoxFlat_wrr0m")
+
+[node name="MarginContainer" type="MarginContainer" parent="WindowMargin/VBoxContainer/BaseColorPanel"]
+layout_mode = 2
+size_flags_vertical = 3
+theme_override_constants/margin_left = 8
+theme_override_constants/margin_top = 8
+theme_override_constants/margin_right = 8
+theme_override_constants/margin_bottom = 8
+
+[node name="HSplitContainer" type="HSplitContainer" parent="WindowMargin/VBoxContainer/BaseColorPanel/MarginContainer"]
+layout_mode = 2
+
+[node name="Tree" type="Tree" parent="WindowMargin/VBoxContainer/BaseColorPanel/MarginContainer/HSplitContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+size_flags_stretch_ratio = 0.54
+theme_override_styles/panel = SubResource("StyleBoxEmpty_2pbsy")
+hide_root = true
+
+[node name="MarginContainer" type="MarginContainer" parent="WindowMargin/VBoxContainer/BaseColorPanel/MarginContainer/HSplitContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_constants/margin_left = 8
+theme_override_constants/margin_top = 8
+theme_override_constants/margin_right = 8
+theme_override_constants/margin_bottom = 8
+
+[node name="RightPanelContent" type="VBoxContainer" parent="WindowMargin/VBoxContainer/BaseColorPanel/MarginContainer/HSplitContainer/MarginContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="PathsLabel" type="Label" parent="WindowMargin/VBoxContainer/BaseColorPanel/MarginContainer/HSplitContainer/MarginContainer/RightPanelContent"]
+visible = false
+layout_mode = 2
+size_flags_vertical = 1
+text = "ID:"
+label_settings = SubResource("LabelSettings_3jkpq")
+justification_flags = 35
+
+[node name="PathsBG" type="PanelContainer" parent="WindowMargin/VBoxContainer/BaseColorPanel/MarginContainer/HSplitContainer/MarginContainer/RightPanelContent"]
+unique_name_in_owner = true
+visible = false
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_styles/panel = SubResource("StyleBoxFlat_0awfk")
+
+[node name="MarginContainer" type="MarginContainer" parent="WindowMargin/VBoxContainer/BaseColorPanel/MarginContainer/HSplitContainer/MarginContainer/RightPanelContent/PathsBG"]
+layout_mode = 2
+theme_override_constants/margin_left = 10
+theme_override_constants/margin_top = 10
+theme_override_constants/margin_right = 10
+theme_override_constants/margin_bottom = 10
+
+[node name="PathContainer" type="HBoxContainer" parent="WindowMargin/VBoxContainer/BaseColorPanel/MarginContainer/HSplitContainer/MarginContainer/RightPanelContent/PathsBG/MarginContainer"]
+layout_mode = 2
+
+[node name="TitleLabelContainer" type="VBoxContainer" parent="WindowMargin/VBoxContainer/BaseColorPanel/MarginContainer/HSplitContainer/MarginContainer/RightPanelContent/PathsBG/MarginContainer/PathContainer"]
+layout_mode = 2
+
+[node name="PathTitleLabel" type="Label" parent="WindowMargin/VBoxContainer/BaseColorPanel/MarginContainer/HSplitContainer/MarginContainer/RightPanelContent/PathsBG/MarginContainer/PathContainer/TitleLabelContainer"]
+layout_mode = 2
+size_flags_vertical = 6
+text = "Path:"
+label_settings = SubResource("LabelSettings_d4isr")
+
+[node name="GuidTitleLabel" type="Label" parent="WindowMargin/VBoxContainer/BaseColorPanel/MarginContainer/HSplitContainer/MarginContainer/RightPanelContent/PathsBG/MarginContainer/PathContainer/TitleLabelContainer"]
+layout_mode = 2
+size_flags_vertical = 6
+text = "GUID: "
+label_settings = SubResource("LabelSettings_d4isr")
+
+[node name="ValueContainer" type="VBoxContainer" parent="WindowMargin/VBoxContainer/BaseColorPanel/MarginContainer/HSplitContainer/MarginContainer/RightPanelContent/PathsBG/MarginContainer/PathContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="PathLabel" type="Label" parent="WindowMargin/VBoxContainer/BaseColorPanel/MarginContainer/HSplitContainer/MarginContainer/RightPanelContent/PathsBG/MarginContainer/PathContainer/ValueContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 0
+size_flags_vertical = 6
+text = "asdfasdfasdfasdf"
+
+[node name="CopyPathLabel" type="Button" parent="WindowMargin/VBoxContainer/BaseColorPanel/MarginContainer/HSplitContainer/MarginContainer/RightPanelContent/PathsBG/MarginContainer/PathContainer/ValueContainer/PathLabel"]
+visible = false
+layout_mode = 1
+anchors_preset = 6
+anchor_left = 1.0
+anchor_top = 0.5
+anchor_right = 1.0
+anchor_bottom = 0.5
+offset_left = 5.57001
+offset_top = -15.5
+offset_right = 36.57
+offset_bottom = 15.5
+grow_horizontal = 0
+grow_vertical = 2
+icon = SubResource("ImageTexture_piloo")
+
+[node name="GuidLabel" type="Label" parent="WindowMargin/VBoxContainer/BaseColorPanel/MarginContainer/HSplitContainer/MarginContainer/RightPanelContent/PathsBG/MarginContainer/PathContainer/ValueContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 0
+size_flags_vertical = 6
+text = "asdfasdf"
+vertical_alignment = 1
+
+[node name="CopyGuidLabel" type="Button" parent="WindowMargin/VBoxContainer/BaseColorPanel/MarginContainer/HSplitContainer/MarginContainer/RightPanelContent/PathsBG/MarginContainer/PathContainer/ValueContainer/GuidLabel"]
+visible = false
+layout_mode = 1
+anchors_preset = 6
+anchor_left = 1.0
+anchor_top = 0.5
+anchor_right = 1.0
+anchor_bottom = 0.5
+offset_left = 6.095
+offset_top = -15.5
+offset_right = 37.095
+offset_bottom = 15.5
+grow_horizontal = 0
+grow_vertical = 2
+icon = SubResource("ImageTexture_piloo")
+
+[node name="ParametersLabel" type="Label" parent="WindowMargin/VBoxContainer/BaseColorPanel/MarginContainer/HSplitContainer/MarginContainer/RightPanelContent"]
+unique_name_in_owner = true
+visible = false
+custom_minimum_size = Vector2(0, 45)
+layout_mode = 2
+text = "Parameters:"
+label_settings = SubResource("LabelSettings_3jkpq")
+vertical_alignment = 2
+
+[node name="ParametersContainer" type="PanelContainer" parent="WindowMargin/VBoxContainer/BaseColorPanel/MarginContainer/HSplitContainer/MarginContainer/RightPanelContent"]
+unique_name_in_owner = true
+visible = false
+layout_mode = 2
+size_flags_vertical = 3
+theme_override_styles/panel = SubResource("StyleBoxFlat_0awfk")
+
+[node name="MarginContainer" type="MarginContainer" parent="WindowMargin/VBoxContainer/BaseColorPanel/MarginContainer/HSplitContainer/MarginContainer/RightPanelContent/ParametersContainer"]
+layout_mode = 2
+theme_override_constants/margin_left = 10
+theme_override_constants/margin_top = 10
+theme_override_constants/margin_right = 10
+theme_override_constants/margin_bottom = 10
+
+[node name="EventParametersDisplay" parent="WindowMargin/VBoxContainer/BaseColorPanel/MarginContainer/HSplitContainer/MarginContainer/RightPanelContent/ParametersContainer/MarginContainer" instance=ExtResource("2_uoyg8")]
+unique_name_in_owner = true
+layout_mode = 2
+
+[node name="EventPlayControls" type="PanelContainer" parent="WindowMargin/VBoxContainer/BaseColorPanel/MarginContainer/HSplitContainer/MarginContainer/RightPanelContent" node_paths=PackedStringArray("play_button", "stop_button", "fade_out_toggle")]
+unique_name_in_owner = true
+visible = false
+custom_minimum_size = Vector2(0, 55.44)
+layout_mode = 2
+size_flags_vertical = 10
+size_flags_stretch_ratio = 0.1
+theme_override_styles/panel = SubResource("StyleBoxFlat_0awfk")
+script = ExtResource("2_mleop")
+play_button = NodePath("MarginContainer/HBoxContainer/PlayEventButton")
+stop_button = NodePath("MarginContainer/HBoxContainer/StopEventButton")
+fade_out_toggle = NodePath("MarginContainer/HBoxContainer/FadeoutToggle")
+
+[node name="MarginContainer" type="MarginContainer" parent="WindowMargin/VBoxContainer/BaseColorPanel/MarginContainer/HSplitContainer/MarginContainer/RightPanelContent/EventPlayControls"]
+layout_mode = 2
+theme_override_constants/margin_left = 10
+theme_override_constants/margin_top = 10
+theme_override_constants/margin_right = 10
+theme_override_constants/margin_bottom = 10
+
+[node name="HBoxContainer" type="HBoxContainer" parent="WindowMargin/VBoxContainer/BaseColorPanel/MarginContainer/HSplitContainer/MarginContainer/RightPanelContent/EventPlayControls/MarginContainer"]
+layout_mode = 2
+
+[node name="PlayEventButton" type="Button" parent="WindowMargin/VBoxContainer/BaseColorPanel/MarginContainer/HSplitContainer/MarginContainer/RightPanelContent/EventPlayControls/MarginContainer/HBoxContainer"]
+layout_mode = 2
+text = "Play"
+icon = SubResource("ImageTexture_p4ox3")
+
+[node name="StopEventButton" type="Button" parent="WindowMargin/VBoxContainer/BaseColorPanel/MarginContainer/HSplitContainer/MarginContainer/RightPanelContent/EventPlayControls/MarginContainer/HBoxContainer"]
+layout_mode = 2
+text = "Stop"
+icon = SubResource("ImageTexture_26yvm")
+
+[node name="FadeoutToggle" type="CheckButton" parent="WindowMargin/VBoxContainer/BaseColorPanel/MarginContainer/HSplitContainer/MarginContainer/RightPanelContent/EventPlayControls/MarginContainer/HBoxContainer"]
+layout_mode = 2
+text = "Allow fade out"
+
+[node name="MarginContainer" type="MarginContainer" parent="WindowMargin/VBoxContainer"]
+layout_mode = 2
+theme_override_constants/margin_top = 8
+
+[node name="HBoxContainer" type="HBoxContainer" parent="WindowMargin/VBoxContainer/MarginContainer"]
+layout_mode = 2
+alignment = 1
+
+[node name="MarginContainer2" type="MarginContainer" parent="WindowMargin/VBoxContainer/MarginContainer/HBoxContainer"]
+layout_mode = 2
+theme_override_constants/margin_left = 8
+theme_override_constants/margin_right = 8
+
+[node name="SelectButton" type="Button" parent="WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/MarginContainer2"]
+unique_name_in_owner = true
+visible = false
+layout_mode = 2
+size_flags_horizontal = 4
+text = "Select"
+
+[node name="MarginContainer" type="MarginContainer" parent="WindowMargin/VBoxContainer/MarginContainer/HBoxContainer"]
+layout_mode = 2
+theme_override_constants/margin_left = 8
+theme_override_constants/margin_right = 8
+
+[node name="CloseButton" type="Button" parent="WindowMargin/VBoxContainer/MarginContainer/HBoxContainer/MarginContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 4
+shortcut = SubResource("Shortcut_rarey")
+text = "Close"
diff --git a/src/addons/fmod/tool/ui/ParameterDisplay.gd b/src/addons/fmod/tool/ui/ParameterDisplay.gd
new file mode 100644
index 0000000..e4d74e7
--- /dev/null
+++ b/src/addons/fmod/tool/ui/ParameterDisplay.gd
@@ -0,0 +1,66 @@
+@tool class_name ParameterDisplay extends MarginContainer
+
+var event_description: FmodEventDescription
+var parameter: FmodParameterDescription
+
+func set_event_description(p_event_description: FmodEventDescription):
+ event_description = p_event_description
+
+func set_parameter(p_parameter: FmodParameterDescription):
+ show()
+ parameter = p_parameter
+
+func display_value_selector(should: bool):
+ %ValueSetterContainer.visible = should
+
+func _ready():
+ if parameter == null:
+ hide()
+ return
+ var minimum_value = parameter.get_minimum()
+ var maximum_value = parameter.get_maximum()
+ var default_value = parameter.get_default_value()
+
+ var copy_icon : Texture = EditorInterface.get_editor_theme().get_icon("ActionCopy", "EditorIcons")
+ %NameCopyButton.icon = copy_icon
+ %IdCopyButton.icon = copy_icon
+
+
+ %NameLabel.text = parameter.get_name()
+ %IdLabel.text = str(parameter.get_id())
+ if parameter.is_labeled():
+ %RangeTitle.text = "Values"
+ var values_text = "["
+ var is_first: bool = true
+ for label: String in event_description.get_parameter_labels_by_id(parameter.get_id()):
+ if not is_first:
+ values_text += ", "
+ values_text += label
+ is_first = false
+ values_text += "]"
+ %RangeLabel.text = values_text
+ else:
+ %RangeLabel.text = "[%s, %s]" % [minimum_value, maximum_value]
+ %DefaultValueLabel.text = str(default_value)
+ %NameCopyButton.pressed.connect(_on_copy_name_button)
+ %IdCopyButton.pressed.connect(_on_copy_id_button)
+ %BackToDefaultButton.pressed.connect(_on_default_value_button)
+
+ %ValueSlider.min_value = minimum_value
+ %ValueSlider.max_value = maximum_value
+ %ValueSlider.value = default_value
+
+ _on_slider_value_changed(%ValueSlider.value)
+ %ValueSlider.value_changed.connect(_on_slider_value_changed)
+
+func _on_copy_name_button():
+ DisplayServer.clipboard_set(%NameLabel.text)
+
+func _on_copy_id_button():
+ DisplayServer.clipboard_set(%IdLabel.text)
+
+func _on_default_value_button():
+ %ValueSlider.value = parameter.get_default_value()
+
+func _on_slider_value_changed(value: float):
+ %CurrentValueLabel.text = str(value)
diff --git a/src/addons/fmod/tool/ui/ParameterDisplay.gd.uid b/src/addons/fmod/tool/ui/ParameterDisplay.gd.uid
new file mode 100644
index 0000000..6294b70
--- /dev/null
+++ b/src/addons/fmod/tool/ui/ParameterDisplay.gd.uid
@@ -0,0 +1 @@
+uid://ve6g43nb1hdd
diff --git a/src/addons/fmod/tool/ui/ParameterDisplay.tscn b/src/addons/fmod/tool/ui/ParameterDisplay.tscn
new file mode 100644
index 0000000..5009988
--- /dev/null
+++ b/src/addons/fmod/tool/ui/ParameterDisplay.tscn
@@ -0,0 +1,146 @@
+[gd_scene load_steps=2 format=3 uid="uid://bfdldojk5i6u3"]
+
+[ext_resource type="Script" uid="uid://ve6g43nb1hdd" path="res://addons/fmod/tool/ui/ParameterDisplay.gd" id="1_fxyw8"]
+
+[node name="ParameterDisplay" type="MarginContainer"]
+visible = false
+offset_right = 168.0
+offset_bottom = 160.0
+size_flags_horizontal = 3
+theme_override_constants/margin_left = 4
+theme_override_constants/margin_top = 4
+theme_override_constants/margin_right = 4
+theme_override_constants/margin_bottom = 4
+script = ExtResource("1_fxyw8")
+
+[node name="VBoxContainer" type="VBoxContainer" parent="."]
+layout_mode = 2
+
+[node name="VBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
+layout_mode = 2
+
+[node name="TitleContainer" type="VBoxContainer" parent="VBoxContainer/VBoxContainer"]
+layout_mode = 2
+theme_override_constants/separation = 20
+
+[node name="NameTitle" type="Label" parent="VBoxContainer/VBoxContainer/TitleContainer"]
+layout_mode = 2
+size_flags_vertical = 10
+text = "Name: "
+
+[node name="IdTitle" type="Label" parent="VBoxContainer/VBoxContainer/TitleContainer"]
+layout_mode = 2
+size_flags_vertical = 10
+text = "ID: "
+
+[node name="RangeTitle" type="Label" parent="VBoxContainer/VBoxContainer/TitleContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_vertical = 10
+text = "Range: "
+
+[node name="DefaultValueTitle" type="Label" parent="VBoxContainer/VBoxContainer/TitleContainer"]
+layout_mode = 2
+size_flags_vertical = 10
+text = "Default value: "
+
+[node name="ContentContainer" type="VBoxContainer" parent="VBoxContainer/VBoxContainer"]
+layout_mode = 2
+theme_override_constants/separation = 20
+
+[node name="NameLabel" type="Label" parent="VBoxContainer/VBoxContainer/ContentContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 0
+size_flags_vertical = 10
+
+[node name="NameCopyButton" type="Button" parent="VBoxContainer/VBoxContainer/ContentContainer/NameLabel"]
+unique_name_in_owner = true
+layout_mode = 1
+anchors_preset = 6
+anchor_left = 1.0
+anchor_top = 0.5
+anchor_right = 1.0
+anchor_bottom = 0.5
+offset_left = 9.0
+offset_top = -15.5
+offset_right = 40.0
+offset_bottom = 15.5
+grow_horizontal = 0
+grow_vertical = 2
+size_flags_vertical = 10
+
+[node name="IdLabel" type="Label" parent="VBoxContainer/VBoxContainer/ContentContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 0
+size_flags_vertical = 10
+
+[node name="IdCopyButton" type="Button" parent="VBoxContainer/VBoxContainer/ContentContainer/IdLabel"]
+unique_name_in_owner = true
+layout_mode = 1
+anchors_preset = 6
+anchor_left = 1.0
+anchor_top = 0.5
+anchor_right = 1.0
+anchor_bottom = 0.5
+offset_left = 9.0
+offset_top = -15.5
+offset_right = 40.0
+offset_bottom = 15.5
+grow_horizontal = 0
+grow_vertical = 2
+size_flags_vertical = 10
+
+[node name="RangeLabel" type="Label" parent="VBoxContainer/VBoxContainer/ContentContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 0
+size_flags_vertical = 10
+
+[node name="DefaultValueLabel" type="Label" parent="VBoxContainer/VBoxContainer/ContentContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 0
+size_flags_vertical = 10
+
+[node name="ValueSetterContainer" type="VBoxContainer" parent="VBoxContainer"]
+unique_name_in_owner = true
+visible = false
+layout_mode = 2
+
+[node name="HSeparator" type="HSeparator" parent="VBoxContainer/ValueSetterContainer"]
+layout_mode = 2
+
+[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/ValueSetterContainer"]
+layout_mode = 2
+
+[node name="Label" type="Label" parent="VBoxContainer/ValueSetterContainer/HBoxContainer"]
+layout_mode = 2
+text = "Set value: "
+
+[node name="ValueSlider" type="HSlider" parent="VBoxContainer/ValueSetterContainer/HBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 4
+
+[node name="BackToDefaultButton" type="Button" parent="VBoxContainer/ValueSetterContainer/HBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+text = "Default"
+
+[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/ValueSetterContainer"]
+layout_mode = 2
+
+[node name="CurrentValueTitleLabel" type="Label" parent="VBoxContainer/ValueSetterContainer/HBoxContainer2"]
+layout_mode = 2
+text = "Current value: "
+
+[node name="CurrentValueLabel" type="Label" parent="VBoxContainer/ValueSetterContainer/HBoxContainer2"]
+unique_name_in_owner = true
+layout_mode = 2
+
+[node name="Button" type="Button" parent="VBoxContainer/ValueSetterContainer"]
+layout_mode = 2
+text = "Select"
diff --git a/src/addons/fmod/tool/ui/TestFmodBankExplorer.tscn b/src/addons/fmod/tool/ui/TestFmodBankExplorer.tscn
new file mode 100644
index 0000000..5368f06
--- /dev/null
+++ b/src/addons/fmod/tool/ui/TestFmodBankExplorer.tscn
@@ -0,0 +1,12 @@
+[gd_scene load_steps=2 format=3 uid="uid://f4i35731qm63"]
+
+[ext_resource type="PackedScene" uid="uid://nr38urn226al" path="res://addons/fmod/tool/ui/FmodBankExplorer.tscn" id="1_0ul6h"]
+
+[node name="TestFmodBankExplorer" type="Node2D"]
+
+[node name="FmodBankLoader" type="FmodBankLoader" parent="."]
+bank_paths = ["res://assets/Banks/Master.strings.bank", "res://assets/Banks/Master.bank", "res://assets/Banks/Music.bank", "res://assets/Banks/Vehicles.bank"]
+
+[node name="FmodBankExplorer" parent="FmodBankLoader" instance=ExtResource("1_0ul6h")]
+initial_position = 0
+position = Vector2i(0, 36)
diff --git a/src/assets/fmod/Master.bank b/src/assets/fmod/Master.bank
new file mode 100644
index 0000000..7148770
--- /dev/null
+++ b/src/assets/fmod/Master.bank
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fed516735b6329bc1dfc5dc77252d25d5ad9a1535239781da3cfa899418c4130
+size 15856
diff --git a/src/assets/fmod/Master.strings.bank b/src/assets/fmod/Master.strings.bank
new file mode 100644
index 0000000..cc19757
--- /dev/null
+++ b/src/assets/fmod/Master.strings.bank
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:26781812a7786530a210ebe8765814ecf48122f47c99fae79629fbf76d5966ee
+size 1656
diff --git a/src/assets/fmod/VO.bank b/src/assets/fmod/VO.bank
new file mode 100644
index 0000000..832066d
--- /dev/null
+++ b/src/assets/fmod/VO.bank
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:697f5b70643ef2b6b9d32600e06075222cde692bf13c7e9046b70339af5c70c1
+size 38592
diff --git a/src/empty_scene.tscn b/src/empty_scene.tscn
index 7714a80..fb0aab3 100644
--- a/src/empty_scene.tscn
+++ b/src/empty_scene.tscn
@@ -1,3 +1,14 @@
[gd_scene format=3 uid="uid://cygqjanirnqqt"]
[node name="Node" type="Node"]
+
+[node name="FmodBankLoader" type="FmodBankLoader" parent="."]
+bank_paths = ["res://assets/fmod/Master.strings.bank", "res://assets/fmod/Master.bank", "res://assets/fmod/VO.bank"]
+
+[node name="FmodListener2D" type="FmodListener2D" parent="."]
+
+[node name="FmodEventEmitter2D" type="FmodEventEmitter2D" parent="."]
+event_name = "event:/VO/Welcome"
+event_guid = "{d7eabb29-abd9-4057-b408-eef937d66f2a}"
+autoplay = true
+auto_release = true
diff --git a/src/export_presets.cfg b/src/export_presets.cfg
index 7849851..fa3a86c 100644
--- a/src/export_presets.cfg
+++ b/src/export_presets.cfg
@@ -1,50 +1,5 @@
[preset.0]
-name="web_release"
-platform="Web"
-runnable=true
-advanced_options=true
-dedicated_server=false
-custom_features=""
-export_filter="exclude"
-export_files=PackedStringArray()
-include_filter=""
-exclude_filter="addons/format_on_save/*, addons/panku_console/*, addons/resource_resave/*, addons/version_check/*"
-export_path="builds/web/web_release/index.html"
-patches=PackedStringArray()
-encryption_include_filters=""
-encryption_exclude_filters=""
-seed=0
-encrypt_pck=false
-encrypt_directory=false
-script_export_mode=2
-
-[preset.0.options]
-
-custom_template/debug=""
-custom_template/release=""
-variant/extensions_support=true
-variant/thread_support=false
-vram_texture_compression/for_desktop=true
-vram_texture_compression/for_mobile=false
-html/export_icon=true
-html/custom_html_shell=""
-html/head_include=""
-html/canvas_resize_policy=2
-html/focus_canvas_on_start=true
-html/experimental_virtual_keyboard=false
-progressive_web_app/enabled=false
-progressive_web_app/ensure_cross_origin_isolation_headers=true
-progressive_web_app/offline_page=""
-progressive_web_app/display=1
-progressive_web_app/orientation=0
-progressive_web_app/icon_144x144=""
-progressive_web_app/icon_180x180=""
-progressive_web_app/icon_512x512=""
-progressive_web_app/background_color=Color(0, 0, 0, 1)
-
-[preset.1]
-
name="linux_release"
platform="Linux"
runnable=true
@@ -64,7 +19,7 @@ encrypt_pck=false
encrypt_directory=false
script_export_mode=2
-[preset.1.options]
+[preset.0.options]
custom_template/debug=""
custom_template/release=""
@@ -90,7 +45,7 @@ texture_format/s3tc=true
texture_format/etc=false
texture_format/etc2=false
-[preset.2]
+[preset.1]
name="windows"
platform="Windows Desktop"
@@ -111,7 +66,7 @@ encrypt_pck=false
encrypt_directory=false
script_export_mode=2
-[preset.2.options]
+[preset.1.options]
custom_template/debug=""
custom_template/release=""
diff --git a/src/free_fmod.gd b/src/free_fmod.gd
new file mode 100644
index 0000000..9111343
--- /dev/null
+++ b/src/free_fmod.gd
@@ -0,0 +1,5 @@
+extends Node
+
+func _exit_tree() -> void:
+ print("exiting tree")
+ FmodServer.shutdown()
diff --git a/src/free_fmod.gd.uid b/src/free_fmod.gd.uid
new file mode 100644
index 0000000..44ae8a9
--- /dev/null
+++ b/src/free_fmod.gd.uid
@@ -0,0 +1 @@
+uid://c1osrer787cv7
diff --git a/src/project.godot b/src/project.godot
index 8445c98..d236aa0 100644
--- a/src/project.godot
+++ b/src/project.godot
@@ -8,6 +8,25 @@
config_version=5
+[Fmod]
+
+General/auto_initialize=true
+General/channel_count=1024
+General/is_live_update_enabled=true
+General/is_memory_tracking_enabled=false
+"Software Format/sample_rate"=48000
+"Software Format/speaker_mode"=3
+"Software Format/raw_speaker_count"=0
+General/default_listener_count=1
+General/banks_path="res://assets/fmod"
+Plugins/path_to_plugin_configuration=""
+General/should_load_by_name=false
+DSP/dsp_buffer_size=512
+DSP/dsp_buffer_count=4
+"3D Settings/doppler_scale"=1.0
+"3D Settings/distance_factor"=1.0
+"3D Settings/rolloff_scale"=1.0
+
[application]
config/name="Project Template"
@@ -19,6 +38,7 @@ config/features=PackedStringArray("4.4", "GL Compatibility")
Logger="*res://addons/godot-logger/logger.gd"
PhantomCameraManager="*res://addons/phantom_camera/scripts/managers/phantom_camera_manager.gd"
EventBus="*res://global/event_bus.gd"
+FmodManager="*res://addons/fmod/FmodManager.gd"
[debug_draw_3d]
@@ -26,7 +46,7 @@ settings/addon_root_folder="res://addons/debug_draw_3d"
[editor_plugins]
-enabled=PackedStringArray("res://addons/format_on_save/plugin.cfg", "res://addons/godot-logger/plugin.cfg", "res://addons/gut/plugin.cfg", "res://addons/phantom_camera/plugin.cfg", "res://addons/resource_resave/plugin.cfg", "res://addons/version_check/plugin.cfg")
+enabled=PackedStringArray("res://addons/fmod/plugin.cfg", "res://addons/format_on_save/plugin.cfg", "res://addons/godot-logger/plugin.cfg", "res://addons/gut/plugin.cfg", "res://addons/phantom_camera/plugin.cfg", "res://addons/resource_resave/plugin.cfg", "res://addons/version_check/plugin.cfg")
[input]