diff --git a/.github/actions/create-native-build/action.yaml b/.github/actions/create-native-build/action.yaml
index 09f49152..cbae9ff2 100644
--- a/.github/actions/create-native-build/action.yaml
+++ b/.github/actions/create-native-build/action.yaml
@@ -17,6 +17,9 @@ inputs:
description: The password for fmod account used to download fmod binaries.
shell:
description: The shell used by the runner.
+ artifact-suffix:
+ description: Optional suffix for the artifact name.
+ default: ""
runs:
using: composite
steps:
@@ -106,6 +109,6 @@ runs:
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
- name: ${{ inputs.platform }}-${{ inputs.target }}
- path: ${{ env.TARGET_PATH }}${{ inputs.platform }}/**/*.*
+ name: ${{ inputs.platform }}-${{ inputs.target }}${{ inputs.artifact-suffix }}
+ path: ${{ env.TARGET_PATH }}${{ inputs.platform }}/**/*
if-no-files-found: error
diff --git a/.github/workflows/check_pr.yml b/.github/workflows/check_pr.yml
index 338efbb5..98e163f2 100644
--- a/.github/workflows/check_pr.yml
+++ b/.github/workflows/check_pr.yml
@@ -142,6 +142,7 @@ jobs:
os: "macos-14"
platform: ios
target: template_debug
+ flags: arch=arm64
fmod-executable-suffix: ios.dmg
shell: bash
@@ -149,6 +150,7 @@ jobs:
os: "macos-14"
platform: ios
target: template_release
+ flags: arch=arm64
fmod-executable-suffix: ios.dmg
shell: bash
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index a9a970a7..2856b1d6 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -123,6 +123,7 @@ jobs:
os: "macos-14"
platform: ios
target: template_debug
+ flags: arch=arm64
fmod-executable-suffix: ios.dmg
shell: bash
@@ -130,9 +131,46 @@ jobs:
os: "macos-14"
platform: ios
target: template_release
+ flags: arch=arm64
fmod-executable-suffix: ios.dmg
shell: bash
+ - name: iOS Simulator x86_64 Debug Compilation
+ os: "macos-14"
+ platform: ios
+ target: template_debug
+ flags: ios_simulator=yes arch=x86_64
+ fmod-executable-suffix: ios.dmg
+ artifact-suffix: "-sim-x64"
+ shell: bash
+
+ - name: iOS Simulator x86_64 Release Compilation
+ os: "macos-14"
+ platform: ios
+ target: template_release
+ flags: ios_simulator=yes arch=x86_64
+ fmod-executable-suffix: ios.dmg
+ artifact-suffix: "-sim-x64"
+ shell: bash
+
+ - name: iOS Simulator arm64 Debug Compilation
+ os: "macos-14"
+ platform: ios
+ target: template_debug
+ flags: ios_simulator=yes arch=arm64
+ fmod-executable-suffix: ios.dmg
+ artifact-suffix: "-sim-arm64"
+ shell: bash
+
+ - name: iOS Simulator arm64 Release Compilation
+ os: "macos-14"
+ platform: ios
+ target: template_release
+ flags: ios_simulator=yes arch=arm64
+ fmod-executable-suffix: ios.dmg
+ artifact-suffix: "-sim-arm64"
+ shell: bash
+
steps:
- name: Checkout
uses: actions/checkout@v4
@@ -158,9 +196,73 @@ jobs:
fmod-user: ${{ secrets.FMODUSER }}
fmod-password: ${{ secrets.FMODPASS }}
shell: ${{ matrix.shell }}
+ artifact-suffix: ${{ matrix.artifact-suffix }}
- package-godot-addon:
+ merge-ios-xcframework:
+ name: Merge iOS XCFrameworks (${{ matrix.target }})
needs: [build]
+ runs-on: "macos-14"
+ strategy:
+ matrix:
+ target: [template_debug, template_release]
+ steps:
+ - name: Download iOS Device
+ uses: actions/download-artifact@v4
+ with:
+ name: ios-${{ matrix.target }}
+ path: ios-device
+
+ - name: Download iOS Simulator x64
+ uses: actions/download-artifact@v4
+ with:
+ name: ios-${{ matrix.target }}-sim-x64
+ path: ios-sim-x64
+
+ - name: Download iOS Simulator arm64
+ uses: actions/download-artifact@v4
+ with:
+ name: ios-${{ matrix.target }}-sim-arm64
+ path: ios-sim-arm64
+
+ - name: Merge Simulator Binaries (Dynamic)
+ run: |
+ mkdir -p ios-sim-universal
+ SIM_X64=$(find ios-sim-x64 -name "${{ env.TARGET_NAME }}.ios.${{ matrix.target }}.x86_64.simulator.dylib" | head -n 1)
+ SIM_ARM64=$(find ios-sim-arm64 -name "${{ env.TARGET_NAME }}.ios.${{ matrix.target }}.arm64.simulator.dylib" | head -n 1)
+ echo "SIM_X64: $SIM_X64"
+ echo "SIM_ARM64: $SIM_ARM64"
+ lipo -create "$SIM_X64" "$SIM_ARM64" -output ios-sim-universal/libGodotFmod.ios.${{ matrix.target }}.simulator.dylib
+
+ - name: Create Universal XCFramework (Bridge)
+ run: |
+ DEVICE_LIB=$(find ios-device -name "${{ env.TARGET_NAME }}.ios.${{ matrix.target }}.arm64.dylib" | head -n 1)
+ SIM_LIB=ios-sim-universal/libGodotFmod.ios.${{ matrix.target }}.simulator.dylib
+ echo "DEVICE_LIB: $DEVICE_LIB"
+ echo "SIM_LIB: $SIM_LIB"
+
+ # Generate dSYMs for both libraries
+ dsymutil "$DEVICE_LIB" -o "${DEVICE_LIB}.dSYM"
+ dsymutil "$SIM_LIB" -o "${SIM_LIB}.dSYM"
+
+ xcodebuild -create-xcframework \
+ -library "$DEVICE_LIB" -debug-symbols "$(pwd)/${DEVICE_LIB}.dSYM" \
+ -library "$SIM_LIB" -debug-symbols "$(pwd)/${SIM_LIB}.dSYM" \
+ -output ${{ env.TARGET_NAME }}.ios.${{ matrix.target }}.xcframework
+
+ - name: Copy FMOD XCFrameworks
+ run: |
+ cp -R ios-device/fmod*.xcframework .
+
+ - name: Upload Merged Artifacts
+ uses: actions/upload-artifact@v4
+ with:
+ name: ios-merged-${{ matrix.target }}
+ path: |
+ ${{ env.TARGET_NAME }}.ios.${{ matrix.target }}.xcframework
+ fmod*.xcframework
+
+ package-godot-addon:
+ needs: [build, merge-ios-xcframework]
strategy:
matrix:
include:
@@ -235,14 +337,14 @@ jobs:
- name: Download iOS template_debug libraries
uses: actions/download-artifact@v4
with:
- name: ios-template_debug
- path: demo/addons/fmod/libs/iOS/
+ name: ios-merged-template_debug
+ path: demo/addons/fmod/libs/ios/
- name: Download iOS template_release libraries
uses: actions/download-artifact@v4
with:
- name: ios-template_release
- path: demo/addons/fmod/libs/iOS/
+ name: ios-merged-template_release
+ path: demo/addons/fmod/libs/ios/
- name: Download android editor libraries
uses: actions/download-artifact@v4
diff --git a/.gitignore b/.gitignore
index fa98f482..24674ab1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -139,6 +139,7 @@ config.log
**/*.editor
demo/addons/fmod/libs/android/aar/
+build_libs/
*.pdb
.vs
\ No newline at end of file
diff --git a/SConstruct b/SConstruct
index 16d843e9..56983998 100644
--- a/SConstruct
+++ b/SConstruct
@@ -13,6 +13,8 @@ env = SConscript("godot-cpp/SConstruct")
# Add those directory manually, so we can skip the godot_cpp directory when including headers in C++ files
source_path = [
+ os.path.join("godot-cpp", "include"),
+ os.path.join("godot-cpp", "gen", "include"),
os.path.join("godot-cpp", "include","godot_cpp"),
os.path.join("godot-cpp", "gen", "include","godot_cpp")
]
@@ -96,16 +98,24 @@ elif env["platform"] == "windows":
env.Append(CCFLAGS=["/FS", "/Zi"])
elif env["platform"] == "ios":
- libfmod = 'libfmod%s_iphoneos.a' % lfix
- libfmodstudio = 'libfmodstudio%s_iphoneos.a' % lfix
-
- env.Append(CPPPATH=[env['fmod_lib_dir'] + 'ios/core/inc/', env['fmod_lib_dir'] + 'ios/studio/inc/'])
- env.Append(LIBPATH=[env['fmod_lib_dir'] + 'ios/core/lib/', env['fmod_lib_dir'] + 'ios/studio/lib/'])
+ ios_platform = "iphonesimulator" if env["ios_simulator"] else "iphoneos"
+ libfmod = 'libfmod%s_%s.a' % (lfix, ios_platform)
+ libfmodstudio = 'libfmodstudio%s_%s.a' % (lfix, ios_platform)
+
+ # Use the local libs/ios folder which should exist via symlink
+ fmod_ios_inc = 'libs/ios/'
+ if not os.path.exists(fmod_ios_inc):
+ # Fallback to the provided prefix if symlink doesn't exist
+ fmod_ios_inc = env['fmod_lib_dir'] + 'ios/'
+
+ env.Append(CPPPATH=[fmod_ios_inc + 'core/inc/', fmod_ios_inc + 'studio/inc/'])
+ env.Append(LIBPATH=[fmod_ios_inc + 'core/lib/', fmod_ios_inc + 'studio/lib/'])
env.Append(LIBS=[libfmod, libfmodstudio])
- env.Append(LINKFLAGS=[
- '-Wl,-undefined,dynamic_lookup', "-miphoneos-version-min=" + env["ios_min_version"]
- ])
+ ios_link_flags = ['-Wl,-undefined,dynamic_lookup']
+ if not env["ios_simulator"]:
+ ios_link_flags.append("-miphoneos-version-min=" + env["ios_min_version"])
+ env.Append(LINKFLAGS=ios_link_flags)
elif env["platform"] == "android":
libfmod = 'libfmod%s.so' % lfix
@@ -137,18 +147,26 @@ if env["platform"] == "macos":
env["target"]
)
else:
- target = "{}.{}{}".format(
+ ios_sim_suffix = ".simulator" if env["platform"] == "ios" and env.get("ios_simulator", False) else ""
+ target = "{}.{}{}{}".format(
target,
env["arch"],
+ ios_sim_suffix,
env["SHLIBSUFFIX"]
)
+ target_out = target
library = env.SharedLibrary(target=target, source=sources)
def sys_exec(args):
- proc = subprocess.Popen(args, stdout=subprocess.PIPE, text=True)
+ print("Running command: " + " ".join(args))
+ proc = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
(out, err) = proc.communicate()
+ if proc.returncode != 0:
+ print("Error executing command: " + " ".join(args))
+ print("Error output: " + err)
+ Exit(proc.returncode)
return out.rstrip("\r\n").lstrip()
@@ -162,13 +180,70 @@ if env["platform"] == "ios":
)
def create_xcframework(self, arg, env, executor = None):
- sys_exec(["xcodebuild", "-create-xcframework", "-library", target, "-output", xcframework_path])
- sys_exec(["rm", target])
- sys_exec(["/usr/libexec/PlistBuddy", "-c", "Add :MinimumOSVersion string " + env["ios_min_version"], "{}/Info.plist".format(xcframework_path)])
+ if os.path.exists(xcframework_path):
+ shutil.rmtree(xcframework_path)
+
+ # Base target path without architecture or simulator suffix
+ base_target = "{}{}/{}.{}.{}".format(
+ target_path, env["platform"], target_name, env["platform"], env["target"]
+ )
+
+ # We want to find the device and simulator libraries for this target
+ # e.g. for ios: .arm64.dylib and .simulator.dylib
+ libs = []
+
+ # Device library (try .arm64.dylib, then fall back to .universal.dylib if found)
+ device_lib_arm64 = "{}.arm64{}".format(base_target, env["SHLIBSUFFIX"])
+ device_lib_universal = "{}.universal{}".format(base_target, env["SHLIBSUFFIX"])
+
+ if os.path.exists(device_lib_arm64):
+ libs.append(device_lib_arm64)
+ elif os.path.exists(device_lib_universal):
+ libs.append(device_lib_universal)
+
+ # Simulator library (prefer universal simulator if it exists)
+ sim_universal = "{}.simulator{}".format(base_target, env["SHLIBSUFFIX"])
+ sim_universal_alt = "{}.universal.simulator{}".format(base_target, env["SHLIBSUFFIX"])
+
+ if os.path.exists(sim_universal):
+ libs.append(sim_universal)
+ elif os.path.exists(sim_universal_alt):
+ libs.append(sim_universal_alt)
+ else:
+ # Fallback to arch-specific simulator build if universal doesn't exist
+ sim_arch = "{}.{}.simulator{}".format(base_target, env["arch"], env["SHLIBSUFFIX"])
+ if os.path.exists(sim_arch):
+ libs.append(sim_arch)
+
+ if not libs:
+ print("No libraries found to create xcframework for target: " + base_target)
+ return
+
+ cmd = ["xcodebuild", "-create-xcframework"]
+ dsym_paths = []
+ for lib in libs:
+ dsym_path = os.path.abspath(lib + ".dSYM")
+ abs_lib = os.path.abspath(lib)
+ sys_exec(["dsymutil", abs_lib, "-o", dsym_path])
+ if os.path.exists(dsym_path):
+ cmd.extend(["-library", abs_lib, "-debug-symbols", dsym_path])
+ else:
+ cmd.extend(["-library", abs_lib])
+ dsym_paths.append(dsym_path)
+
+ cmd.extend(["-output", xcframework_path])
+ sys_exec(cmd)
+
+ # Add MinimumOSVersion to Info.plist
+ plutil_cmd = ["/usr/libexec/PlistBuddy", "-c", "Add :MinimumOSVersion string " + env["ios_min_version"], "{}/Info.plist".format(xcframework_path)]
+ sys_exec(plutil_cmd)
create_xcframework_action = Action('', create_xcframework)
- AddPostAction(library, create_xcframework_action)
+ # Only create xcframework on device builds; simulator builds produce
+ # individual dylibs that the CI merge-ios-xcframework job combines.
+ if not env.get("ios_simulator", False):
+ AddPostAction(library, create_xcframework_action)
def copy_fmod_libraries(self, arg, env, executor = None):
diff --git a/demo/addons/fmod/.gitignore b/demo/addons/fmod/.gitignore
index de430593..a41c488c 100644
--- a/demo/addons/fmod/.gitignore
+++ b/demo/addons/fmod/.gitignore
@@ -4,4 +4,9 @@
*.so
*.so.*
*.xcframework
-!libs/
\ No newline at end of file
+!libs/
+!libs/**/*.a
+!libs/**/*.dylib
+!libs/**/*.xcframework
+!libs/**/*.dll
+!libs/**/*.so
\ No newline at end of file
diff --git a/demo/addons/fmod/fmod.gdextension b/demo/addons/fmod/fmod.gdextension
index eacba962..387ccbf7 100644
--- a/demo/addons/fmod/fmod.gdextension
+++ b/demo/addons/fmod/fmod.gdextension
@@ -1,6 +1,6 @@
[configuration]
entry_symbol = "fmod_library_init"
-compatibility_minimum = 4.5
+compatibility_minimum = 4.1
[libraries]
windows.editor.x86_64 = "res://addons/fmod/libs/windows/libGodotFmod.windows.editor.x86_64.dll"
@@ -92,10 +92,10 @@ android.release.arm64 = {
"libs/android/arm64/libfmodstudio.so": "",
}
ios.debug = {
-"libs/ios/libfmodL_iphoneos.a": "",
-"libs/ios/libfmodstudioL_iphoneos.a": ""
+"libs/ios/fmodL.xcframework": "",
+"libs/ios/fmodstudioL.xcframework": ""
}
ios.release = {
-"libs/ios/libfmod_iphoneos.a": "",
-"libs/ios/libfmodstudio_iphoneos.a": ""
+"libs/ios/fmod.xcframework": "",
+"libs/ios/fmodstudio.xcframework": ""
}
\ No newline at end of file
diff --git a/demo/addons/fmod/libs/iOS/CopyPast_Fmod_Libs_Here.txt b/demo/addons/fmod/libs/ios/CopyPast_Fmod_Libs_Here.txt
similarity index 100%
rename from demo/addons/fmod/libs/iOS/CopyPast_Fmod_Libs_Here.txt
rename to demo/addons/fmod/libs/ios/CopyPast_Fmod_Libs_Here.txt
diff --git a/demo/addons/fmod/libs/ios/fmod.xcframework/Info.plist b/demo/addons/fmod/libs/ios/fmod.xcframework/Info.plist
new file mode 100644
index 00000000..2218b8e4
--- /dev/null
+++ b/demo/addons/fmod/libs/ios/fmod.xcframework/Info.plist
@@ -0,0 +1,45 @@
+
+
+
+
+ AvailableLibraries
+
+
+ BinaryPath
+ libfmod_iphonesimulator.a
+ LibraryIdentifier
+ ios-arm64_x86_64-simulator
+ LibraryPath
+ libfmod_iphonesimulator.a
+ SupportedArchitectures
+
+ arm64
+ x86_64
+
+ SupportedPlatform
+ ios
+ SupportedPlatformVariant
+ simulator
+
+
+ BinaryPath
+ libfmod_iphoneos.a
+ LibraryIdentifier
+ ios-arm64_arm64e
+ LibraryPath
+ libfmod_iphoneos.a
+ SupportedArchitectures
+
+ arm64
+ arm64e
+
+ SupportedPlatform
+ ios
+
+
+ CFBundlePackageType
+ XFWK
+ XCFrameworkFormatVersion
+ 1.0
+
+
diff --git a/demo/addons/fmod/libs/ios/fmod.xcframework/ios-arm64_arm64e/libfmod_iphoneos.a b/demo/addons/fmod/libs/ios/fmod.xcframework/ios-arm64_arm64e/libfmod_iphoneos.a
new file mode 100644
index 00000000..7645cd41
Binary files /dev/null and b/demo/addons/fmod/libs/ios/fmod.xcframework/ios-arm64_arm64e/libfmod_iphoneos.a differ
diff --git a/demo/addons/fmod/libs/ios/fmod.xcframework/ios-arm64_x86_64-simulator/libfmod_iphonesimulator.a b/demo/addons/fmod/libs/ios/fmod.xcframework/ios-arm64_x86_64-simulator/libfmod_iphonesimulator.a
new file mode 100644
index 00000000..92ad62ea
Binary files /dev/null and b/demo/addons/fmod/libs/ios/fmod.xcframework/ios-arm64_x86_64-simulator/libfmod_iphonesimulator.a differ
diff --git a/demo/addons/fmod/libs/ios/fmodL.xcframework/Info.plist b/demo/addons/fmod/libs/ios/fmodL.xcframework/Info.plist
new file mode 100644
index 00000000..8e02c42d
--- /dev/null
+++ b/demo/addons/fmod/libs/ios/fmodL.xcframework/Info.plist
@@ -0,0 +1,45 @@
+
+
+
+
+ AvailableLibraries
+
+
+ BinaryPath
+ libfmodL_iphonesimulator.a
+ LibraryIdentifier
+ ios-arm64_x86_64-simulator
+ LibraryPath
+ libfmodL_iphonesimulator.a
+ SupportedArchitectures
+
+ arm64
+ x86_64
+
+ SupportedPlatform
+ ios
+ SupportedPlatformVariant
+ simulator
+
+
+ BinaryPath
+ libfmodL_iphoneos.a
+ LibraryIdentifier
+ ios-arm64_arm64e
+ LibraryPath
+ libfmodL_iphoneos.a
+ SupportedArchitectures
+
+ arm64
+ arm64e
+
+ SupportedPlatform
+ ios
+
+
+ CFBundlePackageType
+ XFWK
+ XCFrameworkFormatVersion
+ 1.0
+
+
diff --git a/demo/addons/fmod/libs/ios/fmodL.xcframework/ios-arm64_arm64e/libfmodL_iphoneos.a b/demo/addons/fmod/libs/ios/fmodL.xcframework/ios-arm64_arm64e/libfmodL_iphoneos.a
new file mode 100644
index 00000000..0bebfb2c
Binary files /dev/null and b/demo/addons/fmod/libs/ios/fmodL.xcframework/ios-arm64_arm64e/libfmodL_iphoneos.a differ
diff --git a/demo/addons/fmod/libs/ios/fmodL.xcframework/ios-arm64_x86_64-simulator/libfmodL_iphonesimulator.a b/demo/addons/fmod/libs/ios/fmodL.xcframework/ios-arm64_x86_64-simulator/libfmodL_iphonesimulator.a
new file mode 100644
index 00000000..a99ea3d9
Binary files /dev/null and b/demo/addons/fmod/libs/ios/fmodL.xcframework/ios-arm64_x86_64-simulator/libfmodL_iphonesimulator.a differ
diff --git a/demo/addons/fmod/libs/ios/fmodstudio.xcframework/Info.plist b/demo/addons/fmod/libs/ios/fmodstudio.xcframework/Info.plist
new file mode 100644
index 00000000..8cf2e193
--- /dev/null
+++ b/demo/addons/fmod/libs/ios/fmodstudio.xcframework/Info.plist
@@ -0,0 +1,45 @@
+
+
+
+
+ AvailableLibraries
+
+
+ BinaryPath
+ libfmodstudio_iphonesimulator.a
+ LibraryIdentifier
+ ios-arm64_x86_64-simulator
+ LibraryPath
+ libfmodstudio_iphonesimulator.a
+ SupportedArchitectures
+
+ arm64
+ x86_64
+
+ SupportedPlatform
+ ios
+ SupportedPlatformVariant
+ simulator
+
+
+ BinaryPath
+ libfmodstudio_iphoneos.a
+ LibraryIdentifier
+ ios-arm64_arm64e
+ LibraryPath
+ libfmodstudio_iphoneos.a
+ SupportedArchitectures
+
+ arm64
+ arm64e
+
+ SupportedPlatform
+ ios
+
+
+ CFBundlePackageType
+ XFWK
+ XCFrameworkFormatVersion
+ 1.0
+
+
diff --git a/demo/addons/fmod/libs/ios/fmodstudio.xcframework/ios-arm64_arm64e/libfmodstudio_iphoneos.a b/demo/addons/fmod/libs/ios/fmodstudio.xcframework/ios-arm64_arm64e/libfmodstudio_iphoneos.a
new file mode 100644
index 00000000..39c609dc
Binary files /dev/null and b/demo/addons/fmod/libs/ios/fmodstudio.xcframework/ios-arm64_arm64e/libfmodstudio_iphoneos.a differ
diff --git a/demo/addons/fmod/libs/ios/fmodstudio.xcframework/ios-arm64_x86_64-simulator/libfmodstudio_iphonesimulator.a b/demo/addons/fmod/libs/ios/fmodstudio.xcframework/ios-arm64_x86_64-simulator/libfmodstudio_iphonesimulator.a
new file mode 100644
index 00000000..64f9eefd
Binary files /dev/null and b/demo/addons/fmod/libs/ios/fmodstudio.xcframework/ios-arm64_x86_64-simulator/libfmodstudio_iphonesimulator.a differ
diff --git a/demo/addons/fmod/libs/ios/fmodstudioL.xcframework/Info.plist b/demo/addons/fmod/libs/ios/fmodstudioL.xcframework/Info.plist
new file mode 100644
index 00000000..fae8cef8
--- /dev/null
+++ b/demo/addons/fmod/libs/ios/fmodstudioL.xcframework/Info.plist
@@ -0,0 +1,45 @@
+
+
+
+
+ AvailableLibraries
+
+
+ BinaryPath
+ libfmodstudioL_iphonesimulator.a
+ LibraryIdentifier
+ ios-arm64_x86_64-simulator
+ LibraryPath
+ libfmodstudioL_iphonesimulator.a
+ SupportedArchitectures
+
+ arm64
+ x86_64
+
+ SupportedPlatform
+ ios
+ SupportedPlatformVariant
+ simulator
+
+
+ BinaryPath
+ libfmodstudioL_iphoneos.a
+ LibraryIdentifier
+ ios-arm64_arm64e
+ LibraryPath
+ libfmodstudioL_iphoneos.a
+ SupportedArchitectures
+
+ arm64
+ arm64e
+
+ SupportedPlatform
+ ios
+
+
+ CFBundlePackageType
+ XFWK
+ XCFrameworkFormatVersion
+ 1.0
+
+
diff --git a/demo/addons/fmod/libs/ios/fmodstudioL.xcframework/ios-arm64_arm64e/libfmodstudioL_iphoneos.a b/demo/addons/fmod/libs/ios/fmodstudioL.xcframework/ios-arm64_arm64e/libfmodstudioL_iphoneos.a
new file mode 100644
index 00000000..58d1875d
Binary files /dev/null and b/demo/addons/fmod/libs/ios/fmodstudioL.xcframework/ios-arm64_arm64e/libfmodstudioL_iphoneos.a differ
diff --git a/demo/addons/fmod/libs/ios/fmodstudioL.xcframework/ios-arm64_x86_64-simulator/libfmodstudioL_iphonesimulator.a b/demo/addons/fmod/libs/ios/fmodstudioL.xcframework/ios-arm64_x86_64-simulator/libfmodstudioL_iphonesimulator.a
new file mode 100644
index 00000000..d0ac6174
Binary files /dev/null and b/demo/addons/fmod/libs/ios/fmodstudioL.xcframework/ios-arm64_x86_64-simulator/libfmodstudioL_iphonesimulator.a differ
diff --git a/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.arm64.dylib b/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.arm64.dylib
new file mode 100755
index 00000000..d237c965
Binary files /dev/null and b/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.arm64.dylib differ
diff --git a/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.arm64.simulator.dylib b/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.arm64.simulator.dylib
new file mode 100755
index 00000000..6dae427b
Binary files /dev/null and b/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.arm64.simulator.dylib differ
diff --git a/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.simulator.dylib b/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.simulator.dylib
new file mode 100755
index 00000000..7e4dd1f7
Binary files /dev/null and b/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.simulator.dylib differ
diff --git a/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.universal.dylib b/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.universal.dylib
new file mode 100755
index 00000000..074839c5
Binary files /dev/null and b/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.universal.dylib differ
diff --git a/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.universal.simulator.dylib b/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.universal.simulator.dylib
new file mode 100755
index 00000000..b9f30bad
Binary files /dev/null and b/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.universal.simulator.dylib differ
diff --git a/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.x86_64.simulator.dylib b/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.x86_64.simulator.dylib
new file mode 100755
index 00000000..41db08f9
Binary files /dev/null and b/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.x86_64.simulator.dylib differ
diff --git a/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.xcframework/Info.plist b/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.xcframework/Info.plist
new file mode 100644
index 00000000..77f370df
--- /dev/null
+++ b/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.xcframework/Info.plist
@@ -0,0 +1,46 @@
+
+
+
+
+ AvailableLibraries
+
+
+ BinaryPath
+ libGodotFmod.ios.template_debug.simulator.dylib
+ LibraryIdentifier
+ ios-arm64_x86_64-simulator
+ LibraryPath
+ libGodotFmod.ios.template_debug.simulator.dylib
+ SupportedArchitectures
+
+ arm64
+ x86_64
+
+ SupportedPlatform
+ ios
+ SupportedPlatformVariant
+ simulator
+
+
+ BinaryPath
+ libGodotFmod.ios.template_debug.arm64.dylib
+ LibraryIdentifier
+ ios-arm64
+ LibraryPath
+ libGodotFmod.ios.template_debug.arm64.dylib
+ SupportedArchitectures
+
+ arm64
+
+ SupportedPlatform
+ ios
+
+
+ CFBundlePackageType
+ XFWK
+ MinimumOSVersion
+ 12.0
+ XCFrameworkFormatVersion
+ 1.0
+
+
diff --git a/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.xcframework/ios-arm64/libGodotFmod.ios.template_debug.arm64.dylib b/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.xcframework/ios-arm64/libGodotFmod.ios.template_debug.arm64.dylib
new file mode 100755
index 00000000..d237c965
Binary files /dev/null and b/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.xcframework/ios-arm64/libGodotFmod.ios.template_debug.arm64.dylib differ
diff --git a/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.xcframework/ios-arm64_x86_64-simulator/libGodotFmod.ios.template_debug.simulator.dylib b/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.xcframework/ios-arm64_x86_64-simulator/libGodotFmod.ios.template_debug.simulator.dylib
new file mode 100755
index 00000000..7e4dd1f7
Binary files /dev/null and b/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_debug.xcframework/ios-arm64_x86_64-simulator/libGodotFmod.ios.template_debug.simulator.dylib differ
diff --git a/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_release.universal.dylib b/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_release.universal.dylib
new file mode 100755
index 00000000..c2604b1a
Binary files /dev/null and b/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_release.universal.dylib differ
diff --git a/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_release.universal.simulator.dylib b/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_release.universal.simulator.dylib
new file mode 100755
index 00000000..eaa720da
Binary files /dev/null and b/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_release.universal.simulator.dylib differ
diff --git a/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_release.xcframework/Info.plist b/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_release.xcframework/Info.plist
new file mode 100644
index 00000000..4b187b18
--- /dev/null
+++ b/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_release.xcframework/Info.plist
@@ -0,0 +1,32 @@
+
+
+
+
+ AvailableLibraries
+
+
+ BinaryPath
+ libGodotFmod.ios.template_release.universal.simulator.dylib
+ LibraryIdentifier
+ ios-arm64_x86_64-simulator
+ LibraryPath
+ libGodotFmod.ios.template_release.universal.simulator.dylib
+ SupportedArchitectures
+
+ arm64
+ x86_64
+
+ SupportedPlatform
+ ios
+ SupportedPlatformVariant
+ simulator
+
+
+ CFBundlePackageType
+ XFWK
+ MinimumOSVersion
+ 12.0
+ XCFrameworkFormatVersion
+ 1.0
+
+
diff --git a/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_release.xcframework/ios-arm64_x86_64-simulator/libGodotFmod.ios.template_release.universal.simulator.dylib b/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_release.xcframework/ios-arm64_x86_64-simulator/libGodotFmod.ios.template_release.universal.simulator.dylib
new file mode 100755
index 00000000..eaa720da
Binary files /dev/null and b/demo/addons/fmod/libs/ios/libGodotFmod.ios.template_release.xcframework/ios-arm64_x86_64-simulator/libGodotFmod.ios.template_release.universal.simulator.dylib differ
diff --git a/demo/addons/fmod/libs/ios/libgodotcpp.debug.xcframework/Info.plist b/demo/addons/fmod/libs/ios/libgodotcpp.debug.xcframework/Info.plist
new file mode 100644
index 00000000..01d995bc
--- /dev/null
+++ b/demo/addons/fmod/libs/ios/libgodotcpp.debug.xcframework/Info.plist
@@ -0,0 +1,44 @@
+
+
+
+
+ AvailableLibraries
+
+
+ BinaryPath
+ libgodot-cpp.ios.template_debug.arm64.a
+ LibraryIdentifier
+ ios-arm64
+ LibraryPath
+ libgodot-cpp.ios.template_debug.arm64.a
+ SupportedArchitectures
+
+ arm64
+
+ SupportedPlatform
+ ios
+
+
+ BinaryPath
+ libgodot-cpp.ios.template_debug.simulator.a
+ LibraryIdentifier
+ ios-arm64_x86_64-simulator
+ LibraryPath
+ libgodot-cpp.ios.template_debug.simulator.a
+ SupportedArchitectures
+
+ arm64
+ x86_64
+
+ SupportedPlatform
+ ios
+ SupportedPlatformVariant
+ simulator
+
+
+ CFBundlePackageType
+ XFWK
+ XCFrameworkFormatVersion
+ 1.0
+
+
diff --git a/demo/addons/fmod/libs/ios/libgodotcpp.debug.xcframework/ios-arm64/libgodot-cpp.ios.template_debug.arm64.a b/demo/addons/fmod/libs/ios/libgodotcpp.debug.xcframework/ios-arm64/libgodot-cpp.ios.template_debug.arm64.a
new file mode 100644
index 00000000..f416c814
Binary files /dev/null and b/demo/addons/fmod/libs/ios/libgodotcpp.debug.xcframework/ios-arm64/libgodot-cpp.ios.template_debug.arm64.a differ
diff --git a/demo/addons/fmod/libs/ios/libgodotcpp.debug.xcframework/ios-arm64_x86_64-simulator/libgodot-cpp.ios.template_debug.simulator.a b/demo/addons/fmod/libs/ios/libgodotcpp.debug.xcframework/ios-arm64_x86_64-simulator/libgodot-cpp.ios.template_debug.simulator.a
new file mode 100644
index 00000000..48ef75fc
Binary files /dev/null and b/demo/addons/fmod/libs/ios/libgodotcpp.debug.xcframework/ios-arm64_x86_64-simulator/libgodot-cpp.ios.template_debug.simulator.a differ
diff --git a/demo/addons/fmod/libs/ios/libgodotcpp.release.xcframework/Info.plist b/demo/addons/fmod/libs/ios/libgodotcpp.release.xcframework/Info.plist
new file mode 100644
index 00000000..68ea8a12
--- /dev/null
+++ b/demo/addons/fmod/libs/ios/libgodotcpp.release.xcframework/Info.plist
@@ -0,0 +1,44 @@
+
+
+
+
+ AvailableLibraries
+
+
+ BinaryPath
+ libgodot-cpp.ios.template_release.arm64.a
+ LibraryIdentifier
+ ios-arm64
+ LibraryPath
+ libgodot-cpp.ios.template_release.arm64.a
+ SupportedArchitectures
+
+ arm64
+
+ SupportedPlatform
+ ios
+
+
+ BinaryPath
+ libgodot-cpp.ios.template_release.simulator.a
+ LibraryIdentifier
+ ios-arm64_x86_64-simulator
+ LibraryPath
+ libgodot-cpp.ios.template_release.simulator.a
+ SupportedArchitectures
+
+ arm64
+ x86_64
+
+ SupportedPlatform
+ ios
+ SupportedPlatformVariant
+ simulator
+
+
+ CFBundlePackageType
+ XFWK
+ XCFrameworkFormatVersion
+ 1.0
+
+
diff --git a/demo/addons/fmod/libs/ios/libgodotcpp.release.xcframework/ios-arm64/libgodot-cpp.ios.template_release.arm64.a b/demo/addons/fmod/libs/ios/libgodotcpp.release.xcframework/ios-arm64/libgodot-cpp.ios.template_release.arm64.a
new file mode 100644
index 00000000..13ffccdc
Binary files /dev/null and b/demo/addons/fmod/libs/ios/libgodotcpp.release.xcframework/ios-arm64/libgodot-cpp.ios.template_release.arm64.a differ
diff --git a/demo/addons/fmod/libs/ios/libgodotcpp.release.xcframework/ios-arm64_x86_64-simulator/libgodot-cpp.ios.template_release.simulator.a b/demo/addons/fmod/libs/ios/libgodotcpp.release.xcframework/ios-arm64_x86_64-simulator/libgodot-cpp.ios.template_release.simulator.a
new file mode 100644
index 00000000..fd0f29e0
Binary files /dev/null and b/demo/addons/fmod/libs/ios/libgodotcpp.release.xcframework/ios-arm64_x86_64-simulator/libgodot-cpp.ios.template_release.simulator.a differ
diff --git a/demo/addons/fmod/libs/macos/libfmod.dylib b/demo/addons/fmod/libs/macos/libfmod.dylib
new file mode 100644
index 00000000..d3a6dbe7
Binary files /dev/null and b/demo/addons/fmod/libs/macos/libfmod.dylib differ
diff --git a/demo/addons/fmod/libs/macos/libfmodL.dylib b/demo/addons/fmod/libs/macos/libfmodL.dylib
new file mode 100644
index 00000000..b5585928
Binary files /dev/null and b/demo/addons/fmod/libs/macos/libfmodL.dylib differ
diff --git a/demo/addons/fmod/libs/macos/libfmodstudio.dylib b/demo/addons/fmod/libs/macos/libfmodstudio.dylib
new file mode 100644
index 00000000..aa36c733
Binary files /dev/null and b/demo/addons/fmod/libs/macos/libfmodstudio.dylib differ
diff --git a/demo/addons/fmod/libs/macos/libfmodstudioL.dylib b/demo/addons/fmod/libs/macos/libfmodstudioL.dylib
new file mode 100644
index 00000000..cf212ce4
Binary files /dev/null and b/demo/addons/fmod/libs/macos/libfmodstudioL.dylib differ
diff --git a/demo/addons/gut/fonts/AnonymousPro-Bold.ttf.import b/demo/addons/gut/fonts/AnonymousPro-Bold.ttf.import
new file mode 100644
index 00000000..649e1194
--- /dev/null
+++ b/demo/addons/gut/fonts/AnonymousPro-Bold.ttf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontFile"
+uid="uid://cg5bb4jomxvcl"
+path="res://.godot/imported/AnonymousPro-Bold.ttf-9d8fef4d357af5b52cd60afbe608aa49.fontdata"
+
+[deps]
+
+source_file="res://addons/gut/fonts/AnonymousPro-Bold.ttf"
+dest_files=["res://.godot/imported/AnonymousPro-Bold.ttf-9d8fef4d357af5b52cd60afbe608aa49.fontdata"]
+
+[params]
+
+Rendering=null
+antialiasing=1
+generate_mipmaps=false
+disable_embedded_bitmaps=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8
+msdf_size=48
+allow_system_fallback=true
+force_autohinter=false
+modulate_color_glyphs=false
+hinting=1
+subpixel_positioning=4
+keep_rounding_remainders=true
+oversampling=0.0
+Fallbacks=null
+fallbacks=[]
+Compress=null
+compress=true
+preload=[]
+language_support={}
+script_support={}
+opentype_features={}
diff --git a/demo/addons/gut/fonts/AnonymousPro-BoldItalic.ttf.import b/demo/addons/gut/fonts/AnonymousPro-BoldItalic.ttf.import
new file mode 100644
index 00000000..4b4ebebc
--- /dev/null
+++ b/demo/addons/gut/fonts/AnonymousPro-BoldItalic.ttf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontFile"
+uid="uid://xsn1lp3aq7bt"
+path="res://.godot/imported/AnonymousPro-BoldItalic.ttf-4274bf704d3d6b9cd32c4f0754d8c83d.fontdata"
+
+[deps]
+
+source_file="res://addons/gut/fonts/AnonymousPro-BoldItalic.ttf"
+dest_files=["res://.godot/imported/AnonymousPro-BoldItalic.ttf-4274bf704d3d6b9cd32c4f0754d8c83d.fontdata"]
+
+[params]
+
+Rendering=null
+antialiasing=1
+generate_mipmaps=false
+disable_embedded_bitmaps=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8
+msdf_size=48
+allow_system_fallback=true
+force_autohinter=false
+modulate_color_glyphs=false
+hinting=1
+subpixel_positioning=4
+keep_rounding_remainders=true
+oversampling=0.0
+Fallbacks=null
+fallbacks=[]
+Compress=null
+compress=true
+preload=[]
+language_support={}
+script_support={}
+opentype_features={}
diff --git a/demo/addons/gut/fonts/AnonymousPro-Italic.ttf.import b/demo/addons/gut/fonts/AnonymousPro-Italic.ttf.import
new file mode 100644
index 00000000..fa9b94a6
--- /dev/null
+++ b/demo/addons/gut/fonts/AnonymousPro-Italic.ttf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontFile"
+uid="uid://cgwa3s4rfscme"
+path="res://.godot/imported/AnonymousPro-Italic.ttf-9989590b02137b799e13d570de2a42c1.fontdata"
+
+[deps]
+
+source_file="res://addons/gut/fonts/AnonymousPro-Italic.ttf"
+dest_files=["res://.godot/imported/AnonymousPro-Italic.ttf-9989590b02137b799e13d570de2a42c1.fontdata"]
+
+[params]
+
+Rendering=null
+antialiasing=1
+generate_mipmaps=false
+disable_embedded_bitmaps=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8
+msdf_size=48
+allow_system_fallback=true
+force_autohinter=false
+modulate_color_glyphs=false
+hinting=1
+subpixel_positioning=4
+keep_rounding_remainders=true
+oversampling=0.0
+Fallbacks=null
+fallbacks=[]
+Compress=null
+compress=true
+preload=[]
+language_support={}
+script_support={}
+opentype_features={}
diff --git a/demo/addons/gut/fonts/AnonymousPro-Regular.ttf.import b/demo/addons/gut/fonts/AnonymousPro-Regular.ttf.import
new file mode 100644
index 00000000..a68b0787
--- /dev/null
+++ b/demo/addons/gut/fonts/AnonymousPro-Regular.ttf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontFile"
+uid="uid://ds4do3ow06lbl"
+path="res://.godot/imported/AnonymousPro-Regular.ttf-856c843fd6f89964d2ca8d8ff1724f13.fontdata"
+
+[deps]
+
+source_file="res://addons/gut/fonts/AnonymousPro-Regular.ttf"
+dest_files=["res://.godot/imported/AnonymousPro-Regular.ttf-856c843fd6f89964d2ca8d8ff1724f13.fontdata"]
+
+[params]
+
+Rendering=null
+antialiasing=1
+generate_mipmaps=false
+disable_embedded_bitmaps=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8
+msdf_size=48
+allow_system_fallback=true
+force_autohinter=false
+modulate_color_glyphs=false
+hinting=1
+subpixel_positioning=4
+keep_rounding_remainders=true
+oversampling=0.0
+Fallbacks=null
+fallbacks=[]
+Compress=null
+compress=true
+preload=[]
+language_support={}
+script_support={}
+opentype_features={}
diff --git a/demo/addons/gut/fonts/CourierPrime-Bold.ttf.import b/demo/addons/gut/fonts/CourierPrime-Bold.ttf.import
new file mode 100644
index 00000000..bf6d636a
--- /dev/null
+++ b/demo/addons/gut/fonts/CourierPrime-Bold.ttf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontFile"
+uid="uid://bvgf7nn14o4ne"
+path="res://.godot/imported/CourierPrime-Bold.ttf-1f003c66d63ebed70964e7756f4fa235.fontdata"
+
+[deps]
+
+source_file="res://addons/gut/fonts/CourierPrime-Bold.ttf"
+dest_files=["res://.godot/imported/CourierPrime-Bold.ttf-1f003c66d63ebed70964e7756f4fa235.fontdata"]
+
+[params]
+
+Rendering=null
+antialiasing=1
+generate_mipmaps=false
+disable_embedded_bitmaps=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8
+msdf_size=48
+allow_system_fallback=true
+force_autohinter=false
+modulate_color_glyphs=false
+hinting=1
+subpixel_positioning=4
+keep_rounding_remainders=true
+oversampling=0.0
+Fallbacks=null
+fallbacks=[]
+Compress=null
+compress=true
+preload=[]
+language_support={}
+script_support={}
+opentype_features={}
diff --git a/demo/addons/gut/fonts/CourierPrime-BoldItalic.ttf.import b/demo/addons/gut/fonts/CourierPrime-BoldItalic.ttf.import
new file mode 100644
index 00000000..dabaf01a
--- /dev/null
+++ b/demo/addons/gut/fonts/CourierPrime-BoldItalic.ttf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontFile"
+uid="uid://w67c575s33we"
+path="res://.godot/imported/CourierPrime-BoldItalic.ttf-65ebcc61dd5e1dfa8f96313da4ad7019.fontdata"
+
+[deps]
+
+source_file="res://addons/gut/fonts/CourierPrime-BoldItalic.ttf"
+dest_files=["res://.godot/imported/CourierPrime-BoldItalic.ttf-65ebcc61dd5e1dfa8f96313da4ad7019.fontdata"]
+
+[params]
+
+Rendering=null
+antialiasing=1
+generate_mipmaps=false
+disable_embedded_bitmaps=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8
+msdf_size=48
+allow_system_fallback=true
+force_autohinter=false
+modulate_color_glyphs=false
+hinting=1
+subpixel_positioning=4
+keep_rounding_remainders=true
+oversampling=0.0
+Fallbacks=null
+fallbacks=[]
+Compress=null
+compress=true
+preload=[]
+language_support={}
+script_support={}
+opentype_features={}
diff --git a/demo/addons/gut/fonts/CourierPrime-Italic.ttf.import b/demo/addons/gut/fonts/CourierPrime-Italic.ttf.import
new file mode 100644
index 00000000..0ff9b5ab
--- /dev/null
+++ b/demo/addons/gut/fonts/CourierPrime-Italic.ttf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontFile"
+uid="uid://budfxvgandf8l"
+path="res://.godot/imported/CourierPrime-Italic.ttf-baa9156a73770735a0f72fb20b907112.fontdata"
+
+[deps]
+
+source_file="res://addons/gut/fonts/CourierPrime-Italic.ttf"
+dest_files=["res://.godot/imported/CourierPrime-Italic.ttf-baa9156a73770735a0f72fb20b907112.fontdata"]
+
+[params]
+
+Rendering=null
+antialiasing=1
+generate_mipmaps=false
+disable_embedded_bitmaps=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8
+msdf_size=48
+allow_system_fallback=true
+force_autohinter=false
+modulate_color_glyphs=false
+hinting=1
+subpixel_positioning=4
+keep_rounding_remainders=true
+oversampling=0.0
+Fallbacks=null
+fallbacks=[]
+Compress=null
+compress=true
+preload=[]
+language_support={}
+script_support={}
+opentype_features={}
diff --git a/demo/addons/gut/fonts/CourierPrime-Regular.ttf.import b/demo/addons/gut/fonts/CourierPrime-Regular.ttf.import
new file mode 100644
index 00000000..6de4a19c
--- /dev/null
+++ b/demo/addons/gut/fonts/CourierPrime-Regular.ttf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontFile"
+uid="uid://cvrdwkpuwq4k4"
+path="res://.godot/imported/CourierPrime-Regular.ttf-3babe7e4a7a588dfc9a84c14b4f1fe23.fontdata"
+
+[deps]
+
+source_file="res://addons/gut/fonts/CourierPrime-Regular.ttf"
+dest_files=["res://.godot/imported/CourierPrime-Regular.ttf-3babe7e4a7a588dfc9a84c14b4f1fe23.fontdata"]
+
+[params]
+
+Rendering=null
+antialiasing=1
+generate_mipmaps=false
+disable_embedded_bitmaps=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8
+msdf_size=48
+allow_system_fallback=true
+force_autohinter=false
+modulate_color_glyphs=false
+hinting=1
+subpixel_positioning=4
+keep_rounding_remainders=true
+oversampling=0.0
+Fallbacks=null
+fallbacks=[]
+Compress=null
+compress=true
+preload=[]
+language_support={}
+script_support={}
+opentype_features={}
diff --git a/demo/addons/gut/fonts/LobsterTwo-Bold.ttf.import b/demo/addons/gut/fonts/LobsterTwo-Bold.ttf.import
new file mode 100644
index 00000000..047a289b
--- /dev/null
+++ b/demo/addons/gut/fonts/LobsterTwo-Bold.ttf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontFile"
+uid="uid://dwdjjh0xvgarl"
+path="res://.godot/imported/LobsterTwo-Bold.ttf-7c7f734103b58a32491a4788186f3dcb.fontdata"
+
+[deps]
+
+source_file="res://addons/gut/fonts/LobsterTwo-Bold.ttf"
+dest_files=["res://.godot/imported/LobsterTwo-Bold.ttf-7c7f734103b58a32491a4788186f3dcb.fontdata"]
+
+[params]
+
+Rendering=null
+antialiasing=1
+generate_mipmaps=false
+disable_embedded_bitmaps=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8
+msdf_size=48
+allow_system_fallback=true
+force_autohinter=false
+modulate_color_glyphs=false
+hinting=1
+subpixel_positioning=4
+keep_rounding_remainders=true
+oversampling=0.0
+Fallbacks=null
+fallbacks=[]
+Compress=null
+compress=true
+preload=[]
+language_support={}
+script_support={}
+opentype_features={}
diff --git a/demo/addons/gut/fonts/LobsterTwo-BoldItalic.ttf.import b/demo/addons/gut/fonts/LobsterTwo-BoldItalic.ttf.import
new file mode 100644
index 00000000..c34376ee
--- /dev/null
+++ b/demo/addons/gut/fonts/LobsterTwo-BoldItalic.ttf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontFile"
+uid="uid://re4nteo8hv0l"
+path="res://.godot/imported/LobsterTwo-BoldItalic.ttf-227406a33e84448e6aa974176016de19.fontdata"
+
+[deps]
+
+source_file="res://addons/gut/fonts/LobsterTwo-BoldItalic.ttf"
+dest_files=["res://.godot/imported/LobsterTwo-BoldItalic.ttf-227406a33e84448e6aa974176016de19.fontdata"]
+
+[params]
+
+Rendering=null
+antialiasing=1
+generate_mipmaps=false
+disable_embedded_bitmaps=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8
+msdf_size=48
+allow_system_fallback=true
+force_autohinter=false
+modulate_color_glyphs=false
+hinting=1
+subpixel_positioning=4
+keep_rounding_remainders=true
+oversampling=0.0
+Fallbacks=null
+fallbacks=[]
+Compress=null
+compress=true
+preload=[]
+language_support={}
+script_support={}
+opentype_features={}
diff --git a/demo/addons/gut/fonts/LobsterTwo-Italic.ttf.import b/demo/addons/gut/fonts/LobsterTwo-Italic.ttf.import
new file mode 100644
index 00000000..39d37c63
--- /dev/null
+++ b/demo/addons/gut/fonts/LobsterTwo-Italic.ttf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontFile"
+uid="uid://dbka6xdncgxob"
+path="res://.godot/imported/LobsterTwo-Italic.ttf-f93abf6c25390c85ad5fb6c4ee75159e.fontdata"
+
+[deps]
+
+source_file="res://addons/gut/fonts/LobsterTwo-Italic.ttf"
+dest_files=["res://.godot/imported/LobsterTwo-Italic.ttf-f93abf6c25390c85ad5fb6c4ee75159e.fontdata"]
+
+[params]
+
+Rendering=null
+antialiasing=1
+generate_mipmaps=false
+disable_embedded_bitmaps=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8
+msdf_size=48
+allow_system_fallback=true
+force_autohinter=false
+modulate_color_glyphs=false
+hinting=1
+subpixel_positioning=4
+keep_rounding_remainders=true
+oversampling=0.0
+Fallbacks=null
+fallbacks=[]
+Compress=null
+compress=true
+preload=[]
+language_support={}
+script_support={}
+opentype_features={}
diff --git a/demo/addons/gut/fonts/LobsterTwo-Regular.ttf.import b/demo/addons/gut/fonts/LobsterTwo-Regular.ttf.import
new file mode 100644
index 00000000..9e95700e
--- /dev/null
+++ b/demo/addons/gut/fonts/LobsterTwo-Regular.ttf.import
@@ -0,0 +1,36 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontFile"
+uid="uid://cswrnfn4xckku"
+path="res://.godot/imported/LobsterTwo-Regular.ttf-f3fcfa01cd671c8da433dd875d0fe04b.fontdata"
+
+[deps]
+
+source_file="res://addons/gut/fonts/LobsterTwo-Regular.ttf"
+dest_files=["res://.godot/imported/LobsterTwo-Regular.ttf-f3fcfa01cd671c8da433dd875d0fe04b.fontdata"]
+
+[params]
+
+Rendering=null
+antialiasing=1
+generate_mipmaps=false
+disable_embedded_bitmaps=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8
+msdf_size=48
+allow_system_fallback=true
+force_autohinter=false
+modulate_color_glyphs=false
+hinting=1
+subpixel_positioning=4
+keep_rounding_remainders=true
+oversampling=0.0
+Fallbacks=null
+fallbacks=[]
+Compress=null
+compress=true
+preload=[]
+language_support={}
+script_support={}
+opentype_features={}
diff --git a/demo/addons/gut/gui/arrow.png.import b/demo/addons/gut/gui/arrow.png.import
new file mode 100644
index 00000000..62a2785a
--- /dev/null
+++ b/demo/addons/gut/gui/arrow.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dd8f7r3j8sd2x"
+path="res://.godot/imported/arrow.png-2b5b2d838b5b3467cf300ac2da1630d9.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/gut/gui/arrow.png"
+dest_files=["res://.godot/imported/arrow.png-2b5b2d838b5b3467cf300ac2da1630d9.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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/demo/addons/gut/gui/play.png.import b/demo/addons/gut/gui/play.png.import
new file mode 100644
index 00000000..0878f17d
--- /dev/null
+++ b/demo/addons/gut/gui/play.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://wkyhlm57074w"
+path="res://.godot/imported/play.png-5c90e88e8136487a183a099d67a7de24.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/gut/gui/play.png"
+dest_files=["res://.godot/imported/play.png-5c90e88e8136487a183a099d67a7de24.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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/demo/addons/gut/icon.png.import b/demo/addons/gut/icon.png.import
new file mode 100644
index 00000000..1f91fb2c
--- /dev/null
+++ b/demo/addons/gut/icon.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dl4pp2c7vt73l"
+path="res://.godot/imported/icon.png-91b084043b8aaf2f1c906e7b9fa92969.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/gut/icon.png"
+dest_files=["res://.godot/imported/icon.png-91b084043b8aaf2f1c906e7b9fa92969.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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/demo/addons/gut/images/Folder.svg.import b/demo/addons/gut/images/Folder.svg.import
new file mode 100644
index 00000000..88bdb4d0
--- /dev/null
+++ b/demo/addons/gut/images/Folder.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dkua750dgttx8"
+path="res://.godot/imported/Folder.svg-caa50e6a0be9d456fd81991dfb537916.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/gut/images/Folder.svg"
+dest_files=["res://.godot/imported/Folder.svg-caa50e6a0be9d456fd81991dfb537916.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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=false
+editor/convert_colors_with_editor_theme=false
diff --git a/demo/addons/gut/images/GutIconV2_base.png.import b/demo/addons/gut/images/GutIconV2_base.png.import
new file mode 100644
index 00000000..10b5a499
--- /dev/null
+++ b/demo/addons/gut/images/GutIconV2_base.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://caettjotxyq1k"
+path="res://.godot/imported/GutIconV2_base.png-7038b445a6dfa6ba4cec1a42fa81abae.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/gut/images/GutIconV2_base.png"
+dest_files=["res://.godot/imported/GutIconV2_base.png-7038b445a6dfa6ba4cec1a42fa81abae.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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/demo/addons/gut/images/GutIconV2_no_shine.png.import b/demo/addons/gut/images/GutIconV2_no_shine.png.import
new file mode 100644
index 00000000..6924941c
--- /dev/null
+++ b/demo/addons/gut/images/GutIconV2_no_shine.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://mnhybmxgknbq"
+path="res://.godot/imported/GutIconV2_no_shine.png-340880100fb7bae1a2e0530330841e58.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/gut/images/GutIconV2_no_shine.png"
+dest_files=["res://.godot/imported/GutIconV2_no_shine.png-340880100fb7bae1a2e0530330841e58.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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/demo/addons/gut/images/HSplitContainer.svg.import b/demo/addons/gut/images/HSplitContainer.svg.import
new file mode 100644
index 00000000..bbc06487
--- /dev/null
+++ b/demo/addons/gut/images/HSplitContainer.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://didao8vgrsvon"
+path="res://.godot/imported/HSplitContainer.svg-81e594d94ee80e4176e099672ef6025b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/gut/images/HSplitContainer.svg"
+dest_files=["res://.godot/imported/HSplitContainer.svg-81e594d94ee80e4176e099672ef6025b.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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=false
+editor/convert_colors_with_editor_theme=false
diff --git a/demo/addons/gut/images/Script.svg.import b/demo/addons/gut/images/Script.svg.import
new file mode 100644
index 00000000..8858f2fd
--- /dev/null
+++ b/demo/addons/gut/images/Script.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dngdn7nvgmpgq"
+path="res://.godot/imported/Script.svg-34c66aae9c985e3e0470426acbbcda04.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/gut/images/Script.svg"
+dest_files=["res://.godot/imported/Script.svg-34c66aae9c985e3e0470426acbbcda04.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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=false
+editor/convert_colors_with_editor_theme=false
diff --git a/demo/addons/gut/images/VSplitContainer.svg.import b/demo/addons/gut/images/VSplitContainer.svg.import
new file mode 100644
index 00000000..e7b7cda7
--- /dev/null
+++ b/demo/addons/gut/images/VSplitContainer.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cxoqgf15ou7s5"
+path="res://.godot/imported/VSplitContainer.svg-6cec29fefa7e65d6ff7c2fdb9a1bb9ab.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/gut/images/VSplitContainer.svg"
+dest_files=["res://.godot/imported/VSplitContainer.svg-6cec29fefa7e65d6ff7c2fdb9a1bb9ab.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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=false
+editor/convert_colors_with_editor_theme=false
diff --git a/demo/addons/gut/images/eyey.png.import b/demo/addons/gut/images/eyey.png.import
new file mode 100644
index 00000000..bc21244e
--- /dev/null
+++ b/demo/addons/gut/images/eyey.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cer6x5ktcyggk"
+path="res://.godot/imported/eyey.png-e0a721ab6b749f5d493d61e9f27f0654.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/gut/images/eyey.png"
+dest_files=["res://.godot/imported/eyey.png-e0a721ab6b749f5d493d61e9f27f0654.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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/demo/addons/gut/images/green.png.import b/demo/addons/gut/images/green.png.import
new file mode 100644
index 00000000..937e4249
--- /dev/null
+++ b/demo/addons/gut/images/green.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://nlvqbfs4atxx"
+path="res://.godot/imported/green.png-e3a17091688e10a7013279b38edc7f8a.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/gut/images/green.png"
+dest_files=["res://.godot/imported/green.png-e3a17091688e10a7013279b38edc7f8a.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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/demo/addons/gut/images/red.png.import b/demo/addons/gut/images/red.png.import
new file mode 100644
index 00000000..e4ae1bd0
--- /dev/null
+++ b/demo/addons/gut/images/red.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ctj6xrbdu6sjp"
+path="res://.godot/imported/red.png-47a557c3922e800f76686bc1a4ad0c3c.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/gut/images/red.png"
+dest_files=["res://.godot/imported/red.png-47a557c3922e800f76686bc1a4ad0c3c.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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/demo/addons/gut/images/yellow.png.import b/demo/addons/gut/images/yellow.png.import
new file mode 100644
index 00000000..aea10e83
--- /dev/null
+++ b/demo/addons/gut/images/yellow.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dw0liwrhc5gye"
+path="res://.godot/imported/yellow.png-b3cf3d463958a169d909273d3d742052.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/gut/images/yellow.png"
+dest_files=["res://.godot/imported/yellow.png-b3cf3d463958a169d909273d3d742052.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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/demo/addons/gut/source_code_pro.fnt.import b/demo/addons/gut/source_code_pro.fnt.import
new file mode 100644
index 00000000..9e54d57b
--- /dev/null
+++ b/demo/addons/gut/source_code_pro.fnt.import
@@ -0,0 +1,17 @@
+[remap]
+
+importer="font_data_bmfont"
+type="FontFile"
+uid="uid://vo8cydewk5c2"
+path="res://.godot/imported/source_code_pro.fnt-042fb383b3c7b4c19e67c852f7fbefca.fontdata"
+
+[deps]
+
+source_file="res://addons/gut/source_code_pro.fnt"
+dest_files=["res://.godot/imported/source_code_pro.fnt-042fb383b3c7b4c19e67c852f7fbefca.fontdata"]
+
+[params]
+
+fallbacks=[]
+compress=true
+scaling_mode=2
diff --git a/demo/export_presets.cfg b/demo/export_presets.cfg
index f4347b9b..22489ff1 100644
--- a/demo/export_presets.cfg
+++ b/demo/export_presets.cfg
@@ -9,20 +9,31 @@ export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path="../../../../FMOD Gdnative Integration Demo.apk"
+patches=PackedStringArray()
+patch_delta_encoding=false
+patch_delta_compression_level_zstd=19
+patch_delta_min_reduction=0.1
+patch_delta_include_filters="*"
+patch_delta_exclude_filters=""
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=""
gradle_build/use_gradle_build=true
+gradle_build/gradle_build_directory=""
+gradle_build/android_source_template=""
+gradle_build/compress_native_libraries=false
gradle_build/export_format=0
gradle_build/min_sdk=""
gradle_build/target_sdk=""
-plugins/FmodPlugin=true
+gradle_build/custom_theme_attributes={}
architectures/armeabi-v7a=false
architectures/arm64-v8a=true
architectures/x86=false
@@ -35,19 +46,24 @@ package/signed=true
package/app_category=2
package/retain_data_on_uninstall=false
package/exclude_from_recents=false
+package/show_in_android_tv=false
+package/show_in_app_library=true
+package/show_as_launcher_app=false
launcher_icons/main_192x192=""
launcher_icons/adaptive_foreground_432x432=""
launcher_icons/adaptive_background_432x432=""
+launcher_icons/adaptive_monochrome_432x432=""
graphics/opengl_debug=false
+shader_baker/enabled=false
xr_features/xr_mode=0
-xr_features/hand_tracking=0
-xr_features/hand_tracking_frequency=0
-xr_features/passthrough=0
+gesture/swipe_to_dismiss=false
screen/immersive_mode=true
+screen/edge_to_edge=false
screen/support_small=true
screen/support_normal=true
screen/support_large=true
screen/support_xlarge=true
+screen/background_color=Color(0, 0, 0, 1)
user_data_backup/allow=false
command_line/extra_args=""
apk_expansion/enable=false
@@ -58,6 +74,7 @@ permissions/access_checkin_properties=false
permissions/access_coarse_location=false
permissions/access_fine_location=false
permissions/access_location_extra_commands=false
+permissions/access_media_location=false
permissions/access_mock_location=false
permissions/access_network_state=false
permissions/access_surface_flinger=false
@@ -127,6 +144,7 @@ permissions/manage_accounts=false
permissions/manage_app_tokens=false
permissions/manage_documents=false
permissions/manage_external_storage=false
+permissions/manage_media=false
permissions/master_clear=false
permissions/media_content_control=false
permissions/modify_audio_settings=false
@@ -135,6 +153,7 @@ permissions/mount_format_filesystems=false
permissions/mount_unmount_filesystems=false
permissions/nfc=false
permissions/persistent_activity=false
+permissions/post_notifications=false
permissions/process_outgoing_calls=false
permissions/read_calendar=false
permissions/read_call_log=false
@@ -144,6 +163,10 @@ permissions/read_frame_buffer=false
permissions/read_history_bookmarks=false
permissions/read_input_state=false
permissions/read_logs=false
+permissions/read_media_audio=false
+permissions/read_media_images=false
+permissions/read_media_video=false
+permissions/read_media_visual_user_selected=false
permissions/read_phone_state=false
permissions/read_profile=false
permissions/read_sms=false
@@ -200,6 +223,10 @@ permissions/write_sms=false
permissions/write_social_stream=false
permissions/write_sync_settings=false
permissions/write_user_dictionary=false
+plugins/FmodPlugin=true
+xr_features/hand_tracking=0
+xr_features/hand_tracking_frequency=0
+xr_features/passthrough=0
graphics/32_bits_framebuffer=true
xr_features/degrees_of_freedom=0
one_click_deploy/clear_previous_install=false
@@ -218,10 +245,18 @@ export_filter="all_resources"
include_filter="*.bank, *.ogg"
exclude_filter=""
export_path="../../../GodotFmodExport/FMOD.exe"
+patches=PackedStringArray()
+patch_delta_encoding=false
+patch_delta_compression_level_zstd=19
+patch_delta_min_reduction=0.1
+patch_delta_include_filters="*"
+patch_delta_exclude_filters=""
encryption_include_filters=""
encryption_exclude_filters=""
+seed=0
encrypt_pck=false
encrypt_directory=false
+script_export_mode=2
[preset.1.options]
@@ -229,10 +264,9 @@ custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
binary_format/embed_pck=false
-texture_format/bptc=false
-texture_format/s3tc=true
-texture_format/etc=false
-texture_format/etc2=false
+texture_format/s3tc_bptc=true
+texture_format/etc2_astc=false
+shader_baker/enabled=false
binary_format/architecture="x86_64"
codesign/enable=false
codesign/timestamp=true
@@ -251,6 +285,9 @@ application/product_name=""
application/file_description=""
application/copyright=""
application/trademarks=""
+application/export_angle=0
+application/export_d3d12=0
+application/d3d12_agility_sdk_multiarch=true
ssh_remote_deploy/enabled=false
ssh_remote_deploy/host="user@host_ip"
ssh_remote_deploy/port="22"
@@ -268,6 +305,10 @@ Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorActi
ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue
Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue
Remove-Item -Recurse -Force '{temp_dir}'"
+texture_format/bptc=false
+texture_format/s3tc=true
+texture_format/etc=false
+texture_format/etc2=false
texture_format/no_bptc_fallbacks=true
binary_format/64_bits=true
@@ -281,11 +322,19 @@ custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
-export_path="../../../../Desktop/fmod-ios-export/FmodTestDemo.ipa"
+export_path="../../exports/ios/35/FmodTestDemo.xcodeproj"
+patches=PackedStringArray()
+patch_delta_encoding=false
+patch_delta_compression_level_zstd=19
+patch_delta_min_reduction=0.1
+patch_delta_include_filters="*"
+patch_delta_exclude_filters=""
encryption_include_filters=""
encryption_exclude_filters=""
+seed=0
encrypt_pck=false
encrypt_directory=false
+script_export_mode=2
[preset.2.options]
@@ -293,19 +342,29 @@ custom_template/debug=""
custom_template/release=""
architectures/arm64=true
application/app_store_team_id="changeit"
-application/code_sign_identity_debug="iPhone Developer"
application/export_method_debug=1
+application/code_sign_identity_debug="iPhone Developer"
application/code_sign_identity_release="iPhone Developer"
+application/provisioning_profile_specifier_debug=""
+application/provisioning_profile_specifier_release=""
application/export_method_release=1
-application/targeted_device_family=2
application/bundle_identifier="com.utopiarise.godot.fmod"
application/signature="????"
application/short_version="1.0"
application/version="1.0"
+application/additional_plist_content=""
application/icon_interpolation=4
-application/launch_screens_interpolation=4
+application/export_project_only=true
+application/delete_old_export_files_unconditionally=false
+entitlements/increased_memory_limit=false
+entitlements/game_center=false
+entitlements/push_notifications="Disabled"
+entitlements/additional=""
capabilities/access_wifi=false
-capabilities/push_notifications=false
+capabilities/performance_gaming_tier=false
+capabilities/performance_a12=false
+capabilities/additional=PackedStringArray()
+shader_baker/enabled=false
user_data/accessible_from_files_app=false
user_data/accessible_from_itunes_sharing=false
privacy/camera_usage_description=""
@@ -314,24 +373,216 @@ privacy/microphone_usage_description=""
privacy/microphone_usage_description_localized={}
privacy/photolibrary_usage_description=""
privacy/photolibrary_usage_description_localized={}
-icons/iphone_120x120=""
-icons/iphone_180x180=""
-icons/ipad_76x76=""
-icons/ipad_152x152=""
-icons/ipad_167x167=""
-icons/app_store_1024x1024="res://appstore.png"
-icons/spotlight_40x40=""
-icons/spotlight_80x80=""
+privacy/file_timestamp_access_reasons=3
+privacy/system_boot_time_access_reasons=1
+privacy/disk_space_access_reasons=3
+privacy/active_keyboard_access_reasons=0
+privacy/user_defaults_access_reasons=0
+privacy/tracking_enabled=false
+privacy/tracking_domains=PackedStringArray()
+privacy/collected_data/name/collected=false
+privacy/collected_data/name/linked_to_user=false
+privacy/collected_data/name/used_for_tracking=false
+privacy/collected_data/name/collection_purposes=0
+privacy/collected_data/email_address/collected=false
+privacy/collected_data/email_address/linked_to_user=false
+privacy/collected_data/email_address/used_for_tracking=false
+privacy/collected_data/email_address/collection_purposes=0
+privacy/collected_data/phone_number/collected=false
+privacy/collected_data/phone_number/linked_to_user=false
+privacy/collected_data/phone_number/used_for_tracking=false
+privacy/collected_data/phone_number/collection_purposes=0
+privacy/collected_data/physical_address/collected=false
+privacy/collected_data/physical_address/linked_to_user=false
+privacy/collected_data/physical_address/used_for_tracking=false
+privacy/collected_data/physical_address/collection_purposes=0
+privacy/collected_data/other_contact_info/collected=false
+privacy/collected_data/other_contact_info/linked_to_user=false
+privacy/collected_data/other_contact_info/used_for_tracking=false
+privacy/collected_data/other_contact_info/collection_purposes=0
+privacy/collected_data/health/collected=false
+privacy/collected_data/health/linked_to_user=false
+privacy/collected_data/health/used_for_tracking=false
+privacy/collected_data/health/collection_purposes=0
+privacy/collected_data/fitness/collected=false
+privacy/collected_data/fitness/linked_to_user=false
+privacy/collected_data/fitness/used_for_tracking=false
+privacy/collected_data/fitness/collection_purposes=0
+privacy/collected_data/payment_info/collected=false
+privacy/collected_data/payment_info/linked_to_user=false
+privacy/collected_data/payment_info/used_for_tracking=false
+privacy/collected_data/payment_info/collection_purposes=0
+privacy/collected_data/credit_info/collected=false
+privacy/collected_data/credit_info/linked_to_user=false
+privacy/collected_data/credit_info/used_for_tracking=false
+privacy/collected_data/credit_info/collection_purposes=0
+privacy/collected_data/other_financial_info/collected=false
+privacy/collected_data/other_financial_info/linked_to_user=false
+privacy/collected_data/other_financial_info/used_for_tracking=false
+privacy/collected_data/other_financial_info/collection_purposes=0
+privacy/collected_data/precise_location/collected=false
+privacy/collected_data/precise_location/linked_to_user=false
+privacy/collected_data/precise_location/used_for_tracking=false
+privacy/collected_data/precise_location/collection_purposes=0
+privacy/collected_data/coarse_location/collected=false
+privacy/collected_data/coarse_location/linked_to_user=false
+privacy/collected_data/coarse_location/used_for_tracking=false
+privacy/collected_data/coarse_location/collection_purposes=0
+privacy/collected_data/sensitive_info/collected=false
+privacy/collected_data/sensitive_info/linked_to_user=false
+privacy/collected_data/sensitive_info/used_for_tracking=false
+privacy/collected_data/sensitive_info/collection_purposes=0
+privacy/collected_data/contacts/collected=false
+privacy/collected_data/contacts/linked_to_user=false
+privacy/collected_data/contacts/used_for_tracking=false
+privacy/collected_data/contacts/collection_purposes=0
+privacy/collected_data/emails_or_text_messages/collected=false
+privacy/collected_data/emails_or_text_messages/linked_to_user=false
+privacy/collected_data/emails_or_text_messages/used_for_tracking=false
+privacy/collected_data/emails_or_text_messages/collection_purposes=0
+privacy/collected_data/photos_or_videos/collected=false
+privacy/collected_data/photos_or_videos/linked_to_user=false
+privacy/collected_data/photos_or_videos/used_for_tracking=false
+privacy/collected_data/photos_or_videos/collection_purposes=0
+privacy/collected_data/audio_data/collected=false
+privacy/collected_data/audio_data/linked_to_user=false
+privacy/collected_data/audio_data/used_for_tracking=false
+privacy/collected_data/audio_data/collection_purposes=0
+privacy/collected_data/gameplay_content/collected=false
+privacy/collected_data/gameplay_content/linked_to_user=false
+privacy/collected_data/gameplay_content/used_for_tracking=false
+privacy/collected_data/gameplay_content/collection_purposes=0
+privacy/collected_data/customer_support/collected=false
+privacy/collected_data/customer_support/linked_to_user=false
+privacy/collected_data/customer_support/used_for_tracking=false
+privacy/collected_data/customer_support/collection_purposes=0
+privacy/collected_data/other_user_content/collected=false
+privacy/collected_data/other_user_content/linked_to_user=false
+privacy/collected_data/other_user_content/used_for_tracking=false
+privacy/collected_data/other_user_content/collection_purposes=0
+privacy/collected_data/browsing_history/collected=false
+privacy/collected_data/browsing_history/linked_to_user=false
+privacy/collected_data/browsing_history/used_for_tracking=false
+privacy/collected_data/browsing_history/collection_purposes=0
+privacy/collected_data/search_history/collected=false
+privacy/collected_data/search_history/linked_to_user=false
+privacy/collected_data/search_history/used_for_tracking=false
+privacy/collected_data/search_history/collection_purposes=0
+privacy/collected_data/user_id/collected=false
+privacy/collected_data/user_id/linked_to_user=false
+privacy/collected_data/user_id/used_for_tracking=false
+privacy/collected_data/user_id/collection_purposes=0
+privacy/collected_data/device_id/collected=false
+privacy/collected_data/device_id/linked_to_user=false
+privacy/collected_data/device_id/used_for_tracking=false
+privacy/collected_data/device_id/collection_purposes=0
+privacy/collected_data/purchase_history/collected=false
+privacy/collected_data/purchase_history/linked_to_user=false
+privacy/collected_data/purchase_history/used_for_tracking=false
+privacy/collected_data/purchase_history/collection_purposes=0
+privacy/collected_data/product_interaction/collected=false
+privacy/collected_data/product_interaction/linked_to_user=false
+privacy/collected_data/product_interaction/used_for_tracking=false
+privacy/collected_data/product_interaction/collection_purposes=0
+privacy/collected_data/advertising_data/collected=false
+privacy/collected_data/advertising_data/linked_to_user=false
+privacy/collected_data/advertising_data/used_for_tracking=false
+privacy/collected_data/advertising_data/collection_purposes=0
+privacy/collected_data/other_usage_data/collected=false
+privacy/collected_data/other_usage_data/linked_to_user=false
+privacy/collected_data/other_usage_data/used_for_tracking=false
+privacy/collected_data/other_usage_data/collection_purposes=0
+privacy/collected_data/crash_data/collected=false
+privacy/collected_data/crash_data/linked_to_user=false
+privacy/collected_data/crash_data/used_for_tracking=false
+privacy/collected_data/crash_data/collection_purposes=0
+privacy/collected_data/performance_data/collected=false
+privacy/collected_data/performance_data/linked_to_user=false
+privacy/collected_data/performance_data/used_for_tracking=false
+privacy/collected_data/performance_data/collection_purposes=0
+privacy/collected_data/other_diagnostic_data/collected=false
+privacy/collected_data/other_diagnostic_data/linked_to_user=false
+privacy/collected_data/other_diagnostic_data/used_for_tracking=false
+privacy/collected_data/other_diagnostic_data/collection_purposes=0
+privacy/collected_data/environment_scanning/collected=false
+privacy/collected_data/environment_scanning/linked_to_user=false
+privacy/collected_data/environment_scanning/used_for_tracking=false
+privacy/collected_data/environment_scanning/collection_purposes=0
+privacy/collected_data/hands/collected=false
+privacy/collected_data/hands/linked_to_user=false
+privacy/collected_data/hands/used_for_tracking=false
+privacy/collected_data/hands/collection_purposes=0
+privacy/collected_data/head/collected=false
+privacy/collected_data/head/linked_to_user=false
+privacy/collected_data/head/used_for_tracking=false
+privacy/collected_data/head/collection_purposes=0
+privacy/collected_data/other_data_types/collected=false
+privacy/collected_data/other_data_types/linked_to_user=false
+privacy/collected_data/other_data_types/used_for_tracking=false
+privacy/collected_data/other_data_types/collection_purposes=0
+icons/icon_1024x1024=""
+icons/icon_1024x1024_dark=""
+icons/icon_1024x1024_tinted=""
icons/settings_58x58=""
+icons/settings_58x58_dark=""
+icons/settings_58x58_tinted=""
icons/settings_87x87=""
+icons/settings_87x87_dark=""
+icons/settings_87x87_tinted=""
icons/notification_40x40=""
+icons/notification_40x40_dark=""
+icons/notification_40x40_tinted=""
icons/notification_60x60=""
-storyboard/use_launch_screen_storyboard=false
+icons/notification_60x60_dark=""
+icons/notification_60x60_tinted=""
+icons/notification_76x76=""
+icons/notification_76x76_dark=""
+icons/notification_76x76_tinted=""
+icons/notification_114x114=""
+icons/notification_114x114_dark=""
+icons/notification_114x114_tinted=""
+icons/spotlight_80x80=""
+icons/spotlight_80x80_dark=""
+icons/spotlight_80x80_tinted=""
+icons/spotlight_120x120=""
+icons/spotlight_120x120_dark=""
+icons/spotlight_120x120_tinted=""
+icons/iphone_120x120=""
+icons/iphone_120x120_dark=""
+icons/iphone_120x120_tinted=""
+icons/iphone_180x180=""
+icons/iphone_180x180_dark=""
+icons/iphone_180x180_tinted=""
+icons/ipad_167x167=""
+icons/ipad_167x167_dark=""
+icons/ipad_167x167_tinted=""
+icons/ipad_152x152=""
+icons/ipad_152x152_dark=""
+icons/ipad_152x152_tinted=""
+icons/ios_128x128=""
+icons/ios_128x128_dark=""
+icons/ios_128x128_tinted=""
+icons/ios_192x192=""
+icons/ios_192x192_dark=""
+icons/ios_192x192_tinted=""
+icons/ios_136x136=""
+icons/ios_136x136_dark=""
+icons/ios_136x136_tinted=""
+icons/app_store_1024x1024="res://appstore.png"
+icons/app_store_1024x1024_dark=""
+icons/app_store_1024x1024_tinted=""
+application/targeted_device_family=2
+application/min_ios_version="14.0"
storyboard/image_scale_mode=0
storyboard/custom_image@2x=""
storyboard/custom_image@3x=""
storyboard/use_custom_bg_color=false
storyboard/custom_bg_color=Color(0, 0, 0, 1)
+application/launch_screens_interpolation=4
+capabilities/push_notifications=false
+icons/ipad_76x76=""
+icons/spotlight_40x40=""
+storyboard/use_launch_screen_storyboard=false
landscape_launch_screens/iphone_2436x1125=""
landscape_launch_screens/iphone_2208x1242=""
landscape_launch_screens/ipad_1024x768=""
@@ -376,10 +627,18 @@ export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path="../../../../Desktop/fmod-macos-export/FmodTestDemo.dmg"
+patches=PackedStringArray()
+patch_delta_encoding=false
+patch_delta_compression_level_zstd=19
+patch_delta_min_reduction=0.1
+patch_delta_include_filters="*"
+patch_delta_exclude_filters=""
encryption_include_filters=""
encryption_exclude_filters=""
+seed=0
encrypt_pck=false
encrypt_directory=false
+script_export_mode=2
[preset.3.options]
@@ -388,6 +647,7 @@ binary_format/architecture="universal"
custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
+application/liquid_glass_icon=""
application/icon=""
application/icon_interpolation=4
application/bundle_identifier="com.utopiarise.godot.fmod"
@@ -397,8 +657,12 @@ application/short_version="1.0"
application/version="1.0"
application/copyright=""
application/copyright_localized={}
-application/min_macos_version="10.12"
+application/min_macos_version_x86_64="10.12"
+application/min_macos_version_arm64="11.00"
+application/export_angle=0
display/high_res=true
+shader_baker/enabled=false
+application/additional_plist_content=""
xcode/platform_build="14C18"
xcode/sdk_version="13.1"
xcode/sdk_build="22C55"
@@ -431,7 +695,9 @@ codesign/entitlements/app_sandbox/files_downloads=0
codesign/entitlements/app_sandbox/files_pictures=0
codesign/entitlements/app_sandbox/files_music=0
codesign/entitlements/app_sandbox/files_movies=0
+codesign/entitlements/app_sandbox/files_user_selected=0
codesign/entitlements/app_sandbox/helper_executables=[]
+codesign/entitlements/additional=""
codesign/custom_options=PackedStringArray()
notarization/notarization=0
privacy/microphone_usage_description=""
@@ -456,6 +722,148 @@ privacy/network_volumes_usage_description=""
privacy/network_volumes_usage_description_localized={}
privacy/removable_volumes_usage_description=""
privacy/removable_volumes_usage_description_localized={}
+privacy/tracking_enabled=false
+privacy/tracking_domains=PackedStringArray()
+privacy/collected_data/name/collected=false
+privacy/collected_data/name/linked_to_user=false
+privacy/collected_data/name/used_for_tracking=false
+privacy/collected_data/name/collection_purposes=0
+privacy/collected_data/email_address/collected=false
+privacy/collected_data/email_address/linked_to_user=false
+privacy/collected_data/email_address/used_for_tracking=false
+privacy/collected_data/email_address/collection_purposes=0
+privacy/collected_data/phone_number/collected=false
+privacy/collected_data/phone_number/linked_to_user=false
+privacy/collected_data/phone_number/used_for_tracking=false
+privacy/collected_data/phone_number/collection_purposes=0
+privacy/collected_data/physical_address/collected=false
+privacy/collected_data/physical_address/linked_to_user=false
+privacy/collected_data/physical_address/used_for_tracking=false
+privacy/collected_data/physical_address/collection_purposes=0
+privacy/collected_data/other_contact_info/collected=false
+privacy/collected_data/other_contact_info/linked_to_user=false
+privacy/collected_data/other_contact_info/used_for_tracking=false
+privacy/collected_data/other_contact_info/collection_purposes=0
+privacy/collected_data/health/collected=false
+privacy/collected_data/health/linked_to_user=false
+privacy/collected_data/health/used_for_tracking=false
+privacy/collected_data/health/collection_purposes=0
+privacy/collected_data/fitness/collected=false
+privacy/collected_data/fitness/linked_to_user=false
+privacy/collected_data/fitness/used_for_tracking=false
+privacy/collected_data/fitness/collection_purposes=0
+privacy/collected_data/payment_info/collected=false
+privacy/collected_data/payment_info/linked_to_user=false
+privacy/collected_data/payment_info/used_for_tracking=false
+privacy/collected_data/payment_info/collection_purposes=0
+privacy/collected_data/credit_info/collected=false
+privacy/collected_data/credit_info/linked_to_user=false
+privacy/collected_data/credit_info/used_for_tracking=false
+privacy/collected_data/credit_info/collection_purposes=0
+privacy/collected_data/other_financial_info/collected=false
+privacy/collected_data/other_financial_info/linked_to_user=false
+privacy/collected_data/other_financial_info/used_for_tracking=false
+privacy/collected_data/other_financial_info/collection_purposes=0
+privacy/collected_data/precise_location/collected=false
+privacy/collected_data/precise_location/linked_to_user=false
+privacy/collected_data/precise_location/used_for_tracking=false
+privacy/collected_data/precise_location/collection_purposes=0
+privacy/collected_data/coarse_location/collected=false
+privacy/collected_data/coarse_location/linked_to_user=false
+privacy/collected_data/coarse_location/used_for_tracking=false
+privacy/collected_data/coarse_location/collection_purposes=0
+privacy/collected_data/sensitive_info/collected=false
+privacy/collected_data/sensitive_info/linked_to_user=false
+privacy/collected_data/sensitive_info/used_for_tracking=false
+privacy/collected_data/sensitive_info/collection_purposes=0
+privacy/collected_data/contacts/collected=false
+privacy/collected_data/contacts/linked_to_user=false
+privacy/collected_data/contacts/used_for_tracking=false
+privacy/collected_data/contacts/collection_purposes=0
+privacy/collected_data/emails_or_text_messages/collected=false
+privacy/collected_data/emails_or_text_messages/linked_to_user=false
+privacy/collected_data/emails_or_text_messages/used_for_tracking=false
+privacy/collected_data/emails_or_text_messages/collection_purposes=0
+privacy/collected_data/photos_or_videos/collected=false
+privacy/collected_data/photos_or_videos/linked_to_user=false
+privacy/collected_data/photos_or_videos/used_for_tracking=false
+privacy/collected_data/photos_or_videos/collection_purposes=0
+privacy/collected_data/audio_data/collected=false
+privacy/collected_data/audio_data/linked_to_user=false
+privacy/collected_data/audio_data/used_for_tracking=false
+privacy/collected_data/audio_data/collection_purposes=0
+privacy/collected_data/gameplay_content/collected=false
+privacy/collected_data/gameplay_content/linked_to_user=false
+privacy/collected_data/gameplay_content/used_for_tracking=false
+privacy/collected_data/gameplay_content/collection_purposes=0
+privacy/collected_data/customer_support/collected=false
+privacy/collected_data/customer_support/linked_to_user=false
+privacy/collected_data/customer_support/used_for_tracking=false
+privacy/collected_data/customer_support/collection_purposes=0
+privacy/collected_data/other_user_content/collected=false
+privacy/collected_data/other_user_content/linked_to_user=false
+privacy/collected_data/other_user_content/used_for_tracking=false
+privacy/collected_data/other_user_content/collection_purposes=0
+privacy/collected_data/browsing_history/collected=false
+privacy/collected_data/browsing_history/linked_to_user=false
+privacy/collected_data/browsing_history/used_for_tracking=false
+privacy/collected_data/browsing_history/collection_purposes=0
+privacy/collected_data/search_history/collected=false
+privacy/collected_data/search_history/linked_to_user=false
+privacy/collected_data/search_history/used_for_tracking=false
+privacy/collected_data/search_history/collection_purposes=0
+privacy/collected_data/user_id/collected=false
+privacy/collected_data/user_id/linked_to_user=false
+privacy/collected_data/user_id/used_for_tracking=false
+privacy/collected_data/user_id/collection_purposes=0
+privacy/collected_data/device_id/collected=false
+privacy/collected_data/device_id/linked_to_user=false
+privacy/collected_data/device_id/used_for_tracking=false
+privacy/collected_data/device_id/collection_purposes=0
+privacy/collected_data/purchase_history/collected=false
+privacy/collected_data/purchase_history/linked_to_user=false
+privacy/collected_data/purchase_history/used_for_tracking=false
+privacy/collected_data/purchase_history/collection_purposes=0
+privacy/collected_data/product_interaction/collected=false
+privacy/collected_data/product_interaction/linked_to_user=false
+privacy/collected_data/product_interaction/used_for_tracking=false
+privacy/collected_data/product_interaction/collection_purposes=0
+privacy/collected_data/advertising_data/collected=false
+privacy/collected_data/advertising_data/linked_to_user=false
+privacy/collected_data/advertising_data/used_for_tracking=false
+privacy/collected_data/advertising_data/collection_purposes=0
+privacy/collected_data/other_usage_data/collected=false
+privacy/collected_data/other_usage_data/linked_to_user=false
+privacy/collected_data/other_usage_data/used_for_tracking=false
+privacy/collected_data/other_usage_data/collection_purposes=0
+privacy/collected_data/crash_data/collected=false
+privacy/collected_data/crash_data/linked_to_user=false
+privacy/collected_data/crash_data/used_for_tracking=false
+privacy/collected_data/crash_data/collection_purposes=0
+privacy/collected_data/performance_data/collected=false
+privacy/collected_data/performance_data/linked_to_user=false
+privacy/collected_data/performance_data/used_for_tracking=false
+privacy/collected_data/performance_data/collection_purposes=0
+privacy/collected_data/other_diagnostic_data/collected=false
+privacy/collected_data/other_diagnostic_data/linked_to_user=false
+privacy/collected_data/other_diagnostic_data/used_for_tracking=false
+privacy/collected_data/other_diagnostic_data/collection_purposes=0
+privacy/collected_data/environment_scanning/collected=false
+privacy/collected_data/environment_scanning/linked_to_user=false
+privacy/collected_data/environment_scanning/used_for_tracking=false
+privacy/collected_data/environment_scanning/collection_purposes=0
+privacy/collected_data/hands/collected=false
+privacy/collected_data/hands/linked_to_user=false
+privacy/collected_data/hands/used_for_tracking=false
+privacy/collected_data/hands/collection_purposes=0
+privacy/collected_data/head/collected=false
+privacy/collected_data/head/linked_to_user=false
+privacy/collected_data/head/used_for_tracking=false
+privacy/collected_data/head/collection_purposes=0
+privacy/collected_data/other_data_types/collected=false
+privacy/collected_data/other_data_types/linked_to_user=false
+privacy/collected_data/other_data_types/used_for_tracking=false
+privacy/collected_data/other_data_types/collection_purposes=0
ssh_remote_deploy/enabled=false
ssh_remote_deploy/host="user@host_ip"
ssh_remote_deploy/port="22"
@@ -467,3 +875,4 @@ open \"{temp_dir}/{exe_name}.app\" --args {cmd_args}"
ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash
kill $(pgrep -x -f \"{temp_dir}/{exe_name}.app/Contents/MacOS/{exe_name} {cmd_args}\")
rm -rf \"{temp_dir}\""
+application/min_macos_version="10.12"
diff --git a/demo/project.godot b/demo/project.godot
index 5de3bb23..1a1acba5 100644
--- a/demo/project.godot
+++ b/demo/project.godot
@@ -12,16 +12,33 @@ config_version=5
"3D Settings/distance_factor"=64.0
General/banks_path="res://assets/Banks"
+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/should_load_by_name=false
+DSP/dsp_buffer_size=512
+DSP/dsp_buffer_count=4
+"3D Settings/doppler_scale"=1.0
+"3D Settings/rolloff_scale"=1.0
[android]
modules="org/godotengine/godot/FmodSingleton"
+[animation]
+
+compatibility/default_parent_skeleton_in_mesh_instance_3d=true
+
[application]
config/name="Fmod Demo"
run/main_scene="res://low_level_2D/FmodScriptTest.tscn"
-config/features=PackedStringArray("4.5")
+config/features=PackedStringArray("4.6")
config/icon="uid://cih2yjmtjoohg"
[autoload]
diff --git a/src/fmod_server.cpp b/src/fmod_server.cpp
index a28b0f33..5cb7f27d 100644
--- a/src/fmod_server.cpp
+++ b/src/fmod_server.cpp
@@ -510,7 +510,6 @@ void FmodServer::unload_bank(const String& pathToBank) {
bool FmodServer::banks_still_loading() {
return cache->is_loading();
}
-
#ifdef IOS_ENABLED
uint32_t register_ios_dsp(FMOD_SYSTEM_PTR system, FMOD_DSP_DESCRIPTION* description, uint32_t* handle) {
return reinterpret_cast(system)->registerDSP(description, handle);
@@ -523,6 +522,17 @@ uint32_t register_ios_codec(FMOD_SYSTEM_PTR system, FMOD_CODEC_DESCRIPTION* desc
uint32_t register_ios_output(FMOD_SYSTEM_PTR system, FMOD_OUTPUT_DESCRIPTION* description, uint32_t* handle) {
return reinterpret_cast(system)->registerOutput(description, handle);
}
+
+extern "C" {
+// Re-declare with weak attribute to ensure the linker finds a version of this symbol
+// even if the export plugin hasn't generated the real one yet.
+__attribute__((weak)) uint32_t* load_all_fmod_plugins(FMOD_IOS_INTERFACE* p_interface, uint32_t* r_count) {
+ if (r_count) {
+ *r_count = 0;
+ }
+ return nullptr;
+}
+}
#endif
void FmodServer::load_all_plugins(const Ref& p_settings) {
@@ -542,12 +552,16 @@ void FmodServer::load_all_plugins(const Ref& p_settings) {
.register_output_method = ®ister_ios_output
};
- uint32_t plugin_count;
- uint32_t* plugin_handles = load_all_fmod_plugins(&interface, &plugin_count);
- for (uint32_t i = 0; i < plugin_count; ++i) {
- cache->add_plugin(plugin_handles[i]);
+ uint32_t plugin_count = 0;
+ if (load_all_fmod_plugins != nullptr) {
+ uint32_t* plugin_handles = load_all_fmod_plugins(&interface, &plugin_count);
+ for (uint32_t i = 0; i < plugin_count; ++i) {
+ cache->add_plugin(plugin_handles[i]);
+ }
+ std::free(plugin_handles);
+ } else {
+ GODOT_LOG_WARNING("FMOD: load_all_fmod_plugins not found. Static plugins will not be loaded.")
}
- std::free(plugin_handles);
#endif
}
diff --git a/src/plugins/ios_plugins_loader.h b/src/plugins/ios_plugins_loader.h
index 5a7df8e6..c10052aa 100644
--- a/src/plugins/ios_plugins_loader.h
+++ b/src/plugins/ios_plugins_loader.h
@@ -16,7 +16,7 @@ typedef struct {
} FMOD_IOS_INTERFACE;
extern "C" {
- uint32_t* load_all_fmod_plugins(FMOD_IOS_INTERFACE* ios_interface, uint32_t* r_count);
+ __attribute__((weak_import)) uint32_t* load_all_fmod_plugins(FMOD_IOS_INTERFACE* ios_interface, uint32_t* r_count);
};
#endif