浏览代码

update SDL3 to 3.1.6.

Sasha Szpakowski 1 年之前
父节点
当前提交
8c4c8655aa
共有 100 个文件被更改,包括 2400 次插入309 次删除
  1. 15 4
      libs/SDL3/.gitignore
  2. 12 12
      libs/SDL3/CMakeLists.txt
  3. 283 10
      libs/SDL3/VisualC/SDL.sln
  4. 13 0
      libs/SDL3/VisualC/VisualC/examples/audio/01-simple-playback/01-simple-playback.vcxproj
  5. 13 0
      libs/SDL3/VisualC/VisualC/examples/audio/02-simple-playback-callback/02-simple-playback-callback.vcxproj
  6. 13 0
      libs/SDL3/VisualC/VisualC/examples/audio/03-load-wav/03-load-wav.vcxproj
  7. 13 0
      libs/SDL3/VisualC/VisualC/examples/camera/01-read-and-draw/01-read-and-draw.vcxproj
  8. 13 0
      libs/SDL3/VisualC/VisualC/examples/game/01-snake/01-snake.vcxproj
  9. 13 0
      libs/SDL3/VisualC/VisualC/examples/pen/01-drawing-lines/01-drawing-lines.vcxproj
  10. 13 0
      libs/SDL3/VisualC/VisualC/examples/renderer/01-clear/01-clear.vcxproj
  11. 13 0
      libs/SDL3/VisualC/VisualC/examples/renderer/02-primitives/02-primitives.vcxproj
  12. 13 0
      libs/SDL3/VisualC/VisualC/examples/renderer/03-lines/03-lines.vcxproj
  13. 13 0
      libs/SDL3/VisualC/VisualC/examples/renderer/04-points/04-points.vcxproj
  14. 13 0
      libs/SDL3/VisualC/VisualC/examples/renderer/05-rectangles/05-rectangles.vcxproj
  15. 13 0
      libs/SDL3/VisualC/VisualC/examples/renderer/06-textures/06-textures.vcxproj
  16. 13 0
      libs/SDL3/VisualC/VisualC/examples/renderer/07-streaming-textures/07-streaming-textures.vcxproj
  17. 13 0
      libs/SDL3/VisualC/VisualC/examples/renderer/08-rotating-textures/08-rotating-textures.vcxproj
  18. 13 0
      libs/SDL3/VisualC/VisualC/examples/renderer/09-scaling-textures/09-scaling-textures.vcxproj
  19. 13 0
      libs/SDL3/VisualC/VisualC/examples/renderer/10-geometry/10-geometry.vcxproj
  20. 13 0
      libs/SDL3/VisualC/VisualC/examples/renderer/11-color-mods/11-color-mods.vcxproj
  21. 13 0
      libs/SDL3/VisualC/VisualC/examples/renderer/14-viewport/14-viewport.vcxproj
  22. 13 0
      libs/SDL3/VisualC/VisualC/examples/renderer/15-cliprect/15-cliprect.vcxproj
  23. 13 0
      libs/SDL3/VisualC/VisualC/examples/renderer/17-read-pixels/17-read-pixels.vcxproj
  24. 13 0
      libs/SDL3/VisualC/VisualC/examples/renderer/18-debug-text/18-debug-text.vcxproj
  25. 177 0
      libs/SDL3/VisualC/examples/Directory.Build.props
  26. 13 0
      libs/SDL3/VisualC/examples/audio/01-simple-playback/01-simple-playback.vcxproj
  27. 13 0
      libs/SDL3/VisualC/examples/audio/02-simple-playback-callback/02-simple-playback-callback.vcxproj
  28. 14 0
      libs/SDL3/VisualC/examples/audio/03-load-wav/03-load-wav.vcxproj
  29. 13 0
      libs/SDL3/VisualC/examples/camera/01-read-and-draw/01-read-and-draw.vcxproj
  30. 13 0
      libs/SDL3/VisualC/examples/game/01-snake/01-snake.vcxproj
  31. 13 0
      libs/SDL3/VisualC/examples/game/02-woodeneye-008/02-woodeneye-008.vcxproj
  32. 13 0
      libs/SDL3/VisualC/examples/game/03-infinite-monkeys/03-infinite-monkeys.vcxproj
  33. 54 0
      libs/SDL3/VisualC/examples/generate.py
  34. 13 0
      libs/SDL3/VisualC/examples/pen/01-drawing-lines/01-drawing-lines.vcxproj
  35. 13 0
      libs/SDL3/VisualC/examples/renderer/01-clear/01-clear.vcxproj
  36. 13 0
      libs/SDL3/VisualC/examples/renderer/02-primitives/02-primitives.vcxproj
  37. 13 0
      libs/SDL3/VisualC/examples/renderer/03-lines/03-lines.vcxproj
  38. 13 0
      libs/SDL3/VisualC/examples/renderer/04-points/04-points.vcxproj
  39. 13 0
      libs/SDL3/VisualC/examples/renderer/05-rectangles/05-rectangles.vcxproj
  40. 14 0
      libs/SDL3/VisualC/examples/renderer/06-textures/06-textures.vcxproj
  41. 13 0
      libs/SDL3/VisualC/examples/renderer/07-streaming-textures/07-streaming-textures.vcxproj
  42. 14 0
      libs/SDL3/VisualC/examples/renderer/08-rotating-textures/08-rotating-textures.vcxproj
  43. 13 0
      libs/SDL3/VisualC/examples/renderer/09-scaling-textures/09-scaling-textures.vcxproj
  44. 14 0
      libs/SDL3/VisualC/examples/renderer/10-geometry/10-geometry.vcxproj
  45. 14 0
      libs/SDL3/VisualC/examples/renderer/11-color-mods/11-color-mods.vcxproj
  46. 14 0
      libs/SDL3/VisualC/examples/renderer/14-viewport/14-viewport.vcxproj
  47. 14 0
      libs/SDL3/VisualC/examples/renderer/15-cliprect/15-cliprect.vcxproj
  48. 14 0
      libs/SDL3/VisualC/examples/renderer/17-read-pixels/17-read-pixels.vcxproj
  49. 13 0
      libs/SDL3/VisualC/examples/renderer/18-debug-text/18-debug-text.vcxproj
  50. 2 2
      libs/SDL3/Xcode/SDL/Info-Framework.plist
  51. 6 6
      libs/SDL3/Xcode/SDL/SDL.xcodeproj/project.pbxproj
  52. 1 1
      libs/SDL3/Xcode/SDL/pkg-support/SDL.info
  53. 6 0
      libs/SDL3/android-project/app/src/main/AndroidManifest.xml
  54. 1 1
      libs/SDL3/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java
  55. 16 0
      libs/SDL3/build-scripts/SDL_migration.cocci
  56. 1 1
      libs/SDL3/build-scripts/build-release.py
  57. 1 1
      libs/SDL3/build-scripts/create-release.py
  58. 8 5
      libs/SDL3/build-scripts/fnsince.pl
  59. 8 0
      libs/SDL3/build-scripts/pkg-support/msvc/Directory.Build.props
  60. 7 0
      libs/SDL3/build-scripts/wikiheaders.pl
  61. 16 6
      libs/SDL3/cmake/macros.cmake
  62. 15 0
      libs/SDL3/cmake/sdlchecks.cmake
  63. 31 11
      libs/SDL3/docs/README-cmake.md
  64. 22 37
      libs/SDL3/docs/README-emscripten.md
  65. 0 3
      libs/SDL3/docs/README-git.md
  66. 2 0
      libs/SDL3/docs/README-ios.md
  67. 4 0
      libs/SDL3/docs/README-linux.md
  68. 2 2
      libs/SDL3/docs/README-macos.md
  69. 7 1
      libs/SDL3/docs/README-migration.md
  70. 1 1
      libs/SDL3/docs/README-wayland.md
  71. 14 31
      libs/SDL3/examples/CMakeLists.txt
  72. 1 1
      libs/SDL3/examples/camera/01-read-and-draw/read-and-draw.c
  73. 7 4
      libs/SDL3/examples/game/01-snake/snake.c
  74. 1 0
      libs/SDL3/examples/game/02-woodeneye-008/README.txt
  75. 480 0
      libs/SDL3/examples/game/02-woodeneye-008/woodeneye-008.c
  76. 7 0
      libs/SDL3/examples/game/03-infinite-monkeys/README.txt
  77. 377 0
      libs/SDL3/examples/game/03-infinite-monkeys/infinite-monkeys.c
  78. 2 2
      libs/SDL3/examples/pen/01-drawing-lines/drawing-lines.c
  79. 1 1
      libs/SDL3/examples/renderer/01-clear/clear.c
  80. 5 5
      libs/SDL3/examples/renderer/02-primitives/primitives.c
  81. 4 4
      libs/SDL3/examples/renderer/03-lines/lines.c
  82. 2 2
      libs/SDL3/examples/renderer/04-points/points.c
  83. 5 5
      libs/SDL3/examples/renderer/05-rectangles/rectangles.c
  84. 1 1
      libs/SDL3/examples/renderer/06-textures/textures.c
  85. 1 1
      libs/SDL3/examples/renderer/07-streaming-textures/streaming-textures.c
  86. 1 1
      libs/SDL3/examples/renderer/08-rotating-textures/rotating-textures.c
  87. 1 1
      libs/SDL3/examples/renderer/09-scaling-textures/scaling-textures.c
  88. 1 1
      libs/SDL3/examples/renderer/10-geometry/geometry.c
  89. 1 1
      libs/SDL3/examples/renderer/11-color-mods/color-mods.c
  90. 1 1
      libs/SDL3/examples/renderer/14-viewport/viewport.c
  91. 1 1
      libs/SDL3/examples/renderer/15-cliprect/cliprect.c
  92. 1 1
      libs/SDL3/examples/renderer/17-read-pixels/read-pixels.c
  93. 4 4
      libs/SDL3/examples/renderer/18-debug-text/debug-text.c
  94. 1 1
      libs/SDL3/include/SDL3/SDL.h
  95. 47 18
      libs/SDL3/include/SDL3/SDL_assert.h
  96. 31 21
      libs/SDL3/include/SDL3/SDL_atomic.h
  97. 97 72
      libs/SDL3/include/SDL3/SDL_audio.h
  98. 2 2
      libs/SDL3/include/SDL3/SDL_bits.h
  99. 6 4
      libs/SDL3/include/SDL3/SDL_blendmode.h
  100. 19 19
      libs/SDL3/include/SDL3/SDL_camera.h

+ 15 - 4
libs/SDL3/.gitignore

@@ -29,15 +29,27 @@ __pycache__
 *.rej
 
 # for CMake
+.cmake
 CMakeFiles/
 CMakeCache.txt
 cmake_install.cmake
 cmake_uninstall.cmake
-SDL3ConfigVersion.cmake
-.ninja_*
-*.ninja
+install_manifest.txt
+*Targets.cmake
+*Config.cmake
+*ConfigVersion.cmake
+CTestTestfile.cmake
+Testing
 compile_commands.json
 .cache/
+/include-config-*
+/include-revision
+/Makefile
+.ninja_*
+*.ninja
+*.pc
+test/*.test
+wayland-generated-protocols
 
 # for CLion
 .idea
@@ -86,7 +98,6 @@ src/render/direct3d12/D3D12_*_One.h
 src/render/direct3d12/D3D12_*_Series.h
 src/gpu/d3d12/D3D12_*_One.h
 src/gpu/d3d12/D3D12_*_Series.h
-Directory.Build.props
 
 # for Android
 android-project/local.properties

+ 12 - 12
libs/SDL3/CMakeLists.txt

@@ -1,11 +1,7 @@
 cmake_minimum_required(VERSION 3.16)
 
-if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)
-  message(FATAL_ERROR "Prevented in-tree build. Please create a build directory outside of the SDL source code and run \"cmake -S ${CMAKE_SOURCE_DIR} -B .\" from there")
-endif()
-
 # See docs/release_checklist.md
-project(SDL3 LANGUAGES C VERSION "3.1.5")
+project(SDL3 LANGUAGES C VERSION "3.1.6")
 
 if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
   set(SDL3_SUBPROJECT OFF)
@@ -337,6 +333,7 @@ dep_option(SDL_VIVANTE             "Use Vivante EGL video driver" ON "${UNIX_SYS
 dep_option(SDL_VULKAN              "Enable Vulkan support" ON "SDL_VIDEO;ANDROID OR APPLE OR LINUX OR FREEBSD OR WINDOWS" OFF)
 dep_option(SDL_RENDER_VULKAN       "Enable the Vulkan render driver" ON "SDL_RENDER;SDL_VULKAN" OFF)
 dep_option(SDL_METAL               "Enable Metal support" ON "APPLE" OFF)
+set_option(SDL_OPENVR              "Use OpenVR video driver" OFF)
 dep_option(SDL_KMSDRM              "Use KMS DRM video driver" ${UNIX_SYS} "SDL_VIDEO" OFF)
 dep_option(SDL_KMSDRM_SHARED       "Dynamically load KMS DRM support" ON "SDL_KMSDRM" OFF)
 set_option(SDL_OFFSCREEN           "Use offscreen video driver" ON)
@@ -455,7 +452,7 @@ sdl_compile_definitions(PRIVATE "USING_GENERATED_CONFIG_H")
 sdl_include_directories(
   PRIVATE
     "${SDL3_BINARY_DIR}/include-config-$<LOWER_CASE:$<CONFIG>>/build_config"
-    "${SDL3_BINARY_DIR}/include"
+    "${SDL3_BINARY_DIR}/include-revision"
     "${SDL3_SOURCE_DIR}/include"
 )
 # Note: The clang toolset for Visual Studio does not support the '-idirafter' option.
@@ -1544,6 +1541,7 @@ elseif(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU)
     CheckOpenGL()
     CheckOpenGLES()
     CheckWayland()
+    CheckOpenVR()
     CheckVivante()
     CheckVulkan()
     CheckQNXScreen()
@@ -1941,6 +1939,8 @@ elseif(WINDOWS)
     set(SDL_VIDEO_DRIVER_WINDOWS 1)
     sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/windows/*.c")
 
+    CheckOpenVR()
+
     if(SDL_RENDER_D3D AND HAVE_D3D9_H)
       set(SDL_VIDEO_RENDER_D3D 1)
       set(HAVE_RENDER_D3D TRUE)
@@ -3046,11 +3046,11 @@ endif()
 # config variables may contain generator expression, so we need to generate SDL_build_config.h in 2 steps:
 # 1. replace all `#cmakedefine`'s and `@abc@`
 configure_file("${SDL3_SOURCE_DIR}/include/build_config/SDL_build_config.h.cmake"
-  "${SDL3_BINARY_DIR}/SDL_build_config.h.intermediate")
+  "${SDL3_BINARY_DIR}/CMakeFiles/SDL_build_config.h.intermediate")
 # 2. generate SDL_build_config.h in an build_type-dependent folder (which should be first in the include search path)
 file(GENERATE
   OUTPUT "${SDL3_BINARY_DIR}/include-config-$<LOWER_CASE:$<CONFIG>>/build_config/SDL_build_config.h"
-  INPUT "${SDL3_BINARY_DIR}/SDL_build_config.h.intermediate"
+  INPUT "${SDL3_BINARY_DIR}/CMakeFiles/SDL_build_config.h.intermediate"
 )
 
 file(GLOB SDL3_INCLUDE_FILES "${SDL3_SOURCE_DIR}/include/SDL3/*.h")
@@ -3074,9 +3074,9 @@ if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/REVISION.txt")
   set(SDL_REVISION "SDL3-${SDL_REVISION_CENTER}")
 endif()
 
-execute_process(COMMAND "${CMAKE_COMMAND}" -E make_directory "${SDL3_BINARY_DIR}/include/SDL3")
-configure_file(include/build_config/SDL_revision.h.cmake include/SDL3/SDL_revision.h @ONLY)
-list(APPEND SDL3_INCLUDE_FILES "${SDL3_BINARY_DIR}/include/SDL3/SDL_revision.h")
+execute_process(COMMAND "${CMAKE_COMMAND}" -E make_directory "${SDL3_BINARY_DIR}/include-revision/SDL3")
+configure_file(include/build_config/SDL_revision.h.cmake include-revision/SDL3/SDL_revision.h @ONLY)
+list(APPEND SDL3_INCLUDE_FILES "${SDL3_BINARY_DIR}/include-revision/SDL3/SDL_revision.h")
 
 if(SDL_FRAMEWORK)
   # With Apple frameworks, headers in the PUBLIC_HEADER property also need to be added as sources
@@ -3273,7 +3273,7 @@ add_library(SDL3::Headers ALIAS SDL3_Headers)
 set_property(TARGET SDL3_Headers PROPERTY EXPORT_NAME "Headers")
 target_include_directories(SDL3_Headers
   INTERFACE
-    "$<BUILD_INTERFACE:${SDL3_BINARY_DIR}/include>"
+    "$<BUILD_INTERFACE:${SDL3_BINARY_DIR}/include-revision>"
     "$<BUILD_INTERFACE:${SDL3_SOURCE_DIR}/include>"
 )
 if(SDL_FRAMEWORK)

+ 283 - 10
libs/SDL3/VisualC/SDL.sln

@@ -12,7 +12,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testatomic", "tests\testato
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testautomation", "tests\testautomation\testautomation.vcxproj", "{9C7E8C03-3130-436D-A97E-E8F8ED1AC4EA}"
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testdialog", "tests\testdialog\testdialog.vcxproj", "{97A3A89b-E023-48CD-905F-CDBDE8D951DE}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testdialog", "tests\testdialog\testdialog.vcxproj", "{97A3A89B-E023-48CD-905F-CDBDE8D951DE}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testdraw", "tests\testdraw\testdraw.vcxproj", "{8682FE1E-0CF6-4EDD-9BB5-1733D8C8B4DF}"
 EndProject
@@ -54,6 +54,67 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testsurround", "tests\tests
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testpen", "tests\testpen\testpen.vcxproj", "{C4E04D18-EF76-4B42-B4C2-16A1BACDC1A3}"
 EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "examples", "examples", "{1498F0CD-F4DA-4847-9CB2-FB18D48061D5}"
+	ProjectSection(SolutionItems) = preProject
+		examples\Directory.Build.props = examples\Directory.Build.props
+	EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "audio", "audio", "{1B61A1B7-92DE-4C37-9151-D2928D6449AB}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "01-simple-playback", "examples\audio\01-simple-playback\01-simple-playback.vcxproj", "{EB448819-74BC-40C9-A61A-4D4ECD55F9D5}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "02-simple-playback-callback", "examples\audio\02-simple-playback-callback\02-simple-playback-callback.vcxproj", "{6B710DFF-8A4A-40A2-BF2D-88D266F3D4F0}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "camera", "camera", "{AAEC8338-4D33-4AF5-9A1F-B9FF027D4607}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "01-read-and-draw", "examples\camera\01-read-and-draw\01-read-and-draw.vcxproj", "{510ACF0C-4012-4216-98EF-E4F155DE33CE}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "game", "game", "{D1BF59F6-22DC-493B-BDEB-451A50DA793D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "01-snake", "examples\game\01-snake\01-snake.vcxproj", "{7820969A-5B7B-4046-BB0A-82905D457FC5}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "pen", "pen", "{F2247885-8EE8-42F4-A702-4155587620E0}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "01-drawing-lines", "examples\pen\01-drawing-lines\01-drawing-lines.vcxproj", "{5EDA1ED3-8213-4C12-B0DF-B631EB611804}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "renderer", "renderer", "{F91DDAF0-B74F-4516-A1A9-42ED8DFCBF6A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "01-clear", "examples\renderer\01-clear\01-clear.vcxproj", "{896557AC-7575-480C-8FFD-AB08B5DA305D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "02-primitives", "examples\renderer\02-primitives\02-primitives.vcxproj", "{504DC7EC-D82E-448E-9C7D-3BE7981592B3}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "03-lines", "examples\renderer\03-lines\03-lines.vcxproj", "{BDE7DBC0-DCE7-432E-8750-C4AE55463699}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "04-points", "examples\renderer\04-points\04-points.vcxproj", "{7B250AB1-92D3-4F1A-BEB4-19605A69CEDB}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "05-rectangles", "examples\renderer\05-rectangles\05-rectangles.vcxproj", "{4C0E3A60-24F8-4D4C-81C0-C1777F5E7B17}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "06-textures", "examples\renderer\06-textures\06-textures.vcxproj", "{B3D61611-BFA3-4B66-ADC7-A3CE578A6D36}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07-streaming-textures", "examples\renderer\07-streaming-textures\07-streaming-textures.vcxproj", "{540AE143-A58F-4D3B-B843-94EA8576522D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "08-rotating-textures", "examples\renderer\08-rotating-textures\08-rotating-textures.vcxproj", "{7091C001-3D71-47D4-B27B-E99271E5B987}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "09-scaling-textures", "examples\renderer\09-scaling-textures\09-scaling-textures.vcxproj", "{AF8BC84E-0268-4D1F-9503-84D9EE84C65F}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "10-geometry", "examples\renderer\10-geometry\10-geometry.vcxproj", "{8B9AB23E-3F40-4145-BA1C-B2CEACFBBD72}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "11-color-mods", "examples\renderer\11-color-mods\11-color-mods.vcxproj", "{E9C6A7A6-22C0-42E6-AC9C-8580A396D077}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "14-viewport", "examples\renderer\14-viewport\14-viewport.vcxproj", "{B85BC466-C7F0-4C6D-8ECF-ED57E775FC73}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "15-cliprect", "examples\renderer\15-cliprect\15-cliprect.vcxproj", "{9DBD962F-EA4D-44E3-8E8E-31D7F060A2DC}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "17-read-pixels", "examples\renderer\17-read-pixels\17-read-pixels.vcxproj", "{EEF00329-4598-4E34-B969-9DD4B0815E6C}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "18-debug-text", "examples\renderer\18-debug-text\18-debug-text.vcxproj", "{CC0714AA-8A81-4E29-BEC5-2E4FBC50E7FE}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "03-load-wav", "examples\audio\03-load-wav\03-load-wav.vcxproj", "{608C6C67-7766-471F-BBFF-8B00086039AF}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "02-woodeneye-008", "examples\game\02-woodeneye-008\02-woodeneye-008.vcxproj", "{A3F601E0-B54C-4DD8-8A97-FDEF7624EE60}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "03-infinite-monkeys", "examples\game\03-infinite-monkeys\03-infinite-monkeys.vcxproj", "{75AEE75A-C016-4497-960B-D767B822237D}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Win32 = Debug|Win32
@@ -102,14 +163,14 @@ Global
 		{9C7E8C03-3130-436D-A97E-E8F8ED1AC4EA}.Release|Win32.Build.0 = Release|Win32
 		{9C7E8C03-3130-436D-A97E-E8F8ED1AC4EA}.Release|x64.ActiveCfg = Release|x64
 		{9C7E8C03-3130-436D-A97E-E8F8ED1AC4EA}.Release|x64.Build.0 = Release|x64
-		{97A3A89b-E023-48CD-905F-CDBDE8D951DE}.Debug|Win32.ActiveCfg = Debug|Win32
-		{97A3A89b-E023-48CD-905F-CDBDE8D951DE}.Debug|Win32.Build.0 = Debug|Win32
-		{97A3A89b-E023-48CD-905F-CDBDE8D951DE}.Debug|x64.ActiveCfg = Debug|x64
-		{97A3A89b-E023-48CD-905F-CDBDE8D951DE}.Debug|x64.Build.0 = Debug|x64
-		{97A3A89b-E023-48CD-905F-CDBDE8D951DE}.Release|Win32.ActiveCfg = Release|Win32
-		{97A3A89b-E023-48CD-905F-CDBDE8D951DE}.Release|Win32.Build.0 = Release|Win32
-		{97A3A89b-E023-48CD-905F-CDBDE8D951DE}.Release|x64.ActiveCfg = Release|x64
-		{97A3A89b-E023-48CD-905F-CDBDE8D951DE}.Release|x64.Build.0 = Release|x64
+		{97A3A89B-E023-48CD-905F-CDBDE8D951DE}.Debug|Win32.ActiveCfg = Debug|Win32
+		{97A3A89B-E023-48CD-905F-CDBDE8D951DE}.Debug|Win32.Build.0 = Debug|Win32
+		{97A3A89B-E023-48CD-905F-CDBDE8D951DE}.Debug|x64.ActiveCfg = Debug|x64
+		{97A3A89B-E023-48CD-905F-CDBDE8D951DE}.Debug|x64.Build.0 = Debug|x64
+		{97A3A89B-E023-48CD-905F-CDBDE8D951DE}.Release|Win32.ActiveCfg = Release|Win32
+		{97A3A89B-E023-48CD-905F-CDBDE8D951DE}.Release|Win32.Build.0 = Release|Win32
+		{97A3A89B-E023-48CD-905F-CDBDE8D951DE}.Release|x64.ActiveCfg = Release|x64
+		{97A3A89B-E023-48CD-905F-CDBDE8D951DE}.Release|x64.Build.0 = Release|x64
 		{8682FE1E-0CF6-4EDD-9BB5-1733D8C8B4DF}.Debug|Win32.ActiveCfg = Debug|Win32
 		{8682FE1E-0CF6-4EDD-9BB5-1733D8C8B4DF}.Debug|Win32.Build.0 = Debug|Win32
 		{8682FE1E-0CF6-4EDD-9BB5-1733D8C8B4DF}.Debug|x64.ActiveCfg = Debug|x64
@@ -270,6 +331,190 @@ Global
 		{C4E04D18-EF76-4B42-B4C2-16A1BACDC1A3}.Release|Win32.Build.0 = Release|Win32
 		{C4E04D18-EF76-4B42-B4C2-16A1BACDC1A3}.Release|x64.ActiveCfg = Release|x64
 		{C4E04D18-EF76-4B42-B4C2-16A1BACDC1A3}.Release|x64.Build.0 = Release|x64
+		{EB448819-74BC-40C9-A61A-4D4ECD55F9D5}.Debug|Win32.ActiveCfg = Debug|Win32
+		{EB448819-74BC-40C9-A61A-4D4ECD55F9D5}.Debug|Win32.Build.0 = Debug|Win32
+		{EB448819-74BC-40C9-A61A-4D4ECD55F9D5}.Debug|x64.ActiveCfg = Debug|x64
+		{EB448819-74BC-40C9-A61A-4D4ECD55F9D5}.Debug|x64.Build.0 = Debug|x64
+		{EB448819-74BC-40C9-A61A-4D4ECD55F9D5}.Release|Win32.ActiveCfg = Release|Win32
+		{EB448819-74BC-40C9-A61A-4D4ECD55F9D5}.Release|Win32.Build.0 = Release|Win32
+		{EB448819-74BC-40C9-A61A-4D4ECD55F9D5}.Release|x64.ActiveCfg = Release|x64
+		{EB448819-74BC-40C9-A61A-4D4ECD55F9D5}.Release|x64.Build.0 = Release|x64
+		{6B710DFF-8A4A-40A2-BF2D-88D266F3D4F0}.Debug|Win32.ActiveCfg = Debug|Win32
+		{6B710DFF-8A4A-40A2-BF2D-88D266F3D4F0}.Debug|Win32.Build.0 = Debug|Win32
+		{6B710DFF-8A4A-40A2-BF2D-88D266F3D4F0}.Debug|x64.ActiveCfg = Debug|x64
+		{6B710DFF-8A4A-40A2-BF2D-88D266F3D4F0}.Debug|x64.Build.0 = Debug|x64
+		{6B710DFF-8A4A-40A2-BF2D-88D266F3D4F0}.Release|Win32.ActiveCfg = Release|Win32
+		{6B710DFF-8A4A-40A2-BF2D-88D266F3D4F0}.Release|Win32.Build.0 = Release|Win32
+		{6B710DFF-8A4A-40A2-BF2D-88D266F3D4F0}.Release|x64.ActiveCfg = Release|x64
+		{6B710DFF-8A4A-40A2-BF2D-88D266F3D4F0}.Release|x64.Build.0 = Release|x64
+		{510ACF0C-4012-4216-98EF-E4F155DE33CE}.Debug|Win32.ActiveCfg = Debug|Win32
+		{510ACF0C-4012-4216-98EF-E4F155DE33CE}.Debug|Win32.Build.0 = Debug|Win32
+		{510ACF0C-4012-4216-98EF-E4F155DE33CE}.Debug|x64.ActiveCfg = Debug|x64
+		{510ACF0C-4012-4216-98EF-E4F155DE33CE}.Debug|x64.Build.0 = Debug|x64
+		{510ACF0C-4012-4216-98EF-E4F155DE33CE}.Release|Win32.ActiveCfg = Release|Win32
+		{510ACF0C-4012-4216-98EF-E4F155DE33CE}.Release|Win32.Build.0 = Release|Win32
+		{510ACF0C-4012-4216-98EF-E4F155DE33CE}.Release|x64.ActiveCfg = Release|x64
+		{510ACF0C-4012-4216-98EF-E4F155DE33CE}.Release|x64.Build.0 = Release|x64
+		{7820969A-5B7B-4046-BB0A-82905D457FC5}.Debug|Win32.ActiveCfg = Debug|Win32
+		{7820969A-5B7B-4046-BB0A-82905D457FC5}.Debug|Win32.Build.0 = Debug|Win32
+		{7820969A-5B7B-4046-BB0A-82905D457FC5}.Debug|x64.ActiveCfg = Debug|x64
+		{7820969A-5B7B-4046-BB0A-82905D457FC5}.Debug|x64.Build.0 = Debug|x64
+		{7820969A-5B7B-4046-BB0A-82905D457FC5}.Release|Win32.ActiveCfg = Release|Win32
+		{7820969A-5B7B-4046-BB0A-82905D457FC5}.Release|Win32.Build.0 = Release|Win32
+		{7820969A-5B7B-4046-BB0A-82905D457FC5}.Release|x64.ActiveCfg = Release|x64
+		{7820969A-5B7B-4046-BB0A-82905D457FC5}.Release|x64.Build.0 = Release|x64
+		{5EDA1ED3-8213-4C12-B0DF-B631EB611804}.Debug|Win32.ActiveCfg = Debug|Win32
+		{5EDA1ED3-8213-4C12-B0DF-B631EB611804}.Debug|Win32.Build.0 = Debug|Win32
+		{5EDA1ED3-8213-4C12-B0DF-B631EB611804}.Debug|x64.ActiveCfg = Debug|x64
+		{5EDA1ED3-8213-4C12-B0DF-B631EB611804}.Debug|x64.Build.0 = Debug|x64
+		{5EDA1ED3-8213-4C12-B0DF-B631EB611804}.Release|Win32.ActiveCfg = Release|Win32
+		{5EDA1ED3-8213-4C12-B0DF-B631EB611804}.Release|Win32.Build.0 = Release|Win32
+		{5EDA1ED3-8213-4C12-B0DF-B631EB611804}.Release|x64.ActiveCfg = Release|x64
+		{5EDA1ED3-8213-4C12-B0DF-B631EB611804}.Release|x64.Build.0 = Release|x64
+		{896557AC-7575-480C-8FFD-AB08B5DA305D}.Debug|Win32.ActiveCfg = Debug|Win32
+		{896557AC-7575-480C-8FFD-AB08B5DA305D}.Debug|Win32.Build.0 = Debug|Win32
+		{896557AC-7575-480C-8FFD-AB08B5DA305D}.Debug|x64.ActiveCfg = Debug|x64
+		{896557AC-7575-480C-8FFD-AB08B5DA305D}.Debug|x64.Build.0 = Debug|x64
+		{896557AC-7575-480C-8FFD-AB08B5DA305D}.Release|Win32.ActiveCfg = Release|Win32
+		{896557AC-7575-480C-8FFD-AB08B5DA305D}.Release|Win32.Build.0 = Release|Win32
+		{896557AC-7575-480C-8FFD-AB08B5DA305D}.Release|x64.ActiveCfg = Release|x64
+		{896557AC-7575-480C-8FFD-AB08B5DA305D}.Release|x64.Build.0 = Release|x64
+		{504DC7EC-D82E-448E-9C7D-3BE7981592B3}.Debug|Win32.ActiveCfg = Debug|Win32
+		{504DC7EC-D82E-448E-9C7D-3BE7981592B3}.Debug|Win32.Build.0 = Debug|Win32
+		{504DC7EC-D82E-448E-9C7D-3BE7981592B3}.Debug|x64.ActiveCfg = Debug|x64
+		{504DC7EC-D82E-448E-9C7D-3BE7981592B3}.Debug|x64.Build.0 = Debug|x64
+		{504DC7EC-D82E-448E-9C7D-3BE7981592B3}.Release|Win32.ActiveCfg = Release|Win32
+		{504DC7EC-D82E-448E-9C7D-3BE7981592B3}.Release|Win32.Build.0 = Release|Win32
+		{504DC7EC-D82E-448E-9C7D-3BE7981592B3}.Release|x64.ActiveCfg = Release|x64
+		{504DC7EC-D82E-448E-9C7D-3BE7981592B3}.Release|x64.Build.0 = Release|x64
+		{BDE7DBC0-DCE7-432E-8750-C4AE55463699}.Debug|Win32.ActiveCfg = Debug|Win32
+		{BDE7DBC0-DCE7-432E-8750-C4AE55463699}.Debug|Win32.Build.0 = Debug|Win32
+		{BDE7DBC0-DCE7-432E-8750-C4AE55463699}.Debug|x64.ActiveCfg = Debug|x64
+		{BDE7DBC0-DCE7-432E-8750-C4AE55463699}.Debug|x64.Build.0 = Debug|x64
+		{BDE7DBC0-DCE7-432E-8750-C4AE55463699}.Release|Win32.ActiveCfg = Release|Win32
+		{BDE7DBC0-DCE7-432E-8750-C4AE55463699}.Release|Win32.Build.0 = Release|Win32
+		{BDE7DBC0-DCE7-432E-8750-C4AE55463699}.Release|x64.ActiveCfg = Release|x64
+		{BDE7DBC0-DCE7-432E-8750-C4AE55463699}.Release|x64.Build.0 = Release|x64
+		{7B250AB1-92D3-4F1A-BEB4-19605A69CEDB}.Debug|Win32.ActiveCfg = Debug|Win32
+		{7B250AB1-92D3-4F1A-BEB4-19605A69CEDB}.Debug|Win32.Build.0 = Debug|Win32
+		{7B250AB1-92D3-4F1A-BEB4-19605A69CEDB}.Debug|x64.ActiveCfg = Debug|x64
+		{7B250AB1-92D3-4F1A-BEB4-19605A69CEDB}.Debug|x64.Build.0 = Debug|x64
+		{7B250AB1-92D3-4F1A-BEB4-19605A69CEDB}.Release|Win32.ActiveCfg = Release|Win32
+		{7B250AB1-92D3-4F1A-BEB4-19605A69CEDB}.Release|Win32.Build.0 = Release|Win32
+		{7B250AB1-92D3-4F1A-BEB4-19605A69CEDB}.Release|x64.ActiveCfg = Release|x64
+		{7B250AB1-92D3-4F1A-BEB4-19605A69CEDB}.Release|x64.Build.0 = Release|x64
+		{4C0E3A60-24F8-4D4C-81C0-C1777F5E7B17}.Debug|Win32.ActiveCfg = Debug|Win32
+		{4C0E3A60-24F8-4D4C-81C0-C1777F5E7B17}.Debug|Win32.Build.0 = Debug|Win32
+		{4C0E3A60-24F8-4D4C-81C0-C1777F5E7B17}.Debug|x64.ActiveCfg = Debug|x64
+		{4C0E3A60-24F8-4D4C-81C0-C1777F5E7B17}.Debug|x64.Build.0 = Debug|x64
+		{4C0E3A60-24F8-4D4C-81C0-C1777F5E7B17}.Release|Win32.ActiveCfg = Release|Win32
+		{4C0E3A60-24F8-4D4C-81C0-C1777F5E7B17}.Release|Win32.Build.0 = Release|Win32
+		{4C0E3A60-24F8-4D4C-81C0-C1777F5E7B17}.Release|x64.ActiveCfg = Release|x64
+		{4C0E3A60-24F8-4D4C-81C0-C1777F5E7B17}.Release|x64.Build.0 = Release|x64
+		{B3D61611-BFA3-4B66-ADC7-A3CE578A6D36}.Debug|Win32.ActiveCfg = Debug|Win32
+		{B3D61611-BFA3-4B66-ADC7-A3CE578A6D36}.Debug|Win32.Build.0 = Debug|Win32
+		{B3D61611-BFA3-4B66-ADC7-A3CE578A6D36}.Debug|x64.ActiveCfg = Debug|x64
+		{B3D61611-BFA3-4B66-ADC7-A3CE578A6D36}.Debug|x64.Build.0 = Debug|x64
+		{B3D61611-BFA3-4B66-ADC7-A3CE578A6D36}.Release|Win32.ActiveCfg = Release|Win32
+		{B3D61611-BFA3-4B66-ADC7-A3CE578A6D36}.Release|Win32.Build.0 = Release|Win32
+		{B3D61611-BFA3-4B66-ADC7-A3CE578A6D36}.Release|x64.ActiveCfg = Release|x64
+		{B3D61611-BFA3-4B66-ADC7-A3CE578A6D36}.Release|x64.Build.0 = Release|x64
+		{540AE143-A58F-4D3B-B843-94EA8576522D}.Debug|Win32.ActiveCfg = Debug|Win32
+		{540AE143-A58F-4D3B-B843-94EA8576522D}.Debug|Win32.Build.0 = Debug|Win32
+		{540AE143-A58F-4D3B-B843-94EA8576522D}.Debug|x64.ActiveCfg = Debug|x64
+		{540AE143-A58F-4D3B-B843-94EA8576522D}.Debug|x64.Build.0 = Debug|x64
+		{540AE143-A58F-4D3B-B843-94EA8576522D}.Release|Win32.ActiveCfg = Release|Win32
+		{540AE143-A58F-4D3B-B843-94EA8576522D}.Release|Win32.Build.0 = Release|Win32
+		{540AE143-A58F-4D3B-B843-94EA8576522D}.Release|x64.ActiveCfg = Release|x64
+		{540AE143-A58F-4D3B-B843-94EA8576522D}.Release|x64.Build.0 = Release|x64
+		{7091C001-3D71-47D4-B27B-E99271E5B987}.Debug|Win32.ActiveCfg = Debug|Win32
+		{7091C001-3D71-47D4-B27B-E99271E5B987}.Debug|Win32.Build.0 = Debug|Win32
+		{7091C001-3D71-47D4-B27B-E99271E5B987}.Debug|x64.ActiveCfg = Debug|x64
+		{7091C001-3D71-47D4-B27B-E99271E5B987}.Debug|x64.Build.0 = Debug|x64
+		{7091C001-3D71-47D4-B27B-E99271E5B987}.Release|Win32.ActiveCfg = Release|Win32
+		{7091C001-3D71-47D4-B27B-E99271E5B987}.Release|Win32.Build.0 = Release|Win32
+		{7091C001-3D71-47D4-B27B-E99271E5B987}.Release|x64.ActiveCfg = Release|x64
+		{7091C001-3D71-47D4-B27B-E99271E5B987}.Release|x64.Build.0 = Release|x64
+		{AF8BC84E-0268-4D1F-9503-84D9EE84C65F}.Debug|Win32.ActiveCfg = Debug|Win32
+		{AF8BC84E-0268-4D1F-9503-84D9EE84C65F}.Debug|Win32.Build.0 = Debug|Win32
+		{AF8BC84E-0268-4D1F-9503-84D9EE84C65F}.Debug|x64.ActiveCfg = Debug|x64
+		{AF8BC84E-0268-4D1F-9503-84D9EE84C65F}.Debug|x64.Build.0 = Debug|x64
+		{AF8BC84E-0268-4D1F-9503-84D9EE84C65F}.Release|Win32.ActiveCfg = Release|Win32
+		{AF8BC84E-0268-4D1F-9503-84D9EE84C65F}.Release|Win32.Build.0 = Release|Win32
+		{AF8BC84E-0268-4D1F-9503-84D9EE84C65F}.Release|x64.ActiveCfg = Release|x64
+		{AF8BC84E-0268-4D1F-9503-84D9EE84C65F}.Release|x64.Build.0 = Release|x64
+		{8B9AB23E-3F40-4145-BA1C-B2CEACFBBD72}.Debug|Win32.ActiveCfg = Debug|Win32
+		{8B9AB23E-3F40-4145-BA1C-B2CEACFBBD72}.Debug|Win32.Build.0 = Debug|Win32
+		{8B9AB23E-3F40-4145-BA1C-B2CEACFBBD72}.Debug|x64.ActiveCfg = Debug|x64
+		{8B9AB23E-3F40-4145-BA1C-B2CEACFBBD72}.Debug|x64.Build.0 = Debug|x64
+		{8B9AB23E-3F40-4145-BA1C-B2CEACFBBD72}.Release|Win32.ActiveCfg = Release|Win32
+		{8B9AB23E-3F40-4145-BA1C-B2CEACFBBD72}.Release|Win32.Build.0 = Release|Win32
+		{8B9AB23E-3F40-4145-BA1C-B2CEACFBBD72}.Release|x64.ActiveCfg = Release|x64
+		{8B9AB23E-3F40-4145-BA1C-B2CEACFBBD72}.Release|x64.Build.0 = Release|x64
+		{E9C6A7A6-22C0-42E6-AC9C-8580A396D077}.Debug|Win32.ActiveCfg = Debug|Win32
+		{E9C6A7A6-22C0-42E6-AC9C-8580A396D077}.Debug|Win32.Build.0 = Debug|Win32
+		{E9C6A7A6-22C0-42E6-AC9C-8580A396D077}.Debug|x64.ActiveCfg = Debug|x64
+		{E9C6A7A6-22C0-42E6-AC9C-8580A396D077}.Debug|x64.Build.0 = Debug|x64
+		{E9C6A7A6-22C0-42E6-AC9C-8580A396D077}.Release|Win32.ActiveCfg = Release|Win32
+		{E9C6A7A6-22C0-42E6-AC9C-8580A396D077}.Release|Win32.Build.0 = Release|Win32
+		{E9C6A7A6-22C0-42E6-AC9C-8580A396D077}.Release|x64.ActiveCfg = Release|x64
+		{E9C6A7A6-22C0-42E6-AC9C-8580A396D077}.Release|x64.Build.0 = Release|x64
+		{B85BC466-C7F0-4C6D-8ECF-ED57E775FC73}.Debug|Win32.ActiveCfg = Debug|Win32
+		{B85BC466-C7F0-4C6D-8ECF-ED57E775FC73}.Debug|Win32.Build.0 = Debug|Win32
+		{B85BC466-C7F0-4C6D-8ECF-ED57E775FC73}.Debug|x64.ActiveCfg = Debug|x64
+		{B85BC466-C7F0-4C6D-8ECF-ED57E775FC73}.Debug|x64.Build.0 = Debug|x64
+		{B85BC466-C7F0-4C6D-8ECF-ED57E775FC73}.Release|Win32.ActiveCfg = Release|Win32
+		{B85BC466-C7F0-4C6D-8ECF-ED57E775FC73}.Release|Win32.Build.0 = Release|Win32
+		{B85BC466-C7F0-4C6D-8ECF-ED57E775FC73}.Release|x64.ActiveCfg = Release|x64
+		{B85BC466-C7F0-4C6D-8ECF-ED57E775FC73}.Release|x64.Build.0 = Release|x64
+		{9DBD962F-EA4D-44E3-8E8E-31D7F060A2DC}.Debug|Win32.ActiveCfg = Debug|Win32
+		{9DBD962F-EA4D-44E3-8E8E-31D7F060A2DC}.Debug|Win32.Build.0 = Debug|Win32
+		{9DBD962F-EA4D-44E3-8E8E-31D7F060A2DC}.Debug|x64.ActiveCfg = Debug|x64
+		{9DBD962F-EA4D-44E3-8E8E-31D7F060A2DC}.Debug|x64.Build.0 = Debug|x64
+		{9DBD962F-EA4D-44E3-8E8E-31D7F060A2DC}.Release|Win32.ActiveCfg = Release|Win32
+		{9DBD962F-EA4D-44E3-8E8E-31D7F060A2DC}.Release|Win32.Build.0 = Release|Win32
+		{9DBD962F-EA4D-44E3-8E8E-31D7F060A2DC}.Release|x64.ActiveCfg = Release|x64
+		{9DBD962F-EA4D-44E3-8E8E-31D7F060A2DC}.Release|x64.Build.0 = Release|x64
+		{EEF00329-4598-4E34-B969-9DD4B0815E6C}.Debug|Win32.ActiveCfg = Debug|Win32
+		{EEF00329-4598-4E34-B969-9DD4B0815E6C}.Debug|Win32.Build.0 = Debug|Win32
+		{EEF00329-4598-4E34-B969-9DD4B0815E6C}.Debug|x64.ActiveCfg = Debug|x64
+		{EEF00329-4598-4E34-B969-9DD4B0815E6C}.Debug|x64.Build.0 = Debug|x64
+		{EEF00329-4598-4E34-B969-9DD4B0815E6C}.Release|Win32.ActiveCfg = Release|Win32
+		{EEF00329-4598-4E34-B969-9DD4B0815E6C}.Release|Win32.Build.0 = Release|Win32
+		{EEF00329-4598-4E34-B969-9DD4B0815E6C}.Release|x64.ActiveCfg = Release|x64
+		{EEF00329-4598-4E34-B969-9DD4B0815E6C}.Release|x64.Build.0 = Release|x64
+		{CC0714AA-8A81-4E29-BEC5-2E4FBC50E7FE}.Debug|Win32.ActiveCfg = Debug|Win32
+		{CC0714AA-8A81-4E29-BEC5-2E4FBC50E7FE}.Debug|Win32.Build.0 = Debug|Win32
+		{CC0714AA-8A81-4E29-BEC5-2E4FBC50E7FE}.Debug|x64.ActiveCfg = Debug|x64
+		{CC0714AA-8A81-4E29-BEC5-2E4FBC50E7FE}.Debug|x64.Build.0 = Debug|x64
+		{CC0714AA-8A81-4E29-BEC5-2E4FBC50E7FE}.Release|Win32.ActiveCfg = Release|Win32
+		{CC0714AA-8A81-4E29-BEC5-2E4FBC50E7FE}.Release|Win32.Build.0 = Release|Win32
+		{CC0714AA-8A81-4E29-BEC5-2E4FBC50E7FE}.Release|x64.ActiveCfg = Release|x64
+		{CC0714AA-8A81-4E29-BEC5-2E4FBC50E7FE}.Release|x64.Build.0 = Release|x64
+		{608C6C67-7766-471F-BBFF-8B00086039AF}.Debug|Win32.ActiveCfg = Debug|Win32
+		{608C6C67-7766-471F-BBFF-8B00086039AF}.Debug|Win32.Build.0 = Debug|Win32
+		{608C6C67-7766-471F-BBFF-8B00086039AF}.Debug|x64.ActiveCfg = Debug|x64
+		{608C6C67-7766-471F-BBFF-8B00086039AF}.Debug|x64.Build.0 = Debug|x64
+		{608C6C67-7766-471F-BBFF-8B00086039AF}.Release|Win32.ActiveCfg = Release|Win32
+		{608C6C67-7766-471F-BBFF-8B00086039AF}.Release|Win32.Build.0 = Release|Win32
+		{608C6C67-7766-471F-BBFF-8B00086039AF}.Release|x64.ActiveCfg = Release|x64
+		{608C6C67-7766-471F-BBFF-8B00086039AF}.Release|x64.Build.0 = Release|x64
+		{A3F601E0-B54C-4DD8-8A97-FDEF7624EE60}.Debug|Win32.ActiveCfg = Debug|Win32
+		{A3F601E0-B54C-4DD8-8A97-FDEF7624EE60}.Debug|Win32.Build.0 = Debug|Win32
+		{A3F601E0-B54C-4DD8-8A97-FDEF7624EE60}.Debug|x64.ActiveCfg = Debug|x64
+		{A3F601E0-B54C-4DD8-8A97-FDEF7624EE60}.Debug|x64.Build.0 = Debug|x64
+		{A3F601E0-B54C-4DD8-8A97-FDEF7624EE60}.Release|Win32.ActiveCfg = Release|Win32
+		{A3F601E0-B54C-4DD8-8A97-FDEF7624EE60}.Release|Win32.Build.0 = Release|Win32
+		{A3F601E0-B54C-4DD8-8A97-FDEF7624EE60}.Release|x64.ActiveCfg = Release|x64
+		{A3F601E0-B54C-4DD8-8A97-FDEF7624EE60}.Release|x64.Build.0 = Release|x64
+		{75AEE75A-C016-4497-960B-D767B822237D}.Debug|Win32.ActiveCfg = Debug|Win32
+		{75AEE75A-C016-4497-960B-D767B822237D}.Debug|Win32.Build.0 = Debug|Win32
+		{75AEE75A-C016-4497-960B-D767B822237D}.Debug|x64.ActiveCfg = Debug|x64
+		{75AEE75A-C016-4497-960B-D767B822237D}.Debug|x64.Build.0 = Debug|x64
+		{75AEE75A-C016-4497-960B-D767B822237D}.Release|Win32.ActiveCfg = Release|Win32
+		{75AEE75A-C016-4497-960B-D767B822237D}.Release|Win32.Build.0 = Release|Win32
+		{75AEE75A-C016-4497-960B-D767B822237D}.Release|x64.ActiveCfg = Release|x64
+		{75AEE75A-C016-4497-960B-D767B822237D}.Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -279,7 +524,7 @@ Global
 		{AAAD1CB5-7ADA-47AE-85A0-08A6EC48FAFB} = {D69D5741-611F-4E14-8541-1FEE94F50B5A}
 		{66B32F7E-5716-48D0-B5B9-D832FD052DD5} = {D69D5741-611F-4E14-8541-1FEE94F50B5A}
 		{9C7E8C03-3130-436D-A97E-E8F8ED1AC4EA} = {D69D5741-611F-4E14-8541-1FEE94F50B5A}
-		{97A3A89b-E023-48CD-905F-CDBDE8D951DE} = {D69D5741-611F-4E14-8541-1FEE94F50B5A}
+		{97A3A89B-E023-48CD-905F-CDBDE8D951DE} = {D69D5741-611F-4E14-8541-1FEE94F50B5A}
 		{8682FE1E-0CF6-4EDD-9BB5-1733D8C8B4DF} = {D69D5741-611F-4E14-8541-1FEE94F50B5A}
 		{CAE4F1D0-314F-4B10-805B-0EFD670133A0} = {D69D5741-611F-4E14-8541-1FEE94F50B5A}
 		{8B5CFB38-CCBA-40A8-AD7A-89C57B070884} = {D69D5741-611F-4E14-8541-1FEE94F50B5A}
@@ -299,6 +544,34 @@ Global
 		{C4E04D18-EF76-4B42-B4C2-16A1BACDC0A4} = {D69D5741-611F-4E14-8541-1FEE94F50B5A}
 		{70B894A9-E306-49E8-ABC2-932A952A5E5F} = {D69D5741-611F-4E14-8541-1FEE94F50B5A}
 		{C4E04D18-EF76-4B42-B4C2-16A1BACDC1A3} = {D69D5741-611F-4E14-8541-1FEE94F50B5A}
+		{1B61A1B7-92DE-4C37-9151-D2928D6449AB} = {1498F0CD-F4DA-4847-9CB2-FB18D48061D5}
+		{EB448819-74BC-40C9-A61A-4D4ECD55F9D5} = {1B61A1B7-92DE-4C37-9151-D2928D6449AB}
+		{6B710DFF-8A4A-40A2-BF2D-88D266F3D4F0} = {1B61A1B7-92DE-4C37-9151-D2928D6449AB}
+		{AAEC8338-4D33-4AF5-9A1F-B9FF027D4607} = {1498F0CD-F4DA-4847-9CB2-FB18D48061D5}
+		{510ACF0C-4012-4216-98EF-E4F155DE33CE} = {AAEC8338-4D33-4AF5-9A1F-B9FF027D4607}
+		{D1BF59F6-22DC-493B-BDEB-451A50DA793D} = {1498F0CD-F4DA-4847-9CB2-FB18D48061D5}
+		{7820969A-5B7B-4046-BB0A-82905D457FC5} = {D1BF59F6-22DC-493B-BDEB-451A50DA793D}
+		{F2247885-8EE8-42F4-A702-4155587620E0} = {1498F0CD-F4DA-4847-9CB2-FB18D48061D5}
+		{5EDA1ED3-8213-4C12-B0DF-B631EB611804} = {F2247885-8EE8-42F4-A702-4155587620E0}
+		{F91DDAF0-B74F-4516-A1A9-42ED8DFCBF6A} = {1498F0CD-F4DA-4847-9CB2-FB18D48061D5}
+		{896557AC-7575-480C-8FFD-AB08B5DA305D} = {F91DDAF0-B74F-4516-A1A9-42ED8DFCBF6A}
+		{504DC7EC-D82E-448E-9C7D-3BE7981592B3} = {F91DDAF0-B74F-4516-A1A9-42ED8DFCBF6A}
+		{BDE7DBC0-DCE7-432E-8750-C4AE55463699} = {F91DDAF0-B74F-4516-A1A9-42ED8DFCBF6A}
+		{7B250AB1-92D3-4F1A-BEB4-19605A69CEDB} = {F91DDAF0-B74F-4516-A1A9-42ED8DFCBF6A}
+		{4C0E3A60-24F8-4D4C-81C0-C1777F5E7B17} = {F91DDAF0-B74F-4516-A1A9-42ED8DFCBF6A}
+		{B3D61611-BFA3-4B66-ADC7-A3CE578A6D36} = {F91DDAF0-B74F-4516-A1A9-42ED8DFCBF6A}
+		{540AE143-A58F-4D3B-B843-94EA8576522D} = {F91DDAF0-B74F-4516-A1A9-42ED8DFCBF6A}
+		{7091C001-3D71-47D4-B27B-E99271E5B987} = {F91DDAF0-B74F-4516-A1A9-42ED8DFCBF6A}
+		{AF8BC84E-0268-4D1F-9503-84D9EE84C65F} = {F91DDAF0-B74F-4516-A1A9-42ED8DFCBF6A}
+		{8B9AB23E-3F40-4145-BA1C-B2CEACFBBD72} = {F91DDAF0-B74F-4516-A1A9-42ED8DFCBF6A}
+		{E9C6A7A6-22C0-42E6-AC9C-8580A396D077} = {F91DDAF0-B74F-4516-A1A9-42ED8DFCBF6A}
+		{B85BC466-C7F0-4C6D-8ECF-ED57E775FC73} = {F91DDAF0-B74F-4516-A1A9-42ED8DFCBF6A}
+		{9DBD962F-EA4D-44E3-8E8E-31D7F060A2DC} = {F91DDAF0-B74F-4516-A1A9-42ED8DFCBF6A}
+		{EEF00329-4598-4E34-B969-9DD4B0815E6C} = {F91DDAF0-B74F-4516-A1A9-42ED8DFCBF6A}
+		{CC0714AA-8A81-4E29-BEC5-2E4FBC50E7FE} = {F91DDAF0-B74F-4516-A1A9-42ED8DFCBF6A}
+		{608C6C67-7766-471F-BBFF-8B00086039AF} = {1B61A1B7-92DE-4C37-9151-D2928D6449AB}
+		{A3F601E0-B54C-4DD8-8A97-FDEF7624EE60} = {D1BF59F6-22DC-493B-BDEB-451A50DA793D}
+		{75AEE75A-C016-4497-960B-D767B822237D} = {D1BF59F6-22DC-493B-BDEB-451A50DA793D}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {C320C9F2-1A8F-41D7-B02B-6338F872BCAD}

+ 13 - 0
libs/SDL3/VisualC/VisualC/examples/audio/01-simple-playback/01-simple-playback.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{D68EA64A-14ED-4DBF-B86C-9EC2DDC476FB}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\audio\01-simple-playback\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\audio\01-simple-playback\*.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/VisualC/examples/audio/02-simple-playback-callback/02-simple-playback-callback.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{8C80733B-1F90-4682-A999-91699127F182}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\audio\02-simple-playback-callback\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\audio\02-simple-playback-callback\*.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/VisualC/examples/audio/03-load-wav/03-load-wav.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{E941FE4D-964C-43C6-A486-B0966633BED6}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\audio\03-load-wav\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\audio\03-load-wav\*.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/VisualC/examples/camera/01-read-and-draw/01-read-and-draw.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{20B1B6AE-B282-4E65-863A-28301B6C5E9F}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\camera\01-read-and-draw\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\camera\01-read-and-draw\*.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/VisualC/examples/game/01-snake/01-snake.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{7239E6E4-3C4E-45DE-81B4-3BC7635BE63F}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\game\01-snake\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\game\01-snake\*.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/VisualC/examples/pen/01-drawing-lines/01-drawing-lines.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{25BB7BA9-DCAB-4944-9F2A-E316D63AF356}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\pen\01-drawing-lines\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\pen\01-drawing-lines\*.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/VisualC/examples/renderer/01-clear/01-clear.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{541DB2BF-7BE8-402C-8D7C-4BCC5A16DCDF}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\01-clear\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\01-clear\*.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/VisualC/examples/renderer/02-primitives/02-primitives.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{1C512964-A1E4-4569-8EA4-1165D89A9FD9}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\02-primitives\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\02-primitives\*.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/VisualC/examples/renderer/03-lines/03-lines.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{156986DD-710A-4627-8159-19FD1CE0C243}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\03-lines\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\03-lines\*.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/VisualC/examples/renderer/04-points/04-points.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{3D355C93-8429-4226-82D5-F8A63BC02801}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\04-points\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\04-points\*.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/VisualC/examples/renderer/05-rectangles/05-rectangles.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{03CFCE68-B607-4781-8348-4F5F93A09A63}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\05-rectangles\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\05-rectangles\*.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/VisualC/examples/renderer/06-textures/06-textures.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{90118B89-7011-4BDA-AF6E-FAEF74BAD73C}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\06-textures\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\06-textures\*.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/VisualC/examples/renderer/07-streaming-textures/07-streaming-textures.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{2FE0342B-DB71-42D9-918D-C48099167DB9}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\07-streaming-textures\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\07-streaming-textures\*.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/VisualC/examples/renderer/08-rotating-textures/08-rotating-textures.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{E0D48833-9BD2-46EC-A1DA-BC06C521E3CB}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\08-rotating-textures\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\08-rotating-textures\*.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/VisualC/examples/renderer/09-scaling-textures/09-scaling-textures.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{76D6D01E-79C3-4599-8920-DADDD5D8F8D0}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\09-scaling-textures\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\09-scaling-textures\*.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/VisualC/examples/renderer/10-geometry/10-geometry.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{FA567681-211A-43AB-A9B2-6C1EC39CEBFF}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\10-geometry\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\10-geometry\*.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/VisualC/examples/renderer/11-color-mods/11-color-mods.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{6539C356-F420-4EBF-937A-E03C1EDEF8D5}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\11-color-mods\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\11-color-mods\*.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/VisualC/examples/renderer/14-viewport/14-viewport.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{42C0ABC6-6E99-4FE2-B4DB-8B1DFA9D2AEC}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\14-viewport\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\14-viewport\*.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/VisualC/examples/renderer/15-cliprect/15-cliprect.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{2ED69519-A202-4B6E-870E-71FD43A5B883}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\15-cliprect\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\15-cliprect\*.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/VisualC/examples/renderer/17-read-pixels/17-read-pixels.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{94DB4D43-D07D-4CD3-94FF-B6E96CC97C60}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\17-read-pixels\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\17-read-pixels\*.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/VisualC/examples/renderer/18-debug-text/18-debug-text.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{72F39D57-7D82-4040-AE2B-CA7C922506E3}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\18-debug-text\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\18-debug-text\*.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 177 - 0
libs/SDL3/VisualC/examples/Directory.Build.props

@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <VCProjectVersion>15.0</VCProjectVersion>
+    <Keyword>Win32Proj</Keyword>
+    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
+  </PropertyGroup>
+  <PropertyGroup>
+    <PreferredToolArchitecture>x64</PreferredToolArchitecture>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v143</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v143</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v143</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v143</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="Shared">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Platform)\$(Configuration)\</IntDir>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(Platform)\$(Configuration)\</IntDir>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Platform)\$(Configuration)\</IntDir>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\</IntDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <LinkIncremental>true</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <LinkIncremental>true</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <LinkIncremental>false</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <LinkIncremental>false</LinkIncremental>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <AdditionalIncludeDirectories>$(SolutionDir)\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+    </ClCompile>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ProjectReference Include="$(SolutionDir)\SDL\SDL.vcxproj">
+      <Project>{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}</Project>
+      <Private>false</Private>
+      <CopyLocalSatelliteAssemblies>false</CopyLocalSatelliteAssemblies>
+      <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
+    </ProjectReference>
+  </ItemGroup>
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>

+ 13 - 0
libs/SDL3/VisualC/examples/audio/01-simple-playback/01-simple-playback.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{EB448819-74BC-40C9-A61A-4D4ECD55F9D5}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\audio\01-simple-playback\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\audio\01-simple-playback\simple-playback.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/examples/audio/02-simple-playback-callback/02-simple-playback-callback.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{6B710DFF-8A4A-40A2-BF2D-88D266F3D4F0}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\audio\02-simple-playback-callback\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\audio\02-simple-playback-callback\simple-playback-callback.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 14 - 0
libs/SDL3/VisualC/examples/audio/03-load-wav/03-load-wav.vcxproj

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{608C6C67-7766-471F-BBFF-8B00086039AF}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\audio\03-load-wav\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\audio\03-load-wav\load-wav.c" />
+    <Content Include="$(SolutionDir)\..\test\sample.wav" CopyToOutputDirectory="PreserveNewest" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/examples/camera/01-read-and-draw/01-read-and-draw.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{510ACF0C-4012-4216-98EF-E4F155DE33CE}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\camera\01-read-and-draw\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\camera\01-read-and-draw\read-and-draw.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/examples/game/01-snake/01-snake.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{7820969A-5B7B-4046-BB0A-82905D457FC5}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\game\01-snake\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\game\01-snake\snake.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/examples/game/02-woodeneye-008/02-woodeneye-008.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{A3F601E0-B54C-4DD8-8A97-FDEF7624EE60}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\game\02-woodeneye-008\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\game\02-woodeneye-008\woodeneye-008.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/examples/game/03-infinite-monkeys/03-infinite-monkeys.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{75AEE75A-C016-4497-960B-D767B822237D}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\game\03-infinite-monkeys\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\game\03-infinite-monkeys\infinite-monkeys.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 54 - 0
libs/SDL3/VisualC/examples/generate.py

@@ -0,0 +1,54 @@
+import os
+import pathlib
+import uuid
+
+REPOSITORY_ROOT = pathlib.Path(__file__).parent.parent.parent
+
+
+def generate(category, example_name, c_source_file):
+    guid = str(uuid.uuid4()).upper()
+    text = f"""
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{{{guid}}}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\\..\\examples\\{category}\\{example_name}\\README.txt" />
+    <ClCompile Include="$(SolutionDir)\\..\\examples\\{category}\\{example_name}\\{c_source_file}" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\\Microsoft.Cpp.targets" />
+</Project>
+""".strip()
+
+    project_file = REPOSITORY_ROOT / "VisualC" / "examples" / category / example_name / f"{example_name}.vcxproj"
+
+    if project_file.exists():
+        print("Skipping:", project_file)
+        return
+
+    print("Generating file:", project_file)
+    os.makedirs(project_file.parent, exist_ok=True)
+    with open(project_file, "w", encoding="utf-8") as f:
+        f.write(text)
+
+
+def get_c_source_filename(example_dir: pathlib.Path):
+    """Gets the one and only C source file name in the directory of the example."""
+    c_files = [f.name for f in example_dir.iterdir() if f.name.endswith(".c")]
+    assert len(c_files) == 1
+    return c_files[0]
+
+
+def main():
+    path = REPOSITORY_ROOT / "examples"
+    for category in path.iterdir():
+        if category.is_dir():
+            for example in category.iterdir():
+                generate(category.name, example.name, get_c_source_filename(example))
+
+
+if __name__ == "__main__":
+    main()

+ 13 - 0
libs/SDL3/VisualC/examples/pen/01-drawing-lines/01-drawing-lines.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{5EDA1ED3-8213-4C12-B0DF-B631EB611804}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\pen\01-drawing-lines\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\pen\01-drawing-lines\drawing-lines.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/examples/renderer/01-clear/01-clear.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{896557AC-7575-480C-8FFD-AB08B5DA305D}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\01-clear\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\01-clear\clear.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/examples/renderer/02-primitives/02-primitives.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{504DC7EC-D82E-448E-9C7D-3BE7981592B3}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\02-primitives\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\02-primitives\primitives.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/examples/renderer/03-lines/03-lines.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{BDE7DBC0-DCE7-432E-8750-C4AE55463699}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\03-lines\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\03-lines\lines.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/examples/renderer/04-points/04-points.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{7B250AB1-92D3-4F1A-BEB4-19605A69CEDB}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\04-points\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\04-points\points.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/examples/renderer/05-rectangles/05-rectangles.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{4C0E3A60-24F8-4D4C-81C0-C1777F5E7B17}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\05-rectangles\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\05-rectangles\rectangles.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 14 - 0
libs/SDL3/VisualC/examples/renderer/06-textures/06-textures.vcxproj

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{B3D61611-BFA3-4B66-ADC7-A3CE578A6D36}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\06-textures\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\06-textures\textures.c" />
+    <Content Include="$(SolutionDir)\..\test\sample.bmp" CopyToOutputDirectory="PreserveNewest" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/examples/renderer/07-streaming-textures/07-streaming-textures.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{540AE143-A58F-4D3B-B843-94EA8576522D}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\07-streaming-textures\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\07-streaming-textures\streaming-textures.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 14 - 0
libs/SDL3/VisualC/examples/renderer/08-rotating-textures/08-rotating-textures.vcxproj

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{7091C001-3D71-47D4-B27B-E99271E5B987}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\08-rotating-textures\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\08-rotating-textures\rotating-textures.c" />
+    <Content Include="$(SolutionDir)\..\test\sample.bmp" CopyToOutputDirectory="PreserveNewest" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/examples/renderer/09-scaling-textures/09-scaling-textures.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{AF8BC84E-0268-4D1F-9503-84D9EE84C65F}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\09-scaling-textures\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\09-scaling-textures\scaling-textures.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 14 - 0
libs/SDL3/VisualC/examples/renderer/10-geometry/10-geometry.vcxproj

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{8B9AB23E-3F40-4145-BA1C-B2CEACFBBD72}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\10-geometry\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\10-geometry\geometry.c" />
+    <Content Include="$(SolutionDir)\..\test\sample.bmp" CopyToOutputDirectory="PreserveNewest" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 14 - 0
libs/SDL3/VisualC/examples/renderer/11-color-mods/11-color-mods.vcxproj

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{E9C6A7A6-22C0-42E6-AC9C-8580A396D077}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\11-color-mods\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\11-color-mods\color-mods.c" />
+    <Content Include="$(SolutionDir)\..\test\sample.bmp" CopyToOutputDirectory="PreserveNewest" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 14 - 0
libs/SDL3/VisualC/examples/renderer/14-viewport/14-viewport.vcxproj

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{B85BC466-C7F0-4C6D-8ECF-ED57E775FC73}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\14-viewport\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\14-viewport\viewport.c" />
+    <Content Include="$(SolutionDir)\..\test\sample.bmp" CopyToOutputDirectory="PreserveNewest" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 14 - 0
libs/SDL3/VisualC/examples/renderer/15-cliprect/15-cliprect.vcxproj

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{9DBD962F-EA4D-44E3-8E8E-31D7F060A2DC}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\15-cliprect\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\15-cliprect\cliprect.c" />
+    <Content Include="$(SolutionDir)\..\test\sample.bmp" CopyToOutputDirectory="PreserveNewest" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 14 - 0
libs/SDL3/VisualC/examples/renderer/17-read-pixels/17-read-pixels.vcxproj

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{EEF00329-4598-4E34-B969-9DD4B0815E6C}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\17-read-pixels\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\17-read-pixels\read-pixels.c" />
+    <Content Include="$(SolutionDir)\..\test\sample.bmp" CopyToOutputDirectory="PreserveNewest" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 13 - 0
libs/SDL3/VisualC/examples/renderer/18-debug-text/18-debug-text.vcxproj

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{CC0714AA-8A81-4E29-BEC5-2E4FBC50E7FE}</ProjectGuid>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ItemGroup>
+    <None Include="$(SolutionDir)\..\examples\renderer\18-debug-text\README.txt" />
+    <ClCompile Include="$(SolutionDir)\..\examples\renderer\18-debug-text\debug-text.c" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+</Project>

+ 2 - 2
libs/SDL3/Xcode/SDL/Info-Framework.plist

@@ -19,10 +19,10 @@
 	<key>CFBundlePackageType</key>
 	<string>FMWK</string>
 	<key>CFBundleShortVersionString</key>
-	<string>3.1.5</string>
+	<string>3.1.6</string>
 	<key>CFBundleSignature</key>
 	<string>SDLX</string>
 	<key>CFBundleVersion</key>
-	<string>3.1.5</string>
+	<string>3.1.6</string>
 </dict>
 </plist>

+ 6 - 6
libs/SDL3/Xcode/SDL/SDL.xcodeproj/project.pbxproj

@@ -3081,8 +3081,8 @@
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_OBJC_ARC = YES;
 				DEPLOYMENT_POSTPROCESSING = YES;
-				DYLIB_COMPATIBILITY_VERSION = 106.0.0;
-				DYLIB_CURRENT_VERSION = 106.0.0;
+				DYLIB_COMPATIBILITY_VERSION = 107.0.0;
+				DYLIB_CURRENT_VERSION = 107.0.0;
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				GCC_ALTIVEC_EXTENSIONS = YES;
@@ -3114,7 +3114,7 @@
 					"@loader_path/Frameworks",
 				);
 				MACOSX_DEPLOYMENT_TARGET = 10.11;
-				MARKETING_VERSION = 3.1.5;
+				MARKETING_VERSION = 3.1.6;
 				OTHER_LDFLAGS = "$(CONFIG_FRAMEWORK_LDFLAGS)";
 				PRODUCT_BUNDLE_IDENTIFIER = org.libsdl.SDL3;
 				PRODUCT_NAME = SDL3;
@@ -3142,8 +3142,8 @@
 				ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES;
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_OBJC_ARC = YES;
-				DYLIB_COMPATIBILITY_VERSION = 106.0.0;
-				DYLIB_CURRENT_VERSION = 106.0.0;
+				DYLIB_COMPATIBILITY_VERSION = 107.0.0;
+				DYLIB_CURRENT_VERSION = 107.0.0;
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_TESTABILITY = YES;
@@ -3175,7 +3175,7 @@
 					"@loader_path/Frameworks",
 				);
 				MACOSX_DEPLOYMENT_TARGET = 10.11;
-				MARKETING_VERSION = 3.1.5;
+				MARKETING_VERSION = 3.1.6;
 				ONLY_ACTIVE_ARCH = YES;
 				OTHER_LDFLAGS = "$(CONFIG_FRAMEWORK_LDFLAGS)";
 				PRODUCT_BUNDLE_IDENTIFIER = org.libsdl.SDL3;

+ 1 - 1
libs/SDL3/Xcode/SDL/pkg-support/SDL.info

@@ -1,4 +1,4 @@
-Title SDL 3.1.5
+Title SDL 3.1.6
 Version 1
 Description SDL Library for macOS (http://www.libsdl.org)
 DefaultLocation /Library/Frameworks

+ 6 - 0
libs/SDL3/android-project/app/src/main/AndroidManifest.xml

@@ -56,6 +56,12 @@
     <!-- Allow access to the vibrator -->
     <uses-permission android:name="android.permission.VIBRATE" />
 
+    <!-- Allow access to Internet -->
+    <!-- if you want to connect to the network or internet, uncomment this. -->
+    <!--
+    <uses-permission android:name="android.permission.INTERNET" />
+    -->
+
     <!-- Create a Java class extending SDLActivity and place it in a
          directory under app/src/main/java matching the package, e.g. app/src/main/java/com/gamemaker/game/MyGame.java
 

+ 1 - 1
libs/SDL3/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java

@@ -60,7 +60,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
     private static final String TAG = "SDL";
     private static final int SDL_MAJOR_VERSION = 3;
     private static final int SDL_MINOR_VERSION = 1;
-    private static final int SDL_MICRO_VERSION = 5;
+    private static final int SDL_MICRO_VERSION = 6;
 /*
     // Display InputType.SOURCE/CLASS of events and devices
     //

+ 16 - 0
libs/SDL3/build-scripts/SDL_migration.cocci

@@ -3715,3 +3715,19 @@ typedef SDL_bool, bool;
 @@
 - SDL_BUTTON
 + SDL_BUTTON_MASK
+@@
+@@
+- SDL_GLprofile
++ SDL_GLProfile
+@@
+@@
+- SDL_GLcontextFlag
++ SDL_GLContextFlag
+@@
+@@
+- SDL_GLcontextReleaseFlag
++ SDL_GLContextReleaseFlag
+@@
+@@
+- SDL_GLattr
++ SDL_GLAttr

+ 1 - 1
libs/SDL3/build-scripts/build-release.py

@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 """
 This script is shared between SDL2, SDL3, and all satellite libraries.

+ 1 - 1
libs/SDL3/build-scripts/create-release.py

@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 import argparse
 from pathlib import Path

+ 8 - 5
libs/SDL3/build-scripts/fnsince.pl

@@ -65,14 +65,13 @@ if (scalar(@releases) > 0) {
     $current_release = $releases[-1];
 
     my @current_release_segments = split /\./, $current_release;
-
-    # if we're still in the 3.1.x prereleases, bump x by 1, otherwise, bump minor version by 2.
+    # if we're still in the 3.1.x prereleases, call the "next release" 3.2.0 even if we do more prereleases.
     if (($current_release_segments[0] == '3') && ($current_release_segments[1] == '1')) {
-        @current_release_segments[2] = '' . (int($current_release_segments[2]) + 1);
+        $next_release = '3.2.0';
     } else {
         @current_release_segments[1] = '' . (int($current_release_segments[1]) + 2);
+        $next_release = join('.', @current_release_segments);
     }
-    $next_release = join('.', @current_release_segments);
 }
 
 #print("\n\nSORTED\n");
@@ -91,7 +90,11 @@ foreach my $release (@releases) {
     my $tag = $fulltags{$release};
     my $blobname = "$tag:src/dynapi/SDL_dynapi_overrides.h";
 
-    $release = '3.0.0' if $release =~ /\A3\.1\.[0123]/;  # hack to make everything up to ABI-lock look like 3.0.0.
+    if ($release =~ /\A3\.[01]\.\d+/) {  # make everything up to the first SDL3 prerelease look like 3.1.3 (ABI lock version).
+        $release = '3.1.3';
+    }
+
+    else { $release = '3.2.0'; }  # !!! FIXME: REMOVE ME WHEN 3.2.0 SHIPS!
 
     open(PIPEFH, '-|', "git show '$blobname'") or die "Failed to read git blob '$blobname': $!\n";
     while (<PIPEFH>) {

+ 8 - 0
libs/SDL3/build-scripts/pkg-support/msvc/Directory.Build.props

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <PreprocessorDefinitions>SDL_VENDOR_INFO="libsdl.org";%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </ClCompile>
+  </ItemDefinitionGroup>
+</Project>

+ 7 - 0
libs/SDL3/build-scripts/wikiheaders.pl

@@ -1860,6 +1860,7 @@ if ($copy_direction == 1) {  # --copy-to-headers
         my @paramsorder = ();
         my $fnsigparams = $headersymsparaminfo{$sym};
         my $has_returns = 0;
+        my $has_threadsafety = 0;
 
         while (@doxygenlines) {
             my $l = shift @doxygenlines;
@@ -1998,6 +1999,7 @@ if ($copy_direction == 1) {  # --copy-to-headers
                 }
                 $desc =~ s/[\s\n]+\Z//ms;
                 $sections{'Thread Safety'} = wordwrap(wikify($wikitype, $desc)) . "\n";
+                $has_threadsafety = 1;
             } elsif ($l =~ /\A\\sa\s+(.*)\Z/) {
                 my $sa = $1;
                 $sa =~ s/\(\)\Z//;  # Convert "SDL_Func()" to "SDL_Func"
@@ -2014,6 +2016,11 @@ if ($copy_direction == 1) {  # --copy-to-headers
             print STDERR "WARNING: Function '$sym' has a non-void return type but no '\\returns' declaration\n";
         }
 
+        # !!! FIXME: uncomment this when we're trying to clean this up in the headers.
+        #if (($symtype == 1) && !$has_threadsafety) {
+        #    print STDERR "WARNING: Function '$sym' doesn't have a '\\threadsafety' declaration\n";
+        #}
+
         # Make sure %params is in the same order as the actual function signature and add C datatypes...
         my $params_has_c_datatype = 0;
         my @final_params = ();

+ 16 - 6
libs/SDL3/cmake/macros.cmake

@@ -299,8 +299,8 @@ function(check_linker_supports_version_file VAR)
     set(LINKER_SUPPORTS_VERSION_SCRIPT FALSE)
   else()
     cmake_push_check_state(RESET)
-    file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/dummy.sym" "n_0 {\n global:\n  func;\n local: *;\n};\n")
-    list(APPEND CMAKE_REQUIRED_LINK_OPTIONS "-Wl,--version-script=${CMAKE_CURRENT_BINARY_DIR}/dummy.sym")
+    file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/dummy.sym" "n_0 {\n global:\n  func;\n local: *;\n};\n")
+    list(APPEND CMAKE_REQUIRED_LINK_OPTIONS "-Wl,--version-script=${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/dummy.sym")
     check_c_source_compiles("int func(void) {return 0;} int main(int argc,char*argv[]){(void)argc;(void)argv;return func();}" LINKER_SUPPORTS_VERSION_SCRIPT FAIL_REGEX "(unsupported|syntax error|unrecognized option)")
     cmake_pop_check_state()
   endif()
@@ -394,11 +394,21 @@ function(SDL_PrintSummary)
     message(STATUS "")
   endif()
 
-  if(UNIX AND NOT (ANDROID OR APPLE OR EMSCRIPTEN))
+  if(UNIX AND NOT (ANDROID OR APPLE OR EMSCRIPTEN OR HAIKU OR RISCOS))
     if(NOT (HAVE_X11 OR HAVE_WAYLAND))
-      message(STATUS "SDL is being built without a X11 or wayland video driver.")
-      message(STATUS "The library will not be able to create windows on most unix environments.")
-      message(STATUS "")
+      if(NOT SDL_UNIX_CONSOLE_BUILD)
+        message(FATAL_ERROR
+          "SDL could not find X11 or Wayland development libraries on your system. "
+          "This means SDL will not be able to create windows on a typical unix operating system. "
+          "Most likely, this is not wanted."
+          "\n"
+          "On Linux, install the packages listed at "
+          "https://github.com/libsdl-org/SDL/blob/main/docs/README-linux.md#build-dependencies "
+          "\n"
+          "If you really don't need desktop windows, the documentation tells you how to skip this check. "
+          "https://github.com/libsdl-org/SDL/blob/main/docs/README-cmake.md#cmake-fails-to-build-without-x11-or-wayland-support\n"
+        )
+      endif()
     endif()
   endif()
 endfunction()

+ 15 - 0
libs/SDL3/cmake/sdlchecks.cmake

@@ -662,6 +662,21 @@ macro(CheckVivante)
   endif()
 endmacro()
 
+# Requires:
+# - n/a
+macro(CheckOpenVR)
+  if(SDL_OPENVR)
+    set(HAVE_OPENVR TRUE)
+    set(HAVE_OPENVR_VIDEO TRUE)
+
+    sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/openvr/*.c")
+    set(SDL_VIDEO_DRIVER_OPENVR 1)
+    if(NOT WINDOWS)
+      sdl_link_dependency(egl LIBS EGL)
+    endif()
+  endif()
+endmacro()
+
 # Requires:
 # - nada
 macro(CheckGLX)

+ 31 - 11
libs/SDL3/docs/README-cmake.md

@@ -201,7 +201,7 @@ SDL supports following Apple architectures:
 
 CMake documentation: [link](https://cmake.org/cmake/help/latest/variable/CMAKE_OSX_ARCHITECTURES.html)
 
-#### Simulators and/or non-default maxOS platform SDK
+#### Simulators and/or non-default macOS platform SDK
 
 Use `-DCMAKE_OSX_SYSROOT=<value>` to configure a different platform SDK.
 The value can be either the name of the SDK, or a full path to the sdk (e.g. `/full/path/to/iPhoneOS.sdk`).
@@ -226,29 +226,29 @@ CMake documentation: [link](https://cmake.org/cmake/help/latest/variable/CMAKE_O
 - for macOS, building a dylib and/or static library for x86_64 and arm64:
 
     ```bash
-    cmake ~/sdl -DCMAKE_SYSTEM_NAME=Darwin -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64"
+    cmake ~/sdl -DCMAKE_SYSTEM_NAME=Darwin -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DCMAKE_OSX_DEPLOYMENT_TARGET=10.11
 
 - for macOS, building an universal framework for x86_64 and arm64:
 
     ```bash
-    cmake ~/sdl -DSDL_FRAMEWORK=ON -DCMAKE_SYSTEM_NAME=Darwin -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64"
+    cmake ~/sdl -DSDL_FRAMEWORK=ON -DCMAKE_SYSTEM_NAME=Darwin -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DCMAKE_OSX_DEPLOYMENT_TARGET=10.11
 
 - for iOS-Simulator, using the latest, installed SDK:
 
     ```bash
-    cmake ~/sdl -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_ARCHITECTURES=x86_64
+    cmake ~/sdl -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_OSX_DEPLOYMENT_TARGET=9.0
     ```
 
 - for iOS-Device, using the latest, installed SDK, 64-bit only
 
     ```bash
-    cmake ~/sdl -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos -DCMAKE_OSX_ARCHITECTURES=arm64
+    cmake ~/sdl -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_DEPLOYMENT_TARGET=9.0
     ```
 
 - for iOS-Device, using the latest, installed SDK, mixed 32/64 bit
 
     ```cmake
-    cmake ~/sdl -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos -DCMAKE_OSX_ARCHITECTURES="arm64;armv7s"
+    cmake ~/sdl -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos -DCMAKE_OSX_ARCHITECTURES="arm64;armv7s" -DCMAKE_OSX_DEPLOYMENT_TARGET=9.0
     ```
 
 - for iOS-Device, using a specific SDK revision (iOS 12.4, in this example):
@@ -260,19 +260,19 @@ CMake documentation: [link](https://cmake.org/cmake/help/latest/variable/CMAKE_O
 - for iOS-Simulator, using the latest, installed SDK, and building SDL test apps (as .app bundles):
 
     ```cmake
-    cmake ~/sdl -DSDL_TESTS=1 -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_ARCHITECTURES=x86_64
+    cmake ~/sdl -DSDL_TESTS=1 -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_OSX_DEPLOYMENT_TARGET=9.0
     ```
 
 - for tvOS-Simulator, using the latest, installed SDK:
 
     ```cmake
-    cmake ~/sdl -DCMAKE_SYSTEM_NAME=tvOS -DCMAKE_OSX_SYSROOT=appletvsimulator -DCMAKE_OSX_ARCHITECTURES=x86_64
+    cmake ~/sdl -DCMAKE_SYSTEM_NAME=tvOS -DCMAKE_OSX_SYSROOT=appletvsimulator -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_OSX_DEPLOYMENT_TARGET=9.0
     ```
 
 - for tvOS-Device, using the latest, installed SDK:
 
     ```cmake
-    cmake ~/sdl -DCMAKE_SYSTEM_NAME=tvOS -DCMAKE_OSX_SYSROOT=appletvos -DCMAKE_OSX_ARCHITECTURES=arm64`
+    cmake ~/sdl -DCMAKE_SYSTEM_NAME=tvOS -DCMAKE_OSX_SYSROOT=appletvos -DCMAKE_OSX_ARCHITECTURES=arm64` -DCMAKE_OSX_DEPLOYMENT_TARGET=9.0
     ```
 
 - for QNX/aarch64, using the latest, installed SDK:
@@ -297,15 +297,29 @@ At the end of SDL CMake configuration, a table shows all CMake options along wit
 | `-DSDL_DISABLE_INSTALL_DOCS=` | `ON`/`OFF`   | Don't install the SDL documentation                                                                 |
 | `-DSDL_INSTALL_TESTS=`        | `ON`/`OFF`   | Install the SDL test programs                                                                       |
 
+### Incompatibilities
+
+#### `SDL_LIBC=OFF` and sanitizers
+
+Building with `-DSDL_LIBC=OFF` will make it impossible to use the sanitizer, such as the address sanitizer.
+Configure your project with `-DSDL_LIBC=ON` to make use of sanitizers.
+
 ## CMake FAQ
 
+### CMake fails to build without X11 or Wayland support
+
+Install the required system packages prior to running CMake.
+See [README-linux](linux#build-dependencies) for the list of dependencies on Linux.
+Other unix operationg systems should provide similar packages.
+
+If you **really** don't need to show windows, add `-DSDL_UNIX_CONSOLE_BUILD=ON` to the CMake configure command.
+
 ### How do I copy a SDL3 dynamic library to another location?
 
 Use [CMake generator expressions](https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html#target-dependent-expressions).
 Generator expressions support multiple configurations, and are evaluated during build system generation time.
 
-On Windows, the following example this copies `SDL3.dll` to the directory where `mygame.exe` is built.
-On Unix systems, `$<TARGET_FILE:...>` will refer to the dynamic library (or framework).
+On Windows, the following example copies `SDL3.dll` to the directory where `mygame.exe` is built.
 ```cmake
 if(WIN32)
     add_custom_command(
@@ -315,6 +329,12 @@ if(WIN32)
     )
 endif()
 ```
+On Unix systems, `$<TARGET_FILE:...>` will refer to the dynamic library (or framework),
+and you might need to use `$<TARGET_SONAME_FILE:tgt>` instead.
+
+Most often, you can avoid copying libraries by configuring your project with absolute [`CMAKE_LIBRARY_OUTPUT_DIRECTORY`](https://cmake.org/cmake/help/latest/variable/CMAKE_LIBRARY_OUTPUT_DIRECTORY.html)
+and [`CMAKE_RUNTIME_OUTPUT_DIRECTORY`](https://cmake.org/cmake/help/latest/variable/CMAKE_RUNTIME_OUTPUT_DIRECTORY.html) paths.
+When using a multi-config generator (such as Visual Studio or Ninja Multi-Config), eventually add `/$<CONFIG>` to both paths.
 
 ### Linking against a static SDL library fails due to relocation errors
 

+ 22 - 37
libs/SDL3/docs/README-emscripten.md

@@ -2,7 +2,7 @@
 
 ## The state of things
 
-(As of September 2023, but things move quickly and we don't update this
+(As of October 2024, but things move quickly and we don't update this
 document often.)
 
 In modern times, all the browsers you probably care about (Chrome, Firefox,
@@ -33,23 +33,15 @@ Many many things just need some simple adjustments and they'll compile
 like any other C/C++ code, as long as SDL was handling the platform-specific
 work for your program.
 
-First, you probably need this in at least one of your source files:
-
-```c
-#ifdef __EMSCRIPTEN__
-#include <emscripten.h>
-#endif
-```
-
-Second: assembly language code has to go. Replace it with C. You can even use
+First: assembly language code has to go. Replace it with C. You can even use
 [x86 SIMD intrinsic functions in Emscripten](https://emscripten.org/docs/porting/simd.html)!
 
-Third: Middleware has to go. If you have a third-party library you link
+Second: Middleware has to go. If you have a third-party library you link
 against, you either need an Emscripten port of it, or the source code to it
 to compile yourself, or you need to remove it.
 
-Fourth: You still start in a function called main(), but you need to get out of
-it and into a function that gets called repeatedly, and returns quickly,
+Third: If your program starts in a function called main(), you need to get
+out of it and into a function that gets called repeatedly, and returns quickly,
 called a mainloop.
 
 Somewhere in your program, you probably have something that looks like a more
@@ -109,6 +101,13 @@ don't want any shutdown code that might be sitting below this code
 to actually run if main() were to continue on, since we're just
 getting started.
 
+Another option is to use SDL' main callbacks, which handle this for you
+without platform-specific code in your app. Please refer to
+[the wiki](https://wiki.libsdl.org/SDL3/README/main-functions#main-callbacks-in-sdl3)
+or `docs/README-main-functions.md` in the SDL source code.
+
+
+
 There's a lot of little details that are beyond the scope of this
 document, but that's the biggest initial set of hurdles to porting
 your app to the web.
@@ -127,8 +126,8 @@ must be there, but you have to be careful (and read more detailed
 documentation than this for the finer points).
 
 Even when using threads, your main thread needs to set an Emscripten
-mainloop that runs quickly and returns, or things will fail to work
-correctly.
+mainloop (or use SDL's main callbacks) that runs quickly and returns, or
+things will fail to work correctly.
 
 You should definitely read [Emscripten's pthreads docs](https://emscripten.org/docs/porting/pthreads.html)
 for all the finer points. Mostly SDL's thread API will work as expected,
@@ -202,6 +201,9 @@ If you use SDL's 2D render API, it will use GLES2 internally, which
 Emscripten will turn into WebGL calls. You can also use OpenGL ES 2
 directly by creating a GL context and drawing into it.
 
+If the browser (and hardware) support WebGL 2, you can create an OpenGL ES 3
+context.
+
 Calling SDL_RenderPresent (or SDL_GL_SwapWindow) will not actually
 present anything on the screen until your return from your mainloop
 function.
@@ -209,25 +211,8 @@ function.
 
 ## Building SDL/emscripten
 
-First: do you _really_ need to build SDL from source?
-
-If you aren't developing SDL itself, have a desire to mess with its source
-code, or need something on the bleeding edge, don't build SDL. Just use
-Emscripten's packaged version!
-
-Compile and link your app with `-sUSE_SDL=2` and it'll use a build of
-SDL packaged with Emscripten. This comes from the same source code and
-fixes the Emscripten project makes to SDL are generally merged into SDL's
-revision control, so often this is much easier for app developers.
-
-`-sUSE_SDL=1` will select Emscripten's JavaScript reimplementation of SDL
-1.2 instead; if you need SDL 1.2, this might be fine, but we generally
-recommend you don't use SDL 1.2 in modern times.
-
-
-If you want to build SDL, though...
 
-SDL currently requires at least Emscripten 3.1.35 to build. Newer versions
+SDL currently requires at least Emscripten 3.16.0 to build. Newer versions
 are likely to work, as well.
 
 
@@ -260,6 +245,7 @@ emmake make -j4
 ```
 
 To build the tests, add `-DSDL_TESTS=On` to the `emcmake cmake` command line.
+To build the examples, add `-DSDL_EXAMPLES=On` to the `emcmake cmake` command line.
 
 
 ## Building your app
@@ -267,8 +253,7 @@ To build the tests, add `-DSDL_TESTS=On` to the `emcmake cmake` command line.
 You need to compile with `emcc` instead of `gcc` or `clang` or whatever, but
 mostly it uses the same command line arguments as Clang.
 
-Link against the SDL/build/libSDL3.a file you generated by building SDL,
-link with `-sUSE_SDL=2` to use Emscripten's prepackaged SDL2 build.
+Link against the libSDL3.a file you generated by building SDL.
 
 Usually you would produce a binary like this:
 
@@ -288,8 +273,8 @@ runs your app. You will (probably) eventually want to replace or customize
 that file and do `-o index.js` instead to just build the code pieces.
 
 If you're working on a program of any serious size, you'll likely need to
-link with `-sALLOW_MEMORY_GROWTH=1 -sMAXIMUM_MEMORY=1gb` to get access
-to more memory. If using pthreads, you'll need the `-sMAXIMUM_MEMORY=1gb`
+link with `-s ALLOW_MEMORY_GROWTH=1 -s MAXIMUM_MEMORY=1gb` to get access
+to more memory. If using pthreads, you'll need the `-s MAXIMUM_MEMORY=1gb`
 or the app will fail to start on iOS browsers, but this might be a bug that
 goes away in the future.
 

+ 0 - 3
libs/SDL3/docs/README-git.md

@@ -11,9 +11,6 @@ macOS, Windows, and Unix systems.
 
     git clone https://github.com/libsdl-org/SDL
 
-If you are building SDL via configure, you will need to run autogen.sh
-before running configure.
-
 There is a web interface to the Git repository at:
 	http://github.com/libsdl-org/SDL/
 

+ 2 - 0
libs/SDL3/docs/README-ios.md

@@ -140,6 +140,8 @@ Notes -- Mouse
 
 iOS now supports Bluetooth mice on iPad, but by default will provide the mouse input as touch. In order for SDL to see the real mouse events, you should set the key UIApplicationSupportsIndirectInputEvents to true in your Info.plist
 
+From iOS 17 onward, the key now defaults to true.
+
 
 Notes -- Reading and Writing files
 ==============================================================================

+ 4 - 0
libs/SDL3/docs/README-linux.md

@@ -38,6 +38,10 @@ NOTES:
 - The sndio audio target is unavailable on Fedora (but probably not what you
   should want to use anyhow).
 
+openSUSE Tumbleweed:
+
+    sudo zypper in libunwind-devel libusb-1_0-devel Mesa-libGL-devel libxkbcommon-devel libdrm-devel \
+    libgbm-devel pipewire-devel libpulse-devel sndio-devel Mesa-libEGL-devel
 
 Joystick does not work
 --------------------------------------------------------------------------------

+ 2 - 2
libs/SDL3/docs/README-macos.md

@@ -13,7 +13,7 @@ To build SDL using the command line, use the CMake build script:
 ```bash
 mkdir build
 cd build
-cmake ..
+cmake .. -DCMAKE_OSX_DEPLOYMENT_TARGET=10.11
 cmake --build .
 sudo cmake --install .
 ```
@@ -25,7 +25,7 @@ You can also build SDL as a Universal library (a single binary for both
 ```bash
 mkdir build
 cd build
-cmake .. "-DCMAKE_OSX_ARCHITECTURES=arm64;x86_64"
+cmake .. "-DCMAKE_OSX_ARCHITECTURES=arm64;x86_64" -DCMAKE_OSX_DEPLOYMENT_TARGET=10.11
 cmake --build .
 sudo cmake --install .
 ```

+ 7 - 1
libs/SDL3/docs/README-migration.md

@@ -2134,7 +2134,9 @@ SDL_CreateWindow() has been simplified and no longer takes a window position. Yo
     SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_Y_NUMBER, y);
     SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_WIDTH_NUMBER, width);
     SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_HEIGHT_NUMBER, height);
-    SDL_SetNumberProperty(props, "flags", flags);
+    // For window flags you should use separate window creation properties,
+    // but for easier migration from SDL2 you can use the following:
+    SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_FLAGS_NUMBER, flags);
     pWindow = SDL_CreateWindowWithProperties(props);
     SDL_DestroyProperties(props);
     if (window) {
@@ -2227,6 +2229,10 @@ The following symbols have been renamed:
 * SDL_DISPLAYEVENT_DISCONNECTED => SDL_EVENT_DISPLAY_REMOVED
 * SDL_DISPLAYEVENT_MOVED => SDL_EVENT_DISPLAY_MOVED
 * SDL_DISPLAYEVENT_ORIENTATION => SDL_EVENT_DISPLAY_ORIENTATION
+* SDL_GLattr => SDL_GLAttr
+* SDL_GLcontextFlag => SDL_GLContextFlag
+* SDL_GLcontextReleaseFlag => SDL_GLContextReleaseFlag
+* SDL_GLprofile => SDL_GLProfile
 * SDL_WINDOWEVENT_CLOSE => SDL_EVENT_WINDOW_CLOSE_REQUESTED
 * SDL_WINDOWEVENT_DISPLAY_CHANGED => SDL_EVENT_WINDOW_DISPLAY_CHANGED
 * SDL_WINDOWEVENT_ENTER => SDL_EVENT_WINDOW_MOUSE_ENTER

+ 1 - 1
libs/SDL3/docs/README-wayland.md

@@ -212,7 +212,7 @@ int main(int argc, char *argv[])
         SDL_SetWindowSize(sdlWindow, SDL_lround(640. * scale), SDL_lround(480. * scale));
 
         if (qtWindow.isVisible()) {
-            SDL_SetRenderDrawColor(sdlRenderer, 0, 0, 255, 255);
+            SDL_SetRenderDrawColor(sdlRenderer, 0, 0, 255, SDL_ALPHA_OPAQUE);
             SDL_RenderClear(sdlRenderer);
             SDL_RenderPresent(sdlRenderer);
         } else {

+ 14 - 31
libs/SDL3/examples/CMakeLists.txt

@@ -141,7 +141,19 @@ add_sdl_example_executable(audio-load-wav SOURCES audio/03-load-wav/load-wav.c D
 add_sdl_example_executable(camera-read-and-draw SOURCES camera/01-read-and-draw/read-and-draw.c)
 add_sdl_example_executable(pen-drawing-lines SOURCES pen/01-drawing-lines/drawing-lines.c)
 add_sdl_example_executable(game-snake SOURCES game/01-snake/snake.c)
-
+add_sdl_example_executable(game-woodeneye-008 SOURCES game/02-woodeneye-008/woodeneye-008.c)
+add_sdl_example_executable(game-infinite-monkeys SOURCES game/03-infinite-monkeys/infinite-monkeys.c)
+
+# When you add an example, remember to add the Visual Studio project as well:
+# - Add a new example in examples/
+# - Run python VisualC/examples/generate.py
+# - Take note of the newly generated .vcxproj files
+# - Modify the .vcxproj files if necessary (adding content such as BMP or WAV files)
+# - Open VisualC/SDL.sln in Visual Studio or JetBrains Rider
+# - Locate the appropriate folder in the Solution Explorer
+# - Add the newly generated projects: Right click -> Add -> Existing project...
+# - Test if they work
+# - Save the SDL.sln solution
 
 if(PSP)
     # Build EBOOT files if building for PSP
@@ -152,36 +164,7 @@ if(PSP)
             ICON_PATH       NULL
             BACKGROUND_PATH NULL
             PREVIEW_PATH    NULL
-        )
-        add_custom_command(
-            TARGET ${APP} POST_BUILD
-            COMMAND ${CMAKE_COMMAND} -E make_directory
-            $<TARGET_FILE_DIR:${ARG_TARGET}>/sdl-${APP}
-        )
-        add_custom_command(
-            TARGET ${APP} POST_BUILD
-            COMMAND ${CMAKE_COMMAND} -E rename
-            $<TARGET_FILE_DIR:${ARG_TARGET}>/EBOOT.PBP
-            $<TARGET_FILE_DIR:${ARG_TARGET}>/sdl-${APP}/EBOOT.PBP
-        )
-        if(BUILD_PRX)
-            add_custom_command(
-                TARGET ${APP} POST_BUILD
-                COMMAND ${CMAKE_COMMAND} -E copy
-                $<TARGET_FILE_DIR:${ARG_TARGET}>/${APP}
-                $<TARGET_FILE_DIR:${ARG_TARGET}>/sdl-${APP}/${APP}
-            )
-            add_custom_command(
-                TARGET ${APP} POST_BUILD
-                COMMAND ${CMAKE_COMMAND} -E rename
-                $<TARGET_FILE_DIR:${ARG_TARGET}>/${APP}.prx
-                $<TARGET_FILE_DIR:${ARG_TARGET}>/sdl-${APP}/${APP}.prx
-            )
-        endif()
-        add_custom_command(
-            TARGET ${APP} POST_BUILD
-            COMMAND ${CMAKE_COMMAND} -E remove
-            $<TARGET_FILE_DIR:${ARG_TARGET}>/PARAM.SFO
+            OUTPUT_DIR      $<TARGET_FILE_DIR:${APP}>/sdl-${APP}
         )
     endforeach()
 endif()

+ 1 - 1
libs/SDL3/examples/camera/01-read-and-draw/read-and-draw.c

@@ -93,7 +93,7 @@ SDL_AppResult SDL_AppIterate(void *appstate)
         SDL_ReleaseCameraFrame(camera, frame);
     }
 
-    SDL_SetRenderDrawColor(renderer, 0x99, 0x99, 0x99, 255);
+    SDL_SetRenderDrawColor(renderer, 0x99, 0x99, 0x99, SDL_ALPHA_OPAQUE);
     SDL_RenderClear(renderer);
     if (texture) {  /* draw the latest camera frame, if available. */
         SDL_RenderTexture(renderer, texture, NULL, NULL);

+ 7 - 4
libs/SDL3/examples/game/01-snake/snake.c

@@ -257,7 +257,7 @@ SDL_AppResult SDL_AppIterate(void *appstate)
     }
 
     r.w = r.h = SNAKE_BLOCK_SIZE_IN_PIXELS;
-    SDL_SetRenderDrawColor(as->renderer, 0, 0, 0, 255);
+    SDL_SetRenderDrawColor(as->renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
     SDL_RenderClear(as->renderer);
     for (i = 0; i < SNAKE_GAME_WIDTH; i++) {
         for (j = 0; j < SNAKE_GAME_HEIGHT; j++) {
@@ -266,13 +266,13 @@ SDL_AppResult SDL_AppIterate(void *appstate)
                 continue;
             set_rect_xy_(&r, i, j);
             if (ct == SNAKE_CELL_FOOD)
-                SDL_SetRenderDrawColor(as->renderer, 80, 80, 255, 255);
+                SDL_SetRenderDrawColor(as->renderer, 80, 80, 255, SDL_ALPHA_OPAQUE);
             else /* body */
-                SDL_SetRenderDrawColor(as->renderer, 0, 128, 0, 255);
+                SDL_SetRenderDrawColor(as->renderer, 0, 128, 0, SDL_ALPHA_OPAQUE);
             SDL_RenderFillRect(as->renderer, &r);
         }
     }
-    SDL_SetRenderDrawColor(as->renderer, 255, 255, 0, 255); /*head*/
+    SDL_SetRenderDrawColor(as->renderer, 255, 255, 0, SDL_ALPHA_OPAQUE); /*head*/
     set_rect_xy_(&r, ctx->head_xpos, ctx->head_ypos);
     SDL_RenderFillRect(as->renderer, &r);
     SDL_RenderPresent(as->renderer);
@@ -310,6 +310,9 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
     }
 
     AppState *as = SDL_calloc(1, sizeof(AppState));
+    if (!as) {
+        return SDL_APP_FAILURE;
+    }
 
     *appstate = as;
 

+ 1 - 0
libs/SDL3/examples/game/02-woodeneye-008/README.txt

@@ -0,0 +1 @@
+Minimal splitscreen FPS with multiple mouse and keyboards, drawn with the 2D Render API.

+ 480 - 0
libs/SDL3/examples/game/02-woodeneye-008/woodeneye-008.c

@@ -0,0 +1,480 @@
+/*
+ * This code is public domain. Feel free to use it for any purpose!
+ */
+
+#define SDL_MAIN_USE_CALLBACKS 1 /* use the callbacks instead of main() */
+#include <SDL3/SDL.h>
+#include <SDL3/SDL_main.h>
+
+#define MAP_BOX_SCALE 16
+#define MAP_BOX_EDGES_LEN (12 + MAP_BOX_SCALE * 2)
+#define MAX_PLAYER_COUNT 4
+#define CIRCLE_DRAW_SIDES 32
+#define CIRCLE_DRAW_SIDES_LEN (CIRCLE_DRAW_SIDES + 1)
+
+typedef struct {
+    SDL_MouseID mouse;
+    SDL_KeyboardID keyboard;
+    double pos[3];
+    double vel[3];
+    unsigned int yaw;
+    int pitch;
+    float radius, height;
+    unsigned char color[3];
+    unsigned char wasd;
+} Player;
+
+typedef struct {
+    SDL_Window *window;
+    SDL_Renderer *renderer;
+    int player_count;
+    Player players[MAX_PLAYER_COUNT];
+    float edges[MAP_BOX_EDGES_LEN][6];
+} AppState;
+
+static const struct {
+    const char *key;
+    const char *value;
+} extended_metadata[] = {
+    { SDL_PROP_APP_METADATA_URL_STRING, "https://examples.libsdl.org/SDL3/game/02-woodeneye-008/" },
+    { SDL_PROP_APP_METADATA_CREATOR_STRING, "SDL team" },
+    { SDL_PROP_APP_METADATA_COPYRIGHT_STRING, "Placed in the public domain" },
+    { SDL_PROP_APP_METADATA_TYPE_STRING, "game" }
+};
+
+static int whoseMouse(SDL_MouseID mouse, const Player players[], int players_len)
+{
+    int i;
+    for (i = 0; i < players_len; i++) {
+        if (players[i].mouse == mouse) return i;
+    }
+    return -1;
+}
+
+static int whoseKeyboard(SDL_KeyboardID keyboard, const Player players[], int players_len)
+{
+    int i;
+    for (i = 0; i < players_len; i++) {
+        if (players[i].keyboard == keyboard) return i;
+    }
+    return -1;
+}
+
+static void shoot(int shooter, Player players[], int players_len)
+{
+    int i, j;
+    double x0 = players[shooter].pos[0];
+    double y0 = players[shooter].pos[1];
+    double z0 = players[shooter].pos[2];
+    double bin_rad = SDL_PI_D / 2147483648.0;
+    double yaw_rad   = bin_rad * players[shooter].yaw;
+    double pitch_rad = bin_rad * players[shooter].pitch;
+    double cos_yaw   = SDL_cos(  yaw_rad);
+    double sin_yaw   = SDL_sin(  yaw_rad);
+    double cos_pitch = SDL_cos(pitch_rad);
+    double sin_pitch = SDL_sin(pitch_rad);
+    double vx = -sin_yaw*cos_pitch;
+    double vy =          sin_pitch;
+    double vz = -cos_yaw*cos_pitch;
+    for (i = 0; i < players_len; i++) {
+        if (i == shooter) continue;
+        Player *target = &(players[i]);
+        int hit = 0;
+        for (j = 0; j < 2; j++) {
+            double r = target->radius;
+            double h = target->height;
+            double dx = target->pos[0] - x0;
+            double dy = target->pos[1] - y0 + (j == 0 ? 0 : r - h);
+            double dz = target->pos[2] - z0;
+            double vd = vx*dx + vy*dy + vz*dz;
+            double dd = dx*dx + dy*dy + dz*dz;
+            double vv = vx*vx + vy*vy + vz*vz;
+            double rr = r * r;
+            if (vd < 0) continue;
+            if (vd * vd >= vv * (dd - rr)) hit += 1;
+        }
+        if (hit) {
+            target->pos[0] = (double)(MAP_BOX_SCALE * (SDL_rand(256) - 128)) / 256;
+            target->pos[1] = (double)(MAP_BOX_SCALE * (SDL_rand(256) - 128)) / 256;
+            target->pos[2] = (double)(MAP_BOX_SCALE * (SDL_rand(256) - 128)) / 256;
+        }
+    }
+}
+
+static void update(Player *players, int players_len, Uint64 dt_ns)
+{
+    int i;
+    for (i = 0; i < players_len; i++) {
+        Player *player = &players[i];
+        double rate = 6.0;
+        double time = (double)dt_ns * 1e-9;
+        double drag = SDL_exp(-time * rate);
+        double diff = 1.0 - drag;
+        double mult = 60.0;
+        double grav = 25.0;
+        double yaw = (double)player->yaw;
+        double rad = yaw * SDL_PI_D / 2147483648.0;
+        double cos = SDL_cos(rad);
+        double sin = SDL_sin(rad);
+        unsigned char wasd = player->wasd;
+        double dirX = (wasd & 8 ? 1.0 : 0.0) - (wasd & 2 ? 1.0 : 0.0);
+        double dirZ = (wasd & 4 ? 1.0 : 0.0) - (wasd & 1 ? 1.0 : 0.0);
+        double norm = dirX * dirX + dirZ * dirZ;
+        double accX = mult * (norm == 0 ? 0 : ( cos*dirX + sin*dirZ) / SDL_sqrt(norm));
+        double accZ = mult * (norm == 0 ? 0 : (-sin*dirX + cos*dirZ) / SDL_sqrt(norm));
+        double velX = player->vel[0];
+        double velY = player->vel[1];
+        double velZ = player->vel[2];
+        player->vel[0] -= velX * diff;
+        player->vel[1] -= grav * time;
+        player->vel[2] -= velZ * diff;
+        player->vel[0] += diff * accX / rate;
+        player->vel[2] += diff * accZ / rate;
+        player->pos[0] += (time - diff/rate) * accX / rate + diff * velX / rate;
+        player->pos[1] += -0.5 * grav * time * time + velY * time;
+        player->pos[2] += (time - diff/rate) * accZ / rate + diff * velZ / rate;
+        double scale = (double)MAP_BOX_SCALE;
+        double bound = scale - player->radius;
+        double posX = SDL_max(SDL_min(bound, player->pos[0]), -bound);
+        double posY = SDL_max(SDL_min(bound, player->pos[1]), player->height - scale);
+        double posZ = SDL_max(SDL_min(bound, player->pos[2]), -bound);
+        if (player->pos[0] != posX) player->vel[0] = 0;
+        if (player->pos[1] != posY) player->vel[1] = (wasd & 16) ? 8.4375 : 0;
+        if (player->pos[2] != posZ) player->vel[2] = 0;
+        player->pos[0] = posX;
+        player->pos[1] = posY;
+        player->pos[2] = posZ;
+    }
+}
+
+static void drawCircle(SDL_Renderer *renderer, float r, float x, float y)
+{
+    float ang;
+    SDL_FPoint points[CIRCLE_DRAW_SIDES_LEN];
+    int i;
+    for (i = 0; i < CIRCLE_DRAW_SIDES_LEN; i++) {
+        ang = 2.0f * SDL_PI_F * (float)i / (float)CIRCLE_DRAW_SIDES;
+        points[i].x = x + r * SDL_cosf(ang);
+        points[i].y = y + r * SDL_sinf(ang);
+    }
+    SDL_RenderLines(renderer, (const SDL_FPoint*)&points, CIRCLE_DRAW_SIDES_LEN);
+}
+
+static void drawClippedSegment(
+    SDL_Renderer *renderer,
+    float ax, float ay, float az,
+    float bx, float by, float bz,
+    float x, float y, float z, float w)
+{
+    if (az >= -w && bz >= -w) return;
+    float dx = ax - bx;
+    float dy = ay - by;
+    if (az > -w) {
+        float t = (-w - bz) / (az - bz);
+        ax = bx + dx * t;
+        ay = by + dy * t;
+        az = -w;
+    } else if (bz > -w) {
+        float t = (-w - az) / (bz - az);
+        bx = ax - dx * t;
+        by = ay - dy * t;
+        bz = -w;
+    }
+    ax = -z * ax / az;
+    ay = -z * ay / az;
+    bx = -z * bx / bz;
+    by = -z * by / bz;
+    SDL_RenderLine(renderer, x + ax, y - ay, x + bx, y - by);
+}
+
+static char debug_string[32];
+static void draw(SDL_Renderer *renderer, const float (*edges)[6], const Player players[], int players_len)
+{
+    int w, h, i, j, k;
+    if (!SDL_GetRenderOutputSize(renderer, &w, &h)) {
+        return;
+    }
+    SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
+    SDL_RenderClear(renderer);
+    if (players_len > 0) {
+        float wf = (float)w;
+        float hf = (float)h;
+        int part_hor = players_len > 2 ? 2 : 1;
+        int part_ver = players_len > 1 ? 2 : 1;
+        float size_hor = wf / ((float)part_hor);
+        float size_ver = hf / ((float)part_ver);
+        for (i = 0; i < players_len; i++) {
+            const Player *player = &players[i];
+            float mod_x = (float)(i % part_hor);
+            float mod_y = (float)(i / part_hor);
+            float hor_origin = (mod_x + 0.5f) * size_hor;
+            float ver_origin = (mod_y + 0.5f) * size_ver;
+            float cam_origin = (float)(0.5 * SDL_sqrt(size_hor * size_hor + size_ver * size_ver));
+            float hor_offset = mod_x * size_hor;
+            float ver_offset = mod_y * size_ver;
+            SDL_Rect rect;
+            rect.x = (int)hor_offset;
+            rect.y = (int)ver_offset;
+            rect.w = (int)size_hor;
+            rect.h = (int)size_ver;
+            SDL_SetRenderClipRect(renderer, &rect);
+            double x0 = player->pos[0];
+            double y0 = player->pos[1];
+            double z0 = player->pos[2];
+            double bin_rad = SDL_PI_D / 2147483648.0;
+            double yaw_rad   = bin_rad * player->yaw;
+            double pitch_rad = bin_rad * player->pitch;
+            double cos_yaw   = SDL_cos(  yaw_rad);
+            double sin_yaw   = SDL_sin(  yaw_rad);
+            double cos_pitch = SDL_cos(pitch_rad);
+            double sin_pitch = SDL_sin(pitch_rad);
+            double mat[9] = {
+                cos_yaw          ,          0, -sin_yaw          ,
+                sin_yaw*sin_pitch,  cos_pitch,  cos_yaw*sin_pitch,
+                sin_yaw*cos_pitch, -sin_pitch,  cos_yaw*cos_pitch
+            };
+            SDL_SetRenderDrawColor(renderer, 64, 64, 64, 255);
+            for (k = 0; k < MAP_BOX_EDGES_LEN; k++) {
+                const float *line = edges[k];
+                float ax = (float)(mat[0] * (line[0] - x0) + mat[1] * (line[1] - y0) + mat[2] * (line[2] - z0));
+                float ay = (float)(mat[3] * (line[0] - x0) + mat[4] * (line[1] - y0) + mat[5] * (line[2] - z0));
+                float az = (float)(mat[6] * (line[0] - x0) + mat[7] * (line[1] - y0) + mat[8] * (line[2] - z0));
+                float bx = (float)(mat[0] * (line[3] - x0) + mat[1] * (line[4] - y0) + mat[2] * (line[5] - z0));
+                float by = (float)(mat[3] * (line[3] - x0) + mat[4] * (line[4] - y0) + mat[5] * (line[5] - z0));
+                float bz = (float)(mat[6] * (line[3] - x0) + mat[7] * (line[4] - y0) + mat[8] * (line[5] - z0));
+                drawClippedSegment(renderer, ax, ay, az, bx, by, bz, hor_origin, ver_origin, cam_origin, 1);
+            }
+            for (j = 0; j < players_len; j++) {
+                if (i == j) continue;
+                const Player *target = &players[j];
+                SDL_SetRenderDrawColor(renderer, target->color[0], target->color[1], target->color[2], 255);
+                for (k = 0; k < 2; k++) {
+                    double rx = target->pos[0] - player->pos[0];
+                    double ry = target->pos[1] - player->pos[1] + (target->radius - target->height) * (float)k;
+                    double rz = target->pos[2] - player->pos[2];
+                    double dx = mat[0] * rx + mat[1] * ry + mat[2] * rz;
+                    double dy = mat[3] * rx + mat[4] * ry + mat[5] * rz;
+                    double dz = mat[6] * rx + mat[7] * ry + mat[8] * rz;
+                    double r_eff = target->radius * cam_origin / dz;
+                    if (!(dz < 0)) continue;
+                    drawCircle(renderer, (float)(r_eff), (float)(hor_origin - cam_origin*dx/dz), (float)(ver_origin + cam_origin*dy/dz));
+                }
+            }
+            SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
+            SDL_RenderLine(renderer, hor_origin, ver_origin-10, hor_origin, ver_origin+10);
+            SDL_RenderLine(renderer, hor_origin-10, ver_origin, hor_origin+10, ver_origin);
+        }
+    }
+    SDL_SetRenderClipRect(renderer, 0);
+    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
+    SDL_RenderDebugText(renderer, 0, 0, debug_string);
+    SDL_RenderPresent(renderer);
+}
+
+static void initPlayers(Player *players, int len)
+{
+    int i;
+    for (i = 0; i < len; i++) {
+        players[i].pos[0] = 8.0 * (i & 1 ? -1.0 : 1.0);
+        players[i].pos[1] = 0;
+        players[i].pos[2] = 8.0 * (i & 1 ? -1.0 : 1.0) * (i & 2 ? -1.0 : 1.0);
+        players[i].vel[0] = 0;
+        players[i].vel[1] = 0;
+        players[i].vel[2] = 0;
+        players[i].yaw = 0x20000000 + (i & 1 ? 0x80000000 : 0) + (i & 2 ? 0x40000000 : 0);
+        players[i].pitch = -0x08000000;
+        players[i].radius = 0.5f;
+        players[i].height = 1.5f;
+        players[i].wasd = 0;
+        players[i].mouse = 0;
+        players[i].keyboard = 0;
+        players[i].color[0] = (1 << (i / 2)) & 2 ? 0 : 0xff;
+        players[i].color[1] = (1 << (i / 2)) & 1 ? 0 : 0xff;
+        players[i].color[2] = (1 << (i / 2)) & 4 ? 0 : 0xff;
+        players[i].color[0] = (i & 1) ? players[i].color[0] : ~players[i].color[0];
+        players[i].color[1] = (i & 1) ? players[i].color[1] : ~players[i].color[1];
+        players[i].color[2] = (i & 1) ? players[i].color[2] : ~players[i].color[2];
+    }
+}
+
+static void initEdges(int scale, float (*edges)[6], int edges_len)
+{
+    int i, j;
+    const float r = (float)scale;
+    const int map[24] = {
+        0,1 , 1,3 , 3,2 , 2,0 ,
+        7,6 , 6,4 , 4,5 , 5,7 ,
+        6,2 , 3,7 , 0,4 , 5,1
+    };
+    for(i = 0; i < 12; i++) {
+        for (j = 0; j < 3; j++) {
+            edges[i][j+0] = (map[i*2+0] & (1 << j) ? r : -r);
+            edges[i][j+3] = (map[i*2+1] & (1 << j) ? r : -r);
+        }
+    }
+    for(i = 0; i < scale; i++) {
+        float d = (float)(i * 2);
+        for (j = 0; j < 2; j++) {
+            edges[i+12][3*j+0]       = j ? r : -r;
+            edges[i+12][3*j+1]       =  -r;
+            edges[i+12][3*j+2]       = d-r;
+            edges[i+12+scale][3*j+0] = d-r;
+            edges[i+12+scale][3*j+1] =  -r;
+            edges[i+12+scale][3*j+2] = j ? r : -r;
+        }
+    }
+}
+
+SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
+{
+    if (!SDL_SetAppMetadata("Example splitscreen shooter game", "1.0", "com.example.woodeneye-008")) {
+        return SDL_APP_FAILURE;
+    }
+    int i;
+    for (i = 0; i < SDL_arraysize(extended_metadata); i++) {
+        if (!SDL_SetAppMetadataProperty(extended_metadata[i].key, extended_metadata[i].value)) {
+            return SDL_APP_FAILURE;
+        }
+    }
+
+    AppState *as = SDL_calloc(1, sizeof(AppState));
+    if (!as) {
+        return SDL_APP_FAILURE;
+    } else {
+        *appstate = as;
+    }
+
+    if (!SDL_Init(SDL_INIT_VIDEO)) {
+        return SDL_APP_FAILURE;
+    }
+    if (!SDL_CreateWindowAndRenderer("examples/game/woodeneye-008", 640, 480, 0, &as->window, &as->renderer)) {
+        return SDL_APP_FAILURE;
+    }
+
+    as->player_count = 1;
+    initPlayers(as->players, MAX_PLAYER_COUNT);
+    initEdges(MAP_BOX_SCALE, as->edges, MAP_BOX_EDGES_LEN);
+    debug_string[0] = 0;
+
+    SDL_SetRenderVSync(as->renderer, false);
+    SDL_SetWindowRelativeMouseMode(as->window, true);
+    SDL_SetHintWithPriority(SDL_HINT_WINDOWS_RAW_KEYBOARD, "1", SDL_HINT_OVERRIDE);
+    return SDL_APP_CONTINUE;
+}
+
+SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event)
+{
+    AppState *as = appstate;
+    Player *players = as->players;
+    int player_count = as->player_count;
+    int i;
+    switch (event->type) {
+        case SDL_EVENT_QUIT:
+            return SDL_APP_SUCCESS;
+            break;
+        case SDL_EVENT_MOUSE_REMOVED:
+            for (i = 0; i < player_count; i++) {
+                if (players[i].mouse == event->mdevice.which) {
+                    players[i].mouse = 0;
+                }
+            }
+            break;
+        case SDL_EVENT_KEYBOARD_REMOVED:
+            for (i = 0; i < player_count; i++) {
+                if (players[i].keyboard == event->kdevice.which) {
+                    players[i].keyboard = 0;
+                }
+            }
+            break;
+        case SDL_EVENT_MOUSE_MOTION: {
+            SDL_MouseID id = event->motion.which;
+            int index = whoseMouse(id, players, player_count);
+            if (index >= 0) {
+                players[index].yaw -= ((int)event->motion.xrel) * 0x00080000;
+                players[index].pitch = SDL_max(-0x40000000, SDL_min(0x40000000, players[index].pitch - ((int)event->motion.yrel) * 0x00080000));
+            } else if (id) {
+                for (i = 0; i < MAX_PLAYER_COUNT; i++) {
+                    if (players[i].mouse == 0) {
+                        players[i].mouse = id;
+                        as->player_count = SDL_max(as->player_count, i + 1);
+                        break;
+                    }
+                }
+            }
+            break;
+        }
+        case SDL_EVENT_MOUSE_BUTTON_DOWN: {
+            SDL_MouseID id = event->button.which;
+            int index = whoseMouse(id, players, player_count);
+            if (index >= 0) {
+                shoot(index, players, player_count);
+            }
+            break;
+        }
+        case SDL_EVENT_KEY_DOWN: {
+            SDL_Keycode sym = event->key.key;
+            SDL_KeyboardID id = event->key.which;
+            int index = whoseKeyboard(id, players, player_count);
+            if (index >= 0) {
+                if (sym == SDLK_W) players[index].wasd |= 1;
+                if (sym == SDLK_A) players[index].wasd |= 2;
+                if (sym == SDLK_S) players[index].wasd |= 4;
+                if (sym == SDLK_D) players[index].wasd |= 8;
+                if (sym == SDLK_SPACE) players[index].wasd |= 16;
+            } else if (id) {
+                for (i = 0; i < MAX_PLAYER_COUNT; i++) {
+                    if (players[i].keyboard == 0) {
+                        players[i].keyboard = id;
+                        as->player_count = SDL_max(as->player_count, i + 1);
+                        break;
+                    }
+                }
+            }
+            break;
+        }
+        case SDL_EVENT_KEY_UP: {
+            SDL_Keycode sym = event->key.key;
+            SDL_KeyboardID id = event->key.which;
+            if (sym == SDLK_ESCAPE) return SDL_APP_SUCCESS;
+            int index = whoseKeyboard(id, players, player_count);
+            if (index >= 0) {
+                if (sym == SDLK_W) players[index].wasd &= 30;
+                if (sym == SDLK_A) players[index].wasd &= 29;
+                if (sym == SDLK_S) players[index].wasd &= 27;
+                if (sym == SDLK_D) players[index].wasd &= 23;
+                if (sym == SDLK_SPACE) players[index].wasd &= 15;
+            }
+            break;
+        }
+    }
+    return SDL_APP_CONTINUE;
+}
+
+SDL_AppResult SDL_AppIterate(void *appstate)
+{
+    AppState *as = appstate;
+    static Uint64 accu = 0;
+    static Uint64 last = 0;
+    static Uint64 past = 0;
+    Uint64 now = SDL_GetTicksNS();
+    Uint64 dt_ns = now - past;
+    update(as->players, as->player_count, dt_ns);
+    draw(as->renderer, (const float (*)[6])as->edges, as->players, as->player_count);
+    if (now - last > 999999999) {
+        last = now;
+        SDL_snprintf(debug_string, sizeof(debug_string), "%" SDL_PRIu64 " fps", accu);
+        accu = 0;
+    }
+    past = now;
+    accu += 1;
+    Uint64 elapsed = SDL_GetTicksNS() - now;
+    if (elapsed < 999999) {
+        SDL_DelayNS(999999 - elapsed);
+    }
+    return SDL_APP_CONTINUE;
+}
+
+void SDL_AppQuit(void *appstate, SDL_AppResult result)
+{
+    SDL_free(appstate); // just free the memory, SDL will clean up the window/renderer for us.
+}

+ 7 - 0
libs/SDL3/examples/game/03-infinite-monkeys/README.txt

@@ -0,0 +1,7 @@
+
+How many monkeys does it take to write the complete works of Shakespeare?
+
+    Now you can find out!
+
+Cheer on your favorite monkey as they bash keyboards on their way through classic literature.
+

+ 377 - 0
libs/SDL3/examples/game/03-infinite-monkeys/infinite-monkeys.c

@@ -0,0 +1,377 @@
+/*
+ * This code is public domain. Feel free to use it for any purpose!
+ */
+
+#define SDL_MAIN_USE_CALLBACKS 1  /* use the callbacks instead of main() */
+#include <SDL3/SDL.h>
+#include <SDL3/SDL_main.h>
+
+/* We will use this renderer to draw into this window every frame. */
+static SDL_Window *window = NULL;
+static SDL_Renderer *renderer = NULL;
+static char *text;
+static const char *end;
+static const char *progress;
+static SDL_Time start_time;
+static SDL_Time end_time;
+typedef struct {
+    Uint32 *text;
+    int length;
+} Line;
+int row = 0;
+int rows = 0;
+int cols = 0;
+static Line **lines;
+static Line monkey_chars;
+static int monkeys = 100;
+
+/* The highest and lowest scancodes a monkey can hit */
+#define MIN_MONKEY_SCANCODE SDL_SCANCODE_A
+#define MAX_MONKEY_SCANCODE SDL_SCANCODE_SLASH
+
+static const char *default_text =
+"Jabberwocky, by Lewis Carroll\n"
+"\n"
+"'Twas brillig, and the slithy toves\n"
+"      Did gyre and gimble in the wabe:\n"
+"All mimsy were the borogoves,\n"
+"      And the mome raths outgrabe.\n"
+"\n"
+"\"Beware the Jabberwock, my son!\n"
+"      The jaws that bite, the claws that catch!\n"
+"Beware the Jubjub bird, and shun\n"
+"      The frumious Bandersnatch!\"\n"
+"\n"
+"He took his vorpal sword in hand;\n"
+"      Long time the manxome foe he sought-\n"
+"So rested he by the Tumtum tree\n"
+"      And stood awhile in thought.\n"
+"\n"
+"And, as in uffish thought he stood,\n"
+"      The Jabberwock, with eyes of flame,\n"
+"Came whiffling through the tulgey wood,\n"
+"      And burbled as it came!\n"
+"\n"
+"One, two! One, two! And through and through\n"
+"      The vorpal blade went snicker-snack!\n"
+"He left it dead, and with its head\n"
+"      He went galumphing back.\n"
+"\n"
+"\"And hast thou slain the Jabberwock?\n"
+"      Come to my arms, my beamish boy!\n"
+"O frabjous day! Callooh! Callay!\"\n"
+"      He chortled in his joy.\n"
+"\n"
+"'Twas brillig, and the slithy toves\n"
+"      Did gyre and gimble in the wabe:\n"
+"All mimsy were the borogoves,\n"
+"      And the mome raths outgrabe.\n";
+
+
+static void FreeLines(void)
+{
+    int i;
+
+    if (rows > 0 && cols > 0) {
+        for (i = 0; i < rows; ++i) {
+            SDL_free(lines[i]->text);
+            SDL_free(lines[i]);
+        }
+        SDL_free(lines);
+        lines = NULL;
+    }
+    SDL_free(monkey_chars.text);
+    monkey_chars.text = NULL;
+}
+
+static void OnWindowSizeChanged(void)
+{
+    int w, h;
+
+    if (!SDL_GetCurrentRenderOutputSize(renderer, &w, &h)) {
+        return;
+    }
+
+    FreeLines();
+
+    row = 0;
+    rows = (h / SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE) - 4;
+    cols = (w / SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE);
+    if (rows > 0 && cols > 0) {
+        int i;
+
+        lines = (Line **)SDL_malloc(rows * sizeof(Line *));
+        if (lines) {
+            for (i = 0; i < rows; ++i) {
+                lines[i] = (Line *)SDL_malloc(sizeof(Line));
+                if (!lines[i]) {
+                    FreeLines();
+                    break;
+                }
+                lines[i]->text = (Uint32 *)SDL_malloc(cols * sizeof(Uint32));
+                if (!lines[i]->text) {
+                    FreeLines();
+                    break;
+                }
+                lines[i]->length = 0;
+            }
+        }
+
+        monkey_chars.text = (Uint32 *)SDL_malloc(cols * sizeof(Uint32));
+        if (monkey_chars.text) {
+            for (i = 0; i < cols; ++i) {
+                monkey_chars.text[i] = ' ';
+            }
+            monkey_chars.length = cols;
+        }
+    }
+}
+
+/* This function runs once at startup. */
+SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
+{
+    int arg = 1;
+
+    SDL_SetAppMetadata("Infinite Monkeys", "1.0", "com.example.infinite-monkeys");
+
+    if (!SDL_Init(SDL_INIT_VIDEO)) {
+        SDL_Log("Couldn't initialize SDL: %s", SDL_GetError());
+        return SDL_APP_FAILURE;
+    }
+
+    if (!SDL_CreateWindowAndRenderer("examples/game/03-infinite-monkeys", 640, 480, 0, &window, &renderer)) {
+        SDL_Log("Couldn't create window/renderer: %s", SDL_GetError());
+        return SDL_APP_FAILURE;
+    }
+    SDL_SetRenderVSync(renderer, 1);
+
+    if (argv[arg] && SDL_strcmp(argv[arg], "--monkeys") == 0) {
+        ++arg;
+        if (argv[arg]) {
+            monkeys = SDL_atoi(argv[arg]);
+            ++arg;
+        } else {
+            SDL_Log("Usage: %s [--monkeys N] [file.txt]", argv[0]);
+            return SDL_APP_FAILURE;
+        }
+    }
+
+    if (argv[arg]) {
+        const char *file = argv[arg];
+        size_t size;
+        text = (char *)SDL_LoadFile(file, &size);
+        if (!text) {
+            SDL_Log("Couldn't open %s: %s", file, SDL_GetError());
+            return SDL_APP_FAILURE;
+        }
+        end = text + size;
+    } else {
+        text = SDL_strdup(default_text);
+        end = text + SDL_strlen(text);
+    }
+    progress = text;
+
+    SDL_GetCurrentTime(&start_time);
+
+    OnWindowSizeChanged();
+
+    return SDL_APP_CONTINUE;  /* carry on with the program! */
+}
+
+/* This function runs when a new event (mouse input, keypresses, etc) occurs. */
+SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event)
+{
+    switch (event->type) {
+    case SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED:
+        OnWindowSizeChanged();
+        break;
+    case SDL_EVENT_QUIT:
+        return SDL_APP_SUCCESS;  /* end the program, reporting success to the OS. */
+    }
+    return SDL_APP_CONTINUE;  /* carry on with the program! */
+}
+
+static void DisplayLine(float x, float y, Line *line)
+{
+    /* Allocate maximum space potentially needed for this line */
+    char *utf8 = (char *)SDL_malloc(line->length * 4 + 1);
+    if (utf8) {
+        char *spot = utf8;
+        int i;
+
+        for (i = 0; i < line->length; ++i) {
+            spot = SDL_UCS4ToUTF8(line->text[i], spot);
+        }
+        *spot = '\0';
+
+        SDL_RenderDebugText(renderer, x, y, utf8);
+        SDL_free(utf8);
+    }
+}
+
+static bool CanMonkeyType(Uint32 ch)
+{
+    SDL_Keymod modstate;
+    SDL_Scancode scancode = SDL_GetScancodeFromKey(ch, &modstate);
+    if (scancode < MIN_MONKEY_SCANCODE || scancode > MAX_MONKEY_SCANCODE) {
+        return false;
+    }
+    /* Monkeys can hit the shift key, but nothing else */
+    if ((modstate & ~SDL_KMOD_SHIFT) != 0) {
+        return false;
+    }
+    return true;
+}
+
+static void AdvanceRow(void)
+{
+    Line *line;
+
+    ++row;
+    line = lines[row % rows];
+    line->length = 0;
+}
+
+static void AddMonkeyChar(int monkey, Uint32 ch)
+{
+    if (monkey >= 0 && monkey_chars.text) {
+        monkey_chars.text[(monkey % cols)] = ch;
+    }
+
+    if (lines) {
+        if (ch == '\n') {
+            AdvanceRow();
+        } else {
+            Line *line = lines[row % rows];
+            line->text[line->length++] = ch;
+            if (line->length == cols) {
+                AdvanceRow();
+            }
+        }
+    }
+
+    SDL_StepUTF8(&progress, NULL);
+}
+
+static Uint32 GetNextChar(void)
+{
+    Uint32 ch = 0;
+    while (progress < end) {
+        const char *spot = progress;
+        ch = SDL_StepUTF8(&spot, NULL);
+        if (CanMonkeyType(ch)) {
+            break;
+        } else {
+            /* This is a freebie, monkeys can't type this */
+            AddMonkeyChar(-1, ch);
+        }
+    }
+    return ch;
+}
+
+static Uint32 MonkeyPlay(void)
+{
+    int count = (MAX_MONKEY_SCANCODE - MIN_MONKEY_SCANCODE + 1);
+    SDL_Scancode scancode = (SDL_Scancode)(MIN_MONKEY_SCANCODE + SDL_rand(count));
+    SDL_Keymod modstate = (SDL_rand(2) ? SDL_KMOD_SHIFT : 0);
+
+    return SDL_GetKeyFromScancode(scancode, modstate, false);
+}
+
+/* This function runs once per frame, and is the heart of the program. */
+SDL_AppResult SDL_AppIterate(void *appstate)
+{
+    int i, monkey;
+    Uint32 next_char = 0, ch;
+    float x, y;
+    char *caption = NULL;
+    SDL_Time now, elapsed;
+    int hours, minutes, seconds;
+    SDL_FRect rect;
+
+    for (monkey = 0; monkey < monkeys; ++monkey) {
+        if (next_char == 0) {
+            next_char = GetNextChar();
+            if (!next_char) {
+                /* All done! */
+                break;
+            }
+        }
+
+        ch = MonkeyPlay();
+        if (ch == next_char) {
+            AddMonkeyChar(monkey, ch);
+            next_char = 0;
+        }
+    }
+
+    /* Clear the screen */
+    SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
+    SDL_RenderClear(renderer);
+
+    /* Show the text already decoded */
+    SDL_SetRenderDrawColor(renderer, 255, 255, 255, SDL_ALPHA_OPAQUE);
+    x = 0.0f;
+    y = 0.0f;
+    if (lines) {
+        int row_offset = row - rows + 1;
+        if (row_offset < 0) {
+            row_offset = 0;
+        }
+        for (i = 0; i < rows; ++i) {
+            Line *line = lines[(row_offset + i) % rows];
+            DisplayLine(x, y, line);
+            y += SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE;
+        }
+
+        /* Show the caption */
+        y = (float)((rows + 1) * SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE);
+        if (progress == end) {
+            if (!end_time) {
+                SDL_GetCurrentTime(&end_time);
+            }
+            now = end_time;
+        } else {
+            SDL_GetCurrentTime(&now);
+        }
+        elapsed = (now - start_time);
+        elapsed /= SDL_NS_PER_SECOND;
+        seconds = (int)(elapsed % 60);
+        elapsed /= 60;
+        minutes = (int)(elapsed % 60);
+        elapsed /= 60;
+        hours = (int)elapsed;
+        SDL_asprintf(&caption, "Monkeys: %d - %dH:%dM:%dS", monkeys, hours, minutes, seconds);
+        if (caption) {
+            SDL_RenderDebugText(renderer, x, y, caption);
+            SDL_free(caption);
+        }
+        y += SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE;
+
+        /* Show the characters currently typed */
+        DisplayLine(x, y, &monkey_chars);
+        y += SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE;
+    }
+
+    /* Show the current progress */
+    SDL_SetRenderDrawColor(renderer, 0, 255, 0, SDL_ALPHA_OPAQUE);
+    rect.x = x;
+    rect.y = y;
+    rect.w = ((float)(progress - text) / (end - text)) * (cols * SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE);
+    rect.h = (float)SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE;
+    SDL_RenderFillRect(renderer, &rect);
+
+    SDL_RenderPresent(renderer);
+
+    return SDL_APP_CONTINUE;  /* carry on with the program! */
+}
+
+/* This function runs once at shutdown. */
+void SDL_AppQuit(void *appstate, SDL_AppResult result)
+{
+    /* SDL will clean up the window/renderer for us. */
+
+    FreeLines();
+    SDL_free(text);
+}
+

+ 2 - 2
libs/SDL3/examples/pen/01-drawing-lines/drawing-lines.c

@@ -45,7 +45,7 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
 
     /* just blank the render target to gray to start. */
     SDL_SetRenderTarget(renderer, render_target);
-    SDL_SetRenderDrawColor(renderer, 100, 100, 100, 255);
+    SDL_SetRenderDrawColor(renderer, 100, 100, 100, SDL_ALPHA_OPAQUE);
     SDL_RenderClear(renderer);
     SDL_SetRenderTarget(renderer, NULL);
     SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND);
@@ -90,7 +90,7 @@ SDL_AppResult SDL_AppIterate(void *appstate)
 {
     /* make sure we're drawing to the window and not the render target */
     SDL_SetRenderTarget(renderer, NULL);
-    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
+    SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
     SDL_RenderClear(renderer);  /* just in case. */
     SDL_RenderTexture(renderer, render_target, NULL, NULL);
     SDL_RenderPresent(renderer);

+ 1 - 1
libs/SDL3/examples/renderer/01-clear/clear.c

@@ -49,7 +49,7 @@ SDL_AppResult SDL_AppIterate(void *appstate)
     const float red = (float) (0.5 + 0.5 * SDL_sin(now));
     const float green = (float) (0.5 + 0.5 * SDL_sin(now + SDL_PI_D * 2 / 3));
     const float blue = (float) (0.5 + 0.5 * SDL_sin(now + SDL_PI_D * 4 / 3));
-    SDL_SetRenderDrawColorFloat(renderer, red, green, blue, 1.0f);  /* new color, full alpha. */
+    SDL_SetRenderDrawColorFloat(renderer, red, green, blue, SDL_ALPHA_OPAQUE_FLOAT);  /* new color, full alpha. */
 
     /* clear the window to the draw color. */
     SDL_RenderClear(renderer);

+ 5 - 5
libs/SDL3/examples/renderer/02-primitives/primitives.c

@@ -55,22 +55,22 @@ SDL_AppResult SDL_AppIterate(void *appstate)
     SDL_FRect rect;
 
     /* as you can see from this, rendering draws over whatever was drawn before it. */
-    SDL_SetRenderDrawColor(renderer, 33, 33, 33, 255);  /* dark gray, full alpha */
+    SDL_SetRenderDrawColor(renderer, 33, 33, 33, SDL_ALPHA_OPAQUE);  /* dark gray, full alpha */
     SDL_RenderClear(renderer);  /* start with a blank canvas. */
 
     /* draw a filled rectangle in the middle of the canvas. */
-    SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255);  /* blue, full alpha */
+    SDL_SetRenderDrawColor(renderer, 0, 0, 255, SDL_ALPHA_OPAQUE);  /* blue, full alpha */
     rect.x = rect.y = 100;
     rect.w = 440;
     rect.h = 280;
     SDL_RenderFillRect(renderer, &rect);
 
     /* draw some points across the canvas. */
-    SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);  /* red, full alpha */
+    SDL_SetRenderDrawColor(renderer, 255, 0, 0, SDL_ALPHA_OPAQUE);  /* red, full alpha */
     SDL_RenderPoints(renderer, points, SDL_arraysize(points));
 
     /* draw a unfilled rectangle in-set a little bit. */
-    SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);  /* green, full alpha */
+    SDL_SetRenderDrawColor(renderer, 0, 255, 0, SDL_ALPHA_OPAQUE);  /* green, full alpha */
     rect.x += 30;
     rect.y += 30;
     rect.w -= 60;
@@ -78,7 +78,7 @@ SDL_AppResult SDL_AppIterate(void *appstate)
     SDL_RenderRect(renderer, &rect);
 
     /* draw two lines in an X across the whole canvas. */
-    SDL_SetRenderDrawColor(renderer, 255, 255, 0, 255);  /* yellow, full alpha */
+    SDL_SetRenderDrawColor(renderer, 255, 255, 0, SDL_ALPHA_OPAQUE);  /* yellow, full alpha */
     SDL_RenderLine(renderer, 0, 0, 640, 480);
     SDL_RenderLine(renderer, 0, 480, 640, 0);
 

+ 4 - 4
libs/SDL3/examples/renderer/03-lines/lines.c

@@ -56,18 +56,18 @@ SDL_AppResult SDL_AppIterate(void *appstate)
     };
 
     /* as you can see from this, rendering draws over whatever was drawn before it. */
-    SDL_SetRenderDrawColor(renderer, 100, 100, 100, 255);  /* grey, full alpha */
+    SDL_SetRenderDrawColor(renderer, 100, 100, 100, SDL_ALPHA_OPAQUE);  /* grey, full alpha */
     SDL_RenderClear(renderer);  /* start with a blank canvas. */
 
     /* You can draw lines, one at a time, like these brown ones... */
-    SDL_SetRenderDrawColor(renderer, 127, 49, 32, 255);
+    SDL_SetRenderDrawColor(renderer, 127, 49, 32, SDL_ALPHA_OPAQUE);
     SDL_RenderLine(renderer, 240, 450, 400, 450);
     SDL_RenderLine(renderer, 240, 356, 400, 356);
     SDL_RenderLine(renderer, 240, 356, 240, 450);
     SDL_RenderLine(renderer, 400, 356, 400, 450);
 
     /* You can also draw a series of connected lines in a single batch... */
-    SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);
+    SDL_SetRenderDrawColor(renderer, 0, 255, 0, SDL_ALPHA_OPAQUE);
     SDL_RenderLines(renderer, line_points, SDL_arraysize(line_points));
 
     /* here's a bunch of lines drawn out from a center point in a circle. */
@@ -76,7 +76,7 @@ SDL_AppResult SDL_AppIterate(void *appstate)
         const float size = 30.0f;
         const float x = 320.0f;
         const float y = 95.0f - (size / 2.0f);
-        SDL_SetRenderDrawColor(renderer, SDL_rand(256), SDL_rand(256), SDL_rand(256), 255);
+        SDL_SetRenderDrawColor(renderer, SDL_rand(256), SDL_rand(256), SDL_rand(256), SDL_ALPHA_OPAQUE);
         SDL_RenderLine(renderer, x, y, x + SDL_sinf((float) i) * size, y + SDL_cosf((float) i) * size);
     }
 

+ 2 - 2
libs/SDL3/examples/renderer/04-points/points.c

@@ -97,9 +97,9 @@ SDL_AppResult SDL_AppIterate(void *appstate)
     last_time = now;
 
     /* as you can see from this, rendering draws over whatever was drawn before it. */
-    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);  /* black, full alpha */
+    SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);  /* black, full alpha */
     SDL_RenderClear(renderer);  /* start with a blank canvas. */
-    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);  /* white, full alpha */
+    SDL_SetRenderDrawColor(renderer, 255, 255, 255, SDL_ALPHA_OPAQUE);  /* white, full alpha */
     SDL_RenderPoints(renderer, points, SDL_arraysize(points));  /* draw all the points! */
 
     /* You can also draw single points with SDL_RenderPoint(), but it's

+ 5 - 5
libs/SDL3/examples/renderer/05-rectangles/rectangles.c

@@ -55,7 +55,7 @@ SDL_AppResult SDL_AppIterate(void *appstate)
     const float scale = ((float) (((int) (now % 1000)) - 500) / 500.0f) * direction;
 
     /* as you can see from this, rendering draws over whatever was drawn before it. */
-    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);  /* black, full alpha */
+    SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);  /* black, full alpha */
     SDL_RenderClear(renderer);  /* start with a blank canvas. */
 
     /* Rectangles are comprised of set of X and Y coordinates, plus width and
@@ -66,7 +66,7 @@ SDL_AppResult SDL_AppIterate(void *appstate)
     /* Let's draw a single rectangle (square, really). */
     rects[0].x = rects[0].y = 100;
     rects[0].w = rects[0].h = 100 + (100 * scale);
-    SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);  /* red, full alpha */
+    SDL_SetRenderDrawColor(renderer, 255, 0, 0, SDL_ALPHA_OPAQUE);  /* red, full alpha */
     SDL_RenderRect(renderer, &rects[0]);
 
     /* Now let's draw several rectangles with one function call. */
@@ -76,7 +76,7 @@ SDL_AppResult SDL_AppIterate(void *appstate)
         rects[i].x = (WINDOW_WIDTH - rects[i].w) / 2;  /* center it. */
         rects[i].y = (WINDOW_HEIGHT - rects[i].h) / 2;  /* center it. */
     }
-    SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);  /* green, full alpha */
+    SDL_SetRenderDrawColor(renderer, 0, 255, 0, SDL_ALPHA_OPAQUE);  /* green, full alpha */
     SDL_RenderRects(renderer, rects, 3);  /* draw three rectangles at once */
 
     /* those were rectangle _outlines_, really. You can also draw _filled_ rectangles! */
@@ -84,7 +84,7 @@ SDL_AppResult SDL_AppIterate(void *appstate)
     rects[0].y = 50;
     rects[0].w = 100 + (100 * scale);
     rects[0].h = 50 + (50 * scale);
-    SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255);  /* blue, full alpha */
+    SDL_SetRenderDrawColor(renderer, 0, 0, 255, SDL_ALPHA_OPAQUE);  /* blue, full alpha */
     SDL_RenderFillRect(renderer, &rects[0]);
 
     /* ...and also fill a bunch of rectangles at once... */
@@ -96,7 +96,7 @@ SDL_AppResult SDL_AppIterate(void *appstate)
         rects[i].w = w;
         rects[i].h = h;
     }
-    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);  /* white, full alpha */
+    SDL_SetRenderDrawColor(renderer, 255, 255, 255, SDL_ALPHA_OPAQUE);  /* white, full alpha */
     SDL_RenderFillRects(renderer, rects, SDL_arraysize(rects));
 
     SDL_RenderPresent(renderer);  /* put it all on the screen! */

+ 1 - 1
libs/SDL3/examples/renderer/06-textures/textures.c

@@ -86,7 +86,7 @@ SDL_AppResult SDL_AppIterate(void *appstate)
     const float scale = ((float) (((int) (now % 1000)) - 500) / 500.0f) * direction;
 
     /* as you can see from this, rendering draws over whatever was drawn before it. */
-    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);  /* black, full alpha */
+    SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);  /* black, full alpha */
     SDL_RenderClear(renderer);  /* start with a blank canvas. */
 
     /* Just draw the static texture a few times. You can think of it like a

+ 1 - 1
libs/SDL3/examples/renderer/07-streaming-textures/streaming-textures.c

@@ -83,7 +83,7 @@ SDL_AppResult SDL_AppIterate(void *appstate)
     }
 
     /* as you can see from this, rendering draws over whatever was drawn before it. */
-    SDL_SetRenderDrawColor(renderer, 66, 66, 66, 255);  /* grey, full alpha */
+    SDL_SetRenderDrawColor(renderer, 66, 66, 66, SDL_ALPHA_OPAQUE);  /* grey, full alpha */
     SDL_RenderClear(renderer);  /* start with a blank canvas. */
 
     /* Just draw the static texture a few times. You can think of it like a

+ 1 - 1
libs/SDL3/examples/renderer/08-rotating-textures/rotating-textures.c

@@ -86,7 +86,7 @@ SDL_AppResult SDL_AppIterate(void *appstate)
     const float rotation = (((float) ((int) (now % 2000))) / 2000.0f) * 360.0f;
 
     /* as you can see from this, rendering draws over whatever was drawn before it. */
-    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);  /* black, full alpha */
+    SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);  /* black, full alpha */
     SDL_RenderClear(renderer);  /* start with a blank canvas. */
 
     /* Center this one, and draw it with some rotation so it spins! */

+ 1 - 1
libs/SDL3/examples/renderer/09-scaling-textures/scaling-textures.c

@@ -86,7 +86,7 @@ SDL_AppResult SDL_AppIterate(void *appstate)
     const float scale = ((float) (((int) (now % 1000)) - 500) / 500.0f) * direction;
 
     /* as you can see from this, rendering draws over whatever was drawn before it. */
-    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);  /* black, full alpha */
+    SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);  /* black, full alpha */
     SDL_RenderClear(renderer);  /* start with a blank canvas. */
 
     /* center this one and make it grow and shrink. */

+ 1 - 1
libs/SDL3/examples/renderer/10-geometry/geometry.c

@@ -89,7 +89,7 @@ SDL_AppResult SDL_AppIterate(void *appstate)
     int i;
 
     /* as you can see from this, rendering draws over whatever was drawn before it. */
-    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);  /* black, full alpha */
+    SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);  /* black, full alpha */
     SDL_RenderClear(renderer);  /* start with a blank canvas. */
 
     /* Draw a single triangle with a different color at each vertex. Center this one and make it grow and shrink. */

+ 1 - 1
libs/SDL3/examples/renderer/11-color-mods/color-mods.c

@@ -86,7 +86,7 @@ SDL_AppResult SDL_AppIterate(void *appstate)
     const float blue = (float) (0.5 + 0.5 * SDL_sin(now + SDL_PI_D * 4 / 3));
 
     /* as you can see from this, rendering draws over whatever was drawn before it. */
-    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);  /* black, full alpha */
+    SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);  /* black, full alpha */
     SDL_RenderClear(renderer);  /* start with a blank canvas. */
 
     /* Just draw the static texture a few times. You can think of it like a

+ 1 - 1
libs/SDL3/examples/renderer/14-viewport/viewport.c

@@ -86,7 +86,7 @@ SDL_AppResult SDL_AppIterate(void *appstate)
        window. It does _not_ scale rendering to fit the viewport. */
 
     /* as you can see from this, rendering draws over whatever was drawn before it. */
-    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);  /* black, full alpha */
+    SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);  /* black, full alpha */
     SDL_RenderClear(renderer);  /* start with a blank canvas. */
 
     /* Draw once with the whole window as the viewport. */

+ 1 - 1
libs/SDL3/examples/renderer/15-cliprect/cliprect.c

@@ -116,7 +116,7 @@ SDL_AppResult SDL_AppIterate(void *appstate)
     /* okay, now draw! */
 
     /* Note that SDL_RenderClear is _not_ affected by the clipping rectangle! */
-    SDL_SetRenderDrawColor(renderer, 33, 33, 33, 255);  /* grey, full alpha */
+    SDL_SetRenderDrawColor(renderer, 33, 33, 33, SDL_ALPHA_OPAQUE);  /* grey, full alpha */
     SDL_RenderClear(renderer);  /* start with a blank canvas. */
 
     /* stretch the texture across the entire window. Only the piece in the

+ 1 - 1
libs/SDL3/examples/renderer/17-read-pixels/read-pixels.c

@@ -96,7 +96,7 @@ SDL_AppResult SDL_AppIterate(void *appstate)
     const float rotation = (((float) ((int) (now % 2000))) / 2000.0f) * 360.0f;
 
     /* as you can see from this, rendering draws over whatever was drawn before it. */
-    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);  /* black, full alpha */
+    SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);  /* black, full alpha */
     SDL_RenderClear(renderer);  /* start with a blank canvas. */
 
     /* Center this one, and draw it with some rotation so it spins! */

+ 4 - 4
libs/SDL3/examples/renderer/18-debug-text/debug-text.c

@@ -47,16 +47,16 @@ SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event)
 SDL_AppResult SDL_AppIterate(void *appstate)
 {
     /* as you can see from this, rendering draws over whatever was drawn before it. */
-    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);  /* black, full alpha */
+    SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);  /* black, full alpha */
     SDL_RenderClear(renderer);  /* start with a blank canvas. */
 
-    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);  /* white, full alpha */
+    SDL_SetRenderDrawColor(renderer, 255, 255, 255, SDL_ALPHA_OPAQUE);  /* white, full alpha */
     SDL_RenderDebugText(renderer, 272, 100, "Hello world!");
     SDL_RenderDebugText(renderer, 224, 150, "This is some debug text.");
 
-    SDL_SetRenderDrawColor(renderer, 51, 102, 255, 255);  /* light blue, full alpha */
+    SDL_SetRenderDrawColor(renderer, 51, 102, 255, SDL_ALPHA_OPAQUE);  /* light blue, full alpha */
     SDL_RenderDebugText(renderer, 184, 200, "You can do it in different colors.");
-    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);  /* white, full alpha */
+    SDL_SetRenderDrawColor(renderer, 255, 255, 255, SDL_ALPHA_OPAQUE);  /* white, full alpha */
 
     SDL_SetRenderScale(renderer, 4.0f, 4.0f);
     SDL_RenderDebugText(renderer, 14, 65, "It can be scaled.");

+ 1 - 1
libs/SDL3/include/SDL3/SDL.h

@@ -22,7 +22,7 @@
 /**
  *  \file SDL.h
  *
- *  Main include header for the SDL library, version 3.1.5
+ *  Main include header for the SDL library, version 3.1.6
  */
 
 #ifndef SDL_h_

+ 47 - 18
libs/SDL3/include/SDL3/SDL_assert.h

@@ -84,7 +84,7 @@ extern "C" {
  * - 3: Paranoid settings: All SDL assertion macros enabled, including
  *   SDL_assert_paranoid.
  *
- * \since This macro is available since SDL 3.0.0.
+ * \since This macro is available since SDL 3.1.3.
  */
 #define SDL_ASSERT_LEVEL SomeNumberBasedOnVariousFactors
 
@@ -116,9 +116,9 @@ extern "C" {
  * isn't supported (SDL doesn't know how to trigger a breakpoint), this macro
  * does nothing.
  *
- * \threadsafety It is safe to call this function from any thread.
+ * \threadsafety It is safe to call this macro from any thread.
  *
- * \since This macro is available since SDL 3.0.0.
+ * \since This macro is available since SDL 3.1.3.
  */
 #define SDL_TriggerBreakpoint() TriggerABreakpointInAPlatformSpecificManner
 
@@ -198,7 +198,7 @@ disable assertions.
  * condition, try to break in a debugger, kill the program, or ignore the
  * problem).
  *
- * \since This enum is available since SDL 3.0.0.
+ * \since This enum is available since SDL 3.1.3.
  */
 typedef enum SDL_AssertState
 {
@@ -216,7 +216,7 @@ typedef enum SDL_AssertState
  * used by the assertion handler, then added to the assertion report. This is
  * returned as a linked list from SDL_GetAssertionReport().
  *
- * \since This struct is available since SDL 3.0.0.
+ * \since This struct is available since SDL 3.1.3.
  */
 typedef struct SDL_AssertData
 {
@@ -240,7 +240,9 @@ typedef struct SDL_AssertData
  * \param line line number.
  * \returns assert state.
  *
- * \since This function is available since SDL 3.0.0.
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.1.3.
  */
 extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData *data,
                                                             const char *func,
@@ -305,7 +307,9 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData *
  *
  * \param condition boolean value to test.
  *
- * \since This macro is available since SDL 3.0.0.
+ * \threadsafety It is safe to call this macro from any thread.
+ *
+ * \since This macro is available since SDL 3.1.3.
  */
 #define SDL_assert(condition) if (assertion_enabled && (condition)) { trigger_assertion; }
 
@@ -336,7 +340,9 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData *
  *
  * \param condition boolean value to test.
  *
- * \since This macro is available since SDL 3.0.0.
+ * \threadsafety It is safe to call this macro from any thread.
+ *
+ * \since This macro is available since SDL 3.1.3.
  */
 #define SDL_assert_release(condition) SDL_disabled_assert(condition)
 
@@ -363,7 +369,9 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData *
  *
  * \param condition boolean value to test.
  *
- * \since This macro is available since SDL 3.0.0.
+ * \threadsafety It is safe to call this macro from any thread.
+ *
+ * \since This macro is available since SDL 3.1.3.
  */
 #define SDL_assert_paranoid(condition) SDL_disabled_assert(condition)
 
@@ -389,7 +397,7 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData *
 #endif
 
 /**
- * An assertion test that always performed.
+ * An assertion test that is always performed.
  *
  * This macro is always enabled no matter what SDL_ASSERT_LEVEL is set to. You
  * almost never want to use this, as it could trigger on an end-user's system,
@@ -405,7 +413,9 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData *
  *
  * \param condition boolean value to test.
  *
- * \since This macro is available since SDL 3.0.0.
+ * \threadsafety It is safe to call this macro from any thread.
+ *
+ * \since This macro is available since SDL 3.1.3.
  */
 #define SDL_assert_always(condition) SDL_enabled_assert(condition)
 
@@ -418,7 +428,10 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData *
  * \param userdata what was passed as `userdata` to SDL_SetAssertionHandler().
  * \returns an SDL_AssertState value indicating how to handle the failure.
  *
- * \since This datatype is available since SDL 3.0.0.
+ * \threadsafety This callback may be called from any thread that triggers an
+ *               assert at any time.
+ *
+ * \since This datatype is available since SDL 3.1.3.
  */
 typedef SDL_AssertState (SDLCALL *SDL_AssertionHandler)(
                                  const SDL_AssertData *data, void *userdata);
@@ -440,7 +453,9 @@ typedef SDL_AssertState (SDLCALL *SDL_AssertionHandler)(
  *                fails or NULL for the default handler.
  * \param userdata a pointer that is passed to `handler`.
  *
- * \since This function is available since SDL 3.0.0.
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_GetAssertionHandler
  */
@@ -459,7 +474,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetAssertionHandler(
  * \returns the default SDL_AssertionHandler that is called when an assert
  *          triggers.
  *
- * \since This function is available since SDL 3.0.0.
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_GetAssertionHandler
  */
@@ -482,7 +499,9 @@ extern SDL_DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetDefaultAssertionHandler(
  *                  was passed to SDL_SetAssertionHandler().
  * \returns the SDL_AssertionHandler that is called when an assert triggers.
  *
- * \since This function is available since SDL 3.0.0.
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_SetAssertionHandler
  */
@@ -508,9 +527,15 @@ extern SDL_DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetAssertionHandler(void **
  * ```
  *
  * \returns a list of all failed assertions or NULL if the list is empty. This
- *          memory should not be modified or freed by the application.
+ *          memory should not be modified or freed by the application. This
+ *          pointer remains valid until the next call to SDL_Quit() or
+ *          SDL_ResetAssertionReport().
  *
- * \since This function is available since SDL 3.0.0.
+ * \threadsafety This function is not thread safe. Other threads calling
+ *               SDL_ResetAssertionReport() simultaneously, may render the
+ *               returned pointer invalid.
+ *
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_ResetAssertionReport
  */
@@ -524,7 +549,11 @@ extern SDL_DECLSPEC const SDL_AssertData * SDLCALL SDL_GetAssertionReport(void);
  * no items. In addition, any previously-triggered assertions will be reset to
  * a trigger_count of zero, and their always_ignore state will be false.
  *
- * \since This function is available since SDL 3.0.0.
+ * \threadsafety This function is not thread safe. Other threads triggering an
+ *               assertion, or simultaneously calling this function may cause
+ *               memory leaks or crashes.
+ *
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_GetAssertionReport
  */

+ 31 - 21
libs/SDL3/include/SDL3/SDL_atomic.h

@@ -90,7 +90,9 @@ typedef int SDL_SpinLock;
  * \param lock a pointer to a lock variable.
  * \returns true if the lock succeeded, false if the lock is already held.
  *
- * \since This function is available since SDL 3.0.0.
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_LockSpinlock
  * \sa SDL_UnlockSpinlock
@@ -105,7 +107,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_TryLockSpinlock(SDL_SpinLock *lock);
  *
  * \param lock a pointer to a lock variable.
  *
- * \since This function is available since SDL 3.0.0.
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_TryLockSpinlock
  * \sa SDL_UnlockSpinlock
@@ -122,7 +126,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_LockSpinlock(SDL_SpinLock *lock);
  *
  * \param lock a pointer to a lock variable.
  *
- * \since This function is available since SDL 3.0.0.
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_LockSpinlock
  * \sa SDL_TryLockSpinlock
@@ -146,7 +152,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnlockSpinlock(SDL_SpinLock *lock);
  *               time, but if you find yourself needing this, you are probably
  *               dealing with some very sensitive code; be careful!
  *
- * \since This macro is available since SDL 3.0.0.
+ * \since This macro is available since SDL 3.1.3.
  */
 #define SDL_CompilerBarrier() DoCompilerSpecificReadWriteBarrier()
 #elif defined(_MSC_VER) && (_MSC_VER > 1200) && !defined(__clang__)
@@ -189,7 +195,7 @@ extern __inline void SDL_CompilerBarrier(void);
  *               time, but if you find yourself needing this, you are probably
  *               dealing with some very sensitive code; be careful!
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  */
 extern SDL_DECLSPEC void SDLCALL SDL_MemoryBarrierReleaseFunction(void);
 
@@ -202,7 +208,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_MemoryBarrierReleaseFunction(void);
  *               time, but if you find yourself needing this, you are probably
  *               dealing with some very sensitive code; be careful!
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_MemoryBarrierReleaseFunction
  */
@@ -275,7 +281,7 @@ typedef void (*SDL_KernelMemoryBarrierFunc)();
  *
  * \threadsafety This macro is safe to use from any thread.
  *
- * \since This macro is available since SDL 3.0.0.
+ * \since This macro is available since SDL 3.1.3.
  */
 #define SDL_CPUPauseInstruction() DoACPUPauseInACompilerAndArchitectureSpecificWay
 #elif (defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__))
@@ -318,7 +324,7 @@ typedef void (*SDL_KernelMemoryBarrierFunc)();
  * This is a struct so people don't accidentally use numeric operations on it
  * directly. You have to use SDL atomic functions.
  *
- * \since This struct is available since SDL 3.0.0.
+ * \since This struct is available since SDL 3.1.3.
  *
  * \sa SDL_CompareAndSwapAtomicInt
  * \sa SDL_GetAtomicInt
@@ -340,7 +346,7 @@ typedef struct SDL_AtomicInt { int value; } SDL_AtomicInt;
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_GetAtomicInt
  * \sa SDL_SetAtomicInt
@@ -361,7 +367,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_CompareAndSwapAtomicInt(SDL_AtomicInt *a, i
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_GetAtomicInt
  */
@@ -378,7 +384,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_SetAtomicInt(SDL_AtomicInt *a, int v);
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_SetAtomicInt
  */
@@ -398,7 +404,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetAtomicInt(SDL_AtomicInt *a);
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_AtomicDecRef
  * \sa SDL_AtomicIncRef
@@ -415,7 +421,9 @@ extern SDL_DECLSPEC int SDLCALL SDL_AddAtomicInt(SDL_AtomicInt *a, int v);
  * \param a a pointer to an SDL_AtomicInt to increment.
  * \returns the previous value of the atomic variable.
  *
- * \since This macro is available since SDL 3.0.0.
+ * \threadsafety It is safe to call this macro from any thread.
+ *
+ * \since This macro is available since SDL 3.1.3.
  *
  * \sa SDL_AtomicDecRef
  */
@@ -433,7 +441,9 @@ extern SDL_DECLSPEC int SDLCALL SDL_AddAtomicInt(SDL_AtomicInt *a, int v);
  * \returns true if the variable reached zero after decrementing, false
  *          otherwise.
  *
- * \since This macro is available since SDL 3.0.0.
+ * \threadsafety It is safe to call this macro from any thread.
+ *
+ * \since This macro is available since SDL 3.1.3.
  *
  * \sa SDL_AtomicIncRef
  */
@@ -460,7 +470,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_AddAtomicInt(SDL_AtomicInt *a, int v);
  * This is a struct so people don't accidentally use numeric operations on it
  * directly. You have to use SDL atomic functions.
  *
- * \since This struct is available since SDL 3.0.0.
+ * \since This struct is available since SDL 3.1.3.
  *
  * \sa SDL_CompareAndSwapAtomicU32
  * \sa SDL_GetAtomicU32
@@ -482,7 +492,7 @@ typedef struct SDL_AtomicU32 { Uint32 value; } SDL_AtomicU32;
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_GetAtomicU32
  * \sa SDL_SetAtomicU32
@@ -503,7 +513,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_CompareAndSwapAtomicU32(SDL_AtomicU32 *a, U
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_GetAtomicU32
  */
@@ -520,7 +530,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_SetAtomicU32(SDL_AtomicU32 *a, Uint32 v);
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_SetAtomicU32
  */
@@ -539,7 +549,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_GetAtomicU32(SDL_AtomicU32 *a);
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_CompareAndSwapAtomicInt
  * \sa SDL_GetAtomicPointer
@@ -559,7 +569,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_CompareAndSwapAtomicPointer(void **a, void
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_CompareAndSwapAtomicPointer
  * \sa SDL_GetAtomicPointer
@@ -577,7 +587,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_SetAtomicPointer(void **a, void *v);
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_CompareAndSwapAtomicPointer
  * \sa SDL_SetAtomicPointer

+ 97 - 72
libs/SDL3/include/SDL3/SDL_audio.h

@@ -43,6 +43,29 @@
  * if you aren't reading from a file) as a basic means to load sound data into
  * your program.
  *
+ * ## Logical audio devices
+ *
+ * In SDL3, opening a physical device (like a SoundBlaster 16 Pro) gives you a
+ * logical device ID that you can bind audio streams to. In almost all cases,
+ * logical devices can be used anywhere in the API that a physical device is
+ * normally used. However, since each device opening generates a new logical
+ * device, different parts of the program (say, a VoIP library, or
+ * text-to-speech framework, or maybe some other sort of mixer on top of SDL)
+ * can have their own device opens that do not interfere with each other; each
+ * logical device will mix its separate audio down to a single buffer, fed to
+ * the physical device, behind the scenes. As many logical devices as you like
+ * can come and go; SDL will only have to open the physical device at the OS
+ * level once, and will manage all the logical devices on top of it
+ * internally.
+ *
+ * One other benefit of logical devices: if you don't open a specific physical
+ * device, instead opting for the default, SDL can automatically migrate those
+ * logical devices to different hardware as circumstances change: a user
+ * plugged in headphones? The system default changed? SDL can transparently
+ * migrate the logical devices to the correct physical device seamlessly and
+ * keep playing; the app doesn't even have to know it happened if it doesn't
+ * want to.
+ *
  * ## Channel layouts
  *
  * Audio data passing through SDL is uncompressed PCM data, interleaved. One
@@ -73,7 +96,7 @@
  * - 4 channels (quad) layout: FL, FR, BL, BR
  * - 5 channels (4.1) layout: FL, FR, LFE, BL, BR
  * - 6 channels (5.1) layout: FL, FR, FC, LFE, BL, BR (last two can also be
- *   BL, BR)
+ *   SL, SR)
  * - 7 channels (6.1) layout: FL, FR, FC, LFE, BC, SL, SR
  * - 8 channels (7.1) layout: FL, FR, FC, LFE, BL, BR, SL, SR
  *
@@ -113,7 +136,7 @@ extern "C" {
 /**
  * Audio format.
  *
- * \since This enum is available since SDL 3.0.0.
+ * \since This enum is available since SDL 3.1.3.
  *
  * \sa SDL_AUDIO_BITSIZE
  * \sa SDL_AUDIO_BYTESIZE
@@ -167,7 +190,7 @@ typedef enum SDL_AudioFormat
  *
  * \threadsafety It is safe to call this macro from any thread.
  *
- * \since This macro is available since SDL 3.0.0.
+ * \since This macro is available since SDL 3.1.3.
  */
 #define SDL_AUDIO_BITSIZE(x)         ((x) & SDL_AUDIO_MASK_BITSIZE)
 
@@ -181,7 +204,7 @@ typedef enum SDL_AudioFormat
  *
  * \threadsafety It is safe to call this macro from any thread.
  *
- * \since This macro is available since SDL 3.0.0.
+ * \since This macro is available since SDL 3.1.3.
  */
 #define SDL_AUDIO_BYTESIZE(x)        (SDL_AUDIO_BITSIZE(x) / 8)
 
@@ -195,7 +218,7 @@ typedef enum SDL_AudioFormat
  *
  * \threadsafety It is safe to call this macro from any thread.
  *
- * \since This macro is available since SDL 3.0.0.
+ * \since This macro is available since SDL 3.1.3.
  */
 #define SDL_AUDIO_ISFLOAT(x)         ((x) & SDL_AUDIO_MASK_FLOAT)
 
@@ -209,7 +232,7 @@ typedef enum SDL_AudioFormat
  *
  * \threadsafety It is safe to call this macro from any thread.
  *
- * \since This macro is available since SDL 3.0.0.
+ * \since This macro is available since SDL 3.1.3.
  */
 #define SDL_AUDIO_ISBIGENDIAN(x)     ((x) & SDL_AUDIO_MASK_BIG_ENDIAN)
 
@@ -223,7 +246,7 @@ typedef enum SDL_AudioFormat
  *
  * \threadsafety It is safe to call this macro from any thread.
  *
- * \since This macro is available since SDL 3.0.0.
+ * \since This macro is available since SDL 3.1.3.
  */
 #define SDL_AUDIO_ISLITTLEENDIAN(x)  (!SDL_AUDIO_ISBIGENDIAN(x))
 
@@ -237,7 +260,7 @@ typedef enum SDL_AudioFormat
  *
  * \threadsafety It is safe to call this macro from any thread.
  *
- * \since This macro is available since SDL 3.0.0.
+ * \since This macro is available since SDL 3.1.3.
  */
 #define SDL_AUDIO_ISSIGNED(x)        ((x) & SDL_AUDIO_MASK_SIGNED)
 
@@ -251,7 +274,7 @@ typedef enum SDL_AudioFormat
  *
  * \threadsafety It is safe to call this macro from any thread.
  *
- * \since This macro is available since SDL 3.0.0.
+ * \since This macro is available since SDL 3.1.3.
  */
 #define SDL_AUDIO_ISINT(x)           (!SDL_AUDIO_ISFLOAT(x))
 
@@ -265,7 +288,7 @@ typedef enum SDL_AudioFormat
  *
  * \threadsafety It is safe to call this macro from any thread.
  *
- * \since This macro is available since SDL 3.0.0.
+ * \since This macro is available since SDL 3.1.3.
  */
 #define SDL_AUDIO_ISUNSIGNED(x)      (!SDL_AUDIO_ISSIGNED(x))
 
@@ -275,7 +298,7 @@ typedef enum SDL_AudioFormat
  *
  * Zero is used to signify an invalid/null device.
  *
- * \since This datatype is available since SDL 3.0.0.
+ * \since This datatype is available since SDL 3.1.3.
  */
 typedef Uint32 SDL_AudioDeviceID;
 
@@ -286,7 +309,7 @@ typedef Uint32 SDL_AudioDeviceID;
  * to signify the app just wants the system to choose a default device instead
  * of the app providing a specific one.
  *
- * \since This macro is available since SDL 3.0.0.
+ * \since This macro is available since SDL 3.1.3.
  */
 #define SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK ((SDL_AudioDeviceID) 0xFFFFFFFFu)
 
@@ -297,14 +320,14 @@ typedef Uint32 SDL_AudioDeviceID;
  * to signify the app just wants the system to choose a default device instead
  * of the app providing a specific one.
  *
- * \since This macro is available since SDL 3.0.0.
+ * \since This macro is available since SDL 3.1.3.
  */
 #define SDL_AUDIO_DEVICE_DEFAULT_RECORDING ((SDL_AudioDeviceID) 0xFFFFFFFEu)
 
 /**
  * Format specifier for audio data.
  *
- * \since This struct is available since SDL 3.0.0.
+ * \since This struct is available since SDL 3.1.3.
  *
  * \sa SDL_AudioFormat
  */
@@ -326,7 +349,7 @@ typedef struct SDL_AudioSpec
  *
  * \threadsafety It is safe to call this macro from any thread.
  *
- * \since This macro is available since SDL 3.0.0.
+ * \since This macro is available since SDL 3.1.3.
  */
 #define SDL_AUDIO_FRAMESIZE(x) (SDL_AUDIO_BYTESIZE((x).format) * (x).channels)
 
@@ -350,7 +373,7 @@ typedef struct SDL_AudioSpec
  * more of them, bind them to an opened audio device, and feed data to them
  * (or for recording, consume data from them).
  *
- * \since This struct is available since SDL 3.0.0.
+ * \since This struct is available since SDL 3.1.3.
  *
  * \sa SDL_CreateAudioStream
  */
@@ -384,7 +407,7 @@ typedef struct SDL_AudioStream SDL_AudioStream;
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_GetAudioDriver
  */
@@ -408,7 +431,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumAudioDrivers(void);
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_GetNumAudioDrivers
  */
@@ -427,7 +450,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAudioDriver(int index);
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  */
 extern SDL_DECLSPEC const char * SDLCALL SDL_GetCurrentAudioDriver(void);
 
@@ -453,7 +476,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetCurrentAudioDriver(void);
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_OpenAudioDevice
  * \sa SDL_GetAudioRecordingDevices
@@ -482,7 +505,7 @@ extern SDL_DECLSPEC SDL_AudioDeviceID * SDLCALL SDL_GetAudioPlaybackDevices(int
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_OpenAudioDevice
  * \sa SDL_GetAudioPlaybackDevices
@@ -498,7 +521,7 @@ extern SDL_DECLSPEC SDL_AudioDeviceID * SDLCALL SDL_GetAudioRecordingDevices(int
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_GetAudioPlaybackDevices
  * \sa SDL_GetAudioRecordingDevices
@@ -537,7 +560,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAudioDeviceName(SDL_AudioDeviceI
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  */
 extern SDL_DECLSPEC bool SDLCALL SDL_GetAudioDeviceFormat(SDL_AudioDeviceID devid, SDL_AudioSpec *spec, int *sample_frames);
 
@@ -558,7 +581,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetAudioDeviceFormat(SDL_AudioDeviceID devi
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_SetAudioStreamInputChannelMap
  */
@@ -633,7 +656,7 @@ extern SDL_DECLSPEC int * SDLCALL SDL_GetAudioDeviceChannelMap(SDL_AudioDeviceID
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_CloseAudioDevice
  * \sa SDL_GetAudioDeviceFormat
@@ -664,7 +687,7 @@ extern SDL_DECLSPEC SDL_AudioDeviceID SDLCALL SDL_OpenAudioDevice(SDL_AudioDevic
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_ResumeAudioDevice
  * \sa SDL_AudioDevicePaused
@@ -692,7 +715,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_PauseAudioDevice(SDL_AudioDeviceID dev);
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_AudioDevicePaused
  * \sa SDL_PauseAudioDevice
@@ -714,7 +737,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ResumeAudioDevice(SDL_AudioDeviceID dev);
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_PauseAudioDevice
  * \sa SDL_ResumeAudioDevice
@@ -738,7 +761,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_AudioDevicePaused(SDL_AudioDeviceID dev);
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_SetAudioDeviceGain
  */
@@ -773,7 +796,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetAudioDeviceGain(SDL_AudioDeviceID devid
  * \threadsafety It is safe to call this function from any thread, as it holds
  *               a stream-specific mutex while running.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_GetAudioDeviceGain
  */
@@ -794,7 +817,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioDeviceGain(SDL_AudioDeviceID devid,
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_OpenAudioDevice
  */
@@ -829,7 +852,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_CloseAudioDevice(SDL_AudioDeviceID devid);
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_BindAudioStreams
  * \sa SDL_UnbindAudioStream
@@ -850,7 +873,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_BindAudioStreams(SDL_AudioDeviceID devid, S
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_BindAudioStreams
  * \sa SDL_UnbindAudioStream
@@ -872,7 +895,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_BindAudioStream(SDL_AudioDeviceID devid, SD
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_BindAudioStreams
  */
@@ -888,7 +911,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnbindAudioStreams(SDL_AudioStream **stream
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_BindAudioStream
  */
@@ -907,7 +930,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnbindAudioStream(SDL_AudioStream *stream);
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_BindAudioStream
  * \sa SDL_BindAudioStreams
@@ -924,7 +947,7 @@ extern SDL_DECLSPEC SDL_AudioDeviceID SDLCALL SDL_GetAudioStreamDevice(SDL_Audio
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_PutAudioStreamData
  * \sa SDL_GetAudioStreamData
@@ -943,7 +966,9 @@ extern SDL_DECLSPEC SDL_AudioStream * SDLCALL SDL_CreateAudioStream(const SDL_Au
  * \returns a valid property ID on success or 0 on failure; call
  *          SDL_GetError() for more information.
  *
- * \since This function is available since SDL 3.0.0.
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.1.3.
  */
 extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetAudioStreamProperties(SDL_AudioStream *stream);
 
@@ -959,7 +984,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetAudioStreamProperties(SDL_Au
  * \threadsafety It is safe to call this function from any thread, as it holds
  *               a stream-specific mutex while running.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_SetAudioStreamFormat
  */
@@ -989,7 +1014,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetAudioStreamFormat(SDL_AudioStream *strea
  * \threadsafety It is safe to call this function from any thread, as it holds
  *               a stream-specific mutex while running.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_GetAudioStreamFormat
  * \sa SDL_SetAudioStreamFrequencyRatio
@@ -1006,7 +1031,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamFormat(SDL_AudioStream *strea
  * \threadsafety It is safe to call this function from any thread, as it holds
  *               a stream-specific mutex while running.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_SetAudioStreamFrequencyRatio
  */
@@ -1033,7 +1058,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetAudioStreamFrequencyRatio(SDL_AudioStre
  * \threadsafety It is safe to call this function from any thread, as it holds
  *               a stream-specific mutex while running.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_GetAudioStreamFrequencyRatio
  * \sa SDL_SetAudioStreamFormat
@@ -1055,7 +1080,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamFrequencyRatio(SDL_AudioStrea
  * \threadsafety It is safe to call this function from any thread, as it holds
  *               a stream-specific mutex while running.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_SetAudioStreamGain
  */
@@ -1080,7 +1105,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetAudioStreamGain(SDL_AudioStream *stream
  * \threadsafety It is safe to call this function from any thread, as it holds
  *               a stream-specific mutex while running.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_GetAudioStreamGain
  */
@@ -1104,7 +1129,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamGain(SDL_AudioStream *stream,
  * \threadsafety It is safe to call this function from any thread, as it holds
  *               a stream-specific mutex while running.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_SetAudioStreamInputChannelMap
  */
@@ -1128,7 +1153,7 @@ extern SDL_DECLSPEC int * SDLCALL SDL_GetAudioStreamInputChannelMap(SDL_AudioStr
  * \threadsafety It is safe to call this function from any thread, as it holds
  *               a stream-specific mutex while running.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_SetAudioStreamInputChannelMap
  */
@@ -1179,7 +1204,7 @@ extern SDL_DECLSPEC int * SDLCALL SDL_GetAudioStreamOutputChannelMap(SDL_AudioSt
  *               stream's format to have a different number of channels from a
  *               a different thread at the same time, though!
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_SetAudioStreamInputChannelMap
  */
@@ -1226,7 +1251,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamInputChannelMap(SDL_AudioStre
  *               stream's format to have a different number of channels from a
  *               a different thread at the same time, though!
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_SetAudioStreamInputChannelMap
  */
@@ -1253,7 +1278,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamOutputChannelMap(SDL_AudioStr
  *               stream has a callback set, the caller might need to manage
  *               extra locking.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_ClearAudioStream
  * \sa SDL_FlushAudioStream
@@ -1284,7 +1309,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_PutAudioStreamData(SDL_AudioStream *stream,
  *               stream has a callback set, the caller might need to manage
  *               extra locking.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_ClearAudioStream
  * \sa SDL_GetAudioStreamAvailable
@@ -1311,7 +1336,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetAudioStreamData(SDL_AudioStream *stream,
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_GetAudioStreamData
  * \sa SDL_PutAudioStreamData
@@ -1350,7 +1375,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetAudioStreamAvailable(SDL_AudioStream *str
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_PutAudioStreamData
  * \sa SDL_ClearAudioStream
@@ -1372,7 +1397,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetAudioStreamQueued(SDL_AudioStream *stream
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_PutAudioStreamData
  */
@@ -1390,7 +1415,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_FlushAudioStream(SDL_AudioStream *stream);
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_GetAudioStreamAvailable
  * \sa SDL_GetAudioStreamData
@@ -1417,7 +1442,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ClearAudioStream(SDL_AudioStream *stream);
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_ResumeAudioStreamDevice
  */
@@ -1437,7 +1462,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_PauseAudioStreamDevice(SDL_AudioStream *str
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_PauseAudioStreamDevice
  */
@@ -1465,7 +1490,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ResumeAudioStreamDevice(SDL_AudioStream *st
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_UnlockAudioStream
  */
@@ -1484,7 +1509,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_LockAudioStream(SDL_AudioStream *stream);
  * \threadsafety You should only call this from the same thread that
  *               previously called SDL_LockAudioStream.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_LockAudioStream
  */
@@ -1525,7 +1550,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_UnlockAudioStream(SDL_AudioStream *stream);
  *               is called, so your callback does not need to manage the lock
  *               explicitly.
  *
- * \since This datatype is available since SDL 3.0.0.
+ * \since This datatype is available since SDL 3.1.3.
  *
  * \sa SDL_SetAudioStreamGetCallback
  * \sa SDL_SetAudioStreamPutCallback
@@ -1572,7 +1597,7 @@ typedef void (SDLCALL *SDL_AudioStreamCallback)(void *userdata, SDL_AudioStream
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_SetAudioStreamPutCallback
  */
@@ -1621,7 +1646,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamGetCallback(SDL_AudioStream *
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_SetAudioStreamGetCallback
  */
@@ -1643,7 +1668,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamPutCallback(SDL_AudioStream *
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_CreateAudioStream
  */
@@ -1705,7 +1730,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyAudioStream(SDL_AudioStream *stream)
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_GetAudioStreamDevice
  * \sa SDL_ResumeAudioStreamDevice
@@ -1743,7 +1768,7 @@ extern SDL_DECLSPEC SDL_AudioStream * SDLCALL SDL_OpenAudioDeviceStream(SDL_Audi
  *               application is responsible for locking resources the callback
  *               touches that need to be protected.
  *
- * \since This datatype is available since SDL 3.0.0.
+ * \since This datatype is available since SDL 3.1.3.
  *
  * \sa SDL_SetAudioPostmixCallback
  */
@@ -1799,7 +1824,7 @@ typedef void (SDLCALL *SDL_AudioPostmixCallback)(void *userdata, const SDL_Audio
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  */
 extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioPostmixCallback(SDL_AudioDeviceID devid, SDL_AudioPostmixCallback callback, void *userdata);
 
@@ -1845,7 +1870,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioPostmixCallback(SDL_AudioDeviceID d
  * Example:
  *
  * ```c
- * SDL_LoadWAV_IO(SDL_IOFromFile("sample.wav", "rb"), 1, &spec, &buf, &len);
+ * SDL_LoadWAV_IO(SDL_IOFromFile("sample.wav", "rb"), true, &spec, &buf, &len);
  * ```
  *
  * Note that the SDL_LoadWAV function does this same thing for you, but in a
@@ -1877,7 +1902,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioPostmixCallback(SDL_AudioDeviceID d
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_free
  * \sa SDL_LoadWAV
@@ -1913,7 +1938,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_LoadWAV_IO(SDL_IOStream *src, bool closeio,
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_free
  * \sa SDL_LoadWAV_IO
@@ -1952,7 +1977,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_LoadWAV(const char *path, SDL_AudioSpec *sp
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  */
 extern SDL_DECLSPEC bool SDLCALL SDL_MixAudio(Uint8 *dst, const Uint8 *src, SDL_AudioFormat format, Uint32 len, float volume);
 
@@ -1982,7 +2007,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_MixAudio(Uint8 *dst, const Uint8 *src, SDL_
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  */
 extern SDL_DECLSPEC bool SDLCALL SDL_ConvertAudioSamples(const SDL_AudioSpec *src_spec, const Uint8 *src_data, int src_len, const SDL_AudioSpec *dst_spec, Uint8 **dst_data, int *dst_len);
 
@@ -1995,7 +2020,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ConvertAudioSamples(const SDL_AudioSpec *sr
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  */
 extern SDL_DECLSPEC const char * SDLCALL SDL_GetAudioFormatName(SDL_AudioFormat format);
 
@@ -2011,7 +2036,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetAudioFormatName(SDL_AudioFormat
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  */
 extern SDL_DECLSPEC int SDLCALL SDL_GetSilenceValueForFormat(SDL_AudioFormat format);
 

+ 2 - 2
libs/SDL3/include/SDL3/SDL_bits.h

@@ -65,7 +65,7 @@ extern __inline int _SDL_bsr_watcom(Uint32);
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  */
 SDL_FORCE_INLINE int SDL_MostSignificantBitIndex32(Uint32 x)
 {
@@ -132,7 +132,7 @@ SDL_FORCE_INLINE int SDL_MostSignificantBitIndex32(Uint32 x)
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  */
 SDL_FORCE_INLINE bool SDL_HasExactlyOneBitSet32(Uint32 x)
 {

+ 6 - 4
libs/SDL3/include/SDL3/SDL_blendmode.h

@@ -45,7 +45,7 @@ extern "C" {
  *
  * Additional values may be obtained from SDL_ComposeCustomBlendMode.
  *
- * \since This datatype is available since SDL 3.0.0.
+ * \since This datatype is available since SDL 3.1.3.
  *
  * \sa SDL_ComposeCustomBlendMode
  */
@@ -64,7 +64,7 @@ typedef Uint32 SDL_BlendMode;
  * The blend operation used when combining source and destination pixel
  * components.
  *
- * \since This enum is available since SDL 3.0.0.
+ * \since This enum is available since SDL 3.1.3.
  */
 typedef enum SDL_BlendOperation
 {
@@ -83,7 +83,7 @@ typedef enum SDL_BlendOperation
  * operation. The comma-separated factors listed above are always applied in
  * the component order red, green, blue, and alpha.
  *
- * \since This enum is available since SDL 3.0.0.
+ * \since This enum is available since SDL 3.1.3.
  */
 typedef enum SDL_BlendFactor
 {
@@ -177,7 +177,9 @@ typedef enum SDL_BlendFactor
  * \returns an SDL_BlendMode that represents the chosen factors and
  *          operations.
  *
- * \since This function is available since SDL 3.0.0.
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_SetRenderDrawBlendMode
  * \sa SDL_GetRenderDrawBlendMode

+ 19 - 19
libs/SDL3/include/SDL3/SDL_camera.h

@@ -53,7 +53,7 @@ extern "C" {
  *
  * The value 0 is an invalid ID.
  *
- * \since This datatype is available since SDL 3.0.0.
+ * \since This datatype is available since SDL 3.1.3.
  *
  * \sa SDL_GetCameras
  */
@@ -62,7 +62,7 @@ typedef Uint32 SDL_CameraID;
 /**
  * The opaque structure used to identify an opened SDL camera.
  *
- * \since This struct is available since SDL 3.0.0.
+ * \since This struct is available since SDL 3.1.3.
  */
 typedef struct SDL_Camera SDL_Camera;
 
@@ -72,7 +72,7 @@ typedef struct SDL_Camera SDL_Camera;
  * Cameras often support multiple formats; each one will be encapsulated in
  * this struct.
  *
- * \since This struct is available since SDL 3.0.0.
+ * \since This struct is available since SDL 3.1.3.
  *
  * \sa SDL_GetCameraSupportedFormats
  * \sa SDL_GetCameraFormat
@@ -90,7 +90,7 @@ typedef struct SDL_CameraSpec
 /**
  * The position of camera in relation to system device.
  *
- * \since This enum is available since SDL 3.0.0.
+ * \since This enum is available since SDL 3.1.3.
  *
  * \sa SDL_GetCameraPosition
  */
@@ -119,7 +119,7 @@ typedef enum SDL_CameraPosition
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_GetCameraDriver
  */
@@ -143,7 +143,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumCameraDrivers(void);
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_GetNumCameraDrivers
  */
@@ -161,7 +161,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetCameraDriver(int index);
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  */
 extern SDL_DECLSPEC const char * SDLCALL SDL_GetCurrentCameraDriver(void);
 
@@ -176,7 +176,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetCurrentCameraDriver(void);
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_OpenCamera
  */
@@ -214,7 +214,7 @@ extern SDL_DECLSPEC SDL_CameraID * SDLCALL SDL_GetCameras(int *count);
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_GetCameras
  * \sa SDL_OpenCamera
@@ -230,7 +230,7 @@ extern SDL_DECLSPEC SDL_CameraSpec ** SDLCALL SDL_GetCameraSupportedFormats(SDL_
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_GetCameras
  */
@@ -249,7 +249,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetCameraName(SDL_CameraID instance
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_GetCameras
  */
@@ -295,7 +295,7 @@ extern SDL_DECLSPEC SDL_CameraPosition SDLCALL SDL_GetCameraPosition(SDL_CameraI
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_GetCameras
  * \sa SDL_GetCameraFormat
@@ -328,7 +328,7 @@ extern SDL_DECLSPEC SDL_Camera * SDLCALL SDL_OpenCamera(SDL_CameraID instance_id
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_OpenCamera
  * \sa SDL_CloseCamera
@@ -344,7 +344,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetCameraPermissionState(SDL_Camera *camera)
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_OpenCamera
  */
@@ -359,7 +359,7 @@ extern SDL_DECLSPEC SDL_CameraID SDLCALL SDL_GetCameraID(SDL_Camera *camera);
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  */
 extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetCameraProperties(SDL_Camera *camera);
 
@@ -383,7 +383,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetCameraProperties(SDL_Camera
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_OpenCamera
  */
@@ -426,7 +426,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetCameraFormat(SDL_Camera *camera, SDL_Cam
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_ReleaseCameraFrame
  */
@@ -454,7 +454,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_AcquireCameraFrame(SDL_Camera *cam
  *
  * \threadsafety It is safe to call this function from any thread.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_AcquireCameraFrame
  */
@@ -469,7 +469,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseCameraFrame(SDL_Camera *camera, SDL_
  * \threadsafety It is safe to call this function from any thread, but no
  *               thread may reference `device` once this function is called.
  *
- * \since This function is available since SDL 3.0.0.
+ * \since This function is available since SDL 3.1.3.
  *
  * \sa SDL_OpenCameraWithSpec
  * \sa SDL_OpenCamera

部分文件因为文件数量过多而无法显示