mirror of
https://github.com/GayPizzaSpecifications/voxelotl-engine.git
synced 2025-08-02 13:00:53 +00:00
Official iOS/iPadOS/visionOS/tvOS support
This commit is contained in:
parent
788cd28994
commit
224bb6616c
@ -53,7 +53,9 @@ public class Application {
|
|||||||
view = SDL_Metal_CreateView(window)
|
view = SDL_Metal_CreateView(window)
|
||||||
do {
|
do {
|
||||||
let layer = unsafeBitCast(SDL_Metal_GetLayer(view), to: CAMetalLayer.self)
|
let layer = unsafeBitCast(SDL_Metal_GetLayer(view), to: CAMetalLayer.self)
|
||||||
|
#if os(macOS)
|
||||||
layer.displaySyncEnabled = cfg.vsyncMode == .off ? false : true
|
layer.displaySyncEnabled = cfg.vsyncMode == .off ? false : true
|
||||||
|
#endif
|
||||||
self.renderer = try Renderer(layer: layer, size: Size<Int>(backBuffer))
|
self.renderer = try Renderer(layer: layer, size: Size<Int>(backBuffer))
|
||||||
} catch RendererError.initFailure(let message) {
|
} catch RendererError.initFailure(let message) {
|
||||||
printErr("Renderer init error: \(message)")
|
printErr("Renderer init error: \(message)")
|
||||||
|
Binary file not shown.
After Width: | Height: | Size: 672 KiB |
Binary file not shown.
After Width: | Height: | Size: 672 KiB |
Binary file not shown.
After Width: | Height: | Size: 672 KiB |
@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "AppIconMobile1024x1024.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"platform" : "ios",
|
||||||
|
"size" : "1024x1024"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appearances" : [
|
||||||
|
{
|
||||||
|
"appearance" : "luminosity",
|
||||||
|
"value" : "dark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"filename" : "AppIconMobile1024x1024 1.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"platform" : "ios",
|
||||||
|
"size" : "1024x1024"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appearances" : [
|
||||||
|
{
|
||||||
|
"appearance" : "luminosity",
|
||||||
|
"value" : "tinted"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"filename" : "AppIconMobile1024x1024 2.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"platform" : "ios",
|
||||||
|
"size" : "1024x1024"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
@ -80,6 +80,15 @@ set_source_files_properties(
|
|||||||
target_include_directories(Voxelotl PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}")
|
target_include_directories(Voxelotl PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||||
target_link_libraries(Voxelotl PRIVATE SDLSwift)
|
target_link_libraries(Voxelotl PRIVATE SDLSwift)
|
||||||
target_compile_definitions(Voxelotl PRIVATE $<$<CONFIG:Debug>:DEBUG>)
|
target_compile_definitions(Voxelotl PRIVATE $<$<CONFIG:Debug>:DEBUG>)
|
||||||
|
|
||||||
|
if(VOXELOTL_MOBILE_ENABLED)
|
||||||
|
set(VOXELOTL_APPICON "AppIconMobile")
|
||||||
|
set(VOXELOTL_RPATH "@loader_path/Frameworks")
|
||||||
|
else()
|
||||||
|
set(VOXELOTL_APPICON "AppIcon")
|
||||||
|
set(VOXELOTL_RPATH "@loader_path/../Frameworks")
|
||||||
|
endif()
|
||||||
|
|
||||||
set_target_properties(Voxelotl PROPERTIES
|
set_target_properties(Voxelotl PROPERTIES
|
||||||
XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME YES
|
XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME YES
|
||||||
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "gay.pizza.voxelotl"
|
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "gay.pizza.voxelotl"
|
||||||
@ -91,8 +100,8 @@ set_target_properties(Voxelotl PROPERTIES
|
|||||||
MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION}"
|
MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION}"
|
||||||
MACOSX_BUNDLE_GUI_IDENTIFIER "gay.pizza.voxelotl"
|
MACOSX_BUNDLE_GUI_IDENTIFIER "gay.pizza.voxelotl"
|
||||||
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in"
|
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in"
|
||||||
XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon"
|
XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME "${VOXELOTL_APPICON}"
|
||||||
BUILD_RPATH "@loader_path/../Frameworks"
|
BUILD_RPATH "${VOXELOTL_RPATH}"
|
||||||
XCODE_ATTRIBUTE_SKIP_INSTALL "NO"
|
XCODE_ATTRIBUTE_SKIP_INSTALL "NO"
|
||||||
XCODE_ATTRIBUTE_INSTALL_PATH "$(LOCAL_APPS_DIR)"
|
XCODE_ATTRIBUTE_INSTALL_PATH "$(LOCAL_APPS_DIR)"
|
||||||
XCODE_GENERATE_SCHEME ON
|
XCODE_GENERATE_SCHEME ON
|
||||||
@ -100,6 +109,14 @@ set_target_properties(Voxelotl PROPERTIES
|
|||||||
XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_CURRENT_SOURCE_DIR}/Voxelotl.entitlements"
|
XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_CURRENT_SOURCE_DIR}/Voxelotl.entitlements"
|
||||||
MACOSX_BUNDLE_COPYRIGHT "© 2024 Gay Pizza Specifications")
|
MACOSX_BUNDLE_COPYRIGHT "© 2024 Gay Pizza Specifications")
|
||||||
|
|
||||||
|
if(VOXELOTL_MOBILE_ENABLED)
|
||||||
|
set_target_properties(Voxelotl PROPERTIES
|
||||||
|
XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "YES"
|
||||||
|
XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED "YES"
|
||||||
|
XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
set_source_files_properties(Assets.xcassets PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
|
set_source_files_properties(Assets.xcassets PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
|
||||||
set_source_files_properties(module.modulemap PROPERTIES MACOSX_PACKAGE_LOCATION Modules)
|
set_source_files_properties(module.modulemap PROPERTIES MACOSX_PACKAGE_LOCATION Modules)
|
||||||
set_source_files_properties(test.png PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
|
set_source_files_properties(test.png PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
|
||||||
|
@ -52,7 +52,7 @@ public struct AABB {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public extension AABB {
|
public extension AABB {
|
||||||
public static func + (lhs: Self, rhs: SIMD3<Float>) -> Self {
|
static func + (lhs: Self, rhs: SIMD3<Float>) -> Self {
|
||||||
.init(bounds: lhs._bounds + .init(rhs, rhs))
|
.init(bounds: lhs._bounds + .init(rhs, rhs))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,12 +40,16 @@ public class Renderer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fileprivate static func createMetalDevice() -> MTLDevice? {
|
fileprivate static func createMetalDevice() -> MTLDevice? {
|
||||||
|
#if os(macOS)
|
||||||
MTLCopyAllDevices().reduce(nil, { best, dev in
|
MTLCopyAllDevices().reduce(nil, { best, dev in
|
||||||
if best == nil { dev }
|
if best == nil { dev }
|
||||||
else if !best!.isLowPower || dev.isLowPower { best }
|
else if !best!.isLowPower || dev.isLowPower { best }
|
||||||
else if best!.supportsRaytracing || !dev.supportsRaytracing { best }
|
else if best!.supportsRaytracing || !dev.supportsRaytracing { best }
|
||||||
else { dev }
|
else { dev }
|
||||||
})
|
})
|
||||||
|
#else
|
||||||
|
MTLCreateSystemDefaultDevice()
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
internal init(layer metalLayer: CAMetalLayer, size: Size<Int>) throws {
|
internal init(layer metalLayer: CAMetalLayer, size: Size<Int>) throws {
|
||||||
@ -56,6 +60,7 @@ public class Renderer {
|
|||||||
throw RendererError.initFailure("Failed to create Metal device")
|
throw RendererError.initFailure("Failed to create Metal device")
|
||||||
}
|
}
|
||||||
self.device = device
|
self.device = device
|
||||||
|
#if os(macOS)
|
||||||
self._defaultStorageMode = if #available(macOS 100.100, iOS 12.0, *) {
|
self._defaultStorageMode = if #available(macOS 100.100, iOS 12.0, *) {
|
||||||
.storageModeShared
|
.storageModeShared
|
||||||
} else if #available(macOS 10.15, iOS 13.0, *) {
|
} else if #available(macOS 10.15, iOS 13.0, *) {
|
||||||
@ -64,6 +69,9 @@ public class Renderer {
|
|||||||
// https://developer.apple.com/documentation/metal/gpu_devices_and_work_submission/multi-gpu_systems/finding_multiple_gpus_on_an_intel-based_mac#3030770
|
// https://developer.apple.com/documentation/metal/gpu_devices_and_work_submission/multi-gpu_systems/finding_multiple_gpus_on_an_intel-based_mac#3030770
|
||||||
(self.device.isLowPower && !self.device.isRemovable) ? .storageModeShared : .storageModeManaged
|
(self.device.isLowPower && !self.device.isRemovable) ? .storageModeShared : .storageModeManaged
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
self._defaultStorageMode = .storageModeShared
|
||||||
|
#endif
|
||||||
|
|
||||||
layer.device = device
|
layer.device = device
|
||||||
layer.pixelFormat = colorFormat
|
layer.pixelFormat = colorFormat
|
||||||
|
@ -1,4 +1,9 @@
|
|||||||
|
#if os(macOS)
|
||||||
import AppKit
|
import AppKit
|
||||||
|
#else
|
||||||
|
import UIKit
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
struct NSImageLoader {
|
struct NSImageLoader {
|
||||||
private static let flipVertically = true
|
private static let flipVertically = true
|
||||||
@ -6,11 +11,19 @@ struct NSImageLoader {
|
|||||||
static func open(url: URL) throws -> Image2D {
|
static func open(url: URL) throws -> Image2D {
|
||||||
try autoreleasepool {
|
try autoreleasepool {
|
||||||
// Open as a CoreGraphics image
|
// Open as a CoreGraphics image
|
||||||
|
#if os(macOS)
|
||||||
guard let nsImage = NSImage(contentsOf: url),
|
guard let nsImage = NSImage(contentsOf: url),
|
||||||
let cgImage = nsImage.cgImage(forProposedRect: nil, context: nil, hints: nil)
|
let cgImage = nsImage.cgImage(forProposedRect: nil, context: nil, hints: nil)
|
||||||
else {
|
else {
|
||||||
throw ImageLoaderError.openFailed("Failed to open image \"\(url.absoluteString)\"")
|
throw ImageLoaderError.openFailed("Failed to open image \"\(url.absoluteString)\"")
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
guard let nsImage = UIImage(contentsOfFile: url.path(percentEncoded: false)),
|
||||||
|
let cgImage = nsImage.cgImage
|
||||||
|
else {
|
||||||
|
throw ImageLoaderError.openFailed("Failed to open image \"\(url.absoluteString)\"")
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Convert 8-bit ARGB (sRGB) w/ pre-multiplied alpha
|
// Convert 8-bit ARGB (sRGB) w/ pre-multiplied alpha
|
||||||
let alphaInfo = cgImage.alphaInfo == .none
|
let alphaInfo = cgImage.alphaInfo == .none
|
||||||
|
1147
cmake/toolchains/ios.toolchain.cmake
Normal file
1147
cmake/toolchains/ios.toolchain.cmake
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user