From 47971c0a27c1becf53a758c8a7ac0e308a213e46 Mon Sep 17 00:00:00 2001 From: Ricardo Sanchez-Saez Date: Wed, 14 May 2025 12:13:10 +0100 Subject: [PATCH] Introduce 'visionos' platform derived from 'apple_embedded' --- core/os/os.cpp | 2 +- .../EditorExportPlatformAppleEmbedded.xml | 4 +- doc/classes/ProjectSettings.xml | 8 + drivers/SCsub | 6 +- .../apple_embedded/app_delegate_service.mm | 4 + .../display_server_apple_embedded.mm | 5 +- .../godot_view_apple_embedded.mm | 8 + drivers/apple_embedded/view_controller.mm | 2 + drivers/metal/metal_device_properties.mm | 18 +- drivers/metal/pixel_formats.mm | 6 + .../metal/rendering_device_driver_metal.mm | 8 + .../editor_export_platform_apple_embedded.cpp | 57 +- .../editor_export_platform_apple_embedded.h | 3 + editor/export/macho.h | 2 + main/main.cpp | 2 + methods.py | 8 + .../dist/visionos_xcode/PrivacyInfo.xcprivacy | 10 + misc/dist/visionos_xcode/data.pck | 0 .../godot_visionos.xcodeproj/project.pbxproj | 402 ++++++++++++ .../contents.xcworkspacedata | 7 + .../xcschemes/godot_visionos.xcscheme | 93 +++ .../SplashImage.imageset/Contents.json | 22 + .../SplashImage.imageset/splash@2x.png | Bin 0 -> 14779 bytes .../SplashImage.imageset/splash@3x.png | Bin 0 -> 14779 bytes .../visionos_xcode/godot_visionos/dummy.cpp | 31 + .../visionos_xcode/godot_visionos/dummy.h | 33 + .../visionos_xcode/godot_visionos/dummy.swift | 31 + .../godot_visionos/dylibs/empty | 1 + .../godot_visionos/en.lproj/InfoPlist.strings | 1 + .../godot_visionos/export_options.plist | 20 + .../godot_visionos/godot_visionos-Info.plist | 63 ++ .../godot_visionos.entitlements | 7 + .../Info.plist | 39 ++ .../xros-arm64-simulator/empty | 1 + .../xros-arm64/empty | 1 + .../Info.plist | 39 ++ .../xros-arm64-simulator/empty | 1 + .../xros-arm64/empty | 1 + platform/ios/export/export_plugin.cpp | 2 +- platform/ios/export/export_plugin.h | 4 + platform/visionos/README.md | 20 + platform/visionos/SCsub | 29 + platform/visionos/api/api.cpp | 48 ++ platform/visionos/api/api.h | 39 ++ platform/visionos/detect.py | 160 +++++ platform/visionos/display_layer_visionos.h | 36 ++ platform/visionos/display_layer_visionos.mm | 47 ++ platform/visionos/display_server_visionos.h | 54 ++ platform/visionos/display_server_visionos.mm | 67 ++ .../EditorExportPlatformVisionOS.xml | 588 ++++++++++++++++++ platform/visionos/export/export.cpp | 46 ++ platform/visionos/export/export.h | 34 + platform/visionos/export/export_plugin.cpp | 51 ++ platform/visionos/export/export_plugin.h | 59 ++ platform/visionos/export/logo.svg | 1 + platform/visionos/export/run_icon.svg | 1 + platform/visionos/godot_view_visionos.h | 37 ++ platform/visionos/godot_view_visionos.mm | 80 +++ platform/visionos/main_visionos.mm | 89 +++ platform/visionos/os_visionos.h | 47 ++ platform/visionos/os_visionos.mm | 52 ++ platform/visionos/platform_config.h | 33 + platform/visionos/platform_thread.h | 33 + .../visionos/platform_visionos_builders.py | 7 + platform/visionos/visionos.h | 37 ++ .../renderer_rd/cluster_builder_rd.h | 4 +- .../rendering/renderer_rd/effects/metal_fx.h | 8 + .../rendering/renderer_rd/effects/metal_fx.mm | 4 + .../render_forward_clustered.cpp | 12 +- .../render_forward_clustered.h | 6 +- 70 files changed, 2634 insertions(+), 47 deletions(-) create mode 100644 misc/dist/visionos_xcode/PrivacyInfo.xcprivacy create mode 100644 misc/dist/visionos_xcode/data.pck create mode 100644 misc/dist/visionos_xcode/godot_visionos.xcodeproj/project.pbxproj create mode 100644 misc/dist/visionos_xcode/godot_visionos.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 misc/dist/visionos_xcode/godot_visionos.xcodeproj/xcshareddata/xcschemes/godot_visionos.xcscheme create mode 100644 misc/dist/visionos_xcode/godot_visionos/Images.xcassets/SplashImage.imageset/Contents.json create mode 100644 misc/dist/visionos_xcode/godot_visionos/Images.xcassets/SplashImage.imageset/splash@2x.png create mode 100644 misc/dist/visionos_xcode/godot_visionos/Images.xcassets/SplashImage.imageset/splash@3x.png create mode 100644 misc/dist/visionos_xcode/godot_visionos/dummy.cpp create mode 100644 misc/dist/visionos_xcode/godot_visionos/dummy.h create mode 100644 misc/dist/visionos_xcode/godot_visionos/dummy.swift create mode 100644 misc/dist/visionos_xcode/godot_visionos/dylibs/empty create mode 100644 misc/dist/visionos_xcode/godot_visionos/en.lproj/InfoPlist.strings create mode 100644 misc/dist/visionos_xcode/godot_visionos/export_options.plist create mode 100644 misc/dist/visionos_xcode/godot_visionos/godot_visionos-Info.plist create mode 100644 misc/dist/visionos_xcode/godot_visionos/godot_visionos.entitlements create mode 100755 misc/dist/visionos_xcode/libgodot.visionos.debug.xcframework/Info.plist create mode 100644 misc/dist/visionos_xcode/libgodot.visionos.debug.xcframework/xros-arm64-simulator/empty create mode 100644 misc/dist/visionos_xcode/libgodot.visionos.debug.xcframework/xros-arm64/empty create mode 100755 misc/dist/visionos_xcode/libgodot.visionos.release.xcframework/Info.plist create mode 100644 misc/dist/visionos_xcode/libgodot.visionos.release.xcframework/xros-arm64-simulator/empty create mode 100644 misc/dist/visionos_xcode/libgodot.visionos.release.xcframework/xros-arm64/empty create mode 100644 platform/visionos/README.md create mode 100644 platform/visionos/SCsub create mode 100644 platform/visionos/api/api.cpp create mode 100644 platform/visionos/api/api.h create mode 100644 platform/visionos/detect.py create mode 100644 platform/visionos/display_layer_visionos.h create mode 100644 platform/visionos/display_layer_visionos.mm create mode 100644 platform/visionos/display_server_visionos.h create mode 100644 platform/visionos/display_server_visionos.mm create mode 100644 platform/visionos/doc_classes/EditorExportPlatformVisionOS.xml create mode 100644 platform/visionos/export/export.cpp create mode 100644 platform/visionos/export/export.h create mode 100644 platform/visionos/export/export_plugin.cpp create mode 100644 platform/visionos/export/export_plugin.h create mode 100644 platform/visionos/export/logo.svg create mode 100644 platform/visionos/export/run_icon.svg create mode 100644 platform/visionos/godot_view_visionos.h create mode 100644 platform/visionos/godot_view_visionos.mm create mode 100644 platform/visionos/main_visionos.mm create mode 100644 platform/visionos/os_visionos.h create mode 100644 platform/visionos/os_visionos.mm create mode 100644 platform/visionos/platform_config.h create mode 100644 platform/visionos/platform_thread.h create mode 100644 platform/visionos/platform_visionos_builders.py create mode 100644 platform/visionos/visionos.h diff --git a/core/os/os.cpp b/core/os/os.cpp index c4828fe1275..29e49f8f65f 100644 --- a/core/os/os.cpp +++ b/core/os/os.cpp @@ -585,7 +585,7 @@ bool OS::has_feature(const String &p_feature) { } #endif -#if defined(IOS_SIMULATOR) +#if defined(IOS_SIMULATOR) || defined(VISIONOS_SIMULATOR) if (p_feature == "simulator") { return true; } diff --git a/doc/classes/EditorExportPlatformAppleEmbedded.xml b/doc/classes/EditorExportPlatformAppleEmbedded.xml index 8529c3c0815..790ef3a88da 100644 --- a/doc/classes/EditorExportPlatformAppleEmbedded.xml +++ b/doc/classes/EditorExportPlatformAppleEmbedded.xml @@ -1,10 +1,10 @@ - Base class for the Apple embedded platform exporters (iOS). + Base class for the Apple embedded platform exporters (iOS and visionOS). - The base class for Apple embedded platform exporters. These include iOS, but not macOS. See the classes inheriting from this one for more details. + The base class for Apple embedded platform exporters. These include iOS and visionOS, but not macOS. See the classes inheriting from this one for more details. $DOCS_URL/tutorials/export/exporting_for_ios.html diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index cef1253b6dd..df7401ccd67 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -900,6 +900,9 @@ MacOS override for [member display/display_server/driver]. + + visionOS override for [member display/display_server/driver]. + Windows override for [member display/display_server/driver]. @@ -3163,6 +3166,11 @@ - [code]metal[/code] (default), Metal from native drivers, only supported on Apple Silicon Macs. On Intel Macs, it will automatically fall back to [code]vulkan[/code] as Metal support is not implemented. - [code]vulkan[/code], Vulkan over Metal via MoltenVK, supported on both Apple Silicon and Intel Macs. + + visionOS override for [member rendering/rendering_device/driver]. + Only one option is supported: + - [code]metal[/code] (default), Metal from native drivers. + Windows override for [member rendering/rendering_device/driver]. Two options are supported: diff --git a/drivers/SCsub b/drivers/SCsub index 7b527397152..5b891631ce8 100644 --- a/drivers/SCsub +++ b/drivers/SCsub @@ -26,10 +26,10 @@ if env["xaudio2"]: SConscript("xaudio2/SCsub") # Shared Apple platform drivers -if env["platform"] in ["macos", "ios"]: +if env["platform"] in ["macos", "ios", "visionos"]: SConscript("apple/SCsub") SConscript("coreaudio/SCsub") -if env["platform"] in ["ios"]: +if env["platform"] in ["ios", "visionos"]: SConscript("apple_embedded/SCsub") # Accessibility @@ -38,7 +38,7 @@ if env["accesskit"] and env["platform"] in ["macos", "windows", "linuxbsd"]: # Midi drivers SConscript("alsamidi/SCsub") -if env["platform"] in ["macos", "ios"]: +if env["platform"] in ["macos"]: SConscript("coremidi/SCsub") SConscript("winmidi/SCsub") diff --git a/drivers/apple_embedded/app_delegate_service.mm b/drivers/apple_embedded/app_delegate_service.mm index ead216e7290..07b52b9d9c6 100644 --- a/drivers/apple_embedded/app_delegate_service.mm +++ b/drivers/apple_embedded/app_delegate_service.mm @@ -71,9 +71,13 @@ static GDTViewController *mainViewController = nil; // TODO: logo screen is not displayed while shaders are compiling // DummyViewController(Splash/LoadingViewController) -> setup -> GodotViewController +#if !defined(VISIONOS_ENABLED) // Create a full-screen window CGRect windowBounds = [[UIScreen mainScreen] bounds]; self.window = [[UIWindow alloc] initWithFrame:windowBounds]; +#else + self.window = [[UIWindow alloc] init]; +#endif int err = apple_embedded_main(gargc, gargv); diff --git a/drivers/apple_embedded/display_server_apple_embedded.mm b/drivers/apple_embedded/display_server_apple_embedded.mm index ebdbf97a800..3f13b23b9ff 100644 --- a/drivers/apple_embedded/display_server_apple_embedded.mm +++ b/drivers/apple_embedded/display_server_apple_embedded.mm @@ -643,9 +643,12 @@ void DisplayServerAppleEmbedded::screen_set_orientation(DisplayServer::ScreenOri screen_orientation = p_orientation; if (@available(iOS 16.0, *)) { [GDTAppDelegateService.viewController setNeedsUpdateOfSupportedInterfaceOrientations]; - } else { + } +#if !defined(VISIONOS_ENABLED) + else { [UIViewController attemptRotationToDeviceOrientation]; } +#endif } DisplayServer::ScreenOrientation DisplayServerAppleEmbedded::screen_get_orientation(int p_screen) const { diff --git a/drivers/apple_embedded/godot_view_apple_embedded.mm b/drivers/apple_embedded/godot_view_apple_embedded.mm index 8754311c802..dd6ba3f5d2b 100644 --- a/drivers/apple_embedded/godot_view_apple_embedded.mm +++ b/drivers/apple_embedded/godot_view_apple_embedded.mm @@ -117,7 +117,9 @@ static const float earth_gravity = 9.80665; } - (void)godot_commonInit { +#if !defined(VISIONOS_ENABLED) self.contentScaleFactor = [UIScreen mainScreen].scale; +#endif if (@available(iOS 17.0, *)) { [self registerForTraitChanges:@[ [UITraitUserInterfaceStyle class] ] withTarget:self action:@selector(traitCollectionDidChangeWithView:previousTraitCollection:)]; @@ -148,7 +150,9 @@ static const float earth_gravity = 9.80665; - (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection { if (@available(iOS 13.0, *)) { +#if !defined(VISIONOS_ENABLED) [super traitCollectionDidChange:previousTraitCollection]; +#endif [self traitCollectionDidChangeWithView:self previousTraitCollection:previousTraitCollection]; } @@ -419,6 +423,7 @@ static const float earth_gravity = 9.80665; UIInterfaceOrientation interfaceOrientation = UIInterfaceOrientationUnknown; +#if !defined(VISIONOS_ENABLED) #if __IPHONE_OS_VERSION_MAX_ALLOWED < 140000 interfaceOrientation = [[UIApplication sharedApplication] statusBarOrientation]; #else @@ -430,6 +435,9 @@ static const float earth_gravity = 9.80665; #endif } #endif +#else + interfaceOrientation = [UIApplication sharedApplication].delegate.window.windowScene.interfaceOrientation; +#endif switch (interfaceOrientation) { case UIInterfaceOrientationLandscapeLeft: { diff --git a/drivers/apple_embedded/view_controller.mm b/drivers/apple_embedded/view_controller.mm index e1e8f45b7d1..15dc1daf16e 100644 --- a/drivers/apple_embedded/view_controller.mm +++ b/drivers/apple_embedded/view_controller.mm @@ -187,6 +187,7 @@ } - (void)displayLoadingOverlay { +#if !defined(VISIONOS_ENABLED) NSBundle *bundle = [NSBundle mainBundle]; NSString *storyboardName = @"Launch Screen"; @@ -202,6 +203,7 @@ self.godotLoadingOverlay.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; [self.view addSubview:self.godotLoadingOverlay]; +#endif } - (BOOL)godotViewFinishedSetup:(GDTView *)view { diff --git a/drivers/metal/metal_device_properties.mm b/drivers/metal/metal_device_properties.mm index 713f69e41df..1d3b78a1b69 100644 --- a/drivers/metal/metal_device_properties.mm +++ b/drivers/metal/metal_device_properties.mm @@ -50,6 +50,8 @@ #import "metal_device_properties.h" +#include "servers/rendering/renderer_rd/effects/metal_fx.h" + #import #import #import @@ -63,7 +65,7 @@ #define MTLGPUFamilyApple9 (MTLGPUFamily)1009 #endif -API_AVAILABLE(macos(11.0), ios(14.0), tvos(14.0)) +API_AVAILABLE(macos(11.0), ios(14.0), tvos(14.0), visionos(1.0)) MTLGPUFamily &operator--(MTLGPUFamily &p_family) { p_family = static_cast(static_cast(p_family) - 1); if (p_family < MTLGPUFamilyApple1) { @@ -126,7 +128,11 @@ void MetalDeviceProperties::init_features(id p_device) { if (@available(macOS 13.0, iOS 16.0, tvOS 16.0, *)) { features.metal_fx_spatial = [MTLFXSpatialScalerDescriptor supportsDevice:p_device]; +#ifdef METAL_MFXTEMPORAL_ENABLED features.metal_fx_temporal = [MTLFXTemporalScalerDescriptor supportsDevice:p_device]; +#else + features.metal_fx_temporal = false; +#endif } MTLCompileOptions *opts = [MTLCompileOptions new]; @@ -136,7 +142,7 @@ void MetalDeviceProperties::init_features(id p_device) { features.mslVersion = SPIRV_CROSS_NAMESPACE::CompilerMSL::Options::make_msl_version(m_maj, m_min) switch (features.mslVersionEnum) { -#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 150000 || __IPHONE_OS_VERSION_MAX_ALLOWED >= 180000 || __TV_OS_VERSION_MAX_ALLOWED >= 180000 +#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 150000 || __IPHONE_OS_VERSION_MAX_ALLOWED >= 180000 || __TV_OS_VERSION_MAX_ALLOWED >= 180000 || __VISION_OS_VERSION_MAX_ALLOWED >= 20000 case MTLLanguageVersion3_2: setMSLVersion(3, 2); break; @@ -170,7 +176,7 @@ void MetalDeviceProperties::init_features(id p_device) { case MTLLanguageVersion1_1: setMSLVersion(1, 1); break; -#if TARGET_OS_IPHONE && !TARGET_OS_MACCATALYST +#if TARGET_OS_IPHONE && !TARGET_OS_MACCATALYST && !TARGET_OS_VISION case MTLLanguageVersion1_0: setMSLVersion(1, 0); break; @@ -324,6 +330,7 @@ void MetalDeviceProperties::init_limits(id p_device) { limits.maxDrawIndexedIndexValue = std::numeric_limits::max() - 1; +#ifdef METAL_MFXTEMPORAL_ENABLED if (@available(macOS 14.0, iOS 17.0, tvOS 17.0, *)) { limits.temporalScalerInputContentMinScale = (double)[MTLFXTemporalScalerDescriptor supportedInputContentMinScaleForDevice:p_device]; limits.temporalScalerInputContentMaxScale = (double)[MTLFXTemporalScalerDescriptor supportedInputContentMaxScaleForDevice:p_device]; @@ -332,6 +339,11 @@ void MetalDeviceProperties::init_limits(id p_device) { limits.temporalScalerInputContentMinScale = 1.0; limits.temporalScalerInputContentMaxScale = 3.0; } +#else + // Defaults taken from macOS 14+ + limits.temporalScalerInputContentMinScale = 1.0; + limits.temporalScalerInputContentMaxScale = 3.0; +#endif } MetalDeviceProperties::MetalDeviceProperties(id p_device) { diff --git a/drivers/metal/pixel_formats.mm b/drivers/metal/pixel_formats.mm index 86924c6530a..9ce9cdda733 100644 --- a/drivers/metal/pixel_formats.mm +++ b/drivers/metal/pixel_formats.mm @@ -114,6 +114,9 @@ bool PixelFormats::isSupportedOrSubstitutable(DataFormat p_format) { } bool PixelFormats::isPVRTCFormat(MTLPixelFormat p_format) { +#if defined(VISIONOS_ENABLED) + return false; +#else switch (p_format) { case MTLPixelFormatPVRTC_RGBA_2BPP: case MTLPixelFormatPVRTC_RGBA_2BPP_sRGB: @@ -127,6 +130,7 @@ bool PixelFormats::isPVRTCFormat(MTLPixelFormat p_format) { default: return false; } +#endif } MTLFormatType PixelFormats::getFormatType(DataFormat p_format) { @@ -668,11 +672,13 @@ void PixelFormats::initMTLPixelFormatCapabilities() { addMTLPixelFormatDesc(RGBA32Sint, Color128, RWC); addMTLPixelFormatDesc(RGBA32Float, Color128, All); +#if !defined(VISIONOS_ENABLED) // Compressed pixel formats addMTLPixelFormatDesc(PVRTC_RGBA_2BPP, PVRTC_RGBA_2BPP, RF); addMTLPixelFormatDescSRGB(PVRTC_RGBA_2BPP_sRGB, PVRTC_RGBA_2BPP, RF, PVRTC_RGBA_2BPP); addMTLPixelFormatDesc(PVRTC_RGBA_4BPP, PVRTC_RGBA_4BPP, RF); addMTLPixelFormatDescSRGB(PVRTC_RGBA_4BPP_sRGB, PVRTC_RGBA_4BPP, RF, PVRTC_RGBA_4BPP); +#endif addMTLPixelFormatDesc(ETC2_RGB8, ETC2_RGB8, RF); addMTLPixelFormatDescSRGB(ETC2_RGB8_sRGB, ETC2_RGB8, RF, ETC2_RGB8); diff --git a/drivers/metal/rendering_device_driver_metal.mm b/drivers/metal/rendering_device_driver_metal.mm index c42d779f5a1..3d61c63c2db 100644 --- a/drivers/metal/rendering_device_driver_metal.mm +++ b/drivers/metal/rendering_device_driver_metal.mm @@ -290,7 +290,11 @@ RDD::TextureID RenderingDeviceDriverMetal::texture_create(const TextureFormat &p // Usage. MTLResourceOptions options = 0; +#if defined(VISIONOS_ENABLED) + const bool supports_memoryless = true; +#else const bool supports_memoryless = (*device_properties).features.highestFamily >= MTLGPUFamilyApple2 && (*device_properties).features.highestFamily < MTLGPUFamilyMac1; +#endif if (supports_memoryless && p_format.usage_bits & TEXTURE_USAGE_TRANSIENT_BIT) { options = MTLResourceStorageModeMemoryless | MTLResourceHazardTrackingModeTracked; desc.storageMode = MTLStorageModeMemoryless; @@ -2493,7 +2497,11 @@ RDD::ShaderID RenderingDeviceDriverMetal::shader_create_from_bytecode(const Vect cd->name = binary_data.shader_name; cd->stage = shader_data.stage; options.preserveInvariance = shader_data.is_position_invariant; +#if defined(VISIONOS_ENABLED) + options.mathMode = MTLMathModeFast; +#else options.fastMathEnabled = YES; +#endif MDLibrary *library = [MDLibrary newLibraryWithCacheEntry:cd device:device source:source diff --git a/editor/export/editor_export_platform_apple_embedded.cpp b/editor/export/editor_export_platform_apple_embedded.cpp index ffcc5c4c521..02e8b86609b 100644 --- a/editor/export/editor_export_platform_apple_embedded.cpp +++ b/editor/export/editor_export_platform_apple_embedded.cpp @@ -1128,30 +1128,35 @@ Error EditorExportPlatformAppleEmbedded::_convert_to_framework(const String &p_s lib_clean_name[i] = '-'; } } - String info_plist_format = "\n" - "\n" - "\n" - " \n" - " CFBundleShortVersionString\n" - " 1.0\n" - " CFBundleIdentifier\n" - " $id.framework.$cl_name\n" - " CFBundleName\n" - " $name\n" - " CFBundleExecutable\n" - " $name\n" - " DTPlatformName\n" - " iphoneos\n" - " CFBundleInfoDictionaryVersion\n" - " 6.0\n" - " CFBundleVersion\n" - " 1\n" - " CFBundlePackageType\n" - " FMWK\n" - " MinimumOSVersion\n" - " 12.0\n" - " \n" - ""; + String info_plist_format = + "\n" + "\n" + "\n" + " \n" + " CFBundleShortVersionString\n" + " 1.0\n" + " CFBundleIdentifier\n" + " $id.framework.$cl_name\n" + " CFBundleName\n" + " $name\n" + " CFBundleExecutable\n" + " $name\n" + " DTPlatformName\n" + " " + + get_sdk_name() + + "\n" + " CFBundleInfoDictionaryVersion\n" + " 6.0\n" + " CFBundleVersion\n" + " 1\n" + " CFBundlePackageType\n" + " FMWK\n" + " MinimumOSVersion\n" + " " + + get_minimum_deployment_target() + + "\n" + " \n" + ""; String info_plist = info_plist_format.replace("$id", p_id).replace("$name", file_name).replace("$cl_name", lib_clean_name); @@ -2124,6 +2129,8 @@ Error EditorExportPlatformAppleEmbedded::_export_project_helper(const Ref archive_args; archive_args.push_back("-project"); @@ -2131,7 +2138,7 @@ Error EditorExportPlatformAppleEmbedded::_export_project_helper(const Ref &p_preset, const String &p_iconset_dir) { return OK; } virtual String get_platform_name() const = 0; + virtual String get_sdk_name() const = 0; + virtual String get_minimum_deployment_target() const = 0; + virtual void get_preset_features(const Ref &p_preset, List *r_features) const override; virtual void get_export_options(List *r_options) const override; virtual bool get_export_option_visibility(const EditorExportPreset *p_preset, const String &p_option) const override; diff --git a/editor/export/macho.h b/editor/export/macho.h index 0932c276966..4a1faa1f1fc 100644 --- a/editor/export/macho.h +++ b/editor/export/macho.h @@ -111,6 +111,8 @@ public: PLATFORM_TVOSSIMULATOR = 8, PLATFORM_WATCHOSSIMULATOR = 9, PLATFORM_DRIVERKIT = 10, + PLATFORM_VISIONOS = 11, + PLATFORM_VISIONOSSIMULATOR = 12, }; struct LoadCommandHeader { diff --git a/main/main.cpp b/main/main.cpp index 5212958d756..c47984641ab 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -2191,6 +2191,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph GLOBAL_DEF_RST(PropertyInfo(Variant::STRING, "rendering/rendering_device/driver.linuxbsd", PROPERTY_HINT_ENUM, "vulkan"), "vulkan"); GLOBAL_DEF_RST(PropertyInfo(Variant::STRING, "rendering/rendering_device/driver.android", PROPERTY_HINT_ENUM, "vulkan"), "vulkan"); GLOBAL_DEF_RST(PropertyInfo(Variant::STRING, "rendering/rendering_device/driver.ios", PROPERTY_HINT_ENUM, "metal,vulkan"), "metal"); + GLOBAL_DEF_RST(PropertyInfo(Variant::STRING, "rendering/rendering_device/driver.visionos", PROPERTY_HINT_ENUM, "metal"), "metal"); GLOBAL_DEF_RST(PropertyInfo(Variant::STRING, "rendering/rendering_device/driver.macos", PROPERTY_HINT_ENUM, "metal,vulkan"), "metal"); GLOBAL_DEF_RST("rendering/rendering_device/fallback_to_vulkan", true); @@ -2672,6 +2673,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph GLOBAL_DEF_NOVAL(PropertyInfo(Variant::STRING, "display/display_server/driver.linuxbsd", PROPERTY_HINT_ENUM_SUGGESTION, "default,x11,wayland,headless"), "default"); GLOBAL_DEF_NOVAL(PropertyInfo(Variant::STRING, "display/display_server/driver.android", PROPERTY_HINT_ENUM_SUGGESTION, "default,android,headless"), "default"); GLOBAL_DEF_NOVAL(PropertyInfo(Variant::STRING, "display/display_server/driver.ios", PROPERTY_HINT_ENUM_SUGGESTION, "default,iOS,headless"), "default"); + GLOBAL_DEF_NOVAL(PropertyInfo(Variant::STRING, "display/display_server/driver.visionos", PROPERTY_HINT_ENUM_SUGGESTION, "default,visionOS,headless"), "default"); GLOBAL_DEF_NOVAL(PropertyInfo(Variant::STRING, "display/display_server/driver.macos", PROPERTY_HINT_ENUM_SUGGESTION, "default,macos,headless"), "default"); GLOBAL_DEF_RST_NOVAL("audio/driver/driver", AudioDriverManager::get_driver(0)->get_name()); diff --git a/methods.py b/methods.py index 5ec41915256..050e56be2cb 100644 --- a/methods.py +++ b/methods.py @@ -636,6 +636,14 @@ def detect_darwin_sdk_path(platform, env): sdk_name = "iphonesimulator" var_name = "IOS_SDK_PATH" + elif platform == "visionos": + sdk_name = "xros" + var_name = "VISIONOS_SDK_PATH" + + elif platform == "visionossimulator": + sdk_name = "xrsimulator" + var_name = "VISIONOS_SDK_PATH" + else: raise Exception("Invalid platform argument passed to detect_darwin_sdk_path") diff --git a/misc/dist/visionos_xcode/PrivacyInfo.xcprivacy b/misc/dist/visionos_xcode/PrivacyInfo.xcprivacy new file mode 100644 index 00000000000..bc4a893d587 --- /dev/null +++ b/misc/dist/visionos_xcode/PrivacyInfo.xcprivacy @@ -0,0 +1,10 @@ + + + + + NSPrivacyAccessedAPITypes + $priv_api_types + $priv_tracking + $priv_collection + + diff --git a/misc/dist/visionos_xcode/data.pck b/misc/dist/visionos_xcode/data.pck new file mode 100644 index 00000000000..e69de29bb2d diff --git a/misc/dist/visionos_xcode/godot_visionos.xcodeproj/project.pbxproj b/misc/dist/visionos_xcode/godot_visionos.xcodeproj/project.pbxproj new file mode 100644 index 00000000000..272c4024e0a --- /dev/null +++ b/misc/dist/visionos_xcode/godot_visionos.xcodeproj/project.pbxproj @@ -0,0 +1,402 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1F1575721F582BE20003B888 /* dylibs in Resources */ = {isa = PBXBuildFile; fileRef = 1F1575711F582BE20003B888 /* dylibs */; }; + DEADBEEF2F582BE20003B888 /* $binary.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = DEADBEEF1F582BE20003B888 /* $binary.xcframework */; }; + $modules_buildfile + $swift_runtime_buildfile + 1FF8DBB11FBA9DE1009DE660 /* dummy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1FF8DBB01FBA9DE1009DE660 /* dummy.cpp */; }; + D07CD44E1C5D589C00B7FB28 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D07CD44D1C5D589C00B7FB28 /* Images.xcassets */; }; + D0BCFE4618AEBDA2004A7AAE /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = D0BCFE4418AEBDA2004A7AAE /* InfoPlist.strings */; }; + D0BCFE7818AEBFEB004A7AAE /* $binary.pck in Resources */ = {isa = PBXBuildFile; fileRef = D0BCFE7718AEBFEB004A7AAE /* $binary.pck */; }; + F965960D2BC2C3A800579C7E /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = F965960C2BC2C3A800579C7E /* PrivacyInfo.xcprivacy */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 90A13CD024AA68E500E8464F /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + $pbx_embeded_frameworks + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1F1575711F582BE20003B888 /* dylibs */ = {isa = PBXFileReference; lastKnownFileType = folder; name = dylibs; path = "$binary/dylibs"; sourceTree = ""; }; + DEADBEEF1F582BE20003B888 /* $binary.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = godot; path = "$binary.xcframework"; sourceTree = ""; }; + $modules_fileref + $swift_runtime_fileref + 1FF4C1881F584E6300A41E41 /* $binary.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "$binary.entitlements"; sourceTree = ""; }; + 1FF8DBB01FBA9DE1009DE660 /* dummy.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = dummy.cpp; sourceTree = ""; }; + D07CD44D1C5D589C00B7FB28 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + D0BCFE3418AEBDA2004A7AAE /* $binary.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "$binary.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + D0BCFE4318AEBDA2004A7AAE /* $binary-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "$binary-Info.plist"; sourceTree = ""; }; + D0BCFE4518AEBDA2004A7AAE /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + $pbx_locale_file_reference + D0BCFE7718AEBFEB004A7AAE /* $binary.pck */ = {isa = PBXFileReference; lastKnownFileType = file; path = "$binary.pck"; sourceTree = ""; }; + F965960C2BC2C3A800579C7E /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; +/* End PBXFileReference section */ + + $additional_pbx_files + +/* Begin PBXFrameworksBuildPhase section */ + D0BCFE3118AEBDA2004A7AAE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + DEADBEEF2F582BE20003B888 /* $binary.xcframework */, + $modules_buildphase + $additional_pbx_frameworks_build + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + D0BCFE2B18AEBDA2004A7AAE = { + isa = PBXGroup; + children = ( + 1F1575711F582BE20003B888 /* dylibs */, + D0BCFE7718AEBFEB004A7AAE /* $binary.pck */, + D0BCFE4118AEBDA2004A7AAE /* $binary */, + D0BCFE3618AEBDA2004A7AAE /* Frameworks */, + D0BCFE3518AEBDA2004A7AAE /* Products */, + F965960C2BC2C3A800579C7E /* PrivacyInfo.xcprivacy */, + $additional_pbx_resources_refs + ); + sourceTree = ""; + }; + D0BCFE3518AEBDA2004A7AAE /* Products */ = { + isa = PBXGroup; + children = ( + D0BCFE3418AEBDA2004A7AAE /* $binary.app */, + ); + name = Products; + sourceTree = ""; + }; + D0BCFE3618AEBDA2004A7AAE /* Frameworks */ = { + isa = PBXGroup; + children = ( + DEADBEEF1F582BE20003B888 /* $binary.xcframework */, + $modules_buildgrp + $additional_pbx_frameworks_refs + ); + name = Frameworks; + sourceTree = ""; + }; + D0BCFE4118AEBDA2004A7AAE /* $binary */ = { + isa = PBXGroup; + children = ( + 1FF4C1881F584E6300A41E41 /* $binary.entitlements */, + D07CD44D1C5D589C00B7FB28 /* Images.xcassets */, + D0BCFE4218AEBDA2004A7AAE /* Supporting Files */, + 1FF8DBB01FBA9DE1009DE660 /* dummy.cpp */, + $swift_runtime_binary_files + ); + path = "$binary"; + sourceTree = ""; + }; + D0BCFE4218AEBDA2004A7AAE /* Supporting Files */ = { + isa = PBXGroup; + children = ( + D0BCFE4318AEBDA2004A7AAE /* $binary-Info.plist */, + D0BCFE4418AEBDA2004A7AAE /* InfoPlist.strings */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + D0BCFE3318AEBDA2004A7AAE /* $binary */ = { + isa = PBXNativeTarget; + buildConfigurationList = D0BCFE7118AEBDA3004A7AAE /* Build configuration list for PBXNativeTarget "$binary" */; + buildPhases = ( + D0BCFE3018AEBDA2004A7AAE /* Sources */, + D0BCFE3118AEBDA2004A7AAE /* Frameworks */, + D0BCFE3218AEBDA2004A7AAE /* Resources */, + 90A13CD024AA68E500E8464F /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "$binary"; + productName = "$name"; + productReference = D0BCFE3418AEBDA2004A7AAE /* $binary.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D0BCFE2C18AEBDA2004A7AAE /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0500; + ORGANIZATIONNAME = GodotEngine; + TargetAttributes = { + D0BCFE3318AEBDA2004A7AAE = { + DevelopmentTeam = $team_id; + $swift_runtime_migration + ProvisioningStyle = Automatic; + SystemCapabilities = { + }; + }; + }; + }; + buildConfigurationList = D0BCFE2F18AEBDA2004A7AAE /* Build configuration list for PBXProject "$binary" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = D0BCFE2B18AEBDA2004A7AAE; + productRefGroup = D0BCFE3518AEBDA2004A7AAE /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D0BCFE3318AEBDA2004A7AAE /* $binary */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + D0BCFE3218AEBDA2004A7AAE /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D07CD44E1C5D589C00B7FB28 /* Images.xcassets in Resources */, + D0BCFE7818AEBFEB004A7AAE /* $binary.pck in Resources */, + D0BCFE4618AEBDA2004A7AAE /* InfoPlist.strings in Resources */, + F965960D2BC2C3A800579C7E /* PrivacyInfo.xcprivacy in Resources */, + $additional_pbx_resources_build + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + D0BCFE3018AEBDA2004A7AAE /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1FF8DBB11FBA9DE1009DE660 /* dummy.cpp in Sources */, + $swift_runtime_build_phase + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + D0BCFE4418AEBDA2004A7AAE /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + D0BCFE4518AEBDA2004A7AAE /* en */, + $pbx_locale_build_reference + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + D0BCFE6F18AEBDA3004A7AAE /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$godot_archs"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "$code_sign_identity_debug"; + "CODE_SIGN_IDENTITY[sdk=xros*]" = "$code_sign_identity_debug"; + COPY_PHASE_STRIP = NO; + ENABLE_BITCODE = NO; + "FRAMEWORK_SEARCH_PATHS[arch=*]" = ( + "$(PROJECT_DIR)/**", + ); + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + XROS_DEPLOYMENT_TARGET = $min_version; + "LD_CLASSIC_1500" = "-ld_classic"; + "LD_CLASSIC_1501" = "-ld_classic"; + "LD_CLASSIC_1510" = "-ld_classic"; + OTHER_LDFLAGS = "$(LD_CLASSIC_$(XCODE_VERSION_ACTUAL)) $linker_flags"; + SDKROOT = xros; + TARGETED_DEVICE_FAMILY = 7; + }; + name = Debug; + }; + D0BCFE7018AEBDA3004A7AAE /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$godot_archs"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "$code_sign_identity_release"; + "CODE_SIGN_IDENTITY[sdk=xros*]" = "$code_sign_identity_release"; + COPY_PHASE_STRIP = YES; + ENABLE_BITCODE = NO; + "FRAMEWORK_SEARCH_PATHS[arch=*]" = ( + "$(PROJECT_DIR)/**", + ); + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + XROS_DEPLOYMENT_TARGET = $min_version; + "LD_CLASSIC_1500" = "-ld_classic"; + "LD_CLASSIC_1501" = "-ld_classic"; + "LD_CLASSIC_1510" = "-ld_classic"; + OTHER_LDFLAGS = "$(LD_CLASSIC_$(XCODE_VERSION_ACTUAL)) $linker_flags"; + SDKROOT = xros; + TARGETED_DEVICE_FAMILY = 7; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + D0BCFE7218AEBDA3004A7AAE /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$godot_archs"; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = "$binary/$binary.entitlements"; + CODE_SIGN_IDENTITY = "$code_sign_identity_debug"; + "CODE_SIGN_IDENTITY[sdk=xros*]" = "$code_sign_identity_debug"; + CODE_SIGN_STYLE = "$code_sign_style_debug"; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; + DEVELOPMENT_TEAM = $team_id; + INFOPLIST_FILE = "$binary/$binary-Info.plist"; + XROS_DEPLOYMENT_TARGET = $min_version; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/**", + ); + PRODUCT_BUNDLE_IDENTIFIER = $bundle_identifier; + INFOPLIST_KEY_CFBundleDisplayName = "$name"; + PRODUCT_NAME = "$binary"; + EXECUTABLE_NAME = "$binary"; + MARKETING_VERSION = $short_version; + CURRENT_PROJECT_VERSION = $version; + PROVISIONING_PROFILE = "$provisioning_profile_uuid_debug"; + PROVISIONING_PROFILE_SPECIFIER = "$provisioning_profile_specifier_debug"; + TARGETED_DEVICE_FAMILY = 7; + VALID_ARCHS = "arm64 x86_64"; + WRAPPER_EXTENSION = app; + $swift_runtime_build_settings + }; + name = Debug; + }; + D0BCFE7318AEBDA3004A7AAE /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$godot_archs"; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = "$binary/$binary.entitlements"; + CODE_SIGN_IDENTITY = "$code_sign_identity_release"; + "CODE_SIGN_IDENTITY[sdk=xros*]" = "$code_sign_identity_release"; + CODE_SIGN_STYLE = "$code_sign_style_release"; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; + DEVELOPMENT_TEAM = $team_id; + INFOPLIST_FILE = "$binary/$binary-Info.plist"; + XROS_DEPLOYMENT_TARGET = $min_version; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/**", + ); + PRODUCT_BUNDLE_IDENTIFIER = $bundle_identifier; + INFOPLIST_KEY_CFBundleDisplayName = "$name"; + PRODUCT_NAME = "$binary"; + EXECUTABLE_NAME = "$binary"; + MARKETING_VERSION = $short_version; + CURRENT_PROJECT_VERSION = $version; + PROVISIONING_PROFILE = "$provisioning_profile_uuid_release"; + PROVISIONING_PROFILE_SPECIFIER = "$provisioning_profile_specifier_release"; + TARGETED_DEVICE_FAMILY = 7; + VALID_ARCHS = "arm64"; + WRAPPER_EXTENSION = app; + $swift_runtime_build_settings + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + D0BCFE2F18AEBDA2004A7AAE /* Build configuration list for PBXProject "$binary" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D0BCFE6F18AEBDA3004A7AAE /* Debug */, + D0BCFE7018AEBDA3004A7AAE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + D0BCFE7118AEBDA3004A7AAE /* Build configuration list for PBXNativeTarget "$binary" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D0BCFE7218AEBDA3004A7AAE /* Debug */, + D0BCFE7318AEBDA3004A7AAE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; +/* End XCConfigurationList section */ + }; + rootObject = D0BCFE2C18AEBDA2004A7AAE /* Project object */; +} diff --git a/misc/dist/visionos_xcode/godot_visionos.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/misc/dist/visionos_xcode/godot_visionos.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000000..c9c19829f4a --- /dev/null +++ b/misc/dist/visionos_xcode/godot_visionos.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/misc/dist/visionos_xcode/godot_visionos.xcodeproj/xcshareddata/xcschemes/godot_visionos.xcscheme b/misc/dist/visionos_xcode/godot_visionos.xcodeproj/xcshareddata/xcschemes/godot_visionos.xcscheme new file mode 100644 index 00000000000..d61a53d5c2c --- /dev/null +++ b/misc/dist/visionos_xcode/godot_visionos.xcodeproj/xcshareddata/xcschemes/godot_visionos.xcscheme @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/misc/dist/visionos_xcode/godot_visionos/Images.xcassets/SplashImage.imageset/Contents.json b/misc/dist/visionos_xcode/godot_visionos/Images.xcassets/SplashImage.imageset/Contents.json new file mode 100644 index 00000000000..1e63e78edac --- /dev/null +++ b/misc/dist/visionos_xcode/godot_visionos/Images.xcassets/SplashImage.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "splash@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "splash@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/misc/dist/visionos_xcode/godot_visionos/Images.xcassets/SplashImage.imageset/splash@2x.png b/misc/dist/visionos_xcode/godot_visionos/Images.xcassets/SplashImage.imageset/splash@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0469319b1cf5f50f6c6f53147283f16582624e GIT binary patch literal 14779 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

Jv@Y?uQ^cA&NR5m7|Pn=rEO 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 W#a?Jm;r>BSQdUagO}T`T|NjD#g5*d5 literal 0 HcmV?d00001 diff --git a/misc/dist/visionos_xcode/godot_visionos/Images.xcassets/SplashImage.imageset/splash@3x.png b/misc/dist/visionos_xcode/godot_visionos/Images.xcassets/SplashImage.imageset/splash@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0469319b1cf5f50f6c6f53147283f16582624e GIT binary patch literal 14779 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

Jv@Y?uQ^cA&NR5m7|Pn=rEO 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 W#a?Jm;r>BSQdUagO}T`T|NjD#g5*d5 literal 0 HcmV?d00001 diff --git a/misc/dist/visionos_xcode/godot_visionos/dummy.cpp b/misc/dist/visionos_xcode/godot_visionos/dummy.cpp new file mode 100644 index 00000000000..f36e09c68a9 --- /dev/null +++ b/misc/dist/visionos_xcode/godot_visionos/dummy.cpp @@ -0,0 +1,31 @@ +/**************************************************************************/ +/* dummy.cpp */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +$cpp_code diff --git a/misc/dist/visionos_xcode/godot_visionos/dummy.h b/misc/dist/visionos_xcode/godot_visionos/dummy.h new file mode 100644 index 00000000000..a29be476456 --- /dev/null +++ b/misc/dist/visionos_xcode/godot_visionos/dummy.h @@ -0,0 +1,33 @@ +/**************************************************************************/ +/* dummy.h */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#pragma once + +// #import diff --git a/misc/dist/visionos_xcode/godot_visionos/dummy.swift b/misc/dist/visionos_xcode/godot_visionos/dummy.swift new file mode 100644 index 00000000000..495b5c9a870 --- /dev/null +++ b/misc/dist/visionos_xcode/godot_visionos/dummy.swift @@ -0,0 +1,31 @@ +/**************************************************************************/ +/* dummy.swift */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +import Foundation diff --git a/misc/dist/visionos_xcode/godot_visionos/dylibs/empty b/misc/dist/visionos_xcode/godot_visionos/dylibs/empty new file mode 100644 index 00000000000..bd3e8943336 --- /dev/null +++ b/misc/dist/visionos_xcode/godot_visionos/dylibs/empty @@ -0,0 +1 @@ +Dummy file to make dylibs folder exported diff --git a/misc/dist/visionos_xcode/godot_visionos/en.lproj/InfoPlist.strings b/misc/dist/visionos_xcode/godot_visionos/en.lproj/InfoPlist.strings new file mode 100644 index 00000000000..b92732c79e0 --- /dev/null +++ b/misc/dist/visionos_xcode/godot_visionos/en.lproj/InfoPlist.strings @@ -0,0 +1 @@ +/* Localized versions of Info.plist keys */ diff --git a/misc/dist/visionos_xcode/godot_visionos/export_options.plist b/misc/dist/visionos_xcode/godot_visionos/export_options.plist new file mode 100644 index 00000000000..71073d9a075 --- /dev/null +++ b/misc/dist/visionos_xcode/godot_visionos/export_options.plist @@ -0,0 +1,20 @@ + + + + + method + $export_method + + teamID + $team_id + + provisioningProfiles + + $bundle_identifier + $provisioning_profile_uuid + + + compileBitcode + + + diff --git a/misc/dist/visionos_xcode/godot_visionos/godot_visionos-Info.plist b/misc/dist/visionos_xcode/godot_visionos/godot_visionos-Info.plist new file mode 100644 index 00000000000..3d2ae6b52b9 --- /dev/null +++ b/misc/dist/visionos_xcode/godot_visionos/godot_visionos-Info.plist @@ -0,0 +1,63 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + $(INFOPLIST_KEY_CFBundleDisplayName) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIcons + + CFBundleIcons~ipad + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleSignature + $signature + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + ITSAppUsesNonExemptEncryption + + LSRequiresIPhoneOS + + LSSupportsOpeningDocumentsInPlace + $docs_in_place + UIFileSharingEnabled + $docs_sharing + UIRequiredDeviceCapabilities + + $required_device_capabilities + + NSCameraUsageDescription + $camera_usage_description + NSPhotoLibraryUsageDescription + $photolibrary_usage_description + NSMicrophoneUsageDescription + $microphone_usage_description + UIRequiresFullScreen + + UIStatusBarHidden + + UISupportedInterfaceOrientations + + $interface_orientations + + UISupportedInterfaceOrientations~ipad + + $ipad_interface_orientations + + $additional_plist_content + $plist_launch_screen_name + CADisableMinimumFrameDurationOnPhone + + diff --git a/misc/dist/visionos_xcode/godot_visionos/godot_visionos.entitlements b/misc/dist/visionos_xcode/godot_visionos/godot_visionos.entitlements new file mode 100644 index 00000000000..6a9e1af546e --- /dev/null +++ b/misc/dist/visionos_xcode/godot_visionos/godot_visionos.entitlements @@ -0,0 +1,7 @@ + + + + +$entitlements_full + + diff --git a/misc/dist/visionos_xcode/libgodot.visionos.debug.xcframework/Info.plist b/misc/dist/visionos_xcode/libgodot.visionos.debug.xcframework/Info.plist new file mode 100755 index 00000000000..46f2c86cc93 --- /dev/null +++ b/misc/dist/visionos_xcode/libgodot.visionos.debug.xcframework/Info.plist @@ -0,0 +1,39 @@ + + + + + AvailableLibraries + + + LibraryIdentifier + xros-arm64 + LibraryPath + libgodot.a + SupportedArchitectures + + arm64 + + SupportedPlatform + xros + + + LibraryIdentifier + xros-arm64-simulator + LibraryPath + libgodot.a + SupportedArchitectures + + arm64 + + SupportedPlatform + xros + SupportedPlatformVariant + simulator + + + CFBundlePackageType + XFWK + XCFrameworkFormatVersion + 1.0 + + diff --git a/misc/dist/visionos_xcode/libgodot.visionos.debug.xcframework/xros-arm64-simulator/empty b/misc/dist/visionos_xcode/libgodot.visionos.debug.xcframework/xros-arm64-simulator/empty new file mode 100644 index 00000000000..bd3e8943336 --- /dev/null +++ b/misc/dist/visionos_xcode/libgodot.visionos.debug.xcframework/xros-arm64-simulator/empty @@ -0,0 +1 @@ +Dummy file to make dylibs folder exported diff --git a/misc/dist/visionos_xcode/libgodot.visionos.debug.xcframework/xros-arm64/empty b/misc/dist/visionos_xcode/libgodot.visionos.debug.xcframework/xros-arm64/empty new file mode 100644 index 00000000000..bd3e8943336 --- /dev/null +++ b/misc/dist/visionos_xcode/libgodot.visionos.debug.xcframework/xros-arm64/empty @@ -0,0 +1 @@ +Dummy file to make dylibs folder exported diff --git a/misc/dist/visionos_xcode/libgodot.visionos.release.xcframework/Info.plist b/misc/dist/visionos_xcode/libgodot.visionos.release.xcframework/Info.plist new file mode 100755 index 00000000000..46f2c86cc93 --- /dev/null +++ b/misc/dist/visionos_xcode/libgodot.visionos.release.xcframework/Info.plist @@ -0,0 +1,39 @@ + + + + + AvailableLibraries + + + LibraryIdentifier + xros-arm64 + LibraryPath + libgodot.a + SupportedArchitectures + + arm64 + + SupportedPlatform + xros + + + LibraryIdentifier + xros-arm64-simulator + LibraryPath + libgodot.a + SupportedArchitectures + + arm64 + + SupportedPlatform + xros + SupportedPlatformVariant + simulator + + + CFBundlePackageType + XFWK + XCFrameworkFormatVersion + 1.0 + + diff --git a/misc/dist/visionos_xcode/libgodot.visionos.release.xcframework/xros-arm64-simulator/empty b/misc/dist/visionos_xcode/libgodot.visionos.release.xcframework/xros-arm64-simulator/empty new file mode 100644 index 00000000000..bd3e8943336 --- /dev/null +++ b/misc/dist/visionos_xcode/libgodot.visionos.release.xcframework/xros-arm64-simulator/empty @@ -0,0 +1 @@ +Dummy file to make dylibs folder exported diff --git a/misc/dist/visionos_xcode/libgodot.visionos.release.xcframework/xros-arm64/empty b/misc/dist/visionos_xcode/libgodot.visionos.release.xcframework/xros-arm64/empty new file mode 100644 index 00000000000..bd3e8943336 --- /dev/null +++ b/misc/dist/visionos_xcode/libgodot.visionos.release.xcframework/xros-arm64/empty @@ -0,0 +1 @@ +Dummy file to make dylibs folder exported diff --git a/platform/ios/export/export_plugin.cpp b/platform/ios/export/export_plugin.cpp index 74e16fa8f2e..01c8c296f9a 100644 --- a/platform/ios/export/export_plugin.cpp +++ b/platform/ios/export/export_plugin.cpp @@ -44,7 +44,7 @@ void EditorExportPlatformIOS::get_export_options(List *r_options) EditorExportPlatformAppleEmbedded::get_export_options(r_options); r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "application/targeted_device_family", PROPERTY_HINT_ENUM, "iPhone,iPad,iPhone & iPad"), 2)); - r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/min_ios_version"), "14.0")); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/min_ios_version"), get_minimum_deployment_target())); r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "storyboard/image_scale_mode", PROPERTY_HINT_ENUM, "Same as Logo,Center,Scale to Fit,Scale to Fill,Scale"), 0)); r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "storyboard/custom_image@2x", PROPERTY_HINT_FILE, "*.png,*.jpg,*.jpeg"), "")); diff --git a/platform/ios/export/export_plugin.h b/platform/ios/export/export_plugin.h index b6369a02c5a..1dd210d2607 100644 --- a/platform/ios/export/export_plugin.h +++ b/platform/ios/export/export_plugin.h @@ -37,6 +37,10 @@ class EditorExportPlatformIOS : public EditorExportPlatformAppleEmbedded { virtual String get_platform_name() const override { return "ios"; } + virtual String get_sdk_name() const override { return "iphoneos"; } + + virtual String get_minimum_deployment_target() const override { return "14.0"; } + virtual Vector get_icon_infos() const override; virtual void get_export_options(List *r_options) const override; diff --git a/platform/visionos/README.md b/platform/visionos/README.md new file mode 100644 index 00000000000..6bd8f257d71 --- /dev/null +++ b/platform/visionos/README.md @@ -0,0 +1,20 @@ +# visionOS platform port + +This folder contains the C++, Objective-C and Objective-C++ code for the visionOS +platform port. + +This platform derives from the Apple Embedded abstract platform ([`drivers/apple_embedded`](drivers/apple_embedded)). + +This platform uses shared Apple code ([`drivers/apple`](drivers/apple)). + +See also [`misc/dist/ios_xcode`](/misc/dist/ios_xcode) folder for the Xcode +project template used for packaging the iOS export templates. + +## Documentation + +The compiling and exporting process is the same as on iOS, but replacing the `ios` parameter by `visionos`. + +- [Compiling for iOS](https://docs.godotengine.org/en/latest/contributing/development/compiling/compiling_for_ios.html) + - Instructions on building this platform port from source. +- [Exporting for iOS](https://docs.godotengine.org/en/latest/tutorials/export/exporting_for_ios.html) + - Instructions on using the compiled export templates to export a project. diff --git a/platform/visionos/SCsub b/platform/visionos/SCsub new file mode 100644 index 00000000000..d3da9bb04a4 --- /dev/null +++ b/platform/visionos/SCsub @@ -0,0 +1,29 @@ +#!/usr/bin/env python +from misc.utility.scons_hints import * + +from platform_visionos_builders import generate_bundle + +from platform_methods import combine_libs_apple_embedded + +Import("env") + +visionos_lib = [ + "display_layer_visionos.mm", + "display_server_visionos.mm", + "godot_view_visionos.mm", + "main_visionos.mm", + "os_visionos.mm", +] + +env_visionos = env.Clone() +visionos_lib = env_visionos.add_library("visionos", visionos_lib) + +# Enable module support +env_visionos.Append(CCFLAGS=["-fmodules", "-fcxx-modules"]) + +combine_command = env_visionos.Command( + "#bin/libgodot" + env_visionos["LIBSUFFIX"], [visionos_lib] + env_visionos["LIBS"], combine_libs_apple_embedded +) + +if env["generate_bundle"]: + env.AlwaysBuild(env.CommandNoCache("generate_bundle", combine_command, env.Run(generate_bundle))) diff --git a/platform/visionos/api/api.cpp b/platform/visionos/api/api.cpp new file mode 100644 index 00000000000..2b6b89a89f7 --- /dev/null +++ b/platform/visionos/api/api.cpp @@ -0,0 +1,48 @@ +/**************************************************************************/ +/* api.cpp */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#include "api.h" + +#if defined(VISIONOS_ENABLED) + +void register_visionos_api() { + godot_apple_embedded_plugins_initialize(); +} + +void unregister_visionos_api() { + godot_apple_embedded_plugins_deinitialize(); +} + +#else + +void register_visionos_api() {} +void unregister_visionos_api() {} + +#endif // VISIONOS_ENABLED diff --git a/platform/visionos/api/api.h b/platform/visionos/api/api.h new file mode 100644 index 00000000000..3b4230d06a8 --- /dev/null +++ b/platform/visionos/api/api.h @@ -0,0 +1,39 @@ +/**************************************************************************/ +/* api.h */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#pragma once + +#if defined(VISIONOS_ENABLED) +extern void godot_apple_embedded_plugins_initialize(); +extern void godot_apple_embedded_plugins_deinitialize(); +#endif + +void register_visionos_api(); +void unregister_visionos_api(); diff --git a/platform/visionos/detect.py b/platform/visionos/detect.py new file mode 100644 index 00000000000..678c628a192 --- /dev/null +++ b/platform/visionos/detect.py @@ -0,0 +1,160 @@ +import os +import sys +from typing import TYPE_CHECKING + +from methods import detect_darwin_sdk_path, detect_darwin_toolchain_path, print_warning +from platform_methods import validate_arch + +if TYPE_CHECKING: + from SCons.Script.SConscript import SConsEnvironment + + +def get_name(): + return "visionOS" + + +def can_build(): + if sys.platform == "darwin" or ("OSXCROSS_VISIONOS" in os.environ): + return True + + return False + + +def get_opts(): + from SCons.Variables import BoolVariable + + return [ + # APPLE_TOOLCHAIN_PATH Example: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain + (("APPLE_TOOLCHAIN_PATH", "IOS_TOOLCHAIN_PATH"), "Path to the Apple toolchain", ""), + ("VISIONOS_SDK_PATH", "Path to the visionOS SDK", ""), + ("apple_target_triple", "Triple for corresponding target Apple platform toolchain", ""), + BoolVariable("simulator", "Build for Simulator", False), + BoolVariable("generate_bundle", "Generate an APP bundle after building visionOS/macOS binaries", False), + ] + + +def get_doc_classes(): + return [ + "EditorExportPlatformVisionOS", + ] + + +def get_doc_path(): + return "doc_classes" + + +def get_flags(): + return { + "arch": "arm64", + "target": "template_debug", + "use_volk": False, + "metal": True, + "supported": ["metal", "mono"], + "builtin_pcre2_with_jit": False, + "vulkan": False, + "opengl3": False, + } + + +def configure(env: "SConsEnvironment"): + # Validate arch. + supported_arches = ["x86_64", "arm64"] + validate_arch(env["arch"], get_name(), supported_arches) + detect_darwin_toolchain_path(env) + + ## LTO + + if env["lto"] == "auto": # Disable by default as it makes linking in Xcode very slow. + env["lto"] = "none" + + if env["lto"] != "none": + if env["lto"] == "thin": + env.Append(CCFLAGS=["-flto=thin"]) + env.Append(LINKFLAGS=["-flto=thin"]) + else: + env.Append(CCFLAGS=["-flto"]) + env.Append(LINKFLAGS=["-flto"]) + + ## Compiler configuration + + # Save this in environment for use by other modules + if "OSXCROSS_VISIONOS" in os.environ: + env["osxcross"] = True + + env["ENV"]["PATH"] = env["APPLE_TOOLCHAIN_PATH"] + "/Developer/usr/bin/:" + env["ENV"]["PATH"] + + compiler_path = "$APPLE_TOOLCHAIN_PATH/usr/bin/${apple_target_triple}" + + ccache_path = os.environ.get("CCACHE") + if ccache_path is None: + env["CC"] = compiler_path + "clang" + env["CXX"] = compiler_path + "clang++" + env["S_compiler"] = compiler_path + "clang" + else: + # there aren't any ccache wrappers available for visionOS, + # to enable caching we need to prepend the path to the ccache binary + env["CC"] = ccache_path + " " + compiler_path + "clang" + env["CXX"] = ccache_path + " " + compiler_path + "clang++" + env["S_compiler"] = ccache_path + " " + compiler_path + "clang" + env["AR"] = compiler_path + "ar" + env["RANLIB"] = compiler_path + "ranlib" + + ## Compile flags + + if env["simulator"]: + detect_darwin_sdk_path("visionossimulator", env) + env.Append(ASFLAGS=["-mtargetos=xros2.0-simulator"]) + env.Append(CCFLAGS=["-mtargetos=xros2.0-simulator"]) + env.Append(CPPDEFINES=["VISIONOS_SIMULATOR"]) + env.extra_suffix = ".simulator" + env.extra_suffix + else: + detect_darwin_sdk_path("visionos", env) + env.Append(ASFLAGS=["-mtargetos=xros2.0"]) + env.Append(CCFLAGS=["-mtargetos=xros2.0"]) + + if env["arch"] == "arm64": + env.Append( + CCFLAGS=( + "-fobjc-arc -arch arm64 -fmessage-length=0" + " -fdiagnostics-print-source-range-info -fdiagnostics-show-category=id -fdiagnostics-parseable-fixits" + " -fpascal-strings -fblocks -fvisibility=hidden -MMD -MT dependencies" + " -isysroot $VISIONOS_SDK_PATH".split() + ) + ) + env.Append(ASFLAGS=["-arch", "arm64"]) + + # Temp fix for ABS/MAX/MIN macros in visionOS SDK blocking compilation + env.Append(CCFLAGS=["-Wno-ambiguous-macro"]) + + env.Prepend( + CPPPATH=[ + "$VISIONOS_SDK_PATH/usr/include", + "$VISIONOS_SDK_PATH/System/Library/Frameworks/AudioUnit.framework/Headers", + ] + ) + + env.Prepend(CPPPATH=["#platform/visionos"]) + env.Append(CPPDEFINES=["VISIONOS_ENABLED", "APPLE_EMBEDDED_ENABLED", "UNIX_ENABLED", "COREAUDIO_ENABLED"]) + + if env["vulkan"]: + print_warning("The visionOS platform does not support the Vulkan rendering driver") + env["vulkan"] = False + + if env["metal"] and env["simulator"]: + print_warning("visionOS Simulator does not support the Metal rendering driver") + env["metal"] = False + + if env["metal"]: + env.AppendUnique(CPPDEFINES=["METAL_ENABLED", "RD_ENABLED"]) + env.Prepend( + CPPPATH=[ + "$VISIONOS_SDK_PATH/System/Library/Frameworks/Metal.framework/Headers", + "$VISIONOS_SDK_PATH/System/Library/Frameworks/MetalFX.framework/Headers", + "$VISIONOS_SDK_PATH/System/Library/Frameworks/QuartzCore.framework/Headers", + ] + ) + env.Prepend(CPPPATH=["#thirdparty/spirv-cross"]) + + if env["opengl3"]: + print_warning("The visionOS platform does not support the OpenGL rendering driver") + env["opengl3"] = False diff --git a/platform/visionos/display_layer_visionos.h b/platform/visionos/display_layer_visionos.h new file mode 100644 index 00000000000..44ae5d7cb83 --- /dev/null +++ b/platform/visionos/display_layer_visionos.h @@ -0,0 +1,36 @@ +/**************************************************************************/ +/* display_layer_visionos.h */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#pragma once + +#include "drivers/apple_embedded/display_layer_apple_embedded.h" + +@interface GDTMetalLayer : CAMetalLayer +@end diff --git a/platform/visionos/display_layer_visionos.mm b/platform/visionos/display_layer_visionos.mm new file mode 100644 index 00000000000..e8f5b8b9e23 --- /dev/null +++ b/platform/visionos/display_layer_visionos.mm @@ -0,0 +1,47 @@ +/**************************************************************************/ +/* display_layer_visionos.mm */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#import "display_layer_visionos.h" + +@implementation GDTMetalLayer + +- (void)initializeDisplayLayer { +} + +- (void)layoutDisplayLayer { +} + +- (void)startRenderDisplayLayer { +} + +- (void)stopRenderDisplayLayer { +} + +@end diff --git a/platform/visionos/display_server_visionos.h b/platform/visionos/display_server_visionos.h new file mode 100644 index 00000000000..56fbe4e5ccc --- /dev/null +++ b/platform/visionos/display_server_visionos.h @@ -0,0 +1,54 @@ +/**************************************************************************/ +/* display_server_visionos.h */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#pragma once + +#include "drivers/apple_embedded/display_server_apple_embedded.h" + +class DisplayServerVisionOS : public DisplayServerAppleEmbedded { + GDSOFTCLASS(DisplayServerVisionOS, DisplayServerAppleEmbedded); + + _THREAD_SAFE_CLASS_ + + DisplayServerVisionOS(const String &p_rendering_driver, DisplayServer::WindowMode p_mode, DisplayServer::VSyncMode p_vsync_mode, uint32_t p_flags, const Vector2i *p_position, const Vector2i &p_resolution, int p_screen, Context p_context, int64_t p_parent_window, Error &r_error); + ~DisplayServerVisionOS(); + +public: + static DisplayServerVisionOS *get_singleton(); + + static void register_visionos_driver(); + static DisplayServer *create_func(const String &p_rendering_driver, WindowMode p_mode, DisplayServer::VSyncMode p_vsync_mode, uint32_t p_flags, const Vector2i *p_position, const Vector2i &p_resolution, int p_screen, Context p_context, int64_t p_parent_window, Error &r_error); + + virtual String get_name() const override; + + virtual int screen_get_dpi(int p_screen = SCREEN_OF_MAIN_WINDOW) const override; + virtual float screen_get_scale(int p_screen = SCREEN_OF_MAIN_WINDOW) const override; + virtual float screen_get_refresh_rate(int p_screen = SCREEN_OF_MAIN_WINDOW) const override; +}; diff --git a/platform/visionos/display_server_visionos.mm b/platform/visionos/display_server_visionos.mm new file mode 100644 index 00000000000..8c385e2694a --- /dev/null +++ b/platform/visionos/display_server_visionos.mm @@ -0,0 +1,67 @@ +/**************************************************************************/ +/* display_server_visionos.mm */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#import "display_server_visionos.h" + +DisplayServerVisionOS *DisplayServerVisionOS::get_singleton() { + return (DisplayServerVisionOS *)DisplayServerAppleEmbedded::get_singleton(); +} + +DisplayServerVisionOS::DisplayServerVisionOS(const String &p_rendering_driver, WindowMode p_mode, DisplayServer::VSyncMode p_vsync_mode, uint32_t p_flags, const Vector2i *p_position, const Vector2i &p_resolution, int p_screen, Context p_context, int64_t p_parent_window, Error &r_error) : + DisplayServerAppleEmbedded(p_rendering_driver, p_mode, p_vsync_mode, p_flags, p_position, p_resolution, p_screen, p_context, p_parent_window, r_error) { +} + +DisplayServerVisionOS::~DisplayServerVisionOS() { +} + +DisplayServer *DisplayServerVisionOS::create_func(const String &p_rendering_driver, WindowMode p_mode, DisplayServer::VSyncMode p_vsync_mode, uint32_t p_flags, const Vector2i *p_position, const Vector2i &p_resolution, int p_screen, Context p_context, int64_t p_parent_window, Error &r_error) { + return memnew(DisplayServerVisionOS(p_rendering_driver, p_mode, p_vsync_mode, p_flags, p_position, p_resolution, p_screen, p_context, p_parent_window, r_error)); +} + +void DisplayServerVisionOS::register_visionos_driver() { + register_create_function("visionOS", create_func, get_rendering_drivers_func); +} + +String DisplayServerVisionOS::get_name() const { + return "visionOS"; +} + +int DisplayServerVisionOS::screen_get_dpi(int p_screen) const { + // TODO(Apple): Compute this properly from SwiftUI Metric APIs + return 72; +} + +float DisplayServerVisionOS::screen_get_refresh_rate(int p_screen) const { + return 90; +} + +float DisplayServerVisionOS::screen_get_scale(int p_screen) const { + return 1; +} diff --git a/platform/visionos/doc_classes/EditorExportPlatformVisionOS.xml b/platform/visionos/doc_classes/EditorExportPlatformVisionOS.xml new file mode 100644 index 00000000000..17d6f4596d0 --- /dev/null +++ b/platform/visionos/doc_classes/EditorExportPlatformVisionOS.xml @@ -0,0 +1,588 @@ + + + + Exporter for visionOS. + + + + + $DOCS_URL/tutorials/export/exporting_for_ios.html + $DOCS_URL/tutorials/platform/ios/index.html + + + + Additional data added to the root [code]<dict>[/code] section of the [url=https://developer.apple.com/documentation/bundleresources/information_property_list]Info.plist[/url] file. The value should be an XML section with pairs of key-value elements, e.g.: + [codeblock lang=text] + <key>key_name</key> + <string>value</string> + [/codeblock] + + + Apple Team ID, unique 10-character string. To locate your Team ID check "Membership details" section in your Apple developer account dashboard, or "Organizational Unit" of your code signing certificate. See [url=https://developer.apple.com/help/account/manage-your-team/locate-your-team-id]Locate your Team ID[/url]. + + + Unique application identifier in a reverse-DNS format, can only contain alphanumeric characters ([code]A-Z[/code], [code]a-z[/code], and [code]0-9[/code]), hyphens ([code]-[/code]), and periods ([code].[/code]). + + + The "Full Name", "Common Name" or SHA-1 hash of the signing identity used for debug export. + + + The "Full Name", "Common Name" or SHA-1 hash of the signing identity used for release export. + + + If [code]true[/code], existing "project name" and "project name.xcodeproj" in the export destination directory will be unconditionally deleted during export. + + + Application distribution target (debug export). + + + Application distribution target (release export). + + + If [code]true[/code], exports iOS project files without building an XCArchive or [code].ipa[/code] file. If [code]false[/code], exports iOS project files and builds an XCArchive and [code].ipa[/code] file at the same time. When combining Godot with Fastlane or other build pipelines, you may want to set this to [code]true[/code]. + + + Interpolation method used to resize application icon. + + + + + Name of the provisioning profile. Sets XCode PROVISIONING_PROFILE_SPECIFIER for debug. [url=https://developer.apple.com/documentation/xcode/build-settings-reference#Provisioning-Profile]Used for manual provisioning[/url]. + Can be overridden with the environment variable [code]GODOT_APPLE_PLATFORM_PROFILE_SPECIFIER_DEBUG[/code]. + + + Name of the provisioning profile. Sets XCode PROVISIONING_PROFILE_SPECIFIER for release. [url=https://developer.apple.com/documentation/xcode/build-settings-reference#Provisioning-Profile]Used for manual provisioning[/url]. + Can be overridden with the environment variable [code]GODOT_APPLE_PLATFORM_PROFILE_SPECIFIER_RELEASE[/code]. + + + UUID of the provisioning profile. If left empty, Xcode will download or create a provisioning profile automatically. See [url=https://developer.apple.com/help/account/manage-profiles/edit-download-or-delete-profiles]Edit, download, or delete provisioning profiles[/url]. + Can be overridden with the environment variable [code]GODOT_APPLE_PLATFORM_PROVISIONING_PROFILE_UUID_DEBUG[/code]. + + + UUID of the provisioning profile. If left empty, Xcode will download or create a provisioning profile automatically. See [url=https://developer.apple.com/help/account/manage-profiles/edit-download-or-delete-profiles]Edit, download, or delete provisioning profiles[/url]. + Can be overridden with the environment variable [code]GODOT_APPLE_PLATFORM_PROVISIONING_PROFILE_UUID_RELEASE[/code]. + + + Application version visible to the user, can only contain numeric characters ([code]0-9[/code]) and periods ([code].[/code]). Falls back to [member ProjectSettings.application/config/version] if left empty. + + + A four-character creator code that is specific to the bundle. Optional. + + + Machine-readable application version, in the [code]major.minor.patch[/code] format, can only contain numeric characters ([code]0-9[/code]) and periods ([code].[/code]). This must be incremented on every new release pushed to the App Store. + + + If [code]true[/code], [code]arm64[/code] binaries are included into exported project. + + + If [code]true[/code], networking features related to Wi-Fi access are enabled. See [url=https://developer.apple.com/support/required-device-capabilities/]Required Device Capabilities[/url]. + + + Additional data added to the [code]UIRequiredDeviceCapabilities[/code] array of the [code]Info.plist[/code] file. + + + Requires the graphics performance and features of the A12 Bionic and later chips (devices supporting all Vulkan renderer features). + Enabling this option limits supported devices to: iPhone XS, iPhone XR, iPad Mini (5th gen.), iPad Air (3rd gen.), iPad (8th gen) and newer. + + + Requires the graphics performance and features of the A17 Pro and later chips. + Enabling this option limits supported devices to: iPhone 15 Pro and newer. + + + Path to the custom export template. If left empty, default template is used. + + + Path to the custom export template. If left empty, default template is used. + + + Additional data added to the root [code]<dict>[/code] section of the [url=https://developer.apple.com/documentation/bundleresources/entitlements].entitlements[/url] file. The value should be an XML section with pairs of key-value elements, for example: + [codeblock lang=text] + <key>key_name</key> + <string>value</string> + [/codeblock] + + + If [code]true[/code], allows access to Game Center features. See [url=https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_developer_game-center]com.apple.developer.game-center[/url]. + + + If [code]true[/code], hints that the app might perform better with a higher memory limit. See [url=https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_developer_kernel_increased-memory-limit]com.apple.developer.kernel.increased-memory-limit[/url]. + + + Environment for Apple Push Notification service. See [url=https://developer.apple.com/documentation/bundleresources/entitlements/aps-environment]aps-environment[/url]. + + + Base application icon used to generate other icons. If left empty, it will fallback to [member ProjectSettings.application/config/icon]. See [url=https://developer.apple.com/design/human-interface-guidelines/foundations/app-icons]App icons[/url]. + + + Base application icon used to generate other icons, dark version. See [url=https://developer.apple.com/design/human-interface-guidelines/foundations/app-icons]App icons[/url]. + + + Base application icon used to generate other icons, tinted version. See [url=https://developer.apple.com/design/human-interface-guidelines/foundations/app-icons]App icons[/url]. + + + The reasons your app use active keyboard API. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api]Describing use of required reason API[/url]. + + + A message displayed when requesting access to the device's camera (in English). + + + A message displayed when requesting access to the device's camera (localized). + + + Indicates whether your app collects advertising data. + + + The reasons your app collects advertising data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links advertising data to the user's identity. + + + Indicates whether your app uses advertising data for tracking. + + + Indicates whether your app collects audio data. + + + The reasons your app collects audio data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links audio data to the user's identity. + + + Indicates whether your app uses audio data for tracking. + + + Indicates whether your app collects browsing history. + + + The reasons your app collects browsing history. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links browsing history to the user's identity. + + + Indicates whether your app uses browsing history for tracking. + + + Indicates whether your app collects coarse location data. + + + The reasons your app collects coarse location data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links coarse location data to the user's identity. + + + Indicates whether your app uses coarse location data for tracking. + + + Indicates whether your app collects contacts. + + + The reasons your app collects contacts. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links contacts to the user's identity. + + + Indicates whether your app uses contacts for tracking. + + + Indicates whether your app collects crash data. + + + The reasons your app collects crash data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links crash data to the user's identity. + + + Indicates whether your app uses crash data for tracking. + + + Indicates whether your app collects credit information. + + + The reasons your app collects credit information. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links credit information to the user's identity. + + + Indicates whether your app uses credit information for tracking. + + + Indicates whether your app collects customer support data. + + + The reasons your app collects customer support data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links customer support data to the user's identity. + + + Indicates whether your app uses customer support data for tracking. + + + Indicates whether your app collects device IDs. + + + The reasons your app collects device IDs. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links device IDs to the user's identity. + + + Indicates whether your app uses device IDs for tracking. + + + Indicates whether your app collects email address. + + + The reasons your app collects email address. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links email address to the user's identity. + + + Indicates whether your app uses email address for tracking. + + + Indicates whether your app collects emails or text messages. + + + The reasons your app collects emails or text messages. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links emails or text messages to the user's identity. + + + Indicates whether your app uses emails or text messages for tracking. + + + Indicates whether your app collects environment scanning data. + + + The reasons your app collects environment scanning data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links environment scanning data to the user's identity. + + + Indicates whether your app uses environment scanning data for tracking. + + + Indicates whether your app collects fitness and exercise data. + + + The reasons your app collects fitness and exercise data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links fitness and exercise data to the user's identity. + + + Indicates whether your app uses fitness and exercise data for tracking. + + + Indicates whether your app collects gameplay content. + + + The reasons your app collects gameplay content. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links gameplay content to the user's identity. + + + Indicates whether your app uses gameplay content for tracking. + + + Indicates whether your app collects user's hand structure and hand movements. + + + The reasons your app collects user's hand structure and hand movements. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links user's hand structure and hand movements to the user's identity. + + + Indicates whether your app uses user's hand structure and hand movements for tracking. + + + Indicates whether your app collects user's head movement. + + + The reasons your app collects user's head movement. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links user's head movement to the user's identity. + + + Indicates whether your app uses user's head movement for tracking. + + + Indicates whether your app collects health and medical data. + + + The reasons your app collects health and medical data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links health and medical data to the user's identity. + + + Indicates whether your app uses health and medical data for tracking. + + + Indicates whether your app collects user's name. + + + The reasons your app collects user's name. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links user's name to the user's identity. + + + Indicates whether your app uses user's name for tracking. + + + Indicates whether your app collects any other contact information. + + + The reasons your app collects any other contact information. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links any other contact information to the user's identity. + + + Indicates whether your app uses any other contact information for tracking. + + + Indicates whether your app collects any other data. + + + The reasons your app collects any other data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links any other data to the user's identity. + + + Indicates whether your app uses any other data for tracking. + + + Indicates whether your app collects any other diagnostic data. + + + The reasons your app collects any other diagnostic data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links any other diagnostic data to the user's identity. + + + Indicates whether your app uses any other diagnostic data for tracking. + + + Indicates whether your app collects any other financial information. + + + The reasons your app collects any other financial information. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links any other financial information to the user's identity. + + + Indicates whether your app uses any other financial information for tracking. + + + Indicates whether your app collects any other usage data. + + + The reasons your app collects any other usage data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links any other usage data to the user's identity. + + + Indicates whether your app uses any other usage data for tracking. + + + Indicates whether your app collects any other user generated content. + + + The reasons your app collects any other user generated content. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links any other user generated content to the user's identity. + + + Indicates whether your app uses any other user generated content for tracking. + + + Indicates whether your app collects payment information. + + + The reasons your app collects payment information. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links payment information to the user's identity. + + + Indicates whether your app uses payment information for tracking. + + + Indicates whether your app collects performance data. + + + The reasons your app collects performance data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links performance data to the user's identity. + + + Indicates whether your app uses performance data for tracking. + + + Indicates whether your app collects phone number. + + + The reasons your app collects phone number. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links phone number to the user's identity. + + + Indicates whether your app uses phone number for tracking. + + + Indicates whether your app collects photos or videos. + + + The reasons your app collects photos or videos. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links photos or videos to the user's identity. + + + Indicates whether your app uses photos or videos for tracking. + + + Indicates whether your app collects physical address. + + + The reasons your app collects physical address. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links physical address to the user's identity. + + + Indicates whether your app uses physical address for tracking. + + + Indicates whether your app collects precise location data. + + + The reasons your app collects precise location data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links precise location data to the user's identity. + + + Indicates whether your app uses precise location data for tracking. + + + Indicates whether your app collects product interaction data. + + + The reasons your app collects product interaction data. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links product interaction data to the user's identity. + + + Indicates whether your app uses product interaction data for tracking. + + + Indicates whether your app collects purchase history. + + + The reasons your app collects purchase history. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links purchase history to the user's identity. + + + Indicates whether your app uses purchase history for tracking. + + + Indicates whether your app collects search history. + + + The reasons your app collects search history. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links search history to the user's identity. + + + Indicates whether your app uses search history for tracking. + + + Indicates whether your app collects sensitive user information. + + + The reasons your app collects sensitive user information. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links sensitive user information to the user's identity. + + + Indicates whether your app uses sensitive user information for tracking. + + + Indicates whether your app collects user IDs. + + + The reasons your app collects user IDs. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests]Describing data use in privacy manifests[/url]. + + + Indicates whether your app links user IDs to the user's identity. + + + Indicates whether your app uses user IDs for tracking. + + + The reasons your app use free disk space API. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api]Describing use of required reason API[/url]. + + + The reasons your app use file timestamp/metadata API. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api]Describing use of required reason API[/url]. + + + A message displayed when requesting access to the device's microphone (in English). + + + A message displayed when requesting access to the device's microphone (localized). + + + A message displayed when requesting access to the user's photo library (in English). + + + A message displayed when requesting access to the user's photo library (localized). + + + The reasons your app use system boot time / absolute time API. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api]Describing use of required reason API[/url]. + + + The list of internet domains your app connects to that engage in tracking. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files]Privacy manifest files[/url]. + + + Indicates whether your app uses data for tracking. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files]Privacy manifest files[/url]. + + + The reasons your app use user defaults API. See [url=https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api]Describing use of required reason API[/url]. + + + If [code]true[/code], the app "Documents" folder can be accessed via "Files" app. See [url=https://developer.apple.com/documentation/bundleresources/information_property_list/lssupportsopeningdocumentsinplace]LSSupportsOpeningDocumentsInPlace[/url]. + + + If [code]true[/code], the app "Documents" folder can be accessed via iTunes file sharing. See [url=https://developer.apple.com/documentation/bundleresources/information_property_list/uifilesharingenabled]UIFileSharingEnabled[/url]. + + + diff --git a/platform/visionos/export/export.cpp b/platform/visionos/export/export.cpp new file mode 100644 index 00000000000..50acb1740c5 --- /dev/null +++ b/platform/visionos/export/export.cpp @@ -0,0 +1,46 @@ +/**************************************************************************/ +/* export.cpp */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#include "export.h" + +#include "export_plugin.h" + +#include "editor/export/editor_export.h" + +void register_visionos_exporter_types() { + GDREGISTER_VIRTUAL_CLASS(EditorExportPlatformVisionOS); +} + +void register_visionos_exporter() { + Ref platform; + platform.instantiate(); + + EditorExport::get_singleton()->add_export_platform(platform); +} diff --git a/platform/visionos/export/export.h b/platform/visionos/export/export.h new file mode 100644 index 00000000000..17163cc4db8 --- /dev/null +++ b/platform/visionos/export/export.h @@ -0,0 +1,34 @@ +/**************************************************************************/ +/* export.h */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#pragma once + +void register_visionos_exporter_types(); +void register_visionos_exporter(); diff --git a/platform/visionos/export/export_plugin.cpp b/platform/visionos/export/export_plugin.cpp new file mode 100644 index 00000000000..8c67a011854 --- /dev/null +++ b/platform/visionos/export/export_plugin.cpp @@ -0,0 +1,51 @@ +/**************************************************************************/ +/* export_plugin.cpp */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#include "export_plugin.h" + +#include "logo_svg.gen.h" +#include "run_icon_svg.gen.h" + +EditorExportPlatformVisionOS::EditorExportPlatformVisionOS() : + EditorExportPlatformAppleEmbedded(_visionos_logo_svg, _visionos_run_icon_svg) { +} + +EditorExportPlatformVisionOS::~EditorExportPlatformVisionOS() { +} + +void EditorExportPlatformVisionOS::get_export_options(List *r_options) const { + EditorExportPlatformAppleEmbedded::get_export_options(r_options); + + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/min_visionos_version"), get_minimum_deployment_target())); +} + +Vector EditorExportPlatformVisionOS::get_icon_infos() const { + return Vector(); +} diff --git a/platform/visionos/export/export_plugin.h b/platform/visionos/export/export_plugin.h new file mode 100644 index 00000000000..1deb7361af2 --- /dev/null +++ b/platform/visionos/export/export_plugin.h @@ -0,0 +1,59 @@ +/**************************************************************************/ +/* export_plugin.h */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#pragma once + +#include "editor/export/editor_export_platform_apple_embedded.h" + +class EditorExportPlatformVisionOS : public EditorExportPlatformAppleEmbedded { + GDCLASS(EditorExportPlatformVisionOS, EditorExportPlatformAppleEmbedded); + + virtual String get_platform_name() const override { return "visionos"; } + + virtual String get_sdk_name() const override { return "xros"; } + + virtual String get_minimum_deployment_target() const override { return "2.0"; } + + virtual Vector get_icon_infos() const override; + + virtual void get_export_options(List *r_options) const override; + +public: + virtual String get_name() const override { return "visionOS"; } + virtual String get_os_name() const override { return "visionOS"; } + + virtual void get_platform_features(List *r_features) const override { + EditorExportPlatformAppleEmbedded::get_platform_features(r_features); + r_features->push_back("visionos"); + } + + EditorExportPlatformVisionOS(); + ~EditorExportPlatformVisionOS(); +}; diff --git a/platform/visionos/export/logo.svg b/platform/visionos/export/logo.svg new file mode 100644 index 00000000000..da325f6dc78 --- /dev/null +++ b/platform/visionos/export/logo.svg @@ -0,0 +1 @@ + diff --git a/platform/visionos/export/run_icon.svg b/platform/visionos/export/run_icon.svg new file mode 100644 index 00000000000..72f55e86485 --- /dev/null +++ b/platform/visionos/export/run_icon.svg @@ -0,0 +1 @@ + diff --git a/platform/visionos/godot_view_visionos.h b/platform/visionos/godot_view_visionos.h new file mode 100644 index 00000000000..0599efbbdca --- /dev/null +++ b/platform/visionos/godot_view_visionos.h @@ -0,0 +1,37 @@ +/**************************************************************************/ +/* godot_view_visionos.mm */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#pragma once + +#include "drivers/apple_embedded/godot_view_apple_embedded.h" + +@interface GDTViewVisionOS : GDTView + +@end diff --git a/platform/visionos/godot_view_visionos.mm b/platform/visionos/godot_view_visionos.mm new file mode 100644 index 00000000000..d2ed6dd827b --- /dev/null +++ b/platform/visionos/godot_view_visionos.mm @@ -0,0 +1,80 @@ +/**************************************************************************/ +/* godot_view.mm */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#include "godot_view_visionos.h" + +#include "display_layer_visionos.h" + +#include "core/error/error_macros.h" + +#import + +@interface GDTViewVisionOS () + +GODOT_CLANG_WARNING_PUSH_AND_IGNORE("-Wobjc-property-synthesis") +@property(strong, nonatomic) CALayer *renderingLayer; +GODOT_CLANG_WARNING_POP + +@end + +@implementation GDTViewVisionOS + +- (void)godot_commonInit { + [super godot_commonInit]; + + // Enable GamePad handler + GCEventInteraction *gamepadInteraction = [[GCEventInteraction alloc] init]; + gamepadInteraction.handledEventTypes = GCUIEventTypeGamepad; + [self addInteraction:gamepadInteraction]; +} + +- (CALayer *)initializeRenderingForDriver:(NSString *)driverName { + if (self.renderingLayer) { + return self.renderingLayer; + } + + CALayer *layer = [GDTMetalLayer layer]; + + layer.frame = self.bounds; + layer.contentsScale = self.contentScaleFactor; + + [self.layer addSublayer:layer]; + self.renderingLayer = layer; + + [layer initializeDisplayLayer]; + + return self.renderingLayer; +} + +@end + +GDTView *GDTViewCreate() { + return [GDTViewVisionOS new]; +} diff --git a/platform/visionos/main_visionos.mm b/platform/visionos/main_visionos.mm new file mode 100644 index 00000000000..c6bea151a7a --- /dev/null +++ b/platform/visionos/main_visionos.mm @@ -0,0 +1,89 @@ +/**************************************************************************/ +/* main.mm */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#import "os_visionos.h" + +#import "drivers/apple_embedded/godot_app_delegate.h" +#import "drivers/apple_embedded/main_utilities.h" +#include "main/main.h" + +#import +#include + +int gargc; +char **gargv; + +static OS_VisionOS *os = nullptr; + +int main(int argc, char *argv[]) { +#if defined(VULKAN_ENABLED) + //MoltenVK - enable full component swizzling support + setenv("MVK_CONFIG_FULL_IMAGE_VIEW_SWIZZLE", "1", 1); +#endif + + gargc = argc; + gargv = argv; + + @autoreleasepool { + NSString *className = NSStringFromClass([GDTApplicationDelegate class]); + UIApplicationMain(argc, argv, nil, className); + } + return 0; +} + +int apple_embedded_main(int argc, char **argv) { + change_to_launch_dir(argv); + + os = new OS_VisionOS(); + + // We must override main when testing is enabled + TEST_MAIN_OVERRIDE + + char *fargv[64]; + argc = process_args(argc, argv, fargv); + + Error err = Main::setup(fargv[0], argc - 1, &fargv[1], false); + + if (err != OK) { + if (err == ERR_HELP) { // Returned by --help and --version, so success. + return EXIT_SUCCESS; + } + return EXIT_FAILURE; + } + + os->initialize_modules(); + + return os->get_exit_code(); +} + +void apple_embedded_finish() { + Main::cleanup(); + delete os; +} diff --git a/platform/visionos/os_visionos.h b/platform/visionos/os_visionos.h new file mode 100644 index 00000000000..2ef0a8e6e98 --- /dev/null +++ b/platform/visionos/os_visionos.h @@ -0,0 +1,47 @@ +/**************************************************************************/ +/* os_visions.h */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#pragma once + +#ifdef VISIONOS_ENABLED + +#import "drivers/apple_embedded/os_apple_embedded.h" + +class OS_VisionOS : public OS_AppleEmbedded { +public: + static OS_VisionOS *get_singleton(); + + OS_VisionOS(); + ~OS_VisionOS(); + + virtual String get_name() const override; +}; + +#endif // VISIONOS_ENABLED diff --git a/platform/visionos/os_visionos.mm b/platform/visionos/os_visionos.mm new file mode 100644 index 00000000000..b68b740b6ac --- /dev/null +++ b/platform/visionos/os_visionos.mm @@ -0,0 +1,52 @@ +/**************************************************************************/ +/* os_visionos.mm */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#import "os_visionos.h" + +#import "display_server_visionos.h" + +#ifdef VISIONOS_ENABLED + +OS_VisionOS *OS_VisionOS::get_singleton() { + return (OS_VisionOS *)OS_AppleEmbedded::get_singleton(); +} + +OS_VisionOS::OS_VisionOS() : + OS_AppleEmbedded() { + DisplayServerVisionOS::register_visionos_driver(); +} + +OS_VisionOS::~OS_VisionOS() {} + +String OS_VisionOS::get_name() const { + return "visionOS"; +} + +#endif // VISIONOS_ENABLED diff --git a/platform/visionos/platform_config.h b/platform/visionos/platform_config.h new file mode 100644 index 00000000000..52dac8b496e --- /dev/null +++ b/platform/visionos/platform_config.h @@ -0,0 +1,33 @@ +/**************************************************************************/ +/* platform_config.h */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#pragma once + +#import "drivers/apple_embedded/platform_config.h" diff --git a/platform/visionos/platform_thread.h b/platform/visionos/platform_thread.h new file mode 100644 index 00000000000..42827e53fc8 --- /dev/null +++ b/platform/visionos/platform_thread.h @@ -0,0 +1,33 @@ +/**************************************************************************/ +/* platform_thread.h */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#pragma once + +#include "drivers/apple/thread_apple.h" diff --git a/platform/visionos/platform_visionos_builders.py b/platform/visionos/platform_visionos_builders.py new file mode 100644 index 00000000000..a7f955a9480 --- /dev/null +++ b/platform/visionos/platform_visionos_builders.py @@ -0,0 +1,7 @@ +"""Functions used to generate source files during build time""" + +from platform_methods import generate_bundle_apple_embedded + + +def generate_bundle(target, source, env): + generate_bundle_apple_embedded("visionos", "xros-arm64", "xros-arm64-simulator", False, target, source, env) diff --git a/platform/visionos/visionos.h b/platform/visionos/visionos.h new file mode 100644 index 00000000000..beed15809be --- /dev/null +++ b/platform/visionos/visionos.h @@ -0,0 +1,37 @@ +/**************************************************************************/ +/* visionos.h */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#pragma once + +#include "drivers/apple_embedded/apple_embedded.h" + +class visionOS : public AppleEmbedded { + GDCLASS(visionOS, AppleEmbedded); +}; diff --git a/servers/rendering/renderer_rd/cluster_builder_rd.h b/servers/rendering/renderer_rd/cluster_builder_rd.h index 3f3d1a3be6e..c2c423cc0f5 100644 --- a/servers/rendering/renderer_rd/cluster_builder_rd.h +++ b/servers/rendering/renderer_rd/cluster_builder_rd.h @@ -184,8 +184,8 @@ private: }; uint32_t cluster_size = 32; -#if defined(MACOS_ENABLED) || defined(IOS_ENABLED) - // Results in visual artifacts on macOS and iOS when using MSAA and subgroups. +#if defined(MACOS_ENABLED) || defined(APPLE_EMBEDDED_ENABLED) + // Results in visual artifacts on macOS and iOS/visionOS when using MSAA and subgroups. // Using subgroups and disabling MSAA is the optimal solution for now and also works // with MoltenVK. bool use_msaa = false; diff --git a/servers/rendering/renderer_rd/effects/metal_fx.h b/servers/rendering/renderer_rd/effects/metal_fx.h index 341ecd1f4bd..8f16dc41c52 100644 --- a/servers/rendering/renderer_rd/effects/metal_fx.h +++ b/servers/rendering/renderer_rd/effects/metal_fx.h @@ -30,6 +30,10 @@ #pragma once +#if defined(METAL_ENABLED) && !defined(VISIONOS_ENABLED) +#define METAL_MFXTEMPORAL_ENABLED +#endif + #ifdef METAL_ENABLED #include "spatial_upscaler.h" @@ -92,6 +96,8 @@ public: ~MFXSpatialEffect(); }; +#ifdef METAL_MFXTEMPORAL_ENABLED + struct MFXTemporalContext { #ifdef __OBJC__ id scaler = nullptr; @@ -174,6 +180,8 @@ public: void process(MFXTemporalContext *p_ctx, Params p_params); }; +#endif + } //namespace RendererRD #endif // METAL_ENABLED diff --git a/servers/rendering/renderer_rd/effects/metal_fx.mm b/servers/rendering/renderer_rd/effects/metal_fx.mm index c3c81937229..0f6152d5261 100644 --- a/servers/rendering/renderer_rd/effects/metal_fx.mm +++ b/servers/rendering/renderer_rd/effects/metal_fx.mm @@ -123,6 +123,8 @@ MFXSpatialContext *MFXSpatialEffect::create_context(CreateParams p_params) const return context; } +#ifdef METAL_MFXTEMPORAL_ENABLED + #pragma mark - Temporal Scaler MFXTemporalContext::~MFXTemporalContext() {} @@ -219,3 +221,5 @@ void MFXTemporalEffect::callback(RDD *p_driver, RDD::CommandBufferID p_command_b GODOT_CLANG_WARNING_POP } + +#endif diff --git a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp index dfb352f91c6..2d7718da59a 100644 --- a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp +++ b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp @@ -88,7 +88,7 @@ void RenderForwardClustered::RenderBufferDataForwardClustered::ensure_fsr2(Rende } } -#ifdef METAL_ENABLED +#ifdef METAL_MFXTEMPORAL_ENABLED bool RenderForwardClustered::RenderBufferDataForwardClustered::ensure_mfx_temporal(RendererRD::MFXTemporalEffect *p_effect) { if (mfx_temporal_context == nullptr) { RendererRD::MFXTemporalEffect::CreateParams params; @@ -127,7 +127,7 @@ void RenderForwardClustered::RenderBufferDataForwardClustered::free_data() { fsr2_context = nullptr; } -#ifdef METAL_ENABLED +#ifdef METAL_MFXTEMPORAL_ENABLED if (mfx_temporal_context) { memdelete(mfx_temporal_context); mfx_temporal_context = nullptr; @@ -1730,7 +1730,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co scale_type = SCALE_FSR2; break; case RS::VIEWPORT_SCALING_3D_MODE_METALFX_TEMPORAL: -#ifdef METAL_ENABLED +#ifdef METAL_MFXTEMPORAL_ENABLED scale_type = SCALE_MFX; #else scale_type = SCALE_NONE; @@ -2444,7 +2444,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co RD::get_singleton()->draw_command_end_label(); } else if (scale_type == SCALE_MFX) { -#ifdef METAL_ENABLED +#ifdef METAL_MFXTEMPORAL_ENABLED bool reset = rb_data->ensure_mfx_temporal(mfx_temporal_effect); RID exposure; @@ -5005,7 +5005,7 @@ RenderForwardClustered::RenderForwardClustered() { taa = memnew(RendererRD::TAA); fsr2_effect = memnew(RendererRD::FSR2Effect); ss_effects = memnew(RendererRD::SSEffects); -#ifdef METAL_ENABLED +#ifdef METAL_MFXTEMPORAL_ENABLED motion_vectors_store = memnew(RendererRD::MotionVectorsStore); mfx_temporal_effect = memnew(RendererRD::MFXTemporalEffect); #endif @@ -5027,7 +5027,7 @@ RenderForwardClustered::~RenderForwardClustered() { fsr2_effect = nullptr; } -#ifdef METAL_ENABLED +#ifdef METAL_MFXTEMPORAL_ENABLED if (mfx_temporal_effect) { memdelete(mfx_temporal_effect); mfx_temporal_effect = nullptr; diff --git a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h index 0ee21ad2252..9f5127d0492 100644 --- a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h +++ b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h @@ -95,7 +95,7 @@ public: private: RenderSceneBuffersRD *render_buffers = nullptr; RendererRD::FSR2Context *fsr2_context = nullptr; -#ifdef METAL_ENABLED +#ifdef METAL_MFXTEMPORAL_ENABLED RendererRD::MFXTemporalContext *mfx_temporal_context = nullptr; #endif @@ -141,7 +141,7 @@ public: void ensure_fsr2(RendererRD::FSR2Effect *p_effect); RendererRD::FSR2Context *get_fsr2_context() const { return fsr2_context; } -#ifdef METAL_ENABLED +#ifdef METAL_MFXTEMPORAL_ENABLED bool ensure_mfx_temporal(RendererRD::MFXTemporalEffect *p_effect); RendererRD::MFXTemporalContext *get_mfx_temporal_context() const { return mfx_temporal_context; } #endif @@ -719,7 +719,7 @@ private: RendererRD::FSR2Effect *fsr2_effect = nullptr; RendererRD::SSEffects *ss_effects = nullptr; -#ifdef METAL_ENABLED +#ifdef METAL_MFXTEMPORAL_ENABLED RendererRD::MFXTemporalEffect *mfx_temporal_effect = nullptr; #endif RendererRD::MotionVectorsStore *motion_vectors_store = nullptr;