diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7e2367df..31b2ef36 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -8,7 +8,9 @@ set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
-set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
+if(NOT MINGW)
+ set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
+endif()
if(NOT WIN32 AND NOT CMAKE_CROSSCOMPILING)
message(FATAL_ERROR "This CMake build currently supports Windows only. For cross-compilation from Linux, use the clang-cl toolchain.")
diff --git a/CMakePresets.json b/CMakePresets.json
index cb08b959..f1c4167c 100644
--- a/CMakePresets.json
+++ b/CMakePresets.json
@@ -14,7 +14,8 @@
"cacheVariables": {
"PLATFORM_DEFINES": "_WINDOWS64",
"PLATFORM_NAME": "Windows64",
- "IGGY_LIBS": "iggy_w64.lib;iggyperfmon_w64.lib;iggyexpruntime_w64.lib"
+ "IGGY_LIBS": "iggy_w64.lib;iggyperfmon_w64.lib;iggyexpruntime_w64.lib",
+ "CMAKE_ASM_MASM_COMPILER": "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.16.27023/bin/HostX64/x64/ml64.exe"
}
}
],
diff --git a/Minecraft.Client/Assets/RmlUiAssets/HelpOptions.rcss b/Minecraft.Client/Assets/RmlUiAssets/HelpOptions.rcss
new file mode 100644
index 00000000..1a8e7ae6
--- /dev/null
+++ b/Minecraft.Client/Assets/RmlUiAssets/HelpOptions.rcss
@@ -0,0 +1,55 @@
+body
+{
+ width: 100%;
+ height: 100%;
+ font-family: Minecraft Default;
+ font-size: 14px;
+ color: #ffffff;
+ background: transparent;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+div#help_options_menu
+{
+ width: 624px;
+ height: auto;
+ margin: auto;
+ background: rgba(0, 0, 0, 0.65);
+ border-top: 2px solid #555555;
+ border-bottom: 2px solid #555555;
+ border-left: 2px solid #555555;
+ border-right: 2px solid #555555;
+ border-radius: 8px;
+ padding: 40px 48px;
+}
+
+div#buttons
+{
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+button
+{
+ display: block;
+ width: 524px;
+ height: 64px;
+ margin-bottom: 11px;
+ color: #ffffff;
+ font-size: 25px;
+ text-align: center;
+ line-height: 64px;
+ cursor: pointer;
+ border: none;
+ background: transparent;
+ decorator: image(images/Button_Background.png);
+}
+
+button:hover
+{
+ decorator: image(images/button_highlighted.png);
+}
diff --git a/Minecraft.Client/Assets/RmlUiAssets/HelpOptions.rml b/Minecraft.Client/Assets/RmlUiAssets/HelpOptions.rml
new file mode 100644
index 00000000..6156124d
--- /dev/null
+++ b/Minecraft.Client/Assets/RmlUiAssets/HelpOptions.rml
@@ -0,0 +1,17 @@
+
+
+ Help & Options
+
+
+
+
+
+
diff --git a/Minecraft.Client/Assets/RmlUiAssets/PauseMenu.rcss b/Minecraft.Client/Assets/RmlUiAssets/PauseMenu.rcss
new file mode 100644
index 00000000..8d539ef6
--- /dev/null
+++ b/Minecraft.Client/Assets/RmlUiAssets/PauseMenu.rcss
@@ -0,0 +1,158 @@
+body
+{
+ width: 100%;
+ height: 100%;
+ font-family: Minecraft Default;
+ font-size: 14px;
+ color: #ffffff;
+ background: transparent;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+div#pause_menu
+{
+ width: 624px;
+ height: auto;
+ margin: auto;
+ background: rgba(0, 0, 0, 0.65);
+ border-top: 2px solid #555555;
+ border-bottom: 2px solid #555555;
+ border-left: 2px solid #555555;
+ border-right: 2px solid #555555;
+ border-radius: 8px;
+ padding: 40px 48px;
+}
+
+div#buttons
+{
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+button
+{
+ display: block;
+ width: 524px;
+ height: 64px;
+ margin-bottom: 11px;
+ color: #ffffff;
+ font-size: 25px;
+ text-align: center;
+ line-height: 64px;
+ cursor: pointer;
+ border: none;
+ background: transparent;
+ decorator: image(images/Button_Background.png);
+}
+
+button:hover
+{
+ decorator: image(images/button_highlighted.png);
+}
+
+div#exit_dialog
+{
+ display: none;
+ width: 100%;
+ margin-top: 16px;
+ text-align: center;
+}
+
+p#exit_text
+{
+ font-size: 31px;
+ color: #ffffff;
+ margin-bottom: 23px;
+}
+
+div#exit_buttons
+{
+ width: 100%;
+ display: flex;
+ justify-content: center;
+ gap: 10px;
+ flex-wrap: wrap;
+}
+
+button#exit_save,
+button#exit_nosave,
+button#exit_cancel
+{
+ display: inline-block;
+ width: auto;
+ min-width: 233px;
+ height: 58px;
+ margin: 0;
+ padding-left: 29px;
+ padding-right: 29px;
+ color: #ffffff;
+ font-size: 22px;
+ text-align: center;
+ line-height: 58px;
+ cursor: pointer;
+ border: none;
+ background: transparent;
+ decorator: image(images/Button_Background2.png);
+}
+
+button#exit_save:hover,
+button#exit_nosave:hover,
+button#exit_cancel:hover
+{
+ decorator: image(images/button_highlighted.png);
+}
+
+div#save_dialog
+{
+ display: none;
+ width: 100%;
+ margin-top: 16px;
+ text-align: center;
+}
+
+p#save_text
+{
+ font-size: 31px;
+ color: #ffffff;
+ margin-bottom: 23px;
+}
+
+div#save_buttons
+{
+ width: 100%;
+ display: flex;
+ justify-content: center;
+ gap: 10px;
+}
+
+button#save_cancel,
+button#save_confirm
+{
+ display: inline-block;
+ width: auto;
+ min-width: 204px;
+ height: 58px;
+ margin: 0;
+ padding-left: 29px;
+ padding-right: 29px;
+ color: #ffffff;
+ font-size: 22px;
+ text-align: center;
+ line-height: 58px;
+ cursor: pointer;
+ border: none;
+ background: transparent;
+ decorator: image(images/Button_Background2.png);
+}
+
+button#save_cancel:hover,
+button#save_confirm:hover
+{
+ decorator: image(images/button_highlighted.png);
+}
+
+
diff --git a/Minecraft.Client/Assets/RmlUiAssets/PauseMenu.rml b/Minecraft.Client/Assets/RmlUiAssets/PauseMenu.rml
new file mode 100644
index 00000000..97610aa2
--- /dev/null
+++ b/Minecraft.Client/Assets/RmlUiAssets/PauseMenu.rml
@@ -0,0 +1,32 @@
+
+
+ Pause Menu
+
+
+
+
+
+
diff --git a/Minecraft.Client/Assets/RmlUiAssets/SettingsMenu.rcss b/Minecraft.Client/Assets/RmlUiAssets/SettingsMenu.rcss
new file mode 100644
index 00000000..911340ea
--- /dev/null
+++ b/Minecraft.Client/Assets/RmlUiAssets/SettingsMenu.rcss
@@ -0,0 +1,104 @@
+body
+{
+ width: 100%;
+ height: 100%;
+ font-family: Minecraft Default;
+ font-size: 14px;
+ color: #ffffff;
+ background: transparent;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+div#settings_menu
+{
+ width: 624px;
+ height: auto;
+ margin: auto;
+ background: rgba(0, 0, 0, 0.65);
+ border-top: 2px solid #555555;
+ border-bottom: 2px solid #555555;
+ border-left: 2px solid #555555;
+ border-right: 2px solid #555555;
+ border-radius: 8px;
+ padding: 40px 48px;
+}
+
+div#buttons
+{
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+button
+{
+ display: block;
+ width: 524px;
+ height: 64px;
+ margin-bottom: 11px;
+ color: #ffffff;
+ font-size: 25px;
+ text-align: center;
+ line-height: 64px;
+ cursor: pointer;
+ border: none;
+ background: transparent;
+ decorator: image(images/Button_Background.png);
+}
+
+button:hover
+{
+ decorator: image(images/button_highlighted.png);
+}
+
+div#confirm_dialog
+{
+ display: none;
+ width: 100%;
+ margin-top: 16px;
+ text-align: center;
+}
+
+p#confirm_text
+{
+ font-size: 31px;
+ color: #ffffff;
+ margin-bottom: 23px;
+}
+
+div#confirm_buttons
+{
+ width: 100%;
+ display: flex;
+ justify-content: center;
+ gap: 10px;
+}
+
+button#confirm_no,
+button#confirm_yes
+{
+ display: inline-block;
+ width: auto;
+ min-width: 204px;
+ height: 58px;
+ margin: 0;
+ padding-left: 29px;
+ padding-right: 29px;
+ color: #ffffff;
+ font-size: 22px;
+ text-align: center;
+ line-height: 58px;
+ cursor: pointer;
+ border: none;
+ background: transparent;
+ decorator: image(images/Button_Background2.png);
+}
+
+button#confirm_no:hover,
+button#confirm_yes:hover
+{
+ decorator: image(images/button_highlighted.png);
+}
diff --git a/Minecraft.Client/Assets/RmlUiAssets/SettingsMenu.rml b/Minecraft.Client/Assets/RmlUiAssets/SettingsMenu.rml
new file mode 100644
index 00000000..37b86491
--- /dev/null
+++ b/Minecraft.Client/Assets/RmlUiAssets/SettingsMenu.rml
@@ -0,0 +1,25 @@
+
+
+ Settings
+
+
+
+
+
+
diff --git a/Minecraft.Client/Assets/RmlUiAssets/fonts/MinecraftTen.ttf b/Minecraft.Client/Assets/RmlUiAssets/fonts/MinecraftTen.ttf
new file mode 100644
index 00000000..4cd602f8
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/fonts/MinecraftTen.ttf differ
diff --git a/Minecraft.Client/Assets/RmlUiAssets/fonts/Mojangles.ttf b/Minecraft.Client/Assets/RmlUiAssets/fonts/Mojangles.ttf
new file mode 100644
index 00000000..7f3d0dcf
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/fonts/Mojangles.ttf differ
diff --git a/Minecraft.Client/Assets/RmlUiAssets/fonts/chars.txt b/Minecraft.Client/Assets/RmlUiAssets/fonts/chars.txt
new file mode 100644
index 00000000..f7ba12ae
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/fonts/chars.txt differ
diff --git a/Minecraft.Client/Assets/RmlUiAssets/images/AdventureIcon.png b/Minecraft.Client/Assets/RmlUiAssets/images/AdventureIcon.png
new file mode 100644
index 00000000..60d306fe
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/images/AdventureIcon.png differ
diff --git a/Minecraft.Client/Assets/RmlUiAssets/images/Button_Background.png b/Minecraft.Client/Assets/RmlUiAssets/images/Button_Background.png
new file mode 100644
index 00000000..28a3269f
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/images/Button_Background.png differ
diff --git a/Minecraft.Client/Assets/RmlUiAssets/images/Button_Background2.png b/Minecraft.Client/Assets/RmlUiAssets/images/Button_Background2.png
new file mode 100644
index 00000000..2bfa4f49
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/images/Button_Background2.png differ
diff --git a/Minecraft.Client/Assets/RmlUiAssets/images/Button_Square.png b/Minecraft.Client/Assets/RmlUiAssets/images/Button_Square.png
new file mode 100644
index 00000000..08433912
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/images/Button_Square.png differ
diff --git a/Minecraft.Client/Assets/RmlUiAssets/images/Button_Square_Highlighted.png b/Minecraft.Client/Assets/RmlUiAssets/images/Button_Square_Highlighted.png
new file mode 100644
index 00000000..c3620fe3
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/images/Button_Square_Highlighted.png differ
diff --git a/Minecraft.Client/Assets/RmlUiAssets/images/Change_Skin_Icon.png b/Minecraft.Client/Assets/RmlUiAssets/images/Change_Skin_Icon.png
new file mode 100644
index 00000000..62d5012f
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/images/Change_Skin_Icon.png differ
diff --git a/Minecraft.Client/Assets/RmlUiAssets/images/CreateWorldIcon.png b/Minecraft.Client/Assets/RmlUiAssets/images/CreateWorldIcon.png
new file mode 100644
index 00000000..7debd644
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/images/CreateWorldIcon.png differ
diff --git a/Minecraft.Client/Assets/RmlUiAssets/images/CreativeIcon.png b/Minecraft.Client/Assets/RmlUiAssets/images/CreativeIcon.png
new file mode 100644
index 00000000..2ef0df6d
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/images/CreativeIcon.png differ
diff --git a/Minecraft.Client/Assets/RmlUiAssets/images/ModIcon.png b/Minecraft.Client/Assets/RmlUiAssets/images/ModIcon.png
new file mode 100644
index 00000000..517b4304
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/images/ModIcon.png differ
diff --git a/Minecraft.Client/Assets/RmlUiAssets/images/OriginalLogo.png b/Minecraft.Client/Assets/RmlUiAssets/images/OriginalLogo.png
new file mode 100644
index 00000000..eacf7a03
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/images/OriginalLogo.png differ
diff --git a/Minecraft.Client/Assets/RmlUiAssets/images/SaveChest.png b/Minecraft.Client/Assets/RmlUiAssets/images/SaveChest.png
new file mode 100644
index 00000000..04e46ee9
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/images/SaveChest.png differ
diff --git a/Minecraft.Client/Assets/RmlUiAssets/images/SliderHandlerBackground.png b/Minecraft.Client/Assets/RmlUiAssets/images/SliderHandlerBackground.png
new file mode 100644
index 00000000..9b113b61
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/images/SliderHandlerBackground.png differ
diff --git a/Minecraft.Client/Assets/RmlUiAssets/images/Slider_Handle.png b/Minecraft.Client/Assets/RmlUiAssets/images/Slider_Handle.png
new file mode 100644
index 00000000..acfd1fe8
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/images/Slider_Handle.png differ
diff --git a/Minecraft.Client/Assets/RmlUiAssets/images/SurvivalIcon.png b/Minecraft.Client/Assets/RmlUiAssets/images/SurvivalIcon.png
new file mode 100644
index 00000000..6d045a6e
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/images/SurvivalIcon.png differ
diff --git a/Minecraft.Client/Assets/RmlUiAssets/images/Toggle_Switch_Off.png b/Minecraft.Client/Assets/RmlUiAssets/images/Toggle_Switch_Off.png
new file mode 100644
index 00000000..f47fc6f3
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/images/Toggle_Switch_Off.png differ
diff --git a/Minecraft.Client/Assets/RmlUiAssets/images/Toggle_Switch_On.png b/Minecraft.Client/Assets/RmlUiAssets/images/Toggle_Switch_On.png
new file mode 100644
index 00000000..64a7ea2d
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/images/Toggle_Switch_On.png differ
diff --git a/Minecraft.Client/Assets/RmlUiAssets/images/Trash_Bin_Icon.png b/Minecraft.Client/Assets/RmlUiAssets/images/Trash_Bin_Icon.png
new file mode 100644
index 00000000..543d8917
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/images/Trash_Bin_Icon.png differ
diff --git a/Minecraft.Client/Assets/RmlUiAssets/images/button_highlighted.png b/Minecraft.Client/Assets/RmlUiAssets/images/button_highlighted.png
new file mode 100644
index 00000000..af20c131
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/images/button_highlighted.png differ
diff --git a/Minecraft.Client/Assets/RmlUiAssets/images/down_icon.png b/Minecraft.Client/Assets/RmlUiAssets/images/down_icon.png
new file mode 100644
index 00000000..4d52c5fa
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/images/down_icon.png differ
diff --git a/Minecraft.Client/Assets/RmlUiAssets/images/frame_background.png b/Minecraft.Client/Assets/RmlUiAssets/images/frame_background.png
new file mode 100644
index 00000000..d6dae3f3
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/images/frame_background.png differ
diff --git a/Minecraft.Client/Assets/RmlUiAssets/images/lceheadwer.png b/Minecraft.Client/Assets/RmlUiAssets/images/lceheadwer.png
new file mode 100644
index 00000000..abf38ba0
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/images/lceheadwer.png differ
diff --git a/Minecraft.Client/Assets/RmlUiAssets/images/up_icon.png b/Minecraft.Client/Assets/RmlUiAssets/images/up_icon.png
new file mode 100644
index 00000000..b119bcd2
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/images/up_icon.png differ
diff --git a/Minecraft.Client/Assets/RmlUiAssets/panorama/Background_Day.png b/Minecraft.Client/Assets/RmlUiAssets/panorama/Background_Day.png
new file mode 100644
index 00000000..c680c099
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/panorama/Background_Day.png differ
diff --git a/Minecraft.Client/Assets/RmlUiAssets/panorama/Background_Night.png b/Minecraft.Client/Assets/RmlUiAssets/panorama/Background_Night.png
new file mode 100644
index 00000000..b915b51a
Binary files /dev/null and b/Minecraft.Client/Assets/RmlUiAssets/panorama/Background_Night.png differ
diff --git a/Minecraft.Client/CMakeLists.txt b/Minecraft.Client/CMakeLists.txt
index 27885cd6..bdcea8f7 100644
--- a/Minecraft.Client/CMakeLists.txt
+++ b/Minecraft.Client/CMakeLists.txt
@@ -20,8 +20,7 @@ if(PLATFORM_NAME STREQUAL "Windows64")
set_target_properties(Minecraft.Client PROPERTIES WIN32_EXECUTABLE TRUE)
endif()
-target_include_directories(Minecraft.Client
- PRIVATE
+target_include_directories(Minecraft.Client PRIVATE
"${CMAKE_BINARY_DIR}/generated/" # This is for the generated BuildVer.h
"${CMAKE_CURRENT_SOURCE_DIR}"
"${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/Iggy/inc"
@@ -29,6 +28,73 @@ target_include_directories(Minecraft.Client
"${CMAKE_CURRENT_SOURCE_DIR}/Common/Libs/zlib/inc"
"${CMAKE_SOURCE_DIR}/include/"
)
+
+if(PLATFORM_NAME STREQUAL "Windows64")
+ target_include_directories(Minecraft.Client PRIVATE
+ "${CMAKE_CURRENT_SOURCE_DIR}/Windows64"
+ "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/4JLibs/inc"
+ "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/4JLibs/impls/Windows_Libs/Render/vendor"
+ "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/4JLibs/impls/Windows_Libs/Render/vendor/DirectXMath"
+ "${CMAKE_SOURCE_DIR}/Minecraft.World/x64headers"
+ )
+
+ # Build RmlUi as a static library (skip samples, tests, backends)
+ set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
+
+ # Download FreeType for RmlUi font engine
+ include(FetchContent)
+ set(CMAKE_POLICY_VERSION_MINIMUM 3.5)
+ set(FT_DISABLE_ZLIB ON CACHE BOOL "" FORCE)
+ set(FT_DISABLE_BZIP2 ON CACHE BOOL "" FORCE)
+ set(FT_DISABLE_PNG ON CACHE BOOL "" FORCE)
+ set(FT_DISABLE_HARFBUZZ ON CACHE BOOL "" FORCE)
+ set(FT_DISABLE_BROTLI ON CACHE BOOL "" FORCE)
+ FetchContent_Declare(
+ freetype
+ GIT_REPOSITORY https://gitlab.freedesktop.org/freetype/freetype.git
+ GIT_TAG VER-2-13-2
+ GIT_SHALLOW TRUE
+ )
+ FetchContent_MakeAvailable(freetype)
+ if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND MINGW)
+ target_compile_definitions(freetype PRIVATE _INC_SETJMPEX)
+ endif()
+ if(TARGET freetype-interface AND NOT TARGET Freetype::Freetype)
+ add_library(Freetype::Freetype ALIAS freetype-interface)
+ endif()
+ set(RMLUI_SAMPLES OFF CACHE BOOL "" FORCE)
+ set(RMLUI_TESTS OFF CACHE BOOL "" FORCE)
+ set(RMLUI_LUA_BINDINGS OFF CACHE BOOL "" FORCE)
+ set(RMLUI_LOTTIE_PLUGIN OFF CACHE BOOL "" FORCE)
+ set(RMLUI_SVG_PLUGIN OFF CACHE BOOL "" FORCE)
+ set(RMLUI_FONT_ENGINE "freetype" CACHE STRING "" FORCE)
+ set(CMAKE_DISABLE_FIND_PACKAGE_Freetype ON CACHE BOOL "" FORCE)
+ add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/RmlUi" "${CMAKE_BINARY_DIR}/rmlui")
+ target_link_libraries(Minecraft.Client PRIVATE rmlui)
+
+ # Add RmlUi include path only to files that include RmlUi headers,
+ # not to the whole target (avoids PCH macro conflicts with windows.h).
+ set(RMLUI_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/RmlUi/Include")
+ set(_RMLUI_SOURCES
+ "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HelpAndOptionsMenu.cpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HelpAndOptionsMenu.h"
+ "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_PauseMenu.cpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_PauseMenu.h"
+ "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsMenu.cpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsMenu.h"
+ "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SkinSelectMenu.cpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SkinSelectMenu.h"
+ "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/RmlUi_Renderer_D3D11.cpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/RmlUi_Renderer_D3D11.h"
+ "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/RmlUi_SystemInterface_Win64.cpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/RmlUi_SystemInterface_Win64.h"
+ "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/RmlUi_FileInterface.cpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/RmlUi_FileInterface.h"
+ "${CMAKE_CURRENT_SOURCE_DIR}/RmlManager.cpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/RmlManager.h"
+ )
+ set_property(SOURCE ${_RMLUI_SOURCES} APPEND PROPERTY INCLUDE_DIRECTORIES "${RMLUI_INCLUDE_DIR}")
+endif()
target_compile_definitions(Minecraft.Client PRIVATE
${MINECRAFT_SHARED_DEFINES}
)
@@ -46,33 +112,28 @@ target_link_libraries(Minecraft.Client PRIVATE
Minecraft.World
d3d11
d3dcompiler
+ ws2_32
+ $<$:legacy_stdio_definitions>
+ # Allow our override of CRT internal symbols (__acrt_iob_func) to take priority
+ $<$>:-Wl,--allow-multiple-definition>
+ # Group libs with circular deps so linker rescan resolves all symbols
+ $<$>:-Wl,--start-group>
XInput9_1_0
- wsock32
- legacy_stdio_definitions
$<$:
# Debug 4J libraries
- "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/4JLibs/libs/4J_Input_d.lib"
- "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/4JLibs/libs/4J_Storage_d.lib"
- "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/4JLibs/libs/4J_Render_PC_d.lib"
- # Debug Discord libraries
- "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/Discord/libs/discord-rpc_d.lib"
- # Debug ZSTD libraries
- "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/zstd/libs/libzstd_static.lib"
- # Debug ZLIB libraries
- "${CMAKE_CURRENT_SOURCE_DIR}/Common/Libs/zlib/libs/zlibstatic.lib"
+ "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/4JLibs/libs/Debug/4J_Input_d.a"
+ "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/4JLibs/libs/Debug/4J_Storage_d.a"
+ "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/4JLibs/libs/Debug/4J_Render_PC_d.a"
>
$<$>:
# Release 4J libraries
- "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/4JLibs/libs/4J_Input.lib"
- "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/4JLibs/libs/4J_Storage.lib"
- "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/4JLibs/libs/4J_Render_PC.lib"
- # Release Discord libraries
- "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/Discord/libs/discord-rpc.lib"
- # Release ZSTD libraries
- "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/zstd/libs/libzstd_static.lib"
- # Release ZLIB libraries
- "${CMAKE_CURRENT_SOURCE_DIR}/Common/Libs/zlib/libs/zlibstatic.lib"
+ "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/4JLibs/libs/Release/4J_Input.a"
+ "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/4JLibs/libs/Release/4J_Storage.a"
+ "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Libs/4JLibs/libs/Release/4J_Render_PC.a"
>
+ $<$>:z>
+ $<$>:zstd>
+ $<$>:-Wl,--end-group>
)
# Iggy libs
diff --git a/Minecraft.Client/Common/Consoles_App.h b/Minecraft.Client/Common/Consoles_App.h
index ced6b2a3..54d1f46b 100644
--- a/Minecraft.Client/Common/Consoles_App.h
+++ b/Minecraft.Client/Common/Consoles_App.h
@@ -875,6 +875,7 @@ private:
bool m_bResetNether;
+ wstring m_currentSaveFolderName; // 4J Added: for hardcore world deletion on Win64
DWORD m_dwRequiredTexturePackID;
#ifdef _XBOX_ONE
vector m_vTMSPPData;
@@ -889,6 +890,11 @@ private:
#endif
+ // 4J Added - for hardcore world deletion on Win64
+public:
+ void SetCurrentSaveFolderName(const wstring& name) { m_currentSaveFolderName = name; }
+ const wstring& GetCurrentSaveFolderName() const { return m_currentSaveFolderName; }
+
// 4J-PB - language and locale functions
public:
diff --git a/Minecraft.Client/Common/UI/IUIScene_PauseMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_PauseMenu.cpp
index 01ee6c59..a56d6bba 100644
--- a/Minecraft.Client/Common/UI/IUIScene_PauseMenu.cpp
+++ b/Minecraft.Client/Common/UI/IUIScene_PauseMenu.cpp
@@ -1,17 +1,19 @@
+#include "stdafx.h"
#include "IUIScene_PauseMenu.h"
-#include "..\..\Minecraft.h"
-#include "..\..\MinecraftServer.h"
-#include "..\..\MultiPlayerLevel.h"
-#include "..\..\ProgressRenderer.h"
-#include "..\..\..\Minecraft.World\net.minecraft.world.level.h"
-#include "..\..\..\Minecraft.World\net.minecraft.world.phys.h"
-#include "..\..\TexturePackRepository.h"
-#include "..\..\TexturePack.h"
-#include "..\..\DLCTexturePack.h"
-#include "..\..\..\Minecraft.World\StringHelpers.h"
+#include "../../Minecraft.h"
+#include "../../MinecraftServer.h"
+#include "../../MultiPlayerLevel.h"
+#include "../../ProgressRenderer.h"
+#include "../../../Minecraft.World/net.minecraft.world.level.h"
+#include "../../../Minecraft.World/net.minecraft.world.phys.h"
+#include "../../TexturePackRepository.h"
+#include "../../TexturePack.h"
+#include "../../../Minecraft.World/StringHelpers.h"
+#ifndef _XBOX
#include "UI.h"
-#include "../DLC/DLCPack.h"
+#endif
+
int IUIScene_PauseMenu::ExitGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result)
{
@@ -40,43 +42,14 @@ int IUIScene_PauseMenu::ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStor
#endif
// Exit with or without saving
- // Decline means save in this dialog
- if(result==C4JStorage::EMessage_ResultDecline || result==C4JStorage::EMessage_ResultThirdOption)
+ if(result==C4JStorage::EMessage_ResultAccept || result==C4JStorage::EMessage_ResultDecline || result==C4JStorage::EMessage_ResultThirdOption)
{
+ if( result==C4JStorage::EMessage_ResultAccept ) // Cancel
+ {
+ return 0;
+ }
if( result==C4JStorage::EMessage_ResultDecline ) // Save
{
- // 4J-PB - Is the player trying to save but they are using a trial texturepack ?
- if(!Minecraft::GetInstance()->skins->isUsingDefaultSkin())
- {
- TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected();
- DLCTexturePack *pDLCTexPack=static_cast(tPack);
-
- DLCPack *pDLCPack=pDLCTexPack->getDLCInfoParentPack();//tPack->getDLCPack();
- if(!pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" ))
- {
-#ifdef _XBOX
- // upsell
- ULONGLONG ullOfferID_Full;
- // get the dlc texture pack
- DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack;
-
- app.GetDLCFullOfferIDForPackID(pDLCTexPack->getDLCParentPackId(),&ullOfferID_Full);
-
- // tell sentient about the upsell of the full version of the skin pack
- TelemetryManager->RecordUpsellPresented(iPad, eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF);
-#endif
-
- UINT uiIDA[2];
- uiIDA[0]=IDS_CONFIRM_OK;
- uiIDA[1]=IDS_CONFIRM_CANCEL;
-
- // Give the player a warning about the trial version of the texture pack
- //ui.RequestAlertMessage(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad() , &IUIScene_PauseMenu::WarningTrialTexturePackReturned, pParam);
-
- return S_OK;
- }
- }
-
// does the save exist?
bool bSaveExists;
StorageManager.DoesSaveExist(&bSaveExists);
@@ -98,7 +71,7 @@ int IUIScene_PauseMenu::ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStor
MinecraftServer::getInstance()->setSaveOnExit( true );
}
}
- else
+ else // EMessage_ResultThirdOption - Don't Save
{
// been a few requests for a confirm on exit without saving
UINT uiIDA[2];
@@ -212,141 +185,6 @@ int IUIScene_PauseMenu::ExitGameDeclineSaveReturned(void *pParam,int iPad,C4JSto
-int IUIScene_PauseMenu::WarningTrialTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result)
-{
-#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__)
- if(result==C4JStorage::EMessage_ResultAccept)
- {
- if(!ProfileManager.IsSignedInLive(iPad))
- {
- // you're not signed in to PSN!
-
- }
- else
- {
- // 4J-PB - need to check this user can access the store
- bool bContentRestricted;
- ProfileManager.GetChatAndContentRestrictions(iPad,true,nullptr,&bContentRestricted,nullptr);
- if(bContentRestricted)
- {
- UINT uiIDA[1];
- uiIDA[0]=IDS_CONFIRM_OK;
- ui.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad);
- }
- else
- {
- // need to get info on the pack to see if the user has already downloaded it
- TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected();
- DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack;
-
- // retrieve the store name for the skin pack
- DLCPack *pDLCPack=pDLCTexPack->getDLCInfoParentPack();//tPack->getDLCPack();
- const char *pchPackName=wstringtofilename(pDLCPack->getName());
- app.DebugPrintf("Texture Pack - %s\n",pchPackName);
- SONYDLC *pSONYDLCInfo=app.GetSONYDLCInfo((char *)pchPackName);
-
- if(pSONYDLCInfo!=nullptr)
- {
- char chName[42];
- char chSkuID[SCE_NP_COMMERCE2_SKU_ID_LEN];
-
- memset(chSkuID,0,SCE_NP_COMMERCE2_SKU_ID_LEN);
- // find the info on the skin pack
- // we have to retrieve the skuid from the store info, it can't be hardcoded since Sony may change it.
- // So we assume the first sku for the product is the one we want
-#ifdef __ORBIS__
- sprintf(chName,"%s",pSONYDLCInfo->chDLCKeyname);
-#else
- sprintf(chName,"%s-%s",app.GetCommerceCategory(),pSONYDLCInfo->chDLCKeyname);
-#endif
- app.GetDLCSkuIDFromProductList(chName,chSkuID);
- // 4J-PB - need to check for an empty store
-#if defined __ORBIS__ || defined __PSVITA__ || defined __PS3__
- if(app.CheckForEmptyStore(iPad)==false)
-#endif
- {
- if(app.DLCAlreadyPurchased(chSkuID))
- {
- app.DownloadAlreadyPurchased(chSkuID);
- }
- else
- {
- app.Checkout(chSkuID);
- }
- }
- }
- }
- }
- }
-#endif //
-
-#ifdef _XBOX_ONE
- IUIScene_PauseMenu* pScene = (IUIScene_PauseMenu*)pParam;
-
- if(result==C4JStorage::EMessage_ResultAccept)
- {
- if(ProfileManager.IsSignedIn(iPad))
- {
- if (ProfileManager.IsSignedInLive(iPad))
- {
- TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected();
- // get the dlc texture pack
- DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack;
-
- DLCPack *pDLCPack=pDLCTexPack->getDLCInfoParentPack();
-
- DLC_INFO *pDLCInfo=app.GetDLCInfoForProductName((WCHAR *)pDLCPack->getName().c_str());
-
- StorageManager.InstallOffer(1,(WCHAR *)pDLCInfo->wsProductId.c_str(),nullptr,nullptr);
-
- // the license change coming in when the offer has been installed will cause this scene to refresh
- }
- else
- {
- // 4J-JEV: Fix for XB1: #165863 - XR-074: Compliance: With no active network connection user is unable to convert from Trial to Full texture pack and is not messaged why.
- UINT uiIDA[1] = { IDS_CONFIRM_OK };
- ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad);
- }
- }
- }
-
-#endif
-
-#ifdef _XBOX
- IUIScene_PauseMenu* pScene = (IUIScene_PauseMenu*)pParam;
-
- //pScene->m_bIgnoreInput = false;
- pScene->ShowScene( true );
- if(result==C4JStorage::EMessage_ResultAccept)
- {
- if(ProfileManager.IsSignedIn(iPad))
- {
- ULONGLONG ullIndexA[1];
-
- TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected();
- // get the dlc texture pack
- DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack;
-
- // Need to get the parent packs id, since this may be one of many child packs with their own ids
- app.GetDLCFullOfferIDForPackID(pDLCTexPack->getDLCParentPackId(),&ullIndexA[0]);
-
- // need to allow downloads here, or the player would need to quit the game to let the download of a texture pack happen. This might affect the network traffic, since the download could take all the bandwidth...
- XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW);
-
- StorageManager.InstallOffer(1,ullIndexA,nullptr,nullptr);
- }
- }
- else
- {
- TelemetryManager->RecordUpsellResponded(iPad, eSet_UpsellID_Texture_DLC, ( pScene->m_pDLCPack->getPurchaseOfferId() & 0xFFFFFFFF ), eSen_UpsellOutcome_Declined);
- }
-#endif
-
-
- return 0;
-}
-
-
int IUIScene_PauseMenu::SaveWorldThreadProc( LPVOID lpParameter )
{
bool bAutosave=static_cast(lpParameter);
@@ -407,11 +245,73 @@ int IUIScene_PauseMenu::ExitWorldThreadProc( void* lpParameter )
return S_OK;
}
+#ifdef _WINDOWS64
+static bool Win64_DeleteSaveDirectory(const wchar_t* wPath)
+{
+ wchar_t wSearch[MAX_PATH];
+ swprintf_s(wSearch, MAX_PATH, L"%s\\*", wPath);
+ WIN32_FIND_DATAW fd;
+ HANDLE hFind = FindFirstFileW(wSearch, &fd);
+ if (hFind != INVALID_HANDLE_VALUE)
+ {
+ do
+ {
+ if (wcscmp(fd.cFileName, L".") == 0 || wcscmp(fd.cFileName, L"..") == 0) continue;
+ wchar_t wChild[MAX_PATH];
+ swprintf_s(wChild, MAX_PATH, L"%s\\%s", wPath, fd.cFileName);
+ if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ Win64_DeleteSaveDirectory(wChild);
+ else
+ DeleteFileW(wChild);
+ } while (FindNextFileW(hFind, &fd));
+ FindClose(hFind);
+ }
+ return RemoveDirectoryW(wPath) != 0;
+}
+#endif // _WINDOWS64
+
// This function performs the meat of exiting from a level. It should be called from a thread other than the main thread.
void IUIScene_PauseMenu::_ExitWorld(LPVOID lpParameter)
{
+#ifndef MINECRAFT_SERVER_BUILD
Minecraft *pMinecraft=Minecraft::GetInstance();
+ // 4J Added: Capture hardcore delete info before the server is destroyed
+#ifdef _WINDOWS64
+ bool shouldDeleteHardcoreWorld = false;
+ wstring hardcoreSaveFolderName;
+ if (MinecraftServer::getInstance() != nullptr && MinecraftServer::getInstance()->getDeleteWorldOnExit())
+ {
+ shouldDeleteHardcoreWorld = true;
+ // Try 1: Use the save folder name stored by UIScene_LoadMenu::StartGameFromSave (works for existing saves)
+ hardcoreSaveFolderName = app.GetCurrentSaveFolderName();
+ if (!hardcoreSaveFolderName.empty())
+ {
+ app.DebugPrintf("Hardcore mode: save folder from app = '%ls'\n", hardcoreSaveFolderName.c_str());
+ }
+ // Try 2: StorageManager (may work for new saves after first autosave)
+ if (hardcoreSaveFolderName.empty())
+ {
+ char szSaveFolder[MAX_SAVEFILENAME_LENGTH] = {};
+ StorageManager.GetSaveUniqueFilename(szSaveFolder);
+ if (szSaveFolder[0] != '\0')
+ {
+ wchar_t wSaveFolder[MAX_SAVEFILENAME_LENGTH] = {};
+ mbstowcs(wSaveFolder, szSaveFolder, MAX_SAVEFILENAME_LENGTH - 1);
+ hardcoreSaveFolderName = wSaveFolder;
+ app.DebugPrintf("Hardcore mode: save folder from StorageManager = '%s'\n", szSaveFolder);
+ }
+ }
+ // Try 3: Stored during loadLevel
+ if (hardcoreSaveFolderName.empty())
+ {
+ hardcoreSaveFolderName = MinecraftServer::getInstance()->getSaveFolderName();
+ app.DebugPrintf("Hardcore mode: save folder from server = '%ls'\n", hardcoreSaveFolderName.c_str());
+ }
+ MinecraftServer::getInstance()->setDeleteWorldOnExit(false);
+ }
+#endif
+
int exitReasonStringId = pMinecraft->progressRenderer->getCurrentTitle();
int exitReasonTitleId = IDS_CONNECTION_LOST;
@@ -622,6 +522,17 @@ void IUIScene_PauseMenu::_ExitWorld(LPVOID lpParameter)
{
Sleep(1);
}
+ // 4J Added: Hardcore mode — delete world save data now that the server is fully stopped
+#ifdef _WINDOWS64
+ if (shouldDeleteHardcoreWorld && !hardcoreSaveFolderName.empty())
+ {
+ wchar_t wFolderPath[MAX_PATH] = {};
+ swprintf_s(wFolderPath, MAX_PATH, L"Windows64\\GameHDD\\%s", hardcoreSaveFolderName.c_str());
+ app.DebugPrintf("Hardcore mode: Deleting world save folder '%ls'\n", wFolderPath);
+ Win64_DeleteSaveDirectory(wFolderPath);
+ }
+#endif
+
pMinecraft->setLevel(nullptr,exitReasonStringId,nullptr,saveStats);
TelemetryManager->Flush();
@@ -649,6 +560,7 @@ void IUIScene_PauseMenu::_ExitWorld(LPVOID lpParameter)
// Make sure we don't think saving is disabled in the menus
StorageManager.SetSaveDisabled(false);
#endif
+#endif
}
@@ -705,4 +617,4 @@ int IUIScene_PauseMenu::DisableAutosaveDialogReturned(void *pParam,int iPad,C4JS
app.SetAction(iPad,eAppAction_SaveGame);
}
return 0;
-}
\ No newline at end of file
+}
diff --git a/Minecraft.Client/Common/UI/IUIScene_PauseMenu.h b/Minecraft.Client/Common/UI/IUIScene_PauseMenu.h
index 7233df3a..7ce4e949 100644
--- a/Minecraft.Client/Common/UI/IUIScene_PauseMenu.h
+++ b/Minecraft.Client/Common/UI/IUIScene_PauseMenu.h
@@ -2,15 +2,11 @@
class IUIScene_PauseMenu
{
-protected:
- DLCPack *m_pDLCPack;
-
public:
static int ExitGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result);
static int ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result);
static int ExitGameAndSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result);
static int ExitGameDeclineSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result);
- static int WarningTrialTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result);
static int SaveGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result);
static int EnableAutosaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result);
static int DisableAutosaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result);
diff --git a/Minecraft.Client/Common/UI/IUIScene_StartGame.cpp b/Minecraft.Client/Common/UI/IUIScene_StartGame.cpp
index 18d71289..ab70cc91 100644
--- a/Minecraft.Client/Common/UI/IUIScene_StartGame.cpp
+++ b/Minecraft.Client/Common/UI/IUIScene_StartGame.cpp
@@ -12,8 +12,7 @@ IUIScene_StartGame::IUIScene_StartGame(int iPad, UILayer *parentLayer) : UIScene
m_bShowTexturePackDescription = false;
m_iSetTexturePackDescription = -1;
- Minecraft *pMinecraft = Minecraft::GetInstance();
- m_currentTexturePackIndex = pMinecraft->skins->getTexturePackIndex(0);
+ m_currentTexturePackIndex = 0;
}
void IUIScene_StartGame::HandleDLCMountingComplete()
diff --git a/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.cpp b/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.cpp
index c71f47c2..b5199010 100644
--- a/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.cpp
+++ b/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.cpp
@@ -5,6 +5,7 @@
#include "..\..\MultiplayerLocalPlayer.h"
#include "../../Font.h"
#include "..\..\..\Minecraft.World\StringHelpers.h"
+#include
#include "..\..\Windows64\KeyboardMouseInput.h"
diff --git a/Minecraft.Client/Common/UI/UIEnums.h b/Minecraft.Client/Common/UI/UIEnums.h
index d3c60419..752755af 100644
--- a/Minecraft.Client/Common/UI/UIEnums.h
+++ b/Minecraft.Client/Common/UI/UIEnums.h
@@ -81,6 +81,7 @@ enum EUIScene
eUIComponent_Chat,
eUIScene_ReinstallMenu,
eUIScene_SkinSelectMenu,
+ eUIScene_AchievementsMenu,
eUIScene_TextEntry,
eUIScene_InGameHostOptionsMenu,
eUIScene_InGamePlayerOptionsMenu,
diff --git a/Minecraft.Client/Common/UI/UIScene.h b/Minecraft.Client/Common/UI/UIScene.h
index 57054e1c..39ffd506 100644
--- a/Minecraft.Client/Common/UI/UIScene.h
+++ b/Minecraft.Client/Common/UI/UIScene.h
@@ -167,7 +167,7 @@ public:
// Returns true if this scene has focus for the pad passed in
virtual bool hasFocus(int iPad) { return bHasFocus && iPad == m_iPad; }
- void gainFocus();
+ virtual void gainFocus();
void loseFocus();
virtual void updateTooltips();
diff --git a/Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.cpp
index 71926a4f..5240a60f 100644
--- a/Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.cpp
+++ b/Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.cpp
@@ -1,235 +1,260 @@
+#include "stdafx.h"
+
+// Non-RmlUi includes that depend on Windows macros
#include "UI.h"
+#include "../../Minecraft.h"
+
+// RmlUi includes (Windows macros temporarily suppressed)
+#pragma push_macro("byte")
+#pragma push_macro("GetNextSibling")
+#pragma push_macro("GetFirstChild")
+#undef byte
+#undef GetNextSibling
+#undef GetFirstChild
+
#include "UIScene_HelpAndOptionsMenu.h"
-#include "..\..\Minecraft.h"
+#include "RmlManager.h"
+#include "../../Windows64/KeyboardMouseInput.h"
+#include
+#include
-UIScene_HelpAndOptionsMenu::UIScene_HelpAndOptionsMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer)
+#pragma pop_macro("GetFirstChild")
+#pragma pop_macro("GetNextSibling")
+#pragma pop_macro("byte")
+
+UIScene_HelpAndOptionsMenu::UIScene_HelpAndOptionsMenu(int iPad, void *initData, UILayer *parentLayer)
+ : UIScene(iPad, parentLayer)
+ , m_document(nullptr)
{
- // Setup all the Iggy references we need for this scene
- initialiseMovie();
-
- m_bNotInGame=(Minecraft::GetInstance()->level==nullptr);
-
- m_buttons[BUTTON_HAO_CHANGESKIN].init(IDS_CHANGE_SKIN,BUTTON_HAO_CHANGESKIN);
- m_buttons[BUTTON_HAO_HOWTOPLAY].init(IDS_HOW_TO_PLAY,BUTTON_HAO_HOWTOPLAY);
- m_buttons[BUTTON_HAO_CONTROLS].init(IDS_CONTROLS,BUTTON_HAO_CONTROLS);
- m_buttons[BUTTON_HAO_SETTINGS].init(IDS_SETTINGS,BUTTON_HAO_SETTINGS);
- m_buttons[BUTTON_HAO_CREDITS].init(IDS_CREDITS,BUTTON_HAO_CREDITS);
- //m_buttons[BUTTON_HAO_REINSTALL].init(app.GetString(IDS_REINSTALL_CONTENT),BUTTON_HAO_REINSTALL);
- m_buttons[BUTTON_HAO_DEBUG].init(IDS_DEBUG_SETTINGS,BUTTON_HAO_DEBUG);
-
- /* 4J-TomK - we should never remove a control before the other buttons controls are initialised!
- (because vita touchboxes are rebuilt on remove since the remaining positions might change) */
- // We don't have a reinstall content, so remove the button
- removeControl( &m_buttons[BUTTON_HAO_REINSTALL], false );
-
-#ifndef _DEBUG
- removeControl( &m_buttons[BUTTON_HAO_DEBUG], false);
-#else
- if(!app.DebugSettingsOn()) removeControl( &m_buttons[BUTTON_HAO_DEBUG], false);
-#endif
-
-#ifdef _XBOX_ONE
- // 4J-PB - in order to buy the skin packs, we need the signed offer ids for them, which we get in the availability info
- // we need to retrieve this info though, so do it here
- app.AddDLCRequest(e_Marketplace_Content); // content is skin packs, texture packs and mash-up packs
-
- // we also need to mount the local DLC so we can tell what's been purchased
- app.StartInstallDLCProcess(iPad);
-#endif
-
-
-
- // 4J-PB - do not need a storage device to see this menu - just need one when you choose to re-install them
- bool bNotInGame=(Minecraft::GetInstance()->level==nullptr);
-
- // any content to be re-installed?
- if(m_iPad==ProfileManager.GetPrimaryPad() && bNotInGame)
+ Rml::Context* ctx = RmlManager::Get().GetContext();
+ if (!ctx)
{
- // We should show the reinstall menu
- app.DebugPrintf("Reinstall Menu required...\n");
+ app.DebugPrintf("[RmlHelpAndOptions] No RmlUi context available\n");
+ return;
+ }
+
+ m_document = ctx->LoadDocument("HelpOptions.rml");
+ if (m_document)
+ {
+ m_document->Show();
+
+ bool bNotInGame = (Minecraft::GetInstance()->level == nullptr);
+
+ // Change Skin: hide if not full version
+ if (!ProfileManager.IsFullVersion())
+ {
+ auto* el = m_document->GetElementById("change_skin");
+ if (el) el->SetProperty("display", "none");
+ }
+
+ // Credits: hide in splitscreen
+ if (app.GetLocalPlayerCount() > 1)
+ {
+ auto* el = m_document->GetElementById("credits");
+ if (el) el->SetProperty("display", "none");
+ }
+
+ // Register button click listeners
+ m_document->GetElementById("change_skin")->AddEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("how_to_play")->AddEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("controls")->AddEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("settings")->AddEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("credits")->AddEventListener(Rml::EventId::Click, this);
+
+ // Focus first visible button
+ m_document->GetElementById("change_skin")->Focus();
}
else
{
- removeControl( &m_buttons[BUTTON_HAO_REINSTALL], false);
+ app.DebugPrintf("[RmlHelpAndOptions] Failed to load HelpOptions.rml\n");
}
- if(app.GetLocalPlayerCount()>1)
- {
- // no credits in splitscreen
- removeControl( &m_buttons[BUTTON_HAO_CREDITS], false);
+ ui.HidePressStart();
-#if TO_BE_IMPLEMENTED
- app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad,false);
-#endif
- if(ProfileManager.GetPrimaryPad()!=m_iPad)
- {
- removeControl( &m_buttons[BUTTON_HAO_REINSTALL], false);
- }
- }
-
- if(!ProfileManager.IsFullVersion() )//|| ProfileManager.IsGuest(m_iPad))
- {
- removeControl( &m_buttons[BUTTON_HAO_CHANGESKIN], false);
- }
-
- // 4J-TomK Moved horizontal resize check to the end to prevent horizontal scaling for buttons that might get removed anyways (debug options for example)
- doHorizontalResizeCheck();
-
- //StorageManager.TMSPP_GetUserQuotaInfo(C4JStorage::eGlobalStorage_TitleUser,iPad);
- //StorageManager.WebServiceRequestGetFriends(iPad);
+ TelemetryManager->RecordMenuShown(m_iPad, eUIScene_HelpAndOptionsMenu, 0);
}
UIScene_HelpAndOptionsMenu::~UIScene_HelpAndOptionsMenu()
{
+ if (m_document)
+ {
+ m_document->GetElementById("change_skin")->RemoveEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("how_to_play")->RemoveEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("controls")->RemoveEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("settings")->RemoveEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("credits")->RemoveEventListener(Rml::EventId::Click, this);
+ m_document->Close();
+ m_document = nullptr;
+ }
}
-wstring UIScene_HelpAndOptionsMenu::getMoviePath()
+void UIScene_HelpAndOptionsMenu::gainFocus()
{
- if(app.GetLocalPlayerCount() > 1)
+ if (!bHasFocus && stealsFocus())
{
- return L"HelpAndOptionsMenuSplit";
+ bHasFocus = true;
+ updateTooltips();
+ updateComponents();
+ if (!m_bFocussedOnce)
+ {
+ }
+ handleGainFocus(m_bFocussedOnce);
+ if (bHasFocus)
+ m_bFocussedOnce = true;
+ if (m_document)
+ m_document->Show();
}
- else
+}
+
+void UIScene_HelpAndOptionsMenu::handleLoseFocus()
+{
+ if (m_document)
+ m_document->Hide();
+}
+
+void UIScene_HelpAndOptionsMenu::reloadMovie(bool force)
+{
+}
+
+void UIScene_HelpAndOptionsMenu::tick()
+{
+ m_hasTickedOnce = true;
+
+ UIScene::tick();
+
+ Rml::Context* ctx = RmlManager::Get().GetContext();
+ if (!ctx || !bHasFocus)
+ return;
+
+ ctx->ProcessMouseMove(g_KBMInput.GetMouseX(), g_KBMInput.GetMouseY(), 0);
+
+ if (g_KBMInput.IsMouseButtonPressed(KeyboardMouseInput::MOUSE_LEFT))
+ ctx->ProcessMouseButtonDown(0, 0);
+ if (g_KBMInput.IsMouseButtonReleased(KeyboardMouseInput::MOUSE_LEFT))
+ ctx->ProcessMouseButtonUp(0, 0);
+ if (g_KBMInput.IsMouseButtonPressed(KeyboardMouseInput::MOUSE_RIGHT))
+ ctx->ProcessMouseButtonDown(1, 0);
+ if (g_KBMInput.IsMouseButtonReleased(KeyboardMouseInput::MOUSE_RIGHT))
+ ctx->ProcessMouseButtonUp(1, 0);
+
+ int wheelDelta = g_KBMInput.GetMouseWheel();
+ if (wheelDelta != 0)
+ ctx->ProcessMouseWheel(wheelDelta / -120, 0);
+
+ ctx->Update();
+}
+
+void UIScene_HelpAndOptionsMenu::render(S32 width, S32 height, C4JRender::eViewportType viewport)
+{
+}
+
+void UIScene_HelpAndOptionsMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled)
+{
+ Rml::Context* ctx = RmlManager::Get().GetContext();
+ if (!ctx)
+ return;
+
+ if (!pressed)
+ return;
+
+ switch (key)
{
- return L"HelpAndOptionsMenu";
+ case ACTION_MENU_UP:
+ ctx->ProcessKeyDown(Rml::Input::KI_UP, 0);
+ handled = true;
+ break;
+ case ACTION_MENU_DOWN:
+ ctx->ProcessKeyDown(Rml::Input::KI_DOWN, 0);
+ handled = true;
+ break;
+ case ACTION_MENU_OK:
+ if (g_KBMInput.IsKeyPressed(VK_RETURN))
+ {
+ ctx->ProcessKeyDown(Rml::Input::KI_RETURN, 0);
+ handled = true;
+ }
+ break;
+ case ACTION_MENU_CANCEL:
+ case ACTION_MENU_PAUSEMENU:
+ navigateBack();
+ handled = true;
+ break;
+ default:
+ break;
+ }
+}
+
+void UIScene_HelpAndOptionsMenu::ProcessEvent(Rml::Event& event)
+{
+ const Rml::String& id = event.GetCurrentElement()->GetId();
+
+ if (event == Rml::EventId::Click)
+ {
+ if (id == "change_skin") OnChangeSkin();
+ else if (id == "how_to_play") OnHowToPlay();
+ else if (id == "controls") OnControls();
+ else if (id == "settings") OnSettings();
+ else if (id == "credits") OnCredits();
}
}
void UIScene_HelpAndOptionsMenu::updateTooltips()
{
- ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK);
}
void UIScene_HelpAndOptionsMenu::updateComponents()
{
- bool bNotInGame=(Minecraft::GetInstance()->level==nullptr);
- if(bNotInGame)
+ bool bNotInGame = (Minecraft::GetInstance()->level == nullptr);
+ if (bNotInGame)
{
- m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true);
- m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true);
+ m_parentLayer->showComponent(m_iPad, eUIComponent_Panorama, true);
+ m_parentLayer->showComponent(m_iPad, eUIComponent_Logo, true);
}
else
{
- m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,false);
-
- if( app.GetLocalPlayerCount() == 1 ) m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true);
- else m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false);
+ m_parentLayer->showComponent(m_iPad, eUIComponent_Panorama, false);
+ if (app.GetLocalPlayerCount() == 1)
+ m_parentLayer->showComponent(m_iPad, eUIComponent_Logo, true);
+ else
+ m_parentLayer->showComponent(m_iPad, eUIComponent_Logo, false);
}
}
-void UIScene_HelpAndOptionsMenu::handleReload()
+void UIScene_HelpAndOptionsMenu::navigateBack()
{
-#ifndef _DEBUG // def _FINAL_BUILD // disable debug settings in release builds
- removeControl( &m_buttons[BUTTON_HAO_DEBUG], false);
-#else
- if(!app.DebugSettingsOn()) removeControl( &m_buttons[BUTTON_HAO_DEBUG], false);
-#endif
-
- // 4J-PB - do not need a storage device to see this menu - just need one when you choose to re-install them
- bool bNotInGame=(Minecraft::GetInstance()->level==nullptr);
-
- // any content to be re-installed?
- if(m_iPad==ProfileManager.GetPrimaryPad() && bNotInGame)
- {
- // We should show the reinstall menu
- app.DebugPrintf("Reinstall Menu required...\n");
- }
- else
- {
- removeControl( &m_buttons[BUTTON_HAO_REINSTALL], false);
- }
-
- if(app.GetLocalPlayerCount()>1)
- {
- // no credits in splitscreen
- removeControl( &m_buttons[BUTTON_HAO_CREDITS], false);
-
-#if TO_BE_IMPLEMENTED
- app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad,false);
-#endif
- if(ProfileManager.GetPrimaryPad()!=m_iPad)
- {
- removeControl( &m_buttons[BUTTON_HAO_REINSTALL], false);
- }
- }
-
- if(!ProfileManager.IsFullVersion() )//|| ProfileManager.IsGuest(m_iPad))
- {
-#if TO_BE_IMPLEMENTED
- m_Buttons[BUTTON_HAO_CHANGESKIN].SetEnable(FALSE);
- m_Buttons[BUTTON_HAO_CHANGESKIN].EnableInput(FALSE);
- // set the focus to the second button
-
- XuiElementSetUserFocus(m_Buttons[BUTTON_HAO_HOWTOPLAY].m_hObj, m_iPad);
-#endif
- }
-
- if(!ProfileManager.IsFullVersion() )//|| ProfileManager.IsGuest(m_iPad))
- {
- removeControl( &m_buttons[BUTTON_HAO_CHANGESKIN], false);
- }
-
- doHorizontalResizeCheck();
+ ui.PlayUISFX(eSFX_Back);
+ UIScene::navigateBack();
}
-void UIScene_HelpAndOptionsMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled)
-{
- //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE");
-
- ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released);
-
- switch(key)
- {
- case ACTION_MENU_CANCEL:
- if(pressed && !repeat)
- {
- navigateBack();
- }
- break;
- case ACTION_MENU_OK:
-#ifdef __ORBIS__
- case ACTION_MENU_TOUCHPAD_PRESS:
-#endif
- //CD - Added for audio
- if(pressed)
- {
- ui.PlayUISFX(eSFX_Press);
- }
-
- case ACTION_MENU_UP:
- case ACTION_MENU_DOWN:
- sendInputToMovie(key, repeat, pressed, released);
- break;
- }
-}
-
-void UIScene_HelpAndOptionsMenu::handlePress(F64 controlId, F64 childId)
+void UIScene_HelpAndOptionsMenu::OnChangeSkin()
{
ui.PlayUISFX(eSFX_Press);
-
- switch(static_cast(controlId))
- {
- case BUTTON_HAO_CHANGESKIN:
- ui.NavigateToScene(m_iPad, eUIScene_SkinSelectMenu);
- break;
- case BUTTON_HAO_HOWTOPLAY:
- ui.NavigateToScene(m_iPad, eUIScene_HowToPlayMenu);
- break;
- case BUTTON_HAO_CONTROLS:
- ui.NavigateToScene(m_iPad, eUIScene_ControlsMenu);
- break;
- case BUTTON_HAO_SETTINGS:
- ui.NavigateToScene(m_iPad, eUIScene_SettingsMenu);
- break;
- case BUTTON_HAO_CREDITS:
- ui.NavigateToScene(m_iPad, eUIScene_Credits);
- break;
- case BUTTON_HAO_REINSTALL:
- ui.NavigateToScene(m_iPad, eUIScene_ReinstallMenu);
- break;
- case BUTTON_HAO_DEBUG:
- ui.NavigateToScene(m_iPad, eUIScene_DebugOptions);
- break;
- }
+ ui.NavigateToScene(m_iPad, eUIScene_SkinSelectMenu);
}
+
+void UIScene_HelpAndOptionsMenu::OnHowToPlay()
+{
+ ui.PlayUISFX(eSFX_Press);
+ ui.NavigateToScene(m_iPad, eUIScene_HowToPlayMenu);
+}
+
+void UIScene_HelpAndOptionsMenu::OnControls()
+{
+ ui.PlayUISFX(eSFX_Press);
+ ui.NavigateToScene(m_iPad, eUIScene_ControlsMenu);
+}
+
+void UIScene_HelpAndOptionsMenu::OnSettings()
+{
+ ui.PlayUISFX(eSFX_Press);
+ ui.NavigateToScene(m_iPad, eUIScene_SettingsMenu);
+}
+
+void UIScene_HelpAndOptionsMenu::OnCredits()
+{
+ ui.PlayUISFX(eSFX_Press);
+ ui.NavigateToScene(m_iPad, eUIScene_Credits);
+}
+
+
diff --git a/Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.h b/Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.h
index 203011d3..a8c720d4 100644
--- a/Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.h
+++ b/Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.h
@@ -1,50 +1,57 @@
#pragma once
+#pragma push_macro("byte")
+#pragma push_macro("GetNextSibling")
+#pragma push_macro("GetFirstChild")
+#undef byte
+#undef GetNextSibling
+#undef GetFirstChild
+
#include "UIScene.h"
+#include
+#include
-#define BUTTON_HAO_CHANGESKIN 0
-#define BUTTON_HAO_HOWTOPLAY 1
-#define BUTTON_HAO_CONTROLS 2
-#define BUTTON_HAO_SETTINGS 3
-#define BUTTON_HAO_CREDITS 4
-#define BUTTON_HAO_REINSTALL 5
-#define BUTTON_HAO_DEBUG 6
-#define BUTTONS_HAO_MAX BUTTON_HAO_DEBUG + 1
+// NOTE: pop_macro at end of file
-class UIScene_HelpAndOptionsMenu : public UIScene
+class UIScene_HelpAndOptionsMenu : public UIScene, public Rml::EventListener
{
-private:
- UIControl_Button m_buttons[BUTTONS_HAO_MAX];
- UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene)
- UI_MAP_ELEMENT( m_buttons[BUTTON_HAO_CHANGESKIN], "Button1")
- UI_MAP_ELEMENT( m_buttons[BUTTON_HAO_HOWTOPLAY], "Button2")
- UI_MAP_ELEMENT( m_buttons[BUTTON_HAO_CONTROLS], "Button3")
- UI_MAP_ELEMENT( m_buttons[BUTTON_HAO_SETTINGS], "Button4")
- UI_MAP_ELEMENT( m_buttons[BUTTON_HAO_CREDITS], "Button5")
- UI_MAP_ELEMENT( m_buttons[BUTTON_HAO_REINSTALL], "Button6")
- UI_MAP_ELEMENT( m_buttons[BUTTON_HAO_DEBUG], "Button7")
- UI_END_MAP_ELEMENTS_AND_NAMES()
-
- bool m_bNotInGame;
public:
UIScene_HelpAndOptionsMenu(int iPad, void *initData, UILayer *parentLayer);
virtual ~UIScene_HelpAndOptionsMenu();
- virtual EUIScene getSceneType() { return eUIScene_HelpAndOptionsMenu;}
-
- virtual void updateTooltips();
- virtual void updateComponents();
+ virtual EUIScene getSceneType() { return eUIScene_HelpAndOptionsMenu; }
-protected:
- // TODO: This should be pure virtual in this class
- virtual wstring getMoviePath();
+ virtual void tick();
+ virtual void render(S32 width, S32 height, C4JRender::eViewportType viewport);
-public:
- virtual void handleReload();
-
- // INPUT
virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled);
+ // Override focus/movie lifecycle for RmlUi (no Iggy movie)
+ virtual void gainFocus() override;
+ virtual void reloadMovie(bool force) override;
+
+ // Rml::EventListener
+ void ProcessEvent(Rml::Event& event) override;
+
protected:
- void handlePress(F64 controlId, F64 childId);
-};
\ No newline at end of file
+ virtual wstring getMoviePath() { return L""; }
+
+ virtual void handleLoseFocus() override;
+ virtual void updateTooltips() override;
+ virtual void updateComponents() override;
+
+ void navigateBack();
+
+ void OnChangeSkin();
+ void OnHowToPlay();
+ void OnControls();
+ void OnSettings();
+ void OnCredits();
+
+private:
+ Rml::ElementDocument* m_document;
+};
+
+#pragma pop_macro("GetFirstChild")
+#pragma pop_macro("GetNextSibling")
+#pragma pop_macro("byte")
diff --git a/Minecraft.Client/Common/UI/UIScene_LoadCreateJoinMenu.cpp b/Minecraft.Client/Common/UI/UIScene_LoadCreateJoinMenu.cpp
index 6b1bbc6d..9e3ac8d3 100644
--- a/Minecraft.Client/Common/UI/UIScene_LoadCreateJoinMenu.cpp
+++ b/Minecraft.Client/Common/UI/UIScene_LoadCreateJoinMenu.cpp
@@ -286,11 +286,16 @@ UIScene_LoadCreateJoinMenu::UIScene_LoadCreateJoinMenu(int iPad, void* initData,
#endif
// block input if we're waiting for DLC to install, and wipe the saves list. The end of dlc mounting custom message will fill the list again
+#if defined(_WINDOWS64)
+ // On Windows64, DLC is file-based and doesn't block loading; initialise immediately
+ Initialise();
+#else
if (app.StartInstallDLCProcess(m_iPad) == true || app.DLCInstallPending())
// if we're waiting for DLC to mount, don't fill the save list. The custom message on end of dlc mounting will do that
m_bIgnoreInput = true;
else
Initialise();
+#endif
#ifdef __PSVITA__
if (CGameNetworkManager::usingAdhocMode() && SQRNetworkManager_AdHoc_Vita::GetAdhocStatus())
@@ -554,6 +559,7 @@ void UIScene_LoadCreateJoinMenu::handleGainFocus(bool navBack)
m_bIgnoreInput = false;
+#if !defined(_WINDOWS64)
if (app.StartInstallDLCProcess(m_iPad) == false)
m_bIgnoreInput = false;
@@ -567,6 +573,7 @@ void UIScene_LoadCreateJoinMenu::handleGainFocus(bool navBack)
m_controlSavesTimer.setVisible(true);
}
+#endif
if (m_bMultiplayerAllowed)
diff --git a/Minecraft.Client/Common/UI/UIScene_PauseMenu.cpp b/Minecraft.Client/Common/UI/UIScene_PauseMenu.cpp
index 8e1bdc6a..9c9ba14a 100644
--- a/Minecraft.Client/Common/UI/UIScene_PauseMenu.cpp
+++ b/Minecraft.Client/Common/UI/UIScene_PauseMenu.cpp
@@ -1,736 +1,488 @@
+#include "stdafx.h"
+
+// Non-RmlUi includes that depend on Windows macros
#include "UI.h"
+#include "../../MinecraftServer.h"
+#include "../../MultiPlayerLocalPlayer.h"
+
+// RmlUi includes (Windows macros temporarily suppressed)
+#pragma push_macro("byte")
+#pragma push_macro("GetNextSibling")
+#pragma push_macro("GetFirstChild")
+#undef byte
+#undef GetNextSibling
+#undef GetFirstChild
+
#include "UIScene_PauseMenu.h"
-#include "..\..\MinecraftServer.h"
-#include "..\..\MultiplayerLocalPlayer.h"
-#include "..\..\TexturePackRepository.h"
-#include "..\..\TexturePack.h"
-#include "..\..\DLCTexturePack.h"
-#include "../DLC/DLCPack.h"
-#include "../Tutorial/TutorialMode.h"
-#include "..\..\..\Minecraft.World\StringHelpers.h"
+#include "RmlManager.h"
+#include "../../Windows64/KeyboardMouseInput.h"
+#include
+#include
-UIScene_PauseMenu::UIScene_PauseMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer)
+#pragma pop_macro("GetFirstChild")
+#pragma pop_macro("GetNextSibling")
+#pragma pop_macro("byte")
+
+UIScene_PauseMenu::UIScene_PauseMenu(int iPad, void *initData, UILayer *parentLayer)
+ : UIScene(iPad, parentLayer)
+ , m_document(nullptr)
+ , m_bIgnoreInput(false)
+ , m_bExitDialog(false)
+ , m_bSaveDialog(false)
{
- // Setup all the Iggy references we need for this scene
- initialiseMovie();
- m_bIgnoreInput=false;
- m_eAction=eAction_None;
-
- m_buttons[BUTTON_PAUSE_RESUMEGAME].init(app.GetString(IDS_RESUME_GAME),BUTTON_PAUSE_RESUMEGAME);
- m_buttons[BUTTON_PAUSE_HELPANDOPTIONS].init(app.GetString(IDS_HELP_AND_OPTIONS),BUTTON_PAUSE_HELPANDOPTIONS);
- m_buttons[BUTTON_PAUSE_LEADERBOARDS].init(app.GetString(IDS_LEADERBOARDS),BUTTON_PAUSE_LEADERBOARDS);
-#ifdef _DURANGO
- m_buttons[BUTTON_PAUSE_XBOXHELP].init(app.GetString(IDS_XBOX_HELP_APP), BUTTON_PAUSE_XBOXHELP);
-#else
- m_buttons[BUTTON_PAUSE_ACHIEVEMENTS].init(app.GetString(IDS_ACHIEVEMENTS),BUTTON_PAUSE_ACHIEVEMENTS);
-#endif
-#if defined(_XBOX_ONE) || defined(__ORBIS__)
- m_bTrialTexturePack = false;
- if(!Minecraft::GetInstance()->skins->isUsingDefaultSkin())
+ Rml::Context* ctx = RmlManager::Get().GetContext();
+ if (!ctx)
{
- TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected();
- DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack;
-
- m_pDLCPack=pDLCTexPack->getDLCInfoParentPack();//tPack->getDLCPack();
-
- if(!m_pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" ))
- {
- m_bTrialTexturePack = true;
- }
+ app.DebugPrintf("[RmlPauseMenu] No RmlUi context available\n");
+ return;
}
- // 4J-TomK - check for all possible labels being fed into BUTTON_PAUSE_SAVEGAME (Bug 163775)
- // this has to be done before button initialisation!
- wchar_t saveButtonLabels[2][256];
- swprintf( saveButtonLabels[0], 256, L"%ls", app.GetString( IDS_SAVE_GAME ));
- swprintf( saveButtonLabels[1], 256, L"%ls", app.GetString( IDS_DISABLE_AUTOSAVE ));
- m_buttons[BUTTON_PAUSE_SAVEGAME].setAllPossibleLabels(2,saveButtonLabels);
-
- if(app.GetGameHostOption(eGameHostOption_DisableSaving) || m_bTrialTexturePack)
+ m_document = ctx->LoadDocument("PauseMenu.rml");
+ if (m_document)
{
- m_savesDisabled = true;
- m_buttons[BUTTON_PAUSE_SAVEGAME].init(app.GetString(IDS_SAVE_GAME),BUTTON_PAUSE_SAVEGAME);
+ app.DebugPrintf("[RmlPauseMenu] Document loaded OK, showing...\n");
+ m_document->Show();
+ app.DebugPrintf("[RmlPauseMenu] Document shown, visible=%d, context docs=%d\n",
+ m_document->IsVisible(), ctx->GetNumDocuments());
+ m_document->GetElementById("resume")->AddEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("help_options")->AddEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("achievements")->AddEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("save_game")->AddEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("exit_game")->AddEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("exit_save")->AddEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("exit_nosave")->AddEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("exit_cancel")->AddEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("save_cancel")->AddEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("save_confirm")->AddEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("resume")->Focus();
}
else
{
- m_savesDisabled = false;
- m_buttons[BUTTON_PAUSE_SAVEGAME].init(app.GetString(IDS_DISABLE_AUTOSAVE),BUTTON_PAUSE_SAVEGAME);
- }
-#else
- m_buttons[BUTTON_PAUSE_SAVEGAME].init(app.GetString(IDS_SAVE_GAME),BUTTON_PAUSE_SAVEGAME);
-#endif
- m_buttons[BUTTON_PAUSE_EXITGAME].init(app.GetString(IDS_EXIT_GAME),BUTTON_PAUSE_EXITGAME);
-
- if(!ProfileManager.IsFullVersion())
- {
- // hide the trial timer
- ui.ShowTrialTimer(false);
+ app.DebugPrintf("[RmlPauseMenu] Failed to load PauseMenu.rml\n");
}
- updateControlsVisibility();
-
- doHorizontalResizeCheck();
-
- // get rid of the quadrant display if it's on
ui.HidePressStart();
-#if TO_BE_IMPLEMENTED
- XuiSetTimer(m_hObj,IGNORE_KEYPRESS_TIMERID,IGNORE_KEYPRESS_TIME);
-#endif
+ // parentLayer->addComponent(iPad,eUIComponent_Logo);
- if( g_NetworkManager.IsLocalGame() && g_NetworkManager.GetPlayerCount() == 1 )
+ if (g_NetworkManager.IsLocalGame() && g_NetworkManager.GetPlayerCount() == 1)
{
- app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)TRUE);
+ app.SetXuiServerAction(ProfileManager.GetPrimaryPad(), eXuiServerAction_PauseServer, (void*)TRUE);
}
TelemetryManager->RecordMenuShown(m_iPad, eUIScene_PauseMenu, 0);
TelemetryManager->RecordPauseOrInactive(m_iPad);
-
- Minecraft *pMinecraft = Minecraft::GetInstance();
- if(pMinecraft != nullptr && pMinecraft->localgameModes[iPad] != nullptr )
- {
- TutorialMode *gameMode = static_cast(pMinecraft->localgameModes[iPad]);
-
- // This just allows it to be shown
- gameMode->getTutorial()->showTutorialPopup(false);
- }
- m_bErrorDialogRunning = false;
}
UIScene_PauseMenu::~UIScene_PauseMenu()
{
- Minecraft *pMinecraft = Minecraft::GetInstance();
- if(pMinecraft != nullptr && pMinecraft->localgameModes[m_iPad] != nullptr )
+ if (m_document)
{
- TutorialMode *gameMode = static_cast(pMinecraft->localgameModes[m_iPad]);
-
- // This just allows it to be shown
- gameMode->getTutorial()->showTutorialPopup(true);
+ m_document->GetElementById("resume")->RemoveEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("help_options")->RemoveEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("achievements")->RemoveEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("save_game")->RemoveEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("exit_game")->RemoveEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("exit_save")->RemoveEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("exit_nosave")->RemoveEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("exit_cancel")->RemoveEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("save_cancel")->RemoveEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("save_confirm")->RemoveEventListener(Rml::EventId::Click, this);
+ m_document->Close();
+ m_document = nullptr;
}
- m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,false);
- m_parentLayer->showComponent(m_iPad,eUIComponent_MenuBackground,false);
- m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false);
+ m_parentLayer->showComponent(m_iPad, eUIComponent_Panorama, false);
+ m_parentLayer->showComponent(m_iPad, eUIComponent_MenuBackground, false);
+ m_parentLayer->showComponent(m_iPad, eUIComponent_Logo, false);
}
-wstring UIScene_PauseMenu::getMoviePath()
+void UIScene_PauseMenu::gainFocus()
{
- if(app.GetLocalPlayerCount() > 1)
+ if (!bHasFocus && stealsFocus())
{
- return L"PauseMenuSplit";
- }
- else
- {
- return L"PauseMenu";
+ bHasFocus = true;
+ updateTooltips();
+ updateComponents();
+ if (!m_bFocussedOnce)
+ {
+ // No Iggy set-focus call needed for RmlUi scene
+ }
+ handleGainFocus(m_bFocussedOnce);
+ if (bHasFocus)
+ m_bFocussedOnce = true;
+ if (m_document)
+ m_document->Show();
}
}
+void UIScene_PauseMenu::handleLoseFocus()
+{
+ if (m_document)
+ m_document->Hide();
+}
+
+void UIScene_PauseMenu::reloadMovie(bool force)
+{
+}
+
void UIScene_PauseMenu::tick()
{
+ // Signal the base class that we've ticked once, so it sets m_bCanHandleInput
+ // (the Iggy while-loop that normally sets this never runs without a loaded SWF)
+ m_hasTickedOnce = true;
+
UIScene::tick();
-#ifdef __PSVITA__
- // 4J-MGH - Need to check for installed DLC here, as we delay the installation of the key file on Vita
- if(!app.DLCInstallProcessCompleted()) app.StartInstallDLCProcess(0);
-#endif
+ Rml::Context* ctx = RmlManager::Get().GetContext();
+ if (!ctx || !bHasFocus)
+ return;
+ // Forward mouse position (for hover effects and correct click targeting)
+ ctx->ProcessMouseMove(g_KBMInput.GetMouseX(), g_KBMInput.GetMouseY(), 0);
-#if defined _XBOX_ONE || defined __ORBIS__
- if(!m_bTrialTexturePack && m_savesDisabled != (app.GetGameHostOption(eGameHostOption_DisableSaving) != 0) && ProfileManager.GetPrimaryPad() == m_iPad )
- {
- // We show the save button if saves are disabled as this lets us show a prompt to enable them (via purchasing a texture pack)
- if( app.GetGameHostOption(eGameHostOption_DisableSaving) )
- {
- m_savesDisabled = true;
- m_buttons[BUTTON_PAUSE_SAVEGAME].setLabel( app.GetString(IDS_SAVE_GAME) );
- }
- else
- {
- m_savesDisabled = false;
- m_buttons[BUTTON_PAUSE_SAVEGAME].setLabel( app.GetString(IDS_DISABLE_AUTOSAVE) );
- }
- }
-#endif
+ // Forward mouse button presses/releases
+ if (g_KBMInput.IsMouseButtonPressed(KeyboardMouseInput::MOUSE_LEFT))
+ ctx->ProcessMouseButtonDown(0, 0);
+ if (g_KBMInput.IsMouseButtonReleased(KeyboardMouseInput::MOUSE_LEFT))
+ ctx->ProcessMouseButtonUp(0, 0);
+ if (g_KBMInput.IsMouseButtonPressed(KeyboardMouseInput::MOUSE_RIGHT))
+ ctx->ProcessMouseButtonDown(1, 0);
+ if (g_KBMInput.IsMouseButtonReleased(KeyboardMouseInput::MOUSE_RIGHT))
+ ctx->ProcessMouseButtonUp(1, 0);
-#ifdef __ORBIS__
- // Process the error dialog (for a patch being available)
- if(m_bErrorDialogRunning)
- {
- SceErrorDialogStatus stat = sceErrorDialogUpdateStatus();
- if( stat == SCE_ERROR_DIALOG_STATUS_FINISHED )
- {
- sceErrorDialogTerminate();
- m_bErrorDialogRunning=false;
- }
- }
-#endif
+ // Forward scroll wheel
+ int wheelDelta = g_KBMInput.GetMouseWheel();
+ if (wheelDelta != 0)
+ ctx->ProcessMouseWheel(wheelDelta / -120, 0);
+
+ ctx->Update();
}
-void UIScene_PauseMenu::updateTooltips()
+void UIScene_PauseMenu::render(S32 width, S32 height, C4JRender::eViewportType viewport)
{
- bool bUserisClientSide = ProfileManager.IsSignedInLive(m_iPad);
- bool bIsisPrimaryHost=g_NetworkManager.IsHost() && (ProfileManager.GetPrimaryPad()==m_iPad);
-
-#ifdef _XBOX_ONE
- bool bDisplayBanTip = !g_NetworkManager.IsLocalGame() && !bIsisPrimaryHost && !ProfileManager.IsGuest(m_iPad);
-#endif
-
- int iY = -1;
-#if defined __PS3__ || defined __ORBIS__
- if(m_iPad == ProfileManager.GetPrimaryPad() ) iY = IDS_TOOLTIPS_GAME_INVITES;
-#endif
- int iRB = -1;
- int iX = -1;
-
- if(ProfileManager.IsFullVersion())
- {
- if(StorageManager.GetSaveDisabled())
- {
- iX = bIsisPrimaryHost?IDS_TOOLTIPS_SELECTDEVICE:-1;
-#ifdef _XBOX_ONE
- iRB = bDisplayBanTip?IDS_TOOLTIPS_BANLEVEL:-1;
-#endif
- if( CSocialManager::Instance()->IsTitleAllowedToPostImages() && CSocialManager::Instance()->AreAllUsersAllowedToPostImages() && bUserisClientSide )
- {
-#ifndef __PS3__
- iY = IDS_TOOLTIPS_SHARE;
-#endif
- }
- }
- else
- {
- iX = bIsisPrimaryHost?IDS_TOOLTIPS_CHANGEDEVICE:-1;
-#ifdef _XBOX_ONE
- iRB = bDisplayBanTip?IDS_TOOLTIPS_BANLEVEL:-1;
-#endif
- if( CSocialManager::Instance()->IsTitleAllowedToPostImages() && CSocialManager::Instance()->AreAllUsersAllowedToPostImages() && bUserisClientSide)
- {
-#ifndef __PS3__
- iY = IDS_TOOLTIPS_SHARE;
-#endif
- }
- }
- }
- ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,iX,iY, -1,-1,-1,iRB);
-}
-
-void UIScene_PauseMenu::updateComponents()
-{
- m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,false);
- m_parentLayer->showComponent(m_iPad,eUIComponent_MenuBackground,true);
-
- if( app.GetLocalPlayerCount() == 1 ) m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true);
- else m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false);
-}
-
-void UIScene_PauseMenu::handlePreReload()
-{
-#if defined _XBOX_ONE || defined __ORBIS__
- if(ProfileManager.GetPrimaryPad() == m_iPad)
- {
- // 4J-TomK - check for all possible labels being fed into BUTTON_PAUSE_SAVEGAME (Bug 163775)
- // this has to be done before button initialisation!
- wchar_t saveButtonLabels[2][256];
- swprintf( saveButtonLabels[0], 256, L"%ls", app.GetString( IDS_SAVE_GAME ));
- swprintf( saveButtonLabels[1], 256, L"%ls", app.GetString( IDS_DISABLE_AUTOSAVE ));
- m_buttons[BUTTON_PAUSE_SAVEGAME].setAllPossibleLabels(2,saveButtonLabels);
- }
-#endif
-}
-
-void UIScene_PauseMenu::handleReload()
-{
- updateTooltips();
- updateControlsVisibility();
-
-#if defined _XBOX_ONE || defined __ORBIS__
- if(ProfileManager.GetPrimaryPad() == m_iPad)
- {
- // We show the save button if saves are disabled as this lets us show a prompt to enable them (via purchasing a texture pack)
- if( app.GetGameHostOption(eGameHostOption_DisableSaving) || m_bTrialTexturePack )
- {
- m_savesDisabled = true;
- m_buttons[BUTTON_PAUSE_SAVEGAME].setLabel( app.GetString(IDS_SAVE_GAME) );
- }
- else
- {
- m_savesDisabled = false;
- m_buttons[BUTTON_PAUSE_SAVEGAME].setLabel( app.GetString(IDS_DISABLE_AUTOSAVE) );
- }
- }
-#endif
-
- doHorizontalResizeCheck();
-}
-
-void UIScene_PauseMenu::updateControlsVisibility()
-{
- // are we the primary player?
- // 4J-PB - fix for 7844 & 7845 -
- // TCR # 128: XLA Pause Menu: When in a multiplayer game as a client the Pause Menu does not have a Leaderboards option.
- // TCR # 128: XLA Pause Menu: When in a multiplayer game as a client the Pause Menu does not have an Achievements option.
- if(ProfileManager.GetPrimaryPad()==m_iPad) // && g_NetworkManager.IsHost())
- {
- // are we in splitscreen?
- // how many local players do we have?
- if( app.GetLocalPlayerCount()>1 )
- {
- // Hide the BUTTON_PAUSE_LEADERBOARDS and BUTTON_PAUSE_ACHIEVEMENTS
- removeControl( &m_buttons[BUTTON_PAUSE_LEADERBOARDS], false );
-#ifndef _XBOX_ONE
- removeControl( &m_buttons[BUTTON_PAUSE_ACHIEVEMENTS], false );
-#endif
- }
-
- if( !g_NetworkManager.IsHost() )
- {
- // Hide the BUTTON_PAUSE_SAVEGAME
- removeControl( &m_buttons[BUTTON_PAUSE_SAVEGAME], false );
- }
- }
- else
- {
- // Hide the BUTTON_PAUSE_LEADERBOARDS, BUTTON_PAUSE_ACHIEVEMENTS and BUTTON_PAUSE_SAVEGAME
- removeControl( &m_buttons[BUTTON_PAUSE_LEADERBOARDS], false );
-#ifndef _XBOX_ONE
- removeControl( &m_buttons[BUTTON_PAUSE_ACHIEVEMENTS], false );
-#endif
- removeControl( &m_buttons[BUTTON_PAUSE_SAVEGAME], false );
- }
-
- // is saving disabled?
- if(StorageManager.GetSaveDisabled())
- {
-#ifdef _XBOX
- // disable save button
- m_buttons[BUTTON_PAUSE_SAVEGAME].setEnable(false);
-#endif
- }
-
-#if defined(__PS3__) || defined (__PSVITA__) || defined(__ORBIS__)
- // We don't have a way to display trophies/achievements, so remove the button, and we're allowed to not have it on Xbox One
- removeControl( &m_buttons[BUTTON_PAUSE_ACHIEVEMENTS], false );
-#endif
-
}
void UIScene_PauseMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled)
{
- if(m_bIgnoreInput)
- {
+ if (m_bIgnoreInput)
return;
+
+ if (pressed)
+ {
+ if (iPad == ProfileManager.GetPrimaryPad() && g_NetworkManager.IsLocalGame())
+ {
+ app.SetXuiServerAction(ProfileManager.GetPrimaryPad(), eXuiServerAction_PauseServer, (void*)FALSE);
+ }
}
- //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE");
- ui.AnimateKeyPress(iPad, key, repeat, pressed, released);
+ Rml::Context* ctx = RmlManager::Get().GetContext();
+ if (!ctx)
+ return;
-#ifdef _XBOX_ONE
- bool bIsisPrimaryHost=g_NetworkManager.IsHost() && (ProfileManager.GetPrimaryPad()==iPad);
- bool bDisplayBanTip = !g_NetworkManager.IsLocalGame() && !bIsisPrimaryHost && !ProfileManager.IsGuest(iPad);
-#endif
+ // Translate game actions to RmlUi key events.
+ // Mouse clicks are forwarded in tick() via ProcessMouseButtonDown/Up,
+ // so here we only handle keyboard-originated actions.
+ if (!pressed)
+ return;
- switch(key)
+ switch (key)
{
-#ifdef _DURANGO
- case ACTION_MENU_GTC_RESUME:
-#endif
-#if defined(__PS3__) // not for Orbis - we want to use the pause menu (touchpad press) to select a menu item
- case ACTION_MENU_PAUSEMENU:
-#endif
- case ACTION_MENU_CANCEL:
- if(pressed)
- {
- if( iPad == ProfileManager.GetPrimaryPad() && g_NetworkManager.IsLocalGame() )
- {
- app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)FALSE);
- }
-
- ui.PlayUISFX(eSFX_Back);
- navigateBack();
- if(!ProfileManager.IsFullVersion())
- {
- ui.ShowTrialTimer(true);
- }
- }
+ case ACTION_MENU_UP:
+ ctx->ProcessKeyDown(Rml::Input::KI_UP, 0);
+ handled = true;
+ break;
+ case ACTION_MENU_DOWN:
+ ctx->ProcessKeyDown(Rml::Input::KI_DOWN, 0);
+ handled = true;
break;
case ACTION_MENU_OK:
-#ifdef __ORBIS__
- case ACTION_MENU_TOUCHPAD_PRESS:
-#endif
- case ACTION_MENU_UP:
- case ACTION_MENU_DOWN:
- if(pressed)
+ // Only forward as keyboard Enter if actually coming from keyboard,
+ // not from mouse click (mouse is handled in tick()).
+ if (g_KBMInput.IsKeyPressed(VK_RETURN))
{
- sendInputToMovie(key, repeat, pressed, released);
+ ctx->ProcessKeyDown(Rml::Input::KI_RETURN, 0);
+ handled = true;
}
break;
-
-#ifdef _XBOX_ONE
- case ACTION_MENU_RIGHT_SCROLL:
- if( bDisplayBanTip )
+ case ACTION_MENU_CANCEL:
+ case ACTION_MENU_PAUSEMENU:
+ if (m_bExitDialog)
{
- UINT uiIDA[2];
- uiIDA[0]=IDS_CONFIRM_CANCEL;
- uiIDA[1]=IDS_CONFIRM_OK;
- ui.RequestAlertMessage(IDS_ACTION_BAN_LEVEL_TITLE, IDS_ACTION_BAN_LEVEL_DESCRIPTION, uiIDA, 2, iPad,&UIScene_PauseMenu::BanGameDialogReturned,(LPVOID)GetCallbackUniqueId() );
-
- //rfHandled = TRUE;
+ OnExitCancel();
+ handled = true;
+ }
+ else if (m_bSaveDialog)
+ {
+ OnSaveCancel();
+ handled = true;
+ }
+ else
+ {
+ navigateBack();
+ handled = true;
}
break;
-#endif
- }
-}
-
-void UIScene_PauseMenu::handlePress(F64 controlId, F64 childId)
-{
- ui.PlayUISFX(eSFX_Press);
-
- if(m_bIgnoreInput) return;
-
- switch(static_cast(controlId))
- {
- case BUTTON_PAUSE_RESUMEGAME:
- if( m_iPad == ProfileManager.GetPrimaryPad() && g_NetworkManager.IsLocalGame() )
- {
- app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)FALSE);
- }
- navigateBack();
- break;
- case BUTTON_PAUSE_LEADERBOARDS:
- {
- UINT uiIDA[1];
- uiIDA[0]=IDS_OK;
-
- //4J Gordon: Being used for the leaderboards proper now
- // guests can't look at leaderboards
- if(ProfileManager.IsGuest(m_iPad))
- {
- ui.RequestAlertMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad());
- }
- else if(!ProfileManager.IsSignedInLive(m_iPad))
- {
- UINT uiIDA[1] = { IDS_OK };
- ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, m_iPad);
- }
- else
- {
- bool bContentRestricted=false;
-
- if(!bContentRestricted)
- ui.NavigateToScene(m_iPad, eUIScene_LeaderboardsMenu);
- }
- }
- break;
- case BUTTON_PAUSE_HELPANDOPTIONS:
- ui.NavigateToScene(m_iPad,eUIScene_HelpAndOptionsMenu);
- break;
- case BUTTON_PAUSE_SAVEGAME:
- PerformActionSaveGame();
- break;
- case BUTTON_PAUSE_EXITGAME:
- {
- Minecraft *pMinecraft = Minecraft::GetInstance();
- // Check if it's the trial version
- if(ProfileManager.IsFullVersion())
- {
- UINT uiIDA[3];
-
- // is it the primary player exiting?
- if(m_iPad==ProfileManager.GetPrimaryPad())
- {
- int playTime = -1;
- if( pMinecraft->localplayers[m_iPad] != nullptr )
- {
- playTime = static_cast(pMinecraft->localplayers[m_iPad]->getSessionTimer());
- }
-
-#if defined(_XBOX_ONE) || defined(__ORBIS__)
- uiIDA[0]=IDS_CONFIRM_CANCEL;
- uiIDA[1]=IDS_CONFIRM_OK;
-
- if(g_NetworkManager.IsHost() && StorageManager.GetSaveDisabled())
- {
- uiIDA[0]=IDS_CONFIRM_CANCEL;
- uiIDA[1]=IDS_EXIT_GAME_SAVE;
- uiIDA[2]=IDS_EXIT_GAME_NO_SAVE;
-
- if(g_NetworkManager.GetPlayerCount()>1)
- {
- ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, m_iPad,&UIScene_PauseMenu::ExitGameSaveDialogReturned, (LPVOID)GetCallbackUniqueId());
- }
- else
- {
- ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, m_iPad,&UIScene_PauseMenu::ExitGameSaveDialogReturned, (LPVOID)GetCallbackUniqueId());
- }
- }
- else if(g_NetworkManager.IsHost() && g_NetworkManager.GetPlayerCount()>1)
- {
- ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned, (LPVOID)GetCallbackUniqueId());
- }
- else
- {
- ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned, (LPVOID)GetCallbackUniqueId());
- }
-#else
- if(StorageManager.GetSaveDisabled())
- {
- uiIDA[0]=IDS_CONFIRM_CANCEL;
- uiIDA[1]=IDS_CONFIRM_OK;
- ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_PROGRESS_LOST, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned, (LPVOID)GetCallbackUniqueId());
- }
- else
- {
- if( g_NetworkManager.IsHost() )
- {
- uiIDA[0]=IDS_CONFIRM_CANCEL;
- uiIDA[1]=IDS_EXIT_GAME_SAVE;
- uiIDA[2]=IDS_EXIT_GAME_NO_SAVE;
-
- if(g_NetworkManager.GetPlayerCount()>1)
- {
- ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, m_iPad,&UIScene_PauseMenu::ExitGameSaveDialogReturned, (LPVOID)GetCallbackUniqueId());
- }
- else
- {
- ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, m_iPad,&UIScene_PauseMenu::ExitGameSaveDialogReturned, (LPVOID)GetCallbackUniqueId());
- }
- }
- else
- {
- uiIDA[0]=IDS_CONFIRM_CANCEL;
- uiIDA[1]=IDS_CONFIRM_OK;
-
- ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned, (LPVOID)GetCallbackUniqueId());
- }
- }
-#endif
- }
- else
- {
- int playTime = -1;
- if( pMinecraft->localplayers[m_iPad] != nullptr )
- {
- playTime = static_cast(pMinecraft->localplayers[m_iPad]->getSessionTimer());
- }
-
- TelemetryManager->RecordLevelExit(m_iPad, eSen_LevelExitStatus_Exited);
-
-
- // just exit the player
- app.SetAction(m_iPad,eAppAction_ExitPlayer);
- }
- }
- else
- {
- // is it the primary player exiting?
- if(m_iPad==ProfileManager.GetPrimaryPad())
- {
- int playTime = -1;
- if( pMinecraft->localplayers[m_iPad] != nullptr )
- {
- playTime = static_cast(pMinecraft->localplayers[m_iPad]->getSessionTimer());
- }
-
- // adjust the trial time played
- ui.ReduceTrialTimerValue();
-
- // exit the level
- UINT uiIDA[2];
- uiIDA[0]=IDS_CONFIRM_CANCEL;
- uiIDA[1]=IDS_CONFIRM_OK;
- ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_PROGRESS_LOST, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned, (LPVOID)GetCallbackUniqueId());
-
- }
- else
- {
- int playTime = -1;
- if( pMinecraft->localplayers[m_iPad] != nullptr )
- {
- playTime = static_cast(pMinecraft->localplayers[m_iPad]->getSessionTimer());
- }
-
- TelemetryManager->RecordLevelExit(m_iPad, eSen_LevelExitStatus_Exited);
-
- // just exit the player
- app.SetAction(m_iPad,eAppAction_ExitPlayer);
- }
- }
- }
+ default:
break;
}
}
-void UIScene_PauseMenu::PerformActionSaveGame()
+void UIScene_PauseMenu::ProcessEvent(Rml::Event& event)
{
- // 4J-PB - Is the player trying to save but they are using a trial texturepack ?
- if(!Minecraft::GetInstance()->skins->isUsingDefaultSkin())
+ if (m_bIgnoreInput)
+ return;
+
+ const Rml::String& id = event.GetCurrentElement()->GetId();
+
+ if (event == Rml::EventId::Click)
{
- TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected();
- DLCTexturePack *pDLCTexPack=static_cast(tPack);
-
- m_pDLCPack=pDLCTexPack->getDLCInfoParentPack();//tPack->getDLCPack();
-
- if(!m_pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" ))
- {
- return;
- }
- else
- {
- m_bTrialTexturePack = false;
- }
- }
-
- // does the save exist?
- bool bSaveExists;
- C4JStorage::ESaveGameState result=StorageManager.DoesSaveExist(&bSaveExists);
-
-#ifdef _XBOX
- if(result == C4JStorage::ELoadGame_DeviceRemoved)
- {
- // this will be a tester trying to be clever
- UINT uiIDA[2];
- uiIDA[0]=IDS_SELECTANEWDEVICE;
- uiIDA[1]=IDS_NODEVICE_DECLINE;
-
- ui.RequestAlertMessage(IDS_STORAGEDEVICEPROBLEM_TITLE, IDS_FAILED_TO_LOADSAVE_TEXT, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::DeviceRemovedDialogReturned,(LPVOID)GetCallbackUniqueId());
- }
- else
-#endif
- {
-#if defined(_XBOX_ONE) || defined(__ORBIS__)
- if(!m_savesDisabled)
- {
- UINT uiIDA[2];
- uiIDA[0]=IDS_CANCEL;
- uiIDA[1]=IDS_CONFIRM_OK;
- ui.RequestAlertMessage(IDS_TITLE_DISABLE_AUTOSAVE, IDS_CONFIRM_DISABLE_AUTOSAVE, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::DisableAutosaveDialogReturned,(LPVOID)GetCallbackUniqueId());
- }
- else
-#endif
- // we need to ask if they are sure they want to overwrite the existing game
- if(bSaveExists)
- {
- UINT uiIDA[2];
- uiIDA[0]=IDS_CONFIRM_CANCEL;
- uiIDA[1]=IDS_CONFIRM_OK;
- ui.RequestAlertMessage(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::SaveGameDialogReturned,(LPVOID)GetCallbackUniqueId());
- }
- else
- {
-#if defined(_XBOX_ONE) || defined(__ORBIS__)
- UINT uiIDA[2];
- uiIDA[0]=IDS_CONFIRM_CANCEL;
- uiIDA[1]=IDS_CONFIRM_OK;
- ui.RequestAlertMessage(IDS_TITLE_ENABLE_AUTOSAVE, IDS_CONFIRM_ENABLE_AUTOSAVE, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::EnableAutosaveDialogReturned,(LPVOID)GetCallbackUniqueId());
-#else
- // flag a app action of save game
- app.SetAction(m_iPad,eAppAction_SaveGame);
-#endif
- }
+ if (id == "resume") OnResume();
+ else if (id == "help_options") OnHelpAndOptions();
+ else if (id == "achievements") OnAchievements();
+ else if (id == "save_game") OnSaveGame();
+ else if (id == "exit_game") OnExitGame();
+ else if (id == "exit_save") OnExitSave();
+ else if (id == "exit_nosave") OnExitNoSave();
+ else if (id == "exit_cancel") OnExitCancel();
+ else if (id == "save_confirm") OnSaveConfirm();
+ else if (id == "save_cancel") OnSaveCancel();
}
}
void UIScene_PauseMenu::ShowScene(bool show)
{
- app.DebugPrintf("UIScene_PauseMenu::ShowScene is not implemented\n");
+ if (m_document)
+ {
+ if (show)
+ m_document->Show();
+ else
+ m_document->Hide();
+ }
}
-void UIScene_PauseMenu::HandleDLCInstalled()
+void UIScene_PauseMenu::navigateBack()
{
- // mounted DLC may have changed
- if(app.StartInstallDLCProcess(m_iPad)==false)
+ if (m_iPad == ProfileManager.GetPrimaryPad() && g_NetworkManager.IsLocalGame())
{
- // not doing a mount, so re-enable input
- //m_bIgnoreInput=false;
- app.DebugPrintf("UIScene_PauseMenu::HandleDLCInstalled - m_bIgnoreInput false\n");
+ app.SetXuiServerAction(ProfileManager.GetPrimaryPad(), eXuiServerAction_PauseServer, (void*)FALSE);
+ }
+
+ ui.PlayUISFX(eSFX_Back);
+ UIScene::navigateBack();
+}
+
+void UIScene_PauseMenu::OnResume()
+{
+ ui.PlayUISFX(eSFX_Back);
+ navigateBack();
+}
+
+void UIScene_PauseMenu::OnHelpAndOptions()
+{
+ ui.NavigateToScene(m_iPad, eUIScene_HelpAndOptionsMenu);
+}
+
+void UIScene_PauseMenu::OnAchievements()
+{
+ ui.NavigateToScene(m_iPad, eUIScene_AchievementsMenu);
+}
+
+void UIScene_PauseMenu::ShowSaveDialog(bool show)
+{
+ if (!m_document)
+ return;
+
+ auto* saveDialog = m_document->GetElementById("save_dialog");
+ auto* buttons = m_document->GetElementById("buttons");
+
+ if (show)
+ {
+ if (buttons) buttons->SetProperty("display", "none");
+ if (saveDialog) saveDialog->SetProperty("display", "block");
+
+ auto* saveText = m_document->GetElementById("save_text");
+
+ if (!ProfileManager.IsFullVersion())
+ {
+ if (saveText) saveText->SetInnerRML("You need to unlock the full game to save.");
+ }
+ else
+ {
+ if (saveText) saveText->SetInnerRML("Overwrite existing save?");
+ }
+
+ m_document->GetElementById("save_cancel")->Focus();
+ m_bSaveDialog = true;
}
else
{
- // 4J-PB - Somehow, on th edisc build, we get in here, but don't call HandleDLCMountingComplete, so input locks up
- //m_bIgnoreInput=true;
- app.DebugPrintf("UIScene_PauseMenu::HandleDLCInstalled - m_bIgnoreInput true\n");
+ if (saveDialog) saveDialog->SetProperty("display", "none");
+ if (buttons) buttons->SetProperty("display", "block");
+
+ m_document->GetElementById("save_game")->Focus();
+ m_bSaveDialog = false;
}
- // this will send a CustomMessage_DLCMountingComplete when done
}
-
-void UIScene_PauseMenu::HandleDLCMountingComplete()
-{
- // check if we should display the save option
-
- //m_bIgnoreInput=false;
- app.DebugPrintf("UIScene_PauseMenu::HandleDLCMountingComplete - m_bIgnoreInput false \n");
-
- // if(ProfileManager.IsFullVersion())
- // {
- // bool bIsisPrimaryHost=g_NetworkManager.IsHost() && (ProfileManager.GetPrimaryPad()==m_iPad);
- //
- // if(bIsisPrimaryHost)
- // {
- // m_buttons[BUTTON_PAUSE_SAVEGAME].setEnable(true);
- // }
- // }
-}
-
-int UIScene_PauseMenu::UnlockFullSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result)
+void UIScene_PauseMenu::OnSaveGame()
{
- Minecraft *pMinecraft=Minecraft::GetInstance();
+ if (m_iPad != ProfileManager.GetPrimaryPad())
+ return;
- if(result==C4JStorage::EMessage_ResultAccept)
+ if (!ProfileManager.IsFullVersion())
{
- if(ProfileManager.IsSignedInLive(pMinecraft->player->GetXboxPad()))
+ ShowSaveDialog(true);
+ return;
+ }
+
+ bool bSaveExists;
+ StorageManager.DoesSaveExist(&bSaveExists);
+
+ if (bSaveExists)
+ {
+ ShowSaveDialog(true);
+ }
+ else
+ {
+ app.SetAction(m_iPad, eAppAction_SaveGame);
+ }
+}
+
+void UIScene_PauseMenu::OnSaveConfirm()
+{
+ ShowSaveDialog(false);
+
+ if (!ProfileManager.IsFullVersion())
+ {
+ ProfileManager.DisplayFullVersionPurchase(false, m_iPad, eSen_UpsellID_Full_Version_Of_Game);
+ }
+ else
+ {
+ app.SetAction(m_iPad, eAppAction_SaveGame);
+ }
+}
+
+void UIScene_PauseMenu::OnSaveCancel()
+{
+ ShowSaveDialog(false);
+}
+
+void UIScene_PauseMenu::ShowExitDialog(bool show)
+{
+ if (!m_document)
+ return;
+
+ auto* exitDialog = m_document->GetElementById("exit_dialog");
+ auto* buttons = m_document->GetElementById("buttons");
+
+ if (show)
+ {
+ Minecraft* pMinecraft = Minecraft::GetInstance();
+
+ if (buttons) buttons->SetProperty("display", "none");
+ if (exitDialog) exitDialog->SetProperty("display", "block");
+
+ // Configure dialog for current state
+ auto* exitSave = m_document->GetElementById("exit_save");
+ auto* exitNosave = m_document->GetElementById("exit_nosave");
+ auto* exitCancel = m_document->GetElementById("exit_cancel");
+ auto* exitText = m_document->GetElementById("exit_text");
+
+ if (ProfileManager.IsFullVersion() && m_iPad == ProfileManager.GetPrimaryPad())
{
- // 4J-PB - need to check this user can access the store
-#if defined(__PS3__) || defined(__PSVITA__)
- bool bContentRestricted;
- ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),true,nullptr,&bContentRestricted,nullptr);
- if(bContentRestricted)
+ // Full version primary pad: show Save & Exit + Exit without Saving + Cancel
+ if (exitSave) exitSave->SetProperty("display", "inline-block");
+ if (exitNosave) exitNosave->SetProperty("display", "inline-block");
+
+ if (g_NetworkManager.GetPlayerCount() > 1)
{
- UINT uiIDA[1];
- uiIDA[0]=IDS_CONFIRM_OK;
- ui.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad());
+ if (exitText) exitText->SetInnerRML("Exit Game (disconnect other players)?");
}
else
-#endif
{
- ProfileManager.DisplayFullVersionPurchase(false,pMinecraft->player->GetXboxPad(),eSen_UpsellID_Full_Version_Of_Game);
+ if (exitText) exitText->SetInnerRML("Exit Game?");
}
+ if (exitCancel) exitCancel->Focus();
}
+ else if (!ProfileManager.IsFullVersion() && m_iPad == ProfileManager.GetPrimaryPad())
+ {
+ // Trial version: simple OK/Cancel, "progress will be lost"
+ if (exitSave) exitSave->SetProperty("display", "none");
+ if (exitNosave) exitNosave->SetProperty("display", "inline-block");
+ if (exitNosave) exitNosave->SetInnerRML("Yes");
+ if (exitText) exitText->SetInnerRML("Exit Game (progress will be lost)?");
+ if (exitCancel) exitCancel->Focus();
+ }
+
+ m_bExitDialog = true;
}
else
{
- //SentientManager.RecordUpsellResponded(iPad, eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID, eSen_UpsellOutcome_Declined);
- }
+ if (exitDialog) exitDialog->SetProperty("display", "none");
+ if (buttons) buttons->SetProperty("display", "block");
- return 0;
+ // Restore default button state
+ auto* exitSave = m_document->GetElementById("exit_save");
+ auto* exitNosave = m_document->GetElementById("exit_nosave");
+ if (exitSave) exitSave->SetProperty("display", "inline-block");
+ if (exitNosave) exitNosave->SetInnerRML("Exit without Saving");
+ if (exitNosave) exitNosave->SetProperty("display", "inline-block");
+
+ m_document->GetElementById("exit_game")->Focus();
+ m_bExitDialog = false;
+ }
}
-int UIScene_PauseMenu::SaveGame_SignInReturned(void *pParam,bool bContinue, int iPad)
+void UIScene_PauseMenu::OnExitGame()
{
- UIScene_PauseMenu* pClass = static_cast(ui.GetSceneFromCallbackId((size_t)pParam));
- if(pClass) pClass->SetIgnoreInput(false);
+ Minecraft* pMinecraft = Minecraft::GetInstance();
- if(bContinue==true)
+ // Non-primary pad: exit directly without dialog
+ if (m_iPad != ProfileManager.GetPrimaryPad())
{
- if(pClass) pClass->PerformActionSaveGame();
+ if (pMinecraft->localplayers[m_iPad] != nullptr)
+ TelemetryManager->RecordLevelExit(m_iPad, eSen_LevelExitStatus_Exited);
+ app.SetAction(m_iPad, eAppAction_ExitPlayer);
+ return;
}
- return 0;
+ // Primary pad: show inline confirmation dialog (no Iggy MessageBox)
+ ShowExitDialog(true);
}
-#ifdef _XBOX_ONE
-int UIScene_PauseMenu::BanGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result)
+void UIScene_PauseMenu::OnExitSave()
{
- // results switched for this dialog
- if(result==C4JStorage::EMessage_ResultDecline)
+ ShowExitDialog(false);
+ SetIgnoreInput(true);
+
+ Minecraft* pMinecraft = Minecraft::GetInstance();
+ if (pMinecraft->localplayers[m_iPad] != nullptr)
{
- app.SetAction(iPad,eAppAction_BanLevel);
+ int playTime = static_cast(pMinecraft->localplayers[m_iPad]->getSessionTimer());
+ TelemetryManager->RecordLevelExit(m_iPad, eSen_LevelExitStatus_Exited);
}
- return 0;
-}
-#endif
-void UIScene_PauseMenu::SetIgnoreInput(bool ignoreInput)
+ MinecraftServer::getInstance()->setSaveOnExit(true);
+ app.SetAction(m_iPad, eAppAction_ExitWorld);
+}
+
+void UIScene_PauseMenu::OnExitNoSave()
{
- m_bIgnoreInput = ignoreInput;
-}
\ No newline at end of file
+ ShowExitDialog(false);
+ SetIgnoreInput(true);
+
+ Minecraft* pMinecraft = Minecraft::GetInstance();
+ if (pMinecraft->localplayers[m_iPad] != nullptr)
+ {
+ int playTime = static_cast(pMinecraft->localplayers[m_iPad]->getSessionTimer());
+ TelemetryManager->RecordLevelExit(m_iPad, eSen_LevelExitStatus_Exited);
+ }
+
+ app.SetAction(m_iPad, eAppAction_ExitWorld);
+}
+
+void UIScene_PauseMenu::OnExitCancel()
+{
+ ShowExitDialog(false);
+}
diff --git a/Minecraft.Client/Common/UI/UIScene_PauseMenu.h b/Minecraft.Client/Common/UI/UIScene_PauseMenu.h
index 854b6aa5..9d67f593 100644
--- a/Minecraft.Client/Common/UI/UIScene_PauseMenu.h
+++ b/Minecraft.Client/Common/UI/UIScene_PauseMenu.h
@@ -1,103 +1,70 @@
#pragma once
+#pragma push_macro("byte")
+#pragma push_macro("GetNextSibling")
+#pragma push_macro("GetFirstChild")
+#undef byte
+#undef GetNextSibling
+#undef GetFirstChild
+
#include "UIScene.h"
#include "IUIScene_PauseMenu.h"
+#include
+#include
-#define BUTTON_PAUSE_RESUMEGAME 0
-#define BUTTON_PAUSE_HELPANDOPTIONS 1
-#define BUTTON_PAUSE_LEADERBOARDS 2
+// NOTE: pop_macro at end of file
-#ifdef _XBOX_ONE
-#define BUTTON_PAUSE_XBOXHELP 3
-#else
-#define BUTTON_PAUSE_ACHIEVEMENTS 3
-#endif
-
-#define BUTTON_PAUSE_SAVEGAME 4
-#define BUTTON_PAUSE_EXITGAME 5
-#define BUTTONS_PAUSE_MAX BUTTON_PAUSE_EXITGAME + 1
-
-class UIScene_PauseMenu : public UIScene, public IUIScene_PauseMenu
+class UIScene_PauseMenu : public UIScene, public IUIScene_PauseMenu, public Rml::EventListener
{
-private:
- bool m_savesDisabled;
- bool m_bTrialTexturePack;
- bool m_bErrorDialogRunning;
-
- enum eActions
- {
- eAction_None=0,
-#if defined(__PS3__) || defined(__PSVITA__) || defined(__ORBIS__)
- eAction_ViewLeaderboardsPSN,
- eAction_ViewInvitesPSN,
- eAction_SaveGamePSN,
- eAction_BuyTexturePackPSN
-#endif
-
- };
- eActions m_eAction;
-
- UIControl_Button m_buttons[BUTTONS_PAUSE_MAX];
- UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene)
- UI_MAP_ELEMENT( m_buttons[BUTTON_PAUSE_RESUMEGAME], "Button1")
- UI_MAP_ELEMENT( m_buttons[BUTTON_PAUSE_HELPANDOPTIONS], "Button2")
- UI_MAP_ELEMENT( m_buttons[BUTTON_PAUSE_LEADERBOARDS], "Button3")
-#ifdef _DURANGO
- UI_MAP_ELEMENT( m_buttons[BUTTON_PAUSE_XBOXHELP], "Button4")
-#else
- UI_MAP_ELEMENT( m_buttons[BUTTON_PAUSE_ACHIEVEMENTS], "Button4")
-#endif
- UI_MAP_ELEMENT( m_buttons[BUTTON_PAUSE_SAVEGAME], "Button5")
- UI_MAP_ELEMENT( m_buttons[BUTTON_PAUSE_EXITGAME], "Button6")
- UI_END_MAP_ELEMENTS_AND_NAMES()
-
- virtual void HandleDLCMountingComplete();
- virtual void HandleDLCInstalled();
-#ifdef _XBOX_ONE
- virtual void HandleDLCLicenseChange();
-#endif
- static int UnlockFullSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result);
- static int SaveGame_SignInReturned(void *pParam,bool bContinue, int iPad);
-
public:
UIScene_PauseMenu(int iPad, void *initData, UILayer *parentLayer);
virtual ~UIScene_PauseMenu();
- virtual EUIScene getSceneType() { return eUIScene_PauseMenu;}
+ virtual EUIScene getSceneType() { return eUIScene_PauseMenu; }
virtual void tick();
+ virtual void render(S32 width, S32 height, C4JRender::eViewportType viewport);
- virtual void updateTooltips();
- virtual void updateComponents();
- virtual void handlePreReload();
- virtual void handleReload();
-
-protected:
- void updateControlsVisibility();
-
- // TODO: This should be pure virtual in this class
- virtual wstring getMoviePath();
-
-public:
- // INPUT
virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled);
+ // Override focus/movie lifecycle for RmlUi (no Iggy movie)
+ virtual void gainFocus() override;
+ virtual void reloadMovie(bool force) override;
+
+ // Rml::EventListener
+ void ProcessEvent(Rml::Event& event) override;
+
protected:
- void handlePress(F64 controlId, F64 childId);
- virtual void ShowScene(bool show);
- virtual void SetIgnoreInput(bool ignoreInput);
- bool m_bIgnoreInput;
+ virtual wstring getMoviePath() { return L""; }
+
+ virtual void handleLoseFocus() override;
+
+ void ShowScene(bool show) override;
+ void SetIgnoreInput(bool ignoreInput) override { m_bIgnoreInput = ignoreInput; }
+
+ void navigateBack();
+
+ void OnResume();
+ void OnHelpAndOptions();
+ void OnAchievements();
+ void OnSaveGame();
+ void OnExitGame();
+ void OnExitSave();
+ void OnExitNoSave();
+ void OnExitCancel();
+ void OnSaveConfirm();
+ void OnSaveCancel();
+
+ void ShowExitDialog(bool show);
+ void ShowSaveDialog(bool show);
private:
- void PerformActionSaveGame();
-
-protected:
-#ifdef _XBOX_ONE
- static int BanGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result);
- virtual long long getDefaultGtcButtons() { return _360_GTC_BACK | _360_GTC_PLAY; }
-#endif
-
-#ifdef __ORBIS__
- bool CheckForPatch();
-#endif
+ Rml::ElementDocument* m_document;
+ bool m_bIgnoreInput;
+ bool m_bExitDialog;
+ bool m_bSaveDialog;
};
+
+#pragma pop_macro("GetFirstChild")
+#pragma pop_macro("GetNextSibling")
+#pragma pop_macro("byte")
diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SettingsMenu.cpp
index 497af6d1..4e70c087 100644
--- a/Minecraft.Client/Common/UI/UIScene_SettingsMenu.cpp
+++ b/Minecraft.Client/Common/UI/UIScene_SettingsMenu.cpp
@@ -1,168 +1,316 @@
+#include "stdafx.h"
+
+// Non-RmlUi includes that depend on Windows macros
#include "UI.h"
+#include "../../Minecraft.h"
+
+// RmlUi includes (Windows macros temporarily suppressed)
+#pragma push_macro("byte")
+#pragma push_macro("GetNextSibling")
+#pragma push_macro("GetFirstChild")
+#undef byte
+#undef GetNextSibling
+#undef GetFirstChild
+
#include "UIScene_SettingsMenu.h"
-#include "..\..\Minecraft.h"
+#include "RmlManager.h"
+#include "../../Windows64/KeyboardMouseInput.h"
+#include
+#include
-UIScene_SettingsMenu::UIScene_SettingsMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer)
+#pragma pop_macro("GetFirstChild")
+#pragma pop_macro("GetNextSibling")
+#pragma pop_macro("byte")
+
+UIScene_SettingsMenu::UIScene_SettingsMenu(int iPad, void *initData, UILayer *parentLayer)
+ : UIScene(iPad, parentLayer)
+ , m_document(nullptr)
+ , m_bConfirmDialog(false)
{
- // Setup all the Iggy references we need for this scene
- initialiseMovie();
-
- bool bNotInGame=(Minecraft::GetInstance()->level==nullptr);
-
- m_buttons[BUTTON_ALL_OPTIONS].init(IDS_OPTIONS,BUTTON_ALL_OPTIONS);
- m_buttons[BUTTON_ALL_AUDIO].init(IDS_AUDIO,BUTTON_ALL_AUDIO);
- m_buttons[BUTTON_ALL_CONTROL].init(IDS_CONTROL,BUTTON_ALL_CONTROL);
- m_buttons[BUTTON_ALL_GRAPHICS].init(IDS_GRAPHICS,BUTTON_ALL_GRAPHICS);
- m_buttons[BUTTON_ALL_UI].init(IDS_USER_INTERFACE,BUTTON_ALL_UI);
- m_buttons[BUTTON_ALL_RESETTODEFAULTS].init(IDS_RESET_TO_DEFAULTS,BUTTON_ALL_RESETTODEFAULTS);
-
- if(ProfileManager.GetPrimaryPad()!=m_iPad)
+ Rml::Context* ctx = RmlManager::Get().GetContext();
+ if (!ctx)
{
- removeControl( &m_buttons[BUTTON_ALL_AUDIO], bNotInGame);
- removeControl( &m_buttons[BUTTON_ALL_GRAPHICS], bNotInGame);
+ app.DebugPrintf("[RmlSettingsMenu] No RmlUi context available\n");
+ return;
}
- doHorizontalResizeCheck();
-
- if(app.GetLocalPlayerCount()>1)
+ m_document = ctx->LoadDocument("SettingsMenu.rml");
+ if (m_document)
{
-#if TO_BE_IMPLEMENTED
- app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad,false);
-#endif
+ m_document->Show();
+
+ // Apply conditional visibility matching original Iggy scene behavior
+ bool bNotInGame = (Minecraft::GetInstance()->level == nullptr);
+
+ // Audio and Graphics: hidden if not primary pad
+ if (ProfileManager.GetPrimaryPad() != m_iPad)
+ {
+ auto* elAudio = m_document->GetElementById("audio");
+ if (elAudio) elAudio->SetProperty("display", "none");
+ auto* elGraphics = m_document->GetElementById("graphics");
+ if (elGraphics) elGraphics->SetProperty("display", "none");
+ }
+
+ // Register button click listeners
+ m_document->GetElementById("options")->AddEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("audio")->AddEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("controls")->AddEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("graphics")->AddEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("ui")->AddEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("reset_defaults")->AddEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("confirm_yes")->AddEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("confirm_no")->AddEventListener(Rml::EventId::Click, this);
+
+ // Focus first visible button
+ m_document->GetElementById("options")->Focus();
}
+ else
+ {
+ app.DebugPrintf("[RmlSettingsMenu] Failed to load SettingsMenu.rml\n");
+ }
+
+ updateComponents();
+
+ ui.HidePressStart();
+ TelemetryManager->RecordMenuShown(m_iPad, eUIScene_SettingsMenu, 0);
}
UIScene_SettingsMenu::~UIScene_SettingsMenu()
{
-}
-
-wstring UIScene_SettingsMenu::getMoviePath()
-{
- if(app.GetLocalPlayerCount() > 1)
+ if (m_document)
{
- return L"SettingsMenuSplit";
- }
- else
- {
- return L"SettingsMenu";
+ m_document->GetElementById("options")->RemoveEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("audio")->RemoveEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("controls")->RemoveEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("graphics")->RemoveEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("ui")->RemoveEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("reset_defaults")->RemoveEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("confirm_yes")->RemoveEventListener(Rml::EventId::Click, this);
+ m_document->GetElementById("confirm_no")->RemoveEventListener(Rml::EventId::Click, this);
+ m_document->Close();
+ m_document = nullptr;
}
}
-void UIScene_SettingsMenu::handleReload()
+void UIScene_SettingsMenu::gainFocus()
{
- bool bNotInGame=(Minecraft::GetInstance()->level==nullptr);
- if(ProfileManager.GetPrimaryPad()!=m_iPad)
+ if (!bHasFocus && stealsFocus())
{
- removeControl( &m_buttons[BUTTON_ALL_AUDIO], bNotInGame);
- removeControl( &m_buttons[BUTTON_ALL_GRAPHICS], bNotInGame);
+ bHasFocus = true;
+ updateTooltips();
+ updateComponents();
+ if (!m_bFocussedOnce)
+ {
+ }
+ handleGainFocus(m_bFocussedOnce);
+ if (bHasFocus)
+ m_bFocussedOnce = true;
+ if (m_document)
+ m_document->Show();
}
+}
- doHorizontalResizeCheck();
+void UIScene_SettingsMenu::handleLoseFocus()
+{
+ if (m_document)
+ m_document->Hide();
}
void UIScene_SettingsMenu::updateTooltips()
{
- ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK);
}
void UIScene_SettingsMenu::updateComponents()
{
- bool bNotInGame=(Minecraft::GetInstance()->level==nullptr);
- if(bNotInGame)
+ bool bNotInGame = (Minecraft::GetInstance()->level == nullptr);
+
+ if (bNotInGame)
{
- m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true);
- m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true);
+ m_parentLayer->showComponent(m_iPad, eUIComponent_Panorama, true);
+ m_parentLayer->showComponent(m_iPad, eUIComponent_Logo, true);
}
else
{
- m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,false);
-
- if( app.GetLocalPlayerCount() == 1 ) m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true);
- else m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false);
+ m_parentLayer->showComponent(m_iPad, eUIComponent_Panorama, false);
+ if (app.GetLocalPlayerCount() == 1)
+ m_parentLayer->showComponent(m_iPad, eUIComponent_Logo, true);
+ else
+ m_parentLayer->showComponent(m_iPad, eUIComponent_Logo, false);
}
}
+void UIScene_SettingsMenu::reloadMovie(bool force)
+{
+}
+
+void UIScene_SettingsMenu::tick()
+{
+ m_hasTickedOnce = true;
+
+ UIScene::tick();
+
+ Rml::Context* ctx = RmlManager::Get().GetContext();
+ if (!ctx || !bHasFocus)
+ return;
+
+ ctx->ProcessMouseMove(g_KBMInput.GetMouseX(), g_KBMInput.GetMouseY(), 0);
+
+ if (g_KBMInput.IsMouseButtonPressed(KeyboardMouseInput::MOUSE_LEFT))
+ ctx->ProcessMouseButtonDown(0, 0);
+ if (g_KBMInput.IsMouseButtonReleased(KeyboardMouseInput::MOUSE_LEFT))
+ ctx->ProcessMouseButtonUp(0, 0);
+ if (g_KBMInput.IsMouseButtonPressed(KeyboardMouseInput::MOUSE_RIGHT))
+ ctx->ProcessMouseButtonDown(1, 0);
+ if (g_KBMInput.IsMouseButtonReleased(KeyboardMouseInput::MOUSE_RIGHT))
+ ctx->ProcessMouseButtonUp(1, 0);
+
+ int wheelDelta = g_KBMInput.GetMouseWheel();
+ if (wheelDelta != 0)
+ ctx->ProcessMouseWheel(wheelDelta / -120, 0);
+
+ ctx->Update();
+}
+
+void UIScene_SettingsMenu::render(S32 width, S32 height, C4JRender::eViewportType viewport)
+{
+}
+
void UIScene_SettingsMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled)
{
- //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE");
- ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released);
+ Rml::Context* ctx = RmlManager::Get().GetContext();
+ if (!ctx)
+ return;
- switch(key)
+ if (!pressed)
+ return;
+
+ switch (key)
{
- case ACTION_MENU_CANCEL:
- if(pressed)
- {
- // if the profile data has been changed, then force a profile write
- // It seems we're allowed to break the 5 minute rule if it's the result of a user action
-
- app.CheckGameSettingsChanged(true,iPad);
- navigateBack();
- }
+ case ACTION_MENU_UP:
+ ctx->ProcessKeyDown(Rml::Input::KI_UP, 0);
+ handled = true;
+ break;
+ case ACTION_MENU_DOWN:
+ ctx->ProcessKeyDown(Rml::Input::KI_DOWN, 0);
+ handled = true;
break;
case ACTION_MENU_OK:
-#ifdef __ORBIS__
- case ACTION_MENU_TOUCHPAD_PRESS:
-#endif
- sendInputToMovie(key, repeat, pressed, released);
- break;
- case ACTION_MENU_UP:
- case ACTION_MENU_DOWN:
- sendInputToMovie(key, repeat, pressed, released);
- break;
- }
-}
-
-void UIScene_SettingsMenu::handlePress(F64 controlId, F64 childId)
-{
- //CD - Added for audio
- ui.PlayUISFX(eSFX_Press);
-
- switch(static_cast(controlId))
- {
- case BUTTON_ALL_OPTIONS:
- ui.NavigateToScene(m_iPad, eUIScene_SettingsOptionsMenu);
- break;
- case BUTTON_ALL_AUDIO:
- ui.NavigateToScene(m_iPad, eUIScene_SettingsAudioMenu);
- break;
- case BUTTON_ALL_CONTROL:
- ui.NavigateToScene(m_iPad, eUIScene_SettingsControlMenu);
- break;
- case BUTTON_ALL_GRAPHICS:
- ui.NavigateToScene(m_iPad, eUIScene_SettingsGraphicsMenu);
- break;
- case BUTTON_ALL_UI:
- ui.NavigateToScene(m_iPad, eUIScene_SettingsUIMenu);
- break;
- case BUTTON_ALL_RESETTODEFAULTS:
+ if (g_KBMInput.IsKeyPressed(VK_RETURN))
{
- // check they really want to do this
- UINT uiIDA[2];
- uiIDA[0]=IDS_CONFIRM_CANCEL;
- uiIDA[1]=IDS_CONFIRM_OK;
-
- ui.RequestAlertMessage(IDS_DEFAULTS_TITLE, IDS_DEFAULTS_TEXT, uiIDA, 2, m_iPad,&UIScene_SettingsMenu::ResetDefaultsDialogReturned,this);
- }
+ ctx->ProcessKeyDown(Rml::Input::KI_RETURN, 0);
+ handled = true;
+ }
+ break;
+ case ACTION_MENU_CANCEL:
+ case ACTION_MENU_PAUSEMENU:
+ if (m_bConfirmDialog)
+ {
+ OnConfirmNo();
+ handled = true;
+ }
+ else
+ {
+ app.CheckGameSettingsChanged(true, iPad);
+ navigateBack();
+ handled = true;
+ }
+ break;
+ default:
break;
}
}
-int UIScene_SettingsMenu::ResetDefaultsDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result)
+void UIScene_SettingsMenu::ProcessEvent(Rml::Event& event)
{
- UIScene_SettingsMenu* pClass = static_cast(pParam);
+ const Rml::String& id = event.GetCurrentElement()->GetId();
- // results switched for this dialog
- if(result==C4JStorage::EMessage_ResultDecline)
+ if (event == Rml::EventId::Click)
{
-#if (defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__)
- app.SetDefaultOptions(StorageManager.GetDashboardProfileSettings(pClass->m_iPad),pClass->m_iPad);
-#else
- app.SetDefaultOptions(ProfileManager.GetDashboardProfileSettings(pClass->m_iPad),pClass->m_iPad);
-#endif
- // if the profile data has been changed, then force a profile write
- // It seems we're allowed to break the 5 minute rule if it's the result of a user action
- app.CheckGameSettingsChanged(true,iPad);
+ if (id == "options") OnOptions();
+ else if (id == "audio") OnAudio();
+ else if (id == "controls") OnControls();
+ else if (id == "graphics") OnGraphics();
+ else if (id == "ui") OnUI();
+ else if (id == "reset_defaults") OnResetToDefaults();
+ else if (id == "confirm_yes") OnConfirmYes();
+ else if (id == "confirm_no") OnConfirmNo();
}
- return 0;
+}
+
+void UIScene_SettingsMenu::navigateBack()
+{
+ ui.PlayUISFX(eSFX_Back);
+ UIScene::navigateBack();
+}
+
+void UIScene_SettingsMenu::OnOptions()
+{
+ ui.PlayUISFX(eSFX_Press);
+ ui.NavigateToScene(m_iPad, eUIScene_SettingsOptionsMenu);
+}
+
+void UIScene_SettingsMenu::OnAudio()
+{
+ ui.PlayUISFX(eSFX_Press);
+ ui.NavigateToScene(m_iPad, eUIScene_SettingsAudioMenu);
+}
+
+void UIScene_SettingsMenu::OnControls()
+{
+ ui.PlayUISFX(eSFX_Press);
+ ui.NavigateToScene(m_iPad, eUIScene_SettingsControlMenu);
+}
+
+void UIScene_SettingsMenu::OnGraphics()
+{
+ ui.PlayUISFX(eSFX_Press);
+ ui.NavigateToScene(m_iPad, eUIScene_SettingsGraphicsMenu);
+}
+
+void UIScene_SettingsMenu::OnUI()
+{
+ ui.PlayUISFX(eSFX_Press);
+ ui.NavigateToScene(m_iPad, eUIScene_SettingsUIMenu);
+}
+
+void UIScene_SettingsMenu::ShowConfirmDialog(bool show)
+{
+ if (!m_document)
+ return;
+
+ auto* confirmDialog = m_document->GetElementById("confirm_dialog");
+ auto* buttons = m_document->GetElementById("buttons");
+
+ if (show)
+ {
+ if (buttons) buttons->SetProperty("display", "none");
+ if (confirmDialog) confirmDialog->SetProperty("display", "block");
+ m_document->GetElementById("confirm_no")->Focus();
+ m_bConfirmDialog = true;
+ }
+ else
+ {
+ if (confirmDialog) confirmDialog->SetProperty("display", "none");
+ if (buttons) buttons->SetProperty("display", "block");
+ m_document->GetElementById("reset_defaults")->Focus();
+ m_bConfirmDialog = false;
+ }
+}
+
+void UIScene_SettingsMenu::OnResetToDefaults()
+{
+ ShowConfirmDialog(true);
+}
+
+void UIScene_SettingsMenu::OnConfirmYes()
+{
+ app.SetDefaultOptions(ProfileManager.GetDashboardProfileSettings(m_iPad), m_iPad);
+ app.CheckGameSettingsChanged(true, m_iPad);
+ navigateBack();
+}
+
+void UIScene_SettingsMenu::OnConfirmNo()
+{
+ ShowConfirmDialog(false);
}
diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsMenu.h b/Minecraft.Client/Common/UI/UIScene_SettingsMenu.h
index 7f5fe169..f63ebb32 100644
--- a/Minecraft.Client/Common/UI/UIScene_SettingsMenu.h
+++ b/Minecraft.Client/Common/UI/UIScene_SettingsMenu.h
@@ -1,47 +1,63 @@
#pragma once
+#pragma push_macro("byte")
+#pragma push_macro("GetNextSibling")
+#pragma push_macro("GetFirstChild")
+#undef byte
+#undef GetNextSibling
+#undef GetFirstChild
+
#include "UIScene.h"
+#include
+#include
-#define BUTTON_ALL_OPTIONS 0
-#define BUTTON_ALL_AUDIO 1
-#define BUTTON_ALL_CONTROL 2
-#define BUTTON_ALL_GRAPHICS 4
-#define BUTTON_ALL_UI 5
-#define BUTTON_ALL_RESETTODEFAULTS 6
-#define BUTTONS_ALL_MAX BUTTON_ALL_RESETTODEFAULTS + 1
+// NOTE: pop_macro at end of file
-class UIScene_SettingsMenu : public UIScene
+class UIScene_SettingsMenu : public UIScene, public Rml::EventListener
{
-private:
- UIControl_Button m_buttons[BUTTONS_ALL_MAX];
- UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene)
- UI_MAP_ELEMENT( m_buttons[BUTTON_ALL_OPTIONS], "Button1")
- UI_MAP_ELEMENT( m_buttons[BUTTON_ALL_AUDIO], "Button2")
- UI_MAP_ELEMENT( m_buttons[BUTTON_ALL_CONTROL], "Button3")
- UI_MAP_ELEMENT( m_buttons[BUTTON_ALL_GRAPHICS], "Button4")
- UI_MAP_ELEMENT( m_buttons[BUTTON_ALL_UI], "Button5")
- UI_MAP_ELEMENT( m_buttons[BUTTON_ALL_RESETTODEFAULTS], "Button6")
- UI_END_MAP_ELEMENTS_AND_NAMES()
public:
UIScene_SettingsMenu(int iPad, void *initData, UILayer *parentLayer);
virtual ~UIScene_SettingsMenu();
- virtual EUIScene getSceneType() { return eUIScene_SettingsMenu;}
-
- virtual void updateTooltips();
- virtual void updateComponents();
- virtual void handleReload();
+ virtual EUIScene getSceneType() { return eUIScene_SettingsMenu; }
-protected:
- // TODO: This should be pure virtual in this class
- virtual wstring getMoviePath();
+ virtual void tick();
+ virtual void render(S32 width, S32 height, C4JRender::eViewportType viewport);
-public:
- // INPUT
virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled);
-protected:
- void handlePress(F64 controlId, F64 childId);
+ // Override focus/movie lifecycle for RmlUi (no Iggy movie)
+ virtual void gainFocus() override;
+ virtual void reloadMovie(bool force) override;
- static int ResetDefaultsDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result);
-};
\ No newline at end of file
+ // Rml::EventListener
+ void ProcessEvent(Rml::Event& event) override;
+
+protected:
+ virtual wstring getMoviePath() { return L""; }
+
+ virtual void handleLoseFocus() override;
+ virtual void updateTooltips() override;
+ virtual void updateComponents() override;
+
+ void navigateBack();
+
+ void OnOptions();
+ void OnAudio();
+ void OnControls();
+ void OnGraphics();
+ void OnUI();
+ void OnResetToDefaults();
+ void OnConfirmYes();
+ void OnConfirmNo();
+
+ void ShowConfirmDialog(bool show);
+
+private:
+ Rml::ElementDocument* m_document;
+ bool m_bConfirmDialog;
+};
+
+#pragma pop_macro("GetFirstChild")
+#pragma pop_macro("GetNextSibling")
+#pragma pop_macro("byte")
diff --git a/Minecraft.Client/Common/UI/UIStructs.h b/Minecraft.Client/Common/UI/UIStructs.h
index aad77d3f..78869b1a 100644
--- a/Minecraft.Client/Common/UI/UIStructs.h
+++ b/Minecraft.Client/Common/UI/UIStructs.h
@@ -367,19 +367,19 @@ typedef struct _LaunchMoreOptionsMenuInitData
_LaunchMoreOptionsMenuInitData()
{
- memset(this,0,sizeof(_LaunchMoreOptionsMenuInitData));
bOnlineGame = true;
+ bInviteOnly = false;
bAllowFriendsOfFriends = true;
+ bGenerateOptions = false;
+ bStructures = false;
+ bFlatWorld = false;
+ bBonusChest = false;
bPVP = true;
+ bTrust = false;
bFireSpreads = true;
bTNT = true;
- iPad = -1;
- worldSize = 3;
- seed = L"";
- bDisableSaving = false;
- newWorldSize = e_worldSize_Unknown;
- newWorldSizeOverwriteEdges = false;
-
+ bHostPrivileges = false;
+ bResetNether = false;
bMobGriefing = true;
bKeepInventory = false;
bDoMobSpawning = true;
@@ -387,6 +387,15 @@ typedef struct _LaunchMoreOptionsMenuInitData
bDoTileDrops = true;
bNaturalRegeneration = true;
bDoDaylightCycle = true;
+ bOnlineSettingChangedBySystem = false;
+ iPad = -1;
+ dwTexturePack = 0;
+ seed = L"";
+ worldSize = 3;
+ bDisableSaving = false;
+ currentWorldSize = e_worldSize_Unknown;
+ newWorldSize = e_worldSize_Unknown;
+ newWorldSizeOverwriteEdges = false;
}
}
LaunchMoreOptionsMenuInitData;
diff --git a/Minecraft.Client/GameRenderer.cpp b/Minecraft.Client/GameRenderer.cpp
index 41894eb6..d853eae9 100644
--- a/Minecraft.Client/GameRenderer.cpp
+++ b/Minecraft.Client/GameRenderer.cpp
@@ -240,7 +240,7 @@ void GameRenderer::tick(bool first) // 4J - add bFirst
PIXEndNamedEvent();
darkenWorldAmountO = darkenWorldAmount;
- int idx = BossMobGuiInfo::getIndexFromDimension((int)mc->level->dimension);
+ int idx = BossMobGuiInfo::getIndexFromDimension((int)(intptr_t)mc->level->dimension);
if (BossMobGuiInfo::darkenWorld[idx])
{
darkenWorldAmount += 1.0f / (static_cast(SharedConstants::TICKS_PER_SECOND) * 1);
diff --git a/Minecraft.Client/MinecraftServer.h b/Minecraft.Client/MinecraftServer.h
index cf9c7bec..7674cecd 100644
--- a/Minecraft.Client/MinecraftServer.h
+++ b/Minecraft.Client/MinecraftServer.h
@@ -265,6 +265,8 @@ private:
private:
// 4J Added
bool m_saveOnExit;
+ bool m_deleteWorldOnExit; // 4J Added - for hardcore mode world deletion
+ wstring m_saveFolderName; // 4J Added - stored for hardcore world deletion
bool m_suspending;
public:
@@ -278,6 +280,9 @@ public:
void chunkPacketManagement_PostTick();
void setSaveOnExit(bool save) { m_saveOnExit = save; s_bSaveOnExitAnswered = true; }
+ void setDeleteWorldOnExit(bool del) { m_deleteWorldOnExit = del; }
+ bool getDeleteWorldOnExit() const { return m_deleteWorldOnExit; }
+ const wstring& getSaveFolderName() const { return m_saveFolderName; }
void Suspend();
bool IsSuspending();
diff --git a/Minecraft.Client/RmlManager.cpp b/Minecraft.Client/RmlManager.cpp
new file mode 100644
index 00000000..4e5aa17a
--- /dev/null
+++ b/Minecraft.Client/RmlManager.cpp
@@ -0,0 +1,156 @@
+#include "stdafx.h"
+#include "RmlManager.h"
+
+extern ID3D11Device* g_pd3dDevice;
+extern ID3D11DeviceContext* g_pImmediateContext;
+extern ID3D11RenderTargetView* g_pRenderTargetView;
+
+RmlManager& RmlManager::Get()
+{
+ static RmlManager instance;
+ return instance;
+}
+
+RmlManager::RmlManager()
+ : m_initialised(false)
+ , m_context(nullptr)
+{
+}
+
+RmlManager::~RmlManager()
+{
+ Shutdown();
+}
+
+bool RmlManager::Init(int viewport_width, int viewport_height)
+{
+ if (m_initialised)
+ return true;
+
+ m_file_interface = std::make_unique();
+ m_system_interface = std::make_unique();
+ m_renderer = std::make_unique(g_pd3dDevice, g_pImmediateContext);
+
+ if (!m_renderer->IsInitialised())
+ {
+ app.DebugPrintf("[RmlManager] Renderer failed to initialise\n");
+ return false;
+ }
+
+ // Set asset path for RmlUi files (relative to exe directory)
+ char exePath[MAX_PATH];
+ GetModuleFileNameA(nullptr, exePath, MAX_PATH);
+ char* lastSlash = strrchr(exePath, '\\');
+ if (lastSlash)
+ *(lastSlash + 1) = '\0';
+ Rml::String assetPath = Rml::String(exePath) + "Assets/RmlUiAssets";
+ m_file_interface->SetAssetPath(assetPath);
+
+ Rml::SetRenderInterface(m_renderer.get());
+ Rml::SetSystemInterface(m_system_interface.get());
+ Rml::SetFileInterface(m_file_interface.get());
+
+ if (!Rml::Initialise())
+ {
+ app.DebugPrintf("[RmlManager] RmlUi Core failed to initialise\n");
+ return false;
+ }
+
+ // Load default fonts
+ Rml::LoadFontFace("C:/Windows/Fonts/segoeui.ttf", false);
+ Rml::LoadFontFace("C:/Windows/Fonts/segoeuib.ttf", false);
+ Rml::LoadFontFace("C:/Windows/Fonts/segoeuii.ttf", false);
+ Rml::LoadFontFace("C:/Windows/Fonts/segoeuiz.ttf", false);
+
+ // Minecraft's UI fonts (from tryashtar/minecraft-ttf)
+ if (!Rml::LoadFontFace(assetPath + "/fonts/Mojangles.ttf", "Minecraft Default", Rml::Style::FontStyle::Normal, Rml::Style::FontWeight::Normal, false))
+ app.DebugPrintf("[RmlManager] FAILED loading Mojangles.ttf\n");
+ if (!Rml::LoadFontFace(assetPath + "/fonts/MinecraftTen.ttf", "Minecraft Default", Rml::Style::FontStyle::Normal, Rml::Style::FontWeight::Bold, true))
+ app.DebugPrintf("[RmlManager] FAILED loading MinecraftTen.ttf\n");
+
+ m_context = Rml::CreateContext("main", Rml::Vector2i(viewport_width, viewport_height));
+ if (!m_context)
+ {
+ app.DebugPrintf("[RmlManager] Failed to create RmlUi context\n");
+ Rml::Shutdown();
+ return false;
+ }
+ app.DebugPrintf("[RmlManager] Context created (%dx%d)\n", viewport_width, viewport_height);
+
+ m_renderer->SetViewport(viewport_width, viewport_height);
+ m_initialised = true;
+ app.DebugPrintf("[RmlManager] Initialised (%dx%d)\n", viewport_width, viewport_height);
+ return true;
+}
+
+void RmlManager::Shutdown()
+{
+ if (!m_initialised)
+ return;
+
+ if (m_context)
+ {
+ m_context->UnloadAllDocuments();
+ Rml::RemoveContext(m_context->GetName());
+ m_context = nullptr;
+ }
+
+ Rml::Shutdown();
+
+ m_renderer.reset();
+ m_system_interface.reset();
+ m_file_interface.reset();
+
+ m_initialised = false;
+ app.DebugPrintf("[RmlManager] Shutdown\n");
+}
+
+void RmlManager::Update()
+{
+ if (!m_initialised || !m_context)
+ return;
+ m_context->Update();
+}
+
+void RmlManager::Render()
+{
+ if (!m_initialised || !m_context)
+ return;
+
+ // Ensure we render to the backbuffer (gamma post-process may have restored a
+ // different RTV). Use the singleton backbuffer RTV that the rest of the engine
+ // binds at frame start.
+ if (g_pRenderTargetView)
+ {
+ ID3D11DepthStencilView* nullDSV = nullptr;
+ g_pImmediateContext->OMSetRenderTargets(1, &g_pRenderTargetView, nullDSV);
+ }
+
+ // Clear any SRV still bound from gamma post-process so it doesn't
+ // interfere with RmlUi's own texture binding.
+ ID3D11ShaderResourceView* nullSRV[1] = { nullptr };
+ g_pImmediateContext->PSSetShaderResources(0, 1, nullSRV);
+
+ m_renderer->BeginFrame();
+
+ int docCount = 0;
+ for (int i = 0; i < m_context->GetNumDocuments(); i++)
+ {
+ auto* doc = m_context->GetDocument(i);
+ if (doc && doc->IsVisible())
+ docCount++;
+ }
+ if (docCount == 0)
+ app.DebugPrintf("[RmlManager] WARNING: No visible documents in context\n");
+
+ m_context->Render();
+ m_renderer->EndFrame();
+}
+
+void RmlManager::OnResize(int width, int height)
+{
+ if (!m_initialised || !m_context)
+ return;
+ m_context->SetDimensions(Rml::Vector2i(width, height));
+ m_renderer->SetViewport(width, height);
+}
diff --git a/Minecraft.Client/RmlManager.h b/Minecraft.Client/RmlManager.h
new file mode 100644
index 00000000..e9af36da
--- /dev/null
+++ b/Minecraft.Client/RmlManager.h
@@ -0,0 +1,52 @@
+#pragma once
+
+#pragma push_macro("byte")
+#pragma push_macro("GetNextSibling")
+#pragma push_macro("GetFirstChild")
+#undef byte
+#undef GetNextSibling
+#undef GetFirstChild
+
+#include
+#include
+#include
+#include "RmlUi_Renderer_D3D11.h"
+#include "RmlUi_SystemInterface_Win64.h"
+#include "RmlUi_FileInterface.h"
+
+// NOTE: pop_macro at end of file
+
+class RmlManager
+{
+public:
+ static RmlManager& Get();
+
+ bool Init(int viewport_width, int viewport_height);
+ void Shutdown();
+
+ void Update();
+ void Render();
+
+ Rml::Context* GetContext() const { return m_context; }
+ RenderInterface_D3D11* GetRenderInterface() const { return m_renderer.get(); }
+
+ void OnResize(int width, int height);
+
+private:
+ RmlManager();
+ ~RmlManager();
+ RmlManager(const RmlManager&) = delete;
+ RmlManager& operator=(const RmlManager&) = delete;
+
+ bool m_initialised;
+
+ std::unique_ptr m_renderer;
+ std::unique_ptr m_system_interface;
+ std::unique_ptr m_file_interface;
+
+ Rml::Context* m_context;
+};
+
+#pragma pop_macro("GetFirstChild")
+#pragma pop_macro("GetNextSibling")
+#pragma pop_macro("byte")
diff --git a/Minecraft.Client/Tesselator.h b/Minecraft.Client/Tesselator.h
index 2edc4a24..d0be867a 100644
--- a/Minecraft.Client/Tesselator.h
+++ b/Minecraft.Client/Tesselator.h
@@ -1,5 +1,7 @@
#pragma once
+#include
+
class ChunkRebuildData;
class Tesselator {
diff --git a/Minecraft.Client/TileRenderer.cpp b/Minecraft.Client/TileRenderer.cpp
index a5ee810f..4356437d 100644
--- a/Minecraft.Client/TileRenderer.cpp
+++ b/Minecraft.Client/TileRenderer.cpp
@@ -156,7 +156,7 @@ TileRenderer::TileRenderer( LevelSource* level, int xMin, int yMin, int zMin, un
this->zMin2 = zMin-2;
this->tileIds = tileIds;
cache = s_tlsCache;
- std::memset(cache, 0, TILE_RENDERER_CACHE_SIZE * sizeof(unsigned int));
+ memset(cache, 0, TILE_RENDERER_CACHE_SIZE * sizeof(unsigned int));
}
TileRenderer::~TileRenderer() = default;
diff --git a/Minecraft.Client/Windows64/Libs/4JLibs/impls/Windows_Libs/Render/vendor/DirectXMath/DirectXColors.h b/Minecraft.Client/Windows64/Libs/4JLibs/impls/Windows_Libs/Render/vendor/DirectXMath/DirectXColors.h
new file mode 100644
index 00000000..18614505
--- /dev/null
+++ b/Minecraft.Client/Windows64/Libs/4JLibs/impls/Windows_Libs/Render/vendor/DirectXMath/DirectXColors.h
@@ -0,0 +1,311 @@
+//-------------------------------------------------------------------------------------
+// DirectXColors.h -- C++ Color Math library
+//
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+//
+// https://go.microsoft.com/fwlink/?LinkID=615560
+//-------------------------------------------------------------------------------------
+
+#pragma once
+
+#include "DirectXMath.h"
+
+namespace DirectX
+{
+
+ namespace Colors
+ {
+ // Standard colors (Red/Green/Blue/Alpha) in sRGB colorspace
+ XMGLOBALCONST XMVECTORF32 AliceBlue = { { { 0.941176534f, 0.972549081f, 1.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 AntiqueWhite = { { { 0.980392218f, 0.921568692f, 0.843137324f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Aqua = { { { 0.f, 1.f, 1.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Aquamarine = { { { 0.498039246f, 1.f, 0.831372619f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Azure = { { { 0.941176534f, 1.f, 1.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Beige = { { { 0.960784376f, 0.960784376f, 0.862745166f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Bisque = { { { 1.f, 0.894117713f, 0.768627524f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Black = { { { 0.f, 0.f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 BlanchedAlmond = { { { 1.f, 0.921568692f, 0.803921640f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Blue = { { { 0.f, 0.f, 1.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 BlueViolet = { { { 0.541176498f, 0.168627456f, 0.886274576f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Brown = { { { 0.647058845f, 0.164705887f, 0.164705887f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 BurlyWood = { { { 0.870588303f, 0.721568644f, 0.529411793f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 CadetBlue = { { { 0.372549027f, 0.619607866f, 0.627451003f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Chartreuse = { { { 0.498039246f, 1.f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Chocolate = { { { 0.823529482f, 0.411764741f, 0.117647067f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Coral = { { { 1.f, 0.498039246f, 0.313725501f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 CornflowerBlue = { { { 0.392156899f, 0.584313750f, 0.929411829f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Cornsilk = { { { 1.f, 0.972549081f, 0.862745166f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Crimson = { { { 0.862745166f, 0.078431375f, 0.235294133f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Cyan = { { { 0.f, 1.f, 1.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkBlue = { { { 0.f, 0.f, 0.545098066f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkCyan = { { { 0.f, 0.545098066f, 0.545098066f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkGoldenrod = { { { 0.721568644f, 0.525490224f, 0.043137256f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkGray = { { { 0.662745118f, 0.662745118f, 0.662745118f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkGreen = { { { 0.f, 0.392156899f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkKhaki = { { { 0.741176486f, 0.717647076f, 0.419607878f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkMagenta = { { { 0.545098066f, 0.f, 0.545098066f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkOliveGreen = { { { 0.333333343f, 0.419607878f, 0.184313729f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkOrange = { { { 1.f, 0.549019635f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkOrchid = { { { 0.600000024f, 0.196078449f, 0.800000072f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkRed = { { { 0.545098066f, 0.f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkSalmon = { { { 0.913725555f, 0.588235319f, 0.478431404f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkSeaGreen = { { { 0.560784340f, 0.737254918f, 0.545098066f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkSlateBlue = { { { 0.282352954f, 0.239215702f, 0.545098066f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkSlateGray = { { { 0.184313729f, 0.309803933f, 0.309803933f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkTurquoise = { { { 0.f, 0.807843208f, 0.819607913f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkViolet = { { { 0.580392182f, 0.f, 0.827451050f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DeepPink = { { { 1.f, 0.078431375f, 0.576470613f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DeepSkyBlue = { { { 0.f, 0.749019623f, 1.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DimGray = { { { 0.411764741f, 0.411764741f, 0.411764741f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DodgerBlue = { { { 0.117647067f, 0.564705908f, 1.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Firebrick = { { { 0.698039234f, 0.133333340f, 0.133333340f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 FloralWhite = { { { 1.f, 0.980392218f, 0.941176534f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 ForestGreen = { { { 0.133333340f, 0.545098066f, 0.133333340f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Fuchsia = { { { 1.f, 0.f, 1.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Gainsboro = { { { 0.862745166f, 0.862745166f, 0.862745166f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 GhostWhite = { { { 0.972549081f, 0.972549081f, 1.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Gold = { { { 1.f, 0.843137324f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Goldenrod = { { { 0.854902029f, 0.647058845f, 0.125490203f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Gray = { { { 0.501960814f, 0.501960814f, 0.501960814f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Green = { { { 0.f, 0.501960814f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 GreenYellow = { { { 0.678431392f, 1.f, 0.184313729f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Honeydew = { { { 0.941176534f, 1.f, 0.941176534f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 HotPink = { { { 1.f, 0.411764741f, 0.705882370f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 IndianRed = { { { 0.803921640f, 0.360784322f, 0.360784322f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Indigo = { { { 0.294117659f, 0.f, 0.509803951f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Ivory = { { { 1.f, 1.f, 0.941176534f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Khaki = { { { 0.941176534f, 0.901960850f, 0.549019635f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Lavender = { { { 0.901960850f, 0.901960850f, 0.980392218f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LavenderBlush = { { { 1.f, 0.941176534f, 0.960784376f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LawnGreen = { { { 0.486274540f, 0.988235354f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LemonChiffon = { { { 1.f, 0.980392218f, 0.803921640f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LightBlue = { { { 0.678431392f, 0.847058892f, 0.901960850f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LightCoral = { { { 0.941176534f, 0.501960814f, 0.501960814f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LightCyan = { { { 0.878431439f, 1.f, 1.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LightGoldenrodYellow = { { { 0.980392218f, 0.980392218f, 0.823529482f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LightGray = { { { 0.827451050f, 0.827451050f, 0.827451050f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LightGreen = { { { 0.564705908f, 0.933333397f, 0.564705908f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LightPink = { { { 1.f, 0.713725507f, 0.756862819f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LightSalmon = { { { 1.f, 0.627451003f, 0.478431404f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LightSeaGreen = { { { 0.125490203f, 0.698039234f, 0.666666687f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LightSkyBlue = { { { 0.529411793f, 0.807843208f, 0.980392218f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LightSlateGray = { { { 0.466666698f, 0.533333361f, 0.600000024f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LightSteelBlue = { { { 0.690196097f, 0.768627524f, 0.870588303f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LightYellow = { { { 1.f, 1.f, 0.878431439f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Lime = { { { 0.f, 1.f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LimeGreen = { { { 0.196078449f, 0.803921640f, 0.196078449f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Linen = { { { 0.980392218f, 0.941176534f, 0.901960850f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Magenta = { { { 1.f, 0.f, 1.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Maroon = { { { 0.501960814f, 0.f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 MediumAquamarine = { { { 0.400000036f, 0.803921640f, 0.666666687f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 MediumBlue = { { { 0.f, 0.f, 0.803921640f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 MediumOrchid = { { { 0.729411781f, 0.333333343f, 0.827451050f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 MediumPurple = { { { 0.576470613f, 0.439215720f, 0.858823597f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 MediumSeaGreen = { { { 0.235294133f, 0.701960802f, 0.443137288f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 MediumSlateBlue = { { { 0.482352972f, 0.407843173f, 0.933333397f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 MediumSpringGreen = { { { 0.f, 0.980392218f, 0.603921592f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 MediumTurquoise = { { { 0.282352954f, 0.819607913f, 0.800000072f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 MediumVioletRed = { { { 0.780392230f, 0.082352944f, 0.521568656f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 MidnightBlue = { { { 0.098039225f, 0.098039225f, 0.439215720f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 MintCream = { { { 0.960784376f, 1.f, 0.980392218f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 MistyRose = { { { 1.f, 0.894117713f, 0.882353008f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Moccasin = { { { 1.f, 0.894117713f, 0.709803939f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 NavajoWhite = { { { 1.f, 0.870588303f, 0.678431392f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Navy = { { { 0.f, 0.f, 0.501960814f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 OldLace = { { { 0.992156923f, 0.960784376f, 0.901960850f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Olive = { { { 0.501960814f, 0.501960814f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 OliveDrab = { { { 0.419607878f, 0.556862772f, 0.137254909f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Orange = { { { 1.f, 0.647058845f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 OrangeRed = { { { 1.f, 0.270588249f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Orchid = { { { 0.854902029f, 0.439215720f, 0.839215755f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 PaleGoldenrod = { { { 0.933333397f, 0.909803987f, 0.666666687f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 PaleGreen = { { { 0.596078455f, 0.984313786f, 0.596078455f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 PaleTurquoise = { { { 0.686274529f, 0.933333397f, 0.933333397f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 PaleVioletRed = { { { 0.858823597f, 0.439215720f, 0.576470613f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 PapayaWhip = { { { 1.f, 0.937254965f, 0.835294187f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 PeachPuff = { { { 1.f, 0.854902029f, 0.725490212f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Peru = { { { 0.803921640f, 0.521568656f, 0.247058839f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Pink = { { { 1.f, 0.752941251f, 0.796078503f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Plum = { { { 0.866666734f, 0.627451003f, 0.866666734f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 PowderBlue = { { { 0.690196097f, 0.878431439f, 0.901960850f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Purple = { { { 0.501960814f, 0.f, 0.501960814f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Red = { { { 1.f, 0.f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 RosyBrown = { { { 0.737254918f, 0.560784340f, 0.560784340f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 RoyalBlue = { { { 0.254901975f, 0.411764741f, 0.882353008f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 SaddleBrown = { { { 0.545098066f, 0.270588249f, 0.074509807f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Salmon = { { { 0.980392218f, 0.501960814f, 0.447058856f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 SandyBrown = { { { 0.956862807f, 0.643137276f, 0.376470625f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 SeaGreen = { { { 0.180392161f, 0.545098066f, 0.341176480f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 SeaShell = { { { 1.f, 0.960784376f, 0.933333397f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Sienna = { { { 0.627451003f, 0.321568638f, 0.176470593f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Silver = { { { 0.752941251f, 0.752941251f, 0.752941251f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 SkyBlue = { { { 0.529411793f, 0.807843208f, 0.921568692f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 SlateBlue = { { { 0.415686309f, 0.352941185f, 0.803921640f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 SlateGray = { { { 0.439215720f, 0.501960814f, 0.564705908f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Snow = { { { 1.f, 0.980392218f, 0.980392218f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 SpringGreen = { { { 0.f, 1.f, 0.498039246f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 SteelBlue = { { { 0.274509817f, 0.509803951f, 0.705882370f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Tan = { { { 0.823529482f, 0.705882370f, 0.549019635f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Teal = { { { 0.f, 0.501960814f, 0.501960814f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Thistle = { { { 0.847058892f, 0.749019623f, 0.847058892f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Tomato = { { { 1.f, 0.388235331f, 0.278431386f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Transparent = { { { 0.f, 0.f, 0.f, 0.f } } };
+ XMGLOBALCONST XMVECTORF32 Turquoise = { { { 0.250980407f, 0.878431439f, 0.815686345f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Violet = { { { 0.933333397f, 0.509803951f, 0.933333397f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Wheat = { { { 0.960784376f, 0.870588303f, 0.701960802f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 White = { { { 1.f, 1.f, 1.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 WhiteSmoke = { { { 0.960784376f, 0.960784376f, 0.960784376f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Yellow = { { { 1.f, 1.f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 YellowGreen = { { { 0.603921592f, 0.803921640f, 0.196078449f, 1.f } } };
+
+ } // namespace Colors
+
+ namespace ColorsLinear
+ {
+ // Standard colors (Red/Green/Blue/Alpha) in linear colorspace
+ XMGLOBALCONST XMVECTORF32 AliceBlue = { { { 0.871367335f, 0.938685894f, 1.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 AntiqueWhite = { { { 0.955973506f, 0.830770075f, 0.679542601f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Aqua = { { { 0.f, 1.f, 1.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Aquamarine = { { { 0.212230787f, 1.f, 0.658374965f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Azure = { { { 0.871367335f, 1.f, 1.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Beige = { { { 0.913098991f, 0.913098991f, 0.715693772f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Bisque = { { { 1.f, 0.775822461f, 0.552011609f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Black = { { { 0.f, 0.f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 BlanchedAlmond = { { { 1.f, 0.830770075f, 0.610495746f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Blue = { { { 0.f, 0.f, 1.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 BlueViolet = { { { 0.254152179f, 0.024157630f, 0.760524750f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Brown = { { { 0.376262218f, 0.023153365f, 0.023153365f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 BurlyWood = { { { 0.730461001f, 0.479320228f, 0.242281199f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 CadetBlue = { { { 0.114435382f, 0.341914445f, 0.351532698f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Chartreuse = { { { 0.212230787f, 1.f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Chocolate = { { { 0.644479871f, 0.141263321f, 0.012983031f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Coral = { { { 1.f, 0.212230787f, 0.080219828f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 CornflowerBlue = { { { 0.127437726f, 0.300543845f, 0.846873462f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Cornsilk = { { { 1.f, 0.938685894f, 0.715693772f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Crimson = { { { 0.715693772f, 0.006995410f, 0.045186214f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Cyan = { { { 0.f, 1.f, 1.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkBlue = { { { 0.f, 0.f, 0.258182913f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkCyan = { { { 0.f, 0.258182913f, 0.258182913f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkGoldenrod = { { { 0.479320228f, 0.238397658f, 0.003346536f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkGray = { { { 0.396755308f, 0.396755308f, 0.396755308f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkGreen = { { { 0.f, 0.127437726f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkKhaki = { { { 0.508881450f, 0.473531544f, 0.147027299f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkMagenta = { { { 0.258182913f, 0.f, 0.258182913f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkOliveGreen = { { { 0.090841733f, 0.147027299f, 0.028426038f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkOrange = { { { 1.f, 0.262250721f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkOrchid = { { { 0.318546832f, 0.031896040f, 0.603827536f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkRed = { { { 0.258182913f, 0.f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkSalmon = { { { 0.814846814f, 0.304987371f, 0.194617867f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkSeaGreen = { { { 0.274677366f, 0.502886593f, 0.258182913f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkSlateBlue = { { { 0.064803280f, 0.046665095f, 0.258182913f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkSlateGray = { { { 0.028426038f, 0.078187428f, 0.078187428f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkTurquoise = { { { 0.f, 0.617206752f, 0.637597024f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DarkViolet = { { { 0.296138316f, 0.f, 0.651405811f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DeepPink = { { { 1.f, 0.006995410f, 0.291770697f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DeepSkyBlue = { { { 0.f, 0.520995677f, 1.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DimGray = { { { 0.141263321f, 0.141263321f, 0.141263321f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 DodgerBlue = { { { 0.012983031f, 0.278894335f, 1.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Firebrick = { { { 0.445201248f, 0.015996292f, 0.015996292f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 FloralWhite = { { { 1.f, 0.955973506f, 0.871367335f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 ForestGreen = { { { 0.015996292f, 0.258182913f, 0.015996292f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Fuchsia = { { { 1.f, 0.f, 1.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Gainsboro = { { { 0.715693772f, 0.715693772f, 0.715693772f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 GhostWhite = { { { 0.938685894f, 0.938685894f, 1.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Gold = { { { 1.f, 0.679542601f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Goldenrod = { { { 0.701102138f, 0.376262218f, 0.014443844f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Gray = { { { 0.215860531f, 0.215860531f, 0.215860531f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Green = { { { 0.f, 0.215860531f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 GreenYellow = { { { 0.417885154f, 1.f, 0.028426038f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Honeydew = { { { 0.871367335f, 1.f, 0.871367335f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 HotPink = { { { 1.f, 0.141263321f, 0.456411064f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 IndianRed = { { { 0.610495746f, 0.107023112f, 0.107023112f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Indigo = { { { 0.070360109f, 0.f, 0.223227978f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Ivory = { { { 1.f, 1.f, 0.871367335f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Khaki = { { { 0.871367335f, 0.791298151f, 0.262250721f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Lavender = { { { 0.791298151f, 0.791298151f, 0.955973506f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LavenderBlush = { { { 1.f, 0.871367335f, 0.913098991f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LawnGreen = { { { 0.201556295f, 0.973445475f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LemonChiffon = { { { 1.f, 0.955973506f, 0.610495746f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LightBlue = { { { 0.417885154f, 0.686685443f, 0.791298151f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LightCoral = { { { 0.871367335f, 0.215860531f, 0.215860531f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LightCyan = { { { 0.745404482f, 1.f, 1.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LightGoldenrodYellow = { { { 0.955973506f, 0.955973506f, 0.644479871f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LightGray = { { { 0.651405811f, 0.651405811f, 0.651405811f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LightGreen = { { { 0.278894335f, 0.854992807f, 0.278894335f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LightPink = { { { 1.f, 0.467783839f, 0.533276618f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LightSalmon = { { { 1.f, 0.351532698f, 0.194617867f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LightSeaGreen = { { { 0.014443844f, 0.445201248f, 0.401977867f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LightSkyBlue = { { { 0.242281199f, 0.617206752f, 0.955973506f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LightSlateGray = { { { 0.184475034f, 0.246201396f, 0.318546832f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LightSteelBlue = { { { 0.434153706f, 0.552011609f, 0.730461001f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LightYellow = { { { 1.f, 1.f, 0.745404482f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Lime = { { { 0.f, 1.f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 LimeGreen = { { { 0.031896040f, 0.610495746f, 0.031896040f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Linen = { { { 0.955973506f, 0.871367335f, 0.791298151f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Magenta = { { { 1.f, 0.f, 1.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Maroon = { { { 0.215860531f, 0.f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 MediumAquamarine = { { { 0.132868364f, 0.610495746f, 0.401977867f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 MediumBlue = { { { 0.f, 0.f, 0.610495746f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 MediumOrchid = { { { 0.491020888f, 0.090841733f, 0.651405811f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 MediumPurple = { { { 0.291770697f, 0.162029430f, 0.708376050f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 MediumSeaGreen = { { { 0.045186214f, 0.450785846f, 0.165132239f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 MediumSlateBlue = { { { 0.198069349f, 0.138431653f, 0.854992807f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 MediumSpringGreen = { { { 0.f, 0.955973506f, 0.323143244f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 MediumTurquoise = { { { 0.064803280f, 0.637597024f, 0.603827536f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 MediumVioletRed = { { { 0.571125031f, 0.007499032f, 0.234550655f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 MidnightBlue = { { { 0.009721218f, 0.009721218f, 0.162029430f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 MintCream = { { { 0.913098991f, 1.f, 0.955973506f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 MistyRose = { { { 1.f, 0.775822461f, 0.752942443f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Moccasin = { { { 1.f, 0.775822461f, 0.462077051f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 NavajoWhite = { { { 1.f, 0.730461001f, 0.417885154f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Navy = { { { 0.f, 0.f, 0.215860531f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 OldLace = { { { 0.982250869f, 0.913098991f, 0.791298151f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Olive = { { { 0.215860531f, 0.215860531f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 OliveDrab = { { { 0.147027299f, 0.270497859f, 0.016807375f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Orange = { { { 1.f, 0.376262218f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 OrangeRed = { { { 1.f, 0.059511241f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Orchid = { { { 0.701102138f, 0.162029430f, 0.672443330f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 PaleGoldenrod = { { { 0.854992807f, 0.806952477f, 0.401977867f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 PaleGreen = { { { 0.313988745f, 0.964686573f, 0.313988745f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 PaleTurquoise = { { { 0.428690553f, 0.854992807f, 0.854992807f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 PaleVioletRed = { { { 0.708376050f, 0.162029430f, 0.291770697f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 PapayaWhip = { { { 1.f, 0.863157392f, 0.665387452f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 PeachPuff = { { { 1.f, 0.701102138f, 0.485149980f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Peru = { { { 0.610495746f, 0.234550655f, 0.049706575f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Pink = { { { 1.f, 0.527115345f, 0.597202003f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Plum = { { { 0.723055363f, 0.351532698f, 0.723055363f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 PowderBlue = { { { 0.434153706f, 0.745404482f, 0.791298151f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Purple = { { { 0.215860531f, 0.f, 0.215860531f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Red = { { { 1.f, 0.f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 RosyBrown = { { { 0.502886593f, 0.274677366f, 0.274677366f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 RoyalBlue = { { { 0.052860655f, 0.141263321f, 0.752942443f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 SaddleBrown = { { { 0.258182913f, 0.059511241f, 0.006512091f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Salmon = { { { 0.955973506f, 0.215860531f, 0.168269455f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 SandyBrown = { { { 0.904661357f, 0.371237785f, 0.116970696f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 SeaGreen = { { { 0.027320892f, 0.258182913f, 0.095307484f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 SeaShell = { { { 1.f, 0.913098991f, 0.854992807f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Sienna = { { { 0.351532698f, 0.084376216f, 0.026241222f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Silver = { { { 0.527115345f, 0.527115345f, 0.527115345f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 SkyBlue = { { { 0.242281199f, 0.617206752f, 0.830770075f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 SlateBlue = { { { 0.144128501f, 0.102241747f, 0.610495746f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 SlateGray = { { { 0.162029430f, 0.215860531f, 0.278894335f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Snow = { { { 1.f, 0.955973506f, 0.955973506f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 SpringGreen = { { { 0.f, 1.f, 0.212230787f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 SteelBlue = { { { 0.061246071f, 0.223227978f, 0.456411064f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Tan = { { { 0.644479871f, 0.456411064f, 0.262250721f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Teal = { { { 0.f, 0.215860531f, 0.215860531f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Thistle = { { { 0.686685443f, 0.520995677f, 0.686685443f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Tomato = { { { 1.f, 0.124771863f, 0.063010029f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Transparent = { { { 0.f, 0.f, 0.f, 0.f } } };
+ XMGLOBALCONST XMVECTORF32 Turquoise = { { { 0.051269468f, 0.745404482f, 0.630757332f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Violet = { { { 0.854992807f, 0.223227978f, 0.854992807f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Wheat = { { { 0.913098991f, 0.730461001f, 0.450785846f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 White = { { { 1.f, 1.f, 1.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 WhiteSmoke = { { { 0.913098991f, 0.913098991f, 0.913098991f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 Yellow = { { { 1.f, 1.f, 0.f, 1.f } } };
+ XMGLOBALCONST XMVECTORF32 YellowGreen = { { { 0.323143244f, 0.610495746f, 0.031896040f, 1.f } } };
+
+ } // namespace ColorsLinear
+
+} // namespace DirectX
diff --git a/Minecraft.Client/Windows64/Libs/4JLibs/impls/Windows_Libs/Render/vendor/DirectXMath/DirectXMath.h b/Minecraft.Client/Windows64/Libs/4JLibs/impls/Windows_Libs/Render/vendor/DirectXMath/DirectXMath.h
new file mode 100644
index 00000000..ae3cce1d
--- /dev/null
+++ b/Minecraft.Client/Windows64/Libs/4JLibs/impls/Windows_Libs/Render/vendor/DirectXMath/DirectXMath.h
@@ -0,0 +1,2385 @@
+//-------------------------------------------------------------------------------------
+// DirectXMath.h -- SIMD C++ Math library
+//
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+//
+// https://go.microsoft.com/fwlink/?LinkID=615560
+//-------------------------------------------------------------------------------------
+
+#pragma once
+
+#ifndef __cplusplus
+#error DirectX Math requires C++
+#endif
+
+#define DIRECTX_MATH_VERSION 321
+
+#if defined(_MSC_VER) && (_MSC_VER < 1910)
+#error DirectX Math requires Visual C++ 2017 or later.
+#endif
+
+#if defined(_MSC_VER) && !defined(_M_ARM) && !defined(_M_ARM64) && !defined(_M_HYBRID_X86_ARM64) && !defined(_M_ARM64EC) && (!_MANAGED) && (!_M_CEE) && (!defined(_M_IX86_FP) || (_M_IX86_FP > 1)) && !defined(_XM_NO_INTRINSICS_) && !defined(_XM_VECTORCALL_)
+#define _XM_VECTORCALL_ 1
+#endif
+
+#if _XM_VECTORCALL_
+#define XM_CALLCONV __vectorcall
+#elif defined(__GNUC__)
+#define XM_CALLCONV
+#else
+#define XM_CALLCONV __fastcall
+#endif
+
+#ifndef XM_DEPRECATED
+#if (__cplusplus >= 201402L)
+#define XM_DEPRECATED [[deprecated]]
+#elif defined(__GNUC__)
+#define XM_DEPRECATED __attribute__ ((deprecated))
+#else
+#define XM_DEPRECATED __declspec(deprecated("This is deprecated and will be removed in a future version."))
+#endif
+#endif
+
+#if !defined(_XM_AVX2_INTRINSICS_) && defined(__AVX2__) && !defined(_XM_NO_INTRINSICS_)
+#define _XM_AVX2_INTRINSICS_
+#endif
+
+#if !defined(_XM_FMA3_INTRINSICS_) && defined(_XM_AVX2_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_)
+#define _XM_FMA3_INTRINSICS_
+#endif
+
+#if !defined(_XM_F16C_INTRINSICS_) && defined(_XM_AVX2_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_)
+#define _XM_F16C_INTRINSICS_
+#endif
+
+#if !defined(_XM_F16C_INTRINSICS_) && defined(__F16C__) && !defined(_XM_NO_INTRINSICS_)
+#define _XM_F16C_INTRINSICS_
+#endif
+
+#if defined(_XM_FMA3_INTRINSICS_) && !defined(_XM_AVX_INTRINSICS_)
+#define _XM_AVX_INTRINSICS_
+#endif
+
+#if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_AVX_INTRINSICS_)
+#define _XM_AVX_INTRINSICS_
+#endif
+
+#if !defined(_XM_AVX_INTRINSICS_) && defined(__AVX__) && !defined(_XM_NO_INTRINSICS_)
+#define _XM_AVX_INTRINSICS_
+#endif
+
+#if defined(_XM_AVX_INTRINSICS_) && !defined(_XM_SSE4_INTRINSICS_)
+#define _XM_SSE4_INTRINSICS_
+#endif
+
+#if defined(_XM_SSE4_INTRINSICS_) && !defined(_XM_SSE3_INTRINSICS_)
+#define _XM_SSE3_INTRINSICS_
+#endif
+
+#if defined(_XM_SSE3_INTRINSICS_) && !defined(_XM_SSE_INTRINSICS_)
+#define _XM_SSE_INTRINSICS_
+#endif
+
+#if !defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_)
+#if (defined(_M_IX86) || defined(_M_X64) || __i386__ || __x86_64__ || __powerpc64__) && !defined(_M_HYBRID_X86_ARM64) && !defined(_M_ARM64EC)
+#define _XM_SSE_INTRINSICS_
+#elif defined(_M_ARM) || defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __arm__ || __aarch64__
+#define _XM_ARM_NEON_INTRINSICS_
+#elif !defined(_XM_NO_INTRINSICS_)
+#error DirectX Math does not support this target
+#endif
+#endif // !_XM_ARM_NEON_INTRINSICS_ && !_XM_SSE_INTRINSICS_ && !_XM_NO_INTRINSICS_
+
+#if defined(_XM_SSE_INTRINSICS_) && defined(_MSC_VER) && (_MSC_VER >= 1920) && !defined(__clang__) && !defined(_XM_SVML_INTRINSICS_) && !defined(_XM_DISABLE_INTEL_SVML_)
+#define _XM_SVML_INTRINSICS_
+#endif
+
+#if !defined(_XM_NO_XMVECTOR_OVERLOADS_) && (defined(__clang__) || defined(__GNUC__)) && !defined(_XM_NO_INTRINSICS_)
+#define _XM_NO_XMVECTOR_OVERLOADS_
+#endif
+
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable:4514 4820)
+// C4514/4820: Off by default noise
+#endif
+#include
+#include
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+#ifndef _XM_NO_INTRINSICS_
+
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable : 4987)
+// C4987: Off by default noise
+#endif
+#if defined(_MSC_VER) || defined(__MINGW32__)
+#include
+#endif
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+#if (defined(__clang__) || defined(__GNUC__)) && (__x86_64__ || __i386__) && !defined(__MINGW32__) && !defined(_MSC_VER)
+#include
+#endif
+
+#ifdef _XM_SSE_INTRINSICS_
+#include
+#include
+
+#ifdef _XM_SSE3_INTRINSICS_
+#include
+#endif
+
+#ifdef _XM_SSE4_INTRINSICS_
+#include
+#endif
+
+#ifdef _XM_AVX_INTRINSICS_
+#include
+#endif
+
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+#if defined(_MSC_VER) && !defined(__clang__) && (defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC))
+#include
+#else
+#include
+#endif
+#endif
+#endif // !_XM_NO_INTRINSICS_
+
+#include "sal.h"
+#include
+
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable : 4005 4668)
+// C4005/4668: Old header issue
+#endif
+#include
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+#if (__cplusplus >= 201703L)
+#define XM_ALIGNED_DATA(x) alignas(x)
+#define XM_ALIGNED_STRUCT(x) struct alignas(x)
+#elif defined(__GNUC__)
+#define XM_ALIGNED_DATA(x) __attribute__ ((aligned(x)))
+#define XM_ALIGNED_STRUCT(x) struct __attribute__ ((aligned(x)))
+#else
+#define XM_ALIGNED_DATA(x) __declspec(align(x))
+#define XM_ALIGNED_STRUCT(x) __declspec(align(x)) struct
+#endif
+
+#if (__cplusplus >= 202002L)
+#include
+#endif
+
+/****************************************************************************
+ *
+ * Conditional intrinsics
+ *
+ ****************************************************************************/
+
+#if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_)
+
+#if defined(_XM_NO_MOVNT_)
+#define XM_STREAM_PS( p, a ) _mm_store_ps((p), (a))
+#define XM256_STREAM_PS( p, a ) _mm256_store_ps((p), (a))
+#define XM_SFENCE()
+#else
+#define XM_STREAM_PS( p, a ) _mm_stream_ps((p), (a))
+#define XM256_STREAM_PS( p, a ) _mm256_stream_ps((p), (a))
+#define XM_SFENCE() _mm_sfence()
+#endif
+
+#if defined(_XM_FMA3_INTRINSICS_)
+#define XM_FMADD_PS( a, b, c ) _mm_fmadd_ps((a), (b), (c))
+#define XM_FNMADD_PS( a, b, c ) _mm_fnmadd_ps((a), (b), (c))
+#else
+#define XM_FMADD_PS( a, b, c ) _mm_add_ps(_mm_mul_ps((a), (b)), (c))
+#define XM_FNMADD_PS( a, b, c ) _mm_sub_ps((c), _mm_mul_ps((a), (b)))
+#endif
+
+#if defined(_XM_AVX_INTRINSICS_) && defined(_XM_FAVOR_INTEL_)
+#define XM_PERMUTE_PS( v, c ) _mm_permute_ps((v), c )
+#else
+#define XM_PERMUTE_PS( v, c ) _mm_shuffle_ps((v), (v), c )
+#endif
+
+#if (defined(__GNUC__) && !defined(__clang__) && (__GNUC__ < 11)) || defined(__powerpc64__)
+#define XM_LOADU_SI16( p ) _mm_cvtsi32_si128(*reinterpret_cast(p))
+#else
+#define XM_LOADU_SI16( p ) _mm_loadu_si16(p)
+#endif
+
+#endif // _XM_SSE_INTRINSICS_ && !_XM_NO_INTRINSICS_
+
+#if defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_)
+
+#if defined(__clang__) || defined(__GNUC__)
+#define XM_PREFETCH( a ) __builtin_prefetch(a)
+#elif defined(_MSC_VER)
+#define XM_PREFETCH( a ) __prefetch(a)
+#else
+#define XM_PREFETCH( a )
+#endif
+
+#endif // _XM_ARM_NEON_INTRINSICS_ && !_XM_NO_INTRINSICS_
+
+namespace DirectX
+{
+
+ /****************************************************************************
+ *
+ * Constant definitions
+ *
+ ****************************************************************************/
+
+#if defined(__XNAMATH_H__) && defined(XM_PI)
+#undef XM_PI
+#undef XM_2PI
+#undef XM_1DIVPI
+#undef XM_1DIV2PI
+#undef XM_PIDIV2
+#undef XM_PIDIV4
+#undef XM_SELECT_0
+#undef XM_SELECT_1
+#undef XM_PERMUTE_0X
+#undef XM_PERMUTE_0Y
+#undef XM_PERMUTE_0Z
+#undef XM_PERMUTE_0W
+#undef XM_PERMUTE_1X
+#undef XM_PERMUTE_1Y
+#undef XM_PERMUTE_1Z
+#undef XM_PERMUTE_1W
+#undef XM_CRMASK_CR6
+#undef XM_CRMASK_CR6TRUE
+#undef XM_CRMASK_CR6FALSE
+#undef XM_CRMASK_CR6BOUNDS
+#undef XM_CACHE_LINE_SIZE
+#endif
+
+ constexpr float XM_PI = 3.141592654f;
+ constexpr float XM_2PI = 6.283185307f;
+ constexpr float XM_1DIVPI = 0.318309886f;
+ constexpr float XM_1DIV2PI = 0.159154943f;
+ constexpr float XM_PIDIV2 = 1.570796327f;
+ constexpr float XM_PIDIV4 = 0.785398163f;
+
+ constexpr uint32_t XM_SELECT_0 = 0x00000000;
+ constexpr uint32_t XM_SELECT_1 = 0xFFFFFFFF;
+
+ constexpr uint32_t XM_PERMUTE_0X = 0;
+ constexpr uint32_t XM_PERMUTE_0Y = 1;
+ constexpr uint32_t XM_PERMUTE_0Z = 2;
+ constexpr uint32_t XM_PERMUTE_0W = 3;
+ constexpr uint32_t XM_PERMUTE_1X = 4;
+ constexpr uint32_t XM_PERMUTE_1Y = 5;
+ constexpr uint32_t XM_PERMUTE_1Z = 6;
+ constexpr uint32_t XM_PERMUTE_1W = 7;
+
+ constexpr uint32_t XM_SWIZZLE_X = 0;
+ constexpr uint32_t XM_SWIZZLE_Y = 1;
+ constexpr uint32_t XM_SWIZZLE_Z = 2;
+ constexpr uint32_t XM_SWIZZLE_W = 3;
+
+ constexpr uint32_t XM_CRMASK_CR6 = 0x000000F0;
+ constexpr uint32_t XM_CRMASK_CR6TRUE = 0x00000080;
+ constexpr uint32_t XM_CRMASK_CR6FALSE = 0x00000020;
+ constexpr uint32_t XM_CRMASK_CR6BOUNDS = XM_CRMASK_CR6FALSE;
+
+#if defined(_M_ARM) || defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __arm__ || __aarch64__
+ constexpr size_t XM_CACHE_LINE_SIZE = 128;
+#else
+ constexpr size_t XM_CACHE_LINE_SIZE = 64;
+#endif
+
+
+ /****************************************************************************
+ *
+ * Macros
+ *
+ ****************************************************************************/
+
+#if defined(__XNAMATH_H__) && defined(XMComparisonAllTrue)
+#undef XMComparisonAllTrue
+#undef XMComparisonAnyTrue
+#undef XMComparisonAllFalse
+#undef XMComparisonAnyFalse
+#undef XMComparisonMixed
+#undef XMComparisonAllInBounds
+#undef XMComparisonAnyOutOfBounds
+#endif
+
+ // Unit conversion
+
+ constexpr float XMConvertToRadians(float fDegrees) noexcept { return fDegrees * (XM_PI / 180.0f); }
+ constexpr float XMConvertToDegrees(float fRadians) noexcept { return fRadians * (180.0f / XM_PI); }
+
+ // Condition register evaluation proceeding a recording (R) comparison
+
+ constexpr bool XMComparisonAllTrue(uint32_t CR) noexcept { return (CR & XM_CRMASK_CR6TRUE) == XM_CRMASK_CR6TRUE; }
+ constexpr bool XMComparisonAnyTrue(uint32_t CR) noexcept { return (CR & XM_CRMASK_CR6FALSE) != XM_CRMASK_CR6FALSE; }
+ constexpr bool XMComparisonAllFalse(uint32_t CR) noexcept { return (CR & XM_CRMASK_CR6FALSE) == XM_CRMASK_CR6FALSE; }
+ constexpr bool XMComparisonAnyFalse(uint32_t CR) noexcept { return (CR & XM_CRMASK_CR6TRUE) != XM_CRMASK_CR6TRUE; }
+ constexpr bool XMComparisonMixed(uint32_t CR) noexcept { return (CR & XM_CRMASK_CR6) == 0; }
+ constexpr bool XMComparisonAllInBounds(uint32_t CR) noexcept { return (CR & XM_CRMASK_CR6BOUNDS) == XM_CRMASK_CR6BOUNDS; }
+ constexpr bool XMComparisonAnyOutOfBounds(uint32_t CR) noexcept { return (CR & XM_CRMASK_CR6BOUNDS) != XM_CRMASK_CR6BOUNDS; }
+
+
+ /****************************************************************************
+ *
+ * Data types
+ *
+ ****************************************************************************/
+
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable:4068 4201 4365 4324 4820)
+ // C4068: ignore unknown pragmas
+ // C4201: nonstandard extension used : nameless struct/union
+ // C4365: Off by default noise
+ // C4324/4820: padding warnings
+#endif
+
+#ifdef _PREFAST_
+#pragma prefast(push)
+#pragma prefast(disable : 25000, "FXMVECTOR is 16 bytes")
+#endif
+
+//------------------------------------------------------------------------------
+#if defined(_XM_NO_INTRINSICS_)
+ struct __vector4
+ {
+ union
+ {
+ float vector4_f32[4];
+ uint32_t vector4_u32[4];
+ };
+ };
+#endif // _XM_NO_INTRINSICS_
+
+ //------------------------------------------------------------------------------
+ // Vector intrinsic: Four 32 bit floating point components aligned on a 16 byte
+ // boundary and mapped to hardware vector registers
+#if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_)
+ using XMVECTOR = __m128;
+#elif defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_)
+ using XMVECTOR = float32x4_t;
+#else
+ using XMVECTOR = __vector4;
+#endif
+
+ // Fix-up for (1st-3rd) XMVECTOR parameters that are pass-in-register for x86, ARM, ARM64, and vector call; by reference otherwise
+#if ( defined(_M_IX86) || defined(_M_ARM) || defined(_M_ARM64) || _XM_VECTORCALL_ || __i386__ || __arm__ || __aarch64__ ) && !defined(_XM_NO_INTRINSICS_)
+ typedef const XMVECTOR FXMVECTOR;
+#else
+ typedef const XMVECTOR& FXMVECTOR;
+#endif
+
+ // Fix-up for (4th) XMVECTOR parameter to pass in-register for ARM, ARM64, and vector call; by reference otherwise
+#if ( defined(_M_ARM) || defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || _XM_VECTORCALL_ || __arm__ || __aarch64__ ) && !defined(_XM_NO_INTRINSICS_)
+ typedef const XMVECTOR GXMVECTOR;
+#else
+ typedef const XMVECTOR& GXMVECTOR;
+#endif
+
+ // Fix-up for (5th & 6th) XMVECTOR parameter to pass in-register for ARM64 and vector call; by reference otherwise
+#if ( defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || _XM_VECTORCALL_ || __aarch64__ ) && !defined(_XM_NO_INTRINSICS_)
+ typedef const XMVECTOR HXMVECTOR;
+#else
+ typedef const XMVECTOR& HXMVECTOR;
+#endif
+
+ // Fix-up for (7th+) XMVECTOR parameters to pass by reference
+ typedef const XMVECTOR& CXMVECTOR;
+
+ //------------------------------------------------------------------------------
+ // Conversion types for constants
+ XM_ALIGNED_STRUCT(16) XMVECTORF32
+ {
+ union
+ {
+ float f[4];
+ XMVECTOR v;
+ };
+
+ inline operator XMVECTOR() const noexcept { return v; }
+ inline operator const float* () const noexcept { return f; }
+ #ifdef _XM_NO_INTRINSICS_
+ #elif defined(_XM_SSE_INTRINSICS_)
+ inline operator __m128i() const noexcept { return _mm_castps_si128(v); }
+ inline operator __m128d() const noexcept { return _mm_castps_pd(v); }
+ #elif defined(_XM_ARM_NEON_INTRINSICS_) && (defined(__GNUC__) || defined(_ARM64_DISTINCT_NEON_TYPES))
+ inline operator int32x4_t() const noexcept { return vreinterpretq_s32_f32(v); }
+ inline operator uint32x4_t() const noexcept { return vreinterpretq_u32_f32(v); }
+ #endif
+ };
+
+ XM_ALIGNED_STRUCT(16) XMVECTORI32
+ {
+ union
+ {
+ int32_t i[4];
+ XMVECTOR v;
+ };
+
+ inline operator XMVECTOR() const noexcept { return v; }
+ #ifdef _XM_NO_INTRINSICS_
+ #elif defined(_XM_SSE_INTRINSICS_)
+ inline operator __m128i() const noexcept { return _mm_castps_si128(v); }
+ inline operator __m128d() const noexcept { return _mm_castps_pd(v); }
+ #elif defined(_XM_ARM_NEON_INTRINSICS_) && (defined(__GNUC__) || defined(_ARM64_DISTINCT_NEON_TYPES))
+ inline operator int32x4_t() const noexcept { return vreinterpretq_s32_f32(v); }
+ inline operator uint32x4_t() const noexcept { return vreinterpretq_u32_f32(v); }
+ #endif
+ };
+
+ XM_ALIGNED_STRUCT(16) XMVECTORU8
+ {
+ union
+ {
+ uint8_t u[16];
+ XMVECTOR v;
+ };
+
+ inline operator XMVECTOR() const noexcept { return v; }
+ #ifdef _XM_NO_INTRINSICS_
+ #elif defined(_XM_SSE_INTRINSICS_)
+ inline operator __m128i() const noexcept { return _mm_castps_si128(v); }
+ inline operator __m128d() const noexcept { return _mm_castps_pd(v); }
+ #elif defined(_XM_ARM_NEON_INTRINSICS_) && (defined(__GNUC__) || defined(_ARM64_DISTINCT_NEON_TYPES))
+ inline operator int32x4_t() const noexcept { return vreinterpretq_s32_f32(v); }
+ inline operator uint32x4_t() const noexcept { return vreinterpretq_u32_f32(v); }
+ #endif
+ };
+
+ XM_ALIGNED_STRUCT(16) XMVECTORU32
+ {
+ union
+ {
+ uint32_t u[4];
+ XMVECTOR v;
+ };
+
+ inline operator XMVECTOR() const noexcept { return v; }
+ #ifdef _XM_NO_INTRINSICS_
+ #elif defined(_XM_SSE_INTRINSICS_)
+ inline operator __m128i() const noexcept { return _mm_castps_si128(v); }
+ inline operator __m128d() const noexcept { return _mm_castps_pd(v); }
+ #elif defined(_XM_ARM_NEON_INTRINSICS_) && (defined(__GNUC__) || defined(_ARM64_DISTINCT_NEON_TYPES))
+ inline operator int32x4_t() const noexcept { return vreinterpretq_s32_f32(v); }
+ inline operator uint32x4_t() const noexcept { return vreinterpretq_u32_f32(v); }
+ #endif
+ };
+
+ //------------------------------------------------------------------------------
+ // Vector operators
+
+#ifndef _XM_NO_XMVECTOR_OVERLOADS_
+ XMVECTOR XM_CALLCONV operator+ (FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV operator- (FXMVECTOR V) noexcept;
+
+ XMVECTOR& XM_CALLCONV operator+= (XMVECTOR& V1, FXMVECTOR V2) noexcept;
+ XMVECTOR& XM_CALLCONV operator-= (XMVECTOR& V1, FXMVECTOR V2) noexcept;
+ XMVECTOR& XM_CALLCONV operator*= (XMVECTOR& V1, FXMVECTOR V2) noexcept;
+ XMVECTOR& XM_CALLCONV operator/= (XMVECTOR& V1, FXMVECTOR V2) noexcept;
+
+ XMVECTOR& operator*= (XMVECTOR& V, float S) noexcept;
+ XMVECTOR& operator/= (XMVECTOR& V, float S) noexcept;
+
+ XMVECTOR XM_CALLCONV operator+ (FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV operator- (FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV operator* (FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV operator/ (FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV operator* (FXMVECTOR V, float S) noexcept;
+ XMVECTOR XM_CALLCONV operator* (float S, FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV operator/ (FXMVECTOR V, float S) noexcept;
+#endif /* !_XM_NO_XMVECTOR_OVERLOADS_ */
+
+ //------------------------------------------------------------------------------
+ // Matrix type: Sixteen 32 bit floating point components aligned on a
+ // 16 byte boundary and mapped to four hardware vector registers
+
+ struct XMMATRIX;
+
+ // Fix-up for (1st) XMMATRIX parameter to pass in-register for ARM64 and vector call; by reference otherwise
+#if ( defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || _XM_VECTORCALL_ || __aarch64__ ) && !defined(_XM_NO_INTRINSICS_)
+ typedef const XMMATRIX FXMMATRIX;
+#else
+ typedef const XMMATRIX& FXMMATRIX;
+#endif
+
+ // Fix-up for (2nd+) XMMATRIX parameters to pass by reference
+ typedef const XMMATRIX& CXMMATRIX;
+
+#ifdef _XM_NO_INTRINSICS_
+ struct XMMATRIX
+ #else
+ XM_ALIGNED_STRUCT(16) XMMATRIX
+ #endif
+ {
+ #ifdef _XM_NO_INTRINSICS_
+ union
+ {
+ XMVECTOR r[4];
+ struct
+ {
+ float _11, _12, _13, _14;
+ float _21, _22, _23, _24;
+ float _31, _32, _33, _34;
+ float _41, _42, _43, _44;
+ };
+ float m[4][4];
+ };
+ #else
+ XMVECTOR r[4];
+ #endif
+
+ XMMATRIX() = default;
+
+ XMMATRIX(const XMMATRIX&) = default;
+
+ #if defined(_MSC_VER) && (_MSC_FULL_VER < 191426431)
+ XMMATRIX& operator= (const XMMATRIX& M) noexcept { r[0] = M.r[0]; r[1] = M.r[1]; r[2] = M.r[2]; r[3] = M.r[3]; return *this; }
+ #else
+ XMMATRIX& operator=(const XMMATRIX&) = default;
+
+ XMMATRIX(XMMATRIX&&) = default;
+ XMMATRIX& operator=(XMMATRIX&&) = default;
+ #endif
+
+ constexpr XMMATRIX(FXMVECTOR R0, FXMVECTOR R1, FXMVECTOR R2, CXMVECTOR R3) noexcept : r{ R0,R1,R2,R3 } {}
+ XMMATRIX(float m00, float m01, float m02, float m03,
+ float m10, float m11, float m12, float m13,
+ float m20, float m21, float m22, float m23,
+ float m30, float m31, float m32, float m33) noexcept;
+ explicit XMMATRIX(_In_reads_(16) const float* pArray) noexcept;
+
+ #ifdef _XM_NO_INTRINSICS_
+ float operator() (size_t Row, size_t Column) const noexcept { return m[Row][Column]; }
+ float& operator() (size_t Row, size_t Column) noexcept { return m[Row][Column]; }
+ #endif
+
+ XMMATRIX operator+ () const noexcept { return *this; }
+ XMMATRIX operator- () const noexcept;
+
+ XMMATRIX& XM_CALLCONV operator+= (FXMMATRIX M) noexcept;
+ XMMATRIX& XM_CALLCONV operator-= (FXMMATRIX M) noexcept;
+ XMMATRIX& XM_CALLCONV operator*= (FXMMATRIX M) noexcept;
+ XMMATRIX& operator*= (float S) noexcept;
+ XMMATRIX& operator/= (float S) noexcept;
+
+ XMMATRIX XM_CALLCONV operator+ (FXMMATRIX M) const noexcept;
+ XMMATRIX XM_CALLCONV operator- (FXMMATRIX M) const noexcept;
+ XMMATRIX XM_CALLCONV operator* (FXMMATRIX M) const noexcept;
+ XMMATRIX operator* (float S) const noexcept;
+ XMMATRIX operator/ (float S) const noexcept;
+
+ friend XMMATRIX XM_CALLCONV operator* (float S, FXMMATRIX M) noexcept;
+ };
+
+ //------------------------------------------------------------------------------
+ // 2D Vector; 32 bit floating point components
+ struct XMFLOAT2
+ {
+ float x;
+ float y;
+
+ XMFLOAT2() = default;
+
+ XMFLOAT2(const XMFLOAT2&) = default;
+ XMFLOAT2& operator=(const XMFLOAT2&) = default;
+
+ XMFLOAT2(XMFLOAT2&&) = default;
+ XMFLOAT2& operator=(XMFLOAT2&&) = default;
+
+ constexpr XMFLOAT2(float _x, float _y) noexcept : x(_x), y(_y) {}
+ explicit XMFLOAT2(_In_reads_(2) const float* pArray) noexcept : x(pArray[0]), y(pArray[1]) {}
+
+ #if (__cplusplus >= 202002L)
+ bool operator == (const XMFLOAT2&) const = default;
+ auto operator <=> (const XMFLOAT2&) const = default;
+ #endif
+ };
+
+ // 2D Vector; 32 bit floating point components aligned on a 16 byte boundary
+ XM_ALIGNED_STRUCT(16) XMFLOAT2A : public XMFLOAT2
+ {
+ using XMFLOAT2::XMFLOAT2;
+ };
+
+ //------------------------------------------------------------------------------
+ // 2D Vector; 32 bit signed integer components
+ struct XMINT2
+ {
+ int32_t x;
+ int32_t y;
+
+ XMINT2() = default;
+
+ XMINT2(const XMINT2&) = default;
+ XMINT2& operator=(const XMINT2&) = default;
+
+ XMINT2(XMINT2&&) = default;
+ XMINT2& operator=(XMINT2&&) = default;
+
+ constexpr XMINT2(int32_t _x, int32_t _y) noexcept : x(_x), y(_y) {}
+ explicit XMINT2(_In_reads_(2) const int32_t* pArray) noexcept : x(pArray[0]), y(pArray[1]) {}
+
+ #if (__cplusplus >= 202002L)
+ bool operator == (const XMINT2&) const = default;
+ auto operator <=> (const XMINT2&) const = default;
+ #endif
+ };
+
+ // 2D Vector; 32 bit unsigned integer components
+ struct XMUINT2
+ {
+ uint32_t x;
+ uint32_t y;
+
+ XMUINT2() = default;
+
+ XMUINT2(const XMUINT2&) = default;
+ XMUINT2& operator=(const XMUINT2&) = default;
+
+ XMUINT2(XMUINT2&&) = default;
+ XMUINT2& operator=(XMUINT2&&) = default;
+
+ constexpr XMUINT2(uint32_t _x, uint32_t _y) noexcept : x(_x), y(_y) {}
+ explicit XMUINT2(_In_reads_(2) const uint32_t* pArray) noexcept : x(pArray[0]), y(pArray[1]) {}
+
+ #if (__cplusplus >= 202002L)
+ bool operator == (const XMUINT2&) const = default;
+ auto operator <=> (const XMUINT2&) const = default;
+ #endif
+ };
+
+ //------------------------------------------------------------------------------
+ // 3D Vector; 32 bit floating point components
+ struct XMFLOAT3
+ {
+ float x;
+ float y;
+ float z;
+
+ XMFLOAT3() = default;
+
+ XMFLOAT3(const XMFLOAT3&) = default;
+ XMFLOAT3& operator=(const XMFLOAT3&) = default;
+
+ XMFLOAT3(XMFLOAT3&&) = default;
+ XMFLOAT3& operator=(XMFLOAT3&&) = default;
+
+ constexpr XMFLOAT3(float _x, float _y, float _z) noexcept : x(_x), y(_y), z(_z) {}
+ explicit XMFLOAT3(_In_reads_(3) const float* pArray) noexcept : x(pArray[0]), y(pArray[1]), z(pArray[2]) {}
+
+ #if (__cplusplus >= 202002L)
+ bool operator == (const XMFLOAT3&) const = default;
+ auto operator <=> (const XMFLOAT3&) const = default;
+ #endif
+ };
+
+ // 3D Vector; 32 bit floating point components aligned on a 16 byte boundary
+ XM_ALIGNED_STRUCT(16) XMFLOAT3A : public XMFLOAT3
+ {
+ using XMFLOAT3::XMFLOAT3;
+ };
+
+ //------------------------------------------------------------------------------
+ // 3D Vector; 32 bit signed integer components
+ struct XMINT3
+ {
+ int32_t x;
+ int32_t y;
+ int32_t z;
+
+ XMINT3() = default;
+
+ XMINT3(const XMINT3&) = default;
+ XMINT3& operator=(const XMINT3&) = default;
+
+ XMINT3(XMINT3&&) = default;
+ XMINT3& operator=(XMINT3&&) = default;
+
+ constexpr XMINT3(int32_t _x, int32_t _y, int32_t _z) noexcept : x(_x), y(_y), z(_z) {}
+ explicit XMINT3(_In_reads_(3) const int32_t* pArray) noexcept : x(pArray[0]), y(pArray[1]), z(pArray[2]) {}
+
+ #if (__cplusplus >= 202002L)
+ bool operator == (const XMINT3&) const = default;
+ auto operator <=> (const XMINT3&) const = default;
+ #endif
+ };
+
+ // 3D Vector; 32 bit unsigned integer components
+ struct XMUINT3
+ {
+ uint32_t x;
+ uint32_t y;
+ uint32_t z;
+
+ XMUINT3() = default;
+
+ XMUINT3(const XMUINT3&) = default;
+ XMUINT3& operator=(const XMUINT3&) = default;
+
+ XMUINT3(XMUINT3&&) = default;
+ XMUINT3& operator=(XMUINT3&&) = default;
+
+ constexpr XMUINT3(uint32_t _x, uint32_t _y, uint32_t _z) noexcept : x(_x), y(_y), z(_z) {}
+ explicit XMUINT3(_In_reads_(3) const uint32_t* pArray) noexcept : x(pArray[0]), y(pArray[1]), z(pArray[2]) {}
+
+ #if (__cplusplus >= 202002L)
+ bool operator == (const XMUINT3&) const = default;
+ auto operator <=> (const XMUINT3&) const = default;
+ #endif
+ };
+
+ //------------------------------------------------------------------------------
+ // 4D Vector; 32 bit floating point components
+ struct XMFLOAT4
+ {
+ float x;
+ float y;
+ float z;
+ float w;
+
+ XMFLOAT4() = default;
+
+ XMFLOAT4(const XMFLOAT4&) = default;
+ XMFLOAT4& operator=(const XMFLOAT4&) = default;
+
+ XMFLOAT4(XMFLOAT4&&) = default;
+ XMFLOAT4& operator=(XMFLOAT4&&) = default;
+
+ constexpr XMFLOAT4(float _x, float _y, float _z, float _w) noexcept : x(_x), y(_y), z(_z), w(_w) {}
+ explicit XMFLOAT4(_In_reads_(4) const float* pArray) noexcept : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {}
+
+ #if (__cplusplus >= 202002L)
+ bool operator == (const XMFLOAT4&) const = default;
+ auto operator <=> (const XMFLOAT4&) const = default;
+ #endif
+ };
+
+ // 4D Vector; 32 bit floating point components aligned on a 16 byte boundary
+ XM_ALIGNED_STRUCT(16) XMFLOAT4A : public XMFLOAT4
+ {
+ using XMFLOAT4::XMFLOAT4;
+ };
+
+ //------------------------------------------------------------------------------
+ // 4D Vector; 32 bit signed integer components
+ struct XMINT4
+ {
+ int32_t x;
+ int32_t y;
+ int32_t z;
+ int32_t w;
+
+ XMINT4() = default;
+
+ XMINT4(const XMINT4&) = default;
+ XMINT4& operator=(const XMINT4&) = default;
+
+ XMINT4(XMINT4&&) = default;
+ XMINT4& operator=(XMINT4&&) = default;
+
+ constexpr XMINT4(int32_t _x, int32_t _y, int32_t _z, int32_t _w) noexcept : x(_x), y(_y), z(_z), w(_w) {}
+ explicit XMINT4(_In_reads_(4) const int32_t* pArray) noexcept : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {}
+
+ #if (__cplusplus >= 202002L)
+ bool operator == (const XMINT4&) const = default;
+ auto operator <=> (const XMINT4&) const = default;
+ #endif
+ };
+
+ // 4D Vector; 32 bit unsigned integer components
+ struct XMUINT4
+ {
+ uint32_t x;
+ uint32_t y;
+ uint32_t z;
+ uint32_t w;
+
+ XMUINT4() = default;
+
+ XMUINT4(const XMUINT4&) = default;
+ XMUINT4& operator=(const XMUINT4&) = default;
+
+ XMUINT4(XMUINT4&&) = default;
+ XMUINT4& operator=(XMUINT4&&) = default;
+
+ constexpr XMUINT4(uint32_t _x, uint32_t _y, uint32_t _z, uint32_t _w) noexcept : x(_x), y(_y), z(_z), w(_w) {}
+ explicit XMUINT4(_In_reads_(4) const uint32_t* pArray) noexcept : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {}
+
+ #if (__cplusplus >= 202002L)
+ bool operator == (const XMUINT4&) const = default;
+ auto operator <=> (const XMUINT4&) const = default;
+ #endif
+ };
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wgnu-anonymous-struct"
+#pragma clang diagnostic ignored "-Wnested-anon-types"
+#pragma clang diagnostic ignored "-Wunknown-warning-option"
+#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"
+#endif
+
+ //------------------------------------------------------------------------------
+ // 3x3 Matrix: 32 bit floating point components
+ struct XMFLOAT3X3
+ {
+ union
+ {
+ struct
+ {
+ float _11, _12, _13;
+ float _21, _22, _23;
+ float _31, _32, _33;
+ };
+ float m[3][3];
+ };
+
+ XMFLOAT3X3() = default;
+
+ XMFLOAT3X3(const XMFLOAT3X3&) = default;
+ XMFLOAT3X3& operator=(const XMFLOAT3X3&) = default;
+
+ XMFLOAT3X3(XMFLOAT3X3&&) = default;
+ XMFLOAT3X3& operator=(XMFLOAT3X3&&) = default;
+
+ constexpr XMFLOAT3X3(float m00, float m01, float m02,
+ float m10, float m11, float m12,
+ float m20, float m21, float m22) noexcept
+ : _11(m00), _12(m01), _13(m02),
+ _21(m10), _22(m11), _23(m12),
+ _31(m20), _32(m21), _33(m22)
+ {}
+ explicit XMFLOAT3X3(_In_reads_(9) const float* pArray) noexcept;
+
+ float operator() (size_t Row, size_t Column) const noexcept { return m[Row][Column]; }
+ float& operator() (size_t Row, size_t Column) noexcept { return m[Row][Column]; }
+
+ #if (__cplusplus >= 202002L)
+ bool operator == (const XMFLOAT3X3& M) const noexcept
+ {
+ return _11 == M._11 && _12 == M._12 && _13 == M._13
+ && _21 == M._21 && _22 == M._22 && _23 == M._23
+ && _31 == M._31 && _32 == M._32 && _33 == M._33;
+ }
+
+ auto operator <=> (const XMFLOAT3X3& M) const noexcept
+ {
+ if (auto cmp = _11 <=> M._11; cmp != 0) return cmp;
+ if (auto cmp = _12 <=> M._12; cmp != 0) return cmp;
+ if (auto cmp = _13 <=> M._13; cmp != 0) return cmp;
+ if (auto cmp = _21 <=> M._21; cmp != 0) return cmp;
+ if (auto cmp = _22 <=> M._22; cmp != 0) return cmp;
+ if (auto cmp = _23 <=> M._23; cmp != 0) return cmp;
+ if (auto cmp = _31 <=> M._31; cmp != 0) return cmp;
+ if (auto cmp = _32 <=> M._32; cmp != 0) return cmp;
+ return _33 <=> M._33;
+ }
+ #endif
+ };
+
+ //------------------------------------------------------------------------------
+ // 4x3 Row-major Matrix: 32 bit floating point components
+ struct XMFLOAT4X3
+ {
+ union
+ {
+ struct
+ {
+ float _11, _12, _13;
+ float _21, _22, _23;
+ float _31, _32, _33;
+ float _41, _42, _43;
+ };
+ float m[4][3];
+ float f[12];
+ };
+
+ XMFLOAT4X3() = default;
+
+ XMFLOAT4X3(const XMFLOAT4X3&) = default;
+ XMFLOAT4X3& operator=(const XMFLOAT4X3&) = default;
+
+ XMFLOAT4X3(XMFLOAT4X3&&) = default;
+ XMFLOAT4X3& operator=(XMFLOAT4X3&&) = default;
+
+ constexpr XMFLOAT4X3(float m00, float m01, float m02,
+ float m10, float m11, float m12,
+ float m20, float m21, float m22,
+ float m30, float m31, float m32) noexcept
+ : _11(m00), _12(m01), _13(m02),
+ _21(m10), _22(m11), _23(m12),
+ _31(m20), _32(m21), _33(m22),
+ _41(m30), _42(m31), _43(m32)
+ {}
+ explicit XMFLOAT4X3(_In_reads_(12) const float* pArray) noexcept;
+
+ float operator() (size_t Row, size_t Column) const noexcept { return m[Row][Column]; }
+ float& operator() (size_t Row, size_t Column) noexcept { return m[Row][Column]; }
+
+ #if (__cplusplus >= 202002L)
+ bool operator == (const XMFLOAT4X3& M) const noexcept
+ {
+ return _11 == M._11 && _12 == M._12 && _13 == M._13
+ && _21 == M._21 && _22 == M._22 && _23 == M._23
+ && _31 == M._31 && _32 == M._32 && _33 == M._33
+ && _41 == M._41 && _42 == M._42 && _43 == M._43;
+ }
+
+ auto operator <=> (const XMFLOAT4X3& M) const noexcept
+ {
+ if (auto cmp = _11 <=> M._11; cmp != 0) return cmp;
+ if (auto cmp = _12 <=> M._12; cmp != 0) return cmp;
+ if (auto cmp = _13 <=> M._13; cmp != 0) return cmp;
+ if (auto cmp = _21 <=> M._21; cmp != 0) return cmp;
+ if (auto cmp = _22 <=> M._22; cmp != 0) return cmp;
+ if (auto cmp = _23 <=> M._23; cmp != 0) return cmp;
+ if (auto cmp = _31 <=> M._31; cmp != 0) return cmp;
+ if (auto cmp = _32 <=> M._32; cmp != 0) return cmp;
+ if (auto cmp = _33 <=> M._33; cmp != 0) return cmp;
+ if (auto cmp = _41 <=> M._41; cmp != 0) return cmp;
+ if (auto cmp = _42 <=> M._42; cmp != 0) return cmp;
+ return _43 <=> M._43;
+ }
+ #endif
+ };
+
+ // 4x3 Row-major Matrix: 32 bit floating point components aligned on a 16 byte boundary
+ XM_ALIGNED_STRUCT(16) XMFLOAT4X3A : public XMFLOAT4X3
+ {
+ using XMFLOAT4X3::XMFLOAT4X3;
+ };
+
+ //------------------------------------------------------------------------------
+ // 3x4 Column-major Matrix: 32 bit floating point components
+ struct XMFLOAT3X4
+ {
+ union
+ {
+ struct
+ {
+ float _11, _12, _13, _14;
+ float _21, _22, _23, _24;
+ float _31, _32, _33, _34;
+ };
+ float m[3][4];
+ float f[12];
+ };
+
+ XMFLOAT3X4() = default;
+
+ XMFLOAT3X4(const XMFLOAT3X4&) = default;
+ XMFLOAT3X4& operator=(const XMFLOAT3X4&) = default;
+
+ XMFLOAT3X4(XMFLOAT3X4&&) = default;
+ XMFLOAT3X4& operator=(XMFLOAT3X4&&) = default;
+
+ constexpr XMFLOAT3X4(float m00, float m01, float m02, float m03,
+ float m10, float m11, float m12, float m13,
+ float m20, float m21, float m22, float m23) noexcept
+ : _11(m00), _12(m01), _13(m02), _14(m03),
+ _21(m10), _22(m11), _23(m12), _24(m13),
+ _31(m20), _32(m21), _33(m22), _34(m23)
+ {}
+ explicit XMFLOAT3X4(_In_reads_(12) const float* pArray) noexcept;
+
+ float operator() (size_t Row, size_t Column) const noexcept { return m[Row][Column]; }
+ float& operator() (size_t Row, size_t Column) noexcept { return m[Row][Column]; }
+
+ #if (__cplusplus >= 202002L)
+ bool operator == (const XMFLOAT3X4& M) const noexcept
+ {
+ return _11 == M._11 && _12 == M._12 && _13 == M._13 && _14 == M._14
+ && _21 == M._21 && _22 == M._22 && _23 == M._23 && _24 == M._24
+ && _31 == M._31 && _32 == M._32 && _33 == M._33 && _34 == M._34;
+ }
+
+ auto operator <=> (const XMFLOAT3X4& M) const noexcept
+ {
+ if (auto cmp = _11 <=> M._11; cmp != 0) return cmp;
+ if (auto cmp = _12 <=> M._12; cmp != 0) return cmp;
+ if (auto cmp = _13 <=> M._13; cmp != 0) return cmp;
+ if (auto cmp = _14 <=> M._14; cmp != 0) return cmp;
+ if (auto cmp = _21 <=> M._21; cmp != 0) return cmp;
+ if (auto cmp = _22 <=> M._22; cmp != 0) return cmp;
+ if (auto cmp = _23 <=> M._23; cmp != 0) return cmp;
+ if (auto cmp = _24 <=> M._24; cmp != 0) return cmp;
+ if (auto cmp = _31 <=> M._31; cmp != 0) return cmp;
+ if (auto cmp = _32 <=> M._32; cmp != 0) return cmp;
+ if (auto cmp = _33 <=> M._33; cmp != 0) return cmp;
+ return _34 <=> M._34;
+ }
+ #endif
+ };
+
+ // 3x4 Column-major Matrix: 32 bit floating point components aligned on a 16 byte boundary
+ XM_ALIGNED_STRUCT(16) XMFLOAT3X4A : public XMFLOAT3X4
+ {
+ using XMFLOAT3X4::XMFLOAT3X4;
+ };
+
+ //------------------------------------------------------------------------------
+ // 4x4 Matrix: 32 bit floating point components
+ struct XMFLOAT4X4
+ {
+ union
+ {
+ struct
+ {
+ float _11, _12, _13, _14;
+ float _21, _22, _23, _24;
+ float _31, _32, _33, _34;
+ float _41, _42, _43, _44;
+ };
+ float m[4][4];
+ };
+
+ XMFLOAT4X4() = default;
+
+ XMFLOAT4X4(const XMFLOAT4X4&) = default;
+ XMFLOAT4X4& operator=(const XMFLOAT4X4&) = default;
+
+ XMFLOAT4X4(XMFLOAT4X4&&) = default;
+ XMFLOAT4X4& operator=(XMFLOAT4X4&&) = default;
+
+ constexpr XMFLOAT4X4(float m00, float m01, float m02, float m03,
+ float m10, float m11, float m12, float m13,
+ float m20, float m21, float m22, float m23,
+ float m30, float m31, float m32, float m33) noexcept
+ : _11(m00), _12(m01), _13(m02), _14(m03),
+ _21(m10), _22(m11), _23(m12), _24(m13),
+ _31(m20), _32(m21), _33(m22), _34(m23),
+ _41(m30), _42(m31), _43(m32), _44(m33)
+ {}
+ explicit XMFLOAT4X4(_In_reads_(16) const float* pArray) noexcept;
+
+ float operator() (size_t Row, size_t Column) const noexcept { return m[Row][Column]; }
+ float& operator() (size_t Row, size_t Column) noexcept { return m[Row][Column]; }
+
+ #if (__cplusplus >= 202002L)
+ bool operator == (const XMFLOAT4X4& M) const noexcept
+ {
+ return _11 == M._11 && _12 == M._12 && _13 == M._13 && _14 == M._14
+ && _21 == M._21 && _22 == M._22 && _23 == M._23 && _24 == M._24
+ && _31 == M._31 && _32 == M._32 && _33 == M._33 && _34 == M._34
+ && _41 == M._41 && _42 == M._42 && _43 == M._43 && _44 == M._44;
+ }
+
+ auto operator <=> (const XMFLOAT4X4& M) const noexcept
+ {
+ if (auto cmp = _11 <=> M._11; cmp != 0) return cmp;
+ if (auto cmp = _12 <=> M._12; cmp != 0) return cmp;
+ if (auto cmp = _13 <=> M._13; cmp != 0) return cmp;
+ if (auto cmp = _14 <=> M._14; cmp != 0) return cmp;
+ if (auto cmp = _21 <=> M._21; cmp != 0) return cmp;
+ if (auto cmp = _22 <=> M._22; cmp != 0) return cmp;
+ if (auto cmp = _23 <=> M._23; cmp != 0) return cmp;
+ if (auto cmp = _24 <=> M._24; cmp != 0) return cmp;
+ if (auto cmp = _31 <=> M._31; cmp != 0) return cmp;
+ if (auto cmp = _32 <=> M._32; cmp != 0) return cmp;
+ if (auto cmp = _33 <=> M._33; cmp != 0) return cmp;
+ if (auto cmp = _34 <=> M._34; cmp != 0) return cmp;
+ if (auto cmp = _41 <=> M._41; cmp != 0) return cmp;
+ if (auto cmp = _42 <=> M._42; cmp != 0) return cmp;
+ if (auto cmp = _43 <=> M._43; cmp != 0) return cmp;
+ return _44 <=> M._44;
+ }
+ #endif
+ };
+
+ // 4x4 Matrix: 32 bit floating point components aligned on a 16 byte boundary
+ XM_ALIGNED_STRUCT(16) XMFLOAT4X4A : public XMFLOAT4X4
+ {
+ using XMFLOAT4X4::XMFLOAT4X4;
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+#ifdef _PREFAST_
+#pragma prefast(pop)
+#endif
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+/****************************************************************************
+ *
+ * Data conversion operations
+ *
+ ****************************************************************************/
+
+ XMVECTOR XM_CALLCONV XMConvertVectorIntToFloat(FXMVECTOR VInt, uint32_t DivExponent) noexcept;
+ XMVECTOR XM_CALLCONV XMConvertVectorFloatToInt(FXMVECTOR VFloat, uint32_t MulExponent) noexcept;
+ XMVECTOR XM_CALLCONV XMConvertVectorUIntToFloat(FXMVECTOR VUInt, uint32_t DivExponent) noexcept;
+ XMVECTOR XM_CALLCONV XMConvertVectorFloatToUInt(FXMVECTOR VFloat, uint32_t MulExponent) noexcept;
+
+#if defined(__XNAMATH_H__) && defined(XMVectorSetBinaryConstant)
+#undef XMVectorSetBinaryConstant
+#undef XMVectorSplatConstant
+#undef XMVectorSplatConstantInt
+#endif
+
+ XMVECTOR XM_CALLCONV XMVectorSetBinaryConstant(uint32_t C0, uint32_t C1, uint32_t C2, uint32_t C3) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSplatConstant(int32_t IntConstant, uint32_t DivExponent) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSplatConstantInt(int32_t IntConstant) noexcept;
+
+ /****************************************************************************
+ *
+ * Load operations
+ *
+ ****************************************************************************/
+
+ XMVECTOR XM_CALLCONV XMLoadInt(_In_ const uint32_t* pSource) noexcept;
+ XMVECTOR XM_CALLCONV XMLoadFloat(_In_ const float* pSource) noexcept;
+
+ XMVECTOR XM_CALLCONV XMLoadInt2(_In_reads_(2) const uint32_t* pSource) noexcept;
+ XMVECTOR XM_CALLCONV XMLoadInt2A(_In_reads_(2) const uint32_t* PSource) noexcept;
+ XMVECTOR XM_CALLCONV XMLoadFloat2(_In_ const XMFLOAT2* pSource) noexcept;
+ XMVECTOR XM_CALLCONV XMLoadFloat2A(_In_ const XMFLOAT2A* pSource) noexcept;
+ XMVECTOR XM_CALLCONV XMLoadSInt2(_In_ const XMINT2* pSource) noexcept;
+ XMVECTOR XM_CALLCONV XMLoadUInt2(_In_ const XMUINT2* pSource) noexcept;
+
+ XMVECTOR XM_CALLCONV XMLoadInt3(_In_reads_(3) const uint32_t* pSource) noexcept;
+ XMVECTOR XM_CALLCONV XMLoadInt3A(_In_reads_(3) const uint32_t* pSource) noexcept;
+ XMVECTOR XM_CALLCONV XMLoadFloat3(_In_ const XMFLOAT3* pSource) noexcept;
+ XMVECTOR XM_CALLCONV XMLoadFloat3A(_In_ const XMFLOAT3A* pSource) noexcept;
+ XMVECTOR XM_CALLCONV XMLoadSInt3(_In_ const XMINT3* pSource) noexcept;
+ XMVECTOR XM_CALLCONV XMLoadUInt3(_In_ const XMUINT3* pSource) noexcept;
+
+ XMVECTOR XM_CALLCONV XMLoadInt4(_In_reads_(4) const uint32_t* pSource) noexcept;
+ XMVECTOR XM_CALLCONV XMLoadInt4A(_In_reads_(4) const uint32_t* pSource) noexcept;
+ XMVECTOR XM_CALLCONV XMLoadFloat4(_In_ const XMFLOAT4* pSource) noexcept;
+ XMVECTOR XM_CALLCONV XMLoadFloat4A(_In_ const XMFLOAT4A* pSource) noexcept;
+ XMVECTOR XM_CALLCONV XMLoadSInt4(_In_ const XMINT4* pSource) noexcept;
+ XMVECTOR XM_CALLCONV XMLoadUInt4(_In_ const XMUINT4* pSource) noexcept;
+
+ XMMATRIX XM_CALLCONV XMLoadFloat3x3(_In_ const XMFLOAT3X3* pSource) noexcept;
+ XMMATRIX XM_CALLCONV XMLoadFloat4x3(_In_ const XMFLOAT4X3* pSource) noexcept;
+ XMMATRIX XM_CALLCONV XMLoadFloat4x3A(_In_ const XMFLOAT4X3A* pSource) noexcept;
+ XMMATRIX XM_CALLCONV XMLoadFloat3x4(_In_ const XMFLOAT3X4* pSource) noexcept;
+ XMMATRIX XM_CALLCONV XMLoadFloat3x4A(_In_ const XMFLOAT3X4A* pSource) noexcept;
+ XMMATRIX XM_CALLCONV XMLoadFloat4x4(_In_ const XMFLOAT4X4* pSource) noexcept;
+ XMMATRIX XM_CALLCONV XMLoadFloat4x4A(_In_ const XMFLOAT4X4A* pSource) noexcept;
+
+ /****************************************************************************
+ *
+ * Store operations
+ *
+ ****************************************************************************/
+
+ void XM_CALLCONV XMStoreInt(_Out_ uint32_t* pDestination, _In_ FXMVECTOR V) noexcept;
+ void XM_CALLCONV XMStoreFloat(_Out_ float* pDestination, _In_ FXMVECTOR V) noexcept;
+
+ void XM_CALLCONV XMStoreInt2(_Out_writes_(2) uint32_t* pDestination, _In_ FXMVECTOR V) noexcept;
+ void XM_CALLCONV XMStoreInt2A(_Out_writes_(2) uint32_t* pDestination, _In_ FXMVECTOR V) noexcept;
+ void XM_CALLCONV XMStoreFloat2(_Out_ XMFLOAT2* pDestination, _In_ FXMVECTOR V) noexcept;
+ void XM_CALLCONV XMStoreFloat2A(_Out_ XMFLOAT2A* pDestination, _In_ FXMVECTOR V) noexcept;
+ void XM_CALLCONV XMStoreSInt2(_Out_ XMINT2* pDestination, _In_ FXMVECTOR V) noexcept;
+ void XM_CALLCONV XMStoreUInt2(_Out_ XMUINT2* pDestination, _In_ FXMVECTOR V) noexcept;
+
+ void XM_CALLCONV XMStoreInt3(_Out_writes_(3) uint32_t* pDestination, _In_ FXMVECTOR V) noexcept;
+ void XM_CALLCONV XMStoreInt3A(_Out_writes_(3) uint32_t* pDestination, _In_ FXMVECTOR V) noexcept;
+ void XM_CALLCONV XMStoreFloat3(_Out_ XMFLOAT3* pDestination, _In_ FXMVECTOR V) noexcept;
+ void XM_CALLCONV XMStoreFloat3A(_Out_ XMFLOAT3A* pDestination, _In_ FXMVECTOR V) noexcept;
+ void XM_CALLCONV XMStoreSInt3(_Out_ XMINT3* pDestination, _In_ FXMVECTOR V) noexcept;
+ void XM_CALLCONV XMStoreUInt3(_Out_ XMUINT3* pDestination, _In_ FXMVECTOR V) noexcept;
+
+ void XM_CALLCONV XMStoreInt4(_Out_writes_(4) uint32_t* pDestination, _In_ FXMVECTOR V) noexcept;
+ void XM_CALLCONV XMStoreInt4A(_Out_writes_(4) uint32_t* pDestination, _In_ FXMVECTOR V) noexcept;
+ void XM_CALLCONV XMStoreFloat4(_Out_ XMFLOAT4* pDestination, _In_ FXMVECTOR V) noexcept;
+ void XM_CALLCONV XMStoreFloat4A(_Out_ XMFLOAT4A* pDestination, _In_ FXMVECTOR V) noexcept;
+ void XM_CALLCONV XMStoreSInt4(_Out_ XMINT4* pDestination, _In_ FXMVECTOR V) noexcept;
+ void XM_CALLCONV XMStoreUInt4(_Out_ XMUINT4* pDestination, _In_ FXMVECTOR V) noexcept;
+
+ void XM_CALLCONV XMStoreFloat3x3(_Out_ XMFLOAT3X3* pDestination, _In_ FXMMATRIX M) noexcept;
+ void XM_CALLCONV XMStoreFloat4x3(_Out_ XMFLOAT4X3* pDestination, _In_ FXMMATRIX M) noexcept;
+ void XM_CALLCONV XMStoreFloat4x3A(_Out_ XMFLOAT4X3A* pDestination, _In_ FXMMATRIX M) noexcept;
+ void XM_CALLCONV XMStoreFloat3x4(_Out_ XMFLOAT3X4* pDestination, _In_ FXMMATRIX M) noexcept;
+ void XM_CALLCONV XMStoreFloat3x4A(_Out_ XMFLOAT3X4A* pDestination, _In_ FXMMATRIX M) noexcept;
+ void XM_CALLCONV XMStoreFloat4x4(_Out_ XMFLOAT4X4* pDestination, _In_ FXMMATRIX M) noexcept;
+ void XM_CALLCONV XMStoreFloat4x4A(_Out_ XMFLOAT4X4A* pDestination, _In_ FXMMATRIX M) noexcept;
+
+ /****************************************************************************
+ *
+ * General vector operations
+ *
+ ****************************************************************************/
+
+ XMVECTOR XM_CALLCONV XMVectorZero() noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSet(float x, float y, float z, float w) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSetInt(uint32_t x, uint32_t y, uint32_t z, uint32_t w) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorReplicate(float Value) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorReplicatePtr(_In_ const float* pValue) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorReplicateInt(uint32_t Value) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorReplicateIntPtr(_In_ const uint32_t* pValue) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorTrueInt() noexcept;
+ XMVECTOR XM_CALLCONV XMVectorFalseInt() noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSplatX(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSplatY(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSplatZ(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSplatW(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSplatOne() noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSplatInfinity() noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSplatQNaN() noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSplatEpsilon() noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSplatSignMask() noexcept;
+
+ float XM_CALLCONV XMVectorGetByIndex(FXMVECTOR V, size_t i) noexcept;
+ float XM_CALLCONV XMVectorGetX(FXMVECTOR V) noexcept;
+ float XM_CALLCONV XMVectorGetY(FXMVECTOR V) noexcept;
+ float XM_CALLCONV XMVectorGetZ(FXMVECTOR V) noexcept;
+ float XM_CALLCONV XMVectorGetW(FXMVECTOR V) noexcept;
+
+ void XM_CALLCONV XMVectorGetByIndexPtr(_Out_ float* f, _In_ FXMVECTOR V, _In_ size_t i) noexcept;
+ void XM_CALLCONV XMVectorGetXPtr(_Out_ float* x, _In_ FXMVECTOR V) noexcept;
+ void XM_CALLCONV XMVectorGetYPtr(_Out_ float* y, _In_ FXMVECTOR V) noexcept;
+ void XM_CALLCONV XMVectorGetZPtr(_Out_ float* z, _In_ FXMVECTOR V) noexcept;
+ void XM_CALLCONV XMVectorGetWPtr(_Out_ float* w, _In_ FXMVECTOR V) noexcept;
+
+ uint32_t XM_CALLCONV XMVectorGetIntByIndex(FXMVECTOR V, size_t i) noexcept;
+ uint32_t XM_CALLCONV XMVectorGetIntX(FXMVECTOR V) noexcept;
+ uint32_t XM_CALLCONV XMVectorGetIntY(FXMVECTOR V) noexcept;
+ uint32_t XM_CALLCONV XMVectorGetIntZ(FXMVECTOR V) noexcept;
+ uint32_t XM_CALLCONV XMVectorGetIntW(FXMVECTOR V) noexcept;
+
+ void XM_CALLCONV XMVectorGetIntByIndexPtr(_Out_ uint32_t* x, _In_ FXMVECTOR V, _In_ size_t i) noexcept;
+ void XM_CALLCONV XMVectorGetIntXPtr(_Out_ uint32_t* x, _In_ FXMVECTOR V) noexcept;
+ void XM_CALLCONV XMVectorGetIntYPtr(_Out_ uint32_t* y, _In_ FXMVECTOR V) noexcept;
+ void XM_CALLCONV XMVectorGetIntZPtr(_Out_ uint32_t* z, _In_ FXMVECTOR V) noexcept;
+ void XM_CALLCONV XMVectorGetIntWPtr(_Out_ uint32_t* w, _In_ FXMVECTOR V) noexcept;
+
+ XMVECTOR XM_CALLCONV XMVectorSetByIndex(FXMVECTOR V, float f, size_t i) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSetX(FXMVECTOR V, float x) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSetY(FXMVECTOR V, float y) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSetZ(FXMVECTOR V, float z) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSetW(FXMVECTOR V, float w) noexcept;
+
+ XMVECTOR XM_CALLCONV XMVectorSetByIndexPtr(_In_ FXMVECTOR V, _In_ const float* f, _In_ size_t i) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSetXPtr(_In_ FXMVECTOR V, _In_ const float* x) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSetYPtr(_In_ FXMVECTOR V, _In_ const float* y) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSetZPtr(_In_ FXMVECTOR V, _In_ const float* z) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSetWPtr(_In_ FXMVECTOR V, _In_ const float* w) noexcept;
+
+ XMVECTOR XM_CALLCONV XMVectorSetIntByIndex(FXMVECTOR V, uint32_t x, size_t i) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSetIntX(FXMVECTOR V, uint32_t x) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSetIntY(FXMVECTOR V, uint32_t y) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSetIntZ(FXMVECTOR V, uint32_t z) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSetIntW(FXMVECTOR V, uint32_t w) noexcept;
+
+ XMVECTOR XM_CALLCONV XMVectorSetIntByIndexPtr(_In_ FXMVECTOR V, _In_ const uint32_t* x, _In_ size_t i) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSetIntXPtr(_In_ FXMVECTOR V, _In_ const uint32_t* x) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSetIntYPtr(_In_ FXMVECTOR V, _In_ const uint32_t* y) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSetIntZPtr(_In_ FXMVECTOR V, _In_ const uint32_t* z) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSetIntWPtr(_In_ FXMVECTOR V, _In_ const uint32_t* w) noexcept;
+
+#if defined(__XNAMATH_H__) && defined(XMVectorSwizzle)
+#undef XMVectorSwizzle
+#endif
+
+ XMVECTOR XM_CALLCONV XMVectorSwizzle(FXMVECTOR V, uint32_t E0, uint32_t E1, uint32_t E2, uint32_t E3) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2, uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSelectControl(uint32_t VectorIndex0, uint32_t VectorIndex1, uint32_t VectorIndex2, uint32_t VectorIndex3) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSelect(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR Control) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorMergeXY(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorMergeZW(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+
+#if defined(__XNAMATH_H__) && defined(XMVectorShiftLeft)
+#undef XMVectorShiftLeft
+#undef XMVectorRotateLeft
+#undef XMVectorRotateRight
+#undef XMVectorInsert
+#endif
+
+ XMVECTOR XM_CALLCONV XMVectorShiftLeft(FXMVECTOR V1, FXMVECTOR V2, uint32_t Elements) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorRotateLeft(FXMVECTOR V, uint32_t Elements) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorRotateRight(FXMVECTOR V, uint32_t Elements) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorInsert(FXMVECTOR VD, FXMVECTOR VS, uint32_t VSLeftRotateElements,
+ uint32_t Select0, uint32_t Select1, uint32_t Select2, uint32_t Select3) noexcept;
+
+ XMVECTOR XM_CALLCONV XMVectorEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorEqualR(_Out_ uint32_t* pCR, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorEqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorEqualIntR(_Out_ uint32_t* pCR, _In_ FXMVECTOR V, _In_ FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorNearEqual(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR Epsilon) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorNotEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorNotEqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorGreater(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorGreaterR(_Out_ uint32_t* pCR, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorGreaterOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorGreaterOrEqualR(_Out_ uint32_t* pCR, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorLess(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorLessOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorInBounds(FXMVECTOR V, FXMVECTOR Bounds) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorInBoundsR(_Out_ uint32_t* pCR, _In_ FXMVECTOR V, _In_ FXMVECTOR Bounds) noexcept;
+
+ XMVECTOR XM_CALLCONV XMVectorIsNaN(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorIsInfinite(FXMVECTOR V) noexcept;
+
+ XMVECTOR XM_CALLCONV XMVectorMin(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorMax(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorRound(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorTruncate(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorFloor(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorCeiling(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorClamp(FXMVECTOR V, FXMVECTOR Min, FXMVECTOR Max) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSaturate(FXMVECTOR V) noexcept;
+
+ XMVECTOR XM_CALLCONV XMVectorAndInt(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorAndCInt(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorOrInt(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorNorInt(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorXorInt(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+
+ XMVECTOR XM_CALLCONV XMVectorNegate(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorAdd(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSum(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorAddAngles(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSubtract(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSubtractAngles(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorMultiply(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorMultiplyAdd(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR V3) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorDivide(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorNegativeMultiplySubtract(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR V3) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorScale(FXMVECTOR V, float ScaleFactor) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorReciprocalEst(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorReciprocal(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSqrtEst(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSqrt(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorReciprocalSqrtEst(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorReciprocalSqrt(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorExp2(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorExp10(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorExpE(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorExp(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorLog2(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorLog10(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorLogE(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorLog(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorPow(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorAbs(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorMod(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorModAngles(FXMVECTOR Angles) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSin(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSinEst(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorCos(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorCosEst(FXMVECTOR V) noexcept;
+ void XM_CALLCONV XMVectorSinCos(_Out_ XMVECTOR* pSin, _Out_ XMVECTOR* pCos, _In_ FXMVECTOR V) noexcept;
+ void XM_CALLCONV XMVectorSinCosEst(_Out_ XMVECTOR* pSin, _Out_ XMVECTOR* pCos, _In_ FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorTan(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorTanEst(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorSinH(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorCosH(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorTanH(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorASin(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorASinEst(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorACos(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorACosEst(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorATan(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorATanEst(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorATan2(FXMVECTOR Y, FXMVECTOR X) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorATan2Est(FXMVECTOR Y, FXMVECTOR X) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorLerp(FXMVECTOR V0, FXMVECTOR V1, float t) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorLerpV(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR T) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorHermite(FXMVECTOR Position0, FXMVECTOR Tangent0, FXMVECTOR Position1, GXMVECTOR Tangent1, float t) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorHermiteV(FXMVECTOR Position0, FXMVECTOR Tangent0, FXMVECTOR Position1, GXMVECTOR Tangent1, HXMVECTOR T) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorCatmullRom(FXMVECTOR Position0, FXMVECTOR Position1, FXMVECTOR Position2, GXMVECTOR Position3, float t) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorCatmullRomV(FXMVECTOR Position0, FXMVECTOR Position1, FXMVECTOR Position2, GXMVECTOR Position3, HXMVECTOR T) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorBaryCentric(FXMVECTOR Position0, FXMVECTOR Position1, FXMVECTOR Position2, float f, float g) noexcept;
+ XMVECTOR XM_CALLCONV XMVectorBaryCentricV(FXMVECTOR Position0, FXMVECTOR Position1, FXMVECTOR Position2, GXMVECTOR F, HXMVECTOR G) noexcept;
+
+ /****************************************************************************
+ *
+ * 2D vector operations
+ *
+ ****************************************************************************/
+
+ bool XM_CALLCONV XMVector2Equal(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ uint32_t XM_CALLCONV XMVector2EqualR(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ bool XM_CALLCONV XMVector2EqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ uint32_t XM_CALLCONV XMVector2EqualIntR(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ bool XM_CALLCONV XMVector2NearEqual(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR Epsilon) noexcept;
+ bool XM_CALLCONV XMVector2NotEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ bool XM_CALLCONV XMVector2NotEqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ bool XM_CALLCONV XMVector2Greater(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ uint32_t XM_CALLCONV XMVector2GreaterR(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ bool XM_CALLCONV XMVector2GreaterOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ uint32_t XM_CALLCONV XMVector2GreaterOrEqualR(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ bool XM_CALLCONV XMVector2Less(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ bool XM_CALLCONV XMVector2LessOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ bool XM_CALLCONV XMVector2InBounds(FXMVECTOR V, FXMVECTOR Bounds) noexcept;
+
+ bool XM_CALLCONV XMVector2IsNaN(FXMVECTOR V) noexcept;
+ bool XM_CALLCONV XMVector2IsInfinite(FXMVECTOR V) noexcept;
+
+ XMVECTOR XM_CALLCONV XMVector2Dot(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVector2Cross(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVector2LengthSq(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVector2ReciprocalLengthEst(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVector2ReciprocalLength(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVector2LengthEst(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVector2Length(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVector2NormalizeEst(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVector2Normalize(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVector2ClampLength(FXMVECTOR V, float LengthMin, float LengthMax) noexcept;
+ XMVECTOR XM_CALLCONV XMVector2ClampLengthV(FXMVECTOR V, FXMVECTOR LengthMin, FXMVECTOR LengthMax) noexcept;
+ XMVECTOR XM_CALLCONV XMVector2Reflect(FXMVECTOR Incident, FXMVECTOR Normal) noexcept;
+ XMVECTOR XM_CALLCONV XMVector2Refract(FXMVECTOR Incident, FXMVECTOR Normal, float RefractionIndex) noexcept;
+ XMVECTOR XM_CALLCONV XMVector2RefractV(FXMVECTOR Incident, FXMVECTOR Normal, FXMVECTOR RefractionIndex) noexcept;
+ XMVECTOR XM_CALLCONV XMVector2Orthogonal(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVector2AngleBetweenNormalsEst(FXMVECTOR N1, FXMVECTOR N2) noexcept;
+ XMVECTOR XM_CALLCONV XMVector2AngleBetweenNormals(FXMVECTOR N1, FXMVECTOR N2) noexcept;
+ XMVECTOR XM_CALLCONV XMVector2AngleBetweenVectors(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVector2LinePointDistance(FXMVECTOR LinePoint1, FXMVECTOR LinePoint2, FXMVECTOR Point) noexcept;
+ XMVECTOR XM_CALLCONV XMVector2IntersectLine(FXMVECTOR Line1Point1, FXMVECTOR Line1Point2, FXMVECTOR Line2Point1, GXMVECTOR Line2Point2) noexcept;
+ XMVECTOR XM_CALLCONV XMVector2Transform(FXMVECTOR V, FXMMATRIX M) noexcept;
+ XMFLOAT4* XM_CALLCONV XMVector2TransformStream(_Out_writes_bytes_(sizeof(XMFLOAT4) + OutputStride * (VectorCount - 1)) XMFLOAT4* pOutputStream,
+ _In_ size_t OutputStride,
+ _In_reads_bytes_(sizeof(XMFLOAT2) + InputStride * (VectorCount - 1)) const XMFLOAT2* pInputStream,
+ _In_ size_t InputStride, _In_ size_t VectorCount, _In_ FXMMATRIX M) noexcept;
+ XMVECTOR XM_CALLCONV XMVector2TransformCoord(FXMVECTOR V, FXMMATRIX M) noexcept;
+ XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream(_Out_writes_bytes_(sizeof(XMFLOAT2) + OutputStride * (VectorCount - 1)) XMFLOAT2* pOutputStream,
+ _In_ size_t OutputStride,
+ _In_reads_bytes_(sizeof(XMFLOAT2) + InputStride * (VectorCount - 1)) const XMFLOAT2* pInputStream,
+ _In_ size_t InputStride, _In_ size_t VectorCount, _In_ FXMMATRIX M) noexcept;
+ XMVECTOR XM_CALLCONV XMVector2TransformNormal(FXMVECTOR V, FXMMATRIX M) noexcept;
+ XMFLOAT2* XM_CALLCONV XMVector2TransformNormalStream(_Out_writes_bytes_(sizeof(XMFLOAT2) + OutputStride * (VectorCount - 1)) XMFLOAT2* pOutputStream,
+ _In_ size_t OutputStride,
+ _In_reads_bytes_(sizeof(XMFLOAT2) + InputStride * (VectorCount - 1)) const XMFLOAT2* pInputStream,
+ _In_ size_t InputStride, _In_ size_t VectorCount, _In_ FXMMATRIX M) noexcept;
+
+ /****************************************************************************
+ *
+ * 3D vector operations
+ *
+ ****************************************************************************/
+
+ bool XM_CALLCONV XMVector3Equal(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ uint32_t XM_CALLCONV XMVector3EqualR(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ bool XM_CALLCONV XMVector3EqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ uint32_t XM_CALLCONV XMVector3EqualIntR(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ bool XM_CALLCONV XMVector3NearEqual(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR Epsilon) noexcept;
+ bool XM_CALLCONV XMVector3NotEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ bool XM_CALLCONV XMVector3NotEqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ bool XM_CALLCONV XMVector3Greater(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ uint32_t XM_CALLCONV XMVector3GreaterR(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ bool XM_CALLCONV XMVector3GreaterOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ uint32_t XM_CALLCONV XMVector3GreaterOrEqualR(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ bool XM_CALLCONV XMVector3Less(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ bool XM_CALLCONV XMVector3LessOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ bool XM_CALLCONV XMVector3InBounds(FXMVECTOR V, FXMVECTOR Bounds) noexcept;
+
+ bool XM_CALLCONV XMVector3IsNaN(FXMVECTOR V) noexcept;
+ bool XM_CALLCONV XMVector3IsInfinite(FXMVECTOR V) noexcept;
+
+ XMVECTOR XM_CALLCONV XMVector3Dot(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVector3Cross(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVector3LengthSq(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVector3ReciprocalLengthEst(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVector3ReciprocalLength(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVector3LengthEst(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVector3Length(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVector3NormalizeEst(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVector3Normalize(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVector3ClampLength(FXMVECTOR V, float LengthMin, float LengthMax) noexcept;
+ XMVECTOR XM_CALLCONV XMVector3ClampLengthV(FXMVECTOR V, FXMVECTOR LengthMin, FXMVECTOR LengthMax) noexcept;
+ XMVECTOR XM_CALLCONV XMVector3Reflect(FXMVECTOR Incident, FXMVECTOR Normal) noexcept;
+ XMVECTOR XM_CALLCONV XMVector3Refract(FXMVECTOR Incident, FXMVECTOR Normal, float RefractionIndex) noexcept;
+ XMVECTOR XM_CALLCONV XMVector3RefractV(FXMVECTOR Incident, FXMVECTOR Normal, FXMVECTOR RefractionIndex) noexcept;
+ XMVECTOR XM_CALLCONV XMVector3Orthogonal(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVector3AngleBetweenNormalsEst(FXMVECTOR N1, FXMVECTOR N2) noexcept;
+ XMVECTOR XM_CALLCONV XMVector3AngleBetweenNormals(FXMVECTOR N1, FXMVECTOR N2) noexcept;
+ XMVECTOR XM_CALLCONV XMVector3AngleBetweenVectors(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVector3LinePointDistance(FXMVECTOR LinePoint1, FXMVECTOR LinePoint2, FXMVECTOR Point) noexcept;
+ void XM_CALLCONV XMVector3ComponentsFromNormal(_Out_ XMVECTOR* pParallel, _Out_ XMVECTOR* pPerpendicular, _In_ FXMVECTOR V, _In_ FXMVECTOR Normal) noexcept;
+ XMVECTOR XM_CALLCONV XMVector3Rotate(FXMVECTOR V, FXMVECTOR RotationQuaternion) noexcept;
+ XMVECTOR XM_CALLCONV XMVector3InverseRotate(FXMVECTOR V, FXMVECTOR RotationQuaternion) noexcept;
+ XMVECTOR XM_CALLCONV XMVector3Transform(FXMVECTOR V, FXMMATRIX M) noexcept;
+ XMFLOAT4* XM_CALLCONV XMVector3TransformStream(_Out_writes_bytes_(sizeof(XMFLOAT4) + OutputStride * (VectorCount - 1)) XMFLOAT4* pOutputStream,
+ _In_ size_t OutputStride,
+ _In_reads_bytes_(sizeof(XMFLOAT3) + InputStride * (VectorCount - 1)) const XMFLOAT3* pInputStream,
+ _In_ size_t InputStride, _In_ size_t VectorCount, _In_ FXMMATRIX M) noexcept;
+ XMVECTOR XM_CALLCONV XMVector3TransformCoord(FXMVECTOR V, FXMMATRIX M) noexcept;
+ XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream(_Out_writes_bytes_(sizeof(XMFLOAT3) + OutputStride * (VectorCount - 1)) XMFLOAT3* pOutputStream,
+ _In_ size_t OutputStride,
+ _In_reads_bytes_(sizeof(XMFLOAT3) + InputStride * (VectorCount - 1)) const XMFLOAT3* pInputStream,
+ _In_ size_t InputStride, _In_ size_t VectorCount, _In_ FXMMATRIX M) noexcept;
+ XMVECTOR XM_CALLCONV XMVector3TransformNormal(FXMVECTOR V, FXMMATRIX M) noexcept;
+ XMFLOAT3* XM_CALLCONV XMVector3TransformNormalStream(_Out_writes_bytes_(sizeof(XMFLOAT3) + OutputStride * (VectorCount - 1)) XMFLOAT3* pOutputStream,
+ _In_ size_t OutputStride,
+ _In_reads_bytes_(sizeof(XMFLOAT3) + InputStride * (VectorCount - 1)) const XMFLOAT3* pInputStream,
+ _In_ size_t InputStride, _In_ size_t VectorCount, _In_ FXMMATRIX M) noexcept;
+ XMVECTOR XM_CALLCONV XMVector3Project(FXMVECTOR V, float ViewportX, float ViewportY, float ViewportWidth, float ViewportHeight, float ViewportMinZ, float ViewportMaxZ,
+ FXMMATRIX Projection, CXMMATRIX View, CXMMATRIX World) noexcept;
+ XMFLOAT3* XM_CALLCONV XMVector3ProjectStream(_Out_writes_bytes_(sizeof(XMFLOAT3) + OutputStride * (VectorCount - 1)) XMFLOAT3* pOutputStream,
+ _In_ size_t OutputStride,
+ _In_reads_bytes_(sizeof(XMFLOAT3) + InputStride * (VectorCount - 1)) const XMFLOAT3* pInputStream,
+ _In_ size_t InputStride, _In_ size_t VectorCount,
+ _In_ float ViewportX, _In_ float ViewportY, _In_ float ViewportWidth, _In_ float ViewportHeight, _In_ float ViewportMinZ, _In_ float ViewportMaxZ,
+ _In_ FXMMATRIX Projection, _In_ CXMMATRIX View, _In_ CXMMATRIX World) noexcept;
+ XMVECTOR XM_CALLCONV XMVector3Unproject(FXMVECTOR V, float ViewportX, float ViewportY, float ViewportWidth, float ViewportHeight, float ViewportMinZ, float ViewportMaxZ,
+ FXMMATRIX Projection, CXMMATRIX View, CXMMATRIX World) noexcept;
+ XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream(_Out_writes_bytes_(sizeof(XMFLOAT3) + OutputStride * (VectorCount - 1)) XMFLOAT3* pOutputStream,
+ _In_ size_t OutputStride,
+ _In_reads_bytes_(sizeof(XMFLOAT3) + InputStride * (VectorCount - 1)) const XMFLOAT3* pInputStream,
+ _In_ size_t InputStride, _In_ size_t VectorCount,
+ _In_ float ViewportX, _In_ float ViewportY, _In_ float ViewportWidth, _In_ float ViewportHeight, _In_ float ViewportMinZ, _In_ float ViewportMaxZ,
+ _In_ FXMMATRIX Projection, _In_ CXMMATRIX View, _In_ CXMMATRIX World) noexcept;
+
+ /****************************************************************************
+ *
+ * 4D vector operations
+ *
+ ****************************************************************************/
+
+ bool XM_CALLCONV XMVector4Equal(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ uint32_t XM_CALLCONV XMVector4EqualR(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ bool XM_CALLCONV XMVector4EqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ uint32_t XM_CALLCONV XMVector4EqualIntR(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ bool XM_CALLCONV XMVector4NearEqual(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR Epsilon) noexcept;
+ bool XM_CALLCONV XMVector4NotEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ bool XM_CALLCONV XMVector4NotEqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ bool XM_CALLCONV XMVector4Greater(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ uint32_t XM_CALLCONV XMVector4GreaterR(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ bool XM_CALLCONV XMVector4GreaterOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ uint32_t XM_CALLCONV XMVector4GreaterOrEqualR(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ bool XM_CALLCONV XMVector4Less(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ bool XM_CALLCONV XMVector4LessOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ bool XM_CALLCONV XMVector4InBounds(FXMVECTOR V, FXMVECTOR Bounds) noexcept;
+
+ bool XM_CALLCONV XMVector4IsNaN(FXMVECTOR V) noexcept;
+ bool XM_CALLCONV XMVector4IsInfinite(FXMVECTOR V) noexcept;
+
+ XMVECTOR XM_CALLCONV XMVector4Dot(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVector4Cross(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR V3) noexcept;
+ XMVECTOR XM_CALLCONV XMVector4LengthSq(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVector4ReciprocalLengthEst(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVector4ReciprocalLength(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVector4LengthEst(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVector4Length(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVector4NormalizeEst(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVector4Normalize(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVector4ClampLength(FXMVECTOR V, float LengthMin, float LengthMax) noexcept;
+ XMVECTOR XM_CALLCONV XMVector4ClampLengthV(FXMVECTOR V, FXMVECTOR LengthMin, FXMVECTOR LengthMax) noexcept;
+ XMVECTOR XM_CALLCONV XMVector4Reflect(FXMVECTOR Incident, FXMVECTOR Normal) noexcept;
+ XMVECTOR XM_CALLCONV XMVector4Refract(FXMVECTOR Incident, FXMVECTOR Normal, float RefractionIndex) noexcept;
+ XMVECTOR XM_CALLCONV XMVector4RefractV(FXMVECTOR Incident, FXMVECTOR Normal, FXMVECTOR RefractionIndex) noexcept;
+ XMVECTOR XM_CALLCONV XMVector4Orthogonal(FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMVector4AngleBetweenNormalsEst(FXMVECTOR N1, FXMVECTOR N2) noexcept;
+ XMVECTOR XM_CALLCONV XMVector4AngleBetweenNormals(FXMVECTOR N1, FXMVECTOR N2) noexcept;
+ XMVECTOR XM_CALLCONV XMVector4AngleBetweenVectors(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMVector4Transform(FXMVECTOR V, FXMMATRIX M) noexcept;
+ XMFLOAT4* XM_CALLCONV XMVector4TransformStream(_Out_writes_bytes_(sizeof(XMFLOAT4) + OutputStride * (VectorCount - 1)) XMFLOAT4* pOutputStream,
+ _In_ size_t OutputStride,
+ _In_reads_bytes_(sizeof(XMFLOAT4) + InputStride * (VectorCount - 1)) const XMFLOAT4* pInputStream,
+ _In_ size_t InputStride, _In_ size_t VectorCount, _In_ FXMMATRIX M) noexcept;
+
+ /****************************************************************************
+ *
+ * Matrix operations
+ *
+ ****************************************************************************/
+
+ bool XM_CALLCONV XMMatrixIsNaN(FXMMATRIX M) noexcept;
+ bool XM_CALLCONV XMMatrixIsInfinite(FXMMATRIX M) noexcept;
+ bool XM_CALLCONV XMMatrixIsIdentity(FXMMATRIX M) noexcept;
+
+ XMMATRIX XM_CALLCONV XMMatrixMultiply(FXMMATRIX M1, CXMMATRIX M2) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixMultiplyTranspose(FXMMATRIX M1, CXMMATRIX M2) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixTranspose(FXMMATRIX M) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixInverse(_Out_opt_ XMVECTOR* pDeterminant, _In_ FXMMATRIX M) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixVectorTensorProduct(FXMVECTOR V1, FXMVECTOR V2) noexcept;
+ XMVECTOR XM_CALLCONV XMMatrixDeterminant(FXMMATRIX M) noexcept;
+
+ _Success_(return)
+ bool XM_CALLCONV XMMatrixDecompose(_Out_ XMVECTOR* outScale, _Out_ XMVECTOR* outRotQuat, _Out_ XMVECTOR* outTrans, _In_ FXMMATRIX M) noexcept;
+
+ XMMATRIX XM_CALLCONV XMMatrixIdentity() noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixSet(float m00, float m01, float m02, float m03,
+ float m10, float m11, float m12, float m13,
+ float m20, float m21, float m22, float m23,
+ float m30, float m31, float m32, float m33) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixTranslation(float OffsetX, float OffsetY, float OffsetZ) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixTranslationFromVector(FXMVECTOR Offset) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixScaling(float ScaleX, float ScaleY, float ScaleZ) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixScalingFromVector(FXMVECTOR Scale) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixRotationX(float Angle) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixRotationY(float Angle) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixRotationZ(float Angle) noexcept;
+
+ // Rotates about y-axis (Yaw), then x-axis (Pitch), then z-axis (Roll)
+ XMMATRIX XM_CALLCONV XMMatrixRotationRollPitchYaw(float Pitch, float Yaw, float Roll) noexcept;
+
+ // Rotates about y-axis (Angles.y), then x-axis (Angles.x), then z-axis (Angles.z)
+ XMMATRIX XM_CALLCONV XMMatrixRotationRollPitchYawFromVector(FXMVECTOR Angles) noexcept;
+
+ XMMATRIX XM_CALLCONV XMMatrixRotationNormal(FXMVECTOR NormalAxis, float Angle) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixRotationAxis(FXMVECTOR Axis, float Angle) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixRotationQuaternion(FXMVECTOR Quaternion) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixTransformation2D(FXMVECTOR ScalingOrigin, float ScalingOrientation, FXMVECTOR Scaling,
+ FXMVECTOR RotationOrigin, float Rotation, GXMVECTOR Translation) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixTransformation(FXMVECTOR ScalingOrigin, FXMVECTOR ScalingOrientationQuaternion, FXMVECTOR Scaling,
+ GXMVECTOR RotationOrigin, HXMVECTOR RotationQuaternion, HXMVECTOR Translation) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixAffineTransformation2D(FXMVECTOR Scaling, FXMVECTOR RotationOrigin, float Rotation, FXMVECTOR Translation) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixAffineTransformation(FXMVECTOR Scaling, FXMVECTOR RotationOrigin, FXMVECTOR RotationQuaternion, GXMVECTOR Translation) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixReflect(FXMVECTOR ReflectionPlane) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixShadow(FXMVECTOR ShadowPlane, FXMVECTOR LightPosition) noexcept;
+
+ XMMATRIX XM_CALLCONV XMMatrixLookAtLH(FXMVECTOR EyePosition, FXMVECTOR FocusPosition, FXMVECTOR UpDirection) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixLookAtRH(FXMVECTOR EyePosition, FXMVECTOR FocusPosition, FXMVECTOR UpDirection) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixLookToLH(FXMVECTOR EyePosition, FXMVECTOR EyeDirection, FXMVECTOR UpDirection) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixLookToRH(FXMVECTOR EyePosition, FXMVECTOR EyeDirection, FXMVECTOR UpDirection) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixPerspectiveLH(float ViewWidth, float ViewHeight, float NearZ, float FarZ) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixPerspectiveRH(float ViewWidth, float ViewHeight, float NearZ, float FarZ) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixPerspectiveFovLH(float FovAngleY, float AspectRatio, float NearZ, float FarZ) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixPerspectiveFovRH(float FovAngleY, float AspectRatio, float NearZ, float FarZ) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixPerspectiveOffCenterLH(float ViewLeft, float ViewRight, float ViewBottom, float ViewTop, float NearZ, float FarZ) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixPerspectiveOffCenterRH(float ViewLeft, float ViewRight, float ViewBottom, float ViewTop, float NearZ, float FarZ) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixOrthographicLH(float ViewWidth, float ViewHeight, float NearZ, float FarZ) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixOrthographicRH(float ViewWidth, float ViewHeight, float NearZ, float FarZ) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixOrthographicOffCenterLH(float ViewLeft, float ViewRight, float ViewBottom, float ViewTop, float NearZ, float FarZ) noexcept;
+ XMMATRIX XM_CALLCONV XMMatrixOrthographicOffCenterRH(float ViewLeft, float ViewRight, float ViewBottom, float ViewTop, float NearZ, float FarZ) noexcept;
+
+
+ /****************************************************************************
+ *
+ * Quaternion operations
+ *
+ ****************************************************************************/
+
+ bool XM_CALLCONV XMQuaternionEqual(FXMVECTOR Q1, FXMVECTOR Q2) noexcept;
+ bool XM_CALLCONV XMQuaternionNotEqual(FXMVECTOR Q1, FXMVECTOR Q2) noexcept;
+
+ bool XM_CALLCONV XMQuaternionIsNaN(FXMVECTOR Q) noexcept;
+ bool XM_CALLCONV XMQuaternionIsInfinite(FXMVECTOR Q) noexcept;
+ bool XM_CALLCONV XMQuaternionIsIdentity(FXMVECTOR Q) noexcept;
+
+ XMVECTOR XM_CALLCONV XMQuaternionDot(FXMVECTOR Q1, FXMVECTOR Q2) noexcept;
+ XMVECTOR XM_CALLCONV XMQuaternionMultiply(FXMVECTOR Q1, FXMVECTOR Q2) noexcept;
+ XMVECTOR XM_CALLCONV XMQuaternionLengthSq(FXMVECTOR Q) noexcept;
+ XMVECTOR XM_CALLCONV XMQuaternionReciprocalLength(FXMVECTOR Q) noexcept;
+ XMVECTOR XM_CALLCONV XMQuaternionLength(FXMVECTOR Q) noexcept;
+ XMVECTOR XM_CALLCONV XMQuaternionNormalizeEst(FXMVECTOR Q) noexcept;
+ XMVECTOR XM_CALLCONV XMQuaternionNormalize(FXMVECTOR Q) noexcept;
+ XMVECTOR XM_CALLCONV XMQuaternionConjugate(FXMVECTOR Q) noexcept;
+ XMVECTOR XM_CALLCONV XMQuaternionInverse(FXMVECTOR Q) noexcept;
+ XMVECTOR XM_CALLCONV XMQuaternionLn(FXMVECTOR Q) noexcept;
+ XMVECTOR XM_CALLCONV XMQuaternionExp(FXMVECTOR Q) noexcept;
+ XMVECTOR XM_CALLCONV XMQuaternionSlerp(FXMVECTOR Q0, FXMVECTOR Q1, float t) noexcept;
+ XMVECTOR XM_CALLCONV XMQuaternionSlerpV(FXMVECTOR Q0, FXMVECTOR Q1, FXMVECTOR T) noexcept;
+ XMVECTOR XM_CALLCONV XMQuaternionSquad(FXMVECTOR Q0, FXMVECTOR Q1, FXMVECTOR Q2, GXMVECTOR Q3, float t) noexcept;
+ XMVECTOR XM_CALLCONV XMQuaternionSquadV(FXMVECTOR Q0, FXMVECTOR Q1, FXMVECTOR Q2, GXMVECTOR Q3, HXMVECTOR T) noexcept;
+ void XM_CALLCONV XMQuaternionSquadSetup(_Out_ XMVECTOR* pA, _Out_ XMVECTOR* pB, _Out_ XMVECTOR* pC, _In_ FXMVECTOR Q0, _In_ FXMVECTOR Q1, _In_ FXMVECTOR Q2, _In_ GXMVECTOR Q3) noexcept;
+ XMVECTOR XM_CALLCONV XMQuaternionBaryCentric(FXMVECTOR Q0, FXMVECTOR Q1, FXMVECTOR Q2, float f, float g) noexcept;
+ XMVECTOR XM_CALLCONV XMQuaternionBaryCentricV(FXMVECTOR Q0, FXMVECTOR Q1, FXMVECTOR Q2, GXMVECTOR F, HXMVECTOR G) noexcept;
+
+ XMVECTOR XM_CALLCONV XMQuaternionIdentity() noexcept;
+
+ // Rotates about y-axis (Yaw), then x-axis (Pitch), then z-axis (Roll)
+ XMVECTOR XM_CALLCONV XMQuaternionRotationRollPitchYaw(float Pitch, float Yaw, float Roll) noexcept;
+
+ // Rotates about y-axis (Angles.y), then x-axis (Angles.x), then z-axis (Angles.z)
+ XMVECTOR XM_CALLCONV XMQuaternionRotationRollPitchYawFromVector(FXMVECTOR Angles) noexcept;
+
+ XMVECTOR XM_CALLCONV XMQuaternionRotationNormal(FXMVECTOR NormalAxis, float Angle) noexcept;
+ XMVECTOR XM_CALLCONV XMQuaternionRotationAxis(FXMVECTOR Axis, float Angle) noexcept;
+ XMVECTOR XM_CALLCONV XMQuaternionRotationMatrix(FXMMATRIX M) noexcept;
+
+ void XM_CALLCONV XMQuaternionToAxisAngle(_Out_ XMVECTOR* pAxis, _Out_ float* pAngle, _In_ FXMVECTOR Q) noexcept;
+
+ /****************************************************************************
+ *
+ * Plane operations
+ *
+ ****************************************************************************/
+
+ bool XM_CALLCONV XMPlaneEqual(FXMVECTOR P1, FXMVECTOR P2) noexcept;
+ bool XM_CALLCONV XMPlaneNearEqual(FXMVECTOR P1, FXMVECTOR P2, FXMVECTOR Epsilon) noexcept;
+ bool XM_CALLCONV XMPlaneNotEqual(FXMVECTOR P1, FXMVECTOR P2) noexcept;
+
+ bool XM_CALLCONV XMPlaneIsNaN(FXMVECTOR P) noexcept;
+ bool XM_CALLCONV XMPlaneIsInfinite(FXMVECTOR P) noexcept;
+
+ XMVECTOR XM_CALLCONV XMPlaneDot(FXMVECTOR P, FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMPlaneDotCoord(FXMVECTOR P, FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMPlaneDotNormal(FXMVECTOR P, FXMVECTOR V) noexcept;
+ XMVECTOR XM_CALLCONV XMPlaneNormalizeEst(FXMVECTOR P) noexcept;
+ XMVECTOR XM_CALLCONV XMPlaneNormalize(FXMVECTOR P) noexcept;
+ XMVECTOR XM_CALLCONV XMPlaneIntersectLine(FXMVECTOR P, FXMVECTOR LinePoint1, FXMVECTOR LinePoint2) noexcept;
+ void XM_CALLCONV XMPlaneIntersectPlane(_Out_ XMVECTOR* pLinePoint1, _Out_ XMVECTOR* pLinePoint2, _In_ FXMVECTOR P1, _In_ FXMVECTOR P2) noexcept;
+
+ // Transforms a plane given an inverse transpose matrix
+ XMVECTOR XM_CALLCONV XMPlaneTransform(FXMVECTOR P, FXMMATRIX ITM) noexcept;
+
+ // Transforms an array of planes given an inverse transpose matrix
+ XMFLOAT4* XM_CALLCONV XMPlaneTransformStream(_Out_writes_bytes_(sizeof(XMFLOAT4) + OutputStride * (PlaneCount - 1)) XMFLOAT4* pOutputStream,
+ _In_ size_t OutputStride,
+ _In_reads_bytes_(sizeof(XMFLOAT4) + InputStride * (PlaneCount - 1)) const XMFLOAT4* pInputStream,
+ _In_ size_t InputStride, _In_ size_t PlaneCount, _In_ FXMMATRIX ITM) noexcept;
+
+ XMVECTOR XM_CALLCONV XMPlaneFromPointNormal(FXMVECTOR Point, FXMVECTOR Normal) noexcept;
+ XMVECTOR XM_CALLCONV XMPlaneFromPoints(FXMVECTOR Point1, FXMVECTOR Point2, FXMVECTOR Point3) noexcept;
+
+ /****************************************************************************
+ *
+ * Color operations
+ *
+ ****************************************************************************/
+
+ bool XM_CALLCONV XMColorEqual(FXMVECTOR C1, FXMVECTOR C2) noexcept;
+ bool XM_CALLCONV XMColorNotEqual(FXMVECTOR C1, FXMVECTOR C2) noexcept;
+ bool XM_CALLCONV XMColorGreater(FXMVECTOR C1, FXMVECTOR C2) noexcept;
+ bool XM_CALLCONV XMColorGreaterOrEqual(FXMVECTOR C1, FXMVECTOR C2) noexcept;
+ bool XM_CALLCONV XMColorLess(FXMVECTOR C1, FXMVECTOR C2) noexcept;
+ bool XM_CALLCONV XMColorLessOrEqual(FXMVECTOR C1, FXMVECTOR C2) noexcept;
+
+ bool XM_CALLCONV XMColorIsNaN(FXMVECTOR C) noexcept;
+ bool XM_CALLCONV XMColorIsInfinite(FXMVECTOR C) noexcept;
+
+ XMVECTOR XM_CALLCONV XMColorNegative(FXMVECTOR C) noexcept;
+ XMVECTOR XM_CALLCONV XMColorModulate(FXMVECTOR C1, FXMVECTOR C2) noexcept;
+ XMVECTOR XM_CALLCONV XMColorAdjustSaturation(FXMVECTOR C, float Saturation) noexcept;
+ XMVECTOR XM_CALLCONV XMColorAdjustContrast(FXMVECTOR C, float Contrast) noexcept;
+
+ XMVECTOR XM_CALLCONV XMColorRGBToHSL(FXMVECTOR rgb) noexcept;
+ XMVECTOR XM_CALLCONV XMColorHSLToRGB(FXMVECTOR hsl) noexcept;
+
+ XMVECTOR XM_CALLCONV XMColorRGBToHSV(FXMVECTOR rgb) noexcept;
+ XMVECTOR XM_CALLCONV XMColorHSVToRGB(FXMVECTOR hsv) noexcept;
+
+ XMVECTOR XM_CALLCONV XMColorRGBToYUV(FXMVECTOR rgb) noexcept;
+ XMVECTOR XM_CALLCONV XMColorYUVToRGB(FXMVECTOR yuv) noexcept;
+
+ XMVECTOR XM_CALLCONV XMColorRGBToYUV_HD(FXMVECTOR rgb) noexcept;
+ XMVECTOR XM_CALLCONV XMColorYUVToRGB_HD(FXMVECTOR yuv) noexcept;
+
+ XMVECTOR XM_CALLCONV XMColorRGBToYUV_UHD(FXMVECTOR rgb) noexcept;
+ XMVECTOR XM_CALLCONV XMColorYUVToRGB_UHD(FXMVECTOR yuv) noexcept;
+
+ XMVECTOR XM_CALLCONV XMColorRGBToXYZ(FXMVECTOR rgb) noexcept;
+ XMVECTOR XM_CALLCONV XMColorXYZToRGB(FXMVECTOR xyz) noexcept;
+
+ XMVECTOR XM_CALLCONV XMColorXYZToSRGB(FXMVECTOR xyz) noexcept;
+ XMVECTOR XM_CALLCONV XMColorSRGBToXYZ(FXMVECTOR srgb) noexcept;
+
+ XMVECTOR XM_CALLCONV XMColorRGBToSRGB(FXMVECTOR rgb) noexcept;
+ XMVECTOR XM_CALLCONV XMColorSRGBToRGB(FXMVECTOR srgb) noexcept;
+
+
+ /****************************************************************************
+ *
+ * Miscellaneous operations
+ *
+ ****************************************************************************/
+
+ bool XMVerifyCPUSupport() noexcept;
+
+ XMVECTOR XM_CALLCONV XMFresnelTerm(FXMVECTOR CosIncidentAngle, FXMVECTOR RefractionIndex) noexcept;
+
+ bool XMScalarNearEqual(float S1, float S2, float Epsilon) noexcept;
+ float XMScalarModAngle(float Value) noexcept;
+
+ float XMScalarSin(float Value) noexcept;
+ float XMScalarSinEst(float Value) noexcept;
+
+ float XMScalarCos(float Value) noexcept;
+ float XMScalarCosEst(float Value) noexcept;
+
+ void XMScalarSinCos(_Out_ float* pSin, _Out_ float* pCos, float Value) noexcept;
+ void XMScalarSinCosEst(_Out_ float* pSin, _Out_ float* pCos, float Value) noexcept;
+
+ float XMScalarASin(float Value) noexcept;
+ float XMScalarASinEst(float Value) noexcept;
+
+ float XMScalarACos(float Value) noexcept;
+ float XMScalarACosEst(float Value) noexcept;
+
+ /****************************************************************************
+ *
+ * Templates
+ *
+ ****************************************************************************/
+
+#if defined(__XNAMATH_H__) && defined(XMMin)
+#undef XMMin
+#undef XMMax
+#endif
+
+ template inline T XMMin(T a, T b) noexcept { return (a < b) ? a : b; }
+ template inline T XMMax(T a, T b) noexcept { return (a > b) ? a : b; }
+
+ //------------------------------------------------------------------------------
+
+#if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_)
+
+// PermuteHelper internal template (SSE only)
+ namespace MathInternal
+ {
+ // Slow path fallback for permutes that do not map to a single SSE shuffle opcode.
+ template struct PermuteHelper
+ {
+ static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) noexcept
+ {
+ static const XMVECTORU32 selectMask =
+ { { {
+ WhichX ? 0xFFFFFFFF : 0,
+ WhichY ? 0xFFFFFFFF : 0,
+ WhichZ ? 0xFFFFFFFF : 0,
+ WhichW ? 0xFFFFFFFF : 0,
+ } } };
+
+ XMVECTOR shuffled1 = XM_PERMUTE_PS(v1, Shuffle);
+ XMVECTOR shuffled2 = XM_PERMUTE_PS(v2, Shuffle);
+
+ XMVECTOR masked1 = _mm_andnot_ps(selectMask, shuffled1);
+ XMVECTOR masked2 = _mm_and_ps(selectMask, shuffled2);
+
+ return _mm_or_ps(masked1, masked2);
+ }
+ };
+
+ // Fast path for permutes that only read from the first vector.
+ template struct PermuteHelper
+ {
+ static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR) noexcept { return XM_PERMUTE_PS(v1, Shuffle); }
+ };
+
+ // Fast path for permutes that only read from the second vector.
+ template struct PermuteHelper
+ {
+ static XMVECTOR XM_CALLCONV Permute(FXMVECTOR, FXMVECTOR v2) noexcept { return XM_PERMUTE_PS(v2, Shuffle); }
+ };
+
+ // Fast path for permutes that read XY from the first vector, ZW from the second.
+ template struct PermuteHelper
+ {
+ static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) noexcept { return _mm_shuffle_ps(v1, v2, Shuffle); }
+ };
+
+ // Fast path for permutes that read XY from the second vector, ZW from the first.
+ template struct PermuteHelper
+ {
+ static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) noexcept { return _mm_shuffle_ps(v2, v1, Shuffle); }
+ };
+ }
+
+#endif // _XM_SSE_INTRINSICS_ && !_XM_NO_INTRINSICS_
+
+ // General permute template
+ template
+ inline XMVECTOR XM_CALLCONV XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2) noexcept
+ {
+ static_assert(PermuteX <= 7, "PermuteX template parameter out of range");
+ static_assert(PermuteY <= 7, "PermuteY template parameter out of range");
+ static_assert(PermuteZ <= 7, "PermuteZ template parameter out of range");
+ static_assert(PermuteW <= 7, "PermuteW template parameter out of range");
+
+ #if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_)
+ constexpr uint32_t Shuffle = _MM_SHUFFLE(PermuteW & 3, PermuteZ & 3, PermuteY & 3, PermuteX & 3);
+
+ constexpr bool WhichX = PermuteX > 3;
+ constexpr bool WhichY = PermuteY > 3;
+ constexpr bool WhichZ = PermuteZ > 3;
+ constexpr bool WhichW = PermuteW > 3;
+
+ return MathInternal::PermuteHelper::Permute(V1, V2);
+ #else
+
+ return XMVectorPermute(V1, V2, PermuteX, PermuteY, PermuteZ, PermuteW);
+
+ #endif
+ }
+
+ // Special-case permute templates
+ template<> constexpr XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 2, 3>(FXMVECTOR V1, FXMVECTOR) noexcept { return V1; }
+ template<> constexpr XMVECTOR XM_CALLCONV XMVectorPermute<4, 5, 6, 7>(FXMVECTOR, FXMVECTOR V2) noexcept { return V2; }
+
+#if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_)
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 4, 5>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return _mm_movelh_ps(V1, V2); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<6, 7, 2, 3>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return _mm_movehl_ps(V1, V2); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 4, 1, 5>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return _mm_unpacklo_ps(V1, V2); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<2, 6, 3, 7>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return _mm_unpackhi_ps(V1, V2); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<2, 3, 6, 7>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return _mm_castpd_ps(_mm_unpackhi_pd(_mm_castps_pd(V1), _mm_castps_pd(V2))); }
+#endif
+
+#if defined(_XM_SSE4_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_)
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 2, 3>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return _mm_blend_ps(V1, V2, 0x1); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 2, 3>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return _mm_blend_ps(V1, V2, 0x2); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 5, 2, 3>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return _mm_blend_ps(V1, V2, 0x3); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 6, 3>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return _mm_blend_ps(V1, V2, 0x4); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 6, 3>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return _mm_blend_ps(V1, V2, 0x5); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 6, 3>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return _mm_blend_ps(V1, V2, 0x6); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 5, 6, 3>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return _mm_blend_ps(V1, V2, 0x7); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 2, 7>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return _mm_blend_ps(V1, V2, 0x8); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 2, 7>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return _mm_blend_ps(V1, V2, 0x9); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 2, 7>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return _mm_blend_ps(V1, V2, 0xA); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 5, 2, 7>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return _mm_blend_ps(V1, V2, 0xB); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 6, 7>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return _mm_blend_ps(V1, V2, 0xC); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 6, 7>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return _mm_blend_ps(V1, V2, 0xD); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 6, 7>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return _mm_blend_ps(V1, V2, 0xE); }
+#endif
+
+#if defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_)
+
+ // If the indices are all in the range 0-3 or 4-7, then use XMVectorSwizzle instead
+ // The mirror cases are not spelled out here as the programmer can always swap the arguments
+ // (i.e. prefer permutes where the X element comes from the V1 vector instead of the V2 vector)
+
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 4, 5>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return vcombine_f32(vget_low_f32(V1), vget_low_f32(V2)); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<1, 0, 4, 5>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return vcombine_f32(vrev64_f32(vget_low_f32(V1)), vget_low_f32(V2)); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 5, 4>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return vcombine_f32(vget_low_f32(V1), vrev64_f32(vget_low_f32(V2))); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<1, 0, 5, 4>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return vcombine_f32(vrev64_f32(vget_low_f32(V1)), vrev64_f32(vget_low_f32(V2))); }
+
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<2, 3, 6, 7>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return vcombine_f32(vget_high_f32(V1), vget_high_f32(V2)); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<3, 2, 6, 7>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return vcombine_f32(vrev64_f32(vget_high_f32(V1)), vget_high_f32(V2)); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<2, 3, 7, 6>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return vcombine_f32(vget_high_f32(V1), vrev64_f32(vget_high_f32(V2))); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<3, 2, 7, 6>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return vcombine_f32(vrev64_f32(vget_high_f32(V1)), vrev64_f32(vget_high_f32(V2))); }
+
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 6, 7>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return vcombine_f32(vget_low_f32(V1), vget_high_f32(V2)); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<1, 0, 6, 7>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return vcombine_f32(vrev64_f32(vget_low_f32(V1)), vget_high_f32(V2)); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 7, 6>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return vcombine_f32(vget_low_f32(V1), vrev64_f32(vget_high_f32(V2))); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<1, 0, 7, 6>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return vcombine_f32(vrev64_f32(vget_low_f32(V1)), vrev64_f32(vget_high_f32(V2))); }
+
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<3, 2, 4, 5>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return vcombine_f32(vrev64_f32(vget_high_f32(V1)), vget_low_f32(V2)); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<2, 3, 5, 4>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return vcombine_f32(vget_high_f32(V1), vrev64_f32(vget_low_f32(V2))); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<3, 2, 5, 4>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return vcombine_f32(vrev64_f32(vget_high_f32(V1)), vrev64_f32(vget_low_f32(V2))); }
+
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 4, 2, 6>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return vtrnq_f32(V1, V2).val[0]; }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<1, 5, 3, 7>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return vtrnq_f32(V1, V2).val[1]; }
+
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 4, 1, 5>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return vzipq_f32(V1, V2).val[0]; }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<2, 6, 3, 7>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return vzipq_f32(V1, V2).val[1]; }
+
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 2, 4, 6>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return vuzpq_f32(V1, V2).val[0]; }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<1, 3, 5, 7>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return vuzpq_f32(V1, V2).val[1]; }
+
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<1, 2, 3, 4>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return vextq_f32(V1, V2, 1); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<2, 3, 4, 5>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return vextq_f32(V1, V2, 2); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<3, 4, 5, 6>(FXMVECTOR V1, FXMVECTOR V2) noexcept { return vextq_f32(V1, V2, 3); }
+
+#endif // _XM_ARM_NEON_INTRINSICS_ && !_XM_NO_INTRINSICS_
+
+ //------------------------------------------------------------------------------
+
+ // General swizzle template
+ template
+ inline XMVECTOR XM_CALLCONV XMVectorSwizzle(FXMVECTOR V) noexcept
+ {
+ static_assert(SwizzleX <= 3, "SwizzleX template parameter out of range");
+ static_assert(SwizzleY <= 3, "SwizzleY template parameter out of range");
+ static_assert(SwizzleZ <= 3, "SwizzleZ template parameter out of range");
+ static_assert(SwizzleW <= 3, "SwizzleW template parameter out of range");
+
+ #if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_)
+ return XM_PERMUTE_PS(V, _MM_SHUFFLE(SwizzleW, SwizzleZ, SwizzleY, SwizzleX));
+ #else
+
+ return XMVectorSwizzle(V, SwizzleX, SwizzleY, SwizzleZ, SwizzleW);
+
+ #endif
+ }
+
+ // Specialized swizzles
+ template<> constexpr XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 1, 2, 3>(FXMVECTOR V) noexcept { return V; }
+
+#if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_)
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 1, 0, 1>(FXMVECTOR V) noexcept { return _mm_movelh_ps(V, V); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<2, 3, 2, 3>(FXMVECTOR V) noexcept { return _mm_movehl_ps(V, V); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 0, 1, 1>(FXMVECTOR V) noexcept { return _mm_unpacklo_ps(V, V); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<2, 2, 3, 3>(FXMVECTOR V) noexcept { return _mm_unpackhi_ps(V, V); }
+#endif
+
+#if defined(_XM_SSE3_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_)
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 0, 2, 2>(FXMVECTOR V) noexcept { return _mm_moveldup_ps(V); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 1, 3, 3>(FXMVECTOR V) noexcept { return _mm_movehdup_ps(V); }
+#endif
+
+#if defined(_XM_AVX2_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) && defined(_XM_FAVOR_INTEL_)
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 0, 0, 0>(FXMVECTOR V) noexcept { return _mm_broadcastss_ps(V); }
+#endif
+
+#if defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_)
+
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 0, 0, 0>(FXMVECTOR V) noexcept { return vdupq_lane_f32(vget_low_f32(V), 0); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 1, 1, 1>(FXMVECTOR V) noexcept { return vdupq_lane_f32(vget_low_f32(V), 1); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<2, 2, 2, 2>(FXMVECTOR V) noexcept { return vdupq_lane_f32(vget_high_f32(V), 0); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<3, 3, 3, 3>(FXMVECTOR V) noexcept { return vdupq_lane_f32(vget_high_f32(V), 1); }
+
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 0, 3, 2>(FXMVECTOR V) noexcept { return vrev64q_f32(V); }
+
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 1, 0, 1>(FXMVECTOR V) noexcept { float32x2_t vt = vget_low_f32(V); return vcombine_f32(vt, vt); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<2, 3, 2, 3>(FXMVECTOR V) noexcept { float32x2_t vt = vget_high_f32(V); return vcombine_f32(vt, vt); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 0, 1, 0>(FXMVECTOR V) noexcept { float32x2_t vt = vrev64_f32(vget_low_f32(V)); return vcombine_f32(vt, vt); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<3, 2, 3, 2>(FXMVECTOR V) noexcept { float32x2_t vt = vrev64_f32(vget_high_f32(V)); return vcombine_f32(vt, vt); }
+
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 1, 3, 2>(FXMVECTOR V) noexcept { return vcombine_f32(vget_low_f32(V), vrev64_f32(vget_high_f32(V))); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 0, 2, 3>(FXMVECTOR V) noexcept { return vcombine_f32(vrev64_f32(vget_low_f32(V)), vget_high_f32(V)); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<2, 3, 1, 0>(FXMVECTOR V) noexcept { return vcombine_f32(vget_high_f32(V), vrev64_f32(vget_low_f32(V))); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<3, 2, 0, 1>(FXMVECTOR V) noexcept { return vcombine_f32(vrev64_f32(vget_high_f32(V)), vget_low_f32(V)); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<3, 2, 1, 0>(FXMVECTOR V) noexcept { return vcombine_f32(vrev64_f32(vget_high_f32(V)), vrev64_f32(vget_low_f32(V))); }
+
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 0, 2, 2>(FXMVECTOR V) noexcept { return vtrnq_f32(V, V).val[0]; }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 1, 3, 3>(FXMVECTOR V) noexcept { return vtrnq_f32(V, V).val[1]; }
+
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 0, 1, 1>(FXMVECTOR V) noexcept { return vzipq_f32(V, V).val[0]; }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<2, 2, 3, 3>(FXMVECTOR V) noexcept { return vzipq_f32(V, V).val[1]; }
+
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 2, 0, 2>(FXMVECTOR V) noexcept { return vuzpq_f32(V, V).val[0]; }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 3, 1, 3>(FXMVECTOR V) noexcept { return vuzpq_f32(V, V).val[1]; }
+
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 2, 3, 0>(FXMVECTOR V) noexcept { return vextq_f32(V, V, 1); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<2, 3, 0, 1>(FXMVECTOR V) noexcept { return vextq_f32(V, V, 2); }
+ template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<3, 0, 1, 2>(FXMVECTOR V) noexcept { return vextq_f32(V, V, 3); }
+
+#endif // _XM_ARM_NEON_INTRINSICS_ && !_XM_NO_INTRINSICS_
+
+ //------------------------------------------------------------------------------
+
+ template
+ inline XMVECTOR XM_CALLCONV XMVectorShiftLeft(FXMVECTOR V1, FXMVECTOR V2) noexcept
+ {
+ static_assert(Elements < 4, "Elements template parameter out of range");
+ return XMVectorPermute(V1, V2);
+ }
+
+ template
+ inline XMVECTOR XM_CALLCONV XMVectorRotateLeft(FXMVECTOR V) noexcept
+ {
+ static_assert(Elements < 4, "Elements template parameter out of range");
+ return XMVectorSwizzle(V);
+ }
+
+ template
+ inline XMVECTOR XM_CALLCONV XMVectorRotateRight(FXMVECTOR V) noexcept
+ {
+ static_assert(Elements < 4, "Elements template parameter out of range");
+ return XMVectorSwizzle<(4 - Elements) & 3, (5 - Elements) & 3, (6 - Elements) & 3, (7 - Elements) & 3>(V);
+ }
+
+ template
+ inline XMVECTOR XM_CALLCONV XMVectorInsert(FXMVECTOR VD, FXMVECTOR VS) noexcept
+ {
+ XMVECTOR Control = XMVectorSelectControl(Select0 & 1, Select1 & 1, Select2 & 1, Select3 & 1);
+ return XMVectorSelect(VD, XMVectorRotateLeft(VS), Control);
+ }
+
+ /****************************************************************************
+ *
+ * Globals
+ *
+ ****************************************************************************/
+
+ // The purpose of the following global constants is to prevent redundant
+ // reloading of the constants when they are referenced by more than one
+ // separate inline math routine called within the same function. Declaring
+ // a constant locally within a routine is sufficient to prevent redundant
+ // reloads of that constant when that single routine is called multiple
+ // times in a function, but if the constant is used (and declared) in a
+ // separate math routine it would be reloaded.
+
+#ifndef XMGLOBALCONST
+#if __cplusplus >= 201703L
+#define XMGLOBALCONST inline constexpr
+#elif defined(__GNUC__) && !defined(__MINGW32__)
+#define XMGLOBALCONST extern const __attribute__((weak))
+#else
+#define XMGLOBALCONST extern const __declspec(selectany)
+#endif
+#endif
+
+ XMGLOBALCONST XMVECTORF32 g_XMSinCoefficients0 = { { { -0.16666667f, +0.0083333310f, -0.00019840874f, +2.7525562e-06f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMSinCoefficients1 = { { { -2.3889859e-08f, -0.16665852f /*Est1*/, +0.0083139502f /*Est2*/, -0.00018524670f /*Est3*/ } } };
+ XMGLOBALCONST XMVECTORF32 g_XMCosCoefficients0 = { { { -0.5f, +0.041666638f, -0.0013888378f, +2.4760495e-05f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMCosCoefficients1 = { { { -2.6051615e-07f, -0.49992746f /*Est1*/, +0.041493919f /*Est2*/, -0.0012712436f /*Est3*/ } } };
+ XMGLOBALCONST XMVECTORF32 g_XMTanCoefficients0 = { { { 1.0f, 0.333333333f, 0.133333333f, 5.396825397e-2f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMTanCoefficients1 = { { { 2.186948854e-2f, 8.863235530e-3f, 3.592128167e-3f, 1.455834485e-3f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMTanCoefficients2 = { { { 5.900274264e-4f, 2.391290764e-4f, 9.691537707e-5f, 3.927832950e-5f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMArcCoefficients0 = { { { +1.5707963050f, -0.2145988016f, +0.0889789874f, -0.0501743046f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMArcCoefficients1 = { { { +0.0308918810f, -0.0170881256f, +0.0066700901f, -0.0012624911f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMATanCoefficients0 = { { { -0.3333314528f, +0.1999355085f, -0.1420889944f, +0.1065626393f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMATanCoefficients1 = { { { -0.0752896400f, +0.0429096138f, -0.0161657367f, +0.0028662257f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMATanEstCoefficients0 = { { { +0.999866f, +0.999866f, +0.999866f, +0.999866f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMATanEstCoefficients1 = { { { -0.3302995f, +0.180141f, -0.085133f, +0.0208351f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMTanEstCoefficients = { { { 2.484f, -1.954923183e-1f, 2.467401101f, XM_1DIVPI } } };
+ XMGLOBALCONST XMVECTORF32 g_XMArcEstCoefficients = { { { +1.5707288f, -0.2121144f, +0.0742610f, -0.0187293f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMPiConstants0 = { { { XM_PI, XM_2PI, XM_1DIVPI, XM_1DIV2PI } } };
+ XMGLOBALCONST XMVECTORF32 g_XMIdentityR0 = { { { 1.0f, 0.0f, 0.0f, 0.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMIdentityR1 = { { { 0.0f, 1.0f, 0.0f, 0.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMIdentityR2 = { { { 0.0f, 0.0f, 1.0f, 0.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMIdentityR3 = { { { 0.0f, 0.0f, 0.0f, 1.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMNegIdentityR0 = { { { -1.0f, 0.0f, 0.0f, 0.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMNegIdentityR1 = { { { 0.0f, -1.0f, 0.0f, 0.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMNegIdentityR2 = { { { 0.0f, 0.0f, -1.0f, 0.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMNegIdentityR3 = { { { 0.0f, 0.0f, 0.0f, -1.0f } } };
+ XMGLOBALCONST XMVECTORU32 g_XMNegativeZero = { { { 0x80000000, 0x80000000, 0x80000000, 0x80000000 } } };
+ XMGLOBALCONST XMVECTORU32 g_XMNegate3 = { { { 0x80000000, 0x80000000, 0x80000000, 0x00000000 } } };
+ XMGLOBALCONST XMVECTORU32 g_XMMaskXY = { { { 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000 } } };
+ XMGLOBALCONST XMVECTORU32 g_XMMask3 = { { { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000 } } };
+ XMGLOBALCONST XMVECTORU32 g_XMMaskX = { { { 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000 } } };
+ XMGLOBALCONST XMVECTORU32 g_XMMaskY = { { { 0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000 } } };
+ XMGLOBALCONST XMVECTORU32 g_XMMaskZ = { { { 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000 } } };
+ XMGLOBALCONST XMVECTORU32 g_XMMaskW = { { { 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF } } };
+ XMGLOBALCONST XMVECTORF32 g_XMOne = { { { 1.0f, 1.0f, 1.0f, 1.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMOne3 = { { { 1.0f, 1.0f, 1.0f, 0.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMZero = { { { 0.0f, 0.0f, 0.0f, 0.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMTwo = { { { 2.f, 2.f, 2.f, 2.f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMFour = { { { 4.f, 4.f, 4.f, 4.f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMSix = { { { 6.f, 6.f, 6.f, 6.f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMNegativeOne = { { { -1.0f, -1.0f, -1.0f, -1.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMOneHalf = { { { 0.5f, 0.5f, 0.5f, 0.5f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMNegativeOneHalf = { { { -0.5f, -0.5f, -0.5f, -0.5f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMNegativeTwoPi = { { { -XM_2PI, -XM_2PI, -XM_2PI, -XM_2PI } } };
+ XMGLOBALCONST XMVECTORF32 g_XMNegativePi = { { { -XM_PI, -XM_PI, -XM_PI, -XM_PI } } };
+ XMGLOBALCONST XMVECTORF32 g_XMHalfPi = { { { XM_PIDIV2, XM_PIDIV2, XM_PIDIV2, XM_PIDIV2 } } };
+ XMGLOBALCONST XMVECTORF32 g_XMPi = { { { XM_PI, XM_PI, XM_PI, XM_PI } } };
+ XMGLOBALCONST XMVECTORF32 g_XMReciprocalPi = { { { XM_1DIVPI, XM_1DIVPI, XM_1DIVPI, XM_1DIVPI } } };
+ XMGLOBALCONST XMVECTORF32 g_XMTwoPi = { { { XM_2PI, XM_2PI, XM_2PI, XM_2PI } } };
+ XMGLOBALCONST XMVECTORF32 g_XMReciprocalTwoPi = { { { XM_1DIV2PI, XM_1DIV2PI, XM_1DIV2PI, XM_1DIV2PI } } };
+ XMGLOBALCONST XMVECTORF32 g_XMEpsilon = { { { 1.192092896e-7f, 1.192092896e-7f, 1.192092896e-7f, 1.192092896e-7f } } };
+ XMGLOBALCONST XMVECTORI32 g_XMInfinity = { { { 0x7F800000, 0x7F800000, 0x7F800000, 0x7F800000 } } };
+ XMGLOBALCONST XMVECTORI32 g_XMQNaN = { { { 0x7FC00000, 0x7FC00000, 0x7FC00000, 0x7FC00000 } } };
+ XMGLOBALCONST XMVECTORI32 g_XMQNaNTest = { { { 0x007FFFFF, 0x007FFFFF, 0x007FFFFF, 0x007FFFFF } } };
+ XMGLOBALCONST XMVECTORI32 g_XMAbsMask = { { { 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF } } };
+ XMGLOBALCONST XMVECTORI32 g_XMFltMin = { { { 0x00800000, 0x00800000, 0x00800000, 0x00800000 } } };
+ XMGLOBALCONST XMVECTORI32 g_XMFltMax = { { { 0x7F7FFFFF, 0x7F7FFFFF, 0x7F7FFFFF, 0x7F7FFFFF } } };
+ XMGLOBALCONST XMVECTORU32 g_XMNegOneMask = { { { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF } } };
+ XMGLOBALCONST XMVECTORU32 g_XMMaskA8R8G8B8 = { { { 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000 } } };
+ XMGLOBALCONST XMVECTORU32 g_XMFlipA8R8G8B8 = { { { 0x00000000, 0x00000000, 0x00000000, 0x80000000 } } };
+ XMGLOBALCONST XMVECTORF32 g_XMFixAA8R8G8B8 = { { { 0.0f, 0.0f, 0.0f, float(0x80000000U) } } };
+ XMGLOBALCONST XMVECTORF32 g_XMNormalizeA8R8G8B8 = { { { 1.0f / (255.0f * float(0x10000)), 1.0f / (255.0f * float(0x100)), 1.0f / 255.0f, 1.0f / (255.0f * float(0x1000000)) } } };
+ XMGLOBALCONST XMVECTORU32 g_XMMaskA2B10G10R10 = { { { 0x000003FF, 0x000FFC00, 0x3FF00000, 0xC0000000 } } };
+ XMGLOBALCONST XMVECTORU32 g_XMFlipA2B10G10R10 = { { { 0x00000200, 0x00080000, 0x20000000, 0x80000000 } } };
+ XMGLOBALCONST XMVECTORF32 g_XMFixAA2B10G10R10 = { { { -512.0f, -512.0f * float(0x400), -512.0f * float(0x100000), float(0x80000000U) } } };
+ XMGLOBALCONST XMVECTORF32 g_XMNormalizeA2B10G10R10 = { { { 1.0f / 511.0f, 1.0f / (511.0f * float(0x400)), 1.0f / (511.0f * float(0x100000)), 1.0f / (3.0f * float(0x40000000)) } } };
+ XMGLOBALCONST XMVECTORU32 g_XMMaskX16Y16 = { { { 0x0000FFFF, 0xFFFF0000, 0x00000000, 0x00000000 } } };
+ XMGLOBALCONST XMVECTORI32 g_XMFlipX16Y16 = { { { 0x00008000, 0x00000000, 0x00000000, 0x00000000 } } };
+ XMGLOBALCONST XMVECTORF32 g_XMFixX16Y16 = { { { -32768.0f, 0.0f, 0.0f, 0.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMNormalizeX16Y16 = { { { 1.0f / 32767.0f, 1.0f / (32767.0f * 65536.0f), 0.0f, 0.0f } } };
+ XMGLOBALCONST XMVECTORU32 g_XMMaskX16Y16Z16W16 = { { { 0x0000FFFF, 0x0000FFFF, 0xFFFF0000, 0xFFFF0000 } } };
+ XMGLOBALCONST XMVECTORI32 g_XMFlipX16Y16Z16W16 = { { { 0x00008000, 0x00008000, 0x00000000, 0x00000000 } } };
+ XMGLOBALCONST XMVECTORF32 g_XMFixX16Y16Z16W16 = { { { -32768.0f, -32768.0f, 0.0f, 0.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMNormalizeX16Y16Z16W16 = { { { 1.0f / 32767.0f, 1.0f / 32767.0f, 1.0f / (32767.0f * 65536.0f), 1.0f / (32767.0f * 65536.0f) } } };
+ XMGLOBALCONST XMVECTORF32 g_XMNoFraction = { { { 8388608.0f, 8388608.0f, 8388608.0f, 8388608.0f } } };
+ XMGLOBALCONST XMVECTORI32 g_XMMaskByte = { { { 0x000000FF, 0x000000FF, 0x000000FF, 0x000000FF } } };
+ XMGLOBALCONST XMVECTORF32 g_XMNegateX = { { { -1.0f, 1.0f, 1.0f, 1.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMNegateY = { { { 1.0f, -1.0f, 1.0f, 1.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMNegateZ = { { { 1.0f, 1.0f, -1.0f, 1.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMNegateW = { { { 1.0f, 1.0f, 1.0f, -1.0f } } };
+ XMGLOBALCONST XMVECTORU32 g_XMSelect0101 = { { { XM_SELECT_0, XM_SELECT_1, XM_SELECT_0, XM_SELECT_1 } } };
+ XMGLOBALCONST XMVECTORU32 g_XMSelect1010 = { { { XM_SELECT_1, XM_SELECT_0, XM_SELECT_1, XM_SELECT_0 } } };
+ XMGLOBALCONST XMVECTORI32 g_XMOneHalfMinusEpsilon = { { { 0x3EFFFFFD, 0x3EFFFFFD, 0x3EFFFFFD, 0x3EFFFFFD } } };
+ XMGLOBALCONST XMVECTORU32 g_XMSelect1000 = { { { XM_SELECT_1, XM_SELECT_0, XM_SELECT_0, XM_SELECT_0 } } };
+ XMGLOBALCONST XMVECTORU32 g_XMSelect1100 = { { { XM_SELECT_1, XM_SELECT_1, XM_SELECT_0, XM_SELECT_0 } } };
+ XMGLOBALCONST XMVECTORU32 g_XMSelect1110 = { { { XM_SELECT_1, XM_SELECT_1, XM_SELECT_1, XM_SELECT_0 } } };
+ XMGLOBALCONST XMVECTORU32 g_XMSelect1011 = { { { XM_SELECT_1, XM_SELECT_0, XM_SELECT_1, XM_SELECT_1 } } };
+ XMGLOBALCONST XMVECTORF32 g_XMFixupY16 = { { { 1.0f, 1.0f / 65536.0f, 0.0f, 0.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMFixupY16W16 = { { { 1.0f, 1.0f, 1.0f / 65536.0f, 1.0f / 65536.0f } } };
+ XMGLOBALCONST XMVECTORU32 g_XMFlipY = { { { 0, 0x80000000, 0, 0 } } };
+ XMGLOBALCONST XMVECTORU32 g_XMFlipZ = { { { 0, 0, 0x80000000, 0 } } };
+ XMGLOBALCONST XMVECTORU32 g_XMFlipW = { { { 0, 0, 0, 0x80000000 } } };
+ XMGLOBALCONST XMVECTORU32 g_XMFlipYZ = { { { 0, 0x80000000, 0x80000000, 0 } } };
+ XMGLOBALCONST XMVECTORU32 g_XMFlipZW = { { { 0, 0, 0x80000000, 0x80000000 } } };
+ XMGLOBALCONST XMVECTORU32 g_XMFlipYW = { { { 0, 0x80000000, 0, 0x80000000 } } };
+ XMGLOBALCONST XMVECTORI32 g_XMMaskDec4 = { { { 0x3FF, 0x3FF << 10, 0x3FF << 20, static_cast(0xC0000000) } } };
+ XMGLOBALCONST XMVECTORI32 g_XMXorDec4 = { { { 0x200, 0x200 << 10, 0x200 << 20, 0 } } };
+ XMGLOBALCONST XMVECTORF32 g_XMAddUDec4 = { { { 0, 0, 0, 32768.0f * 65536.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMAddDec4 = { { { -512.0f, -512.0f * 1024.0f, -512.0f * 1024.0f * 1024.0f, 0 } } };
+ XMGLOBALCONST XMVECTORF32 g_XMMulDec4 = { { { 1.0f, 1.0f / 1024.0f, 1.0f / (1024.0f * 1024.0f), 1.0f / (1024.0f * 1024.0f * 1024.0f) } } };
+ XMGLOBALCONST XMVECTORU32 g_XMMaskByte4 = { { { 0xFF, 0xFF00, 0xFF0000, 0xFF000000 } } };
+ XMGLOBALCONST XMVECTORI32 g_XMXorByte4 = { { { 0x80, 0x8000, 0x800000, 0x00000000 } } };
+ XMGLOBALCONST XMVECTORF32 g_XMAddByte4 = { { { -128.0f, -128.0f * 256.0f, -128.0f * 65536.0f, 0 } } };
+ XMGLOBALCONST XMVECTORF32 g_XMFixUnsigned = { { { 32768.0f * 65536.0f, 32768.0f * 65536.0f, 32768.0f * 65536.0f, 32768.0f * 65536.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMMaxInt = { { { 65536.0f * 32768.0f - 128.0f, 65536.0f * 32768.0f - 128.0f, 65536.0f * 32768.0f - 128.0f, 65536.0f * 32768.0f - 128.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMMaxUInt = { { { 65536.0f * 65536.0f - 256.0f, 65536.0f * 65536.0f - 256.0f, 65536.0f * 65536.0f - 256.0f, 65536.0f * 65536.0f - 256.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMUnsignedFix = { { { 32768.0f * 65536.0f, 32768.0f * 65536.0f, 32768.0f * 65536.0f, 32768.0f * 65536.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMsrgbScale = { { { 12.92f, 12.92f, 12.92f, 1.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMsrgbA = { { { 0.055f, 0.055f, 0.055f, 0.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMsrgbA1 = { { { 1.055f, 1.055f, 1.055f, 1.0f } } };
+ XMGLOBALCONST XMVECTORI32 g_XMExponentBias = { { { 127, 127, 127, 127 } } };
+ XMGLOBALCONST XMVECTORI32 g_XMSubnormalExponent = { { { -126, -126, -126, -126 } } };
+ XMGLOBALCONST XMVECTORI32 g_XMNumTrailing = { { { 23, 23, 23, 23 } } };
+ XMGLOBALCONST XMVECTORI32 g_XMMinNormal = { { { 0x00800000, 0x00800000, 0x00800000, 0x00800000 } } };
+ XMGLOBALCONST XMVECTORU32 g_XMNegInfinity = { { { 0xFF800000, 0xFF800000, 0xFF800000, 0xFF800000 } } };
+ XMGLOBALCONST XMVECTORU32 g_XMNegQNaN = { { { 0xFFC00000, 0xFFC00000, 0xFFC00000, 0xFFC00000 } } };
+ XMGLOBALCONST XMVECTORI32 g_XMBin128 = { { { 0x43000000, 0x43000000, 0x43000000, 0x43000000 } } };
+ XMGLOBALCONST XMVECTORU32 g_XMBinNeg150 = { { { 0xC3160000, 0xC3160000, 0xC3160000, 0xC3160000 } } };
+ XMGLOBALCONST XMVECTORI32 g_XM253 = { { { 253, 253, 253, 253 } } };
+ XMGLOBALCONST XMVECTORF32 g_XMExpEst1 = { { { -6.93147182e-1f, -6.93147182e-1f, -6.93147182e-1f, -6.93147182e-1f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMExpEst2 = { { { +2.40226462e-1f, +2.40226462e-1f, +2.40226462e-1f, +2.40226462e-1f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMExpEst3 = { { { -5.55036440e-2f, -5.55036440e-2f, -5.55036440e-2f, -5.55036440e-2f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMExpEst4 = { { { +9.61597636e-3f, +9.61597636e-3f, +9.61597636e-3f, +9.61597636e-3f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMExpEst5 = { { { -1.32823968e-3f, -1.32823968e-3f, -1.32823968e-3f, -1.32823968e-3f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMExpEst6 = { { { +1.47491097e-4f, +1.47491097e-4f, +1.47491097e-4f, +1.47491097e-4f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMExpEst7 = { { { -1.08635004e-5f, -1.08635004e-5f, -1.08635004e-5f, -1.08635004e-5f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMLogEst0 = { { { +1.442693f, +1.442693f, +1.442693f, +1.442693f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMLogEst1 = { { { -0.721242f, -0.721242f, -0.721242f, -0.721242f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMLogEst2 = { { { +0.479384f, +0.479384f, +0.479384f, +0.479384f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMLogEst3 = { { { -0.350295f, -0.350295f, -0.350295f, -0.350295f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMLogEst4 = { { { +0.248590f, +0.248590f, +0.248590f, +0.248590f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMLogEst5 = { { { -0.145700f, -0.145700f, -0.145700f, -0.145700f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMLogEst6 = { { { +0.057148f, +0.057148f, +0.057148f, +0.057148f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMLogEst7 = { { { -0.010578f, -0.010578f, -0.010578f, -0.010578f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMLgE = { { { +1.442695f, +1.442695f, +1.442695f, +1.442695f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMInvLgE = { { { +6.93147182e-1f, +6.93147182e-1f, +6.93147182e-1f, +6.93147182e-1f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMLg10 = { { { +3.321928f, +3.321928f, +3.321928f, +3.321928f } } };
+ XMGLOBALCONST XMVECTORF32 g_XMInvLg10 = { { { +3.010299956e-1f, +3.010299956e-1f, +3.010299956e-1f, +3.010299956e-1f } } };
+ XMGLOBALCONST XMVECTORF32 g_UByteMax = { { { 255.0f, 255.0f, 255.0f, 255.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_ByteMin = { { { -127.0f, -127.0f, -127.0f, -127.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_ByteMax = { { { 127.0f, 127.0f, 127.0f, 127.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_ShortMin = { { { -32767.0f, -32767.0f, -32767.0f, -32767.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_ShortMax = { { { 32767.0f, 32767.0f, 32767.0f, 32767.0f } } };
+ XMGLOBALCONST XMVECTORF32 g_UShortMax = { { { 65535.0f, 65535.0f, 65535.0f, 65535.0f } } };
+
+ /****************************************************************************
+ *
+ * Implementation
+ *
+ ****************************************************************************/
+
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable:4068 4214 4204 4365 4616 4640 6001 6101)
+ // C4068/4616: ignore unknown pragmas
+ // C4214/4204: nonstandard extension used
+ // C4365/4640: Off by default noise
+ // C6001/6101: False positives
+#endif
+
+#ifdef _PREFAST_
+#pragma prefast(push)
+#pragma prefast(disable : 25000, "FXMVECTOR is 16 bytes")
+#pragma prefast(disable : 26495, "Union initialization confuses /analyze")
+#endif
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wfloat-equal"
+#pragma clang diagnostic ignored "-Wundefined-reinterpret-cast"
+#pragma clang diagnostic ignored "-Wunknown-warning-option"
+#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"
+#endif
+
+//------------------------------------------------------------------------------
+
+ inline XMVECTOR XM_CALLCONV XMVectorSetBinaryConstant(uint32_t C0, uint32_t C1, uint32_t C2, uint32_t C3) noexcept
+ {
+ #if defined(_XM_NO_INTRINSICS_)
+ XMVECTORU32 vResult;
+ vResult.u[0] = (0 - (C0 & 1)) & 0x3F800000;
+ vResult.u[1] = (0 - (C1 & 1)) & 0x3F800000;
+ vResult.u[2] = (0 - (C2 & 1)) & 0x3F800000;
+ vResult.u[3] = (0 - (C3 & 1)) & 0x3F800000;
+ return vResult.v;
+ #elif defined(_XM_ARM_NEON_INTRINSICS_)
+ XMVECTORU32 vResult;
+ vResult.u[0] = (0 - (C0 & 1)) & 0x3F800000;
+ vResult.u[1] = (0 - (C1 & 1)) & 0x3F800000;
+ vResult.u[2] = (0 - (C2 & 1)) & 0x3F800000;
+ vResult.u[3] = (0 - (C3 & 1)) & 0x3F800000;
+ return vResult.v;
+ #else // XM_SSE_INTRINSICS_
+ static const XMVECTORU32 g_vMask1 = { { { 1, 1, 1, 1 } } };
+ // Move the parms to a vector
+ __m128i vTemp = _mm_set_epi32(static_cast(C3), static_cast(C2), static_cast(C1), static_cast(C0));
+ // Mask off the low bits
+ vTemp = _mm_and_si128(vTemp, g_vMask1);
+ // 0xFFFFFFFF on true bits
+ vTemp = _mm_cmpeq_epi32(vTemp, g_vMask1);
+ // 0xFFFFFFFF -> 1.0f, 0x00000000 -> 0.0f
+ vTemp = _mm_and_si128(vTemp, g_XMOne);
+ return _mm_castsi128_ps(vTemp);
+ #endif
+ }
+
+ //------------------------------------------------------------------------------
+
+ inline XMVECTOR XM_CALLCONV XMVectorSplatConstant(int32_t IntConstant, uint32_t DivExponent) noexcept
+ {
+ assert(IntConstant >= -16 && IntConstant <= 15);
+ assert(DivExponent < 32);
+ #if defined(_XM_NO_INTRINSICS_)
+
+ using DirectX::XMConvertVectorIntToFloat;
+
+ XMVECTORI32 V = { { { IntConstant, IntConstant, IntConstant, IntConstant } } };
+ return XMConvertVectorIntToFloat(V.v, DivExponent);
+
+ #elif defined(_XM_ARM_NEON_INTRINSICS_)
+ // Splat the int
+ int32x4_t vScale = vdupq_n_s32(IntConstant);
+ // Convert to a float
+ XMVECTOR vResult = vcvtq_f32_s32(vScale);
+ // Convert DivExponent into 1.0f/(1<(&vScale)[0]);
+ return vResult;
+ #else // XM_SSE_INTRINSICS_
+ // Splat the int
+ __m128i vScale = _mm_set1_epi32(IntConstant);
+ // Convert to a float
+ XMVECTOR vResult = _mm_cvtepi32_ps(vScale);
+ // Convert DivExponent into 1.0f/(1<(uScale));
+ // Multiply by the reciprocal (Perform a right shift by DivExponent)
+ vResult = _mm_mul_ps(vResult, _mm_castsi128_ps(vScale));
+ return vResult;
+ #endif
+ }
+
+ //------------------------------------------------------------------------------
+
+ inline XMVECTOR XM_CALLCONV XMVectorSplatConstantInt(int32_t IntConstant) noexcept
+ {
+ assert(IntConstant >= -16 && IntConstant <= 15);
+ #if defined(_XM_NO_INTRINSICS_)
+
+ XMVECTORI32 V = { { { IntConstant, IntConstant, IntConstant, IntConstant } } };
+ return V.v;
+
+ #elif defined(_XM_ARM_NEON_INTRINSICS_)
+ int32x4_t V = vdupq_n_s32(IntConstant);
+ return reinterpret_cast(&V)[0];
+ #else // XM_SSE_INTRINSICS_
+ __m128i V = _mm_set1_epi32(IntConstant);
+ return _mm_castsi128_ps(V);
+ #endif
+ }
+
+#include "DirectXMathConvert.inl"
+#include "DirectXMathVector.inl"
+#include "DirectXMathMatrix.inl"
+#include "DirectXMathMisc.inl"
+
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+#ifdef _PREFAST_
+#pragma prefast(pop)
+#endif
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+} // namespace DirectX
+
diff --git a/Minecraft.Client/Windows64/Libs/4JLibs/impls/Windows_Libs/Render/vendor/DirectXMath/DirectXMathConvert.inl b/Minecraft.Client/Windows64/Libs/4JLibs/impls/Windows_Libs/Render/vendor/DirectXMath/DirectXMathConvert.inl
new file mode 100644
index 00000000..e3a6bdc6
--- /dev/null
+++ b/Minecraft.Client/Windows64/Libs/4JLibs/impls/Windows_Libs/Render/vendor/DirectXMath/DirectXMathConvert.inl
@@ -0,0 +1,2219 @@
+//-------------------------------------------------------------------------------------
+// DirectXMathConvert.inl -- SIMD C++ Math library
+//
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+//
+// https://go.microsoft.com/fwlink/?LinkID=615560
+//-------------------------------------------------------------------------------------
+
+#pragma once
+
+/****************************************************************************
+ *
+ * Data conversion
+ *
+ ****************************************************************************/
+
+//------------------------------------------------------------------------------
+
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable:4701)
+// C4701: false positives
+#endif
+
+inline XMVECTOR XM_CALLCONV XMConvertVectorIntToFloat
+(
+ FXMVECTOR VInt,
+ uint32_t DivExponent
+) noexcept
+{
+ assert(DivExponent < 32);
+#if defined(_XM_NO_INTRINSICS_)
+ float fScale = 1.0f / static_cast(1U << DivExponent);
+ uint32_t ElementIndex = 0;
+ XMVECTOR Result;
+ do
+ {
+ auto iTemp = static_cast(VInt.vector4_u32[ElementIndex]);
+ Result.vector4_f32[ElementIndex] = static_cast(iTemp)* fScale;
+ }
+ while (++ElementIndex < 4);
+ return Result;
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ float fScale = 1.0f / static_cast(1U << DivExponent);
+ float32x4_t vResult = vcvtq_f32_s32(vreinterpretq_s32_f32(VInt));
+ return vmulq_n_f32(vResult, fScale);
+#else // _XM_SSE_INTRINSICS_
+ // Convert to floats
+ XMVECTOR vResult = _mm_cvtepi32_ps(_mm_castps_si128(VInt));
+ // Convert DivExponent into 1.0f/(1<(uScale));
+ vResult = _mm_mul_ps(vResult, _mm_castsi128_ps(vScale));
+ return vResult;
+#endif
+}
+
+//------------------------------------------------------------------------------
+
+inline XMVECTOR XM_CALLCONV XMConvertVectorFloatToInt
+(
+ FXMVECTOR VFloat,
+ uint32_t MulExponent
+) noexcept
+{
+ assert(MulExponent < 32);
+#if defined(_XM_NO_INTRINSICS_)
+ // Get the scalar factor.
+ auto fScale = static_cast(1U << MulExponent);
+ uint32_t ElementIndex = 0;
+ XMVECTOR Result;
+ do
+ {
+ int32_t iResult;
+ float fTemp = VFloat.vector4_f32[ElementIndex] * fScale;
+ if (fTemp <= -(65536.0f * 32768.0f))
+ {
+ iResult = (-0x7FFFFFFF) - 1;
+ }
+ else if (fTemp > (65536.0f * 32768.0f) - 128.0f)
+ {
+ iResult = 0x7FFFFFFF;
+ }
+ else
+ {
+ iResult = static_cast(fTemp);
+ }
+ Result.vector4_u32[ElementIndex] = static_cast(iResult);
+ }
+ while (++ElementIndex < 4);
+ return Result;
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ float32x4_t vResult = vmulq_n_f32(VFloat, static_cast(1U << MulExponent));
+ // In case of positive overflow, detect it
+ uint32x4_t vOverflow = vcgtq_f32(vResult, g_XMMaxInt);
+ // Float to int conversion
+ int32x4_t vResulti = vcvtq_s32_f32(vResult);
+ // If there was positive overflow, set to 0x7FFFFFFF
+ vResult = vreinterpretq_f32_u32(vandq_u32(vOverflow, g_XMAbsMask));
+ vOverflow = vbicq_u32(vreinterpretq_u32_s32(vResulti), vOverflow);
+ vOverflow = vorrq_u32(vOverflow, vreinterpretq_u32_f32(vResult));
+ return vreinterpretq_f32_u32(vOverflow);
+#else // _XM_SSE_INTRINSICS_
+ XMVECTOR vResult = _mm_set_ps1(static_cast(1U << MulExponent));
+ vResult = _mm_mul_ps(vResult, VFloat);
+ // In case of positive overflow, detect it
+ XMVECTOR vOverflow = _mm_cmpgt_ps(vResult, g_XMMaxInt);
+ // Float to int conversion
+ __m128i vResulti = _mm_cvttps_epi32(vResult);
+ // If there was positive overflow, set to 0x7FFFFFFF
+ vResult = _mm_and_ps(vOverflow, g_XMAbsMask);
+ vOverflow = _mm_andnot_ps(vOverflow, _mm_castsi128_ps(vResulti));
+ vOverflow = _mm_or_ps(vOverflow, vResult);
+ return vOverflow;
+#endif
+}
+
+//------------------------------------------------------------------------------
+
+inline XMVECTOR XM_CALLCONV XMConvertVectorUIntToFloat
+(
+ FXMVECTOR VUInt,
+ uint32_t DivExponent
+) noexcept
+{
+ assert(DivExponent < 32);
+#if defined(_XM_NO_INTRINSICS_)
+ float fScale = 1.0f / static_cast(1U << DivExponent);
+ uint32_t ElementIndex = 0;
+ XMVECTOR Result;
+ do
+ {
+ Result.vector4_f32[ElementIndex] = static_cast(VUInt.vector4_u32[ElementIndex])* fScale;
+ }
+ while (++ElementIndex < 4);
+ return Result;
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ float fScale = 1.0f / static_cast(1U << DivExponent);
+ float32x4_t vResult = vcvtq_f32_u32(vreinterpretq_u32_f32(VUInt));
+ return vmulq_n_f32(vResult, fScale);
+#else // _XM_SSE_INTRINSICS_
+ // For the values that are higher than 0x7FFFFFFF, a fixup is needed
+ // Determine which ones need the fix.
+ XMVECTOR vMask = _mm_and_ps(VUInt, g_XMNegativeZero);
+ // Force all values positive
+ XMVECTOR vResult = _mm_xor_ps(VUInt, vMask);
+ // Convert to floats
+ vResult = _mm_cvtepi32_ps(_mm_castps_si128(vResult));
+ // Convert 0x80000000 -> 0xFFFFFFFF
+ __m128i iMask = _mm_srai_epi32(_mm_castps_si128(vMask), 31);
+ // For only the ones that are too big, add the fixup
+ vMask = _mm_and_ps(_mm_castsi128_ps(iMask), g_XMFixUnsigned);
+ vResult = _mm_add_ps(vResult, vMask);
+ // Convert DivExponent into 1.0f/(1<(uScale));
+ vResult = _mm_mul_ps(vResult, _mm_castsi128_ps(iMask));
+ return vResult;
+#endif
+}
+
+//------------------------------------------------------------------------------
+
+inline XMVECTOR XM_CALLCONV XMConvertVectorFloatToUInt
+(
+ FXMVECTOR VFloat,
+ uint32_t MulExponent
+) noexcept
+{
+ assert(MulExponent < 32);
+#if defined(_XM_NO_INTRINSICS_)
+ // Get the scalar factor.
+ auto fScale = static_cast(1U << MulExponent);
+ uint32_t ElementIndex = 0;
+ XMVECTOR Result;
+ do
+ {
+ uint32_t uResult;
+ float fTemp = VFloat.vector4_f32[ElementIndex] * fScale;
+ if (fTemp <= 0.0f)
+ {
+ uResult = 0;
+ }
+ else if (fTemp >= (65536.0f * 65536.0f))
+ {
+ uResult = 0xFFFFFFFFU;
+ }
+ else
+ {
+ uResult = static_cast(fTemp);
+ }
+ Result.vector4_u32[ElementIndex] = uResult;
+ }
+ while (++ElementIndex < 4);
+ return Result;
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ float32x4_t vResult = vmulq_n_f32(VFloat, static_cast(1U << MulExponent));
+ // In case of overflow, detect it
+ uint32x4_t vOverflow = vcgtq_f32(vResult, g_XMMaxUInt);
+ // Float to int conversion
+ uint32x4_t vResulti = vcvtq_u32_f32(vResult);
+ // If there was overflow, set to 0xFFFFFFFFU
+ vResult = vreinterpretq_f32_u32(vbicq_u32(vResulti, vOverflow));
+ vOverflow = vorrq_u32(vOverflow, vreinterpretq_u32_f32(vResult));
+ return vreinterpretq_f32_u32(vOverflow);
+#else // _XM_SSE_INTRINSICS_
+ XMVECTOR vResult = _mm_set_ps1(static_cast(1U << MulExponent));
+ vResult = _mm_mul_ps(vResult, VFloat);
+ // Clamp to >=0
+ vResult = _mm_max_ps(vResult, g_XMZero);
+ // Any numbers that are too big, set to 0xFFFFFFFFU
+ XMVECTOR vOverflow = _mm_cmpgt_ps(vResult, g_XMMaxUInt);
+ XMVECTOR vValue = g_XMUnsignedFix;
+ // Too large for a signed integer?
+ XMVECTOR vMask = _mm_cmpge_ps(vResult, vValue);
+ // Zero for number's lower than 0x80000000, 32768.0f*65536.0f otherwise
+ vValue = _mm_and_ps(vValue, vMask);
+ // Perform fixup only on numbers too large (Keeps low bit precision)
+ vResult = _mm_sub_ps(vResult, vValue);
+ __m128i vResulti = _mm_cvttps_epi32(vResult);
+ // Convert from signed to unsigned pnly if greater than 0x80000000
+ vMask = _mm_and_ps(vMask, g_XMNegativeZero);
+ vResult = _mm_xor_ps(_mm_castsi128_ps(vResulti), vMask);
+ // On those that are too large, set to 0xFFFFFFFF
+ vResult = _mm_or_ps(vResult, vOverflow);
+ return vResult;
+#endif
+}
+
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+/****************************************************************************
+ *
+ * Vector and matrix load operations
+ *
+ ****************************************************************************/
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMVECTOR XM_CALLCONV XMLoadInt(const uint32_t* pSource) noexcept
+{
+ assert(pSource);
+#if defined(_XM_NO_INTRINSICS_)
+ XMVECTOR V;
+ V.vector4_u32[0] = *pSource;
+ V.vector4_u32[1] = 0;
+ V.vector4_u32[2] = 0;
+ V.vector4_u32[3] = 0;
+ return V;
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ uint32x4_t zero = vdupq_n_u32(0);
+ return vreinterpretq_f32_u32(vld1q_lane_u32(pSource, zero, 0));
+#elif defined(_XM_SSE_INTRINSICS_)
+ return _mm_load_ss(reinterpret_cast(pSource));
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMVECTOR XM_CALLCONV XMLoadFloat(const float* pSource) noexcept
+{
+ assert(pSource);
+#if defined(_XM_NO_INTRINSICS_)
+ XMVECTOR V;
+ V.vector4_f32[0] = *pSource;
+ V.vector4_f32[1] = 0.f;
+ V.vector4_f32[2] = 0.f;
+ V.vector4_f32[3] = 0.f;
+ return V;
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ float32x4_t zero = vdupq_n_f32(0);
+ return vld1q_lane_f32(pSource, zero, 0);
+#elif defined(_XM_SSE_INTRINSICS_)
+ return _mm_load_ss(pSource);
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMVECTOR XM_CALLCONV XMLoadInt2(const uint32_t* pSource) noexcept
+{
+ assert(pSource);
+#if defined(_XM_NO_INTRINSICS_)
+ XMVECTOR V;
+ V.vector4_u32[0] = pSource[0];
+ V.vector4_u32[1] = pSource[1];
+ V.vector4_u32[2] = 0;
+ V.vector4_u32[3] = 0;
+ return V;
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ uint32x2_t x = vld1_u32(pSource);
+ uint32x2_t zero = vdup_n_u32(0);
+ return vreinterpretq_f32_u32(vcombine_u32(x, zero));
+#elif defined(_XM_SSE_INTRINSICS_)
+ return _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource)));
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMVECTOR XM_CALLCONV XMLoadInt2A(const uint32_t* pSource) noexcept
+{
+ assert(pSource);
+ assert((reinterpret_cast(pSource) & 0xF) == 0);
+#if defined(_XM_NO_INTRINSICS_)
+ XMVECTOR V;
+ V.vector4_u32[0] = pSource[0];
+ V.vector4_u32[1] = pSource[1];
+ V.vector4_u32[2] = 0;
+ V.vector4_u32[3] = 0;
+ return V;
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES)
+ uint32x2_t x = vld1_u32_ex(pSource, 64);
+#else
+ uint32x2_t x = vld1_u32(pSource);
+#endif
+ uint32x2_t zero = vdup_n_u32(0);
+ return vreinterpretq_f32_u32(vcombine_u32(x, zero));
+#elif defined(_XM_SSE_INTRINSICS_)
+ return _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource)));
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMVECTOR XM_CALLCONV XMLoadFloat2(const XMFLOAT2* pSource) noexcept
+{
+ assert(pSource);
+#if defined(_XM_NO_INTRINSICS_)
+ XMVECTOR V;
+ V.vector4_f32[0] = pSource->x;
+ V.vector4_f32[1] = pSource->y;
+ V.vector4_f32[2] = 0.f;
+ V.vector4_f32[3] = 0.f;
+ return V;
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ float32x2_t x = vld1_f32(reinterpret_cast(pSource));
+ float32x2_t zero = vdup_n_f32(0);
+ return vcombine_f32(x, zero);
+#elif defined(_XM_SSE_INTRINSICS_)
+ return _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource)));
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMVECTOR XM_CALLCONV XMLoadFloat2A(const XMFLOAT2A* pSource) noexcept
+{
+ assert(pSource);
+ assert((reinterpret_cast(pSource) & 0xF) == 0);
+#if defined(_XM_NO_INTRINSICS_)
+ XMVECTOR V;
+ V.vector4_f32[0] = pSource->x;
+ V.vector4_f32[1] = pSource->y;
+ V.vector4_f32[2] = 0.f;
+ V.vector4_f32[3] = 0.f;
+ return V;
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES)
+ float32x2_t x = vld1_f32_ex(reinterpret_cast(pSource), 64);
+#else
+ float32x2_t x = vld1_f32(reinterpret_cast(pSource));
+#endif
+ float32x2_t zero = vdup_n_f32(0);
+ return vcombine_f32(x, zero);
+#elif defined(_XM_SSE_INTRINSICS_)
+ return _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource)));
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMVECTOR XM_CALLCONV XMLoadSInt2(const XMINT2* pSource) noexcept
+{
+ assert(pSource);
+#if defined(_XM_NO_INTRINSICS_)
+ XMVECTOR V;
+ V.vector4_f32[0] = static_cast(pSource->x);
+ V.vector4_f32[1] = static_cast(pSource->y);
+ V.vector4_f32[2] = 0.f;
+ V.vector4_f32[3] = 0.f;
+ return V;
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ int32x2_t x = vld1_s32(reinterpret_cast(pSource));
+ float32x2_t v = vcvt_f32_s32(x);
+ float32x2_t zero = vdup_n_f32(0);
+ return vcombine_f32(v, zero);
+#elif defined(_XM_SSE_INTRINSICS_)
+ __m128 V = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource)));
+ return _mm_cvtepi32_ps(_mm_castps_si128(V));
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMVECTOR XM_CALLCONV XMLoadUInt2(const XMUINT2* pSource) noexcept
+{
+ assert(pSource);
+#if defined(_XM_NO_INTRINSICS_)
+ XMVECTOR V;
+ V.vector4_f32[0] = static_cast(pSource->x);
+ V.vector4_f32[1] = static_cast(pSource->y);
+ V.vector4_f32[2] = 0.f;
+ V.vector4_f32[3] = 0.f;
+ return V;
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ uint32x2_t x = vld1_u32(reinterpret_cast(pSource));
+ float32x2_t v = vcvt_f32_u32(x);
+ float32x2_t zero = vdup_n_f32(0);
+ return vcombine_f32(v, zero);
+#elif defined(_XM_SSE_INTRINSICS_)
+ __m128 V = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource)));
+ // For the values that are higher than 0x7FFFFFFF, a fixup is needed
+ // Determine which ones need the fix.
+ XMVECTOR vMask = _mm_and_ps(V, g_XMNegativeZero);
+ // Force all values positive
+ XMVECTOR vResult = _mm_xor_ps(V, vMask);
+ // Convert to floats
+ vResult = _mm_cvtepi32_ps(_mm_castps_si128(vResult));
+ // Convert 0x80000000 -> 0xFFFFFFFF
+ __m128i iMask = _mm_srai_epi32(_mm_castps_si128(vMask), 31);
+ // For only the ones that are too big, add the fixup
+ vMask = _mm_and_ps(_mm_castsi128_ps(iMask), g_XMFixUnsigned);
+ vResult = _mm_add_ps(vResult, vMask);
+ return vResult;
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMVECTOR XM_CALLCONV XMLoadInt3(const uint32_t* pSource) noexcept
+{
+ assert(pSource);
+#if defined(_XM_NO_INTRINSICS_)
+ XMVECTOR V;
+ V.vector4_u32[0] = pSource[0];
+ V.vector4_u32[1] = pSource[1];
+ V.vector4_u32[2] = pSource[2];
+ V.vector4_u32[3] = 0;
+ return V;
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ uint32x2_t x = vld1_u32(pSource);
+ uint32x2_t zero = vdup_n_u32(0);
+ uint32x2_t y = vld1_lane_u32(pSource + 2, zero, 0);
+ return vreinterpretq_f32_u32(vcombine_u32(x, y));
+#elif defined(_XM_SSE4_INTRINSICS_)
+ __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource)));
+ __m128 z = _mm_load_ss(reinterpret_cast(pSource + 2));
+ return _mm_insert_ps(xy, z, 0x20);
+#elif defined(_XM_SSE_INTRINSICS_)
+ __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource)));
+ __m128 z = _mm_load_ss(reinterpret_cast(pSource + 2));
+ return _mm_movelh_ps(xy, z);
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMVECTOR XM_CALLCONV XMLoadInt3A(const uint32_t* pSource) noexcept
+{
+ assert(pSource);
+ assert((reinterpret_cast(pSource) & 0xF) == 0);
+#if defined(_XM_NO_INTRINSICS_)
+ XMVECTOR V;
+ V.vector4_u32[0] = pSource[0];
+ V.vector4_u32[1] = pSource[1];
+ V.vector4_u32[2] = pSource[2];
+ V.vector4_u32[3] = 0;
+ return V;
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ // Reads an extra integer which is zero'd
+#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES)
+ uint32x4_t V = vld1q_u32_ex(pSource, 128);
+#else
+ uint32x4_t V = vld1q_u32(pSource);
+#endif
+ return vreinterpretq_f32_u32(vsetq_lane_u32(0, V, 3));
+#elif defined(_XM_SSE4_INTRINSICS_)
+ __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource)));
+ __m128 z = _mm_load_ss(reinterpret_cast(pSource + 2));
+ return _mm_insert_ps(xy, z, 0x20);
+#elif defined(_XM_SSE_INTRINSICS_)
+ __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource)));
+ __m128 z = _mm_load_ss(reinterpret_cast(pSource + 2));
+ return _mm_movelh_ps(xy, z);
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMVECTOR XM_CALLCONV XMLoadFloat3(const XMFLOAT3* pSource) noexcept
+{
+ assert(pSource);
+#if defined(_XM_NO_INTRINSICS_)
+ XMVECTOR V;
+ V.vector4_f32[0] = pSource->x;
+ V.vector4_f32[1] = pSource->y;
+ V.vector4_f32[2] = pSource->z;
+ V.vector4_f32[3] = 0.f;
+ return V;
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ float32x2_t x = vld1_f32(reinterpret_cast(pSource));
+ float32x2_t zero = vdup_n_f32(0);
+ float32x2_t y = vld1_lane_f32(reinterpret_cast(pSource) + 2, zero, 0);
+ return vcombine_f32(x, y);
+#elif defined(_XM_SSE4_INTRINSICS_)
+ __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource)));
+ __m128 z = _mm_load_ss(&pSource->z);
+ return _mm_insert_ps(xy, z, 0x20);
+#elif defined(_XM_SSE_INTRINSICS_)
+ __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource)));
+ __m128 z = _mm_load_ss(&pSource->z);
+ return _mm_movelh_ps(xy, z);
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMVECTOR XM_CALLCONV XMLoadFloat3A(const XMFLOAT3A* pSource) noexcept
+{
+ assert(pSource);
+ assert((reinterpret_cast(pSource) & 0xF) == 0);
+#if defined(_XM_NO_INTRINSICS_)
+ XMVECTOR V;
+ V.vector4_f32[0] = pSource->x;
+ V.vector4_f32[1] = pSource->y;
+ V.vector4_f32[2] = pSource->z;
+ V.vector4_f32[3] = 0.f;
+ return V;
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ // Reads an extra float which is zero'd
+#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES)
+ float32x4_t V = vld1q_f32_ex(reinterpret_cast(pSource), 128);
+#else
+ float32x4_t V = vld1q_f32(reinterpret_cast(pSource));
+#endif
+ return vsetq_lane_f32(0, V, 3);
+#elif defined(_XM_SSE4_INTRINSICS_)
+ // Reads an extra float which is zero'd
+ __m128 V = _mm_load_ps(&pSource->x);
+ return _mm_blend_ps(_mm_setzero_ps(), V, 0x7);
+#elif defined(_XM_SSE_INTRINSICS_)
+ // Reads an extra float which is zero'd
+ __m128 V = _mm_load_ps(&pSource->x);
+ return _mm_and_ps(V, g_XMMask3);
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMVECTOR XM_CALLCONV XMLoadSInt3(const XMINT3* pSource) noexcept
+{
+ assert(pSource);
+#if defined(_XM_NO_INTRINSICS_)
+
+ XMVECTOR V;
+ V.vector4_f32[0] = static_cast(pSource->x);
+ V.vector4_f32[1] = static_cast(pSource->y);
+ V.vector4_f32[2] = static_cast(pSource->z);
+ V.vector4_f32[3] = 0.f;
+ return V;
+
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ int32x2_t x = vld1_s32(reinterpret_cast(pSource));
+ int32x2_t zero = vdup_n_s32(0);
+ int32x2_t y = vld1_lane_s32(reinterpret_cast(pSource) + 2, zero, 0);
+ int32x4_t v = vcombine_s32(x, y);
+ return vcvtq_f32_s32(v);
+#elif defined(_XM_SSE_INTRINSICS_)
+ __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource)));
+ __m128 z = _mm_load_ss(reinterpret_cast(&pSource->z));
+ __m128 V = _mm_movelh_ps(xy, z);
+ return _mm_cvtepi32_ps(_mm_castps_si128(V));
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMVECTOR XM_CALLCONV XMLoadUInt3(const XMUINT3* pSource) noexcept
+{
+ assert(pSource);
+#if defined(_XM_NO_INTRINSICS_)
+ XMVECTOR V;
+ V.vector4_f32[0] = static_cast(pSource->x);
+ V.vector4_f32[1] = static_cast(pSource->y);
+ V.vector4_f32[2] = static_cast(pSource->z);
+ V.vector4_f32[3] = 0.f;
+ return V;
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ uint32x2_t x = vld1_u32(reinterpret_cast(pSource));
+ uint32x2_t zero = vdup_n_u32(0);
+ uint32x2_t y = vld1_lane_u32(reinterpret_cast(pSource) + 2, zero, 0);
+ uint32x4_t v = vcombine_u32(x, y);
+ return vcvtq_f32_u32(v);
+#elif defined(_XM_SSE_INTRINSICS_)
+ __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource)));
+ __m128 z = _mm_load_ss(reinterpret_cast(&pSource->z));
+ __m128 V = _mm_movelh_ps(xy, z);
+ // For the values that are higher than 0x7FFFFFFF, a fixup is needed
+ // Determine which ones need the fix.
+ XMVECTOR vMask = _mm_and_ps(V, g_XMNegativeZero);
+ // Force all values positive
+ XMVECTOR vResult = _mm_xor_ps(V, vMask);
+ // Convert to floats
+ vResult = _mm_cvtepi32_ps(_mm_castps_si128(vResult));
+ // Convert 0x80000000 -> 0xFFFFFFFF
+ __m128i iMask = _mm_srai_epi32(_mm_castps_si128(vMask), 31);
+ // For only the ones that are too big, add the fixup
+ vMask = _mm_and_ps(_mm_castsi128_ps(iMask), g_XMFixUnsigned);
+ vResult = _mm_add_ps(vResult, vMask);
+ return vResult;
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMVECTOR XM_CALLCONV XMLoadInt4(const uint32_t* pSource) noexcept
+{
+ assert(pSource);
+
+#if defined(_XM_NO_INTRINSICS_)
+ XMVECTOR V;
+ V.vector4_u32[0] = pSource[0];
+ V.vector4_u32[1] = pSource[1];
+ V.vector4_u32[2] = pSource[2];
+ V.vector4_u32[3] = pSource[3];
+ return V;
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ return vreinterpretq_f32_u32(vld1q_u32(pSource));
+#elif defined(_XM_SSE_INTRINSICS_)
+ __m128i V = _mm_loadu_si128(reinterpret_cast(pSource));
+ return _mm_castsi128_ps(V);
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMVECTOR XM_CALLCONV XMLoadInt4A(const uint32_t* pSource) noexcept
+{
+ assert(pSource);
+ assert((reinterpret_cast(pSource) & 0xF) == 0);
+#if defined(_XM_NO_INTRINSICS_)
+ XMVECTOR V;
+ V.vector4_u32[0] = pSource[0];
+ V.vector4_u32[1] = pSource[1];
+ V.vector4_u32[2] = pSource[2];
+ V.vector4_u32[3] = pSource[3];
+ return V;
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES)
+ return vld1q_u32_ex(pSource, 128);
+#else
+ return vreinterpretq_f32_u32(vld1q_u32(pSource));
+#endif
+#elif defined(_XM_SSE_INTRINSICS_)
+ __m128i V = _mm_load_si128(reinterpret_cast(pSource));
+ return _mm_castsi128_ps(V);
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMVECTOR XM_CALLCONV XMLoadFloat4(const XMFLOAT4* pSource) noexcept
+{
+ assert(pSource);
+#if defined(_XM_NO_INTRINSICS_)
+ XMVECTOR V;
+ V.vector4_f32[0] = pSource->x;
+ V.vector4_f32[1] = pSource->y;
+ V.vector4_f32[2] = pSource->z;
+ V.vector4_f32[3] = pSource->w;
+ return V;
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ return vld1q_f32(reinterpret_cast(pSource));
+#elif defined(_XM_SSE_INTRINSICS_)
+ return _mm_loadu_ps(&pSource->x);
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMVECTOR XM_CALLCONV XMLoadFloat4A(const XMFLOAT4A* pSource) noexcept
+{
+ assert(pSource);
+ assert((reinterpret_cast(pSource) & 0xF) == 0);
+#if defined(_XM_NO_INTRINSICS_)
+ XMVECTOR V;
+ V.vector4_f32[0] = pSource->x;
+ V.vector4_f32[1] = pSource->y;
+ V.vector4_f32[2] = pSource->z;
+ V.vector4_f32[3] = pSource->w;
+ return V;
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES)
+ return vld1q_f32_ex(reinterpret_cast(pSource), 128);
+#else
+ return vld1q_f32(reinterpret_cast(pSource));
+#endif
+#elif defined(_XM_SSE_INTRINSICS_)
+ return _mm_load_ps(&pSource->x);
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMVECTOR XM_CALLCONV XMLoadSInt4(const XMINT4* pSource) noexcept
+{
+ assert(pSource);
+#if defined(_XM_NO_INTRINSICS_)
+
+ XMVECTOR V;
+ V.vector4_f32[0] = static_cast(pSource->x);
+ V.vector4_f32[1] = static_cast(pSource->y);
+ V.vector4_f32[2] = static_cast(pSource->z);
+ V.vector4_f32[3] = static_cast(pSource->w);
+ return V;
+
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ int32x4_t v = vld1q_s32(reinterpret_cast(pSource));
+ return vcvtq_f32_s32(v);
+#elif defined(_XM_SSE_INTRINSICS_)
+ __m128i V = _mm_loadu_si128(reinterpret_cast(pSource));
+ return _mm_cvtepi32_ps(V);
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMVECTOR XM_CALLCONV XMLoadUInt4(const XMUINT4* pSource) noexcept
+{
+ assert(pSource);
+#if defined(_XM_NO_INTRINSICS_)
+ XMVECTOR V;
+ V.vector4_f32[0] = static_cast(pSource->x);
+ V.vector4_f32[1] = static_cast(pSource->y);
+ V.vector4_f32[2] = static_cast(pSource->z);
+ V.vector4_f32[3] = static_cast(pSource->w);
+ return V;
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ uint32x4_t v = vld1q_u32(reinterpret_cast(pSource));
+ return vcvtq_f32_u32(v);
+#elif defined(_XM_SSE_INTRINSICS_)
+ __m128i V = _mm_loadu_si128(reinterpret_cast(pSource));
+ // For the values that are higher than 0x7FFFFFFF, a fixup is needed
+ // Determine which ones need the fix.
+ XMVECTOR vMask = _mm_and_ps(_mm_castsi128_ps(V), g_XMNegativeZero);
+ // Force all values positive
+ XMVECTOR vResult = _mm_xor_ps(_mm_castsi128_ps(V), vMask);
+ // Convert to floats
+ vResult = _mm_cvtepi32_ps(_mm_castps_si128(vResult));
+ // Convert 0x80000000 -> 0xFFFFFFFF
+ __m128i iMask = _mm_srai_epi32(_mm_castps_si128(vMask), 31);
+ // For only the ones that are too big, add the fixup
+ vMask = _mm_and_ps(_mm_castsi128_ps(iMask), g_XMFixUnsigned);
+ vResult = _mm_add_ps(vResult, vMask);
+ return vResult;
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMMATRIX XM_CALLCONV XMLoadFloat3x3(const XMFLOAT3X3* pSource) noexcept
+{
+ assert(pSource);
+#if defined(_XM_NO_INTRINSICS_)
+
+ XMMATRIX M;
+ M.r[0].vector4_f32[0] = pSource->m[0][0];
+ M.r[0].vector4_f32[1] = pSource->m[0][1];
+ M.r[0].vector4_f32[2] = pSource->m[0][2];
+ M.r[0].vector4_f32[3] = 0.0f;
+
+ M.r[1].vector4_f32[0] = pSource->m[1][0];
+ M.r[1].vector4_f32[1] = pSource->m[1][1];
+ M.r[1].vector4_f32[2] = pSource->m[1][2];
+ M.r[1].vector4_f32[3] = 0.0f;
+
+ M.r[2].vector4_f32[0] = pSource->m[2][0];
+ M.r[2].vector4_f32[1] = pSource->m[2][1];
+ M.r[2].vector4_f32[2] = pSource->m[2][2];
+ M.r[2].vector4_f32[3] = 0.0f;
+ M.r[3].vector4_f32[0] = 0.0f;
+ M.r[3].vector4_f32[1] = 0.0f;
+ M.r[3].vector4_f32[2] = 0.0f;
+ M.r[3].vector4_f32[3] = 1.0f;
+ return M;
+
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ float32x4_t v0 = vld1q_f32(&pSource->m[0][0]);
+ float32x4_t v1 = vld1q_f32(&pSource->m[1][1]);
+ float32x2_t v2 = vcreate_f32(static_cast(*reinterpret_cast(&pSource->m[2][2])));
+ float32x4_t T = vextq_f32(v0, v1, 3);
+
+ XMMATRIX M;
+ M.r[0] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(v0), g_XMMask3));
+ M.r[1] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T), g_XMMask3));
+ M.r[2] = vcombine_f32(vget_high_f32(v1), v2);
+ M.r[3] = g_XMIdentityR3;
+ return M;
+#elif defined(_XM_SSE_INTRINSICS_)
+ __m128 Z = _mm_setzero_ps();
+
+ __m128 V1 = _mm_loadu_ps(&pSource->m[0][0]);
+ __m128 V2 = _mm_loadu_ps(&pSource->m[1][1]);
+ __m128 V3 = _mm_load_ss(&pSource->m[2][2]);
+
+ __m128 T1 = _mm_unpackhi_ps(V1, Z);
+ __m128 T2 = _mm_unpacklo_ps(V2, Z);
+ __m128 T3 = _mm_shuffle_ps(V3, T2, _MM_SHUFFLE(0, 1, 0, 0));
+ __m128 T4 = _mm_movehl_ps(T2, T3);
+ __m128 T5 = _mm_movehl_ps(Z, T1);
+
+ XMMATRIX M;
+ M.r[0] = _mm_movelh_ps(V1, T1);
+ M.r[1] = _mm_add_ps(T4, T5);
+ M.r[2] = _mm_shuffle_ps(V2, V3, _MM_SHUFFLE(1, 0, 3, 2));
+ M.r[3] = g_XMIdentityR3;
+ return M;
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMMATRIX XM_CALLCONV XMLoadFloat4x3(const XMFLOAT4X3* pSource) noexcept
+{
+ assert(pSource);
+#if defined(_XM_NO_INTRINSICS_)
+
+ XMMATRIX M;
+ M.r[0].vector4_f32[0] = pSource->m[0][0];
+ M.r[0].vector4_f32[1] = pSource->m[0][1];
+ M.r[0].vector4_f32[2] = pSource->m[0][2];
+ M.r[0].vector4_f32[3] = 0.0f;
+
+ M.r[1].vector4_f32[0] = pSource->m[1][0];
+ M.r[1].vector4_f32[1] = pSource->m[1][1];
+ M.r[1].vector4_f32[2] = pSource->m[1][2];
+ M.r[1].vector4_f32[3] = 0.0f;
+
+ M.r[2].vector4_f32[0] = pSource->m[2][0];
+ M.r[2].vector4_f32[1] = pSource->m[2][1];
+ M.r[2].vector4_f32[2] = pSource->m[2][2];
+ M.r[2].vector4_f32[3] = 0.0f;
+
+ M.r[3].vector4_f32[0] = pSource->m[3][0];
+ M.r[3].vector4_f32[1] = pSource->m[3][1];
+ M.r[3].vector4_f32[2] = pSource->m[3][2];
+ M.r[3].vector4_f32[3] = 1.0f;
+ return M;
+
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ float32x4_t v0 = vld1q_f32(&pSource->m[0][0]);
+ float32x4_t v1 = vld1q_f32(&pSource->m[1][1]);
+ float32x4_t v2 = vld1q_f32(&pSource->m[2][2]);
+
+ float32x4_t T1 = vextq_f32(v0, v1, 3);
+ float32x4_t T2 = vcombine_f32(vget_high_f32(v1), vget_low_f32(v2));
+ float32x4_t T3 = vextq_f32(v2, v2, 1);
+
+ XMMATRIX M;
+ M.r[0] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(v0), g_XMMask3));
+ M.r[1] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T1), g_XMMask3));
+ M.r[2] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T2), g_XMMask3));
+ M.r[3] = vsetq_lane_f32(1.f, T3, 3);
+ return M;
+#elif defined(_XM_SSE_INTRINSICS_)
+ // Use unaligned load instructions to
+ // load the 12 floats
+ // vTemp1 = x1,y1,z1,x2
+ XMVECTOR vTemp1 = _mm_loadu_ps(&pSource->m[0][0]);
+ // vTemp2 = y2,z2,x3,y3
+ XMVECTOR vTemp2 = _mm_loadu_ps(&pSource->m[1][1]);
+ // vTemp4 = z3,x4,y4,z4
+ XMVECTOR vTemp4 = _mm_loadu_ps(&pSource->m[2][2]);
+ // vTemp3 = x3,y3,z3,z3
+ XMVECTOR vTemp3 = _mm_shuffle_ps(vTemp2, vTemp4, _MM_SHUFFLE(0, 0, 3, 2));
+ // vTemp2 = y2,z2,x2,x2
+ vTemp2 = _mm_shuffle_ps(vTemp2, vTemp1, _MM_SHUFFLE(3, 3, 1, 0));
+ // vTemp2 = x2,y2,z2,z2
+ vTemp2 = XM_PERMUTE_PS(vTemp2, _MM_SHUFFLE(1, 1, 0, 2));
+ // vTemp1 = x1,y1,z1,0
+ // vTemp2 = x2,y2,z2,0
+ // vTemp3 = x3,y3,z3,0
+#ifdef _XM_SSE4_INTRINSICS_
+ XMVECTOR zero = _mm_setzero_ps();
+ vTemp1 = _mm_blend_ps(zero, vTemp1, 0x7);
+ vTemp2 = _mm_blend_ps(zero, vTemp2, 0x7);
+ vTemp3 = _mm_blend_ps(zero, vTemp3, 0x7);
+#else
+ vTemp1 = _mm_and_ps(vTemp1, g_XMMask3);
+ vTemp2 = _mm_and_ps(vTemp2, g_XMMask3);
+ vTemp3 = _mm_and_ps(vTemp3, g_XMMask3);
+#endif
+ // vTemp4i = x4,y4,z4,0
+ __m128i vTemp4i = _mm_srli_si128(_mm_castps_si128(vTemp4), 32 / 8);
+ // vTemp4i = x4,y4,z4,1.0f
+ vTemp4i = _mm_or_si128(vTemp4i, g_XMIdentityR3);
+ XMMATRIX M(vTemp1,
+ vTemp2,
+ vTemp3,
+ _mm_castsi128_ps(vTemp4i));
+ return M;
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMMATRIX XM_CALLCONV XMLoadFloat4x3A(const XMFLOAT4X3A* pSource) noexcept
+{
+ assert(pSource);
+ assert((reinterpret_cast(pSource) & 0xF) == 0);
+#if defined(_XM_NO_INTRINSICS_)
+
+ XMMATRIX M;
+ M.r[0].vector4_f32[0] = pSource->m[0][0];
+ M.r[0].vector4_f32[1] = pSource->m[0][1];
+ M.r[0].vector4_f32[2] = pSource->m[0][2];
+ M.r[0].vector4_f32[3] = 0.0f;
+
+ M.r[1].vector4_f32[0] = pSource->m[1][0];
+ M.r[1].vector4_f32[1] = pSource->m[1][1];
+ M.r[1].vector4_f32[2] = pSource->m[1][2];
+ M.r[1].vector4_f32[3] = 0.0f;
+
+ M.r[2].vector4_f32[0] = pSource->m[2][0];
+ M.r[2].vector4_f32[1] = pSource->m[2][1];
+ M.r[2].vector4_f32[2] = pSource->m[2][2];
+ M.r[2].vector4_f32[3] = 0.0f;
+
+ M.r[3].vector4_f32[0] = pSource->m[3][0];
+ M.r[3].vector4_f32[1] = pSource->m[3][1];
+ M.r[3].vector4_f32[2] = pSource->m[3][2];
+ M.r[3].vector4_f32[3] = 1.0f;
+ return M;
+
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES)
+ float32x4_t v0 = vld1q_f32_ex(&pSource->m[0][0], 128);
+ float32x4_t v1 = vld1q_f32_ex(&pSource->m[1][1], 128);
+ float32x4_t v2 = vld1q_f32_ex(&pSource->m[2][2], 128);
+#else
+ float32x4_t v0 = vld1q_f32(&pSource->m[0][0]);
+ float32x4_t v1 = vld1q_f32(&pSource->m[1][1]);
+ float32x4_t v2 = vld1q_f32(&pSource->m[2][2]);
+#endif
+
+ float32x4_t T1 = vextq_f32(v0, v1, 3);
+ float32x4_t T2 = vcombine_f32(vget_high_f32(v1), vget_low_f32(v2));
+ float32x4_t T3 = vextq_f32(v2, v2, 1);
+
+ XMMATRIX M;
+ M.r[0] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(v0), g_XMMask3));
+ M.r[1] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T1), g_XMMask3));
+ M.r[2] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T2), g_XMMask3));
+ M.r[3] = vsetq_lane_f32(1.f, T3, 3);
+ return M;
+#elif defined(_XM_SSE_INTRINSICS_)
+ // Use aligned load instructions to
+ // load the 12 floats
+ // vTemp1 = x1,y1,z1,x2
+ XMVECTOR vTemp1 = _mm_load_ps(&pSource->m[0][0]);
+ // vTemp2 = y2,z2,x3,y3
+ XMVECTOR vTemp2 = _mm_load_ps(&pSource->m[1][1]);
+ // vTemp4 = z3,x4,y4,z4
+ XMVECTOR vTemp4 = _mm_load_ps(&pSource->m[2][2]);
+ // vTemp3 = x3,y3,z3,z3
+ XMVECTOR vTemp3 = _mm_shuffle_ps(vTemp2, vTemp4, _MM_SHUFFLE(0, 0, 3, 2));
+ // vTemp2 = y2,z2,x2,x2
+ vTemp2 = _mm_shuffle_ps(vTemp2, vTemp1, _MM_SHUFFLE(3, 3, 1, 0));
+ // vTemp2 = x2,y2,z2,z2
+ vTemp2 = XM_PERMUTE_PS(vTemp2, _MM_SHUFFLE(1, 1, 0, 2));
+ // vTemp1 = x1,y1,z1,0
+ // vTemp2 = x2,y2,z2,0
+ // vTemp3 = x3,y3,z3,0
+#ifdef _XM_SSE4_INTRINSICS_
+ XMVECTOR zero = _mm_setzero_ps();
+ vTemp1 = _mm_blend_ps(zero, vTemp1, 0x7);
+ vTemp2 = _mm_blend_ps(zero, vTemp2, 0x7);
+ vTemp3 = _mm_blend_ps(zero, vTemp3, 0x7);
+#else
+ vTemp1 = _mm_and_ps(vTemp1, g_XMMask3);
+ vTemp2 = _mm_and_ps(vTemp2, g_XMMask3);
+ vTemp3 = _mm_and_ps(vTemp3, g_XMMask3);
+#endif
+ // vTemp4i = x4,y4,z4,0
+ __m128i vTemp4i = _mm_srli_si128(_mm_castps_si128(vTemp4), 32 / 8);
+ // vTemp4i = x4,y4,z4,1.0f
+ vTemp4i = _mm_or_si128(vTemp4i, g_XMIdentityR3);
+ XMMATRIX M(vTemp1,
+ vTemp2,
+ vTemp3,
+ _mm_castsi128_ps(vTemp4i));
+ return M;
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMMATRIX XM_CALLCONV XMLoadFloat3x4(const XMFLOAT3X4* pSource) noexcept
+{
+ assert(pSource);
+#if defined(_XM_NO_INTRINSICS_)
+
+ XMMATRIX M;
+ M.r[0].vector4_f32[0] = pSource->m[0][0];
+ M.r[0].vector4_f32[1] = pSource->m[1][0];
+ M.r[0].vector4_f32[2] = pSource->m[2][0];
+ M.r[0].vector4_f32[3] = 0.0f;
+
+ M.r[1].vector4_f32[0] = pSource->m[0][1];
+ M.r[1].vector4_f32[1] = pSource->m[1][1];
+ M.r[1].vector4_f32[2] = pSource->m[2][1];
+ M.r[1].vector4_f32[3] = 0.0f;
+
+ M.r[2].vector4_f32[0] = pSource->m[0][2];
+ M.r[2].vector4_f32[1] = pSource->m[1][2];
+ M.r[2].vector4_f32[2] = pSource->m[2][2];
+ M.r[2].vector4_f32[3] = 0.0f;
+
+ M.r[3].vector4_f32[0] = pSource->m[0][3];
+ M.r[3].vector4_f32[1] = pSource->m[1][3];
+ M.r[3].vector4_f32[2] = pSource->m[2][3];
+ M.r[3].vector4_f32[3] = 1.0f;
+ return M;
+
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ float32x2x4_t vTemp0 = vld4_f32(&pSource->_11);
+ float32x4_t vTemp1 = vld1q_f32(&pSource->_31);
+
+ float32x2_t l = vget_low_f32(vTemp1);
+ float32x4_t T0 = vcombine_f32(vTemp0.val[0], l);
+ float32x2_t rl = vrev64_f32(l);
+ float32x4_t T1 = vcombine_f32(vTemp0.val[1], rl);
+
+ float32x2_t h = vget_high_f32(vTemp1);
+ float32x4_t T2 = vcombine_f32(vTemp0.val[2], h);
+ float32x2_t rh = vrev64_f32(h);
+ float32x4_t T3 = vcombine_f32(vTemp0.val[3], rh);
+
+ XMMATRIX M = {};
+ M.r[0] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T0), g_XMMask3));
+ M.r[1] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T1), g_XMMask3));
+ M.r[2] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T2), g_XMMask3));
+ M.r[3] = vsetq_lane_f32(1.f, T3, 3);
+ return M;
+#elif defined(_XM_SSE_INTRINSICS_)
+ XMMATRIX M;
+ M.r[0] = _mm_loadu_ps(&pSource->_11);
+ M.r[1] = _mm_loadu_ps(&pSource->_21);
+ M.r[2] = _mm_loadu_ps(&pSource->_31);
+ M.r[3] = g_XMIdentityR3;
+
+ // x.x,x.y,y.x,y.y
+ XMVECTOR vTemp1 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(1, 0, 1, 0));
+ // x.z,x.w,y.z,y.w
+ XMVECTOR vTemp3 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(3, 2, 3, 2));
+ // z.x,z.y,w.x,w.y
+ XMVECTOR vTemp2 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(1, 0, 1, 0));
+ // z.z,z.w,w.z,w.w
+ XMVECTOR vTemp4 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(3, 2, 3, 2));
+ XMMATRIX mResult;
+
+ // x.x,y.x,z.x,w.x
+ mResult.r[0] = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(2, 0, 2, 0));
+ // x.y,y.y,z.y,w.y
+ mResult.r[1] = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(3, 1, 3, 1));
+ // x.z,y.z,z.z,w.z
+ mResult.r[2] = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(2, 0, 2, 0));
+ // x.w,y.w,z.w,w.w
+ mResult.r[3] = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(3, 1, 3, 1));
+ return mResult;
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMMATRIX XM_CALLCONV XMLoadFloat3x4A(const XMFLOAT3X4A* pSource) noexcept
+{
+ assert(pSource);
+ assert((reinterpret_cast(pSource) & 0xF) == 0);
+#if defined(_XM_NO_INTRINSICS_)
+
+ XMMATRIX M;
+ M.r[0].vector4_f32[0] = pSource->m[0][0];
+ M.r[0].vector4_f32[1] = pSource->m[1][0];
+ M.r[0].vector4_f32[2] = pSource->m[2][0];
+ M.r[0].vector4_f32[3] = 0.0f;
+
+ M.r[1].vector4_f32[0] = pSource->m[0][1];
+ M.r[1].vector4_f32[1] = pSource->m[1][1];
+ M.r[1].vector4_f32[2] = pSource->m[2][1];
+ M.r[1].vector4_f32[3] = 0.0f;
+
+ M.r[2].vector4_f32[0] = pSource->m[0][2];
+ M.r[2].vector4_f32[1] = pSource->m[1][2];
+ M.r[2].vector4_f32[2] = pSource->m[2][2];
+ M.r[2].vector4_f32[3] = 0.0f;
+
+ M.r[3].vector4_f32[0] = pSource->m[0][3];
+ M.r[3].vector4_f32[1] = pSource->m[1][3];
+ M.r[3].vector4_f32[2] = pSource->m[2][3];
+ M.r[3].vector4_f32[3] = 1.0f;
+ return M;
+
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES)
+ float32x2x4_t vTemp0 = vld4_f32_ex(&pSource->_11, 128);
+ float32x4_t vTemp1 = vld1q_f32_ex(&pSource->_31, 128);
+#else
+ float32x2x4_t vTemp0 = vld4_f32(&pSource->_11);
+ float32x4_t vTemp1 = vld1q_f32(&pSource->_31);
+#endif
+
+ float32x2_t l = vget_low_f32(vTemp1);
+ float32x4_t T0 = vcombine_f32(vTemp0.val[0], l);
+ float32x2_t rl = vrev64_f32(l);
+ float32x4_t T1 = vcombine_f32(vTemp0.val[1], rl);
+
+ float32x2_t h = vget_high_f32(vTemp1);
+ float32x4_t T2 = vcombine_f32(vTemp0.val[2], h);
+ float32x2_t rh = vrev64_f32(h);
+ float32x4_t T3 = vcombine_f32(vTemp0.val[3], rh);
+
+ XMMATRIX M = {};
+ M.r[0] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T0), g_XMMask3));
+ M.r[1] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T1), g_XMMask3));
+ M.r[2] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T2), g_XMMask3));
+ M.r[3] = vsetq_lane_f32(1.f, T3, 3);
+ return M;
+#elif defined(_XM_SSE_INTRINSICS_)
+ XMMATRIX M;
+ M.r[0] = _mm_load_ps(&pSource->_11);
+ M.r[1] = _mm_load_ps(&pSource->_21);
+ M.r[2] = _mm_load_ps(&pSource->_31);
+ M.r[3] = g_XMIdentityR3;
+
+ // x.x,x.y,y.x,y.y
+ XMVECTOR vTemp1 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(1, 0, 1, 0));
+ // x.z,x.w,y.z,y.w
+ XMVECTOR vTemp3 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(3, 2, 3, 2));
+ // z.x,z.y,w.x,w.y
+ XMVECTOR vTemp2 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(1, 0, 1, 0));
+ // z.z,z.w,w.z,w.w
+ XMVECTOR vTemp4 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(3, 2, 3, 2));
+ XMMATRIX mResult;
+
+ // x.x,y.x,z.x,w.x
+ mResult.r[0] = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(2, 0, 2, 0));
+ // x.y,y.y,z.y,w.y
+ mResult.r[1] = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(3, 1, 3, 1));
+ // x.z,y.z,z.z,w.z
+ mResult.r[2] = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(2, 0, 2, 0));
+ // x.w,y.w,z.w,w.w
+ mResult.r[3] = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(3, 1, 3, 1));
+ return mResult;
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMMATRIX XM_CALLCONV XMLoadFloat4x4(const XMFLOAT4X4* pSource) noexcept
+{
+ assert(pSource);
+#if defined(_XM_NO_INTRINSICS_)
+
+ XMMATRIX M;
+ M.r[0].vector4_f32[0] = pSource->m[0][0];
+ M.r[0].vector4_f32[1] = pSource->m[0][1];
+ M.r[0].vector4_f32[2] = pSource->m[0][2];
+ M.r[0].vector4_f32[3] = pSource->m[0][3];
+
+ M.r[1].vector4_f32[0] = pSource->m[1][0];
+ M.r[1].vector4_f32[1] = pSource->m[1][1];
+ M.r[1].vector4_f32[2] = pSource->m[1][2];
+ M.r[1].vector4_f32[3] = pSource->m[1][3];
+
+ M.r[2].vector4_f32[0] = pSource->m[2][0];
+ M.r[2].vector4_f32[1] = pSource->m[2][1];
+ M.r[2].vector4_f32[2] = pSource->m[2][2];
+ M.r[2].vector4_f32[3] = pSource->m[2][3];
+
+ M.r[3].vector4_f32[0] = pSource->m[3][0];
+ M.r[3].vector4_f32[1] = pSource->m[3][1];
+ M.r[3].vector4_f32[2] = pSource->m[3][2];
+ M.r[3].vector4_f32[3] = pSource->m[3][3];
+ return M;
+
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ XMMATRIX M;
+ M.r[0] = vld1q_f32(reinterpret_cast(&pSource->_11));
+ M.r[1] = vld1q_f32(reinterpret_cast(&pSource->_21));
+ M.r[2] = vld1q_f32(reinterpret_cast(&pSource->_31));
+ M.r[3] = vld1q_f32(reinterpret_cast(&pSource->_41));
+ return M;
+#elif defined(_XM_SSE_INTRINSICS_)
+ XMMATRIX M;
+ M.r[0] = _mm_loadu_ps(&pSource->_11);
+ M.r[1] = _mm_loadu_ps(&pSource->_21);
+ M.r[2] = _mm_loadu_ps(&pSource->_31);
+ M.r[3] = _mm_loadu_ps(&pSource->_41);
+ return M;
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline XMMATRIX XM_CALLCONV XMLoadFloat4x4A(const XMFLOAT4X4A* pSource) noexcept
+{
+ assert(pSource);
+ assert((reinterpret_cast(pSource) & 0xF) == 0);
+#if defined(_XM_NO_INTRINSICS_)
+
+ XMMATRIX M;
+ M.r[0].vector4_f32[0] = pSource->m[0][0];
+ M.r[0].vector4_f32[1] = pSource->m[0][1];
+ M.r[0].vector4_f32[2] = pSource->m[0][2];
+ M.r[0].vector4_f32[3] = pSource->m[0][3];
+
+ M.r[1].vector4_f32[0] = pSource->m[1][0];
+ M.r[1].vector4_f32[1] = pSource->m[1][1];
+ M.r[1].vector4_f32[2] = pSource->m[1][2];
+ M.r[1].vector4_f32[3] = pSource->m[1][3];
+
+ M.r[2].vector4_f32[0] = pSource->m[2][0];
+ M.r[2].vector4_f32[1] = pSource->m[2][1];
+ M.r[2].vector4_f32[2] = pSource->m[2][2];
+ M.r[2].vector4_f32[3] = pSource->m[2][3];
+
+ M.r[3].vector4_f32[0] = pSource->m[3][0];
+ M.r[3].vector4_f32[1] = pSource->m[3][1];
+ M.r[3].vector4_f32[2] = pSource->m[3][2];
+ M.r[3].vector4_f32[3] = pSource->m[3][3];
+ return M;
+
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ XMMATRIX M;
+#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES)
+ M.r[0] = vld1q_f32_ex(reinterpret_cast(&pSource->_11), 128);
+ M.r[1] = vld1q_f32_ex(reinterpret_cast(&pSource->_21), 128);
+ M.r[2] = vld1q_f32_ex(reinterpret_cast(&pSource->_31), 128);
+ M.r[3] = vld1q_f32_ex(reinterpret_cast(&pSource->_41), 128);
+#else
+ M.r[0] = vld1q_f32(reinterpret_cast(&pSource->_11));
+ M.r[1] = vld1q_f32(reinterpret_cast(&pSource->_21));
+ M.r[2] = vld1q_f32(reinterpret_cast(&pSource->_31));
+ M.r[3] = vld1q_f32(reinterpret_cast(&pSource->_41));
+#endif
+ return M;
+#elif defined(_XM_SSE_INTRINSICS_)
+ XMMATRIX M;
+ M.r[0] = _mm_load_ps(&pSource->_11);
+ M.r[1] = _mm_load_ps(&pSource->_21);
+ M.r[2] = _mm_load_ps(&pSource->_31);
+ M.r[3] = _mm_load_ps(&pSource->_41);
+ return M;
+#endif
+}
+
+/****************************************************************************
+ *
+ * Vector and matrix store operations
+ *
+ ****************************************************************************/
+_Use_decl_annotations_
+inline void XM_CALLCONV XMStoreInt
+(
+ uint32_t* pDestination,
+ FXMVECTOR V
+) noexcept
+{
+ assert(pDestination);
+#if defined(_XM_NO_INTRINSICS_)
+ *pDestination = XMVectorGetIntX(V);
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ vst1q_lane_u32(pDestination, *reinterpret_cast(&V), 0);
+#elif defined(_XM_SSE_INTRINSICS_)
+ _mm_store_ss(reinterpret_cast(pDestination), V);
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline void XM_CALLCONV XMStoreFloat
+(
+ float* pDestination,
+ FXMVECTOR V
+) noexcept
+{
+ assert(pDestination);
+#if defined(_XM_NO_INTRINSICS_)
+ *pDestination = XMVectorGetX(V);
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ vst1q_lane_f32(pDestination, V, 0);
+#elif defined(_XM_SSE_INTRINSICS_)
+ _mm_store_ss(pDestination, V);
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline void XM_CALLCONV XMStoreInt2
+(
+ uint32_t* pDestination,
+ FXMVECTOR V
+) noexcept
+{
+ assert(pDestination);
+#if defined(_XM_NO_INTRINSICS_)
+ pDestination[0] = V.vector4_u32[0];
+ pDestination[1] = V.vector4_u32[1];
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ uint32x2_t VL = vget_low_u32(vreinterpretq_u32_f32(V));
+ vst1_u32(pDestination, VL);
+#elif defined(_XM_SSE_INTRINSICS_)
+ _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V));
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline void XM_CALLCONV XMStoreInt2A
+(
+ uint32_t* pDestination,
+ FXMVECTOR V
+) noexcept
+{
+ assert(pDestination);
+ assert((reinterpret_cast(pDestination) & 0xF) == 0);
+#if defined(_XM_NO_INTRINSICS_)
+ pDestination[0] = V.vector4_u32[0];
+ pDestination[1] = V.vector4_u32[1];
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ uint32x2_t VL = vget_low_u32(vreinterpretq_u32_f32(V));
+#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES)
+ vst1_u32_ex(pDestination, VL, 64);
+#else
+ vst1_u32(pDestination, VL);
+#endif
+#elif defined(_XM_SSE_INTRINSICS_)
+ _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V));
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline void XM_CALLCONV XMStoreFloat2
+(
+ XMFLOAT2* pDestination,
+ FXMVECTOR V
+) noexcept
+{
+ assert(pDestination);
+#if defined(_XM_NO_INTRINSICS_)
+ pDestination->x = V.vector4_f32[0];
+ pDestination->y = V.vector4_f32[1];
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ float32x2_t VL = vget_low_f32(V);
+ vst1_f32(reinterpret_cast(pDestination), VL);
+#elif defined(_XM_SSE_INTRINSICS_)
+ _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V));
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline void XM_CALLCONV XMStoreFloat2A
+(
+ XMFLOAT2A* pDestination,
+ FXMVECTOR V
+) noexcept
+{
+ assert(pDestination);
+ assert((reinterpret_cast(pDestination) & 0xF) == 0);
+#if defined(_XM_NO_INTRINSICS_)
+ pDestination->x = V.vector4_f32[0];
+ pDestination->y = V.vector4_f32[1];
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ float32x2_t VL = vget_low_f32(V);
+#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES)
+ vst1_f32_ex(reinterpret_cast(pDestination), VL, 64);
+#else
+ vst1_f32(reinterpret_cast(pDestination), VL);
+#endif
+#elif defined(_XM_SSE_INTRINSICS_)
+ _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V));
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline void XM_CALLCONV XMStoreSInt2
+(
+ XMINT2* pDestination,
+ FXMVECTOR V
+) noexcept
+{
+ assert(pDestination);
+#if defined(_XM_NO_INTRINSICS_)
+ pDestination->x = static_cast(V.vector4_f32[0]);
+ pDestination->y = static_cast(V.vector4_f32[1]);
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ float32x2_t v = vget_low_f32(V);
+ int32x2_t iv = vcvt_s32_f32(v);
+ vst1_s32(reinterpret_cast(pDestination), iv);
+#elif defined(_XM_SSE_INTRINSICS_)
+ // In case of positive overflow, detect it
+ XMVECTOR vOverflow = _mm_cmpgt_ps(V, g_XMMaxInt);
+ // Float to int conversion
+ __m128i vResulti = _mm_cvttps_epi32(V);
+ // If there was positive overflow, set to 0x7FFFFFFF
+ XMVECTOR vResult = _mm_and_ps(vOverflow, g_XMAbsMask);
+ vOverflow = _mm_andnot_ps(vOverflow, _mm_castsi128_ps(vResulti));
+ vOverflow = _mm_or_ps(vOverflow, vResult);
+ // Write two ints
+ _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(vOverflow));
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline void XM_CALLCONV XMStoreUInt2
+(
+ XMUINT2* pDestination,
+ FXMVECTOR V
+) noexcept
+{
+ assert(pDestination);
+#if defined(_XM_NO_INTRINSICS_)
+ pDestination->x = static_cast(V.vector4_f32[0]);
+ pDestination->y = static_cast(V.vector4_f32[1]);
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ float32x2_t v = vget_low_f32(V);
+ uint32x2_t iv = vcvt_u32_f32(v);
+ vst1_u32(reinterpret_cast(pDestination), iv);
+#elif defined(_XM_SSE_INTRINSICS_)
+ // Clamp to >=0
+ XMVECTOR vResult = _mm_max_ps(V, g_XMZero);
+ // Any numbers that are too big, set to 0xFFFFFFFFU
+ XMVECTOR vOverflow = _mm_cmpgt_ps(vResult, g_XMMaxUInt);
+ XMVECTOR vValue = g_XMUnsignedFix;
+ // Too large for a signed integer?
+ XMVECTOR vMask = _mm_cmpge_ps(vResult, vValue);
+ // Zero for number's lower than 0x80000000, 32768.0f*65536.0f otherwise
+ vValue = _mm_and_ps(vValue, vMask);
+ // Perform fixup only on numbers too large (Keeps low bit precision)
+ vResult = _mm_sub_ps(vResult, vValue);
+ __m128i vResulti = _mm_cvttps_epi32(vResult);
+ // Convert from signed to unsigned pnly if greater than 0x80000000
+ vMask = _mm_and_ps(vMask, g_XMNegativeZero);
+ vResult = _mm_xor_ps(_mm_castsi128_ps(vResulti), vMask);
+ // On those that are too large, set to 0xFFFFFFFF
+ vResult = _mm_or_ps(vResult, vOverflow);
+ // Write two uints
+ _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(vResult));
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline void XM_CALLCONV XMStoreInt3
+(
+ uint32_t* pDestination,
+ FXMVECTOR V
+) noexcept
+{
+ assert(pDestination);
+#if defined(_XM_NO_INTRINSICS_)
+ pDestination[0] = V.vector4_u32[0];
+ pDestination[1] = V.vector4_u32[1];
+ pDestination[2] = V.vector4_u32[2];
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ uint32x2_t VL = vget_low_u32(vreinterpretq_u32_f32(V));
+ vst1_u32(pDestination, VL);
+ vst1q_lane_u32(pDestination + 2, *reinterpret_cast(&V), 2);
+#elif defined(_XM_SSE_INTRINSICS_)
+ _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V));
+ __m128 z = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2));
+ _mm_store_ss(reinterpret_cast(&pDestination[2]), z);
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline void XM_CALLCONV XMStoreInt3A
+(
+ uint32_t* pDestination,
+ FXMVECTOR V
+) noexcept
+{
+ assert(pDestination);
+ assert((reinterpret_cast(pDestination) & 0xF) == 0);
+#if defined(_XM_NO_INTRINSICS_)
+ pDestination[0] = V.vector4_u32[0];
+ pDestination[1] = V.vector4_u32[1];
+ pDestination[2] = V.vector4_u32[2];
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ uint32x2_t VL = vget_low_u32(vreinterpretq_u32_f32(V));
+#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES)
+ vst1_u32_ex(pDestination, VL, 64);
+#else
+ vst1_u32(pDestination, VL);
+#endif
+ vst1q_lane_u32(pDestination + 2, *reinterpret_cast(&V), 2);
+#elif defined(_XM_SSE_INTRINSICS_)
+ _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V));
+ __m128 z = _mm_movehl_ps(V, V);
+ _mm_store_ss(reinterpret_cast(&pDestination[2]), z);
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline void XM_CALLCONV XMStoreFloat3
+(
+ XMFLOAT3* pDestination,
+ FXMVECTOR V
+) noexcept
+{
+ assert(pDestination);
+#if defined(_XM_NO_INTRINSICS_)
+ pDestination->x = V.vector4_f32[0];
+ pDestination->y = V.vector4_f32[1];
+ pDestination->z = V.vector4_f32[2];
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ float32x2_t VL = vget_low_f32(V);
+ vst1_f32(reinterpret_cast(pDestination), VL);
+ vst1q_lane_f32(reinterpret_cast(pDestination) + 2, V, 2);
+#elif defined(_XM_SSE4_INTRINSICS_)
+ * reinterpret_cast(&pDestination->x) = _mm_extract_ps(V, 0);
+ *reinterpret_cast(&pDestination->y) = _mm_extract_ps(V, 1);
+ *reinterpret_cast(&pDestination->z) = _mm_extract_ps(V, 2);
+#elif defined(_XM_SSE_INTRINSICS_)
+ _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V));
+ __m128 z = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2));
+ _mm_store_ss(&pDestination->z, z);
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline void XM_CALLCONV XMStoreFloat3A
+(
+ XMFLOAT3A* pDestination,
+ FXMVECTOR V
+) noexcept
+{
+ assert(pDestination);
+ assert((reinterpret_cast(pDestination) & 0xF) == 0);
+#if defined(_XM_NO_INTRINSICS_)
+ pDestination->x = V.vector4_f32[0];
+ pDestination->y = V.vector4_f32[1];
+ pDestination->z = V.vector4_f32[2];
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ float32x2_t VL = vget_low_f32(V);
+#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES)
+ vst1_f32_ex(reinterpret_cast(pDestination), VL, 64);
+#else
+ vst1_f32(reinterpret_cast(pDestination), VL);
+#endif
+ vst1q_lane_f32(reinterpret_cast(pDestination) + 2, V, 2);
+#elif defined(_XM_SSE4_INTRINSICS_)
+ _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V));
+ *reinterpret_cast(&pDestination->z) = _mm_extract_ps(V, 2);
+#elif defined(_XM_SSE_INTRINSICS_)
+ _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V));
+ __m128 z = _mm_movehl_ps(V, V);
+ _mm_store_ss(&pDestination->z, z);
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline void XM_CALLCONV XMStoreSInt3
+(
+ XMINT3* pDestination,
+ FXMVECTOR V
+) noexcept
+{
+ assert(pDestination);
+#if defined(_XM_NO_INTRINSICS_)
+ pDestination->x = static_cast(V.vector4_f32[0]);
+ pDestination->y = static_cast(V.vector4_f32[1]);
+ pDestination->z = static_cast(V.vector4_f32[2]);
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ int32x4_t v = vcvtq_s32_f32(V);
+ int32x2_t vL = vget_low_s32(v);
+ vst1_s32(reinterpret_cast(pDestination), vL);
+ vst1q_lane_s32(reinterpret_cast(pDestination) + 2, v, 2);
+#elif defined(_XM_SSE_INTRINSICS_)
+ // In case of positive overflow, detect it
+ XMVECTOR vOverflow = _mm_cmpgt_ps(V, g_XMMaxInt);
+ // Float to int conversion
+ __m128i vResulti = _mm_cvttps_epi32(V);
+ // If there was positive overflow, set to 0x7FFFFFFF
+ XMVECTOR vResult = _mm_and_ps(vOverflow, g_XMAbsMask);
+ vOverflow = _mm_andnot_ps(vOverflow, _mm_castsi128_ps(vResulti));
+ vOverflow = _mm_or_ps(vOverflow, vResult);
+ // Write 3 uints
+ _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(vOverflow));
+ __m128 z = XM_PERMUTE_PS(vOverflow, _MM_SHUFFLE(2, 2, 2, 2));
+ _mm_store_ss(reinterpret_cast(&pDestination->z), z);
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline void XM_CALLCONV XMStoreUInt3
+(
+ XMUINT3* pDestination,
+ FXMVECTOR V
+) noexcept
+{
+ assert(pDestination);
+#if defined(_XM_NO_INTRINSICS_)
+ pDestination->x = static_cast(V.vector4_f32[0]);
+ pDestination->y = static_cast(V.vector4_f32[1]);
+ pDestination->z = static_cast(V.vector4_f32[2]);
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ uint32x4_t v = vcvtq_u32_f32(V);
+ uint32x2_t vL = vget_low_u32(v);
+ vst1_u32(reinterpret_cast(pDestination), vL);
+ vst1q_lane_u32(reinterpret_cast(pDestination) + 2, v, 2);
+#elif defined(_XM_SSE_INTRINSICS_)
+ // Clamp to >=0
+ XMVECTOR vResult = _mm_max_ps(V, g_XMZero);
+ // Any numbers that are too big, set to 0xFFFFFFFFU
+ XMVECTOR vOverflow = _mm_cmpgt_ps(vResult, g_XMMaxUInt);
+ XMVECTOR vValue = g_XMUnsignedFix;
+ // Too large for a signed integer?
+ XMVECTOR vMask = _mm_cmpge_ps(vResult, vValue);
+ // Zero for number's lower than 0x80000000, 32768.0f*65536.0f otherwise
+ vValue = _mm_and_ps(vValue, vMask);
+ // Perform fixup only on numbers too large (Keeps low bit precision)
+ vResult = _mm_sub_ps(vResult, vValue);
+ __m128i vResulti = _mm_cvttps_epi32(vResult);
+ // Convert from signed to unsigned pnly if greater than 0x80000000
+ vMask = _mm_and_ps(vMask, g_XMNegativeZero);
+ vResult = _mm_xor_ps(_mm_castsi128_ps(vResulti), vMask);
+ // On those that are too large, set to 0xFFFFFFFF
+ vResult = _mm_or_ps(vResult, vOverflow);
+ // Write 3 uints
+ _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(vResult));
+ __m128 z = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(2, 2, 2, 2));
+ _mm_store_ss(reinterpret_cast(&pDestination->z), z);
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline void XM_CALLCONV XMStoreInt4
+(
+ uint32_t* pDestination,
+ FXMVECTOR V
+) noexcept
+{
+ assert(pDestination);
+#if defined(_XM_NO_INTRINSICS_)
+ pDestination[0] = V.vector4_u32[0];
+ pDestination[1] = V.vector4_u32[1];
+ pDestination[2] = V.vector4_u32[2];
+ pDestination[3] = V.vector4_u32[3];
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ vst1q_u32(pDestination, vreinterpretq_u32_f32(V));
+#elif defined(_XM_SSE_INTRINSICS_)
+ _mm_storeu_si128(reinterpret_cast<__m128i*>(pDestination), _mm_castps_si128(V));
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline void XM_CALLCONV XMStoreInt4A
+(
+ uint32_t* pDestination,
+ FXMVECTOR V
+) noexcept
+{
+ assert(pDestination);
+ assert((reinterpret_cast(pDestination) & 0xF) == 0);
+#if defined(_XM_NO_INTRINSICS_)
+ pDestination[0] = V.vector4_u32[0];
+ pDestination[1] = V.vector4_u32[1];
+ pDestination[2] = V.vector4_u32[2];
+ pDestination[3] = V.vector4_u32[3];
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES)
+ vst1q_u32_ex(pDestination, V, 128);
+#else
+ vst1q_u32(pDestination, vreinterpretq_u32_f32(V));
+#endif
+#elif defined(_XM_SSE_INTRINSICS_)
+ _mm_store_si128(reinterpret_cast<__m128i*>(pDestination), _mm_castps_si128(V));
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline void XM_CALLCONV XMStoreFloat4
+(
+ XMFLOAT4* pDestination,
+ FXMVECTOR V
+) noexcept
+{
+ assert(pDestination);
+#if defined(_XM_NO_INTRINSICS_)
+ pDestination->x = V.vector4_f32[0];
+ pDestination->y = V.vector4_f32[1];
+ pDestination->z = V.vector4_f32[2];
+ pDestination->w = V.vector4_f32[3];
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+ vst1q_f32(reinterpret_cast(pDestination), V);
+#elif defined(_XM_SSE_INTRINSICS_)
+ _mm_storeu_ps(&pDestination->x, V);
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline void XM_CALLCONV XMStoreFloat4A
+(
+ XMFLOAT4A* pDestination,
+ FXMVECTOR V
+) noexcept
+{
+ assert(pDestination);
+ assert((reinterpret_cast(pDestination) & 0xF) == 0);
+#if defined(_XM_NO_INTRINSICS_)
+ pDestination->x = V.vector4_f32[0];
+ pDestination->y = V.vector4_f32[1];
+ pDestination->z = V.vector4_f32[2];
+ pDestination->w = V.vector4_f32[3];
+#elif defined(_XM_ARM_NEON_INTRINSICS_)
+#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES)
+ vst1q_f32_ex(reinterpret_cast(pDestination), V, 128);
+#else
+ vst1q_f32(reinterpret_cast(pDestination), V);
+#endif
+#elif defined(_XM_SSE_INTRINSICS_)
+ _mm_store_ps(&pDestination->x, V);
+#endif
+}
+
+//------------------------------------------------------------------------------
+_Use_decl_annotations_
+inline void XM_CALLCONV XMStoreSInt4
+(
+ XMINT4* pDestination,
+ FXMVECTOR V
+) noexcept
+{
+ assert(pDestination);
+#if defined(_XM_NO_INTRINSICS_)
+ pDestination->x = static_cast(V.vector4_f32[0]);
+ pDestination->y = static_cast