diff --git a/.gitignore b/.gitignore index 847f56d..692201a 100644 --- a/.gitignore +++ b/.gitignore @@ -31,4 +31,13 @@ *.out *.app -scenes/ \ No newline at end of file +scenes/ + +apps/apple/VulkanSplatting/shaders.h +apps/apple/MoltenVK +apps/apple/VulkanSplatting/ThirdParty + +# xcuserdata under any directory is ignored +xcuserdata/ + +project.xcconfig \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 186ce16..5580987 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -78,18 +78,7 @@ else () add_compile_definitions(NDEBUG) endif () +add_compile_definitions(VKGS_ENABLE_GLFW) + add_subdirectory(src) -add_subdirectory(apps) - -#add_custom_target( -# Shaders -# DEPENDS ${SPIRV_BINARY_FILES} ${SHADER_HEADER} -#) -#include_directories(${PROJECT_BINARY_DIR}/shaders) - -#add_custom_command(TARGET vulkan_splatting POST_BUILD -# COMMAND ${CMAKE_COMMAND} -E make_directory "$/shaders/" -# COMMAND ${CMAKE_COMMAND} -E copy_directory -# "${PROJECT_BINARY_DIR}/shaders" -# "$/shaders" -#) +add_subdirectory(apps) \ No newline at end of file diff --git a/README.md b/README.md index 13c497e..79df9e0 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,12 @@ cmake -DCMAKE_BUILD_TYPE=Release -DVULKAN_SDK=\INSTALL\LOCATION\OF\YOUR\SDK -S . After installing the Vulkan SDK, please proceed with CMake configuration and build steps as usual. +### iOS, iPadOS, visionOS +1. Make sure that the Vulkan SDK is installed +2. Run the `xcode_setup` CMake target +3. Set your development team id in `project.xcconfig` +4. Profit + ## TODO - [x] Better controls and GUI on GLFW diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt index 41047f8..763e91e 100644 --- a/apps/CMakeLists.txt +++ b/apps/CMakeLists.txt @@ -1,3 +1,4 @@ cmake_minimum_required(VERSION 3.26) -add_subdirectory(viewer) \ No newline at end of file +add_subdirectory(viewer) +add_subdirectory(apple) \ No newline at end of file diff --git a/apps/apple/CMakeLists.txt b/apps/apple/CMakeLists.txt new file mode 100644 index 0000000..a481e9c --- /dev/null +++ b/apps/apple/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.26) + +set(XCODE_THIRDPARTY_DIR ${CMAKE_SOURCE_DIR}/apps/apple/VulkanSplatting/ThirdParty) + +add_custom_target(xcode_thirdparty DEPENDS ${XCODE_THIRDPARTY_DIR}) + +add_custom_command(OUTPUT ${XCODE_THIRDPARTY_DIR} + COMMAND ${CMAKE_COMMAND} -E make_directory ${XCODE_THIRDPARTY_DIR} + COMMAND ${CMAKE_COMMAND} -E copy_directory ${glm_SOURCE_DIR} ${XCODE_THIRDPARTY_DIR}/glm +) + +add_custom_target(xcode_setup DEPENDS xcode_thirdparty xcode_shaders) \ No newline at end of file diff --git a/apps/apple/VulkanSplatting.xcworkspace/contents.xcworkspacedata b/apps/apple/VulkanSplatting.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..5f494d7 --- /dev/null +++ b/apps/apple/VulkanSplatting.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/apps/apple/VulkanSplatting.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/apps/apple/VulkanSplatting.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/apps/apple/VulkanSplatting.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/apps/apple/VulkanSplatting/VulkanSplatting-Bridging-Header.h b/apps/apple/VulkanSplatting/VulkanSplatting-Bridging-Header.h new file mode 100644 index 0000000..a1270bc --- /dev/null +++ b/apps/apple/VulkanSplatting/VulkanSplatting-Bridging-Header.h @@ -0,0 +1,37 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// + +#include "VulkanSplatting.h" +#include +#include + +static VulkanSplatting *_instance = nullptr; + +void vkgs_initialize(VulkanSplatting::RendererConfiguration config) { + _instance = new VulkanSplatting(config); +// try { + _instance->initialize(); +// } catch (const std::exception& e) { +// // print error +// std::cerr << e.what() << std::endl; +// } +} + +void vkgs_draw() { + _instance->draw(); +} + +void vkgs_pan_translation(float x, float y) { + _instance->logTranslation(x, y); +} + +void vkgs_movement(float x, float y, float z) { + _instance->logMovement(x, y, z); +} + +void vkgs_cleanup() { + _instance->stop(); + delete _instance; + _instance = nullptr; +} diff --git a/apps/apple/VulkanSplatting/VulkanSplatting.xcodeproj/project.pbxproj b/apps/apple/VulkanSplatting/VulkanSplatting.xcodeproj/project.pbxproj new file mode 100644 index 0000000..877ca64 --- /dev/null +++ b/apps/apple/VulkanSplatting/VulkanSplatting.xcodeproj/project.pbxproj @@ -0,0 +1,1490 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + B027E0EE2BA6B63B00BDA43F /* SplashScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B027E0ED2BA6B63B00BDA43F /* SplashScreenView.swift */; }; + B0608E442BA54D8E00CE9114 /* DummyImguiManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B0608E432BA54D8E00CE9114 /* DummyImguiManager.cpp */; }; + B0608E4B2BA5522500CE9114 /* MetalWindow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B0608E472BA5522500CE9114 /* MetalWindow.cpp */; }; + B0608E4F2BA55BBB00CE9114 /* VulkanSplatting.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B0608E4E2BA55BBB00CE9114 /* VulkanSplatting.cpp */; }; + B0EA8A512BA2FDC7003B92F7 /* VulkanSplattingApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0EA8A502BA2FDC7003B92F7 /* VulkanSplattingApp.swift */; }; + B0EA8A532BA2FDC7003B92F7 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0EA8A522BA2FDC7003B92F7 /* ContentView.swift */; }; + B0EA8A552BA2FDC9003B92F7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B0EA8A542BA2FDC9003B92F7 /* Assets.xcassets */; }; + B0EA8A582BA2FDC9003B92F7 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B0EA8A572BA2FDC9003B92F7 /* Preview Assets.xcassets */; }; + B0EA8AAB2BA302E6003B92F7 /* GSScene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B0EA8A772BA302E6003B92F7 /* GSScene.cpp */; }; + B0EA8AAD2BA302E6003B92F7 /* Renderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B0EA8A7B2BA302E6003B92F7 /* Renderer.cpp */; }; + B0EA8ABC2BA302E6003B92F7 /* Utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B0EA8A942BA302E6003B92F7 /* Utils.cpp */; }; + B0EA8ABE2BA302E6003B92F7 /* Pipeline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B0EA8A9D2BA302E6003B92F7 /* Pipeline.cpp */; }; + B0EA8ABF2BA302E6003B92F7 /* ComputePipeline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B0EA8A9E2BA302E6003B92F7 /* ComputePipeline.cpp */; }; + B0EA8AC02BA302E6003B92F7 /* DescriptorSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B0EA8AA12BA302E6003B92F7 /* DescriptorSet.cpp */; }; + B0EA8AC12BA302E6003B92F7 /* Shader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B0EA8AA22BA302E6003B92F7 /* Shader.cpp */; }; + B0EA8AC22BA302E6003B92F7 /* Buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B0EA8AA32BA302E6003B92F7 /* Buffer.cpp */; }; + B0EA8AC32BA302E6003B92F7 /* Swapchain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B0EA8AA42BA302E6003B92F7 /* Swapchain.cpp */; }; + B0EA8AC42BA302E6003B92F7 /* VMA.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B0EA8AA62BA302E6003B92F7 /* VMA.cpp */; }; + B0EA8AC52BA302E6003B92F7 /* QueryManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B0EA8AA72BA302E6003B92F7 /* QueryManager.cpp */; }; + B0EA8AC62BA302E6003B92F7 /* VulkanContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B0EA8AA92BA302E6003B92F7 /* VulkanContext.cpp */; }; + B0EA8DC62BA30916003B92F7 /* MoltenVK.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = B0EA8DC52BA30916003B92F7 /* MoltenVK.xcframework */; }; + B0EA8DC72BA30916003B92F7 /* MoltenVK.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B0EA8DC52BA30916003B92F7 /* MoltenVK.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + B0EA91F02BA30CEE003B92F7 /* glm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B0EA90FD2BA30CED003B92F7 /* glm.cpp */; }; + B0EA924C2BA30EA2003B92F7 /* DummyGUIManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B0EA924B2BA30EA2003B92F7 /* DummyGUIManager.cpp */; }; + B0EA92502BA31662003B92F7 /* VulkanController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0EA924F2BA31662003B92F7 /* VulkanController.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + B0EA8DC82BA30916003B92F7 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + B0EA8DC72BA30916003B92F7 /* MoltenVK.xcframework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + B027E0ED2BA6B63B00BDA43F /* SplashScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashScreenView.swift; sourceTree = ""; }; + B0608E432BA54D8E00CE9114 /* DummyImguiManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DummyImguiManager.cpp; path = VulkanSplatting/DummyImguiManager.cpp; sourceTree = SOURCE_ROOT; }; + B0608E472BA5522500CE9114 /* MetalWindow.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MetalWindow.cpp; sourceTree = ""; }; + B0608E482BA5522500CE9114 /* MetalWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MetalWindow.h; sourceTree = ""; }; + B0608E4D2BA5557A00CE9114 /* Window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Window.h; sourceTree = ""; }; + B0608E4E2BA55BBB00CE9114 /* VulkanSplatting.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = VulkanSplatting.cpp; path = ../../../src/VulkanSplatting.cpp; sourceTree = ""; }; + B0A860112BA56169008B0F4F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; + B0B7FB3C2BA7856600DA3A53 /* project.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = project.xcconfig; sourceTree = ""; }; + B0EA8A4D2BA2FDC7003B92F7 /* VulkanSplatting.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = VulkanSplatting.app; sourceTree = BUILT_PRODUCTS_DIR; }; + B0EA8A502BA2FDC7003B92F7 /* VulkanSplattingApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VulkanSplattingApp.swift; sourceTree = ""; }; + B0EA8A522BA2FDC7003B92F7 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + B0EA8A542BA2FDC9003B92F7 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + B0EA8A572BA2FDC9003B92F7 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + B0EA8A5F2BA30239003B92F7 /* VulkanSplatting-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "VulkanSplatting-Bridging-Header.h"; sourceTree = ""; }; + B0EA8A762BA302E6003B92F7 /* Renderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Renderer.h; path = ../../../src/Renderer.h; sourceTree = ""; }; + B0EA8A772BA302E6003B92F7 /* GSScene.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GSScene.cpp; path = ../../../src/GSScene.cpp; sourceTree = ""; }; + B0EA8A792BA302E6003B92F7 /* GUIManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GUIManager.h; path = ../../../src/GUIManager.h; sourceTree = ""; }; + B0EA8A7A2BA302E6003B92F7 /* GSScene.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GSScene.h; path = ../../../src/GSScene.h; sourceTree = ""; }; + B0EA8A7B2BA302E6003B92F7 /* Renderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Renderer.cpp; path = ../../../src/Renderer.cpp; sourceTree = ""; }; + B0EA8A842BA302E6003B92F7 /* vk_mem_alloc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vk_mem_alloc.h; sourceTree = ""; }; + B0EA8A852BA302E6003B92F7 /* vk_enum_string_helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vk_enum_string_helper.h; sourceTree = ""; }; + B0EA8A932BA302E6003B92F7 /* Utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Utils.h; sourceTree = ""; }; + B0EA8A942BA302E6003B92F7 /* Utils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Utils.cpp; sourceTree = ""; }; + B0EA8A952BA302E6003B92F7 /* Shader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Shader.h; sourceTree = ""; }; + B0EA8A962BA302E6003B92F7 /* VulkanContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VulkanContext.h; sourceTree = ""; }; + B0EA8A982BA302E6003B92F7 /* QueryManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QueryManager.h; sourceTree = ""; }; + B0EA8A992BA302E6003B92F7 /* Swapchain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Swapchain.h; sourceTree = ""; }; + B0EA8A9B2BA302E6003B92F7 /* ImguiManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImguiManager.h; sourceTree = ""; }; + B0EA8A9D2BA302E6003B92F7 /* Pipeline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Pipeline.cpp; sourceTree = ""; }; + B0EA8A9E2BA302E6003B92F7 /* ComputePipeline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ComputePipeline.cpp; sourceTree = ""; }; + B0EA8A9F2BA302E6003B92F7 /* ComputePipeline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ComputePipeline.h; sourceTree = ""; }; + B0EA8AA02BA302E6003B92F7 /* Pipeline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Pipeline.h; sourceTree = ""; }; + B0EA8AA12BA302E6003B92F7 /* DescriptorSet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DescriptorSet.cpp; sourceTree = ""; }; + B0EA8AA22BA302E6003B92F7 /* Shader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Shader.cpp; sourceTree = ""; }; + B0EA8AA32BA302E6003B92F7 /* Buffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Buffer.cpp; sourceTree = ""; }; + B0EA8AA42BA302E6003B92F7 /* Swapchain.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Swapchain.cpp; sourceTree = ""; }; + B0EA8AA52BA302E6003B92F7 /* Buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Buffer.h; sourceTree = ""; }; + B0EA8AA62BA302E6003B92F7 /* VMA.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VMA.cpp; sourceTree = ""; }; + B0EA8AA72BA302E6003B92F7 /* QueryManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = QueryManager.cpp; sourceTree = ""; }; + B0EA8AA82BA302E6003B92F7 /* DescriptorSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DescriptorSet.h; sourceTree = ""; }; + B0EA8AA92BA302E6003B92F7 /* VulkanContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VulkanContext.cpp; sourceTree = ""; }; + B0EA8AC82BA3034B003B92F7 /* VulkanSplatting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VulkanSplatting.h; path = ../../../include/vulkan_splatting/VulkanSplatting.h; sourceTree = ""; }; + B0EA8ACB2BA30665003B92F7 /* shaders.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shaders.h; sourceTree = ""; }; + B0EA8DC52BA30916003B92F7 /* MoltenVK.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = MoltenVK.xcframework; path = ../MoltenVK/dynamic/MoltenVK.xcframework; sourceTree = ""; }; + B0EA900A2BA30CED003B92F7 /* vec4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vec4.hpp; sourceTree = ""; }; + B0EA900B2BA30CED003B92F7 /* integer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = integer.hpp; sourceTree = ""; }; + B0EA900C2BA30CED003B92F7 /* vector_relational.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_relational.hpp; sourceTree = ""; }; + B0EA900D2BA30CED003B92F7 /* mat2x3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = mat2x3.hpp; sourceTree = ""; }; + B0EA900E2BA30CED003B92F7 /* mat4x4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = mat4x4.hpp; sourceTree = ""; }; + B0EA900F2BA30CED003B92F7 /* mat2x2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = mat2x2.hpp; sourceTree = ""; }; + B0EA90102BA30CED003B92F7 /* exponential.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = exponential.hpp; sourceTree = ""; }; + B0EA90112BA30CED003B92F7 /* vec2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vec2.hpp; sourceTree = ""; }; + B0EA90122BA30CED003B92F7 /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = ""; }; + B0EA90132BA30CED003B92F7 /* vec3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vec3.hpp; sourceTree = ""; }; + B0EA90142BA30CED003B92F7 /* fwd.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = fwd.hpp; sourceTree = ""; }; + B0EA90152BA30CED003B92F7 /* mat4x3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = mat4x3.hpp; sourceTree = ""; }; + B0EA90162BA30CED003B92F7 /* mat4x2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = mat4x2.hpp; sourceTree = ""; }; + B0EA90172BA30CED003B92F7 /* mat2x4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = mat2x4.hpp; sourceTree = ""; }; + B0EA90182BA30CED003B92F7 /* packing.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = packing.hpp; sourceTree = ""; }; + B0EA90192BA30CED003B92F7 /* mat3x3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = mat3x3.hpp; sourceTree = ""; }; + B0EA901A2BA30CED003B92F7 /* mat3x2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = mat3x2.hpp; sourceTree = ""; }; + B0EA901C2BA30CED003B92F7 /* matrix_double3x2_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_double3x2_precision.hpp; sourceTree = ""; }; + B0EA901D2BA30CED003B92F7 /* matrix_float2x4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_float2x4.hpp; sourceTree = ""; }; + B0EA901E2BA30CED003B92F7 /* vector_bool2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_bool2.hpp; sourceTree = ""; }; + B0EA901F2BA30CED003B92F7 /* quaternion_double_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = quaternion_double_precision.hpp; sourceTree = ""; }; + B0EA90202BA30CED003B92F7 /* matrix_float4x2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_float4x2.hpp; sourceTree = ""; }; + B0EA90212BA30CED003B92F7 /* scalar_packing.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = scalar_packing.inl; sourceTree = ""; }; + B0EA90222BA30CED003B92F7 /* matrix_float4x3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_float4x3.hpp; sourceTree = ""; }; + B0EA90232BA30CED003B92F7 /* vector_bool3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_bool3.hpp; sourceTree = ""; }; + B0EA90242BA30CED003B92F7 /* vector_relational.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_relational.hpp; sourceTree = ""; }; + B0EA90252BA30CED003B92F7 /* matrix_integer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_integer.hpp; sourceTree = ""; }; + B0EA90262BA30CED003B92F7 /* vector_uint1_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_uint1_sized.hpp; sourceTree = ""; }; + B0EA90272BA30CED003B92F7 /* vector_bool1.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_bool1.hpp; sourceTree = ""; }; + B0EA90282BA30CED003B92F7 /* quaternion_common.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = quaternion_common.inl; sourceTree = ""; }; + B0EA90292BA30CED003B92F7 /* matrix_int3x2_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_int3x2_sized.hpp; sourceTree = ""; }; + B0EA902A2BA30CED003B92F7 /* vector_float1_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_float1_precision.hpp; sourceTree = ""; }; + B0EA902B2BA30CED003B92F7 /* matrix_float2x3_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_float2x3_precision.hpp; sourceTree = ""; }; + B0EA902C2BA30CED003B92F7 /* vector_int2_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_int2_sized.hpp; sourceTree = ""; }; + B0EA902D2BA30CED003B92F7 /* matrix_float2x2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_float2x2.hpp; sourceTree = ""; }; + B0EA902E2BA30CED003B92F7 /* matrix_common.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_common.hpp; sourceTree = ""; }; + B0EA902F2BA30CED003B92F7 /* vector_bool4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_bool4.hpp; sourceTree = ""; }; + B0EA90302BA30CED003B92F7 /* matrix_float2x4_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_float2x4_precision.hpp; sourceTree = ""; }; + B0EA90312BA30CED003B92F7 /* _matrix_vectorize.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = _matrix_vectorize.hpp; sourceTree = ""; }; + B0EA90322BA30CED003B92F7 /* matrix_float4x4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_float4x4.hpp; sourceTree = ""; }; + B0EA90332BA30CED003B92F7 /* matrix_float2x3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_float2x3.hpp; sourceTree = ""; }; + B0EA90342BA30CED003B92F7 /* matrix_clip_space.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_clip_space.hpp; sourceTree = ""; }; + B0EA90352BA30CED003B92F7 /* scalar_integer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = scalar_integer.hpp; sourceTree = ""; }; + B0EA90362BA30CED003B92F7 /* vector_float2_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_float2_precision.hpp; sourceTree = ""; }; + B0EA90372BA30CED003B92F7 /* matrix_transform.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = matrix_transform.inl; sourceTree = ""; }; + B0EA90382BA30CED003B92F7 /* quaternion_exponential.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = quaternion_exponential.inl; sourceTree = ""; }; + B0EA90392BA30CED003B92F7 /* matrix_int3x4_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_int3x4_sized.hpp; sourceTree = ""; }; + B0EA903A2BA30CED003B92F7 /* scalar_common.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = scalar_common.hpp; sourceTree = ""; }; + B0EA903B2BA30CED003B92F7 /* vector_int4_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_int4_sized.hpp; sourceTree = ""; }; + B0EA903C2BA30CED003B92F7 /* matrix_uint3x3_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_uint3x3_sized.hpp; sourceTree = ""; }; + B0EA903D2BA30CED003B92F7 /* quaternion_transform.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = quaternion_transform.inl; sourceTree = ""; }; + B0EA903E2BA30CED003B92F7 /* vector_reciprocal.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = vector_reciprocal.inl; sourceTree = ""; }; + B0EA903F2BA30CED003B92F7 /* matrix_double4x2_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_double4x2_precision.hpp; sourceTree = ""; }; + B0EA90402BA30CED003B92F7 /* matrix_clip_space.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = matrix_clip_space.inl; sourceTree = ""; }; + B0EA90412BA30CED003B92F7 /* vector_double4_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_double4_precision.hpp; sourceTree = ""; }; + B0EA90422BA30CED003B92F7 /* matrix_float3x4_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_float3x4_precision.hpp; sourceTree = ""; }; + B0EA90432BA30CED003B92F7 /* scalar_integer.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = scalar_integer.inl; sourceTree = ""; }; + B0EA90442BA30CED003B92F7 /* vector_uint3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_uint3.hpp; sourceTree = ""; }; + B0EA90452BA30CED003B92F7 /* matrix_float4x3_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_float4x3_precision.hpp; sourceTree = ""; }; + B0EA90462BA30CED003B92F7 /* matrix_common.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = matrix_common.inl; sourceTree = ""; }; + B0EA90472BA30CED003B92F7 /* vector_uint2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_uint2.hpp; sourceTree = ""; }; + B0EA90482BA30CED003B92F7 /* quaternion_float_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = quaternion_float_precision.hpp; sourceTree = ""; }; + B0EA90492BA30CED003B92F7 /* vector_reciprocal.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_reciprocal.hpp; sourceTree = ""; }; + B0EA904A2BA30CED003B92F7 /* matrix_float3x4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_float3x4.hpp; sourceTree = ""; }; + B0EA904B2BA30CED003B92F7 /* quaternion_transform.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = quaternion_transform.hpp; sourceTree = ""; }; + B0EA904C2BA30CED003B92F7 /* matrix_uint3x4_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_uint3x4_sized.hpp; sourceTree = ""; }; + B0EA904D2BA30CED003B92F7 /* vector_bool4_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_bool4_precision.hpp; sourceTree = ""; }; + B0EA904E2BA30CED003B92F7 /* vector_int3_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_int3_sized.hpp; sourceTree = ""; }; + B0EA904F2BA30CED003B92F7 /* vector_uint1.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_uint1.hpp; sourceTree = ""; }; + B0EA90502BA30CED003B92F7 /* matrix_transform.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_transform.hpp; sourceTree = ""; }; + B0EA90512BA30CED003B92F7 /* matrix_int3x3_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_int3x3_sized.hpp; sourceTree = ""; }; + B0EA90522BA30CED003B92F7 /* scalar_common.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = scalar_common.inl; sourceTree = ""; }; + B0EA90532BA30CED003B92F7 /* quaternion_exponential.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = quaternion_exponential.hpp; sourceTree = ""; }; + B0EA90542BA30CED003B92F7 /* vector_relational.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = vector_relational.inl; sourceTree = ""; }; + B0EA90552BA30CED003B92F7 /* vector_bool3_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_bool3_precision.hpp; sourceTree = ""; }; + B0EA90562BA30CED003B92F7 /* matrix_integer.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = matrix_integer.inl; sourceTree = ""; }; + B0EA90572BA30CED003B92F7 /* matrix_double2x2_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_double2x2_precision.hpp; sourceTree = ""; }; + B0EA90582BA30CED003B92F7 /* scalar_packing.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = scalar_packing.hpp; sourceTree = ""; }; + B0EA90592BA30CED003B92F7 /* quaternion_float.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = quaternion_float.hpp; sourceTree = ""; }; + B0EA905A2BA30CED003B92F7 /* vector_uint4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_uint4.hpp; sourceTree = ""; }; + B0EA905B2BA30CED003B92F7 /* matrix_float3x2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_float3x2.hpp; sourceTree = ""; }; + B0EA905C2BA30CED003B92F7 /* vector_double3_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_double3_precision.hpp; sourceTree = ""; }; + B0EA905D2BA30CED003B92F7 /* quaternion_common.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = quaternion_common.hpp; sourceTree = ""; }; + B0EA905E2BA30CED003B92F7 /* matrix_float3x3_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_float3x3_precision.hpp; sourceTree = ""; }; + B0EA905F2BA30CED003B92F7 /* matrix_float3x3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_float3x3.hpp; sourceTree = ""; }; + B0EA90602BA30CED003B92F7 /* scalar_int_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = scalar_int_sized.hpp; sourceTree = ""; }; + B0EA90612BA30CED003B92F7 /* matrix_uint3x2_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_uint3x2_sized.hpp; sourceTree = ""; }; + B0EA90622BA30CED003B92F7 /* matrix_float4x4_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_float4x4_precision.hpp; sourceTree = ""; }; + B0EA90632BA30CED003B92F7 /* matrix_double4x2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_double4x2.hpp; sourceTree = ""; }; + B0EA90642BA30CED003B92F7 /* matrix_uint2x3_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_uint2x3_sized.hpp; sourceTree = ""; }; + B0EA90652BA30CED003B92F7 /* matrix_int2x2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_int2x2.hpp; sourceTree = ""; }; + B0EA90662BA30CED003B92F7 /* vector_int1.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_int1.hpp; sourceTree = ""; }; + B0EA90672BA30CED003B92F7 /* matrix_int4x4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_int4x4.hpp; sourceTree = ""; }; + B0EA90682BA30CED003B92F7 /* vector_float3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_float3.hpp; sourceTree = ""; }; + B0EA90692BA30CED003B92F7 /* matrix_double2x4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_double2x4.hpp; sourceTree = ""; }; + B0EA906A2BA30CED003B92F7 /* scalar_ulp.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = scalar_ulp.hpp; sourceTree = ""; }; + B0EA906B2BA30CED003B92F7 /* quaternion_geometric.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = quaternion_geometric.hpp; sourceTree = ""; }; + B0EA906C2BA30CED003B92F7 /* matrix_int2x4_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_int2x4_sized.hpp; sourceTree = ""; }; + B0EA906D2BA30CED003B92F7 /* vector_float2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_float2.hpp; sourceTree = ""; }; + B0EA906E2BA30CED003B92F7 /* matrix_double2x3_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_double2x3_precision.hpp; sourceTree = ""; }; + B0EA906F2BA30CED003B92F7 /* matrix_uint4x2_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_uint4x2_sized.hpp; sourceTree = ""; }; + B0EA90702BA30CED003B92F7 /* matrix_int2x3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_int2x3.hpp; sourceTree = ""; }; + B0EA90712BA30CED003B92F7 /* vector_bool2_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_bool2_precision.hpp; sourceTree = ""; }; + B0EA90722BA30CED003B92F7 /* quaternion_double.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = quaternion_double.hpp; sourceTree = ""; }; + B0EA90732BA30CED003B92F7 /* matrix_double4x3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_double4x3.hpp; sourceTree = ""; }; + B0EA90742BA30CED003B92F7 /* matrix_uint3x2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_uint3x2.hpp; sourceTree = ""; }; + B0EA90752BA30CED003B92F7 /* quaternion_common_simd.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = quaternion_common_simd.inl; sourceTree = ""; }; + B0EA90762BA30CED003B92F7 /* vector_int2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_int2.hpp; sourceTree = ""; }; + B0EA90772BA30CED003B92F7 /* vector_double2_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_double2_precision.hpp; sourceTree = ""; }; + B0EA90782BA30CED003B92F7 /* matrix_float3x2_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_float3x2_precision.hpp; sourceTree = ""; }; + B0EA90792BA30CED003B92F7 /* matrix_relational.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_relational.hpp; sourceTree = ""; }; + B0EA907A2BA30CED003B92F7 /* vector_integer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_integer.hpp; sourceTree = ""; }; + B0EA907B2BA30CED003B92F7 /* scalar_relational.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = scalar_relational.hpp; sourceTree = ""; }; + B0EA907C2BA30CED003B92F7 /* vector_float1.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_float1.hpp; sourceTree = ""; }; + B0EA907D2BA30CED003B92F7 /* vector_uint3_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_uint3_sized.hpp; sourceTree = ""; }; + B0EA907E2BA30CED003B92F7 /* vector_int3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_int3.hpp; sourceTree = ""; }; + B0EA907F2BA30CED003B92F7 /* matrix_uint3x3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_uint3x3.hpp; sourceTree = ""; }; + B0EA90802BA30CED003B92F7 /* scalar_constants.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = scalar_constants.inl; sourceTree = ""; }; + B0EA90812BA30CED003B92F7 /* matrix_double4x4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_double4x4.hpp; sourceTree = ""; }; + B0EA90822BA30CED003B92F7 /* scalar_uint_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = scalar_uint_sized.hpp; sourceTree = ""; }; + B0EA90832BA30CED003B92F7 /* matrix_int2x4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_int2x4.hpp; sourceTree = ""; }; + B0EA90842BA30CED003B92F7 /* matrix_int2x2_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_int2x2_sized.hpp; sourceTree = ""; }; + B0EA90852BA30CED003B92F7 /* matrix_int4x2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_int4x2.hpp; sourceTree = ""; }; + B0EA90862BA30CED003B92F7 /* vector_double1_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_double1_precision.hpp; sourceTree = ""; }; + B0EA90872BA30CED003B92F7 /* matrix_double2x2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_double2x2.hpp; sourceTree = ""; }; + B0EA90882BA30CED003B92F7 /* matrix_uint4x4_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_uint4x4_sized.hpp; sourceTree = ""; }; + B0EA90892BA30CED003B92F7 /* scalar_reciprocal.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = scalar_reciprocal.inl; sourceTree = ""; }; + B0EA908A2BA30CED003B92F7 /* matrix_float4x2_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_float4x2_precision.hpp; sourceTree = ""; }; + B0EA908B2BA30CED003B92F7 /* matrix_double2x3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_double2x3.hpp; sourceTree = ""; }; + B0EA908C2BA30CED003B92F7 /* matrix_projection.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_projection.hpp; sourceTree = ""; }; + B0EA908D2BA30CED003B92F7 /* vector_float4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_float4.hpp; sourceTree = ""; }; + B0EA908E2BA30CED003B92F7 /* vector_common.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = vector_common.inl; sourceTree = ""; }; + B0EA908F2BA30CED003B92F7 /* matrix_int4x3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_int4x3.hpp; sourceTree = ""; }; + B0EA90902BA30CED003B92F7 /* matrix_int4x3_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_int4x3_sized.hpp; sourceTree = ""; }; + B0EA90912BA30CED003B92F7 /* matrix_double2x4_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_double2x4_precision.hpp; sourceTree = ""; }; + B0EA90922BA30CED003B92F7 /* matrix_uint3x4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_uint3x4.hpp; sourceTree = ""; }; + B0EA90932BA30CED003B92F7 /* vector_int4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_int4.hpp; sourceTree = ""; }; + B0EA90942BA30CED003B92F7 /* quaternion_relational.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = quaternion_relational.hpp; sourceTree = ""; }; + B0EA90952BA30CED003B92F7 /* quaternion_trigonometric.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = quaternion_trigonometric.hpp; sourceTree = ""; }; + B0EA90962BA30CED003B92F7 /* vector_bool1_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_bool1_precision.hpp; sourceTree = ""; }; + B0EA90972BA30CED003B92F7 /* vector_ulp.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_ulp.hpp; sourceTree = ""; }; + B0EA90982BA30CED003B92F7 /* vector_packing.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = vector_packing.inl; sourceTree = ""; }; + B0EA90992BA30CED003B92F7 /* vector_float3_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_float3_precision.hpp; sourceTree = ""; }; + B0EA909A2BA30CED003B92F7 /* matrix_uint4x4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_uint4x4.hpp; sourceTree = ""; }; + B0EA909B2BA30CED003B92F7 /* matrix_int4x4_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_int4x4_sized.hpp; sourceTree = ""; }; + B0EA909C2BA30CED003B92F7 /* matrix_uint2x2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_uint2x2.hpp; sourceTree = ""; }; + B0EA909D2BA30CED003B92F7 /* matrix_projection.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = matrix_projection.inl; sourceTree = ""; }; + B0EA909E2BA30CED003B92F7 /* scalar_reciprocal.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = scalar_reciprocal.hpp; sourceTree = ""; }; + B0EA909F2BA30CED003B92F7 /* vector_common.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_common.hpp; sourceTree = ""; }; + B0EA90A02BA30CED003B92F7 /* matrix_uint2x2_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_uint2x2_sized.hpp; sourceTree = ""; }; + B0EA90A12BA30CED003B92F7 /* matrix_uint4x3_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_uint4x3_sized.hpp; sourceTree = ""; }; + B0EA90A22BA30CED003B92F7 /* matrix_uint2x3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_uint2x3.hpp; sourceTree = ""; }; + B0EA90A32BA30CED003B92F7 /* scalar_constants.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = scalar_constants.hpp; sourceTree = ""; }; + B0EA90A42BA30CED003B92F7 /* matrix_double3x4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_double3x4.hpp; sourceTree = ""; }; + B0EA90A52BA30CED003B92F7 /* quaternion_trigonometric.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = quaternion_trigonometric.inl; sourceTree = ""; }; + B0EA90A62BA30CED003B92F7 /* matrix_double4x3_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_double4x3_precision.hpp; sourceTree = ""; }; + B0EA90A72BA30CED003B92F7 /* vector_ulp.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = vector_ulp.inl; sourceTree = ""; }; + B0EA90A82BA30CED003B92F7 /* vector_packing.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_packing.hpp; sourceTree = ""; }; + B0EA90A92BA30CED003B92F7 /* vector_int1_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_int1_sized.hpp; sourceTree = ""; }; + B0EA90AA2BA30CED003B92F7 /* matrix_int3x2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_int3x2.hpp; sourceTree = ""; }; + B0EA90AB2BA30CED003B92F7 /* matrix_double3x4_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_double3x4_precision.hpp; sourceTree = ""; }; + B0EA90AC2BA30CED003B92F7 /* quaternion_relational.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = quaternion_relational.inl; sourceTree = ""; }; + B0EA90AD2BA30CED003B92F7 /* vector_double4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_double4.hpp; sourceTree = ""; }; + B0EA90AE2BA30CED003B92F7 /* matrix_int3x3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_int3x3.hpp; sourceTree = ""; }; + B0EA90AF2BA30CED003B92F7 /* vector_uint2_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_uint2_sized.hpp; sourceTree = ""; }; + B0EA90B02BA30CED003B92F7 /* matrix_uint4x2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_uint4x2.hpp; sourceTree = ""; }; + B0EA90B12BA30CED003B92F7 /* matrix_uint2x4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_uint2x4.hpp; sourceTree = ""; }; + B0EA90B22BA30CED003B92F7 /* matrix_int2x3_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_int2x3_sized.hpp; sourceTree = ""; }; + B0EA90B32BA30CED003B92F7 /* matrix_int4x2_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_int4x2_sized.hpp; sourceTree = ""; }; + B0EA90B42BA30CED003B92F7 /* vector_double1.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_double1.hpp; sourceTree = ""; }; + B0EA90B52BA30CED003B92F7 /* matrix_double4x4_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_double4x4_precision.hpp; sourceTree = ""; }; + B0EA90B62BA30CED003B92F7 /* scalar_ulp.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = scalar_ulp.inl; sourceTree = ""; }; + B0EA90B72BA30CED003B92F7 /* quaternion_geometric.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = quaternion_geometric.inl; sourceTree = ""; }; + B0EA90B82BA30CED003B92F7 /* matrix_uint2x4_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_uint2x4_sized.hpp; sourceTree = ""; }; + B0EA90B92BA30CED003B92F7 /* matrix_uint4x3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_uint4x3.hpp; sourceTree = ""; }; + B0EA90BA2BA30CED003B92F7 /* matrix_double3x3_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_double3x3_precision.hpp; sourceTree = ""; }; + B0EA90BB2BA30CED003B92F7 /* matrix_double3x2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_double3x2.hpp; sourceTree = ""; }; + B0EA90BC2BA30CED003B92F7 /* matrix_float2x2_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_float2x2_precision.hpp; sourceTree = ""; }; + B0EA90BD2BA30CED003B92F7 /* vector_integer.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = vector_integer.inl; sourceTree = ""; }; + B0EA90BE2BA30CED003B92F7 /* scalar_relational.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = scalar_relational.inl; sourceTree = ""; }; + B0EA90BF2BA30CED003B92F7 /* matrix_int3x4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_int3x4.hpp; sourceTree = ""; }; + B0EA90C02BA30CED003B92F7 /* vector_uint4_sized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_uint4_sized.hpp; sourceTree = ""; }; + B0EA90C12BA30CED003B92F7 /* vector_double3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_double3.hpp; sourceTree = ""; }; + B0EA90C22BA30CED003B92F7 /* vector_float4_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_float4_precision.hpp; sourceTree = ""; }; + B0EA90C32BA30CED003B92F7 /* vector_double2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_double2.hpp; sourceTree = ""; }; + B0EA90C42BA30CED003B92F7 /* matrix_relational.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = matrix_relational.inl; sourceTree = ""; }; + B0EA90C52BA30CED003B92F7 /* matrix_double3x3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_double3x3.hpp; sourceTree = ""; }; + B0EA90C72BA30CED003B92F7 /* neon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = neon.h; sourceTree = ""; }; + B0EA90C82BA30CED003B92F7 /* vector_relational.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vector_relational.h; sourceTree = ""; }; + B0EA90C92BA30CED003B92F7 /* matrix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = matrix.h; sourceTree = ""; }; + B0EA90CA2BA30CED003B92F7 /* packing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = packing.h; sourceTree = ""; }; + B0EA90CB2BA30CED003B92F7 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; + B0EA90CC2BA30CED003B92F7 /* trigonometric.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = trigonometric.h; sourceTree = ""; }; + B0EA90CD2BA30CED003B92F7 /* geometric.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = geometric.h; sourceTree = ""; }; + B0EA90CE2BA30CED003B92F7 /* integer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = integer.h; sourceTree = ""; }; + B0EA90CF2BA30CED003B92F7 /* platform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform.h; sourceTree = ""; }; + B0EA90D02BA30CED003B92F7 /* exponential.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = exponential.h; sourceTree = ""; }; + B0EA90D12BA30CED003B92F7 /* mat3x4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = mat3x4.hpp; sourceTree = ""; }; + B0EA90D22BA30CED003B92F7 /* matrix.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix.hpp; sourceTree = ""; }; + B0EA90D32BA30CED003B92F7 /* glm.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = glm.hpp; sourceTree = ""; }; + B0EA90D42BA30CED003B92F7 /* trigonometric.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = trigonometric.hpp; sourceTree = ""; }; + B0EA90D52BA30CED003B92F7 /* geometric.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = geometric.hpp; sourceTree = ""; }; + B0EA90D72BA30CED003B92F7 /* func_exponential.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = func_exponential.inl; sourceTree = ""; }; + B0EA90D82BA30CED003B92F7 /* func_integer_simd.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = func_integer_simd.inl; sourceTree = ""; }; + B0EA90D92BA30CED003B92F7 /* func_vector_relational.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = func_vector_relational.inl; sourceTree = ""; }; + B0EA90DA2BA30CED003B92F7 /* func_packing.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = func_packing.inl; sourceTree = ""; }; + B0EA90DB2BA30CED003B92F7 /* _fixes.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = _fixes.hpp; sourceTree = ""; }; + B0EA90DC2BA30CED003B92F7 /* type_quat.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = type_quat.inl; sourceTree = ""; }; + B0EA90DD2BA30CED003B92F7 /* type_half.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = type_half.inl; sourceTree = ""; }; + B0EA90DE2BA30CED003B92F7 /* func_vector_relational_simd.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = func_vector_relational_simd.inl; sourceTree = ""; }; + B0EA90DF2BA30CED003B92F7 /* qualifier.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = qualifier.hpp; sourceTree = ""; }; + B0EA90E02BA30CED003B92F7 /* func_matrix_simd.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = func_matrix_simd.inl; sourceTree = ""; }; + B0EA90E12BA30CED003B92F7 /* _noise.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = _noise.hpp; sourceTree = ""; }; + B0EA90E22BA30CED003B92F7 /* type_half.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = type_half.hpp; sourceTree = ""; }; + B0EA90E32BA30CED003B92F7 /* _features.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = _features.hpp; sourceTree = ""; }; + B0EA90E42BA30CED003B92F7 /* func_integer.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = func_integer.inl; sourceTree = ""; }; + B0EA90E52BA30CED003B92F7 /* _vectorize.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = _vectorize.hpp; sourceTree = ""; }; + B0EA90E62BA30CED003B92F7 /* func_geometric.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = func_geometric.inl; sourceTree = ""; }; + B0EA90E72BA30CED003B92F7 /* type_quat.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = type_quat.hpp; sourceTree = ""; }; + B0EA90E82BA30CED003B92F7 /* func_common.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = func_common.inl; sourceTree = ""; }; + B0EA90E92BA30CED003B92F7 /* type_quat_simd.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = type_quat_simd.inl; sourceTree = ""; }; + B0EA90EA2BA30CED003B92F7 /* func_trigonometric.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = func_trigonometric.inl; sourceTree = ""; }; + B0EA90EB2BA30CED003B92F7 /* type_mat2x4.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = type_mat2x4.inl; sourceTree = ""; }; + B0EA90EC2BA30CED003B92F7 /* type_mat4x2.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = type_mat4x2.inl; sourceTree = ""; }; + B0EA90ED2BA30CED003B92F7 /* _swizzle.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = _swizzle.hpp; sourceTree = ""; }; + B0EA90EE2BA30CED003B92F7 /* type_mat4x3.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = type_mat4x3.inl; sourceTree = ""; }; + B0EA90EF2BA30CED003B92F7 /* func_packing_simd.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = func_packing_simd.inl; sourceTree = ""; }; + B0EA90F02BA30CED003B92F7 /* type_vec4.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = type_vec4.inl; sourceTree = ""; }; + B0EA90F12BA30CED003B92F7 /* func_trigonometric_simd.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = func_trigonometric_simd.inl; sourceTree = ""; }; + B0EA90F22BA30CED003B92F7 /* type_mat3x3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = type_mat3x3.hpp; sourceTree = ""; }; + B0EA90F32BA30CED003B92F7 /* type_mat3x2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = type_mat3x2.hpp; sourceTree = ""; }; + B0EA90F42BA30CED003B92F7 /* compute_common.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = compute_common.hpp; sourceTree = ""; }; + B0EA90F52BA30CED003B92F7 /* setup.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = setup.hpp; sourceTree = ""; }; + B0EA90F62BA30CED003B92F7 /* type_mat2x2.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = type_mat2x2.inl; sourceTree = ""; }; + B0EA90F72BA30CED003B92F7 /* type_vec1.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = type_vec1.inl; sourceTree = ""; }; + B0EA90F82BA30CED003B92F7 /* func_common_simd.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = func_common_simd.inl; sourceTree = ""; }; + B0EA90F92BA30CED003B92F7 /* type_mat4x4.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = type_mat4x4.inl; sourceTree = ""; }; + B0EA90FA2BA30CED003B92F7 /* func_geometric_simd.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = func_geometric_simd.inl; sourceTree = ""; }; + B0EA90FB2BA30CED003B92F7 /* type_mat2x3.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = type_mat2x3.inl; sourceTree = ""; }; + B0EA90FC2BA30CED003B92F7 /* type_vec2.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = type_vec2.inl; sourceTree = ""; }; + B0EA90FD2BA30CED003B92F7 /* glm.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = glm.cpp; sourceTree = ""; }; + B0EA90FE2BA30CED003B92F7 /* type_mat3x4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = type_mat3x4.hpp; sourceTree = ""; }; + B0EA90FF2BA30CED003B92F7 /* type_vec3.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = type_vec3.inl; sourceTree = ""; }; + B0EA91002BA30CED003B92F7 /* type_mat4x4_simd.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = type_mat4x4_simd.inl; sourceTree = ""; }; + B0EA91012BA30CED003B92F7 /* type_mat2x3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = type_mat2x3.hpp; sourceTree = ""; }; + B0EA91022BA30CED003B92F7 /* type_mat4x4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = type_mat4x4.hpp; sourceTree = ""; }; + B0EA91032BA30CED003B92F7 /* func_matrix.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = func_matrix.inl; sourceTree = ""; }; + B0EA91042BA30CED003B92F7 /* type_mat2x2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = type_mat2x2.hpp; sourceTree = ""; }; + B0EA91052BA30CED003B92F7 /* type_vec1.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = type_vec1.hpp; sourceTree = ""; }; + B0EA91062BA30CED003B92F7 /* _swizzle_func.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = _swizzle_func.hpp; sourceTree = ""; }; + B0EA91072BA30CED003B92F7 /* type_vec3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = type_vec3.hpp; sourceTree = ""; }; + B0EA91082BA30CED003B92F7 /* compute_vector_relational.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = compute_vector_relational.hpp; sourceTree = ""; }; + B0EA91092BA30CED003B92F7 /* type_vec4_simd.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = type_vec4_simd.inl; sourceTree = ""; }; + B0EA910A2BA30CED003B92F7 /* type_mat3x4.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = type_mat3x4.inl; sourceTree = ""; }; + B0EA910B2BA30CED003B92F7 /* func_exponential_simd.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = func_exponential_simd.inl; sourceTree = ""; }; + B0EA910C2BA30CED003B92F7 /* type_vec2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = type_vec2.hpp; sourceTree = ""; }; + B0EA910D2BA30CED003B92F7 /* type_mat4x3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = type_mat4x3.hpp; sourceTree = ""; }; + B0EA910E2BA30CED003B92F7 /* type_mat4x2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = type_mat4x2.hpp; sourceTree = ""; }; + B0EA910F2BA30CED003B92F7 /* type_float.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = type_float.hpp; sourceTree = ""; }; + B0EA91102BA30CED003B92F7 /* type_mat2x4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = type_mat2x4.hpp; sourceTree = ""; }; + B0EA91112BA30CED003B92F7 /* type_mat3x2.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = type_mat3x2.inl; sourceTree = ""; }; + B0EA91122BA30CED003B92F7 /* type_mat3x3.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = type_mat3x3.inl; sourceTree = ""; }; + B0EA91132BA30CED003B92F7 /* type_vec4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = type_vec4.hpp; sourceTree = ""; }; + B0EA91142BA30CED003B92F7 /* glm.cppm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = glm.cppm; sourceTree = ""; }; + B0EA91152BA30CED003B92F7 /* ext.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = ext.hpp; sourceTree = ""; }; + B0EA91172BA30CED003B92F7 /* integer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = integer.hpp; sourceTree = ""; }; + B0EA91182BA30CED003B92F7 /* matrix_integer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_integer.hpp; sourceTree = ""; }; + B0EA91192BA30CED003B92F7 /* matrix_inverse.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = matrix_inverse.inl; sourceTree = ""; }; + B0EA911A2BA30CED003B92F7 /* quaternion.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = quaternion.inl; sourceTree = ""; }; + B0EA911B2BA30CED003B92F7 /* packing.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = packing.inl; sourceTree = ""; }; + B0EA911C2BA30CED003B92F7 /* matrix_transform.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = matrix_transform.inl; sourceTree = ""; }; + B0EA911D2BA30CED003B92F7 /* vec1.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vec1.hpp; sourceTree = ""; }; + B0EA911E2BA30CED003B92F7 /* type_precision.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = type_precision.inl; sourceTree = ""; }; + B0EA911F2BA30CED003B92F7 /* bitfield.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = bitfield.inl; sourceTree = ""; }; + B0EA91202BA30CED003B92F7 /* ulp.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = ulp.hpp; sourceTree = ""; }; + B0EA91212BA30CED003B92F7 /* round.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = round.inl; sourceTree = ""; }; + B0EA91222BA30CED003B92F7 /* packing.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = packing.hpp; sourceTree = ""; }; + B0EA91232BA30CED003B92F7 /* quaternion_simd.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = quaternion_simd.inl; sourceTree = ""; }; + B0EA91242BA30CED003B92F7 /* ulp.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ulp.inl; sourceTree = ""; }; + B0EA91252BA30CED003B92F7 /* round.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = round.hpp; sourceTree = ""; }; + B0EA91262BA30CED003B92F7 /* matrix_transform.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_transform.hpp; sourceTree = ""; }; + B0EA91272BA30CED003B92F7 /* type_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = type_precision.hpp; sourceTree = ""; }; + B0EA91282BA30CED003B92F7 /* bitfield.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = bitfield.hpp; sourceTree = ""; }; + B0EA91292BA30CED003B92F7 /* integer.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = integer.inl; sourceTree = ""; }; + B0EA912A2BA30CED003B92F7 /* quaternion.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = quaternion.hpp; sourceTree = ""; }; + B0EA912B2BA30CED003B92F7 /* matrix_inverse.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_inverse.hpp; sourceTree = ""; }; + B0EA912C2BA30CED003B92F7 /* epsilon.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = epsilon.inl; sourceTree = ""; }; + B0EA912D2BA30CED003B92F7 /* random.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = random.hpp; sourceTree = ""; }; + B0EA912E2BA30CED003B92F7 /* matrix_access.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = matrix_access.inl; sourceTree = ""; }; + B0EA912F2BA30CED003B92F7 /* type_ptr.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = type_ptr.hpp; sourceTree = ""; }; + B0EA91302BA30CED003B92F7 /* constants.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = constants.hpp; sourceTree = ""; }; + B0EA91312BA30CED003B92F7 /* color_space.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = color_space.hpp; sourceTree = ""; }; + B0EA91322BA30CED003B92F7 /* noise.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = noise.hpp; sourceTree = ""; }; + B0EA91332BA30CED003B92F7 /* color_space.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = color_space.inl; sourceTree = ""; }; + B0EA91342BA30CED003B92F7 /* noise.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = noise.inl; sourceTree = ""; }; + B0EA91352BA30CED003B92F7 /* matrix_access.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_access.hpp; sourceTree = ""; }; + B0EA91362BA30CED003B92F7 /* random.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = random.inl; sourceTree = ""; }; + B0EA91372BA30CED003B92F7 /* epsilon.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = epsilon.hpp; sourceTree = ""; }; + B0EA91382BA30CED003B92F7 /* constants.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = constants.inl; sourceTree = ""; }; + B0EA91392BA30CED003B92F7 /* reciprocal.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = reciprocal.hpp; sourceTree = ""; }; + B0EA913A2BA30CED003B92F7 /* type_ptr.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = type_ptr.inl; sourceTree = ""; }; + B0EA913B2BA30CED003B92F7 /* type_aligned.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = type_aligned.hpp; sourceTree = ""; }; + B0EA913C2BA30CED003B92F7 /* common.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = common.hpp; sourceTree = ""; }; + B0EA913E2BA30CED003B92F7 /* vector_angle.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_angle.hpp; sourceTree = ""; }; + B0EA913F2BA30CED003B92F7 /* log_base.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = log_base.inl; sourceTree = ""; }; + B0EA91402BA30CED003B92F7 /* matrix_query.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = matrix_query.inl; sourceTree = ""; }; + B0EA91412BA30CED003B92F7 /* extend.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extend.inl; sourceTree = ""; }; + B0EA91422BA30CED003B92F7 /* integer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = integer.hpp; sourceTree = ""; }; + B0EA91432BA30CED003B92F7 /* associated_min_max.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = associated_min_max.inl; sourceTree = ""; }; + B0EA91442BA30CED003B92F7 /* matrix_transform_2d.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = matrix_transform_2d.inl; sourceTree = ""; }; + B0EA91452BA30CED003B92F7 /* hash.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = hash.hpp; sourceTree = ""; }; + B0EA91462BA30CED003B92F7 /* rotate_vector.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = rotate_vector.hpp; sourceTree = ""; }; + B0EA91472BA30CED003B92F7 /* matrix_interpolation.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_interpolation.hpp; sourceTree = ""; }; + B0EA91482BA30CED003B92F7 /* functions.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = functions.hpp; sourceTree = ""; }; + B0EA91492BA30CED003B92F7 /* quaternion.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = quaternion.inl; sourceTree = ""; }; + B0EA914A2BA30CED003B92F7 /* exterior_product.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = exterior_product.inl; sourceTree = ""; }; + B0EA914B2BA30CED003B92F7 /* gradient_paint.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = gradient_paint.inl; sourceTree = ""; }; + B0EA914C2BA30CED003B92F7 /* string_cast.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = string_cast.hpp; sourceTree = ""; }; + B0EA914D2BA30CED003B92F7 /* color_space_YCoCg.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = color_space_YCoCg.hpp; sourceTree = ""; }; + B0EA914E2BA30CED003B92F7 /* type_trait.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = type_trait.inl; sourceTree = ""; }; + B0EA914F2BA30CED003B92F7 /* extended_min_max.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = extended_min_max.hpp; sourceTree = ""; }; + B0EA91502BA30CED003B92F7 /* euler_angles.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = euler_angles.inl; sourceTree = ""; }; + B0EA91512BA30CED003B92F7 /* fast_square_root.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = fast_square_root.hpp; sourceTree = ""; }; + B0EA91522BA30CED003B92F7 /* raw_data.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = raw_data.inl; sourceTree = ""; }; + B0EA91532BA30CED003B92F7 /* matrix_cross_product.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = matrix_cross_product.inl; sourceTree = ""; }; + B0EA91542BA30CED003B92F7 /* spline.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = spline.hpp; sourceTree = ""; }; + B0EA91552BA30CED003B92F7 /* fast_trigonometry.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = fast_trigonometry.hpp; sourceTree = ""; }; + B0EA91562BA30CED003B92F7 /* optimum_pow.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = optimum_pow.inl; sourceTree = ""; }; + B0EA91572BA30CED003B92F7 /* dual_quaternion.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = dual_quaternion.hpp; sourceTree = ""; }; + B0EA91582BA30CED003B92F7 /* closest_point.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = closest_point.hpp; sourceTree = ""; }; + B0EA91592BA30CED003B92F7 /* mixed_product.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = mixed_product.inl; sourceTree = ""; }; + B0EA915A2BA30CED003B92F7 /* transform.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = transform.inl; sourceTree = ""; }; + B0EA915B2BA30CED003B92F7 /* bit.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = bit.inl; sourceTree = ""; }; + B0EA915C2BA30CED003B92F7 /* io.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = io.inl; sourceTree = ""; }; + B0EA915D2BA30CED003B92F7 /* fast_trigonometry.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fast_trigonometry.inl; sourceTree = ""; }; + B0EA915E2BA30CED003B92F7 /* optimum_pow.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = optimum_pow.hpp; sourceTree = ""; }; + B0EA915F2BA30CED003B92F7 /* spline.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = spline.inl; sourceTree = ""; }; + B0EA91602BA30CED003B92F7 /* raw_data.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = raw_data.hpp; sourceTree = ""; }; + B0EA91612BA30CED003B92F7 /* matrix_cross_product.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_cross_product.hpp; sourceTree = ""; }; + B0EA91622BA30CED003B92F7 /* euler_angles.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = euler_angles.hpp; sourceTree = ""; }; + B0EA91632BA30CED003B92F7 /* fast_square_root.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fast_square_root.inl; sourceTree = ""; }; + B0EA91642BA30CED003B92F7 /* color_space_YCoCg.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = color_space_YCoCg.inl; sourceTree = ""; }; + B0EA91652BA30CED003B92F7 /* type_trait.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = type_trait.hpp; sourceTree = ""; }; + B0EA91662BA30CED003B92F7 /* extended_min_max.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extended_min_max.inl; sourceTree = ""; }; + B0EA91672BA30CED003B92F7 /* io.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = io.hpp; sourceTree = ""; }; + B0EA91682BA30CED003B92F7 /* float_notmalize.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = float_notmalize.inl; sourceTree = ""; }; + B0EA91692BA30CED003B92F7 /* transform.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = transform.hpp; sourceTree = ""; }; + B0EA916A2BA30CED003B92F7 /* bit.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = bit.hpp; sourceTree = ""; }; + B0EA916B2BA30CED003B92F7 /* number_precision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = number_precision.hpp; sourceTree = ""; }; + B0EA916C2BA30CED003B92F7 /* mixed_product.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = mixed_product.hpp; sourceTree = ""; }; + B0EA916D2BA30CED003B92F7 /* closest_point.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = closest_point.inl; sourceTree = ""; }; + B0EA916E2BA30CED003B92F7 /* dual_quaternion.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = dual_quaternion.inl; sourceTree = ""; }; + B0EA916F2BA30CED003B92F7 /* associated_min_max.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = associated_min_max.hpp; sourceTree = ""; }; + B0EA91702BA30CED003B92F7 /* matrix_transform_2d.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_transform_2d.hpp; sourceTree = ""; }; + B0EA91712BA30CED003B92F7 /* integer.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = integer.inl; sourceTree = ""; }; + B0EA91722BA30CED003B92F7 /* log_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = log_base.hpp; sourceTree = ""; }; + B0EA91732BA30CED003B92F7 /* matrix_query.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_query.hpp; sourceTree = ""; }; + B0EA91742BA30CED003B92F7 /* vector_angle.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = vector_angle.inl; sourceTree = ""; }; + B0EA91752BA30CED003B92F7 /* extend.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = extend.hpp; sourceTree = ""; }; + B0EA91762BA30CED003B92F7 /* gradient_paint.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = gradient_paint.hpp; sourceTree = ""; }; + B0EA91772BA30CED003B92F7 /* quaternion.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = quaternion.hpp; sourceTree = ""; }; + B0EA91782BA30CED003B92F7 /* exterior_product.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = exterior_product.hpp; sourceTree = ""; }; + B0EA91792BA30CED003B92F7 /* string_cast.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = string_cast.inl; sourceTree = ""; }; + B0EA917A2BA30CED003B92F7 /* functions.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = functions.inl; sourceTree = ""; }; + B0EA917B2BA30CED003B92F7 /* rotate_vector.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = rotate_vector.inl; sourceTree = ""; }; + B0EA917C2BA30CED003B92F7 /* matrix_interpolation.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = matrix_interpolation.inl; sourceTree = ""; }; + B0EA917D2BA30CED003B92F7 /* hash.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = hash.inl; sourceTree = ""; }; + B0EA917E2BA30CED003B92F7 /* vector_query.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = vector_query.inl; sourceTree = ""; }; + B0EA917F2BA30CED003B92F7 /* polar_coordinates.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = polar_coordinates.hpp; sourceTree = ""; }; + B0EA91802BA30CED003B92F7 /* orthonormalize.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = orthonormalize.inl; sourceTree = ""; }; + B0EA91812BA30CED003B92F7 /* component_wise.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = component_wise.inl; sourceTree = ""; }; + B0EA91822BA30CED003B92F7 /* normalize_dot.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = normalize_dot.inl; sourceTree = ""; }; + B0EA91832BA30CED003B92F7 /* std_based_type.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = std_based_type.inl; sourceTree = ""; }; + B0EA91842BA30CED003B92F7 /* matrix_factorisation.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = matrix_factorisation.inl; sourceTree = ""; }; + B0EA91852BA30CED003B92F7 /* type_aligned.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = type_aligned.inl; sourceTree = ""; }; + B0EA91862BA30CED003B92F7 /* vec_swizzle.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vec_swizzle.hpp; sourceTree = ""; }; + B0EA91872BA30CED003B92F7 /* projection.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = projection.hpp; sourceTree = ""; }; + B0EA91882BA30CED003B92F7 /* compatibility.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = compatibility.inl; sourceTree = ""; }; + B0EA91892BA30CED003B92F7 /* pca.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = pca.hpp; sourceTree = ""; }; + B0EA918A2BA30CED003B92F7 /* scalar_relational.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = scalar_relational.hpp; sourceTree = ""; }; + B0EA918B2BA30CED003B92F7 /* wrap.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = wrap.hpp; sourceTree = ""; }; + B0EA918C2BA30CED003B92F7 /* rotate_normalized_axis.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = rotate_normalized_axis.inl; sourceTree = ""; }; + B0EA918D2BA30CED003B92F7 /* texture.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = texture.hpp; sourceTree = ""; }; + B0EA918E2BA30CED003B92F7 /* color_encoding.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = color_encoding.inl; sourceTree = ""; }; + B0EA918F2BA30CED003B92F7 /* norm.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = norm.hpp; sourceTree = ""; }; + B0EA91902BA30CED003B92F7 /* matrix_major_storage.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = matrix_major_storage.inl; sourceTree = ""; }; + B0EA91912BA30CED003B92F7 /* matrix_operation.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = matrix_operation.inl; sourceTree = ""; }; + B0EA91922BA30CED003B92F7 /* color_space.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = color_space.hpp; sourceTree = ""; }; + B0EA91932BA30CED003B92F7 /* normal.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = normal.hpp; sourceTree = ""; }; + B0EA91942BA30CED003B92F7 /* intersect.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = intersect.inl; sourceTree = ""; }; + B0EA91952BA30CED003B92F7 /* perpendicular.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = perpendicular.inl; sourceTree = ""; }; + B0EA91962BA30CED003B92F7 /* easing.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = easing.hpp; sourceTree = ""; }; + B0EA91972BA30CED003B92F7 /* transform2.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = transform2.inl; sourceTree = ""; }; + B0EA91982BA30CED003B92F7 /* matrix_decompose.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_decompose.hpp; sourceTree = ""; }; + B0EA91992BA30CED003B92F7 /* fast_exponential.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = fast_exponential.hpp; sourceTree = ""; }; + B0EA919A2BA30CED003B92F7 /* common.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = common.inl; sourceTree = ""; }; + B0EA919B2BA30CED003B92F7 /* handed_coordinate_space.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = handed_coordinate_space.hpp; sourceTree = ""; }; + B0EA919C2BA30CED003B92F7 /* intersect.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = intersect.hpp; sourceTree = ""; }; + B0EA919D2BA30CED003B92F7 /* perpendicular.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = perpendicular.hpp; sourceTree = ""; }; + B0EA919E2BA30CED003B92F7 /* easing.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = easing.inl; sourceTree = ""; }; + B0EA919F2BA30CED003B92F7 /* matrix_operation.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_operation.hpp; sourceTree = ""; }; + B0EA91A02BA30CED003B92F7 /* color_space.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = color_space.inl; sourceTree = ""; }; + B0EA91A12BA30CED003B92F7 /* normal.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = normal.inl; sourceTree = ""; }; + B0EA91A22BA30CED003B92F7 /* color_encoding.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = color_encoding.hpp; sourceTree = ""; }; + B0EA91A32BA30CED003B92F7 /* matrix_major_storage.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_major_storage.hpp; sourceTree = ""; }; + B0EA91A42BA30CED003B92F7 /* norm.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = norm.inl; sourceTree = ""; }; + B0EA91A52BA30CED003B92F7 /* texture.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = texture.inl; sourceTree = ""; }; + B0EA91A62BA30CED003B92F7 /* handed_coordinate_space.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = handed_coordinate_space.inl; sourceTree = ""; }; + B0EA91A72BA30CED003B92F7 /* common.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = common.hpp; sourceTree = ""; }; + B0EA91A82BA30CED003B92F7 /* range.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = range.hpp; sourceTree = ""; }; + B0EA91A92BA30CED003B92F7 /* fast_exponential.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fast_exponential.inl; sourceTree = ""; }; + B0EA91AA2BA30CED003B92F7 /* transform2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = transform2.hpp; sourceTree = ""; }; + B0EA91AB2BA30CED003B92F7 /* matrix_decompose.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = matrix_decompose.inl; sourceTree = ""; }; + B0EA91AC2BA30CED003B92F7 /* scalar_multiplication.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = scalar_multiplication.hpp; sourceTree = ""; }; + B0EA91AD2BA30CED003B92F7 /* std_based_type.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = std_based_type.hpp; sourceTree = ""; }; + B0EA91AE2BA30CED003B92F7 /* matrix_factorisation.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = matrix_factorisation.hpp; sourceTree = ""; }; + B0EA91AF2BA30CED003B92F7 /* orthonormalize.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = orthonormalize.hpp; sourceTree = ""; }; + B0EA91B02BA30CED003B92F7 /* normalize_dot.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = normalize_dot.hpp; sourceTree = ""; }; + B0EA91B12BA30CED003B92F7 /* component_wise.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = component_wise.hpp; sourceTree = ""; }; + B0EA91B22BA30CED003B92F7 /* polar_coordinates.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = polar_coordinates.inl; sourceTree = ""; }; + B0EA91B32BA30CED003B92F7 /* vector_query.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector_query.hpp; sourceTree = ""; }; + B0EA91B42BA30CED003B92F7 /* scalar_relational.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = scalar_relational.inl; sourceTree = ""; }; + B0EA91B52BA30CED003B92F7 /* wrap.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = wrap.inl; sourceTree = ""; }; + B0EA91B62BA30CED003B92F7 /* compatibility.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = compatibility.hpp; sourceTree = ""; }; + B0EA91B72BA30CED003B92F7 /* pca.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = pca.inl; sourceTree = ""; }; + B0EA91B82BA30CED003B92F7 /* rotate_normalized_axis.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = rotate_normalized_axis.hpp; sourceTree = ""; }; + B0EA91B92BA30CED003B92F7 /* projection.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = projection.inl; sourceTree = ""; }; + B0EA91BA2BA30CED003B92F7 /* type_aligned.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = type_aligned.hpp; sourceTree = ""; }; + B0EA924B2BA30EA2003B92F7 /* DummyGUIManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DummyGUIManager.cpp; path = ../../../src/DummyGUIManager.cpp; sourceTree = ""; }; + B0EA924F2BA31662003B92F7 /* VulkanController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VulkanController.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + B0EA8A4A2BA2FDC7003B92F7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B0EA8DC62BA30916003B92F7 /* MoltenVK.xcframework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + B0608E492BA5522500CE9114 /* windowing */ = { + isa = PBXGroup; + children = ( + B0608E472BA5522500CE9114 /* MetalWindow.cpp */, + B0608E482BA5522500CE9114 /* MetalWindow.h */, + ); + path = windowing; + sourceTree = ""; + }; + B0EA8A442BA2FDC7003B92F7 = { + isa = PBXGroup; + children = ( + B0B7FB3C2BA7856600DA3A53 /* project.xcconfig */, + B0EA8CC52BA306E0003B92F7 /* ThirdParty */, + B0EA8A5E2BA3021F003B92F7 /* Renderer */, + B0EA8A4F2BA2FDC7003B92F7 /* VulkanSplatting */, + B0EA8A4E2BA2FDC7003B92F7 /* Products */, + B0EA8DC42BA30916003B92F7 /* Frameworks */, + ); + sourceTree = ""; + }; + B0EA8A4E2BA2FDC7003B92F7 /* Products */ = { + isa = PBXGroup; + children = ( + B0EA8A4D2BA2FDC7003B92F7 /* VulkanSplatting.app */, + ); + name = Products; + sourceTree = ""; + }; + B0EA8A4F2BA2FDC7003B92F7 /* VulkanSplatting */ = { + isa = PBXGroup; + children = ( + B0A860112BA56169008B0F4F /* Info.plist */, + B0EA8A502BA2FDC7003B92F7 /* VulkanSplattingApp.swift */, + B0EA8A522BA2FDC7003B92F7 /* ContentView.swift */, + B0EA8A542BA2FDC9003B92F7 /* Assets.xcassets */, + B0EA8A562BA2FDC9003B92F7 /* Preview Content */, + B0EA924F2BA31662003B92F7 /* VulkanController.swift */, + B027E0ED2BA6B63B00BDA43F /* SplashScreenView.swift */, + ); + path = VulkanSplatting; + sourceTree = ""; + }; + B0EA8A562BA2FDC9003B92F7 /* Preview Content */ = { + isa = PBXGroup; + children = ( + B0EA8A572BA2FDC9003B92F7 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + B0EA8A5E2BA3021F003B92F7 /* Renderer */ = { + isa = PBXGroup; + children = ( + B0608E4E2BA55BBB00CE9114 /* VulkanSplatting.cpp */, + B0EA924B2BA30EA2003B92F7 /* DummyGUIManager.cpp */, + B0EA8ACB2BA30665003B92F7 /* shaders.h */, + B0EA8AC82BA3034B003B92F7 /* VulkanSplatting.h */, + B0EA8A772BA302E6003B92F7 /* GSScene.cpp */, + B0EA8A7A2BA302E6003B92F7 /* GSScene.h */, + B0EA8A792BA302E6003B92F7 /* GUIManager.h */, + B0EA8A7B2BA302E6003B92F7 /* Renderer.cpp */, + B0EA8A762BA302E6003B92F7 /* Renderer.h */, + B0EA8A7D2BA302E6003B92F7 /* third_party */, + B0EA8A922BA302E6003B92F7 /* vulkan */, + B0EA8A5F2BA30239003B92F7 /* VulkanSplatting-Bridging-Header.h */, + ); + name = Renderer; + sourceTree = ""; + }; + B0EA8A7D2BA302E6003B92F7 /* third_party */ = { + isa = PBXGroup; + children = ( + B0EA8A842BA302E6003B92F7 /* vk_mem_alloc.h */, + B0EA8A852BA302E6003B92F7 /* vk_enum_string_helper.h */, + ); + name = third_party; + path = ../../../src/third_party; + sourceTree = ""; + }; + B0EA8A922BA302E6003B92F7 /* vulkan */ = { + isa = PBXGroup; + children = ( + B0608E4D2BA5557A00CE9114 /* Window.h */, + B0608E492BA5522500CE9114 /* windowing */, + B0608E432BA54D8E00CE9114 /* DummyImguiManager.cpp */, + B0EA8A932BA302E6003B92F7 /* Utils.h */, + B0EA8A942BA302E6003B92F7 /* Utils.cpp */, + B0EA8A952BA302E6003B92F7 /* Shader.h */, + B0EA8A962BA302E6003B92F7 /* VulkanContext.h */, + B0EA8A982BA302E6003B92F7 /* QueryManager.h */, + B0EA8A992BA302E6003B92F7 /* Swapchain.h */, + B0EA8A9B2BA302E6003B92F7 /* ImguiManager.h */, + B0EA8A9C2BA302E6003B92F7 /* pipelines */, + B0EA8AA12BA302E6003B92F7 /* DescriptorSet.cpp */, + B0EA8AA22BA302E6003B92F7 /* Shader.cpp */, + B0EA8AA32BA302E6003B92F7 /* Buffer.cpp */, + B0EA8AA42BA302E6003B92F7 /* Swapchain.cpp */, + B0EA8AA52BA302E6003B92F7 /* Buffer.h */, + B0EA8AA62BA302E6003B92F7 /* VMA.cpp */, + B0EA8AA72BA302E6003B92F7 /* QueryManager.cpp */, + B0EA8AA82BA302E6003B92F7 /* DescriptorSet.h */, + B0EA8AA92BA302E6003B92F7 /* VulkanContext.cpp */, + ); + name = vulkan; + path = ../../../src/vulkan; + sourceTree = ""; + }; + B0EA8A9C2BA302E6003B92F7 /* pipelines */ = { + isa = PBXGroup; + children = ( + B0EA8A9D2BA302E6003B92F7 /* Pipeline.cpp */, + B0EA8A9E2BA302E6003B92F7 /* ComputePipeline.cpp */, + B0EA8A9F2BA302E6003B92F7 /* ComputePipeline.h */, + B0EA8AA02BA302E6003B92F7 /* Pipeline.h */, + ); + path = pipelines; + sourceTree = ""; + }; + B0EA8CC52BA306E0003B92F7 /* ThirdParty */ = { + isa = PBXGroup; + children = ( + B0EA90092BA30CED003B92F7 /* glm */, + ); + path = ThirdParty; + sourceTree = ""; + }; + B0EA8DC42BA30916003B92F7 /* Frameworks */ = { + isa = PBXGroup; + children = ( + B0EA8DC52BA30916003B92F7 /* MoltenVK.xcframework */, + ); + name = Frameworks; + sourceTree = ""; + }; + B0EA90092BA30CED003B92F7 /* glm */ = { + isa = PBXGroup; + children = ( + B0EA900A2BA30CED003B92F7 /* vec4.hpp */, + B0EA900B2BA30CED003B92F7 /* integer.hpp */, + B0EA900C2BA30CED003B92F7 /* vector_relational.hpp */, + B0EA900D2BA30CED003B92F7 /* mat2x3.hpp */, + B0EA900E2BA30CED003B92F7 /* mat4x4.hpp */, + B0EA900F2BA30CED003B92F7 /* mat2x2.hpp */, + B0EA90102BA30CED003B92F7 /* exponential.hpp */, + B0EA90112BA30CED003B92F7 /* vec2.hpp */, + B0EA90122BA30CED003B92F7 /* CMakeLists.txt */, + B0EA90132BA30CED003B92F7 /* vec3.hpp */, + B0EA90142BA30CED003B92F7 /* fwd.hpp */, + B0EA90152BA30CED003B92F7 /* mat4x3.hpp */, + B0EA90162BA30CED003B92F7 /* mat4x2.hpp */, + B0EA90172BA30CED003B92F7 /* mat2x4.hpp */, + B0EA90182BA30CED003B92F7 /* packing.hpp */, + B0EA90192BA30CED003B92F7 /* mat3x3.hpp */, + B0EA901A2BA30CED003B92F7 /* mat3x2.hpp */, + B0EA901B2BA30CED003B92F7 /* ext */, + B0EA90C62BA30CED003B92F7 /* simd */, + B0EA90D12BA30CED003B92F7 /* mat3x4.hpp */, + B0EA90D22BA30CED003B92F7 /* matrix.hpp */, + B0EA90D32BA30CED003B92F7 /* glm.hpp */, + B0EA90D42BA30CED003B92F7 /* trigonometric.hpp */, + B0EA90D52BA30CED003B92F7 /* geometric.hpp */, + B0EA90D62BA30CED003B92F7 /* detail */, + B0EA91142BA30CED003B92F7 /* glm.cppm */, + B0EA91152BA30CED003B92F7 /* ext.hpp */, + B0EA91162BA30CED003B92F7 /* gtc */, + B0EA913C2BA30CED003B92F7 /* common.hpp */, + B0EA913D2BA30CED003B92F7 /* gtx */, + ); + name = glm; + path = glm/glm; + sourceTree = ""; + }; + B0EA901B2BA30CED003B92F7 /* ext */ = { + isa = PBXGroup; + children = ( + B0EA901C2BA30CED003B92F7 /* matrix_double3x2_precision.hpp */, + B0EA901D2BA30CED003B92F7 /* matrix_float2x4.hpp */, + B0EA901E2BA30CED003B92F7 /* vector_bool2.hpp */, + B0EA901F2BA30CED003B92F7 /* quaternion_double_precision.hpp */, + B0EA90202BA30CED003B92F7 /* matrix_float4x2.hpp */, + B0EA90212BA30CED003B92F7 /* scalar_packing.inl */, + B0EA90222BA30CED003B92F7 /* matrix_float4x3.hpp */, + B0EA90232BA30CED003B92F7 /* vector_bool3.hpp */, + B0EA90242BA30CED003B92F7 /* vector_relational.hpp */, + B0EA90252BA30CED003B92F7 /* matrix_integer.hpp */, + B0EA90262BA30CED003B92F7 /* vector_uint1_sized.hpp */, + B0EA90272BA30CED003B92F7 /* vector_bool1.hpp */, + B0EA90282BA30CED003B92F7 /* quaternion_common.inl */, + B0EA90292BA30CED003B92F7 /* matrix_int3x2_sized.hpp */, + B0EA902A2BA30CED003B92F7 /* vector_float1_precision.hpp */, + B0EA902B2BA30CED003B92F7 /* matrix_float2x3_precision.hpp */, + B0EA902C2BA30CED003B92F7 /* vector_int2_sized.hpp */, + B0EA902D2BA30CED003B92F7 /* matrix_float2x2.hpp */, + B0EA902E2BA30CED003B92F7 /* matrix_common.hpp */, + B0EA902F2BA30CED003B92F7 /* vector_bool4.hpp */, + B0EA90302BA30CED003B92F7 /* matrix_float2x4_precision.hpp */, + B0EA90312BA30CED003B92F7 /* _matrix_vectorize.hpp */, + B0EA90322BA30CED003B92F7 /* matrix_float4x4.hpp */, + B0EA90332BA30CED003B92F7 /* matrix_float2x3.hpp */, + B0EA90342BA30CED003B92F7 /* matrix_clip_space.hpp */, + B0EA90352BA30CED003B92F7 /* scalar_integer.hpp */, + B0EA90362BA30CED003B92F7 /* vector_float2_precision.hpp */, + B0EA90372BA30CED003B92F7 /* matrix_transform.inl */, + B0EA90382BA30CED003B92F7 /* quaternion_exponential.inl */, + B0EA90392BA30CED003B92F7 /* matrix_int3x4_sized.hpp */, + B0EA903A2BA30CED003B92F7 /* scalar_common.hpp */, + B0EA903B2BA30CED003B92F7 /* vector_int4_sized.hpp */, + B0EA903C2BA30CED003B92F7 /* matrix_uint3x3_sized.hpp */, + B0EA903D2BA30CED003B92F7 /* quaternion_transform.inl */, + B0EA903E2BA30CED003B92F7 /* vector_reciprocal.inl */, + B0EA903F2BA30CED003B92F7 /* matrix_double4x2_precision.hpp */, + B0EA90402BA30CED003B92F7 /* matrix_clip_space.inl */, + B0EA90412BA30CED003B92F7 /* vector_double4_precision.hpp */, + B0EA90422BA30CED003B92F7 /* matrix_float3x4_precision.hpp */, + B0EA90432BA30CED003B92F7 /* scalar_integer.inl */, + B0EA90442BA30CED003B92F7 /* vector_uint3.hpp */, + B0EA90452BA30CED003B92F7 /* matrix_float4x3_precision.hpp */, + B0EA90462BA30CED003B92F7 /* matrix_common.inl */, + B0EA90472BA30CED003B92F7 /* vector_uint2.hpp */, + B0EA90482BA30CED003B92F7 /* quaternion_float_precision.hpp */, + B0EA90492BA30CED003B92F7 /* vector_reciprocal.hpp */, + B0EA904A2BA30CED003B92F7 /* matrix_float3x4.hpp */, + B0EA904B2BA30CED003B92F7 /* quaternion_transform.hpp */, + B0EA904C2BA30CED003B92F7 /* matrix_uint3x4_sized.hpp */, + B0EA904D2BA30CED003B92F7 /* vector_bool4_precision.hpp */, + B0EA904E2BA30CED003B92F7 /* vector_int3_sized.hpp */, + B0EA904F2BA30CED003B92F7 /* vector_uint1.hpp */, + B0EA90502BA30CED003B92F7 /* matrix_transform.hpp */, + B0EA90512BA30CED003B92F7 /* matrix_int3x3_sized.hpp */, + B0EA90522BA30CED003B92F7 /* scalar_common.inl */, + B0EA90532BA30CED003B92F7 /* quaternion_exponential.hpp */, + B0EA90542BA30CED003B92F7 /* vector_relational.inl */, + B0EA90552BA30CED003B92F7 /* vector_bool3_precision.hpp */, + B0EA90562BA30CED003B92F7 /* matrix_integer.inl */, + B0EA90572BA30CED003B92F7 /* matrix_double2x2_precision.hpp */, + B0EA90582BA30CED003B92F7 /* scalar_packing.hpp */, + B0EA90592BA30CED003B92F7 /* quaternion_float.hpp */, + B0EA905A2BA30CED003B92F7 /* vector_uint4.hpp */, + B0EA905B2BA30CED003B92F7 /* matrix_float3x2.hpp */, + B0EA905C2BA30CED003B92F7 /* vector_double3_precision.hpp */, + B0EA905D2BA30CED003B92F7 /* quaternion_common.hpp */, + B0EA905E2BA30CED003B92F7 /* matrix_float3x3_precision.hpp */, + B0EA905F2BA30CED003B92F7 /* matrix_float3x3.hpp */, + B0EA90602BA30CED003B92F7 /* scalar_int_sized.hpp */, + B0EA90612BA30CED003B92F7 /* matrix_uint3x2_sized.hpp */, + B0EA90622BA30CED003B92F7 /* matrix_float4x4_precision.hpp */, + B0EA90632BA30CED003B92F7 /* matrix_double4x2.hpp */, + B0EA90642BA30CED003B92F7 /* matrix_uint2x3_sized.hpp */, + B0EA90652BA30CED003B92F7 /* matrix_int2x2.hpp */, + B0EA90662BA30CED003B92F7 /* vector_int1.hpp */, + B0EA90672BA30CED003B92F7 /* matrix_int4x4.hpp */, + B0EA90682BA30CED003B92F7 /* vector_float3.hpp */, + B0EA90692BA30CED003B92F7 /* matrix_double2x4.hpp */, + B0EA906A2BA30CED003B92F7 /* scalar_ulp.hpp */, + B0EA906B2BA30CED003B92F7 /* quaternion_geometric.hpp */, + B0EA906C2BA30CED003B92F7 /* matrix_int2x4_sized.hpp */, + B0EA906D2BA30CED003B92F7 /* vector_float2.hpp */, + B0EA906E2BA30CED003B92F7 /* matrix_double2x3_precision.hpp */, + B0EA906F2BA30CED003B92F7 /* matrix_uint4x2_sized.hpp */, + B0EA90702BA30CED003B92F7 /* matrix_int2x3.hpp */, + B0EA90712BA30CED003B92F7 /* vector_bool2_precision.hpp */, + B0EA90722BA30CED003B92F7 /* quaternion_double.hpp */, + B0EA90732BA30CED003B92F7 /* matrix_double4x3.hpp */, + B0EA90742BA30CED003B92F7 /* matrix_uint3x2.hpp */, + B0EA90752BA30CED003B92F7 /* quaternion_common_simd.inl */, + B0EA90762BA30CED003B92F7 /* vector_int2.hpp */, + B0EA90772BA30CED003B92F7 /* vector_double2_precision.hpp */, + B0EA90782BA30CED003B92F7 /* matrix_float3x2_precision.hpp */, + B0EA90792BA30CED003B92F7 /* matrix_relational.hpp */, + B0EA907A2BA30CED003B92F7 /* vector_integer.hpp */, + B0EA907B2BA30CED003B92F7 /* scalar_relational.hpp */, + B0EA907C2BA30CED003B92F7 /* vector_float1.hpp */, + B0EA907D2BA30CED003B92F7 /* vector_uint3_sized.hpp */, + B0EA907E2BA30CED003B92F7 /* vector_int3.hpp */, + B0EA907F2BA30CED003B92F7 /* matrix_uint3x3.hpp */, + B0EA90802BA30CED003B92F7 /* scalar_constants.inl */, + B0EA90812BA30CED003B92F7 /* matrix_double4x4.hpp */, + B0EA90822BA30CED003B92F7 /* scalar_uint_sized.hpp */, + B0EA90832BA30CED003B92F7 /* matrix_int2x4.hpp */, + B0EA90842BA30CED003B92F7 /* matrix_int2x2_sized.hpp */, + B0EA90852BA30CED003B92F7 /* matrix_int4x2.hpp */, + B0EA90862BA30CED003B92F7 /* vector_double1_precision.hpp */, + B0EA90872BA30CED003B92F7 /* matrix_double2x2.hpp */, + B0EA90882BA30CED003B92F7 /* matrix_uint4x4_sized.hpp */, + B0EA90892BA30CED003B92F7 /* scalar_reciprocal.inl */, + B0EA908A2BA30CED003B92F7 /* matrix_float4x2_precision.hpp */, + B0EA908B2BA30CED003B92F7 /* matrix_double2x3.hpp */, + B0EA908C2BA30CED003B92F7 /* matrix_projection.hpp */, + B0EA908D2BA30CED003B92F7 /* vector_float4.hpp */, + B0EA908E2BA30CED003B92F7 /* vector_common.inl */, + B0EA908F2BA30CED003B92F7 /* matrix_int4x3.hpp */, + B0EA90902BA30CED003B92F7 /* matrix_int4x3_sized.hpp */, + B0EA90912BA30CED003B92F7 /* matrix_double2x4_precision.hpp */, + B0EA90922BA30CED003B92F7 /* matrix_uint3x4.hpp */, + B0EA90932BA30CED003B92F7 /* vector_int4.hpp */, + B0EA90942BA30CED003B92F7 /* quaternion_relational.hpp */, + B0EA90952BA30CED003B92F7 /* quaternion_trigonometric.hpp */, + B0EA90962BA30CED003B92F7 /* vector_bool1_precision.hpp */, + B0EA90972BA30CED003B92F7 /* vector_ulp.hpp */, + B0EA90982BA30CED003B92F7 /* vector_packing.inl */, + B0EA90992BA30CED003B92F7 /* vector_float3_precision.hpp */, + B0EA909A2BA30CED003B92F7 /* matrix_uint4x4.hpp */, + B0EA909B2BA30CED003B92F7 /* matrix_int4x4_sized.hpp */, + B0EA909C2BA30CED003B92F7 /* matrix_uint2x2.hpp */, + B0EA909D2BA30CED003B92F7 /* matrix_projection.inl */, + B0EA909E2BA30CED003B92F7 /* scalar_reciprocal.hpp */, + B0EA909F2BA30CED003B92F7 /* vector_common.hpp */, + B0EA90A02BA30CED003B92F7 /* matrix_uint2x2_sized.hpp */, + B0EA90A12BA30CED003B92F7 /* matrix_uint4x3_sized.hpp */, + B0EA90A22BA30CED003B92F7 /* matrix_uint2x3.hpp */, + B0EA90A32BA30CED003B92F7 /* scalar_constants.hpp */, + B0EA90A42BA30CED003B92F7 /* matrix_double3x4.hpp */, + B0EA90A52BA30CED003B92F7 /* quaternion_trigonometric.inl */, + B0EA90A62BA30CED003B92F7 /* matrix_double4x3_precision.hpp */, + B0EA90A72BA30CED003B92F7 /* vector_ulp.inl */, + B0EA90A82BA30CED003B92F7 /* vector_packing.hpp */, + B0EA90A92BA30CED003B92F7 /* vector_int1_sized.hpp */, + B0EA90AA2BA30CED003B92F7 /* matrix_int3x2.hpp */, + B0EA90AB2BA30CED003B92F7 /* matrix_double3x4_precision.hpp */, + B0EA90AC2BA30CED003B92F7 /* quaternion_relational.inl */, + B0EA90AD2BA30CED003B92F7 /* vector_double4.hpp */, + B0EA90AE2BA30CED003B92F7 /* matrix_int3x3.hpp */, + B0EA90AF2BA30CED003B92F7 /* vector_uint2_sized.hpp */, + B0EA90B02BA30CED003B92F7 /* matrix_uint4x2.hpp */, + B0EA90B12BA30CED003B92F7 /* matrix_uint2x4.hpp */, + B0EA90B22BA30CED003B92F7 /* matrix_int2x3_sized.hpp */, + B0EA90B32BA30CED003B92F7 /* matrix_int4x2_sized.hpp */, + B0EA90B42BA30CED003B92F7 /* vector_double1.hpp */, + B0EA90B52BA30CED003B92F7 /* matrix_double4x4_precision.hpp */, + B0EA90B62BA30CED003B92F7 /* scalar_ulp.inl */, + B0EA90B72BA30CED003B92F7 /* quaternion_geometric.inl */, + B0EA90B82BA30CED003B92F7 /* matrix_uint2x4_sized.hpp */, + B0EA90B92BA30CED003B92F7 /* matrix_uint4x3.hpp */, + B0EA90BA2BA30CED003B92F7 /* matrix_double3x3_precision.hpp */, + B0EA90BB2BA30CED003B92F7 /* matrix_double3x2.hpp */, + B0EA90BC2BA30CED003B92F7 /* matrix_float2x2_precision.hpp */, + B0EA90BD2BA30CED003B92F7 /* vector_integer.inl */, + B0EA90BE2BA30CED003B92F7 /* scalar_relational.inl */, + B0EA90BF2BA30CED003B92F7 /* matrix_int3x4.hpp */, + B0EA90C02BA30CED003B92F7 /* vector_uint4_sized.hpp */, + B0EA90C12BA30CED003B92F7 /* vector_double3.hpp */, + B0EA90C22BA30CED003B92F7 /* vector_float4_precision.hpp */, + B0EA90C32BA30CED003B92F7 /* vector_double2.hpp */, + B0EA90C42BA30CED003B92F7 /* matrix_relational.inl */, + B0EA90C52BA30CED003B92F7 /* matrix_double3x3.hpp */, + ); + path = ext; + sourceTree = ""; + }; + B0EA90C62BA30CED003B92F7 /* simd */ = { + isa = PBXGroup; + children = ( + B0EA90C72BA30CED003B92F7 /* neon.h */, + B0EA90C82BA30CED003B92F7 /* vector_relational.h */, + B0EA90C92BA30CED003B92F7 /* matrix.h */, + B0EA90CA2BA30CED003B92F7 /* packing.h */, + B0EA90CB2BA30CED003B92F7 /* common.h */, + B0EA90CC2BA30CED003B92F7 /* trigonometric.h */, + B0EA90CD2BA30CED003B92F7 /* geometric.h */, + B0EA90CE2BA30CED003B92F7 /* integer.h */, + B0EA90CF2BA30CED003B92F7 /* platform.h */, + B0EA90D02BA30CED003B92F7 /* exponential.h */, + ); + path = simd; + sourceTree = ""; + }; + B0EA90D62BA30CED003B92F7 /* detail */ = { + isa = PBXGroup; + children = ( + B0EA90D72BA30CED003B92F7 /* func_exponential.inl */, + B0EA90D82BA30CED003B92F7 /* func_integer_simd.inl */, + B0EA90D92BA30CED003B92F7 /* func_vector_relational.inl */, + B0EA90DA2BA30CED003B92F7 /* func_packing.inl */, + B0EA90DB2BA30CED003B92F7 /* _fixes.hpp */, + B0EA90DC2BA30CED003B92F7 /* type_quat.inl */, + B0EA90DD2BA30CED003B92F7 /* type_half.inl */, + B0EA90DE2BA30CED003B92F7 /* func_vector_relational_simd.inl */, + B0EA90DF2BA30CED003B92F7 /* qualifier.hpp */, + B0EA90E02BA30CED003B92F7 /* func_matrix_simd.inl */, + B0EA90E12BA30CED003B92F7 /* _noise.hpp */, + B0EA90E22BA30CED003B92F7 /* type_half.hpp */, + B0EA90E32BA30CED003B92F7 /* _features.hpp */, + B0EA90E42BA30CED003B92F7 /* func_integer.inl */, + B0EA90E52BA30CED003B92F7 /* _vectorize.hpp */, + B0EA90E62BA30CED003B92F7 /* func_geometric.inl */, + B0EA90E72BA30CED003B92F7 /* type_quat.hpp */, + B0EA90E82BA30CED003B92F7 /* func_common.inl */, + B0EA90E92BA30CED003B92F7 /* type_quat_simd.inl */, + B0EA90EA2BA30CED003B92F7 /* func_trigonometric.inl */, + B0EA90EB2BA30CED003B92F7 /* type_mat2x4.inl */, + B0EA90EC2BA30CED003B92F7 /* type_mat4x2.inl */, + B0EA90ED2BA30CED003B92F7 /* _swizzle.hpp */, + B0EA90EE2BA30CED003B92F7 /* type_mat4x3.inl */, + B0EA90EF2BA30CED003B92F7 /* func_packing_simd.inl */, + B0EA90F02BA30CED003B92F7 /* type_vec4.inl */, + B0EA90F12BA30CED003B92F7 /* func_trigonometric_simd.inl */, + B0EA90F22BA30CED003B92F7 /* type_mat3x3.hpp */, + B0EA90F32BA30CED003B92F7 /* type_mat3x2.hpp */, + B0EA90F42BA30CED003B92F7 /* compute_common.hpp */, + B0EA90F52BA30CED003B92F7 /* setup.hpp */, + B0EA90F62BA30CED003B92F7 /* type_mat2x2.inl */, + B0EA90F72BA30CED003B92F7 /* type_vec1.inl */, + B0EA90F82BA30CED003B92F7 /* func_common_simd.inl */, + B0EA90F92BA30CED003B92F7 /* type_mat4x4.inl */, + B0EA90FA2BA30CED003B92F7 /* func_geometric_simd.inl */, + B0EA90FB2BA30CED003B92F7 /* type_mat2x3.inl */, + B0EA90FC2BA30CED003B92F7 /* type_vec2.inl */, + B0EA90FD2BA30CED003B92F7 /* glm.cpp */, + B0EA90FE2BA30CED003B92F7 /* type_mat3x4.hpp */, + B0EA90FF2BA30CED003B92F7 /* type_vec3.inl */, + B0EA91002BA30CED003B92F7 /* type_mat4x4_simd.inl */, + B0EA91012BA30CED003B92F7 /* type_mat2x3.hpp */, + B0EA91022BA30CED003B92F7 /* type_mat4x4.hpp */, + B0EA91032BA30CED003B92F7 /* func_matrix.inl */, + B0EA91042BA30CED003B92F7 /* type_mat2x2.hpp */, + B0EA91052BA30CED003B92F7 /* type_vec1.hpp */, + B0EA91062BA30CED003B92F7 /* _swizzle_func.hpp */, + B0EA91072BA30CED003B92F7 /* type_vec3.hpp */, + B0EA91082BA30CED003B92F7 /* compute_vector_relational.hpp */, + B0EA91092BA30CED003B92F7 /* type_vec4_simd.inl */, + B0EA910A2BA30CED003B92F7 /* type_mat3x4.inl */, + B0EA910B2BA30CED003B92F7 /* func_exponential_simd.inl */, + B0EA910C2BA30CED003B92F7 /* type_vec2.hpp */, + B0EA910D2BA30CED003B92F7 /* type_mat4x3.hpp */, + B0EA910E2BA30CED003B92F7 /* type_mat4x2.hpp */, + B0EA910F2BA30CED003B92F7 /* type_float.hpp */, + B0EA91102BA30CED003B92F7 /* type_mat2x4.hpp */, + B0EA91112BA30CED003B92F7 /* type_mat3x2.inl */, + B0EA91122BA30CED003B92F7 /* type_mat3x3.inl */, + B0EA91132BA30CED003B92F7 /* type_vec4.hpp */, + ); + path = detail; + sourceTree = ""; + }; + B0EA91162BA30CED003B92F7 /* gtc */ = { + isa = PBXGroup; + children = ( + B0EA91172BA30CED003B92F7 /* integer.hpp */, + B0EA91182BA30CED003B92F7 /* matrix_integer.hpp */, + B0EA91192BA30CED003B92F7 /* matrix_inverse.inl */, + B0EA911A2BA30CED003B92F7 /* quaternion.inl */, + B0EA911B2BA30CED003B92F7 /* packing.inl */, + B0EA911C2BA30CED003B92F7 /* matrix_transform.inl */, + B0EA911D2BA30CED003B92F7 /* vec1.hpp */, + B0EA911E2BA30CED003B92F7 /* type_precision.inl */, + B0EA911F2BA30CED003B92F7 /* bitfield.inl */, + B0EA91202BA30CED003B92F7 /* ulp.hpp */, + B0EA91212BA30CED003B92F7 /* round.inl */, + B0EA91222BA30CED003B92F7 /* packing.hpp */, + B0EA91232BA30CED003B92F7 /* quaternion_simd.inl */, + B0EA91242BA30CED003B92F7 /* ulp.inl */, + B0EA91252BA30CED003B92F7 /* round.hpp */, + B0EA91262BA30CED003B92F7 /* matrix_transform.hpp */, + B0EA91272BA30CED003B92F7 /* type_precision.hpp */, + B0EA91282BA30CED003B92F7 /* bitfield.hpp */, + B0EA91292BA30CED003B92F7 /* integer.inl */, + B0EA912A2BA30CED003B92F7 /* quaternion.hpp */, + B0EA912B2BA30CED003B92F7 /* matrix_inverse.hpp */, + B0EA912C2BA30CED003B92F7 /* epsilon.inl */, + B0EA912D2BA30CED003B92F7 /* random.hpp */, + B0EA912E2BA30CED003B92F7 /* matrix_access.inl */, + B0EA912F2BA30CED003B92F7 /* type_ptr.hpp */, + B0EA91302BA30CED003B92F7 /* constants.hpp */, + B0EA91312BA30CED003B92F7 /* color_space.hpp */, + B0EA91322BA30CED003B92F7 /* noise.hpp */, + B0EA91332BA30CED003B92F7 /* color_space.inl */, + B0EA91342BA30CED003B92F7 /* noise.inl */, + B0EA91352BA30CED003B92F7 /* matrix_access.hpp */, + B0EA91362BA30CED003B92F7 /* random.inl */, + B0EA91372BA30CED003B92F7 /* epsilon.hpp */, + B0EA91382BA30CED003B92F7 /* constants.inl */, + B0EA91392BA30CED003B92F7 /* reciprocal.hpp */, + B0EA913A2BA30CED003B92F7 /* type_ptr.inl */, + B0EA913B2BA30CED003B92F7 /* type_aligned.hpp */, + ); + path = gtc; + sourceTree = ""; + }; + B0EA913D2BA30CED003B92F7 /* gtx */ = { + isa = PBXGroup; + children = ( + B0EA913E2BA30CED003B92F7 /* vector_angle.hpp */, + B0EA913F2BA30CED003B92F7 /* log_base.inl */, + B0EA91402BA30CED003B92F7 /* matrix_query.inl */, + B0EA91412BA30CED003B92F7 /* extend.inl */, + B0EA91422BA30CED003B92F7 /* integer.hpp */, + B0EA91432BA30CED003B92F7 /* associated_min_max.inl */, + B0EA91442BA30CED003B92F7 /* matrix_transform_2d.inl */, + B0EA91452BA30CED003B92F7 /* hash.hpp */, + B0EA91462BA30CED003B92F7 /* rotate_vector.hpp */, + B0EA91472BA30CED003B92F7 /* matrix_interpolation.hpp */, + B0EA91482BA30CED003B92F7 /* functions.hpp */, + B0EA91492BA30CED003B92F7 /* quaternion.inl */, + B0EA914A2BA30CED003B92F7 /* exterior_product.inl */, + B0EA914B2BA30CED003B92F7 /* gradient_paint.inl */, + B0EA914C2BA30CED003B92F7 /* string_cast.hpp */, + B0EA914D2BA30CED003B92F7 /* color_space_YCoCg.hpp */, + B0EA914E2BA30CED003B92F7 /* type_trait.inl */, + B0EA914F2BA30CED003B92F7 /* extended_min_max.hpp */, + B0EA91502BA30CED003B92F7 /* euler_angles.inl */, + B0EA91512BA30CED003B92F7 /* fast_square_root.hpp */, + B0EA91522BA30CED003B92F7 /* raw_data.inl */, + B0EA91532BA30CED003B92F7 /* matrix_cross_product.inl */, + B0EA91542BA30CED003B92F7 /* spline.hpp */, + B0EA91552BA30CED003B92F7 /* fast_trigonometry.hpp */, + B0EA91562BA30CED003B92F7 /* optimum_pow.inl */, + B0EA91572BA30CED003B92F7 /* dual_quaternion.hpp */, + B0EA91582BA30CED003B92F7 /* closest_point.hpp */, + B0EA91592BA30CED003B92F7 /* mixed_product.inl */, + B0EA915A2BA30CED003B92F7 /* transform.inl */, + B0EA915B2BA30CED003B92F7 /* bit.inl */, + B0EA915C2BA30CED003B92F7 /* io.inl */, + B0EA915D2BA30CED003B92F7 /* fast_trigonometry.inl */, + B0EA915E2BA30CED003B92F7 /* optimum_pow.hpp */, + B0EA915F2BA30CED003B92F7 /* spline.inl */, + B0EA91602BA30CED003B92F7 /* raw_data.hpp */, + B0EA91612BA30CED003B92F7 /* matrix_cross_product.hpp */, + B0EA91622BA30CED003B92F7 /* euler_angles.hpp */, + B0EA91632BA30CED003B92F7 /* fast_square_root.inl */, + B0EA91642BA30CED003B92F7 /* color_space_YCoCg.inl */, + B0EA91652BA30CED003B92F7 /* type_trait.hpp */, + B0EA91662BA30CED003B92F7 /* extended_min_max.inl */, + B0EA91672BA30CED003B92F7 /* io.hpp */, + B0EA91682BA30CED003B92F7 /* float_notmalize.inl */, + B0EA91692BA30CED003B92F7 /* transform.hpp */, + B0EA916A2BA30CED003B92F7 /* bit.hpp */, + B0EA916B2BA30CED003B92F7 /* number_precision.hpp */, + B0EA916C2BA30CED003B92F7 /* mixed_product.hpp */, + B0EA916D2BA30CED003B92F7 /* closest_point.inl */, + B0EA916E2BA30CED003B92F7 /* dual_quaternion.inl */, + B0EA916F2BA30CED003B92F7 /* associated_min_max.hpp */, + B0EA91702BA30CED003B92F7 /* matrix_transform_2d.hpp */, + B0EA91712BA30CED003B92F7 /* integer.inl */, + B0EA91722BA30CED003B92F7 /* log_base.hpp */, + B0EA91732BA30CED003B92F7 /* matrix_query.hpp */, + B0EA91742BA30CED003B92F7 /* vector_angle.inl */, + B0EA91752BA30CED003B92F7 /* extend.hpp */, + B0EA91762BA30CED003B92F7 /* gradient_paint.hpp */, + B0EA91772BA30CED003B92F7 /* quaternion.hpp */, + B0EA91782BA30CED003B92F7 /* exterior_product.hpp */, + B0EA91792BA30CED003B92F7 /* string_cast.inl */, + B0EA917A2BA30CED003B92F7 /* functions.inl */, + B0EA917B2BA30CED003B92F7 /* rotate_vector.inl */, + B0EA917C2BA30CED003B92F7 /* matrix_interpolation.inl */, + B0EA917D2BA30CED003B92F7 /* hash.inl */, + B0EA917E2BA30CED003B92F7 /* vector_query.inl */, + B0EA917F2BA30CED003B92F7 /* polar_coordinates.hpp */, + B0EA91802BA30CED003B92F7 /* orthonormalize.inl */, + B0EA91812BA30CED003B92F7 /* component_wise.inl */, + B0EA91822BA30CED003B92F7 /* normalize_dot.inl */, + B0EA91832BA30CED003B92F7 /* std_based_type.inl */, + B0EA91842BA30CED003B92F7 /* matrix_factorisation.inl */, + B0EA91852BA30CED003B92F7 /* type_aligned.inl */, + B0EA91862BA30CED003B92F7 /* vec_swizzle.hpp */, + B0EA91872BA30CED003B92F7 /* projection.hpp */, + B0EA91882BA30CED003B92F7 /* compatibility.inl */, + B0EA91892BA30CED003B92F7 /* pca.hpp */, + B0EA918A2BA30CED003B92F7 /* scalar_relational.hpp */, + B0EA918B2BA30CED003B92F7 /* wrap.hpp */, + B0EA918C2BA30CED003B92F7 /* rotate_normalized_axis.inl */, + B0EA918D2BA30CED003B92F7 /* texture.hpp */, + B0EA918E2BA30CED003B92F7 /* color_encoding.inl */, + B0EA918F2BA30CED003B92F7 /* norm.hpp */, + B0EA91902BA30CED003B92F7 /* matrix_major_storage.inl */, + B0EA91912BA30CED003B92F7 /* matrix_operation.inl */, + B0EA91922BA30CED003B92F7 /* color_space.hpp */, + B0EA91932BA30CED003B92F7 /* normal.hpp */, + B0EA91942BA30CED003B92F7 /* intersect.inl */, + B0EA91952BA30CED003B92F7 /* perpendicular.inl */, + B0EA91962BA30CED003B92F7 /* easing.hpp */, + B0EA91972BA30CED003B92F7 /* transform2.inl */, + B0EA91982BA30CED003B92F7 /* matrix_decompose.hpp */, + B0EA91992BA30CED003B92F7 /* fast_exponential.hpp */, + B0EA919A2BA30CED003B92F7 /* common.inl */, + B0EA919B2BA30CED003B92F7 /* handed_coordinate_space.hpp */, + B0EA919C2BA30CED003B92F7 /* intersect.hpp */, + B0EA919D2BA30CED003B92F7 /* perpendicular.hpp */, + B0EA919E2BA30CED003B92F7 /* easing.inl */, + B0EA919F2BA30CED003B92F7 /* matrix_operation.hpp */, + B0EA91A02BA30CED003B92F7 /* color_space.inl */, + B0EA91A12BA30CED003B92F7 /* normal.inl */, + B0EA91A22BA30CED003B92F7 /* color_encoding.hpp */, + B0EA91A32BA30CED003B92F7 /* matrix_major_storage.hpp */, + B0EA91A42BA30CED003B92F7 /* norm.inl */, + B0EA91A52BA30CED003B92F7 /* texture.inl */, + B0EA91A62BA30CED003B92F7 /* handed_coordinate_space.inl */, + B0EA91A72BA30CED003B92F7 /* common.hpp */, + B0EA91A82BA30CED003B92F7 /* range.hpp */, + B0EA91A92BA30CED003B92F7 /* fast_exponential.inl */, + B0EA91AA2BA30CED003B92F7 /* transform2.hpp */, + B0EA91AB2BA30CED003B92F7 /* matrix_decompose.inl */, + B0EA91AC2BA30CED003B92F7 /* scalar_multiplication.hpp */, + B0EA91AD2BA30CED003B92F7 /* std_based_type.hpp */, + B0EA91AE2BA30CED003B92F7 /* matrix_factorisation.hpp */, + B0EA91AF2BA30CED003B92F7 /* orthonormalize.hpp */, + B0EA91B02BA30CED003B92F7 /* normalize_dot.hpp */, + B0EA91B12BA30CED003B92F7 /* component_wise.hpp */, + B0EA91B22BA30CED003B92F7 /* polar_coordinates.inl */, + B0EA91B32BA30CED003B92F7 /* vector_query.hpp */, + B0EA91B42BA30CED003B92F7 /* scalar_relational.inl */, + B0EA91B52BA30CED003B92F7 /* wrap.inl */, + B0EA91B62BA30CED003B92F7 /* compatibility.hpp */, + B0EA91B72BA30CED003B92F7 /* pca.inl */, + B0EA91B82BA30CED003B92F7 /* rotate_normalized_axis.hpp */, + B0EA91B92BA30CED003B92F7 /* projection.inl */, + B0EA91BA2BA30CED003B92F7 /* type_aligned.hpp */, + ); + path = gtx; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + B0EA8A4C2BA2FDC7003B92F7 /* VulkanSplatting */ = { + isa = PBXNativeTarget; + buildConfigurationList = B0EA8A5B2BA2FDC9003B92F7 /* Build configuration list for PBXNativeTarget "VulkanSplatting" */; + buildPhases = ( + B0EA8A492BA2FDC7003B92F7 /* Sources */, + B0EA8A4A2BA2FDC7003B92F7 /* Frameworks */, + B0EA8A4B2BA2FDC7003B92F7 /* Resources */, + B0EA8DC82BA30916003B92F7 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = VulkanSplatting; + productName = VulkanSplatting; + productReference = B0EA8A4D2BA2FDC7003B92F7 /* VulkanSplatting.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + B0EA8A452BA2FDC7003B92F7 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1520; + LastUpgradeCheck = 1520; + TargetAttributes = { + B0EA8A4C2BA2FDC7003B92F7 = { + CreatedOnToolsVersion = 15.2; + LastSwiftMigration = 1520; + }; + }; + }; + buildConfigurationList = B0EA8A482BA2FDC7003B92F7 /* Build configuration list for PBXProject "VulkanSplatting" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = B0EA8A442BA2FDC7003B92F7; + productRefGroup = B0EA8A4E2BA2FDC7003B92F7 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + B0EA8A4C2BA2FDC7003B92F7 /* VulkanSplatting */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + B0EA8A4B2BA2FDC7003B92F7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B0EA8A582BA2FDC9003B92F7 /* Preview Assets.xcassets in Resources */, + B0EA8A552BA2FDC9003B92F7 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + B0EA8A492BA2FDC7003B92F7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B0EA8A532BA2FDC7003B92F7 /* ContentView.swift in Sources */, + B0EA8AAD2BA302E6003B92F7 /* Renderer.cpp in Sources */, + B0608E442BA54D8E00CE9114 /* DummyImguiManager.cpp in Sources */, + B0EA8ABF2BA302E6003B92F7 /* ComputePipeline.cpp in Sources */, + B0EA8AC62BA302E6003B92F7 /* VulkanContext.cpp in Sources */, + B0EA8AC12BA302E6003B92F7 /* Shader.cpp in Sources */, + B0EA92502BA31662003B92F7 /* VulkanController.swift in Sources */, + B0608E4B2BA5522500CE9114 /* MetalWindow.cpp in Sources */, + B0EA8AC22BA302E6003B92F7 /* Buffer.cpp in Sources */, + B0EA8AC32BA302E6003B92F7 /* Swapchain.cpp in Sources */, + B0EA8ABE2BA302E6003B92F7 /* Pipeline.cpp in Sources */, + B0EA8A512BA2FDC7003B92F7 /* VulkanSplattingApp.swift in Sources */, + B0EA8ABC2BA302E6003B92F7 /* Utils.cpp in Sources */, + B0EA8AC42BA302E6003B92F7 /* VMA.cpp in Sources */, + B027E0EE2BA6B63B00BDA43F /* SplashScreenView.swift in Sources */, + B0EA8AAB2BA302E6003B92F7 /* GSScene.cpp in Sources */, + B0608E4F2BA55BBB00CE9114 /* VulkanSplatting.cpp in Sources */, + B0EA91F02BA30CEE003B92F7 /* glm.cpp in Sources */, + B0EA8AC02BA302E6003B92F7 /* DescriptorSet.cpp in Sources */, + B0EA924C2BA30EA2003B92F7 /* DummyGUIManager.cpp in Sources */, + B0EA8AC52BA302E6003B92F7 /* QueryManager.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + B0EA8A592BA2FDC9003B92F7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + VKGS_ENABLE_METAL, + VK_USE_PLATFORM_METAL_EXT, + ); + 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_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.2; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + B0EA8A5A2BA2FDC9003B92F7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + VKGS_ENABLE_METAL, + VK_USE_PLATFORM_METAL_EXT, + ); + 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_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.2; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + B0EA8A5C2BA2FDC9003B92F7 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B0B7FB3C2BA7856600DA3A53 /* project.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"VulkanSplatting/Preview Content\""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + HEADER_SEARCH_PATHS = ( + "\"$(SRCROOT)/include\"", + "\"$(SRCROOT)/ThirdParty\"/**", + "\"$(SRCROOT)/../MoltenVK/include\"/**", + "\"$(SRCROOT)/../../../src/third_party\"", + "\"$(SRCROOT)/../../../include/vulkan_splatting\"", + ); + INFOPLIST_FILE = VulkanSplatting/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "Vulkan Splatting"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.photography"; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait"; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/Frameworks/MoltenVK.framework", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = life.shg.VulkanSplatting; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "VulkanSplatting-Bridging-Header.h"; + SWIFT_OBJC_INTEROP_MODE = objcxx; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + B0EA8A5D2BA2FDC9003B92F7 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B0B7FB3C2BA7856600DA3A53 /* project.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"VulkanSplatting/Preview Content\""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + HEADER_SEARCH_PATHS = ( + "\"$(SRCROOT)/include\"", + "\"$(SRCROOT)/ThirdParty\"/**", + "\"$(SRCROOT)/../MoltenVK/include\"/**", + "\"$(SRCROOT)/../../../src/third_party\"", + "\"$(SRCROOT)/../../../include/vulkan_splatting\"", + ); + INFOPLIST_FILE = VulkanSplatting/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "Vulkan Splatting"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.photography"; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait"; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/Frameworks/MoltenVK.framework", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = life.shg.VulkanSplatting; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "VulkanSplatting-Bridging-Header.h"; + SWIFT_OBJC_INTEROP_MODE = objcxx; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + B0EA8A482BA2FDC7003B92F7 /* Build configuration list for PBXProject "VulkanSplatting" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B0EA8A592BA2FDC9003B92F7 /* Debug */, + B0EA8A5A2BA2FDC9003B92F7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B0EA8A5B2BA2FDC9003B92F7 /* Build configuration list for PBXNativeTarget "VulkanSplatting" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B0EA8A5C2BA2FDC9003B92F7 /* Debug */, + B0EA8A5D2BA2FDC9003B92F7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = B0EA8A452BA2FDC7003B92F7 /* Project object */; +} diff --git a/apps/apple/VulkanSplatting/VulkanSplatting.xcodeproj/xcshareddata/xcschemes/VulkanSplatting.xcscheme b/apps/apple/VulkanSplatting/VulkanSplatting.xcodeproj/xcshareddata/xcschemes/VulkanSplatting.xcscheme new file mode 100644 index 0000000..75512bd --- /dev/null +++ b/apps/apple/VulkanSplatting/VulkanSplatting.xcodeproj/xcshareddata/xcschemes/VulkanSplatting.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/apple/VulkanSplatting/VulkanSplatting/Assets.xcassets/AccentColor.colorset/Contents.json b/apps/apple/VulkanSplatting/VulkanSplatting/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/apps/apple/VulkanSplatting/VulkanSplatting/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/apps/apple/VulkanSplatting/VulkanSplatting/Assets.xcassets/AppIcon.appiconset/Contents.json b/apps/apple/VulkanSplatting/VulkanSplatting/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..f434400 --- /dev/null +++ b/apps/apple/VulkanSplatting/VulkanSplatting/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,14 @@ +{ + "images" : [ + { + "filename" : "logo.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/apps/apple/VulkanSplatting/VulkanSplatting/Assets.xcassets/AppIcon.appiconset/logo.png b/apps/apple/VulkanSplatting/VulkanSplatting/Assets.xcassets/AppIcon.appiconset/logo.png new file mode 100644 index 0000000..6131fc8 Binary files /dev/null and b/apps/apple/VulkanSplatting/VulkanSplatting/Assets.xcassets/AppIcon.appiconset/logo.png differ diff --git a/apps/apple/VulkanSplatting/VulkanSplatting/Assets.xcassets/Contents.json b/apps/apple/VulkanSplatting/VulkanSplatting/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/apps/apple/VulkanSplatting/VulkanSplatting/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/apps/apple/VulkanSplatting/VulkanSplatting/Assets.xcassets/github-mark-white.imageset/Contents.json b/apps/apple/VulkanSplatting/VulkanSplatting/Assets.xcassets/github-mark-white.imageset/Contents.json new file mode 100644 index 0000000..6541baf --- /dev/null +++ b/apps/apple/VulkanSplatting/VulkanSplatting/Assets.xcassets/github-mark-white.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "github-mark-white.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/apps/apple/VulkanSplatting/VulkanSplatting/Assets.xcassets/github-mark-white.imageset/github-mark-white.png b/apps/apple/VulkanSplatting/VulkanSplatting/Assets.xcassets/github-mark-white.imageset/github-mark-white.png new file mode 100644 index 0000000..50b8175 Binary files /dev/null and b/apps/apple/VulkanSplatting/VulkanSplatting/Assets.xcassets/github-mark-white.imageset/github-mark-white.png differ diff --git a/apps/apple/VulkanSplatting/VulkanSplatting/Assets.xcassets/logo.imageset/Contents.json b/apps/apple/VulkanSplatting/VulkanSplatting/Assets.xcassets/logo.imageset/Contents.json new file mode 100644 index 0000000..5f670ca --- /dev/null +++ b/apps/apple/VulkanSplatting/VulkanSplatting/Assets.xcassets/logo.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "logo.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/apps/apple/VulkanSplatting/VulkanSplatting/Assets.xcassets/logo.imageset/logo.png b/apps/apple/VulkanSplatting/VulkanSplatting/Assets.xcassets/logo.imageset/logo.png new file mode 100644 index 0000000..6130e30 Binary files /dev/null and b/apps/apple/VulkanSplatting/VulkanSplatting/Assets.xcassets/logo.imageset/logo.png differ diff --git a/apps/apple/VulkanSplatting/VulkanSplatting/ContentView.swift b/apps/apple/VulkanSplatting/VulkanSplatting/ContentView.swift new file mode 100644 index 0000000..33f3c8d --- /dev/null +++ b/apps/apple/VulkanSplatting/VulkanSplatting/ContentView.swift @@ -0,0 +1,123 @@ +import SwiftUI + +struct ContentView: View { + + @State var completedAnimation = false + @State var isSceneSelected = false + @State var sceneFile: URL? + @State private var showFileImporter = false + + var body: some View { + if !completedAnimation { + SplashScreenView(completedAnimation: $completedAnimation) + } else { + GeometryReader { geometry in + ZStack { + Color(hex: 0x0f032e, alpha: 1.0) + .edgesIgnoringSafeArea(.all) + + Image("logo") // Replace "your-logo" with your actual logo image + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 200, height: 200) + .clipShape(Circle()) + .offset(y: -geometry.size.height / 3) + + Text("VulkanSplatting") + .font(.title) + .fontWeight(.bold) + .foregroundColor(.white) + .offset(y: -geometry.size.height / 3 + 100) // Adjust positioning as needed + + VStack { + Button(action: { + showFileImporter = true + }) { + VStack { + Image(systemName: "square.and.arrow.down") + .font(.largeTitle) // Adjust the size as needed + + Text("Open scene") + .fontWeight(.medium) + } + .foregroundColor(Color(hex: 0xE0E0E0)) // Sets the color of the text and icon + .padding() // Adds space around the icon and text + .background( + RoundedRectangle(cornerSize: CGSize(width: 8, height: 8)) // Rounded rectangle background + .stroke(style: StrokeStyle(lineWidth: 2, dash: [10])) // Dashed border + .foregroundColor(Color(hex: 0xE0E0E0)) + ) + } + + Spacer() + + Link(destination: URL(string: "https://github.com/shg8/VulkanSplatting")!) { + Label { + Text("Leave a star!") + .font(.subheadline.lowercaseSmallCaps()) + } icon: { + Image("github-mark-white") + .resizable() + .frame(width: 20, height: 20) + } + }.padding() + } + .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: geometry.size.height / 2) + .offset(y: geometry.size.height / 4) + .edgesIgnoringSafeArea(.all) + .fileImporter( + isPresented: $showFileImporter, + allowedContentTypes: [.data], + allowsMultipleSelection: false + ) { result in + switch result { + case .success(let files): + files.forEach { file in + // gain access to the directory + let gotAccess = file.startAccessingSecurityScopedResource() + if !gotAccess { return } + // access the directory URL + // (read templates in the directory, make a bookmark, etc.) + sceneFile = file + isSceneSelected = true + // handlePickedPDF(file) + // release access + // file.stopAccessingSecurityScopedResource() + } + case .failure(let error): + // handle error + print(error) + } + }.fullScreenCover(isPresented: $isSceneSelected) { + VulkanView(sceneFile: $sceneFile) + .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity) + .edgesIgnoringSafeArea(.all) + .overlay(alignment: .topLeading) { + CloseButton(action: { + isSceneSelected = false + }) + .padding() + .frame(maxWidth: .infinity, alignment: .topLeading) + } + } + }.preferredColorScheme(.dark) + }.frame(maxWidth: .infinity, maxHeight: .infinity) + .ignoresSafeArea() + } + } +} + +struct CloseButton: View { + var action: () -> Void + + var body: some View { + Button(action: action) { + Image(systemName: "xmark.circle.fill") + .font(.title) + .foregroundColor(.white) + } + .padding(10) + .background(Color.black.opacity(0.5)) + .clipShape(Circle()) + } +} diff --git a/apps/apple/VulkanSplatting/VulkanSplatting/DummyImguiManager.cpp b/apps/apple/VulkanSplatting/VulkanSplatting/DummyImguiManager.cpp new file mode 100644 index 0000000..2f8c87f --- /dev/null +++ b/apps/apple/VulkanSplatting/VulkanSplatting/DummyImguiManager.cpp @@ -0,0 +1,28 @@ +#include "ImguiManager.h" + +ImguiManager::ImguiManager(std::shared_ptr context, std::shared_ptr swapchain, + std::shared_ptr window) { +} + +void ImguiManager::createCommandPool() { +} + +void ImguiManager::setStyle() { + +} + +void ImguiManager::init() { + +} + +void ImguiManager::immediateSubmit(std::function&& function) { + +} + +void ImguiManager::draw(vk::CommandBuffer commandBuffer, uint32_t currentImageIndex, std::function imguiFunction) { + +} + +ImguiManager::~ImguiManager() { + +} diff --git a/apps/apple/VulkanSplatting/VulkanSplatting/Info.plist b/apps/apple/VulkanSplatting/VulkanSplatting/Info.plist new file mode 100644 index 0000000..0c67376 --- /dev/null +++ b/apps/apple/VulkanSplatting/VulkanSplatting/Info.plist @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/apple/VulkanSplatting/VulkanSplatting/Preview Content/Preview Assets.xcassets/Contents.json b/apps/apple/VulkanSplatting/VulkanSplatting/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/apps/apple/VulkanSplatting/VulkanSplatting/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/apps/apple/VulkanSplatting/VulkanSplatting/SplashScreenView.swift b/apps/apple/VulkanSplatting/VulkanSplatting/SplashScreenView.swift new file mode 100644 index 0000000..8af9fc8 --- /dev/null +++ b/apps/apple/VulkanSplatting/VulkanSplatting/SplashScreenView.swift @@ -0,0 +1,69 @@ +import SwiftUI + +struct SplashScreenView: View { + @Binding var completedAnimation: Bool + + // Animation states + @State private var startAnimation = false + @State private var expandBackground = false + @State private var textOpacity = 0.0 + + var body: some View { + ZStack { + // The expanding background + Color(hex: 0x0f032e, alpha: 1.0) + .frame(width: expandBackground ? 2000 : 200, height: expandBackground ? 2000 : 200) + .clipShape(Circle()) + .onAppear { + // Start the initial logo animation + withAnimation(.easeIn(duration: 0.5)) { + startAnimation = true + withAnimation(.easeInOut(duration: 0.5)) { + expandBackground = true + } + } + // Begin fading in the text slightly after the logo starts moving + withAnimation(.easeIn(duration: 0.5).delay(0.25)) { + textOpacity = 1.0 + } + // Transition to main content after animations + DispatchQueue.main.asyncAfter(deadline: .now() + 1) { + completedAnimation = true + } + } + .offset(y: startAnimation ? -UIScreen.main.bounds.height / 3 : 0) + + // Your logo at the center +// if !completedAnimation { + Image("logo") // Replace "your-logo" with your actual logo image + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 200, height: 200) + .clipShape(Circle()) + .offset(y: startAnimation ? -UIScreen.main.bounds.height / 3 : 0) + + // Add this below the Image view for the logo + Text("VulkanSplatting") + .font(.title) + .fontWeight(.bold) + .foregroundColor(.white) + .opacity(textOpacity) + .offset(y: startAnimation ? (-UIScreen.main.bounds.height / 3) + 100 : 0) // Adjust positioning as needed +// } + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + .ignoresSafeArea() + } +} + +extension Color { + init(hex: UInt, alpha: Double = 1) { + self.init( + .sRGB, + red: Double((hex >> 16) & 0xff) / 255, + green: Double((hex >> 08) & 0xff) / 255, + blue: Double((hex >> 00) & 0xff) / 255, + opacity: alpha + ) + } +} diff --git a/apps/apple/VulkanSplatting/VulkanSplatting/VulkanController.swift b/apps/apple/VulkanSplatting/VulkanSplatting/VulkanController.swift new file mode 100644 index 0000000..11bf0fa --- /dev/null +++ b/apps/apple/VulkanSplatting/VulkanSplatting/VulkanController.swift @@ -0,0 +1,142 @@ +// +// VulkanController.swift +// VulkanSplatting +// +// Created by Steven on 3/14/24. +// + +import SwiftUI +import UIKit + +class MetalView: UIView { + override class var layerClass: AnyClass { + return CAMetalLayer.self + } +} + +class VulkanController: UIViewController { + + var sceneFile: URL? + var panGesture: UIPanGestureRecognizer! + var moveGesture: UIPanGestureRecognizer! + var pinchGesture: UIPinchGestureRecognizer! + var displayLink: CADisplayLink! + + override func loadView() { + view = MetalView() + } + + override func viewDidLoad() { + super.viewDidLoad() + + self.view.contentScaleFactor = UIScreen.main.nativeScale; + + setupInput() + + displayLink = CADisplayLink(target: self, selector: #selector(self.renderLoop)) + displayLink.preferredFrameRateRange = CAFrameRateRange(minimum: 60.0, maximum: 60.0, preferred: 60.0) + } + + func getCurrentOrientationMask() -> UIInterfaceOrientationMask { + switch UIDevice.current.orientation { + case .portrait: + return .portrait + case .landscapeRight: + return .landscapeRight + case .landscapeLeft: + return .landscapeLeft + case .portraitUpsideDown: + return .portraitUpsideDown + default: + return .portrait + } + } + + override func viewDidAppear(_ animated: Bool) { + // lock orientaion + VulkanSplattingApp.orientationLock = getCurrentOrientationMask() + let metalLayer = self.view.layer as! CAMetalLayer + + var config = VulkanSplatting.RendererConfiguration() + + config.scene = std.string(sceneFile!.path(percentEncoded: false)) + config.window = VulkanSplatting.createMetalWindow(Unmanaged.passUnretained(metalLayer).toOpaque(), Int32(UIScreen.main.nativeBounds.width), Int32(UIScreen.main.nativeBounds.height)) + + vkgs_initialize(config) + displayLink.add(to: .current, forMode: .default) + } + + override func viewDidDisappear(_ animated: Bool) { + displayLink.remove(from: .current, forMode: .default) + vkgs_cleanup() + VulkanSplattingApp.orientationLock = .all + } + + @objc func handlePanGesture(_ recognizer: UIPanGestureRecognizer) { + let translation = recognizer.translation(in: self.view) + + // Reset the translation to zero after it's been used so the next callback gives incremental changes + recognizer.setTranslation(CGPoint.zero, in: self.view) + vkgs_pan_translation(Float(translation.x), Float(translation.y)) + } + + @objc func handleMoveGesture(_ recognizer: UIPanGestureRecognizer) { + let translation = recognizer.translation(in: self.view) + + recognizer.setTranslation(CGPoint.zero, in: self.view) + vkgs_movement(Float(translation.x * -0.01), Float(translation.y * 0.01), 0) + } + + @objc func handlePinch(_ gesture: UIPinchGestureRecognizer) { + if gesture.state == .changed { + // Determine whether the user is zooming in or out + let scale = gesture.scale + if scale > 1.0 { + // Zooming in + vkgs_movement(0, 0, -Float(scale - 1)) + } else { + // Zooming out + vkgs_movement(0, 0, 1-Float(scale)) + } + + // Reset the scale to avoid accumulating the scale factor + gesture.scale = 1.0 + } + } + + + @objc func renderLoop() { + print("renderLoop") + vkgs_draw() + } + + func setupInput() { + panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture(_:))) + panGesture.maximumNumberOfTouches = 1 + panGesture.minimumNumberOfTouches = 1 + self.view.addGestureRecognizer(panGesture) + + moveGesture = UIPanGestureRecognizer(target: self, action: #selector(handleMoveGesture(_:))) + moveGesture.maximumNumberOfTouches = 2 + moveGesture.minimumNumberOfTouches = 2 + self.view.addGestureRecognizer(moveGesture) + + pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(handlePinch(_:))) + self.view.addGestureRecognizer(pinchGesture) + } +} + +struct VulkanView: UIViewControllerRepresentable { + + @Binding var sceneFile: URL? + + func updateUIViewController(_ uiViewController: VulkanController, context: Context) { + + } + + func makeUIViewController(context: Context) -> VulkanController { + var controller = VulkanController() + controller.sceneFile = sceneFile + return controller + } +} diff --git a/apps/apple/VulkanSplatting/VulkanSplatting/VulkanSplattingApp.swift b/apps/apple/VulkanSplatting/VulkanSplatting/VulkanSplattingApp.swift new file mode 100644 index 0000000..4bf03e8 --- /dev/null +++ b/apps/apple/VulkanSplatting/VulkanSplatting/VulkanSplattingApp.swift @@ -0,0 +1,30 @@ +import SwiftUI + +@main +struct VulkanSplattingApp: App { + + static var orientationLock = UIInterfaceOrientationMask.portrait { + didSet { + if #available(iOS 16.0, *) { + UIApplication.shared.connectedScenes.forEach { scene in + if let windowScene = scene as? UIWindowScene { + windowScene.requestGeometryUpdate(.iOS(interfaceOrientations: orientationLock)) + } + } + UIViewController.attemptRotationToDeviceOrientation() + } else { + if orientationLock == .landscape { + UIDevice.current.setValue(UIInterfaceOrientation.landscapeRight.rawValue, forKey: "orientation") + } else { + UIDevice.current.setValue(UIInterfaceOrientation.portrait.rawValue, forKey: "orientation") + } + } + } + } + + var body: some Scene { + WindowGroup { + ContentView() + } + } +} diff --git a/apps/apple/VulkanSplatting/include/spdlog/spdlog.h b/apps/apple/VulkanSplatting/include/spdlog/spdlog.h new file mode 100644 index 0000000..e9cbc0d --- /dev/null +++ b/apps/apple/VulkanSplatting/include/spdlog/spdlog.h @@ -0,0 +1,75 @@ +#ifndef spdlog_h +#define spdlog_h + +#include + +class spdlog { +public: + + template + static void debug(const char* fmt, Args... args) { + log("DEBUG", fmt, args...); + } + + template + static void info(const char* fmt, Args... args) { + log("INFO", fmt, args...); + } + + template + static void warn(const char* fmt, Args... args) { + log("WARN", fmt, args...); + } + + template + static void error(const char* fmt, Args... args) { + log("ERROR", fmt, args...); + } + + template + static void critical(const char* fmt, Args... args) { + log("CRITICAL", fmt, args...); + } + +private: + + template + static std::string to_string(T value) + { + std::ostringstream os; + os << value; + return os.str(); + } + + template + static std::string fmt(const std::string& format, Args... args) + { + std::string result = format; + std::string::size_type pos; + int count = 0; + std::string argStrings[] = { to_string(args)... }; + + while ((pos = result.find("{}")) != std::string::npos) + { + if (count < sizeof...(args)) + { + result.replace(pos, 2, argStrings[count++]); + } + else + { + throw std::runtime_error("Not enough arguments provided for format string"); + } + } + + return result; + } + + template + static void log(const char* level, const char* fmt, Args... args) { + std::string message = spdlog::fmt(fmt, args...); + printf("[%s] %s\n", level, message.c_str()); + } + +}; + +#endif diff --git a/apps/apple/VulkanSplatting/project.xcconfig b/apps/apple/VulkanSplatting/project.xcconfig new file mode 100644 index 0000000..49499a9 --- /dev/null +++ b/apps/apple/VulkanSplatting/project.xcconfig @@ -0,0 +1,4 @@ +// Configuration settings file format documentation can be found at: +// https://help.apple.com/xcode/#/dev745c5c974 + +DEVELOPMENT_TEAM = J76DD3X5AH diff --git a/apps/viewer/main.cpp b/apps/viewer/main.cpp index c45b066..b02d8e3 100644 --- a/apps/viewer/main.cpp +++ b/apps/viewer/main.cpp @@ -84,13 +84,10 @@ int main(int argc, char** argv) { config.enableGui = false; } - if (widthFlag) { - config.width = args::get(widthFlag); - } + auto width = widthFlag ? args::get(widthFlag) : 1280; + auto height = heightFlag ? args::get(heightFlag) : 720; - if (heightFlag) { - config.height = args::get(heightFlag); - } + config.window = VulkanSplatting::createGlfwWindow("Vulkan Splatting", width, height); #ifndef DEBUG try { diff --git a/include/vulkan_splatting/VulkanSplatting.h b/include/vulkan_splatting/VulkanSplatting.h index f849a05..a4d711e 100644 --- a/include/vulkan_splatting/VulkanSplatting.h +++ b/include/vulkan_splatting/VulkanSplatting.h @@ -3,6 +3,10 @@ #include #include +#include + +class Window; +class Renderer; class VulkanSplatting { public: @@ -15,16 +19,35 @@ class VulkanSplatting { float fov = 45.0f; float near = 0.2f; float far = 1000.0f; - bool enableGui = true; - uint32_t width = 800; - uint32_t height = 600; + bool enableGui = false; + + std::shared_ptr window; }; explicit VulkanSplatting(RendererConfiguration configuration) : configuration(configuration) {} - void start() const; +#ifdef VKGS_ENABLE_GLFW + static std::shared_ptr createGlfwWindow(std::string name, int width, int height); +#endif + +#ifdef VKGS_ENABLE_METAL + static std::shared_ptr createMetalWindow(void *caMetalLayer, int width, int height); +#endif + + void start(); + + void initialize(); + + void draw(); + + void logTranslation(float x, float y); + + void logMovement(float x, float y, float z); + + void stop(); private: RendererConfiguration configuration; + std::shared_ptr renderer; }; #endif //VULKANSPLATTING_H diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7f066f8..c457689 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -12,9 +12,11 @@ file(GLOB EXTERNAL_SOURCE third_party/implot/implot_items.cpp ) -file(GLOB_RECURSE SOURCE +file(GLOB SOURCE *.cpp - vulkan/*.cpp) + vulkan/*.cpp + vulkan/pipelines/*.cpp + vulkan/windowing/GLFWWindow.cpp) add_library(vulkan_splatting STATIC ${SOURCE} diff --git a/src/DummyGUIManager.cpp b/src/DummyGUIManager.cpp new file mode 100644 index 0000000..9075f6e --- /dev/null +++ b/src/DummyGUIManager.cpp @@ -0,0 +1,35 @@ +#include "GUIManager.h" + +#include + +GUIManager::GUIManager() { + +} + +void GUIManager::init() { + +} + +void GUIManager::buildGui() { + +} + +void GUIManager::pushTextMetric(const std::string& name, float value) { + +} + +void GUIManager::pushMetric(const std::string& name, float value) { + +} + +void GUIManager::pushMetric(const std::unordered_map& name) { + +} + +bool GUIManager::wantCaptureMouse() { + return false; +} + +bool GUIManager::wantCaptureKeyboard() { + return false; +} diff --git a/src/GUIManager.cpp b/src/GUIManager.cpp index b551f76..9e85984 100644 --- a/src/GUIManager.cpp +++ b/src/GUIManager.cpp @@ -2,6 +2,34 @@ #include +#include "imgui.h" +#include "implot/implot.h" + +struct ScrollingBuffer { + int maxSize; + int offset; + ImVector data; + explicit ScrollingBuffer(const int max_size = 10000) { + maxSize = max_size; + offset = 0; + data.reserve(maxSize); + } + void addPoint(float x, float y) { + if (data.size() < maxSize) + data.push_back(ImVec2(x,y)); + else { + data[offset] = ImVec2(x,y); + offset = (offset + 1) % maxSize; + } + } + void clear() { + if (data.size() > 0) { + data.shrink(0); + offset = 0; + } + } +}; + static std::shared_ptr> metricsMap; static std::shared_ptr> textMetricsMap; diff --git a/src/GUIManager.h b/src/GUIManager.h index e50a726..4adc829 100644 --- a/src/GUIManager.h +++ b/src/GUIManager.h @@ -5,34 +5,6 @@ #include #include -#include "imgui.h" -#include "implot/implot.h" - -struct ScrollingBuffer { - int maxSize; - int offset; - ImVector data; - explicit ScrollingBuffer(const int max_size = 10000) { - maxSize = max_size; - offset = 0; - data.reserve(maxSize); - } - void addPoint(float x, float y) { - if (data.size() < maxSize) - data.push_back(ImVec2(x,y)); - else { - data[offset] = ImVec2(x,y); - offset = (offset + 1) % maxSize; - } - } - void clear() { - if (data.size() > 0) { - data.shrink(0); - offset = 0; - } - } -}; - class GUIManager { public: GUIManager(); diff --git a/src/Renderer.cpp b/src/Renderer.cpp index b0df827..5a1b66c 100644 --- a/src/Renderer.cpp +++ b/src/Renderer.cpp @@ -5,7 +5,7 @@ #include "vulkan/Swapchain.h" #include -#include +#include "shaders.h" #include #include @@ -34,13 +34,14 @@ void Renderer::handleInput() { auto translation = window->getCursorTranslation(); auto keys = window->getKeys(); // W, A, S, D - if (!guiManager.wantCaptureMouse() && !guiManager.mouseCapture && window->getMouseButton()[0]) { + if ((!configuration.enableGui || (!guiManager.wantCaptureMouse() && !guiManager.mouseCapture)) && window-> + getMouseButton()[0]) { window->mouseCapture(true); guiManager.mouseCapture = true; } // rotate camera - if (guiManager.mouseCapture) { + if (!configuration.enableGui || guiManager.mouseCapture) { if (translation[0] != 0.0 || translation[1] != 0.0) { camera.rotation = glm::rotate(camera.rotation, static_cast(translation[0]) * 0.005f, glm::vec3(0.0f, -1.0f, 0.0f)); @@ -49,9 +50,8 @@ void Renderer::handleInput() { } } - // move camera - if (!guiManager.wantCaptureKeyboard()) { + if (!configuration.enableGui || !guiManager.wantCaptureKeyboard()) { glm::vec3 direction = glm::vec3(0.0f, 0.0f, 0.0f); if (keys[0]) { direction += glm::vec3(0.0f, 0.0f, -1.0f); @@ -94,14 +94,31 @@ void Renderer::retrieveTimestamps() { auto metrics = queryManager->parseResults(timestamps); for (auto& metric: metrics) { - guiManager.pushMetric(metric.first, metric.second / 1000000.0); + if (configuration.enableGui) + guiManager.pushMetric(metric.first, metric.second / 1000000.0); } } +void Renderer::recreateSwapchain() { + auto oldExtent = swapchain->swapchainExtent; + swapchain->recreate(); + if (swapchain->swapchainExtent == oldExtent) { + return; + } + + auto [width, height] = swapchain->swapchainExtent; + auto tileX = (width + 16 - 1) / 16; + auto tileY = (height + 16 - 1) / 16; + tileBoundaryBuffer->realloc(tileX * tileY * sizeof(uint32_t) * 2); + + recordPreprocessCommandBuffer(); + createRenderPipeline(); +} + void Renderer::initializeVulkan() { spdlog::debug("Initializing Vulkan"); - window = std::make_shared("Vulkan Splatting", configuration.width, configuration.height); - context = std::make_shared(Window::getRequiredInstanceExtensions(), std::vector{}, + window = configuration.window; + context = std::make_shared(window->getRequiredInstanceExtensions(), std::vector{}, configuration.enableVulkanValidationLayers); context->createInstance(); @@ -113,6 +130,7 @@ void Renderer::initializeVulkan() { vk::PhysicalDeviceVulkan12Features pdf12{}; pdf.shaderStorageImageWriteWithoutFormat = true; pdf.shaderInt64 = true; + // pdf.robustBufferAccess = true; // pdf12.shaderFloat16 = true; // pdf12.shaderBufferInt64Atomics = true; // pdf12.shaderSharedInt64Atomics = true; @@ -120,7 +138,6 @@ void Renderer::initializeVulkan() { context->createLogicalDevice(pdf, pdf11, pdf12); context->createDescriptorPool(1); - auto [width, height] = window->getFramebufferSize(); swapchain = std::make_shared(context, window, configuration.immediateSwapchain); for (int i = 0; i < FRAMES_IN_FLIGHT; i++) { @@ -149,7 +166,8 @@ void Renderer::createPreprocessPipeline() { vertexAttributeBuffer = Buffer::storage(context, scene->getNumVertices() * sizeof(VertexAttributeBuffer), false); tileOverlapBuffer = Buffer::storage(context, scene->getNumVertices() * sizeof(uint32_t), false); - preprocessPipeline = std::make_shared(context, std::make_shared(context, "preprocess", SPV_PREPROCESS, SPV_PREPROCESS_len)); + preprocessPipeline = std::make_shared( + context, std::make_shared(context, "preprocess", SPV_PREPROCESS, SPV_PREPROCESS_len)); inputSet = std::make_shared(context, FRAMES_IN_FLIGHT); inputSet->bindBufferToDescriptorSet(0, vk::DescriptorType::eStorageBuffer, vk::ShaderStageFlagBits::eCompute, scene->vertexBuffer); @@ -178,11 +196,12 @@ Renderer::Renderer(VulkanSplatting::RendererConfiguration configuration) : confi } void Renderer::createGui() { - spdlog::debug("Creating GUI"); if (!configuration.enableGui) { return; } + spdlog::debug("Creating GUI"); + imguiManager = std::make_shared(context, swapchain, window); imguiManager->init(); guiManager.init(); @@ -194,7 +213,8 @@ void Renderer::createPrefixSumPipeline() { prefixSumPongBuffer = Buffer::storage(context, scene->getNumVertices() * sizeof(uint32_t), false); totalSumBufferHost = Buffer::staging(context, sizeof(uint32_t)); - prefixSumPipeline = std::make_shared(context, std::make_shared(context, "prefix_sum", SPV_PREFIX_SUM, SPV_PREFIX_SUM_len)); + prefixSumPipeline = std::make_shared( + context, std::make_shared(context, "prefix_sum", SPV_PREFIX_SUM, SPV_PREFIX_SUM_len)); auto descriptorSet = std::make_shared(context, FRAMES_IN_FLIGHT); descriptorSet->bindBufferToDescriptorSet(0, vk::DescriptorType::eStorageBuffer, vk::ShaderStageFlagBits::eCompute, prefixSumPingBuffer); @@ -226,8 +246,10 @@ void Renderer::createRadixSortPipeline() { sortHistBuffer = Buffer::storage(context, numWorkgroups * 256 * sizeof(uint32_t), false); - sortHistPipeline = std::make_shared(context, std::make_shared(context, "hist", SPV_HIST, SPV_HIST_len)); - sortPipeline = std::make_shared(context, std::make_shared(context, "sort", SPV_SORT, SPV_SORT_len)); + sortHistPipeline = std::make_shared( + context, std::make_shared(context, "hist", SPV_HIST, SPV_HIST_len)); + sortPipeline = std::make_shared( + context, std::make_shared(context, "sort", SPV_SORT, SPV_SORT_len)); auto descriptorSet = std::make_shared(context, FRAMES_IN_FLIGHT); descriptorSet->bindBufferToDescriptorSet(0, vk::DescriptorType::eStorageBuffer, vk::ShaderStageFlagBits::eCompute, @@ -268,7 +290,8 @@ void Renderer::createRadixSortPipeline() { void Renderer::createPreprocessSortPipeline() { spdlog::debug("Creating preprocess sort pipeline"); - preprocessSortPipeline = std::make_shared(context, std::make_shared(context, "preprocess_sort", SPV_PREPROCESS_SORT, SPV_PREPROCESS_SORT_len)); + preprocessSortPipeline = std::make_shared( + context, std::make_shared(context, "preprocess_sort", SPV_PREPROCESS_SORT, SPV_PREPROCESS_SORT_len)); auto descriptorSet = std::make_shared(context, FRAMES_IN_FLIGHT); descriptorSet->bindBufferToDescriptorSet(0, vk::DescriptorType::eStorageBuffer, vk::ShaderStageFlagBits::eCompute, vertexAttributeBuffer); @@ -289,12 +312,13 @@ void Renderer::createPreprocessSortPipeline() { void Renderer::createTileBoundaryPipeline() { spdlog::debug("Creating tile boundary pipeline"); - auto [width, height] = window->getFramebufferSize(); + auto [width, height] = swapchain->swapchainExtent; auto tileX = (width + 16 - 1) / 16; auto tileY = (height + 16 - 1) / 16; tileBoundaryBuffer = Buffer::storage(context, tileX * tileY * sizeof(uint32_t) * 2, false); - tileBoundaryPipeline = std::make_shared(context, std::make_shared(context, "tile_boundary", SPV_TILE_BOUNDARY, SPV_TILE_BOUNDARY_len)); + tileBoundaryPipeline = std::make_shared( + context, std::make_shared(context, "tile_boundary", SPV_TILE_BOUNDARY, SPV_TILE_BOUNDARY_len)); auto descriptorSet = std::make_shared(context, FRAMES_IN_FLIGHT); descriptorSet->bindBufferToDescriptorSet(0, vk::DescriptorType::eStorageBuffer, vk::ShaderStageFlagBits::eCompute, sortKBufferEven); @@ -311,7 +335,8 @@ void Renderer::createTileBoundaryPipeline() { void Renderer::createRenderPipeline() { spdlog::debug("Creating render pipeline"); - renderPipeline = std::make_shared(context, std::make_shared(context, "render", SPV_RENDER, SPV_RENDER_len)); + renderPipeline = std::make_shared( + context, std::make_shared(context, "render", SPV_RENDER, SPV_RENDER_len)); auto inputSet = std::make_shared(context, FRAMES_IN_FLIGHT); inputSet->bindBufferToDescriptorSet(0, vk::DescriptorType::eStorageBuffer, vk::ShaderStageFlagBits::eCompute, vertexAttributeBuffer); @@ -335,66 +360,70 @@ void Renderer::createRenderPipeline() { renderPipeline->build(); } -void Renderer::run() { - auto i = 0; - while (running) { - if (!window->tick()) { - break; - } - auto ret = context->device->waitForFences(inflightFences[0].get(), VK_TRUE, UINT64_MAX); - if (ret != vk::Result::eSuccess) { - throw std::runtime_error("Failed to wait for fence"); - } - context->device->resetFences(inflightFences[0].get()); - - auto res = context->device->acquireNextImageKHR(swapchain->swapchain.get(), UINT64_MAX, - swapchain->imageAvailableSemaphores[0].get(), - nullptr, ¤tImageIndex); - if (res == vk::Result::eErrorOutOfDateKHR) { - swapchain->recreate(); - continue; - } else if (res != vk::Result::eSuccess && res != vk::Result::eSuboptimalKHR) { - throw std::runtime_error("Failed to acquire swapchain image"); - } +void Renderer::draw() { + auto ret = context->device->waitForFences(inflightFences[0].get(), VK_TRUE, UINT64_MAX); + if (ret != vk::Result::eSuccess) { + throw std::runtime_error("Failed to wait for fence"); + } + context->device->resetFences(inflightFences[0].get()); + + auto res = context->device->acquireNextImageKHR(swapchain->swapchain.get(), UINT64_MAX, + swapchain->imageAvailableSemaphores[0].get(), + nullptr, ¤tImageIndex); + if (res == vk::Result::eErrorOutOfDateKHR) { + recreateSwapchain(); + return; + } else if (res != vk::Result::eSuccess && res != vk::Result::eSuboptimalKHR) { + throw std::runtime_error("Failed to acquire swapchain image"); + } - startOfRenderLoop: - handleInput(); +startOfRenderLoop: + handleInput(); - updateUniforms(); + updateUniforms(); - auto submitInfo = vk::SubmitInfo{}.setCommandBuffers(preprocessCommandBuffer.get()); - context->queues[VulkanContext::Queue::COMPUTE].queue.submit(submitInfo, inflightFences[0].get()); + auto submitInfo = vk::SubmitInfo{}.setCommandBuffers(preprocessCommandBuffer.get()); + context->queues[VulkanContext::Queue::COMPUTE].queue.submit(submitInfo, inflightFences[0].get()); - ret = context->device->waitForFences(inflightFences[0].get(), VK_TRUE, UINT64_MAX); - if (ret != vk::Result::eSuccess) { - throw std::runtime_error("Failed to wait for fence"); - } - context->device->resetFences(inflightFences[0].get()); + ret = context->device->waitForFences(inflightFences[0].get(), VK_TRUE, UINT64_MAX); + if (ret != vk::Result::eSuccess) { + throw std::runtime_error("Failed to wait for fence"); + } + context->device->resetFences(inflightFences[0].get()); - if (!recordRenderCommandBuffer(0)) { - goto startOfRenderLoop; - } - vk::PipelineStageFlags waitStage = vk::PipelineStageFlagBits::eComputeShader; - submitInfo = vk::SubmitInfo{}.setWaitSemaphores(swapchain->imageAvailableSemaphores[0].get()) - .setCommandBuffers(renderCommandBuffer.get()) - .setSignalSemaphores(renderFinishedSemaphores[0].get()) - .setWaitDstStageMask(waitStage); - context->queues[VulkanContext::Queue::COMPUTE].queue.submit(submitInfo, inflightFences[0].get()); - - vk::PresentInfoKHR presentInfo{}; - presentInfo.waitSemaphoreCount = 1; - presentInfo.pWaitSemaphores = &renderFinishedSemaphores[0].get(); - presentInfo.swapchainCount = 1; - presentInfo.pSwapchains = &swapchain->swapchain.get(); - presentInfo.pImageIndices = ¤tImageIndex; - - ret = context->queues[VulkanContext::Queue::PRESENT].queue.presentKHR(presentInfo); - if (ret == vk::Result::eErrorOutOfDateKHR || ret == vk::Result::eSuboptimalKHR) { - swapchain->recreate(); - } else if (ret != vk::Result::eSuccess) { - throw std::runtime_error("Failed to present swapchain image"); + if (!recordRenderCommandBuffer(0)) { + goto startOfRenderLoop; + } + vk::PipelineStageFlags waitStage = vk::PipelineStageFlagBits::eComputeShader; + submitInfo = vk::SubmitInfo{}.setWaitSemaphores(swapchain->imageAvailableSemaphores[0].get()) + .setCommandBuffers(renderCommandBuffer.get()) + .setSignalSemaphores(renderFinishedSemaphores[0].get()) + .setWaitDstStageMask(waitStage); + context->queues[VulkanContext::Queue::COMPUTE].queue.submit(submitInfo, inflightFences[0].get()); + + vk::PresentInfoKHR presentInfo{}; + presentInfo.waitSemaphoreCount = 1; + presentInfo.pWaitSemaphores = &renderFinishedSemaphores[0].get(); + presentInfo.swapchainCount = 1; + presentInfo.pSwapchains = &swapchain->swapchain.get(); + presentInfo.pImageIndices = ¤tImageIndex; + + ret = context->queues[VulkanContext::Queue::PRESENT].queue.presentKHR(presentInfo); + if (ret == vk::Result::eErrorOutOfDateKHR || ret == vk::Result::eSuboptimalKHR) { + recreateSwapchain(); + } else if (ret != vk::Result::eSuccess) { + throw std::runtime_error("Failed to present swapchain image"); + } +} + +void Renderer::run() { + while (running) { + if (!window->tick()) { + break; } + draw(); + auto now = std::chrono::high_resolution_clock::now(); auto diff = std::chrono::duration_cast(now - lastFpsTime).count(); if (diff > 1000) { @@ -406,31 +435,18 @@ void Renderer::run() { } retrieveTimestamps(); - - // auto nn = totalSumBufferHost->readOne() ; - // auto staging = Buffer::staging(context, nn* sizeof(uint64_t)); - // sortKVBufferEven->downloadTo(staging); - // uint64_t* data = reinterpret_cast(staging->allocation_info.pMappedData); - // for (int i = 0; i < nn; i++) { - // auto key = data[i] >> 32; - // if (i > 0) { - // assert(key >= data[i-1] >> 32); - // } - // } - // - // uint32_t totalSum = totalSumBufferHost->readOne(); - // std::cout << "Total sum: " << totalSum << std::endl; - // // - // auto v = tileBoundaryBuffer->download(); - // uint32_t* data2 = reinterpret_cast(v.data()); - // for (int i = 0; i < v.size() / sizeof(uint32_t); i+=2) { - // assert(data2[i] <= data2[i+1]); - // } } context->device->waitIdle(); } +void Renderer::stop() { + // wait till device is idle + running = false; + + context->device->waitIdle(); +} + void Renderer::createCommandPool() { spdlog::debug("Creating command pool"); vk::CommandPoolCreateInfo poolInfo = {}; @@ -497,25 +513,6 @@ void Renderer::recordPreprocessCommandBuffer() { &totalSumRegion); } - vertexAttributeBuffer->computeWriteReadBarrier(preprocessCommandBuffer.get()); - - preprocessCommandBuffer->writeTimestamp(vk::PipelineStageFlagBits::eBottomOfPipe, context->queryPool.get(), - queryManager->registerQuery("prefix_sum_end")); - - preprocessSortPipeline->bind(preprocessCommandBuffer, 0, iters % 2 == 0 ? 0 : 1); - preprocessCommandBuffer->writeTimestamp(vk::PipelineStageFlagBits::eTopOfPipe, context->queryPool.get(), - queryManager->registerQuery("preprocess_sort_start")); - uint32_t tileX = (swapchain->swapchainExtent.width + 16 - 1) / 16; - // assert(tileX == 50); - preprocessCommandBuffer->pushConstants(preprocessSortPipeline->pipelineLayout.get(), - vk::ShaderStageFlagBits::eCompute, 0, - sizeof(uint32_t), &tileX); - preprocessCommandBuffer->dispatch(numGroups, 1, 1); - - sortKBufferEven->computeWriteReadBarrier(preprocessCommandBuffer.get()); - preprocessCommandBuffer->writeTimestamp(vk::PipelineStageFlagBits::eBottomOfPipe, context->queryPool.get(), - queryManager->registerQuery("preprocess_sort_end")); - preprocessCommandBuffer->end(); } @@ -527,6 +524,7 @@ bool Renderer::recordRenderCommandBuffer(uint32_t currentFrame) { } uint32_t numInstances = totalSumBufferHost->readOne(); + spdlog::debug("Num instances: {}", numInstances); guiManager.pushTextMetric("instances", numInstances); if (numInstances > scene->getNumVertices() * sortBufferSizeMultiplier) { auto old = sortBufferSizeMultiplier; @@ -539,7 +537,8 @@ bool Renderer::recordRenderCommandBuffer(uint32_t currentFrame) { sortVBufferEven->realloc(scene->getNumVertices() * sizeof(uint32_t) * sortBufferSizeMultiplier); sortVBufferOdd->realloc(scene->getNumVertices() * sizeof(uint32_t) * sortBufferSizeMultiplier); - uint32_t globalInvocationSize = scene->getNumVertices() * sortBufferSizeMultiplier / numRadixSortBlocksPerWorkgroup; + uint32_t globalInvocationSize = scene->getNumVertices() * sortBufferSizeMultiplier / + numRadixSortBlocksPerWorkgroup; uint32_t remainder = scene->getNumVertices() * sortBufferSizeMultiplier % numRadixSortBlocksPerWorkgroup; globalInvocationSize += remainder > 0 ? 1 : 0; @@ -554,6 +553,34 @@ bool Renderer::recordRenderCommandBuffer(uint32_t currentFrame) { renderCommandBuffer->reset({}); renderCommandBuffer->begin(vk::CommandBufferBeginInfo{}); +#ifdef VKGS_ENABLE_METAL + if (numInstances == 0 && __APPLE__) { + renderCommandBuffer->end(); + return true; + } +#endif + + vertexAttributeBuffer->computeWriteReadBarrier(renderCommandBuffer.get()); + + renderCommandBuffer->writeTimestamp(vk::PipelineStageFlagBits::eBottomOfPipe, context->queryPool.get(), + queryManager->registerQuery("prefix_sum_end")); + + const auto iters = static_cast(std::ceil(std::log2(static_cast(scene->getNumVertices())))); + auto numGroups = (scene->getNumVertices() + 255) / 256; + preprocessSortPipeline->bind(renderCommandBuffer, 0, iters % 2 == 0 ? 0 : 1); + renderCommandBuffer->writeTimestamp(vk::PipelineStageFlagBits::eTopOfPipe, context->queryPool.get(), + queryManager->registerQuery("preprocess_sort_start")); + uint32_t tileX = (swapchain->swapchainExtent.width + 16 - 1) / 16; + // assert(tileX == 50); + renderCommandBuffer->pushConstants(preprocessSortPipeline->pipelineLayout.get(), + vk::ShaderStageFlagBits::eCompute, 0, + sizeof(uint32_t), &tileX); + renderCommandBuffer->dispatch(numGroups, 1, 1); + + sortKBufferEven->computeWriteReadBarrier(renderCommandBuffer.get()); + renderCommandBuffer->writeTimestamp(vk::PipelineStageFlagBits::eBottomOfPipe, context->queryPool.get(), + queryManager->registerQuery("preprocess_sort_end")); + // std::cout << "Num instances: " << numInstances << std::endl; assert(numInstances <= scene->getNumVertices() * sortBufferSizeMultiplier); @@ -623,7 +650,7 @@ bool Renderer::recordRenderCommandBuffer(uint32_t currentFrame) { renderPipeline->bind(renderCommandBuffer, 0, std::vector{0, currentImageIndex}); renderCommandBuffer->writeTimestamp(vk::PipelineStageFlagBits::eTopOfPipe, context->queryPool.get(), queryManager->registerQuery("render_start")); - auto [width, height] = window->getFramebufferSize(); + auto [width, height] = swapchain->swapchainExtent; uint32_t constants[2] = {width, height}; renderCommandBuffer->pushConstants(renderPipeline->pipelineLayout.get(), vk::ShaderStageFlagBits::eCompute, 0, @@ -687,7 +714,7 @@ bool Renderer::recordRenderCommandBuffer(uint32_t currentFrame) { void Renderer::updateUniforms() { UniformBuffer data{}; - auto [width, height] = window->getFramebufferSize(); + auto [width, height] = swapchain->swapchainExtent; data.width = width; data.height = height; data.camera_position = glm::vec4(camera.position, 1.0f); @@ -696,8 +723,11 @@ void Renderer::updateUniforms() { auto translation = glm::translate(glm::mat4(1.0f), camera.position); auto view = glm::inverse(translation * rotation); + float tan_fovx = std::tan(glm::radians(camera.fov) / 2.0); + float tan_fovy = tan_fovx * static_cast(height) / static_cast(width); data.view_mat = view; - data.proj_mat = glm::perspective(glm::radians(camera.fov) / 2.0f, static_cast(width) / static_cast(height), + data.proj_mat = glm::perspective(std::atan(tan_fovy) * 2.0f, + static_cast(width) / static_cast(height), camera.nearPlane, camera.farPlane) * view; @@ -714,8 +744,8 @@ void Renderer::updateUniforms() { data.proj_mat[1][1] *= -1.0f; data.proj_mat[2][1] *= -1.0f; data.proj_mat[3][1] *= -1.0f; - data.tan_fovx = std::tan(glm::radians(camera.fov) / 2.0); - data.tan_fovy = data.tan_fovx * static_cast(height) / static_cast(width); + data.tan_fovx = tan_fovx; + data.tan_fovy = tan_fovy; uniformBuffer->upload(&data, sizeof(UniformBuffer), 0); } diff --git a/src/Renderer.h b/src/Renderer.h index 16d0131..821e5c5 100644 --- a/src/Renderer.h +++ b/src/Renderer.h @@ -4,7 +4,7 @@ #define GLM_SWIZZLE #include -#include +#include "VulkanSplatting.h" #include "vulkan/Window.h" #include "GSScene.h" @@ -34,7 +34,7 @@ class Renderer { glm::uvec4 aabb; glm::vec2 uv; float depth; - float __padding[1]; + uint32_t __padding[1]; }; struct Camera { @@ -43,6 +43,10 @@ class Renderer { float fov; float nearPlane; float farPlane; + + void translate(glm::vec3 translation) { + position += rotation * translation; + } }; struct RadixSortPushConstants { @@ -62,9 +66,24 @@ class Renderer { void retrieveTimestamps(); + void recreateSwapchain(); + + void draw(); + void run(); + void stop(); + ~Renderer(); + + Camera camera { + .position = glm::vec3(0.0f, 0.0f, 0.0f), + .rotation = glm::quat(1.0f, 0.0f, 0.0f, 0.0f), + .fov = 45.0f, + .nearPlane = 0.1f, + .farPlane = 1000.0f + }; + private: VulkanSplatting::RendererConfiguration configuration; std::shared_ptr window; @@ -103,14 +122,6 @@ class Renderer { std::shared_ptr swapchain; - Camera camera { - .position = glm::vec3(0.0f, 0.0f, 0.0f), - .rotation = glm::quat(1.0f, 0.0f, 0.0f, 0.0f), - .fov = 45.0f, - .nearPlane = 0.1f, - .farPlane = 1000.0f - }; - vk::UniqueCommandPool commandPool; vk::UniqueCommandBuffer preprocessCommandBuffer; @@ -120,12 +131,16 @@ class Renderer { std::vector renderFinishedSemaphores; - uint32_t numRadixSortBlocksPerWorkgroup = __APPLE__ ? 256 : 32; +#ifdef __APPLE__ + uint32_t numRadixSortBlocksPerWorkgroup = 256; +#else + uint32_t numRadixSortBlocksPerWorkgroup = 32; +#endif int fpsCounter = 0; std::chrono::high_resolution_clock::time_point lastFpsTime = std::chrono::high_resolution_clock::now(); - unsigned int sortBufferSizeMultiplier = 3; + unsigned int sortBufferSizeMultiplier = 1; void initializeVulkan(); diff --git a/src/VulkanSplatting.cpp b/src/VulkanSplatting.cpp index 660587c..75bfefe 100644 --- a/src/VulkanSplatting.cpp +++ b/src/VulkanSplatting.cpp @@ -1,10 +1,44 @@ #include "VulkanSplatting.h" #include "Renderer.h" -void VulkanSplatting::start() const { +#ifdef VKGS_ENABLE_GLFW +#include "vulkan/windowing/GLFWWindow.h" +std::shared_ptr VulkanSplatting::createGlfwWindow(std::string name, int width, int height) { + return std::make_shared(name, width, height); +} +#endif + +#ifdef VKGS_ENABLE_METAL +#include "vulkan/windowing/MetalWindow.h" +std::shared_ptr VulkanSplatting::createMetalWindow(void *caMetalLayer, int width, int height) { + return std::make_shared(caMetalLayer, width, height); +} +#endif + +void VulkanSplatting::start() { // Create the renderer - Renderer renderer(configuration); - renderer.initialize(); - renderer.createGui(); - renderer.run(); + renderer = std::make_shared(configuration); + renderer->initialize(); + renderer->run(); +} + +void VulkanSplatting::initialize() { + renderer = std::make_shared(configuration); + renderer->initialize(); +} + +void VulkanSplatting::draw() { + renderer->draw(); +} + +void VulkanSplatting::logTranslation(float x, float y) { + configuration.window->logTranslation(x, y); +} + +void VulkanSplatting::logMovement(float x, float y, float z) { + renderer->camera.translate(glm::vec3(x, y, z)); +} + +void VulkanSplatting::stop() { + renderer->stop(); } diff --git a/src/shaders/CMakeLists.txt b/src/shaders/CMakeLists.txt index 1e47d5b..3fc4346 100644 --- a/src/shaders/CMakeLists.txt +++ b/src/shaders/CMakeLists.txt @@ -21,6 +21,8 @@ if (APPLE) endif () set(SHADER_HEADER "${CMAKE_BINARY_DIR}/shaders/shaders.h") +set(XCODE_SHADER "${CMAKE_SOURCE_DIR}/apps/apple/VulkanSplatting/shaders.h") + message(STATUS "Shader header file: ${SHADER_HEADER}") # Delete old header file @@ -52,4 +54,15 @@ foreach (GLSL ${GLSL_SOURCE_FILES}) list(APPEND TEMP_HEADERS ${TEMP_HEADER}) endforeach (GLSL) -add_custom_target(shaders DEPENDS ${SHADER_HEADER} ${SPIRV_BINARY_FILES}) \ No newline at end of file +add_custom_target(shaders DEPENDS ${SHADER_HEADER} ${SPIRV_BINARY_FILES}) + +add_custom_target(xcode_shaders + DEPENDS + ${XCODE_SHADER} +) + +add_custom_command( + OUTPUT ${XCODE_SHADER} + COMMAND ${CMAKE_COMMAND} -E copy ${SHADER_HEADER} ${XCODE_SHADER} + DEPENDS ${SHADER_HEADER} +) \ No newline at end of file diff --git a/src/shaders/calibrate.comp b/src/shaders/calibrate.comp new file mode 100644 index 0000000..5f52602 --- /dev/null +++ b/src/shaders/calibrate.comp @@ -0,0 +1,183 @@ +#version 450 +#extension GL_GOOGLE_include_directive : enable +#include "./common.glsl" + + +layout (std430, set = 0, binding = 0) readonly buffer Vertices { + Vertex vertices[]; +}; + +layout (std430, set = 0, binding = 1) readonly buffer Cov3Ds { + float cov3ds[]; +}; + +layout (std140, set = 1, binding = 0) uniform Params { + vec4 camera_position; + mat4 proj_mat; + mat4 view_mat; + uint width; + uint height; + float tan_fovx; + float tan_fovy; +}; + +layout (std430, set = 1, binding = 1) writeonly buffer VertexAttributes { + VertexAttribute attr[]; +}; + +layout (std430, set = 1, binding = 2) writeonly buffer NumTilesOverlap { + uint tiles_overlap[]; +}; + +layout (local_size_x = TILE_WIDTH * TILE_HEIGHT, local_size_y = 1, local_size_z = 1) in; + +mat3 get_projection_jacobian_approx(vec3 t) { + float limx = 1.3 * tan_fovx; + float limy = 1.3 * tan_fovy; + float txtz = t.x / t.z; + float tytz = t.y / t.z; + t.x = min(limx, max(-limx, txtz)) * t.z; + t.y = min(limy, max(-limy, tytz)) * t.z; + + float focal_x = width / (2 * tan_fovx); + float focal_y = height / (2 * tan_fovy); + + return mat3( + focal_x / t.z, 0, -(focal_x * t.x) / (t.z * t.z), + 0, focal_y / t.z, -(focal_y * t.y) / (t.z * t.z), + 0, 0, 0 + ); +} + +mat2 compute_cov2d(vec3 cam) { + uint index = gl_GlobalInvocationID.x; + mat3 J = get_projection_jacobian_approx(cam); + mat3 W = transpose(mat3(view_mat)); + mat3 Sigma = mat3( + cov3ds[index * 6], cov3ds[index * 6 + 1], cov3ds[index * 6 + 2], + cov3ds[index * 6 + 1], cov3ds[index * 6 + 3], cov3ds[index * 6 + 4], + cov3ds[index * 6 + 2], cov3ds[index * 6 + 4], cov3ds[index * 6 + 5] + ); + mat3 T = W * J; + mat3 cov2d = transpose(T) * Sigma * T; + cov2d[0][0] += 0.3f; + cov2d[1][1] += 0.3f; + return mat2(cov2d); +} + +vec3 get_sh_vec3(uint ind) { + uint index = gl_GlobalInvocationID.x; + return vec3(vertices[index].sh[ind * 3], vertices[index].sh[ind * 3 + 1], vertices[index].sh[ind * 3 + 2]); +} + +vec3 compute_sh() { + uint index = gl_GlobalInvocationID.x; + + vec3 ray_direction = vertices[index].position.xyz - camera_position.xyz; + ray_direction /= length(ray_direction); + float x = ray_direction.x, y = ray_direction.y, z = ray_direction.z; + + vec3 c = SH_C0 * get_sh_vec3(0); + + c -= SH_C1 * get_sh_vec3(1) * y; + c += SH_C1 * get_sh_vec3(2) * z; + c -= SH_C1 * get_sh_vec3(3) * x; + + c += SH_C2[0] * get_sh_vec3(4) * x * y; + c += SH_C2[1] * get_sh_vec3(5) * y * z; + c += SH_C2[2] * get_sh_vec3(6) * (2.0 * z * z - x * x - y * y); + c += SH_C2[3] * get_sh_vec3(7) * z * x; + c += SH_C2[4] * get_sh_vec3(8) * (x * x - y * y); + + c += SH_C3[0] * get_sh_vec3(9) * (3.0 * x * x - y * y) * y; + c += SH_C3[1] * get_sh_vec3(10) * x * y * z; + c += SH_C3[2] * get_sh_vec3(11) * (4.0 * z * z - x * x - y * y) * y; + c += SH_C3[3] * get_sh_vec3(12) * z * (2.0 * z * z - 3.0 * x * x - 3.0 * y * y); + c += SH_C3[4] * get_sh_vec3(13) * x * (4.0 * z * z - x * x - y * y); + c += SH_C3[5] * get_sh_vec3(14) * (x * x - y * y) * z; + c += SH_C3[6] * get_sh_vec3(15) * x * (x * x - 3.0 * y * y); + + c += 0.5; + + if (c.x < 0.0) { + c.x = 0.0; + } + +// assert(all(lessThanEqual(c, vec3(159.0))), "invalid sh: %f %f %f\n", c); + return c; +} + +float ndc2Pix(float v, int S) +{ + return ((v + 1.0) * S - 1.0) * 0.5; +} + +void main() { + uint index = gl_GlobalInvocationID.x; + if (index >= vertices.length()) { + return; + } + if (index == 0) { +// debugPrintfEXT("width: %d, height: %d, tan_fovx: %f, tan_fovy: %f\n", width, height, tan_fovx, tan_fovy); + } + + ivec2 tile_shape = ivec2((width + TILE_WIDTH - 1) / TILE_WIDTH, (height + TILE_HEIGHT - 1) / TILE_HEIGHT); +// assert(tile_shape.x == 50 && tile_shape.y == 38, "invalid tile shape: %d %d\n", tile_shape); + + attr[index].color_radii.w = 0.0; + tiles_overlap[index] = 0; + + vec4 p_hom = proj_mat * vertices[index].position; + float p_w = 1.0f / p_hom.w; + vec3 ndc = vec3(p_hom.xyz * p_w); + + vec4 p_view = view_mat * vertices[index].position; + if (p_view.z <= 0.2f) { + return; + } + + mat2 cov2d = compute_cov2d(p_view.xyz); + float det = determinant(cov2d); + if (det <= 0.0) { + return; + } + mat2 conic = inverse(cov2d); + attr[index].conic_opacity.xyz = vec3(conic[0][0], conic[0][1], conic[1][1]); + attr[index].conic_opacity.w = vertices[index].scale_opacity.w; + + float mid = 0.5 * (cov2d[0][0] + cov2d[1][1]); + float lambda1 = mid + sqrt(max(0.1, mid * mid - det)); + float lambda2 = mid - sqrt(max(0.1, mid * mid - det)); + float lambda = max(lambda1, lambda2); + float radii = ceil(3.0 * sqrt(lambda)); +// if (radii > 2.0) { +// debugPrintfEXT("lambda: %f, radii: %f\n", lambda, radii); +// } + +// vec2 uv = vec2((ndc.x + 1.0) * 0.5 * width, (ndc.y + 1.0) * 0.5 * height); + vec2 uv = vec2(ndc2Pix(ndc.x, int(width)), ndc2Pix(ndc.y, int(height))); + + uvec4 bounding_box = uvec4( + uint(clamp(int((uv.x - radii) / TILE_WIDTH), 0, tile_shape.x)), + uint(clamp(int((uv.y - radii) / TILE_HEIGHT), 0, tile_shape.y)), + uint(clamp(int((uv.x + radii + TILE_WIDTH - 1) / TILE_WIDTH), 0, tile_shape.x)), + uint(clamp(int((uv.y + radii + TILE_HEIGHT - 1) / TILE_HEIGHT), 0, tile_shape.y)) + ); + +// debugPrintfEXT("radii: %f, uv: %f %f, aabb: %d %d %d %d\n", radii, uv.x, uv.y, ivec4(bounding_box)); + + uint num_tiles_overlap = (bounding_box.z - bounding_box.x) * (bounding_box.w - bounding_box.y); + if (num_tiles_overlap == 0) { + return; + } + assert(num_tiles_overlap <= width * height, "too many tiles overlap: %d\n", num_tiles_overlap); + attr[index].aabb = bounding_box; +// assert(bounding_box.x < bounding_box.z && bounding_box.y < bounding_box.w, "invalid aabb: %d %d %d %d\n", ivec4(bounding_box)); + tiles_overlap[index] = num_tiles_overlap; + attr[index].depth = p_view.z; + attr[index].color_radii.w = radii; + attr[index].color_radii.xyz = compute_sh(); + attr[index].uv = uv; + attr[index].magic = MAGIC; +// attr[index*2].magic = MAGIC; +} \ No newline at end of file diff --git a/src/shaders/preprocess.comp b/src/shaders/preprocess.comp index e46e3f0..5f52602 100644 --- a/src/shaders/preprocess.comp +++ b/src/shaders/preprocess.comp @@ -179,4 +179,5 @@ void main() { attr[index].color_radii.xyz = compute_sh(); attr[index].uv = uv; attr[index].magic = MAGIC; +// attr[index*2].magic = MAGIC; } \ No newline at end of file diff --git a/src/vulkan/ImguiManager.cpp b/src/vulkan/ImguiManager.cpp index 0d577d1..76b0f01 100644 --- a/src/vulkan/ImguiManager.cpp +++ b/src/vulkan/ImguiManager.cpp @@ -1,5 +1,11 @@ #include "ImguiManager.h" +#include "imgui.h" +#include "imgui_impl_glfw.h" +#include "imgui_impl_vulkan.h" + +#include "windowing/GLFWWindow.h" + ImguiManager::ImguiManager(std::shared_ptr context, std::shared_ptr swapchain, std::shared_ptr window) : context(context), swapchain(swapchain), window(window) { } @@ -113,7 +119,8 @@ void ImguiManager::init() { descriptorPool = context->device->createDescriptorPoolUnique(poolInfo); ImGui::CreateContext(); - ImGui_ImplGlfw_InitForVulkan(static_cast(window->window), true); + auto glfwWindow = std::reinterpret_pointer_cast(window); + ImGui_ImplGlfw_InitForVulkan(static_cast(glfwWindow->window), true); ImGui_ImplVulkan_InitInfo init_info = {}; init_info.Instance = context->instance.get(); init_info.PhysicalDevice = context->physicalDevice; diff --git a/src/vulkan/ImguiManager.h b/src/vulkan/ImguiManager.h index 312a863..349a963 100644 --- a/src/vulkan/ImguiManager.h +++ b/src/vulkan/ImguiManager.h @@ -7,10 +7,6 @@ #include "Swapchain.h" #include "Window.h" -#include "imgui.h" -#include "imgui_impl_glfw.h" -#include "imgui_impl_vulkan.h" - class ImguiManager { public: ImguiManager(std::shared_ptr context, std::shared_ptr swapchain, std::shared_ptr window); diff --git a/src/vulkan/Shader.cpp b/src/vulkan/Shader.cpp index 7c24488..a08bc34 100644 --- a/src/vulkan/Shader.cpp +++ b/src/vulkan/Shader.cpp @@ -16,4 +16,12 @@ void Shader::load() { create_info.pCode = reinterpret_cast(data); } shader = context->device->createShaderModuleUnique(create_info); + + if (context->validationLayersEnabled) { + context->device->setDebugUtilsObjectNameEXT(vk::DebugUtilsObjectNameInfoEXT { + vk::ObjectType::eShaderModule, + reinterpret_cast(static_cast(shader.get())), + filename.c_str() + }); + } } diff --git a/src/vulkan/Swapchain.cpp b/src/vulkan/Swapchain.cpp index fef58cb..5bac09e 100644 --- a/src/vulkan/Swapchain.cpp +++ b/src/vulkan/Swapchain.cpp @@ -1,11 +1,11 @@ #include "Swapchain.h" +#include "glm/glm.hpp" #include "spdlog/spdlog.h" #include -Swapchain::Swapchain(const std::shared_ptr&context, const std::shared_ptr&window, - bool immediate) : context( - context), window(window), immediate(immediate) { +Swapchain::Swapchain(const std::shared_ptr& context, const std::shared_ptr& window, + bool immediate) : context(context), window(window), immediate(immediate) { createSwapchain(); createSwapchainImages(); } @@ -20,7 +20,7 @@ void Swapchain::createSwapchain() { auto [width, height] = window->getFramebufferSize(); surfaceFormat = formats[0]; - for (const auto&availableFormat: formats) { + for (const auto& availableFormat: formats) { if (availableFormat.format == vk::Format::eB8G8R8A8Unorm && availableFormat.colorSpace == vk::ColorSpaceKHR::eSrgbNonlinear) { surfaceFormat = availableFormat; @@ -30,7 +30,7 @@ void Swapchain::createSwapchain() { spdlog::debug("Surface format: {}", string_VkFormat(static_cast(surfaceFormat.format))); presentMode = vk::PresentModeKHR::eFifo; - for (const auto&availablePresentMode: presentModes) { + for (const auto& availablePresentMode: presentModes) { if (immediate && availablePresentMode == vk::PresentModeKHR::eImmediate) { presentMode = availablePresentMode; break; @@ -44,16 +44,18 @@ void Swapchain::createSwapchain() { spdlog::debug("Present mode: {}", string_VkPresentModeKHR(static_cast(presentMode))); auto extent = capabilities.currentExtent; - if (capabilities.currentExtent.width == UINT32_MAX) { + if (capabilities.currentExtent.width == UINT32_MAX || capabilities.currentExtent.width == 0) { extent.width = std::clamp(width, capabilities.minImageExtent.width, capabilities.maxImageExtent.width); extent.height = std::clamp(height, capabilities.minImageExtent.height, capabilities.maxImageExtent.height); } + spdlog::debug("Swapchain extent range: {}x{} - {}x{}", capabilities.minImageExtent.width, capabilities.minImageExtent.height, + capabilities.maxImageExtent.width, capabilities.maxImageExtent.height); + imageCount = capabilities.minImageCount + 1; if (capabilities.maxImageCount > 0 && imageCount > capabilities.maxImageCount) { imageCount = capabilities.maxImageCount; - } - else if (capabilities.maxImageCount == 0) { + } else if (capabilities.maxImageCount == 0) { imageCount = capabilities.minImageCount; } @@ -67,7 +69,7 @@ void Swapchain::createSwapchain() { createInfo.imageUsage = vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eStorage; std::vector uniqueQueueFamilies; - for (auto&queue: context->queues) { + for (auto& queue: context->queues) { if (std::find(uniqueQueueFamilies.begin(), uniqueQueueFamilies.end(), queue.first) == uniqueQueueFamilies.end()) { uniqueQueueFamilies.push_back(queue.first); @@ -76,10 +78,9 @@ void Swapchain::createSwapchain() { if (uniqueQueueFamilies.size() > 1) { createInfo.imageSharingMode = vk::SharingMode::eConcurrent; - createInfo.queueFamilyIndexCount = (uint32_t)uniqueQueueFamilies.size(); + createInfo.queueFamilyIndexCount = (uint32_t) uniqueQueueFamilies.size(); createInfo.pQueueFamilyIndices = uniqueQueueFamilies.data(); - } - else { + } else { createInfo.imageSharingMode = vk::SharingMode::eExclusive; } @@ -88,6 +89,7 @@ void Swapchain::createSwapchain() { createInfo.presentMode = presentMode; createInfo.clipped = VK_TRUE; + spdlog::debug("Swapchain extent: {}x{}. Preferred extent: {}x{}", extent.width, extent.height, width, height); swapchainExtent = extent; swapchainFormat = surfaceFormat.format; @@ -98,7 +100,7 @@ void Swapchain::createSwapchain() { void Swapchain::createSwapchainImages() { auto images = context->device->getSwapchainImagesKHR(*swapchain); - for (auto&image: images) { + for (auto& image: images) { auto imageView = context->device->createImageViewUnique({ {}, image, vk::ImageViewType::e2D, swapchainFormat, {}, diff --git a/src/vulkan/VulkanContext.cpp b/src/vulkan/VulkanContext.cpp index c89a2bb..e18259d 100644 --- a/src/vulkan/VulkanContext.cpp +++ b/src/vulkan/VulkanContext.cpp @@ -39,19 +39,29 @@ VulkanContext::VulkanContext(const std::vector& instance_extensions : instanceExtensions(instance_extensions), deviceExtensions(device_extensions), validationLayersEnabled(validation_layers_enabled) { #ifdef __APPLE__ - instanceExtensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); - deviceExtensions.push_back("VK_KHR_portability_subset"); - deviceExtensions.push_back(VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME); + #ifndef VKGS_ENABLE_METAL + instanceExtensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); + deviceExtensions.push_back("VK_KHR_portability_subset"); + #endif #endif - deviceExtensions.push_back(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME); if (validation_layers_enabled) { + deviceExtensions.push_back(VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME); + instanceExtensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); instanceExtensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); } - auto getInstanceProcAddr = dl.getProcAddress( - "vkGetInstanceProcAddr"); - VULKAN_HPP_DEFAULT_DISPATCHER.init(getInstanceProcAddr); + +#ifndef VKGS_ENABLE_METAL + VULKAN_HPP_DEFAULT_DISPATCHER.init(); +#else + void *libvulkan = dlopen("MoltenVK.framework/MoltenVK", RTLD_NOW | RTLD_LOCAL); + if (!libvulkan) { + throw std::runtime_error("MoltenVK not found"); + } + auto vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr) dlsym(libvulkan, "vkGetInstanceProcAddr"); + VULKAN_HPP_DEFAULT_DISPATCHER.init(vkGetInstanceProcAddr); +#endif } void VulkanContext::createInstance() { diff --git a/src/vulkan/VulkanContext.h b/src/vulkan/VulkanContext.h index c581821..e71bbf2 100644 --- a/src/vulkan/VulkanContext.h +++ b/src/vulkan/VulkanContext.h @@ -96,11 +96,10 @@ class VulkanContext { vk::UniqueDescriptorPool descriptorPool; vk::UniqueQueryPool queryPool; + bool validationLayersEnabled; private: - vk::DynamicLoader dl; std::vector instanceExtensions; std::vector deviceExtensions; - bool validationLayersEnabled; vk::UniqueCommandPool commandPool; diff --git a/src/vulkan/Window.h b/src/vulkan/Window.h index 12fc54e..71932d0 100644 --- a/src/vulkan/Window.h +++ b/src/vulkan/Window.h @@ -7,34 +7,30 @@ #include "VulkanContext.h" - class Window { public: - Window(std::string name, int width, int height); + virtual VkSurfaceKHR createSurface(std::shared_ptr context) = 0; - VkSurfaceKHR createSurface(std::shared_ptr context); + virtual std::array getMouseButton() { return {false, false, false}; } - std::array getMouseButton(); + virtual std::vector getRequiredInstanceExtensions() = 0; - static std::vector getRequiredInstanceExtensions(); + [[nodiscard]] virtual std::pair getFramebufferSize() const = 0; - std::pair getFramebufferSize() const; + virtual std::array getCursorTranslation() { return {0, 0}; } - std::array getCursorTranslation(); + virtual std::array getKeys() { return {false, false, false, false, false, false, false}; } - std::array getKeys(); + virtual void mouseCapture(bool capture) { } - void mouseCapture(bool capture); + virtual bool tick() { return false; }; - bool tick(); + virtual void logTranslation(float x, float y) { }; - void* window; + virtual void logMovement(float x, float y) { }; -private: - VkSurfaceKHR surface; + virtual ~Window() = default; - double lastX = 0.0; - double lastY = 0.0; }; diff --git a/src/vulkan/Window.cpp b/src/vulkan/windowing/GLFWWindow.cpp similarity index 80% rename from src/vulkan/Window.cpp rename to src/vulkan/windowing/GLFWWindow.cpp index ab1afe3..576982d 100644 --- a/src/vulkan/Window.cpp +++ b/src/vulkan/windowing/GLFWWindow.cpp @@ -1,18 +1,18 @@ -#include "Window.h" +#include "GLFWWindow.h" #define GLFW_INCLUDE_VULKAN #include #include -Window::Window(std::string name, int width, int height) { +GLFWWindow::GLFWWindow(std::string name, int width, int height) { glfwInit(); glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); - glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE); + glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); window = glfwCreateWindow(width, height, name.c_str(), nullptr, nullptr); } -VkSurfaceKHR Window::createSurface(std::shared_ptr context) { +VkSurfaceKHR GLFWWindow::createSurface(std::shared_ptr context) { if (glfwCreateWindowSurface(context->instance.get(), static_cast(window), nullptr, &surface) != VK_SUCCESS) { throw std::runtime_error("failed to create window surface!"); @@ -20,7 +20,7 @@ VkSurfaceKHR Window::createSurface(std::shared_ptr context) { return surface; } -std::array Window::getMouseButton() { +std::array GLFWWindow::getMouseButton() { return { glfwGetMouseButton(static_cast(window), GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS, glfwGetMouseButton(static_cast(window), GLFW_MOUSE_BUTTON_MIDDLE) == GLFW_PRESS, @@ -28,7 +28,7 @@ std::array Window::getMouseButton() { }; } -std::vector Window::getRequiredInstanceExtensions() { +std::vector GLFWWindow::getRequiredInstanceExtensions() { uint32_t glfwExtensionCount = 0; const char** glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount); auto extensions = std::vector{}; @@ -38,13 +38,13 @@ std::vector Window::getRequiredInstanceExtensions() { return extensions; } -std::pair Window::getFramebufferSize() const { +std::pair GLFWWindow::getFramebufferSize() const { int width, height; glfwGetFramebufferSize(static_cast(window), &width, &height); return {width, height}; } -std::array Window::getCursorTranslation() { +std::array GLFWWindow::getCursorTranslation() { double x, y; glfwGetCursorPos(static_cast(window), &x, &y); const auto translation = std::array{x - lastX, y - lastY}; @@ -53,7 +53,7 @@ std::array Window::getCursorTranslation() { return translation; } -std::array Window::getKeys() { +std::array GLFWWindow::getKeys() { return { glfwGetKey(static_cast(window), GLFW_KEY_W) == GLFW_PRESS, glfwGetKey(static_cast(window), GLFW_KEY_A) == GLFW_PRESS, @@ -65,7 +65,7 @@ std::array Window::getKeys() { }; } -void Window::mouseCapture(bool capture) { +void GLFWWindow::mouseCapture(bool capture) { if (capture) { glfwSetInputMode(static_cast(window), GLFW_CURSOR, GLFW_CURSOR_DISABLED); } else { @@ -73,7 +73,7 @@ void Window::mouseCapture(bool capture) { } } -bool Window::tick() { +bool GLFWWindow::tick() { glfwPollEvents(); return !glfwWindowShouldClose(static_cast(window)); -} +} \ No newline at end of file diff --git a/src/vulkan/windowing/GLFWWindow.h b/src/vulkan/windowing/GLFWWindow.h new file mode 100644 index 0000000..25ff327 --- /dev/null +++ b/src/vulkan/windowing/GLFWWindow.h @@ -0,0 +1,36 @@ +#ifndef GLFWWINDOW_H +#define GLFWWINDOW_H + +#include "../Window.h" + +class GLFWWindow final : public Window { +public: + GLFWWindow(std::string name, int width, int height); + + VkSurfaceKHR createSurface(std::shared_ptr context) override; + + std::array getMouseButton() override; + + std::vector getRequiredInstanceExtensions() override; + + [[nodiscard]] std::pair getFramebufferSize() const override; + + std::array getCursorTranslation() override; + + std::array getKeys() override; + + void mouseCapture(bool capture) override; + + bool tick() override; + + void* window; + +private: + VkSurfaceKHR surface = VK_NULL_HANDLE; + + double lastX = 0.0; + double lastY = 0.0; +}; + + +#endif //GLFWWINDOW_H diff --git a/src/vulkan/windowing/MetalWindow.cpp b/src/vulkan/windowing/MetalWindow.cpp new file mode 100644 index 0000000..88a2ff3 --- /dev/null +++ b/src/vulkan/windowing/MetalWindow.cpp @@ -0,0 +1,46 @@ +#include "MetalWindow.h" + +MetalWindow::MetalWindow(void* caMetalLayer, int width, int height) : caMetalLayer(caMetalLayer), width(width), height(height) { +} + +VkSurfaceKHR MetalWindow::createSurface(std::shared_ptr context) { + this->context = context; + vk::MetalSurfaceCreateInfoEXT surfaceCreateInfo {{}, caMetalLayer}; + return context->instance->createMetalSurfaceEXT(surfaceCreateInfo); +} + +std::array MetalWindow::getMouseButton() { + return Window::getMouseButton(); +} + +std::vector MetalWindow::getRequiredInstanceExtensions() { + return {VK_KHR_SURFACE_EXTENSION_NAME, VK_EXT_METAL_SURFACE_EXTENSION_NAME}; +} + +std::pair MetalWindow::getFramebufferSize() const { + return {static_cast(width), static_cast(height)}; +} + +std::array MetalWindow::getCursorTranslation() { + auto result = std::array{accumulatedX, accumulatedY}; + accumulatedX = 0; + accumulatedY = 0; + return result; +} + +std::array MetalWindow::getKeys() { + return Window::getKeys(); +} + +void MetalWindow::mouseCapture(bool capture) { + Window::mouseCapture(capture); +} + +bool MetalWindow::tick() { + return Window::tick(); +} + +void MetalWindow::logTranslation(float x, float y) { + accumulatedX += x; + accumulatedY += y; +} diff --git a/src/vulkan/windowing/MetalWindow.h b/src/vulkan/windowing/MetalWindow.h new file mode 100644 index 0000000..367ac1f --- /dev/null +++ b/src/vulkan/windowing/MetalWindow.h @@ -0,0 +1,39 @@ +#ifndef METALWINDOW_H +#define METALWINDOW_H +#include "../Window.h" +#include "../VulkanContext.h" + +class MetalWindow final : public Window { +public: + MetalWindow(void *caMetalLayer, int width, int height); + + VkSurfaceKHR createSurface(std::shared_ptr context) override; + + std::array getMouseButton() override; + + std::vector getRequiredInstanceExtensions() override; + + [[nodiscard]] std::pair getFramebufferSize() const override; + + std::array getCursorTranslation() override; + + std::array getKeys() override; + + void mouseCapture(bool capture) override; + + void logTranslation(float x, float y) override; + + bool tick() override; +private: + void *caMetalLayer; + int width = 0; + int height = 0; + std::shared_ptr context; + + float accumulatedX = 0; + float accumulatedY = 0; +}; + + + +#endif //METALWINDOW_H