diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1a89d46c..df390763 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -49,7 +49,7 @@ jobs: run: | Start-Service audio* Invoke-WebRequest https://github.com/duncanthrax/scream/releases/download/3.6/Scream3.6.zip -OutFile C:\Scream3.6.zip - Extract-7Zip -Path C:\Scream3.6.zip -DestinationPath C:\Scream + 7z x C:\Scream3.6.zip -oC:\Scream $cert = (Get-AuthenticodeSignature C:\Scream\Install\driver\Scream.sys).SignerCertificate $store = [System.Security.Cryptography.X509Certificates.X509Store]::new("TrustedPublisher", "LocalMachine") $store.Open("ReadWrite") @@ -62,7 +62,7 @@ jobs: shell: pwsh run: | Invoke-WebRequest https://github.com/pal1000/mesa-dist-win/releases/download/23.0.0/mesa3d-23.0.0-release-msvc.7z -OutFile mesa3d.7z - Extract-7Zip -Path mesa3d.7z -DestinationPath mesa + 7z x mesa3d.7z -omesa cp mesa\$env:platform\*.dll _release\bin\ ls _release\bin @@ -210,6 +210,7 @@ jobs: with: submodules: recursive - run: ./env.sh emscripten make emscripten + - run: ./env.sh emscripten ./test/suite.sh emscripten nx: name: Switch diff --git a/.gitignore b/.gitignore index 82ab046f..d3c0cf49 100644 --- a/.gitignore +++ b/.gitignore @@ -45,6 +45,7 @@ _release/bin/**/*.xml _release/bin/**/*.toml _release/bin/blitzcc _release/bin/ide2 +_release/bin/mediaview _release/cfg/blitzide.prefs _release/cfg/blitzide.toml _release/help/index.html diff --git a/.gitmodules b/.gitmodules index 54da5c32..03d3b576 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,9 +4,6 @@ [submodule "freeimage"] path = deps/freeimage/src url = https://github.com/blitz3d-ng/freeimage -[submodule "assimp"] - path = deps/assimp/tree - url = https://github.com/assimp/assimp.git [submodule "enet"] path = deps/enet/tree url = https://github.com/lsalzman/enet.git diff --git a/CMakeLists.txt b/CMakeLists.txt index fb3e7f48..20e8cb72 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -180,6 +180,7 @@ ENDIF() IF(BB_EMSCRIPTEN) set (BB_WEB true) add_definitions(-DBB_WEB) + set(CMAKE_SYSTEM_PROCESSOR wasm) # defaults to x86? not sure that makes sense. ENDIF() IF(NOT BB_ENV) diff --git a/_release/Games/wing_ring/media/F15.BMP b/_release/Games/wing_ring/media/F15.bmp similarity index 100% rename from _release/Games/wing_ring/media/F15.BMP rename to _release/Games/wing_ring/media/F15.bmp diff --git a/_release/help/commands/3d_examples/media/makbot/blshine.jpg b/_release/help/commands/3d_examples/media/makbot/BLSHINE.JPG similarity index 100% rename from _release/help/commands/3d_examples/media/makbot/blshine.jpg rename to _release/help/commands/3d_examples/media/makbot/BLSHINE.JPG diff --git a/_release/help/commands/3d_examples/media/makbot/dkshine.jpg b/_release/help/commands/3d_examples/media/makbot/DKSHINE.JPG similarity index 100% rename from _release/help/commands/3d_examples/media/makbot/dkshine.jpg rename to _release/help/commands/3d_examples/media/makbot/DKSHINE.JPG diff --git a/_release/help/commands/3d_examples/media/makbot/Panels.jpg b/_release/help/commands/3d_examples/media/makbot/PANELS.JPG similarity index 100% rename from _release/help/commands/3d_examples/media/makbot/Panels.jpg rename to _release/help/commands/3d_examples/media/makbot/PANELS.JPG diff --git a/_release/mediaview/mediaview.bb b/_release/mediaview/mediaview.bb index cbe37ca8..eb409190 100644 --- a/_release/mediaview/mediaview.bb +++ b/_release/mediaview/mediaview.bb @@ -4,8 +4,7 @@ ;Create executable in 'bin' AppTitle CommandLine$() -fil$=Lower$( CommandLine$() ) - +fil$=CommandLine$() index=Instr( fil$,"." ) If index>0 ext$=Mid$( fil$,index+1 ) Select ext$ @@ -20,7 +19,7 @@ Case "wav" Case "mp3","mid","mod","x3m","xm","it" ShowMusic( fil$ ) Default - RuntimeError "Unknown File Extension" + RuntimeError "Unknown File Extension: "+ext End Select End @@ -35,7 +34,7 @@ Function ShowModel( fil$,md2 ) model=LoadMD2( fil$ ) If model ScaleEntity model,.025,.025,.025 Else - model=LoadAnimMesh( fil$ ) + model=LoadMesh( fil$ ) If model FitMesh model,-1,-1,-1,2,2,2,True EndIf If model=0 RuntimeError "Unable to load 3D mesh:"+fil$ diff --git a/_release/samples/halo/Lightmap/blocks.bmp b/_release/samples/halo/Lightmap/BLOCKS.BMP similarity index 100% rename from _release/samples/halo/Lightmap/blocks.bmp rename to _release/samples/halo/Lightmap/BLOCKS.BMP diff --git a/_release/samples/halo/Lightmap/flagstn.bmp b/_release/samples/halo/Lightmap/FLAGSTN.BMP similarity index 100% rename from _release/samples/halo/Lightmap/flagstn.bmp rename to _release/samples/halo/Lightmap/FLAGSTN.BMP diff --git a/_release/samples/mak/anim/makbot/blshine.jpg b/_release/samples/mak/anim/makbot/BLSHINE.JPG similarity index 100% rename from _release/samples/mak/anim/makbot/blshine.jpg rename to _release/samples/mak/anim/makbot/BLSHINE.JPG diff --git a/_release/samples/mak/anim/makbot/dkshine.jpg b/_release/samples/mak/anim/makbot/DKSHINE.JPG similarity index 100% rename from _release/samples/mak/anim/makbot/dkshine.jpg rename to _release/samples/mak/anim/makbot/DKSHINE.JPG diff --git a/_release/samples/mak/anim/makbot/Panels.jpg b/_release/samples/mak/anim/makbot/PANELS.JPG similarity index 100% rename from _release/samples/mak/anim/makbot/Panels.jpg rename to _release/samples/mak/anim/makbot/PANELS.JPG diff --git a/_release/samples/mak/castle/castle/castlest.jpg b/_release/samples/mak/castle/castle/CASTLEST.JPG similarity index 100% rename from _release/samples/mak/castle/castle/castlest.jpg rename to _release/samples/mak/castle/castle/CASTLEST.JPG diff --git a/_release/samples/mak/castle/castle/gothic3.jpg b/_release/samples/mak/castle/castle/GOTHIC3.JPG similarity index 100% rename from _release/samples/mak/castle/castle/gothic3.jpg rename to _release/samples/mak/castle/castle/GOTHIC3.JPG diff --git a/_release/samples/mak/castle/castle/oldbric.jpg b/_release/samples/mak/castle/castle/OLDBRIC.JPG similarity index 100% rename from _release/samples/mak/castle/castle/oldbric.jpg rename to _release/samples/mak/castle/castle/OLDBRIC.JPG diff --git a/_release/samples/mak/castle/castle/shingle.jpg b/_release/samples/mak/castle/castle/SHINGLE.JPG similarity index 100% rename from _release/samples/mak/castle/castle/shingle.jpg rename to _release/samples/mak/castle/castle/SHINGLE.JPG diff --git a/_release/samples/mak/castle/castle/stone2.jpg b/_release/samples/mak/castle/castle/STONE2.JPG similarity index 100% rename from _release/samples/mak/castle/castle/stone2.jpg rename to _release/samples/mak/castle/castle/STONE2.JPG diff --git a/_release/samples/si/fps/stone_blue1.bmp b/_release/samples/si/fps/stone_blue1.BMP similarity index 100% rename from _release/samples/si/fps/stone_blue1.bmp rename to _release/samples/si/fps/stone_blue1.BMP diff --git a/_release/samples/si/fps/Stone_grey1.bmp b/_release/samples/si/fps/stone_grey1.BMP similarity index 100% rename from _release/samples/si/fps/Stone_grey1.bmp rename to _release/samples/si/fps/stone_grey1.BMP diff --git a/_release/samples/si/fps/stone_red1.bmp b/_release/samples/si/fps/stone_red1.BMP similarity index 100% rename from _release/samples/si/fps/stone_red1.bmp rename to _release/samples/si/fps/stone_red1.BMP diff --git a/_release/samples/si/fps/stone_yellow1.bmp b/_release/samples/si/fps/stone_yellow1.BMP similarity index 100% rename from _release/samples/si/fps/stone_yellow1.bmp rename to _release/samples/si/fps/stone_yellow1.BMP diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt index 922b2003..83fe9e04 100644 --- a/deps/CMakeLists.txt +++ b/deps/CMakeLists.txt @@ -37,7 +37,6 @@ add_subdirectory(sdl) add_subdirectory(libpng) add_subdirectory(freeimage) add_subdirectory(dxsdk) -add_subdirectory(assimp) # audio add_subdirectory(fmod) diff --git a/deps/assimp/CMakeLists.txt b/deps/assimp/CMakeLists.txt deleted file mode 100644 index 93353776..00000000 --- a/deps/assimp/CMakeLists.txt +++ /dev/null @@ -1,168 +0,0 @@ -set (SOURCE tree/code/Assimp.cpp - tree/code/BaseImporter.h - tree/code/BaseImporter.cpp - tree/code/BaseProcess.h - tree/code/BaseProcess.cpp - tree/code/CalcTangentsProcess.cpp - tree/code/CalcTangentsProcess.h - tree/code/ConvertToLHProcess.h - tree/code/ConvertToLHProcess.cpp - tree/code/ComputeUVMappingProcess.cpp - tree/code/ComputeUVMappingProcess.h - tree/code/DeboneProcess.cpp - tree/code/DeboneProcess.h - tree/code/DefaultIOStream.h - tree/code/DefaultIOStream.cpp - tree/code/DefaultIOSystem.h - tree/code/DefaultIOSystem.cpp - tree/code/DefaultLogger.cpp - tree/code/FindDegenerates.cpp - tree/code/FindDegenerates.h - tree/code/FindInstancesProcess.cpp - tree/code/FindInstancesProcess.h - tree/code/FindInvalidDataProcess.cpp - tree/code/FindInvalidDataProcess.h - tree/code/FixNormalsStep.cpp - tree/code/FixNormalsStep.h - tree/code/GenFaceNormalsProcess.cpp - tree/code/GenFaceNormalsProcess.h - tree/code/GenVertexNormalsProcess.cpp - tree/code/GenVertexNormalsProcess.h - tree/code/Importer.h - tree/code/Importer.cpp - tree/code/ImporterRegistry.cpp - tree/code/ImproveCacheLocality.cpp - tree/code/ImproveCacheLocality.h - tree/code/JoinVerticesProcess.cpp - tree/code/JoinVerticesProcess.h - tree/code/LimitBoneWeightsProcess.cpp - tree/code/LimitBoneWeightsProcess.h - tree/code/MaterialSystem.h - tree/code/MaterialSystem.cpp - tree/code/OptimizeGraph.cpp - tree/code/OptimizeGraph.h - tree/code/OptimizeMeshes.cpp - tree/code/OptimizeMeshes.h - tree/code/PostStepRegistry.cpp - tree/code/PretransformVertices.cpp - tree/code/PretransformVertices.h - tree/code/ProcessHelper.h - tree/code/ProcessHelper.cpp - tree/code/RemoveVCProcess.cpp - tree/code/RemoveVCProcess.h - tree/code/RemoveRedundantMaterials.cpp - tree/code/RemoveRedundantMaterials.h - tree/code/SceneCombiner.h - tree/code/SceneCombiner.cpp - tree/code/ScenePreprocessor.h - tree/code/ScenePreprocessor.cpp - tree/code/SortByPTypeProcess.cpp - tree/code/SortByPTypeProcess.h - tree/code/SpatialSort.h - tree/code/SpatialSort.cpp - tree/code/SplitByBoneCountProcess.cpp - tree/code/SplitByBoneCountProcess.h - tree/code/SplitLargeMeshes.cpp - tree/code/SplitLargeMeshes.h - tree/code/TextureTransform.cpp - tree/code/TextureTransform.h - tree/code/TriangulateProcess.cpp - tree/code/TriangulateProcess.h - tree/code/ValidateDataStructure.h - tree/code/ValidateDataStructure.cpp - tree/code/Version.cpp - tree/code/VertexTriangleAdjacency.h - tree/code/VertexTriangleAdjacency.cpp - - tree/code/XFileHelper.h - tree/code/XFileImporter.cpp - tree/code/XFileImporter.h - tree/code/XFileParser.cpp - tree/code/XFileParser.h -) - -set (SOURCE ${SOURCE} tree/contrib/ConvertUTF/ConvertUTF.c tree/contrib/ConvertUTF/ConvertUTF.h) - -add_library (assimp STATIC ${SOURCE}) -target_output_to_toolchain(assimp) - -target_include_directories(assimp SYSTEM PUBLIC tree/include include) -target_link_libraries(assimp ${ZLIB}) - -target_compile_definitions(assimp PRIVATE - -DASSIMP_BUILD_NO_OWN_ZLIB - -DASSIMP_BUILD_NO_3DS_IMPORTER - -DASSIMP_BUILD_NO_3DS_EXPORTER - -DASSIMP_BUILD_NO_MD3_IMPORTER - -DASSIMP_BUILD_NO_MDL_IMPORTER - -DASSIMP_BUILD_NO_MD2_IMPORTER - -DASSIMP_BUILD_NO_PLY_IMPORTER - -DASSIMP_BUILD_NO_ASE_IMPORTER - -DASSIMP_BUILD_NO_OBJ_IMPORTER - -DASSIMP_BUILD_NO_HMP_IMPORTER - -DASSIMP_BUILD_NO_SMD_IMPORTER - -DASSIMP_BUILD_NO_MDC_IMPORTER - -DASSIMP_BUILD_NO_MD5_IMPORTER - -DASSIMP_BUILD_NO_STL_IMPORTER - -DASSIMP_BUILD_NO_LWO_IMPORTER - -DASSIMP_BUILD_NO_DXF_IMPORTER - -DASSIMP_BUILD_NO_NFF_IMPORTER - -DASSIMP_BUILD_NO_RAW_IMPORTER - -DASSIMP_BUILD_NO_SIB_IMPORTER - -DASSIMP_BUILD_NO_OFF_IMPORTER - -DASSIMP_BUILD_NO_AC_IMPORTER - -DASSIMP_BUILD_NO_BVH_IMPORTER - -DASSIMP_BUILD_NO_IRRMESH_IMPORTER - -DASSIMP_BUILD_NO_IRR_IMPORTER - -DASSIMP_BUILD_NO_Q3D_IMPORTER - -DASSIMP_BUILD_NO_B3D_IMPORTER - -DASSIMP_BUILD_NO_COLLADA_IMPORTER - -DASSIMP_BUILD_NO_TERRAGEN_IMPORTER - -DASSIMP_BUILD_NO_CSM_IMPORTER - -DASSIMP_BUILD_NO_3D_IMPORTER - -DASSIMP_BUILD_NO_LWS_IMPORTER - -DASSIMP_BUILD_NO_OGRE_IMPORTER - -DASSIMP_BUILD_NO_OPENGEX_IMPORTER - -DASSIMP_BUILD_NO_MS3D_IMPORTER - -DASSIMP_BUILD_NO_COB_IMPORTER - -DASSIMP_BUILD_NO_BLEND_IMPORTER - -DASSIMP_BUILD_NO_Q3BSP_IMPORTER - -DASSIMP_BUILD_NO_NDO_IMPORTER - -DASSIMP_BUILD_NO_IFC_IMPORTER - -DASSIMP_BUILD_NO_XGL_IMPORTER - -DASSIMP_BUILD_NO_FBX_IMPORTER - -DASSIMP_BUILD_NO_ASSBIN_IMPORTER - -DASSIMP_BUILD_NO_GLTF_IMPORTER - -DASSIMP_BUILD_NO_C4D_IMPORTER - -DASSIMP_BUILD_NO_3MF_IMPORTER - - # TODO: once the ASSIMP loader code is solid we can disable a bunch of these - # -DASSIMP_BUILD_NO_MAKELEFTHANDED_PROCESS - # -DASSIMP_BUILD_NO_FLIPUVS_PROCESS - # -DASSIMP_BUILD_NO_FLIPWINDINGORDER_PROCESS - # -DASSIMP_BUILD_NO_REMOVEVC_PROCESS - # -DASSIMP_BUILD_NO_REMOVE_REDUNDANTMATERIALS_PROCESS - # -DASSIMP_BUILD_NO_FINDINSTANCES_PROCESS - # -DASSIMP_BUILD_NO_OPTIMIZEGRAPH_PROCESS - # -DASSIMP_BUILD_NO_FINDDEGENERATES_PROCESS - # -DASSIMP_BUILD_NO_GENUVCOORDS_PROCESS - # -DASSIMP_BUILD_NO_TRANSFORMTEXCOORDS_PROCESS - # -DASSIMP_BUILD_NO_PRETRANSFORMVERTICES_PROCESS - # -DASSIMP_BUILD_NO_TRIANGULATE_PROCESS - # -DASSIMP_BUILD_NO_SORTBYPTYPE_PROCESS - # -DASSIMP_BUILD_NO_FINDINVALIDDATA_PROCESS - # -DASSIMP_BUILD_NO_OPTIMIZEMESHES_PROCESS - # -DASSIMP_BUILD_NO_FIXINFACINGNORMALS_PROCESS - # -DASSIMP_BUILD_NO_SPLITBYBONECOUNT_PROCESS - # -DASSIMP_BUILD_NO_SPLITLARGEMESHES_PROCESS - # -DASSIMP_BUILD_NO_GENFACENORMALS_PROCESS - # -DASSIMP_BUILD_NO_GENVERTEXNORMALS_PROCESS - # -DASSIMP_BUILD_NO_CALCTANGENTS_PROCESS - # -DASSIMP_BUILD_NO_JOINVERTICES_PROCESS - # -DASSIMP_BUILD_NO_SPLITLARGEMESHES_PROCESS - # -DASSIMP_BUILD_NO_DEBONE_PROCESS - # -DASSIMP_BUILD_NO_LIMITBONEWEIGHTS_PROCESS - # -DASSIMP_BUILD_NO_IMPROVECACHELOCALITY_PROCESS -) - -set_target_properties(assimp PROPERTIES UNITY_BUILD false) diff --git a/deps/assimp/include/revision.h b/deps/assimp/include/revision.h deleted file mode 100644 index a2fa1665..00000000 --- a/deps/assimp/include/revision.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef ASSIMP_REVISION_H_INC -#define ASSIMP_REVISION_H_INC - -#define GitVersion 0x00 -#define GitBranch "" - -#endif // ASSIMP_REVISION_H_INC diff --git a/deps/assimp/tree b/deps/assimp/tree deleted file mode 160000 index a8673d48..00000000 --- a/deps/assimp/tree +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a8673d4828df5107186f49e5e4efa5316b727482 diff --git a/src/ios.toolchain.cmake b/src/ios.toolchain.cmake index d4690a28..8322033a 100644 --- a/src/ios.toolchain.cmake +++ b/src/ios.toolchain.cmake @@ -37,7 +37,7 @@ # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # -# This file is based off of the Platform/Darwin.cmake and +# This file is based on the Platform/Darwin.cmake and # Platform/UnixPaths.cmake files which are included with CMake 2.8.4 # It has been altered for iOS development. # @@ -58,18 +58,21 @@ # PLATFORM: (default "OS64") # OS = Build for iPhoneOS. # OS64 = Build for arm64 iphoneOS. -# OS64COMBINED = Build for arm64 x86_64 iphoneOS. Combined into FAT STATIC lib (supported on 3.14+ of CMakewith "-G Xcode" argument ONLY) +# OS64COMBINED = Build for arm64 x86_64 iphoneOS + iphoneOS Simulator. Combined into FAT STATIC lib (only supported on 3.14+ of CMake with "-G Xcode" argument in combination with the "cmake --install" CMake build step) # SIMULATOR = Build for x86 i386 iphoneOS Simulator. # SIMULATOR64 = Build for x86_64 iphoneOS Simulator. # SIMULATORARM64 = Build for arm64 iphoneOS Simulator. +# SIMULATOR64COMBINED = Build for arm64 x86_64 iphoneOS Simulator. Combined into FAT STATIC lib (supported on 3.14+ of CMakewith "-G Xcode" argument ONLY) # TVOS = Build for arm64 tvOS. -# TVOSCOMBINED = Build for arm64 x86_64 tvOS. Combined into FAT STATIC lib (supported on 3.14+ of CMake with "-G Xcode" argument ONLY) +# TVOSCOMBINED = Build for arm64 x86_64 tvOS + tvOS Simulator. Combined into FAT STATIC lib (only supported on 3.14+ of CMake with "-G Xcode" argument in combination with the "cmake --install" CMake build step) # SIMULATOR_TVOS = Build for x86_64 tvOS Simulator. +# SIMULATORARM64_TVOS = Build for arm64 tvOS Simulator. # WATCHOS = Build for armv7k arm64_32 for watchOS. -# WATCHOSCOMBINED = Build for armv7k arm64_32 x86_64 watchOS. Combined into FAT STATIC lib (supported on 3.14+ of CMake with "-G Xcode" argument ONLY) +# WATCHOSCOMBINED = Build for armv7k arm64_32 x86_64 watchOS + watchOS Simulator. Combined into FAT STATIC lib (only supported on 3.14+ of CMake with "-G Xcode" argument in combination with the "cmake --install" CMake build step) # SIMULATOR_WATCHOS = Build for x86_64 for watchOS Simulator. # MAC = Build for x86_64 macOS. # MAC_ARM64 = Build for Apple Silicon macOS. +# MAC_UNIVERSAL = Combined build for x86_64 and Apple Silicon on macOS. # MAC_CATALYST = Build for x86_64 macOS with Catalyst support (iOS toolchain on macOS). # Note: The build argument "MACOSX_DEPLOYMENT_TARGET" can be used to control min-version of macOS # MAC_CATALYST_ARM64 = Build for Apple Silicon macOS with Catalyst support (iOS toolchain on macOS). @@ -80,7 +83,7 @@ # can also be manually specified (although this should not be required). # # CMAKE_DEVELOPER_ROOT: Path to the Developer directory for the platform -# being compiled for. By default this is automatically determined from +# being compiled for. By default, this is automatically determined from # CMAKE_OSX_SYSROOT, but can also be manually specified (although this should # not be required). # @@ -88,9 +91,9 @@ # # NAMED_LANGUAGE_SUPPORT: # ON (default) = Will require "enable_language(OBJC) and/or enable_language(OBJCXX)" for full OBJC|OBJCXX support -# OFF = Will embed the OBJC and OBJCXX flags into the CMAKE_C_FLAGS and CMAKE_CXX_FLAGS (legacy behaviour, CMake version < 3.16) +# OFF = Will embed the OBJC and OBJCXX flags into the CMAKE_C_FLAGS and CMAKE_CXX_FLAGS (legacy behavior, CMake version < 3.16) # -# ENABLE_BITCODE: (ON|OFF) Enables or disables bitcode support. Default ON +# ENABLE_BITCODE: (ON|OFF) Enables or disables bitcode support. Default OFF # # ENABLE_ARC: (ON|OFF) Enables or disables ARC support. Default ON (ARC enabled by default) # @@ -107,10 +110,12 @@ # SIMULATORARM64 = arm64 # TVOS = arm64 # SIMULATOR_TVOS = x86_64 (i386 has since long been deprecated) +# SIMULATORARM64_TVOS = arm64 # WATCHOS = armv7k arm64_32 (if applicable) # SIMULATOR_WATCHOS = x86_64 (i386 has since long been deprecated) # MAC = x86_64 # MAC_ARM64 = arm64 +# MAC_UNIVERSAL = x86_64 arm64 # MAC_CATALYST = x86_64 # MAC_CATALYST_ARM64 = arm64 # @@ -126,7 +131,7 @@ # XCODE_VERSION: Version number (not including Build version) of Xcode detected. # SDK_VERSION: Version of SDK being used. # OSX_ARCHITECTURES: Architectures being compiled for (generated from PLATFORM). -# APPLE_TARGET_TRIPLE: Used by autoconf build systems. NOTE: If "ARCHS" are overridden, this will *NOT* be set! +# APPLE_TARGET_TRIPLE: Used by autoconf build systems. NOTE: If "ARCHS" is overridden, this will *NOT* be set! # # This toolchain defines the following macros for use externally: # @@ -151,10 +156,11 @@ set(ENV{_IOS_TOOLCHAIN_HAS_RUN} true) # List of supported platform values list(APPEND _supported_platforms - "OS" "OS64" "OS64COMBINED" "SIMULATOR" "SIMULATOR64" "SIMULATORARM64" - "TVOS" "TVOSCOMBINED" "SIMULATOR_TVOS" + "OS" "OS64" "OS64COMBINED" "SIMULATOR" "SIMULATOR64" "SIMULATORARM64" "SIMULATOR64COMBINED" + "TVOS" "TVOSCOMBINED" "SIMULATOR_TVOS" "SIMULATORARM64_TVOS" "WATCHOS" "WATCHOSCOMBINED" "SIMULATOR_WATCHOS" - "MAC" "MAC_ARM64" + "MAC" "MAC_ARM64" "MAC_UNIVERSAL" + "VISIONOS" "SIMULATOR_VISIONOS" "SIMULATOR64_VISIONOS" "MAC_CATALYST" "MAC_CATALYST_ARM64") # Cache what generator is used @@ -167,9 +173,9 @@ endif() # Get the Xcode version being used. # Problem: CMake runs toolchain files multiple times, but can't read cache variables on some runs. -# Workaround: On first run (in which cache variables are always accessible), set an intermediary environment variable. +# Workaround: On the first run (in which cache variables are always accessible), set an intermediary environment variable. # -# NOTE: This pattern is used i many places in this toolchain to speed up checks of all sorts +# NOTE: This pattern is used in many places in this toolchain to speed up checks of all sorts if(DEFINED XCODE_VERSION_INT) # Environment variables are always preserved. set(ENV{_XCODE_VERSION_INT} "${XCODE_VERSION_INT}") @@ -191,10 +197,10 @@ endif() # Assuming that xcode 12.0 is installed you most probably have ios sdk 14.0 or later installed (tested on Big Sur) # if you don't set a deployment target it will be set the way you only get 64-bit builds -if(NOT DEFINED DEPLOYMENT_TARGET AND XCODE_VERSION_INT VERSION_GREATER 12.0) - # Temporarily fix the arm64 issues in CMake install-combined by excluding arm64 for simulator builds (needed for Apple Silicon...) - set(CMAKE_XCODE_ATTRIBUTE_EXCLUDED_ARCHS[sdk=iphonesimulator*] "arm64") -endif() +#if(NOT DEFINED DEPLOYMENT_TARGET AND XCODE_VERSION_INT VERSION_GREATER 12.0) +# Temporarily fix the arm64 issues in CMake install-combined by excluding arm64 for simulator builds (needed for Apple Silicon...) +# set(CMAKE_XCODE_ATTRIBUTE_EXCLUDED_ARCHS[sdk=iphonesimulator*] "arm64") +#endif() # Check if the platform variable is set if(DEFINED PLATFORM) @@ -207,7 +213,7 @@ elseif(NOT DEFINED PLATFORM) endif () if(PLATFORM MATCHES ".*COMBINED" AND NOT CMAKE_GENERATOR MATCHES "Xcode") - message(FATAL_ERROR "The combined builds support requires Xcode to be used as generator via '-G Xcode' command-line argument in CMake") + message(FATAL_ERROR "The combined builds support requires Xcode to be used as a generator via '-G Xcode' command-line argument in CMake") endif() # Safeguard that the platform value is set and is one of the supported values @@ -219,11 +225,11 @@ if("${contains_PLATFORM}" EQUAL "-1") endif() # Check if Apple Silicon is supported -if(PLATFORM MATCHES "^(MAC_ARM64)$|^(MAC_CATALYST_ARM64)$" AND ${CMAKE_VERSION} VERSION_LESS "3.19.5") +if(PLATFORM MATCHES "^(MAC_ARM64)$|^(MAC_CATALYST_ARM64)$|^(MAC_UNIVERSAL)$" AND ${CMAKE_VERSION} VERSION_LESS "3.19.5") message(FATAL_ERROR "Apple Silicon builds requires a minimum of CMake 3.19.5") endif() -# Touch toolchain variable to suppress "unused variable" warning. +# Touch the toolchain variable to suppress the "unused variable" warning. # This happens if CMake is invoked with the same command line the second time. if(CMAKE_TOOLCHAIN_FILE) endif() @@ -240,29 +246,35 @@ if(NOT DEFINED NAMED_LANGUAGE_SUPPORT AND ${CMAKE_VERSION} VERSION_GREATER_EQUAL message(STATUS "[DEFAULTS] Using explicit named language support! E.g., enable_language(CXX) is needed in the project files.") elseif(NOT DEFINED NAMED_LANGUAGE_SUPPORT AND ${CMAKE_VERSION} VERSION_LESS "3.16") set(NAMED_LANGUAGE_SUPPORT OFF) - message(STATUS "[DEFAULTS] Disabling explicit named language support. Falling back to legacy behaviour.") + message(STATUS "[DEFAULTS] Disabling explicit named language support. Falling back to legacy behavior.") elseif(DEFINED NAMED_LANGUAGE_SUPPORT AND ${CMAKE_VERSION} VERSION_LESS "3.16") message(FATAL_ERROR "CMake named language support for OBJC and OBJCXX was added in CMake 3.16.") endif() set(NAMED_LANGUAGE_SUPPORT_INT ${NAMED_LANGUAGE_SUPPORT} CACHE BOOL "Whether or not to enable explicit named language support" FORCE) -# Specify minimum version of deployment target. +# Specify the minimum version of the deployment target. if(NOT DEFINED DEPLOYMENT_TARGET) if (PLATFORM MATCHES "WATCHOS") # Unless specified, SDK version 4.0 is used by default as minimum target version (watchOS). set(DEPLOYMENT_TARGET "4.0") elseif(PLATFORM STREQUAL "MAC") - # Unless specified, SDK version 10.13 (High sierra) is used by default as minimum target version (macos). + # Unless specified, SDK version 10.13 (High Sierra) is used by default as the minimum target version (macos). set(DEPLOYMENT_TARGET "10.13") + elseif(PLATFORM STREQUAL "VISIONOS" OR PLATFORM STREQUAL "SIMULATOR_VISIONOS" OR PLATFORM STREQUAL "SIMULATOR64_VISIONOS") + # Unless specified, SDK version 1.0 is used by default as minimum target version (visionOS). + set(DEPLOYMENT_TARGET "1.0") elseif(PLATFORM STREQUAL "MAC_ARM64") - # Unless specified, SDK version 11.0 (Big Sur) is used by default as minimum target version (macos on arm). + # Unless specified, SDK version 11.0 (Big Sur) is used by default as the minimum target version (macOS on arm). + set(DEPLOYMENT_TARGET "11.0") + elseif(PLATFORM STREQUAL "MAC_UNIVERSAL") + # Unless specified, SDK version 11.0 (Big Sur) is used by default as minimum target version for universal builds. set(DEPLOYMENT_TARGET "11.0") elseif(PLATFORM STREQUAL "MAC_CATALYST" OR PLATFORM STREQUAL "MAC_CATALYST_ARM64") - # Unless specified, SDK version 13.0 is used by default as minimum target version (mac catalyst minimum requirement). + # Unless specified, SDK version 13.0 is used by default as the minimum target version (mac catalyst minimum requirement). set(DEPLOYMENT_TARGET "13.1") else() - # Unless specified, SDK version 11.0 is used by default as minimum target version (iOS, tvOS). + # Unless specified, SDK version 11.0 is used by default as the minimum target version (iOS, tvOS). set(DEPLOYMENT_TARGET "11.0") endif() message(STATUS "[DEFAULTS] Using the default min-version since DEPLOYMENT_TARGET not provided!") @@ -302,11 +314,11 @@ elseif(PLATFORM_INT STREQUAL "OS64") set(SDK_NAME iphoneos) if(NOT ARCHS) if (XCODE_VERSION_INT VERSION_GREATER 10.0) - set(ARCHS arm64) # FIXME: Add arm64e when Apple have fixed the integration issues with it, libarclite_iphoneos.a is currently missung bitcode markers for example + set(ARCHS arm64) # FIXME: Add arm64e when Apple has fixed the integration issues with it, libarclite_iphoneos.a is currently missing bitcode markers for example else() set(ARCHS arm64) endif() - set(APPLE_TARGET_TRIPLE_INT aarch64-apple-ios${DEPLOYMENT_TARGET}) + set(APPLE_TARGET_TRIPLE_INT arm64-apple-ios${DEPLOYMENT_TARGET}) else() set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-ios${DEPLOYMENT_TARGET}) endif() @@ -314,12 +326,12 @@ elseif(PLATFORM_INT STREQUAL "OS64COMBINED") set(SDK_NAME iphoneos) if(MODERN_CMAKE) if(NOT ARCHS) - if (XCODE_VERSION_INT VERSION_GREATER 10.0) - set(ARCHS arm64 x86_64) # FIXME: Add arm64e when Apple have fixed the integration issues with it, libarclite_iphoneos.a is currently missung bitcode markers for example + if (XCODE_VERSION_INT VERSION_GREATER 12.0) + set(ARCHS arm64 x86_64) set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=iphoneos*] "arm64") - set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=iphonesimulator*] "x86_64") + set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=iphonesimulator*] "x86_64 arm64") set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphoneos*] "arm64") - set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphonesimulator*] "x86_64") + set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphonesimulator*] "x86_64 arm64") else() set(ARCHS arm64 x86_64) set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=iphoneos*] "arm64") @@ -327,13 +339,37 @@ elseif(PLATFORM_INT STREQUAL "OS64COMBINED") set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphoneos*] "arm64") set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphonesimulator*] "x86_64") endif() - set(APPLE_TARGET_TRIPLE_INT aarch64-x86_64-apple-ios${DEPLOYMENT_TARGET}) + set(APPLE_TARGET_TRIPLE_INT arm64-x86_64-apple-ios${DEPLOYMENT_TARGET}) else() set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-ios${DEPLOYMENT_TARGET}) endif() else() message(FATAL_ERROR "Please make sure that you are running CMake 3.14+ to make the OS64COMBINED setting work") endif() +elseif(PLATFORM_INT STREQUAL "SIMULATOR64COMBINED") + set(SDK_NAME iphonesimulator) + if(MODERN_CMAKE) + if(NOT ARCHS) + if (XCODE_VERSION_INT VERSION_GREATER 12.0) + set(ARCHS arm64 x86_64) # FIXME: Add arm64e when Apple have fixed the integration issues with it, libarclite_iphoneos.a is currently missing bitcode markers for example + set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=iphoneos*] "") + set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=iphonesimulator*] "x86_64 arm64") + set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphoneos*] "") + set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphonesimulator*] "x86_64 arm64") + else() + set(ARCHS arm64 x86_64) + set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=iphoneos*] "") + set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=iphonesimulator*] "x86_64") + set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphoneos*] "") + set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphonesimulator*] "x86_64") + endif() + set(APPLE_TARGET_TRIPLE_INT aarch64-x86_64-apple-ios${DEPLOYMENT_TARGET}-simulator) + else() + set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-ios${DEPLOYMENT_TARGET}-simulator) + endif() + else() + message(FATAL_ERROR "Please make sure that you are running CMake 3.14+ to make the SIMULATOR64COMBINED setting work") + endif() elseif(PLATFORM_INT STREQUAL "SIMULATOR") set(SDK_NAME iphonesimulator) if(NOT ARCHS) @@ -355,7 +391,7 @@ elseif(PLATFORM_INT STREQUAL "SIMULATORARM64") set(SDK_NAME iphonesimulator) if(NOT ARCHS) set(ARCHS arm64) - set(APPLE_TARGET_TRIPLE_INT aarch64-apple-ios${DEPLOYMENT_TARGET}-simulator) + set(APPLE_TARGET_TRIPLE_INT arm64-apple-ios${DEPLOYMENT_TARGET}-simulator) else() set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-ios${DEPLOYMENT_TARGET}-simulator) endif() @@ -363,7 +399,7 @@ elseif(PLATFORM_INT STREQUAL "TVOS") set(SDK_NAME appletvos) if(NOT ARCHS) set(ARCHS arm64) - set(APPLE_TARGET_TRIPLE_INT aarch64-apple-tvos${DEPLOYMENT_TARGET}) + set(APPLE_TARGET_TRIPLE_INT arm64-apple-tvos${DEPLOYMENT_TARGET}) else() set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-tvos${DEPLOYMENT_TARGET}) endif() @@ -372,7 +408,7 @@ elseif (PLATFORM_INT STREQUAL "TVOSCOMBINED") if(MODERN_CMAKE) if(NOT ARCHS) set(ARCHS arm64 x86_64) - set(APPLE_TARGET_TRIPLE_INT aarch64-x86_64-apple-tvos${DEPLOYMENT_TARGET}) + set(APPLE_TARGET_TRIPLE_INT arm64-x86_64-apple-tvos${DEPLOYMENT_TARGET}) set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=appletvos*] "arm64") set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=appletvsimulator*] "x86_64") set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=appletvos*] "arm64") @@ -391,12 +427,20 @@ elseif(PLATFORM_INT STREQUAL "SIMULATOR_TVOS") else() set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-tvos${DEPLOYMENT_TARGET}-simulator) endif() +elseif(PLATFORM_INT STREQUAL "SIMULATORARM64_TVOS") + set(SDK_NAME appletvsimulator) + if(NOT ARCHS) + set(ARCHS arm64) + set(APPLE_TARGET_TRIPLE_INT arm64-apple-tvos${DEPLOYMENT_TARGET}-simulator) + else() + set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-tvos${DEPLOYMENT_TARGET}-simulator) + endif() elseif(PLATFORM_INT STREQUAL "WATCHOS") set(SDK_NAME watchos) if(NOT ARCHS) if (XCODE_VERSION_INT VERSION_GREATER 10.0) set(ARCHS armv7k arm64_32) - set(APPLE_TARGET_TRIPLE_INT aarch64_32-apple-watchos${DEPLOYMENT_TARGET}) + set(APPLE_TARGET_TRIPLE_INT arm64_32-apple-watchos${DEPLOYMENT_TARGET}) else() set(ARCHS armv7k) set(APPLE_TARGET_TRIPLE_INT arm-apple-watchos${DEPLOYMENT_TARGET}) @@ -410,7 +454,7 @@ elseif(PLATFORM_INT STREQUAL "WATCHOSCOMBINED") if(NOT ARCHS) if (XCODE_VERSION_INT VERSION_GREATER 10.0) set(ARCHS armv7k arm64_32 i386) - set(APPLE_TARGET_TRIPLE_INT aarch64_32-i386-apple-watchos${DEPLOYMENT_TARGET}) + set(APPLE_TARGET_TRIPLE_INT arm64_32-i386-apple-watchos${DEPLOYMENT_TARGET}) set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=watchos*] "armv7k arm64_32") set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=watchsimulator*] "i386") set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=watchos*] "armv7k arm64_32") @@ -437,6 +481,30 @@ elseif(PLATFORM_INT STREQUAL "SIMULATOR_WATCHOS") else() set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-watchos${DEPLOYMENT_TARGET}-simulator) endif() +elseif(PLATFORM_INT STREQUAL "SIMULATOR64_VISIONOS") + set(SDK_NAME xrsimulator) + if(NOT ARCHS) + set(ARCHS x86_64) + set(APPLE_TARGET_TRIPLE_INT x86_64-apple-xros${DEPLOYMENT_TARGET}-simulator) + else() + set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-xros${DEPLOYMENT_TARGET}-simulator) + endif() +elseif(PLATFORM_INT STREQUAL "SIMULATOR_VISIONOS") + set(SDK_NAME xrsimulator) + if(NOT ARCHS) + set(ARCHS arm64) + set(APPLE_TARGET_TRIPLE_INT arm64-apple-xros${DEPLOYMENT_TARGET}-simulator) + else() + set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-xros${DEPLOYMENT_TARGET}-simulator) + endif() +elseif(PLATFORM_INT STREQUAL "VISIONOS") + set(SDK_NAME xros) + if(NOT ARCHS) + set(ARCHS arm64) + set(APPLE_TARGET_TRIPLE_INT arm64-apple-xros${DEPLOYMENT_TARGET}) + else() + set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-xros${DEPLOYMENT_TARGET}) + endif() elseif(PLATFORM_INT STREQUAL "MAC" OR PLATFORM_INT STREQUAL "MAC_CATALYST") set(SDK_NAME macosx) if(NOT ARCHS) @@ -459,6 +527,13 @@ elseif(PLATFORM_INT MATCHES "^(MAC_ARM64)$|^(MAC_CATALYST_ARM64)$") elseif(PLATFORM_INT STREQUAL "MAC_CATALYST_ARM64") set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-ios${DEPLOYMENT_TARGET}-macabi) endif() +elseif(PLATFORM_INT STREQUAL "MAC_UNIVERSAL") + set(SDK_NAME macosx) + if(NOT ARCHS) + set(ARCHS "x86_64;arm64") + endif() + string(REPLACE ";" "-" ARCHS_SPLIT "${ARCHS}") + set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-macosx${DEPLOYMENT_TARGET}) else() message(FATAL_ERROR "Invalid PLATFORM: ${PLATFORM_INT}") endif() @@ -472,7 +547,7 @@ endif() if(CMAKE_GENERATOR MATCHES "Xcode" AND PLATFORM_INT MATCHES "^MAC_CATALYST") set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++") set(CMAKE_XCODE_ATTRIBUTE_SUPPORTED_PLATFORMS "macosx") - set(CMAKE_XCODE_EFFECTIVE_PLATFORMS "-maccatalyst") + set(CMAKE_XCODE_ATTRIBUTE_SUPPORTS_MACCATALYST "YES") if(NOT DEFINED MACOSX_DEPLOYMENT_TARGET) set(CMAKE_XCODE_ATTRIBUTE_MACOSX_DEPLOYMENT_TARGET "10.15") else() @@ -487,7 +562,7 @@ elseif(CMAKE_GENERATOR MATCHES "Xcode") endif() endif() -# If user did not specify the SDK root to use, then query xcodebuild for it. +# If the user did not specify the SDK root to use, then query xcodebuild for it. if(DEFINED CMAKE_OSX_SYSROOT_INT) # Environment variables are always preserved. set(ENV{_CMAKE_OSX_SYSROOT_INT} "${CMAKE_OSX_SYSROOT_INT}") @@ -514,12 +589,8 @@ elseif(DEFINED CMAKE_OSX_SYSROOT_INT) endif() # Use bitcode or not -if(NOT DEFINED ENABLE_BITCODE AND NOT ARCHS MATCHES "((^|;|, )(i386|x86_64))+") - # Unless specified, enable bitcode support by default - message(STATUS "[DEFAULTS] Enabling bitcode support by default. ENABLE_BITCODE not provided!") - set(ENABLE_BITCODE ON) -elseif(NOT DEFINED ENABLE_BITCODE) - message(STATUS "[DEFAULTS] Disabling bitcode support by default on simulators. ENABLE_BITCODE not provided for override!") +if(NOT DEFINED ENABLE_BITCODE) + message(STATUS "[DEFAULTS] Disabling bitcode support by default. ENABLE_BITCODE not provided for override!") set(ENABLE_BITCODE OFF) endif() set(ENABLE_BITCODE_INT ${ENABLE_BITCODE} CACHE BOOL @@ -631,10 +702,14 @@ foreach(lang ${languages}) set(CMAKE_${lang}_CREATE_STATIC_LIBRARY "${BUILD_LIBTOOL} -static -o " CACHE INTERNAL "") endforeach() -# CMake 3.14+ support building for iOS, watchOS and tvOS out of the box. +# CMake 3.14+ support building for iOS, watchOS, and tvOS out of the box. if(MODERN_CMAKE) if(SDK_NAME MATCHES "iphone") set(CMAKE_SYSTEM_NAME iOS) + elseif(SDK_NAME MATCHES "xros") + set(CMAKE_SYSTEM_NAME visionOS) + elseif(SDK_NAME MATCHES "xrsimulator") + set(CMAKE_SYSTEM_NAME visionOS) elseif(SDK_NAME MATCHES "macosx") set(CMAKE_SYSTEM_NAME Darwin) elseif(SDK_NAME MATCHES "appletv") @@ -644,21 +719,27 @@ if(MODERN_CMAKE) endif() # Provide flags for a combined FAT library build on newer CMake versions if(PLATFORM_INT MATCHES ".*COMBINED") - set(CMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH "NO") set(CMAKE_IOS_INSTALL_COMBINED YES) + if(CMAKE_GENERATOR MATCHES "Xcode") + # Set the SDKROOT Xcode properties to a Xcode-friendly value (the SDK_NAME, E.g, iphoneos) + # This way, Xcode will automatically switch between the simulator and device SDK when building. + set(CMAKE_XCODE_ATTRIBUTE_SDKROOT "${SDK_NAME}") + # Force to not build just one ARCH, but all! + set(CMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH "NO") + endif() endif() elseif(NOT DEFINED CMAKE_SYSTEM_NAME AND ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.10") # Legacy code path prior to CMake 3.14 or fallback if no CMAKE_SYSTEM_NAME specified set(CMAKE_SYSTEM_NAME iOS) elseif(NOT DEFINED CMAKE_SYSTEM_NAME) - # Legacy code path prior to CMake 3.14 or fallback if no CMAKE_SYSTEM_NAME specified + # Legacy code path before CMake 3.14 or fallback if no CMAKE_SYSTEM_NAME specified set(CMAKE_SYSTEM_NAME Darwin) endif() # Standard settings. set(CMAKE_SYSTEM_VERSION ${SDK_VERSION} CACHE INTERNAL "") set(UNIX ON CACHE BOOL "") set(APPLE ON CACHE BOOL "") -if(PLATFORM STREQUAL "MAC" OR PLATFORM STREQUAL "MAC_ARM64") +if(PLATFORM STREQUAL "MAC" OR PLATFORM STREQUAL "MAC_ARM64" OR PLATFORM STREQUAL "MAC_UNIVERSAL") set(IOS OFF CACHE BOOL "") set(MACOS ON CACHE BOOL "") elseif(PLATFORM STREQUAL "MAC_CATALYST" OR PLATFORM STREQUAL "MAC_CATALYST_ARM64") @@ -667,9 +748,6 @@ elseif(PLATFORM STREQUAL "MAC_CATALYST" OR PLATFORM STREQUAL "MAC_CATALYST_ARM64 else() set(IOS ON CACHE BOOL "") endif() -set(CMAKE_AR ar CACHE FILEPATH "" FORCE) -set(CMAKE_RANLIB ranlib CACHE FILEPATH "" FORCE) -set(CMAKE_STRIP strip CACHE FILEPATH "" FORCE) # Set the architectures for which to build. set(CMAKE_OSX_ARCHITECTURES ${ARCHS} CACHE INTERNAL "") # Change the type of target generated for try_compile() so it'll work when cross-compiling, weak compiler checks @@ -677,7 +755,9 @@ if(NOT ENABLE_STRICT_TRY_COMPILE_INT) set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) endif() # All iOS/Darwin specific settings - some may be redundant. -set(CMAKE_MACOSX_BUNDLE YES) +if (NOT DEFINED CMAKE_MACOSX_BUNDLE) + set(CMAKE_MACOSX_BUNDLE YES) +endif() set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "NO") set(CMAKE_SHARED_LIBRARY_PREFIX "lib") set(CMAKE_SHARED_LIBRARY_SUFFIX ".dylib") @@ -727,6 +807,9 @@ if(${CMAKE_VERSION} VERSION_LESS "3.11") elseif(PLATFORM_INT STREQUAL "SIMULATOR_TVOS") set(SDK_NAME_VERSION_FLAGS "-mtvos-simulator-version-min=${DEPLOYMENT_TARGET}") +elseif(PLATFORM_INT STREQUAL "SIMULATORARM64_TVOS") + set(SDK_NAME_VERSION_FLAGS + "-mtvos-simulator-version-min=${DEPLOYMENT_TARGET}") elseif(PLATFORM_INT STREQUAL "WATCHOS") set(SDK_NAME_VERSION_FLAGS "-mwatchos-version-min=${DEPLOYMENT_TARGET}") @@ -800,9 +883,9 @@ if(DEFINED APPLE_TARGET_TRIPLE) set(APPLE_TARGET_TRIPLE_FLAG "-target ${APPLE_TARGET_TRIPLE}") endif() -#Check if Xcode generator is used, since that will handle these flags automagically +#Check if Xcode generator is used since that will handle these flags automagically if(CMAKE_GENERATOR MATCHES "Xcode") - message(STATUS "Not setting any manual command-line buildflags, since Xcode is selected as generator. Modifying the Xcode build-settings directly instead.") + message(STATUS "Not setting any manual command-line buildflags, since Xcode is selected as the generator. Modifying the Xcode build-settings directly instead.") else() set(CMAKE_C_FLAGS "${C_TARGET_FLAGS} ${APPLE_TARGET_TRIPLE_FLAG} ${SDK_NAME_VERSION_FLAGS} ${OBJC_LEGACY_VARS} ${BITCODE} ${VISIBILITY} ${CMAKE_C_FLAGS}") set(CMAKE_C_FLAGS_DEBUG "-O0 -g ${CMAKE_C_FLAGS_DEBUG}") @@ -953,7 +1036,9 @@ if(NOT PLATFORM_INT MATCHES "^MAC.*$") endif() # Default to searching for frameworks first. -set(CMAKE_FIND_FRAMEWORK FIRST) +IF(NOT DEFINED CMAKE_FIND_FRAMEWORK) + set(CMAKE_FIND_FRAMEWORK FIRST) +ENDIF(NOT DEFINED CMAKE_FIND_FRAMEWORK) # Set up the default search directories for frameworks. if(PLATFORM_INT MATCHES "^MAC_CATALYST") diff --git a/src/modules/bb/blitz3d/CMakeLists.txt b/src/modules/bb/blitz3d/CMakeLists.txt index aca39341..c5ec421a 100644 --- a/src/modules/bb/blitz3d/CMakeLists.txt +++ b/src/modules/bb/blitz3d/CMakeLists.txt @@ -1,18 +1,15 @@ +if(BB_MSVC AND BB_WIN32) + set(USE_D3DXOF true) +endif() + bb_start_module(blitz3d) set(DEPENDS_ON bb.graphics) -set(SOURCES animation.cpp animator.cpp blitz3d.h blitz3d.cpp brush.cpp cachedtexture.cpp camera.cpp collision.cpp entity.cpp frustum.cpp geom.cpp graphics.cpp graphics.h light.cpp listener.cpp loader_3ds.cpp loader_b3d.cpp md2model.cpp md2norms.cpp md2rep.cpp mesh.cpp meshcollider.cpp meshloader.cpp meshmodel.cpp meshutil.cpp mirror.cpp model.cpp object.cpp pivot.cpp planemodel.cpp q3bspmodel.cpp q3bsprep.cpp scene.cpp sprite.cpp std.cpp surface.cpp terrain.cpp terrainrep.cpp texture.cpp world.cpp animation.h animator.h blitz3d.h brush.h cachedtexture.h camera.h collision.h entity.h frustum.h geom.h light.h listener.h loader_3ds.h loader_b3d.h md2model.h md2norms.h md2rep.h meshcollider.h meshloader.h meshmodel.h meshutil.h mirror.h model.h object.h pivot.h planemodel.h q3bspmodel.h q3bsprep.h rendercontext.h scene.h sprite.h std.h surface.h terrain.h terrainrep.h texture.h world.h) - -if(NOT BB_MSVC OR BB_WIN64) - set(USE_ASSIMP true) -endif() +set(SOURCES animation.cpp animator.cpp blitz3d.h blitz3d.cpp brush.cpp cachedtexture.cpp camera.cpp collision.cpp entity.cpp frustum.cpp geom.cpp graphics.cpp graphics.h light.cpp listener.cpp loader_3ds.cpp loader_b3d.cpp loader_x2.cpp md2model.cpp md2norms.cpp md2rep.cpp mesh.cpp meshcollider.cpp meshloader.cpp meshmodel.cpp meshutil.cpp mirror.cpp model.cpp object.cpp pivot.cpp planemodel.cpp q3bspmodel.cpp q3bsprep.cpp scene.cpp sprite.cpp std.cpp surface.cpp terrain.cpp terrainrep.cpp texture.cpp world.cpp animation.h animator.h blitz3d.h brush.h cachedtexture.h camera.h collision.h entity.h frustum.h geom.h light.h listener.h loader_3ds.h loader_b3d.h md2model.h md2norms.h md2rep.h meshcollider.h meshloader.h meshmodel.h meshutil.h mirror.h model.h object.h pivot.h planemodel.h q3bspmodel.h q3bsprep.h rendercontext.h scene.h sprite.h std.h surface.h terrain.h terrainrep.h texture.h world.h) -IF(USE_ASSIMP) - set(SOURCES ${SOURCES} loader_assimp.cpp loader_assimp.h) - set(LIBS ${LIBS} assimp ${ZLIB}) -ELSE() +if(USE_D3DXOF) set(SOURCES ${SOURCES} loader_x.cpp loader_x.h) set(LIBS ${LIBS} d3dxof) -ENDIF() +endif() bb_end_module() @@ -20,13 +17,10 @@ set_target_properties(bb.blitz3d PROPERTIES UNITY_BUILD_MODE GROUP) set_source_files_properties(${SOURCES} PROPERTIES UNITY_GROUP "group1") set_source_files_properties(loader_b3d.cpp PROPERTIES UNITY_GROUP "group2") set_source_files_properties(loader_3ds.cpp PROPERTIES UNITY_GROUP "group3") -set_source_files_properties(loader_assimp.cpp PROPERTIES UNITY_GROUP "group4") -set_source_files_properties(loader_x.cpp PROPERTIES UNITY_GROUP "group5") +set_source_files_properties(loader_x.cpp PROPERTIES UNITY_GROUP "group4") +set_source_files_properties(loader_x2.cpp PROPERTIES UNITY_GROUP "group5") -IF(BB_WINDOWS AND NOT BB_MINGW) +if(USE_D3DXOF) target_link_libraries(bb.blitz3d dxsdk) -ENDIF() - -IF(USE_ASSIMP) - target_compile_definitions (bb.blitz3d PRIVATE USE_ASSIMP) -ENDIF() + target_compile_definitions (bb.blitz3d PRIVATE USE_D3DXOF) +endif() diff --git a/src/modules/bb/blitz3d/blitz3d.cpp b/src/modules/bb/blitz3d/blitz3d.cpp index ed630456..a986b4b9 100644 --- a/src/modules/bb/blitz3d/blitz3d.cpp +++ b/src/modules/bb/blitz3d/blitz3d.cpp @@ -7,10 +7,10 @@ #include #include #include "blitz3d.h" -#ifndef USE_ASSIMP +#ifdef USE_D3DXOF #include "loader_x.h" #else -#include "loader_assimp.h" +#include "loader_x2.h" #endif #include "loader_3ds.h" #include "loader_b3d.h" @@ -44,10 +44,10 @@ static ObjCollision picked; extern float stats3d[10]; -#ifndef USE_ASSIMP +#ifdef USE_D3DXOF static Loader_X loader_x; #else -static Loader_Assimp loader_x; +static Loader_X2 loader_x; #endif static Loader_3DS loader_3ds; static Loader_B3D loader_b3d; diff --git a/src/modules/bb/blitz3d/cachedtexture.cpp b/src/modules/bb/blitz3d/cachedtexture.cpp index d091897f..2b90f568 100644 --- a/src/modules/bb/blitz3d/cachedtexture.cpp +++ b/src/modules/bb/blitz3d/cachedtexture.cpp @@ -107,8 +107,8 @@ rep(d_new Rep(w,h,flags,cnt)){ } CachedTexture::CachedTexture( const std::string &f_,int flags,int w,int h,int first,int cnt ){ - std::string f=f_; - if( f.substr(0,2)==".\\" ) f=f.substr(2); + std::string f=canonicalpath( f_ ); + if( f.substr(0,2)=="." OS_FS_SEP ) f=f.substr(2); if( path.size() ){ #ifdef BB_WINDOWS // TODO: decide if tolower should get pushed into filenamefile/fullfilename std::string t=path+tolower( filenamefile( f ) ); @@ -163,8 +163,12 @@ const std::vector &CachedTexture::getFrames()const{ } void CachedTexture::setPath( const std::string &t ){ +#ifdef BB_WINDOWS path=tolower(t); +#else + path=t; +#endif if( int sz=path.size() ){ - if( path[sz-1]!='/' && path[sz-1]!='\\' ) path+='\\'; + if( path[sz-1]!=OS_FS_SEP[0] ) path+=OS_FS_SEP[0]; } } diff --git a/src/modules/bb/blitz3d/loader_x2.cpp b/src/modules/bb/blitz3d/loader_x2.cpp new file mode 100644 index 00000000..73735cbc --- /dev/null +++ b/src/modules/bb/blitz3d/loader_x2.cpp @@ -0,0 +1,812 @@ +// This is a replacement loader for the original loader_x.cpp which requires +// DX SDK components. +// +// https://learn.microsoft.com/en-us/windows/win32/direct3d9/dx9-graphics-reference-x-file-format + +#include +#include "loader_x2.h" +#include "meshmodel.h" +#include "animation.h" +#include "pivot.h" + +#include +#include + +static std::map frames_map; +static int anim_len; + +static bool conv,flip_tris; +static Transform conv_tform; +static bool collapse,animonly; + +#define XOFFILE_FORMAT_MAGIC \ + ((long)'x' + ((long)'o' << 8) + ((long)'f' << 16) + ((long)' ' << 24)) +#define XOFFILE_FORMAT_MAJOR_VERSION \ + ((long)'0' + ((long)'3' << 8)) +#define XOFFILE_FORMAT_BINARY \ + ((long)'b' + ((long)'i' << 8) + ((long)'n' << 16) + ((long)' ' << 24)) +#define XOFFILE_FORMAT_TEXT \ + ((long)'t' + ((long)'x' << 8) + ((long)'t' << 16) + ((long)' ' << 24)) +#define XOFFILE_FORMAT_COMPRESSED \ + ((long)'c' + ((long)'m' << 8) + ((long)'p' << 16) + ((long)' ' << 24)) +#define XOFFILE_FORMAT_FLOAT_BITS_32 \ + ((long)'0' + ((long)'0' << 8) + ((long)'3' << 16) + ((long)'2' << 24)) +#define XOFFILE_FORMAT_FLOAT_BITS_64 \ + ((long)'0' + ((long)'0' << 8) + ((long)'6' << 16) + ((long)'4' << 24)) + +#define TOKEN_NAME 1 +#define TOKEN_STRING 2 +#define TOKEN_INTEGER 3 +#define TOKEN_GUID 5 +#define TOKEN_INTEGER_LIST 6 +#define TOKEN_FLOAT_LIST 7 + +#define TOKEN_OBRACE 10 +#define TOKEN_CBRACE 11 +#define TOKEN_OPAREN 12 +#define TOKEN_CPAREN 13 +#define TOKEN_OBRACKET 14 +#define TOKEN_CBRACKET 15 +#define TOKEN_OANGLE 16 +#define TOKEN_CANGLE 17 +#define TOKEN_DOT 18 +#define TOKEN_COMMA 19 +#define TOKEN_SEMICOLON 20 +#define TOKEN_TEMPLATE 31 +#define TOKEN_WORD 40 +#define TOKEN_DWORD 41 +#define TOKEN_FLOAT 42 +#define TOKEN_DOUBLE 43 +#define TOKEN_CHAR 44 +#define TOKEN_UCHAR 45 +#define TOKEN_SWORD 46 +#define TOKEN_SDWORD 47 +#define TOKEN_VOID 48 +#define TOKEN_LPSTR 49 +#define TOKEN_UNICODE 50 +#define TOKEN_CSTRING 51 +#define TOKEN_ARRAY 52 + +#define TOKEN_COMMENT 98 +#define TOKEN_EOF 99 + +class XParser:public std::ifstream{ +protected: + int format,float_bits; + +public: + XParser( const std::string &path ):std::ifstream( path,std::ios::binary ),format(0),float_bits(0){} + + enum{ + BINARY, + TEXT + }; + + typedef unsigned int dword; + typedef std::vector int_list; + typedef std::vector float32_list; + + class Object{ + public: + std::string tmpl,id; + std::vector blob; + std::vector children; + + Object( const std::string &t,const std::string &i ):tmpl(t),id(i){} + Object():Object( "","" ){} + + char *data(){ + return blob.data(); + } + + size_t size(){ + return blob.size(); + } + + char *expand( size_t len ){ + blob.resize( blob.size()+len ); + return blob.data()+blob.size()-len; + } + + void add( void *mem,size_t len ){ + dword *data=(dword*)expand( len ); + memcpy( data,mem,len ); + } + + void add( const std::string &s ){ + dword len=s.size(); + add( &len,sizeof(len) ); + add( (void*)s.data(),s.size() ); + } + + void add( int_list list ){ + size_t len=list.size()*sizeof(dword); + dword *data=(dword*)expand( len ); + for( auto &i:list ){ + *data++=i; + } + } + }; + + class Token{ + public: + dword type; + std::string text; + Token( dword t,const std::string &s ):type(t),text(s){} + Token():Token( 0,"" ){} + + bool operator==( const int i ){ + return type==i; + } + bool operator!=( const int i ){ + return type!=i; + } + bool operator==( const std::string &t ){ + return text==t; + } + bool operator!=( const std::string &t ){ + return text!=t; + } + }; + + std::map> objects; + std::map mats; + Object tmp; + + void ex( const std::string &msg ){ + throw "["+itoa(tellg())+"] "+msg; + } + + void log( const std::string &msg ){ + std::cerr<<"["<data(); + brush.setColor( Vector( color[0],color[1],color[2] ) ); + if( color[3] ) brush.setAlpha( color[3] ); + + std::string tex; + for( auto& child:obj->children ){ + if( child->tmpl=="TextureFileName"||child->tmpl=="TextureFilename" ){ + dword cnt=*(dword*)child->data(); + // std::string tex( child->data()+4,cnt ); + tex=std::string( child->data()+4,cnt ); + + brush.setTexture( 0,Texture( tex,0 ),0 ); + brush.setColor( Vector( 1,1,1 ) ); + } + } + + return brush; + } + + struct FaceX{ + dword *data,mat_index; + FaceX( dword *d ):data(d),mat_index(0){} + }; + + void parseMesh( Object *obj,MeshModel *mesh, std::map &mats_map ){ + //stuff... + std::vector faces; + std::vector mats; + + MeshLoader::beginMesh(); + + // log("parseMesh-start "+obj->id); + + dword *data=(dword*)obj->data(); + + //setup vertices + int num_verts=*data++; + // log("parseMesh-num_verts "+itoa(num_verts)); + + for( int k=0;kchildren ){ + std::string name=child->tmpl; + if( name=="MeshNormals" ){ + dword *data=(dword*)child->data(); + dword num_normals=*data++; + if( num_normals==num_verts ){ + Matrix co=conv_tform.m.cofactor(); + for( int k=0;kdata(); + + if( num_coords==num_verts ){ + float *coords=(float*)(child->data()+4); + for( int k=0;kdata(); + dword num_mats=*data++; + dword num_faces=*data++; + for( dword k=0;kchildren ){ + Object *mat=0; + if( child->tmpl=="Material" ){ + mat=child; + }else if( child->tmpl=="DataReference" ){ + mat=objects["Material"][child->id]; + if( !mat ) ex("wat"); + } + + if( mat ){ + mats.push_back( parseMaterial( mat ) ); + if( --num_mats==0 ) break; + } + } + + for( dword i=0;iupdateNormals(); + } + + void parseFrameTransformMatrix( Object *c,MeshModel *e ){ + if( c->size()!=16*sizeof(float) ) return; + + float *els=(float*)c->data(); + Transform tform=Transform( Matrix( + Vector( els[ 0],els[ 1],els[ 2] ), + Vector( els[ 4],els[ 5],els[ 6] ), + Vector( els[ 8],els[ 9],els[10] ) ), + Vector( els[12],els[13],els[14] ) ); + if( conv ) tform=conv_tform * tform * -conv_tform; + e->setLocalTform( tform ); + } + + MeshModel *parseFrame( Object *obj ){ + MeshModel *e=d_new MeshModel(); + e->setName( obj->id ); + frames_map[obj->id]=e; + + for( auto &child:obj->children ){ + std::string &tmpl=child->tmpl; + if( tmpl=="FrameTransformMatrix" ){ + parseFrameTransformMatrix( child,e ); + }else if( tmpl=="Frame" ){ + MeshModel *t=parseFrame( child ); + t->setParent( e ); + }else if( tmpl=="Mesh" ){ + if( !animonly ) parseMesh( child,e,mats ); + }else if( tmpl=="Material" ){ + // nothing to do here... + }else{ + log( "Unhandled object "+tmpl ); + } + } + + // log("parseFrame-end"); + return e; + } + + void parseAnimKey( Object *obj,MeshModel *e ){ + dword *data=(dword*)obj->data(); + dword type=*data++; + dword cnt=*data++; + Animation anim=e->getAnimation(); + for( int k=0;kanim_len ) anim_len=time; + switch( type ){ + case 0: + if( n==4 ){ + Quat rot=*(Quat*)data; + if( conv ){ + if( fabs(rot.w)<1-EPSILON ){ + rot.normalize(); + //quat-to-axis/angle + float half=acosf( rot.w ); + if( flip_tris ) half=-half; + rot=Quat( cosf( half ),(conv_tform.m*rot.v).normalized()*sinf( half ) ); + }else rot=Quat(); + } + anim.setRotationKey( time,rot ); + } + break; + case 1: + if( n==3 ){ + Vector scl=*(Vector*)data; + if( conv ) scl=conv_tform.m * scl; + scl.x=fabs(scl.x);scl.y=fabs(scl.y);scl.z=fabs(scl.z); + anim.setScaleKey( time,scl ); + } + break; + case 2: + if( n==3 ){ + Vector pos=*(Vector*)data; + if( conv ) pos=conv_tform*pos; + anim.setPositionKey( time,pos ); + } + break; + } + data+=n; + } + e->setAnimation( anim ); + + // log("parseAnimKey-end"); + } + + void parseAnim( Object *obj ){ + MeshModel *frame=0; + + // log("parseAnim-start"); + + for( auto &child:obj->children ){ + if( child->tmpl=="Frame" ){ + frame=frames_map[child->id]; + if( frame ) break; + } + } + + if( frame ){ + for( auto &child:obj->children ){ + if( child->tmpl=="AnimationKey" ){ + parseAnimKey( child,frame ); + } + } + } + + // log("parseAnim-end"); + } + + void parseAnimSet( Object *obj ){ + for( auto &child:obj->children ){ + if( child->tmpl=="Animation" ){ + parseAnim( child ); + } + } + } + + void eat( size_t sz ){ + char c=get(); + while( !eof()&&sz>0 ){ + c=get(); + if( !isspace(c) ) sz--; + } + } + + Token readToken(){ + Token t; + if( format==BINARY ){ + dword c=readShort(); + if( eof() ) return Token( TOKEN_EOF,"" ); + + t.type=c; + if( c==TOKEN_NAME ){ + dword count=readInt(); + t.text.resize( count ); + read( t.text.data(),count ); + }else if( c==TOKEN_GUID ){ + dword data1=readInt(); + dword data2=readShort(); + dword data3=readShort(); + readInt();readInt(); + }else if( c==TOKEN_STRING||c==TOKEN_INTEGER_LIST||c==TOKEN_FLOAT_LIST ){ + }else if( c==TOKEN_OBRACE ){ + t.text="{"; + }else if( c==TOKEN_CPAREN ){ + t.text="("; + }else if( c==TOKEN_OPAREN ){ + t.text=")"; + }else if( c==TOKEN_CBRACE ){ + t.text="}"; + }else if( c==TOKEN_OBRACKET ){ + t.text="["; + }else if( c==TOKEN_CBRACKET ){ + t.text="]"; + }else if( c==TOKEN_SEMICOLON ){ + t.text=";"; + }else if( c==TOKEN_TEMPLATE ){ + t.text="template"; + }else if( c==TOKEN_WORD ){ + t.text="WORD"; + }else if( c==TOKEN_DWORD ){ + t.text="DWORD"; + }else if( c==TOKEN_FLOAT ){ + t.text="FLOAT"; + }else if( c==TOKEN_DOUBLE ){ + t.text="DOUBLE"; + }else if( c==TOKEN_CHAR ){ + t.text="CHAR"; + }else if( c==TOKEN_UCHAR ){ + t.text="UCHAR"; + }else if( c==TOKEN_SWORD ){ + t.text="SWORD"; + }else if( c==TOKEN_SDWORD ){ + t.text="SDWORD"; + }else if( c==TOKEN_VOID ){ + t.text="VOID"; + }else if( c==TOKEN_LPSTR ){ + t.text="LPSTR"; + }else if( c==TOKEN_ARRAY ){ + readShort(); + expectName(); + expect( TOKEN_OBRACKET ); + readToken(); + expect( TOKEN_CBRACKET ); + t.text=""; + }else{ + ex( "Unmapped char "+itoa(c) ); + } + }else if( format==TEXT ){ + char c=get(); + while( isspace(c) ) c=get(); + + if( eof() ) return Token( TOKEN_EOF,"" ); + + std::string s( 1,c ); + if( isalpha(c)||peek()=='_' ){ + char p; + while( isalnum(p=peek())||p=='_'||p=='-' ) s+=get(); + + if( s=="template" ){ + t.type=TOKEN_TEMPLATE; + }else{ + t.type=TOKEN_NAME; + } + }else if( isdigit(c)||c=='-' ){ + while( isdigit(peek()) ) s+=get(); + if( peek()=='.' ){ + s+=get(); + while( isdigit(peek()) ) s+=get(); + if( peek()=='E' ){ + s+=get(); + s+=get(); + while( isdigit(peek()) ) s+=get(); + } + t.type=TOKEN_FLOAT; + }else{ + t.type=TOKEN_INTEGER; + } + }else if( c=='"' ){ + s=""; + while( peek()!='"' ) s+=get(); + get(); + t.type=TOKEN_STRING; + }else if( c=='{' ){ + t.type=TOKEN_OBRACE; + }else if( c=='}' ){ + t.type=TOKEN_CBRACE; + }else if( c=='[' ){ + t.type=TOKEN_OBRACKET; + }else if( c==']' ){ + t.type=TOKEN_CBRACKET; + }else if( c=='<' ){ + t.type=TOKEN_OANGLE; + }else if( c=='>' ){ + t.type=TOKEN_CANGLE; + }else if( c=='.' ){ + t.type=TOKEN_DOT; + }else if( c==',' ){ + t.type=TOKEN_COMMA; + }else if( c==';' ){ + t.type=TOKEN_SEMICOLON; + }else if( c=='#'||c=='/'&&peek()=='/' ){ + t.type=TOKEN_COMMENT; + while( peek()!='\n' ) s+=get(); + } + t.text=s; + } + if( !eof()&&!t.type ) ex( "missing type for "+t.text ); + return t; + } + + Object *parseObject( Token t ){ + std::string tmpl,id; + tmpl=t.text; + + t=readToken(); + if( t!="{" ){ + if( t!=TOKEN_NAME ){ + ex( "Expected name, but got "+t.text ); + } + id=t.text; + expect( "{" ); + } + + t=readToken(); + if( t=="<" ){ + eat(36); + expect( ">" ); + } + + tmp.blob.clear(); + tmp.blob.reserve( 1024 ); + + Object *obj=d_new Object( tmpl,id ); + if( id!="" ) objects[tmpl][id]=obj; + + bool data=true; + do { + if( t=="}" ) break; + + if( t==TOKEN_NAME||t==TOKEN_OBRACE ){ + obj->blob=tmp.blob; + + do{ + if( t==TOKEN_NAME ){ + obj->children.push_back( parseObject( t ) ); + }else if( t==TOKEN_OBRACE ){ + Object *ref=d_new Object( "DataReference",expectName() ); + obj->children.push_back( ref ); + expect( "}" ); + } + } while( !eof() && (t=readToken())!="}" ); + + return obj; + } + + if( format==BINARY ){ + switch( t.type ){ + case TOKEN_STRING: + { + dword count=readInt(); + char *data=tmp.expand( sizeof(dword)+count ); + *data=count; + if( count>0 ) read( data+sizeof(dword),count ); + } + readShort(); + break; + // case TOKEN_INTEGER: + // case TOKEN_GUID: + case TOKEN_INTEGER_LIST: + { + dword count=readInt(); + int_list list;list.resize( count ); + read( (char*)list.data(),count*sizeof(dword) ); + tmp.add( list ); + } + break; + case TOKEN_FLOAT_LIST: + { + dword count=readInt(); + size_t len=count*sizeof(float); + float *data=(float*)tmp.expand( len ); + if( float_bits==32 ){ + read( (char*)data,len ); + }else if( float_bits==64 ){ + double v; + for( dword i=0;iblob=tmp.blob; + // expect( "}" ); + return obj; + } + + MeshModel *parseObjects(){ + MeshModel *e=d_new MeshModel(); + + std::vector objs; + + Token t; + while( (t=readToken())!=TOKEN_EOF ){ + if( t==TOKEN_NAME ){ + objs.push_back( parseObject( t ) ); + }else if( t==TOKEN_TEMPLATE ){ + expectName(); + expect( "{" ); + while( readToken().text!="}" ){} + } + } + + for( auto &obj:objs ){ + if( obj->tmpl=="Mesh" ){ + if( !animonly ) parseMesh( obj,e,mats ); + }else if( obj->tmpl=="Frame" ){ + MeshModel *t=parseFrame( obj ); + t->setParent( e ); + }else if( obj->tmpl=="AnimationSet" ){ + if( !collapse ) parseAnimSet( obj ); + }else if( obj->tmpl=="Header"||obj->tmpl=="Material" ){ + // nothing to do... + }else{ + log( "Unhandled object "+obj->tmpl ); + } + } + + return e; + } + + MeshModel *parseFile(){ + MeshModel *e; + + try{ + e=parseObjects(); + }catch( const std::string &e ){ + LOGE( "[loader.x] %s",e.c_str() ); + return 0; + } + + if( !collapse ){ + e->setAnimator( d_new Animator( e,anim_len ) ); + } + + return e; + } +}; + +MeshModel *Loader_X2::load( const std::string &filename,const Transform &t,int hint ){ + conv_tform=t; + conv=flip_tris=false; + if( conv_tform!=Transform() ){ + conv=true; + if( conv_tform.m.i.cross(conv_tform.m.j).dot(conv_tform.m.k)<0 ) flip_tris=true; + } + collapse=!!(hint&MeshLoader::HINT_COLLAPSE); + animonly=!!(hint&MeshLoader::HINT_ANIMONLY); + + std::string path=filename; +#ifdef BB_NX + path="romfs:/"+path; +#endif + XParser in( path ); + if( !in.is_open() ){ + in.log( "failed to open "+path ); + return 0; + } + + if( in.readInt()!=XOFFILE_FORMAT_MAGIC ) return 0; + if( in.readShort()!=XOFFILE_FORMAT_MAJOR_VERSION ) return 0; + in.readShort(); // minor version + + switch( in.readInt() ){ + case XOFFILE_FORMAT_BINARY: + in.setFormat( XParser::BINARY ); + break; + case XOFFILE_FORMAT_TEXT: + in.setFormat( XParser::TEXT ); + break; + default: + return 0; + } + + switch( in.readInt() ){ + case XOFFILE_FORMAT_FLOAT_BITS_32: + in.setFloatBits( 32 ); + break; + case XOFFILE_FORMAT_FLOAT_BITS_64: + in.setFloatBits( 64 ); + break; + default: + return 0; + } + + MeshModel *e=in.parseFile(); + frames_map.clear(); + return e; +} diff --git a/src/modules/bb/blitz3d/loader_x2.h b/src/modules/bb/blitz3d/loader_x2.h new file mode 100644 index 00000000..703a89b6 --- /dev/null +++ b/src/modules/bb/blitz3d/loader_x2.h @@ -0,0 +1,12 @@ + +#ifndef LOADER_X2_H +#define LOADER_X2_H + +#include "meshloader.h" + +class Loader_X2 final : public MeshLoader{ +public: + MeshModel *load( const std::string &f,const Transform &conv,int hint ); +}; + +#endif diff --git a/src/modules/bb/graphics/CMakeLists.txt b/src/modules/bb/graphics/CMakeLists.txt index d0b12313..ea1d1203 100644 --- a/src/modules/bb/graphics/CMakeLists.txt +++ b/src/modules/bb/graphics/CMakeLists.txt @@ -1,7 +1,7 @@ bb_start_module(graphics) set(DEPENDS_ON bb.blitz bb.runtime bb.system bb.input bb.pixmap) set(SOURCES graphics.h graphics.cpp canvas.h canvas.cpp driver.cpp font.h font.cpp movie.h movie.cpp) -set(LIBS freetype) +set(LIBS freetype ${ZLIB}) bb_end_module() target_link_libraries(bb.graphics utf8.h) diff --git a/src/modules/bb/string/string.cpp b/src/modules/bb/string/string.cpp index 1bd6fb8b..11dcd4a9 100644 --- a/src/modules/bb/string/string.cpp +++ b/src/modules/bb/string/string.cpp @@ -70,8 +70,9 @@ bb_int_t BBCALL bbInstr( BBStr *s,BBStr *t,bb_int_t from ){ BBStr * BBCALL bbMid( BBStr *s,bb_int_t o,bb_int_t n ){ CHKOFF( o ); + if( n==-1 ) n=s->size(); utf8_int32_t chr; - const char *l=s->c_str(),*r=s->c_str()+s->size()-1; + const char *l=s->c_str(),*r=s->c_str()+s->size(); const char *p=l;while( --o>0&&p0&&psubstr( p-l,e-p );return s; diff --git a/src/stdutil/stdutil.cpp b/src/stdutil/stdutil.cpp index 933d4345..1e38ad68 100644 --- a/src/stdutil/stdutil.cpp +++ b/src/stdutil/stdutil.cpp @@ -318,7 +318,7 @@ std::string toupper( const std::string &s ){ } std::string fullfilename( const std::string &t ){ -#ifdef BB_NDK +#if defined(BB_NDK)||defined(BB_NX) // TODO: this may not be the correct thing... return t; #endif @@ -343,8 +343,11 @@ std::string filenamepath( const std::string &t ){ #else std::string filenamepath( const std::string &t ){ #ifdef BB_NX - // FIXME: this certainly isn't right - return t; + size_t p=t.size(); + while( t[p]!='/'&&t[p]!='\\'&&p>0 ) p--; + std::string res=t.substr( 0,p ); + if( res=="" ) res="."; + return res; #else char buff[PATH_MAX+1]; strcpy( buff,t.c_str() ); @@ -363,8 +366,9 @@ std::string filenamefile( const std::string &t ){ #else std::string filenamefile( const std::string &t ){ #ifdef BB_NX - // FIXME: this certainly isn't right - return t; + size_t p=t.size(); + while( t[p]!='/'&&t[p]!='\\'&&p>0 ) --p; + return t.substr( p ); #else char buff[PATH_MAX+1]; strcpy( buff,t.c_str() ); diff --git a/src/stdutil/stdutil.h b/src/stdutil/stdutil.h index f325acfa..50ba3867 100644 --- a/src/stdutil/stdutil.h +++ b/src/stdutil/stdutil.h @@ -17,6 +17,12 @@ HBITMAP ScaleBitmap( HBITMAP bmp,int width,int height ); #endif +#ifdef BB_WINDOWS +#define OS_FS_SEP "\\" +#else +#define OS_FS_SEP "/" +#endif + #ifdef MEMDEBUG void * _cdecl operator new( size_t size ); diff --git a/test/modules/blitz3d.bb b/test/modules/blitz3d.bb index bcc4ebc5..acc8d449 100644 --- a/test/modules/blitz3d.bb +++ b/test/modules/blitz3d.bb @@ -48,12 +48,30 @@ Expect mirror<>0, "can create a mirror" mirror_copy=CopyEntity(mirror) +Function TotalVerts( m ) + v=0 + For i=1 To CountSurfaces( m ) + v=v+CountVertices(GetSurface(m,i)) + Next + Return v +End Function + +Function TotalTris( m ) + v=0 + For i=1 To CountSurfaces( m ) + v=v+CountTriangles(GetSurface(m,i)) + Next + Return v +End Function + dwarf_b3d=LoadAnimMesh( "media/dwarf2.b3d" ) Expect dwarf_b3d<>0, "can load animated b3d" Animate dwarf_b3d,2,0.2 level_b3d=LoadMesh( "../_release/samples/mak/cubewater/level/test.b3d" ) Expect level_b3d<>0, "can load b3d" +ExpectInt TotalVerts(level_b3d),5251 +ExpectInt TotalTris(level_b3d),4383 bot_3ds=LoadAnimMesh( "../_release/samples/mak/anim/makbot/mak_robotic.3DS" ) Expect bot_3ds<>0, "can load 3ds" @@ -67,6 +85,75 @@ dragon=LoadMD2( "../_release/samples/mak/dragon/model/dragon.md2" ); Expect dragon<>0, "can load md2" AnimateMD2 dragon,1,.05,0,40 +bot_x_flat=LoadMesh( "../_release/samples/mak/anim/makbot/mak_robotic.x") +ExpectInt TotalVerts(bot_x_flat),1883 +ExpectInt TotalTris(bot_x_flat),1554 + +ufo=LoadMesh( "../_release/Games/wing_ring/media/blue_ufo.X" ); +Expect ufo<>0, "can load X" + +Function CanLoad( file$,surfs,verts,tris ) + mesh=LoadMesh( file ) + Expect mesh<>0,"Can load "+file + If mesh + ExpectInt CountSurfaces( mesh ),surfs,file+" has "+surfs+" surfaces" + ExpectInt TotalVerts( mesh ),verts,file+" has "+verts+" vertices" + ExpectInt TotalTris( mesh ),tris,file+" has "+tris+" triangles" + End If +End Function + +CanLoad( "../_release/samples/birdie/dolphin/dolphin.x",1,285,564 ) +CanLoad( "../_release/samples/birdie/dolphin/seafloor.x",1,1490,2830 ) +CanLoad( "../_release/samples/birdie/dolphin/ddown.x",1,285,564 ) +CanLoad( "../_release/samples/birdie/dolphin/dup.x",1,285,564 ) +CanLoad( "../_release/samples/birdie/LodMesh/dolphin.x",1,285,564 ) +CanLoad( "../_release/samples/birdie/Jet Tails/jet.x",3,142,199 ) +CanLoad( "../_release/samples/RobHutchinson/WingPilot/objects/eyepiece.x",2,245,163 ) +CanLoad( "../_release/samples/RobHutchinson/WingPilot/objects/mainring.x",1,64,64 ) +CanLoad( "../_release/samples/RobHutchinson/WingPilot/objects/maincent.x",1,18,16 ) +CanLoad( "../_release/samples/RobHutchinson/WingPilot/Craft1.x",4,375,328 ) +CanLoad( "../_release/samples/RobHutchinson/ModelChildren/Models/facia.x",2,82,28 ) +CanLoad( "../_release/samples/RobHutchinson/CraftFlare/Craft1.x",4,375,328 ) +CanLoad( "../_release/samples/RobHutchinson/SkyPlateau/Models/ground.x",4,777,605 ) +CanLoad( "../_release/samples/RobHutchinson/SkyPlateau/Models/icon.x",1,323,276 ) +CanLoad( "../_release/samples/RobHutchinson/SkyPlateau/Models/totem.x",1,290,184 ) +CanLoad( "../_release/samples/halo/Lightmap/level.x",2,996,356 ) +CanLoad( "../_release/samples/halo/Lightmap/lightmap.x",1,996,356 ) +CanLoad( "../_release/samples/zenith/scare/models/pistol/pistol.x",1,200,287 ) +CanLoad( "../_release/samples/zenith/scare/models/level/level.x",5,759,548 ) +CanLoad( "../_release/samples/zenith/scare/models/level/crate.x",2,48,24 ) +CanLoad( "../_release/samples/mak/anim/makbot/mak_robotic.x",3,1883,1554 ) +CanLoad( "../_release/samples/mak/anim/makbot/mak_running.x",3,1883,1554 ) +CanLoad( "../_release/samples/mak/driver/car.x",5,1051,1850 ) +CanLoad( "../_release/samples/mak/xfighter/biplane.x",4,1282,596 ) +CanLoad( "../_release/samples/mak/castle/markio/mariorun.x",6,1052,1118 ) +CanLoad( "../_release/samples/mak/castle/castle/CASTLE1.X",4,3295,1506 ) +CanLoad( "../_release/samples/mak/teapot/teapot.x",1,1178,2256 ) +CanLoad( "../_release/samples/si/fps/ladders.X",2,10,6 ) +CanLoad( "../_release/samples/si/fps/interior.X",5,3756,1878 ) +CanLoad( "../_release/samples/AGore/BirdDemo/Canyon.x",1,12090,4030 ) +CanLoad( "../_release/samples/AGore/HeadDemo/Eye.x",1,162,320 ) +CanLoad( "../_release/samples/AGore/HeadDemo/Head.x",1,1343,2418 ) +CanLoad( "../_release/samples/Hi-Toro/Death Island/msh/747.X",6,4380,5706 ) +CanLoad( "../_release/samples/Hi-Toro/Shooter/Shooter/msh/ship.x",4,254,228 ) +CanLoad( "../_release/Games/wing_ring/media/pink_ufo.x",4,215,414 ) +CanLoad( "../_release/Games/wing_ring/media/orange_ufo.x",4,215,414 ) +CanLoad( "../_release/Games/wing_ring/media/green_ufo.x",4,215,414 ) +CanLoad( "../_release/Games/wing_ring/media/yellow_ufo.X",4,215,414 ) +CanLoad( "../_release/Games/wing_ring/media/mother.x",5,215,374 ) +CanLoad( "../_release/Games/wing_ring/media/sphinx.x",1,276,548 ) +CanLoad( "../_release/Games/wing_ring/media/stat_lib.x",2,277,538 ) +CanLoad( "../_release/Games/wing_ring/media/camel.x",1,275,546 ) +CanLoad( "../_release/Games/wing_ring/media/blue_ufo.X",4,215,414 ) +CanLoad( "../_release/Games/wing_ring/media/plane.x",4,142,199 ) +CanLoad( "../_release/help/commands/3d_examples/media/CACTUS2.X",1,36,68 ) +CanLoad( "../_release/help/commands/3d_examples/media/teapot.x",1,1178,2256 ) +CanLoad( "../_release/help/commands/3d_examples/media/green_ufo.x",4,215,414 ) +CanLoad( "../_release/help/commands/3d_examples/media/makbot/mak_robotic.x",3,1883,1554 ) +CanLoad( "../_release/help/commands/3d_examples/media/makbot/mak_running.x",3,1883,1554 ) +CanLoad( "../_release/help/commands/3d_examples/media/camel.x",1,275,546 ) +CanLoad( "../_release/Media/geometricks_models/supplies/supplies.x",2,24,12 ) + terr=LoadTerrain( "../_release/samples/mak/castle/environ/terrain-1.jpg" ) Expect terr<>0, "can load terrain" diff --git a/test/modules/string.bb b/test/modules/string.bb index 7a35826a..a7d7be0e 100644 --- a/test/modules/string.bb +++ b/test/modules/string.bb @@ -24,9 +24,11 @@ ExpectInt Instr( "AöBBAA","A",100000 ),0 ExpectInt Instr( "AöBBAA","C",100000 ),0 ExpectStr Mid( "Kevin",2,3 ), "evi" +ExpectStr Mid( "Kevin",2 ), "evin" ExpectStr Mid( "wörld",2,2 ), "ör" ExpectStr Mid( "wörld",1000,1000 ), "" ExpectStr Mid( "wörld",2,1000 ), "örld" +ExpectStr Mid$( "test/test.x",Instr("test/test.x",".")+1 ), "x" ExpectStr Upper( "Kevin" ),"KEVIN" ExpectStr Upper("hello, wörld"),"HELLO, WÖRLD"