From ed8c2dad9170d00b9c39a66346152e2ea3ea5fa5 Mon Sep 17 00:00:00 2001 From: Chuck Walbourn Date: Mon, 7 Sep 2026 14:41:30 -0700 Subject: [PATCH 1/7] Enable use of clang format --- .github/linters/.clang-format | 87 +++++++++++++++++ .github/linters/.editorconfig-checker.json | 5 +- .github/workflows/lint.yml | 5 +- XDSP/XDSP.h | 2 + build/Format.ps1 | 105 +++++++++++++++++++++ 5 files changed, 201 insertions(+), 3 deletions(-) create mode 100644 .github/linters/.clang-format create mode 100644 build/Format.ps1 diff --git a/.github/linters/.clang-format b/.github/linters/.clang-format new file mode 100644 index 00000000..842e0331 --- /dev/null +++ b/.github/linters/.clang-format @@ -0,0 +1,87 @@ +Language: Cpp +BasedOnStyle: LLVM +AccessModifierOffset: -4 +AlignAfterOpenBracket: false +AlignConsecutiveAssignments: + Enabled: true + AcrossEmptyLines: false + AcrossComments: false +AlignConsecutiveDeclarations: + Enabled: true + AcrossEmptyLines: false + AcrossComments: false +AlignEscapedNewlines: Left +AlignOperands: true +AlignConsecutiveShortCaseStatements: + Enabled: true + AcrossEmptyLines: true + AcrossComments: true + AlignCaseColons: false +AlignTrailingComments: + Kind: Always + OverEmptyLines: 2 +AllowAllArgumentsOnNextLine: false +AllowAllParametersOfDeclarationOnNextLine: false +AllowShortBlocksOnASingleLine: Empty +AllowShortCaseLabelsOnASingleLine: true +AllowShortFunctionsOnASingleLine: Inline +AllowShortIfStatementsOnASingleLine: Never +AllowShortLambdasOnASingleLine: Empty +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: true +BinPackArguments: false +BinPackParameters: false +BreakBeforeBraces: Custom +BraceWrapping: + AfterClass: true + AfterControlStatement: true + AfterEnum: true + AfterFunction: true + AfterNamespace: true + AfterStruct: true + AfterUnion: true + BeforeCatch: true + BeforeElse: true + BeforeLambdaBody: true + SplitEmptyFunction: false + SplitEmptyRecord: false +#requires clang-format 22 +#BreakAfterOpenBracketFunction: true +#BreakBeforeCloseBracketFunction: true +BreakBeforeBinaryOperators: All +BreakBeforeTernaryOperators: false +BreakConstructorInitializers: BeforeColon +BreakInheritanceList: BeforeColon +BreakTemplateDeclarations: Yes +ColumnLimit: 140 +ConstructorInitializerAllOnOneLineOrOnePerLine: true +Cpp11BracedListStyle: false +FixNamespaceComments: true +IndentCaseLabels: false +IndentExternBlock: Indent +IndentPPDirectives: None +IndentWidth: 4 +InsertNewlineAtEOF: true +LineEnding: CRLF +NamespaceIndentation: All +PackConstructorInitializers: Never +PointerAlignment: Left +ReflowComments: true +SortIncludes: false +SpaceAfterCStyleCast: false +#requires clang format 21 +#SpaceAfterOperatorKeyword: true +SpaceAfterTemplateKeyword: false +SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeParens: ControlStatements +SpaceInEmptyParentheses: false +SpacesInAngles: false +SpacesInCStyleCastParentheses: false +SpacesInContainerLiterals: false +SpacesInParentheses: false +Standard: c++17 +TabWidth: 4 +UseTab: Never diff --git a/.github/linters/.editorconfig-checker.json b/.github/linters/.editorconfig-checker.json index 078fa78e..5f3ecd6a 100644 --- a/.github/linters/.editorconfig-checker.json +++ b/.github/linters/.editorconfig-checker.json @@ -4,5 +4,8 @@ ".git", "LICENSE", "Tests" - ] + ], + "Disable": { + "IndentSize": true + } } diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index ef1f283e..cf9444c2 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -26,18 +26,19 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 - name: Lint Code Base - uses: super-linter/super-linter@4ce20838b8ab83717e78138c5b3a1407148e0918 # v8.7.0 + uses: super-linter/super-linter@4ce20838b8ab83717e78138c5b3a1407148e0918 # v8.7.0 env: DEFAULT_BRANCH: origin/main GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} IGNORE_GITIGNORED_FILES: true VALIDATE_ALL_CODEBASE: true VALIDATE_CHECKOV: true + VALIDATE_CLANG_FORMAT: true VALIDATE_EDITORCONFIG: true VALIDATE_GITHUB_ACTIONS: true VALIDATE_JSON: true diff --git a/XDSP/XDSP.h b/XDSP/XDSP.h index 4864813f..c9998bd2 100644 --- a/XDSP/XDSP.h +++ b/XDSP/XDSP.h @@ -525,6 +525,7 @@ namespace XDSP const size_t uLength = size_t(1) << (uLog2Length - 2); static const unsigned char cSwizzleTable[256] = { + // clang-format off 0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0, 0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0, 0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4, 0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4, 0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8, 0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8, @@ -541,6 +542,7 @@ namespace XDSP 0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7, 0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7, 0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB, 0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB, 0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF, 0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF + // clang-format on }; if ((uLog2Length & 1) == 0) { diff --git a/build/Format.ps1 b/build/Format.ps1 new file mode 100644 index 00000000..819eb5cd --- /dev/null +++ b/build/Format.ps1 @@ -0,0 +1,105 @@ +<# + +.NOTES +Copyright (c) Microsoft Corporation. +Licensed under the MIT License. + +.SYNOPSIS +Runs clang-format on the source code. + +.DESCRIPTION +This is use to clang-format the code using the rules in .github\linters\.clang-format. + +The clang-format version must match the version used by GitHub Super-Linter or false positives can be found. +You can install this version locally using: + +winget install --id=LLVM.LLVM --version 21.1.2 + +.PARAMETER Check +Runs clang-format without modifying the files in place. + +.PARAMETER LLVM +Normally clang-format is found on the path. If you use this switch, then it looks for it in C:\Program Files\LLVM\bin. + +.LINKS +https://github.com/microsoft/DirectXMath + +#> + +[CmdletBinding()] +param( + [switch] $Check, + [Alias('UseLLVM')] + [switch] $LLVM +) + +$ErrorActionPreference = 'Stop' + +$repoRoot = (Resolve-Path (Join-Path $PSScriptRoot '..')).Path +$configFile = Join-Path $repoRoot '.github\linters\.clang-format' + +if (-not (Test-Path -LiteralPath $configFile -PathType Leaf)) { + throw "clang-format configuration was not found: $configFile" +} + +$clangFormatPath = if ($LLVM) { + 'C:\Program Files\LLVM\bin\clang-format.exe' +} +else { + (Get-Command clang-format -ErrorAction SilentlyContinue).Source +} + +if (-not $clangFormatPath -or -not (Test-Path -LiteralPath $clangFormatPath -PathType Leaf)) { + if ($LLVM) { + throw "clang-format was not found at: $clangFormatPath" + } + + throw 'clang-format was not found on PATH.' +} + +# This has to match the version used by GitHub super-linter or results will not match. +$requiredClangFormatVersion = '21.1.2' +$clangFormatVersion = (& $clangFormatPath '--version' 2>&1 | Out-String).Trim() +if ($LASTEXITCODE -ne 0) { + throw "Unable to determine clang-format version." +} + +if ($clangFormatVersion -notmatch "\b$([regex]::Escape($requiredClangFormatVersion))\b") { + throw "clang-format version $requiredClangFormatVersion is required; found: $clangFormatVersion" +} + +$sourceFiles = Get-ChildItem -LiteralPath $repoRoot -Recurse| + Where-Object { + $_.FullName -notmatch '\\(?:\.git|\.vs|build|Tests|vcpkg_installed)\\' -and $_.Extension -in '.c','.cc','.cpp','.cxx','.h','.hh','.hpp','.inl' + } + +if ($sourceFiles.Count -eq 0) { + Write-Output 'No C/C++ source files found.' + exit 0 +} + +$arguments = @( + '--style=file:{0}' -f $configFile +) + +if ($Check) { + $arguments += '--dry-run' + $arguments += '--Werror' +} +else { + $arguments += '-i' +} + +foreach ($sourceFile in $sourceFiles) { + & $clangFormatPath @arguments $sourceFile.FullName + if ($LASTEXITCODE -ne 0) { + throw "clang-format failed for $($sourceFile.FullName)." + } +} + +if ($Check) { + Write-Output "Checked $($sourceFiles.Count) C/C++ source files." +} +else { + Write-Output "Formatted $($sourceFiles.Count) C/C++ source files." +} From 87817f74445d467015241df186439fef89361c82 Mon Sep 17 00:00:00 2001 From: Chuck Walbourn Date: Tue, 8 Sep 2026 10:55:56 -0700 Subject: [PATCH 2/7] Update readme --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 4252ea54..2e3d1d13 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,13 @@ FOR SECURITY ADVISORIES, see [GitHub](https://github.com/microsoft/DirectXMath/s For a full change history, see [CHANGELOG.md](https://github.com/microsoft/DirectXMath/blob/main/CHANGELOG.md). +* clang-format use for this project must match the version use by GitHub Super-Linter to pass the validation. VS 2022 and VS 2026 come with different versions, so to match use: + +```cmd +winget install --id=LLVM.LLVM --version 21.1.2 +powershell -File build/Format.ps1 -LLVM +``` + * The *directxmath* NuGet package is deprecated. The best way to integrate the latest DirectXMath into your C++ project is using [vcpkg](https://github.com/microsoft/vcpkg/tree/master/ports/directxmath). * The CMake projects require 3.21 or later. VS 2019 users will need to install a standalone version of CMake 3.21 or later and add it to their PATH. From 643475b2a9871e54222d5ba425f42e6d25597417 Mon Sep 17 00:00:00 2001 From: Chuck Walbourn Date: Mon, 14 Sep 2026 14:59:24 -0700 Subject: [PATCH 3/7] Script update --- build/Format.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/Format.ps1 b/build/Format.ps1 index 819eb5cd..f43730a1 100644 --- a/build/Format.ps1 +++ b/build/Format.ps1 @@ -70,7 +70,7 @@ if ($clangFormatVersion -notmatch "\b$([regex]::Escape($requiredClangFormatVersi $sourceFiles = Get-ChildItem -LiteralPath $repoRoot -Recurse| Where-Object { - $_.FullName -notmatch '\\(?:\.git|\.vs|build|Tests|vcpkg_installed)\\' -and $_.Extension -in '.c','.cc','.cpp','.cxx','.h','.hh','.hpp','.inl' + $_.FullName -notmatch '\\(?:\.git|\.vs|build|Tests|vcpkg_installed|wiki)\\' -and $_.Extension -in '.c','.cc','.cpp','.cxx','.h','.hh','.hpp','.inl' } if ($sourceFiles.Count -eq 0) { From 239abb84d0572c43b12c88f4ea8a0fa62d3d21a7 Mon Sep 17 00:00:00 2001 From: Chuck Walbourn Date: Mon, 21 Sep 2026 09:39:20 -0700 Subject: [PATCH 4/7] clang format off --- Inc/DirectXCollision.inl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Inc/DirectXCollision.inl b/Inc/DirectXCollision.inl index b5e6f55c..924a6eca 100644 --- a/Inc/DirectXCollision.inl +++ b/Inc/DirectXCollision.inl @@ -3323,9 +3323,11 @@ inline bool BoundingFrustum::Intersects(const BoundingSphere& sh) const noexcept // The Edges are: static const size_t edges[12][2] = { + // clang-format off { 0, 1 }, { 2, 3 }, { 0, 2 }, { 1, 3 }, // Near plane { 4, 5 }, { 6, 7 }, { 4, 6 }, { 5, 7 }, // Far plane { 0, 4 }, { 1, 5 }, { 2, 6 }, { 3, 7 }, + // clang-format on }; // Near to far XMVECTOR RadiusSq = XMVectorMultiply(vRadius, vRadius); From 4959d0679946c0b9a12396cba9065f3667bc6c60 Mon Sep 17 00:00:00 2001 From: Chuck Walbourn Date: Mon, 21 Sep 2026 09:40:08 -0700 Subject: [PATCH 5/7] Reformat --- Extensions/DirectXMathAVX.h | 181 +- Extensions/DirectXMathAVX2.h | 600 +-- Extensions/DirectXMathBE.h | 45 +- Extensions/DirectXMathF16C.h | 88 +- Extensions/DirectXMathFMA3.h | 345 +- Extensions/DirectXMathFMA4.h | 357 +- Extensions/DirectXMathSSE3.h | 38 +- Extensions/DirectXMathSSE4.h | 73 +- Inc/DirectXCollision.h | 317 +- Inc/DirectXCollision.inl | 1891 ++++---- Inc/DirectXColors.h | 561 ++- Inc/DirectXMath.h | 3021 ++++++++----- Inc/DirectXMathConvert.inl | 529 +-- Inc/DirectXMathMatrix.inl | 1588 +++---- Inc/DirectXMathMisc.inl | 940 ++-- Inc/DirectXMathVector.inl | 6852 ++++++++++++----------------- Inc/DirectXPackedVector.h | 1197 +++-- Inc/DirectXPackedVector.inl | 2028 ++++----- MatrixStack/DirectXMatrixStack.h | 89 +- SHMath/DirectXSH.cpp | 5733 ++++++++++++------------ SHMath/DirectXSH.h | 126 +- SHMath/DirectXSHD3D11.cpp | 212 +- SHMath/DirectXSHD3D12.cpp | 203 +- Stereo3D/Stereo3DMatrixHelper.cpp | 122 +- Stereo3D/Stereo3DMatrixHelper.h | 18 +- XDSP/XDSP.h | 226 +- 26 files changed, 13172 insertions(+), 14208 deletions(-) diff --git a/Extensions/DirectXMathAVX.h b/Extensions/DirectXMathAVX.h index 964a9a48..174735fb 100644 --- a/Extensions/DirectXMathAVX.h +++ b/Extensions/DirectXMathAVX.h @@ -28,31 +28,30 @@ namespace DirectX // See https://msdn.microsoft.com/en-us/library/hskdteyh.aspx int CPUInfo[4] = { -1 }; - #if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) +#if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) __cpuid(0, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]); - #else +#else __cpuid(CPUInfo, 0); - #endif +#endif if (CPUInfo[0] < 1) return false; - #if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) +#if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) __cpuid(1, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]); - #else +#else __cpuid(CPUInfo, 1); - #endif +#endif // We check for AVX, OSXSAVE, SSSE4.1, and SSE3 return ((CPUInfo[2] & 0x18080001) == 0x18080001); } - //------------------------------------------------------------------------------------- // Vector //------------------------------------------------------------------------------------- - inline XMVECTOR XM_CALLCONV XMVectorReplicatePtr(_In_ const float *pValue) + inline XMVECTOR XM_CALLCONV XMVectorReplicatePtr(_In_ const float* pValue) { return _mm_broadcast_ss(pValue); } @@ -82,23 +81,24 @@ namespace DirectX assert((E0 < 4) && (E1 < 4) && (E2 < 4) && (E3 < 4)); _Analysis_assume_((E0 < 4) && (E1 < 4) && (E2 < 4) && (E3 < 4)); - unsigned int elem[4] = { E0, E1, E2, E3 }; - __m128i vControl = _mm_loadu_si128(reinterpret_cast(&elem[0])); + unsigned int elem[4] = { E0, E1, E2, E3 }; + __m128i vControl = _mm_loadu_si128(reinterpret_cast(&elem[0])); return _mm_permutevar_ps(V, vControl); } - inline XMVECTOR XM_CALLCONV XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2, uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW) + inline XMVECTOR XM_CALLCONV + XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2, uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW) { assert(PermuteX <= 7 && PermuteY <= 7 && PermuteZ <= 7 && PermuteW <= 7); _Analysis_assume_(PermuteX <= 7 && PermuteY <= 7 && PermuteZ <= 7 && PermuteW <= 7); static const XMVECTORU32 three = { { { 3, 3, 3, 3 } } }; - XM_ALIGNED_DATA(16) unsigned int elem[4] = { PermuteX, PermuteY, PermuteZ, PermuteW }; - __m128i vControl = _mm_load_si128(reinterpret_cast(&elem[0])); + XM_ALIGNED_DATA(16) unsigned int elem[4] = { PermuteX, PermuteY, PermuteZ, PermuteW }; + __m128i vControl = _mm_load_si128(reinterpret_cast(&elem[0])); __m128i vSelect = _mm_cmpgt_epi32(vControl, three); - vControl = _mm_castps_si128(_mm_and_ps(_mm_castsi128_ps(vControl), three)); + vControl = _mm_castps_si128(_mm_and_ps(_mm_castsi128_ps(vControl), three)); __m128 shuffled1 = _mm_permutevar_ps(V1, vControl); __m128 shuffled2 = _mm_permutevar_ps(V2, vControl); @@ -113,7 +113,7 @@ namespace DirectX { assert(Elements < 4); _Analysis_assume_(Elements < 4); - return AVX::XMVectorPermute(V1, V2, Elements, ((Elements)+ 1), ((Elements)+ 2), ((Elements)+ 3)); + return AVX::XMVectorPermute(V1, V2, Elements, ((Elements) + 1), ((Elements) + 2), ((Elements) + 3)); } inline XMVECTOR XM_CALLCONV XMVectorRotateLeft(FXMVECTOR V, uint32_t Elements) @@ -130,7 +130,6 @@ namespace DirectX return AVX::XMVectorSwizzle(V, (4 - (Elements)) & 3, (5 - (Elements)) & 3, (6 - (Elements)) & 3, (7 - (Elements)) & 3); } - //------------------------------------------------------------------------------------- // Permute Templates //------------------------------------------------------------------------------------- @@ -138,12 +137,12 @@ namespace DirectX namespace MathInternal { // Slow path fallback for permutes that do not map to a single SSE opcode. - template struct PermuteHelper + template + struct PermuteHelper { static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) { - static const XMVECTORU32 selectMask = - { { { + static const XMVECTORU32 selectMask = { { { WhichX ? 0xFFFFFFFF : 0, WhichY ? 0xFFFFFFFF : 0, WhichZ ? 0xFFFFFFFF : 0, @@ -161,29 +160,41 @@ namespace DirectX }; // Fast path for permutes that only read from the first vector. - template struct PermuteHelper + template + struct PermuteHelper { - static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) { (v2); return _mm_permute_ps(v1, Shuffle); } + static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) + { + (v2); + return _mm_permute_ps(v1, Shuffle); + } }; // Fast path for permutes that only read from the second vector. - template struct PermuteHelper + template + struct PermuteHelper { - static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) { (v1); return _mm_permute_ps(v2, Shuffle); } + static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) + { + (v1); + return _mm_permute_ps(v2, Shuffle); + } }; // Fast path for permutes that read XY from the first vector, ZW from the second. - template struct PermuteHelper + template + struct PermuteHelper { static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) { 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 + template + struct PermuteHelper { static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) { return _mm_shuffle_ps(v2, v1, Shuffle); } }; - }; + }; // namespace MathInternal // General permute template template @@ -205,23 +216,86 @@ namespace DirectX } // Special-case permute templates - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 2, 3>(FXMVECTOR V1, FXMVECTOR) { return V1; } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 5, 6, 7>(FXMVECTOR, FXMVECTOR V2) { return V2; } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 2, 3>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0x1); } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 2, 3>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0x2); } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 5, 2, 3>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0x3); } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 6, 3>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0x4); } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 6, 3>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0x5); } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 6, 3>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0x6); } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 5, 6, 3>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0x7); } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 2, 7>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0x8); } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 2, 7>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0x9); } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 2, 7>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0xA); } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 5, 2, 7>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0xB); } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 6, 7>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0xC); } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 6, 7>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0xD); } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 6, 7>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0xE); } - + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 2, 3>(FXMVECTOR V1, FXMVECTOR) + { + return V1; + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 5, 6, 7>(FXMVECTOR, FXMVECTOR V2) + { + return V2; + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 2, 3>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0x1); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 2, 3>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0x2); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 5, 2, 3>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0x3); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 6, 3>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0x4); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 6, 3>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0x5); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 6, 3>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0x6); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 5, 6, 3>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0x7); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 2, 7>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0x8); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 2, 7>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0x9); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 2, 7>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0xA); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 5, 2, 7>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0xB); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 6, 7>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0xC); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 6, 7>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0xD); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 6, 7>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0xE); + } //------------------------------------------------------------------------------------- // Swizzle Templates @@ -240,10 +314,21 @@ namespace DirectX } // Specialized swizzles - template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 1, 2, 3>(FXMVECTOR V) { return V; } - template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 0, 2, 2>(FXMVECTOR V) { return _mm_moveldup_ps(V); } - template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 1, 3, 3>(FXMVECTOR V) { return _mm_movehdup_ps(V); } - + template<> + inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 1, 2, 3>(FXMVECTOR V) + { + return V; + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 0, 2, 2>(FXMVECTOR V) + { + return _mm_moveldup_ps(V); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 1, 3, 3>(FXMVECTOR V) + { + return _mm_movehdup_ps(V); + } //------------------------------------------------------------------------------------- // Other Templates @@ -272,4 +357,4 @@ namespace DirectX } // namespace AVX -} // namespace DirectX; +} // namespace DirectX diff --git a/Extensions/DirectXMathAVX2.h b/Extensions/DirectXMathAVX2.h index 3ee88065..7b14e1bb 100644 --- a/Extensions/DirectXMathAVX2.h +++ b/Extensions/DirectXMathAVX2.h @@ -29,40 +29,39 @@ namespace DirectX // See https://msdn.microsoft.com/en-us/library/hskdteyh.aspx int CPUInfo[4] = { -1 }; - #if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) +#if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) __cpuid(0, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]); - #else +#else __cpuid(CPUInfo, 0); - #endif +#endif if (CPUInfo[0] < 7) return false; - #if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) +#if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) __cpuid(1, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]); - #else +#else __cpuid(CPUInfo, 1); - #endif +#endif // We check for F16C, FMA3, AVX, OSXSAVE, SSSE4.1, and SSE3 if ((CPUInfo[2] & 0x38081001) != 0x38081001) return false; - #if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) +#if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) __cpuid_count(7, 0, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]); - #else +#else __cpuidex(CPUInfo, 7, 0); - #endif +#endif return ((CPUInfo[1] & 0x20) == 0x20); } - //------------------------------------------------------------------------------------- // Vector //------------------------------------------------------------------------------------- - inline XMVECTOR XM_CALLCONV XMVectorReplicatePtr(_In_ const float *pValue) + inline XMVECTOR XM_CALLCONV XMVectorReplicatePtr(_In_ const float* pValue) { return _mm_broadcast_ss(pValue); } @@ -87,22 +86,12 @@ namespace DirectX return _mm_permute_ps(V, _MM_SHUFFLE(3, 3, 3, 3)); } - inline XMVECTOR XM_CALLCONV XMVectorMultiplyAdd - ( - FXMVECTOR V1, - FXMVECTOR V2, - FXMVECTOR V3 - ) + inline XMVECTOR XM_CALLCONV XMVectorMultiplyAdd(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR V3) { return _mm_fmadd_ps(V1, V2, V3); } - inline XMVECTOR XM_CALLCONV XMVectorNegativeMultiplySubtract - ( - FXMVECTOR V1, - FXMVECTOR V2, - FXMVECTOR V3 - ) + inline XMVECTOR XM_CALLCONV XMVectorNegativeMultiplySubtract(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR V3) { return _mm_fnmadd_ps(V1, V2, V3); } @@ -112,23 +101,24 @@ namespace DirectX assert((E0 < 4) && (E1 < 4) && (E2 < 4) && (E3 < 4)); _Analysis_assume_((E0 < 4) && (E1 < 4) && (E2 < 4) && (E3 < 4)); - unsigned int elem[4] = { E0, E1, E2, E3 }; - __m128i vControl = _mm_loadu_si128(reinterpret_cast(&elem[0])); + unsigned int elem[4] = { E0, E1, E2, E3 }; + __m128i vControl = _mm_loadu_si128(reinterpret_cast(&elem[0])); return _mm_permutevar_ps(V, vControl); } - inline XMVECTOR XM_CALLCONV XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2, uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW) + inline XMVECTOR XM_CALLCONV + XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2, uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW) { assert(PermuteX <= 7 && PermuteY <= 7 && PermuteZ <= 7 && PermuteW <= 7); _Analysis_assume_(PermuteX <= 7 && PermuteY <= 7 && PermuteZ <= 7 && PermuteW <= 7); static const XMVECTORU32 three = { { { 3, 3, 3, 3 } } }; - XM_ALIGNED_DATA(16) unsigned int elem[4] = { PermuteX, PermuteY, PermuteZ, PermuteW }; - __m128i vControl = _mm_load_si128(reinterpret_cast(&elem[0])); + XM_ALIGNED_DATA(16) unsigned int elem[4] = { PermuteX, PermuteY, PermuteZ, PermuteW }; + __m128i vControl = _mm_load_si128(reinterpret_cast(&elem[0])); __m128i vSelect = _mm_cmpgt_epi32(vControl, three); - vControl = _mm_castps_si128(_mm_and_ps(_mm_castsi128_ps(vControl), three)); + vControl = _mm_castps_si128(_mm_and_ps(_mm_castsi128_ps(vControl), three)); __m128 shuffled1 = _mm_permutevar_ps(V1, vControl); __m128 shuffled2 = _mm_permutevar_ps(V2, vControl); @@ -143,7 +133,7 @@ namespace DirectX { assert(Elements < 4); _Analysis_assume_(Elements < 4); - return AVX2::XMVectorPermute(V1, V2, Elements, ((Elements)+ 1), ((Elements)+ 2), ((Elements)+ 3)); + return AVX2::XMVectorPermute(V1, V2, Elements, ((Elements) + 1), ((Elements) + 2), ((Elements) + 3)); } inline XMVECTOR XM_CALLCONV XMVectorRotateLeft(FXMVECTOR V, uint32_t Elements) @@ -160,128 +150,99 @@ namespace DirectX return AVX2::XMVectorSwizzle(V, (4 - (Elements)) & 3, (5 - (Elements)) & 3, (6 - (Elements)) & 3, (7 - (Elements)) & 3); } - //------------------------------------------------------------------------------------- // Vector2 //------------------------------------------------------------------------------------- - inline XMVECTOR XM_CALLCONV XMVector2Transform - ( - FXMVECTOR V, - CXMMATRIX M - ) + inline XMVECTOR XM_CALLCONV XMVector2Transform(FXMVECTOR V, CXMMATRIX M) { XMVECTOR vResult = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = _mm_fmadd_ps(vResult, M.r[1], M.r[3]); - XMVECTOR vTemp = _mm_broadcastss_ps(V); // X - vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); + vResult = _mm_fmadd_ps(vResult, M.r[1], M.r[3]); + XMVECTOR vTemp = _mm_broadcastss_ps(V); // X + vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); return vResult; } - inline XMVECTOR XM_CALLCONV XMVector2TransformCoord - ( - FXMVECTOR V, - CXMMATRIX M - ) + inline XMVECTOR XM_CALLCONV XMVector2TransformCoord(FXMVECTOR V, CXMMATRIX M) { XMVECTOR vResult = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = _mm_fmadd_ps(vResult, M.r[1], M.r[3]); - XMVECTOR vTemp = _mm_broadcastss_ps(V); // X - vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); - XMVECTOR W = _mm_permute_ps(vResult, _MM_SHUFFLE(3, 3, 3, 3)); - vResult = _mm_div_ps(vResult, W); + vResult = _mm_fmadd_ps(vResult, M.r[1], M.r[3]); + XMVECTOR vTemp = _mm_broadcastss_ps(V); // X + vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); + XMVECTOR W = _mm_permute_ps(vResult, _MM_SHUFFLE(3, 3, 3, 3)); + vResult = _mm_div_ps(vResult, W); return vResult; } - inline XMVECTOR XM_CALLCONV XMVector2TransformNormal - ( - FXMVECTOR V, - CXMMATRIX M - ) + inline XMVECTOR XM_CALLCONV XMVector2TransformNormal(FXMVECTOR V, CXMMATRIX M) { XMVECTOR vResult = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = _mm_mul_ps(vResult, M.r[1]); - XMVECTOR vTemp = _mm_broadcastss_ps(V); // X - vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); + vResult = _mm_mul_ps(vResult, M.r[1]); + XMVECTOR vTemp = _mm_broadcastss_ps(V); // X + vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); return vResult; } - //------------------------------------------------------------------------------------- // Vector3 //------------------------------------------------------------------------------------- - inline XMVECTOR XM_CALLCONV XMVector3Transform - ( - FXMVECTOR V, - CXMMATRIX M - ) + inline XMVECTOR XM_CALLCONV XMVector3Transform(FXMVECTOR V, CXMMATRIX M) { XMVECTOR vResult = _mm_permute_ps(V, _MM_SHUFFLE(2, 2, 2, 2)); // Z - vResult = _mm_fmadd_ps(vResult, M.r[2], M.r[3]); - XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = _mm_fmadd_ps(vTemp, M.r[1], vResult); - vTemp = _mm_broadcastss_ps(V); // X - vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); + vResult = _mm_fmadd_ps(vResult, M.r[2], M.r[3]); + XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y + vResult = _mm_fmadd_ps(vTemp, M.r[1], vResult); + vTemp = _mm_broadcastss_ps(V); // X + vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); return vResult; } - inline XMVECTOR XM_CALLCONV XMVector3TransformCoord - ( - FXMVECTOR V, - CXMMATRIX M - ) + inline XMVECTOR XM_CALLCONV XMVector3TransformCoord(FXMVECTOR V, CXMMATRIX M) { XMVECTOR vResult = _mm_permute_ps(V, _MM_SHUFFLE(2, 2, 2, 2)); // Z - vResult = _mm_fmadd_ps(vResult, M.r[2], M.r[3]); - XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = _mm_fmadd_ps(vTemp, M.r[1], vResult); - vTemp = _mm_broadcastss_ps(V); // X - vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); - XMVECTOR W = _mm_permute_ps(vResult, _MM_SHUFFLE(3, 3, 3, 3)); - vResult = _mm_div_ps(vResult, W); + vResult = _mm_fmadd_ps(vResult, M.r[2], M.r[3]); + XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y + vResult = _mm_fmadd_ps(vTemp, M.r[1], vResult); + vTemp = _mm_broadcastss_ps(V); // X + vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); + XMVECTOR W = _mm_permute_ps(vResult, _MM_SHUFFLE(3, 3, 3, 3)); + vResult = _mm_div_ps(vResult, W); return vResult; } - inline XMVECTOR XM_CALLCONV XMVector3TransformNormal - ( - FXMVECTOR V, - CXMMATRIX M - ) + inline XMVECTOR XM_CALLCONV XMVector3TransformNormal(FXMVECTOR V, CXMMATRIX M) { XMVECTOR vResult = _mm_permute_ps(V, _MM_SHUFFLE(2, 2, 2, 2)); // Z - vResult = _mm_mul_ps(vResult, M.r[2]); - XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = _mm_fmadd_ps(vTemp, M.r[1], vResult); - vTemp = _mm_broadcastss_ps(V); // X - vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); + vResult = _mm_mul_ps(vResult, M.r[2]); + XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y + vResult = _mm_fmadd_ps(vTemp, M.r[1], vResult); + vTemp = _mm_broadcastss_ps(V); // X + vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); return vResult; } XMMATRIX XM_CALLCONV XMMatrixMultiply(CXMMATRIX M1, CXMMATRIX M2); - inline XMVECTOR XM_CALLCONV XMVector3Project - ( - FXMVECTOR V, - float ViewportX, - float ViewportY, - float ViewportWidth, - float ViewportHeight, - float ViewportMinZ, - float ViewportMaxZ, - CXMMATRIX Projection, - CXMMATRIX View, - CXMMATRIX World - ) + inline XMVECTOR XM_CALLCONV XMVector3Project(FXMVECTOR V, + float ViewportX, + float ViewportY, + float ViewportWidth, + float ViewportHeight, + float ViewportMinZ, + float ViewportMaxZ, + CXMMATRIX Projection, + CXMMATRIX View, + CXMMATRIX World) { - const float HalfViewportWidth = ViewportWidth * 0.5f; + const float HalfViewportWidth = ViewportWidth * 0.5f; const float HalfViewportHeight = ViewportHeight * 0.5f; - XMVECTOR Scale = XMVectorSet(HalfViewportWidth, -HalfViewportHeight, ViewportMaxZ - ViewportMinZ, 0.0f); + XMVECTOR Scale = XMVectorSet(HalfViewportWidth, -HalfViewportHeight, ViewportMaxZ - ViewportMinZ, 0.0f); XMVECTOR Offset = XMVectorSet(ViewportX + HalfViewportWidth, ViewportY + HalfViewportHeight, ViewportMinZ, 0.0f); XMMATRIX Transform = AVX2::XMMatrixMultiply(World, View); - Transform = AVX2::XMMatrixMultiply(Transform, Projection); + Transform = AVX2::XMMatrixMultiply(Transform, Projection); XMVECTOR Result = AVX2::XMVector3TransformCoord(V, Transform); @@ -290,69 +251,56 @@ namespace DirectX return Result; } - inline XMVECTOR XM_CALLCONV XMVector3Unproject - ( - FXMVECTOR V, - float ViewportX, - float ViewportY, - float ViewportWidth, - float ViewportHeight, - float ViewportMinZ, - float ViewportMaxZ, - CXMMATRIX Projection, - CXMMATRIX View, - CXMMATRIX World - ) + inline XMVECTOR XM_CALLCONV XMVector3Unproject(FXMVECTOR V, + float ViewportX, + float ViewportY, + float ViewportWidth, + float ViewportHeight, + float ViewportMinZ, + float ViewportMaxZ, + CXMMATRIX Projection, + CXMMATRIX View, + CXMMATRIX World) { static const XMVECTORF32 D = { { { -1.0f, 1.0f, 0.0f, 0.0f } } }; XMVECTOR Scale = XMVectorSet(ViewportWidth * 0.5f, -ViewportHeight * 0.5f, ViewportMaxZ - ViewportMinZ, 1.0f); - Scale = XMVectorReciprocal(Scale); + Scale = XMVectorReciprocal(Scale); XMVECTOR Offset = XMVectorSet(-ViewportX, -ViewportY, -ViewportMinZ, 0.0f); - Offset = AVX2::XMVectorMultiplyAdd(Scale, Offset, D.v); + Offset = AVX2::XMVectorMultiplyAdd(Scale, Offset, D.v); XMMATRIX Transform = AVX2::XMMatrixMultiply(World, View); - Transform = AVX2::XMMatrixMultiply(Transform, Projection); - Transform = XMMatrixInverse(nullptr, Transform); + Transform = AVX2::XMMatrixMultiply(Transform, Projection); + Transform = XMMatrixInverse(nullptr, Transform); XMVECTOR Result = AVX2::XMVectorMultiplyAdd(V, Scale, Offset); return AVX2::XMVector3TransformCoord(Result, Transform); } - //------------------------------------------------------------------------------------- // Vector4 //------------------------------------------------------------------------------------- - inline XMVECTOR XM_CALLCONV XMVector4Transform - ( - FXMVECTOR V, - CXMMATRIX M - ) + inline XMVECTOR XM_CALLCONV XMVector4Transform(FXMVECTOR V, CXMMATRIX M) { XMVECTOR vResult = _mm_permute_ps(V, _MM_SHUFFLE(3, 3, 3, 3)); // W - vResult = _mm_mul_ps(vResult, M.r[3]); - XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(2, 2, 2, 2)); // Z - vResult = _mm_fmadd_ps(vTemp, M.r[2], vResult); - vTemp = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = _mm_fmadd_ps(vTemp, M.r[1], vResult); - vTemp = _mm_broadcastss_ps(V); // X - vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); + vResult = _mm_mul_ps(vResult, M.r[3]); + XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(2, 2, 2, 2)); // Z + vResult = _mm_fmadd_ps(vTemp, M.r[2], vResult); + vTemp = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y + vResult = _mm_fmadd_ps(vTemp, M.r[1], vResult); + vTemp = _mm_broadcastss_ps(V); // X + vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); return vResult; } - //------------------------------------------------------------------------------------- // Matrix //------------------------------------------------------------------------------------- - inline XMMATRIX XM_CALLCONV XMMatrixMultiply - ( - CXMMATRIX M1, - CXMMATRIX M2 - ) + inline XMMATRIX XM_CALLCONV XMMatrixMultiply(CXMMATRIX M1, CXMMATRIX M2) { XMMATRIX mResult; // Use vW to hold the original row @@ -361,52 +309,48 @@ namespace DirectX XMVECTOR vX = _mm_broadcastss_ps(vW); XMVECTOR vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); + vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); // Perform the operation on the first row - vX = _mm_mul_ps(vX, M2.r[0]); - vX = _mm_fmadd_ps(vY, M2.r[1], vX); - vX = _mm_fmadd_ps(vZ, M2.r[2], vX); - vX = _mm_fmadd_ps(vW, M2.r[3], vX); + vX = _mm_mul_ps(vX, M2.r[0]); + vX = _mm_fmadd_ps(vY, M2.r[1], vX); + vX = _mm_fmadd_ps(vZ, M2.r[2], vX); + vX = _mm_fmadd_ps(vW, M2.r[3], vX); mResult.r[0] = vX; // Repeat for the other 3 rows - vW = M1.r[1]; - vX = _mm_broadcastss_ps(vW); - vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); - vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); - vX = _mm_mul_ps(vX, M2.r[0]); - vX = _mm_fmadd_ps(vY, M2.r[1], vX); - vX = _mm_fmadd_ps(vZ, M2.r[2], vX); - vX = _mm_fmadd_ps(vW, M2.r[3], vX); + vW = M1.r[1]; + vX = _mm_broadcastss_ps(vW); + vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); + vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); + vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); + vX = _mm_mul_ps(vX, M2.r[0]); + vX = _mm_fmadd_ps(vY, M2.r[1], vX); + vX = _mm_fmadd_ps(vZ, M2.r[2], vX); + vX = _mm_fmadd_ps(vW, M2.r[3], vX); mResult.r[1] = vX; - vW = M1.r[2]; - vX = _mm_broadcastss_ps(vW); - vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); - vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); - vX = _mm_mul_ps(vX, M2.r[0]); - vX = _mm_fmadd_ps(vY, M2.r[1], vX); - vX = _mm_fmadd_ps(vZ, M2.r[2], vX); - vX = _mm_fmadd_ps(vW, M2.r[3], vX); + vW = M1.r[2]; + vX = _mm_broadcastss_ps(vW); + vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); + vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); + vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); + vX = _mm_mul_ps(vX, M2.r[0]); + vX = _mm_fmadd_ps(vY, M2.r[1], vX); + vX = _mm_fmadd_ps(vZ, M2.r[2], vX); + vX = _mm_fmadd_ps(vW, M2.r[3], vX); mResult.r[2] = vX; - vW = M1.r[3]; - vX = _mm_broadcastss_ps(vW); - vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); - vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); - vX = _mm_mul_ps(vX, M2.r[0]); - vX = _mm_fmadd_ps(vY, M2.r[1], vX); - vX = _mm_fmadd_ps(vZ, M2.r[2], vX); - vX = _mm_fmadd_ps(vW, M2.r[3], vX); + vW = M1.r[3]; + vX = _mm_broadcastss_ps(vW); + vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); + vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); + vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); + vX = _mm_mul_ps(vX, M2.r[0]); + vX = _mm_fmadd_ps(vY, M2.r[1], vX); + vX = _mm_fmadd_ps(vZ, M2.r[2], vX); + vX = _mm_fmadd_ps(vW, M2.r[3], vX); mResult.r[3] = vX; return mResult; } - inline XMMATRIX XM_CALLCONV XMMatrixMultiplyTranspose - ( - FXMMATRIX M1, - CXMMATRIX M2 - ) + inline XMMATRIX XM_CALLCONV XMMatrixMultiplyTranspose(FXMMATRIX M1, CXMMATRIX M2) { // Use vW to hold the original row XMVECTOR vW = M1.r[0]; @@ -414,43 +358,43 @@ namespace DirectX XMVECTOR vX = _mm_broadcastss_ps(vW); XMVECTOR vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); + vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); // Perform the operation on the first row - vX = _mm_mul_ps(vX, M2.r[0]); - vX = _mm_fmadd_ps(vY, M2.r[1], vX); - vX = _mm_fmadd_ps(vZ, M2.r[2], vX); - vX = _mm_fmadd_ps(vW, M2.r[3], vX); + vX = _mm_mul_ps(vX, M2.r[0]); + vX = _mm_fmadd_ps(vY, M2.r[1], vX); + vX = _mm_fmadd_ps(vZ, M2.r[2], vX); + vX = _mm_fmadd_ps(vW, M2.r[3], vX); __m128 r0 = vX; // Repeat for the other 3 rows - vW = M1.r[1]; - vX = _mm_broadcastss_ps(vW); - vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); - vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); - vX = _mm_mul_ps(vX, M2.r[0]); - vX = _mm_fmadd_ps(vY, M2.r[1], vX); - vX = _mm_fmadd_ps(vZ, M2.r[2], vX); - vX = _mm_fmadd_ps(vW, M2.r[3], vX); + vW = M1.r[1]; + vX = _mm_broadcastss_ps(vW); + vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); + vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); + vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); + vX = _mm_mul_ps(vX, M2.r[0]); + vX = _mm_fmadd_ps(vY, M2.r[1], vX); + vX = _mm_fmadd_ps(vZ, M2.r[2], vX); + vX = _mm_fmadd_ps(vW, M2.r[3], vX); __m128 r1 = vX; - vW = M1.r[2]; - vX = _mm_broadcastss_ps(vW); - vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); - vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); - vX = _mm_mul_ps(vX, M2.r[0]); - vX = _mm_fmadd_ps(vY, M2.r[1], vX); - vX = _mm_fmadd_ps(vZ, M2.r[2], vX); - vX = _mm_fmadd_ps(vW, M2.r[3], vX); + vW = M1.r[2]; + vX = _mm_broadcastss_ps(vW); + vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); + vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); + vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); + vX = _mm_mul_ps(vX, M2.r[0]); + vX = _mm_fmadd_ps(vY, M2.r[1], vX); + vX = _mm_fmadd_ps(vZ, M2.r[2], vX); + vX = _mm_fmadd_ps(vW, M2.r[3], vX); __m128 r2 = vX; - vW = M1.r[3]; - vX = _mm_broadcastss_ps(vW); - vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); - vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); - vX = _mm_mul_ps(vX, M2.r[0]); - vX = _mm_fmadd_ps(vY, M2.r[1], vX); - vX = _mm_fmadd_ps(vZ, M2.r[2], vX); - vX = _mm_fmadd_ps(vW, M2.r[3], vX); + vW = M1.r[3]; + vX = _mm_broadcastss_ps(vW); + vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); + vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); + vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); + vX = _mm_mul_ps(vX, M2.r[0]); + vX = _mm_fmadd_ps(vY, M2.r[1], vX); + vX = _mm_fmadd_ps(vZ, M2.r[2], vX); + vX = _mm_fmadd_ps(vW, M2.r[3], vX); __m128 r3 = vX; // x.x,x.y,y.x,y.y @@ -474,7 +418,6 @@ namespace DirectX return mResult; } - //------------------------------------------------------------------------------------- // Permute Templates //------------------------------------------------------------------------------------- @@ -482,12 +425,12 @@ namespace DirectX namespace MathInternal { // Slow path fallback for permutes that do not map to a single SSE opcode. - template struct PermuteHelper + template + struct PermuteHelper { static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) { - static const XMVECTORU32 selectMask = - { { { + static const XMVECTORU32 selectMask = { { { WhichX ? 0xFFFFFFFF : 0, WhichY ? 0xFFFFFFFF : 0, WhichZ ? 0xFFFFFFFF : 0, @@ -505,29 +448,41 @@ namespace DirectX }; // Fast path for permutes that only read from the first vector. - template struct PermuteHelper + template + struct PermuteHelper { - static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) { (v2); return _mm_permute_ps(v1, Shuffle); } + static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) + { + (v2); + return _mm_permute_ps(v1, Shuffle); + } }; // Fast path for permutes that only read from the second vector. - template struct PermuteHelper + template + struct PermuteHelper { - static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) { (v1); return _mm_permute_ps(v2, Shuffle); } + static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) + { + (v1); + return _mm_permute_ps(v2, Shuffle); + } }; // Fast path for permutes that read XY from the first vector, ZW from the second. - template struct PermuteHelper + template + struct PermuteHelper { static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) { 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 + template + struct PermuteHelper { static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) { return _mm_shuffle_ps(v2, v1, Shuffle); } }; - }; + }; // namespace MathInternal // General permute template template @@ -549,23 +504,86 @@ namespace DirectX } // Special-case permute templates - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 2, 3>(FXMVECTOR V1, FXMVECTOR) { return V1; } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 5, 6, 7>(FXMVECTOR, FXMVECTOR V2) { return V2; } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 2, 3>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0x1); } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 2, 3>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0x2); } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 5, 2, 3>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0x3); } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 6, 3>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0x4); } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 6, 3>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0x5); } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 6, 3>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0x6); } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 5, 6, 3>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0x7); } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 2, 7>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0x8); } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 2, 7>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0x9); } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 2, 7>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0xA); } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 5, 2, 7>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0xB); } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 6, 7>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0xC); } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 6, 7>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0xD); } - template<> inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 6, 7>(FXMVECTOR V1, FXMVECTOR V2) { return _mm_blend_ps(V1, V2, 0xE); } - + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 2, 3>(FXMVECTOR V1, FXMVECTOR) + { + return V1; + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 5, 6, 7>(FXMVECTOR, FXMVECTOR V2) + { + return V2; + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 2, 3>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0x1); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 2, 3>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0x2); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 5, 2, 3>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0x3); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 6, 3>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0x4); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 6, 3>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0x5); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 6, 3>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0x6); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 5, 6, 3>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0x7); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 2, 7>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0x8); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 2, 7>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0x9); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 2, 7>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0xA); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 5, 2, 7>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0xB); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 6, 7>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0xC); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 6, 7>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0xD); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 6, 7>(FXMVECTOR V1, FXMVECTOR V2) + { + return _mm_blend_ps(V1, V2, 0xE); + } //------------------------------------------------------------------------------------- // Swizzle Templates @@ -584,11 +602,26 @@ namespace DirectX } // Specialized swizzles - template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 1, 2, 3>(FXMVECTOR V) { return V; } - template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 0, 0, 0>(FXMVECTOR V) { return _mm_broadcastss_ps(V); } - template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 0, 2, 2>(FXMVECTOR V) { return _mm_moveldup_ps(V); } - template<> inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 1, 3, 3>(FXMVECTOR V) { return _mm_movehdup_ps(V); } - + template<> + inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 1, 2, 3>(FXMVECTOR V) + { + return V; + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 0, 0, 0>(FXMVECTOR V) + { + return _mm_broadcastss_ps(V); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 0, 2, 2>(FXMVECTOR V) + { + return _mm_moveldup_ps(V); + } + template<> + inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 1, 3, 3>(FXMVECTOR V) + { + return _mm_movehdup_ps(V); + } //------------------------------------------------------------------------------------- // Other Templates @@ -622,25 +655,22 @@ namespace DirectX inline float XMConvertHalfToFloat(PackedVector::HALF Value) { __m128i V1 = _mm_cvtsi32_si128(static_cast(Value)); - __m128 V2 = _mm_cvtph_ps(V1); + __m128 V2 = _mm_cvtph_ps(V1); return _mm_cvtss_f32(V2); } inline PackedVector::HALF XMConvertFloatToHalf(float Value) { - __m128 V1 = _mm_set_ss(Value); + __m128 V1 = _mm_set_ss(Value); __m128i V2 = _mm_cvtps_ph(V1, 0); return static_cast(_mm_cvtsi128_si32(V2)); } - inline float* XMConvertHalfToFloatStream - ( - _Out_writes_bytes_(sizeof(float)+OutputStride*(HalfCount-1)) float* pOutputStream, - _In_ size_t OutputStride, - _In_reads_bytes_(2+InputStride*(HalfCount-1)) const PackedVector::HALF* pInputStream, - _In_ size_t InputStride, - _In_ size_t HalfCount - ) + inline float* XMConvertHalfToFloatStream(_Out_writes_bytes_(sizeof(float) + OutputStride * (HalfCount - 1)) float* pOutputStream, + _In_ size_t OutputStride, + _In_reads_bytes_(2 + InputStride * (HalfCount - 1)) const PackedVector::HALF* pInputStream, + _In_ size_t InputStride, + _In_ size_t HalfCount) { using namespace PackedVector; @@ -650,10 +680,10 @@ namespace DirectX assert(InputStride >= sizeof(HALF)); assert(OutputStride >= sizeof(float)); - auto pHalf = reinterpret_cast(pInputStream); + auto pHalf = reinterpret_cast(pInputStream); auto pFloat = reinterpret_cast(pOutputStream); - size_t i = 0; + size_t i = 0; size_t four = HalfCount >> 2; if (four > 0) { @@ -731,11 +761,11 @@ namespace DirectX pHalf += InputStride; __m128i HV = _mm_setzero_si128(); - HV = _mm_insert_epi16(HV, H1, 0); - HV = _mm_insert_epi16(HV, H2, 1); - HV = _mm_insert_epi16(HV, H3, 2); - HV = _mm_insert_epi16(HV, H4, 3); - __m128 FV = _mm_cvtph_ps(HV); + HV = _mm_insert_epi16(HV, H1, 0); + HV = _mm_insert_epi16(HV, H2, 1); + HV = _mm_insert_epi16(HV, H3, 2); + HV = _mm_insert_epi16(HV, H4, 3); + __m128 FV = _mm_cvtph_ps(HV); _mm_stream_ps(reinterpret_cast(pFloat), FV); pFloat += OutputStride * 4; @@ -757,17 +787,16 @@ namespace DirectX pHalf += InputStride; __m128i HV = _mm_setzero_si128(); - HV = _mm_insert_epi16(HV, H1, 0); - HV = _mm_insert_epi16(HV, H2, 1); - HV = _mm_insert_epi16(HV, H3, 2); - HV = _mm_insert_epi16(HV, H4, 3); - __m128 FV = _mm_cvtph_ps(HV); + HV = _mm_insert_epi16(HV, H1, 0); + HV = _mm_insert_epi16(HV, H2, 1); + HV = _mm_insert_epi16(HV, H3, 2); + HV = _mm_insert_epi16(HV, H4, 3); + __m128 FV = _mm_cvtph_ps(HV); _mm_storeu_ps(reinterpret_cast(pFloat), FV); pFloat += OutputStride * 4; i += 4; } - } } else @@ -785,11 +814,11 @@ namespace DirectX pHalf += InputStride; __m128i HV = _mm_setzero_si128(); - HV = _mm_insert_epi16(HV, H1, 0); - HV = _mm_insert_epi16(HV, H2, 1); - HV = _mm_insert_epi16(HV, H3, 2); - HV = _mm_insert_epi16(HV, H4, 3); - __m128 FV = _mm_cvtph_ps(HV); + HV = _mm_insert_epi16(HV, H1, 0); + HV = _mm_insert_epi16(HV, H2, 1); + HV = _mm_insert_epi16(HV, H3, 2); + HV = _mm_insert_epi16(HV, H4, 3); + __m128 FV = _mm_cvtph_ps(HV); _mm_store_ss(reinterpret_cast(pFloat), FV); pFloat += OutputStride; @@ -814,15 +843,12 @@ namespace DirectX return pOutputStream; } - - inline PackedVector::HALF* XMConvertFloatToHalfStream - ( - _Out_writes_bytes_(2+OutputStride*(FloatCount-1)) PackedVector::HALF* pOutputStream, - _In_ size_t OutputStride, - _In_reads_bytes_(sizeof(float)+InputStride*(FloatCount-1)) const float* pInputStream, - _In_ size_t InputStride, - _In_ size_t FloatCount - ) + inline PackedVector::HALF* XMConvertFloatToHalfStream(_Out_writes_bytes_(2 + OutputStride * (FloatCount - 1)) + PackedVector::HALF* pOutputStream, + _In_ size_t OutputStride, + _In_reads_bytes_(sizeof(float) + InputStride * (FloatCount - 1)) const float* pInputStream, + _In_ size_t InputStride, + _In_ size_t FloatCount) { using namespace PackedVector; @@ -833,9 +859,9 @@ namespace DirectX assert(OutputStride >= sizeof(HALF)); auto pFloat = reinterpret_cast(pInputStream); - auto pHalf = reinterpret_cast(pOutputStream); + auto pHalf = reinterpret_cast(pOutputStream); - size_t i = 0; + size_t i = 0; size_t four = FloatCount >> 2; if (four > 0) { @@ -939,7 +965,7 @@ namespace DirectX __m128 FV = _mm_blend_ps(FV1, FV2, 0x2); __m128 FT = _mm_blend_ps(FV3, FV4, 0x8); - FV = _mm_blend_ps(FV, FT, 0xC); + FV = _mm_blend_ps(FV, FT, 0xC); __m128i HV = _mm_cvtps_ph(FV, 0); @@ -967,7 +993,7 @@ namespace DirectX __m128 FV = _mm_blend_ps(FV1, FV2, 0x2); __m128 FT = _mm_blend_ps(FV3, FV4, 0x8); - FV = _mm_blend_ps(FV, FT, 0xC); + FV = _mm_blend_ps(FV, FT, 0xC); __m128i HV = _mm_cvtps_ph(FV, 0); @@ -994,7 +1020,6 @@ namespace DirectX return pOutputStream; } - //------------------------------------------------------------------------------------- // Half2 //------------------------------------------------------------------------------------- @@ -1013,7 +1038,6 @@ namespace DirectX _mm_store_ss(reinterpret_cast(pDestination), _mm_castsi128_ps(V1)); } - //------------------------------------------------------------------------------------- // Half4 //------------------------------------------------------------------------------------- @@ -1034,4 +1058,4 @@ namespace DirectX } // namespace AVX2 -} // namespace DirectX; +} // namespace DirectX diff --git a/Extensions/DirectXMathBE.h b/Extensions/DirectXMathBE.h index 68d7aee4..37ea2c07 100644 --- a/Extensions/DirectXMathBE.h +++ b/Extensions/DirectXMathBE.h @@ -18,12 +18,9 @@ namespace DirectX { - inline XMVECTOR XM_CALLCONV XMVectorEndian - ( - FXMVECTOR V - ) + inline XMVECTOR XM_CALLCONV XMVectorEndian(FXMVECTOR V) { - #if defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) +#if defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) static const XMVECTORU32 idx = { { { 0x00010203u, 0x04050607u, 0x08090A0Bu, 0x0C0D0E0Fu } } }; uint8x8x2_t tbl; @@ -33,22 +30,21 @@ namespace DirectX const uint8x8_t rL = vtbl2_u8(tbl, vget_low_u32(idx)); const uint8x8_t rH = vtbl2_u8(tbl, vget_high_u32(idx)); return vcombine_f32(vreinterpret_f32_u8(rL), vreinterpret_f32_u8(rH)); - #else +#else XMVECTORU32 E; - E.v = V; + E.v = V; uint32_t value = E.u[0]; - E.u[0] = ((value << 24) | ((value & 0xFF00) << 8) | ((value & 0xFF0000) >> 8) | (value >> 24)); - value = E.u[1]; - E.u[1] = ((value << 24) | ((value & 0xFF00) << 8) | ((value & 0xFF0000) >> 8) | (value >> 24)); - value = E.u[2]; - E.u[2] = ((value << 24) | ((value & 0xFF00) << 8) | ((value & 0xFF0000) >> 8) | (value >> 24)); - value = E.u[3]; - E.u[3] = ((value << 24) | ((value & 0xFF00) << 8) | ((value & 0xFF0000) >> 8) | (value >> 24)); + E.u[0] = ((value << 24) | ((value & 0xFF00) << 8) | ((value & 0xFF0000) >> 8) | (value >> 24)); + value = E.u[1]; + E.u[1] = ((value << 24) | ((value & 0xFF00) << 8) | ((value & 0xFF0000) >> 8) | (value >> 24)); + value = E.u[2]; + E.u[2] = ((value << 24) | ((value & 0xFF00) << 8) | ((value & 0xFF0000) >> 8) | (value >> 24)); + value = E.u[3]; + E.u[3] = ((value << 24) | ((value & 0xFF00) << 8) | ((value & 0xFF0000) >> 8) | (value >> 24)); return E.v; - #endif +#endif } - #if (defined(_M_IX86) || defined(_M_X64) || __i386__ || __x86_64__) && !defined(_M_HYBRID_X86_ARM64) namespace SSSE3 { @@ -59,29 +55,26 @@ namespace DirectX // See https://msdn.microsoft.com/en-us/library/hskdteyh.aspx int CPUInfo[4] = { -1 }; - #if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) +#if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) __cpuid(0, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]); - #else +#else __cpuid(CPUInfo, 0); - #endif +#endif if (CPUInfo[0] < 1) return false; - #if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) +#if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) __cpuid(1, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]); - #else +#else __cpuid(CPUInfo, 1); - #endif +#endif // Check for SSSE3 instruction set. return ((CPUInfo[2] & 0x200) != 0); } - inline XMVECTOR XM_CALLCONV XMVectorEndian - ( - FXMVECTOR V - ) + inline XMVECTOR XM_CALLCONV XMVectorEndian(FXMVECTOR V) { static const XMVECTORU32 idx = { { { 0x00010203u, 0x04050607u, 0x08090A0Bu, 0x0C0D0E0Fu } } }; diff --git a/Extensions/DirectXMathF16C.h b/Extensions/DirectXMathF16C.h index cf0995d5..04cc665e 100644 --- a/Extensions/DirectXMathF16C.h +++ b/Extensions/DirectXMathF16C.h @@ -29,26 +29,25 @@ namespace DirectX // See https://msdn.microsoft.com/en-us/library/hskdteyh.aspx int CPUInfo[4] = { -1 }; - #if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) +#if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) __cpuid(0, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]); - #else +#else __cpuid(CPUInfo, 0); - #endif +#endif if (CPUInfo[0] < 1) return false; - #if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) +#if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) __cpuid(1, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]); - #else +#else __cpuid(CPUInfo, 1); - #endif +#endif // We check for F16C, AVX, OSXSAVE, and SSE4.1 return ((CPUInfo[2] & 0x38080000) == 0x38080000); } - //------------------------------------------------------------------------------------- // Data conversion //------------------------------------------------------------------------------------- @@ -56,25 +55,22 @@ namespace DirectX inline float XMConvertHalfToFloat(PackedVector::HALF Value) { __m128i V1 = _mm_cvtsi32_si128(static_cast(Value)); - __m128 V2 = _mm_cvtph_ps(V1); + __m128 V2 = _mm_cvtph_ps(V1); return _mm_cvtss_f32(V2); } inline PackedVector::HALF XMConvertFloatToHalf(float Value) { - __m128 V1 = _mm_set_ss(Value); + __m128 V1 = _mm_set_ss(Value); __m128i V2 = _mm_cvtps_ph(V1, 0); return static_cast(_mm_cvtsi128_si32(V2)); } - inline float* XMConvertHalfToFloatStream - ( - _Out_writes_bytes_(sizeof(float) + OutputStride * (HalfCount - 1)) float* pOutputStream, - _In_ size_t OutputStride, - _In_reads_bytes_(2 + InputStride * (HalfCount - 1)) const PackedVector::HALF* pInputStream, - _In_ size_t InputStride, - _In_ size_t HalfCount - ) + inline float* XMConvertHalfToFloatStream(_Out_writes_bytes_(sizeof(float) + OutputStride * (HalfCount - 1)) float* pOutputStream, + _In_ size_t OutputStride, + _In_reads_bytes_(2 + InputStride * (HalfCount - 1)) const PackedVector::HALF* pInputStream, + _In_ size_t InputStride, + _In_ size_t HalfCount) { using namespace PackedVector; @@ -84,10 +80,10 @@ namespace DirectX assert(InputStride >= sizeof(HALF)); assert(OutputStride >= sizeof(float)); - auto pHalf = reinterpret_cast(pInputStream); + auto pHalf = reinterpret_cast(pInputStream); auto pFloat = reinterpret_cast(pOutputStream); - size_t i = 0; + size_t i = 0; size_t four = HalfCount >> 2; if (four > 0) { @@ -165,11 +161,11 @@ namespace DirectX pHalf += InputStride; __m128i HV = _mm_setzero_si128(); - HV = _mm_insert_epi16(HV, H1, 0); - HV = _mm_insert_epi16(HV, H2, 1); - HV = _mm_insert_epi16(HV, H3, 2); - HV = _mm_insert_epi16(HV, H4, 3); - __m128 FV = _mm_cvtph_ps(HV); + HV = _mm_insert_epi16(HV, H1, 0); + HV = _mm_insert_epi16(HV, H2, 1); + HV = _mm_insert_epi16(HV, H3, 2); + HV = _mm_insert_epi16(HV, H4, 3); + __m128 FV = _mm_cvtph_ps(HV); _mm_stream_ps(reinterpret_cast(pFloat), FV); pFloat += OutputStride * 4; @@ -191,17 +187,16 @@ namespace DirectX pHalf += InputStride; __m128i HV = _mm_setzero_si128(); - HV = _mm_insert_epi16(HV, H1, 0); - HV = _mm_insert_epi16(HV, H2, 1); - HV = _mm_insert_epi16(HV, H3, 2); - HV = _mm_insert_epi16(HV, H4, 3); - __m128 FV = _mm_cvtph_ps(HV); + HV = _mm_insert_epi16(HV, H1, 0); + HV = _mm_insert_epi16(HV, H2, 1); + HV = _mm_insert_epi16(HV, H3, 2); + HV = _mm_insert_epi16(HV, H4, 3); + __m128 FV = _mm_cvtph_ps(HV); _mm_storeu_ps(reinterpret_cast(pFloat), FV); pFloat += OutputStride * 4; i += 4; } - } } else @@ -219,11 +214,11 @@ namespace DirectX pHalf += InputStride; __m128i HV = _mm_setzero_si128(); - HV = _mm_insert_epi16(HV, H1, 0); - HV = _mm_insert_epi16(HV, H2, 1); - HV = _mm_insert_epi16(HV, H3, 2); - HV = _mm_insert_epi16(HV, H4, 3); - __m128 FV = _mm_cvtph_ps(HV); + HV = _mm_insert_epi16(HV, H1, 0); + HV = _mm_insert_epi16(HV, H2, 1); + HV = _mm_insert_epi16(HV, H3, 2); + HV = _mm_insert_epi16(HV, H4, 3); + __m128 FV = _mm_cvtph_ps(HV); _mm_store_ss(reinterpret_cast(pFloat), FV); pFloat += OutputStride; @@ -248,15 +243,12 @@ namespace DirectX return pOutputStream; } - - inline PackedVector::HALF* XMConvertFloatToHalfStream - ( - _Out_writes_bytes_(2 + OutputStride * (FloatCount - 1)) PackedVector::HALF* pOutputStream, - _In_ size_t OutputStride, + inline PackedVector::HALF* XMConvertFloatToHalfStream(_Out_writes_bytes_(2 + OutputStride * (FloatCount - 1)) + PackedVector::HALF* pOutputStream, + _In_ size_t OutputStride, _In_reads_bytes_(sizeof(float) + InputStride * (FloatCount - 1)) const float* pInputStream, - _In_ size_t InputStride, - _In_ size_t FloatCount - ) + _In_ size_t InputStride, + _In_ size_t FloatCount) { using namespace PackedVector; @@ -267,9 +259,9 @@ namespace DirectX assert(OutputStride >= sizeof(HALF)); auto pFloat = reinterpret_cast(pInputStream); - auto pHalf = reinterpret_cast(pOutputStream); + auto pHalf = reinterpret_cast(pOutputStream); - size_t i = 0; + size_t i = 0; size_t four = FloatCount >> 2; if (four > 0) { @@ -373,7 +365,7 @@ namespace DirectX __m128 FV = _mm_blend_ps(FV1, FV2, 0x2); __m128 FT = _mm_blend_ps(FV3, FV4, 0x8); - FV = _mm_blend_ps(FV, FT, 0xC); + FV = _mm_blend_ps(FV, FT, 0xC); __m128i HV = _mm_cvtps_ph(FV, 0); @@ -401,7 +393,7 @@ namespace DirectX __m128 FV = _mm_blend_ps(FV1, FV2, 0x2); __m128 FT = _mm_blend_ps(FV3, FV4, 0x8); - FV = _mm_blend_ps(FV, FT, 0xC); + FV = _mm_blend_ps(FV, FT, 0xC); __m128i HV = _mm_cvtps_ph(FV, 0); @@ -428,7 +420,6 @@ namespace DirectX return pOutputStream; } - //------------------------------------------------------------------------------------- // Half2 //------------------------------------------------------------------------------------- @@ -447,7 +438,6 @@ namespace DirectX _mm_store_ss(reinterpret_cast(pDestination), _mm_castsi128_ps(V1)); } - //------------------------------------------------------------------------------------- // Half4 //------------------------------------------------------------------------------------- diff --git a/Extensions/DirectXMathFMA3.h b/Extensions/DirectXMathFMA3.h index a991d3f8..f64d953f 100644 --- a/Extensions/DirectXMathFMA3.h +++ b/Extensions/DirectXMathFMA3.h @@ -28,172 +28,132 @@ namespace DirectX // See https://msdn.microsoft.com/en-us/library/hskdteyh.aspx int CPUInfo[4] = { -1 }; - #if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) +#if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) __cpuid(0, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]); - #else +#else __cpuid(CPUInfo, 0); - #endif +#endif if (CPUInfo[0] < 1) return false; - #if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) +#if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) __cpuid(1, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]); - #else +#else __cpuid(CPUInfo, 1); - #endif +#endif // We check for FMA3, AVX, OSXSAVE return ((CPUInfo[2] & 0x18001000) == 0x18001000); } - //------------------------------------------------------------------------------------- // Vector //------------------------------------------------------------------------------------- - inline XMVECTOR XM_CALLCONV XMVectorMultiplyAdd - ( - FXMVECTOR V1, - FXMVECTOR V2, - FXMVECTOR V3 - ) + inline XMVECTOR XM_CALLCONV XMVectorMultiplyAdd(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR V3) { return _mm_fmadd_ps(V1, V2, V3); } - inline XMVECTOR XM_CALLCONV XMVectorNegativeMultiplySubtract - ( - FXMVECTOR V1, - FXMVECTOR V2, - FXMVECTOR V3 - ) + inline XMVECTOR XM_CALLCONV XMVectorNegativeMultiplySubtract(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR V3) { return _mm_fnmadd_ps(V1, V2, V3); } - //------------------------------------------------------------------------------------- // Vector2 //------------------------------------------------------------------------------------- - inline XMVECTOR XM_CALLCONV XMVector2Transform - ( - FXMVECTOR V, - CXMMATRIX M - ) + inline XMVECTOR XM_CALLCONV XMVector2Transform(FXMVECTOR V, CXMMATRIX M) { XMVECTOR vResult = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = _mm_fmadd_ps(vResult, M.r[1], M.r[3]); - XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X - vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); + vResult = _mm_fmadd_ps(vResult, M.r[1], M.r[3]); + XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X + vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); return vResult; } - inline XMVECTOR XM_CALLCONV XMVector2TransformCoord - ( - FXMVECTOR V, - CXMMATRIX M - ) + inline XMVECTOR XM_CALLCONV XMVector2TransformCoord(FXMVECTOR V, CXMMATRIX M) { XMVECTOR vResult = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = _mm_fmadd_ps(vResult, M.r[1], M.r[3]); - XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X - vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); - XMVECTOR W = _mm_permute_ps(vResult, _MM_SHUFFLE(3, 3, 3, 3)); - vResult = _mm_div_ps(vResult, W); + vResult = _mm_fmadd_ps(vResult, M.r[1], M.r[3]); + XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X + vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); + XMVECTOR W = _mm_permute_ps(vResult, _MM_SHUFFLE(3, 3, 3, 3)); + vResult = _mm_div_ps(vResult, W); return vResult; } - inline XMVECTOR XM_CALLCONV XMVector2TransformNormal - ( - FXMVECTOR V, - CXMMATRIX M - ) + inline XMVECTOR XM_CALLCONV XMVector2TransformNormal(FXMVECTOR V, CXMMATRIX M) { XMVECTOR vResult = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = _mm_mul_ps(vResult, M.r[1]); - XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X - vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); + vResult = _mm_mul_ps(vResult, M.r[1]); + XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X + vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); return vResult; } - //------------------------------------------------------------------------------------- // Vector3 //------------------------------------------------------------------------------------- - inline XMVECTOR XM_CALLCONV XMVector3Transform - ( - FXMVECTOR V, - CXMMATRIX M - ) + inline XMVECTOR XM_CALLCONV XMVector3Transform(FXMVECTOR V, CXMMATRIX M) { XMVECTOR vResult = _mm_permute_ps(V, _MM_SHUFFLE(2, 2, 2, 2)); // Z - vResult = _mm_fmadd_ps(vResult, M.r[2], M.r[3]); - XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = _mm_fmadd_ps(vTemp, M.r[1], vResult); - vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X - vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); + vResult = _mm_fmadd_ps(vResult, M.r[2], M.r[3]); + XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y + vResult = _mm_fmadd_ps(vTemp, M.r[1], vResult); + vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X + vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); return vResult; } - inline XMVECTOR XM_CALLCONV XMVector3TransformCoord - ( - FXMVECTOR V, - CXMMATRIX M - ) + inline XMVECTOR XM_CALLCONV XMVector3TransformCoord(FXMVECTOR V, CXMMATRIX M) { XMVECTOR vResult = _mm_permute_ps(V, _MM_SHUFFLE(2, 2, 2, 2)); // Z - vResult = _mm_fmadd_ps(vResult, M.r[2], M.r[3]); - XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = _mm_fmadd_ps(vTemp, M.r[1], vResult); - vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X - vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); - XMVECTOR W = _mm_permute_ps(vResult, _MM_SHUFFLE(3, 3, 3, 3)); - vResult = _mm_div_ps(vResult, W); + vResult = _mm_fmadd_ps(vResult, M.r[2], M.r[3]); + XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y + vResult = _mm_fmadd_ps(vTemp, M.r[1], vResult); + vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X + vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); + XMVECTOR W = _mm_permute_ps(vResult, _MM_SHUFFLE(3, 3, 3, 3)); + vResult = _mm_div_ps(vResult, W); return vResult; } - inline XMVECTOR XM_CALLCONV XMVector3TransformNormal - ( - FXMVECTOR V, - CXMMATRIX M - ) + inline XMVECTOR XM_CALLCONV XMVector3TransformNormal(FXMVECTOR V, CXMMATRIX M) { XMVECTOR vResult = _mm_permute_ps(V, _MM_SHUFFLE(2, 2, 2, 2)); // Z - vResult = _mm_mul_ps(vResult, M.r[2]); - XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = _mm_fmadd_ps(vTemp, M.r[1], vResult); - vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X - vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); + vResult = _mm_mul_ps(vResult, M.r[2]); + XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y + vResult = _mm_fmadd_ps(vTemp, M.r[1], vResult); + vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X + vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); return vResult; } XMMATRIX XM_CALLCONV XMMatrixMultiply(CXMMATRIX M1, CXMMATRIX M2); - inline XMVECTOR XM_CALLCONV XMVector3Project - ( - FXMVECTOR V, - float ViewportX, - float ViewportY, - float ViewportWidth, - float ViewportHeight, - float ViewportMinZ, - float ViewportMaxZ, - CXMMATRIX Projection, - CXMMATRIX View, - CXMMATRIX World - ) + inline XMVECTOR XM_CALLCONV XMVector3Project(FXMVECTOR V, + float ViewportX, + float ViewportY, + float ViewportWidth, + float ViewportHeight, + float ViewportMinZ, + float ViewportMaxZ, + CXMMATRIX Projection, + CXMMATRIX View, + CXMMATRIX World) { - const float HalfViewportWidth = ViewportWidth * 0.5f; + const float HalfViewportWidth = ViewportWidth * 0.5f; const float HalfViewportHeight = ViewportHeight * 0.5f; - XMVECTOR Scale = XMVectorSet(HalfViewportWidth, -HalfViewportHeight, ViewportMaxZ - ViewportMinZ, 0.0f); + XMVECTOR Scale = XMVectorSet(HalfViewportWidth, -HalfViewportHeight, ViewportMaxZ - ViewportMinZ, 0.0f); XMVECTOR Offset = XMVectorSet(ViewportX + HalfViewportWidth, ViewportY + HalfViewportHeight, ViewportMinZ, 0.0f); XMMATRIX Transform = FMA3::XMMatrixMultiply(World, View); - Transform = FMA3::XMMatrixMultiply(Transform, Projection); + Transform = FMA3::XMMatrixMultiply(Transform, Projection); XMVECTOR Result = FMA3::XMVector3TransformCoord(V, Transform); @@ -202,69 +162,56 @@ namespace DirectX return Result; } - inline XMVECTOR XM_CALLCONV XMVector3Unproject - ( - FXMVECTOR V, - float ViewportX, - float ViewportY, - float ViewportWidth, - float ViewportHeight, - float ViewportMinZ, - float ViewportMaxZ, - CXMMATRIX Projection, - CXMMATRIX View, - CXMMATRIX World - ) + inline XMVECTOR XM_CALLCONV XMVector3Unproject(FXMVECTOR V, + float ViewportX, + float ViewportY, + float ViewportWidth, + float ViewportHeight, + float ViewportMinZ, + float ViewportMaxZ, + CXMMATRIX Projection, + CXMMATRIX View, + CXMMATRIX World) { static const XMVECTORF32 D = { { { -1.0f, 1.0f, 0.0f, 0.0f } } }; XMVECTOR Scale = XMVectorSet(ViewportWidth * 0.5f, -ViewportHeight * 0.5f, ViewportMaxZ - ViewportMinZ, 1.0f); - Scale = XMVectorReciprocal(Scale); + Scale = XMVectorReciprocal(Scale); XMVECTOR Offset = XMVectorSet(-ViewportX, -ViewportY, -ViewportMinZ, 0.0f); - Offset = FMA3::XMVectorMultiplyAdd(Scale, Offset, D.v); + Offset = FMA3::XMVectorMultiplyAdd(Scale, Offset, D.v); XMMATRIX Transform = FMA3::XMMatrixMultiply(World, View); - Transform = FMA3::XMMatrixMultiply(Transform, Projection); - Transform = XMMatrixInverse(nullptr, Transform); + Transform = FMA3::XMMatrixMultiply(Transform, Projection); + Transform = XMMatrixInverse(nullptr, Transform); XMVECTOR Result = FMA3::XMVectorMultiplyAdd(V, Scale, Offset); return FMA3::XMVector3TransformCoord(Result, Transform); } - //------------------------------------------------------------------------------------- // Vector4 //------------------------------------------------------------------------------------- - inline XMVECTOR XM_CALLCONV XMVector4Transform - ( - FXMVECTOR V, - CXMMATRIX M - ) + inline XMVECTOR XM_CALLCONV XMVector4Transform(FXMVECTOR V, CXMMATRIX M) { XMVECTOR vResult = _mm_permute_ps(V, _MM_SHUFFLE(3, 3, 3, 3)); // W - vResult = _mm_mul_ps(vResult, M.r[3]); - XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(2, 2, 2, 2)); // Z - vResult = _mm_fmadd_ps(vTemp, M.r[2], vResult); - vTemp = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = _mm_fmadd_ps(vTemp, M.r[1], vResult); - vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X - vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); + vResult = _mm_mul_ps(vResult, M.r[3]); + XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(2, 2, 2, 2)); // Z + vResult = _mm_fmadd_ps(vTemp, M.r[2], vResult); + vTemp = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y + vResult = _mm_fmadd_ps(vTemp, M.r[1], vResult); + vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X + vResult = _mm_fmadd_ps(vTemp, M.r[0], vResult); return vResult; } - //------------------------------------------------------------------------------------- // Matrix //------------------------------------------------------------------------------------- - inline XMMATRIX XM_CALLCONV XMMatrixMultiply - ( - CXMMATRIX M1, - CXMMATRIX M2 - ) + inline XMMATRIX XM_CALLCONV XMMatrixMultiply(CXMMATRIX M1, CXMMATRIX M2) { XMMATRIX mResult; // Use vW to hold the original row @@ -273,52 +220,48 @@ namespace DirectX XMVECTOR vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); XMVECTOR vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); + vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); // Perform the operation on the first row - vX = _mm_mul_ps(vX, M2.r[0]); - vX = _mm_fmadd_ps(vY, M2.r[1], vX); - vX = _mm_fmadd_ps(vZ, M2.r[2], vX); - vX = _mm_fmadd_ps(vW, M2.r[3], vX); + vX = _mm_mul_ps(vX, M2.r[0]); + vX = _mm_fmadd_ps(vY, M2.r[1], vX); + vX = _mm_fmadd_ps(vZ, M2.r[2], vX); + vX = _mm_fmadd_ps(vW, M2.r[3], vX); mResult.r[0] = vX; // Repeat for the other 3 rows - vW = M1.r[1]; - vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); - vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); - vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); - vX = _mm_mul_ps(vX, M2.r[0]); - vX = _mm_fmadd_ps(vY, M2.r[1], vX); - vX = _mm_fmadd_ps(vZ, M2.r[2], vX); - vX = _mm_fmadd_ps(vW, M2.r[3], vX); + vW = M1.r[1]; + vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); + vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); + vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); + vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); + vX = _mm_mul_ps(vX, M2.r[0]); + vX = _mm_fmadd_ps(vY, M2.r[1], vX); + vX = _mm_fmadd_ps(vZ, M2.r[2], vX); + vX = _mm_fmadd_ps(vW, M2.r[3], vX); mResult.r[1] = vX; - vW = M1.r[2]; - vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); - vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); - vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); - vX = _mm_mul_ps(vX, M2.r[0]); - vX = _mm_fmadd_ps(vY, M2.r[1], vX); - vX = _mm_fmadd_ps(vZ, M2.r[2], vX); - vX = _mm_fmadd_ps(vW, M2.r[3], vX); + vW = M1.r[2]; + vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); + vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); + vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); + vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); + vX = _mm_mul_ps(vX, M2.r[0]); + vX = _mm_fmadd_ps(vY, M2.r[1], vX); + vX = _mm_fmadd_ps(vZ, M2.r[2], vX); + vX = _mm_fmadd_ps(vW, M2.r[3], vX); mResult.r[2] = vX; - vW = M1.r[3]; - vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); - vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); - vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); - vX = _mm_mul_ps(vX, M2.r[0]); - vX = _mm_fmadd_ps(vY, M2.r[1], vX); - vX = _mm_fmadd_ps(vZ, M2.r[2], vX); - vX = _mm_fmadd_ps(vW, M2.r[3], vX); + vW = M1.r[3]; + vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); + vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); + vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); + vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); + vX = _mm_mul_ps(vX, M2.r[0]); + vX = _mm_fmadd_ps(vY, M2.r[1], vX); + vX = _mm_fmadd_ps(vZ, M2.r[2], vX); + vX = _mm_fmadd_ps(vW, M2.r[3], vX); mResult.r[3] = vX; return mResult; } - inline XMMATRIX XM_CALLCONV XMMatrixMultiplyTranspose - ( - FXMMATRIX M1, - CXMMATRIX M2 - ) + inline XMMATRIX XM_CALLCONV XMMatrixMultiplyTranspose(FXMMATRIX M1, CXMMATRIX M2) { // Use vW to hold the original row XMVECTOR vW = M1.r[0]; @@ -326,43 +269,43 @@ namespace DirectX XMVECTOR vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); XMVECTOR vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); + vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); // Perform the operation on the first row - vX = _mm_mul_ps(vX, M2.r[0]); - vX = _mm_fmadd_ps(vY, M2.r[1], vX); - vX = _mm_fmadd_ps(vZ, M2.r[2], vX); - vX = _mm_fmadd_ps(vW, M2.r[3], vX); + vX = _mm_mul_ps(vX, M2.r[0]); + vX = _mm_fmadd_ps(vY, M2.r[1], vX); + vX = _mm_fmadd_ps(vZ, M2.r[2], vX); + vX = _mm_fmadd_ps(vW, M2.r[3], vX); __m128 r0 = vX; // Repeat for the other 3 rows - vW = M1.r[1]; - vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); - vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); - vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); - vX = _mm_mul_ps(vX, M2.r[0]); - vX = _mm_fmadd_ps(vY, M2.r[1], vX); - vX = _mm_fmadd_ps(vZ, M2.r[2], vX); - vX = _mm_fmadd_ps(vW, M2.r[3], vX); + vW = M1.r[1]; + vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); + vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); + vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); + vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); + vX = _mm_mul_ps(vX, M2.r[0]); + vX = _mm_fmadd_ps(vY, M2.r[1], vX); + vX = _mm_fmadd_ps(vZ, M2.r[2], vX); + vX = _mm_fmadd_ps(vW, M2.r[3], vX); __m128 r1 = vX; - vW = M1.r[2]; - vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); - vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); - vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); - vX = _mm_mul_ps(vX, M2.r[0]); - vX = _mm_fmadd_ps(vY, M2.r[1], vX); - vX = _mm_fmadd_ps(vZ, M2.r[2], vX); - vX = _mm_fmadd_ps(vW, M2.r[3], vX); + vW = M1.r[2]; + vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); + vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); + vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); + vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); + vX = _mm_mul_ps(vX, M2.r[0]); + vX = _mm_fmadd_ps(vY, M2.r[1], vX); + vX = _mm_fmadd_ps(vZ, M2.r[2], vX); + vX = _mm_fmadd_ps(vW, M2.r[3], vX); __m128 r2 = vX; - vW = M1.r[3]; - vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); - vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); - vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); - vX = _mm_mul_ps(vX, M2.r[0]); - vX = _mm_fmadd_ps(vY, M2.r[1], vX); - vX = _mm_fmadd_ps(vZ, M2.r[2], vX); - vX = _mm_fmadd_ps(vW, M2.r[3], vX); + vW = M1.r[3]; + vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); + vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); + vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); + vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); + vX = _mm_mul_ps(vX, M2.r[0]); + vX = _mm_fmadd_ps(vY, M2.r[1], vX); + vX = _mm_fmadd_ps(vZ, M2.r[2], vX); + vX = _mm_fmadd_ps(vW, M2.r[3], vX); __m128 r3 = vX; // x.x,x.y,y.x,y.y @@ -388,4 +331,4 @@ namespace DirectX } // namespace FMA3 -} // namespace DirectX; +} // namespace DirectX diff --git a/Extensions/DirectXMathFMA4.h b/Extensions/DirectXMathFMA4.h index c6394faf..73168712 100644 --- a/Extensions/DirectXMathFMA4.h +++ b/Extensions/DirectXMathFMA4.h @@ -33,191 +33,151 @@ namespace DirectX // See https://msdn.microsoft.com/en-us/library/hskdteyh.aspx int CPUInfo[4] = { -1 }; - #if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) +#if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) __cpuid(0, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]); - #else +#else __cpuid(CPUInfo, 0); - #endif +#endif if (CPUInfo[0] < 1) return false; - #if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) +#if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) __cpuid(1, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]); - #else +#else __cpuid(CPUInfo, 1); - #endif +#endif // We check for AVX, OSXSAVE (required to access FMA4) if ((CPUInfo[2] & 0x18000000) != 0x18000000) return false; - #if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) +#if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) __cpuid(0x80000000, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]); - #else +#else __cpuid(CPUInfo, static_cast(0x80000000)); - #endif +#endif if (uint32_t(CPUInfo[0]) < 0x80000001u) return false; // We check for FMA4 - #if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) +#if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) __cpuid(0x80000001, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]); - #else +#else __cpuid(CPUInfo, static_cast(0x80000001)); - #endif +#endif return (CPUInfo[2] & 0x10000); } - //------------------------------------------------------------------------------------- // Vector //------------------------------------------------------------------------------------- - inline XMVECTOR XM_CALLCONV XMVectorMultiplyAdd - ( - FXMVECTOR V1, - FXMVECTOR V2, - FXMVECTOR V3 - ) + inline XMVECTOR XM_CALLCONV XMVectorMultiplyAdd(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR V3) { return _mm_macc_ps(V1, V2, V3); } - inline XMVECTOR XM_CALLCONV XMVectorNegativeMultiplySubtract - ( - FXMVECTOR V1, - FXMVECTOR V2, - FXMVECTOR V3 - ) + inline XMVECTOR XM_CALLCONV XMVectorNegativeMultiplySubtract(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR V3) { return _mm_nmacc_ps(V1, V2, V3); } - //------------------------------------------------------------------------------------- // Vector2 //------------------------------------------------------------------------------------- - inline XMVECTOR XM_CALLCONV XMVector2Transform - ( - FXMVECTOR V, - CXMMATRIX M - ) + inline XMVECTOR XM_CALLCONV XMVector2Transform(FXMVECTOR V, CXMMATRIX M) { XMVECTOR vResult = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = _mm_macc_ps(vResult, M.r[1], M.r[3]); - XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X - vResult = _mm_macc_ps(vTemp, M.r[0], vResult); + vResult = _mm_macc_ps(vResult, M.r[1], M.r[3]); + XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X + vResult = _mm_macc_ps(vTemp, M.r[0], vResult); return vResult; } - inline XMVECTOR XM_CALLCONV XMVector2TransformCoord - ( - FXMVECTOR V, - CXMMATRIX M - ) + inline XMVECTOR XM_CALLCONV XMVector2TransformCoord(FXMVECTOR V, CXMMATRIX M) { XMVECTOR vResult = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = _mm_macc_ps(vResult, M.r[1], M.r[3]); - XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X - vResult = _mm_macc_ps(vTemp, M.r[0], vResult); - XMVECTOR W = _mm_permute_ps(vResult, _MM_SHUFFLE(3, 3, 3, 3)); - vResult = _mm_div_ps(vResult, W); + vResult = _mm_macc_ps(vResult, M.r[1], M.r[3]); + XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X + vResult = _mm_macc_ps(vTemp, M.r[0], vResult); + XMVECTOR W = _mm_permute_ps(vResult, _MM_SHUFFLE(3, 3, 3, 3)); + vResult = _mm_div_ps(vResult, W); return vResult; } - inline XMVECTOR XM_CALLCONV XMVector2TransformNormal - ( - FXMVECTOR V, - CXMMATRIX M - ) + inline XMVECTOR XM_CALLCONV XMVector2TransformNormal(FXMVECTOR V, CXMMATRIX M) { XMVECTOR vResult = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = _mm_mul_ps(vResult, M.r[1]); - XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X - vResult = _mm_macc_ps(vTemp, M.r[0], vResult); + vResult = _mm_mul_ps(vResult, M.r[1]); + XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X + vResult = _mm_macc_ps(vTemp, M.r[0], vResult); return vResult; } - //------------------------------------------------------------------------------------- // Vector3 //------------------------------------------------------------------------------------- - inline XMVECTOR XM_CALLCONV XMVector3Transform - ( - FXMVECTOR V, - CXMMATRIX M - ) + inline XMVECTOR XM_CALLCONV XMVector3Transform(FXMVECTOR V, CXMMATRIX M) { XMVECTOR vResult = _mm_permute_ps(V, _MM_SHUFFLE(2, 2, 2, 2)); // Z - vResult = _mm_macc_ps(vResult, M.r[2], M.r[3]); - XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = _mm_macc_ps(vTemp, M.r[1], vResult); - vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X - vResult = _mm_macc_ps(vTemp, M.r[0], vResult); + vResult = _mm_macc_ps(vResult, M.r[2], M.r[3]); + XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y + vResult = _mm_macc_ps(vTemp, M.r[1], vResult); + vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X + vResult = _mm_macc_ps(vTemp, M.r[0], vResult); return vResult; } - inline XMVECTOR XM_CALLCONV XMVector3TransformCoord - ( - FXMVECTOR V, - CXMMATRIX M - ) + inline XMVECTOR XM_CALLCONV XMVector3TransformCoord(FXMVECTOR V, CXMMATRIX M) { XMVECTOR vResult = _mm_permute_ps(V, _MM_SHUFFLE(2, 2, 2, 2)); // Z - vResult = _mm_macc_ps(vResult, M.r[2], M.r[3]); - XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = _mm_macc_ps(vTemp, M.r[1], vResult); - vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X - vResult = _mm_macc_ps(vTemp, M.r[0], vResult); - XMVECTOR W = _mm_permute_ps(vResult, _MM_SHUFFLE(3, 3, 3, 3)); - vResult = _mm_div_ps(vResult, W); + vResult = _mm_macc_ps(vResult, M.r[2], M.r[3]); + XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y + vResult = _mm_macc_ps(vTemp, M.r[1], vResult); + vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X + vResult = _mm_macc_ps(vTemp, M.r[0], vResult); + XMVECTOR W = _mm_permute_ps(vResult, _MM_SHUFFLE(3, 3, 3, 3)); + vResult = _mm_div_ps(vResult, W); return vResult; } - inline XMVECTOR XM_CALLCONV XMVector3TransformNormal - ( - FXMVECTOR V, - CXMMATRIX M - ) + inline XMVECTOR XM_CALLCONV XMVector3TransformNormal(FXMVECTOR V, CXMMATRIX M) { XMVECTOR vResult = _mm_permute_ps(V, _MM_SHUFFLE(2, 2, 2, 2)); // Z - vResult = _mm_mul_ps(vResult, M.r[2]); - XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = _mm_macc_ps(vTemp, M.r[1], vResult); - vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X - vResult = _mm_macc_ps(vTemp, M.r[0], vResult); + vResult = _mm_mul_ps(vResult, M.r[2]); + XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y + vResult = _mm_macc_ps(vTemp, M.r[1], vResult); + vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X + vResult = _mm_macc_ps(vTemp, M.r[0], vResult); return vResult; } XMMATRIX XM_CALLCONV XMMatrixMultiply(CXMMATRIX M1, CXMMATRIX M2); - inline XMVECTOR XM_CALLCONV XMVector3Project - ( - FXMVECTOR V, - float ViewportX, - float ViewportY, - float ViewportWidth, - float ViewportHeight, - float ViewportMinZ, - float ViewportMaxZ, - CXMMATRIX Projection, - CXMMATRIX View, - CXMMATRIX World - ) + inline XMVECTOR XM_CALLCONV XMVector3Project(FXMVECTOR V, + float ViewportX, + float ViewportY, + float ViewportWidth, + float ViewportHeight, + float ViewportMinZ, + float ViewportMaxZ, + CXMMATRIX Projection, + CXMMATRIX View, + CXMMATRIX World) { - const float HalfViewportWidth = ViewportWidth * 0.5f; + const float HalfViewportWidth = ViewportWidth * 0.5f; const float HalfViewportHeight = ViewportHeight * 0.5f; - XMVECTOR Scale = XMVectorSet(HalfViewportWidth, -HalfViewportHeight, ViewportMaxZ - ViewportMinZ, 0.0f); + XMVECTOR Scale = XMVectorSet(HalfViewportWidth, -HalfViewportHeight, ViewportMaxZ - ViewportMinZ, 0.0f); XMVECTOR Offset = XMVectorSet(ViewportX + HalfViewportWidth, ViewportY + HalfViewportHeight, ViewportMinZ, 0.0f); XMMATRIX Transform = FMA4::XMMatrixMultiply(World, View); - Transform = FMA4::XMMatrixMultiply(Transform, Projection); + Transform = FMA4::XMMatrixMultiply(Transform, Projection); XMVECTOR Result = FMA4::XMVector3TransformCoord(V, Transform); @@ -226,69 +186,56 @@ namespace DirectX return Result; } - inline XMVECTOR XM_CALLCONV XMVector3Unproject - ( - FXMVECTOR V, - float ViewportX, - float ViewportY, - float ViewportWidth, - float ViewportHeight, - float ViewportMinZ, - float ViewportMaxZ, - CXMMATRIX Projection, - CXMMATRIX View, - CXMMATRIX World - ) + inline XMVECTOR XM_CALLCONV XMVector3Unproject(FXMVECTOR V, + float ViewportX, + float ViewportY, + float ViewportWidth, + float ViewportHeight, + float ViewportMinZ, + float ViewportMaxZ, + CXMMATRIX Projection, + CXMMATRIX View, + CXMMATRIX World) { static const XMVECTORF32 D = { { { -1.0f, 1.0f, 0.0f, 0.0f } } }; XMVECTOR Scale = XMVectorSet(ViewportWidth * 0.5f, -ViewportHeight * 0.5f, ViewportMaxZ - ViewportMinZ, 1.0f); - Scale = XMVectorReciprocal(Scale); + Scale = XMVectorReciprocal(Scale); XMVECTOR Offset = XMVectorSet(-ViewportX, -ViewportY, -ViewportMinZ, 0.0f); - Offset = FMA4::XMVectorMultiplyAdd(Scale, Offset, D.v); + Offset = FMA4::XMVectorMultiplyAdd(Scale, Offset, D.v); XMMATRIX Transform = FMA4::XMMatrixMultiply(World, View); - Transform = FMA4::XMMatrixMultiply(Transform, Projection); - Transform = XMMatrixInverse(nullptr, Transform); + Transform = FMA4::XMMatrixMultiply(Transform, Projection); + Transform = XMMatrixInverse(nullptr, Transform); XMVECTOR Result = FMA4::XMVectorMultiplyAdd(V, Scale, Offset); return FMA4::XMVector3TransformCoord(Result, Transform); } - //------------------------------------------------------------------------------------- // Vector4 //------------------------------------------------------------------------------------- - inline XMVECTOR XM_CALLCONV XMVector4Transform - ( - FXMVECTOR V, - CXMMATRIX M - ) + inline XMVECTOR XM_CALLCONV XMVector4Transform(FXMVECTOR V, CXMMATRIX M) { XMVECTOR vResult = _mm_permute_ps(V, _MM_SHUFFLE(3, 3, 3, 3)); // W - vResult = _mm_mul_ps(vResult, M.r[3]); - XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(2, 2, 2, 2)); // Z - vResult = _mm_macc_ps(vTemp, M.r[2], vResult); - vTemp = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = _mm_macc_ps(vTemp, M.r[1], vResult); - vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X - vResult = _mm_macc_ps(vTemp, M.r[0], vResult); + vResult = _mm_mul_ps(vResult, M.r[3]); + XMVECTOR vTemp = _mm_permute_ps(V, _MM_SHUFFLE(2, 2, 2, 2)); // Z + vResult = _mm_macc_ps(vTemp, M.r[2], vResult); + vTemp = _mm_permute_ps(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y + vResult = _mm_macc_ps(vTemp, M.r[1], vResult); + vTemp = _mm_permute_ps(V, _MM_SHUFFLE(0, 0, 0, 0)); // X + vResult = _mm_macc_ps(vTemp, M.r[0], vResult); return vResult; } - //------------------------------------------------------------------------------------- // Matrix //------------------------------------------------------------------------------------- - inline XMMATRIX XM_CALLCONV XMMatrixMultiply - ( - CXMMATRIX M1, - CXMMATRIX M2 - ) + inline XMMATRIX XM_CALLCONV XMMatrixMultiply(CXMMATRIX M1, CXMMATRIX M2) { XMMATRIX mResult; // Use vW to hold the original row @@ -297,52 +244,48 @@ namespace DirectX XMVECTOR vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); XMVECTOR vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); + vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); // Perform the operation on the first row - vX = _mm_mul_ps(vX, M2.r[0]); - vX = _mm_macc_ps(vY, M2.r[1], vX); - vX = _mm_macc_ps(vZ, M2.r[2], vX); - vX = _mm_macc_ps(vW, M2.r[3], vX); + vX = _mm_mul_ps(vX, M2.r[0]); + vX = _mm_macc_ps(vY, M2.r[1], vX); + vX = _mm_macc_ps(vZ, M2.r[2], vX); + vX = _mm_macc_ps(vW, M2.r[3], vX); mResult.r[0] = vX; // Repeat for the other 3 rows - vW = M1.r[1]; - vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); - vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); - vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); - vX = _mm_mul_ps(vX, M2.r[0]); - vX = _mm_macc_ps(vY, M2.r[1], vX); - vX = _mm_macc_ps(vZ, M2.r[2], vX); - vX = _mm_macc_ps(vW, M2.r[3], vX); + vW = M1.r[1]; + vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); + vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); + vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); + vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); + vX = _mm_mul_ps(vX, M2.r[0]); + vX = _mm_macc_ps(vY, M2.r[1], vX); + vX = _mm_macc_ps(vZ, M2.r[2], vX); + vX = _mm_macc_ps(vW, M2.r[3], vX); mResult.r[1] = vX; - vW = M1.r[2]; - vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); - vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); - vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); - vX = _mm_mul_ps(vX, M2.r[0]); - vX = _mm_macc_ps(vY, M2.r[1], vX); - vX = _mm_macc_ps(vZ, M2.r[2], vX); - vX = _mm_macc_ps(vW, M2.r[3], vX); + vW = M1.r[2]; + vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); + vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); + vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); + vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); + vX = _mm_mul_ps(vX, M2.r[0]); + vX = _mm_macc_ps(vY, M2.r[1], vX); + vX = _mm_macc_ps(vZ, M2.r[2], vX); + vX = _mm_macc_ps(vW, M2.r[3], vX); mResult.r[2] = vX; - vW = M1.r[3]; - vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); - vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); - vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); - vX = _mm_mul_ps(vX, M2.r[0]); - vX = _mm_macc_ps(vY, M2.r[1], vX); - vX = _mm_macc_ps(vZ, M2.r[2], vX); - vX = _mm_macc_ps(vW, M2.r[3], vX); + vW = M1.r[3]; + vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); + vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); + vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); + vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); + vX = _mm_mul_ps(vX, M2.r[0]); + vX = _mm_macc_ps(vY, M2.r[1], vX); + vX = _mm_macc_ps(vZ, M2.r[2], vX); + vX = _mm_macc_ps(vW, M2.r[3], vX); mResult.r[3] = vX; return mResult; } - inline XMMATRIX XM_CALLCONV XMMatrixMultiplyTranspose - ( - FXMMATRIX M1, - CXMMATRIX M2 - ) + inline XMMATRIX XM_CALLCONV XMMatrixMultiplyTranspose(FXMMATRIX M1, CXMMATRIX M2) { // Use vW to hold the original row XMVECTOR vW = M1.r[0]; @@ -350,43 +293,43 @@ namespace DirectX XMVECTOR vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); XMVECTOR vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); + vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); // Perform the operation on the first row - vX = _mm_mul_ps(vX, M2.r[0]); - vX = _mm_macc_ps(vY, M2.r[1], vX); - vX = _mm_macc_ps(vZ, M2.r[2], vX); - vX = _mm_macc_ps(vW, M2.r[3], vX); + vX = _mm_mul_ps(vX, M2.r[0]); + vX = _mm_macc_ps(vY, M2.r[1], vX); + vX = _mm_macc_ps(vZ, M2.r[2], vX); + vX = _mm_macc_ps(vW, M2.r[3], vX); __m128 r0 = vX; // Repeat for the other 3 rows - vW = M1.r[1]; - vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); - vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); - vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); - vX = _mm_mul_ps(vX, M2.r[0]); - vX = _mm_macc_ps(vY, M2.r[1], vX); - vX = _mm_macc_ps(vZ, M2.r[2], vX); - vX = _mm_macc_ps(vW, M2.r[3], vX); + vW = M1.r[1]; + vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); + vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); + vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); + vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); + vX = _mm_mul_ps(vX, M2.r[0]); + vX = _mm_macc_ps(vY, M2.r[1], vX); + vX = _mm_macc_ps(vZ, M2.r[2], vX); + vX = _mm_macc_ps(vW, M2.r[3], vX); __m128 r1 = vX; - vW = M1.r[2]; - vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); - vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); - vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); - vX = _mm_mul_ps(vX, M2.r[0]); - vX = _mm_macc_ps(vY, M2.r[1], vX); - vX = _mm_macc_ps(vZ, M2.r[2], vX); - vX = _mm_macc_ps(vW, M2.r[3], vX); + vW = M1.r[2]; + vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); + vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); + vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); + vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); + vX = _mm_mul_ps(vX, M2.r[0]); + vX = _mm_macc_ps(vY, M2.r[1], vX); + vX = _mm_macc_ps(vZ, M2.r[2], vX); + vX = _mm_macc_ps(vW, M2.r[3], vX); __m128 r2 = vX; - vW = M1.r[3]; - vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); - vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); - vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); - vX = _mm_mul_ps(vX, M2.r[0]); - vX = _mm_macc_ps(vY, M2.r[1], vX); - vX = _mm_macc_ps(vZ, M2.r[2], vX); - vX = _mm_macc_ps(vW, M2.r[3], vX); + vW = M1.r[3]; + vX = _mm_permute_ps(vW, _MM_SHUFFLE(0, 0, 0, 0)); + vY = _mm_permute_ps(vW, _MM_SHUFFLE(1, 1, 1, 1)); + vZ = _mm_permute_ps(vW, _MM_SHUFFLE(2, 2, 2, 2)); + vW = _mm_permute_ps(vW, _MM_SHUFFLE(3, 3, 3, 3)); + vX = _mm_mul_ps(vX, M2.r[0]); + vX = _mm_macc_ps(vY, M2.r[1], vX); + vX = _mm_macc_ps(vZ, M2.r[2], vX); + vX = _mm_macc_ps(vW, M2.r[3], vX); __m128 r3 = vX; // x.x,x.y,y.x,y.y @@ -412,4 +355,4 @@ namespace DirectX } // namespace FMA4 -} // namespace DirectX; +} // namespace DirectX diff --git a/Extensions/DirectXMathSSE3.h b/Extensions/DirectXMathSSE3.h index 667d1d91..6f864c60 100644 --- a/Extensions/DirectXMathSSE3.h +++ b/Extensions/DirectXMathSSE3.h @@ -29,32 +29,28 @@ namespace DirectX // See https://msdn.microsoft.com/en-us/library/hskdteyh.aspx int CPUInfo[4] = { -1 }; - #if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) +#if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) __cpuid(0, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]); - #else +#else __cpuid(CPUInfo, 0); - #endif +#endif if (CPUInfo[0] < 1) return false; - #if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) +#if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) __cpuid(1, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]); - #else +#else __cpuid(CPUInfo, 1); - #endif +#endif // We only check for SSE3 instruction set. SSSE3 instructions are not used. return ((CPUInfo[2] & 0x1) != 0); } - inline XMVECTOR XM_CALLCONV XMVector2Dot - ( - FXMVECTOR V1, - FXMVECTOR V2 - ) + inline XMVECTOR XM_CALLCONV XMVector2Dot(FXMVECTOR V1, FXMVECTOR V2) { XMVECTOR vTemp = _mm_mul_ps(V1, V2); - vTemp = _mm_hadd_ps(vTemp, vTemp); + vTemp = _mm_hadd_ps(vTemp, vTemp); return _mm_shuffle_ps(vTemp, vTemp, _MM_SHUFFLE(0, 0, 0, 0)); } @@ -63,15 +59,11 @@ namespace DirectX return SSE3::XMVector2Dot(V, V); } - inline XMVECTOR XM_CALLCONV XMVector3Dot - ( - FXMVECTOR V1, - FXMVECTOR V2 - ) + inline XMVECTOR XM_CALLCONV XMVector3Dot(FXMVECTOR V1, FXMVECTOR V2) { XMVECTOR vTemp = _mm_mul_ps(V1, V2); - vTemp = _mm_and_ps(vTemp, g_XMMask3); - vTemp = _mm_hadd_ps(vTemp, vTemp); + vTemp = _mm_and_ps(vTemp, g_XMMask3); + vTemp = _mm_hadd_ps(vTemp, vTemp); return _mm_hadd_ps(vTemp, vTemp); } @@ -80,14 +72,10 @@ namespace DirectX return SSE3::XMVector3Dot(V, V); } - inline XMVECTOR XM_CALLCONV XMVector4Dot - ( - FXMVECTOR V1, - FXMVECTOR V2 - ) + inline XMVECTOR XM_CALLCONV XMVector4Dot(FXMVECTOR V1, FXMVECTOR V2) { XMVECTOR vTemp = _mm_mul_ps(V1, V2); - vTemp = _mm_hadd_ps(vTemp, vTemp); + vTemp = _mm_hadd_ps(vTemp, vTemp); return _mm_hadd_ps(vTemp, vTemp); } diff --git a/Extensions/DirectXMathSSE4.h b/Extensions/DirectXMathSSE4.h index c20eafd1..b55d7762 100644 --- a/Extensions/DirectXMathSSE4.h +++ b/Extensions/DirectXMathSSE4.h @@ -29,46 +29,45 @@ namespace DirectX // See https://msdn.microsoft.com/en-us/library/hskdteyh.aspx int CPUInfo[4] = { -1 }; - #if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) +#if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) __cpuid(0, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]); - #else +#else __cpuid(CPUInfo, 0); - #endif +#endif if (CPUInfo[0] < 1) return false; - #if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) +#if (defined(__clang__) || defined(__GNUC__)) && !defined(_MSC_VER) && !defined(__MINGW32__) __cpuid(1, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]); - #else +#else __cpuid(CPUInfo, 1); - #endif +#endif // We only check for SSE4.1 instruction set. SSE4.2 instructions are not used. return ((CPUInfo[2] & 0x80000) == 0x80000); } - //------------------------------------------------------------------------------------- // Vector //------------------------------------------------------------------------------------- - #ifdef __clang__ - #pragma clang diagnostic ignored "-Wundefined-reinterpret-cast" - #endif +#ifdef __clang__ +#pragma clang diagnostic ignored "-Wundefined-reinterpret-cast" +#endif - inline void XM_CALLCONV XMVectorGetYPtr(_Out_ float *y, _In_ FXMVECTOR V) + inline void XM_CALLCONV XMVectorGetYPtr(_Out_ float* y, _In_ FXMVECTOR V) { assert(y != nullptr); *reinterpret_cast(y) = _mm_extract_ps(V, 1); } - inline void XM_CALLCONV XMVectorGetZPtr(_Out_ float *z, _In_ FXMVECTOR V) + inline void XM_CALLCONV XMVectorGetZPtr(_Out_ float* z, _In_ FXMVECTOR V) { assert(z != nullptr); *reinterpret_cast(z) = _mm_extract_ps(V, 2); } - inline void XM_CALLCONV XMVectorGetWPtr(_Out_ float *w, _In_ FXMVECTOR V) + inline void XM_CALLCONV XMVectorGetWPtr(_Out_ float* w, _In_ FXMVECTOR V) { assert(w != nullptr); *reinterpret_cast(w) = _mm_extract_ps(V, 3); @@ -92,66 +91,66 @@ namespace DirectX return static_cast(_mm_extract_epi32(V1, 3)); } - inline void XM_CALLCONV XMVectorGetIntYPtr(_Out_ uint32_t *y, _In_ FXMVECTOR V) + inline void XM_CALLCONV XMVectorGetIntYPtr(_Out_ uint32_t* y, _In_ FXMVECTOR V) { assert(y != nullptr); __m128i V1 = _mm_castps_si128(V); - *y = static_cast(_mm_extract_epi32(V1, 1)); + *y = static_cast(_mm_extract_epi32(V1, 1)); } - inline void XM_CALLCONV XMVectorGetIntZPtr(_Out_ uint32_t *z, _In_ FXMVECTOR V) + inline void XM_CALLCONV XMVectorGetIntZPtr(_Out_ uint32_t* z, _In_ FXMVECTOR V) { assert(z != nullptr); __m128i V1 = _mm_castps_si128(V); - *z = static_cast(_mm_extract_epi32(V1, 2)); + *z = static_cast(_mm_extract_epi32(V1, 2)); } - inline void XM_CALLCONV XMVectorGetIntWPtr(_Out_ uint32_t *w, _In_ FXMVECTOR V) + inline void XM_CALLCONV XMVectorGetIntWPtr(_Out_ uint32_t* w, _In_ FXMVECTOR V) { assert(w != nullptr); __m128i V1 = _mm_castps_si128(V); - *w = static_cast(_mm_extract_epi32(V1, 3)); + *w = static_cast(_mm_extract_epi32(V1, 3)); } inline XMVECTOR XM_CALLCONV XMVectorSetY(FXMVECTOR V, float y) { XMVECTOR vResult = _mm_set_ss(y); - vResult = _mm_insert_ps(V, vResult, 0x10); + vResult = _mm_insert_ps(V, vResult, 0x10); return vResult; } inline XMVECTOR XM_CALLCONV XMVectorSetZ(FXMVECTOR V, float z) { XMVECTOR vResult = _mm_set_ss(z); - vResult = _mm_insert_ps(V, vResult, 0x20); + vResult = _mm_insert_ps(V, vResult, 0x20); return vResult; } inline XMVECTOR XM_CALLCONV XMVectorSetW(FXMVECTOR V, float w) { XMVECTOR vResult = _mm_set_ss(w); - vResult = _mm_insert_ps(V, vResult, 0x30); + vResult = _mm_insert_ps(V, vResult, 0x30); return vResult; } inline XMVECTOR XM_CALLCONV XMVectorSetIntY(FXMVECTOR V, uint32_t y) { __m128i vResult = _mm_castps_si128(V); - vResult = _mm_insert_epi32(vResult, static_cast(y), 1); + vResult = _mm_insert_epi32(vResult, static_cast(y), 1); return _mm_castsi128_ps(vResult); } inline XMVECTOR XM_CALLCONV XMVectorSetIntZ(FXMVECTOR V, uint32_t z) { __m128i vResult = _mm_castps_si128(V); - vResult = _mm_insert_epi32(vResult, static_cast(z), 2); + vResult = _mm_insert_epi32(vResult, static_cast(z), 2); return _mm_castsi128_ps(vResult); } inline XMVECTOR XM_CALLCONV XMVectorSetIntW(FXMVECTOR V, uint32_t w) { __m128i vResult = _mm_castps_si128(V); - vResult = _mm_insert_epi32(vResult, static_cast(w), 3); + vResult = _mm_insert_epi32(vResult, static_cast(w), 3); return _mm_castsi128_ps(vResult); } @@ -175,7 +174,6 @@ namespace DirectX return _mm_ceil_ps(V); } - //------------------------------------------------------------------------------------- // Vector2 //------------------------------------------------------------------------------------- @@ -198,7 +196,7 @@ namespace DirectX inline XMVECTOR XM_CALLCONV XMVector2ReciprocalLength(FXMVECTOR V) { - XMVECTOR vTemp = _mm_dp_ps(V, V, 0x3f); + XMVECTOR vTemp = _mm_dp_ps(V, V, 0x3f); XMVECTOR vLengthSq = _mm_sqrt_ps(vTemp); return _mm_div_ps(g_XMOne, vLengthSq); } @@ -217,7 +215,7 @@ namespace DirectX inline XMVECTOR XM_CALLCONV XMVector2NormalizeEst(FXMVECTOR V) { - XMVECTOR vTemp = _mm_dp_ps(V, V, 0x3f); + XMVECTOR vTemp = _mm_dp_ps(V, V, 0x3f); XMVECTOR vResult = _mm_rsqrt_ps(vTemp); return _mm_mul_ps(vResult, V); } @@ -241,11 +239,10 @@ namespace DirectX // Select qnan or result based on infinite length XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); - vResult = _mm_or_ps(vTemp1, vTemp2); + vResult = _mm_or_ps(vTemp1, vTemp2); return vResult; } - //------------------------------------------------------------------------------------- // Vector3 //------------------------------------------------------------------------------------- @@ -268,7 +265,7 @@ namespace DirectX inline XMVECTOR XM_CALLCONV XMVector3ReciprocalLength(FXMVECTOR V) { - XMVECTOR vTemp = _mm_dp_ps(V, V, 0x7f); + XMVECTOR vTemp = _mm_dp_ps(V, V, 0x7f); XMVECTOR vLengthSq = _mm_sqrt_ps(vTemp); return _mm_div_ps(g_XMOne, vLengthSq); } @@ -287,7 +284,7 @@ namespace DirectX inline XMVECTOR XM_CALLCONV XMVector3NormalizeEst(FXMVECTOR V) { - XMVECTOR vTemp = _mm_dp_ps(V, V, 0x7f); + XMVECTOR vTemp = _mm_dp_ps(V, V, 0x7f); XMVECTOR vResult = _mm_rsqrt_ps(vTemp); return _mm_mul_ps(vResult, V); } @@ -311,11 +308,10 @@ namespace DirectX // Select qnan or result based on infinite length XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); - vResult = _mm_or_ps(vTemp1, vTemp2); + vResult = _mm_or_ps(vTemp1, vTemp2); return vResult; } - //------------------------------------------------------------------------------------- // Vector4 //------------------------------------------------------------------------------------- @@ -338,7 +334,7 @@ namespace DirectX inline XMVECTOR XM_CALLCONV XMVector4ReciprocalLength(FXMVECTOR V) { - XMVECTOR vTemp = _mm_dp_ps(V, V, 0xff); + XMVECTOR vTemp = _mm_dp_ps(V, V, 0xff); XMVECTOR vLengthSq = _mm_sqrt_ps(vTemp); return _mm_div_ps(g_XMOne, vLengthSq); } @@ -357,7 +353,7 @@ namespace DirectX inline XMVECTOR XM_CALLCONV XMVector4NormalizeEst(FXMVECTOR V) { - XMVECTOR vTemp = _mm_dp_ps(V, V, 0xff); + XMVECTOR vTemp = _mm_dp_ps(V, V, 0xff); XMVECTOR vResult = _mm_rsqrt_ps(vTemp); return _mm_mul_ps(vResult, V); } @@ -381,18 +377,17 @@ namespace DirectX // Select qnan or result based on infinite length XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); - vResult = _mm_or_ps(vTemp1, vTemp2); + vResult = _mm_or_ps(vTemp1, vTemp2); return vResult; } - //------------------------------------------------------------------------------------- // Plane //------------------------------------------------------------------------------------- inline XMVECTOR XM_CALLCONV XMPlaneNormalizeEst(FXMVECTOR P) { - XMVECTOR vTemp = _mm_dp_ps(P, P, 0x7f); + XMVECTOR vTemp = _mm_dp_ps(P, P, 0x7f); XMVECTOR vResult = _mm_rsqrt_ps(vTemp); return _mm_mul_ps(vResult, P); } diff --git a/Inc/DirectXCollision.h b/Inc/DirectXCollision.h index e5aff7c8..cdaedc86 100644 --- a/Inc/DirectXCollision.h +++ b/Inc/DirectXCollision.h @@ -16,16 +16,16 @@ namespace DirectX enum ContainmentType { - DISJOINT = 0, + DISJOINT = 0, INTERSECTS = 1, - CONTAINS = 2 + CONTAINS = 2 }; enum PlaneIntersectionType { - FRONT = 0, + FRONT = 0, INTERSECTING = 1, - BACK = 2 + BACK = 2 }; struct BoundingBox; @@ -34,7 +34,7 @@ namespace DirectX #ifdef _MSC_VER #pragma warning(push) -#pragma warning(disable:4324 4820) +#pragma warning(disable : 4324 4820) // C4324: alignment padding warnings // C4820: Off by default noise #endif @@ -44,49 +44,61 @@ namespace DirectX //------------------------------------------------------------------------------------- struct BoundingSphere { - XMFLOAT3 Center; // Center of the sphere. - float Radius; // Radius of the sphere. + XMFLOAT3 Center; // Center of the sphere. + float Radius; // Radius of the sphere. // Creators - BoundingSphere() noexcept : Center(0, 0, 0), Radius(1.f) {} + BoundingSphere() noexcept + : Center(0, 0, 0), + Radius(1.f) + {} - BoundingSphere(const BoundingSphere&) = default; + BoundingSphere(const BoundingSphere&) = default; BoundingSphere& operator=(const BoundingSphere&) = default; - BoundingSphere(BoundingSphere&&) = default; + BoundingSphere(BoundingSphere&&) = default; BoundingSphere& operator=(BoundingSphere&&) = default; constexpr BoundingSphere(_In_ const XMFLOAT3& center, _In_ float radius) noexcept - : Center(center), Radius(radius) {} + : Center(center), + Radius(radius) + {} // Methods - void XM_CALLCONV Transform(_Out_ BoundingSphere& Out, _In_ FXMMATRIX M) const noexcept; - void XM_CALLCONV Transform(_Out_ BoundingSphere& Out, _In_ float Scale, _In_ FXMVECTOR Rotation, _In_ FXMVECTOR Translation) const noexcept; + void XM_CALLCONV Transform(_Out_ BoundingSphere& Out, _In_ FXMMATRIX M) const noexcept; + void XM_CALLCONV Transform(_Out_ BoundingSphere& Out, + _In_ float Scale, + _In_ FXMVECTOR Rotation, + _In_ FXMVECTOR Translation) const noexcept; // Transform the sphere - ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR Point) const noexcept; - ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2) const noexcept; - ContainmentType Contains(_In_ const BoundingSphere& sh) const noexcept; - ContainmentType Contains(_In_ const BoundingBox& box) const noexcept; - ContainmentType Contains(_In_ const BoundingOrientedBox& box) const noexcept; - ContainmentType Contains(_In_ const BoundingFrustum& fr) const noexcept; + ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR Point) const noexcept; + ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2) const noexcept; + ContainmentType Contains(_In_ const BoundingSphere& sh) const noexcept; + ContainmentType Contains(_In_ const BoundingBox& box) const noexcept; + ContainmentType Contains(_In_ const BoundingOrientedBox& box) const noexcept; + ContainmentType Contains(_In_ const BoundingFrustum& fr) const noexcept; bool Intersects(_In_ const BoundingSphere& sh) const noexcept; bool Intersects(_In_ const BoundingBox& box) const noexcept; bool Intersects(_In_ const BoundingOrientedBox& box) const noexcept; bool Intersects(_In_ const BoundingFrustum& fr) const noexcept; - bool XM_CALLCONV Intersects(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2) const noexcept; + bool XM_CALLCONV Intersects(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2) const noexcept; // Triangle-sphere test - PlaneIntersectionType XM_CALLCONV Intersects(_In_ FXMVECTOR Plane) const noexcept; + PlaneIntersectionType XM_CALLCONV Intersects(_In_ FXMVECTOR Plane) const noexcept; // Plane-sphere test - bool XM_CALLCONV Intersects(_In_ FXMVECTOR Origin, _In_ FXMVECTOR Direction, _Out_ float& Dist) const noexcept; + bool XM_CALLCONV Intersects(_In_ FXMVECTOR Origin, _In_ FXMVECTOR Direction, _Out_ float& Dist) const noexcept; // Ray-sphere test - ContainmentType XM_CALLCONV ContainedBy(_In_ FXMVECTOR Plane0, _In_ FXMVECTOR Plane1, _In_ FXMVECTOR Plane2, - _In_ GXMVECTOR Plane3, _In_ HXMVECTOR Plane4, _In_ HXMVECTOR Plane5) const noexcept; + ContainmentType XM_CALLCONV ContainedBy(_In_ FXMVECTOR Plane0, + _In_ FXMVECTOR Plane1, + _In_ FXMVECTOR Plane2, + _In_ GXMVECTOR Plane3, + _In_ HXMVECTOR Plane4, + _In_ HXMVECTOR Plane5) const noexcept; // Test sphere against six planes (see BoundingFrustum::GetPlanes) // Static methods @@ -95,8 +107,10 @@ namespace DirectX static void CreateFromBoundingBox(_Out_ BoundingSphere& Out, _In_ const BoundingBox& box) noexcept; static void CreateFromBoundingBox(_Out_ BoundingSphere& Out, _In_ const BoundingOrientedBox& box) noexcept; - static void CreateFromPoints(_Out_ BoundingSphere& Out, _In_ size_t Count, - _In_reads_bytes_(sizeof(XMFLOAT3) + Stride * (Count - 1)) const XMFLOAT3* pPoints, _In_ size_t Stride) noexcept; + static void CreateFromPoints(_Out_ BoundingSphere& Out, + _In_ size_t Count, + _In_reads_bytes_(sizeof(XMFLOAT3) + Stride * (Count - 1)) const XMFLOAT3* pPoints, + _In_ size_t Stride) noexcept; static void CreateFromFrustum(_Out_ BoundingSphere& Out, _In_ const BoundingFrustum& fr) noexcept; }; @@ -108,51 +122,63 @@ namespace DirectX { static constexpr size_t CORNER_COUNT = 8; - XMFLOAT3 Center; // Center of the box. - XMFLOAT3 Extents; // Distance from the center to each side. + XMFLOAT3 Center; // Center of the box. + XMFLOAT3 Extents; // Distance from the center to each side. // Creators - BoundingBox() noexcept : Center(0, 0, 0), Extents(1.f, 1.f, 1.f) {} + BoundingBox() noexcept + : Center(0, 0, 0), + Extents(1.f, 1.f, 1.f) + {} - BoundingBox(const BoundingBox&) = default; + BoundingBox(const BoundingBox&) = default; BoundingBox& operator=(const BoundingBox&) = default; - BoundingBox(BoundingBox&&) = default; + BoundingBox(BoundingBox&&) = default; BoundingBox& operator=(BoundingBox&&) = default; constexpr BoundingBox(_In_ const XMFLOAT3& center, _In_ const XMFLOAT3& extents) noexcept - : Center(center), Extents(extents) {} + : Center(center), + Extents(extents) + {} // Methods - void XM_CALLCONV Transform(_Out_ BoundingBox& Out, _In_ FXMMATRIX M) const noexcept; - void XM_CALLCONV Transform(_Out_ BoundingBox& Out, _In_ float Scale, _In_ FXMVECTOR Rotation, _In_ FXMVECTOR Translation) const noexcept; + void XM_CALLCONV Transform(_Out_ BoundingBox& Out, _In_ FXMMATRIX M) const noexcept; + void XM_CALLCONV Transform(_Out_ BoundingBox& Out, + _In_ float Scale, + _In_ FXMVECTOR Rotation, + _In_ FXMVECTOR Translation) const noexcept; void GetCorners(_Out_writes_(8) XMFLOAT3* Corners) const noexcept; // Gets the 8 corners of the box - ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR Point) const noexcept; - ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2) const noexcept; - ContainmentType Contains(_In_ const BoundingSphere& sh) const noexcept; - ContainmentType Contains(_In_ const BoundingBox& box) const noexcept; - ContainmentType Contains(_In_ const BoundingOrientedBox& box) const noexcept; - ContainmentType Contains(_In_ const BoundingFrustum& fr) const noexcept; + ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR Point) const noexcept; + ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2) const noexcept; + ContainmentType Contains(_In_ const BoundingSphere& sh) const noexcept; + ContainmentType Contains(_In_ const BoundingBox& box) const noexcept; + ContainmentType Contains(_In_ const BoundingOrientedBox& box) const noexcept; + ContainmentType Contains(_In_ const BoundingFrustum& fr) const noexcept; bool Intersects(_In_ const BoundingSphere& sh) const noexcept; bool Intersects(_In_ const BoundingBox& box) const noexcept; bool Intersects(_In_ const BoundingOrientedBox& box) const noexcept; bool Intersects(_In_ const BoundingFrustum& fr) const noexcept; - bool XM_CALLCONV Intersects(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2) const noexcept; + bool XM_CALLCONV Intersects(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2) const noexcept; // Triangle-Box test - PlaneIntersectionType XM_CALLCONV Intersects(_In_ FXMVECTOR Plane) const noexcept; + PlaneIntersectionType XM_CALLCONV Intersects(_In_ FXMVECTOR Plane) const noexcept; // Plane-box test - bool XM_CALLCONV Intersects(_In_ FXMVECTOR Origin, _In_ FXMVECTOR Direction, _Out_ float& Dist) const noexcept; + bool XM_CALLCONV Intersects(_In_ FXMVECTOR Origin, _In_ FXMVECTOR Direction, _Out_ float& Dist) const noexcept; // Ray-Box test - ContainmentType XM_CALLCONV ContainedBy(_In_ FXMVECTOR Plane0, _In_ FXMVECTOR Plane1, _In_ FXMVECTOR Plane2, - _In_ GXMVECTOR Plane3, _In_ HXMVECTOR Plane4, _In_ HXMVECTOR Plane5) const noexcept; + ContainmentType XM_CALLCONV ContainedBy(_In_ FXMVECTOR Plane0, + _In_ FXMVECTOR Plane1, + _In_ FXMVECTOR Plane2, + _In_ GXMVECTOR Plane3, + _In_ HXMVECTOR Plane4, + _In_ HXMVECTOR Plane5) const noexcept; // Test box against six planes (see BoundingFrustum::GetPlanes) // Static methods @@ -160,9 +186,11 @@ namespace DirectX static void CreateFromSphere(_Out_ BoundingBox& Out, _In_ const BoundingSphere& sh) noexcept; - static void XM_CALLCONV CreateFromPoints(_Out_ BoundingBox& Out, _In_ FXMVECTOR pt1, _In_ FXMVECTOR pt2) noexcept; - static void CreateFromPoints(_Out_ BoundingBox& Out, _In_ size_t Count, - _In_reads_bytes_(sizeof(XMFLOAT3) + Stride * (Count - 1)) const XMFLOAT3* pPoints, _In_ size_t Stride) noexcept; + static void XM_CALLCONV CreateFromPoints(_Out_ BoundingBox& Out, _In_ FXMVECTOR pt1, _In_ FXMVECTOR pt2) noexcept; + static void CreateFromPoints(_Out_ BoundingBox& Out, + _In_ size_t Count, + _In_reads_bytes_(sizeof(XMFLOAT3) + Stride * (Count - 1)) const XMFLOAT3* pPoints, + _In_ size_t Stride) noexcept; }; //------------------------------------------------------------------------------------- @@ -172,59 +200,75 @@ namespace DirectX { static constexpr size_t CORNER_COUNT = 8; - XMFLOAT3 Center; // Center of the box. - XMFLOAT3 Extents; // Distance from the center to each side. - XMFLOAT4 Orientation; // Unit quaternion representing rotation (box -> world). + XMFLOAT3 Center; // Center of the box. + XMFLOAT3 Extents; // Distance from the center to each side. + XMFLOAT4 Orientation; // Unit quaternion representing rotation (box -> world). // Creators - BoundingOrientedBox() noexcept : Center(0, 0, 0), Extents(1.f, 1.f, 1.f), Orientation(0, 0, 0, 1.f) {} + BoundingOrientedBox() noexcept + : Center(0, 0, 0), + Extents(1.f, 1.f, 1.f), + Orientation(0, 0, 0, 1.f) + {} - BoundingOrientedBox(const BoundingOrientedBox&) = default; + BoundingOrientedBox(const BoundingOrientedBox&) = default; BoundingOrientedBox& operator=(const BoundingOrientedBox&) = default; - BoundingOrientedBox(BoundingOrientedBox&&) = default; + BoundingOrientedBox(BoundingOrientedBox&&) = default; BoundingOrientedBox& operator=(BoundingOrientedBox&&) = default; constexpr BoundingOrientedBox(_In_ const XMFLOAT3& center, _In_ const XMFLOAT3& extents, _In_ const XMFLOAT4& orientation) noexcept - : Center(center), Extents(extents), Orientation(orientation) {} + : Center(center), + Extents(extents), + Orientation(orientation) + {} // Methods - void XM_CALLCONV Transform(_Out_ BoundingOrientedBox& Out, _In_ FXMMATRIX M) const noexcept; - void XM_CALLCONV Transform(_Out_ BoundingOrientedBox& Out, _In_ float Scale, _In_ FXMVECTOR Rotation, _In_ FXMVECTOR Translation) const noexcept; + void XM_CALLCONV Transform(_Out_ BoundingOrientedBox& Out, _In_ FXMMATRIX M) const noexcept; + void XM_CALLCONV Transform(_Out_ BoundingOrientedBox& Out, + _In_ float Scale, + _In_ FXMVECTOR Rotation, + _In_ FXMVECTOR Translation) const noexcept; void GetCorners(_Out_writes_(8) XMFLOAT3* Corners) const noexcept; // Gets the 8 corners of the box - ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR Point) const noexcept; - ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2) const noexcept; - ContainmentType Contains(_In_ const BoundingSphere& sh) const noexcept; - ContainmentType Contains(_In_ const BoundingBox& box) const noexcept; - ContainmentType Contains(_In_ const BoundingOrientedBox& box) const noexcept; - ContainmentType Contains(_In_ const BoundingFrustum& fr) const noexcept; + ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR Point) const noexcept; + ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2) const noexcept; + ContainmentType Contains(_In_ const BoundingSphere& sh) const noexcept; + ContainmentType Contains(_In_ const BoundingBox& box) const noexcept; + ContainmentType Contains(_In_ const BoundingOrientedBox& box) const noexcept; + ContainmentType Contains(_In_ const BoundingFrustum& fr) const noexcept; bool Intersects(_In_ const BoundingSphere& sh) const noexcept; bool Intersects(_In_ const BoundingBox& box) const noexcept; bool Intersects(_In_ const BoundingOrientedBox& box) const noexcept; bool Intersects(_In_ const BoundingFrustum& fr) const noexcept; - bool XM_CALLCONV Intersects(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2) const noexcept; + bool XM_CALLCONV Intersects(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2) const noexcept; // Triangle-OrientedBox test - PlaneIntersectionType XM_CALLCONV Intersects(_In_ FXMVECTOR Plane) const noexcept; + PlaneIntersectionType XM_CALLCONV Intersects(_In_ FXMVECTOR Plane) const noexcept; // Plane-OrientedBox test - bool XM_CALLCONV Intersects(_In_ FXMVECTOR Origin, _In_ FXMVECTOR Direction, _Out_ float& Dist) const noexcept; + bool XM_CALLCONV Intersects(_In_ FXMVECTOR Origin, _In_ FXMVECTOR Direction, _Out_ float& Dist) const noexcept; // Ray-OrientedBox test - ContainmentType XM_CALLCONV ContainedBy(_In_ FXMVECTOR Plane0, _In_ FXMVECTOR Plane1, _In_ FXMVECTOR Plane2, - _In_ GXMVECTOR Plane3, _In_ HXMVECTOR Plane4, _In_ HXMVECTOR Plane5) const noexcept; + ContainmentType XM_CALLCONV ContainedBy(_In_ FXMVECTOR Plane0, + _In_ FXMVECTOR Plane1, + _In_ FXMVECTOR Plane2, + _In_ GXMVECTOR Plane3, + _In_ HXMVECTOR Plane4, + _In_ HXMVECTOR Plane5) const noexcept; // Test OrientedBox against six planes (see BoundingFrustum::GetPlanes) // Static methods static void CreateFromBoundingBox(_Out_ BoundingOrientedBox& Out, _In_ const BoundingBox& box) noexcept; - static void CreateFromPoints(_Out_ BoundingOrientedBox& Out, _In_ size_t Count, - _In_reads_bytes_(sizeof(XMFLOAT3) + Stride * (Count - 1)) const XMFLOAT3* pPoints, _In_ size_t Stride) noexcept; + static void CreateFromPoints(_Out_ BoundingOrientedBox& Out, + _In_ size_t Count, + _In_reads_bytes_(sizeof(XMFLOAT3) + Stride * (Count - 1)) const XMFLOAT3* pPoints, + _In_ size_t Stride) noexcept; }; //------------------------------------------------------------------------------------- @@ -234,47 +278,68 @@ namespace DirectX { static constexpr size_t CORNER_COUNT = 8; - XMFLOAT3 Origin; // Origin of the frustum (and projection). - XMFLOAT4 Orientation; // Quaternion representing rotation. + XMFLOAT3 Origin; // Origin of the frustum (and projection). + XMFLOAT4 Orientation; // Quaternion representing rotation. - float RightSlope; // Positive X (X/Z) - float LeftSlope; // Negative X - float TopSlope; // Positive Y (Y/Z) - float BottomSlope; // Negative Y - float Near, Far; // Z of the near plane and far plane. + float RightSlope; // Positive X (X/Z) + float LeftSlope; // Negative X + float TopSlope; // Positive Y (Y/Z) + float BottomSlope; // Negative Y + float Near, Far; // Z of the near plane and far plane. // Creators - BoundingFrustum() noexcept : - Origin(0, 0, 0), Orientation(0, 0, 0, 1.f), RightSlope(1.f), LeftSlope(-1.f), - TopSlope(1.f), BottomSlope(-1.f), Near(0), Far(1.f) {} - - BoundingFrustum(const BoundingFrustum&) = default; + BoundingFrustum() noexcept + : Origin(0, 0, 0), + Orientation(0, 0, 0, 1.f), + RightSlope(1.f), + LeftSlope(-1.f), + TopSlope(1.f), + BottomSlope(-1.f), + Near(0), + Far(1.f) + {} + + BoundingFrustum(const BoundingFrustum&) = default; BoundingFrustum& operator=(const BoundingFrustum&) = default; - BoundingFrustum(BoundingFrustum&&) = default; + BoundingFrustum(BoundingFrustum&&) = default; BoundingFrustum& operator=(BoundingFrustum&&) = default; - constexpr BoundingFrustum(_In_ const XMFLOAT3& origin, _In_ const XMFLOAT4& orientation, - _In_ float rightSlope, _In_ float leftSlope, _In_ float topSlope, _In_ float bottomSlope, - _In_ float nearPlane, _In_ float farPlane) noexcept - : Origin(origin), Orientation(orientation), - RightSlope(rightSlope), LeftSlope(leftSlope), TopSlope(topSlope), BottomSlope(bottomSlope), - Near(nearPlane), Far(farPlane) {} + constexpr BoundingFrustum(_In_ const XMFLOAT3& origin, + _In_ const XMFLOAT4& orientation, + _In_ float rightSlope, + _In_ float leftSlope, + _In_ float topSlope, + _In_ float bottomSlope, + _In_ float nearPlane, + _In_ float farPlane) noexcept + : Origin(origin), + Orientation(orientation), + RightSlope(rightSlope), + LeftSlope(leftSlope), + TopSlope(topSlope), + BottomSlope(bottomSlope), + Near(nearPlane), + Far(farPlane) + {} BoundingFrustum(_In_ CXMMATRIX Projection, bool rhcoords = false) noexcept; // Methods - void XM_CALLCONV Transform(_Out_ BoundingFrustum& Out, _In_ FXMMATRIX M) const noexcept; - void XM_CALLCONV Transform(_Out_ BoundingFrustum& Out, _In_ float Scale, _In_ FXMVECTOR Rotation, _In_ FXMVECTOR Translation) const noexcept; + void XM_CALLCONV Transform(_Out_ BoundingFrustum& Out, _In_ FXMMATRIX M) const noexcept; + void XM_CALLCONV Transform(_Out_ BoundingFrustum& Out, + _In_ float Scale, + _In_ FXMVECTOR Rotation, + _In_ FXMVECTOR Translation) const noexcept; void GetCorners(_Out_writes_(8) XMFLOAT3* Corners) const noexcept; // Gets the 8 corners of the frustum - ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR Point) const noexcept; - ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2) const noexcept; - ContainmentType Contains(_In_ const BoundingSphere& sp) const noexcept; - ContainmentType Contains(_In_ const BoundingBox& box) const noexcept; - ContainmentType Contains(_In_ const BoundingOrientedBox& box) const noexcept; - ContainmentType Contains(_In_ const BoundingFrustum& fr) const noexcept; + ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR Point) const noexcept; + ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2) const noexcept; + ContainmentType Contains(_In_ const BoundingSphere& sp) const noexcept; + ContainmentType Contains(_In_ const BoundingBox& box) const noexcept; + ContainmentType Contains(_In_ const BoundingOrientedBox& box) const noexcept; + ContainmentType Contains(_In_ const BoundingFrustum& fr) const noexcept; // Frustum-Frustum test bool Intersects(_In_ const BoundingSphere& sh) const noexcept; @@ -282,25 +347,33 @@ namespace DirectX bool Intersects(_In_ const BoundingOrientedBox& box) const noexcept; bool Intersects(_In_ const BoundingFrustum& fr) const noexcept; - bool XM_CALLCONV Intersects(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2) const noexcept; + bool XM_CALLCONV Intersects(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2) const noexcept; // Triangle-Frustum test - PlaneIntersectionType XM_CALLCONV Intersects(_In_ FXMVECTOR Plane) const noexcept; + PlaneIntersectionType XM_CALLCONV Intersects(_In_ FXMVECTOR Plane) const noexcept; // Plane-Frustum test - bool XM_CALLCONV Intersects(_In_ FXMVECTOR rayOrigin, _In_ FXMVECTOR Direction, _Out_ float& Dist) const noexcept; + bool XM_CALLCONV Intersects(_In_ FXMVECTOR rayOrigin, _In_ FXMVECTOR Direction, _Out_ float& Dist) const noexcept; // Ray-Frustum test - ContainmentType XM_CALLCONV ContainedBy(_In_ FXMVECTOR Plane0, _In_ FXMVECTOR Plane1, _In_ FXMVECTOR Plane2, - _In_ GXMVECTOR Plane3, _In_ HXMVECTOR Plane4, _In_ HXMVECTOR Plane5) const noexcept; + ContainmentType XM_CALLCONV ContainedBy(_In_ FXMVECTOR Plane0, + _In_ FXMVECTOR Plane1, + _In_ FXMVECTOR Plane2, + _In_ GXMVECTOR Plane3, + _In_ HXMVECTOR Plane4, + _In_ HXMVECTOR Plane5) const noexcept; // Test frustum against six planes (see BoundingFrustum::GetPlanes) - void GetPlanes(_Out_opt_ XMVECTOR* NearPlane, _Out_opt_ XMVECTOR* FarPlane, _Out_opt_ XMVECTOR* RightPlane, - _Out_opt_ XMVECTOR* LeftPlane, _Out_opt_ XMVECTOR* TopPlane, _Out_opt_ XMVECTOR* BottomPlane) const noexcept; + void GetPlanes(_Out_opt_ XMVECTOR* NearPlane, + _Out_opt_ XMVECTOR* FarPlane, + _Out_opt_ XMVECTOR* RightPlane, + _Out_opt_ XMVECTOR* LeftPlane, + _Out_opt_ XMVECTOR* TopPlane, + _Out_opt_ XMVECTOR* BottomPlane) const noexcept; // Create 6 Planes representation of Frustum // Static methods - static void XM_CALLCONV CreateFromMatrix(_Out_ BoundingFrustum& Out, _In_ FXMMATRIX Projection, bool rhcoords = false) noexcept; + static void XM_CALLCONV CreateFromMatrix(_Out_ BoundingFrustum& Out, _In_ FXMMATRIX Projection, bool rhcoords = false) noexcept; }; //----------------------------------------------------------------------------- @@ -308,20 +381,39 @@ namespace DirectX //----------------------------------------------------------------------------- namespace TriangleTests { - bool XM_CALLCONV Intersects(_In_ FXMVECTOR Origin, _In_ FXMVECTOR Direction, _In_ FXMVECTOR V0, _In_ GXMVECTOR V1, _In_ HXMVECTOR V2, _Out_ float& Dist) noexcept; + bool XM_CALLCONV Intersects(_In_ FXMVECTOR Origin, + _In_ FXMVECTOR Direction, + _In_ FXMVECTOR V0, + _In_ GXMVECTOR V1, + _In_ HXMVECTOR V2, + _Out_ float& Dist) noexcept; // Ray-Triangle - bool XM_CALLCONV Intersects(_In_ FXMVECTOR A0, _In_ FXMVECTOR A1, _In_ FXMVECTOR A2, _In_ GXMVECTOR B0, _In_ HXMVECTOR B1, _In_ HXMVECTOR B2) noexcept; + bool XM_CALLCONV Intersects(_In_ FXMVECTOR A0, + _In_ FXMVECTOR A1, + _In_ FXMVECTOR A2, + _In_ GXMVECTOR B0, + _In_ HXMVECTOR B1, + _In_ HXMVECTOR B2) noexcept; // Triangle-Triangle - PlaneIntersectionType XM_CALLCONV Intersects(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2, _In_ GXMVECTOR Plane) noexcept; + PlaneIntersectionType XM_CALLCONV Intersects(_In_ FXMVECTOR V0, + _In_ FXMVECTOR V1, + _In_ FXMVECTOR V2, + _In_ GXMVECTOR Plane) noexcept; // Plane-Triangle - ContainmentType XM_CALLCONV ContainedBy(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2, - _In_ GXMVECTOR Plane0, _In_ HXMVECTOR Plane1, _In_ HXMVECTOR Plane2, - _In_ CXMVECTOR Plane3, _In_ CXMVECTOR Plane4, _In_ CXMVECTOR Plane5) noexcept; + ContainmentType XM_CALLCONV ContainedBy(_In_ FXMVECTOR V0, + _In_ FXMVECTOR V1, + _In_ FXMVECTOR V2, + _In_ GXMVECTOR Plane0, + _In_ HXMVECTOR Plane1, + _In_ HXMVECTOR Plane2, + _In_ CXMVECTOR Plane3, + _In_ CXMVECTOR Plane4, + _In_ CXMVECTOR Plane5) noexcept; // Test a triangle against six planes at once (see BoundingFrustum::GetPlanes) - } + } // namespace TriangleTests #ifdef _MSC_VER #pragma warning(pop) @@ -367,4 +459,3 @@ namespace DirectX #endif } // namespace DirectX - diff --git a/Inc/DirectXCollision.inl b/Inc/DirectXCollision.inl index 924a6eca..1d6f2d31 100644 --- a/Inc/DirectXCollision.inl +++ b/Inc/DirectXCollision.inl @@ -9,22 +9,21 @@ #pragma once -XMGLOBALCONST XMVECTORF32 g_BoxOffset[8] = -{ - { { { -1.0f, -1.0f, 1.0f, 0.0f } } }, - { { { 1.0f, -1.0f, 1.0f, 0.0f } } }, - { { { 1.0f, 1.0f, 1.0f, 0.0f } } }, - { { { -1.0f, 1.0f, 1.0f, 0.0f } } }, +XMGLOBALCONST XMVECTORF32 g_BoxOffset[8] = { + { { { -1.0f, -1.0f, 1.0f, 0.0f } } }, + { { { 1.0f, -1.0f, 1.0f, 0.0f } } }, + { { { 1.0f, 1.0f, 1.0f, 0.0f } } }, + { { { -1.0f, 1.0f, 1.0f, 0.0f } } }, { { { -1.0f, -1.0f, -1.0f, 0.0f } } }, - { { { 1.0f, -1.0f, -1.0f, 0.0f } } }, - { { { 1.0f, 1.0f, -1.0f, 0.0f } } }, - { { { -1.0f, 1.0f, -1.0f, 0.0f } } }, + { { { 1.0f, -1.0f, -1.0f, 0.0f } } }, + { { { 1.0f, 1.0f, -1.0f, 0.0f } } }, + { { { -1.0f, 1.0f, -1.0f, 0.0f } } }, }; -XMGLOBALCONST XMVECTORF32 g_RayEpsilon = { { { 1e-20f, 1e-20f, 1e-20f, 1e-20f } } }; +XMGLOBALCONST XMVECTORF32 g_RayEpsilon = { { { 1e-20f, 1e-20f, 1e-20f, 1e-20f } } }; XMGLOBALCONST XMVECTORF32 g_RayNegEpsilon = { { { -1e-20f, -1e-20f, -1e-20f, -1e-20f } } }; -XMGLOBALCONST XMVECTORF32 g_FltMin = { { { -FLT_MAX, -FLT_MAX, -FLT_MAX, -FLT_MAX } } }; -XMGLOBALCONST XMVECTORF32 g_FltMax = { { { FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX } } }; +XMGLOBALCONST XMVECTORF32 g_FltMin = { { { -FLT_MAX, -FLT_MAX, -FLT_MAX, -FLT_MAX } } }; +XMGLOBALCONST XMVECTORF32 g_FltMax = { { { FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX } } }; namespace MathInternal { @@ -41,7 +40,6 @@ namespace MathInternal return XMComparisonAnyTrue(XMVector4EqualIntR(C, XMVectorTrueInt())); } - //----------------------------------------------------------------------------- // Return true if all of the elements of a 3 vector are equal to 0xffffffff. // Slightly more efficient than using XMVector3EqualInt. @@ -56,9 +54,9 @@ namespace MathInternal #if defined(_PREFAST_) || !defined(NDEBUG) - XMGLOBALCONST XMVECTORF32 g_UnitVectorEpsilon = { { { 1.0e-4f, 1.0e-4f, 1.0e-4f, 1.0e-4f } } }; + XMGLOBALCONST XMVECTORF32 g_UnitVectorEpsilon = { { { 1.0e-4f, 1.0e-4f, 1.0e-4f, 1.0e-4f } } }; XMGLOBALCONST XMVECTORF32 g_UnitQuaternionEpsilon = { { { 1.0e-4f, 1.0e-4f, 1.0e-4f, 1.0e-4f } } }; - XMGLOBALCONST XMVECTORF32 g_UnitPlaneEpsilon = { { { 1.0e-4f, 1.0e-4f, 1.0e-4f, 1.0e-4f } } }; + XMGLOBALCONST XMVECTORF32 g_UnitPlaneEpsilon = { { { 1.0e-4f, 1.0e-4f, 1.0e-4f, 1.0e-4f } } }; //----------------------------------------------------------------------------- // Return true if the vector is a unit vector (length == 1). @@ -93,7 +91,7 @@ namespace MathInternal inline XMVECTOR XMPlaneTransform(_In_ FXMVECTOR Plane, _In_ FXMVECTOR Rotation, _In_ FXMVECTOR Translation) noexcept { XMVECTOR vNormal = XMVector3Rotate(Plane, Rotation); - XMVECTOR vD = XMVectorSubtract(XMVectorSplatW(Plane), XMVector3Dot(vNormal, Translation)); + XMVECTOR vD = XMVectorSubtract(XMVectorSplatW(Plane), XMVector3Dot(vNormal, Translation)); return XMVectorInsert<0, 0, 0, 0, 1>(vNormal, vD); } @@ -103,20 +101,20 @@ namespace MathInternal //----------------------------------------------------------------------------- inline XMVECTOR PointOnLineSegmentNearestPoint(_In_ FXMVECTOR S1, _In_ FXMVECTOR S2, _In_ FXMVECTOR P) noexcept { - XMVECTOR Dir = XMVectorSubtract(S2, S1); + XMVECTOR Dir = XMVectorSubtract(S2, S1); XMVECTOR Projection = XMVectorSubtract(XMVector3Dot(P, Dir), XMVector3Dot(S1, Dir)); - XMVECTOR LengthSq = XMVector3Dot(Dir, Dir); + XMVECTOR LengthSq = XMVector3Dot(Dir, Dir); - XMVECTOR t = XMVectorMultiply(Projection, XMVectorReciprocal(LengthSq)); + XMVECTOR t = XMVectorMultiply(Projection, XMVectorReciprocal(LengthSq)); XMVECTOR Point = XMVectorMultiplyAdd(t, Dir, S1); // t < 0 XMVECTOR SelectS1 = XMVectorLess(Projection, XMVectorZero()); - Point = XMVectorSelect(Point, S1, SelectS1); + Point = XMVectorSelect(Point, S1, SelectS1); // t > 1 XMVECTOR SelectS2 = XMVectorGreater(Projection, LengthSq); - Point = XMVectorSelect(Point, S2, SelectS2); + Point = XMVectorSelect(Point, S2, SelectS2); return Point; } @@ -125,7 +123,10 @@ namespace MathInternal // Test if the point (P) on the plane of the triangle is inside the triangle // (V0, V1, V2). //----------------------------------------------------------------------------- - inline XMVECTOR XM_CALLCONV PointOnPlaneInsideTriangle(_In_ FXMVECTOR P, _In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ GXMVECTOR V2) noexcept + inline XMVECTOR XM_CALLCONV PointOnPlaneInsideTriangle(_In_ FXMVECTOR P, + _In_ FXMVECTOR V0, + _In_ FXMVECTOR V1, + _In_ GXMVECTOR V2) noexcept { // Compute the triangle normal. XMVECTOR N = XMVector3Cross(XMVectorSubtract(V2, V0), XMVectorSubtract(V1, V0)); @@ -138,7 +139,7 @@ namespace MathInternal // If the cross product points in the same direction as the normal the the // point is inside the edge (it is zero if is on the edge). - XMVECTOR Zero = XMVectorZero(); + XMVECTOR Zero = XMVectorZero(); XMVECTOR Inside0 = XMVectorGreaterOrEqual(XMVector3Dot(C0, N), Zero); XMVECTOR Inside1 = XMVectorGreaterOrEqual(XMVector3Dot(C1, N), Zero); XMVECTOR Inside2 = XMVectorGreaterOrEqual(XMVector3Dot(C2, N), Zero); @@ -159,7 +160,7 @@ namespace MathInternal if (h > 0) { *t = *u = *v = 0.f; - return false; // only one real root + return false; // only one real root } if ((h == 0) && (q == 0)) // all the same root @@ -177,19 +178,24 @@ namespace MathInternal else rc = powf(d, 1.0f / 3.0f); - theta = XMScalarACos(-q / (2.0f * d)); + theta = XMScalarACos(-q / (2.0f * d)); costh3 = XMScalarCos(theta / 3.0f); sinth3 = sqrtf(3.0f) * XMScalarSin(theta / 3.0f); - *t = 2.0f * rc * costh3 - e / 3.0f; - *u = -rc * (costh3 + sinth3) - e / 3.0f; - *v = -rc * (costh3 - sinth3) - e / 3.0f; + *t = 2.0f * rc * costh3 - e / 3.0f; + *u = -rc * (costh3 + sinth3) - e / 3.0f; + *v = -rc * (costh3 - sinth3) - e / 3.0f; return true; } //----------------------------------------------------------------------------- - inline XMVECTOR CalculateEigenVector(_In_ float m11, _In_ float m12, _In_ float m13, - _In_ float m22, _In_ float m23, _In_ float m33, _In_ float e) noexcept + inline XMVECTOR CalculateEigenVector(_In_ float m11, + _In_ float m12, + _In_ float m13, + _In_ float m22, + _In_ float m23, + _In_ float m33, + _In_ float e) noexcept { float fTmp[3]; fTmp[0] = m12 * m23 - m13 * (m22 - e); @@ -205,20 +211,28 @@ namespace MathInternal // we only have one equation - find a valid one if ((m11 - e != 0) || (m12 != 0) || (m13 != 0)) { - f1 = m11 - e; f2 = m12; f3 = m13; + f1 = m11 - e; + f2 = m12; + f3 = m13; } else if ((m12 != 0) || (m22 - e != 0) || (m23 != 0)) { - f1 = m12; f2 = m22 - e; f3 = m23; + f1 = m12; + f2 = m22 - e; + f3 = m23; } else if ((m13 != 0) || (m23 != 0) || (m33 - e != 0)) { - f1 = m13; f2 = m23; f3 = m33 - e; + f1 = m13; + f2 = m23; + f3 = m33 - e; } else { // error, we'll just make something up - we have NO context - f1 = 1.0f; f2 = 0.0f; f3 = 0.0f; + f1 = 1.0f; + f2 = 0.0f; + f3 = 0.0f; } if (f1 == 0) @@ -257,10 +271,18 @@ namespace MathInternal } //----------------------------------------------------------------------------- - inline bool CalculateEigenVectors(_In_ float m11, _In_ float m12, _In_ float m13, - _In_ float m22, _In_ float m23, _In_ float m33, - _In_ float e1, _In_ float e2, _In_ float e3, - _Out_ XMVECTOR* pV1, _Out_ XMVECTOR* pV2, _Out_ XMVECTOR* pV3) noexcept + inline bool CalculateEigenVectors(_In_ float m11, + _In_ float m12, + _In_ float m13, + _In_ float m22, + _In_ float m23, + _In_ float m33, + _In_ float e1, + _In_ float e2, + _In_ float e3, + _Out_ XMVECTOR* pV1, + _Out_ XMVECTOR* pV2, + _Out_ XMVECTOR* pV3) noexcept { *pV1 = DirectX::MathInternal::CalculateEigenVector(m11, m12, m13, m22, m23, m33, e1); *pV2 = DirectX::MathInternal::CalculateEigenVector(m11, m12, m13, m22, m23, m33, e2); @@ -285,8 +307,8 @@ namespace MathInternal bool e13 = (fabsf(XMVectorGetX(XMVector3Dot(*pV1, *pV3))) > 0.1f); bool e23 = (fabsf(XMVectorGetX(XMVector3Dot(*pV2, *pV3))) > 0.1f); - if ((v1z && v2z && v3z) || (e12 && e13 && e23) || - (e12 && v3z) || (e13 && v2z) || (e23 && v1z)) // all eigenvectors are 0- any basis set + if ((v1z && v2z && v3z) || (e12 && e13 && e23) || (e12 && v3z) || (e13 && v2z) + || (e23 && v1z)) // all eigenvectors are 0- any basis set { *pV1 = g_XMIdentityR0.v; *pV2 = g_XMIdentityR1.v; @@ -352,9 +374,15 @@ namespace MathInternal } //----------------------------------------------------------------------------- - inline bool CalculateEigenVectorsFromCovarianceMatrix(_In_ float Cxx, _In_ float Cyy, _In_ float Czz, - _In_ float Cxy, _In_ float Cxz, _In_ float Cyz, - _Out_ XMVECTOR* pV1, _Out_ XMVECTOR* pV2, _Out_ XMVECTOR* pV3) noexcept + inline bool CalculateEigenVectorsFromCovarianceMatrix(_In_ float Cxx, + _In_ float Cyy, + _In_ float Czz, + _In_ float Cxy, + _In_ float Cxz, + _In_ float Cyz, + _Out_ XMVECTOR* pV1, + _Out_ XMVECTOR* pV2, + _Out_ XMVECTOR* pV3) noexcept { // Calculate the eigenvalues by solving a cubic equation. float e = -(Cxx + Cyy + Czz); @@ -375,10 +403,8 @@ namespace MathInternal } //----------------------------------------------------------------------------- - inline void XM_CALLCONV FastIntersectTrianglePlane( - FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2, - GXMVECTOR Plane, - XMVECTOR& Outside, XMVECTOR& Inside) noexcept + inline void XM_CALLCONV + FastIntersectTrianglePlane(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2, GXMVECTOR Plane, XMVECTOR& Outside, XMVECTOR& Inside) noexcept { // Plane0 XMVECTOR Dist0 = XMVector4Dot(V0, Plane); @@ -386,10 +412,10 @@ namespace MathInternal XMVECTOR Dist2 = XMVector4Dot(V2, Plane); XMVECTOR MinDist = XMVectorMin(Dist0, Dist1); - MinDist = XMVectorMin(MinDist, Dist2); + MinDist = XMVectorMin(MinDist, Dist2); XMVECTOR MaxDist = XMVectorMax(Dist0, Dist1); - MaxDist = XMVectorMax(MaxDist, Dist2); + MaxDist = XMVectorMax(MaxDist, Dist2); XMVECTOR Zero = XMVectorZero(); @@ -401,8 +427,11 @@ namespace MathInternal } //----------------------------------------------------------------------------- - inline void FastIntersectSpherePlane(_In_ FXMVECTOR Center, _In_ FXMVECTOR Radius, _In_ FXMVECTOR Plane, - _Out_ XMVECTOR& Outside, _Out_ XMVECTOR& Inside) noexcept + inline void FastIntersectSpherePlane(_In_ FXMVECTOR Center, + _In_ FXMVECTOR Radius, + _In_ FXMVECTOR Plane, + _Out_ XMVECTOR& Outside, + _Out_ XMVECTOR& Inside) noexcept { XMVECTOR Dist = XMVector4Dot(Center, Plane); @@ -414,8 +443,11 @@ namespace MathInternal } //----------------------------------------------------------------------------- - inline void FastIntersectAxisAlignedBoxPlane(_In_ FXMVECTOR Center, _In_ FXMVECTOR Extents, _In_ FXMVECTOR Plane, - _Out_ XMVECTOR& Outside, _Out_ XMVECTOR& Inside) noexcept + inline void FastIntersectAxisAlignedBoxPlane(_In_ FXMVECTOR Center, + _In_ FXMVECTOR Extents, + _In_ FXMVECTOR Plane, + _Out_ XMVECTOR& Outside, + _Out_ XMVECTOR& Inside) noexcept { // Compute the distance to the center of the box. XMVECTOR Dist = XMVector4Dot(Center, Plane); @@ -435,11 +467,14 @@ namespace MathInternal } //----------------------------------------------------------------------------- - inline void XM_CALLCONV FastIntersectOrientedBoxPlane( - _In_ FXMVECTOR Center, _In_ FXMVECTOR Extents, _In_ FXMVECTOR Axis0, - _In_ GXMVECTOR Axis1, - _In_ HXMVECTOR Axis2, _In_ HXMVECTOR Plane, - _Out_ XMVECTOR& Outside, _Out_ XMVECTOR& Inside) noexcept + inline void XM_CALLCONV FastIntersectOrientedBoxPlane(_In_ FXMVECTOR Center, + _In_ FXMVECTOR Extents, + _In_ FXMVECTOR Axis0, + _In_ GXMVECTOR Axis1, + _In_ HXMVECTOR Axis2, + _In_ HXMVECTOR Plane, + _Out_ XMVECTOR& Outside, + _Out_ XMVECTOR& Inside) noexcept { // Compute the distance to the center of the box. XMVECTOR Dist = XMVector4Dot(Center, Plane); @@ -450,9 +485,9 @@ namespace MathInternal // where h(i) are extents of the box, n is the plane normal, and b(i) are the // axes of the box. XMVECTOR Radius = XMVector3Dot(Plane, Axis0); - Radius = XMVectorInsert<0, 0, 1, 0, 0>(Radius, XMVector3Dot(Plane, Axis1)); - Radius = XMVectorInsert<0, 0, 0, 1, 0>(Radius, XMVector3Dot(Plane, Axis2)); - Radius = XMVector3Dot(Extents, XMVectorAbs(Radius)); + Radius = XMVectorInsert<0, 0, 1, 0, 0>(Radius, XMVector3Dot(Plane, Axis1)); + Radius = XMVectorInsert<0, 0, 0, 1, 0>(Radius, XMVector3Dot(Plane, Axis2)); + Radius = XMVector3Dot(Extents, XMVectorAbs(Radius)); // Outside the plane? Outside = XMVectorGreater(Dist, Radius); @@ -462,12 +497,17 @@ namespace MathInternal } //----------------------------------------------------------------------------- - inline void XM_CALLCONV FastIntersectFrustumPlane( - _In_ FXMVECTOR Point0, _In_ FXMVECTOR Point1, _In_ FXMVECTOR Point2, - _In_ GXMVECTOR Point3, - _In_ HXMVECTOR Point4, _In_ HXMVECTOR Point5, - _In_ CXMVECTOR Point6, _In_ CXMVECTOR Point7, _In_ CXMVECTOR Plane, - _Out_ XMVECTOR& Outside, _Out_ XMVECTOR& Inside) noexcept + inline void XM_CALLCONV FastIntersectFrustumPlane(_In_ FXMVECTOR Point0, + _In_ FXMVECTOR Point1, + _In_ FXMVECTOR Point2, + _In_ GXMVECTOR Point3, + _In_ HXMVECTOR Point4, + _In_ HXMVECTOR Point5, + _In_ CXMVECTOR Point6, + _In_ CXMVECTOR Point7, + _In_ CXMVECTOR Plane, + _Out_ XMVECTOR& Outside, + _Out_ XMVECTOR& Inside) noexcept { // Find the min/max projection of the frustum onto the plane normal. XMVECTOR Min, Max, Dist; @@ -475,32 +515,32 @@ namespace MathInternal Min = Max = XMVector3Dot(Plane, Point0); Dist = XMVector3Dot(Plane, Point1); - Min = XMVectorMin(Min, Dist); - Max = XMVectorMax(Max, Dist); + Min = XMVectorMin(Min, Dist); + Max = XMVectorMax(Max, Dist); Dist = XMVector3Dot(Plane, Point2); - Min = XMVectorMin(Min, Dist); - Max = XMVectorMax(Max, Dist); + Min = XMVectorMin(Min, Dist); + Max = XMVectorMax(Max, Dist); Dist = XMVector3Dot(Plane, Point3); - Min = XMVectorMin(Min, Dist); - Max = XMVectorMax(Max, Dist); + Min = XMVectorMin(Min, Dist); + Max = XMVectorMax(Max, Dist); Dist = XMVector3Dot(Plane, Point4); - Min = XMVectorMin(Min, Dist); - Max = XMVectorMax(Max, Dist); + Min = XMVectorMin(Min, Dist); + Max = XMVectorMax(Max, Dist); Dist = XMVector3Dot(Plane, Point5); - Min = XMVectorMin(Min, Dist); - Max = XMVectorMax(Max, Dist); + Min = XMVectorMin(Min, Dist); + Max = XMVectorMax(Max, Dist); Dist = XMVector3Dot(Plane, Point6); - Min = XMVectorMin(Min, Dist); - Max = XMVectorMax(Max, Dist); + Min = XMVectorMin(Min, Dist); + Max = XMVectorMax(Max, Dist); Dist = XMVector3Dot(Plane, Point7); - Min = XMVectorMin(Min, Dist); - Max = XMVectorMax(Max, Dist); + Min = XMVectorMin(Min, Dist); + Max = XMVectorMax(Max, Dist); XMVECTOR PlaneDist = XMVectorNegate(XMVectorSplatW(Plane)); @@ -513,7 +553,6 @@ namespace MathInternal } // namespace MathInternal - /**************************************************************************** * * BoundingSphere @@ -523,8 +562,7 @@ namespace MathInternal //----------------------------------------------------------------------------- // Transform a sphere by an angle preserving transform. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void XM_CALLCONV BoundingSphere::Transform(BoundingSphere& Out, FXMMATRIX M) const noexcept +_Use_decl_annotations_ inline void XM_CALLCONV BoundingSphere::Transform(BoundingSphere& Out, FXMMATRIX M) const noexcept { // Load the center of the sphere. XMVECTOR vCenter = XMLoadFloat3(&Center); @@ -543,11 +581,13 @@ inline void XM_CALLCONV BoundingSphere::Transform(BoundingSphere& Out, FXMMATRIX // Scale the radius of the pshere. float Scale = sqrtf(XMVectorGetX(d)); - Out.Radius = Radius * Scale; + Out.Radius = Radius * Scale; } -_Use_decl_annotations_ -inline void XM_CALLCONV BoundingSphere::Transform(BoundingSphere& Out, float Scale, FXMVECTOR Rotation, FXMVECTOR Translation) const noexcept +_Use_decl_annotations_ inline void XM_CALLCONV BoundingSphere::Transform(BoundingSphere& Out, + float Scale, + FXMVECTOR Rotation, + FXMVECTOR Translation) const noexcept { // Load the center of the sphere. XMVECTOR vCenter = XMLoadFloat3(&Center); @@ -562,60 +602,54 @@ inline void XM_CALLCONV BoundingSphere::Transform(BoundingSphere& Out, float Sca Out.Radius = Radius * Scale; } - //----------------------------------------------------------------------------- // Point in sphere test. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType XM_CALLCONV BoundingSphere::Contains(FXMVECTOR Point) const noexcept +_Use_decl_annotations_ inline ContainmentType XM_CALLCONV BoundingSphere::Contains(FXMVECTOR Point) const noexcept { XMVECTOR vCenter = XMLoadFloat3(&Center); XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); XMVECTOR DistanceSquared = XMVector3LengthSq(XMVectorSubtract(Point, vCenter)); - XMVECTOR RadiusSquared = XMVectorMultiply(vRadius, vRadius); + XMVECTOR RadiusSquared = XMVectorMultiply(vRadius, vRadius); return XMVector3LessOrEqual(DistanceSquared, RadiusSquared) ? CONTAINS : DISJOINT; } - //----------------------------------------------------------------------------- // Triangle in sphere test //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType XM_CALLCONV BoundingSphere::Contains(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept +_Use_decl_annotations_ inline ContainmentType XM_CALLCONV BoundingSphere::Contains(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept { if (!Intersects(V0, V1, V2)) return DISJOINT; - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); XMVECTOR RadiusSquared = XMVectorMultiply(vRadius, vRadius); XMVECTOR DistanceSquared = XMVector3LengthSq(XMVectorSubtract(V0, vCenter)); - XMVECTOR Inside = XMVectorLessOrEqual(DistanceSquared, RadiusSquared); + XMVECTOR Inside = XMVectorLessOrEqual(DistanceSquared, RadiusSquared); DistanceSquared = XMVector3LengthSq(XMVectorSubtract(V1, vCenter)); - Inside = XMVectorAndInt(Inside, XMVectorLessOrEqual(DistanceSquared, RadiusSquared)); + Inside = XMVectorAndInt(Inside, XMVectorLessOrEqual(DistanceSquared, RadiusSquared)); DistanceSquared = XMVector3LengthSq(XMVectorSubtract(V2, vCenter)); - Inside = XMVectorAndInt(Inside, XMVectorLessOrEqual(DistanceSquared, RadiusSquared)); + Inside = XMVectorAndInt(Inside, XMVectorLessOrEqual(DistanceSquared, RadiusSquared)); return (XMVector3EqualInt(Inside, XMVectorTrueInt())) ? CONTAINS : INTERSECTS; } - //----------------------------------------------------------------------------- // Sphere in sphere test. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingSphere::Contains(const BoundingSphere& sh) const noexcept +_Use_decl_annotations_ inline ContainmentType BoundingSphere::Contains(const BoundingSphere& sh) const noexcept { XMVECTOR Center1 = XMLoadFloat3(&Center); - float r1 = Radius; + float r1 = Radius; XMVECTOR Center2 = XMLoadFloat3(&sh.Center); - float r2 = sh.Radius; + float r2 = sh.Radius; XMVECTOR V = XMVectorSubtract(Center2, Center1); @@ -626,21 +660,19 @@ inline ContainmentType BoundingSphere::Contains(const BoundingSphere& sh) const return (r1 + r2 >= d) ? ((r1 - r2 >= d) ? CONTAINS : INTERSECTS) : DISJOINT; } - //----------------------------------------------------------------------------- // Axis-aligned box in sphere test //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingSphere::Contains(const BoundingBox& box) const noexcept +_Use_decl_annotations_ inline ContainmentType BoundingSphere::Contains(const BoundingBox& box) const noexcept { if (!box.Intersects(*this)) return DISJOINT; - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); XMVECTOR RadiusSq = XMVectorMultiply(vRadius, vRadius); - XMVECTOR boxCenter = XMLoadFloat3(&box.Center); + XMVECTOR boxCenter = XMLoadFloat3(&box.Center); XMVECTOR boxExtents = XMLoadFloat3(&box.Extents); XMVECTOR InsideAll = XMVectorTrueInt(); @@ -651,28 +683,26 @@ inline ContainmentType BoundingSphere::Contains(const BoundingBox& box) const no { XMVECTOR C = XMVectorMultiplyAdd(boxExtents, g_BoxOffset[i], offset); XMVECTOR d = XMVector3LengthSq(C); - InsideAll = XMVectorAndInt(InsideAll, XMVectorLessOrEqual(d, RadiusSq)); + InsideAll = XMVectorAndInt(InsideAll, XMVectorLessOrEqual(d, RadiusSq)); } return (XMVector3EqualInt(InsideAll, XMVectorTrueInt())) ? CONTAINS : INTERSECTS; } - //----------------------------------------------------------------------------- // Oriented box in sphere test //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingSphere::Contains(const BoundingOrientedBox& box) const noexcept +_Use_decl_annotations_ inline ContainmentType BoundingSphere::Contains(const BoundingOrientedBox& box) const noexcept { if (!box.Intersects(*this)) return DISJOINT; - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); XMVECTOR RadiusSq = XMVectorMultiply(vRadius, vRadius); - XMVECTOR boxCenter = XMLoadFloat3(&box.Center); - XMVECTOR boxExtents = XMLoadFloat3(&box.Extents); + XMVECTOR boxCenter = XMLoadFloat3(&box.Center); + XMVECTOR boxExtents = XMLoadFloat3(&box.Extents); XMVECTOR boxOrientation = XMLoadFloat4(&box.Orientation); assert(DirectX::MathInternal::XMQuaternionIsUnit(boxOrientation)); @@ -683,39 +713,36 @@ inline ContainmentType BoundingSphere::Contains(const BoundingOrientedBox& box) { XMVECTOR C = XMVectorAdd(XMVector3Rotate(XMVectorMultiply(boxExtents, g_BoxOffset[i]), boxOrientation), boxCenter); XMVECTOR d = XMVector3LengthSq(XMVectorSubtract(vCenter, C)); - InsideAll = XMVectorAndInt(InsideAll, XMVectorLessOrEqual(d, RadiusSq)); + InsideAll = XMVectorAndInt(InsideAll, XMVectorLessOrEqual(d, RadiusSq)); } return (XMVector3EqualInt(InsideAll, XMVectorTrueInt())) ? CONTAINS : INTERSECTS; - } - //----------------------------------------------------------------------------- // Frustum in sphere test //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingSphere::Contains(const BoundingFrustum& fr) const noexcept +_Use_decl_annotations_ inline ContainmentType BoundingSphere::Contains(const BoundingFrustum& fr) const noexcept { if (!fr.Intersects(*this)) return DISJOINT; - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); XMVECTOR RadiusSq = XMVectorMultiply(vRadius, vRadius); - XMVECTOR vOrigin = XMLoadFloat3(&fr.Origin); + XMVECTOR vOrigin = XMLoadFloat3(&fr.Origin); XMVECTOR vOrientation = XMLoadFloat4(&fr.Orientation); assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); // Build the corners of the frustum. - XMVECTOR vRightTop = XMVectorSet(fr.RightSlope, fr.TopSlope, 1.0f, 0.0f); + XMVECTOR vRightTop = XMVectorSet(fr.RightSlope, fr.TopSlope, 1.0f, 0.0f); XMVECTOR vRightBottom = XMVectorSet(fr.RightSlope, fr.BottomSlope, 1.0f, 0.0f); - XMVECTOR vLeftTop = XMVectorSet(fr.LeftSlope, fr.TopSlope, 1.0f, 0.0f); - XMVECTOR vLeftBottom = XMVectorSet(fr.LeftSlope, fr.BottomSlope, 1.0f, 0.0f); - XMVECTOR vNear = XMVectorReplicatePtr(&fr.Near); - XMVECTOR vFar = XMVectorReplicatePtr(&fr.Far); + XMVECTOR vLeftTop = XMVectorSet(fr.LeftSlope, fr.TopSlope, 1.0f, 0.0f); + XMVECTOR vLeftBottom = XMVectorSet(fr.LeftSlope, fr.BottomSlope, 1.0f, 0.0f); + XMVECTOR vNear = XMVectorReplicatePtr(&fr.Near); + XMVECTOR vFar = XMVectorReplicatePtr(&fr.Far); XMVECTOR Corners[BoundingFrustum::CORNER_COUNT]; Corners[0] = XMVectorMultiply(vRightTop, vNear); @@ -732,18 +759,16 @@ inline ContainmentType BoundingSphere::Contains(const BoundingFrustum& fr) const { XMVECTOR C = XMVectorAdd(XMVector3Rotate(Corners[i], vOrientation), vOrigin); XMVECTOR d = XMVector3LengthSq(XMVectorSubtract(vCenter, C)); - InsideAll = XMVectorAndInt(InsideAll, XMVectorLessOrEqual(d, RadiusSq)); + InsideAll = XMVectorAndInt(InsideAll, XMVectorLessOrEqual(d, RadiusSq)); } return (XMVector3EqualInt(InsideAll, XMVectorTrueInt())) ? CONTAINS : INTERSECTS; } - //----------------------------------------------------------------------------- // Sphere vs. sphere test. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingSphere::Intersects(const BoundingSphere& sh) const noexcept +_Use_decl_annotations_ inline bool BoundingSphere::Intersects(const BoundingSphere& sh) const noexcept { // Load A. XMVECTOR vCenterA = XMLoadFloat3(&Center); @@ -754,48 +779,41 @@ inline bool BoundingSphere::Intersects(const BoundingSphere& sh) const noexcept XMVECTOR vRadiusB = XMVectorReplicatePtr(&sh.Radius); // Distance squared between centers. - XMVECTOR Delta = XMVectorSubtract(vCenterB, vCenterA); + XMVECTOR Delta = XMVectorSubtract(vCenterB, vCenterA); XMVECTOR DistanceSquared = XMVector3LengthSq(Delta); // Sum of the radii squared. XMVECTOR RadiusSquared = XMVectorAdd(vRadiusA, vRadiusB); - RadiusSquared = XMVectorMultiply(RadiusSquared, RadiusSquared); + RadiusSquared = XMVectorMultiply(RadiusSquared, RadiusSquared); return XMVector3LessOrEqual(DistanceSquared, RadiusSquared); } - //----------------------------------------------------------------------------- // Box vs. sphere test. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingSphere::Intersects(const BoundingBox& box) const noexcept +_Use_decl_annotations_ inline bool BoundingSphere::Intersects(const BoundingBox& box) const noexcept { return box.Intersects(*this); } -_Use_decl_annotations_ -inline bool BoundingSphere::Intersects(const BoundingOrientedBox& box) const noexcept +_Use_decl_annotations_ inline bool BoundingSphere::Intersects(const BoundingOrientedBox& box) const noexcept { return box.Intersects(*this); } - //----------------------------------------------------------------------------- // Frustum vs. sphere test. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingSphere::Intersects(const BoundingFrustum& fr) const noexcept +_Use_decl_annotations_ inline bool BoundingSphere::Intersects(const BoundingFrustum& fr) const noexcept { return fr.Intersects(*this); } - //----------------------------------------------------------------------------- // Triangle vs sphere test //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool XM_CALLCONV BoundingSphere::Intersects(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept +_Use_decl_annotations_ inline bool XM_CALLCONV BoundingSphere::Intersects(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept { // Load the sphere. XMVECTOR vCenter = XMLoadFloat3(&Center); @@ -813,7 +831,7 @@ inline bool XM_CALLCONV BoundingSphere::Intersects(FXMVECTOR V0, FXMVECTOR V1, F // If the center of the sphere is farther from the plane of the triangle than // the radius of the sphere, then there cannot be an intersection. XMVECTOR NoIntersection = XMVectorLess(Dist, XMVectorNegate(vRadius)); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Dist, vRadius)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Dist, vRadius)); // Project the center of the sphere onto the plane of the triangle. XMVECTOR Point = XMVectorNegativeMultiplySubtract(N, Dist, vCenter); @@ -849,12 +867,10 @@ inline bool XM_CALLCONV BoundingSphere::Intersects(FXMVECTOR V0, FXMVECTOR V1, F return XMVector4EqualInt(XMVectorAndCInt(Intersection, NoIntersection), XMVectorTrueInt()); } - //----------------------------------------------------------------------------- // Sphere-plane intersection //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline PlaneIntersectionType XM_CALLCONV BoundingSphere::Intersects(FXMVECTOR Plane) const noexcept +_Use_decl_annotations_ inline PlaneIntersectionType XM_CALLCONV BoundingSphere::Intersects(FXMVECTOR Plane) const noexcept { assert(DirectX::MathInternal::XMPlaneIsUnit(Plane)); @@ -880,12 +896,10 @@ inline PlaneIntersectionType XM_CALLCONV BoundingSphere::Intersects(FXMVECTOR Pl return INTERSECTING; } - //----------------------------------------------------------------------------- // Compute the intersection of a ray (Origin, Direction) with a sphere. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool XM_CALLCONV BoundingSphere::Intersects(FXMVECTOR Origin, FXMVECTOR Direction, float& Dist) const noexcept +_Use_decl_annotations_ inline bool XM_CALLCONV BoundingSphere::Intersects(FXMVECTOR Origin, FXMVECTOR Direction, float& Dist) const noexcept { assert(DirectX::MathInternal::XMVector3IsUnit(Direction)); @@ -916,12 +930,12 @@ inline bool XM_CALLCONV BoundingSphere::Intersects(FXMVECTOR Origin, FXMVECTOR D NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(m2, r2)); // The ray hits the sphere, compute the nearest intersection point. - XMVECTOR q = XMVectorSqrt(XMVectorSubtract(r2, m2)); + XMVECTOR q = XMVectorSqrt(XMVectorSubtract(r2, m2)); XMVECTOR t1 = XMVectorSubtract(s, q); XMVECTOR t2 = XMVectorAdd(s, q); XMVECTOR OriginInside = XMVectorLessOrEqual(l2, r2); - XMVECTOR t = XMVectorSelect(t1, t2, OriginInside); + XMVECTOR t = XMVectorSelect(t1, t2, OriginInside); if (XMVector4NotEqualInt(NoIntersection, XMVectorTrueInt())) { @@ -934,15 +948,15 @@ inline bool XM_CALLCONV BoundingSphere::Intersects(FXMVECTOR Origin, FXMVECTOR D return false; } - //----------------------------------------------------------------------------- // Test a sphere vs 6 planes (typically forming a frustum). //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType XM_CALLCONV BoundingSphere::ContainedBy( - FXMVECTOR Plane0, FXMVECTOR Plane1, FXMVECTOR Plane2, - GXMVECTOR Plane3, - HXMVECTOR Plane4, HXMVECTOR Plane5) const noexcept +_Use_decl_annotations_ inline ContainmentType XM_CALLCONV BoundingSphere::ContainedBy(FXMVECTOR Plane0, + FXMVECTOR Plane1, + FXMVECTOR Plane2, + GXMVECTOR Plane3, + HXMVECTOR Plane4, + HXMVECTOR Plane5) const noexcept { // Load the sphere. XMVECTOR vCenter = XMLoadFloat3(&Center); @@ -957,27 +971,27 @@ inline ContainmentType XM_CALLCONV BoundingSphere::ContainedBy( DirectX::MathInternal::FastIntersectSpherePlane(vCenter, vRadius, Plane0, Outside, Inside); XMVECTOR AnyOutside = Outside; - XMVECTOR AllInside = Inside; + XMVECTOR AllInside = Inside; DirectX::MathInternal::FastIntersectSpherePlane(vCenter, vRadius, Plane1, Outside, Inside); AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); + AllInside = XMVectorAndInt(AllInside, Inside); DirectX::MathInternal::FastIntersectSpherePlane(vCenter, vRadius, Plane2, Outside, Inside); AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); + AllInside = XMVectorAndInt(AllInside, Inside); DirectX::MathInternal::FastIntersectSpherePlane(vCenter, vRadius, Plane3, Outside, Inside); AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); + AllInside = XMVectorAndInt(AllInside, Inside); DirectX::MathInternal::FastIntersectSpherePlane(vCenter, vRadius, Plane4, Outside, Inside); AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); + AllInside = XMVectorAndInt(AllInside, Inside); DirectX::MathInternal::FastIntersectSpherePlane(vCenter, vRadius, Plane5, Outside, Inside); AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); + AllInside = XMVectorAndInt(AllInside, Inside); // If the sphere is outside any plane it is outside. if (XMVector4EqualInt(AnyOutside, XMVectorTrueInt())) @@ -991,18 +1005,17 @@ inline ContainmentType XM_CALLCONV BoundingSphere::ContainedBy( return INTERSECTS; } - //----------------------------------------------------------------------------- // Creates a bounding sphere that contains two other bounding spheres //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void BoundingSphere::CreateMerged(BoundingSphere& Out, const BoundingSphere& S1, const BoundingSphere& S2) noexcept +_Use_decl_annotations_ inline void +BoundingSphere::CreateMerged(BoundingSphere& Out, const BoundingSphere& S1, const BoundingSphere& S2) noexcept { XMVECTOR Center1 = XMLoadFloat3(&S1.Center); - float r1 = S1.Radius; + float r1 = S1.Radius; XMVECTOR Center2 = XMLoadFloat3(&S2.Center); - float r2 = S2.Radius; + float r2 = S2.Radius; XMVECTOR V = XMVectorSubtract(Center2, Center1); @@ -1026,8 +1039,8 @@ inline void BoundingSphere::CreateMerged(BoundingSphere& Out, const BoundingSphe XMVECTOR N = XMVectorDivide(V, Dist); - float t1 = XMMin(-r1, d - r2); - float t2 = XMMax(r1, d + r2); + float t1 = XMMin(-r1, d - r2); + float t2 = XMMax(r1, d + r2); float t_5 = (t2 - t1) * 0.5f; XMVECTOR NCenter = XMVectorAdd(Center1, XMVectorMultiply(N, XMVectorReplicate(t_5 + t1))); @@ -1036,28 +1049,24 @@ inline void BoundingSphere::CreateMerged(BoundingSphere& Out, const BoundingSphe Out.Radius = t_5; } - //----------------------------------------------------------------------------- // Create sphere enscribing bounding box //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void BoundingSphere::CreateFromBoundingBox(BoundingSphere& Out, const BoundingBox& box) noexcept +_Use_decl_annotations_ inline void BoundingSphere::CreateFromBoundingBox(BoundingSphere& Out, const BoundingBox& box) noexcept { - Out.Center = box.Center; + Out.Center = box.Center; XMVECTOR vExtents = XMLoadFloat3(&box.Extents); - Out.Radius = XMVectorGetX(XMVector3Length(vExtents)); + Out.Radius = XMVectorGetX(XMVector3Length(vExtents)); } -_Use_decl_annotations_ -inline void BoundingSphere::CreateFromBoundingBox(BoundingSphere& Out, const BoundingOrientedBox& box) noexcept +_Use_decl_annotations_ inline void BoundingSphere::CreateFromBoundingBox(BoundingSphere& Out, const BoundingOrientedBox& box) noexcept { // Bounding box orientation is irrelevant because a sphere is rotationally invariant - Out.Center = box.Center; + Out.Center = box.Center; XMVECTOR vExtents = XMLoadFloat3(&box.Extents); - Out.Radius = XMVectorGetX(XMVector3Length(vExtents)); + Out.Radius = XMVectorGetX(XMVector3Length(vExtents)); } - //----------------------------------------------------------------------------- // Find the approximate smallest enclosing bounding sphere for a set of // points. Exact computation of the smallest enclosing bounding sphere is @@ -1065,8 +1074,8 @@ inline void BoundingSphere::CreateFromBoundingBox(BoundingSphere& Out, const Bou // The algorithm is based on Jack Ritter, "An Efficient Bounding Sphere", // Graphics Gems. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void BoundingSphere::CreateFromPoints(BoundingSphere& Out, size_t Count, const XMFLOAT3* pPoints, size_t Stride) noexcept +_Use_decl_annotations_ inline void +BoundingSphere::CreateFromPoints(BoundingSphere& Out, size_t Count, const XMFLOAT3* pPoints, size_t Stride) noexcept { assert(Count > 0); assert(pPoints); @@ -1105,13 +1114,13 @@ inline void BoundingSphere::CreateFromPoints(BoundingSphere& Out, size_t Count, // Use the min/max pair that are farthest apart to form the initial sphere. XMVECTOR DeltaX = XMVectorSubtract(MaxX, MinX); - XMVECTOR DistX = XMVector3Length(DeltaX); + XMVECTOR DistX = XMVector3Length(DeltaX); XMVECTOR DeltaY = XMVectorSubtract(MaxY, MinY); - XMVECTOR DistY = XMVector3Length(DeltaY); + XMVECTOR DistY = XMVector3Length(DeltaY); XMVECTOR DeltaZ = XMVectorSubtract(MaxZ, MinZ); - XMVECTOR DistZ = XMVector3Length(DeltaZ); + XMVECTOR DistZ = XMVector3Length(DeltaZ); XMVECTOR vCenter; XMVECTOR vRadius; @@ -1160,7 +1169,8 @@ inline void BoundingSphere::CreateFromPoints(BoundingSphere& Out, size_t Count, { // Adjust sphere to include the new point. vRadius = XMVectorScale(XMVectorAdd(vRadius, Dist), 0.5f); - vCenter = XMVectorAdd(vCenter, XMVectorMultiply(XMVectorSubtract(XMVectorReplicate(1.0f), XMVectorDivide(vRadius, Dist)), Delta)); + vCenter + = XMVectorAdd(vCenter, XMVectorMultiply(XMVectorSubtract(XMVectorReplicate(1.0f), XMVectorDivide(vRadius, Dist)), Delta)); } } @@ -1168,19 +1178,16 @@ inline void BoundingSphere::CreateFromPoints(BoundingSphere& Out, size_t Count, XMStoreFloat(&Out.Radius, vRadius); } - //----------------------------------------------------------------------------- // Create sphere containing frustum //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void BoundingSphere::CreateFromFrustum(BoundingSphere& Out, const BoundingFrustum& fr) noexcept +_Use_decl_annotations_ inline void BoundingSphere::CreateFromFrustum(BoundingSphere& Out, const BoundingFrustum& fr) noexcept { XMFLOAT3 Corners[BoundingFrustum::CORNER_COUNT]; fr.GetCorners(Corners); CreateFromPoints(Out, BoundingFrustum::CORNER_COUNT, Corners, sizeof(XMFLOAT3)); } - /**************************************************************************** * * BoundingBox @@ -1190,16 +1197,15 @@ inline void BoundingSphere::CreateFromFrustum(BoundingSphere& Out, const Boundin //----------------------------------------------------------------------------- // Transform an axis aligned box by an angle preserving transform. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void XM_CALLCONV BoundingBox::Transform(BoundingBox& Out, FXMMATRIX M) const noexcept +_Use_decl_annotations_ inline void XM_CALLCONV BoundingBox::Transform(BoundingBox& Out, FXMMATRIX M) const noexcept { // Load center and extents. - XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vCenter = XMLoadFloat3(&Center); XMVECTOR vExtents = XMLoadFloat3(&Extents); // Compute and transform the corners and find new min/max bounds. XMVECTOR Corner = XMVectorMultiplyAdd(vExtents, g_BoxOffset[0], vCenter); - Corner = XMVector3Transform(Corner, M); + Corner = XMVector3Transform(Corner, M); XMVECTOR Min, Max; Min = Max = Corner; @@ -1218,20 +1224,22 @@ inline void XM_CALLCONV BoundingBox::Transform(BoundingBox& Out, FXMMATRIX M) co XMStoreFloat3(&Out.Extents, XMVectorScale(XMVectorSubtract(Max, Min), 0.5f)); } -_Use_decl_annotations_ -inline void XM_CALLCONV BoundingBox::Transform(BoundingBox& Out, float Scale, FXMVECTOR Rotation, FXMVECTOR Translation) const noexcept +_Use_decl_annotations_ inline void XM_CALLCONV BoundingBox::Transform(BoundingBox& Out, + float Scale, + FXMVECTOR Rotation, + FXMVECTOR Translation) const noexcept { assert(DirectX::MathInternal::XMQuaternionIsUnit(Rotation)); // Load center and extents. - XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vCenter = XMLoadFloat3(&Center); XMVECTOR vExtents = XMLoadFloat3(&Extents); XMVECTOR VectorScale = XMVectorReplicate(Scale); // Compute and transform the corners and find new min/max bounds. XMVECTOR Corner = XMVectorMultiplyAdd(vExtents, g_BoxOffset[0], vCenter); - Corner = XMVectorAdd(XMVector3Rotate(XMVectorMultiply(Corner, VectorScale), Rotation), Translation); + Corner = XMVectorAdd(XMVector3Rotate(XMVectorMultiply(Corner, VectorScale), Rotation), Translation); XMVECTOR Min, Max; Min = Max = Corner; @@ -1250,17 +1258,15 @@ inline void XM_CALLCONV BoundingBox::Transform(BoundingBox& Out, float Scale, FX XMStoreFloat3(&Out.Extents, XMVectorScale(XMVectorSubtract(Max, Min), 0.5f)); } - //----------------------------------------------------------------------------- // Get the corner points of the box //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void BoundingBox::GetCorners(XMFLOAT3* Corners) const noexcept +_Use_decl_annotations_ inline void BoundingBox::GetCorners(XMFLOAT3* Corners) const noexcept { assert(Corners != nullptr); // Load the box - XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vCenter = XMLoadFloat3(&Center); XMVECTOR vExtents = XMLoadFloat3(&Extents); for (size_t i = 0; i < CORNER_COUNT; ++i) @@ -1270,55 +1276,49 @@ inline void BoundingBox::GetCorners(XMFLOAT3* Corners) const noexcept } } - //----------------------------------------------------------------------------- // Point in axis-aligned box test //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType XM_CALLCONV BoundingBox::Contains(FXMVECTOR Point) const noexcept +_Use_decl_annotations_ inline ContainmentType XM_CALLCONV BoundingBox::Contains(FXMVECTOR Point) const noexcept { - XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vCenter = XMLoadFloat3(&Center); XMVECTOR vExtents = XMLoadFloat3(&Extents); return XMVector3InBounds(XMVectorSubtract(Point, vCenter), vExtents) ? CONTAINS : DISJOINT; } - //----------------------------------------------------------------------------- // Triangle in axis-aligned box test //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType XM_CALLCONV BoundingBox::Contains(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept +_Use_decl_annotations_ inline ContainmentType XM_CALLCONV BoundingBox::Contains(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept { if (!Intersects(V0, V1, V2)) return DISJOINT; - XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vCenter = XMLoadFloat3(&Center); XMVECTOR vExtents = XMLoadFloat3(&Extents); - XMVECTOR d = XMVectorAbs(XMVectorSubtract(V0, vCenter)); + XMVECTOR d = XMVectorAbs(XMVectorSubtract(V0, vCenter)); XMVECTOR Inside = XMVectorLessOrEqual(d, vExtents); - d = XMVectorAbs(XMVectorSubtract(V1, vCenter)); + d = XMVectorAbs(XMVectorSubtract(V1, vCenter)); Inside = XMVectorAndInt(Inside, XMVectorLessOrEqual(d, vExtents)); - d = XMVectorAbs(XMVectorSubtract(V2, vCenter)); + d = XMVectorAbs(XMVectorSubtract(V2, vCenter)); Inside = XMVectorAndInt(Inside, XMVectorLessOrEqual(d, vExtents)); return (XMVector3EqualInt(Inside, XMVectorTrueInt())) ? CONTAINS : INTERSECTS; } - //----------------------------------------------------------------------------- // Sphere in axis-aligned box test //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingBox::Contains(const BoundingSphere& sh) const noexcept +_Use_decl_annotations_ inline ContainmentType BoundingBox::Contains(const BoundingSphere& sh) const noexcept { XMVECTOR SphereCenter = XMLoadFloat3(&sh.Center); XMVECTOR SphereRadius = XMVectorReplicatePtr(&sh.Radius); - XMVECTOR BoxCenter = XMLoadFloat3(&Center); + XMVECTOR BoxCenter = XMLoadFloat3(&Center); XMVECTOR BoxExtents = XMLoadFloat3(&Extents); XMVECTOR BoxMin = XMVectorSubtract(BoxCenter, BoxExtents); @@ -1332,7 +1332,7 @@ inline ContainmentType BoundingBox::Contains(const BoundingSphere& sh) const noe XMVECTOR d = XMVectorZero(); // Compute d for each dimension. - XMVECTOR LessThanMin = XMVectorLess(SphereCenter, BoxMin); + XMVECTOR LessThanMin = XMVectorLess(SphereCenter, BoxMin); XMVECTOR GreaterThanMax = XMVectorGreater(SphereCenter, BoxMax); XMVECTOR MinDelta = XMVectorSubtract(SphereCenter, BoxMin); @@ -1349,23 +1349,21 @@ inline ContainmentType BoundingBox::Contains(const BoundingSphere& sh) const noe return DISJOINT; XMVECTOR InsideAll = XMVectorLessOrEqual(XMVectorAdd(BoxMin, SphereRadius), SphereCenter); - InsideAll = XMVectorAndInt(InsideAll, XMVectorLessOrEqual(SphereCenter, XMVectorSubtract(BoxMax, SphereRadius))); - InsideAll = XMVectorAndInt(InsideAll, XMVectorGreater(XMVectorSubtract(BoxMax, BoxMin), SphereRadius)); + InsideAll = XMVectorAndInt(InsideAll, XMVectorLessOrEqual(SphereCenter, XMVectorSubtract(BoxMax, SphereRadius))); + InsideAll = XMVectorAndInt(InsideAll, XMVectorGreater(XMVectorSubtract(BoxMax, BoxMin), SphereRadius)); return (XMVector3EqualInt(InsideAll, XMVectorTrueInt())) ? CONTAINS : INTERSECTS; } - //----------------------------------------------------------------------------- // Axis-aligned box in axis-aligned box test //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingBox::Contains(const BoundingBox& box) const noexcept +_Use_decl_annotations_ inline ContainmentType BoundingBox::Contains(const BoundingBox& box) const noexcept { - XMVECTOR CenterA = XMLoadFloat3(&Center); + XMVECTOR CenterA = XMLoadFloat3(&Center); XMVECTOR ExtentsA = XMLoadFloat3(&Extents); - XMVECTOR CenterB = XMLoadFloat3(&box.Center); + XMVECTOR CenterB = XMLoadFloat3(&box.Center); XMVECTOR ExtentsB = XMLoadFloat3(&box.Extents); XMVECTOR MinA = XMVectorSubtract(CenterA, ExtentsA); @@ -1386,23 +1384,21 @@ inline ContainmentType BoundingBox::Contains(const BoundingBox& box) const noexc return DirectX::MathInternal::XMVector3AllTrue(Inside) ? CONTAINS : INTERSECTS; } - //----------------------------------------------------------------------------- // Oriented box in axis-aligned box test //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingBox::Contains(const BoundingOrientedBox& box) const noexcept +_Use_decl_annotations_ inline ContainmentType BoundingBox::Contains(const BoundingOrientedBox& box) const noexcept { if (!box.Intersects(*this)) return DISJOINT; - XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vCenter = XMLoadFloat3(&Center); XMVECTOR vExtents = XMLoadFloat3(&Extents); // Subtract off the AABB center to remove a subtract below XMVECTOR oCenter = XMVectorSubtract(XMLoadFloat3(&box.Center), vCenter); - XMVECTOR oExtents = XMLoadFloat3(&box.Extents); + XMVECTOR oExtents = XMLoadFloat3(&box.Extents); XMVECTOR oOrientation = XMLoadFloat4(&box.Orientation); assert(DirectX::MathInternal::XMQuaternionIsUnit(oOrientation)); @@ -1413,18 +1409,16 @@ inline ContainmentType BoundingBox::Contains(const BoundingOrientedBox& box) con { XMVECTOR C = XMVectorAdd(XMVector3Rotate(XMVectorMultiply(oExtents, g_BoxOffset[i]), oOrientation), oCenter); XMVECTOR d = XMVectorAbs(C); - Inside = XMVectorAndInt(Inside, XMVectorLessOrEqual(d, vExtents)); + Inside = XMVectorAndInt(Inside, XMVectorLessOrEqual(d, vExtents)); } return (XMVector3EqualInt(Inside, XMVectorTrueInt())) ? CONTAINS : INTERSECTS; } - //----------------------------------------------------------------------------- // Frustum in axis-aligned box test //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingBox::Contains(const BoundingFrustum& fr) const noexcept +_Use_decl_annotations_ inline ContainmentType BoundingBox::Contains(const BoundingFrustum& fr) const noexcept { if (!fr.Intersects(*this)) return DISJOINT; @@ -1432,7 +1426,7 @@ inline ContainmentType BoundingBox::Contains(const BoundingFrustum& fr) const no XMFLOAT3 Corners[BoundingFrustum::CORNER_COUNT]; fr.GetCorners(Corners); - XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vCenter = XMLoadFloat3(&Center); XMVECTOR vExtents = XMLoadFloat3(&Extents); XMVECTOR Inside = XMVectorTrueInt(); @@ -1440,24 +1434,22 @@ inline ContainmentType BoundingBox::Contains(const BoundingFrustum& fr) const no for (size_t i = 0; i < BoundingFrustum::CORNER_COUNT; ++i) { XMVECTOR Point = XMLoadFloat3(&Corners[i]); - XMVECTOR d = XMVectorAbs(XMVectorSubtract(Point, vCenter)); - Inside = XMVectorAndInt(Inside, XMVectorLessOrEqual(d, vExtents)); + XMVECTOR d = XMVectorAbs(XMVectorSubtract(Point, vCenter)); + Inside = XMVectorAndInt(Inside, XMVectorLessOrEqual(d, vExtents)); } return (XMVector3EqualInt(Inside, XMVectorTrueInt())) ? CONTAINS : INTERSECTS; } - //----------------------------------------------------------------------------- // Sphere vs axis-aligned box test //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingBox::Intersects(const BoundingSphere& sh) const noexcept +_Use_decl_annotations_ inline bool BoundingBox::Intersects(const BoundingSphere& sh) const noexcept { XMVECTOR SphereCenter = XMLoadFloat3(&sh.Center); XMVECTOR SphereRadius = XMVectorReplicatePtr(&sh.Radius); - XMVECTOR BoxCenter = XMLoadFloat3(&Center); + XMVECTOR BoxCenter = XMLoadFloat3(&Center); XMVECTOR BoxExtents = XMLoadFloat3(&Extents); XMVECTOR BoxMin = XMVectorSubtract(BoxCenter, BoxExtents); @@ -1471,7 +1463,7 @@ inline bool BoundingBox::Intersects(const BoundingSphere& sh) const noexcept XMVECTOR d = XMVectorZero(); // Compute d for each dimension. - XMVECTOR LessThanMin = XMVectorLess(SphereCenter, BoxMin); + XMVECTOR LessThanMin = XMVectorLess(SphereCenter, BoxMin); XMVECTOR GreaterThanMax = XMVectorGreater(SphereCenter, BoxMax); XMVECTOR MinDelta = XMVectorSubtract(SphereCenter, BoxMin); @@ -1487,17 +1479,15 @@ inline bool BoundingBox::Intersects(const BoundingSphere& sh) const noexcept return XMVector3LessOrEqual(d2, XMVectorMultiply(SphereRadius, SphereRadius)); } - //----------------------------------------------------------------------------- // Axis-aligned box vs. axis-aligned box test //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingBox::Intersects(const BoundingBox& box) const noexcept +_Use_decl_annotations_ inline bool BoundingBox::Intersects(const BoundingBox& box) const noexcept { - XMVECTOR CenterA = XMLoadFloat3(&Center); + XMVECTOR CenterA = XMLoadFloat3(&Center); XMVECTOR ExtentsA = XMLoadFloat3(&Extents); - XMVECTOR CenterB = XMLoadFloat3(&box.Center); + XMVECTOR CenterB = XMLoadFloat3(&box.Center); XMVECTOR ExtentsB = XMLoadFloat3(&box.Extents); XMVECTOR MinA = XMVectorSubtract(CenterA, ExtentsA); @@ -1512,37 +1502,31 @@ inline bool BoundingBox::Intersects(const BoundingBox& box) const noexcept return !DirectX::MathInternal::XMVector3AnyTrue(Disjoint); } - //----------------------------------------------------------------------------- // Oriented box vs. axis-aligned box test //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingBox::Intersects(const BoundingOrientedBox& box) const noexcept +_Use_decl_annotations_ inline bool BoundingBox::Intersects(const BoundingOrientedBox& box) const noexcept { return box.Intersects(*this); } - //----------------------------------------------------------------------------- // Frustum vs. axis-aligned box test //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingBox::Intersects(const BoundingFrustum& fr) const noexcept +_Use_decl_annotations_ inline bool BoundingBox::Intersects(const BoundingFrustum& fr) const noexcept { return fr.Intersects(*this); } - //----------------------------------------------------------------------------- // Triangle vs. axis aligned box test //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool XM_CALLCONV BoundingBox::Intersects(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept +_Use_decl_annotations_ inline bool XM_CALLCONV BoundingBox::Intersects(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept { XMVECTOR Zero = XMVectorZero(); // Load the box. - XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vCenter = XMLoadFloat3(&Center); XMVECTOR vExtents = XMLoadFloat3(&Extents); XMVECTOR BoxMin = XMVectorSubtract(vCenter, vExtents); @@ -1560,7 +1544,7 @@ inline bool XM_CALLCONV BoundingBox::Intersects(FXMVECTOR V0, FXMVECTOR V1, FXMV // Test the plane of the triangle. XMVECTOR Normal = XMVector3Cross(XMVectorSubtract(V1, V0), XMVectorSubtract(V2, V0)); - XMVECTOR Dist = XMVector3Dot(Normal, V0); + XMVECTOR Dist = XMVector3Dot(Normal, V0); // Assert that the triangle is not degenerate. assert(!XMVector3Equal(Normal, Zero)); @@ -1568,15 +1552,15 @@ inline bool XM_CALLCONV BoundingBox::Intersects(FXMVECTOR V0, FXMVECTOR V1, FXMV // for each i in (x, y, z) if n(i) >= 0 then v_min(i)=b_min(i), v_max(i)=b_max(i) // else v_min(i)=b_max(i), v_max(i)=b_min(i) XMVECTOR NormalSelect = XMVectorGreater(Normal, Zero); - XMVECTOR V_Min = XMVectorSelect(BoxMax, BoxMin, NormalSelect); - XMVECTOR V_Max = XMVectorSelect(BoxMin, BoxMax, NormalSelect); + XMVECTOR V_Min = XMVectorSelect(BoxMax, BoxMin, NormalSelect); + XMVECTOR V_Max = XMVectorSelect(BoxMin, BoxMax, NormalSelect); // if n dot v_min + d > 0 || n dot v_max + d < 0 then disjoint XMVECTOR MinDist = XMVector3Dot(V_Min, Normal); XMVECTOR MaxDist = XMVector3Dot(V_Max, Normal); XMVECTOR NoIntersection = XMVectorGreater(MinDist, Dist); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(MaxDist, Dist)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(MaxDist, Dist)); // Move the box center to zero to simplify the following tests. XMVECTOR TV0 = XMVectorSubtract(V0, vCenter); @@ -1600,115 +1584,113 @@ inline bool XM_CALLCONV BoundingBox::Intersects(FXMVECTOR V0, FXMVECTOR V1, FXMV // Axis == (1,0,0) x e0 = (0, -e0.z, e0.y) Axis = XMVectorPermute(e0, XMVectorNegate(e0)); - p0 = XMVector3Dot(TV0, Axis); + p0 = XMVector3Dot(TV0, Axis); // p1 = XMVector3Dot( V1, Axis ); // p1 = p0; - p2 = XMVector3Dot(TV2, Axis); - Min = XMVectorMin(p0, p2); - Max = XMVectorMax(p0, p2); - Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); + p2 = XMVector3Dot(TV2, Axis); + Min = XMVectorMin(p0, p2); + Max = XMVectorMax(p0, p2); + Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); // Axis == (1,0,0) x e1 = (0, -e1.z, e1.y) Axis = XMVectorPermute(e1, XMVectorNegate(e1)); - p0 = XMVector3Dot(TV0, Axis); - p1 = XMVector3Dot(TV1, Axis); + p0 = XMVector3Dot(TV0, Axis); + p1 = XMVector3Dot(TV1, Axis); // p2 = XMVector3Dot( V2, Axis ); // p2 = p1; - Min = XMVectorMin(p0, p1); - Max = XMVectorMax(p0, p1); - Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); + Min = XMVectorMin(p0, p1); + Max = XMVectorMax(p0, p1); + Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); // Axis == (1,0,0) x e2 = (0, -e2.z, e2.y) Axis = XMVectorPermute(e2, XMVectorNegate(e2)); - p0 = XMVector3Dot(TV0, Axis); - p1 = XMVector3Dot(TV1, Axis); + p0 = XMVector3Dot(TV0, Axis); + p1 = XMVector3Dot(TV1, Axis); // p2 = XMVector3Dot( V2, Axis ); // p2 = p0; - Min = XMVectorMin(p0, p1); - Max = XMVectorMax(p0, p1); - Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); + Min = XMVectorMin(p0, p1); + Max = XMVectorMax(p0, p1); + Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); // Axis == (0,1,0) x e0 = (e0.z, 0, -e0.x) Axis = XMVectorPermute(e0, XMVectorNegate(e0)); - p0 = XMVector3Dot(TV0, Axis); + p0 = XMVector3Dot(TV0, Axis); // p1 = XMVector3Dot( V1, Axis ); // p1 = p0; - p2 = XMVector3Dot(TV2, Axis); - Min = XMVectorMin(p0, p2); - Max = XMVectorMax(p0, p2); - Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); + p2 = XMVector3Dot(TV2, Axis); + Min = XMVectorMin(p0, p2); + Max = XMVectorMax(p0, p2); + Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); // Axis == (0,1,0) x e1 = (e1.z, 0, -e1.x) Axis = XMVectorPermute(e1, XMVectorNegate(e1)); - p0 = XMVector3Dot(TV0, Axis); - p1 = XMVector3Dot(TV1, Axis); + p0 = XMVector3Dot(TV0, Axis); + p1 = XMVector3Dot(TV1, Axis); // p2 = XMVector3Dot( V2, Axis ); // p2 = p1; - Min = XMVectorMin(p0, p1); - Max = XMVectorMax(p0, p1); - Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); + Min = XMVectorMin(p0, p1); + Max = XMVectorMax(p0, p1); + Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); // Axis == (0,0,1) x e2 = (e2.z, 0, -e2.x) Axis = XMVectorPermute(e2, XMVectorNegate(e2)); - p0 = XMVector3Dot(TV0, Axis); - p1 = XMVector3Dot(TV1, Axis); + p0 = XMVector3Dot(TV0, Axis); + p1 = XMVector3Dot(TV1, Axis); // p2 = XMVector3Dot( V2, Axis ); // p2 = p0; - Min = XMVectorMin(p0, p1); - Max = XMVectorMax(p0, p1); - Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); + Min = XMVectorMin(p0, p1); + Max = XMVectorMax(p0, p1); + Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); // Axis == (0,0,1) x e0 = (-e0.y, e0.x, 0) Axis = XMVectorPermute(e0, XMVectorNegate(e0)); - p0 = XMVector3Dot(TV0, Axis); + p0 = XMVector3Dot(TV0, Axis); // p1 = XMVector3Dot( V1, Axis ); // p1 = p0; - p2 = XMVector3Dot(TV2, Axis); - Min = XMVectorMin(p0, p2); - Max = XMVectorMax(p0, p2); - Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); + p2 = XMVector3Dot(TV2, Axis); + Min = XMVectorMin(p0, p2); + Max = XMVectorMax(p0, p2); + Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); // Axis == (0,0,1) x e1 = (-e1.y, e1.x, 0) Axis = XMVectorPermute(e1, XMVectorNegate(e1)); - p0 = XMVector3Dot(TV0, Axis); - p1 = XMVector3Dot(TV1, Axis); + p0 = XMVector3Dot(TV0, Axis); + p1 = XMVector3Dot(TV1, Axis); // p2 = XMVector3Dot( V2, Axis ); // p2 = p1; - Min = XMVectorMin(p0, p1); - Max = XMVectorMax(p0, p1); - Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); + Min = XMVectorMin(p0, p1); + Max = XMVectorMax(p0, p1); + Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); // Axis == (0,0,1) x e2 = (-e2.y, e2.x, 0) Axis = XMVectorPermute(e2, XMVectorNegate(e2)); - p0 = XMVector3Dot(TV0, Axis); - p1 = XMVector3Dot(TV1, Axis); + p0 = XMVector3Dot(TV0, Axis); + p1 = XMVector3Dot(TV1, Axis); // p2 = XMVector3Dot( V2, Axis ); // p2 = p0; - Min = XMVectorMin(p0, p1); - Max = XMVectorMax(p0, p1); - Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); + Min = XMVectorMin(p0, p1); + Max = XMVectorMax(p0, p1); + Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); return XMVector4NotEqualInt(NoIntersection, XMVectorTrueInt()); } - //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline PlaneIntersectionType XM_CALLCONV BoundingBox::Intersects(FXMVECTOR Plane) const noexcept +_Use_decl_annotations_ inline PlaneIntersectionType XM_CALLCONV BoundingBox::Intersects(FXMVECTOR Plane) const noexcept { assert(DirectX::MathInternal::XMPlaneIsUnit(Plane)); // Load the box. - XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vCenter = XMLoadFloat3(&Center); XMVECTOR vExtents = XMLoadFloat3(&Extents); // Set w of the center to one so we can dot4 with a plane. @@ -1729,18 +1711,16 @@ inline PlaneIntersectionType XM_CALLCONV BoundingBox::Intersects(FXMVECTOR Plane return INTERSECTING; } - //----------------------------------------------------------------------------- // Compute the intersection of a ray (Origin, Direction) with an axis aligned // box using the slabs method. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool XM_CALLCONV BoundingBox::Intersects(FXMVECTOR Origin, FXMVECTOR Direction, float& Dist) const noexcept +_Use_decl_annotations_ inline bool XM_CALLCONV BoundingBox::Intersects(FXMVECTOR Origin, FXMVECTOR Direction, float& Dist) const noexcept { assert(DirectX::MathInternal::XMVector3IsUnit(Direction)); // Load the box. - XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vCenter = XMLoadFloat3(&Center); XMVECTOR vExtents = XMLoadFloat3(&Extents); // Adjust ray origin to be relative to center of the box. @@ -1748,7 +1728,7 @@ inline bool XM_CALLCONV BoundingBox::Intersects(FXMVECTOR Origin, FXMVECTOR Dire // Compute the dot product againt each axis of the box. // Since the axii are (1,0,0), (0,1,0), (0,0,1) no computation is necessary. - XMVECTOR AxisDotOrigin = TOrigin; + XMVECTOR AxisDotOrigin = TOrigin; XMVECTOR AxisDotDirection = Direction; // if (fabs(AxisDotDirection) <= Epsilon) the ray is nearly parallel to the slab. @@ -1756,8 +1736,8 @@ inline bool XM_CALLCONV BoundingBox::Intersects(FXMVECTOR Origin, FXMVECTOR Dire // Test against all three axii simultaneously. XMVECTOR InverseAxisDotDirection = XMVectorReciprocal(AxisDotDirection); - XMVECTOR t1 = XMVectorMultiply(XMVectorSubtract(AxisDotOrigin, vExtents), InverseAxisDotDirection); - XMVECTOR t2 = XMVectorMultiply(XMVectorAdd(AxisDotOrigin, vExtents), InverseAxisDotDirection); + XMVECTOR t1 = XMVectorMultiply(XMVectorSubtract(AxisDotOrigin, vExtents), InverseAxisDotDirection); + XMVECTOR t2 = XMVectorMultiply(XMVectorAdd(AxisDotOrigin, vExtents), InverseAxisDotDirection); // Compute the max of min(t1,t2) and the min of max(t1,t2) ensuring we don't // use the results from any directions parallel to the slab. @@ -1766,10 +1746,10 @@ inline bool XM_CALLCONV BoundingBox::Intersects(FXMVECTOR Origin, FXMVECTOR Dire // t_min.x = maximum( t_min.x, t_min.y, t_min.z ); // t_max.x = minimum( t_max.x, t_max.y, t_max.z ); - t_min = XMVectorMax(t_min, XMVectorSplatY(t_min)); // x = max(x,y) - t_min = XMVectorMax(t_min, XMVectorSplatZ(t_min)); // x = max(max(x,y),z) - t_max = XMVectorMin(t_max, XMVectorSplatY(t_max)); // x = min(x,y) - t_max = XMVectorMin(t_max, XMVectorSplatZ(t_max)); // x = min(min(x,y),z) + t_min = XMVectorMax(t_min, XMVectorSplatY(t_min)); // x = max(x,y) + t_min = XMVectorMax(t_min, XMVectorSplatZ(t_min)); // x = max(max(x,y),z) + t_max = XMVectorMin(t_max, XMVectorSplatY(t_max)); // x = min(x,y) + t_max = XMVectorMin(t_max, XMVectorSplatZ(t_max)); // x = min(min(x,y),z) // if ( t_min > t_max ) return false; XMVECTOR NoIntersection = XMVectorGreater(XMVectorSplatX(t_min), XMVectorSplatX(t_max)); @@ -1779,7 +1759,7 @@ inline bool XM_CALLCONV BoundingBox::Intersects(FXMVECTOR Origin, FXMVECTOR Dire // if (IsParallel && (-Extents > AxisDotOrigin || Extents < AxisDotOrigin)) return false; XMVECTOR ParallelOverlap = XMVectorInBounds(AxisDotOrigin, vExtents); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorAndCInt(IsParallel, ParallelOverlap)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorAndCInt(IsParallel, ParallelOverlap)); if (!DirectX::MathInternal::XMVector3AnyTrue(NoIntersection)) { @@ -1792,18 +1772,18 @@ inline bool XM_CALLCONV BoundingBox::Intersects(FXMVECTOR Origin, FXMVECTOR Dire return false; } - //----------------------------------------------------------------------------- // Test an axis alinged box vs 6 planes (typically forming a frustum). //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType XM_CALLCONV BoundingBox::ContainedBy( - FXMVECTOR Plane0, FXMVECTOR Plane1, FXMVECTOR Plane2, - GXMVECTOR Plane3, - HXMVECTOR Plane4, HXMVECTOR Plane5) const noexcept +_Use_decl_annotations_ inline ContainmentType XM_CALLCONV BoundingBox::ContainedBy(FXMVECTOR Plane0, + FXMVECTOR Plane1, + FXMVECTOR Plane2, + GXMVECTOR Plane3, + HXMVECTOR Plane4, + HXMVECTOR Plane5) const noexcept { // Load the box. - XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vCenter = XMLoadFloat3(&Center); XMVECTOR vExtents = XMLoadFloat3(&Extents); // Set w of the center to one so we can dot4 with a plane. @@ -1815,27 +1795,27 @@ inline ContainmentType XM_CALLCONV BoundingBox::ContainedBy( DirectX::MathInternal::FastIntersectAxisAlignedBoxPlane(vCenter, vExtents, Plane0, Outside, Inside); XMVECTOR AnyOutside = Outside; - XMVECTOR AllInside = Inside; + XMVECTOR AllInside = Inside; DirectX::MathInternal::FastIntersectAxisAlignedBoxPlane(vCenter, vExtents, Plane1, Outside, Inside); AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); + AllInside = XMVectorAndInt(AllInside, Inside); DirectX::MathInternal::FastIntersectAxisAlignedBoxPlane(vCenter, vExtents, Plane2, Outside, Inside); AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); + AllInside = XMVectorAndInt(AllInside, Inside); DirectX::MathInternal::FastIntersectAxisAlignedBoxPlane(vCenter, vExtents, Plane3, Outside, Inside); AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); + AllInside = XMVectorAndInt(AllInside, Inside); DirectX::MathInternal::FastIntersectAxisAlignedBoxPlane(vCenter, vExtents, Plane4, Outside, Inside); AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); + AllInside = XMVectorAndInt(AllInside, Inside); DirectX::MathInternal::FastIntersectAxisAlignedBoxPlane(vCenter, vExtents, Plane5, Outside, Inside); AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); + AllInside = XMVectorAndInt(AllInside, Inside); // If the box is outside any plane it is outside. if (XMVector4EqualInt(AnyOutside, XMVectorTrueInt())) @@ -1849,24 +1829,22 @@ inline ContainmentType XM_CALLCONV BoundingBox::ContainedBy( return INTERSECTS; } - //----------------------------------------------------------------------------- // Create axis-aligned box that contains two other bounding boxes //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void BoundingBox::CreateMerged(BoundingBox& Out, const BoundingBox& b1, const BoundingBox& b2) noexcept +_Use_decl_annotations_ inline void BoundingBox::CreateMerged(BoundingBox& Out, const BoundingBox& b1, const BoundingBox& b2) noexcept { - XMVECTOR b1Center = XMLoadFloat3(&b1.Center); + XMVECTOR b1Center = XMLoadFloat3(&b1.Center); XMVECTOR b1Extents = XMLoadFloat3(&b1.Extents); - XMVECTOR b2Center = XMLoadFloat3(&b2.Center); + XMVECTOR b2Center = XMLoadFloat3(&b2.Center); XMVECTOR b2Extents = XMLoadFloat3(&b2.Extents); XMVECTOR Min = XMVectorSubtract(b1Center, b1Extents); - Min = XMVectorMin(Min, XMVectorSubtract(b2Center, b2Extents)); + Min = XMVectorMin(Min, XMVectorSubtract(b2Center, b2Extents)); XMVECTOR Max = XMVectorAdd(b1Center, b1Extents); - Max = XMVectorMax(Max, XMVectorAdd(b2Center, b2Extents)); + Max = XMVectorMax(Max, XMVectorAdd(b2Center, b2Extents)); assert(XMVector3LessOrEqual(Min, Max)); @@ -1874,12 +1852,10 @@ inline void BoundingBox::CreateMerged(BoundingBox& Out, const BoundingBox& b1, c XMStoreFloat3(&Out.Extents, XMVectorScale(XMVectorSubtract(Max, Min), 0.5f)); } - //----------------------------------------------------------------------------- // Create axis-aligned box that contains a bounding sphere //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void BoundingBox::CreateFromSphere(BoundingBox& Out, const BoundingSphere& sh) noexcept +_Use_decl_annotations_ inline void BoundingBox::CreateFromSphere(BoundingBox& Out, const BoundingSphere& sh) noexcept { XMVECTOR spCenter = XMLoadFloat3(&sh.Center); XMVECTOR shRadius = XMVectorReplicatePtr(&sh.Radius); @@ -1893,12 +1869,10 @@ inline void BoundingBox::CreateFromSphere(BoundingBox& Out, const BoundingSphere XMStoreFloat3(&Out.Extents, XMVectorScale(XMVectorSubtract(Max, Min), 0.5f)); } - //----------------------------------------------------------------------------- // Create axis-aligned box from min/max points //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void XM_CALLCONV BoundingBox::CreateFromPoints(BoundingBox& Out, FXMVECTOR pt1, FXMVECTOR pt2) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV BoundingBox::CreateFromPoints(BoundingBox& Out, FXMVECTOR pt1, FXMVECTOR pt2) noexcept { XMVECTOR Min = XMVectorMin(pt1, pt2); XMVECTOR Max = XMVectorMax(pt1, pt2); @@ -1908,12 +1882,11 @@ inline void XM_CALLCONV BoundingBox::CreateFromPoints(BoundingBox& Out, FXMVECTO XMStoreFloat3(&Out.Extents, XMVectorScale(XMVectorSubtract(Max, Min), 0.5f)); } - //----------------------------------------------------------------------------- // Find the minimum axis aligned bounding box containing a set of points. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void BoundingBox::CreateFromPoints(BoundingBox& Out, size_t Count, const XMFLOAT3* pPoints, size_t Stride) noexcept +_Use_decl_annotations_ inline void +BoundingBox::CreateFromPoints(BoundingBox& Out, size_t Count, const XMFLOAT3* pPoints, size_t Stride) noexcept { assert(Count > 0); assert(pPoints); @@ -1936,7 +1909,6 @@ inline void BoundingBox::CreateFromPoints(BoundingBox& Out, size_t Count, const XMStoreFloat3(&Out.Extents, XMVectorScale(XMVectorSubtract(vMax, vMin), 0.5f)); } - /**************************************************************************** * * BoundingOrientedBox @@ -1946,24 +1918,23 @@ inline void BoundingBox::CreateFromPoints(BoundingBox& Out, size_t Count, const //----------------------------------------------------------------------------- // Transform an oriented box by an angle preserving transform. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void XM_CALLCONV BoundingOrientedBox::Transform(BoundingOrientedBox& Out, FXMMATRIX M) const noexcept +_Use_decl_annotations_ inline void XM_CALLCONV BoundingOrientedBox::Transform(BoundingOrientedBox& Out, FXMMATRIX M) const noexcept { // Load the box. - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); XMVECTOR vOrientation = XMLoadFloat4(&Orientation); assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); // Composite the box rotation and the transform rotation. XMMATRIX nM; - nM.r[0] = XMVector3Normalize(M.r[0]); - nM.r[1] = XMVector3Normalize(M.r[1]); - nM.r[2] = XMVector3Normalize(M.r[2]); - nM.r[3] = g_XMIdentityR3; + nM.r[0] = XMVector3Normalize(M.r[0]); + nM.r[1] = XMVector3Normalize(M.r[1]); + nM.r[2] = XMVector3Normalize(M.r[2]); + nM.r[3] = g_XMIdentityR3; XMVECTOR Rotation = XMQuaternionRotationMatrix(nM); - vOrientation = XMQuaternionMultiply(vOrientation, Rotation); + vOrientation = XMQuaternionMultiply(vOrientation, Rotation); // Transform the center. vCenter = XMVector3Transform(vCenter, M); @@ -1974,8 +1945,8 @@ inline void XM_CALLCONV BoundingOrientedBox::Transform(BoundingOrientedBox& Out, XMVECTOR dZ = XMVector3Length(M.r[2]); XMVECTOR VectorScale = XMVectorSelect(dY, dX, g_XMSelect1000); - VectorScale = XMVectorSelect(dZ, VectorScale, g_XMSelect1100); - vExtents = XMVectorMultiply(vExtents, VectorScale); + VectorScale = XMVectorSelect(dZ, VectorScale, g_XMSelect1100); + vExtents = XMVectorMultiply(vExtents, VectorScale); // Store the box. XMStoreFloat3(&Out.Center, vCenter); @@ -1983,14 +1954,16 @@ inline void XM_CALLCONV BoundingOrientedBox::Transform(BoundingOrientedBox& Out, XMStoreFloat4(&Out.Orientation, vOrientation); } -_Use_decl_annotations_ -inline void XM_CALLCONV BoundingOrientedBox::Transform(BoundingOrientedBox& Out, float Scale, FXMVECTOR Rotation, FXMVECTOR Translation) const noexcept +_Use_decl_annotations_ inline void XM_CALLCONV BoundingOrientedBox::Transform(BoundingOrientedBox& Out, + float Scale, + FXMVECTOR Rotation, + FXMVECTOR Translation) const noexcept { assert(DirectX::MathInternal::XMQuaternionIsUnit(Rotation)); // Load the box. - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); XMVECTOR vOrientation = XMLoadFloat4(&Orientation); assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); @@ -2000,7 +1973,7 @@ inline void XM_CALLCONV BoundingOrientedBox::Transform(BoundingOrientedBox& Out, // Transform the center. XMVECTOR VectorScale = XMVectorReplicate(Scale); - vCenter = XMVectorAdd(XMVector3Rotate(XMVectorMultiply(vCenter, VectorScale), Rotation), Translation); + vCenter = XMVectorAdd(XMVector3Rotate(XMVectorMultiply(vCenter, VectorScale), Rotation), Translation); // Scale the box extents. vExtents = XMVectorMultiply(vExtents, VectorScale); @@ -2011,18 +1984,16 @@ inline void XM_CALLCONV BoundingOrientedBox::Transform(BoundingOrientedBox& Out, XMStoreFloat4(&Out.Orientation, vOrientation); } - //----------------------------------------------------------------------------- // Get the corner points of the box //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void BoundingOrientedBox::GetCorners(XMFLOAT3* Corners) const noexcept +_Use_decl_annotations_ inline void BoundingOrientedBox::GetCorners(XMFLOAT3* Corners) const noexcept { assert(Corners != nullptr); // Load the box - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); XMVECTOR vOrientation = XMLoadFloat4(&Orientation); assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); @@ -2034,15 +2005,13 @@ inline void BoundingOrientedBox::GetCorners(XMFLOAT3* Corners) const noexcept } } - //----------------------------------------------------------------------------- // Point in oriented box test. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType XM_CALLCONV BoundingOrientedBox::Contains(FXMVECTOR Point) const noexcept +_Use_decl_annotations_ inline ContainmentType XM_CALLCONV BoundingOrientedBox::Contains(FXMVECTOR Point) const noexcept { - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); XMVECTOR vOrientation = XMLoadFloat4(&Orientation); // Transform the point to be local to the box. @@ -2051,15 +2020,15 @@ inline ContainmentType XM_CALLCONV BoundingOrientedBox::Contains(FXMVECTOR Point return XMVector3InBounds(TPoint, vExtents) ? CONTAINS : DISJOINT; } - //----------------------------------------------------------------------------- // Triangle in oriented bounding box //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType XM_CALLCONV BoundingOrientedBox::Contains(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept +_Use_decl_annotations_ inline ContainmentType XM_CALLCONV BoundingOrientedBox::Contains(FXMVECTOR V0, + FXMVECTOR V1, + FXMVECTOR V2) const noexcept { // Load the box center & orientation. - XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vCenter = XMLoadFloat3(&Center); XMVECTOR vOrientation = XMLoadFloat4(&Orientation); // Transform the triangle vertices into the space of the box. @@ -2068,25 +2037,23 @@ inline ContainmentType XM_CALLCONV BoundingOrientedBox::Contains(FXMVECTOR V0, F XMVECTOR TV2 = XMVector3InverseRotate(XMVectorSubtract(V2, vCenter), vOrientation); BoundingBox box; - box.Center = XMFLOAT3(0.0f, 0.0f, 0.0f); + box.Center = XMFLOAT3(0.0f, 0.0f, 0.0f); box.Extents = Extents; // Use the triangle vs axis aligned box intersection routine. return box.Contains(TV0, TV1, TV2); } - //----------------------------------------------------------------------------- // Sphere in oriented bounding box //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingOrientedBox::Contains(const BoundingSphere& sh) const noexcept +_Use_decl_annotations_ inline ContainmentType BoundingOrientedBox::Contains(const BoundingSphere& sh) const noexcept { XMVECTOR SphereCenter = XMLoadFloat3(&sh.Center); XMVECTOR SphereRadius = XMVectorReplicatePtr(&sh.Radius); - XMVECTOR BoxCenter = XMLoadFloat3(&Center); - XMVECTOR BoxExtents = XMLoadFloat3(&Extents); + XMVECTOR BoxCenter = XMLoadFloat3(&Center); + XMVECTOR BoxExtents = XMLoadFloat3(&Extents); XMVECTOR BoxOrientation = XMLoadFloat4(&Orientation); assert(DirectX::MathInternal::XMQuaternionIsUnit(BoxOrientation)); @@ -2104,7 +2071,7 @@ inline ContainmentType BoundingOrientedBox::Contains(const BoundingSphere& sh) c XMVECTOR d = XMVectorZero(); // Compute d for each dimension. - XMVECTOR LessThanMin = XMVectorLess(SphereCenter, XMVectorNegate(BoxExtents)); + XMVECTOR LessThanMin = XMVectorLess(SphereCenter, XMVectorNegate(BoxExtents)); XMVECTOR GreaterThanMax = XMVectorGreater(SphereCenter, BoxExtents); XMVECTOR MinDelta = XMVectorAdd(SphereCenter, BoxExtents); @@ -2115,7 +2082,7 @@ inline ContainmentType BoundingOrientedBox::Contains(const BoundingSphere& sh) c d = XMVectorSelect(d, MaxDelta, GreaterThanMax); // Use a dot-product to square them and sum them together. - XMVECTOR d2 = XMVector3Dot(d, d); + XMVECTOR d2 = XMVector3Dot(d, d); XMVECTOR SphereRadiusSq = XMVectorMultiply(SphereRadius, SphereRadius); if (XMVector4Greater(d2, SphereRadiusSq)) @@ -2128,38 +2095,34 @@ inline ContainmentType BoundingOrientedBox::Contains(const BoundingSphere& sh) c return (XMVector3InBounds(SMin, BoxExtents) && XMVector3InBounds(SMax, BoxExtents)) ? CONTAINS : INTERSECTS; } - //----------------------------------------------------------------------------- // Axis aligned box vs. oriented box. Constructs an oriented box and uses // the oriented box vs. oriented box test. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingOrientedBox::Contains(const BoundingBox& box) const noexcept +_Use_decl_annotations_ inline ContainmentType BoundingOrientedBox::Contains(const BoundingBox& box) const noexcept { // Make the axis aligned box oriented and do an OBB vs OBB test. BoundingOrientedBox obox(box.Center, box.Extents, XMFLOAT4(0.f, 0.f, 0.f, 1.f)); return Contains(obox); } - //----------------------------------------------------------------------------- // Oriented bounding box in oriented bounding box //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingOrientedBox::Contains(const BoundingOrientedBox& box) const noexcept +_Use_decl_annotations_ inline ContainmentType BoundingOrientedBox::Contains(const BoundingOrientedBox& box) const noexcept { if (!Intersects(box)) return DISJOINT; // Load the boxes - XMVECTOR aCenter = XMLoadFloat3(&Center); - XMVECTOR aExtents = XMLoadFloat3(&Extents); + XMVECTOR aCenter = XMLoadFloat3(&Center); + XMVECTOR aExtents = XMLoadFloat3(&Extents); XMVECTOR aOrientation = XMLoadFloat4(&Orientation); assert(DirectX::MathInternal::XMQuaternionIsUnit(aOrientation)); - XMVECTOR bCenter = XMLoadFloat3(&box.Center); - XMVECTOR bExtents = XMLoadFloat3(&box.Extents); + XMVECTOR bCenter = XMLoadFloat3(&box.Center); + XMVECTOR bExtents = XMLoadFloat3(&box.Extents); XMVECTOR bOrientation = XMLoadFloat4(&box.Orientation); assert(DirectX::MathInternal::XMQuaternionIsUnit(bOrientation)); @@ -2172,7 +2135,7 @@ inline ContainmentType BoundingOrientedBox::Contains(const BoundingOrientedBox& // Ca = invrotate( Cb - aCenter, aOrientation ) XMVECTOR C = XMVectorAdd(XMVector3Rotate(XMVectorMultiply(bExtents, g_BoxOffset[i]), bOrientation), offset); - C = XMVector3InverseRotate(C, aOrientation); + C = XMVector3InverseRotate(C, aOrientation); if (!XMVector3InBounds(C, aExtents)) return INTERSECTS; @@ -2181,12 +2144,10 @@ inline ContainmentType BoundingOrientedBox::Contains(const BoundingOrientedBox& return CONTAINS; } - //----------------------------------------------------------------------------- // Frustum in oriented bounding box //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingOrientedBox::Contains(const BoundingFrustum& fr) const noexcept +_Use_decl_annotations_ inline ContainmentType BoundingOrientedBox::Contains(const BoundingFrustum& fr) const noexcept { if (!fr.Intersects(*this)) return DISJOINT; @@ -2195,8 +2156,8 @@ inline ContainmentType BoundingOrientedBox::Contains(const BoundingFrustum& fr) fr.GetCorners(Corners); // Load the box - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); XMVECTOR vOrientation = XMLoadFloat4(&Orientation); assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); @@ -2212,18 +2173,16 @@ inline ContainmentType BoundingOrientedBox::Contains(const BoundingFrustum& fr) return CONTAINS; } - //----------------------------------------------------------------------------- // Sphere vs. oriented box test //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingOrientedBox::Intersects(const BoundingSphere& sh) const noexcept +_Use_decl_annotations_ inline bool BoundingOrientedBox::Intersects(const BoundingSphere& sh) const noexcept { XMVECTOR SphereCenter = XMLoadFloat3(&sh.Center); XMVECTOR SphereRadius = XMVectorReplicatePtr(&sh.Radius); - XMVECTOR BoxCenter = XMLoadFloat3(&Center); - XMVECTOR BoxExtents = XMLoadFloat3(&Extents); + XMVECTOR BoxCenter = XMLoadFloat3(&Center); + XMVECTOR BoxExtents = XMLoadFloat3(&Extents); XMVECTOR BoxOrientation = XMLoadFloat4(&Orientation); assert(DirectX::MathInternal::XMQuaternionIsUnit(BoxOrientation)); @@ -2241,7 +2200,7 @@ inline bool BoundingOrientedBox::Intersects(const BoundingSphere& sh) const noex XMVECTOR d = XMVectorZero(); // Compute d for each dimension. - XMVECTOR LessThanMin = XMVectorLess(SphereCenter, XMVectorNegate(BoxExtents)); + XMVECTOR LessThanMin = XMVectorLess(SphereCenter, XMVectorNegate(BoxExtents)); XMVECTOR GreaterThanMax = XMVectorGreater(SphereCenter, BoxExtents); XMVECTOR MinDelta = XMVectorAdd(SphereCenter, BoxExtents); @@ -2257,26 +2216,22 @@ inline bool BoundingOrientedBox::Intersects(const BoundingSphere& sh) const noex return XMVector4LessOrEqual(d2, XMVectorMultiply(SphereRadius, SphereRadius)) ? true : false; } - //----------------------------------------------------------------------------- // Axis aligned box vs. oriented box. Constructs an oriented box and uses // the oriented box vs. oriented box test. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingOrientedBox::Intersects(const BoundingBox& box) const noexcept +_Use_decl_annotations_ inline bool BoundingOrientedBox::Intersects(const BoundingBox& box) const noexcept { // Make the axis aligned box oriented and do an OBB vs OBB test. BoundingOrientedBox obox(box.Center, box.Extents, XMFLOAT4(0.f, 0.f, 0.f, 1.f)); return Intersects(obox); } - //----------------------------------------------------------------------------- // Fast oriented box / oriented box intersection test using the separating axis // theorem. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingOrientedBox::Intersects(const BoundingOrientedBox& box) const noexcept +_Use_decl_annotations_ inline bool BoundingOrientedBox::Intersects(const BoundingOrientedBox& box) const noexcept { // Build the 3x3 rotation matrix that defines the orientation of B relative to A. XMVECTOR A_quat = XMLoadFloat4(&Orientation); @@ -2291,7 +2246,7 @@ inline bool BoundingOrientedBox::Intersects(const BoundingOrientedBox& box) cons // Compute the translation of B relative to A. XMVECTOR A_cent = XMLoadFloat3(&Center); XMVECTOR B_cent = XMLoadFloat3(&box.Center); - XMVECTOR t = XMVector3InverseRotate(XMVectorSubtract(B_cent, A_cent), A_quat); + XMVECTOR t = XMVector3InverseRotate(XMVectorSubtract(B_cent, A_cent), A_quat); // // h(A) = extents of A. @@ -2339,162 +2294,144 @@ inline bool BoundingOrientedBox::Intersects(const BoundingOrientedBox& box) cons // t dot l = t.x // d(A) = h(A).x // d(B) = h(B) dot abs(r00, r01, r02) - d = XMVectorSplatX(t); - d_A = XMVectorSplatX(h_A); - d_B = XMVector3Dot(h_B, AR0X); + d = XMVectorSplatX(t); + d_A = XMVectorSplatX(h_A); + d_B = XMVector3Dot(h_B, AR0X); XMVECTOR NoIntersection = XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B)); // l = a(v) = (0, 1, 0) // t dot l = t.y // d(A) = h(A).y // d(B) = h(B) dot abs(r10, r11, r12) - d = XMVectorSplatY(t); - d_A = XMVectorSplatY(h_A); - d_B = XMVector3Dot(h_B, AR1X); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + d = XMVectorSplatY(t); + d_A = XMVectorSplatY(h_A); + d_B = XMVector3Dot(h_B, AR1X); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); // l = a(w) = (0, 0, 1) // t dot l = t.z // d(A) = h(A).z // d(B) = h(B) dot abs(r20, r21, r22) - d = XMVectorSplatZ(t); - d_A = XMVectorSplatZ(h_A); - d_B = XMVector3Dot(h_B, AR2X); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + d = XMVectorSplatZ(t); + d_A = XMVectorSplatZ(h_A); + d_B = XMVector3Dot(h_B, AR2X); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); // l = b(u) = (r00, r10, r20) // d(A) = h(A) dot abs(r00, r10, r20) // d(B) = h(B).x - d = XMVector3Dot(t, RX0); - d_A = XMVector3Dot(h_A, ARX0); - d_B = XMVectorSplatX(h_B); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + d = XMVector3Dot(t, RX0); + d_A = XMVector3Dot(h_A, ARX0); + d_B = XMVectorSplatX(h_B); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); // l = b(v) = (r01, r11, r21) // d(A) = h(A) dot abs(r01, r11, r21) // d(B) = h(B).y - d = XMVector3Dot(t, RX1); - d_A = XMVector3Dot(h_A, ARX1); - d_B = XMVectorSplatY(h_B); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + d = XMVector3Dot(t, RX1); + d_A = XMVector3Dot(h_A, ARX1); + d_B = XMVectorSplatY(h_B); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); // l = b(w) = (r02, r12, r22) // d(A) = h(A) dot abs(r02, r12, r22) // d(B) = h(B).z - d = XMVector3Dot(t, RX2); - d_A = XMVector3Dot(h_A, ARX2); - d_B = XMVectorSplatZ(h_B); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + d = XMVector3Dot(t, RX2); + d_A = XMVector3Dot(h_A, ARX2); + d_B = XMVectorSplatZ(h_B); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); // l = a(u) x b(u) = (0, -r20, r10) // d(A) = h(A) dot abs(0, r20, r10) // d(B) = h(B) dot abs(0, r02, r01) - d = XMVector3Dot(t, XMVectorPermute(RX0, XMVectorNegate(RX0))); - d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX0)); - d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR0X)); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + d = XMVector3Dot(t, XMVectorPermute(RX0, XMVectorNegate(RX0))); + d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX0)); + d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR0X)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); // l = a(u) x b(v) = (0, -r21, r11) // d(A) = h(A) dot abs(0, r21, r11) // d(B) = h(B) dot abs(r02, 0, r00) - d = XMVector3Dot(t, XMVectorPermute(RX1, XMVectorNegate(RX1))); - d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX1)); - d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR0X)); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + d = XMVector3Dot(t, XMVectorPermute(RX1, XMVectorNegate(RX1))); + d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX1)); + d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR0X)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); // l = a(u) x b(w) = (0, -r22, r12) // d(A) = h(A) dot abs(0, r22, r12) // d(B) = h(B) dot abs(r01, r00, 0) - d = XMVector3Dot(t, XMVectorPermute(RX2, XMVectorNegate(RX2))); - d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX2)); - d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR0X)); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + d = XMVector3Dot(t, XMVectorPermute(RX2, XMVectorNegate(RX2))); + d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX2)); + d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR0X)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); // l = a(v) x b(u) = (r20, 0, -r00) // d(A) = h(A) dot abs(r20, 0, r00) // d(B) = h(B) dot abs(0, r12, r11) - d = XMVector3Dot(t, XMVectorPermute(RX0, XMVectorNegate(RX0))); - d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX0)); - d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR1X)); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + d = XMVector3Dot(t, XMVectorPermute(RX0, XMVectorNegate(RX0))); + d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX0)); + d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR1X)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); // l = a(v) x b(v) = (r21, 0, -r01) // d(A) = h(A) dot abs(r21, 0, r01) // d(B) = h(B) dot abs(r12, 0, r10) - d = XMVector3Dot(t, XMVectorPermute(RX1, XMVectorNegate(RX1))); - d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX1)); - d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR1X)); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + d = XMVector3Dot(t, XMVectorPermute(RX1, XMVectorNegate(RX1))); + d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX1)); + d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR1X)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); // l = a(v) x b(w) = (r22, 0, -r02) // d(A) = h(A) dot abs(r22, 0, r02) // d(B) = h(B) dot abs(r11, r10, 0) - d = XMVector3Dot(t, XMVectorPermute(RX2, XMVectorNegate(RX2))); - d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX2)); - d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR1X)); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + d = XMVector3Dot(t, XMVectorPermute(RX2, XMVectorNegate(RX2))); + d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX2)); + d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR1X)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); // l = a(w) x b(u) = (-r10, r00, 0) // d(A) = h(A) dot abs(r10, r00, 0) // d(B) = h(B) dot abs(0, r22, r21) - d = XMVector3Dot(t, XMVectorPermute(RX0, XMVectorNegate(RX0))); - d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX0)); - d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR2X)); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + d = XMVector3Dot(t, XMVectorPermute(RX0, XMVectorNegate(RX0))); + d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX0)); + d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR2X)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); // l = a(w) x b(v) = (-r11, r01, 0) // d(A) = h(A) dot abs(r11, r01, 0) // d(B) = h(B) dot abs(r22, 0, r20) - d = XMVector3Dot(t, XMVectorPermute(RX1, XMVectorNegate(RX1))); - d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX1)); - d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR2X)); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + d = XMVector3Dot(t, XMVectorPermute(RX1, XMVectorNegate(RX1))); + d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX1)); + d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR2X)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); // l = a(w) x b(w) = (-r12, r02, 0) // d(A) = h(A) dot abs(r12, r02, 0) // d(B) = h(B) dot abs(r21, r20, 0) - d = XMVector3Dot(t, XMVectorPermute(RX2, XMVectorNegate(RX2))); - d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX2)); - d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR2X)); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + d = XMVector3Dot(t, XMVectorPermute(RX2, XMVectorNegate(RX2))); + d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX2)); + d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR2X)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); // No seperating axis found, boxes must intersect. return XMVector4NotEqualInt(NoIntersection, XMVectorTrueInt()) ? true : false; } - //----------------------------------------------------------------------------- // Frustum vs. oriented box test //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingOrientedBox::Intersects(const BoundingFrustum& fr) const noexcept +_Use_decl_annotations_ inline bool BoundingOrientedBox::Intersects(const BoundingFrustum& fr) const noexcept { return fr.Intersects(*this); } - //----------------------------------------------------------------------------- // Triangle vs. oriented box test. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool XM_CALLCONV BoundingOrientedBox::Intersects(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept +_Use_decl_annotations_ inline bool XM_CALLCONV BoundingOrientedBox::Intersects(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept { // Load the box center & orientation. - XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vCenter = XMLoadFloat3(&Center); XMVECTOR vOrientation = XMLoadFloat4(&Orientation); // Transform the triangle vertices into the space of the box. @@ -2503,23 +2440,21 @@ inline bool XM_CALLCONV BoundingOrientedBox::Intersects(FXMVECTOR V0, FXMVECTOR XMVECTOR TV2 = XMVector3InverseRotate(XMVectorSubtract(V2, vCenter), vOrientation); BoundingBox box; - box.Center = XMFLOAT3(0.0f, 0.0f, 0.0f); + box.Center = XMFLOAT3(0.0f, 0.0f, 0.0f); box.Extents = Extents; // Use the triangle vs axis aligned box intersection routine. return box.Intersects(TV0, TV1, TV2); } - //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline PlaneIntersectionType XM_CALLCONV BoundingOrientedBox::Intersects(FXMVECTOR Plane) const noexcept +_Use_decl_annotations_ inline PlaneIntersectionType XM_CALLCONV BoundingOrientedBox::Intersects(FXMVECTOR Plane) const noexcept { assert(DirectX::MathInternal::XMPlaneIsUnit(Plane)); // Load the box. - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); XMVECTOR BoxOrientation = XMLoadFloat4(&Orientation); assert(DirectX::MathInternal::XMQuaternionIsUnit(BoxOrientation)); @@ -2545,13 +2480,13 @@ inline PlaneIntersectionType XM_CALLCONV BoundingOrientedBox::Intersects(FXMVECT return INTERSECTING; } - //----------------------------------------------------------------------------- // Compute the intersection of a ray (Origin, Direction) with an oriented box // using the slabs method. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool XM_CALLCONV BoundingOrientedBox::Intersects(FXMVECTOR Origin, FXMVECTOR Direction, float& Dist) const noexcept +_Use_decl_annotations_ inline bool XM_CALLCONV BoundingOrientedBox::Intersects(FXMVECTOR Origin, + FXMVECTOR Direction, + float& Dist) const noexcept { assert(DirectX::MathInternal::XMVector3IsUnit(Direction)); @@ -2559,8 +2494,8 @@ inline bool XM_CALLCONV BoundingOrientedBox::Intersects(FXMVECTOR Origin, FXMVEC static const XMVECTORU32 SelectZ = { { { XM_SELECT_0, XM_SELECT_0, XM_SELECT_1, XM_SELECT_0 } } }; // Load the box. - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); XMVECTOR vOrientation = XMLoadFloat4(&Orientation); assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); @@ -2573,20 +2508,20 @@ inline bool XM_CALLCONV BoundingOrientedBox::Intersects(FXMVECTOR Origin, FXMVEC // Compute the dot product againt each axis of the box. XMVECTOR AxisDotOrigin = XMVector3Dot(R.r[0], TOrigin); - AxisDotOrigin = XMVectorSelect(AxisDotOrigin, XMVector3Dot(R.r[1], TOrigin), SelectY); - AxisDotOrigin = XMVectorSelect(AxisDotOrigin, XMVector3Dot(R.r[2], TOrigin), SelectZ); + AxisDotOrigin = XMVectorSelect(AxisDotOrigin, XMVector3Dot(R.r[1], TOrigin), SelectY); + AxisDotOrigin = XMVectorSelect(AxisDotOrigin, XMVector3Dot(R.r[2], TOrigin), SelectZ); XMVECTOR AxisDotDirection = XMVector3Dot(R.r[0], Direction); - AxisDotDirection = XMVectorSelect(AxisDotDirection, XMVector3Dot(R.r[1], Direction), SelectY); - AxisDotDirection = XMVectorSelect(AxisDotDirection, XMVector3Dot(R.r[2], Direction), SelectZ); + AxisDotDirection = XMVectorSelect(AxisDotDirection, XMVector3Dot(R.r[1], Direction), SelectY); + AxisDotDirection = XMVectorSelect(AxisDotDirection, XMVector3Dot(R.r[2], Direction), SelectZ); // if (fabs(AxisDotDirection) <= Epsilon) the ray is nearly parallel to the slab. XMVECTOR IsParallel = XMVectorLessOrEqual(XMVectorAbs(AxisDotDirection), g_RayEpsilon); // Test against all three axes simultaneously. XMVECTOR InverseAxisDotDirection = XMVectorReciprocal(AxisDotDirection); - XMVECTOR t1 = XMVectorMultiply(XMVectorSubtract(AxisDotOrigin, vExtents), InverseAxisDotDirection); - XMVECTOR t2 = XMVectorMultiply(XMVectorAdd(AxisDotOrigin, vExtents), InverseAxisDotDirection); + XMVECTOR t1 = XMVectorMultiply(XMVectorSubtract(AxisDotOrigin, vExtents), InverseAxisDotDirection); + XMVECTOR t2 = XMVectorMultiply(XMVectorAdd(AxisDotOrigin, vExtents), InverseAxisDotDirection); // Compute the max of min(t1,t2) and the min of max(t1,t2) ensuring we don't // use the results from any directions parallel to the slab. @@ -2595,10 +2530,10 @@ inline bool XM_CALLCONV BoundingOrientedBox::Intersects(FXMVECTOR Origin, FXMVEC // t_min.x = maximum( t_min.x, t_min.y, t_min.z ); // t_max.x = minimum( t_max.x, t_max.y, t_max.z ); - t_min = XMVectorMax(t_min, XMVectorSplatY(t_min)); // x = max(x,y) - t_min = XMVectorMax(t_min, XMVectorSplatZ(t_min)); // x = max(max(x,y),z) - t_max = XMVectorMin(t_max, XMVectorSplatY(t_max)); // x = min(x,y) - t_max = XMVectorMin(t_max, XMVectorSplatZ(t_max)); // x = min(min(x,y),z) + t_min = XMVectorMax(t_min, XMVectorSplatY(t_min)); // x = max(x,y) + t_min = XMVectorMax(t_min, XMVectorSplatZ(t_min)); // x = max(max(x,y),z) + t_max = XMVectorMin(t_max, XMVectorSplatY(t_max)); // x = min(x,y) + t_max = XMVectorMin(t_max, XMVectorSplatZ(t_max)); // x = min(min(x,y),z) // if ( t_min > t_max ) return false; XMVECTOR NoIntersection = XMVectorGreater(XMVectorSplatX(t_min), XMVectorSplatX(t_max)); @@ -2608,7 +2543,7 @@ inline bool XM_CALLCONV BoundingOrientedBox::Intersects(FXMVECTOR Origin, FXMVEC // if (IsParallel && (-Extents > AxisDotOrigin || Extents < AxisDotOrigin)) return false; XMVECTOR ParallelOverlap = XMVectorInBounds(AxisDotOrigin, vExtents); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorAndCInt(IsParallel, ParallelOverlap)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorAndCInt(IsParallel, ParallelOverlap)); if (!DirectX::MathInternal::XMVector3AnyTrue(NoIntersection)) { @@ -2621,19 +2556,19 @@ inline bool XM_CALLCONV BoundingOrientedBox::Intersects(FXMVECTOR Origin, FXMVEC return false; } - //----------------------------------------------------------------------------- // Test an oriented box vs 6 planes (typically forming a frustum). //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType XM_CALLCONV BoundingOrientedBox::ContainedBy( - FXMVECTOR Plane0, FXMVECTOR Plane1, FXMVECTOR Plane2, - GXMVECTOR Plane3, - HXMVECTOR Plane4, HXMVECTOR Plane5) const noexcept +_Use_decl_annotations_ inline ContainmentType XM_CALLCONV BoundingOrientedBox::ContainedBy(FXMVECTOR Plane0, + FXMVECTOR Plane1, + FXMVECTOR Plane2, + GXMVECTOR Plane3, + HXMVECTOR Plane4, + HXMVECTOR Plane5) const noexcept { // Load the box. - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); XMVECTOR BoxOrientation = XMLoadFloat4(&Orientation); assert(DirectX::MathInternal::XMQuaternionIsUnit(BoxOrientation)); @@ -2650,27 +2585,27 @@ inline ContainmentType XM_CALLCONV BoundingOrientedBox::ContainedBy( DirectX::MathInternal::FastIntersectOrientedBoxPlane(vCenter, vExtents, R.r[0], R.r[1], R.r[2], Plane0, Outside, Inside); XMVECTOR AnyOutside = Outside; - XMVECTOR AllInside = Inside; + XMVECTOR AllInside = Inside; DirectX::MathInternal::FastIntersectOrientedBoxPlane(vCenter, vExtents, R.r[0], R.r[1], R.r[2], Plane1, Outside, Inside); AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); + AllInside = XMVectorAndInt(AllInside, Inside); DirectX::MathInternal::FastIntersectOrientedBoxPlane(vCenter, vExtents, R.r[0], R.r[1], R.r[2], Plane2, Outside, Inside); AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); + AllInside = XMVectorAndInt(AllInside, Inside); DirectX::MathInternal::FastIntersectOrientedBoxPlane(vCenter, vExtents, R.r[0], R.r[1], R.r[2], Plane3, Outside, Inside); AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); + AllInside = XMVectorAndInt(AllInside, Inside); DirectX::MathInternal::FastIntersectOrientedBoxPlane(vCenter, vExtents, R.r[0], R.r[1], R.r[2], Plane4, Outside, Inside); AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); + AllInside = XMVectorAndInt(AllInside, Inside); DirectX::MathInternal::FastIntersectOrientedBoxPlane(vCenter, vExtents, R.r[0], R.r[1], R.r[2], Plane5, Outside, Inside); AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); + AllInside = XMVectorAndInt(AllInside, Inside); // If the box is outside any plane it is outside. if (XMVector4EqualInt(AnyOutside, XMVectorTrueInt())) @@ -2684,19 +2619,16 @@ inline ContainmentType XM_CALLCONV BoundingOrientedBox::ContainedBy( return INTERSECTS; } - //----------------------------------------------------------------------------- // Create oriented bounding box from axis-aligned bounding box //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void BoundingOrientedBox::CreateFromBoundingBox(BoundingOrientedBox& Out, const BoundingBox& box) noexcept +_Use_decl_annotations_ inline void BoundingOrientedBox::CreateFromBoundingBox(BoundingOrientedBox& Out, const BoundingBox& box) noexcept { - Out.Center = box.Center; - Out.Extents = box.Extents; + Out.Center = box.Center; + Out.Extents = box.Extents; Out.Orientation = XMFLOAT4(0.f, 0.f, 0.f, 1.f); } - //----------------------------------------------------------------------------- // Find the approximate minimum oriented bounding box containing a set of // points. Exact computation of minimum oriented bounding box is possible but @@ -2708,8 +2640,8 @@ inline void BoundingOrientedBox::CreateFromBoundingBox(BoundingOrientedBox& Out, // Exact computation of the minimum oriented bounding box is possible but the // best know algorithm is O(N^3) and is significanly more complex to implement. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void BoundingOrientedBox::CreateFromPoints(BoundingOrientedBox& Out, size_t Count, const XMFLOAT3* pPoints, size_t Stride) noexcept +_Use_decl_annotations_ inline void +BoundingOrientedBox::CreateFromPoints(BoundingOrientedBox& Out, size_t Count, const XMFLOAT3* pPoints, size_t Stride) noexcept { assert(Count > 0); assert(pPoints != nullptr); @@ -2734,7 +2666,9 @@ inline void BoundingOrientedBox::CreateFromPoints(BoundingOrientedBox& Out, size for (size_t i = 0; i < Count; ++i) { - XMVECTOR Point = XMVectorSubtract(XMLoadFloat3(reinterpret_cast(reinterpret_cast(pPoints) + i * Stride)), CenterOfMass); + XMVECTOR Point + = XMVectorSubtract(XMLoadFloat3(reinterpret_cast(reinterpret_cast(pPoints) + i * Stride)), + CenterOfMass); XX_YY_ZZ = XMVectorAdd(XX_YY_ZZ, XMVectorMultiply(Point, Point)); @@ -2747,11 +2681,15 @@ inline void BoundingOrientedBox::CreateFromPoints(BoundingOrientedBox& Out, size XMVECTOR v1, v2, v3; // Compute the eigenvectors of the inertia tensor. - DirectX::MathInternal::CalculateEigenVectorsFromCovarianceMatrix(XMVectorGetX(XX_YY_ZZ), XMVectorGetY(XX_YY_ZZ), + DirectX::MathInternal::CalculateEigenVectorsFromCovarianceMatrix(XMVectorGetX(XX_YY_ZZ), + XMVectorGetY(XX_YY_ZZ), XMVectorGetZ(XX_YY_ZZ), - XMVectorGetX(XY_XZ_YZ), XMVectorGetY(XY_XZ_YZ), + XMVectorGetX(XY_XZ_YZ), + XMVectorGetY(XY_XZ_YZ), XMVectorGetZ(XY_XZ_YZ), - &v1, &v2, &v3); + &v1, + &v2, + &v3); // Put them in a matrix. XMMATRIX R; @@ -2793,7 +2731,8 @@ inline void BoundingOrientedBox::CreateFromPoints(BoundingOrientedBox& Out, size for (size_t i = 1; i < Count; ++i) { - XMVECTOR Point = XMVector3TransformNormal(XMLoadFloat3(reinterpret_cast(reinterpret_cast(pPoints) + i * Stride)), + XMVECTOR Point = XMVector3TransformNormal( + XMLoadFloat3(reinterpret_cast(reinterpret_cast(pPoints) + i * Stride)), InverseR); vMin = XMVectorMin(vMin, Point); @@ -2802,7 +2741,7 @@ inline void BoundingOrientedBox::CreateFromPoints(BoundingOrientedBox& Out, size // Rotate the center into world space. XMVECTOR vCenter = XMVectorScale(XMVectorAdd(vMin, vMax), 0.5f); - vCenter = XMVector3TransformNormal(vCenter, R); + vCenter = XMVector3TransformNormal(vCenter, R); // Store center, extents, and orientation. XMStoreFloat3(&Out.Center, vCenter); @@ -2810,40 +2749,36 @@ inline void BoundingOrientedBox::CreateFromPoints(BoundingOrientedBox& Out, size XMStoreFloat4(&Out.Orientation, vOrientation); } - /**************************************************************************** * * BoundingFrustum * ****************************************************************************/ -_Use_decl_annotations_ -inline BoundingFrustum::BoundingFrustum(CXMMATRIX Projection, bool rhcoords) noexcept +_Use_decl_annotations_ inline BoundingFrustum::BoundingFrustum(CXMMATRIX Projection, bool rhcoords) noexcept { CreateFromMatrix(*this, Projection, rhcoords); } - //----------------------------------------------------------------------------- // Transform a frustum by an angle preserving transform. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void XM_CALLCONV BoundingFrustum::Transform(BoundingFrustum& Out, FXMMATRIX M) const noexcept +_Use_decl_annotations_ inline void XM_CALLCONV BoundingFrustum::Transform(BoundingFrustum& Out, FXMMATRIX M) const noexcept { // Load the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrigin = XMLoadFloat3(&Origin); XMVECTOR vOrientation = XMLoadFloat4(&Orientation); assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); // Composite the frustum rotation and the transform rotation XMMATRIX nM; - nM.r[0] = XMVector3Normalize(M.r[0]); - nM.r[1] = XMVector3Normalize(M.r[1]); - nM.r[2] = XMVector3Normalize(M.r[2]); - nM.r[3] = g_XMIdentityR3; + nM.r[0] = XMVector3Normalize(M.r[0]); + nM.r[1] = XMVector3Normalize(M.r[1]); + nM.r[2] = XMVector3Normalize(M.r[2]); + nM.r[3] = g_XMIdentityR3; XMVECTOR Rotation = XMQuaternionRotationMatrix(nM); - vOrientation = XMQuaternionMultiply(vOrientation, Rotation); + vOrientation = XMQuaternionMultiply(vOrientation, Rotation); // Transform the center. vOrigin = XMVector3Transform(vOrigin, M); @@ -2857,26 +2792,28 @@ inline void XM_CALLCONV BoundingFrustum::Transform(BoundingFrustum& Out, FXMMATR XMVECTOR dY = XMVector3Dot(M.r[1], M.r[1]); XMVECTOR dZ = XMVector3Dot(M.r[2], M.r[2]); - XMVECTOR d = XMVectorMax(dX, XMVectorMax(dY, dZ)); - float Scale = sqrtf(XMVectorGetX(d)); + XMVECTOR d = XMVectorMax(dX, XMVectorMax(dY, dZ)); + float Scale = sqrtf(XMVectorGetX(d)); Out.Near = Near * Scale; - Out.Far = Far * Scale; + Out.Far = Far * Scale; // Copy the slopes. - Out.RightSlope = RightSlope; - Out.LeftSlope = LeftSlope; - Out.TopSlope = TopSlope; + Out.RightSlope = RightSlope; + Out.LeftSlope = LeftSlope; + Out.TopSlope = TopSlope; Out.BottomSlope = BottomSlope; } -_Use_decl_annotations_ -inline void XM_CALLCONV BoundingFrustum::Transform(BoundingFrustum& Out, float Scale, FXMVECTOR Rotation, FXMVECTOR Translation) const noexcept +_Use_decl_annotations_ inline void XM_CALLCONV BoundingFrustum::Transform(BoundingFrustum& Out, + float Scale, + FXMVECTOR Rotation, + FXMVECTOR Translation) const noexcept { assert(DirectX::MathInternal::XMQuaternionIsUnit(Rotation)); // Load the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrigin = XMLoadFloat3(&Origin); XMVECTOR vOrientation = XMLoadFloat4(&Orientation); assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); @@ -2893,37 +2830,35 @@ inline void XM_CALLCONV BoundingFrustum::Transform(BoundingFrustum& Out, float S // Scale the near and far distances (the slopes remain the same). Out.Near = Near * Scale; - Out.Far = Far * Scale; + Out.Far = Far * Scale; // Copy the slopes. - Out.RightSlope = RightSlope; - Out.LeftSlope = LeftSlope; - Out.TopSlope = TopSlope; + Out.RightSlope = RightSlope; + Out.LeftSlope = LeftSlope; + Out.TopSlope = TopSlope; Out.BottomSlope = BottomSlope; } - //----------------------------------------------------------------------------- // Get the corner points of the frustum //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void BoundingFrustum::GetCorners(XMFLOAT3* Corners) const noexcept +_Use_decl_annotations_ inline void BoundingFrustum::GetCorners(XMFLOAT3* Corners) const noexcept { assert(Corners != nullptr); // Load origin and orientation of the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrigin = XMLoadFloat3(&Origin); XMVECTOR vOrientation = XMLoadFloat4(&Orientation); assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); // Build the corners of the frustum. - XMVECTOR vRightTop = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR vRightTop = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); XMVECTOR vRightBottom = XMVectorSet(RightSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR vLeftTop = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); - XMVECTOR vLeftBottom = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR vNear = XMVectorReplicatePtr(&Near); - XMVECTOR vFar = XMVectorReplicatePtr(&Far); + XMVECTOR vLeftTop = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR vLeftBottom = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); + XMVECTOR vNear = XMVectorReplicatePtr(&Near); + XMVECTOR vFar = XMVectorReplicatePtr(&Far); // Returns 8 corners position of bounding frustum. // Near Far @@ -2949,12 +2884,10 @@ inline void BoundingFrustum::GetCorners(XMFLOAT3* Corners) const noexcept } } - //----------------------------------------------------------------------------- // Point in frustum test. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType XM_CALLCONV BoundingFrustum::Contains(FXMVECTOR Point) const noexcept +_Use_decl_annotations_ inline ContainmentType XM_CALLCONV BoundingFrustum::Contains(FXMVECTOR Point) const noexcept { // Build frustum planes. XMVECTOR Planes[6]; @@ -2966,7 +2899,7 @@ inline ContainmentType XM_CALLCONV BoundingFrustum::Contains(FXMVECTOR Point) co Planes[5] = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); // Load origin and orientation. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrigin = XMLoadFloat3(&Origin); XMVECTOR vOrientation = XMLoadFloat4(&Orientation); assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); @@ -2977,207 +2910,196 @@ inline ContainmentType XM_CALLCONV BoundingFrustum::Contains(FXMVECTOR Point) co // Set w to one. TPoint = XMVectorInsert<0, 0, 0, 0, 1>(TPoint, XMVectorSplatOne()); - XMVECTOR Zero = XMVectorZero(); + XMVECTOR Zero = XMVectorZero(); XMVECTOR Outside = Zero; // Test point against each plane of the frustum. for (size_t i = 0; i < 6; ++i) { XMVECTOR Dot = XMVector4Dot(TPoint, Planes[i]); - Outside = XMVectorOrInt(Outside, XMVectorGreater(Dot, Zero)); + Outside = XMVectorOrInt(Outside, XMVectorGreater(Dot, Zero)); } return XMVector4NotEqualInt(Outside, XMVectorTrueInt()) ? CONTAINS : DISJOINT; } - //----------------------------------------------------------------------------- // Triangle vs frustum test. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType XM_CALLCONV BoundingFrustum::Contains(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept +_Use_decl_annotations_ inline ContainmentType XM_CALLCONV BoundingFrustum::Contains(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept { // Load origin and orientation of the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrigin = XMLoadFloat3(&Origin); XMVECTOR vOrientation = XMLoadFloat4(&Orientation); // Create 6 planes (do it inline to encourage use of registers) XMVECTOR NearPlane = XMVectorSet(0.0f, 0.0f, -1.0f, Near); - NearPlane = DirectX::MathInternal::XMPlaneTransform(NearPlane, vOrientation, vOrigin); - NearPlane = XMPlaneNormalize(NearPlane); + NearPlane = DirectX::MathInternal::XMPlaneTransform(NearPlane, vOrientation, vOrigin); + NearPlane = XMPlaneNormalize(NearPlane); XMVECTOR FarPlane = XMVectorSet(0.0f, 0.0f, 1.0f, -Far); - FarPlane = DirectX::MathInternal::XMPlaneTransform(FarPlane, vOrientation, vOrigin); - FarPlane = XMPlaneNormalize(FarPlane); + FarPlane = DirectX::MathInternal::XMPlaneTransform(FarPlane, vOrientation, vOrigin); + FarPlane = XMPlaneNormalize(FarPlane); XMVECTOR RightPlane = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); - RightPlane = DirectX::MathInternal::XMPlaneTransform(RightPlane, vOrientation, vOrigin); - RightPlane = XMPlaneNormalize(RightPlane); + RightPlane = DirectX::MathInternal::XMPlaneTransform(RightPlane, vOrientation, vOrigin); + RightPlane = XMPlaneNormalize(RightPlane); XMVECTOR LeftPlane = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); - LeftPlane = DirectX::MathInternal::XMPlaneTransform(LeftPlane, vOrientation, vOrigin); - LeftPlane = XMPlaneNormalize(LeftPlane); + LeftPlane = DirectX::MathInternal::XMPlaneTransform(LeftPlane, vOrientation, vOrigin); + LeftPlane = XMPlaneNormalize(LeftPlane); XMVECTOR TopPlane = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); - TopPlane = DirectX::MathInternal::XMPlaneTransform(TopPlane, vOrientation, vOrigin); - TopPlane = XMPlaneNormalize(TopPlane); + TopPlane = DirectX::MathInternal::XMPlaneTransform(TopPlane, vOrientation, vOrigin); + TopPlane = XMPlaneNormalize(TopPlane); XMVECTOR BottomPlane = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); - BottomPlane = DirectX::MathInternal::XMPlaneTransform(BottomPlane, vOrientation, vOrigin); - BottomPlane = XMPlaneNormalize(BottomPlane); + BottomPlane = DirectX::MathInternal::XMPlaneTransform(BottomPlane, vOrientation, vOrigin); + BottomPlane = XMPlaneNormalize(BottomPlane); return TriangleTests::ContainedBy(V0, V1, V2, NearPlane, FarPlane, RightPlane, LeftPlane, TopPlane, BottomPlane); } - //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingFrustum::Contains(const BoundingSphere& sh) const noexcept +_Use_decl_annotations_ inline ContainmentType BoundingFrustum::Contains(const BoundingSphere& sh) const noexcept { // Load origin and orientation of the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrigin = XMLoadFloat3(&Origin); XMVECTOR vOrientation = XMLoadFloat4(&Orientation); // Create 6 planes (do it inline to encourage use of registers) XMVECTOR NearPlane = XMVectorSet(0.0f, 0.0f, -1.0f, Near); - NearPlane = DirectX::MathInternal::XMPlaneTransform(NearPlane, vOrientation, vOrigin); - NearPlane = XMPlaneNormalize(NearPlane); + NearPlane = DirectX::MathInternal::XMPlaneTransform(NearPlane, vOrientation, vOrigin); + NearPlane = XMPlaneNormalize(NearPlane); XMVECTOR FarPlane = XMVectorSet(0.0f, 0.0f, 1.0f, -Far); - FarPlane = DirectX::MathInternal::XMPlaneTransform(FarPlane, vOrientation, vOrigin); - FarPlane = XMPlaneNormalize(FarPlane); + FarPlane = DirectX::MathInternal::XMPlaneTransform(FarPlane, vOrientation, vOrigin); + FarPlane = XMPlaneNormalize(FarPlane); XMVECTOR RightPlane = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); - RightPlane = DirectX::MathInternal::XMPlaneTransform(RightPlane, vOrientation, vOrigin); - RightPlane = XMPlaneNormalize(RightPlane); + RightPlane = DirectX::MathInternal::XMPlaneTransform(RightPlane, vOrientation, vOrigin); + RightPlane = XMPlaneNormalize(RightPlane); XMVECTOR LeftPlane = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); - LeftPlane = DirectX::MathInternal::XMPlaneTransform(LeftPlane, vOrientation, vOrigin); - LeftPlane = XMPlaneNormalize(LeftPlane); + LeftPlane = DirectX::MathInternal::XMPlaneTransform(LeftPlane, vOrientation, vOrigin); + LeftPlane = XMPlaneNormalize(LeftPlane); XMVECTOR TopPlane = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); - TopPlane = DirectX::MathInternal::XMPlaneTransform(TopPlane, vOrientation, vOrigin); - TopPlane = XMPlaneNormalize(TopPlane); + TopPlane = DirectX::MathInternal::XMPlaneTransform(TopPlane, vOrientation, vOrigin); + TopPlane = XMPlaneNormalize(TopPlane); XMVECTOR BottomPlane = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); - BottomPlane = DirectX::MathInternal::XMPlaneTransform(BottomPlane, vOrientation, vOrigin); - BottomPlane = XMPlaneNormalize(BottomPlane); + BottomPlane = DirectX::MathInternal::XMPlaneTransform(BottomPlane, vOrientation, vOrigin); + BottomPlane = XMPlaneNormalize(BottomPlane); return sh.ContainedBy(NearPlane, FarPlane, RightPlane, LeftPlane, TopPlane, BottomPlane); } - //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingFrustum::Contains(const BoundingBox& box) const noexcept +_Use_decl_annotations_ inline ContainmentType BoundingFrustum::Contains(const BoundingBox& box) const noexcept { // Load origin and orientation of the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrigin = XMLoadFloat3(&Origin); XMVECTOR vOrientation = XMLoadFloat4(&Orientation); // Create 6 planes (do it inline to encourage use of registers) XMVECTOR NearPlane = XMVectorSet(0.0f, 0.0f, -1.0f, Near); - NearPlane = DirectX::MathInternal::XMPlaneTransform(NearPlane, vOrientation, vOrigin); - NearPlane = XMPlaneNormalize(NearPlane); + NearPlane = DirectX::MathInternal::XMPlaneTransform(NearPlane, vOrientation, vOrigin); + NearPlane = XMPlaneNormalize(NearPlane); XMVECTOR FarPlane = XMVectorSet(0.0f, 0.0f, 1.0f, -Far); - FarPlane = DirectX::MathInternal::XMPlaneTransform(FarPlane, vOrientation, vOrigin); - FarPlane = XMPlaneNormalize(FarPlane); + FarPlane = DirectX::MathInternal::XMPlaneTransform(FarPlane, vOrientation, vOrigin); + FarPlane = XMPlaneNormalize(FarPlane); XMVECTOR RightPlane = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); - RightPlane = DirectX::MathInternal::XMPlaneTransform(RightPlane, vOrientation, vOrigin); - RightPlane = XMPlaneNormalize(RightPlane); + RightPlane = DirectX::MathInternal::XMPlaneTransform(RightPlane, vOrientation, vOrigin); + RightPlane = XMPlaneNormalize(RightPlane); XMVECTOR LeftPlane = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); - LeftPlane = DirectX::MathInternal::XMPlaneTransform(LeftPlane, vOrientation, vOrigin); - LeftPlane = XMPlaneNormalize(LeftPlane); + LeftPlane = DirectX::MathInternal::XMPlaneTransform(LeftPlane, vOrientation, vOrigin); + LeftPlane = XMPlaneNormalize(LeftPlane); XMVECTOR TopPlane = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); - TopPlane = DirectX::MathInternal::XMPlaneTransform(TopPlane, vOrientation, vOrigin); - TopPlane = XMPlaneNormalize(TopPlane); + TopPlane = DirectX::MathInternal::XMPlaneTransform(TopPlane, vOrientation, vOrigin); + TopPlane = XMPlaneNormalize(TopPlane); XMVECTOR BottomPlane = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); - BottomPlane = DirectX::MathInternal::XMPlaneTransform(BottomPlane, vOrientation, vOrigin); - BottomPlane = XMPlaneNormalize(BottomPlane); + BottomPlane = DirectX::MathInternal::XMPlaneTransform(BottomPlane, vOrientation, vOrigin); + BottomPlane = XMPlaneNormalize(BottomPlane); return box.ContainedBy(NearPlane, FarPlane, RightPlane, LeftPlane, TopPlane, BottomPlane); } - //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingFrustum::Contains(const BoundingOrientedBox& box) const noexcept +_Use_decl_annotations_ inline ContainmentType BoundingFrustum::Contains(const BoundingOrientedBox& box) const noexcept { // Load origin and orientation of the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrigin = XMLoadFloat3(&Origin); XMVECTOR vOrientation = XMLoadFloat4(&Orientation); // Create 6 planes (do it inline to encourage use of registers) XMVECTOR NearPlane = XMVectorSet(0.0f, 0.0f, -1.0f, Near); - NearPlane = DirectX::MathInternal::XMPlaneTransform(NearPlane, vOrientation, vOrigin); - NearPlane = XMPlaneNormalize(NearPlane); + NearPlane = DirectX::MathInternal::XMPlaneTransform(NearPlane, vOrientation, vOrigin); + NearPlane = XMPlaneNormalize(NearPlane); XMVECTOR FarPlane = XMVectorSet(0.0f, 0.0f, 1.0f, -Far); - FarPlane = DirectX::MathInternal::XMPlaneTransform(FarPlane, vOrientation, vOrigin); - FarPlane = XMPlaneNormalize(FarPlane); + FarPlane = DirectX::MathInternal::XMPlaneTransform(FarPlane, vOrientation, vOrigin); + FarPlane = XMPlaneNormalize(FarPlane); XMVECTOR RightPlane = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); - RightPlane = DirectX::MathInternal::XMPlaneTransform(RightPlane, vOrientation, vOrigin); - RightPlane = XMPlaneNormalize(RightPlane); + RightPlane = DirectX::MathInternal::XMPlaneTransform(RightPlane, vOrientation, vOrigin); + RightPlane = XMPlaneNormalize(RightPlane); XMVECTOR LeftPlane = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); - LeftPlane = DirectX::MathInternal::XMPlaneTransform(LeftPlane, vOrientation, vOrigin); - LeftPlane = XMPlaneNormalize(LeftPlane); + LeftPlane = DirectX::MathInternal::XMPlaneTransform(LeftPlane, vOrientation, vOrigin); + LeftPlane = XMPlaneNormalize(LeftPlane); XMVECTOR TopPlane = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); - TopPlane = DirectX::MathInternal::XMPlaneTransform(TopPlane, vOrientation, vOrigin); - TopPlane = XMPlaneNormalize(TopPlane); + TopPlane = DirectX::MathInternal::XMPlaneTransform(TopPlane, vOrientation, vOrigin); + TopPlane = XMPlaneNormalize(TopPlane); XMVECTOR BottomPlane = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); - BottomPlane = DirectX::MathInternal::XMPlaneTransform(BottomPlane, vOrientation, vOrigin); - BottomPlane = XMPlaneNormalize(BottomPlane); + BottomPlane = DirectX::MathInternal::XMPlaneTransform(BottomPlane, vOrientation, vOrigin); + BottomPlane = XMPlaneNormalize(BottomPlane); return box.ContainedBy(NearPlane, FarPlane, RightPlane, LeftPlane, TopPlane, BottomPlane); } - //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingFrustum::Contains(const BoundingFrustum& fr) const noexcept +_Use_decl_annotations_ inline ContainmentType BoundingFrustum::Contains(const BoundingFrustum& fr) const noexcept { // Load origin and orientation of the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrigin = XMLoadFloat3(&Origin); XMVECTOR vOrientation = XMLoadFloat4(&Orientation); // Create 6 planes (do it inline to encourage use of registers) XMVECTOR NearPlane = XMVectorSet(0.0f, 0.0f, -1.0f, Near); - NearPlane = DirectX::MathInternal::XMPlaneTransform(NearPlane, vOrientation, vOrigin); - NearPlane = XMPlaneNormalize(NearPlane); + NearPlane = DirectX::MathInternal::XMPlaneTransform(NearPlane, vOrientation, vOrigin); + NearPlane = XMPlaneNormalize(NearPlane); XMVECTOR FarPlane = XMVectorSet(0.0f, 0.0f, 1.0f, -Far); - FarPlane = DirectX::MathInternal::XMPlaneTransform(FarPlane, vOrientation, vOrigin); - FarPlane = XMPlaneNormalize(FarPlane); + FarPlane = DirectX::MathInternal::XMPlaneTransform(FarPlane, vOrientation, vOrigin); + FarPlane = XMPlaneNormalize(FarPlane); XMVECTOR RightPlane = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); - RightPlane = DirectX::MathInternal::XMPlaneTransform(RightPlane, vOrientation, vOrigin); - RightPlane = XMPlaneNormalize(RightPlane); + RightPlane = DirectX::MathInternal::XMPlaneTransform(RightPlane, vOrientation, vOrigin); + RightPlane = XMPlaneNormalize(RightPlane); XMVECTOR LeftPlane = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); - LeftPlane = DirectX::MathInternal::XMPlaneTransform(LeftPlane, vOrientation, vOrigin); - LeftPlane = XMPlaneNormalize(LeftPlane); + LeftPlane = DirectX::MathInternal::XMPlaneTransform(LeftPlane, vOrientation, vOrigin); + LeftPlane = XMPlaneNormalize(LeftPlane); XMVECTOR TopPlane = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); - TopPlane = DirectX::MathInternal::XMPlaneTransform(TopPlane, vOrientation, vOrigin); - TopPlane = XMPlaneNormalize(TopPlane); + TopPlane = DirectX::MathInternal::XMPlaneTransform(TopPlane, vOrientation, vOrigin); + TopPlane = XMPlaneNormalize(TopPlane); XMVECTOR BottomPlane = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); - BottomPlane = DirectX::MathInternal::XMPlaneTransform(BottomPlane, vOrientation, vOrigin); - BottomPlane = XMPlaneNormalize(BottomPlane); + BottomPlane = DirectX::MathInternal::XMPlaneTransform(BottomPlane, vOrientation, vOrigin); + BottomPlane = XMPlaneNormalize(BottomPlane); return fr.ContainedBy(NearPlane, FarPlane, RightPlane, LeftPlane, TopPlane, BottomPlane); } - //----------------------------------------------------------------------------- // Exact sphere vs frustum test. The algorithm first checks the sphere against // the planes of the frustum, then if the plane checks were indeterminate finds @@ -3185,8 +3107,7 @@ inline ContainmentType BoundingFrustum::Contains(const BoundingFrustum& fr) cons // sphere and compares the distance to the nearest feature to the radius of the // sphere //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingFrustum::Intersects(const BoundingSphere& sh) const noexcept +_Use_decl_annotations_ inline bool BoundingFrustum::Intersects(const BoundingSphere& sh) const noexcept { XMVECTOR Zero = XMVectorZero(); @@ -3206,7 +3127,7 @@ inline bool BoundingFrustum::Intersects(const BoundingSphere& sh) const noexcept Planes[5] = XMVector3Normalize(Planes[5]); // Load origin and orientation of the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrigin = XMLoadFloat3(&Origin); XMVECTOR vOrientation = XMLoadFloat4(&Orientation); assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); @@ -3222,8 +3143,8 @@ inline bool BoundingFrustum::Intersects(const BoundingSphere& sh) const noexcept vCenter = XMVectorInsert<0, 0, 0, 0, 1>(vCenter, XMVectorSplatOne()); // Check against each plane of the frustum. - XMVECTOR Outside = XMVectorFalseInt(); - XMVECTOR InsideAll = XMVectorTrueInt(); + XMVECTOR Outside = XMVectorFalseInt(); + XMVECTOR InsideAll = XMVectorTrueInt(); XMVECTOR CenterInsideAll = XMVectorTrueInt(); XMVECTOR Dist[6]; @@ -3260,15 +3181,12 @@ inline bool BoundingFrustum::Intersects(const BoundingSphere& sh) const noexcept // to the sphere. // The faces adjacent to each face are: - static const size_t adjacent_faces[6][4] = - { - { 2, 3, 4, 5 }, // 0 - { 2, 3, 4, 5 }, // 1 - { 0, 1, 4, 5 }, // 2 - { 0, 1, 4, 5 }, // 3 - { 0, 1, 2, 3 }, // 4 - { 0, 1, 2, 3 } - }; // 5 + static const size_t adjacent_faces[6][4] = { { 2, 3, 4, 5 }, // 0 + { 2, 3, 4, 5 }, // 1 + { 0, 1, 4, 5 }, // 2 + { 0, 1, 4, 5 }, // 3 + { 0, 1, 2, 3 }, // 4 + { 0, 1, 2, 3 } }; // 5 XMVECTOR Intersects = XMVectorFalseInt(); @@ -3289,26 +3207,24 @@ inline bool BoundingFrustum::Intersects(const BoundingSphere& sh) const noexcept { size_t plane_index = adjacent_faces[i][j]; - InsideFace = XMVectorAndInt(InsideFace, - XMVectorLessOrEqual(XMVector4Dot(Point, Planes[plane_index]), Zero)); + InsideFace = XMVectorAndInt(InsideFace, XMVectorLessOrEqual(XMVector4Dot(Point, Planes[plane_index]), Zero)); } // Since we have already checked distance from the plane we know that the // sphere must intersect if this plane is the nearest feature. - Intersects = XMVectorOrInt(Intersects, - XMVectorAndInt(XMVectorGreater(Dist[i], Zero), InsideFace)); + Intersects = XMVectorOrInt(Intersects, XMVectorAndInt(XMVectorGreater(Dist[i], Zero), InsideFace)); } if (XMVector4EqualInt(Intersects, XMVectorTrueInt())) return true; // Build the corners of the frustum. - XMVECTOR vRightTop = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR vRightTop = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); XMVECTOR vRightBottom = XMVectorSet(RightSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR vLeftTop = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); - XMVECTOR vLeftBottom = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR vNear = XMVectorReplicatePtr(&Near); - XMVECTOR vFar = XMVectorReplicatePtr(&Far); + XMVECTOR vLeftTop = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR vLeftBottom = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); + XMVECTOR vNear = XMVectorReplicatePtr(&Near); + XMVECTOR vFar = XMVectorReplicatePtr(&Far); XMVECTOR Corners[CORNER_COUNT]; Corners[0] = XMVectorMultiply(vRightTop, vNear); @@ -3321,8 +3237,7 @@ inline bool BoundingFrustum::Intersects(const BoundingSphere& sh) const noexcept Corners[7] = XMVectorMultiply(vLeftBottom, vFar); // The Edges are: - static const size_t edges[12][2] = - { + static const size_t edges[12][2] = { // clang-format off { 0, 1 }, { 2, 3 }, { 0, 2 }, { 1, 3 }, // Near plane { 4, 5 }, { 6, 7 }, { 4, 6 }, { 5, 7 }, // Far plane @@ -3358,25 +3273,21 @@ inline bool BoundingFrustum::Intersects(const BoundingSphere& sh) const noexcept return false; } - //----------------------------------------------------------------------------- // Exact axis aligned box vs frustum test. Constructs an oriented box and uses // the oriented box vs frustum test. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingFrustum::Intersects(const BoundingBox& box) const noexcept +_Use_decl_annotations_ inline bool BoundingFrustum::Intersects(const BoundingBox& box) const noexcept { // Make the axis aligned box oriented and do an OBB vs frustum test. BoundingOrientedBox obox(box.Center, box.Extents, XMFLOAT4(0.f, 0.f, 0.f, 1.f)); return Intersects(obox); } - //----------------------------------------------------------------------------- // Exact oriented box vs frustum test. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingFrustum::Intersects(const BoundingOrientedBox& box) const noexcept +_Use_decl_annotations_ inline bool BoundingFrustum::Intersects(const BoundingOrientedBox& box) const noexcept { static const XMVECTORU32 SelectY = { { { XM_SELECT_0, XM_SELECT_1, XM_SELECT_0, XM_SELECT_0 } } }; static const XMVECTORU32 SelectZ = { { { XM_SELECT_0, XM_SELECT_0, XM_SELECT_1, XM_SELECT_0 } } }; @@ -3393,21 +3304,21 @@ inline bool BoundingFrustum::Intersects(const BoundingOrientedBox& box) const no Planes[5] = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); // Load origin and orientation of the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrigin = XMLoadFloat3(&Origin); XMVECTOR FrustumOrientation = XMLoadFloat4(&Orientation); assert(DirectX::MathInternal::XMQuaternionIsUnit(FrustumOrientation)); // Load the box. - XMVECTOR Center = XMLoadFloat3(&box.Center); - XMVECTOR Extents = XMLoadFloat3(&box.Extents); + XMVECTOR Center = XMLoadFloat3(&box.Center); + XMVECTOR Extents = XMLoadFloat3(&box.Extents); XMVECTOR BoxOrientation = XMLoadFloat4(&box.Orientation); assert(DirectX::MathInternal::XMQuaternionIsUnit(BoxOrientation)); // Transform the oriented box into the space of the frustum in order to // minimize the number of transforms we have to do. - Center = XMVector3InverseRotate(XMVectorSubtract(Center, vOrigin), FrustumOrientation); + Center = XMVector3InverseRotate(XMVectorSubtract(Center, vOrigin), FrustumOrientation); BoxOrientation = XMQuaternionMultiply(BoxOrientation, XMQuaternionConjugate(FrustumOrientation)); // Set w of the center to one so we can dot4 with the plane. @@ -3417,8 +3328,8 @@ inline bool BoundingFrustum::Intersects(const BoundingOrientedBox& box) const no XMMATRIX R = XMMatrixRotationQuaternion(BoxOrientation); // Check against each plane of the frustum. - XMVECTOR Outside = XMVectorFalseInt(); - XMVECTOR InsideAll = XMVectorTrueInt(); + XMVECTOR Outside = XMVectorFalseInt(); + XMVECTOR InsideAll = XMVectorTrueInt(); XMVECTOR CenterInsideAll = XMVectorTrueInt(); for (size_t i = 0; i < 6; ++i) @@ -3432,9 +3343,9 @@ inline bool BoundingFrustum::Intersects(const BoundingOrientedBox& box) const no // where h(i) are extents of the box, n is the plane normal, and b(i) are the // axes of the box. XMVECTOR Radius = XMVector3Dot(Planes[i], R.r[0]); - Radius = XMVectorSelect(Radius, XMVector3Dot(Planes[i], R.r[1]), SelectY); - Radius = XMVectorSelect(Radius, XMVector3Dot(Planes[i], R.r[2]), SelectZ); - Radius = XMVector3Dot(Extents, XMVectorAbs(Radius)); + Radius = XMVectorSelect(Radius, XMVector3Dot(Planes[i], R.r[1]), SelectY); + Radius = XMVectorSelect(Radius, XMVector3Dot(Planes[i], R.r[2]), SelectZ); + Radius = XMVector3Dot(Extents, XMVectorAbs(Radius)); // Outside the plane? Outside = XMVectorOrInt(Outside, XMVectorGreater(Dist, Radius)); @@ -3460,12 +3371,12 @@ inline bool BoundingFrustum::Intersects(const BoundingOrientedBox& box) const no return true; // Build the corners of the frustum. - XMVECTOR vRightTop = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR vRightTop = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); XMVECTOR vRightBottom = XMVectorSet(RightSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR vLeftTop = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); - XMVECTOR vLeftBottom = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR vNear = XMVectorReplicatePtr(&Near); - XMVECTOR vFar = XMVectorReplicatePtr(&Far); + XMVECTOR vLeftTop = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR vLeftBottom = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); + XMVECTOR vNear = XMVectorReplicatePtr(&Near); + XMVECTOR vFar = XMVectorReplicatePtr(&Far); XMVECTOR Corners[CORNER_COUNT]; Corners[0] = XMVectorMultiply(vRightTop, vNear); @@ -3490,8 +3401,8 @@ inline bool BoundingFrustum::Intersects(const BoundingOrientedBox& box) const no for (size_t i = 1; i < BoundingOrientedBox::CORNER_COUNT; ++i) { XMVECTOR Temp = XMVector3Dot(Corners[i], R.r[0]); - Temp = XMVectorSelect(Temp, XMVector3Dot(Corners[i], R.r[1]), SelectY); - Temp = XMVectorSelect(Temp, XMVector3Dot(Corners[i], R.r[2]), SelectZ); + Temp = XMVectorSelect(Temp, XMVector3Dot(Corners[i], R.r[1]), SelectY); + Temp = XMVectorSelect(Temp, XMVector3Dot(Corners[i], R.r[2]), SelectZ); FrustumMin = XMVectorMin(FrustumMin, Temp); FrustumMax = XMVectorMax(FrustumMax, Temp); @@ -3499,8 +3410,8 @@ inline bool BoundingFrustum::Intersects(const BoundingOrientedBox& box) const no // Project the center of the box onto the axes. XMVECTOR BoxDist = XMVector3Dot(Center, R.r[0]); - BoxDist = XMVectorSelect(BoxDist, XMVector3Dot(Center, R.r[1]), SelectY); - BoxDist = XMVectorSelect(BoxDist, XMVector3Dot(Center, R.r[2]), SelectZ); + BoxDist = XMVectorSelect(BoxDist, XMVector3Dot(Center, R.r[1]), SelectY); + BoxDist = XMVectorSelect(BoxDist, XMVector3Dot(Center, R.r[2]), SelectZ); // The projection of the box onto the axis is just its Center and Extents. // if (min > box_max || max < box_min) reject; @@ -3536,8 +3447,8 @@ inline bool BoundingFrustum::Intersects(const BoundingOrientedBox& box) const no for (size_t k = 1; k < CORNER_COUNT; k++) { XMVECTOR Temp = XMVector3Dot(Axis, Corners[k]); - FrustumMin = XMVectorMin(FrustumMin, Temp); - FrustumMax = XMVectorMax(FrustumMax, Temp); + FrustumMin = XMVectorMin(FrustumMin, Temp); + FrustumMax = XMVectorMax(FrustumMax, Temp); } // Project the center of the box onto the axis. @@ -3545,9 +3456,9 @@ inline bool BoundingFrustum::Intersects(const BoundingOrientedBox& box) const no // Project the axes of the box onto the axis to find the "radius" of the box. XMVECTOR Radius = XMVector3Dot(Axis, R.r[0]); - Radius = XMVectorSelect(Radius, XMVector3Dot(Axis, R.r[1]), SelectY); - Radius = XMVectorSelect(Radius, XMVector3Dot(Axis, R.r[2]), SelectZ); - Radius = XMVector3Dot(Extents, XMVectorAbs(Radius)); + Radius = XMVectorSelect(Radius, XMVector3Dot(Axis, R.r[1]), SelectY); + Radius = XMVectorSelect(Radius, XMVector3Dot(Axis, R.r[2]), SelectZ); + Radius = XMVector3Dot(Extents, XMVectorAbs(Radius)); // if (center > max + radius || center < min - radius) reject; Outside = XMVectorOrInt(Outside, XMVectorGreater(Dist, XMVectorAdd(FrustumMax, Radius))); @@ -3562,15 +3473,13 @@ inline bool BoundingFrustum::Intersects(const BoundingOrientedBox& box) const no return true; } - //----------------------------------------------------------------------------- // Exact frustum vs frustum test. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingFrustum::Intersects(const BoundingFrustum& fr) const noexcept +_Use_decl_annotations_ inline bool BoundingFrustum::Intersects(const BoundingFrustum& fr) const noexcept { // Load origin and orientation of frustum B. - XMVECTOR OriginB = XMLoadFloat3(&Origin); + XMVECTOR OriginB = XMLoadFloat3(&Origin); XMVECTOR OrientationB = XMLoadFloat4(&Orientation); assert(DirectX::MathInternal::XMQuaternionIsUnit(OrientationB)); @@ -3593,28 +3502,28 @@ inline bool BoundingFrustum::Intersects(const BoundingFrustum& fr) const noexcep PlaneDistB[5] = XMVectorZero(); // Load origin and orientation of frustum A. - XMVECTOR OriginA = XMLoadFloat3(&fr.Origin); + XMVECTOR OriginA = XMLoadFloat3(&fr.Origin); XMVECTOR OrientationA = XMLoadFloat4(&fr.Orientation); assert(DirectX::MathInternal::XMQuaternionIsUnit(OrientationA)); // Transform frustum A into the space of the frustum B in order to // minimize the number of transforms we have to do. - OriginA = XMVector3InverseRotate(XMVectorSubtract(OriginA, OriginB), OrientationB); + OriginA = XMVector3InverseRotate(XMVectorSubtract(OriginA, OriginB), OrientationB); OrientationA = XMQuaternionMultiply(OrientationA, XMQuaternionConjugate(OrientationB)); // Build the corners of frustum A (in the local space of B). - XMVECTOR RightTopA = XMVectorSet(fr.RightSlope, fr.TopSlope, 1.0f, 0.0f); + XMVECTOR RightTopA = XMVectorSet(fr.RightSlope, fr.TopSlope, 1.0f, 0.0f); XMVECTOR RightBottomA = XMVectorSet(fr.RightSlope, fr.BottomSlope, 1.0f, 0.0f); - XMVECTOR LeftTopA = XMVectorSet(fr.LeftSlope, fr.TopSlope, 1.0f, 0.0f); - XMVECTOR LeftBottomA = XMVectorSet(fr.LeftSlope, fr.BottomSlope, 1.0f, 0.0f); - XMVECTOR NearA = XMVectorReplicatePtr(&fr.Near); - XMVECTOR FarA = XMVectorReplicatePtr(&fr.Far); + XMVECTOR LeftTopA = XMVectorSet(fr.LeftSlope, fr.TopSlope, 1.0f, 0.0f); + XMVECTOR LeftBottomA = XMVectorSet(fr.LeftSlope, fr.BottomSlope, 1.0f, 0.0f); + XMVECTOR NearA = XMVectorReplicatePtr(&fr.Near); + XMVECTOR FarA = XMVectorReplicatePtr(&fr.Far); - RightTopA = XMVector3Rotate(RightTopA, OrientationA); + RightTopA = XMVector3Rotate(RightTopA, OrientationA); RightBottomA = XMVector3Rotate(RightBottomA, OrientationA); - LeftTopA = XMVector3Rotate(LeftTopA, OrientationA); - LeftBottomA = XMVector3Rotate(LeftBottomA, OrientationA); + LeftTopA = XMVector3Rotate(LeftTopA, OrientationA); + LeftBottomA = XMVector3Rotate(LeftBottomA, OrientationA); XMVECTOR CornersA[CORNER_COUNT]; CornersA[0] = XMVectorMultiplyAdd(RightTopA, NearA, OriginA); @@ -3627,7 +3536,7 @@ inline bool BoundingFrustum::Intersects(const BoundingFrustum& fr) const noexcep CornersA[7] = XMVectorMultiplyAdd(LeftBottomA, FarA, OriginA); // Check frustum A against each plane of frustum B. - XMVECTOR Outside = XMVectorFalseInt(); + XMVECTOR Outside = XMVectorFalseInt(); XMVECTOR InsideAll = XMVectorTrueInt(); for (size_t i = 0; i < 6; ++i) @@ -3640,8 +3549,8 @@ inline bool BoundingFrustum::Intersects(const BoundingFrustum& fr) const noexcep for (size_t j = 1; j < CORNER_COUNT; j++) { XMVECTOR Temp = XMVector3Dot(AxisB[i], CornersA[j]); - Min = XMVectorMin(Min, Temp); - Max = XMVectorMax(Max, Temp); + Min = XMVectorMin(Min, Temp); + Max = XMVectorMax(Max, Temp); } // Outside the plane? @@ -3660,12 +3569,12 @@ inline bool BoundingFrustum::Intersects(const BoundingFrustum& fr) const noexcep return true; // Build the corners of frustum B. - XMVECTOR RightTopB = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR RightTopB = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); XMVECTOR RightBottomB = XMVectorSet(RightSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR LeftTopB = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); - XMVECTOR LeftBottomB = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR NearB = XMVectorReplicatePtr(&Near); - XMVECTOR FarB = XMVectorReplicatePtr(&Far); + XMVECTOR LeftTopB = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR LeftBottomB = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); + XMVECTOR NearB = XMVectorReplicatePtr(&Near); + XMVECTOR FarB = XMVectorReplicatePtr(&Far); XMVECTOR CornersB[BoundingFrustum::CORNER_COUNT]; CornersB[0] = XMVectorMultiply(RightTopB, NearB); @@ -3695,8 +3604,8 @@ inline bool BoundingFrustum::Intersects(const BoundingFrustum& fr) const noexcep AxisA[4] = XMVector3Rotate(AxisA[4], OrientationA); AxisA[5] = XMVector3Rotate(AxisA[5], OrientationA); - PlaneDistA[0] = XMVector3Dot(AxisA[0], CornersA[0]); // Re-use corner on near plane. - PlaneDistA[1] = XMVector3Dot(AxisA[1], CornersA[4]); // Re-use corner on far plane. + PlaneDistA[0] = XMVector3Dot(AxisA[0], CornersA[0]); // Re-use corner on near plane. + PlaneDistA[1] = XMVector3Dot(AxisA[1], CornersA[4]); // Re-use corner on far plane. PlaneDistA[2] = XMVector3Dot(AxisA[2], OriginA); PlaneDistA[3] = XMVector3Dot(AxisA[3], OriginA); PlaneDistA[4] = XMVector3Dot(AxisA[4], OriginA); @@ -3713,7 +3622,7 @@ inline bool BoundingFrustum::Intersects(const BoundingFrustum& fr) const noexcep for (size_t j = 1; j < CORNER_COUNT; j++) { XMVECTOR Temp = XMVector3Dot(AxisA[i], CornersB[j]); - Min = XMVectorMin(Min, Temp); + Min = XMVectorMin(Min, Temp); } // Outside the plane? @@ -3758,12 +3667,12 @@ inline bool BoundingFrustum::Intersects(const BoundingFrustum& fr) const noexcep for (size_t k = 1; k < CORNER_COUNT; k++) { XMVECTOR TempA = XMVector3Dot(Axis, CornersA[k]); - MinA = XMVectorMin(MinA, TempA); - MaxA = XMVectorMax(MaxA, TempA); + MinA = XMVectorMin(MinA, TempA); + MaxA = XMVectorMax(MaxA, TempA); XMVECTOR TempB = XMVector3Dot(Axis, CornersB[k]); - MinB = XMVectorMin(MinB, TempB); - MaxB = XMVectorMax(MaxB, TempB); + MinB = XMVectorMin(MinB, TempB); + MaxB = XMVectorMax(MaxB, TempB); } // if (MinA > MaxB || MinB > MaxA) reject @@ -3780,12 +3689,10 @@ inline bool BoundingFrustum::Intersects(const BoundingFrustum& fr) const noexcep return true; } - //----------------------------------------------------------------------------- // Triangle vs frustum test. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool XM_CALLCONV BoundingFrustum::Intersects(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept +_Use_decl_annotations_ inline bool XM_CALLCONV BoundingFrustum::Intersects(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept { // Build the frustum planes (NOTE: D is negated from the usual). XMVECTOR Planes[6]; @@ -3797,7 +3704,7 @@ inline bool XM_CALLCONV BoundingFrustum::Intersects(FXMVECTOR V0, FXMVECTOR V1, Planes[5] = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); // Load origin and orientation of the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrigin = XMLoadFloat3(&Origin); XMVECTOR vOrientation = XMLoadFloat4(&Orientation); assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); @@ -3808,7 +3715,7 @@ inline bool XM_CALLCONV BoundingFrustum::Intersects(FXMVECTOR V0, FXMVECTOR V1, XMVECTOR TV2 = XMVector3InverseRotate(XMVectorSubtract(V2, vOrigin), vOrientation); // Test each vertex of the triangle against the frustum planes. - XMVECTOR Outside = XMVectorFalseInt(); + XMVECTOR Outside = XMVectorFalseInt(); XMVECTOR InsideAll = XMVectorTrueInt(); for (size_t i = 0; i < 6; ++i) @@ -3818,9 +3725,9 @@ inline bool XM_CALLCONV BoundingFrustum::Intersects(FXMVECTOR V0, FXMVECTOR V1, XMVECTOR Dist2 = XMVector3Dot(TV2, Planes[i]); XMVECTOR MinDist = XMVectorMin(Dist0, Dist1); - MinDist = XMVectorMin(MinDist, Dist2); + MinDist = XMVectorMin(MinDist, Dist2); XMVECTOR MaxDist = XMVectorMax(Dist0, Dist1); - MaxDist = XMVectorMax(MaxDist, Dist2); + MaxDist = XMVectorMax(MaxDist, Dist2); XMVECTOR PlaneDist = XMVectorSplatW(Planes[i]); @@ -3840,12 +3747,12 @@ inline bool XM_CALLCONV BoundingFrustum::Intersects(FXMVECTOR V0, FXMVECTOR V1, return true; // Build the corners of the frustum. - XMVECTOR vRightTop = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR vRightTop = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); XMVECTOR vRightBottom = XMVectorSet(RightSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR vLeftTop = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); - XMVECTOR vLeftBottom = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR vNear = XMVectorReplicatePtr(&Near); - XMVECTOR vFar = XMVectorReplicatePtr(&Far); + XMVECTOR vLeftTop = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR vLeftBottom = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); + XMVECTOR vNear = XMVectorReplicatePtr(&Near); + XMVECTOR vFar = XMVectorReplicatePtr(&Far); XMVECTOR Corners[CORNER_COUNT]; Corners[0] = XMVectorMultiply(vRightTop, vNear); @@ -3859,15 +3766,15 @@ inline bool XM_CALLCONV BoundingFrustum::Intersects(FXMVECTOR V0, FXMVECTOR V1, // Test the plane of the triangle. XMVECTOR Normal = XMVector3Cross(XMVectorSubtract(V1, V0), XMVectorSubtract(V2, V0)); - XMVECTOR Dist = XMVector3Dot(Normal, V0); + XMVECTOR Dist = XMVector3Dot(Normal, V0); XMVECTOR MinDist, MaxDist; MinDist = MaxDist = XMVector3Dot(Corners[0], Normal); for (size_t i = 1; i < CORNER_COUNT; ++i) { XMVECTOR Temp = XMVector3Dot(Corners[i], Normal); - MinDist = XMVectorMin(MinDist, Temp); - MaxDist = XMVectorMax(MaxDist, Temp); + MinDist = XMVectorMin(MinDist, Temp); + MaxDist = XMVectorMax(MaxDist, Temp); } Outside = XMVectorOrInt(XMVectorGreater(MinDist, Dist), XMVectorLess(MaxDist, Dist)); @@ -3915,8 +3822,8 @@ inline bool XM_CALLCONV BoundingFrustum::Intersects(FXMVECTOR V0, FXMVECTOR V1, for (size_t k = 1; k < CORNER_COUNT; k++) { XMVECTOR Temp = XMVector3Dot(Axis, Corners[k]); - MinB = XMVectorMin(MinB, Temp); - MaxB = XMVectorMax(MaxB, Temp); + MinB = XMVectorMin(MinB, Temp); + MaxB = XMVectorMax(MaxB, Temp); } // if (MinA > MaxB || MinB > MaxA) reject; @@ -3932,15 +3839,13 @@ inline bool XM_CALLCONV BoundingFrustum::Intersects(FXMVECTOR V0, FXMVECTOR V1, return true; } - //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline PlaneIntersectionType XM_CALLCONV BoundingFrustum::Intersects(FXMVECTOR Plane) const noexcept +_Use_decl_annotations_ inline PlaneIntersectionType XM_CALLCONV BoundingFrustum::Intersects(FXMVECTOR Plane) const noexcept { assert(DirectX::MathInternal::XMPlaneIsUnit(Plane)); // Load origin and orientation of the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrigin = XMLoadFloat3(&Origin); XMVECTOR vOrientation = XMLoadFloat4(&Orientation); assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); @@ -3949,17 +3854,17 @@ inline PlaneIntersectionType XM_CALLCONV BoundingFrustum::Intersects(FXMVECTOR P vOrigin = XMVectorInsert<0, 0, 0, 0, 1>(vOrigin, XMVectorSplatOne()); // Build the corners of the frustum (in world space). - XMVECTOR RightTop = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR RightTop = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); XMVECTOR RightBottom = XMVectorSet(RightSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR LeftTop = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); - XMVECTOR LeftBottom = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR vNear = XMVectorReplicatePtr(&Near); - XMVECTOR vFar = XMVectorReplicatePtr(&Far); + XMVECTOR LeftTop = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR LeftBottom = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); + XMVECTOR vNear = XMVectorReplicatePtr(&Near); + XMVECTOR vFar = XMVectorReplicatePtr(&Far); - RightTop = XMVector3Rotate(RightTop, vOrientation); + RightTop = XMVector3Rotate(RightTop, vOrientation); RightBottom = XMVector3Rotate(RightBottom, vOrientation); - LeftTop = XMVector3Rotate(LeftTop, vOrientation); - LeftBottom = XMVector3Rotate(LeftBottom, vOrientation); + LeftTop = XMVector3Rotate(LeftTop, vOrientation); + LeftBottom = XMVector3Rotate(LeftBottom, vOrientation); XMVECTOR Corners0 = XMVectorMultiplyAdd(RightTop, vNear, vOrigin); XMVECTOR Corners1 = XMVectorMultiplyAdd(RightBottom, vNear, vOrigin); @@ -3971,9 +3876,17 @@ inline PlaneIntersectionType XM_CALLCONV BoundingFrustum::Intersects(FXMVECTOR P XMVECTOR Corners7 = XMVectorMultiplyAdd(LeftBottom, vFar, vOrigin); XMVECTOR Outside, Inside; - DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, Corners1, Corners2, Corners3, - Corners4, Corners5, Corners6, Corners7, - Plane, Outside, Inside); + DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, + Corners1, + Corners2, + Corners3, + Corners4, + Corners5, + Corners6, + Corners7, + Plane, + Outside, + Inside); // If the frustum is outside any plane it is outside. if (XMVector4EqualInt(Outside, XMVectorTrueInt())) @@ -3987,12 +3900,12 @@ inline PlaneIntersectionType XM_CALLCONV BoundingFrustum::Intersects(FXMVECTOR P return INTERSECTING; } - //----------------------------------------------------------------------------- // Ray vs. frustum test //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool XM_CALLCONV BoundingFrustum::Intersects(FXMVECTOR rayOrigin, FXMVECTOR Direction, float& Dist) const noexcept +_Use_decl_annotations_ inline bool XM_CALLCONV BoundingFrustum::Intersects(FXMVECTOR rayOrigin, + FXMVECTOR Direction, + float& Dist) const noexcept { // If ray starts inside the frustum, return a distance of 0 for the hit if (Contains(rayOrigin) == CONTAINS) @@ -4011,19 +3924,19 @@ inline bool XM_CALLCONV BoundingFrustum::Intersects(FXMVECTOR rayOrigin, FXMVECT Planes[5] = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); // Load origin and orientation of the frustum. - XMVECTOR frOrigin = XMLoadFloat3(&Origin); + XMVECTOR frOrigin = XMLoadFloat3(&Origin); XMVECTOR frOrientation = XMLoadFloat4(&Orientation); // This algorithm based on "Fast Ray-Convex Polyhedron Intersectin," in James Arvo, ed., Graphics Gems II pp. 247-250 float tnear = -FLT_MAX; - float tfar = FLT_MAX; + float tfar = FLT_MAX; for (size_t i = 0; i < 6; ++i) { XMVECTOR Plane = DirectX::MathInternal::XMPlaneTransform(Planes[i], frOrientation, frOrigin); - Plane = XMPlaneNormalize(Plane); + Plane = XMPlaneNormalize(Plane); - XMVECTOR AxisDotOrigin = XMPlaneDotCoord(Plane, rayOrigin); + XMVECTOR AxisDotOrigin = XMPlaneDotCoord(Plane, rayOrigin); XMVECTOR AxisDotDirection = XMVector3Dot(Plane, Direction); if (XMVector3LessOrEqual(XMVectorAbs(AxisDotDirection), g_RayEpsilon)) @@ -4041,7 +3954,7 @@ inline bool XM_CALLCONV BoundingFrustum::Intersects(FXMVECTOR rayOrigin, FXMVECT // Ray not parallel - get distance to plane. float vd = XMVectorGetX(AxisDotDirection); float vn = XMVectorGetX(AxisDotOrigin); - float t = -vn / vd; + float t = -vn / vd; if (vd < 0.0f) { // Front face - T is a near point. @@ -4087,18 +4000,18 @@ inline bool XM_CALLCONV BoundingFrustum::Intersects(FXMVECTOR rayOrigin, FXMVECT return false; } - //----------------------------------------------------------------------------- // Test a frustum vs 6 planes (typically forming another frustum). //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType XM_CALLCONV BoundingFrustum::ContainedBy( - FXMVECTOR Plane0, FXMVECTOR Plane1, FXMVECTOR Plane2, - GXMVECTOR Plane3, - HXMVECTOR Plane4, HXMVECTOR Plane5) const noexcept +_Use_decl_annotations_ inline ContainmentType XM_CALLCONV BoundingFrustum::ContainedBy(FXMVECTOR Plane0, + FXMVECTOR Plane1, + FXMVECTOR Plane2, + GXMVECTOR Plane3, + HXMVECTOR Plane4, + HXMVECTOR Plane5) const noexcept { // Load origin and orientation of the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrigin = XMLoadFloat3(&Origin); XMVECTOR vOrientation = XMLoadFloat4(&Orientation); assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); @@ -4107,17 +4020,17 @@ inline ContainmentType XM_CALLCONV BoundingFrustum::ContainedBy( vOrigin = XMVectorInsert<0, 0, 0, 0, 1>(vOrigin, XMVectorSplatOne()); // Build the corners of the frustum (in world space). - XMVECTOR RightTop = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR RightTop = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); XMVECTOR RightBottom = XMVectorSet(RightSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR LeftTop = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); - XMVECTOR LeftBottom = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR vNear = XMVectorReplicatePtr(&Near); - XMVECTOR vFar = XMVectorReplicatePtr(&Far); + XMVECTOR LeftTop = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR LeftBottom = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); + XMVECTOR vNear = XMVectorReplicatePtr(&Near); + XMVECTOR vFar = XMVectorReplicatePtr(&Far); - RightTop = XMVector3Rotate(RightTop, vOrientation); + RightTop = XMVector3Rotate(RightTop, vOrientation); RightBottom = XMVector3Rotate(RightBottom, vOrientation); - LeftTop = XMVector3Rotate(LeftTop, vOrientation); - LeftBottom = XMVector3Rotate(LeftBottom, vOrientation); + LeftTop = XMVector3Rotate(LeftTop, vOrientation); + LeftBottom = XMVector3Rotate(LeftBottom, vOrientation); XMVECTOR Corners0 = XMVectorMultiplyAdd(RightTop, vNear, vOrigin); XMVECTOR Corners1 = XMVectorMultiplyAdd(RightBottom, vNear, vOrigin); @@ -4131,47 +4044,95 @@ inline ContainmentType XM_CALLCONV BoundingFrustum::ContainedBy( XMVECTOR Outside, Inside; // Test against each plane. - DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, Corners1, Corners2, Corners3, - Corners4, Corners5, Corners6, Corners7, - Plane0, Outside, Inside); + DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, + Corners1, + Corners2, + Corners3, + Corners4, + Corners5, + Corners6, + Corners7, + Plane0, + Outside, + Inside); XMVECTOR AnyOutside = Outside; - XMVECTOR AllInside = Inside; - - DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, Corners1, Corners2, Corners3, - Corners4, Corners5, Corners6, Corners7, - Plane1, Outside, Inside); + XMVECTOR AllInside = Inside; + + DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, + Corners1, + Corners2, + Corners3, + Corners4, + Corners5, + Corners6, + Corners7, + Plane1, + Outside, + Inside); AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, Corners1, Corners2, Corners3, - Corners4, Corners5, Corners6, Corners7, - Plane2, Outside, Inside); + AllInside = XMVectorAndInt(AllInside, Inside); + + DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, + Corners1, + Corners2, + Corners3, + Corners4, + Corners5, + Corners6, + Corners7, + Plane2, + Outside, + Inside); AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, Corners1, Corners2, Corners3, - Corners4, Corners5, Corners6, Corners7, - Plane3, Outside, Inside); + AllInside = XMVectorAndInt(AllInside, Inside); + + DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, + Corners1, + Corners2, + Corners3, + Corners4, + Corners5, + Corners6, + Corners7, + Plane3, + Outside, + Inside); AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, Corners1, Corners2, Corners3, - Corners4, Corners5, Corners6, Corners7, - Plane4, Outside, Inside); + AllInside = XMVectorAndInt(AllInside, Inside); + + DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, + Corners1, + Corners2, + Corners3, + Corners4, + Corners5, + Corners6, + Corners7, + Plane4, + Outside, + Inside); AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, Corners1, Corners2, Corners3, - Corners4, Corners5, Corners6, Corners7, - Plane5, Outside, Inside); + AllInside = XMVectorAndInt(AllInside, Inside); + + DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, + Corners1, + Corners2, + Corners3, + Corners4, + Corners5, + Corners6, + Corners7, + Plane5, + Outside, + Inside); AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); + AllInside = XMVectorAndInt(AllInside, Inside); // If the frustum is outside any plane it is outside. if (XMVector4EqualInt(AnyOutside, XMVectorTrueInt())) @@ -4185,7 +4146,6 @@ inline ContainmentType XM_CALLCONV BoundingFrustum::ContainedBy( return INTERSECTS; } - //----------------------------------------------------------------------------- // Build the 6 frustum planes from a frustum. // @@ -4196,76 +4156,78 @@ inline ContainmentType XM_CALLCONV BoundingFrustum::ContainedBy( // of these cases is true then it may or may not be intersecting the frustum // (INTERSECTS) //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void BoundingFrustum::GetPlanes(XMVECTOR* NearPlane, XMVECTOR* FarPlane, XMVECTOR* RightPlane, - XMVECTOR* LeftPlane, XMVECTOR* TopPlane, XMVECTOR* BottomPlane) const noexcept +_Use_decl_annotations_ inline void BoundingFrustum::GetPlanes(XMVECTOR* NearPlane, + XMVECTOR* FarPlane, + XMVECTOR* RightPlane, + XMVECTOR* LeftPlane, + XMVECTOR* TopPlane, + XMVECTOR* BottomPlane) const noexcept { // Load origin and orientation of the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrigin = XMLoadFloat3(&Origin); XMVECTOR vOrientation = XMLoadFloat4(&Orientation); if (NearPlane) { XMVECTOR vNearPlane = XMVectorSet(0.0f, 0.0f, -1.0f, Near); - vNearPlane = DirectX::MathInternal::XMPlaneTransform(vNearPlane, vOrientation, vOrigin); - *NearPlane = XMPlaneNormalize(vNearPlane); + vNearPlane = DirectX::MathInternal::XMPlaneTransform(vNearPlane, vOrientation, vOrigin); + *NearPlane = XMPlaneNormalize(vNearPlane); } if (FarPlane) { XMVECTOR vFarPlane = XMVectorSet(0.0f, 0.0f, 1.0f, -Far); - vFarPlane = DirectX::MathInternal::XMPlaneTransform(vFarPlane, vOrientation, vOrigin); - *FarPlane = XMPlaneNormalize(vFarPlane); + vFarPlane = DirectX::MathInternal::XMPlaneTransform(vFarPlane, vOrientation, vOrigin); + *FarPlane = XMPlaneNormalize(vFarPlane); } if (RightPlane) { XMVECTOR vRightPlane = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); - vRightPlane = DirectX::MathInternal::XMPlaneTransform(vRightPlane, vOrientation, vOrigin); - *RightPlane = XMPlaneNormalize(vRightPlane); + vRightPlane = DirectX::MathInternal::XMPlaneTransform(vRightPlane, vOrientation, vOrigin); + *RightPlane = XMPlaneNormalize(vRightPlane); } if (LeftPlane) { XMVECTOR vLeftPlane = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); - vLeftPlane = DirectX::MathInternal::XMPlaneTransform(vLeftPlane, vOrientation, vOrigin); - *LeftPlane = XMPlaneNormalize(vLeftPlane); + vLeftPlane = DirectX::MathInternal::XMPlaneTransform(vLeftPlane, vOrientation, vOrigin); + *LeftPlane = XMPlaneNormalize(vLeftPlane); } if (TopPlane) { XMVECTOR vTopPlane = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); - vTopPlane = DirectX::MathInternal::XMPlaneTransform(vTopPlane, vOrientation, vOrigin); - *TopPlane = XMPlaneNormalize(vTopPlane); + vTopPlane = DirectX::MathInternal::XMPlaneTransform(vTopPlane, vOrientation, vOrigin); + *TopPlane = XMPlaneNormalize(vTopPlane); } if (BottomPlane) { XMVECTOR vBottomPlane = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); - vBottomPlane = DirectX::MathInternal::XMPlaneTransform(vBottomPlane, vOrientation, vOrigin); - *BottomPlane = XMPlaneNormalize(vBottomPlane); + vBottomPlane = DirectX::MathInternal::XMPlaneTransform(vBottomPlane, vOrientation, vOrigin); + *BottomPlane = XMPlaneNormalize(vBottomPlane); } } - //----------------------------------------------------------------------------- // Build a frustum from a persepective projection matrix. The matrix may only // contain a projection; any rotation, translation or scale will cause the // constructed frustum to be incorrect. //----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void XM_CALLCONV BoundingFrustum::CreateFromMatrix(BoundingFrustum& Out, FXMMATRIX Projection, bool rhcoords) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV BoundingFrustum::CreateFromMatrix(BoundingFrustum& Out, + FXMMATRIX Projection, + bool rhcoords) noexcept { // Corners of the projection frustum in NDC space. - static XMVECTORF32 NDCPoints[6] = - { - { { { 1.0f, 0.0f, 1.0f, 1.0f } } }, // right (at far plane) - { { { -1.0f, 0.0f, 1.0f, 1.0f } } }, // left - { { { 0.0f, 1.0f, 1.0f, 1.0f } } }, // top - { { { 0.0f, -1.0f, 1.0f, 1.0f } } }, // bottom - - { { { 0.0f, 0.0f, 0.0f, 1.0f } } }, // near - { { { 0.0f, 0.0f, 1.0f, 1.0f } } } // far + static XMVECTORF32 NDCPoints[6] = { + { { { 1.0f, 0.0f, 1.0f, 1.0f } } }, // right (at far plane) + { { { -1.0f, 0.0f, 1.0f, 1.0f } } }, // left + { { { 0.0f, 1.0f, 1.0f, 1.0f } } }, // top + { { { 0.0f, -1.0f, 1.0f, 1.0f } } }, // bottom + + { { { 0.0f, 0.0f, 0.0f, 1.0f } } }, // near + { { { 0.0f, 0.0f, 1.0f, 1.0f } } } // far }; XMVECTOR Determinant; @@ -4280,7 +4242,7 @@ inline void XM_CALLCONV BoundingFrustum::CreateFromMatrix(BoundingFrustum& Out, Points[i] = XMVector4Transform(NDCPoints[i], matInverse); } - Out.Origin = XMFLOAT3(0.0f, 0.0f, 0.0f); + Out.Origin = XMFLOAT3(0.0f, 0.0f, 0.0f); Out.Orientation = XMFLOAT4(0.0f, 0.0f, 0.0f, 1.0f); // Compute the slopes. @@ -4289,9 +4251,9 @@ inline void XM_CALLCONV BoundingFrustum::CreateFromMatrix(BoundingFrustum& Out, Points[2] = XMVectorMultiply(Points[2], XMVectorReciprocal(XMVectorSplatZ(Points[2]))); Points[3] = XMVectorMultiply(Points[3], XMVectorReciprocal(XMVectorSplatZ(Points[3]))); - Out.RightSlope = XMVectorGetX(Points[0]); - Out.LeftSlope = XMVectorGetX(Points[1]); - Out.TopSlope = XMVectorGetY(Points[2]); + Out.RightSlope = XMVectorGetX(Points[0]); + Out.LeftSlope = XMVectorGetX(Points[1]); + Out.TopSlope = XMVectorGetY(Points[2]); Out.BottomSlope = XMVectorGetY(Points[3]); // Compute near and far. @@ -4301,16 +4263,15 @@ inline void XM_CALLCONV BoundingFrustum::CreateFromMatrix(BoundingFrustum& Out, if (rhcoords) { Out.Near = XMVectorGetZ(Points[5]); - Out.Far = XMVectorGetZ(Points[4]); + Out.Far = XMVectorGetZ(Points[4]); } else { Out.Near = XMVectorGetZ(Points[4]); - Out.Far = XMVectorGetZ(Points[5]); + Out.Far = XMVectorGetZ(Points[5]); } } - /**************************************************************************** * * TriangleTests @@ -4329,11 +4290,8 @@ namespace TriangleTests // Ray-Triangle Intersection", Journal of Graphics Tools, vol. 2, no. 1, // pp 21-28, 1997. //----------------------------------------------------------------------------- - _Use_decl_annotations_ - inline bool XM_CALLCONV Intersects( - FXMVECTOR Origin, FXMVECTOR Direction, FXMVECTOR V0, - GXMVECTOR V1, - HXMVECTOR V2, float& Dist) noexcept + _Use_decl_annotations_ inline bool XM_CALLCONV + Intersects(FXMVECTOR Origin, FXMVECTOR Direction, FXMVECTOR V0, GXMVECTOR V1, HXMVECTOR V2, float& Dist) noexcept { assert(DirectX::MathInternal::XMVector3IsUnit(Direction)); @@ -4359,7 +4317,7 @@ namespace TriangleTests u = XMVector3Dot(s, p); XMVECTOR NoIntersection = XMVectorLess(u, Zero); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(u, det)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(u, det)); // q = s ^ e1; XMVECTOR q = XMVector3Cross(s, e1); @@ -4390,7 +4348,7 @@ namespace TriangleTests u = XMVector3Dot(s, p); XMVECTOR NoIntersection = XMVectorGreater(u, Zero); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(u, det)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(u, det)); // q = s ^ e1; XMVECTOR q = XMVector3Cross(s, e1); @@ -4429,7 +4387,6 @@ namespace TriangleTests return true; } - //----------------------------------------------------------------------------- // Test if two triangles intersect. // @@ -4443,11 +4400,11 @@ namespace TriangleTests // the 9 possible cases narrowed down to the only two pairs of edges that can // actaully result in a seperation. //----------------------------------------------------------------------------- - _Use_decl_annotations_ - inline bool XM_CALLCONV Intersects(FXMVECTOR A0, FXMVECTOR A1, FXMVECTOR A2, GXMVECTOR B0, HXMVECTOR B1, HXMVECTOR B2) noexcept + _Use_decl_annotations_ inline bool XM_CALLCONV + Intersects(FXMVECTOR A0, FXMVECTOR A1, FXMVECTOR A2, GXMVECTOR B0, HXMVECTOR B1, HXMVECTOR B2) noexcept { - static const XMVECTORU32 SelectY = { { { XM_SELECT_0, XM_SELECT_1, XM_SELECT_0, XM_SELECT_0 } } }; - static const XMVECTORU32 SelectZ = { { { XM_SELECT_0, XM_SELECT_0, XM_SELECT_1, XM_SELECT_0 } } }; + static const XMVECTORU32 SelectY = { { { XM_SELECT_0, XM_SELECT_1, XM_SELECT_0, XM_SELECT_0 } } }; + static const XMVECTORU32 SelectZ = { { { XM_SELECT_0, XM_SELECT_0, XM_SELECT_1, XM_SELECT_0 } } }; static const XMVECTORU32 Select0111 = { { { XM_SELECT_0, XM_SELECT_1, XM_SELECT_1, XM_SELECT_1 } } }; static const XMVECTORU32 Select1011 = { { { XM_SELECT_1, XM_SELECT_0, XM_SELECT_1, XM_SELECT_1 } } }; static const XMVECTORU32 Select1101 = { { { XM_SELECT_1, XM_SELECT_1, XM_SELECT_0, XM_SELECT_1 } } }; @@ -4462,13 +4419,13 @@ namespace TriangleTests // Test points of B against the plane of A. XMVECTOR BDist = XMVector3Dot(N1, XMVectorSubtract(B0, A0)); - BDist = XMVectorSelect(BDist, XMVector3Dot(N1, XMVectorSubtract(B1, A0)), SelectY); - BDist = XMVectorSelect(BDist, XMVector3Dot(N1, XMVectorSubtract(B2, A0)), SelectZ); + BDist = XMVectorSelect(BDist, XMVector3Dot(N1, XMVectorSubtract(B1, A0)), SelectY); + BDist = XMVectorSelect(BDist, XMVector3Dot(N1, XMVectorSubtract(B2, A0)), SelectZ); // Ensure robustness with co-planar triangles by zeroing small distances. uint32_t BDistIsZeroCR; XMVECTOR BDistIsZero = XMVectorGreaterR(&BDistIsZeroCR, g_RayEpsilon, XMVectorAbs(BDist)); - BDist = XMVectorSelect(BDist, Zero, BDistIsZero); + BDist = XMVectorSelect(BDist, Zero, BDistIsZero); uint32_t BDistIsLessCR; XMVECTOR BDistIsLess = XMVectorGreaterR(&BDistIsLessCR, Zero, BDist); @@ -4488,13 +4445,13 @@ namespace TriangleTests // Test points of A against the plane of B. XMVECTOR ADist = XMVector3Dot(N2, XMVectorSubtract(A0, B0)); - ADist = XMVectorSelect(ADist, XMVector3Dot(N2, XMVectorSubtract(A1, B0)), SelectY); - ADist = XMVectorSelect(ADist, XMVector3Dot(N2, XMVectorSubtract(A2, B0)), SelectZ); + ADist = XMVectorSelect(ADist, XMVector3Dot(N2, XMVectorSubtract(A1, B0)), SelectY); + ADist = XMVectorSelect(ADist, XMVector3Dot(N2, XMVectorSubtract(A2, B0)), SelectZ); // Ensure robustness with co-planar triangles by zeroing small distances. uint32_t ADistIsZeroCR; XMVECTOR ADistIsZero = XMVectorGreaterR(&ADistIsZeroCR, g_RayEpsilon, XMVectorAbs(ADist)); - ADist = XMVectorSelect(ADist, Zero, ADistIsZero); + ADist = XMVectorSelect(ADist, Zero, ADistIsZero); uint32_t ADistIsLessCR; XMVECTOR ADistIsLess = XMVectorGreaterR(&ADistIsLessCR, Zero, ADist); @@ -4589,52 +4546,64 @@ namespace TriangleTests // the triangle winding so that the overlap comparisons will compare the // correct edges with the correct signs. // - XMVECTOR ADistIsLessEqual = XMVectorOrInt(ADistIsLess, ADistIsZero); + XMVECTOR ADistIsLessEqual = XMVectorOrInt(ADistIsLess, ADistIsZero); XMVECTOR ADistIsGreaterEqual = XMVectorOrInt(ADistIsGreater, ADistIsZero); XMVECTOR AA0, AA1, AA2; - bool bPositiveA; + bool bPositiveA; - if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsGreaterEqual, ADistIsLess, Select0111)) || - DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsGreater, ADistIsLessEqual, Select0111))) + if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsGreaterEqual, ADistIsLess, Select0111)) + || DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsGreater, ADistIsLessEqual, Select0111))) { // A0 is singular, crossing from positive to negative. - AA0 = A0; AA1 = A1; AA2 = A2; + AA0 = A0; + AA1 = A1; + AA2 = A2; bPositiveA = true; } - else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsLessEqual, ADistIsGreater, Select0111)) || - DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsLess, ADistIsGreaterEqual, Select0111))) + else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsLessEqual, ADistIsGreater, Select0111)) + || DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsLess, ADistIsGreaterEqual, Select0111))) { // A0 is singular, crossing from negative to positive. - AA0 = A0; AA1 = A2; AA2 = A1; + AA0 = A0; + AA1 = A2; + AA2 = A1; bPositiveA = false; } - else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsGreaterEqual, ADistIsLess, Select1011)) || - DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsGreater, ADistIsLessEqual, Select1011))) + else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsGreaterEqual, ADistIsLess, Select1011)) + || DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsGreater, ADistIsLessEqual, Select1011))) { // A1 is singular, crossing from positive to negative. - AA0 = A1; AA1 = A2; AA2 = A0; + AA0 = A1; + AA1 = A2; + AA2 = A0; bPositiveA = true; } - else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsLessEqual, ADistIsGreater, Select1011)) || - DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsLess, ADistIsGreaterEqual, Select1011))) + else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsLessEqual, ADistIsGreater, Select1011)) + || DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsLess, ADistIsGreaterEqual, Select1011))) { // A1 is singular, crossing from negative to positive. - AA0 = A1; AA1 = A0; AA2 = A2; + AA0 = A1; + AA1 = A0; + AA2 = A2; bPositiveA = false; } - else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsGreaterEqual, ADistIsLess, Select1101)) || - DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsGreater, ADistIsLessEqual, Select1101))) + else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsGreaterEqual, ADistIsLess, Select1101)) + || DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsGreater, ADistIsLessEqual, Select1101))) { // A2 is singular, crossing from positive to negative. - AA0 = A2; AA1 = A0; AA2 = A1; + AA0 = A2; + AA1 = A0; + AA2 = A1; bPositiveA = true; } - else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsLessEqual, ADistIsGreater, Select1101)) || - DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsLess, ADistIsGreaterEqual, Select1101))) + else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsLessEqual, ADistIsGreater, Select1101)) + || DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsLess, ADistIsGreaterEqual, Select1101))) { // A2 is singular, crossing from negative to positive. - AA0 = A2; AA1 = A1; AA2 = A0; + AA0 = A2; + AA1 = A1; + AA2 = A0; bPositiveA = false; } else @@ -4643,52 +4612,64 @@ namespace TriangleTests return false; } - XMVECTOR BDistIsLessEqual = XMVectorOrInt(BDistIsLess, BDistIsZero); + XMVECTOR BDistIsLessEqual = XMVectorOrInt(BDistIsLess, BDistIsZero); XMVECTOR BDistIsGreaterEqual = XMVectorOrInt(BDistIsGreater, BDistIsZero); XMVECTOR BB0, BB1, BB2; - bool bPositiveB; + bool bPositiveB; - if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsGreaterEqual, BDistIsLess, Select0111)) || - DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsGreater, BDistIsLessEqual, Select0111))) + if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsGreaterEqual, BDistIsLess, Select0111)) + || DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsGreater, BDistIsLessEqual, Select0111))) { // B0 is singular, crossing from positive to negative. - BB0 = B0; BB1 = B1; BB2 = B2; + BB0 = B0; + BB1 = B1; + BB2 = B2; bPositiveB = true; } - else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsLessEqual, BDistIsGreater, Select0111)) || - DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsLess, BDistIsGreaterEqual, Select0111))) + else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsLessEqual, BDistIsGreater, Select0111)) + || DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsLess, BDistIsGreaterEqual, Select0111))) { // B0 is singular, crossing from negative to positive. - BB0 = B0; BB1 = B2; BB2 = B1; + BB0 = B0; + BB1 = B2; + BB2 = B1; bPositiveB = false; } - else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsGreaterEqual, BDistIsLess, Select1011)) || - DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsGreater, BDistIsLessEqual, Select1011))) + else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsGreaterEqual, BDistIsLess, Select1011)) + || DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsGreater, BDistIsLessEqual, Select1011))) { // B1 is singular, crossing from positive to negative. - BB0 = B1; BB1 = B2; BB2 = B0; + BB0 = B1; + BB1 = B2; + BB2 = B0; bPositiveB = true; } - else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsLessEqual, BDistIsGreater, Select1011)) || - DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsLess, BDistIsGreaterEqual, Select1011))) + else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsLessEqual, BDistIsGreater, Select1011)) + || DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsLess, BDistIsGreaterEqual, Select1011))) { // B1 is singular, crossing from negative to positive. - BB0 = B1; BB1 = B0; BB2 = B2; + BB0 = B1; + BB1 = B0; + BB2 = B2; bPositiveB = false; } - else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsGreaterEqual, BDistIsLess, Select1101)) || - DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsGreater, BDistIsLessEqual, Select1101))) + else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsGreaterEqual, BDistIsLess, Select1101)) + || DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsGreater, BDistIsLessEqual, Select1101))) { // B2 is singular, crossing from positive to negative. - BB0 = B2; BB1 = B0; BB2 = B1; + BB0 = B2; + BB1 = B0; + BB2 = B1; bPositiveB = true; } - else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsLessEqual, BDistIsGreater, Select1101)) || - DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsLess, BDistIsGreaterEqual, Select1101))) + else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsLessEqual, BDistIsGreater, Select1101)) + || DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsLess, BDistIsGreaterEqual, Select1101))) { // B2 is singular, crossing from negative to positive. - BB0 = B2; BB1 = B1; BB2 = B0; + BB0 = B2; + BB1 = B1; + BB2 = B0; bPositiveB = false; } else @@ -4725,12 +4706,13 @@ namespace TriangleTests return true; } - //----------------------------------------------------------------------------- // Ray-triangle test //----------------------------------------------------------------------------- - _Use_decl_annotations_ - inline PlaneIntersectionType XM_CALLCONV Intersects(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2, GXMVECTOR Plane) noexcept + _Use_decl_annotations_ inline PlaneIntersectionType XM_CALLCONV Intersects(FXMVECTOR V0, + FXMVECTOR V1, + FXMVECTOR V2, + GXMVECTOR Plane) noexcept { XMVECTOR One = XMVectorSplatOne(); @@ -4756,16 +4738,18 @@ namespace TriangleTests return INTERSECTING; } - //----------------------------------------------------------------------------- // Test a triangle vs 6 planes (typically forming a frustum). //----------------------------------------------------------------------------- - _Use_decl_annotations_ - inline ContainmentType XM_CALLCONV ContainedBy( - FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2, - GXMVECTOR Plane0, - HXMVECTOR Plane1, HXMVECTOR Plane2, - CXMVECTOR Plane3, CXMVECTOR Plane4, CXMVECTOR Plane5) noexcept + _Use_decl_annotations_ inline ContainmentType XM_CALLCONV ContainedBy(FXMVECTOR V0, + FXMVECTOR V1, + FXMVECTOR V2, + GXMVECTOR Plane0, + HXMVECTOR Plane1, + HXMVECTOR Plane2, + CXMVECTOR Plane3, + CXMVECTOR Plane4, + CXMVECTOR Plane5) noexcept { XMVECTOR One = XMVectorSplatOne(); @@ -4780,27 +4764,27 @@ namespace TriangleTests DirectX::MathInternal::FastIntersectTrianglePlane(TV0, TV1, TV2, Plane0, Outside, Inside); XMVECTOR AnyOutside = Outside; - XMVECTOR AllInside = Inside; + XMVECTOR AllInside = Inside; DirectX::MathInternal::FastIntersectTrianglePlane(TV0, TV1, TV2, Plane1, Outside, Inside); AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); + AllInside = XMVectorAndInt(AllInside, Inside); DirectX::MathInternal::FastIntersectTrianglePlane(TV0, TV1, TV2, Plane2, Outside, Inside); AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); + AllInside = XMVectorAndInt(AllInside, Inside); DirectX::MathInternal::FastIntersectTrianglePlane(TV0, TV1, TV2, Plane3, Outside, Inside); AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); + AllInside = XMVectorAndInt(AllInside, Inside); DirectX::MathInternal::FastIntersectTrianglePlane(TV0, TV1, TV2, Plane4, Outside, Inside); AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); + AllInside = XMVectorAndInt(AllInside, Inside); DirectX::MathInternal::FastIntersectTrianglePlane(TV0, TV1, TV2, Plane5, Outside, Inside); AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); + AllInside = XMVectorAndInt(AllInside, Inside); // If the triangle is outside any plane it is outside. if (XMVector4EqualInt(AnyOutside, XMVectorTrueInt())) @@ -4815,4 +4799,3 @@ namespace TriangleTests } } // namespace TriangleTests - diff --git a/Inc/DirectXColors.h b/Inc/DirectXColors.h index 02426e92..941737b4 100644 --- a/Inc/DirectXColors.h +++ b/Inc/DirectXColors.h @@ -17,296 +17,295 @@ 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 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 } } }; + 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 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 } } }; + 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/Inc/DirectXMath.h b/Inc/DirectXMath.h index 10e82a28..bd93fa4f 100644 --- a/Inc/DirectXMath.h +++ b/Inc/DirectXMath.h @@ -19,7 +19,8 @@ #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_) +#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 @@ -35,7 +36,7 @@ #if (__cplusplus >= 201402L) #define XM_DEPRECATED [[deprecated]] #elif defined(__GNUC__) -#define XM_DEPRECATED __attribute__ ((deprecated)) +#define XM_DEPRECATED __attribute__((deprecated)) #else #define XM_DEPRECATED __declspec(deprecated("This is deprecated and will be removed in a future version.")) #endif @@ -82,7 +83,8 @@ #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) +#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_ @@ -91,7 +93,8 @@ #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_) +#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 @@ -101,7 +104,7 @@ #ifdef _MSC_VER #pragma warning(push) -#pragma warning(disable:4514 4820) +#pragma warning(disable : 4514 4820) // C4514/4820: Off by default noise #endif #include @@ -171,8 +174,8 @@ #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))) +#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 @@ -191,33 +194,33 @@ #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_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_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)) +#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))) +#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 ) +#define XM_PERMUTE_PS(v, c) _mm_permute_ps((v), c) #else -#define XM_PERMUTE_PS( v, c ) _mm_shuffle_ps((v), (v), c ) +#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)) +#define XM_LOADU_SI16(p) _mm_cvtsi32_si128(*reinterpret_cast(p)) #else -#define XM_LOADU_SI16( p ) _mm_loadu_si16(p) +#define XM_LOADU_SI16(p) _mm_loadu_si16(p) #endif #endif // _XM_SSE_INTRINSICS_ && !_XM_NO_INTRINSICS_ @@ -225,11 +228,11 @@ #if defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) #if defined(__clang__) || defined(__GNUC__) -#define XM_PREFETCH( a ) __builtin_prefetch(a) +#define XM_PREFETCH(a) __builtin_prefetch(a) #elif defined(_MSC_VER) -#define XM_PREFETCH( a ) __prefetch(a) +#define XM_PREFETCH(a) __prefetch(a) #else -#define XM_PREFETCH( a ) +#define XM_PREFETCH(a) #endif #endif // _XM_ARM_NEON_INTRINSICS_ && !_XM_NO_INTRINSICS_ @@ -267,12 +270,12 @@ namespace DirectX #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_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 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; @@ -291,9 +294,9 @@ namespace DirectX 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_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__ @@ -302,7 +305,6 @@ namespace DirectX constexpr size_t XM_CACHE_LINE_SIZE = 64; #endif - /**************************************************************************** * * Macros @@ -321,19 +323,45 @@ namespace DirectX // 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); } + 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; } - + 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; + } /**************************************************************************** * @@ -343,7 +371,7 @@ namespace DirectX #ifdef _MSC_VER #pragma warning(push) -#pragma warning(disable:4068 4201 4365 4324 4820) +#pragma warning(disable : 4068 4201 4365 4324 4820) // C4068: ignore unknown pragmas // C4201: nonstandard extension used : nameless struct/union // C4365: Off by default noise @@ -361,8 +389,8 @@ namespace DirectX { union { - float vector4_f32[4]; - uint32_t vector4_u32[4]; + float vector4_f32[4]; + uint32_t vector4_u32[4]; }; }; #endif // _XM_NO_INTRINSICS_ @@ -379,21 +407,25 @@ namespace DirectX #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_) +#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_) +#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_) +#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; @@ -408,58 +440,106 @@ namespace DirectX { union { - float f[4]; + 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 + 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]; + 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 + 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]; + 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 + 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 @@ -470,39 +550,54 @@ namespace DirectX 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 + 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; + 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_ */ //------------------------------------------------------------------------------ @@ -512,7 +607,8 @@ namespace DirectX 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_) +#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; @@ -523,11 +619,11 @@ namespace DirectX #ifdef _XM_NO_INTRINSICS_ struct XMMATRIX - #else +#else XM_ALIGNED_STRUCT(16) XMMATRIX - #endif +#endif { - #ifdef _XM_NO_INTRINSICS_ +#ifdef _XM_NO_INTRINSICS_ union { XMVECTOR r[4]; @@ -540,51 +636,81 @@ namespace DirectX }; float m[4][4]; }; - #else +#else XMVECTOR r[4]; - #endif +#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 +#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(XMMATRIX&&) = default; XMMATRIX& operator=(XMMATRIX&&) = default; - #endif +#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; + 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 +#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 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) 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; + 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; + friend XMMATRIX XM_CALLCONV operator*(float S, FXMMATRIX M) noexcept; }; //------------------------------------------------------------------------------ @@ -596,19 +722,25 @@ namespace DirectX XMFLOAT2() = default; - XMFLOAT2(const XMFLOAT2&) = default; + XMFLOAT2(const XMFLOAT2&) = default; XMFLOAT2& operator=(const XMFLOAT2&) = default; - XMFLOAT2(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]) {} + 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 +#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 @@ -626,19 +758,25 @@ namespace DirectX XMINT2() = default; - XMINT2(const XMINT2&) = default; + XMINT2(const XMINT2&) = default; XMINT2& operator=(const XMINT2&) = default; - XMINT2(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]) {} + 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 +#if (__cplusplus >= 202002L) + bool operator==(const XMINT2&) const = default; + auto operator<= > (const XMINT2&) const = default; +#endif }; // 2D Vector; 32 bit unsigned integer components @@ -649,19 +787,25 @@ namespace DirectX XMUINT2() = default; - XMUINT2(const XMUINT2&) = default; + XMUINT2(const XMUINT2&) = default; XMUINT2& operator=(const XMUINT2&) = default; - XMUINT2(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]) {} + 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 +#if (__cplusplus >= 202002L) + bool operator==(const XMUINT2&) const = default; + auto operator<= > (const XMUINT2&) const = default; +#endif }; //------------------------------------------------------------------------------ @@ -674,19 +818,27 @@ namespace DirectX XMFLOAT3() = default; - XMFLOAT3(const XMFLOAT3&) = default; + XMFLOAT3(const XMFLOAT3&) = default; XMFLOAT3& operator=(const XMFLOAT3&) = default; - XMFLOAT3(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]) {} + 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 +#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 @@ -705,19 +857,27 @@ namespace DirectX XMINT3() = default; - XMINT3(const XMINT3&) = default; + XMINT3(const XMINT3&) = default; XMINT3& operator=(const XMINT3&) = default; - XMINT3(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]) {} + 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 +#if (__cplusplus >= 202002L) + bool operator==(const XMINT3&) const = default; + auto operator<= > (const XMINT3&) const = default; +#endif }; // 3D Vector; 32 bit unsigned integer components @@ -729,19 +889,27 @@ namespace DirectX XMUINT3() = default; - XMUINT3(const XMUINT3&) = default; + XMUINT3(const XMUINT3&) = default; XMUINT3& operator=(const XMUINT3&) = default; - XMUINT3(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]) {} + 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 +#if (__cplusplus >= 202002L) + bool operator==(const XMUINT3&) const = default; + auto operator<= > (const XMUINT3&) const = default; +#endif }; //------------------------------------------------------------------------------ @@ -755,19 +923,29 @@ namespace DirectX XMFLOAT4() = default; - XMFLOAT4(const XMFLOAT4&) = default; + XMFLOAT4(const XMFLOAT4&) = default; XMFLOAT4& operator=(const XMFLOAT4&) = default; - XMFLOAT4(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]) {} + 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 +#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 @@ -787,19 +965,29 @@ namespace DirectX XMINT4() = default; - XMINT4(const XMINT4&) = default; + XMINT4(const XMINT4&) = default; XMINT4& operator=(const XMINT4&) = default; - XMINT4(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]) {} + 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 +#if (__cplusplus >= 202002L) + bool operator==(const XMINT4&) const = default; + auto operator<= > (const XMINT4&) const = default; +#endif }; // 4D Vector; 32 bit unsigned integer components @@ -812,19 +1000,29 @@ namespace DirectX XMUINT4() = default; - XMUINT4(const XMUINT4&) = default; + XMUINT4(const XMUINT4&) = default; XMUINT4& operator=(const XMUINT4&) = default; - XMUINT4(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]) {} + 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 +#if (__cplusplus >= 202002L) + bool operator==(const XMUINT4&) const = default; + auto operator<= > (const XMUINT4&) const = default; +#endif }; #ifdef __clang__ @@ -852,45 +1050,56 @@ namespace DirectX XMFLOAT3X3() = default; - XMFLOAT3X3(const XMFLOAT3X3&) = default; + XMFLOAT3X3(const XMFLOAT3X3&) = default; XMFLOAT3X3& operator=(const XMFLOAT3X3&) = default; - XMFLOAT3X3(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) + 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]; } + 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) - constexpr bool operator == (const XMFLOAT3X3& M) const noexcept +#if (__cplusplus >= 202002L) + constexpr 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; + 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; } - constexpr auto operator <=> (const XMFLOAT3X3& M) const noexcept + constexpr 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; + 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 +#endif }; //------------------------------------------------------------------------------ @@ -912,51 +1121,76 @@ namespace DirectX XMFLOAT4X3() = default; - XMFLOAT4X3(const XMFLOAT4X3&) = default; + XMFLOAT4X3(const XMFLOAT4X3&) = default; XMFLOAT4X3& operator=(const XMFLOAT4X3&) = default; - XMFLOAT4X3(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) + 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]; } + 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) - constexpr bool operator == (const XMFLOAT4X3& M) const noexcept +#if (__cplusplus >= 202002L) + constexpr 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; + 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; } - constexpr auto operator <=> (const XMFLOAT4X3& M) const noexcept + constexpr 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; + 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 +#endif }; // 4x3 Row-major Matrix: 32 bit floating point components aligned on a 16 byte boundary @@ -983,48 +1217,76 @@ namespace DirectX XMFLOAT3X4() = default; - XMFLOAT3X4(const XMFLOAT3X4&) = default; + XMFLOAT3X4(const XMFLOAT3X4&) = default; XMFLOAT3X4& operator=(const XMFLOAT3X4&) = default; - XMFLOAT3X4(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) + 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]; } + 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) - constexpr bool operator == (const XMFLOAT3X4& M) const noexcept +#if (__cplusplus >= 202002L) + constexpr 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; + 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; } - constexpr auto operator <=> (const XMFLOAT3X4& M) const noexcept + constexpr 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; + 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 +#endif }; // 3x4 Column-major Matrix: 32 bit floating point components aligned on a 16 byte boundary @@ -1051,55 +1313,93 @@ namespace DirectX XMFLOAT4X4() = default; - XMFLOAT4X4(const XMFLOAT4X4&) = default; + XMFLOAT4X4(const XMFLOAT4X4&) = default; XMFLOAT4X4& operator=(const XMFLOAT4X4&) = default; - XMFLOAT4X4(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) + 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]; } + 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) - constexpr bool operator == (const XMFLOAT4X4& M) const noexcept +#if (__cplusplus >= 202002L) + constexpr 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; + 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; } - constexpr auto operator <=> (const XMFLOAT4X4& M) const noexcept + constexpr 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; + 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 +#endif }; // 4x4 Matrix: 32 bit floating point components aligned on a 16 byte boundary @@ -1120,16 +1420,16 @@ namespace DirectX #pragma warning(pop) #endif -/**************************************************************************** - * - * Data conversion operations - * - ****************************************************************************/ + /**************************************************************************** + * + * 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; + 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 @@ -1137,9 +1437,9 @@ namespace DirectX #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; + 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; /**************************************************************************** * @@ -1147,37 +1447,37 @@ namespace DirectX * ****************************************************************************/ - 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; + 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; /**************************************************************************** * @@ -1185,37 +1485,37 @@ namespace DirectX * ****************************************************************************/ - 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; + 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; /**************************************************************************** * @@ -1223,83 +1523,87 @@ namespace DirectX * ****************************************************************************/ - 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; + 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; + 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 @@ -1308,102 +1612,112 @@ namespace DirectX #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; + 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; /**************************************************************************** * @@ -1411,59 +1725,71 @@ namespace DirectX * ****************************************************************************/ - 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, + 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_ 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_ 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; + _In_ size_t InputStride, + _In_ size_t VectorCount, + _In_ FXMMATRIX M) noexcept; /**************************************************************************** * @@ -1471,77 +1797,123 @@ namespace DirectX * ****************************************************************************/ - 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, + 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_ 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_ 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_ 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_ 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; + _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; /**************************************************************************** * @@ -1549,47 +1921,50 @@ namespace DirectX * ****************************************************************************/ - 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, + 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; + _In_ size_t InputStride, + _In_ size_t VectorCount, + _In_ FXMMATRIX M) noexcept; /**************************************************************************** * @@ -1597,66 +1972,95 @@ namespace DirectX * ****************************************************************************/ - 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; + 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; + 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; - + 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; /**************************************************************************** * @@ -1664,45 +2068,51 @@ namespace DirectX * ****************************************************************************/ - 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; + 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; + 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 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; + 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; + void XM_CALLCONV XMQuaternionToAxisAngle(_Out_ XMVECTOR* pAxis, _Out_ float* pAngle, _In_ FXMVECTOR Q) noexcept; /**************************************************************************** * @@ -1710,32 +2120,38 @@ namespace DirectX * ****************************************************************************/ - 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 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; + 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; + 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; + 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, + 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; + _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; + XMVECTOR XM_CALLCONV XMPlaneFromPointNormal(FXMVECTOR Point, FXMVECTOR Normal) noexcept; + XMVECTOR XM_CALLCONV XMPlaneFromPoints(FXMVECTOR Point1, FXMVECTOR Point2, FXMVECTOR Point3) noexcept; /**************************************************************************** * @@ -1743,45 +2159,44 @@ namespace DirectX * ****************************************************************************/ - 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; + 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; - 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; + bool XM_CALLCONV XMColorIsNaN(FXMVECTOR C) noexcept; + bool XM_CALLCONV XMColorIsInfinite(FXMVECTOR C) noexcept; - XMVECTOR XM_CALLCONV XMColorRGBToHSL(FXMVECTOR rgb) noexcept; - XMVECTOR XM_CALLCONV XMColorHSLToRGB(FXMVECTOR hsl) 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 XMColorRGBToHSV(FXMVECTOR rgb) noexcept; - XMVECTOR XM_CALLCONV XMColorHSVToRGB(FXMVECTOR hsv) noexcept; + XMVECTOR XM_CALLCONV XMColorRGBToHSL(FXMVECTOR rgb) noexcept; + XMVECTOR XM_CALLCONV XMColorHSLToRGB(FXMVECTOR hsl) noexcept; - XMVECTOR XM_CALLCONV XMColorRGBToYUV(FXMVECTOR rgb) noexcept; - XMVECTOR XM_CALLCONV XMColorYUVToRGB(FXMVECTOR yuv) noexcept; + XMVECTOR XM_CALLCONV XMColorRGBToHSV(FXMVECTOR rgb) noexcept; + XMVECTOR XM_CALLCONV XMColorHSVToRGB(FXMVECTOR hsv) noexcept; - XMVECTOR XM_CALLCONV XMColorRGBToYUV_HD(FXMVECTOR rgb) noexcept; - XMVECTOR XM_CALLCONV XMColorYUVToRGB_HD(FXMVECTOR yuv) noexcept; + XMVECTOR XM_CALLCONV XMColorRGBToYUV(FXMVECTOR rgb) noexcept; + XMVECTOR XM_CALLCONV XMColorYUVToRGB(FXMVECTOR yuv) noexcept; - XMVECTOR XM_CALLCONV XMColorRGBToYUV_UHD(FXMVECTOR rgb) noexcept; - XMVECTOR XM_CALLCONV XMColorYUVToRGB_UHD(FXMVECTOR yuv) noexcept; + XMVECTOR XM_CALLCONV XMColorRGBToYUV_HD(FXMVECTOR rgb) noexcept; + XMVECTOR XM_CALLCONV XMColorYUVToRGB_HD(FXMVECTOR yuv) noexcept; - XMVECTOR XM_CALLCONV XMColorRGBToXYZ(FXMVECTOR rgb) noexcept; - XMVECTOR XM_CALLCONV XMColorXYZToRGB(FXMVECTOR xyz) noexcept; + XMVECTOR XM_CALLCONV XMColorRGBToYUV_UHD(FXMVECTOR rgb) noexcept; + XMVECTOR XM_CALLCONV XMColorYUVToRGB_UHD(FXMVECTOR yuv) noexcept; - XMVECTOR XM_CALLCONV XMColorXYZToSRGB(FXMVECTOR xyz) noexcept; - XMVECTOR XM_CALLCONV XMColorSRGBToXYZ(FXMVECTOR srgb) noexcept; + XMVECTOR XM_CALLCONV XMColorRGBToXYZ(FXMVECTOR rgb) noexcept; + XMVECTOR XM_CALLCONV XMColorXYZToRGB(FXMVECTOR xyz) noexcept; - XMVECTOR XM_CALLCONV XMColorRGBToSRGB(FXMVECTOR rgb) noexcept; - XMVECTOR XM_CALLCONV XMColorSRGBToRGB(FXMVECTOR srgb) 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; /**************************************************************************** * @@ -1789,27 +2204,27 @@ namespace DirectX * ****************************************************************************/ - bool XMVerifyCPUSupport() noexcept; + bool XMVerifyCPUSupport() noexcept; - XMVECTOR XM_CALLCONV XMFresnelTerm(FXMVECTOR CosIncidentAngle, FXMVECTOR RefractionIndex) noexcept; + XMVECTOR XM_CALLCONV XMFresnelTerm(FXMVECTOR CosIncidentAngle, FXMVECTOR RefractionIndex) noexcept; - bool XMScalarNearEqual(float S1, float S2, float Epsilon) noexcept; - float XMScalarModAngle(float Value) 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 XMScalarSin(float Value) noexcept; + float XMScalarSinEst(float Value) noexcept; - float XMScalarCos(float Value) noexcept; - float XMScalarCosEst(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; + 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 XMScalarASin(float Value) noexcept; + float XMScalarASinEst(float Value) noexcept; - float XMScalarACos(float Value) noexcept; - float XMScalarACosEst(float Value) noexcept; + float XMScalarACos(float Value) noexcept; + float XMScalarACosEst(float Value) noexcept; /**************************************************************************** * @@ -1822,27 +2237,35 @@ namespace DirectX #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; } + 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) + // 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 + template + struct PermuteHelper { - static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) noexcept + 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, + static const XMVECTORU32 selectMask = { { { + WhichX ? 0xFFFFFFFF : 0, + WhichY ? 0xFFFFFFFF : 0, + WhichZ ? 0xFFFFFFFF : 0, + WhichW ? 0xFFFFFFFF : 0, } } }; XMVECTOR shuffled1 = XM_PERMUTE_PS(v1, Shuffle); @@ -1856,42 +2279,46 @@ namespace DirectX }; // Fast path for permutes that only read from the first vector. - template struct PermuteHelper + template + struct PermuteHelper { - static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR) noexcept { return XM_PERMUTE_PS(v1, Shuffle); } + 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 + template + struct PermuteHelper { - static XMVECTOR XM_CALLCONV Permute(FXMVECTOR, FXMVECTOR v2) noexcept { return XM_PERMUTE_PS(v2, Shuffle); } + 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 + template + struct PermuteHelper { - static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) noexcept { return _mm_shuffle_ps(v1, v2, Shuffle); } + 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 + template + struct PermuteHelper { - static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) noexcept { return _mm_shuffle_ps(v2, v1, Shuffle); } + static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) noexcept { return _mm_shuffle_ps(v2, v1, Shuffle); } }; - } + } // namespace MathInternal #endif // _XM_SSE_INTRINSICS_ && !_XM_NO_INTRINSICS_ // General permute template template - inline XMVECTOR XM_CALLCONV XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2) noexcept + 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_) +#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; @@ -1900,40 +2327,124 @@ namespace DirectX constexpr bool WhichW = PermuteW > 3; return MathInternal::PermuteHelper::Permute(V1, V2); - #else +#else return XMVectorPermute(V1, V2, PermuteX, PermuteY, PermuteZ, PermuteW); - #endif +#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; } + 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))); } + 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); } + 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_) @@ -1942,37 +2453,133 @@ namespace DirectX // 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<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<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<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<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, 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, 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<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); } + 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_ @@ -1980,101 +2587,229 @@ namespace DirectX // General swizzle template template - inline XMVECTOR XM_CALLCONV XMVectorSwizzle(FXMVECTOR V) noexcept + 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_) +#if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) return XM_PERMUTE_PS(V, _MM_SHUFFLE(SwizzleW, SwizzleZ, SwizzleY, SwizzleX)); - #else +#else return XMVectorSwizzle(V, SwizzleX, SwizzleY, SwizzleZ, SwizzleW); - #endif +#endif } // Specialized swizzles - template<> constexpr XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 1, 2, 3>(FXMVECTOR V) noexcept { return V; } + 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); } + 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); } + 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); } + 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<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<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, 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, 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, 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, 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<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); } + 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 + 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 + 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 + 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 + 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); @@ -2105,147 +2840,160 @@ namespace DirectX #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_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_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 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 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 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_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_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 } } }; + 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 } } }; /**************************************************************************** * @@ -2255,7 +3003,7 @@ namespace DirectX #ifdef _MSC_VER #pragma warning(push) -#pragma warning(disable:4068 4214 4204 4365 4616 4640 6001 6101) +#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 @@ -2276,25 +3024,25 @@ namespace DirectX #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_) +#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_) +#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_ +#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)); @@ -2305,7 +3053,7 @@ namespace DirectX // 0xFFFFFFFF -> 1.0f, 0x00000000 -> 0.0f vTemp = _mm_and_si128(vTemp, g_XMOne); return _mm_castsi128_ps(vTemp); - #endif +#endif } //------------------------------------------------------------------------------ @@ -2314,15 +3062,15 @@ namespace DirectX { assert(IntConstant >= -16 && IntConstant <= 15); assert(DivExponent < 32); - #if defined(_XM_NO_INTRINSICS_) +#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 +#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); @@ -2333,8 +3081,8 @@ namespace DirectX // Multiply by the reciprocal (Perform a right shift by DivExponent) vResult = vmulq_f32(vResult, reinterpret_cast(&vScale)[0]); return vResult; - #else // XM_SSE_INTRINSICS_ - // Splat the int +#else // XM_SSE_INTRINSICS_ + // Splat the int __m128i vScale = _mm_set1_epi32(IntConstant); // Convert to a float XMVECTOR vResult = _mm_cvtepi32_ps(vScale); @@ -2345,7 +3093,7 @@ namespace DirectX // Multiply by the reciprocal (Perform a right shift by DivExponent) vResult = _mm_mul_ps(vResult, _mm_castsi128_ps(vScale)); return vResult; - #endif +#endif } //------------------------------------------------------------------------------ @@ -2353,18 +3101,18 @@ namespace DirectX inline XMVECTOR XM_CALLCONV XMVectorSplatConstantInt(int32_t IntConstant) noexcept { assert(IntConstant >= -16 && IntConstant <= 15); - #if defined(_XM_NO_INTRINSICS_) +#if defined(_XM_NO_INTRINSICS_) XMVECTORI32 V = { { { IntConstant, IntConstant, IntConstant, IntConstant } } }; return V.v; - #elif defined(_XM_ARM_NEON_INTRINSICS_) +#elif defined(_XM_ARM_NEON_INTRINSICS_) int32x4_t V = vdupq_n_s32(IntConstant); return reinterpret_cast(&V)[0]; - #else // XM_SSE_INTRINSICS_ +#else // XM_SSE_INTRINSICS_ __m128i V = _mm_set1_epi32(IntConstant); return _mm_castsi128_ps(V); - #endif +#endif } #include "DirectXMathConvert.inl" @@ -2383,4 +3131,3 @@ namespace DirectX #endif } // namespace DirectX - diff --git a/Inc/DirectXMathConvert.inl b/Inc/DirectXMathConvert.inl index e3a6bdc6..59d4b7c8 100644 --- a/Inc/DirectXMathConvert.inl +++ b/Inc/DirectXMathConvert.inl @@ -19,30 +19,25 @@ #ifdef _MSC_VER #pragma warning(push) -#pragma warning(disable:4701) +#pragma warning(disable : 4701) // C4701: false positives #endif -inline XMVECTOR XM_CALLCONV XMConvertVectorIntToFloat -( - FXMVECTOR VInt, - uint32_t DivExponent -) noexcept +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); + 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); + 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); + 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_ @@ -52,29 +47,25 @@ inline XMVECTOR XM_CALLCONV XMConvertVectorIntToFloat uint32_t uScale = 0x3F800000U - (DivExponent << 23); // Splat the scalar value __m128i vScale = _mm_set1_epi32(static_cast(uScale)); - vResult = _mm_mul_ps(vResult, _mm_castsi128_ps(vScale)); + vResult = _mm_mul_ps(vResult, _mm_castsi128_ps(vScale)); return vResult; #endif } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMConvertVectorFloatToInt -( - FXMVECTOR VFloat, - uint32_t MulExponent -) noexcept +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); + auto fScale = static_cast(1U << MulExponent); uint32_t ElementIndex = 0; XMVECTOR Result; do { int32_t iResult; - float fTemp = VFloat.vector4_f32[ElementIndex] * fScale; + float fTemp = VFloat.vector4_f32[ElementIndex] * fScale; if (fTemp <= -(65536.0f * 32768.0f)) { iResult = (-0x7FFFFFFF) - 1; @@ -88,8 +79,7 @@ inline XMVECTOR XM_CALLCONV XMConvertVectorFloatToInt iResult = static_cast(fTemp); } Result.vector4_u32[ElementIndex] = static_cast(iResult); - } - while (++ElementIndex < 4); + } while (++ElementIndex < 4); return Result; #elif defined(_XM_ARM_NEON_INTRINSICS_) float32x4_t vResult = vmulq_n_f32(VFloat, static_cast(1U << MulExponent)); @@ -98,19 +88,19 @@ inline XMVECTOR XM_CALLCONV XMConvertVectorFloatToInt // 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)); + 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); + 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); + vResult = _mm_and_ps(vOverflow, g_XMAbsMask); vOverflow = _mm_andnot_ps(vOverflow, _mm_castsi128_ps(vResulti)); vOverflow = _mm_or_ps(vOverflow, vResult); return vOverflow; @@ -119,25 +109,20 @@ inline XMVECTOR XM_CALLCONV XMConvertVectorFloatToInt //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMConvertVectorUIntToFloat -( - FXMVECTOR VUInt, - uint32_t DivExponent -) noexcept +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); + 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); + 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); + 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_ @@ -151,12 +136,12 @@ inline XMVECTOR XM_CALLCONV XMConvertVectorUIntToFloat // 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); + vMask = _mm_and_ps(_mm_castsi128_ps(iMask), g_XMFixUnsigned); vResult = _mm_add_ps(vResult, vMask); // Convert DivExponent into 1.0f/(1<(uScale)); + iMask = _mm_set1_epi32(static_cast(uScale)); vResult = _mm_mul_ps(vResult, _mm_castsi128_ps(iMask)); return vResult; #endif @@ -164,22 +149,18 @@ inline XMVECTOR XM_CALLCONV XMConvertVectorUIntToFloat //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMConvertVectorFloatToUInt -( - FXMVECTOR VFloat, - uint32_t MulExponent -) noexcept +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); + auto fScale = static_cast(1U << MulExponent); uint32_t ElementIndex = 0; XMVECTOR Result; do { uint32_t uResult; - float fTemp = VFloat.vector4_f32[ElementIndex] * fScale; + float fTemp = VFloat.vector4_f32[ElementIndex] * fScale; if (fTemp <= 0.0f) { uResult = 0; @@ -193,8 +174,7 @@ inline XMVECTOR XM_CALLCONV XMConvertVectorFloatToUInt uResult = static_cast(fTemp); } Result.vector4_u32[ElementIndex] = uResult; - } - while (++ElementIndex < 4); + } while (++ElementIndex < 4); return Result; #elif defined(_XM_ARM_NEON_INTRINSICS_) float32x4_t vResult = vmulq_n_f32(VFloat, static_cast(1U << MulExponent)); @@ -203,26 +183,26 @@ inline XMVECTOR XM_CALLCONV XMConvertVectorFloatToUInt // 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)); + 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); + 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; + 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); + 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); + 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); @@ -241,8 +221,7 @@ inline XMVECTOR XM_CALLCONV XMConvertVectorFloatToUInt ****************************************************************************/ //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadInt(const uint32_t* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadInt(const uint32_t* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) @@ -261,8 +240,7 @@ inline XMVECTOR XM_CALLCONV XMLoadInt(const uint32_t* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadFloat(const float* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadFloat(const float* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) @@ -281,8 +259,7 @@ inline XMVECTOR XM_CALLCONV XMLoadFloat(const float* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadInt2(const uint32_t* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadInt2(const uint32_t* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) @@ -293,7 +270,7 @@ inline XMVECTOR XM_CALLCONV XMLoadInt2(const uint32_t* pSource) noexcept V.vector4_u32[3] = 0; return V; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t x = vld1_u32(pSource); + 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_) @@ -302,8 +279,7 @@ inline XMVECTOR XM_CALLCONV XMLoadInt2(const uint32_t* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadInt2A(const uint32_t* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadInt2A(const uint32_t* pSource) noexcept { assert(pSource); assert((reinterpret_cast(pSource) & 0xF) == 0); @@ -328,8 +304,7 @@ inline XMVECTOR XM_CALLCONV XMLoadInt2A(const uint32_t* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadFloat2(const XMFLOAT2* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadFloat2(const XMFLOAT2* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) @@ -340,7 +315,7 @@ inline XMVECTOR XM_CALLCONV XMLoadFloat2(const XMFLOAT2* pSource) noexcept V.vector4_f32[3] = 0.f; return V; #elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t x = vld1_f32(reinterpret_cast(pSource)); + 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_) @@ -349,8 +324,7 @@ inline XMVECTOR XM_CALLCONV XMLoadFloat2(const XMFLOAT2* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadFloat2A(const XMFLOAT2A* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadFloat2A(const XMFLOAT2A* pSource) noexcept { assert(pSource); assert((reinterpret_cast(pSource) & 0xF) == 0); @@ -375,8 +349,7 @@ inline XMVECTOR XM_CALLCONV XMLoadFloat2A(const XMFLOAT2A* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadSInt2(const XMINT2* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadSInt2(const XMINT2* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) @@ -387,8 +360,8 @@ inline XMVECTOR XM_CALLCONV XMLoadSInt2(const XMINT2* pSource) noexcept 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); + 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_) @@ -398,8 +371,7 @@ inline XMVECTOR XM_CALLCONV XMLoadSInt2(const XMINT2* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUInt2(const XMUINT2* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadUInt2(const XMUINT2* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) @@ -410,8 +382,8 @@ inline XMVECTOR XM_CALLCONV XMLoadUInt2(const XMUINT2* pSource) noexcept 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); + 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_) @@ -426,15 +398,14 @@ inline XMVECTOR XM_CALLCONV XMLoadUInt2(const XMUINT2* pSource) noexcept // 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); + 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 +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadInt3(const uint32_t* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) @@ -445,24 +416,23 @@ inline XMVECTOR XM_CALLCONV XMLoadInt3(const uint32_t* pSource) noexcept V.vector4_u32[3] = 0; return V; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t x = vld1_u32(pSource); + uint32x2_t x = vld1_u32(pSource); uint32x2_t zero = vdup_n_u32(0); - uint32x2_t y = vld1_lane_u32(pSource + 2, zero, 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)); + __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)); + __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 +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadInt3A(const uint32_t* pSource) noexcept { assert(pSource); assert((reinterpret_cast(pSource) & 0xF) == 0); @@ -483,18 +453,17 @@ inline XMVECTOR XM_CALLCONV XMLoadInt3A(const uint32_t* pSource) noexcept 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)); + __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)); + __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 +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadFloat3(const XMFLOAT3* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) @@ -505,24 +474,23 @@ inline XMVECTOR XM_CALLCONV XMLoadFloat3(const XMFLOAT3* pSource) noexcept V.vector4_f32[3] = 0.f; return V; #elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t x = vld1_f32(reinterpret_cast(pSource)); + 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); + 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); + __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); + __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 +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadFloat3A(const XMFLOAT3A* pSource) noexcept { assert(pSource); assert((reinterpret_cast(pSource) & 0xF) == 0); @@ -553,8 +521,7 @@ inline XMVECTOR XM_CALLCONV XMLoadFloat3A(const XMFLOAT3A* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadSInt3(const XMINT3* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadSInt3(const XMINT3* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) @@ -567,22 +534,21 @@ inline XMVECTOR XM_CALLCONV XMLoadSInt3(const XMINT3* pSource) noexcept return V; #elif defined(_XM_ARM_NEON_INTRINSICS_) - int32x2_t x = vld1_s32(reinterpret_cast(pSource)); + 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); + 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); + __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 +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadUInt3(const XMUINT3* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) @@ -593,15 +559,15 @@ inline XMVECTOR XM_CALLCONV XMLoadUInt3(const XMUINT3* pSource) noexcept V.vector4_f32[3] = 0.f; return V; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t x = vld1_u32(reinterpret_cast(pSource)); + 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); + 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); + __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); @@ -612,15 +578,14 @@ inline XMVECTOR XM_CALLCONV XMLoadUInt3(const XMUINT3* pSource) noexcept // 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); + 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 +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadInt4(const uint32_t* pSource) noexcept { assert(pSource); @@ -640,8 +605,7 @@ inline XMVECTOR XM_CALLCONV XMLoadInt4(const uint32_t* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadInt4A(const uint32_t* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadInt4A(const uint32_t* pSource) noexcept { assert(pSource); assert((reinterpret_cast(pSource) & 0xF) == 0); @@ -665,8 +629,7 @@ inline XMVECTOR XM_CALLCONV XMLoadInt4A(const uint32_t* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadFloat4(const XMFLOAT4* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadFloat4(const XMFLOAT4* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) @@ -684,8 +647,7 @@ inline XMVECTOR XM_CALLCONV XMLoadFloat4(const XMFLOAT4* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadFloat4A(const XMFLOAT4A* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadFloat4A(const XMFLOAT4A* pSource) noexcept { assert(pSource); assert((reinterpret_cast(pSource) & 0xF) == 0); @@ -708,8 +670,7 @@ inline XMVECTOR XM_CALLCONV XMLoadFloat4A(const XMFLOAT4A* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadSInt4(const XMINT4* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadSInt4(const XMINT4* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) @@ -731,8 +692,7 @@ inline XMVECTOR XM_CALLCONV XMLoadSInt4(const XMINT4* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUInt4(const XMUINT4* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadUInt4(const XMUINT4* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) @@ -757,15 +717,14 @@ inline XMVECTOR XM_CALLCONV XMLoadUInt4(const XMUINT4* pSource) noexcept // 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); + 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 +_Use_decl_annotations_ inline XMMATRIX XM_CALLCONV XMLoadFloat3x3(const XMFLOAT3X3* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) @@ -795,7 +754,7 @@ inline XMMATRIX XM_CALLCONV XMLoadFloat3x3(const XMFLOAT3X3* pSource) noexcept 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); + float32x4_t T = vextq_f32(v0, v1, 3); XMMATRIX M; M.r[0] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(v0), g_XMMask3)); @@ -826,8 +785,7 @@ inline XMMATRIX XM_CALLCONV XMLoadFloat3x3(const XMFLOAT3X3* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMMATRIX XM_CALLCONV XMLoadFloat4x3(const XMFLOAT4X3* pSource) noexcept +_Use_decl_annotations_ inline XMMATRIX XM_CALLCONV XMLoadFloat4x3(const XMFLOAT4X3* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) @@ -889,9 +847,9 @@ inline XMMATRIX XM_CALLCONV XMLoadFloat4x3(const XMFLOAT4X3* pSource) noexcept // 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); + 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); @@ -901,17 +859,13 @@ inline XMMATRIX XM_CALLCONV XMLoadFloat4x3(const XMFLOAT4X3* pSource) noexcept __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)); + XMMATRIX M(vTemp1, vTemp2, vTemp3, _mm_castsi128_ps(vTemp4i)); return M; #endif } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMMATRIX XM_CALLCONV XMLoadFloat4x3A(const XMFLOAT4X3A* pSource) noexcept +_Use_decl_annotations_ inline XMMATRIX XM_CALLCONV XMLoadFloat4x3A(const XMFLOAT4X3A* pSource) noexcept { assert(pSource); assert((reinterpret_cast(pSource) & 0xF) == 0); @@ -980,9 +934,9 @@ inline XMMATRIX XM_CALLCONV XMLoadFloat4x3A(const XMFLOAT4X3A* pSource) noexcept // 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); + 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); @@ -992,17 +946,13 @@ inline XMMATRIX XM_CALLCONV XMLoadFloat4x3A(const XMFLOAT4X3A* pSource) noexcept __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)); + XMMATRIX M(vTemp1, vTemp2, vTemp3, _mm_castsi128_ps(vTemp4i)); return M; #endif } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMMATRIX XM_CALLCONV XMLoadFloat3x4(const XMFLOAT3X4* pSource) noexcept +_Use_decl_annotations_ inline XMMATRIX XM_CALLCONV XMLoadFloat3x4(const XMFLOAT3X4* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) @@ -1031,23 +981,23 @@ inline XMMATRIX XM_CALLCONV XMLoadFloat3x4(const XMFLOAT3X4* pSource) noexcept #elif defined(_XM_ARM_NEON_INTRINSICS_) float32x2x4_t vTemp0 = vld4_f32(&pSource->_11); - float32x4_t vTemp1 = vld1q_f32(&pSource->_31); + float32x4_t vTemp1 = vld1q_f32(&pSource->_31); - float32x2_t l = vget_low_f32(vTemp1); + 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); + 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); + 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; @@ -1079,8 +1029,7 @@ inline XMMATRIX XM_CALLCONV XMLoadFloat3x4(const XMFLOAT3X4* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMMATRIX XM_CALLCONV XMLoadFloat3x4A(const XMFLOAT3X4A* pSource) noexcept +_Use_decl_annotations_ inline XMMATRIX XM_CALLCONV XMLoadFloat3x4A(const XMFLOAT3X4A* pSource) noexcept { assert(pSource); assert((reinterpret_cast(pSource) & 0xF) == 0); @@ -1111,27 +1060,27 @@ inline XMMATRIX XM_CALLCONV XMLoadFloat3x4A(const XMFLOAT3X4A* pSource) noexcept #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); + float32x4_t vTemp1 = vld1q_f32_ex(&pSource->_31, 128); #else float32x2x4_t vTemp0 = vld4_f32(&pSource->_11); - float32x4_t vTemp1 = vld1q_f32(&pSource->_31); + float32x4_t vTemp1 = vld1q_f32(&pSource->_31); #endif - float32x2_t l = vget_low_f32(vTemp1); + 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); + 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); + 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; @@ -1163,8 +1112,7 @@ inline XMMATRIX XM_CALLCONV XMLoadFloat3x4A(const XMFLOAT3X4A* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMMATRIX XM_CALLCONV XMLoadFloat4x4(const XMFLOAT4X4* pSource) noexcept +_Use_decl_annotations_ inline XMMATRIX XM_CALLCONV XMLoadFloat4x4(const XMFLOAT4X4* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) @@ -1209,8 +1157,7 @@ inline XMMATRIX XM_CALLCONV XMLoadFloat4x4(const XMFLOAT4X4* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMMATRIX XM_CALLCONV XMLoadFloat4x4A(const XMFLOAT4X4A* pSource) noexcept +_Use_decl_annotations_ inline XMMATRIX XM_CALLCONV XMLoadFloat4x4A(const XMFLOAT4X4A* pSource) noexcept { assert(pSource); assert((reinterpret_cast(pSource) & 0xF) == 0); @@ -1267,12 +1214,7 @@ inline XMMATRIX XM_CALLCONV XMLoadFloat4x4A(const XMFLOAT4X4A* pSource) noexcept * Vector and matrix store operations * ****************************************************************************/ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreInt -( - uint32_t* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreInt(uint32_t* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) @@ -1285,12 +1227,7 @@ inline void XM_CALLCONV XMStoreInt } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat -( - float* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreFloat(float* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) @@ -1303,12 +1240,7 @@ inline void XM_CALLCONV XMStoreFloat } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreInt2 -( - uint32_t* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreInt2(uint32_t* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) @@ -1323,12 +1255,7 @@ inline void XM_CALLCONV XMStoreInt2 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreInt2A -( - uint32_t* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreInt2A(uint32_t* pDestination, FXMVECTOR V) noexcept { assert(pDestination); assert((reinterpret_cast(pDestination) & 0xF) == 0); @@ -1348,12 +1275,7 @@ inline void XM_CALLCONV XMStoreInt2A } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat2 -( - XMFLOAT2* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreFloat2(XMFLOAT2* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) @@ -1368,12 +1290,7 @@ inline void XM_CALLCONV XMStoreFloat2 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat2A -( - XMFLOAT2A* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreFloat2A(XMFLOAT2A* pDestination, FXMVECTOR V) noexcept { assert(pDestination); assert((reinterpret_cast(pDestination) & 0xF) == 0); @@ -1393,20 +1310,15 @@ inline void XM_CALLCONV XMStoreFloat2A } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreSInt2 -( - XMINT2* pDestination, - FXMVECTOR V -) noexcept +_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); + 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 @@ -1415,44 +1327,39 @@ inline void XM_CALLCONV XMStoreSInt2 __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); + 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 +_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); + 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; + 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); + 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); + 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); @@ -1462,12 +1369,7 @@ inline void XM_CALLCONV XMStoreUInt2 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreInt3 -( - uint32_t* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreInt3(uint32_t* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) @@ -1486,12 +1388,7 @@ inline void XM_CALLCONV XMStoreInt3 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreInt3A -( - uint32_t* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreInt3A(uint32_t* pDestination, FXMVECTOR V) noexcept { assert(pDestination); assert((reinterpret_cast(pDestination) & 0xF) == 0); @@ -1515,12 +1412,7 @@ inline void XM_CALLCONV XMStoreInt3A } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat3 -( - XMFLOAT3* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreFloat3(XMFLOAT3* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) @@ -1532,7 +1424,7 @@ inline void XM_CALLCONV XMStoreFloat3 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->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_) @@ -1543,12 +1435,7 @@ inline void XM_CALLCONV XMStoreFloat3 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat3A -( - XMFLOAT3A* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreFloat3A(XMFLOAT3A* pDestination, FXMVECTOR V) noexcept { assert(pDestination); assert((reinterpret_cast(pDestination) & 0xF) == 0); @@ -1575,12 +1462,7 @@ inline void XM_CALLCONV XMStoreFloat3A } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreSInt3 -( - XMINT3* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreSInt3(XMINT3* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) @@ -1588,7 +1470,7 @@ inline void XM_CALLCONV XMStoreSInt3 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); + 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); @@ -1599,8 +1481,8 @@ inline void XM_CALLCONV XMStoreSInt3 __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); + 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)); @@ -1609,12 +1491,7 @@ inline void XM_CALLCONV XMStoreSInt3 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUInt3 -( - XMUINT3* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreUInt3(XMUINT3* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) @@ -1622,7 +1499,7 @@ inline void XM_CALLCONV XMStoreUInt3 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); + 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); @@ -1631,16 +1508,16 @@ inline void XM_CALLCONV XMStoreUInt3 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; + 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); + 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); + 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); @@ -1652,12 +1529,7 @@ inline void XM_CALLCONV XMStoreUInt3 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreInt4 -( - uint32_t* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreInt4(uint32_t* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) @@ -1673,12 +1545,7 @@ inline void XM_CALLCONV XMStoreInt4 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreInt4A -( - uint32_t* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreInt4A(uint32_t* pDestination, FXMVECTOR V) noexcept { assert(pDestination); assert((reinterpret_cast(pDestination) & 0xF) == 0); @@ -1699,12 +1566,7 @@ inline void XM_CALLCONV XMStoreInt4A } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat4 -( - XMFLOAT4* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreFloat4(XMFLOAT4* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) @@ -1720,12 +1582,7 @@ inline void XM_CALLCONV XMStoreFloat4 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat4A -( - XMFLOAT4A* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreFloat4A(XMFLOAT4A* pDestination, FXMVECTOR V) noexcept { assert(pDestination); assert((reinterpret_cast(pDestination) & 0xF) == 0); @@ -1746,12 +1603,7 @@ inline void XM_CALLCONV XMStoreFloat4A } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreSInt4 -( - XMINT4* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreSInt4(XMINT4* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) @@ -1769,19 +1621,14 @@ inline void XM_CALLCONV XMStoreSInt4 __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); + vOverflow = _mm_andnot_ps(vOverflow, _mm_castsi128_ps(vResulti)); + vOverflow = _mm_or_ps(vOverflow, vResult); _mm_storeu_si128(reinterpret_cast<__m128i*>(pDestination), _mm_castps_si128(vOverflow)); #endif } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUInt4 -( - XMUINT4* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreUInt4(XMUINT4* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) @@ -1797,16 +1644,16 @@ inline void XM_CALLCONV XMStoreUInt4 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; + 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); + 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); + 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); @@ -1815,12 +1662,7 @@ inline void XM_CALLCONV XMStoreUInt4 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat3x3 -( - XMFLOAT3X3* pDestination, - FXMMATRIX M -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreFloat3x3(XMFLOAT3X3* pDestination, FXMMATRIX M) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) @@ -1851,8 +1693,8 @@ inline void XM_CALLCONV XMStoreFloat3x3 XMVECTOR vTemp1 = M.r[0]; XMVECTOR vTemp2 = M.r[1]; XMVECTOR vTemp3 = M.r[2]; - XMVECTOR vWork = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(0, 0, 2, 2)); - vTemp1 = _mm_shuffle_ps(vTemp1, vWork, _MM_SHUFFLE(2, 0, 1, 0)); + XMVECTOR vWork = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(0, 0, 2, 2)); + vTemp1 = _mm_shuffle_ps(vTemp1, vWork, _MM_SHUFFLE(2, 0, 1, 0)); _mm_storeu_ps(&pDestination->m[0][0], vTemp1); vTemp2 = _mm_shuffle_ps(vTemp2, vTemp3, _MM_SHUFFLE(1, 0, 2, 1)); _mm_storeu_ps(&pDestination->m[1][1], vTemp2); @@ -1862,12 +1704,7 @@ inline void XM_CALLCONV XMStoreFloat3x3 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat4x3 -( - XMFLOAT4X3* pDestination, - FXMMATRIX M -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreFloat4x3(XMFLOAT4X3* pDestination, FXMMATRIX M) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) @@ -1901,15 +1738,15 @@ inline void XM_CALLCONV XMStoreFloat4x3 T2 = vextq_f32(T1, M.r[3], 3); vst1q_f32(&pDestination->m[2][2], T2); #elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp1 = M.r[0]; - XMVECTOR vTemp2 = M.r[1]; - XMVECTOR vTemp3 = M.r[2]; - XMVECTOR vTemp4 = M.r[3]; + XMVECTOR vTemp1 = M.r[0]; + XMVECTOR vTemp2 = M.r[1]; + XMVECTOR vTemp3 = M.r[2]; + XMVECTOR vTemp4 = M.r[3]; XMVECTOR vTemp2x = _mm_shuffle_ps(vTemp2, vTemp3, _MM_SHUFFLE(1, 0, 2, 1)); - vTemp2 = _mm_shuffle_ps(vTemp2, vTemp1, _MM_SHUFFLE(2, 2, 0, 0)); - vTemp1 = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(0, 2, 1, 0)); - vTemp3 = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(0, 0, 2, 2)); - vTemp3 = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(2, 1, 2, 0)); + vTemp2 = _mm_shuffle_ps(vTemp2, vTemp1, _MM_SHUFFLE(2, 2, 0, 0)); + vTemp1 = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(0, 2, 1, 0)); + vTemp3 = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(0, 0, 2, 2)); + vTemp3 = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(2, 1, 2, 0)); _mm_storeu_ps(&pDestination->m[0][0], vTemp1); _mm_storeu_ps(&pDestination->m[1][1], vTemp2x); _mm_storeu_ps(&pDestination->m[2][2], vTemp3); @@ -1917,12 +1754,7 @@ inline void XM_CALLCONV XMStoreFloat4x3 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat4x3A -( - XMFLOAT4X3A* pDestination, - FXMMATRIX M -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreFloat4x3A(XMFLOAT4X3A* pDestination, FXMMATRIX M) noexcept { assert(pDestination); assert((reinterpret_cast(pDestination) & 0xF) == 0); @@ -1997,12 +1829,7 @@ inline void XM_CALLCONV XMStoreFloat4x3A } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat3x4 -( - XMFLOAT3X4* pDestination, - FXMMATRIX M -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreFloat3x4(XMFLOAT3X4* pDestination, FXMMATRIX M) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) @@ -2056,12 +1883,7 @@ inline void XM_CALLCONV XMStoreFloat3x4 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat3x4A -( - XMFLOAT3X4A* pDestination, - FXMMATRIX M -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreFloat3x4A(XMFLOAT3X4A* pDestination, FXMMATRIX M) noexcept { assert(pDestination); assert((reinterpret_cast(pDestination) & 0xF) == 0); @@ -2122,12 +1944,7 @@ inline void XM_CALLCONV XMStoreFloat3x4A } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat4x4 -( - XMFLOAT4X4* pDestination, - FXMMATRIX M -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreFloat4x4(XMFLOAT4X4* pDestination, FXMMATRIX M) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) @@ -2166,12 +1983,7 @@ inline void XM_CALLCONV XMStoreFloat4x4 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat4x4A -( - XMFLOAT4X4A* pDestination, - FXMMATRIX M -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreFloat4x4A(XMFLOAT4X4A* pDestination, FXMMATRIX M) noexcept { assert(pDestination); assert((reinterpret_cast(pDestination) & 0xF) == 0); @@ -2216,4 +2028,3 @@ inline void XM_CALLCONV XMStoreFloat4x4A _mm_store_ps(&pDestination->_41, M.r[3]); #endif } - diff --git a/Inc/DirectXMathMatrix.inl b/Inc/DirectXMathMatrix.inl index 5e96a331..d0f8e111 100644 --- a/Inc/DirectXMathMatrix.inl +++ b/Inc/DirectXMathMatrix.inl @@ -30,11 +30,11 @@ inline bool XM_CALLCONV XMMatrixIsNaN(FXMMATRIX M) noexcept { #if defined(_XM_NO_INTRINSICS_) - size_t i = 16; - auto pWork = reinterpret_cast(&M.m[0][0]); + size_t i = 16; + auto pWork = reinterpret_cast(&M.m[0][0]); do { - // Fetch value into integer unit + // Fetch value into integer unit uint32_t uTest = pWork[0]; // Remove sign uTest &= 0x7FFFFFFFU; @@ -42,12 +42,11 @@ inline bool XM_CALLCONV XMMatrixIsNaN(FXMMATRIX M) noexcept uTest -= 0x7F800001U; if (uTest < 0x007FFFFFU) { - break; // NaN found + break; // NaN found } - ++pWork; // Next entry - } - while (--i); - return (i != 0); // i == 0 if nothing matched + ++pWork; // Next entry + } while (--i); + return (i != 0); // i == 0 if nothing matched #elif defined(_XM_ARM_NEON_INTRINSICS_) // Load in registers float32x4_t vX = M.r[0]; @@ -64,11 +63,9 @@ inline bool XM_CALLCONV XMMatrixIsNaN(FXMMATRIX M) noexcept ymask = vorrq_u32(ymask, wmask); xmask = vorrq_u32(xmask, ymask); // If any tested true, return true - uint8x8x2_t vTemp = vzip_u8( - vget_low_u8(vreinterpretq_u8_u32(xmask)), - vget_high_u8(vreinterpretq_u8_u32(xmask))); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(xmask)), vget_high_u8(vreinterpretq_u8_u32(xmask))); uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); return (r != 0); #elif defined(_XM_SSE_INTRINSICS_) // Load in registers @@ -101,23 +98,22 @@ inline bool XM_CALLCONV XMMatrixIsNaN(FXMMATRIX M) noexcept inline bool XM_CALLCONV XMMatrixIsInfinite(FXMMATRIX M) noexcept { #if defined(_XM_NO_INTRINSICS_) - size_t i = 16; - auto pWork = reinterpret_cast(&M.m[0][0]); + size_t i = 16; + auto pWork = reinterpret_cast(&M.m[0][0]); do { - // Fetch value into integer unit + // Fetch value into integer unit uint32_t uTest = pWork[0]; // Remove sign uTest &= 0x7FFFFFFFU; // INF is 0x7F800000 if (uTest == 0x7F800000U) { - break; // INF found + break; // INF found } - ++pWork; // Next entry - } - while (--i); - return (i != 0); // i == 0 if nothing matched + ++pWork; // Next entry + } while (--i); + return (i != 0); // i == 0 if nothing matched #elif defined(_XM_ARM_NEON_INTRINSICS_) // Load in registers float32x4_t vX = M.r[0]; @@ -139,11 +135,9 @@ inline bool XM_CALLCONV XMMatrixIsInfinite(FXMMATRIX M) noexcept ymask = vorrq_u32(ymask, wmask); xmask = vorrq_u32(xmask, ymask); // If any tested true, return true - uint8x8x2_t vTemp = vzip_u8( - vget_low_u8(vreinterpretq_u8_u32(xmask)), - vget_high_u8(vreinterpretq_u8_u32(xmask))); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(xmask)), vget_high_u8(vreinterpretq_u8_u32(xmask))); uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); return (r != 0); #elif defined(_XM_SSE_INTRINSICS_) // Mask off the sign bits @@ -195,30 +189,30 @@ inline bool XM_CALLCONV XMMatrixIsIdentity(FXMMATRIX M) noexcept uZero |= pWork[14]; uOne |= pWork[15] ^ 0x3F800000U; // If all zero entries are zero, the uZero==0 - uZero &= 0x7FFFFFFF; // Allow -0.0f + uZero &= 0x7FFFFFFF; // Allow -0.0f // If all 1.0f entries are 1.0f, then uOne==0 uOne |= uZero; return (uOne == 0); #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t xmask = vceqq_f32(M.r[0], g_XMIdentityR0); - uint32x4_t ymask = vceqq_f32(M.r[1], g_XMIdentityR1); - uint32x4_t zmask = vceqq_f32(M.r[2], g_XMIdentityR2); - uint32x4_t wmask = vceqq_f32(M.r[3], g_XMIdentityR3); - xmask = vandq_u32(xmask, zmask); - ymask = vandq_u32(ymask, wmask); - xmask = vandq_u32(xmask, ymask); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(xmask)), vget_high_u8(vreinterpretq_u8_u32(xmask))); + uint32x4_t xmask = vceqq_f32(M.r[0], g_XMIdentityR0); + uint32x4_t ymask = vceqq_f32(M.r[1], g_XMIdentityR1); + uint32x4_t zmask = vceqq_f32(M.r[2], g_XMIdentityR2); + uint32x4_t wmask = vceqq_f32(M.r[3], g_XMIdentityR3); + xmask = vandq_u32(xmask, zmask); + ymask = vandq_u32(ymask, wmask); + xmask = vandq_u32(xmask, ymask); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(xmask)), vget_high_u8(vreinterpretq_u8_u32(xmask))); uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); return (r == 0xFFFFFFFFU); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vTemp1 = _mm_cmpeq_ps(M.r[0], g_XMIdentityR0); XMVECTOR vTemp2 = _mm_cmpeq_ps(M.r[1], g_XMIdentityR1); XMVECTOR vTemp3 = _mm_cmpeq_ps(M.r[2], g_XMIdentityR2); XMVECTOR vTemp4 = _mm_cmpeq_ps(M.r[3], g_XMIdentityR3); - vTemp1 = _mm_and_ps(vTemp1, vTemp2); - vTemp3 = _mm_and_ps(vTemp3, vTemp4); - vTemp1 = _mm_and_ps(vTemp1, vTemp3); + vTemp1 = _mm_and_ps(vTemp1, vTemp2); + vTemp3 = _mm_and_ps(vTemp3, vTemp4); + vTemp1 = _mm_and_ps(vTemp1, vTemp3); return (_mm_movemask_ps(vTemp1) == 0x0f); #endif } @@ -229,11 +223,7 @@ inline bool XM_CALLCONV XMMatrixIsIdentity(FXMMATRIX M) noexcept //------------------------------------------------------------------------------ // Perform a 4x4 matrix multiply by a 4x4 matrix -inline XMMATRIX XM_CALLCONV XMMatrixMultiply -( - FXMMATRIX M1, - CXMMATRIX M2 -) noexcept +inline XMMATRIX XM_CALLCONV XMMatrixMultiply(FXMMATRIX M1, CXMMATRIX M2) noexcept { #if defined(_XM_NO_INTRINSICS_) XMMATRIX mResult; @@ -248,33 +238,33 @@ inline XMMATRIX XM_CALLCONV XMMatrixMultiply mResult.m[0][2] = (M2.m[0][2] * x) + (M2.m[1][2] * y) + (M2.m[2][2] * z) + (M2.m[3][2] * w); mResult.m[0][3] = (M2.m[0][3] * x) + (M2.m[1][3] * y) + (M2.m[2][3] * z) + (M2.m[3][3] * w); // Repeat for all the other rows - x = M1.m[1][0]; - y = M1.m[1][1]; - z = M1.m[1][2]; - w = M1.m[1][3]; + x = M1.m[1][0]; + y = M1.m[1][1]; + z = M1.m[1][2]; + w = M1.m[1][3]; mResult.m[1][0] = (M2.m[0][0] * x) + (M2.m[1][0] * y) + (M2.m[2][0] * z) + (M2.m[3][0] * w); mResult.m[1][1] = (M2.m[0][1] * x) + (M2.m[1][1] * y) + (M2.m[2][1] * z) + (M2.m[3][1] * w); mResult.m[1][2] = (M2.m[0][2] * x) + (M2.m[1][2] * y) + (M2.m[2][2] * z) + (M2.m[3][2] * w); mResult.m[1][3] = (M2.m[0][3] * x) + (M2.m[1][3] * y) + (M2.m[2][3] * z) + (M2.m[3][3] * w); - x = M1.m[2][0]; - y = M1.m[2][1]; - z = M1.m[2][2]; - w = M1.m[2][3]; + x = M1.m[2][0]; + y = M1.m[2][1]; + z = M1.m[2][2]; + w = M1.m[2][3]; mResult.m[2][0] = (M2.m[0][0] * x) + (M2.m[1][0] * y) + (M2.m[2][0] * z) + (M2.m[3][0] * w); mResult.m[2][1] = (M2.m[0][1] * x) + (M2.m[1][1] * y) + (M2.m[2][1] * z) + (M2.m[3][1] * w); mResult.m[2][2] = (M2.m[0][2] * x) + (M2.m[1][2] * y) + (M2.m[2][2] * z) + (M2.m[3][2] * w); mResult.m[2][3] = (M2.m[0][3] * x) + (M2.m[1][3] * y) + (M2.m[2][3] * z) + (M2.m[3][3] * w); - x = M1.m[3][0]; - y = M1.m[3][1]; - z = M1.m[3][2]; - w = M1.m[3][3]; + x = M1.m[3][0]; + y = M1.m[3][1]; + z = M1.m[3][2]; + w = M1.m[3][3]; mResult.m[3][0] = (M2.m[0][0] * x) + (M2.m[1][0] * y) + (M2.m[2][0] * z) + (M2.m[3][0] * w); mResult.m[3][1] = (M2.m[0][1] * x) + (M2.m[1][1] * y) + (M2.m[2][1] * z) + (M2.m[3][1] * w); mResult.m[3][2] = (M2.m[0][2] * x) + (M2.m[1][2] * y) + (M2.m[2][2] * z) + (M2.m[3][2] * w); mResult.m[3][3] = (M2.m[0][3] * x) + (M2.m[1][3] * y) + (M2.m[2][3] * z) + (M2.m[3][3] * w); return mResult; #elif defined(_XM_ARM_NEON_INTRINSICS_) - XMMATRIX mResult; + XMMATRIX mResult; float32x2_t VL = vget_low_f32(M1.r[0]); float32x2_t VH = vget_high_f32(M1.r[0]); // Perform the operation on the first row @@ -282,40 +272,40 @@ inline XMMATRIX XM_CALLCONV XMMatrixMultiply float32x4_t vY = vmulq_lane_f32(M2.r[1], VL, 1); float32x4_t vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); float32x4_t vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); - mResult.r[0] = vaddq_f32(vZ, vW); + mResult.r[0] = vaddq_f32(vZ, vW); // Repeat for the other 3 rows - VL = vget_low_f32(M1.r[1]); - VH = vget_high_f32(M1.r[1]); - vX = vmulq_lane_f32(M2.r[0], VL, 0); - vY = vmulq_lane_f32(M2.r[1], VL, 1); - vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); - vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); + VL = vget_low_f32(M1.r[1]); + VH = vget_high_f32(M1.r[1]); + vX = vmulq_lane_f32(M2.r[0], VL, 0); + vY = vmulq_lane_f32(M2.r[1], VL, 1); + vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); + vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); mResult.r[1] = vaddq_f32(vZ, vW); - VL = vget_low_f32(M1.r[2]); - VH = vget_high_f32(M1.r[2]); - vX = vmulq_lane_f32(M2.r[0], VL, 0); - vY = vmulq_lane_f32(M2.r[1], VL, 1); - vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); - vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); + VL = vget_low_f32(M1.r[2]); + VH = vget_high_f32(M1.r[2]); + vX = vmulq_lane_f32(M2.r[0], VL, 0); + vY = vmulq_lane_f32(M2.r[1], VL, 1); + vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); + vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); mResult.r[2] = vaddq_f32(vZ, vW); - VL = vget_low_f32(M1.r[3]); - VH = vget_high_f32(M1.r[3]); - vX = vmulq_lane_f32(M2.r[0], VL, 0); - vY = vmulq_lane_f32(M2.r[1], VL, 1); - vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); - vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); + VL = vget_low_f32(M1.r[3]); + VH = vget_high_f32(M1.r[3]); + vX = vmulq_lane_f32(M2.r[0], VL, 0); + vY = vmulq_lane_f32(M2.r[1], VL, 1); + vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); + vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); mResult.r[3] = vaddq_f32(vZ, vW); return mResult; #elif defined(_XM_AVX2_INTRINSICS_) __m256 t0 = _mm256_castps128_ps256(M1.r[0]); - t0 = _mm256_insertf128_ps(t0, M1.r[1], 1); + t0 = _mm256_insertf128_ps(t0, M1.r[1], 1); __m256 t1 = _mm256_castps128_ps256(M1.r[2]); - t1 = _mm256_insertf128_ps(t1, M1.r[3], 1); + t1 = _mm256_insertf128_ps(t1, M1.r[3], 1); __m256 u0 = _mm256_castps128_ps256(M2.r[0]); - u0 = _mm256_insertf128_ps(u0, M2.r[1], 1); + u0 = _mm256_insertf128_ps(u0, M2.r[1], 1); __m256 u1 = _mm256_castps128_ps256(M2.r[2]); - u1 = _mm256_insertf128_ps(u1, M2.r[3], 1); + u1 = _mm256_insertf128_ps(u1, M2.r[3], 1); __m256 a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(0, 0, 0, 0)); __m256 a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(0, 0, 0, 0)); @@ -323,21 +313,21 @@ inline XMMATRIX XM_CALLCONV XMMatrixMultiply __m256 c0 = _mm256_mul_ps(a0, b0); __m256 c1 = _mm256_mul_ps(a1, b0); - a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(1, 1, 1, 1)); - a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(1, 1, 1, 1)); - b0 = _mm256_permute2f128_ps(u0, u0, 0x11); + a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(1, 1, 1, 1)); + a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(1, 1, 1, 1)); + b0 = _mm256_permute2f128_ps(u0, u0, 0x11); __m256 c2 = _mm256_fmadd_ps(a0, b0, c0); __m256 c3 = _mm256_fmadd_ps(a1, b0, c1); - a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(2, 2, 2, 2)); - a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(2, 2, 2, 2)); + a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(2, 2, 2, 2)); + a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(2, 2, 2, 2)); __m256 b1 = _mm256_permute2f128_ps(u1, u1, 0x00); __m256 c4 = _mm256_mul_ps(a0, b1); __m256 c5 = _mm256_mul_ps(a1, b1); - a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(3, 3, 3, 3)); - a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(3, 3, 3, 3)); - b1 = _mm256_permute2f128_ps(u1, u1, 0x11); + a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(3, 3, 3, 3)); + a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(3, 3, 3, 3)); + b1 = _mm256_permute2f128_ps(u1, u1, 0x11); __m256 c6 = _mm256_fmadd_ps(a0, b1, c4); __m256 c7 = _mm256_fmadd_ps(a1, b1, c5); @@ -364,7 +354,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixMultiply XMVECTOR vX = XM_PERMUTE_PS(vW, _MM_SHUFFLE(0, 0, 0, 0)); XMVECTOR vY = XM_PERMUTE_PS(vW, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR vZ = XM_PERMUTE_PS(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = XM_PERMUTE_PS(vW, _MM_SHUFFLE(3, 3, 3, 3)); + vW = XM_PERMUTE_PS(vW, _MM_SHUFFLE(3, 3, 3, 3)); #endif // Perform the operation on the first row vX = _mm_mul_ps(vX, M2.r[0]); @@ -372,9 +362,9 @@ inline XMMATRIX XM_CALLCONV XMMatrixMultiply vZ = _mm_mul_ps(vZ, M2.r[2]); vW = _mm_mul_ps(vW, M2.r[3]); // Perform a binary add to reduce cumulative errors - vX = _mm_add_ps(vX, vZ); - vY = _mm_add_ps(vY, vW); - vX = _mm_add_ps(vX, vY); + vX = _mm_add_ps(vX, vZ); + vY = _mm_add_ps(vY, vW); + vX = _mm_add_ps(vX, vY); mResult.r[0] = vX; // Repeat for the other 3 rows #if defined(_XM_AVX_INTRINSICS_) @@ -389,13 +379,13 @@ inline XMMATRIX XM_CALLCONV XMMatrixMultiply vZ = XM_PERMUTE_PS(vW, _MM_SHUFFLE(2, 2, 2, 2)); vW = XM_PERMUTE_PS(vW, _MM_SHUFFLE(3, 3, 3, 3)); #endif - vX = _mm_mul_ps(vX, M2.r[0]); - vY = _mm_mul_ps(vY, M2.r[1]); - vZ = _mm_mul_ps(vZ, M2.r[2]); - vW = _mm_mul_ps(vW, M2.r[3]); - vX = _mm_add_ps(vX, vZ); - vY = _mm_add_ps(vY, vW); - vX = _mm_add_ps(vX, vY); + vX = _mm_mul_ps(vX, M2.r[0]); + vY = _mm_mul_ps(vY, M2.r[1]); + vZ = _mm_mul_ps(vZ, M2.r[2]); + vW = _mm_mul_ps(vW, M2.r[3]); + vX = _mm_add_ps(vX, vZ); + vY = _mm_add_ps(vY, vW); + vX = _mm_add_ps(vX, vY); mResult.r[1] = vX; #if defined(_XM_AVX_INTRINSICS_) vX = _mm_broadcast_ss(reinterpret_cast(&M1.r[2]) + 0); @@ -409,13 +399,13 @@ inline XMMATRIX XM_CALLCONV XMMatrixMultiply vZ = XM_PERMUTE_PS(vW, _MM_SHUFFLE(2, 2, 2, 2)); vW = XM_PERMUTE_PS(vW, _MM_SHUFFLE(3, 3, 3, 3)); #endif - vX = _mm_mul_ps(vX, M2.r[0]); - vY = _mm_mul_ps(vY, M2.r[1]); - vZ = _mm_mul_ps(vZ, M2.r[2]); - vW = _mm_mul_ps(vW, M2.r[3]); - vX = _mm_add_ps(vX, vZ); - vY = _mm_add_ps(vY, vW); - vX = _mm_add_ps(vX, vY); + vX = _mm_mul_ps(vX, M2.r[0]); + vY = _mm_mul_ps(vY, M2.r[1]); + vZ = _mm_mul_ps(vZ, M2.r[2]); + vW = _mm_mul_ps(vW, M2.r[3]); + vX = _mm_add_ps(vX, vZ); + vY = _mm_add_ps(vY, vW); + vX = _mm_add_ps(vX, vY); mResult.r[2] = vX; #if defined(_XM_AVX_INTRINSICS_) vX = _mm_broadcast_ss(reinterpret_cast(&M1.r[3]) + 0); @@ -429,13 +419,13 @@ inline XMMATRIX XM_CALLCONV XMMatrixMultiply vZ = XM_PERMUTE_PS(vW, _MM_SHUFFLE(2, 2, 2, 2)); vW = XM_PERMUTE_PS(vW, _MM_SHUFFLE(3, 3, 3, 3)); #endif - vX = _mm_mul_ps(vX, M2.r[0]); - vY = _mm_mul_ps(vY, M2.r[1]); - vZ = _mm_mul_ps(vZ, M2.r[2]); - vW = _mm_mul_ps(vW, M2.r[3]); - vX = _mm_add_ps(vX, vZ); - vY = _mm_add_ps(vY, vW); - vX = _mm_add_ps(vX, vY); + vX = _mm_mul_ps(vX, M2.r[0]); + vY = _mm_mul_ps(vY, M2.r[1]); + vZ = _mm_mul_ps(vZ, M2.r[2]); + vW = _mm_mul_ps(vW, M2.r[3]); + vX = _mm_add_ps(vX, vZ); + vY = _mm_add_ps(vY, vW); + vX = _mm_add_ps(vX, vY); mResult.r[3] = vX; return mResult; #endif @@ -443,11 +433,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixMultiply //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMatrixMultiplyTranspose -( - FXMMATRIX M1, - CXMMATRIX M2 -) noexcept +inline XMMATRIX XM_CALLCONV XMMatrixMultiplyTranspose(FXMMATRIX M1, CXMMATRIX M2) noexcept { #if defined(_XM_NO_INTRINSICS_) XMMATRIX mResult; @@ -462,26 +448,26 @@ inline XMMATRIX XM_CALLCONV XMMatrixMultiplyTranspose mResult.m[0][2] = (M1.m[2][0] * x) + (M1.m[2][1] * y) + (M1.m[2][2] * z) + (M1.m[2][3] * w); mResult.m[0][3] = (M1.m[3][0] * x) + (M1.m[3][1] * y) + (M1.m[3][2] * z) + (M1.m[3][3] * w); // Repeat for all the other rows - x = M2.m[0][1]; - y = M2.m[1][1]; - z = M2.m[2][1]; - w = M2.m[3][1]; + x = M2.m[0][1]; + y = M2.m[1][1]; + z = M2.m[2][1]; + w = M2.m[3][1]; mResult.m[1][0] = (M1.m[0][0] * x) + (M1.m[0][1] * y) + (M1.m[0][2] * z) + (M1.m[0][3] * w); mResult.m[1][1] = (M1.m[1][0] * x) + (M1.m[1][1] * y) + (M1.m[1][2] * z) + (M1.m[1][3] * w); mResult.m[1][2] = (M1.m[2][0] * x) + (M1.m[2][1] * y) + (M1.m[2][2] * z) + (M1.m[2][3] * w); mResult.m[1][3] = (M1.m[3][0] * x) + (M1.m[3][1] * y) + (M1.m[3][2] * z) + (M1.m[3][3] * w); - x = M2.m[0][2]; - y = M2.m[1][2]; - z = M2.m[2][2]; - w = M2.m[3][2]; + x = M2.m[0][2]; + y = M2.m[1][2]; + z = M2.m[2][2]; + w = M2.m[3][2]; mResult.m[2][0] = (M1.m[0][0] * x) + (M1.m[0][1] * y) + (M1.m[0][2] * z) + (M1.m[0][3] * w); mResult.m[2][1] = (M1.m[1][0] * x) + (M1.m[1][1] * y) + (M1.m[1][2] * z) + (M1.m[1][3] * w); mResult.m[2][2] = (M1.m[2][0] * x) + (M1.m[2][1] * y) + (M1.m[2][2] * z) + (M1.m[2][3] * w); mResult.m[2][3] = (M1.m[3][0] * x) + (M1.m[3][1] * y) + (M1.m[3][2] * z) + (M1.m[3][3] * w); - x = M2.m[0][3]; - y = M2.m[1][3]; - z = M2.m[2][3]; - w = M2.m[3][3]; + x = M2.m[0][3]; + y = M2.m[1][3]; + z = M2.m[2][3]; + w = M2.m[3][3]; mResult.m[3][0] = (M1.m[0][0] * x) + (M1.m[0][1] * y) + (M1.m[0][2] * z) + (M1.m[0][3] * w); mResult.m[3][1] = (M1.m[1][0] * x) + (M1.m[1][1] * y) + (M1.m[1][2] * z) + (M1.m[1][3] * w); mResult.m[3][2] = (M1.m[2][0] * x) + (M1.m[2][1] * y) + (M1.m[2][2] * z) + (M1.m[2][3] * w); @@ -497,26 +483,26 @@ inline XMMATRIX XM_CALLCONV XMMatrixMultiplyTranspose float32x4_t vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); float32x4_t r0 = vaddq_f32(vZ, vW); // Repeat for the other 3 rows - VL = vget_low_f32(M1.r[1]); - VH = vget_high_f32(M1.r[1]); - vX = vmulq_lane_f32(M2.r[0], VL, 0); - vY = vmulq_lane_f32(M2.r[1], VL, 1); - vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); - vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); + VL = vget_low_f32(M1.r[1]); + VH = vget_high_f32(M1.r[1]); + vX = vmulq_lane_f32(M2.r[0], VL, 0); + vY = vmulq_lane_f32(M2.r[1], VL, 1); + vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); + vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); float32x4_t r1 = vaddq_f32(vZ, vW); - VL = vget_low_f32(M1.r[2]); - VH = vget_high_f32(M1.r[2]); - vX = vmulq_lane_f32(M2.r[0], VL, 0); - vY = vmulq_lane_f32(M2.r[1], VL, 1); - vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); - vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); + VL = vget_low_f32(M1.r[2]); + VH = vget_high_f32(M1.r[2]); + vX = vmulq_lane_f32(M2.r[0], VL, 0); + vY = vmulq_lane_f32(M2.r[1], VL, 1); + vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); + vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); float32x4_t r2 = vaddq_f32(vZ, vW); - VL = vget_low_f32(M1.r[3]); - VH = vget_high_f32(M1.r[3]); - vX = vmulq_lane_f32(M2.r[0], VL, 0); - vY = vmulq_lane_f32(M2.r[1], VL, 1); - vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); - vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); + VL = vget_low_f32(M1.r[3]); + VH = vget_high_f32(M1.r[3]); + vX = vmulq_lane_f32(M2.r[0], VL, 0); + vY = vmulq_lane_f32(M2.r[1], VL, 1); + vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); + vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); float32x4_t r3 = vaddq_f32(vZ, vW); // Transpose result @@ -534,14 +520,14 @@ inline XMMATRIX XM_CALLCONV XMMatrixMultiplyTranspose return mResult; #elif defined(_XM_AVX2_INTRINSICS_) __m256 t0 = _mm256_castps128_ps256(M1.r[0]); - t0 = _mm256_insertf128_ps(t0, M1.r[1], 1); + t0 = _mm256_insertf128_ps(t0, M1.r[1], 1); __m256 t1 = _mm256_castps128_ps256(M1.r[2]); - t1 = _mm256_insertf128_ps(t1, M1.r[3], 1); + t1 = _mm256_insertf128_ps(t1, M1.r[3], 1); __m256 u0 = _mm256_castps128_ps256(M2.r[0]); - u0 = _mm256_insertf128_ps(u0, M2.r[1], 1); + u0 = _mm256_insertf128_ps(u0, M2.r[1], 1); __m256 u1 = _mm256_castps128_ps256(M2.r[2]); - u1 = _mm256_insertf128_ps(u1, M2.r[3], 1); + u1 = _mm256_insertf128_ps(u1, M2.r[3], 1); __m256 a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(0, 0, 0, 0)); __m256 a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(0, 0, 0, 0)); @@ -549,21 +535,21 @@ inline XMMATRIX XM_CALLCONV XMMatrixMultiplyTranspose __m256 c0 = _mm256_mul_ps(a0, b0); __m256 c1 = _mm256_mul_ps(a1, b0); - a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(1, 1, 1, 1)); - a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(1, 1, 1, 1)); - b0 = _mm256_permute2f128_ps(u0, u0, 0x11); + a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(1, 1, 1, 1)); + a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(1, 1, 1, 1)); + b0 = _mm256_permute2f128_ps(u0, u0, 0x11); __m256 c2 = _mm256_fmadd_ps(a0, b0, c0); __m256 c3 = _mm256_fmadd_ps(a1, b0, c1); - a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(2, 2, 2, 2)); - a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(2, 2, 2, 2)); + a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(2, 2, 2, 2)); + a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(2, 2, 2, 2)); __m256 b1 = _mm256_permute2f128_ps(u1, u1, 0x00); __m256 c4 = _mm256_mul_ps(a0, b1); __m256 c5 = _mm256_mul_ps(a1, b1); - a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(3, 3, 3, 3)); - a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(3, 3, 3, 3)); - b1 = _mm256_permute2f128_ps(u1, u1, 0x11); + a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(3, 3, 3, 3)); + a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(3, 3, 3, 3)); + b1 = _mm256_permute2f128_ps(u1, u1, 0x11); __m256 c6 = _mm256_fmadd_ps(a0, b1, c4); __m256 c7 = _mm256_fmadd_ps(a1, b1, c5); @@ -571,14 +557,14 @@ inline XMMATRIX XM_CALLCONV XMMatrixMultiplyTranspose t1 = _mm256_add_ps(c3, c7); // Transpose result - __m256 vTemp = _mm256_unpacklo_ps(t0, t1); + __m256 vTemp = _mm256_unpacklo_ps(t0, t1); __m256 vTemp2 = _mm256_unpackhi_ps(t0, t1); __m256 vTemp3 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x20); __m256 vTemp4 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x31); - vTemp = _mm256_unpacklo_ps(vTemp3, vTemp4); - vTemp2 = _mm256_unpackhi_ps(vTemp3, vTemp4); - t0 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x20); - t1 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x31); + vTemp = _mm256_unpacklo_ps(vTemp3, vTemp4); + vTemp2 = _mm256_unpackhi_ps(vTemp3, vTemp4); + t0 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x20); + t1 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x31); XMMATRIX mResult; mResult.r[0] = _mm256_castps256_ps128(t0); @@ -599,7 +585,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixMultiplyTranspose XMVECTOR vX = XM_PERMUTE_PS(vW, _MM_SHUFFLE(0, 0, 0, 0)); XMVECTOR vY = XM_PERMUTE_PS(vW, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR vZ = XM_PERMUTE_PS(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = XM_PERMUTE_PS(vW, _MM_SHUFFLE(3, 3, 3, 3)); + vW = XM_PERMUTE_PS(vW, _MM_SHUFFLE(3, 3, 3, 3)); #endif // Perform the operation on the first row vX = _mm_mul_ps(vX, M2.r[0]); @@ -607,9 +593,9 @@ inline XMMATRIX XM_CALLCONV XMMatrixMultiplyTranspose vZ = _mm_mul_ps(vZ, M2.r[2]); vW = _mm_mul_ps(vW, M2.r[3]); // Perform a binary add to reduce cumulative errors - vX = _mm_add_ps(vX, vZ); - vY = _mm_add_ps(vY, vW); - vX = _mm_add_ps(vX, vY); + vX = _mm_add_ps(vX, vZ); + vY = _mm_add_ps(vY, vW); + vX = _mm_add_ps(vX, vY); XMVECTOR r0 = vX; // Repeat for the other 3 rows #if defined(_XM_AVX_INTRINSICS_) @@ -624,13 +610,13 @@ inline XMMATRIX XM_CALLCONV XMMatrixMultiplyTranspose vZ = XM_PERMUTE_PS(vW, _MM_SHUFFLE(2, 2, 2, 2)); vW = XM_PERMUTE_PS(vW, _MM_SHUFFLE(3, 3, 3, 3)); #endif - vX = _mm_mul_ps(vX, M2.r[0]); - vY = _mm_mul_ps(vY, M2.r[1]); - vZ = _mm_mul_ps(vZ, M2.r[2]); - vW = _mm_mul_ps(vW, M2.r[3]); - vX = _mm_add_ps(vX, vZ); - vY = _mm_add_ps(vY, vW); - vX = _mm_add_ps(vX, vY); + vX = _mm_mul_ps(vX, M2.r[0]); + vY = _mm_mul_ps(vY, M2.r[1]); + vZ = _mm_mul_ps(vZ, M2.r[2]); + vW = _mm_mul_ps(vW, M2.r[3]); + vX = _mm_add_ps(vX, vZ); + vY = _mm_add_ps(vY, vW); + vX = _mm_add_ps(vX, vY); XMVECTOR r1 = vX; #if defined(_XM_AVX_INTRINSICS_) vX = _mm_broadcast_ss(reinterpret_cast(&M1.r[2]) + 0); @@ -644,13 +630,13 @@ inline XMMATRIX XM_CALLCONV XMMatrixMultiplyTranspose vZ = XM_PERMUTE_PS(vW, _MM_SHUFFLE(2, 2, 2, 2)); vW = XM_PERMUTE_PS(vW, _MM_SHUFFLE(3, 3, 3, 3)); #endif - vX = _mm_mul_ps(vX, M2.r[0]); - vY = _mm_mul_ps(vY, M2.r[1]); - vZ = _mm_mul_ps(vZ, M2.r[2]); - vW = _mm_mul_ps(vW, M2.r[3]); - vX = _mm_add_ps(vX, vZ); - vY = _mm_add_ps(vY, vW); - vX = _mm_add_ps(vX, vY); + vX = _mm_mul_ps(vX, M2.r[0]); + vY = _mm_mul_ps(vY, M2.r[1]); + vZ = _mm_mul_ps(vZ, M2.r[2]); + vW = _mm_mul_ps(vW, M2.r[3]); + vX = _mm_add_ps(vX, vZ); + vY = _mm_add_ps(vY, vW); + vX = _mm_add_ps(vX, vY); XMVECTOR r2 = vX; #if defined(_XM_AVX_INTRINSICS_) vX = _mm_broadcast_ss(reinterpret_cast(&M1.r[3]) + 0); @@ -664,13 +650,13 @@ inline XMMATRIX XM_CALLCONV XMMatrixMultiplyTranspose vZ = XM_PERMUTE_PS(vW, _MM_SHUFFLE(2, 2, 2, 2)); vW = XM_PERMUTE_PS(vW, _MM_SHUFFLE(3, 3, 3, 3)); #endif - vX = _mm_mul_ps(vX, M2.r[0]); - vY = _mm_mul_ps(vY, M2.r[1]); - vZ = _mm_mul_ps(vZ, M2.r[2]); - vW = _mm_mul_ps(vW, M2.r[3]); - vX = _mm_add_ps(vX, vZ); - vY = _mm_add_ps(vY, vW); - vX = _mm_add_ps(vX, vY); + vX = _mm_mul_ps(vX, M2.r[0]); + vY = _mm_mul_ps(vY, M2.r[1]); + vZ = _mm_mul_ps(vZ, M2.r[2]); + vW = _mm_mul_ps(vW, M2.r[3]); + vX = _mm_add_ps(vX, vZ); + vY = _mm_add_ps(vY, vW); + vX = _mm_add_ps(vX, vY); XMVECTOR r3 = vX; // Transpose result @@ -710,10 +696,10 @@ inline XMMATRIX XM_CALLCONV XMMatrixTranspose(FXMMATRIX M) noexcept // m30m31m32m33 XMMATRIX P; - P.r[0] = XMVectorMergeXY(M.r[0], M.r[2]); // m00m20m01m21 - P.r[1] = XMVectorMergeXY(M.r[1], M.r[3]); // m10m30m11m31 - P.r[2] = XMVectorMergeZW(M.r[0], M.r[2]); // m02m22m03m23 - P.r[3] = XMVectorMergeZW(M.r[1], M.r[3]); // m12m32m13m33 + P.r[0] = XMVectorMergeXY(M.r[0], M.r[2]); // m00m20m01m21 + P.r[1] = XMVectorMergeXY(M.r[1], M.r[3]); // m10m30m11m31 + P.r[2] = XMVectorMergeZW(M.r[0], M.r[2]); // m02m22m03m23 + P.r[3] = XMVectorMergeZW(M.r[1], M.r[3]); // m12m32m13m33 XMMATRIX MT; MT.r[0] = XMVectorMergeXY(P.r[0], P.r[1]); // m00m10m20m30 @@ -737,18 +723,18 @@ inline XMMATRIX XM_CALLCONV XMMatrixTranspose(FXMMATRIX M) noexcept return mResult; #elif defined(_XM_AVX2_INTRINSICS_) __m256 t0 = _mm256_castps128_ps256(M.r[0]); - t0 = _mm256_insertf128_ps(t0, M.r[1], 1); + t0 = _mm256_insertf128_ps(t0, M.r[1], 1); __m256 t1 = _mm256_castps128_ps256(M.r[2]); - t1 = _mm256_insertf128_ps(t1, M.r[3], 1); + t1 = _mm256_insertf128_ps(t1, M.r[3], 1); - __m256 vTemp = _mm256_unpacklo_ps(t0, t1); + __m256 vTemp = _mm256_unpacklo_ps(t0, t1); __m256 vTemp2 = _mm256_unpackhi_ps(t0, t1); __m256 vTemp3 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x20); __m256 vTemp4 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x31); - vTemp = _mm256_unpacklo_ps(vTemp3, vTemp4); - vTemp2 = _mm256_unpackhi_ps(vTemp3, vTemp4); - t0 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x20); - t1 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x31); + vTemp = _mm256_unpacklo_ps(vTemp3, vTemp4); + vTemp2 = _mm256_unpackhi_ps(vTemp3, vTemp4); + t0 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x20); + t1 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x31); XMMATRIX mResult; mResult.r[0] = _mm256_castps256_ps128(t0); @@ -781,12 +767,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixTranspose(FXMMATRIX M) noexcept //------------------------------------------------------------------------------ // Return the inverse and the determinant of a 4x4 matrix -_Use_decl_annotations_ -inline XMMATRIX XM_CALLCONV XMMatrixInverse -( - XMVECTOR* pDeterminant, - FXMMATRIX M -) noexcept +_Use_decl_annotations_ inline XMMATRIX XM_CALLCONV XMMatrixInverse(XMVECTOR* pDeterminant, FXMMATRIX M) noexcept { #if defined(_XM_NO_INTRINSICS_) || defined(_XM_ARM_NEON_INTRINSICS_) @@ -853,13 +834,13 @@ inline XMMATRIX XM_CALLCONV XMMatrixInverse V1[3] = XMVectorPermute(D1, D2); XMVECTOR C1 = XMVectorNegativeMultiplySubtract(V0[0], V1[0], C0); - C0 = XMVectorMultiplyAdd(V0[0], V1[0], C0); + C0 = XMVectorMultiplyAdd(V0[0], V1[0], C0); XMVECTOR C3 = XMVectorMultiplyAdd(V0[1], V1[1], C2); - C2 = XMVectorNegativeMultiplySubtract(V0[1], V1[1], C2); + C2 = XMVectorNegativeMultiplySubtract(V0[1], V1[1], C2); XMVECTOR C5 = XMVectorNegativeMultiplySubtract(V0[2], V1[2], C4); - C4 = XMVectorMultiplyAdd(V0[2], V1[2], C4); + C4 = XMVectorMultiplyAdd(V0[2], V1[2], C4); XMVECTOR C7 = XMVectorMultiplyAdd(V0[3], V1[3], C6); - C6 = XMVectorNegativeMultiplySubtract(V0[3], V1[3], C6); + C6 = XMVectorNegativeMultiplySubtract(V0[3], V1[3], C6); XMMATRIX R; R.r[0] = XMVectorSelect(C0, C1, g_XMSelect0101.v); @@ -923,10 +904,10 @@ inline XMMATRIX XM_CALLCONV XMMatrixInverse V11 = _mm_shuffle_ps(V11, D0, _MM_SHUFFLE(2, 1, 2, 1)); // V13 = D1Y,D1W,D2W,D2W XMVECTOR V13 = _mm_shuffle_ps(D1, D2, _MM_SHUFFLE(3, 3, 3, 1)); - V02 = XM_PERMUTE_PS(MT.r[3], _MM_SHUFFLE(1, 0, 2, 1)); - V12 = _mm_shuffle_ps(V13, D1, _MM_SHUFFLE(0, 3, 0, 2)); + V02 = XM_PERMUTE_PS(MT.r[3], _MM_SHUFFLE(1, 0, 2, 1)); + V12 = _mm_shuffle_ps(V13, D1, _MM_SHUFFLE(0, 3, 0, 2)); XMVECTOR V03 = XM_PERMUTE_PS(MT.r[2], _MM_SHUFFLE(0, 1, 0, 2)); - V13 = _mm_shuffle_ps(V13, D1, _MM_SHUFFLE(2, 1, 2, 1)); + V13 = _mm_shuffle_ps(V13, D1, _MM_SHUFFLE(2, 1, 2, 1)); XMVECTOR C0 = _mm_mul_ps(V00, V10); XMVECTOR C2 = _mm_mul_ps(V01, V11); @@ -968,18 +949,18 @@ inline XMMATRIX XM_CALLCONV XMMatrixInverse V13 = _mm_shuffle_ps(D1, D2, _MM_SHUFFLE(3, 2, 3, 0)); V13 = XM_PERMUTE_PS(V13, _MM_SHUFFLE(2, 1, 0, 3)); - V00 = _mm_mul_ps(V00, V10); - V01 = _mm_mul_ps(V01, V11); - V02 = _mm_mul_ps(V02, V12); - V03 = _mm_mul_ps(V03, V13); + V00 = _mm_mul_ps(V00, V10); + V01 = _mm_mul_ps(V01, V11); + V02 = _mm_mul_ps(V02, V12); + V03 = _mm_mul_ps(V03, V13); XMVECTOR C1 = _mm_sub_ps(C0, V00); - C0 = _mm_add_ps(C0, V00); + C0 = _mm_add_ps(C0, V00); XMVECTOR C3 = _mm_add_ps(C2, V01); - C2 = _mm_sub_ps(C2, V01); + C2 = _mm_sub_ps(C2, V01); XMVECTOR C5 = _mm_sub_ps(C4, V02); - C4 = _mm_add_ps(C4, V02); + C4 = _mm_add_ps(C4, V02); XMVECTOR C7 = _mm_add_ps(C6, V03); - C6 = _mm_sub_ps(C6, V03); + C6 = _mm_sub_ps(C6, V03); C0 = _mm_shuffle_ps(C0, C1, _MM_SHUFFLE(3, 1, 2, 0)); C2 = _mm_shuffle_ps(C2, C3, _MM_SHUFFLE(3, 1, 2, 0)); @@ -1005,11 +986,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixInverse //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMatrixVectorTensorProduct -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMMATRIX XM_CALLCONV XMMatrixVectorTensorProduct(FXMVECTOR V1, FXMVECTOR V2) noexcept { XMMATRIX mResult; mResult.r[0] = XMVectorMultiply(XMVectorSwizzle<0, 0, 0, 0>(V1), V2); @@ -1053,78 +1030,68 @@ inline XMVECTOR XM_CALLCONV XMMatrixDeterminant(FXMMATRIX M) noexcept XMVECTOR S = XMVectorMultiply(M.r[0], Sign.v); XMVECTOR R = XMVectorMultiply(V0, P0); - R = XMVectorNegativeMultiplySubtract(V1, P1, R); - R = XMVectorMultiplyAdd(V2, P2, R); + R = XMVectorNegativeMultiplySubtract(V1, P1, R); + R = XMVectorMultiplyAdd(V2, P2, R); return XMVector4Dot(S, R); } -#define XM3RANKDECOMPOSE(a, b, c, x, y, z) \ - if((x) < (y)) \ - { \ - if((y) < (z)) \ - { \ - (a) = 2; \ - (b) = 1; \ - (c) = 0; \ - } \ - else \ - { \ - (a) = 1; \ - \ - if((x) < (z)) \ - { \ - (b) = 2; \ - (c) = 0; \ - } \ - else \ - { \ - (b) = 0; \ - (c) = 2; \ - } \ - } \ - } \ - else \ - { \ - if((x) < (z)) \ - { \ - (a) = 2; \ - (b) = 0; \ - (c) = 1; \ - } \ - else \ - { \ - (a) = 0; \ - \ - if((y) < (z)) \ - { \ - (b) = 2; \ - (c) = 1; \ - } \ - else \ - { \ - (b) = 1; \ - (c) = 2; \ - } \ - } \ +#define XM3RANKDECOMPOSE(a, b, c, x, y, z) \ + if ((x) < (y)) \ + { \ + if ((y) < (z)) \ + { \ + (a) = 2; \ + (b) = 1; \ + (c) = 0; \ + } \ + else \ + { \ + (a) = 1; \ + \ + if ((x) < (z)) \ + { \ + (b) = 2; \ + (c) = 0; \ + } \ + else \ + { \ + (b) = 0; \ + (c) = 2; \ + } \ + } \ + } \ + else \ + { \ + if ((x) < (z)) \ + { \ + (a) = 2; \ + (b) = 0; \ + (c) = 1; \ + } \ + else \ + { \ + (a) = 0; \ + \ + if ((y) < (z)) \ + { \ + (b) = 2; \ + (c) = 1; \ + } \ + else \ + { \ + (b) = 1; \ + (c) = 2; \ + } \ + } \ } #define XM3_DECOMP_EPSILON 0.0001f -_Use_decl_annotations_ -inline bool XM_CALLCONV XMMatrixDecompose -( - XMVECTOR* outScale, - XMVECTOR* outRotQuat, - XMVECTOR* outTrans, - FXMMATRIX M -) noexcept +_Use_decl_annotations_ inline bool + XM_CALLCONV XMMatrixDecompose(XMVECTOR* outScale, XMVECTOR* outRotQuat, XMVECTOR* outTrans, FXMMATRIX M) noexcept { - static const XMVECTOR* pvCanonicalBasis[3] = { - &g_XMIdentityR0.v, - &g_XMIdentityR1.v, - &g_XMIdentityR2.v - }; + static const XMVECTOR* pvCanonicalBasis[3] = { &g_XMIdentityR0.v, &g_XMIdentityR1.v, &g_XMIdentityR2.v }; assert(outScale != nullptr); assert(outRotQuat != nullptr); @@ -1134,7 +1101,7 @@ inline bool XM_CALLCONV XMMatrixDecompose outTrans[0] = M.r[3]; XMVECTOR* ppvBasis[3]; - XMMATRIX matTemp; + XMMATRIX matTemp; ppvBasis[0] = &matTemp.r[0]; ppvBasis[1] = &matTemp.r[1]; ppvBasis[2] = &matTemp.r[2]; @@ -1154,16 +1121,16 @@ inline bool XM_CALLCONV XMMatrixDecompose XM3RANKDECOMPOSE(a, b, c, pfScales[0], pfScales[1], pfScales[2]) - if (pfScales[a] < XM3_DECOMP_EPSILON) - { - ppvBasis[a][0] = pvCanonicalBasis[a][0]; - } + if (pfScales[a] < XM3_DECOMP_EPSILON) + { + ppvBasis[a][0] = pvCanonicalBasis[a][0]; + } ppvBasis[a][0] = XMVector3Normalize(ppvBasis[a][0]); if (pfScales[b] < XM3_DECOMP_EPSILON) { size_t aa, bb, cc; - float fAbsX, fAbsY, fAbsZ; + float fAbsX, fAbsY, fAbsZ; fAbsX = fabsf(XMVectorGetX(ppvBasis[a][0])); fAbsY = fabsf(XMVectorGetY(ppvBasis[a][0])); @@ -1171,7 +1138,7 @@ inline bool XM_CALLCONV XMMatrixDecompose XM3RANKDECOMPOSE(aa, bb, cc, fAbsX, fAbsY, fAbsZ) - ppvBasis[b][0] = XMVector3Cross(ppvBasis[a][0], pvCanonicalBasis[cc][0]); + ppvBasis[b][0] = XMVector3Cross(ppvBasis[a][0], pvCanonicalBasis[cc][0]); } ppvBasis[b][0] = XMVector3Normalize(ppvBasis[b][0]); @@ -1189,7 +1156,7 @@ inline bool XM_CALLCONV XMMatrixDecompose if (fDet < 0.0f) { // switch coordinate system by negating the scale and inverting the basis vector on the x-axis - pfScales[a] = -pfScales[a]; + pfScales[a] = -pfScales[a]; ppvBasis[a][0] = XMVectorNegate(ppvBasis[a][0]); fDet = -fDet; @@ -1230,20 +1197,41 @@ inline XMMATRIX XM_CALLCONV XMMatrixIdentity() noexcept //------------------------------------------------------------------------------ -inline 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 +inline 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 M; #if defined(_XM_NO_INTRINSICS_) - M.m[0][0] = m00; M.m[0][1] = m01; M.m[0][2] = m02; M.m[0][3] = m03; - M.m[1][0] = m10; M.m[1][1] = m11; M.m[1][2] = m12; M.m[1][3] = m13; - M.m[2][0] = m20; M.m[2][1] = m21; M.m[2][2] = m22; M.m[2][3] = m23; - M.m[3][0] = m30; M.m[3][1] = m31; M.m[3][2] = m32; M.m[3][3] = m33; + M.m[0][0] = m00; + M.m[0][1] = m01; + M.m[0][2] = m02; + M.m[0][3] = m03; + M.m[1][0] = m10; + M.m[1][1] = m11; + M.m[1][2] = m12; + M.m[1][3] = m13; + M.m[2][0] = m20; + M.m[2][1] = m21; + M.m[2][2] = m22; + M.m[2][3] = m23; + M.m[3][0] = m30; + M.m[3][1] = m31; + M.m[3][2] = m32; + M.m[3][3] = m33; #else M.r[0] = XMVectorSet(m00, m01, m02, m03); M.r[1] = XMVectorSet(m10, m11, m12, m13); @@ -1255,12 +1243,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixSet //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMatrixTranslation -( - float OffsetX, - float OffsetY, - float OffsetZ -) noexcept +inline XMMATRIX XM_CALLCONV XMMatrixTranslation(float OffsetX, float OffsetY, float OffsetZ) noexcept { #if defined(_XM_NO_INTRINSICS_) @@ -1296,7 +1279,6 @@ inline XMMATRIX XM_CALLCONV XMMatrixTranslation #endif } - //------------------------------------------------------------------------------ inline XMMATRIX XM_CALLCONV XMMatrixTranslationFromVector(FXMVECTOR Offset) noexcept @@ -1337,12 +1319,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixTranslationFromVector(FXMVECTOR Offset) noex //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMatrixScaling -( - float ScaleX, - float ScaleY, - float ScaleZ -) noexcept +inline XMMATRIX XM_CALLCONV XMMatrixScaling(float ScaleX, float ScaleY, float ScaleZ) noexcept { #if defined(_XM_NO_INTRINSICS_) @@ -1370,7 +1347,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixScaling #elif defined(_XM_ARM_NEON_INTRINSICS_) const XMVECTOR Zero = vdupq_n_f32(0); - XMMATRIX M; + XMMATRIX M; M.r[0] = vsetq_lane_f32(ScaleX, Zero, 0); M.r[1] = vsetq_lane_f32(ScaleY, Zero, 1); M.r[2] = vsetq_lane_f32(ScaleZ, Zero, 2); @@ -1437,8 +1414,8 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationX(float Angle) noexcept { #if defined(_XM_NO_INTRINSICS_) - float fSinAngle; - float fCosAngle; + float fSinAngle; + float fCosAngle; XMScalarSinCos(&fSinAngle, &fCosAngle, Angle); XMMATRIX M; @@ -1464,17 +1441,17 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationX(float Angle) noexcept return M; #elif defined(_XM_ARM_NEON_INTRINSICS_) - float fSinAngle; - float fCosAngle; + float fSinAngle; + float fCosAngle; XMScalarSinCos(&fSinAngle, &fCosAngle, Angle); const float32x4_t Zero = vdupq_n_f32(0); float32x4_t T1 = vsetq_lane_f32(fCosAngle, Zero, 1); - T1 = vsetq_lane_f32(fSinAngle, T1, 2); + T1 = vsetq_lane_f32(fSinAngle, T1, 2); float32x4_t T2 = vsetq_lane_f32(-fSinAngle, Zero, 1); - T2 = vsetq_lane_f32(fCosAngle, T2, 2); + T2 = vsetq_lane_f32(fCosAngle, T2, 2); XMMATRIX M; M.r[0] = g_XMIdentityR0.v; @@ -1483,8 +1460,8 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationX(float Angle) noexcept M.r[3] = g_XMIdentityR3.v; return M; #elif defined(_XM_SSE_INTRINSICS_) - float SinAngle; - float CosAngle; + float SinAngle; + float CosAngle; XMScalarSinCos(&SinAngle, &CosAngle, Angle); XMVECTOR vSin = _mm_set_ss(SinAngle); @@ -1497,7 +1474,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationX(float Angle) noexcept // x = 0,y = sin,z = cos, w = 0 vCos = XM_PERMUTE_PS(vCos, _MM_SHUFFLE(3, 1, 2, 0)); // x = 0,y = -sin,z = cos, w = 0 - vCos = _mm_mul_ps(vCos, g_XMNegateY); + vCos = _mm_mul_ps(vCos, g_XMNegateY); M.r[2] = vCos; M.r[3] = g_XMIdentityR3; return M; @@ -1510,8 +1487,8 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationY(float Angle) noexcept { #if defined(_XM_NO_INTRINSICS_) - float fSinAngle; - float fCosAngle; + float fSinAngle; + float fCosAngle; XMScalarSinCos(&fSinAngle, &fCosAngle, Angle); XMMATRIX M; @@ -1537,17 +1514,17 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationY(float Angle) noexcept return M; #elif defined(_XM_ARM_NEON_INTRINSICS_) - float fSinAngle; - float fCosAngle; + float fSinAngle; + float fCosAngle; XMScalarSinCos(&fSinAngle, &fCosAngle, Angle); const float32x4_t Zero = vdupq_n_f32(0); float32x4_t T0 = vsetq_lane_f32(fCosAngle, Zero, 0); - T0 = vsetq_lane_f32(-fSinAngle, T0, 2); + T0 = vsetq_lane_f32(-fSinAngle, T0, 2); float32x4_t T2 = vsetq_lane_f32(fSinAngle, Zero, 0); - T2 = vsetq_lane_f32(fCosAngle, T2, 2); + T2 = vsetq_lane_f32(fCosAngle, T2, 2); XMMATRIX M; M.r[0] = T0; @@ -1556,8 +1533,8 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationY(float Angle) noexcept M.r[3] = g_XMIdentityR3.v; return M; #elif defined(_XM_SSE_INTRINSICS_) - float SinAngle; - float CosAngle; + float SinAngle; + float CosAngle; XMScalarSinCos(&SinAngle, &CosAngle, Angle); XMVECTOR vSin = _mm_set_ss(SinAngle); @@ -1570,7 +1547,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationY(float Angle) noexcept // x = cos,y = 0,z = sin, w = 0 vSin = XM_PERMUTE_PS(vSin, _MM_SHUFFLE(3, 0, 1, 2)); // x = cos,y = 0,z = -sin, w = 0 - vSin = _mm_mul_ps(vSin, g_XMNegateZ); + vSin = _mm_mul_ps(vSin, g_XMNegateZ); M.r[0] = vSin; M.r[3] = g_XMIdentityR3; return M; @@ -1583,8 +1560,8 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationZ(float Angle) noexcept { #if defined(_XM_NO_INTRINSICS_) - float fSinAngle; - float fCosAngle; + float fSinAngle; + float fCosAngle; XMScalarSinCos(&fSinAngle, &fCosAngle, Angle); XMMATRIX M; @@ -1610,17 +1587,17 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationZ(float Angle) noexcept return M; #elif defined(_XM_ARM_NEON_INTRINSICS_) - float fSinAngle; - float fCosAngle; + float fSinAngle; + float fCosAngle; XMScalarSinCos(&fSinAngle, &fCosAngle, Angle); const float32x4_t Zero = vdupq_n_f32(0); float32x4_t T0 = vsetq_lane_f32(fCosAngle, Zero, 0); - T0 = vsetq_lane_f32(fSinAngle, T0, 1); + T0 = vsetq_lane_f32(fSinAngle, T0, 1); float32x4_t T1 = vsetq_lane_f32(-fSinAngle, Zero, 0); - T1 = vsetq_lane_f32(fCosAngle, T1, 1); + T1 = vsetq_lane_f32(fCosAngle, T1, 1); XMMATRIX M; M.r[0] = T0; @@ -1629,8 +1606,8 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationZ(float Angle) noexcept M.r[3] = g_XMIdentityR3.v; return M; #elif defined(_XM_SSE_INTRINSICS_) - float SinAngle; - float CosAngle; + float SinAngle; + float CosAngle; XMScalarSinCos(&SinAngle, &CosAngle, Angle); XMVECTOR vSin = _mm_set_ss(SinAngle); @@ -1642,7 +1619,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationZ(float Angle) noexcept // x = sin,y = cos,z = 0, w = 0 vCos = XM_PERMUTE_PS(vCos, _MM_SHUFFLE(3, 2, 0, 1)); // x = cos,y = -sin,z = 0, w = 0 - vCos = _mm_mul_ps(vCos, g_XMNegateX); + vCos = _mm_mul_ps(vCos, g_XMNegateX); M.r[1] = vCos; M.r[2] = g_XMIdentityR2; M.r[3] = g_XMIdentityR3; @@ -1652,12 +1629,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationZ(float Angle) noexcept //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMatrixRotationRollPitchYaw -( - float Pitch, - float Yaw, - float Roll -) noexcept +inline XMMATRIX XM_CALLCONV XMMatrixRotationRollPitchYaw(float Pitch, float Yaw, float Roll) noexcept { #if defined(_XM_NO_INTRINSICS_) float cp = cosf(Pitch); @@ -1698,10 +1670,8 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationRollPitchYaw //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMatrixRotationRollPitchYawFromVector -( - FXMVECTOR Angles // -) noexcept +inline XMMATRIX XM_CALLCONV XMMatrixRotationRollPitchYawFromVector(FXMVECTOR Angles // + ) noexcept { #if defined(_XM_NO_INTRINSICS_) float cp = cosf(Angles.vector4_f32[0]); @@ -1735,7 +1705,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationRollPitchYawFromVector M.m[3][3] = 1.0f; return M; #else - static const XMVECTORF32 Sign = { { { 1.0f, -1.0f, -1.0f, 1.0f } } }; + static const XMVECTORF32 Sign = { { { 1.0f, -1.0f, -1.0f, 1.0f } } }; XMVECTOR SinAngles, CosAngles; XMVectorSinCos(&SinAngles, &CosAngles, Angles); @@ -1751,9 +1721,9 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationRollPitchYawFromVector XMVECTOR Q0 = XMVectorMultiply(P0, Y0); XMVECTOR Q1 = XMVectorMultiply(P1, Sign.v); - Q1 = XMVectorMultiply(Q1, Y1); + Q1 = XMVectorMultiply(Q1, Y1); XMVECTOR Q2 = XMVectorMultiply(P2, Y2); - Q2 = XMVectorMultiplyAdd(Q2, P3, Q1); + Q2 = XMVectorMultiplyAdd(Q2, P3, Q1); XMVECTOR V0 = XMVectorPermute(Q0, Q2); XMVECTOR V1 = XMVectorPermute(Q0, Q2); @@ -1770,16 +1740,12 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationRollPitchYawFromVector //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMatrixRotationNormal -( - FXMVECTOR NormalAxis, - float Angle -) noexcept +inline XMMATRIX XM_CALLCONV XMMatrixRotationNormal(FXMVECTOR NormalAxis, float Angle) noexcept { #if defined(_XM_NO_INTRINSICS_) || defined(_XM_ARM_NEON_INTRINSICS_) - float fSinAngle; - float fCosAngle; + float fSinAngle; + float fCosAngle; XMScalarSinCos(&fSinAngle, &fCosAngle, Angle); XMVECTOR A = XMVectorSet(fSinAngle, fCosAngle, 1.0f - fCosAngle, 0.0f); @@ -1792,15 +1758,15 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationNormal XMVECTOR N1 = XMVectorSwizzle(NormalAxis); XMVECTOR V0 = XMVectorMultiply(C2, N0); - V0 = XMVectorMultiply(V0, N1); + V0 = XMVectorMultiply(V0, N1); XMVECTOR R0 = XMVectorMultiply(C2, NormalAxis); - R0 = XMVectorMultiplyAdd(R0, NormalAxis, C1); + R0 = XMVectorMultiplyAdd(R0, NormalAxis, C1); XMVECTOR R1 = XMVectorMultiplyAdd(C0, NormalAxis, V0); XMVECTOR R2 = XMVectorNegativeMultiplySubtract(C0, NormalAxis, V0); - V0 = XMVectorSelect(A, R0, g_XMSelect1110.v); + V0 = XMVectorSelect(A, R0, g_XMSelect1110.v); XMVECTOR V1 = XMVectorPermute(R1, R2); XMVECTOR V2 = XMVectorPermute(R1, R2); @@ -1812,8 +1778,8 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationNormal return M; #elif defined(_XM_SSE_INTRINSICS_) - float fSinAngle; - float fCosAngle; + float fSinAngle; + float fCosAngle; XMScalarSinCos(&fSinAngle, &fCosAngle, Angle); XMVECTOR C2 = _mm_set_ps1(1.0f - fCosAngle); @@ -1824,22 +1790,22 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationNormal XMVECTOR N1 = XM_PERMUTE_PS(NormalAxis, _MM_SHUFFLE(3, 1, 0, 2)); XMVECTOR V0 = _mm_mul_ps(C2, N0); - V0 = _mm_mul_ps(V0, N1); + V0 = _mm_mul_ps(V0, N1); XMVECTOR R0 = _mm_mul_ps(C2, NormalAxis); - R0 = _mm_mul_ps(R0, NormalAxis); - R0 = _mm_add_ps(R0, C1); + R0 = _mm_mul_ps(R0, NormalAxis); + R0 = _mm_add_ps(R0, C1); XMVECTOR R1 = _mm_mul_ps(C0, NormalAxis); - R1 = _mm_add_ps(R1, V0); + R1 = _mm_add_ps(R1, V0); XMVECTOR R2 = _mm_mul_ps(C0, NormalAxis); - R2 = _mm_sub_ps(V0, R2); + R2 = _mm_sub_ps(V0, R2); - V0 = _mm_and_ps(R0, g_XMMask3); + V0 = _mm_and_ps(R0, g_XMMask3); XMVECTOR V1 = _mm_shuffle_ps(R1, R2, _MM_SHUFFLE(2, 1, 2, 0)); - V1 = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 3, 2, 1)); + V1 = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 3, 2, 1)); XMVECTOR V2 = _mm_shuffle_ps(R1, R2, _MM_SHUFFLE(0, 0, 1, 1)); - V2 = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 0, 2, 0)); + V2 = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 0, 2, 0)); R2 = _mm_shuffle_ps(V0, V1, _MM_SHUFFLE(1, 0, 3, 0)); R2 = XM_PERMUTE_PS(R2, _MM_SHUFFLE(1, 3, 2, 0)); @@ -1847,11 +1813,11 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationNormal XMMATRIX M; M.r[0] = R2; - R2 = _mm_shuffle_ps(V0, V1, _MM_SHUFFLE(3, 2, 3, 1)); - R2 = XM_PERMUTE_PS(R2, _MM_SHUFFLE(1, 3, 0, 2)); + R2 = _mm_shuffle_ps(V0, V1, _MM_SHUFFLE(3, 2, 3, 1)); + R2 = XM_PERMUTE_PS(R2, _MM_SHUFFLE(1, 3, 0, 2)); M.r[1] = R2; - V2 = _mm_shuffle_ps(V2, V0, _MM_SHUFFLE(3, 2, 1, 0)); + V2 = _mm_shuffle_ps(V2, V0, _MM_SHUFFLE(3, 2, 1, 0)); M.r[2] = V2; M.r[3] = g_XMIdentityR3.v; return M; @@ -1860,11 +1826,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationNormal //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMatrixRotationAxis -( - FXMVECTOR Axis, - float Angle -) noexcept +inline XMMATRIX XM_CALLCONV XMMatrixRotationAxis(FXMVECTOR Axis, float Angle) noexcept { assert(!XMVector3Equal(Axis, XMVectorZero())); assert(!XMVector3IsInfinite(Axis)); @@ -1879,13 +1841,13 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationQuaternion(FXMVECTOR Quaternion) noe { #if defined(_XM_NO_INTRINSICS_) - float qx = Quaternion.vector4_f32[0]; + float qx = Quaternion.vector4_f32[0]; float qxx = qx * qx; - float qy = Quaternion.vector4_f32[1]; + float qy = Quaternion.vector4_f32[1]; float qyy = qy * qy; - float qz = Quaternion.vector4_f32[2]; + float qz = Quaternion.vector4_f32[2]; float qzz = qz * qz; float qw = Quaternion.vector4_f32[3]; @@ -1921,15 +1883,15 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationQuaternion(FXMVECTOR Quaternion) noe XMVECTOR V0 = XMVectorPermute(Q1, Constant1110.v); XMVECTOR V1 = XMVectorPermute(Q1, Constant1110.v); XMVECTOR R0 = XMVectorSubtract(Constant1110, V0); - R0 = XMVectorSubtract(R0, V1); + R0 = XMVectorSubtract(R0, V1); V0 = XMVectorSwizzle(Quaternion); V1 = XMVectorSwizzle(Q0); V0 = XMVectorMultiply(V0, V1); - V1 = XMVectorSplatW(Quaternion); + V1 = XMVectorSplatW(Quaternion); XMVECTOR V2 = XMVectorSwizzle(Q0); - V1 = XMVectorMultiply(V1, V2); + V1 = XMVectorMultiply(V1, V2); XMVECTOR R1 = XMVectorAdd(V0, V1); XMVECTOR R2 = XMVectorSubtract(V0, V1); @@ -1945,25 +1907,25 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationQuaternion(FXMVECTOR Quaternion) noe return M; #elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 Constant1110 = { { { 1.0f, 1.0f, 1.0f, 0.0f } } }; + static const XMVECTORF32 Constant1110 = { { { 1.0f, 1.0f, 1.0f, 0.0f } } }; XMVECTOR Q0 = _mm_add_ps(Quaternion, Quaternion); XMVECTOR Q1 = _mm_mul_ps(Quaternion, Q0); XMVECTOR V0 = XM_PERMUTE_PS(Q1, _MM_SHUFFLE(3, 0, 0, 1)); - V0 = _mm_and_ps(V0, g_XMMask3); + V0 = _mm_and_ps(V0, g_XMMask3); XMVECTOR V1 = XM_PERMUTE_PS(Q1, _MM_SHUFFLE(3, 1, 2, 2)); - V1 = _mm_and_ps(V1, g_XMMask3); + V1 = _mm_and_ps(V1, g_XMMask3); XMVECTOR R0 = _mm_sub_ps(Constant1110, V0); - R0 = _mm_sub_ps(R0, V1); + R0 = _mm_sub_ps(R0, V1); V0 = XM_PERMUTE_PS(Quaternion, _MM_SHUFFLE(3, 1, 0, 0)); V1 = XM_PERMUTE_PS(Q0, _MM_SHUFFLE(3, 2, 1, 2)); V0 = _mm_mul_ps(V0, V1); - V1 = XM_PERMUTE_PS(Quaternion, _MM_SHUFFLE(3, 3, 3, 3)); + V1 = XM_PERMUTE_PS(Quaternion, _MM_SHUFFLE(3, 3, 3, 3)); XMVECTOR V2 = XM_PERMUTE_PS(Q0, _MM_SHUFFLE(3, 0, 2, 1)); - V1 = _mm_mul_ps(V1, V2); + V1 = _mm_mul_ps(V1, V2); XMVECTOR R1 = _mm_add_ps(V0, V1); XMVECTOR R2 = _mm_sub_ps(V0, V1); @@ -1979,11 +1941,11 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationQuaternion(FXMVECTOR Quaternion) noe XMMATRIX M; M.r[0] = Q1; - Q1 = _mm_shuffle_ps(R0, V0, _MM_SHUFFLE(3, 2, 3, 1)); - Q1 = XM_PERMUTE_PS(Q1, _MM_SHUFFLE(1, 3, 0, 2)); + Q1 = _mm_shuffle_ps(R0, V0, _MM_SHUFFLE(3, 2, 3, 1)); + Q1 = XM_PERMUTE_PS(Q1, _MM_SHUFFLE(1, 3, 0, 2)); M.r[1] = Q1; - Q1 = _mm_shuffle_ps(V1, R0, _MM_SHUFFLE(3, 2, 1, 0)); + Q1 = _mm_shuffle_ps(V1, R0, _MM_SHUFFLE(3, 2, 1, 0)); M.r[2] = Q1; M.r[3] = g_XMIdentityR3; return M; @@ -1992,76 +1954,70 @@ inline XMMATRIX XM_CALLCONV XMMatrixRotationQuaternion(FXMVECTOR Quaternion) noe //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMatrixTransformation2D -( - FXMVECTOR ScalingOrigin, - float ScalingOrientation, - FXMVECTOR Scaling, - FXMVECTOR RotationOrigin, - float Rotation, - GXMVECTOR Translation -) noexcept +inline XMMATRIX XM_CALLCONV XMMatrixTransformation2D(FXMVECTOR ScalingOrigin, + float ScalingOrientation, + FXMVECTOR Scaling, + FXMVECTOR RotationOrigin, + float Rotation, + GXMVECTOR Translation) noexcept { // M = Inverse(MScalingOrigin) * Transpose(MScalingOrientation) * MScaling * MScalingOrientation * // MScalingOrigin * Inverse(MRotationOrigin) * MRotation * MRotationOrigin * MTranslation; - XMVECTOR VScalingOrigin = XMVectorSelect(g_XMSelect1100.v, ScalingOrigin, g_XMSelect1100.v); + XMVECTOR VScalingOrigin = XMVectorSelect(g_XMSelect1100.v, ScalingOrigin, g_XMSelect1100.v); XMVECTOR NegScalingOrigin = XMVectorNegate(VScalingOrigin); - XMMATRIX MScalingOriginI = XMMatrixTranslationFromVector(NegScalingOrigin); - XMMATRIX MScalingOrientation = XMMatrixRotationZ(ScalingOrientation); + XMMATRIX MScalingOriginI = XMMatrixTranslationFromVector(NegScalingOrigin); + XMMATRIX MScalingOrientation = XMMatrixRotationZ(ScalingOrientation); XMMATRIX MScalingOrientationT = XMMatrixTranspose(MScalingOrientation); - XMVECTOR VScaling = XMVectorSelect(g_XMOne.v, Scaling, g_XMSelect1100.v); - XMMATRIX MScaling = XMMatrixScalingFromVector(VScaling); - XMVECTOR VRotationOrigin = XMVectorSelect(g_XMSelect1100.v, RotationOrigin, g_XMSelect1100.v); - XMMATRIX MRotation = XMMatrixRotationZ(Rotation); - XMVECTOR VTranslation = XMVectorSelect(g_XMSelect1100.v, Translation, g_XMSelect1100.v); + XMVECTOR VScaling = XMVectorSelect(g_XMOne.v, Scaling, g_XMSelect1100.v); + XMMATRIX MScaling = XMMatrixScalingFromVector(VScaling); + XMVECTOR VRotationOrigin = XMVectorSelect(g_XMSelect1100.v, RotationOrigin, g_XMSelect1100.v); + XMMATRIX MRotation = XMMatrixRotationZ(Rotation); + XMVECTOR VTranslation = XMVectorSelect(g_XMSelect1100.v, Translation, g_XMSelect1100.v); XMMATRIX M = XMMatrixMultiply(MScalingOriginI, MScalingOrientationT); - M = XMMatrixMultiply(M, MScaling); - M = XMMatrixMultiply(M, MScalingOrientation); - M.r[3] = XMVectorAdd(M.r[3], VScalingOrigin); - M.r[3] = XMVectorSubtract(M.r[3], VRotationOrigin); - M = XMMatrixMultiply(M, MRotation); - M.r[3] = XMVectorAdd(M.r[3], VRotationOrigin); - M.r[3] = XMVectorAdd(M.r[3], VTranslation); + M = XMMatrixMultiply(M, MScaling); + M = XMMatrixMultiply(M, MScalingOrientation); + M.r[3] = XMVectorAdd(M.r[3], VScalingOrigin); + M.r[3] = XMVectorSubtract(M.r[3], VRotationOrigin); + M = XMMatrixMultiply(M, MRotation); + M.r[3] = XMVectorAdd(M.r[3], VRotationOrigin); + M.r[3] = XMVectorAdd(M.r[3], VTranslation); return M; } //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMatrixTransformation -( - FXMVECTOR ScalingOrigin, - FXMVECTOR ScalingOrientationQuaternion, - FXMVECTOR Scaling, - GXMVECTOR RotationOrigin, - HXMVECTOR RotationQuaternion, - HXMVECTOR Translation -) noexcept +inline XMMATRIX XM_CALLCONV XMMatrixTransformation(FXMVECTOR ScalingOrigin, + FXMVECTOR ScalingOrientationQuaternion, + FXMVECTOR Scaling, + GXMVECTOR RotationOrigin, + HXMVECTOR RotationQuaternion, + HXMVECTOR Translation) noexcept { // M = Inverse(MScalingOrigin) * Transpose(MScalingOrientation) * MScaling * MScalingOrientation * // MScalingOrigin * Inverse(MRotationOrigin) * MRotation * MRotationOrigin * MTranslation; - XMVECTOR VScalingOrigin = XMVectorSelect(g_XMSelect1110.v, ScalingOrigin, g_XMSelect1110.v); + XMVECTOR VScalingOrigin = XMVectorSelect(g_XMSelect1110.v, ScalingOrigin, g_XMSelect1110.v); XMVECTOR NegScalingOrigin = XMVectorNegate(ScalingOrigin); - XMMATRIX MScalingOriginI = XMMatrixTranslationFromVector(NegScalingOrigin); - XMMATRIX MScalingOrientation = XMMatrixRotationQuaternion(ScalingOrientationQuaternion); + XMMATRIX MScalingOriginI = XMMatrixTranslationFromVector(NegScalingOrigin); + XMMATRIX MScalingOrientation = XMMatrixRotationQuaternion(ScalingOrientationQuaternion); XMMATRIX MScalingOrientationT = XMMatrixTranspose(MScalingOrientation); - XMMATRIX MScaling = XMMatrixScalingFromVector(Scaling); - XMVECTOR VRotationOrigin = XMVectorSelect(g_XMSelect1110.v, RotationOrigin, g_XMSelect1110.v); - XMMATRIX MRotation = XMMatrixRotationQuaternion(RotationQuaternion); - XMVECTOR VTranslation = XMVectorSelect(g_XMSelect1110.v, Translation, g_XMSelect1110.v); + XMMATRIX MScaling = XMMatrixScalingFromVector(Scaling); + XMVECTOR VRotationOrigin = XMVectorSelect(g_XMSelect1110.v, RotationOrigin, g_XMSelect1110.v); + XMMATRIX MRotation = XMMatrixRotationQuaternion(RotationQuaternion); + XMVECTOR VTranslation = XMVectorSelect(g_XMSelect1110.v, Translation, g_XMSelect1110.v); XMMATRIX M; - M = XMMatrixMultiply(MScalingOriginI, MScalingOrientationT); - M = XMMatrixMultiply(M, MScaling); - M = XMMatrixMultiply(M, MScalingOrientation); + M = XMMatrixMultiply(MScalingOriginI, MScalingOrientationT); + M = XMMatrixMultiply(M, MScaling); + M = XMMatrixMultiply(M, MScalingOrientation); M.r[3] = XMVectorAdd(M.r[3], VScalingOrigin); M.r[3] = XMVectorSubtract(M.r[3], VRotationOrigin); - M = XMMatrixMultiply(M, MRotation); + M = XMMatrixMultiply(M, MRotation); M.r[3] = XMVectorAdd(M.r[3], VRotationOrigin); M.r[3] = XMVectorAdd(M.r[3], VTranslation); return M; @@ -2069,26 +2025,23 @@ inline XMMATRIX XM_CALLCONV XMMatrixTransformation //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMatrixAffineTransformation2D -( - FXMVECTOR Scaling, - FXMVECTOR RotationOrigin, - float Rotation, - FXMVECTOR Translation -) noexcept +inline XMMATRIX XM_CALLCONV XMMatrixAffineTransformation2D(FXMVECTOR Scaling, + FXMVECTOR RotationOrigin, + float Rotation, + FXMVECTOR Translation) noexcept { // M = MScaling * Inverse(MRotationOrigin) * MRotation * MRotationOrigin * MTranslation; - XMVECTOR VScaling = XMVectorSelect(g_XMOne.v, Scaling, g_XMSelect1100.v); - XMMATRIX MScaling = XMMatrixScalingFromVector(VScaling); + XMVECTOR VScaling = XMVectorSelect(g_XMOne.v, Scaling, g_XMSelect1100.v); + XMMATRIX MScaling = XMMatrixScalingFromVector(VScaling); XMVECTOR VRotationOrigin = XMVectorSelect(g_XMSelect1100.v, RotationOrigin, g_XMSelect1100.v); - XMMATRIX MRotation = XMMatrixRotationZ(Rotation); - XMVECTOR VTranslation = XMVectorSelect(g_XMSelect1100.v, Translation, g_XMSelect1100.v); + XMMATRIX MRotation = XMMatrixRotationZ(Rotation); + XMVECTOR VTranslation = XMVectorSelect(g_XMSelect1100.v, Translation, g_XMSelect1100.v); XMMATRIX M; - M = MScaling; + M = MScaling; M.r[3] = XMVectorSubtract(M.r[3], VRotationOrigin); - M = XMMatrixMultiply(M, MRotation); + M = XMMatrixMultiply(M, MRotation); M.r[3] = XMVectorAdd(M.r[3], VRotationOrigin); M.r[3] = XMVectorAdd(M.r[3], VTranslation); return M; @@ -2096,25 +2049,22 @@ inline XMMATRIX XM_CALLCONV XMMatrixAffineTransformation2D //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMatrixAffineTransformation -( - FXMVECTOR Scaling, - FXMVECTOR RotationOrigin, - FXMVECTOR RotationQuaternion, - GXMVECTOR Translation -) noexcept +inline XMMATRIX XM_CALLCONV XMMatrixAffineTransformation(FXMVECTOR Scaling, + FXMVECTOR RotationOrigin, + FXMVECTOR RotationQuaternion, + GXMVECTOR Translation) noexcept { // M = MScaling * Inverse(MRotationOrigin) * MRotation * MRotationOrigin * MTranslation; - XMMATRIX MScaling = XMMatrixScalingFromVector(Scaling); + XMMATRIX MScaling = XMMatrixScalingFromVector(Scaling); XMVECTOR VRotationOrigin = XMVectorSelect(g_XMSelect1110.v, RotationOrigin, g_XMSelect1110.v); - XMMATRIX MRotation = XMMatrixRotationQuaternion(RotationQuaternion); - XMVECTOR VTranslation = XMVectorSelect(g_XMSelect1110.v, Translation, g_XMSelect1110.v); + XMMATRIX MRotation = XMMatrixRotationQuaternion(RotationQuaternion); + XMVECTOR VTranslation = XMVectorSelect(g_XMSelect1110.v, Translation, g_XMSelect1110.v); XMMATRIX M; - M = MScaling; + M = MScaling; M.r[3] = XMVectorSubtract(M.r[3], VRotationOrigin); - M = XMMatrixMultiply(M, MRotation); + M = XMMatrixMultiply(M, MRotation); M.r[3] = XMVectorAdd(M.r[3], VRotationOrigin); M.r[3] = XMVectorAdd(M.r[3], VTranslation); return M; @@ -2147,33 +2097,29 @@ inline XMMATRIX XM_CALLCONV XMMatrixReflect(FXMVECTOR ReflectionPlane) noexcept //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMatrixShadow -( - FXMVECTOR ShadowPlane, - FXMVECTOR LightPosition -) noexcept +inline XMMATRIX XM_CALLCONV XMMatrixShadow(FXMVECTOR ShadowPlane, FXMVECTOR LightPosition) noexcept { static const XMVECTORU32 Select0001 = { { { XM_SELECT_0, XM_SELECT_0, XM_SELECT_0, XM_SELECT_1 } } }; assert(!XMVector3Equal(ShadowPlane, XMVectorZero())); assert(!XMPlaneIsInfinite(ShadowPlane)); - XMVECTOR P = XMPlaneNormalize(ShadowPlane); + XMVECTOR P = XMPlaneNormalize(ShadowPlane); XMVECTOR Dot = XMPlaneDot(P, LightPosition); - P = XMVectorNegate(P); - XMVECTOR D = XMVectorSplatW(P); - XMVECTOR C = XMVectorSplatZ(P); - XMVECTOR B = XMVectorSplatY(P); - XMVECTOR A = XMVectorSplatX(P); - Dot = XMVectorSelect(Select0001.v, Dot, Select0001.v); + P = XMVectorNegate(P); + XMVECTOR D = XMVectorSplatW(P); + XMVECTOR C = XMVectorSplatZ(P); + XMVECTOR B = XMVectorSplatY(P); + XMVECTOR A = XMVectorSplatX(P); + Dot = XMVectorSelect(Select0001.v, Dot, Select0001.v); XMMATRIX M; M.r[3] = XMVectorMultiplyAdd(D, LightPosition, Dot); - Dot = XMVectorRotateLeft(Dot, 1); + Dot = XMVectorRotateLeft(Dot, 1); M.r[2] = XMVectorMultiplyAdd(C, LightPosition, Dot); - Dot = XMVectorRotateLeft(Dot, 1); + Dot = XMVectorRotateLeft(Dot, 1); M.r[1] = XMVectorMultiplyAdd(B, LightPosition, Dot); - Dot = XMVectorRotateLeft(Dot, 1); + Dot = XMVectorRotateLeft(Dot, 1); M.r[0] = XMVectorMultiplyAdd(A, LightPosition, Dot); return M; } @@ -2182,12 +2128,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixShadow // View and projection initialization operations //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMatrixLookAtLH -( - FXMVECTOR EyePosition, - FXMVECTOR FocusPosition, - FXMVECTOR UpDirection -) noexcept +inline XMMATRIX XM_CALLCONV XMMatrixLookAtLH(FXMVECTOR EyePosition, FXMVECTOR FocusPosition, FXMVECTOR UpDirection) noexcept { XMVECTOR EyeDirection = XMVectorSubtract(FocusPosition, EyePosition); return XMMatrixLookToLH(EyePosition, EyeDirection, UpDirection); @@ -2195,12 +2136,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixLookAtLH //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMatrixLookAtRH -( - FXMVECTOR EyePosition, - FXMVECTOR FocusPosition, - FXMVECTOR UpDirection -) noexcept +inline XMMATRIX XM_CALLCONV XMMatrixLookAtRH(FXMVECTOR EyePosition, FXMVECTOR FocusPosition, FXMVECTOR UpDirection) noexcept { XMVECTOR NegEyeDirection = XMVectorSubtract(EyePosition, FocusPosition); return XMMatrixLookToLH(EyePosition, NegEyeDirection, UpDirection); @@ -2208,12 +2144,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixLookAtRH //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMatrixLookToLH -( - FXMVECTOR EyePosition, - FXMVECTOR EyeDirection, - FXMVECTOR UpDirection -) noexcept +inline XMMATRIX XM_CALLCONV XMMatrixLookToLH(FXMVECTOR EyePosition, FXMVECTOR EyeDirection, FXMVECTOR UpDirection) noexcept { assert(!XMVector3Equal(EyeDirection, XMVectorZero())); assert(!XMVector3IsInfinite(EyeDirection)); @@ -2223,7 +2154,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixLookToLH XMVECTOR R2 = XMVector3Normalize(EyeDirection); XMVECTOR R0 = XMVector3Cross(UpDirection, R2); - R0 = XMVector3Normalize(R0); + R0 = XMVector3Normalize(R0); XMVECTOR R1 = XMVector3Cross(R2, R0); @@ -2246,12 +2177,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixLookToLH //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMatrixLookToRH -( - FXMVECTOR EyePosition, - FXMVECTOR EyeDirection, - FXMVECTOR UpDirection -) noexcept +inline XMMATRIX XM_CALLCONV XMMatrixLookToRH(FXMVECTOR EyePosition, FXMVECTOR EyeDirection, FXMVECTOR UpDirection) noexcept { XMVECTOR NegEyeDirection = XMVectorNegate(EyeDirection); return XMMatrixLookToLH(EyePosition, NegEyeDirection, UpDirection); @@ -2261,16 +2187,10 @@ inline XMMATRIX XM_CALLCONV XMMatrixLookToRH #ifdef _PREFAST_ #pragma prefast(push) -#pragma prefast(disable:28931, "PREfast noise: Esp:1266") +#pragma prefast(disable : 28931, "PREfast noise: Esp:1266") #endif -inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveLH -( - float ViewWidth, - float ViewHeight, - float NearZ, - float FarZ -) noexcept +inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveLH(float ViewWidth, float ViewHeight, float NearZ, float FarZ) noexcept { assert(NearZ > 0.f && FarZ > 0.f); assert(!XMScalarNearEqual(ViewWidth, 0.0f, 0.00001f)); @@ -2280,7 +2200,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveLH #if defined(_XM_NO_INTRINSICS_) float TwoNearZ = NearZ + NearZ; - float fRange = FarZ / (FarZ - NearZ); + float fRange = FarZ / (FarZ - NearZ); XMMATRIX M; M.m[0][0] = TwoNearZ / ViewWidth; @@ -2305,10 +2225,10 @@ inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveLH return M; #elif defined(_XM_ARM_NEON_INTRINSICS_) - float TwoNearZ = NearZ + NearZ; - float fRange = FarZ / (FarZ - NearZ); - const float32x4_t Zero = vdupq_n_f32(0); - XMMATRIX M; + float TwoNearZ = NearZ + NearZ; + float fRange = FarZ / (FarZ - NearZ); + const float32x4_t Zero = vdupq_n_f32(0); + XMMATRIX M; M.r[0] = vsetq_lane_f32(TwoNearZ / ViewWidth, Zero, 0); M.r[1] = vsetq_lane_f32(TwoNearZ / ViewHeight, Zero, 1); M.r[2] = vsetq_lane_f32(fRange, g_XMIdentityR3.v, 2); @@ -2316,34 +2236,29 @@ inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveLH return M; #elif defined(_XM_SSE_INTRINSICS_) XMMATRIX M; - float TwoNearZ = NearZ + NearZ; - float fRange = FarZ / (FarZ - NearZ); + float TwoNearZ = NearZ + NearZ; + float fRange = FarZ / (FarZ - NearZ); // Note: This is recorded on the stack - XMVECTOR rMem = { - TwoNearZ / ViewWidth, - TwoNearZ / ViewHeight, - fRange, - -fRange * NearZ - }; + XMVECTOR rMem = { TwoNearZ / ViewWidth, TwoNearZ / ViewHeight, fRange, -fRange * NearZ }; // Copy from memory to SSE register XMVECTOR vValues = rMem; - XMVECTOR vTemp = _mm_setzero_ps(); + XMVECTOR vTemp = _mm_setzero_ps(); // Copy x only vTemp = _mm_move_ss(vTemp, vValues); // TwoNearZ / ViewWidth,0,0,0 M.r[0] = vTemp; // 0,TwoNearZ / ViewHeight,0,0 - vTemp = vValues; - vTemp = _mm_and_ps(vTemp, g_XMMaskY); + vTemp = vValues; + vTemp = _mm_and_ps(vTemp, g_XMMaskY); M.r[1] = vTemp; // x=fRange,y=-fRange * NearZ,0,1.0f vValues = _mm_shuffle_ps(vValues, g_XMIdentityR3, _MM_SHUFFLE(3, 2, 3, 2)); // 0,0,fRange,1.0f - vTemp = _mm_setzero_ps(); - vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(3, 0, 0, 0)); + vTemp = _mm_setzero_ps(); + vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(3, 0, 0, 0)); M.r[2] = vTemp; // 0,0,-fRange * NearZ,0 - vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(2, 1, 0, 0)); + vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(2, 1, 0, 0)); M.r[3] = vTemp; return M; #endif @@ -2351,13 +2266,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveLH //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveRH -( - float ViewWidth, - float ViewHeight, - float NearZ, - float FarZ -) noexcept +inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveRH(float ViewWidth, float ViewHeight, float NearZ, float FarZ) noexcept { assert(NearZ > 0.f && FarZ > 0.f); assert(!XMScalarNearEqual(ViewWidth, 0.0f, 0.00001f)); @@ -2367,7 +2276,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveRH #if defined(_XM_NO_INTRINSICS_) float TwoNearZ = NearZ + NearZ; - float fRange = FarZ / (NearZ - FarZ); + float fRange = FarZ / (NearZ - FarZ); XMMATRIX M; M.m[0][0] = TwoNearZ / ViewWidth; @@ -2392,9 +2301,9 @@ inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveRH return M; #elif defined(_XM_ARM_NEON_INTRINSICS_) - float TwoNearZ = NearZ + NearZ; - float fRange = FarZ / (NearZ - FarZ); - const float32x4_t Zero = vdupq_n_f32(0); + float TwoNearZ = NearZ + NearZ; + float fRange = FarZ / (NearZ - FarZ); + const float32x4_t Zero = vdupq_n_f32(0); XMMATRIX M; M.r[0] = vsetq_lane_f32(TwoNearZ / ViewWidth, Zero, 0); @@ -2404,34 +2313,29 @@ inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveRH return M; #elif defined(_XM_SSE_INTRINSICS_) XMMATRIX M; - float TwoNearZ = NearZ + NearZ; - float fRange = FarZ / (NearZ - FarZ); + float TwoNearZ = NearZ + NearZ; + float fRange = FarZ / (NearZ - FarZ); // Note: This is recorded on the stack - XMVECTOR rMem = { - TwoNearZ / ViewWidth, - TwoNearZ / ViewHeight, - fRange, - fRange * NearZ - }; + XMVECTOR rMem = { TwoNearZ / ViewWidth, TwoNearZ / ViewHeight, fRange, fRange * NearZ }; // Copy from memory to SSE register XMVECTOR vValues = rMem; - XMVECTOR vTemp = _mm_setzero_ps(); + XMVECTOR vTemp = _mm_setzero_ps(); // Copy x only vTemp = _mm_move_ss(vTemp, vValues); // TwoNearZ / ViewWidth,0,0,0 M.r[0] = vTemp; // 0,TwoNearZ / ViewHeight,0,0 - vTemp = vValues; - vTemp = _mm_and_ps(vTemp, g_XMMaskY); + vTemp = vValues; + vTemp = _mm_and_ps(vTemp, g_XMMaskY); M.r[1] = vTemp; // x=fRange,y=-fRange * NearZ,0,-1.0f vValues = _mm_shuffle_ps(vValues, g_XMNegIdentityR3, _MM_SHUFFLE(3, 2, 3, 2)); // 0,0,fRange,-1.0f - vTemp = _mm_setzero_ps(); - vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(3, 0, 0, 0)); + vTemp = _mm_setzero_ps(); + vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(3, 0, 0, 0)); M.r[2] = vTemp; // 0,0,-fRange * NearZ,0 - vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(2, 1, 0, 0)); + vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(2, 1, 0, 0)); M.r[3] = vTemp; return M; #endif @@ -2439,13 +2343,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveRH //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveFovLH -( - float FovAngleY, - float AspectRatio, - float NearZ, - float FarZ -) noexcept +inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveFovLH(float FovAngleY, float AspectRatio, float NearZ, float FarZ) noexcept { assert(NearZ > 0.f && FarZ > 0.f); assert(!XMScalarNearEqual(FovAngleY, 0.0f, 0.00001f * 2.0f)); @@ -2454,12 +2352,12 @@ inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveFovLH #if defined(_XM_NO_INTRINSICS_) - float SinFov; - float CosFov; + float SinFov; + float CosFov; XMScalarSinCos(&SinFov, &CosFov, 0.5f * FovAngleY); float Height = CosFov / SinFov; - float Width = Height / AspectRatio; + float Width = Height / AspectRatio; float fRange = FarZ / (FarZ - NearZ); XMMATRIX M; @@ -2485,14 +2383,14 @@ inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveFovLH return M; #elif defined(_XM_ARM_NEON_INTRINSICS_) - float SinFov; - float CosFov; + float SinFov; + float CosFov; XMScalarSinCos(&SinFov, &CosFov, 0.5f * FovAngleY); - float fRange = FarZ / (FarZ - NearZ); - float Height = CosFov / SinFov; - float Width = Height / AspectRatio; - const float32x4_t Zero = vdupq_n_f32(0); + float fRange = FarZ / (FarZ - NearZ); + float Height = CosFov / SinFov; + float Width = Height / AspectRatio; + const float32x4_t Zero = vdupq_n_f32(0); XMMATRIX M; M.r[0] = vsetq_lane_f32(Width, Zero, 0); @@ -2501,39 +2399,34 @@ inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveFovLH M.r[3] = vsetq_lane_f32(-fRange * NearZ, Zero, 2); return M; #elif defined(_XM_SSE_INTRINSICS_) - float SinFov; - float CosFov; + float SinFov; + float CosFov; XMScalarSinCos(&SinFov, &CosFov, 0.5f * FovAngleY); float fRange = FarZ / (FarZ - NearZ); // Note: This is recorded on the stack - float Height = CosFov / SinFov; - XMVECTOR rMem = { - Height / AspectRatio, - Height, - fRange, - -fRange * NearZ - }; + float Height = CosFov / SinFov; + XMVECTOR rMem = { Height / AspectRatio, Height, fRange, -fRange * NearZ }; // Copy from memory to SSE register XMVECTOR vValues = rMem; - XMVECTOR vTemp = _mm_setzero_ps(); + XMVECTOR vTemp = _mm_setzero_ps(); // Copy x only vTemp = _mm_move_ss(vTemp, vValues); // Height / AspectRatio,0,0,0 XMMATRIX M; M.r[0] = vTemp; // 0,Height,0,0 - vTemp = vValues; - vTemp = _mm_and_ps(vTemp, g_XMMaskY); + vTemp = vValues; + vTemp = _mm_and_ps(vTemp, g_XMMaskY); M.r[1] = vTemp; // x=fRange,y=-fRange * NearZ,0,1.0f - vTemp = _mm_setzero_ps(); + vTemp = _mm_setzero_ps(); vValues = _mm_shuffle_ps(vValues, g_XMIdentityR3, _MM_SHUFFLE(3, 2, 3, 2)); // 0,0,fRange,1.0f - vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(3, 0, 0, 0)); + vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(3, 0, 0, 0)); M.r[2] = vTemp; // 0,0,-fRange * NearZ,0.0f - vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(2, 1, 0, 0)); + vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(2, 1, 0, 0)); M.r[3] = vTemp; return M; #endif @@ -2541,13 +2434,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveFovLH //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveFovRH -( - float FovAngleY, - float AspectRatio, - float NearZ, - float FarZ -) noexcept +inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveFovRH(float FovAngleY, float AspectRatio, float NearZ, float FarZ) noexcept { assert(NearZ > 0.f && FarZ > 0.f); assert(!XMScalarNearEqual(FovAngleY, 0.0f, 0.00001f * 2.0f)); @@ -2556,12 +2443,12 @@ inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveFovRH #if defined(_XM_NO_INTRINSICS_) - float SinFov; - float CosFov; + float SinFov; + float CosFov; XMScalarSinCos(&SinFov, &CosFov, 0.5f * FovAngleY); float Height = CosFov / SinFov; - float Width = Height / AspectRatio; + float Width = Height / AspectRatio; float fRange = FarZ / (NearZ - FarZ); XMMATRIX M; @@ -2587,13 +2474,13 @@ inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveFovRH return M; #elif defined(_XM_ARM_NEON_INTRINSICS_) - float SinFov; - float CosFov; + float SinFov; + float CosFov; XMScalarSinCos(&SinFov, &CosFov, 0.5f * FovAngleY); - float fRange = FarZ / (NearZ - FarZ); - float Height = CosFov / SinFov; - float Width = Height / AspectRatio; - const float32x4_t Zero = vdupq_n_f32(0); + float fRange = FarZ / (NearZ - FarZ); + float Height = CosFov / SinFov; + float Width = Height / AspectRatio; + const float32x4_t Zero = vdupq_n_f32(0); XMMATRIX M; M.r[0] = vsetq_lane_f32(Width, Zero, 0); @@ -2602,38 +2489,33 @@ inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveFovRH M.r[3] = vsetq_lane_f32(fRange * NearZ, Zero, 2); return M; #elif defined(_XM_SSE_INTRINSICS_) - float SinFov; - float CosFov; + float SinFov; + float CosFov; XMScalarSinCos(&SinFov, &CosFov, 0.5f * FovAngleY); float fRange = FarZ / (NearZ - FarZ); // Note: This is recorded on the stack - float Height = CosFov / SinFov; - XMVECTOR rMem = { - Height / AspectRatio, - Height, - fRange, - fRange * NearZ - }; + float Height = CosFov / SinFov; + XMVECTOR rMem = { Height / AspectRatio, Height, fRange, fRange * NearZ }; // Copy from memory to SSE register XMVECTOR vValues = rMem; - XMVECTOR vTemp = _mm_setzero_ps(); + XMVECTOR vTemp = _mm_setzero_ps(); // Copy x only vTemp = _mm_move_ss(vTemp, vValues); // Height / AspectRatio,0,0,0 XMMATRIX M; M.r[0] = vTemp; // 0,Height,0,0 - vTemp = vValues; - vTemp = _mm_and_ps(vTemp, g_XMMaskY); + vTemp = vValues; + vTemp = _mm_and_ps(vTemp, g_XMMaskY); M.r[1] = vTemp; // x=fRange,y=-fRange * NearZ,0,-1.0f - vTemp = _mm_setzero_ps(); + vTemp = _mm_setzero_ps(); vValues = _mm_shuffle_ps(vValues, g_XMNegIdentityR3, _MM_SHUFFLE(3, 2, 3, 2)); // 0,0,fRange,-1.0f - vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(3, 0, 0, 0)); + vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(3, 0, 0, 0)); M.r[2] = vTemp; // 0,0,fRange * NearZ,0.0f - vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(2, 1, 0, 0)); + vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(2, 1, 0, 0)); M.r[3] = vTemp; return M; #endif @@ -2641,15 +2523,8 @@ inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveFovRH //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveOffCenterLH -( - float ViewLeft, - float ViewRight, - float ViewBottom, - float ViewTop, - float NearZ, - float FarZ -) noexcept +inline XMMATRIX XM_CALLCONV +XMMatrixPerspectiveOffCenterLH(float ViewLeft, float ViewRight, float ViewBottom, float ViewTop, float NearZ, float FarZ) noexcept { assert(NearZ > 0.f && FarZ > 0.f); assert(!XMScalarNearEqual(ViewRight, ViewLeft, 0.00001f)); @@ -2658,10 +2533,10 @@ inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveOffCenterLH #if defined(_XM_NO_INTRINSICS_) - float TwoNearZ = NearZ + NearZ; - float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); + float TwoNearZ = NearZ + NearZ; + float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); - float fRange = FarZ / (FarZ - NearZ); + float fRange = FarZ / (FarZ - NearZ); XMMATRIX M; M.m[0][0] = TwoNearZ * ReciprocalWidth; @@ -2686,68 +2561,50 @@ inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveOffCenterLH return M; #elif defined(_XM_ARM_NEON_INTRINSICS_) - float TwoNearZ = NearZ + NearZ; - float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); - float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); - float fRange = FarZ / (FarZ - NearZ); - const float32x4_t Zero = vdupq_n_f32(0); + float TwoNearZ = NearZ + NearZ; + float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); + float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); + float fRange = FarZ / (FarZ - NearZ); + const float32x4_t Zero = vdupq_n_f32(0); XMMATRIX M; M.r[0] = vsetq_lane_f32(TwoNearZ * ReciprocalWidth, Zero, 0); M.r[1] = vsetq_lane_f32(TwoNearZ * ReciprocalHeight, Zero, 1); - M.r[2] = XMVectorSet(-(ViewLeft + ViewRight) * ReciprocalWidth, - -(ViewTop + ViewBottom) * ReciprocalHeight, - fRange, - 1.0f); + M.r[2] = XMVectorSet(-(ViewLeft + ViewRight) * ReciprocalWidth, -(ViewTop + ViewBottom) * ReciprocalHeight, fRange, 1.0f); M.r[3] = vsetq_lane_f32(-fRange * NearZ, Zero, 2); return M; #elif defined(_XM_SSE_INTRINSICS_) XMMATRIX M; - float TwoNearZ = NearZ + NearZ; - float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); - float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); - float fRange = FarZ / (FarZ - NearZ); + float TwoNearZ = NearZ + NearZ; + float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); + float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); + float fRange = FarZ / (FarZ - NearZ); // Note: This is recorded on the stack - XMVECTOR rMem = { - TwoNearZ * ReciprocalWidth, - TwoNearZ * ReciprocalHeight, - -fRange * NearZ, - 0 - }; + XMVECTOR rMem = { TwoNearZ * ReciprocalWidth, TwoNearZ * ReciprocalHeight, -fRange * NearZ, 0 }; // Copy from memory to SSE register XMVECTOR vValues = rMem; - XMVECTOR vTemp = _mm_setzero_ps(); + XMVECTOR vTemp = _mm_setzero_ps(); // Copy x only vTemp = _mm_move_ss(vTemp, vValues); // TwoNearZ*ReciprocalWidth,0,0,0 M.r[0] = vTemp; // 0,TwoNearZ*ReciprocalHeight,0,0 - vTemp = vValues; - vTemp = _mm_and_ps(vTemp, g_XMMaskY); + vTemp = vValues; + vTemp = _mm_and_ps(vTemp, g_XMMaskY); M.r[1] = vTemp; // 0,0,fRange,1.0f - M.r[2] = XMVectorSet(-(ViewLeft + ViewRight) * ReciprocalWidth, - -(ViewTop + ViewBottom) * ReciprocalHeight, - fRange, - 1.0f); + M.r[2] = XMVectorSet(-(ViewLeft + ViewRight) * ReciprocalWidth, -(ViewTop + ViewBottom) * ReciprocalHeight, fRange, 1.0f); // 0,0,-fRange * NearZ,0.0f vValues = _mm_and_ps(vValues, g_XMMaskZ); - M.r[3] = vValues; + M.r[3] = vValues; return M; #endif } //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveOffCenterRH -( - float ViewLeft, - float ViewRight, - float ViewBottom, - float ViewTop, - float NearZ, - float FarZ -) noexcept +inline XMMATRIX XM_CALLCONV +XMMatrixPerspectiveOffCenterRH(float ViewLeft, float ViewRight, float ViewBottom, float ViewTop, float NearZ, float FarZ) noexcept { assert(NearZ > 0.f && FarZ > 0.f); assert(!XMScalarNearEqual(ViewRight, ViewLeft, 0.00001f)); @@ -2756,10 +2613,10 @@ inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveOffCenterRH #if defined(_XM_NO_INTRINSICS_) - float TwoNearZ = NearZ + NearZ; - float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); + float TwoNearZ = NearZ + NearZ; + float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); - float fRange = FarZ / (NearZ - FarZ); + float fRange = FarZ / (NearZ - FarZ); XMMATRIX M; M.m[0][0] = TwoNearZ * ReciprocalWidth; @@ -2784,66 +2641,49 @@ inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveOffCenterRH return M; #elif defined(_XM_ARM_NEON_INTRINSICS_) - float TwoNearZ = NearZ + NearZ; - float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); - float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); - float fRange = FarZ / (NearZ - FarZ); - const float32x4_t Zero = vdupq_n_f32(0); + float TwoNearZ = NearZ + NearZ; + float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); + float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); + float fRange = FarZ / (NearZ - FarZ); + const float32x4_t Zero = vdupq_n_f32(0); XMMATRIX M; M.r[0] = vsetq_lane_f32(TwoNearZ * ReciprocalWidth, Zero, 0); M.r[1] = vsetq_lane_f32(TwoNearZ * ReciprocalHeight, Zero, 1); - M.r[2] = XMVectorSet((ViewLeft + ViewRight) * ReciprocalWidth, - (ViewTop + ViewBottom) * ReciprocalHeight, - fRange, - -1.0f); + M.r[2] = XMVectorSet((ViewLeft + ViewRight) * ReciprocalWidth, (ViewTop + ViewBottom) * ReciprocalHeight, fRange, -1.0f); M.r[3] = vsetq_lane_f32(fRange * NearZ, Zero, 2); return M; #elif defined(_XM_SSE_INTRINSICS_) XMMATRIX M; - float TwoNearZ = NearZ + NearZ; - float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); - float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); - float fRange = FarZ / (NearZ - FarZ); + float TwoNearZ = NearZ + NearZ; + float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); + float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); + float fRange = FarZ / (NearZ - FarZ); // Note: This is recorded on the stack - XMVECTOR rMem = { - TwoNearZ * ReciprocalWidth, - TwoNearZ * ReciprocalHeight, - fRange * NearZ, - 0 - }; + XMVECTOR rMem = { TwoNearZ * ReciprocalWidth, TwoNearZ * ReciprocalHeight, fRange * NearZ, 0 }; // Copy from memory to SSE register XMVECTOR vValues = rMem; - XMVECTOR vTemp = _mm_setzero_ps(); + XMVECTOR vTemp = _mm_setzero_ps(); // Copy x only vTemp = _mm_move_ss(vTemp, vValues); // TwoNearZ*ReciprocalWidth,0,0,0 M.r[0] = vTemp; // 0,TwoNearZ*ReciprocalHeight,0,0 - vTemp = vValues; - vTemp = _mm_and_ps(vTemp, g_XMMaskY); + vTemp = vValues; + vTemp = _mm_and_ps(vTemp, g_XMMaskY); M.r[1] = vTemp; // 0,0,fRange,1.0f - M.r[2] = XMVectorSet((ViewLeft + ViewRight) * ReciprocalWidth, - (ViewTop + ViewBottom) * ReciprocalHeight, - fRange, - -1.0f); + M.r[2] = XMVectorSet((ViewLeft + ViewRight) * ReciprocalWidth, (ViewTop + ViewBottom) * ReciprocalHeight, fRange, -1.0f); // 0,0,-fRange * NearZ,0.0f vValues = _mm_and_ps(vValues, g_XMMaskZ); - M.r[3] = vValues; + M.r[3] = vValues; return M; #endif } //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMatrixOrthographicLH -( - float ViewWidth, - float ViewHeight, - float NearZ, - float FarZ -) noexcept +inline XMMATRIX XM_CALLCONV XMMatrixOrthographicLH(float ViewWidth, float ViewHeight, float NearZ, float FarZ) noexcept { assert(!XMScalarNearEqual(ViewWidth, 0.0f, 0.00001f)); assert(!XMScalarNearEqual(ViewHeight, 0.0f, 0.00001f)); @@ -2879,7 +2719,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixOrthographicLH float fRange = 1.0f / (FarZ - NearZ); const float32x4_t Zero = vdupq_n_f32(0); - XMMATRIX M; + XMMATRIX M; M.r[0] = vsetq_lane_f32(2.0f / ViewWidth, Zero, 0); M.r[1] = vsetq_lane_f32(2.0f / ViewHeight, Zero, 1); M.r[2] = vsetq_lane_f32(fRange, Zero, 2); @@ -2887,33 +2727,28 @@ inline XMMATRIX XM_CALLCONV XMMatrixOrthographicLH return M; #elif defined(_XM_SSE_INTRINSICS_) XMMATRIX M; - float fRange = 1.0f / (FarZ - NearZ); + float fRange = 1.0f / (FarZ - NearZ); // Note: This is recorded on the stack - XMVECTOR rMem = { - 2.0f / ViewWidth, - 2.0f / ViewHeight, - fRange, - -fRange * NearZ - }; + XMVECTOR rMem = { 2.0f / ViewWidth, 2.0f / ViewHeight, fRange, -fRange * NearZ }; // Copy from memory to SSE register XMVECTOR vValues = rMem; - XMVECTOR vTemp = _mm_setzero_ps(); + XMVECTOR vTemp = _mm_setzero_ps(); // Copy x only vTemp = _mm_move_ss(vTemp, vValues); // 2.0f / ViewWidth,0,0,0 M.r[0] = vTemp; // 0,2.0f / ViewHeight,0,0 - vTemp = vValues; - vTemp = _mm_and_ps(vTemp, g_XMMaskY); + vTemp = vValues; + vTemp = _mm_and_ps(vTemp, g_XMMaskY); M.r[1] = vTemp; // x=fRange,y=-fRange * NearZ,0,1.0f - vTemp = _mm_setzero_ps(); + vTemp = _mm_setzero_ps(); vValues = _mm_shuffle_ps(vValues, g_XMIdentityR3, _MM_SHUFFLE(3, 2, 3, 2)); // 0,0,fRange,0.0f - vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(2, 0, 0, 0)); + vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(2, 0, 0, 0)); M.r[2] = vTemp; // 0,0,-fRange * NearZ,1.0f - vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(3, 1, 0, 0)); + vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(3, 1, 0, 0)); M.r[3] = vTemp; return M; #endif @@ -2921,13 +2756,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixOrthographicLH //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMatrixOrthographicRH -( - float ViewWidth, - float ViewHeight, - float NearZ, - float FarZ -) noexcept +inline XMMATRIX XM_CALLCONV XMMatrixOrthographicRH(float ViewWidth, float ViewHeight, float NearZ, float FarZ) noexcept { assert(!XMScalarNearEqual(ViewWidth, 0.0f, 0.00001f)); assert(!XMScalarNearEqual(ViewHeight, 0.0f, 0.00001f)); @@ -2963,7 +2792,7 @@ inline XMMATRIX XM_CALLCONV XMMatrixOrthographicRH float fRange = 1.0f / (NearZ - FarZ); const float32x4_t Zero = vdupq_n_f32(0); - XMMATRIX M; + XMMATRIX M; M.r[0] = vsetq_lane_f32(2.0f / ViewWidth, Zero, 0); M.r[1] = vsetq_lane_f32(2.0f / ViewHeight, Zero, 1); M.r[2] = vsetq_lane_f32(fRange, Zero, 2); @@ -2971,33 +2800,28 @@ inline XMMATRIX XM_CALLCONV XMMatrixOrthographicRH return M; #elif defined(_XM_SSE_INTRINSICS_) XMMATRIX M; - float fRange = 1.0f / (NearZ - FarZ); + float fRange = 1.0f / (NearZ - FarZ); // Note: This is recorded on the stack - XMVECTOR rMem = { - 2.0f / ViewWidth, - 2.0f / ViewHeight, - fRange, - fRange * NearZ - }; + XMVECTOR rMem = { 2.0f / ViewWidth, 2.0f / ViewHeight, fRange, fRange * NearZ }; // Copy from memory to SSE register XMVECTOR vValues = rMem; - XMVECTOR vTemp = _mm_setzero_ps(); + XMVECTOR vTemp = _mm_setzero_ps(); // Copy x only vTemp = _mm_move_ss(vTemp, vValues); // 2.0f / ViewWidth,0,0,0 M.r[0] = vTemp; // 0,2.0f / ViewHeight,0,0 - vTemp = vValues; - vTemp = _mm_and_ps(vTemp, g_XMMaskY); + vTemp = vValues; + vTemp = _mm_and_ps(vTemp, g_XMMaskY); M.r[1] = vTemp; // x=fRange,y=fRange * NearZ,0,1.0f - vTemp = _mm_setzero_ps(); + vTemp = _mm_setzero_ps(); vValues = _mm_shuffle_ps(vValues, g_XMIdentityR3, _MM_SHUFFLE(3, 2, 3, 2)); // 0,0,fRange,0.0f - vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(2, 0, 0, 0)); + vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(2, 0, 0, 0)); M.r[2] = vTemp; // 0,0,fRange * NearZ,1.0f - vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(3, 1, 0, 0)); + vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(3, 1, 0, 0)); M.r[3] = vTemp; return M; #endif @@ -3005,15 +2829,8 @@ inline XMMATRIX XM_CALLCONV XMMatrixOrthographicRH //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMatrixOrthographicOffCenterLH -( - float ViewLeft, - float ViewRight, - float ViewBottom, - float ViewTop, - float NearZ, - float FarZ -) noexcept +inline XMMATRIX XM_CALLCONV +XMMatrixOrthographicOffCenterLH(float ViewLeft, float ViewRight, float ViewBottom, float ViewTop, float NearZ, float FarZ) noexcept { assert(!XMScalarNearEqual(ViewRight, ViewLeft, 0.00001f)); assert(!XMScalarNearEqual(ViewTop, ViewBottom, 0.00001f)); @@ -3021,9 +2838,9 @@ inline XMMATRIX XM_CALLCONV XMMatrixOrthographicOffCenterLH #if defined(_XM_NO_INTRINSICS_) - float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); + float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); - float fRange = 1.0f / (FarZ - NearZ); + float fRange = 1.0f / (FarZ - NearZ); XMMATRIX M; M.m[0][0] = ReciprocalWidth + ReciprocalWidth; @@ -3048,72 +2865,52 @@ inline XMMATRIX XM_CALLCONV XMMatrixOrthographicOffCenterLH return M; #elif defined(_XM_ARM_NEON_INTRINSICS_) - float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); - float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); - float fRange = 1.0f / (FarZ - NearZ); - const float32x4_t Zero = vdupq_n_f32(0); - XMMATRIX M; + float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); + float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); + float fRange = 1.0f / (FarZ - NearZ); + const float32x4_t Zero = vdupq_n_f32(0); + XMMATRIX M; M.r[0] = vsetq_lane_f32(ReciprocalWidth + ReciprocalWidth, Zero, 0); M.r[1] = vsetq_lane_f32(ReciprocalHeight + ReciprocalHeight, Zero, 1); M.r[2] = vsetq_lane_f32(fRange, Zero, 2); - M.r[3] = XMVectorSet(-(ViewLeft + ViewRight) * ReciprocalWidth, - -(ViewTop + ViewBottom) * ReciprocalHeight, - -fRange * NearZ, - 1.0f); + M.r[3] = XMVectorSet(-(ViewLeft + ViewRight) * ReciprocalWidth, -(ViewTop + ViewBottom) * ReciprocalHeight, -fRange * NearZ, 1.0f); return M; #elif defined(_XM_SSE_INTRINSICS_) XMMATRIX M; - float fReciprocalWidth = 1.0f / (ViewRight - ViewLeft); - float fReciprocalHeight = 1.0f / (ViewTop - ViewBottom); - float fRange = 1.0f / (FarZ - NearZ); + float fReciprocalWidth = 1.0f / (ViewRight - ViewLeft); + float fReciprocalHeight = 1.0f / (ViewTop - ViewBottom); + float fRange = 1.0f / (FarZ - NearZ); // Note: This is recorded on the stack - XMVECTOR rMem = { - fReciprocalWidth, - fReciprocalHeight, - fRange, - 1.0f - }; - XMVECTOR rMem2 = { - -(ViewLeft + ViewRight), - -(ViewTop + ViewBottom), - -NearZ, - 1.0f - }; + XMVECTOR rMem = { fReciprocalWidth, fReciprocalHeight, fRange, 1.0f }; + XMVECTOR rMem2 = { -(ViewLeft + ViewRight), -(ViewTop + ViewBottom), -NearZ, 1.0f }; // Copy from memory to SSE register XMVECTOR vValues = rMem; - XMVECTOR vTemp = _mm_setzero_ps(); + XMVECTOR vTemp = _mm_setzero_ps(); // Copy x only vTemp = _mm_move_ss(vTemp, vValues); // fReciprocalWidth*2,0,0,0 - vTemp = _mm_add_ss(vTemp, vTemp); + vTemp = _mm_add_ss(vTemp, vTemp); M.r[0] = vTemp; // 0,fReciprocalHeight*2,0,0 - vTemp = vValues; - vTemp = _mm_and_ps(vTemp, g_XMMaskY); - vTemp = _mm_add_ps(vTemp, vTemp); + vTemp = vValues; + vTemp = _mm_and_ps(vTemp, g_XMMaskY); + vTemp = _mm_add_ps(vTemp, vTemp); M.r[1] = vTemp; // 0,0,fRange,0.0f - vTemp = vValues; - vTemp = _mm_and_ps(vTemp, g_XMMaskZ); + vTemp = vValues; + vTemp = _mm_and_ps(vTemp, g_XMMaskZ); M.r[2] = vTemp; // -(ViewLeft + ViewRight)*fReciprocalWidth,-(ViewTop + ViewBottom)*fReciprocalHeight,fRange*-NearZ,1.0f vValues = _mm_mul_ps(vValues, rMem2); - M.r[3] = vValues; + M.r[3] = vValues; return M; #endif } //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMatrixOrthographicOffCenterRH -( - float ViewLeft, - float ViewRight, - float ViewBottom, - float ViewTop, - float NearZ, - float FarZ -) noexcept +inline XMMATRIX XM_CALLCONV +XMMatrixOrthographicOffCenterRH(float ViewLeft, float ViewRight, float ViewBottom, float ViewTop, float NearZ, float FarZ) noexcept { assert(!XMScalarNearEqual(ViewRight, ViewLeft, 0.00001f)); assert(!XMScalarNearEqual(ViewTop, ViewBottom, 0.00001f)); @@ -3121,9 +2918,9 @@ inline XMMATRIX XM_CALLCONV XMMatrixOrthographicOffCenterRH #if defined(_XM_NO_INTRINSICS_) - float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); + float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); - float fRange = 1.0f / (NearZ - FarZ); + float fRange = 1.0f / (NearZ - FarZ); XMMATRIX M; M.m[0][0] = ReciprocalWidth + ReciprocalWidth; @@ -3141,64 +2938,48 @@ inline XMMATRIX XM_CALLCONV XMMatrixOrthographicOffCenterRH M.m[2][2] = fRange; M.m[2][3] = 0.0f; - M.r[3] = XMVectorSet(-(ViewLeft + ViewRight) * ReciprocalWidth, - -(ViewTop + ViewBottom) * ReciprocalHeight, - fRange * NearZ, - 1.0f); + M.r[3] = XMVectorSet(-(ViewLeft + ViewRight) * ReciprocalWidth, -(ViewTop + ViewBottom) * ReciprocalHeight, fRange * NearZ, 1.0f); return M; #elif defined(_XM_ARM_NEON_INTRINSICS_) - float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); - float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); - float fRange = 1.0f / (NearZ - FarZ); - const float32x4_t Zero = vdupq_n_f32(0); - XMMATRIX M; + float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); + float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); + float fRange = 1.0f / (NearZ - FarZ); + const float32x4_t Zero = vdupq_n_f32(0); + XMMATRIX M; M.r[0] = vsetq_lane_f32(ReciprocalWidth + ReciprocalWidth, Zero, 0); M.r[1] = vsetq_lane_f32(ReciprocalHeight + ReciprocalHeight, Zero, 1); M.r[2] = vsetq_lane_f32(fRange, Zero, 2); - M.r[3] = XMVectorSet(-(ViewLeft + ViewRight) * ReciprocalWidth, - -(ViewTop + ViewBottom) * ReciprocalHeight, - fRange * NearZ, - 1.0f); + M.r[3] = XMVectorSet(-(ViewLeft + ViewRight) * ReciprocalWidth, -(ViewTop + ViewBottom) * ReciprocalHeight, fRange * NearZ, 1.0f); return M; #elif defined(_XM_SSE_INTRINSICS_) XMMATRIX M; - float fReciprocalWidth = 1.0f / (ViewRight - ViewLeft); - float fReciprocalHeight = 1.0f / (ViewTop - ViewBottom); - float fRange = 1.0f / (NearZ - FarZ); + float fReciprocalWidth = 1.0f / (ViewRight - ViewLeft); + float fReciprocalHeight = 1.0f / (ViewTop - ViewBottom); + float fRange = 1.0f / (NearZ - FarZ); // Note: This is recorded on the stack - XMVECTOR rMem = { - fReciprocalWidth, - fReciprocalHeight, - fRange, - 1.0f - }; - XMVECTOR rMem2 = { - -(ViewLeft + ViewRight), - -(ViewTop + ViewBottom), - NearZ, - 1.0f - }; + XMVECTOR rMem = { fReciprocalWidth, fReciprocalHeight, fRange, 1.0f }; + XMVECTOR rMem2 = { -(ViewLeft + ViewRight), -(ViewTop + ViewBottom), NearZ, 1.0f }; // Copy from memory to SSE register XMVECTOR vValues = rMem; - XMVECTOR vTemp = _mm_setzero_ps(); + XMVECTOR vTemp = _mm_setzero_ps(); // Copy x only vTemp = _mm_move_ss(vTemp, vValues); // fReciprocalWidth*2,0,0,0 - vTemp = _mm_add_ss(vTemp, vTemp); + vTemp = _mm_add_ss(vTemp, vTemp); M.r[0] = vTemp; // 0,fReciprocalHeight*2,0,0 - vTemp = vValues; - vTemp = _mm_and_ps(vTemp, g_XMMaskY); - vTemp = _mm_add_ps(vTemp, vTemp); + vTemp = vValues; + vTemp = _mm_and_ps(vTemp, g_XMMaskY); + vTemp = _mm_add_ps(vTemp, vTemp); M.r[1] = vTemp; // 0,0,fRange,0.0f - vTemp = vValues; - vTemp = _mm_and_ps(vTemp, g_XMMaskZ); + vTemp = vValues; + vTemp = _mm_and_ps(vTemp, g_XMMaskZ); M.r[2] = vTemp; // -(ViewLeft + ViewRight)*fReciprocalWidth,-(ViewTop + ViewBottom)*fReciprocalHeight,fRange*-NearZ,1.0f vValues = _mm_mul_ps(vValues, rMem2); - M.r[3] = vValues; + M.r[3] = vValues; return M; #endif } @@ -3215,13 +2996,22 @@ inline XMMATRIX XM_CALLCONV XMMatrixOrthographicOffCenterRH //------------------------------------------------------------------------------ -inline XMMATRIX::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 +inline XMMATRIX::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 { r[0] = XMVectorSet(m00, m01, m02, m03); r[1] = XMVectorSet(m10, m11, m12, m13); @@ -3230,8 +3020,7 @@ inline XMMATRIX::XMMATRIX } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMMATRIX::XMMATRIX(const float* pArray) noexcept +_Use_decl_annotations_ inline XMMATRIX::XMMATRIX(const float* pArray) noexcept { assert(pArray != nullptr); r[0] = XMLoadFloat4(reinterpret_cast(pArray)); @@ -3242,7 +3031,7 @@ inline XMMATRIX::XMMATRIX(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMMATRIX XMMATRIX::operator- () const noexcept +inline XMMATRIX XMMATRIX::operator-() const noexcept { XMMATRIX R; R.r[0] = XMVectorNegate(r[0]); @@ -3254,7 +3043,7 @@ inline XMMATRIX XMMATRIX::operator- () const noexcept //------------------------------------------------------------------------------ -inline XMMATRIX& XM_CALLCONV XMMATRIX::operator+= (FXMMATRIX M) noexcept +inline XMMATRIX& XM_CALLCONV XMMATRIX::operator+=(FXMMATRIX M) noexcept { r[0] = XMVectorAdd(r[0], M.r[0]); r[1] = XMVectorAdd(r[1], M.r[1]); @@ -3265,7 +3054,7 @@ inline XMMATRIX& XM_CALLCONV XMMATRIX::operator+= (FXMMATRIX M) noexcept //------------------------------------------------------------------------------ -inline XMMATRIX& XM_CALLCONV XMMATRIX::operator-= (FXMMATRIX M) noexcept +inline XMMATRIX& XM_CALLCONV XMMATRIX::operator-=(FXMMATRIX M) noexcept { r[0] = XMVectorSubtract(r[0], M.r[0]); r[1] = XMVectorSubtract(r[1], M.r[1]); @@ -3284,7 +3073,7 @@ inline XMMATRIX& XM_CALLCONV XMMATRIX::operator*=(FXMMATRIX M) noexcept //------------------------------------------------------------------------------ -inline XMMATRIX& XMMATRIX::operator*= (float S) noexcept +inline XMMATRIX& XMMATRIX::operator*=(float S) noexcept { r[0] = XMVectorScale(r[0], S); r[1] = XMVectorScale(r[1], S); @@ -3295,50 +3084,50 @@ inline XMMATRIX& XMMATRIX::operator*= (float S) noexcept //------------------------------------------------------------------------------ -inline XMMATRIX& XMMATRIX::operator/= (float S) noexcept +inline XMMATRIX& XMMATRIX::operator/=(float S) noexcept { #if defined(_XM_NO_INTRINSICS_) XMVECTOR vS = XMVectorReplicate(S); - r[0] = XMVectorDivide(r[0], vS); - r[1] = XMVectorDivide(r[1], vS); - r[2] = XMVectorDivide(r[2], vS); - r[3] = XMVectorDivide(r[3], vS); + r[0] = XMVectorDivide(r[0], vS); + r[1] = XMVectorDivide(r[1], vS); + r[2] = XMVectorDivide(r[2], vS); + r[3] = XMVectorDivide(r[3], vS); return *this; #elif defined(_XM_ARM_NEON_INTRINSICS_) #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ float32x4_t vS = vdupq_n_f32(S); - r[0] = vdivq_f32(r[0], vS); - r[1] = vdivq_f32(r[1], vS); - r[2] = vdivq_f32(r[2], vS); - r[3] = vdivq_f32(r[3], vS); + r[0] = vdivq_f32(r[0], vS); + r[1] = vdivq_f32(r[1], vS); + r[2] = vdivq_f32(r[2], vS); + r[3] = vdivq_f32(r[3], vS); #else // 2 iterations of Newton-Raphson refinement of reciprocal - float32x2_t vS = vdup_n_f32(S); - float32x2_t R0 = vrecpe_f32(vS); - float32x2_t S0 = vrecps_f32(R0, vS); - R0 = vmul_f32(S0, R0); - S0 = vrecps_f32(R0, vS); - R0 = vmul_f32(S0, R0); + float32x2_t vS = vdup_n_f32(S); + float32x2_t R0 = vrecpe_f32(vS); + float32x2_t S0 = vrecps_f32(R0, vS); + R0 = vmul_f32(S0, R0); + S0 = vrecps_f32(R0, vS); + R0 = vmul_f32(S0, R0); float32x4_t Reciprocal = vcombine_f32(R0, R0); - r[0] = vmulq_f32(r[0], Reciprocal); - r[1] = vmulq_f32(r[1], Reciprocal); - r[2] = vmulq_f32(r[2], Reciprocal); - r[3] = vmulq_f32(r[3], Reciprocal); + r[0] = vmulq_f32(r[0], Reciprocal); + r[1] = vmulq_f32(r[1], Reciprocal); + r[2] = vmulq_f32(r[2], Reciprocal); + r[3] = vmulq_f32(r[3], Reciprocal); #endif return *this; #elif defined(_XM_SSE_INTRINSICS_) __m128 vS = _mm_set_ps1(S); - r[0] = _mm_div_ps(r[0], vS); - r[1] = _mm_div_ps(r[1], vS); - r[2] = _mm_div_ps(r[2], vS); - r[3] = _mm_div_ps(r[3], vS); + r[0] = _mm_div_ps(r[0], vS); + r[1] = _mm_div_ps(r[1], vS); + r[2] = _mm_div_ps(r[2], vS); + r[3] = _mm_div_ps(r[3], vS); return *this; #endif } //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMATRIX::operator+ (FXMMATRIX M) const noexcept +inline XMMATRIX XM_CALLCONV XMMATRIX::operator+(FXMMATRIX M) const noexcept { XMMATRIX R; R.r[0] = XMVectorAdd(r[0], M.r[0]); @@ -3350,7 +3139,7 @@ inline XMMATRIX XM_CALLCONV XMMATRIX::operator+ (FXMMATRIX M) const noexcept //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV XMMATRIX::operator- (FXMMATRIX M) const noexcept +inline XMMATRIX XM_CALLCONV XMMATRIX::operator-(FXMMATRIX M) const noexcept { XMMATRIX R; R.r[0] = XMVectorSubtract(r[0], M.r[0]); @@ -3369,7 +3158,7 @@ inline XMMATRIX XM_CALLCONV XMMATRIX::operator*(FXMMATRIX M) const noexcept //------------------------------------------------------------------------------ -inline XMMATRIX XMMATRIX::operator* (float S) const noexcept +inline XMMATRIX XMMATRIX::operator*(float S) const noexcept { XMMATRIX R; R.r[0] = XMVectorScale(r[0], S); @@ -3381,7 +3170,7 @@ inline XMMATRIX XMMATRIX::operator* (float S) const noexcept //------------------------------------------------------------------------------ -inline XMMATRIX XMMATRIX::operator/ (float S) const noexcept +inline XMMATRIX XMMATRIX::operator/(float S) const noexcept { #if defined(_XM_NO_INTRINSICS_) XMVECTOR vS = XMVectorReplicate(S); @@ -3394,21 +3183,21 @@ inline XMMATRIX XMMATRIX::operator/ (float S) const noexcept #elif defined(_XM_ARM_NEON_INTRINSICS_) #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ float32x4_t vS = vdupq_n_f32(S); - XMMATRIX R; + XMMATRIX R; R.r[0] = vdivq_f32(r[0], vS); R.r[1] = vdivq_f32(r[1], vS); R.r[2] = vdivq_f32(r[2], vS); R.r[3] = vdivq_f32(r[3], vS); #else // 2 iterations of Newton-Raphson refinement of reciprocal - float32x2_t vS = vdup_n_f32(S); - float32x2_t R0 = vrecpe_f32(vS); - float32x2_t S0 = vrecps_f32(R0, vS); - R0 = vmul_f32(S0, R0); - S0 = vrecps_f32(R0, vS); - R0 = vmul_f32(S0, R0); + float32x2_t vS = vdup_n_f32(S); + float32x2_t R0 = vrecpe_f32(vS); + float32x2_t S0 = vrecps_f32(R0, vS); + R0 = vmul_f32(S0, R0); + S0 = vrecps_f32(R0, vS); + R0 = vmul_f32(S0, R0); float32x4_t Reciprocal = vcombine_f32(R0, R0); - XMMATRIX R; + XMMATRIX R; R.r[0] = vmulq_f32(r[0], Reciprocal); R.r[1] = vmulq_f32(r[1], Reciprocal); R.r[2] = vmulq_f32(r[2], Reciprocal); @@ -3416,7 +3205,7 @@ inline XMMATRIX XMMATRIX::operator/ (float S) const noexcept #endif return R; #elif defined(_XM_SSE_INTRINSICS_) - __m128 vS = _mm_set_ps1(S); + __m128 vS = _mm_set_ps1(S); XMMATRIX R; R.r[0] = _mm_div_ps(r[0], vS); R.r[1] = _mm_div_ps(r[1], vS); @@ -3428,11 +3217,7 @@ inline XMMATRIX XMMATRIX::operator/ (float S) const noexcept //------------------------------------------------------------------------------ -inline XMMATRIX XM_CALLCONV operator* -( - float S, - FXMMATRIX M - ) noexcept +inline XMMATRIX XM_CALLCONV operator*(float S, FXMMATRIX M) noexcept { XMMATRIX R; R.r[0] = XMVectorScale(M.r[0], S); @@ -3449,8 +3234,7 @@ inline XMMATRIX XM_CALLCONV operator* ****************************************************************************/ //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMFLOAT3X3::XMFLOAT3X3(const float* pArray) noexcept +_Use_decl_annotations_ inline XMFLOAT3X3::XMFLOAT3X3(const float* pArray) noexcept { assert(pArray != nullptr); for (size_t Row = 0; Row < 3; Row++) @@ -3469,8 +3253,7 @@ inline XMFLOAT3X3::XMFLOAT3X3(const float* pArray) noexcept ****************************************************************************/ //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMFLOAT4X3::XMFLOAT4X3(const float* pArray) noexcept +_Use_decl_annotations_ inline XMFLOAT4X3::XMFLOAT4X3(const float* pArray) noexcept { assert(pArray != nullptr); @@ -3492,14 +3275,13 @@ inline XMFLOAT4X3::XMFLOAT4X3(const float* pArray) noexcept } /**************************************************************************** -* -* XMFLOAT3X4 operators -* -****************************************************************************/ + * + * XMFLOAT3X4 operators + * + ****************************************************************************/ //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMFLOAT3X4::XMFLOAT3X4(const float* pArray) noexcept +_Use_decl_annotations_ inline XMFLOAT3X4::XMFLOAT3X4(const float* pArray) noexcept { assert(pArray != nullptr); @@ -3526,8 +3308,7 @@ inline XMFLOAT3X4::XMFLOAT3X4(const float* pArray) noexcept ****************************************************************************/ //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMFLOAT4X4::XMFLOAT4X4(const float* pArray) noexcept +_Use_decl_annotations_ inline XMFLOAT4X4::XMFLOAT4X4(const float* pArray) noexcept { assert(pArray != nullptr); @@ -3551,4 +3332,3 @@ inline XMFLOAT4X4::XMFLOAT4X4(const float* pArray) noexcept m[3][2] = pArray[14]; m[3][3] = pArray[15]; } - diff --git a/Inc/DirectXMathMisc.inl b/Inc/DirectXMathMisc.inl index d7981043..01378ec7 100644 --- a/Inc/DirectXMathMisc.inl +++ b/Inc/DirectXMathMisc.inl @@ -21,22 +21,14 @@ //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMQuaternionEqual -( - FXMVECTOR Q1, - FXMVECTOR Q2 -) noexcept +inline bool XM_CALLCONV XMQuaternionEqual(FXMVECTOR Q1, FXMVECTOR Q2) noexcept { return XMVector4Equal(Q1, Q2); } //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMQuaternionNotEqual -( - FXMVECTOR Q1, - FXMVECTOR Q2 -) noexcept +inline bool XM_CALLCONV XMQuaternionNotEqual(FXMVECTOR Q1, FXMVECTOR Q2) noexcept { return XMVector4NotEqual(Q1, Q2); } @@ -68,22 +60,14 @@ inline bool XM_CALLCONV XMQuaternionIsIdentity(FXMVECTOR Q) noexcept //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMQuaternionDot -( - FXMVECTOR Q1, - FXMVECTOR Q2 -) noexcept +inline XMVECTOR XM_CALLCONV XMQuaternionDot(FXMVECTOR Q1, FXMVECTOR Q2) noexcept { return XMVector4Dot(Q1, Q2); } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMQuaternionMultiply -( - FXMVECTOR Q1, - FXMVECTOR Q2 -) noexcept +inline XMVECTOR XM_CALLCONV XMQuaternionMultiply(FXMVECTOR Q1, FXMVECTOR Q2) noexcept { // Returns the product Q2*Q1 (which is the concatenation of a rotation Q1 followed by the rotation Q2) @@ -93,12 +77,14 @@ inline XMVECTOR XM_CALLCONV XMQuaternionMultiply // (Q2.w * Q1.w) - (Q2.x * Q1.x) - (Q2.y * Q1.y) - (Q2.z * Q1.z) ] #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - (Q2.vector4_f32[3] * Q1.vector4_f32[0]) + (Q2.vector4_f32[0] * Q1.vector4_f32[3]) + (Q2.vector4_f32[1] * Q1.vector4_f32[2]) - (Q2.vector4_f32[2] * Q1.vector4_f32[1]), - (Q2.vector4_f32[3] * Q1.vector4_f32[1]) - (Q2.vector4_f32[0] * Q1.vector4_f32[2]) + (Q2.vector4_f32[1] * Q1.vector4_f32[3]) + (Q2.vector4_f32[2] * Q1.vector4_f32[0]), - (Q2.vector4_f32[3] * Q1.vector4_f32[2]) + (Q2.vector4_f32[0] * Q1.vector4_f32[1]) - (Q2.vector4_f32[1] * Q1.vector4_f32[0]) + (Q2.vector4_f32[2] * Q1.vector4_f32[3]), - (Q2.vector4_f32[3] * Q1.vector4_f32[3]) - (Q2.vector4_f32[0] * Q1.vector4_f32[0]) - (Q2.vector4_f32[1] * Q1.vector4_f32[1]) - (Q2.vector4_f32[2] * Q1.vector4_f32[2]) - } } }; + XMVECTORF32 Result = { { { (Q2.vector4_f32[3] * Q1.vector4_f32[0]) + (Q2.vector4_f32[0] * Q1.vector4_f32[3]) + + (Q2.vector4_f32[1] * Q1.vector4_f32[2]) - (Q2.vector4_f32[2] * Q1.vector4_f32[1]), + (Q2.vector4_f32[3] * Q1.vector4_f32[1]) - (Q2.vector4_f32[0] * Q1.vector4_f32[2]) + (Q2.vector4_f32[1] * Q1.vector4_f32[3]) + + (Q2.vector4_f32[2] * Q1.vector4_f32[0]), + (Q2.vector4_f32[3] * Q1.vector4_f32[2]) + (Q2.vector4_f32[0] * Q1.vector4_f32[1]) - (Q2.vector4_f32[1] * Q1.vector4_f32[0]) + + (Q2.vector4_f32[2] * Q1.vector4_f32[3]), + (Q2.vector4_f32[3] * Q1.vector4_f32[3]) - (Q2.vector4_f32[0] * Q1.vector4_f32[0]) - (Q2.vector4_f32[1] * Q1.vector4_f32[1]) + - (Q2.vector4_f32[2] * Q1.vector4_f32[2]) } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) static const XMVECTORF32 ControlWZYX = { { { 1.0f, -1.0f, 1.0f, -1.0f } } }; @@ -108,26 +94,26 @@ inline XMVECTOR XM_CALLCONV XMQuaternionMultiply float32x2_t Q2L = vget_low_f32(Q2); float32x2_t Q2H = vget_high_f32(Q2); - float32x4_t Q2X = vdupq_lane_f32(Q2L, 0); - float32x4_t Q2Y = vdupq_lane_f32(Q2L, 1); - float32x4_t Q2Z = vdupq_lane_f32(Q2H, 0); - XMVECTOR vResult = vmulq_lane_f32(Q1, Q2H, 1); + float32x4_t Q2X = vdupq_lane_f32(Q2L, 0); + float32x4_t Q2Y = vdupq_lane_f32(Q2L, 1); + float32x4_t Q2Z = vdupq_lane_f32(Q2H, 0); + XMVECTOR vResult = vmulq_lane_f32(Q1, Q2H, 1); // Mul by Q1WZYX float32x4_t vTemp = vrev64q_f32(Q1); - vTemp = vcombine_f32(vget_high_f32(vTemp), vget_low_f32(vTemp)); - Q2X = vmulq_f32(Q2X, vTemp); - vResult = vmlaq_f32(vResult, Q2X, ControlWZYX); + vTemp = vcombine_f32(vget_high_f32(vTemp), vget_low_f32(vTemp)); + Q2X = vmulq_f32(Q2X, vTemp); + vResult = vmlaq_f32(vResult, Q2X, ControlWZYX); // Mul by Q1ZWXY - vTemp = vreinterpretq_f32_u32(vrev64q_u32(vreinterpretq_u32_f32(vTemp))); - Q2Y = vmulq_f32(Q2Y, vTemp); + vTemp = vreinterpretq_f32_u32(vrev64q_u32(vreinterpretq_u32_f32(vTemp))); + Q2Y = vmulq_f32(Q2Y, vTemp); vResult = vmlaq_f32(vResult, Q2Y, ControlZWXY); // Mul by Q1YXWZ - vTemp = vreinterpretq_f32_u32(vrev64q_u32(vreinterpretq_u32_f32(vTemp))); - vTemp = vcombine_f32(vget_high_f32(vTemp), vget_low_f32(vTemp)); - Q2Z = vmulq_f32(Q2Z, vTemp); + vTemp = vreinterpretq_f32_u32(vrev64q_u32(vreinterpretq_u32_f32(vTemp))); + vTemp = vcombine_f32(vget_high_f32(vTemp), vget_low_f32(vTemp)); + Q2Z = vmulq_f32(Q2Z, vTemp); vResult = vmlaq_f32(vResult, Q2Z, ControlYXWZ); return vResult; #elif defined(_XM_SSE_INTRINSICS_) @@ -135,34 +121,34 @@ inline XMVECTOR XM_CALLCONV XMQuaternionMultiply static const XMVECTORF32 ControlZWXY = { { { 1.0f, 1.0f, -1.0f, -1.0f } } }; static const XMVECTORF32 ControlYXWZ = { { { -1.0f, 1.0f, 1.0f, -1.0f } } }; // Copy to SSE registers and use as few as possible for x86 - XMVECTOR Q2X = Q2; - XMVECTOR Q2Y = Q2; - XMVECTOR Q2Z = Q2; + XMVECTOR Q2X = Q2; + XMVECTOR Q2Y = Q2; + XMVECTOR Q2Z = Q2; XMVECTOR vResult = Q2; // Splat with one instruction vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(3, 3, 3, 3)); - Q2X = XM_PERMUTE_PS(Q2X, _MM_SHUFFLE(0, 0, 0, 0)); - Q2Y = XM_PERMUTE_PS(Q2Y, _MM_SHUFFLE(1, 1, 1, 1)); - Q2Z = XM_PERMUTE_PS(Q2Z, _MM_SHUFFLE(2, 2, 2, 2)); + Q2X = XM_PERMUTE_PS(Q2X, _MM_SHUFFLE(0, 0, 0, 0)); + Q2Y = XM_PERMUTE_PS(Q2Y, _MM_SHUFFLE(1, 1, 1, 1)); + Q2Z = XM_PERMUTE_PS(Q2Z, _MM_SHUFFLE(2, 2, 2, 2)); // Retire Q1 and perform Q1*Q2W - vResult = _mm_mul_ps(vResult, Q1); + vResult = _mm_mul_ps(vResult, Q1); XMVECTOR Q1Shuffle = Q1; // Shuffle the copies of Q1 Q1Shuffle = XM_PERMUTE_PS(Q1Shuffle, _MM_SHUFFLE(0, 1, 2, 3)); // Mul by Q1WZYX - Q2X = _mm_mul_ps(Q2X, Q1Shuffle); + Q2X = _mm_mul_ps(Q2X, Q1Shuffle); Q1Shuffle = XM_PERMUTE_PS(Q1Shuffle, _MM_SHUFFLE(2, 3, 0, 1)); // Flip the signs on y and z vResult = XM_FMADD_PS(Q2X, ControlWZYX, vResult); // Mul by Q1ZWXY - Q2Y = _mm_mul_ps(Q2Y, Q1Shuffle); + Q2Y = _mm_mul_ps(Q2Y, Q1Shuffle); Q1Shuffle = XM_PERMUTE_PS(Q1Shuffle, _MM_SHUFFLE(0, 1, 2, 3)); // Flip the signs on z and w Q2Y = _mm_mul_ps(Q2Y, ControlZWXY); // Mul by Q1YXWZ Q2Z = _mm_mul_ps(Q2Z, Q1Shuffle); // Flip the signs on x and w - Q2Y = XM_FMADD_PS(Q2Z, ControlYXWZ, Q2Y); + Q2Y = XM_FMADD_PS(Q2Z, ControlYXWZ, Q2Y); vResult = _mm_add_ps(vResult, Q2Y); return vResult; #endif @@ -208,12 +194,7 @@ inline XMVECTOR XM_CALLCONV XMQuaternionNormalize(FXMVECTOR Q) noexcept inline XMVECTOR XM_CALLCONV XMQuaternionConjugate(FXMVECTOR Q) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - -Q.vector4_f32[0], - -Q.vector4_f32[1], - -Q.vector4_f32[2], - Q.vector4_f32[3] - } } }; + XMVECTORF32 Result = { { { -Q.vector4_f32[0], -Q.vector4_f32[1], -Q.vector4_f32[2], Q.vector4_f32[3] } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) static const XMVECTORF32 NegativeOne3 = { { { -1.0f, -1.0f, -1.0f, 1.0f } } }; @@ -228,7 +209,7 @@ inline XMVECTOR XM_CALLCONV XMQuaternionConjugate(FXMVECTOR Q) noexcept inline XMVECTOR XM_CALLCONV XMQuaternionInverse(FXMVECTOR Q) noexcept { - XMVECTOR L = XMVector4LengthSq(Q); + XMVECTOR L = XMVector4LengthSq(Q); XMVECTOR Conjugate = XMQuaternionConjugate(Q); XMVECTOR Control = XMVectorLessOrEqual(L, g_XMEpsilon.v); @@ -251,13 +232,13 @@ inline XMVECTOR XM_CALLCONV XMQuaternionLn(FXMVECTOR Q) noexcept XMVECTOR ControlW = XMVectorInBounds(QW, OneMinusEpsilon.v); - XMVECTOR Theta = XMVectorACos(QW); + XMVECTOR Theta = XMVectorACos(QW); XMVECTOR SinTheta = XMVectorSin(Theta); XMVECTOR S = XMVectorDivide(Theta, SinTheta); XMVECTOR Result = XMVectorMultiply(Q0, S); - Result = XMVectorSelect(Q0, Result, ControlW); + Result = XMVectorSelect(Q0, Result, ControlW); return Result; } @@ -275,9 +256,9 @@ inline XMVECTOR XM_CALLCONV XMQuaternionExp(FXMVECTOR Q) noexcept XMVECTOR Result = XMVectorMultiply(Q, S); - const XMVECTOR Zero = XMVectorZero(); - XMVECTOR Control = XMVectorNearEqual(Theta, Zero, g_XMEpsilon.v); - Result = XMVectorSelect(Result, Q, Control); + const XMVECTOR Zero = XMVectorZero(); + XMVECTOR Control = XMVectorNearEqual(Theta, Zero, g_XMEpsilon.v); + Result = XMVectorSelect(Result, Q, Control); Result = XMVectorSelect(CosTheta, Result, g_XMSelect1110.v); @@ -286,12 +267,7 @@ inline XMVECTOR XM_CALLCONV XMQuaternionExp(FXMVECTOR Q) noexcept //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMQuaternionSlerp -( - FXMVECTOR Q0, - FXMVECTOR Q1, - float t -) noexcept +inline XMVECTOR XM_CALLCONV XMQuaternionSlerp(FXMVECTOR Q0, FXMVECTOR Q1, float t) noexcept { XMVECTOR T = XMVectorReplicate(t); return XMQuaternionSlerpV(Q0, Q1, T); @@ -299,12 +275,7 @@ inline XMVECTOR XM_CALLCONV XMQuaternionSlerp //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMQuaternionSlerpV -( - FXMVECTOR Q0, - FXMVECTOR Q1, - FXMVECTOR T -) noexcept +inline XMVECTOR XM_CALLCONV XMQuaternionSlerpV(FXMVECTOR Q0, FXMVECTOR Q1, FXMVECTOR T) noexcept { assert((XMVectorGetY(T) == XMVectorGetX(T)) && (XMVectorGetZ(T) == XMVectorGetX(T)) && (XMVectorGetW(T) == XMVectorGetX(T))); @@ -316,95 +287,88 @@ inline XMVECTOR XM_CALLCONV XMQuaternionSlerpV XMVECTOR CosOmega = XMQuaternionDot(Q0, Q1); - const XMVECTOR Zero = XMVectorZero(); - XMVECTOR Control = XMVectorLess(CosOmega, Zero); - XMVECTOR Sign = XMVectorSelect(g_XMOne.v, g_XMNegativeOne.v, Control); + const XMVECTOR Zero = XMVectorZero(); + XMVECTOR Control = XMVectorLess(CosOmega, Zero); + XMVECTOR Sign = XMVectorSelect(g_XMOne.v, g_XMNegativeOne.v, Control); CosOmega = XMVectorMultiply(CosOmega, Sign); Control = XMVectorLess(CosOmega, OneMinusEpsilon); XMVECTOR SinOmega = XMVectorNegativeMultiplySubtract(CosOmega, CosOmega, g_XMOne.v); - SinOmega = XMVectorSqrt(SinOmega); + SinOmega = XMVectorSqrt(SinOmega); XMVECTOR Omega = XMVectorATan2(SinOmega, CosOmega); XMVECTOR SignMask = XMVectorSplatSignMask(); - XMVECTOR V01 = XMVectorShiftLeft(T, Zero, 2); - SignMask = XMVectorShiftLeft(SignMask, Zero, 3); - V01 = XMVectorXorInt(V01, SignMask); - V01 = XMVectorAdd(g_XMIdentityR0.v, V01); + XMVECTOR V01 = XMVectorShiftLeft(T, Zero, 2); + SignMask = XMVectorShiftLeft(SignMask, Zero, 3); + V01 = XMVectorXorInt(V01, SignMask); + V01 = XMVectorAdd(g_XMIdentityR0.v, V01); XMVECTOR InvSinOmega = XMVectorReciprocal(SinOmega); XMVECTOR S0 = XMVectorMultiply(V01, Omega); - S0 = XMVectorSin(S0); - S0 = XMVectorMultiply(S0, InvSinOmega); + S0 = XMVectorSin(S0); + S0 = XMVectorMultiply(S0, InvSinOmega); S0 = XMVectorSelect(V01, S0, Control); XMVECTOR S1 = XMVectorSplatY(S0); - S0 = XMVectorSplatX(S0); + S0 = XMVectorSplatX(S0); S1 = XMVectorMultiply(S1, Sign); XMVECTOR Result = XMVectorMultiply(Q0, S0); - Result = XMVectorMultiplyAdd(Q1, S1, Result); + Result = XMVectorMultiplyAdd(Q1, S1, Result); return Result; #elif defined(_XM_SSE_INTRINSICS_) static const XMVECTORF32 OneMinusEpsilon = { { { 1.0f - 0.00001f, 1.0f - 0.00001f, 1.0f - 0.00001f, 1.0f - 0.00001f } } }; - static const XMVECTORU32 SignMask2 = { { { 0x80000000, 0x00000000, 0x00000000, 0x00000000 } } }; + static const XMVECTORU32 SignMask2 = { { { 0x80000000, 0x00000000, 0x00000000, 0x00000000 } } }; XMVECTOR CosOmega = XMQuaternionDot(Q0, Q1); - const XMVECTOR Zero = XMVectorZero(); - XMVECTOR Control = XMVectorLess(CosOmega, Zero); - XMVECTOR Sign = XMVectorSelect(g_XMOne, g_XMNegativeOne, Control); + const XMVECTOR Zero = XMVectorZero(); + XMVECTOR Control = XMVectorLess(CosOmega, Zero); + XMVECTOR Sign = XMVectorSelect(g_XMOne, g_XMNegativeOne, Control); CosOmega = _mm_mul_ps(CosOmega, Sign); Control = XMVectorLess(CosOmega, OneMinusEpsilon); XMVECTOR SinOmega = _mm_mul_ps(CosOmega, CosOmega); - SinOmega = _mm_sub_ps(g_XMOne, SinOmega); - SinOmega = _mm_sqrt_ps(SinOmega); + SinOmega = _mm_sub_ps(g_XMOne, SinOmega); + SinOmega = _mm_sqrt_ps(SinOmega); XMVECTOR Omega = XMVectorATan2(SinOmega, CosOmega); XMVECTOR V01 = XM_PERMUTE_PS(T, _MM_SHUFFLE(2, 3, 0, 1)); - V01 = _mm_and_ps(V01, g_XMMaskXY); - V01 = _mm_xor_ps(V01, SignMask2); - V01 = _mm_add_ps(g_XMIdentityR0, V01); + V01 = _mm_and_ps(V01, g_XMMaskXY); + V01 = _mm_xor_ps(V01, SignMask2); + V01 = _mm_add_ps(g_XMIdentityR0, V01); XMVECTOR S0 = _mm_mul_ps(V01, Omega); - S0 = XMVectorSin(S0); - S0 = _mm_div_ps(S0, SinOmega); + S0 = XMVectorSin(S0); + S0 = _mm_div_ps(S0, SinOmega); S0 = XMVectorSelect(V01, S0, Control); XMVECTOR S1 = XMVectorSplatY(S0); - S0 = XMVectorSplatX(S0); + S0 = XMVectorSplatX(S0); - S1 = _mm_mul_ps(S1, Sign); + S1 = _mm_mul_ps(S1, Sign); XMVECTOR Result = _mm_mul_ps(Q0, S0); - S1 = _mm_mul_ps(S1, Q1); - Result = _mm_add_ps(Result, S1); + S1 = _mm_mul_ps(S1, Q1); + Result = _mm_add_ps(Result, S1); return Result; #endif } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMQuaternionSquad -( - FXMVECTOR Q0, - FXMVECTOR Q1, - FXMVECTOR Q2, - GXMVECTOR Q3, - float t -) noexcept +inline XMVECTOR XM_CALLCONV XMQuaternionSquad(FXMVECTOR Q0, FXMVECTOR Q1, FXMVECTOR Q2, GXMVECTOR Q3, float t) noexcept { XMVECTOR T = XMVectorReplicate(t); return XMQuaternionSquadV(Q0, Q1, Q2, Q3, T); @@ -412,18 +376,11 @@ inline XMVECTOR XM_CALLCONV XMQuaternionSquad //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMQuaternionSquadV -( - FXMVECTOR Q0, - FXMVECTOR Q1, - FXMVECTOR Q2, - GXMVECTOR Q3, - HXMVECTOR T -) noexcept +inline XMVECTOR XM_CALLCONV XMQuaternionSquadV(FXMVECTOR Q0, FXMVECTOR Q1, FXMVECTOR Q2, GXMVECTOR Q3, HXMVECTOR T) noexcept { assert((XMVectorGetY(T) == XMVectorGetX(T)) && (XMVectorGetZ(T) == XMVectorGetX(T)) && (XMVectorGetW(T) == XMVectorGetX(T))); - XMVECTOR TP = T; + XMVECTOR TP = T; const XMVECTOR Two = XMVectorSplatConstant(2, 0); XMVECTOR Q03 = XMQuaternionSlerpV(Q0, Q3, T); @@ -438,17 +395,8 @@ inline XMVECTOR XM_CALLCONV XMQuaternionSquadV } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMQuaternionSquadSetup -( - XMVECTOR* pA, - XMVECTOR* pB, - XMVECTOR* pC, - FXMVECTOR Q0, - FXMVECTOR Q1, - FXMVECTOR Q2, - GXMVECTOR Q3 -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV +XMQuaternionSquadSetup(XMVECTOR* pA, XMVECTOR* pB, XMVECTOR* pC, FXMVECTOR Q0, FXMVECTOR Q1, FXMVECTOR Q2, GXMVECTOR Q3) noexcept { assert(pA); assert(pB); @@ -456,18 +404,18 @@ inline void XM_CALLCONV XMQuaternionSquadSetup XMVECTOR LS12 = XMQuaternionLengthSq(XMVectorAdd(Q1, Q2)); XMVECTOR LD12 = XMQuaternionLengthSq(XMVectorSubtract(Q1, Q2)); - XMVECTOR SQ2 = XMVectorNegate(Q2); + XMVECTOR SQ2 = XMVectorNegate(Q2); XMVECTOR Control1 = XMVectorLess(LS12, LD12); - SQ2 = XMVectorSelect(Q2, SQ2, Control1); + SQ2 = XMVectorSelect(Q2, SQ2, Control1); XMVECTOR LS01 = XMQuaternionLengthSq(XMVectorAdd(Q0, Q1)); XMVECTOR LD01 = XMQuaternionLengthSq(XMVectorSubtract(Q0, Q1)); - XMVECTOR SQ0 = XMVectorNegate(Q0); + XMVECTOR SQ0 = XMVectorNegate(Q0); XMVECTOR LS23 = XMQuaternionLengthSq(XMVectorAdd(SQ2, Q3)); XMVECTOR LD23 = XMQuaternionLengthSq(XMVectorSubtract(SQ2, Q3)); - XMVECTOR SQ3 = XMVectorNegate(Q3); + XMVECTOR SQ3 = XMVectorNegate(Q3); XMVECTOR Control0 = XMVectorLess(LS01, LD01); XMVECTOR Control2 = XMVectorLess(LS23, LD23); @@ -487,8 +435,8 @@ inline void XM_CALLCONV XMQuaternionSquadSetup XMVECTOR ExpQ02 = XMVectorMultiply(XMVectorAdd(LnQ0, LnQ2), NegativeOneQuarter); XMVECTOR ExpQ13 = XMVectorMultiply(XMVectorAdd(LnQ1, LnQ3), NegativeOneQuarter); - ExpQ02 = XMQuaternionExp(ExpQ02); - ExpQ13 = XMQuaternionExp(ExpQ13); + ExpQ02 = XMQuaternionExp(ExpQ02); + ExpQ13 = XMQuaternionExp(ExpQ13); *pA = XMQuaternionMultiply(Q1, ExpQ02); *pB = XMQuaternionMultiply(SQ2, ExpQ13); @@ -497,14 +445,7 @@ inline void XM_CALLCONV XMQuaternionSquadSetup //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMQuaternionBaryCentric -( - FXMVECTOR Q0, - FXMVECTOR Q1, - FXMVECTOR Q2, - float f, - float g -) noexcept +inline XMVECTOR XM_CALLCONV XMQuaternionBaryCentric(FXMVECTOR Q0, FXMVECTOR Q1, FXMVECTOR Q2, float f, float g) noexcept { float s = f + g; @@ -526,14 +467,7 @@ inline XMVECTOR XM_CALLCONV XMQuaternionBaryCentric //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMQuaternionBaryCentricV -( - FXMVECTOR Q0, - FXMVECTOR Q1, - FXMVECTOR Q2, - GXMVECTOR F, - HXMVECTOR G -) noexcept +inline XMVECTOR XM_CALLCONV XMQuaternionBaryCentricV(FXMVECTOR Q0, FXMVECTOR Q1, FXMVECTOR Q2, GXMVECTOR F, HXMVECTOR G) noexcept { assert((XMVectorGetY(F) == XMVectorGetX(F)) && (XMVectorGetZ(F) == XMVectorGetX(F)) && (XMVectorGetW(F) == XMVectorGetX(F))); assert((XMVectorGetY(G) == XMVectorGetX(G)) && (XMVectorGetZ(G) == XMVectorGetX(G)) && (XMVectorGetW(G) == XMVectorGetX(G))); @@ -551,8 +485,8 @@ inline XMVECTOR XM_CALLCONV XMQuaternionBaryCentricV { XMVECTOR Q01 = XMQuaternionSlerpV(Q0, Q1, S); XMVECTOR Q02 = XMQuaternionSlerpV(Q0, Q2, S); - XMVECTOR GS = XMVectorReciprocal(S); - GS = XMVectorMultiply(G, GS); + XMVECTOR GS = XMVectorReciprocal(S); + GS = XMVectorMultiply(G, GS); Result = XMQuaternionSlerpV(Q01, Q02, GS); } @@ -573,32 +507,23 @@ inline XMVECTOR XM_CALLCONV XMQuaternionIdentity() noexcept //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMQuaternionRotationRollPitchYaw -( - float Pitch, - float Yaw, - float Roll -) noexcept +inline XMVECTOR XM_CALLCONV XMQuaternionRotationRollPitchYaw(float Pitch, float Yaw, float Roll) noexcept { #if defined(_XM_NO_INTRINSICS_) const float halfpitch = Pitch * 0.5f; - float cp = cosf(halfpitch); - float sp = sinf(halfpitch); + float cp = cosf(halfpitch); + float sp = sinf(halfpitch); const float halfyaw = Yaw * 0.5f; - float cy = cosf(halfyaw); - float sy = sinf(halfyaw); + float cy = cosf(halfyaw); + float sy = sinf(halfyaw); const float halfroll = Roll * 0.5f; - float cr = cosf(halfroll); - float sr = sinf(halfroll); + float cr = cosf(halfroll); + float sr = sinf(halfroll); - XMVECTORF32 vResult = { { { - cr * sp * cy + sr * cp * sy, - cr * cp * sy - sr * sp * cy, - sr * cp * cy - cr * sp * sy, - cr * cp * cy + sr * sp * sy - } } }; + XMVECTORF32 vResult + = { { { cr * sp * cy + sr * cp * sy, cr * cp * sy - sr * sp * cy, sr * cp * cy - cr * sp * sy, cr * cp * cy + sr * sp * sy } } }; return vResult; #else XMVECTOR Angles = XMVectorSet(Pitch, Yaw, Roll, 0.0f); @@ -608,33 +533,27 @@ inline XMVECTOR XM_CALLCONV XMQuaternionRotationRollPitchYaw //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMQuaternionRotationRollPitchYawFromVector -( - FXMVECTOR Angles // -) noexcept +inline XMVECTOR XM_CALLCONV XMQuaternionRotationRollPitchYawFromVector(FXMVECTOR Angles // + ) noexcept { #if defined(_XM_NO_INTRINSICS_) const float halfpitch = Angles.vector4_f32[0] * 0.5f; - float cp = cosf(halfpitch); - float sp = sinf(halfpitch); + float cp = cosf(halfpitch); + float sp = sinf(halfpitch); const float halfyaw = Angles.vector4_f32[1] * 0.5f; - float cy = cosf(halfyaw); - float sy = sinf(halfyaw); + float cy = cosf(halfyaw); + float sy = sinf(halfyaw); const float halfroll = Angles.vector4_f32[2] * 0.5f; - float cr = cosf(halfroll); - float sr = sinf(halfroll); + float cr = cosf(halfroll); + float sr = sinf(halfroll); - XMVECTORF32 vResult = { { { - cr * sp * cy + sr * cp * sy, - cr * cp * sy - sr * sp * cy, - sr * cp * cy - cr * sp * sy, - cr * cp * cy + sr * sp * sy - } } }; + XMVECTORF32 vResult + = { { { cr * sp * cy + sr * cp * sy, cr * cp * sy - sr * sp * cy, sr * cp * cy - cr * sp * sy, cr * cp * cy + sr * sp * sy } } }; return vResult; #else - static const XMVECTORF32 Sign = { { { 1.0f, -1.0f, -1.0f, 1.0f } } }; + static const XMVECTORF32 Sign = { { { 1.0f, -1.0f, -1.0f, 1.0f } } }; XMVECTOR HalfAngles = XMVectorMultiply(Angles, g_XMOneHalf.v); @@ -650,9 +569,9 @@ inline XMVECTOR XM_CALLCONV XMQuaternionRotationRollPitchYawFromVector XMVECTOR Q1 = XMVectorMultiply(P1, Sign.v); XMVECTOR Q0 = XMVectorMultiply(P0, Y0); - Q1 = XMVectorMultiply(Q1, Y1); - Q0 = XMVectorMultiply(Q0, R0); - XMVECTOR Q = XMVectorMultiplyAdd(Q1, R1, Q0); + Q1 = XMVectorMultiply(Q1, Y1); + Q0 = XMVectorMultiply(Q0, R0); + XMVECTOR Q = XMVectorMultiplyAdd(Q1, R1, Q0); return Q; #endif @@ -660,11 +579,7 @@ inline XMVECTOR XM_CALLCONV XMQuaternionRotationRollPitchYawFromVector //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMQuaternionRotationNormal -( - FXMVECTOR NormalAxis, - float Angle -) noexcept +inline XMVECTOR XM_CALLCONV XMQuaternionRotationNormal(FXMVECTOR NormalAxis, float Angle) noexcept { #if defined(_XM_NO_INTRINSICS_) || defined(_XM_ARM_NEON_INTRINSICS_) @@ -676,33 +591,29 @@ inline XMVECTOR XM_CALLCONV XMQuaternionRotationNormal XMVECTOR Scale = XMVectorSet(SinV, SinV, SinV, CosV); return XMVectorMultiply(N, Scale); #elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR N = _mm_and_ps(NormalAxis, g_XMMask3); - N = _mm_or_ps(N, g_XMIdentityR3); + XMVECTOR N = _mm_and_ps(NormalAxis, g_XMMask3); + N = _mm_or_ps(N, g_XMIdentityR3); XMVECTOR Scale = _mm_set_ps1(0.5f * Angle); XMVECTOR vSine; XMVECTOR vCosine; XMVectorSinCos(&vSine, &vCosine, Scale); - Scale = _mm_and_ps(vSine, g_XMMask3); + Scale = _mm_and_ps(vSine, g_XMMask3); vCosine = _mm_and_ps(vCosine, g_XMMaskW); - Scale = _mm_or_ps(Scale, vCosine); - N = _mm_mul_ps(N, Scale); + Scale = _mm_or_ps(Scale, vCosine); + N = _mm_mul_ps(N, Scale); return N; #endif } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMQuaternionRotationAxis -( - FXMVECTOR Axis, - float Angle -) noexcept +inline XMVECTOR XM_CALLCONV XMQuaternionRotationAxis(FXMVECTOR Axis, float Angle) noexcept { assert(!XMVector3Equal(Axis, XMVectorZero())); assert(!XMVector3IsInfinite(Axis)); XMVECTOR Normal = XMVector3Normalize(Axis); - XMVECTOR Q = XMQuaternionRotationNormal(Normal, Angle); + XMVECTOR Q = XMQuaternionRotationNormal(Normal, Angle); return Q; } @@ -713,59 +624,59 @@ inline XMVECTOR XM_CALLCONV XMQuaternionRotationMatrix(FXMMATRIX M) noexcept #if defined(_XM_NO_INTRINSICS_) XMVECTORF32 q; - float r22 = M.m[2][2]; - if (r22 <= 0.f) // x^2 + y^2 >= z^2 + w^2 + float r22 = M.m[2][2]; + if (r22 <= 0.f) // x^2 + y^2 >= z^2 + w^2 { float dif10 = M.m[1][1] - M.m[0][0]; float omr22 = 1.f - r22; - if (dif10 <= 0.f) // x^2 >= y^2 + if (dif10 <= 0.f) // x^2 >= y^2 { float fourXSqr = omr22 - dif10; - float inv4x = 0.5f / sqrtf(fourXSqr); - q.f[0] = fourXSqr * inv4x; - q.f[1] = (M.m[0][1] + M.m[1][0]) * inv4x; - q.f[2] = (M.m[0][2] + M.m[2][0]) * inv4x; - q.f[3] = (M.m[1][2] - M.m[2][1]) * inv4x; + float inv4x = 0.5f / sqrtf(fourXSqr); + q.f[0] = fourXSqr * inv4x; + q.f[1] = (M.m[0][1] + M.m[1][0]) * inv4x; + q.f[2] = (M.m[0][2] + M.m[2][0]) * inv4x; + q.f[3] = (M.m[1][2] - M.m[2][1]) * inv4x; } - else // y^2 >= x^2 + else // y^2 >= x^2 { float fourYSqr = omr22 + dif10; - float inv4y = 0.5f / sqrtf(fourYSqr); - q.f[0] = (M.m[0][1] + M.m[1][0]) * inv4y; - q.f[1] = fourYSqr * inv4y; - q.f[2] = (M.m[1][2] + M.m[2][1]) * inv4y; - q.f[3] = (M.m[2][0] - M.m[0][2]) * inv4y; + float inv4y = 0.5f / sqrtf(fourYSqr); + q.f[0] = (M.m[0][1] + M.m[1][0]) * inv4y; + q.f[1] = fourYSqr * inv4y; + q.f[2] = (M.m[1][2] + M.m[2][1]) * inv4y; + q.f[3] = (M.m[2][0] - M.m[0][2]) * inv4y; } } - else // z^2 + w^2 >= x^2 + y^2 + else // z^2 + w^2 >= x^2 + y^2 { float sum10 = M.m[1][1] + M.m[0][0]; float opr22 = 1.f + r22; - if (sum10 <= 0.f) // z^2 >= w^2 + if (sum10 <= 0.f) // z^2 >= w^2 { float fourZSqr = opr22 - sum10; - float inv4z = 0.5f / sqrtf(fourZSqr); - q.f[0] = (M.m[0][2] + M.m[2][0]) * inv4z; - q.f[1] = (M.m[1][2] + M.m[2][1]) * inv4z; - q.f[2] = fourZSqr * inv4z; - q.f[3] = (M.m[0][1] - M.m[1][0]) * inv4z; + float inv4z = 0.5f / sqrtf(fourZSqr); + q.f[0] = (M.m[0][2] + M.m[2][0]) * inv4z; + q.f[1] = (M.m[1][2] + M.m[2][1]) * inv4z; + q.f[2] = fourZSqr * inv4z; + q.f[3] = (M.m[0][1] - M.m[1][0]) * inv4z; } - else // w^2 >= z^2 + else // w^2 >= z^2 { float fourWSqr = opr22 + sum10; - float inv4w = 0.5f / sqrtf(fourWSqr); - q.f[0] = (M.m[1][2] - M.m[2][1]) * inv4w; - q.f[1] = (M.m[2][0] - M.m[0][2]) * inv4w; - q.f[2] = (M.m[0][1] - M.m[1][0]) * inv4w; - q.f[3] = fourWSqr * inv4w; + float inv4w = 0.5f / sqrtf(fourWSqr); + q.f[0] = (M.m[1][2] - M.m[2][1]) * inv4w; + q.f[1] = (M.m[2][0] - M.m[0][2]) * inv4w; + q.f[2] = (M.m[0][1] - M.m[1][0]) * inv4w; + q.f[3] = fourWSqr * inv4w; } } return q.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 XMPMMP = { { { +1.0f, -1.0f, -1.0f, +1.0f } } }; - static const XMVECTORF32 XMMPMP = { { { -1.0f, +1.0f, -1.0f, +1.0f } } }; - static const XMVECTORF32 XMMMPP = { { { -1.0f, -1.0f, +1.0f, +1.0f } } }; + static const XMVECTORF32 XMPMMP = { { { +1.0f, -1.0f, -1.0f, +1.0f } } }; + static const XMVECTORF32 XMMPMP = { { { -1.0f, +1.0f, -1.0f, +1.0f } } }; + static const XMVECTORF32 XMMMPP = { { { -1.0f, -1.0f, +1.0f, +1.0f } } }; static const XMVECTORU32 Select0110 = { { { XM_SELECT_0, XM_SELECT_1, XM_SELECT_1, XM_SELECT_0 } } }; static const XMVECTORU32 Select0010 = { { { XM_SELECT_0, XM_SELECT_0, XM_SELECT_1, XM_SELECT_0 } } }; @@ -779,30 +690,30 @@ inline XMVECTOR XM_CALLCONV XMQuaternionRotationMatrix(FXMMATRIX M) noexcept // x^2 >= y^2 equivalent to r11 - r00 <= 0 float32x4_t r11mr00 = vsubq_f32(r11, r00); - uint32x4_t x2gey2 = vcleq_f32(r11mr00, g_XMZero); + uint32x4_t x2gey2 = vcleq_f32(r11mr00, g_XMZero); // z^2 >= w^2 equivalent to r11 + r00 <= 0 float32x4_t r11pr00 = vaddq_f32(r11, r00); - uint32x4_t z2gew2 = vcleq_f32(r11pr00, g_XMZero); + uint32x4_t z2gew2 = vcleq_f32(r11pr00, g_XMZero); // x^2 + y^2 >= z^2 + w^2 equivalent to r22 <= 0 uint32x4_t x2py2gez2pw2 = vcleq_f32(r22, g_XMZero); // (4*x^2, 4*y^2, 4*z^2, 4*w^2) - float32x4_t t0 = vmulq_f32(XMPMMP, r00); + float32x4_t t0 = vmulq_f32(XMPMMP, r00); float32x4_t x2y2z2w2 = vmlaq_f32(t0, XMMPMP, r11); - x2y2z2w2 = vmlaq_f32(x2y2z2w2, XMMMPP, r22); - x2y2z2w2 = vaddq_f32(x2y2z2w2, g_XMOne); + x2y2z2w2 = vmlaq_f32(x2y2z2w2, XMMMPP, r22); + x2y2z2w2 = vaddq_f32(x2y2z2w2, g_XMOne); // (r01, r02, r12, r11) - t0 = vextq_f32(r0, r0, 1); + t0 = vextq_f32(r0, r0, 1); float32x4_t t1 = vextq_f32(r1, r1, 1); - t0 = vcombine_f32(vget_low_f32(t0), vrev64_f32(vget_low_f32(t1))); + t0 = vcombine_f32(vget_low_f32(t0), vrev64_f32(vget_low_f32(t1))); // (r10, r20, r21, r10) - t1 = vextq_f32(r2, r2, 3); + t1 = vextq_f32(r2, r2, 3); float32x4_t r10 = vdupq_lane_f32(vget_low_f32(r1), 0); - t1 = vbslq_f32(Select0110, t1, r10); + t1 = vbslq_f32(Select0110, t1, r10); // (4*x*y, 4*x*z, 4*y*z, unused) float32x4_t xyxzyz = vaddq_f32(t0, t1); @@ -813,26 +724,26 @@ inline XMVECTOR XM_CALLCONV XMQuaternionRotationMatrix(FXMMATRIX M) noexcept // (r12, r02, r01, r12) float32x4_t t2 = vcombine_f32(vrev64_f32(vget_high_f32(r0)), vrev64_f32(vget_low_f32(r0))); float32x4_t t3 = vdupq_lane_f32(vget_high_f32(r1), 0); - t1 = vbslq_f32(Select0110, t2, t3); + t1 = vbslq_f32(Select0110, t2, t3); // (4*x*w, 4*y*w, 4*z*w, unused) float32x4_t xwywzw = vsubq_f32(t0, t1); - xwywzw = vmulq_f32(XMMPMP, xwywzw); + xwywzw = vmulq_f32(XMMPMP, xwywzw); // (4*x*x, 4*x*y, 4*x*z, 4*x*w) - t0 = vextq_f32(xyxzyz, xyxzyz, 3); - t1 = vbslq_f32(Select0110, t0, x2y2z2w2); - t2 = vdupq_lane_f32(vget_low_f32(xwywzw), 0); + t0 = vextq_f32(xyxzyz, xyxzyz, 3); + t1 = vbslq_f32(Select0110, t0, x2y2z2w2); + t2 = vdupq_lane_f32(vget_low_f32(xwywzw), 0); float32x4_t tensor0 = vbslq_f32(g_XMSelect1110, t1, t2); // (4*y*x, 4*y*y, 4*y*z, 4*y*w) - t0 = vbslq_f32(g_XMSelect1011, xyxzyz, x2y2z2w2); - t1 = vdupq_lane_f32(vget_low_f32(xwywzw), 1); + t0 = vbslq_f32(g_XMSelect1011, xyxzyz, x2y2z2w2); + t1 = vdupq_lane_f32(vget_low_f32(xwywzw), 1); float32x4_t tensor1 = vbslq_f32(g_XMSelect1110, t0, t1); // (4*z*x, 4*z*y, 4*z*z, 4*z*w) - t0 = vextq_f32(xyxzyz, xyxzyz, 1); - t1 = vcombine_f32(vget_low_f32(t0), vrev64_f32(vget_high_f32(xwywzw))); + t0 = vextq_f32(xyxzyz, xyxzyz, 1); + t1 = vcombine_f32(vget_low_f32(t0), vrev64_f32(vget_high_f32(xwywzw))); float32x4_t tensor2 = vbslq_f32(Select0010, x2y2z2w2, t1); // (4*w*x, 4*w*y, 4*w*z, 4*w*w) @@ -854,9 +765,9 @@ inline XMVECTOR XM_CALLCONV XMQuaternionRotationMatrix(FXMMATRIX M) noexcept static const XMVECTORF32 XMMPMP = { { { -1.0f, +1.0f, -1.0f, +1.0f } } }; static const XMVECTORF32 XMMMPP = { { { -1.0f, -1.0f, +1.0f, +1.0f } } }; - XMVECTOR r0 = M.r[0]; // (r00, r01, r02, 0) - XMVECTOR r1 = M.r[1]; // (r10, r11, r12, 0) - XMVECTOR r2 = M.r[2]; // (r20, r21, r22, 0) + XMVECTOR r0 = M.r[0]; // (r00, r01, r02, 0) + XMVECTOR r1 = M.r[1]; // (r10, r11, r12, 0) + XMVECTOR r2 = M.r[2]; // (r20, r21, r22, 0) // (r00, r00, r00, r00) XMVECTOR r00 = XM_PERMUTE_PS(r0, _MM_SHUFFLE(0, 0, 0, 0)); @@ -868,20 +779,20 @@ inline XMVECTOR XM_CALLCONV XMQuaternionRotationMatrix(FXMMATRIX M) noexcept // x^2 >= y^2 equivalent to r11 - r00 <= 0 // (r11 - r00, r11 - r00, r11 - r00, r11 - r00) XMVECTOR r11mr00 = _mm_sub_ps(r11, r00); - XMVECTOR x2gey2 = _mm_cmple_ps(r11mr00, g_XMZero); + XMVECTOR x2gey2 = _mm_cmple_ps(r11mr00, g_XMZero); // z^2 >= w^2 equivalent to r11 + r00 <= 0 // (r11 + r00, r11 + r00, r11 + r00, r11 + r00) XMVECTOR r11pr00 = _mm_add_ps(r11, r00); - XMVECTOR z2gew2 = _mm_cmple_ps(r11pr00, g_XMZero); + XMVECTOR z2gew2 = _mm_cmple_ps(r11pr00, g_XMZero); // x^2 + y^2 >= z^2 + w^2 equivalent to r22 <= 0 XMVECTOR x2py2gez2pw2 = _mm_cmple_ps(r22, g_XMZero); // (4*x^2, 4*y^2, 4*z^2, 4*w^2) - XMVECTOR t0 = XM_FMADD_PS(XMPMMP, r00, g_XMOne); - XMVECTOR t1 = _mm_mul_ps(XMMPMP, r11); - XMVECTOR t2 = XM_FMADD_PS(XMMMPP, r22, t0); + XMVECTOR t0 = XM_FMADD_PS(XMPMMP, r00, g_XMOne); + XMVECTOR t1 = _mm_mul_ps(XMMPMP, r11); + XMVECTOR t2 = XM_FMADD_PS(XMMMPP, r22, t0); XMVECTOR x2y2z2w2 = _mm_add_ps(t1, t2); // (r01, r02, r12, r11) @@ -901,7 +812,7 @@ inline XMVECTOR XM_CALLCONV XMQuaternionRotationMatrix(FXMMATRIX M) noexcept t1 = XM_PERMUTE_PS(t1, _MM_SHUFFLE(1, 3, 2, 0)); // (4*x*w, 4*y*w, 4*z*w, unused) XMVECTOR xwywzw = _mm_sub_ps(t0, t1); - xwywzw = _mm_mul_ps(XMMPMP, xwywzw); + xwywzw = _mm_mul_ps(XMMPMP, xwywzw); // (4*x^2, 4*y^2, 4*x*y, unused) t0 = _mm_shuffle_ps(x2y2z2w2, xyxzyz, _MM_SHUFFLE(0, 0, 1, 0)); @@ -944,13 +855,7 @@ inline XMVECTOR XM_CALLCONV XMQuaternionRotationMatrix(FXMMATRIX M) noexcept //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMQuaternionToAxisAngle -( - XMVECTOR* pAxis, - float* pAngle, - FXMVECTOR Q -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMQuaternionToAxisAngle(XMVECTOR* pAxis, float* pAngle, FXMVECTOR Q) noexcept { assert(pAxis); assert(pAngle); @@ -972,23 +877,14 @@ inline void XM_CALLCONV XMQuaternionToAxisAngle //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMPlaneEqual -( - FXMVECTOR P1, - FXMVECTOR P2 -) noexcept +inline bool XM_CALLCONV XMPlaneEqual(FXMVECTOR P1, FXMVECTOR P2) noexcept { return XMVector4Equal(P1, P2); } //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMPlaneNearEqual -( - FXMVECTOR P1, - FXMVECTOR P2, - FXMVECTOR Epsilon -) noexcept +inline bool XM_CALLCONV XMPlaneNearEqual(FXMVECTOR P1, FXMVECTOR P2, FXMVECTOR Epsilon) noexcept { XMVECTOR NP1 = XMPlaneNormalize(P1); XMVECTOR NP2 = XMPlaneNormalize(P2); @@ -997,11 +893,7 @@ inline bool XM_CALLCONV XMPlaneNearEqual //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMPlaneNotEqual -( - FXMVECTOR P1, - FXMVECTOR P2 -) noexcept +inline bool XM_CALLCONV XMPlaneNotEqual(FXMVECTOR P1, FXMVECTOR P2) noexcept { return XMVector4NotEqual(P1, P2); } @@ -1026,37 +918,25 @@ inline bool XM_CALLCONV XMPlaneIsInfinite(FXMVECTOR P) noexcept //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMPlaneDot -( - FXMVECTOR P, - FXMVECTOR V -) noexcept +inline XMVECTOR XM_CALLCONV XMPlaneDot(FXMVECTOR P, FXMVECTOR V) noexcept { return XMVector4Dot(P, V); } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMPlaneDotCoord -( - FXMVECTOR P, - FXMVECTOR V -) noexcept +inline XMVECTOR XM_CALLCONV XMPlaneDotCoord(FXMVECTOR P, FXMVECTOR V) noexcept { // Result = P[0] * V[0] + P[1] * V[1] + P[2] * V[2] + P[3] - XMVECTOR V3 = XMVectorSelect(g_XMOne.v, V, g_XMSelect1110.v); + XMVECTOR V3 = XMVectorSelect(g_XMOne.v, V, g_XMSelect1110.v); XMVECTOR Result = XMVector4Dot(P, V3); return Result; } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMPlaneDotNormal -( - FXMVECTOR P, - FXMVECTOR V -) noexcept +inline XMVECTOR XM_CALLCONV XMPlaneDotNormal(FXMVECTOR P, FXMVECTOR V) noexcept { return XMVector3Dot(P, V); } @@ -1073,7 +953,7 @@ inline XMVECTOR XM_CALLCONV XMPlaneNormalizeEst(FXMVECTOR P) noexcept return XMVectorMultiply(P, Result); #elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vTemp = _mm_dp_ps(P, P, 0x7f); + XMVECTOR vTemp = _mm_dp_ps(P, P, 0x7f); XMVECTOR vResult = _mm_rsqrt_ps(vTemp); return _mm_mul_ps(vResult, P); #elif defined(_XM_SSE_INTRINSICS_) @@ -1102,18 +982,16 @@ inline XMVECTOR XM_CALLCONV XMPlaneNormalizeEst(FXMVECTOR P) noexcept inline XMVECTOR XM_CALLCONV XMPlaneNormalize(FXMVECTOR P) noexcept { #if defined(_XM_NO_INTRINSICS_) - float fLengthSq = sqrtf((P.vector4_f32[0] * P.vector4_f32[0]) + (P.vector4_f32[1] * P.vector4_f32[1]) + (P.vector4_f32[2] * P.vector4_f32[2])); + float fLengthSq + = sqrtf((P.vector4_f32[0] * P.vector4_f32[0]) + (P.vector4_f32[1] * P.vector4_f32[1]) + (P.vector4_f32[2] * P.vector4_f32[2])); // Prevent divide by zero if (fLengthSq > 0) { fLengthSq = 1.0f / fLengthSq; } - XMVECTORF32 vResult = { { { - P.vector4_f32[0] * fLengthSq, - P.vector4_f32[1] * fLengthSq, - P.vector4_f32[2] * fLengthSq, - P.vector4_f32[3] * fLengthSq - } } }; + XMVECTORF32 vResult = { + { { P.vector4_f32[0] * fLengthSq, P.vector4_f32[1] * fLengthSq, P.vector4_f32[2] * fLengthSq, P.vector4_f32[3] * fLengthSq } } + }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) XMVECTOR vLength = XMVector3ReciprocalLength(P); @@ -1133,11 +1011,11 @@ inline XMVECTOR XM_CALLCONV XMPlaneNormalize(FXMVECTOR P) noexcept #elif defined(_XM_SSE_INTRINSICS_) // Perform the dot product on x,y and z only XMVECTOR vLengthSq = _mm_mul_ps(P, P); - XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(2, 1, 2, 1)); - vLengthSq = _mm_add_ss(vLengthSq, vTemp); - vTemp = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(1, 1, 1, 1)); - vLengthSq = _mm_add_ss(vLengthSq, vTemp); - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); + XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(2, 1, 2, 1)); + vLengthSq = _mm_add_ss(vLengthSq, vTemp); + vTemp = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(1, 1, 1, 1)); + vLengthSq = _mm_add_ss(vLengthSq, vTemp); + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); // Prepare for the division XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); // Failsafe on zero (Or epsilon) length planes @@ -1153,38 +1031,29 @@ inline XMVECTOR XM_CALLCONV XMPlaneNormalize(FXMVECTOR P) noexcept //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMPlaneIntersectLine -( - FXMVECTOR P, - FXMVECTOR LinePoint1, - FXMVECTOR LinePoint2 -) noexcept +inline XMVECTOR XM_CALLCONV XMPlaneIntersectLine(FXMVECTOR P, FXMVECTOR LinePoint1, FXMVECTOR LinePoint2) noexcept { XMVECTOR V1 = XMVector3Dot(P, LinePoint1); XMVECTOR V2 = XMVector3Dot(P, LinePoint2); - XMVECTOR D = XMVectorSubtract(V1, V2); + XMVECTOR D = XMVectorSubtract(V1, V2); XMVECTOR VT = XMPlaneDotCoord(P, LinePoint1); - VT = XMVectorDivide(VT, D); + VT = XMVectorDivide(VT, D); XMVECTOR Point = XMVectorSubtract(LinePoint2, LinePoint1); - Point = XMVectorMultiplyAdd(Point, VT, LinePoint1); + Point = XMVectorMultiplyAdd(Point, VT, LinePoint1); - const XMVECTOR Zero = XMVectorZero(); - XMVECTOR Control = XMVectorNearEqual(D, Zero, g_XMEpsilon.v); + const XMVECTOR Zero = XMVectorZero(); + XMVECTOR Control = XMVectorNearEqual(D, Zero, g_XMEpsilon.v); return XMVectorSelect(Point, g_XMQNaN.v, Control); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMPlaneIntersectPlane -( - XMVECTOR* pLinePoint1, - XMVECTOR* pLinePoint2, - FXMVECTOR P1, - FXMVECTOR P2 -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMPlaneIntersectPlane(XMVECTOR* pLinePoint1, + XMVECTOR* pLinePoint2, + FXMVECTOR P1, + FXMVECTOR P2) noexcept { assert(pLinePoint1); assert(pLinePoint2); @@ -1195,30 +1064,26 @@ inline void XM_CALLCONV XMPlaneIntersectPlane XMVECTOR V2 = XMVector3Cross(P2, V1); - XMVECTOR P1W = XMVectorSplatW(P1); + XMVECTOR P1W = XMVectorSplatW(P1); XMVECTOR Point = XMVectorMultiply(V2, P1W); XMVECTOR V3 = XMVector3Cross(V1, P1); XMVECTOR P2W = XMVectorSplatW(P2); - Point = XMVectorMultiplyAdd(V3, P2W, Point); + Point = XMVectorMultiplyAdd(V3, P2W, Point); XMVECTOR LinePoint1 = XMVectorDivide(Point, LengthSq); XMVECTOR LinePoint2 = XMVectorAdd(LinePoint1, V1); XMVECTOR Control = XMVectorLessOrEqual(LengthSq, g_XMEpsilon.v); - *pLinePoint1 = XMVectorSelect(LinePoint1, g_XMQNaN.v, Control); - *pLinePoint2 = XMVectorSelect(LinePoint2, g_XMQNaN.v, Control); + *pLinePoint1 = XMVectorSelect(LinePoint1, g_XMQNaN.v, Control); + *pLinePoint2 = XMVectorSelect(LinePoint2, g_XMQNaN.v, Control); } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMPlaneTransform -( - FXMVECTOR P, - FXMMATRIX ITM -) noexcept +inline XMVECTOR XM_CALLCONV XMPlaneTransform(FXMVECTOR P, FXMMATRIX ITM) noexcept { XMVECTOR W = XMVectorSplatW(P); XMVECTOR Z = XMVectorSplatZ(P); @@ -1226,30 +1091,21 @@ inline XMVECTOR XM_CALLCONV XMPlaneTransform XMVECTOR X = XMVectorSplatX(P); XMVECTOR Result = XMVectorMultiply(W, ITM.r[3]); - Result = XMVectorMultiplyAdd(Z, ITM.r[2], Result); - Result = XMVectorMultiplyAdd(Y, ITM.r[1], Result); - Result = XMVectorMultiplyAdd(X, ITM.r[0], Result); + Result = XMVectorMultiplyAdd(Z, ITM.r[2], Result); + Result = XMVectorMultiplyAdd(Y, ITM.r[1], Result); + Result = XMVectorMultiplyAdd(X, ITM.r[0], Result); return Result; } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMFLOAT4* XM_CALLCONV XMPlaneTransformStream -( - XMFLOAT4* pOutputStream, - size_t OutputStride, - const XMFLOAT4* pInputStream, - size_t InputStride, - size_t PlaneCount, - FXMMATRIX ITM -) noexcept +_Use_decl_annotations_ inline XMFLOAT4* XM_CALLCONV XMPlaneTransformStream(XMFLOAT4* pOutputStream, + size_t OutputStride, + const XMFLOAT4* pInputStream, + size_t InputStride, + size_t PlaneCount, + FXMMATRIX ITM) noexcept { - return XMVector4TransformStream(pOutputStream, - OutputStride, - pInputStream, - InputStride, - PlaneCount, - ITM); + return XMVector4TransformStream(pOutputStream, OutputStride, pInputStream, InputStride, PlaneCount, ITM); } //------------------------------------------------------------------------------ @@ -1258,34 +1114,25 @@ inline XMFLOAT4* XM_CALLCONV XMPlaneTransformStream //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMPlaneFromPointNormal -( - FXMVECTOR Point, - FXMVECTOR Normal -) noexcept +inline XMVECTOR XM_CALLCONV XMPlaneFromPointNormal(FXMVECTOR Point, FXMVECTOR Normal) noexcept { XMVECTOR W = XMVector3Dot(Point, Normal); - W = XMVectorNegate(W); + W = XMVectorNegate(W); return XMVectorSelect(W, Normal, g_XMSelect1110.v); } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMPlaneFromPoints -( - FXMVECTOR Point1, - FXMVECTOR Point2, - FXMVECTOR Point3 -) noexcept +inline XMVECTOR XM_CALLCONV XMPlaneFromPoints(FXMVECTOR Point1, FXMVECTOR Point2, FXMVECTOR Point3) noexcept { XMVECTOR V21 = XMVectorSubtract(Point1, Point2); XMVECTOR V31 = XMVectorSubtract(Point1, Point3); XMVECTOR N = XMVector3Cross(V21, V31); - N = XMVector3Normalize(N); + N = XMVector3Normalize(N); XMVECTOR D = XMPlaneDotNormal(N, Point1); - D = XMVectorNegate(D); + D = XMVectorNegate(D); XMVECTOR Result = XMVectorSelect(D, N, g_XMSelect1110.v); @@ -1304,66 +1151,42 @@ inline XMVECTOR XM_CALLCONV XMPlaneFromPoints //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMColorEqual -( - FXMVECTOR C1, - FXMVECTOR C2 -) noexcept +inline bool XM_CALLCONV XMColorEqual(FXMVECTOR C1, FXMVECTOR C2) noexcept { return XMVector4Equal(C1, C2); } //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMColorNotEqual -( - FXMVECTOR C1, - FXMVECTOR C2 -) noexcept +inline bool XM_CALLCONV XMColorNotEqual(FXMVECTOR C1, FXMVECTOR C2) noexcept { return XMVector4NotEqual(C1, C2); } //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMColorGreater -( - FXMVECTOR C1, - FXMVECTOR C2 -) noexcept +inline bool XM_CALLCONV XMColorGreater(FXMVECTOR C1, FXMVECTOR C2) noexcept { return XMVector4Greater(C1, C2); } //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMColorGreaterOrEqual -( - FXMVECTOR C1, - FXMVECTOR C2 -) noexcept +inline bool XM_CALLCONV XMColorGreaterOrEqual(FXMVECTOR C1, FXMVECTOR C2) noexcept { return XMVector4GreaterOrEqual(C1, C2); } //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMColorLess -( - FXMVECTOR C1, - FXMVECTOR C2 -) noexcept +inline bool XM_CALLCONV XMColorLess(FXMVECTOR C1, FXMVECTOR C2) noexcept { return XMVector4Less(C1, C2); } //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMColorLessOrEqual -( - FXMVECTOR C1, - FXMVECTOR C2 -) noexcept +inline bool XM_CALLCONV XMColorLessOrEqual(FXMVECTOR C1, FXMVECTOR C2) noexcept { return XMVector4LessOrEqual(C1, C2); } @@ -1391,12 +1214,8 @@ inline bool XM_CALLCONV XMColorIsInfinite(FXMVECTOR C) noexcept inline XMVECTOR XM_CALLCONV XMColorNegative(FXMVECTOR vColor) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - 1.0f - vColor.vector4_f32[0], - 1.0f - vColor.vector4_f32[1], - 1.0f - vColor.vector4_f32[2], - vColor.vector4_f32[3] - } } }; + XMVECTORF32 vResult + = { { { 1.0f - vColor.vector4_f32[0], 1.0f - vColor.vector4_f32[1], 1.0f - vColor.vector4_f32[2], vColor.vector4_f32[3] } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) uint32x4_t vTemp = veorq_u32(vreinterpretq_u32_f32(vColor), g_XMNegate3); @@ -1411,29 +1230,22 @@ inline XMVECTOR XM_CALLCONV XMColorNegative(FXMVECTOR vColor) noexcept //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMColorModulate -( - FXMVECTOR C1, - FXMVECTOR C2 -) noexcept +inline XMVECTOR XM_CALLCONV XMColorModulate(FXMVECTOR C1, FXMVECTOR C2) noexcept { return XMVectorMultiply(C1, C2); } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMColorAdjustSaturation -( - FXMVECTOR vColor, - float fSaturation -) noexcept +inline XMVECTOR XM_CALLCONV XMColorAdjustSaturation(FXMVECTOR vColor, float fSaturation) noexcept { // Luminance = 0.2125f * C[0] + 0.7154f * C[1] + 0.0721f * C[2]; // Result = (C - Luminance) * Saturation + Luminance; const XMVECTORF32 gvLuminance = { { { 0.2125f, 0.7154f, 0.0721f, 0.0f } } }; #if defined(_XM_NO_INTRINSICS_) - float fLuminance = (vColor.vector4_f32[0] * gvLuminance.f[0]) + (vColor.vector4_f32[1] * gvLuminance.f[1]) + (vColor.vector4_f32[2] * gvLuminance.f[2]); + float fLuminance = (vColor.vector4_f32[0] * gvLuminance.f[0]) + (vColor.vector4_f32[1] * gvLuminance.f[1]) + + (vColor.vector4_f32[2] * gvLuminance.f[2]); XMVECTOR vResult; vResult.vector4_f32[0] = ((vColor.vector4_f32[0] - fLuminance) * fSaturation) + fLuminance; vResult.vector4_f32[1] = ((vColor.vector4_f32[1] - fLuminance) * fSaturation) + fLuminance; @@ -1442,8 +1254,8 @@ inline XMVECTOR XM_CALLCONV XMColorAdjustSaturation return vResult; #elif defined(_XM_ARM_NEON_INTRINSICS_) XMVECTOR vLuminance = XMVector3Dot(vColor, gvLuminance); - XMVECTOR vResult = vsubq_f32(vColor, vLuminance); - vResult = vmlaq_n_f32(vLuminance, vResult, fSaturation); + XMVECTOR vResult = vsubq_f32(vColor, vLuminance); + vResult = vmlaq_n_f32(vLuminance, vResult, fSaturation); return vbslq_f32(g_XMSelect1110, vResult, vColor); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vLuminance = XMVector3Dot(vColor, gvLuminance); @@ -1451,43 +1263,39 @@ inline XMVECTOR XM_CALLCONV XMColorAdjustSaturation XMVECTOR vSaturation = _mm_set_ps1(fSaturation); // vResult = ((vColor-vLuminance)*vSaturation)+vLuminance; XMVECTOR vResult = _mm_sub_ps(vColor, vLuminance); - vResult = XM_FMADD_PS(vResult, vSaturation, vLuminance); + vResult = XM_FMADD_PS(vResult, vSaturation, vLuminance); // Retain w from the source color - vLuminance = _mm_shuffle_ps(vResult, vColor, _MM_SHUFFLE(3, 2, 2, 2)); // x = vResult.z,y = vResult.z,z = vColor.z,w=vColor.w - vResult = _mm_shuffle_ps(vResult, vLuminance, _MM_SHUFFLE(3, 0, 1, 0)); // x = vResult.x,y = vResult.y,z = vResult.z,w=vColor.w + vLuminance = _mm_shuffle_ps(vResult, vColor, _MM_SHUFFLE(3, 2, 2, 2)); // x = vResult.z,y = vResult.z,z = vColor.z,w=vColor.w + vResult = _mm_shuffle_ps(vResult, vLuminance, _MM_SHUFFLE(3, 0, 1, 0)); // x = vResult.x,y = vResult.y,z = vResult.z,w=vColor.w return vResult; #endif } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMColorAdjustContrast -( - FXMVECTOR vColor, - float fContrast -) noexcept +inline XMVECTOR XM_CALLCONV XMColorAdjustContrast(FXMVECTOR vColor, float fContrast) noexcept { // Result = (vColor - 0.5f) * fContrast + 0.5f; #if defined(_XM_NO_INTRINSICS_) XMVECTORF32 vResult = { { { - ((vColor.vector4_f32[0] - 0.5f) * fContrast) + 0.5f, - ((vColor.vector4_f32[1] - 0.5f) * fContrast) + 0.5f, - ((vColor.vector4_f32[2] - 0.5f) * fContrast) + 0.5f, - vColor.vector4_f32[3] // Leave W untouched - } } }; + ((vColor.vector4_f32[0] - 0.5f) * fContrast) + 0.5f, + ((vColor.vector4_f32[1] - 0.5f) * fContrast) + 0.5f, + ((vColor.vector4_f32[2] - 0.5f) * fContrast) + 0.5f, + vColor.vector4_f32[3] // Leave W untouched + } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) XMVECTOR vResult = vsubq_f32(vColor, g_XMOneHalf.v); - vResult = vmlaq_n_f32(g_XMOneHalf.v, vResult, fContrast); + vResult = vmlaq_n_f32(g_XMOneHalf.v, vResult, fContrast); return vbslq_f32(g_XMSelect1110, vResult, vColor); #elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vScale = _mm_set_ps1(fContrast); // Splat the scale - XMVECTOR vResult = _mm_sub_ps(vColor, g_XMOneHalf); // Subtract 0.5f from the source (Saving source) - vResult = XM_FMADD_PS(vResult, vScale, g_XMOneHalf); -// Retain w from the source color - vScale = _mm_shuffle_ps(vResult, vColor, _MM_SHUFFLE(3, 2, 2, 2)); // x = vResult.z,y = vResult.z,z = vColor.z,w=vColor.w - vResult = _mm_shuffle_ps(vResult, vScale, _MM_SHUFFLE(3, 0, 1, 0)); // x = vResult.x,y = vResult.y,z = vResult.z,w=vColor.w + XMVECTOR vScale = _mm_set_ps1(fContrast); // Splat the scale + XMVECTOR vResult = _mm_sub_ps(vColor, g_XMOneHalf); // Subtract 0.5f from the source (Saving source) + vResult = XM_FMADD_PS(vResult, vScale, g_XMOneHalf); + // Retain w from the source color + vScale = _mm_shuffle_ps(vResult, vColor, _MM_SHUFFLE(3, 2, 2, 2)); // x = vResult.z,y = vResult.z,z = vColor.z,w=vColor.w + vResult = _mm_shuffle_ps(vResult, vScale, _MM_SHUFFLE(3, 0, 1, 0)); // x = vResult.x,y = vResult.y,z = vResult.z,w=vColor.w return vResult; #endif } @@ -1566,7 +1374,7 @@ namespace MathInternal inline XMVECTOR XM_CALLCONV XMColorHue2Clr(FXMVECTOR p, FXMVECTOR q, FXMVECTOR h) noexcept { - static const XMVECTORF32 oneSixth = { { { 1.0f / 6.0f, 1.0f / 6.0f, 1.0f / 6.0f, 1.0f / 6.0f } } }; + static const XMVECTORF32 oneSixth = { { { 1.0f / 6.0f, 1.0f / 6.0f, 1.0f / 6.0f, 1.0f / 6.0f } } }; static const XMVECTORF32 twoThirds = { { { 2.0f / 3.0f, 2.0f / 3.0f, 2.0f / 3.0f, 2.0f / 3.0f } } }; XMVECTOR t = h; @@ -1649,7 +1457,7 @@ inline XMVECTOR XM_CALLCONV XMColorRGBToHSV(FXMVECTOR rgb) noexcept XMVECTOR b = XMVectorSplatZ(rgb); XMVECTOR min = XMVectorMin(r, XMVectorMin(g, b)); - XMVECTOR v = XMVectorMax(r, XMVectorMax(g, b)); + XMVECTOR v = XMVectorMax(r, XMVectorMax(g, b)); XMVECTOR d = XMVectorSubtract(v, min); @@ -1658,7 +1466,7 @@ inline XMVECTOR XM_CALLCONV XMColorRGBToHSV(FXMVECTOR rgb) noexcept if (XMVector3Less(d, g_XMEpsilon)) { // Achromatic, assume H of 0 - XMVECTOR hv = XMVectorSelect(v, g_XMZero, g_XMSelect1000); + XMVECTOR hv = XMVectorSelect(v, g_XMZero, g_XMSelect1000); XMVECTOR hva = XMVectorSelect(rgb, hv, g_XMSelect1110); return XMVectorSelect(s, hva, g_XMSelect1011); } @@ -1689,7 +1497,7 @@ inline XMVECTOR XM_CALLCONV XMColorRGBToHSV(FXMVECTOR rgb) noexcept h = XMVectorDivide(h, g_XMSix); - XMVECTOR hv = XMVectorSelect(v, h, g_XMSelect1000); + XMVECTOR hv = XMVectorSelect(v, h, g_XMSelect1000); XMVECTOR hva = XMVectorSelect(rgb, hv, g_XMSelect1110); return XMVectorSelect(s, hva, g_XMSelect1011); } @@ -1724,41 +1532,41 @@ inline XMVECTOR XM_CALLCONV XMColorHSVToRGB(FXMVECTOR hsv) noexcept switch (ii) { case 0: // rgb = vtp - { - XMVECTOR vt = XMVectorSelect(t, v, g_XMSelect1000); - _rgb = XMVectorSelect(p, vt, g_XMSelect1100); - } - break; + { + XMVECTOR vt = XMVectorSelect(t, v, g_XMSelect1000); + _rgb = XMVectorSelect(p, vt, g_XMSelect1100); + } + break; case 1: // rgb = qvp - { - XMVECTOR qv = XMVectorSelect(v, q, g_XMSelect1000); - _rgb = XMVectorSelect(p, qv, g_XMSelect1100); - } - break; + { + XMVECTOR qv = XMVectorSelect(v, q, g_XMSelect1000); + _rgb = XMVectorSelect(p, qv, g_XMSelect1100); + } + break; case 2: // rgb = pvt - { - XMVECTOR pv = XMVectorSelect(v, p, g_XMSelect1000); - _rgb = XMVectorSelect(t, pv, g_XMSelect1100); - } - break; + { + XMVECTOR pv = XMVectorSelect(v, p, g_XMSelect1000); + _rgb = XMVectorSelect(t, pv, g_XMSelect1100); + } + break; case 3: // rgb = pqv - { - XMVECTOR pq = XMVectorSelect(q, p, g_XMSelect1000); - _rgb = XMVectorSelect(v, pq, g_XMSelect1100); - } - break; + { + XMVECTOR pq = XMVectorSelect(q, p, g_XMSelect1000); + _rgb = XMVectorSelect(v, pq, g_XMSelect1100); + } + break; case 4: // rgb = tpv - { - XMVECTOR tp = XMVectorSelect(p, t, g_XMSelect1000); - _rgb = XMVectorSelect(v, tp, g_XMSelect1100); - } - break; + { + XMVECTOR tp = XMVectorSelect(p, t, g_XMSelect1000); + _rgb = XMVectorSelect(v, tp, g_XMSelect1100); + } + break; default: // rgb = vpq - { - XMVECTOR vp = XMVectorSelect(p, v, g_XMSelect1000); - _rgb = XMVectorSelect(q, vp, g_XMSelect1100); - } - break; + { + XMVECTOR vp = XMVectorSelect(p, v, g_XMSelect1000); + _rgb = XMVectorSelect(q, vp, g_XMSelect1100); + } + break; } return XMVectorSelect(hsv, _rgb, g_XMSelect1110); @@ -1822,9 +1630,9 @@ inline XMVECTOR XM_CALLCONV XMColorYUVToRGB_HD(FXMVECTOR yuv) noexcept inline XMVECTOR XM_CALLCONV XMColorRGBToYUV_UHD(FXMVECTOR rgb) noexcept { - static const XMVECTORF32 Scale0 = { { { 0.2627f, -0.1215f, 0.6150f, 0.0f } } }; + static const XMVECTORF32 Scale0 = { { { 0.2627f, -0.1215f, 0.6150f, 0.0f } } }; static const XMVECTORF32 Scale1 = { { { 0.6780f, -0.3136f, -0.5655f, 0.0f } } }; - static const XMVECTORF32 Scale2 = { { { 0.0593f, 0.4351f, -0.0495f, 0.0f } } }; + static const XMVECTORF32 Scale2 = { { { 0.0593f, 0.4351f, -0.0495f, 0.0f } } }; XMMATRIX M(Scale0, Scale1, Scale2, g_XMZero); XMVECTOR clr = XMVector3Transform(rgb, M); @@ -1836,8 +1644,8 @@ inline XMVECTOR XM_CALLCONV XMColorRGBToYUV_UHD(FXMVECTOR rgb) noexcept inline XMVECTOR XM_CALLCONV XMColorYUVToRGB_UHD(FXMVECTOR yuv) noexcept { - static const XMVECTORF32 Scale1 = { { { 0.0f, -0.1891f, 2.1620f, 0.0f } } }; - static const XMVECTORF32 Scale2 = { { { 1.1989f, -0.4645f, 0.0f, 0.0f } } }; + static const XMVECTORF32 Scale1 = { { { 0.0f, -0.1891f, 2.1620f, 0.0f } } }; + static const XMVECTORF32 Scale2 = { { { 1.1989f, -0.4645f, 0.0f, 0.0f } } }; XMMATRIX M(g_XMOne, Scale1, Scale2, g_XMZero); XMVECTOR clr = XMVector3Transform(yuv, M); @@ -1852,7 +1660,7 @@ inline XMVECTOR XM_CALLCONV XMColorRGBToXYZ(FXMVECTOR rgb) noexcept static const XMVECTORF32 Scale0 = { { { 0.4887180f, 0.1762044f, 0.0000000f, 0.0f } } }; static const XMVECTORF32 Scale1 = { { { 0.3106803f, 0.8129847f, 0.0102048f, 0.0f } } }; static const XMVECTORF32 Scale2 = { { { 0.2006017f, 0.0108109f, 0.9897952f, 0.0f } } }; - static const XMVECTORF32 Scale = { { { 1.f / 0.17697f, 1.f / 0.17697f, 1.f / 0.17697f, 0.0f } } }; + static const XMVECTORF32 Scale = { { { 1.f / 0.17697f, 1.f / 0.17697f, 1.f / 0.17697f, 0.0f } } }; XMMATRIX M(Scale0, Scale1, Scale2, g_XMZero); XMVECTOR clr = XMVectorMultiply(XMVector3Transform(rgb, M), Scale); @@ -1865,7 +1673,7 @@ inline XMVECTOR XM_CALLCONV XMColorXYZToRGB(FXMVECTOR xyz) noexcept static const XMVECTORF32 Scale0 = { { { 2.3706743f, -0.5138850f, 0.0052982f, 0.0f } } }; static const XMVECTORF32 Scale1 = { { { -0.9000405f, 1.4253036f, -0.0146949f, 0.0f } } }; static const XMVECTORF32 Scale2 = { { { -0.4706338f, 0.0885814f, 1.0093968f, 0.0f } } }; - static const XMVECTORF32 Scale = { { { 0.17697f, 0.17697f, 0.17697f, 0.0f } } }; + static const XMVECTORF32 Scale = { { { 0.17697f, 0.17697f, 0.17697f, 0.0f } } }; XMMATRIX M(Scale0, Scale1, Scale2, g_XMZero); XMVECTOR clr = XMVector3Transform(XMVectorMultiply(xyz, Scale), M); @@ -1881,7 +1689,7 @@ inline XMVECTOR XM_CALLCONV XMColorXYZToSRGB(FXMVECTOR xyz) noexcept static const XMVECTORF32 Scale1 = { { { -1.5372f, 1.8758f, -0.2040f, 0.0f } } }; static const XMVECTORF32 Scale2 = { { { -0.4986f, 0.0415f, 1.0570f, 0.0f } } }; static const XMVECTORF32 Cutoff = { { { 0.0031308f, 0.0031308f, 0.0031308f, 0.0f } } }; - static const XMVECTORF32 Exp = { { { 1.0f / 2.4f, 1.0f / 2.4f, 1.0f / 2.4f, 1.0f } } }; + static const XMVECTORF32 Exp = { { { 1.0f / 2.4f, 1.0f / 2.4f, 1.0f / 2.4f, 1.0f } } }; XMMATRIX M(Scale0, Scale1, Scale2, g_XMZero); XMVECTOR lclr = XMVector3Transform(xyz, M); @@ -1907,7 +1715,7 @@ inline XMVECTOR XM_CALLCONV XMColorSRGBToXYZ(FXMVECTOR srgb) noexcept static const XMVECTORF32 Scale1 = { { { 0.3576f, 0.7152f, 0.1192f, 0.0f } } }; static const XMVECTORF32 Scale2 = { { { 0.1805f, 0.0722f, 0.9505f, 0.0f } } }; static const XMVECTORF32 Cutoff = { { { 0.04045f, 0.04045f, 0.04045f, 0.0f } } }; - static const XMVECTORF32 Exp = { { { 2.4f, 2.4f, 2.4f, 1.0f } } }; + static const XMVECTORF32 Exp = { { { 2.4f, 2.4f, 2.4f, 1.0f } } }; XMVECTOR sel = XMVectorGreater(srgb, Cutoff); @@ -1929,17 +1737,17 @@ inline XMVECTOR XM_CALLCONV XMColorSRGBToXYZ(FXMVECTOR srgb) noexcept inline XMVECTOR XM_CALLCONV XMColorRGBToSRGB(FXMVECTOR rgb) noexcept { - static const XMVECTORF32 Cutoff = { { { 0.0031308f, 0.0031308f, 0.0031308f, 1.f } } }; - static const XMVECTORF32 Linear = { { { 12.92f, 12.92f, 12.92f, 1.f } } }; - static const XMVECTORF32 Scale = { { { 1.055f, 1.055f, 1.055f, 1.f } } }; - static const XMVECTORF32 Bias = { { { 0.055f, 0.055f, 0.055f, 0.f } } }; + static const XMVECTORF32 Cutoff = { { { 0.0031308f, 0.0031308f, 0.0031308f, 1.f } } }; + static const XMVECTORF32 Linear = { { { 12.92f, 12.92f, 12.92f, 1.f } } }; + static const XMVECTORF32 Scale = { { { 1.055f, 1.055f, 1.055f, 1.f } } }; + static const XMVECTORF32 Bias = { { { 0.055f, 0.055f, 0.055f, 0.f } } }; static const XMVECTORF32 InvGamma = { { { 1.0f / 2.4f, 1.0f / 2.4f, 1.0f / 2.4f, 1.f } } }; - XMVECTOR V = XMVectorSaturate(rgb); - XMVECTOR V0 = XMVectorMultiply(V, Linear); - XMVECTOR V1 = XMVectorSubtract(XMVectorMultiply(Scale, XMVectorPow(V, InvGamma)), Bias); + XMVECTOR V = XMVectorSaturate(rgb); + XMVECTOR V0 = XMVectorMultiply(V, Linear); + XMVECTOR V1 = XMVectorSubtract(XMVectorMultiply(Scale, XMVectorPow(V, InvGamma)), Bias); XMVECTOR select = XMVectorLess(V, Cutoff); - V = XMVectorSelect(V1, V0, select); + V = XMVectorSelect(V1, V0, select); return XMVectorSelect(rgb, V, g_XMSelect1110); } @@ -1947,17 +1755,17 @@ inline XMVECTOR XM_CALLCONV XMColorRGBToSRGB(FXMVECTOR rgb) noexcept inline XMVECTOR XM_CALLCONV XMColorSRGBToRGB(FXMVECTOR srgb) noexcept { - static const XMVECTORF32 Cutoff = { { { 0.04045f, 0.04045f, 0.04045f, 1.f } } }; + static const XMVECTORF32 Cutoff = { { { 0.04045f, 0.04045f, 0.04045f, 1.f } } }; static const XMVECTORF32 ILinear = { { { 1.f / 12.92f, 1.f / 12.92f, 1.f / 12.92f, 1.f } } }; - static const XMVECTORF32 Scale = { { { 1.f / 1.055f, 1.f / 1.055f, 1.f / 1.055f, 1.f } } }; - static const XMVECTORF32 Bias = { { { 0.055f, 0.055f, 0.055f, 0.f } } }; - static const XMVECTORF32 Gamma = { { { 2.4f, 2.4f, 2.4f, 1.f } } }; + static const XMVECTORF32 Scale = { { { 1.f / 1.055f, 1.f / 1.055f, 1.f / 1.055f, 1.f } } }; + static const XMVECTORF32 Bias = { { { 0.055f, 0.055f, 0.055f, 0.f } } }; + static const XMVECTORF32 Gamma = { { { 2.4f, 2.4f, 2.4f, 1.f } } }; - XMVECTOR V = XMVectorSaturate(srgb); - XMVECTOR V0 = XMVectorMultiply(V, ILinear); - XMVECTOR V1 = XMVectorPow(XMVectorMultiply(XMVectorAdd(V, Bias), Scale), Gamma); + XMVECTOR V = XMVectorSaturate(srgb); + XMVECTOR V0 = XMVectorMultiply(V, ILinear); + XMVECTOR V1 = XMVectorPow(XMVectorMultiply(XMVectorAdd(V, Bias), Scale), Gamma); XMVECTOR select = XMVectorGreater(V, Cutoff); - V = XMVectorSelect(V0, V1, select); + V = XMVectorSelect(V0, V1, select); return XMVectorSelect(srgb, V, g_XMSelect1110); } @@ -2043,11 +1851,7 @@ inline bool XMVerifyCPUSupport() noexcept //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMFresnelTerm -( - FXMVECTOR CosIncidentAngle, - FXMVECTOR RefractionIndex -) noexcept +inline XMVECTOR XM_CALLCONV XMFresnelTerm(FXMVECTOR CosIncidentAngle, FXMVECTOR RefractionIndex) noexcept { assert(!XMVector4IsInfinite(CosIncidentAngle)); @@ -2058,25 +1862,25 @@ inline XMVECTOR XM_CALLCONV XMFresnelTerm #if defined(_XM_NO_INTRINSICS_) || defined(_XM_ARM_NEON_INTRINSICS_) XMVECTOR G = XMVectorMultiplyAdd(RefractionIndex, RefractionIndex, g_XMNegativeOne.v); - G = XMVectorMultiplyAdd(CosIncidentAngle, CosIncidentAngle, G); - G = XMVectorAbs(G); - G = XMVectorSqrt(G); + G = XMVectorMultiplyAdd(CosIncidentAngle, CosIncidentAngle, G); + G = XMVectorAbs(G); + G = XMVectorSqrt(G); XMVECTOR S = XMVectorAdd(G, CosIncidentAngle); XMVECTOR D = XMVectorSubtract(G, CosIncidentAngle); XMVECTOR V0 = XMVectorMultiply(D, D); XMVECTOR V1 = XMVectorMultiply(S, S); - V1 = XMVectorReciprocal(V1); - V0 = XMVectorMultiply(g_XMOneHalf.v, V0); - V0 = XMVectorMultiply(V0, V1); + V1 = XMVectorReciprocal(V1); + V0 = XMVectorMultiply(g_XMOneHalf.v, V0); + V0 = XMVectorMultiply(V0, V1); XMVECTOR V2 = XMVectorMultiplyAdd(CosIncidentAngle, S, g_XMNegativeOne.v); XMVECTOR V3 = XMVectorMultiplyAdd(CosIncidentAngle, D, g_XMOne.v); - V2 = XMVectorMultiply(V2, V2); - V3 = XMVectorMultiply(V3, V3); - V3 = XMVectorReciprocal(V3); - V2 = XMVectorMultiplyAdd(V2, V3, g_XMOne.v); + V2 = XMVectorMultiply(V2, V2); + V3 = XMVectorMultiply(V3, V3); + V3 = XMVectorReciprocal(V3); + V2 = XMVectorMultiplyAdd(V2, V3, g_XMOne.v); XMVECTOR Result = XMVectorMultiply(V0, V2); @@ -2086,10 +1890,10 @@ inline XMVECTOR XM_CALLCONV XMFresnelTerm #elif defined(_XM_SSE_INTRINSICS_) // G = sqrt(abs((RefractionIndex^2-1) + CosIncidentAngle^2)) - XMVECTOR G = _mm_mul_ps(RefractionIndex, RefractionIndex); + XMVECTOR G = _mm_mul_ps(RefractionIndex, RefractionIndex); XMVECTOR vTemp = _mm_mul_ps(CosIncidentAngle, CosIncidentAngle); - G = _mm_sub_ps(G, g_XMOne); - vTemp = _mm_add_ps(vTemp, G); + G = _mm_sub_ps(G, g_XMOne); + vTemp = _mm_add_ps(vTemp, G); // max((0-vTemp),vTemp) == abs(vTemp) // The abs is needed to deal with refraction and cosine being zero G = _mm_setzero_ps(); @@ -2103,9 +1907,9 @@ inline XMVECTOR XM_CALLCONV XMFresnelTerm XMVECTOR GSubC = _mm_sub_ps(G, CosIncidentAngle); // Perform the term (0.5f *(g - c)^2) / (g + c)^2 XMVECTOR vResult = _mm_mul_ps(GSubC, GSubC); - vTemp = _mm_mul_ps(GAddC, GAddC); - vResult = _mm_mul_ps(vResult, g_XMOneHalf); - vResult = _mm_div_ps(vResult, vTemp); + vTemp = _mm_mul_ps(GAddC, GAddC); + vResult = _mm_mul_ps(vResult, g_XMOneHalf); + vResult = _mm_div_ps(vResult, vTemp); // Perform the term ((c * (g + c) - 1)^2 / (c * (g - c) + 1)^2 + 1) GAddC = _mm_mul_ps(GAddC, CosIncidentAngle); GSubC = _mm_mul_ps(GSubC, CosIncidentAngle); @@ -2126,12 +1930,7 @@ inline XMVECTOR XM_CALLCONV XMFresnelTerm //------------------------------------------------------------------------------ -inline bool XMScalarNearEqual -( - float S1, - float S2, - float Epsilon -) noexcept +inline bool XMScalarNearEqual(float S1, float S2, float Epsilon) noexcept { float Delta = S1 - S2; return (fabsf(Delta) <= Epsilon); @@ -2148,7 +1947,7 @@ inline float XMScalarModAngle(float Angle) noexcept Angle = Angle + XM_PI; // Perform the modulo, unsigned float fTemp = fabsf(Angle); - fTemp = fTemp - (XM_2PI * static_cast(static_cast(fTemp / XM_2PI))); + fTemp = fTemp - (XM_2PI * static_cast(static_cast(fTemp / XM_2PI))); // Restore the number to the range of -XM_PI to XM_PI-epsilon fTemp = fTemp - XM_PI; // If the modulo'd value was negative, restore negation @@ -2241,12 +2040,12 @@ inline float XMScalarCos(float Value) noexcept float sign; if (y > XM_PIDIV2) { - y = XM_PI - y; + y = XM_PI - y; sign = -1.0f; } else if (y < -XM_PIDIV2) { - y = -XM_PI - y; + y = -XM_PI - y; sign = -1.0f; } else @@ -2256,7 +2055,7 @@ inline float XMScalarCos(float Value) noexcept // 10-degree minimax approximation float y2 = y * y; - float p = ((((-2.6051615e-07f * y2 + 2.4760495e-05f) * y2 - 0.0013888378f) * y2 + 0.041666638f) * y2 - 0.5f) * y2 + 1.0f; + float p = ((((-2.6051615e-07f * y2 + 2.4760495e-05f) * y2 - 0.0013888378f) * y2 + 0.041666638f) * y2 - 0.5f) * y2 + 1.0f; return sign * p; } @@ -2280,12 +2079,12 @@ inline float XMScalarCosEst(float Value) noexcept float sign; if (y > XM_PIDIV2) { - y = XM_PI - y; + y = XM_PI - y; sign = -1.0f; } else if (y < -XM_PIDIV2) { - y = -XM_PI - y; + y = -XM_PI - y; sign = -1.0f; } else @@ -2295,19 +2094,13 @@ inline float XMScalarCosEst(float Value) noexcept // 6-degree minimax approximation float y2 = y * y; - float p = ((-0.0012712436f * y2 + 0.041493919f) * y2 - 0.49992746f) * y2 + 1.0f; + float p = ((-0.0012712436f * y2 + 0.041493919f) * y2 - 0.49992746f) * y2 + 1.0f; return sign * p; } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XMScalarSinCos -( - float* pSin, - float* pCos, - float Value -) noexcept +_Use_decl_annotations_ inline void XMScalarSinCos(float* pSin, float* pCos, float Value) noexcept { assert(pSin); assert(pCos); @@ -2328,12 +2121,12 @@ inline void XMScalarSinCos float sign; if (y > XM_PIDIV2) { - y = XM_PI - y; + y = XM_PI - y; sign = -1.0f; } else if (y < -XM_PIDIV2) { - y = -XM_PI - y; + y = -XM_PI - y; sign = -1.0f; } else @@ -2348,18 +2141,12 @@ inline void XMScalarSinCos // 10-degree minimax approximation float p = ((((-2.6051615e-07f * y2 + 2.4760495e-05f) * y2 - 0.0013888378f) * y2 + 0.041666638f) * y2 - 0.5f) * y2 + 1.0f; - *pCos = sign * p; + *pCos = sign * p; } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XMScalarSinCosEst -( - float* pSin, - float* pCos, - float Value -) noexcept +_Use_decl_annotations_ inline void XMScalarSinCosEst(float* pSin, float* pCos, float Value) noexcept { assert(pSin); assert(pCos); @@ -2380,12 +2167,12 @@ inline void XMScalarSinCosEst float sign; if (y > XM_PIDIV2) { - y = XM_PI - y; + y = XM_PI - y; sign = -1.0f; } else if (y < -XM_PIDIV2) { - y = -XM_PI - y; + y = -XM_PI - y; sign = -1.0f; } else @@ -2400,7 +2187,7 @@ inline void XMScalarSinCosEst // 6-degree minimax approximation float p = ((-0.0012712436f * y2 + 0.041493919f) * y2 - 0.49992746f) * y2 + 1.0f; - *pCos = sign * p; + *pCos = sign * p; } //------------------------------------------------------------------------------ @@ -2408,9 +2195,9 @@ inline void XMScalarSinCosEst inline float XMScalarASin(float Value) noexcept { // Clamp input to [-1,1]. - bool nonnegative = (Value >= 0.0f); - float x = fabsf(Value); - float omx = 1.0f - x; + bool nonnegative = (Value >= 0.0f); + float x = fabsf(Value); + float omx = 1.0f - x; if (omx < 0.0f) { omx = 0.0f; @@ -2418,8 +2205,12 @@ inline float XMScalarASin(float Value) noexcept float root = sqrtf(omx); // 7-degree minimax approximation - float result = ((((((-0.0012624911f * x + 0.0066700901f) * x - 0.0170881256f) * x + 0.0308918810f) * x - 0.0501743046f) * x + 0.0889789874f) * x - 0.2145988016f) * x + 1.5707963050f; - result *= root; // acos(|x|) + float result + = ((((((-0.0012624911f * x + 0.0066700901f) * x - 0.0170881256f) * x + 0.0308918810f) * x - 0.0501743046f) * x + 0.0889789874f) * x + - 0.2145988016f) + * x + + 1.5707963050f; + result *= root; // acos(|x|) // acos(x) = pi - acos(-x) when x < 0, asin(x) = pi/2 - acos(x) return (nonnegative ? XM_PIDIV2 - result : result - XM_PIDIV2); @@ -2430,9 +2221,9 @@ inline float XMScalarASin(float Value) noexcept inline float XMScalarASinEst(float Value) noexcept { // Clamp input to [-1,1]. - bool nonnegative = (Value >= 0.0f); - float x = fabsf(Value); - float omx = 1.0f - x; + bool nonnegative = (Value >= 0.0f); + float x = fabsf(Value); + float omx = 1.0f - x; if (omx < 0.0f) { omx = 0.0f; @@ -2441,7 +2232,7 @@ inline float XMScalarASinEst(float Value) noexcept // 3-degree minimax approximation float result = ((-0.0187293f * x + 0.0742610f) * x - 0.2121144f) * x + 1.5707288f; - result *= root; // acos(|x|) + result *= root; // acos(|x|) // acos(x) = pi - acos(-x) when x < 0, asin(x) = pi/2 - acos(x) return (nonnegative ? XM_PIDIV2 - result : result - XM_PIDIV2); @@ -2452,9 +2243,9 @@ inline float XMScalarASinEst(float Value) noexcept inline float XMScalarACos(float Value) noexcept { // Clamp input to [-1,1]. - bool nonnegative = (Value >= 0.0f); - float x = fabsf(Value); - float omx = 1.0f - x; + bool nonnegative = (Value >= 0.0f); + float x = fabsf(Value); + float omx = 1.0f - x; if (omx < 0.0f) { omx = 0.0f; @@ -2462,7 +2253,11 @@ inline float XMScalarACos(float Value) noexcept float root = sqrtf(omx); // 7-degree minimax approximation - float result = ((((((-0.0012624911f * x + 0.0066700901f) * x - 0.0170881256f) * x + 0.0308918810f) * x - 0.0501743046f) * x + 0.0889789874f) * x - 0.2145988016f) * x + 1.5707963050f; + float result + = ((((((-0.0012624911f * x + 0.0066700901f) * x - 0.0170881256f) * x + 0.0308918810f) * x - 0.0501743046f) * x + 0.0889789874f) * x + - 0.2145988016f) + * x + + 1.5707963050f; result *= root; // acos(x) = pi - acos(-x) when x < 0 @@ -2474,9 +2269,9 @@ inline float XMScalarACos(float Value) noexcept inline float XMScalarACosEst(float Value) noexcept { // Clamp input to [-1,1]. - bool nonnegative = (Value >= 0.0f); - float x = fabsf(Value); - float omx = 1.0f - x; + bool nonnegative = (Value >= 0.0f); + float x = fabsf(Value); + float omx = 1.0f - x; if (omx < 0.0f) { omx = 0.0f; @@ -2490,4 +2285,3 @@ inline float XMScalarACosEst(float Value) noexcept // acos(x) = pi - acos(-x) when x < 0 return (nonnegative ? result : XM_PI - result); } - diff --git a/Inc/DirectXMathVector.inl b/Inc/DirectXMathVector.inl index 761cf677..91a13164 100644 --- a/Inc/DirectXMathVector.inl +++ b/Inc/DirectXMathVector.inl @@ -10,24 +10,24 @@ #pragma once #if defined(_XM_NO_INTRINSICS_) -#define XMISNAN(x) isnan(x) -#define XMISINF(x) isinf(x) +#define XMISNAN(x) isnan(x) +#define XMISINF(x) isinf(x) #endif #if defined(_XM_SSE_INTRINSICS_) -#define XM3UNPACK3INTO4(l1, l2, l3) \ - XMVECTOR V3 = _mm_shuffle_ps(l2, l3, _MM_SHUFFLE(0, 0, 3, 2));\ - XMVECTOR V2 = _mm_shuffle_ps(l2, l1, _MM_SHUFFLE(3, 3, 1, 0));\ - V2 = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 0, 2));\ +#define XM3UNPACK3INTO4(l1, l2, l3) \ + XMVECTOR V3 = _mm_shuffle_ps(l2, l3, _MM_SHUFFLE(0, 0, 3, 2)); \ + XMVECTOR V2 = _mm_shuffle_ps(l2, l1, _MM_SHUFFLE(3, 3, 1, 0)); \ + V2 = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 0, 2)); \ XMVECTOR V4 = _mm_castsi128_ps(_mm_srli_si128(_mm_castps_si128(L3), 32 / 8)) -#define XM3PACK4INTO3(v2x) \ - v2x = _mm_shuffle_ps(V2, V3, _MM_SHUFFLE(1, 0, 2, 1));\ - V2 = _mm_shuffle_ps(V2, V1, _MM_SHUFFLE(2, 2, 0, 0));\ - V1 = _mm_shuffle_ps(V1, V2, _MM_SHUFFLE(0, 2, 1, 0));\ - V3 = _mm_shuffle_ps(V3, V4, _MM_SHUFFLE(0, 0, 2, 2));\ - V3 = _mm_shuffle_ps(V3, V4, _MM_SHUFFLE(2, 1, 2, 0)) +#define XM3PACK4INTO3(v2x) \ + v2x = _mm_shuffle_ps(V2, V3, _MM_SHUFFLE(1, 0, 2, 1)); \ + V2 = _mm_shuffle_ps(V2, V1, _MM_SHUFFLE(2, 2, 0, 0)); \ + V1 = _mm_shuffle_ps(V1, V2, _MM_SHUFFLE(0, 2, 1, 0)); \ + V3 = _mm_shuffle_ps(V3, V4, _MM_SHUFFLE(0, 0, 2, 2)); \ + V3 = _mm_shuffle_ps(V3, V4, _MM_SHUFFLE(2, 1, 2, 0)) #endif @@ -57,24 +57,16 @@ inline XMVECTOR XM_CALLCONV XMVectorZero() noexcept //------------------------------------------------------------------------------ // Initialize a vector with four floating point values -inline XMVECTOR XM_CALLCONV XMVectorSet -( - float x, - float y, - float z, - float w -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorSet(float x, float y, float z, float w) noexcept { #if defined(_XM_NO_INTRINSICS_) XMVECTORF32 vResult = { { { x, y, z, w } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t V0 = vcreate_f32( - static_cast(*reinterpret_cast(&x)) - | (static_cast(*reinterpret_cast(&y)) << 32)); - float32x2_t V1 = vcreate_f32( - static_cast(*reinterpret_cast(&z)) - | (static_cast(*reinterpret_cast(&w)) << 32)); + float32x2_t V0 = vcreate_f32(static_cast(*reinterpret_cast(&x)) + | (static_cast(*reinterpret_cast(&y)) << 32)); + float32x2_t V1 = vcreate_f32(static_cast(*reinterpret_cast(&z)) + | (static_cast(*reinterpret_cast(&w)) << 32)); return vcombine_f32(V0, V1); #elif defined(_XM_SSE_INTRINSICS_) return _mm_set_ps(w, z, y, x); @@ -83,13 +75,7 @@ inline XMVECTOR XM_CALLCONV XMVectorSet //------------------------------------------------------------------------------ // Initialize a vector with four integer values -inline XMVECTOR XM_CALLCONV XMVectorSetInt -( - uint32_t x, - uint32_t y, - uint32_t z, - uint32_t w -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorSetInt(uint32_t x, uint32_t y, uint32_t z, uint32_t w) noexcept { #if defined(_XM_NO_INTRINSICS_) XMVECTORU32 vResult = { { { x, y, z, w } } }; @@ -110,10 +96,7 @@ inline XMVECTOR XM_CALLCONV XMVectorReplicate(float Value) noexcept { #if defined(_XM_NO_INTRINSICS_) XMVECTORF32 vResult; - vResult.f[0] = - vResult.f[1] = - vResult.f[2] = - vResult.f[3] = Value; + vResult.f[0] = vResult.f[1] = vResult.f[2] = vResult.f[3] = Value; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vdupq_n_f32(Value); @@ -124,16 +107,12 @@ inline XMVECTOR XM_CALLCONV XMVectorReplicate(float Value) noexcept //------------------------------------------------------------------------------ // Initialize a vector with a replicated floating point value passed by pointer -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorReplicatePtr(const float* pValue) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMVectorReplicatePtr(const float* pValue) noexcept { #if defined(_XM_NO_INTRINSICS_) - float Value = pValue[0]; + float Value = pValue[0]; XMVECTORF32 vResult; - vResult.f[0] = - vResult.f[1] = - vResult.f[2] = - vResult.f[3] = Value; + vResult.f[0] = vResult.f[1] = vResult.f[2] = vResult.f[3] = Value; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vld1q_dup_f32(pValue); @@ -150,10 +129,7 @@ inline XMVECTOR XM_CALLCONV XMVectorReplicateInt(uint32_t Value) noexcept { #if defined(_XM_NO_INTRINSICS_) XMVECTORU32 vResult; - vResult.u[0] = - vResult.u[1] = - vResult.u[2] = - vResult.u[3] = Value; + vResult.u[0] = vResult.u[1] = vResult.u[2] = vResult.u[3] = Value; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vreinterpretq_f32_u32(vdupq_n_u32(Value)); @@ -165,16 +141,12 @@ inline XMVECTOR XM_CALLCONV XMVectorReplicateInt(uint32_t Value) noexcept //------------------------------------------------------------------------------ // Initialize a vector with a replicated integer value passed by pointer -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorReplicateIntPtr(const uint32_t* pValue) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMVectorReplicateIntPtr(const uint32_t* pValue) noexcept { #if defined(_XM_NO_INTRINSICS_) - uint32_t Value = pValue[0]; + uint32_t Value = pValue[0]; XMVECTORU32 vResult; - vResult.u[0] = - vResult.u[1] = - vResult.u[2] = - vResult.u[3] = Value; + vResult.u[0] = vResult.u[1] = vResult.u[2] = vResult.u[3] = Value; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vreinterpretq_f32_u32(vld1q_dup_u32(pValue)); @@ -218,10 +190,7 @@ inline XMVECTOR XM_CALLCONV XMVectorSplatX(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) XMVECTORF32 vResult; - vResult.f[0] = - vResult.f[1] = - vResult.f[2] = - vResult.f[3] = V.vector4_f32[0]; + vResult.f[0] = vResult.f[1] = vResult.f[2] = vResult.f[3] = V.vector4_f32[0]; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vdupq_lane_f32(vget_low_f32(V), 0); @@ -238,10 +207,7 @@ inline XMVECTOR XM_CALLCONV XMVectorSplatY(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) XMVECTORF32 vResult; - vResult.f[0] = - vResult.f[1] = - vResult.f[2] = - vResult.f[3] = V.vector4_f32[1]; + vResult.f[0] = vResult.f[1] = vResult.f[2] = vResult.f[3] = V.vector4_f32[1]; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vdupq_lane_f32(vget_low_f32(V), 1); @@ -256,10 +222,7 @@ inline XMVECTOR XM_CALLCONV XMVectorSplatZ(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) XMVECTORF32 vResult; - vResult.f[0] = - vResult.f[1] = - vResult.f[2] = - vResult.f[3] = V.vector4_f32[2]; + vResult.f[0] = vResult.f[1] = vResult.f[2] = vResult.f[3] = V.vector4_f32[2]; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vdupq_lane_f32(vget_high_f32(V), 0); @@ -274,10 +237,7 @@ inline XMVECTOR XM_CALLCONV XMVectorSplatW(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) XMVECTORF32 vResult; - vResult.f[0] = - vResult.f[1] = - vResult.f[2] = - vResult.f[3] = V.vector4_f32[3]; + vResult.f[0] = vResult.f[1] = vResult.f[2] = vResult.f[3] = V.vector4_f32[3]; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vdupq_lane_f32(vget_high_f32(V), 1); @@ -292,10 +252,7 @@ inline XMVECTOR XM_CALLCONV XMVectorSplatOne() noexcept { #if defined(_XM_NO_INTRINSICS_) XMVECTORF32 vResult; - vResult.f[0] = - vResult.f[1] = - vResult.f[2] = - vResult.f[3] = 1.0f; + vResult.f[0] = vResult.f[1] = vResult.f[2] = vResult.f[3] = 1.0f; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vdupq_n_f32(1.0f); @@ -310,10 +267,7 @@ inline XMVECTOR XM_CALLCONV XMVectorSplatInfinity() noexcept { #if defined(_XM_NO_INTRINSICS_) XMVECTORU32 vResult; - vResult.u[0] = - vResult.u[1] = - vResult.u[2] = - vResult.u[3] = 0x7F800000; + vResult.u[0] = vResult.u[1] = vResult.u[2] = vResult.u[3] = 0x7F800000; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vreinterpretq_f32_u32(vdupq_n_u32(0x7F800000)); @@ -328,10 +282,7 @@ inline XMVECTOR XM_CALLCONV XMVectorSplatQNaN() noexcept { #if defined(_XM_NO_INTRINSICS_) XMVECTORU32 vResult; - vResult.u[0] = - vResult.u[1] = - vResult.u[2] = - vResult.u[3] = 0x7FC00000; + vResult.u[0] = vResult.u[1] = vResult.u[2] = vResult.u[3] = 0x7FC00000; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vreinterpretq_f32_u32(vdupq_n_u32(0x7FC00000)); @@ -346,10 +297,7 @@ inline XMVECTOR XM_CALLCONV XMVectorSplatEpsilon() noexcept { #if defined(_XM_NO_INTRINSICS_) XMVECTORU32 vResult; - vResult.u[0] = - vResult.u[1] = - vResult.u[2] = - vResult.u[3] = 0x34000000; + vResult.u[0] = vResult.u[1] = vResult.u[2] = vResult.u[3] = 0x34000000; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vreinterpretq_f32_u32(vdupq_n_u32(0x34000000)); @@ -364,10 +312,7 @@ inline XMVECTOR XM_CALLCONV XMVectorSplatSignMask() noexcept { #if defined(_XM_NO_INTRINSICS_) XMVECTORU32 vResult; - vResult.u[0] = - vResult.u[1] = - vResult.u[2] = - vResult.u[3] = 0x80000000U; + vResult.u[0] = vResult.u[1] = vResult.u[2] = vResult.u[3] = 0x80000000U; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vreinterpretq_f32_u32(vdupq_n_u32(0x80000000U)); @@ -448,8 +393,7 @@ inline float XM_CALLCONV XMVectorGetW(FXMVECTOR V) noexcept //------------------------------------------------------------------------------ // Store a component indexed by i into a 32 bit float location in memory. -_Use_decl_annotations_ -inline void XM_CALLCONV XMVectorGetByIndexPtr(float* f, FXMVECTOR V, size_t i) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMVectorGetByIndexPtr(float* f, FXMVECTOR V, size_t i) noexcept { assert(f != nullptr); assert(i < 4); @@ -459,15 +403,14 @@ inline void XM_CALLCONV XMVectorGetByIndexPtr(float* f, FXMVECTOR V, size_t i) n #else XMVECTORF32 U; U.v = V; - *f = U.f[i]; + *f = U.f[i]; #endif } //------------------------------------------------------------------------------ // Store the X component into a 32 bit float location in memory. -_Use_decl_annotations_ -inline void XM_CALLCONV XMVectorGetXPtr(float* x, FXMVECTOR V) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMVectorGetXPtr(float* x, FXMVECTOR V) noexcept { assert(x != nullptr); #if defined(_XM_NO_INTRINSICS_) @@ -480,8 +423,7 @@ inline void XM_CALLCONV XMVectorGetXPtr(float* x, FXMVECTOR V) noexcept } // Store the Y component into a 32 bit float location in memory. -_Use_decl_annotations_ -inline void XM_CALLCONV XMVectorGetYPtr(float* y, FXMVECTOR V) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMVectorGetYPtr(float* y, FXMVECTOR V) noexcept { assert(y != nullptr); #if defined(_XM_NO_INTRINSICS_) @@ -489,7 +431,7 @@ inline void XM_CALLCONV XMVectorGetYPtr(float* y, FXMVECTOR V) noexcept #elif defined(_XM_ARM_NEON_INTRINSICS_) vst1q_lane_f32(y, V, 1); #elif defined(_XM_SSE4_INTRINSICS_) - * (reinterpret_cast(y)) = _mm_extract_ps(V, 1); + *(reinterpret_cast(y)) = _mm_extract_ps(V, 1); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); _mm_store_ss(y, vResult); @@ -497,8 +439,7 @@ inline void XM_CALLCONV XMVectorGetYPtr(float* y, FXMVECTOR V) noexcept } // Store the Z component into a 32 bit float location in memory. -_Use_decl_annotations_ -inline void XM_CALLCONV XMVectorGetZPtr(float* z, FXMVECTOR V) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMVectorGetZPtr(float* z, FXMVECTOR V) noexcept { assert(z != nullptr); #if defined(_XM_NO_INTRINSICS_) @@ -506,7 +447,7 @@ inline void XM_CALLCONV XMVectorGetZPtr(float* z, FXMVECTOR V) noexcept #elif defined(_XM_ARM_NEON_INTRINSICS_) vst1q_lane_f32(z, V, 2); #elif defined(_XM_SSE4_INTRINSICS_) - * (reinterpret_cast(z)) = _mm_extract_ps(V, 2); + *(reinterpret_cast(z)) = _mm_extract_ps(V, 2); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); _mm_store_ss(z, vResult); @@ -514,8 +455,7 @@ inline void XM_CALLCONV XMVectorGetZPtr(float* z, FXMVECTOR V) noexcept } // Store the W component into a 32 bit float location in memory. -_Use_decl_annotations_ -inline void XM_CALLCONV XMVectorGetWPtr(float* w, FXMVECTOR V) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMVectorGetWPtr(float* w, FXMVECTOR V) noexcept { assert(w != nullptr); #if defined(_XM_NO_INTRINSICS_) @@ -523,7 +463,7 @@ inline void XM_CALLCONV XMVectorGetWPtr(float* w, FXMVECTOR V) noexcept #elif defined(_XM_ARM_NEON_INTRINSICS_) vst1q_lane_f32(w, V, 3); #elif defined(_XM_SSE4_INTRINSICS_) - * (reinterpret_cast(w)) = _mm_extract_ps(V, 3); + *(reinterpret_cast(w)) = _mm_extract_ps(V, 3); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); _mm_store_ss(w, vResult); @@ -612,8 +552,7 @@ inline uint32_t XM_CALLCONV XMVectorGetIntW(FXMVECTOR V) noexcept //------------------------------------------------------------------------------ // Store a component indexed by i into a 32 bit integer location in memory. -_Use_decl_annotations_ -inline void XM_CALLCONV XMVectorGetIntByIndexPtr(uint32_t* x, FXMVECTOR V, size_t i) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMVectorGetIntByIndexPtr(uint32_t* x, FXMVECTOR V, size_t i) noexcept { assert(x != nullptr); assert(i < 4); @@ -623,15 +562,14 @@ inline void XM_CALLCONV XMVectorGetIntByIndexPtr(uint32_t* x, FXMVECTOR V, size_ #else XMVECTORU32 U; U.v = V; - *x = U.u[i]; + *x = U.u[i]; #endif } //------------------------------------------------------------------------------ // Store the X component into a 32 bit integer location in memory. -_Use_decl_annotations_ -inline void XM_CALLCONV XMVectorGetIntXPtr(uint32_t* x, FXMVECTOR V) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMVectorGetIntXPtr(uint32_t* x, FXMVECTOR V) noexcept { assert(x != nullptr); #if defined(_XM_NO_INTRINSICS_) @@ -644,8 +582,7 @@ inline void XM_CALLCONV XMVectorGetIntXPtr(uint32_t* x, FXMVECTOR V) noexcept } // Store the Y component into a 32 bit integer location in memory. -_Use_decl_annotations_ -inline void XM_CALLCONV XMVectorGetIntYPtr(uint32_t* y, FXMVECTOR V) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMVectorGetIntYPtr(uint32_t* y, FXMVECTOR V) noexcept { assert(y != nullptr); #if defined(_XM_NO_INTRINSICS_) @@ -654,7 +591,7 @@ inline void XM_CALLCONV XMVectorGetIntYPtr(uint32_t* y, FXMVECTOR V) noexcept vst1q_lane_u32(y, *reinterpret_cast(&V), 1); #elif defined(_XM_SSE4_INTRINSICS_) __m128i V1 = _mm_castps_si128(V); - *y = static_cast(_mm_extract_epi32(V1, 1)); + *y = static_cast(_mm_extract_epi32(V1, 1)); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); _mm_store_ss(reinterpret_cast(y), vResult); @@ -662,8 +599,7 @@ inline void XM_CALLCONV XMVectorGetIntYPtr(uint32_t* y, FXMVECTOR V) noexcept } // Store the Z component into a 32 bit integer locaCantion in memory. -_Use_decl_annotations_ -inline void XM_CALLCONV XMVectorGetIntZPtr(uint32_t* z, FXMVECTOR V) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMVectorGetIntZPtr(uint32_t* z, FXMVECTOR V) noexcept { assert(z != nullptr); #if defined(_XM_NO_INTRINSICS_) @@ -672,7 +608,7 @@ inline void XM_CALLCONV XMVectorGetIntZPtr(uint32_t* z, FXMVECTOR V) noexcept vst1q_lane_u32(z, *reinterpret_cast(&V), 2); #elif defined(_XM_SSE4_INTRINSICS_) __m128i V1 = _mm_castps_si128(V); - *z = static_cast(_mm_extract_epi32(V1, 2)); + *z = static_cast(_mm_extract_epi32(V1, 2)); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); _mm_store_ss(reinterpret_cast(z), vResult); @@ -680,8 +616,7 @@ inline void XM_CALLCONV XMVectorGetIntZPtr(uint32_t* z, FXMVECTOR V) noexcept } // Store the W component into a 32 bit integer location in memory. -_Use_decl_annotations_ -inline void XM_CALLCONV XMVectorGetIntWPtr(uint32_t* w, FXMVECTOR V) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMVectorGetIntWPtr(uint32_t* w, FXMVECTOR V) noexcept { assert(w != nullptr); #if defined(_XM_NO_INTRINSICS_) @@ -690,7 +625,7 @@ inline void XM_CALLCONV XMVectorGetIntWPtr(uint32_t* w, FXMVECTOR V) noexcept vst1q_lane_u32(w, *reinterpret_cast(&V), 3); #elif defined(_XM_SSE4_INTRINSICS_) __m128i V1 = _mm_castps_si128(V); - *w = static_cast(_mm_extract_epi32(V1, 3)); + *w = static_cast(_mm_extract_epi32(V1, 3)); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); _mm_store_ss(reinterpret_cast(w), vResult); @@ -705,7 +640,7 @@ inline XMVECTOR XM_CALLCONV XMVectorSetByIndex(FXMVECTOR V, float f, size_t i) n assert(i < 4); _Analysis_assume_(i < 4); XMVECTORF32 U; - U.v = V; + U.v = V; U.f[i] = f; return U.v; } @@ -716,18 +651,13 @@ inline XMVECTOR XM_CALLCONV XMVectorSetByIndex(FXMVECTOR V, float f, size_t i) n inline XMVECTOR XM_CALLCONV XMVectorSetX(FXMVECTOR V, float x) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 U = { { { - x, - V.vector4_f32[1], - V.vector4_f32[2], - V.vector4_f32[3] - } } }; + XMVECTORF32 U = { { { x, V.vector4_f32[1], V.vector4_f32[2], V.vector4_f32[3] } } }; return U.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vsetq_lane_f32(x, V, 0); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vResult = _mm_set_ss(x); - vResult = _mm_move_ss(V, vResult); + vResult = _mm_move_ss(V, vResult); return vResult; #endif } @@ -736,18 +666,13 @@ inline XMVECTOR XM_CALLCONV XMVectorSetX(FXMVECTOR V, float x) noexcept inline XMVECTOR XM_CALLCONV XMVectorSetY(FXMVECTOR V, float y) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 U = { { { - V.vector4_f32[0], - y, - V.vector4_f32[2], - V.vector4_f32[3] - } } }; + XMVECTORF32 U = { { { V.vector4_f32[0], y, V.vector4_f32[2], V.vector4_f32[3] } } }; return U.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vsetq_lane_f32(y, V, 1); #elif defined(_XM_SSE4_INTRINSICS_) XMVECTOR vResult = _mm_set_ss(y); - vResult = _mm_insert_ps(V, vResult, 0x10); + vResult = _mm_insert_ps(V, vResult, 0x10); return vResult; #elif defined(_XM_SSE_INTRINSICS_) // Swap y and x @@ -765,18 +690,13 @@ inline XMVECTOR XM_CALLCONV XMVectorSetY(FXMVECTOR V, float y) noexcept inline XMVECTOR XM_CALLCONV XMVectorSetZ(FXMVECTOR V, float z) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 U = { { { - V.vector4_f32[0], - V.vector4_f32[1], - z, - V.vector4_f32[3] - } } }; + XMVECTORF32 U = { { { V.vector4_f32[0], V.vector4_f32[1], z, V.vector4_f32[3] } } }; return U.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vsetq_lane_f32(z, V, 2); #elif defined(_XM_SSE4_INTRINSICS_) XMVECTOR vResult = _mm_set_ss(z); - vResult = _mm_insert_ps(V, vResult, 0x20); + vResult = _mm_insert_ps(V, vResult, 0x20); return vResult; #elif defined(_XM_SSE_INTRINSICS_) // Swap z and x @@ -795,18 +715,13 @@ inline XMVECTOR XM_CALLCONV XMVectorSetZ(FXMVECTOR V, float z) noexcept inline XMVECTOR XM_CALLCONV XMVectorSetW(FXMVECTOR V, float w) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 U = { { { - V.vector4_f32[0], - V.vector4_f32[1], - V.vector4_f32[2], - w - } } }; + XMVECTORF32 U = { { { V.vector4_f32[0], V.vector4_f32[1], V.vector4_f32[2], w } } }; return U.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vsetq_lane_f32(w, V, 3); #elif defined(_XM_SSE4_INTRINSICS_) XMVECTOR vResult = _mm_set_ss(w); - vResult = _mm_insert_ps(V, vResult, 0x30); + vResult = _mm_insert_ps(V, vResult, 0x30); return vResult; #elif defined(_XM_SSE_INTRINSICS_) // Swap w and x @@ -824,14 +739,13 @@ inline XMVECTOR XM_CALLCONV XMVectorSetW(FXMVECTOR V, float w) noexcept //------------------------------------------------------------------------------ // Sets a component of a vector to a floating point value passed by pointer -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorSetByIndexPtr(FXMVECTOR V, const float* f, size_t i) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMVectorSetByIndexPtr(FXMVECTOR V, const float* f, size_t i) noexcept { assert(f != nullptr); assert(i < 4); _Analysis_assume_(i < 4); XMVECTORF32 U; - U.v = V; + U.v = V; U.f[i] = *f; return U.v; } @@ -839,39 +753,27 @@ inline XMVECTOR XM_CALLCONV XMVectorSetByIndexPtr(FXMVECTOR V, const float* f, s //------------------------------------------------------------------------------ // Sets the X component of a vector to a floating point value passed by pointer -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorSetXPtr(FXMVECTOR V, const float* x) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMVectorSetXPtr(FXMVECTOR V, const float* x) noexcept { assert(x != nullptr); #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 U = { { { - *x, - V.vector4_f32[1], - V.vector4_f32[2], - V.vector4_f32[3] - } } }; + XMVECTORF32 U = { { { *x, V.vector4_f32[1], V.vector4_f32[2], V.vector4_f32[3] } } }; return U.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vld1q_lane_f32(x, V, 0); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vResult = _mm_load_ss(x); - vResult = _mm_move_ss(V, vResult); + vResult = _mm_move_ss(V, vResult); return vResult; #endif } // Sets the Y component of a vector to a floating point value passed by pointer -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorSetYPtr(FXMVECTOR V, const float* y) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMVectorSetYPtr(FXMVECTOR V, const float* y) noexcept { assert(y != nullptr); #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 U = { { { - V.vector4_f32[0], - *y, - V.vector4_f32[2], - V.vector4_f32[3] - } } }; + XMVECTORF32 U = { { { V.vector4_f32[0], *y, V.vector4_f32[2], V.vector4_f32[3] } } }; return U.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vld1q_lane_f32(y, V, 1); @@ -889,17 +791,11 @@ inline XMVECTOR XM_CALLCONV XMVectorSetYPtr(FXMVECTOR V, const float* y) noexcep } // Sets the Z component of a vector to a floating point value passed by pointer -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorSetZPtr(FXMVECTOR V, const float* z) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMVectorSetZPtr(FXMVECTOR V, const float* z) noexcept { assert(z != nullptr); #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 U = { { { - V.vector4_f32[0], - V.vector4_f32[1], - *z, - V.vector4_f32[3] - } } }; + XMVECTORF32 U = { { { V.vector4_f32[0], V.vector4_f32[1], *z, V.vector4_f32[3] } } }; return U.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vld1q_lane_f32(z, V, 2); @@ -917,17 +813,11 @@ inline XMVECTOR XM_CALLCONV XMVectorSetZPtr(FXMVECTOR V, const float* z) noexcep } // Sets the W component of a vector to a floating point value passed by pointer -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorSetWPtr(FXMVECTOR V, const float* w) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMVectorSetWPtr(FXMVECTOR V, const float* w) noexcept { assert(w != nullptr); #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 U = { { { - V.vector4_f32[0], - V.vector4_f32[1], - V.vector4_f32[2], - *w - } } }; + XMVECTORF32 U = { { { V.vector4_f32[0], V.vector4_f32[1], V.vector4_f32[2], *w } } }; return U.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vld1q_lane_f32(w, V, 3); @@ -952,7 +842,7 @@ inline XMVECTOR XM_CALLCONV XMVectorSetIntByIndex(FXMVECTOR V, uint32_t x, size_ assert(i < 4); _Analysis_assume_(i < 4); XMVECTORU32 tmp; - tmp.v = V; + tmp.v = V; tmp.u[i] = x; return tmp; } @@ -963,17 +853,12 @@ inline XMVECTOR XM_CALLCONV XMVectorSetIntByIndex(FXMVECTOR V, uint32_t x, size_ inline XMVECTOR XM_CALLCONV XMVectorSetIntX(FXMVECTOR V, uint32_t x) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 U = { { { - x, - V.vector4_u32[1], - V.vector4_u32[2], - V.vector4_u32[3] - } } }; + XMVECTORU32 U = { { { x, V.vector4_u32[1], V.vector4_u32[2], V.vector4_u32[3] } } }; return U.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vreinterpretq_f32_u32(vsetq_lane_u32(x, vreinterpretq_u32_f32(V), 0)); #elif defined(_XM_SSE_INTRINSICS_) - __m128i vTemp = _mm_cvtsi32_si128(static_cast(x)); + __m128i vTemp = _mm_cvtsi32_si128(static_cast(x)); XMVECTOR vResult = _mm_move_ss(V, _mm_castsi128_ps(vTemp)); return vResult; #endif @@ -983,18 +868,13 @@ inline XMVECTOR XM_CALLCONV XMVectorSetIntX(FXMVECTOR V, uint32_t x) noexcept inline XMVECTOR XM_CALLCONV XMVectorSetIntY(FXMVECTOR V, uint32_t y) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 U = { { { - V.vector4_u32[0], - y, - V.vector4_u32[2], - V.vector4_u32[3] - } } }; + XMVECTORU32 U = { { { V.vector4_u32[0], y, V.vector4_u32[2], V.vector4_u32[3] } } }; return U.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vreinterpretq_f32_u32(vsetq_lane_u32(y, vreinterpretq_u32_f32(V), 1)); #elif defined(_XM_SSE4_INTRINSICS_) __m128i vResult = _mm_castps_si128(V); - vResult = _mm_insert_epi32(vResult, static_cast(y), 1); + vResult = _mm_insert_epi32(vResult, static_cast(y), 1); return _mm_castsi128_ps(vResult); #elif defined(_XM_SSE_INTRINSICS_) // Swap y and x @@ -1013,18 +893,13 @@ inline XMVECTOR XM_CALLCONV XMVectorSetIntY(FXMVECTOR V, uint32_t y) noexcept inline XMVECTOR XM_CALLCONV XMVectorSetIntZ(FXMVECTOR V, uint32_t z) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 U = { { { - V.vector4_u32[0], - V.vector4_u32[1], - z, - V.vector4_u32[3] - } } }; + XMVECTORU32 U = { { { V.vector4_u32[0], V.vector4_u32[1], z, V.vector4_u32[3] } } }; return U.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vreinterpretq_f32_u32(vsetq_lane_u32(z, vreinterpretq_u32_f32(V), 2)); #elif defined(_XM_SSE4_INTRINSICS_) __m128i vResult = _mm_castps_si128(V); - vResult = _mm_insert_epi32(vResult, static_cast(z), 2); + vResult = _mm_insert_epi32(vResult, static_cast(z), 2); return _mm_castsi128_ps(vResult); #elif defined(_XM_SSE_INTRINSICS_) // Swap z and x @@ -1043,18 +918,13 @@ inline XMVECTOR XM_CALLCONV XMVectorSetIntZ(FXMVECTOR V, uint32_t z) noexcept inline XMVECTOR XM_CALLCONV XMVectorSetIntW(FXMVECTOR V, uint32_t w) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 U = { { { - V.vector4_u32[0], - V.vector4_u32[1], - V.vector4_u32[2], - w - } } }; + XMVECTORU32 U = { { { V.vector4_u32[0], V.vector4_u32[1], V.vector4_u32[2], w } } }; return U.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vreinterpretq_f32_u32(vsetq_lane_u32(w, vreinterpretq_u32_f32(V), 3)); #elif defined(_XM_SSE4_INTRINSICS_) __m128i vResult = _mm_castps_si128(V); - vResult = _mm_insert_epi32(vResult, static_cast(w), 3); + vResult = _mm_insert_epi32(vResult, static_cast(w), 3); return _mm_castsi128_ps(vResult); #elif defined(_XM_SSE_INTRINSICS_) // Swap w and x @@ -1072,14 +942,13 @@ inline XMVECTOR XM_CALLCONV XMVectorSetIntW(FXMVECTOR V, uint32_t w) noexcept //------------------------------------------------------------------------------ // Sets a component of a vector to an integer value passed by pointer -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorSetIntByIndexPtr(FXMVECTOR V, const uint32_t* x, size_t i) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMVectorSetIntByIndexPtr(FXMVECTOR V, const uint32_t* x, size_t i) noexcept { assert(x != nullptr); assert(i < 4); _Analysis_assume_(i < 4); XMVECTORU32 tmp; - tmp.v = V; + tmp.v = V; tmp.u[i] = *x; return tmp; } @@ -1087,39 +956,27 @@ inline XMVECTOR XM_CALLCONV XMVectorSetIntByIndexPtr(FXMVECTOR V, const uint32_t //------------------------------------------------------------------------------ // Sets the X component of a vector to an integer value passed by pointer -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorSetIntXPtr(FXMVECTOR V, const uint32_t* x) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMVectorSetIntXPtr(FXMVECTOR V, const uint32_t* x) noexcept { assert(x != nullptr); #if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 U = { { { - *x, - V.vector4_u32[1], - V.vector4_u32[2], - V.vector4_u32[3] - } } }; + XMVECTORU32 U = { { { *x, V.vector4_u32[1], V.vector4_u32[2], V.vector4_u32[3] } } }; return U.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vreinterpretq_f32_u32(vld1q_lane_u32(x, *reinterpret_cast(&V), 0)); #elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_load_ss(reinterpret_cast(x)); + XMVECTOR vTemp = _mm_load_ss(reinterpret_cast(x)); XMVECTOR vResult = _mm_move_ss(V, vTemp); return vResult; #endif } // Sets the Y component of a vector to an integer value passed by pointer -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorSetIntYPtr(FXMVECTOR V, const uint32_t* y) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMVectorSetIntYPtr(FXMVECTOR V, const uint32_t* y) noexcept { assert(y != nullptr); #if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 U = { { { - V.vector4_u32[0], - *y, - V.vector4_u32[2], - V.vector4_u32[3] - } } }; + XMVECTORU32 U = { { { V.vector4_u32[0], *y, V.vector4_u32[2], V.vector4_u32[3] } } }; return U.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vreinterpretq_f32_u32(vld1q_lane_u32(y, *reinterpret_cast(&V), 1)); @@ -1137,17 +994,11 @@ inline XMVECTOR XM_CALLCONV XMVectorSetIntYPtr(FXMVECTOR V, const uint32_t* y) n } // Sets the Z component of a vector to an integer value passed by pointer -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorSetIntZPtr(FXMVECTOR V, const uint32_t* z) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMVectorSetIntZPtr(FXMVECTOR V, const uint32_t* z) noexcept { assert(z != nullptr); #if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 U = { { { - V.vector4_u32[0], - V.vector4_u32[1], - *z, - V.vector4_u32[3] - } } }; + XMVECTORU32 U = { { { V.vector4_u32[0], V.vector4_u32[1], *z, V.vector4_u32[3] } } }; return U.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vreinterpretq_f32_u32(vld1q_lane_u32(z, *reinterpret_cast(&V), 2)); @@ -1165,17 +1016,11 @@ inline XMVECTOR XM_CALLCONV XMVectorSetIntZPtr(FXMVECTOR V, const uint32_t* z) n } // Sets the W component of a vector to an integer value passed by pointer -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorSetIntWPtr(FXMVECTOR V, const uint32_t* w) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMVectorSetIntWPtr(FXMVECTOR V, const uint32_t* w) noexcept { assert(w != nullptr); #if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 U = { { { - V.vector4_u32[0], - V.vector4_u32[1], - V.vector4_u32[2], - *w - } } }; + XMVECTORU32 U = { { { V.vector4_u32[0], V.vector4_u32[1], V.vector4_u32[2], *w } } }; return U.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vreinterpretq_f32_u32(vld1q_lane_u32(w, *reinterpret_cast(&V), 3)); @@ -1194,30 +1039,17 @@ inline XMVECTOR XM_CALLCONV XMVectorSetIntWPtr(FXMVECTOR V, const uint32_t* w) n //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorSwizzle -( - FXMVECTOR V, - uint32_t E0, - uint32_t E1, - uint32_t E2, - uint32_t E3 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorSwizzle(FXMVECTOR V, uint32_t E0, uint32_t E1, uint32_t E2, uint32_t E3) noexcept { assert((E0 < 4) && (E1 < 4) && (E2 < 4) && (E3 < 4)); _Analysis_assume_((E0 < 4) && (E1 < 4) && (E2 < 4) && (E3 < 4)); #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - V.vector4_f32[E0], - V.vector4_f32[E1], - V.vector4_f32[E2], - V.vector4_f32[E3] - } } }; + XMVECTORF32 Result = { { { V.vector4_f32[E0], V.vector4_f32[E1], V.vector4_f32[E2], V.vector4_f32[E3] } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - static const uint32_t ControlElement[4] = - { + static const uint32_t ControlElement[4] = { 0x03020100, // XM_SWIZZLE_X 0x07060504, // XM_SWIZZLE_Y 0x0B0A0908, // XM_SWIZZLE_Z @@ -1228,22 +1060,22 @@ inline XMVECTOR XM_CALLCONV XMVectorSwizzle tbl.val[0] = vreinterpret_u8_f32(vget_low_f32(V)); tbl.val[1] = vreinterpret_u8_f32(vget_high_f32(V)); - uint32x2_t idx = vcreate_u32(static_cast(ControlElement[E0]) | (static_cast(ControlElement[E1]) << 32)); - const uint8x8_t rL = vtbl2_u8(tbl, vreinterpret_u8_u32(idx)); + uint32x2_t idx = vcreate_u32(static_cast(ControlElement[E0]) | (static_cast(ControlElement[E1]) << 32)); + const uint8x8_t rL = vtbl2_u8(tbl, vreinterpret_u8_u32(idx)); - idx = vcreate_u32(static_cast(ControlElement[E2]) | (static_cast(ControlElement[E3]) << 32)); + idx = vcreate_u32(static_cast(ControlElement[E2]) | (static_cast(ControlElement[E3]) << 32)); const uint8x8_t rH = vtbl2_u8(tbl, vreinterpret_u8_u32(idx)); return vcombine_f32(vreinterpret_f32_u8(rL), vreinterpret_f32_u8(rH)); #elif defined(_XM_AVX_INTRINSICS_) - unsigned int elem[4] = { E0, E1, E2, E3 }; - __m128i vControl = _mm_loadu_si128(reinterpret_cast(&elem[0])); + unsigned int elem[4] = { E0, E1, E2, E3 }; + __m128i vControl = _mm_loadu_si128(reinterpret_cast(&elem[0])); return _mm_permutevar_ps(V, vControl); #else #if defined(__GNUC__) && !defined(__clang__) // workaround some GCC optimization behavior that breaks this function XMVECTORU32 T; - T.v = V; + T.v = V; auto aPtr = reinterpret_cast(&T); #else auto aPtr = reinterpret_cast(&V); @@ -1260,22 +1092,14 @@ inline XMVECTOR XM_CALLCONV XMVectorSwizzle } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorPermute -( - FXMVECTOR V1, - FXMVECTOR V2, - uint32_t PermuteX, - uint32_t PermuteY, - uint32_t PermuteZ, - uint32_t PermuteW -) noexcept +inline XMVECTOR XM_CALLCONV +XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2, uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW) noexcept { assert(PermuteX <= 7 && PermuteY <= 7 && PermuteZ <= 7 && PermuteW <= 7); _Analysis_assume_(PermuteX <= 7 && PermuteY <= 7 && PermuteZ <= 7 && PermuteW <= 7); #if defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - static const uint32_t ControlElement[8] = - { + static const uint32_t ControlElement[8] = { 0x03020100, // XM_PERMUTE_0X 0x07060504, // XM_PERMUTE_0Y 0x0B0A0908, // XM_PERMUTE_0Z @@ -1302,11 +1126,11 @@ inline XMVECTOR XM_CALLCONV XMVectorPermute #elif defined(_XM_AVX_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) static const XMVECTORU32 three = { { { 3, 3, 3, 3 } } }; - XM_ALIGNED_DATA(16) unsigned int elem[4] = { PermuteX, PermuteY, PermuteZ, PermuteW }; - __m128i vControl = _mm_load_si128(reinterpret_cast(&elem[0])); + XM_ALIGNED_DATA(16) unsigned int elem[4] = { PermuteX, PermuteY, PermuteZ, PermuteW }; + __m128i vControl = _mm_load_si128(reinterpret_cast(&elem[0])); __m128i vSelect = _mm_cmpgt_epi32(vControl, three); - vControl = _mm_castps_si128(_mm_and_ps(_mm_castsi128_ps(vControl), three)); + vControl = _mm_castps_si128(_mm_and_ps(_mm_castsi128_ps(vControl), three)); __m128 shuffled1 = _mm_permutevar_ps(V1, vControl); __m128 shuffled2 = _mm_permutevar_ps(V2, vControl); @@ -1324,7 +1148,7 @@ inline XMVECTOR XM_CALLCONV XMVectorPermute XMVECTORU32 T1; T1.v = V1; XMVECTORU32 T2; - T2.v = V2; + T2.v = V2; aPtr[0] = reinterpret_cast(&T1); aPtr[1] = reinterpret_cast(&T2); #else @@ -1332,22 +1156,22 @@ inline XMVECTOR XM_CALLCONV XMVectorPermute aPtr[1] = reinterpret_cast(&V2); #endif - XMVECTORU32 vResult; - const uint32_t i0 = PermuteX & 3; + XMVECTORU32 vResult; + const uint32_t i0 = PermuteX & 3; const uint32_t vi0 = PermuteX >> 2; - vResult.u[0] = aPtr[vi0][i0]; + vResult.u[0] = aPtr[vi0][i0]; - const uint32_t i1 = PermuteY & 3; + const uint32_t i1 = PermuteY & 3; const uint32_t vi1 = PermuteY >> 2; - vResult.u[1] = aPtr[vi1][i1]; + vResult.u[1] = aPtr[vi1][i1]; - const uint32_t i2 = PermuteZ & 3; + const uint32_t i2 = PermuteZ & 3; const uint32_t vi2 = PermuteZ >> 2; - vResult.u[2] = aPtr[vi2][i2]; + vResult.u[2] = aPtr[vi2][i2]; - const uint32_t i3 = PermuteW & 3; + const uint32_t i3 = PermuteW & 3; const uint32_t vi3 = PermuteW >> 2; - vResult.u[3] = aPtr[vi3][i3]; + vResult.u[3] = aPtr[vi3][i3]; return vResult.v; #endif @@ -1364,33 +1188,29 @@ inline XMVECTOR XM_CALLCONV XMVectorPermute // vector to be selected whereas a one causes the component from the // second vector to be selected instead. -inline XMVECTOR XM_CALLCONV XMVectorSelectControl -( - uint32_t VectorIndex0, - uint32_t VectorIndex1, - uint32_t VectorIndex2, - uint32_t VectorIndex3 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorSelectControl(uint32_t VectorIndex0, + uint32_t VectorIndex1, + uint32_t VectorIndex2, + uint32_t VectorIndex3) noexcept { #if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) // x=Index0,y=Index1,z=Index2,w=Index3 - __m128i vTemp = _mm_set_epi32(static_cast(VectorIndex3), static_cast(VectorIndex2), static_cast(VectorIndex1), static_cast(VectorIndex0)); + __m128i vTemp = _mm_set_epi32(static_cast(VectorIndex3), + static_cast(VectorIndex2), + static_cast(VectorIndex1), + static_cast(VectorIndex0)); // Any non-zero entries become 0xFFFFFFFF else 0 vTemp = _mm_cmpgt_epi32(vTemp, g_XMZero); return _mm_castsi128_ps(vTemp); #elif defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - int32x2_t V0 = vcreate_s32(static_cast(VectorIndex0) | (static_cast(VectorIndex1) << 32)); - int32x2_t V1 = vcreate_s32(static_cast(VectorIndex2) | (static_cast(VectorIndex3) << 32)); + int32x2_t V0 = vcreate_s32(static_cast(VectorIndex0) | (static_cast(VectorIndex1) << 32)); + int32x2_t V1 = vcreate_s32(static_cast(VectorIndex2) | (static_cast(VectorIndex3) << 32)); int32x4_t vTemp = vcombine_s32(V0, V1); // Any non-zero entries become 0xFFFFFFFF else 0 return vreinterpretq_f32_u32(vcgtq_s32(vTemp, g_XMZero)); #else - XMVECTOR ControlVector; - const uint32_t ControlElement[] = - { - XM_SELECT_0, - XM_SELECT_1 - }; + XMVECTOR ControlVector; + const uint32_t ControlElement[] = { XM_SELECT_0, XM_SELECT_1 }; assert(VectorIndex0 < 2); assert(VectorIndex1 < 2); @@ -1413,21 +1233,16 @@ inline XMVECTOR XM_CALLCONV XMVectorSelectControl //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorSelect -( - FXMVECTOR V1, - FXMVECTOR V2, - FXMVECTOR Control -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorSelect(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR Control) noexcept { #if defined(_XM_NO_INTRINSICS_) XMVECTORU32 Result = { { { - (V1.vector4_u32[0] & ~Control.vector4_u32[0]) | (V2.vector4_u32[0] & Control.vector4_u32[0]), - (V1.vector4_u32[1] & ~Control.vector4_u32[1]) | (V2.vector4_u32[1] & Control.vector4_u32[1]), - (V1.vector4_u32[2] & ~Control.vector4_u32[2]) | (V2.vector4_u32[2] & Control.vector4_u32[2]), - (V1.vector4_u32[3] & ~Control.vector4_u32[3]) | (V2.vector4_u32[3] & Control.vector4_u32[3]), - } } }; + (V1.vector4_u32[0] & ~Control.vector4_u32[0]) | (V2.vector4_u32[0] & Control.vector4_u32[0]), + (V1.vector4_u32[1] & ~Control.vector4_u32[1]) | (V2.vector4_u32[1] & Control.vector4_u32[1]), + (V1.vector4_u32[2] & ~Control.vector4_u32[2]) | (V2.vector4_u32[2] & Control.vector4_u32[2]), + (V1.vector4_u32[3] & ~Control.vector4_u32[3]) | (V2.vector4_u32[3] & Control.vector4_u32[3]), + } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) @@ -1441,20 +1256,16 @@ inline XMVECTOR XM_CALLCONV XMVectorSelect //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorMergeXY -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorMergeXY(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) XMVECTORU32 Result = { { { - V1.vector4_u32[0], - V2.vector4_u32[0], - V1.vector4_u32[1], - V2.vector4_u32[1], - } } }; + V1.vector4_u32[0], + V2.vector4_u32[0], + V1.vector4_u32[1], + V2.vector4_u32[1], + } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) @@ -1466,20 +1277,11 @@ inline XMVECTOR XM_CALLCONV XMVectorMergeXY //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorMergeZW -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorMergeZW(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 Result = { { { - V1.vector4_u32[2], - V2.vector4_u32[2], - V1.vector4_u32[3], - V2.vector4_u32[3] - } } }; + XMVECTORU32 Result = { { { V1.vector4_u32[2], V2.vector4_u32[2], V1.vector4_u32[3], V2.vector4_u32[3] } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) @@ -1495,7 +1297,7 @@ inline XMVECTOR XM_CALLCONV XMVectorShiftLeft(FXMVECTOR V1, FXMVECTOR V2, uint32 { assert(Elements < 4); _Analysis_assume_(Elements < 4); - return XMVectorPermute(V1, V2, Elements, ((Elements)+1), ((Elements)+2), ((Elements)+3)); + return XMVectorPermute(V1, V2, Elements, ((Elements) + 1), ((Elements) + 2), ((Elements) + 3)); } //------------------------------------------------------------------------------ @@ -1518,10 +1320,13 @@ inline XMVECTOR XM_CALLCONV XMVectorRotateRight(FXMVECTOR V, uint32_t Elements) //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorInsert( - FXMVECTOR VD, FXMVECTOR VS, - uint32_t VSLeftRotateElements, - uint32_t Select0, uint32_t Select1, uint32_t Select2, uint32_t Select3) noexcept +inline 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 Control = XMVectorSelectControl(Select0 & 1, Select1 & 1, Select2 & 1, Select3 & 1); return XMVectorSelect(VD, XMVectorRotateLeft(VS, VSLeftRotateElements), Control); @@ -1533,20 +1338,16 @@ inline XMVECTOR XM_CALLCONV XMVectorInsert( //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorEqual -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) XMVECTORU32 Control = { { { - (V1.vector4_f32[0] == V2.vector4_f32[0]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[1] == V2.vector4_f32[1]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[2] == V2.vector4_f32[2]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[3] == V2.vector4_f32[3]) ? 0xFFFFFFFF : 0, - } } }; + (V1.vector4_f32[0] == V2.vector4_f32[0]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[1] == V2.vector4_f32[1]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[2] == V2.vector4_f32[2]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[3] == V2.vector4_f32[3]) ? 0xFFFFFFFF : 0, + } } }; return Control.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) @@ -1558,13 +1359,7 @@ inline XMVECTOR XM_CALLCONV XMVectorEqual //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorEqualR -( - uint32_t* pCR, - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMVectorEqualR(uint32_t* pCR, FXMVECTOR V1, FXMVECTOR V2) noexcept { assert(pCR != nullptr); #if defined(_XM_NO_INTRINSICS_) @@ -1589,11 +1384,11 @@ inline XMVECTOR XM_CALLCONV XMVectorEqualR return Control; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vreinterpret_u8_u32(vget_low_u32(vResult)), vreinterpret_u8_u32(vget_high_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); - uint32_t CR = 0; + uint32x4_t vResult = vceqq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vreinterpret_u8_u32(vget_low_u32(vResult)), vreinterpret_u8_u32(vget_high_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); + uint32_t CR = 0; if (r == 0xFFFFFFFFU) { // All elements are equal @@ -1608,8 +1403,8 @@ inline XMVECTOR XM_CALLCONV XMVectorEqualR return vreinterpretq_f32_u32(vResult); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vTemp = _mm_cmpeq_ps(V1, V2); - uint32_t CR = 0; - int iTest = _mm_movemask_ps(vTemp); + uint32_t CR = 0; + int iTest = _mm_movemask_ps(vTemp); if (iTest == 0xf) { CR = XM_CRMASK_CR6TRUE; @@ -1630,20 +1425,16 @@ inline XMVECTOR XM_CALLCONV XMVectorEqualR // comparing control vectors and result vectors returned from // other comparison operations. -inline XMVECTOR XM_CALLCONV XMVectorEqualInt -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorEqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) XMVECTORU32 Control = { { { - (V1.vector4_u32[0] == V2.vector4_u32[0]) ? 0xFFFFFFFF : 0, - (V1.vector4_u32[1] == V2.vector4_u32[1]) ? 0xFFFFFFFF : 0, - (V1.vector4_u32[2] == V2.vector4_u32[2]) ? 0xFFFFFFFF : 0, - (V1.vector4_u32[3] == V2.vector4_u32[3]) ? 0xFFFFFFFF : 0, - } } }; + (V1.vector4_u32[0] == V2.vector4_u32[0]) ? 0xFFFFFFFF : 0, + (V1.vector4_u32[1] == V2.vector4_u32[1]) ? 0xFFFFFFFF : 0, + (V1.vector4_u32[2] == V2.vector4_u32[2]) ? 0xFFFFFFFF : 0, + (V1.vector4_u32[3] == V2.vector4_u32[3]) ? 0xFFFFFFFF : 0, + } } }; return Control.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) @@ -1656,13 +1447,7 @@ inline XMVECTOR XM_CALLCONV XMVectorEqualInt //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorEqualIntR -( - uint32_t* pCR, - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMVectorEqualIntR(uint32_t* pCR, FXMVECTOR V1, FXMVECTOR V2) noexcept { assert(pCR != nullptr); #if defined(_XM_NO_INTRINSICS_) @@ -1683,11 +1468,11 @@ inline XMVECTOR XM_CALLCONV XMVectorEqualIntR return Control; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); - uint32_t CR = 0; + uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); + uint32_t CR = 0; if (r == 0xFFFFFFFFU) { // All elements are equal @@ -1701,9 +1486,9 @@ inline XMVECTOR XM_CALLCONV XMVectorEqualIntR *pCR = CR; return vreinterpretq_f32_u32(vResult); #elif defined(_XM_SSE_INTRINSICS_) - __m128i V = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); - int iTemp = _mm_movemask_ps(_mm_castsi128_ps(V)); - uint32_t CR = 0; + __m128i V = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); + int iTemp = _mm_movemask_ps(_mm_castsi128_ps(V)); + uint32_t CR = 0; if (iTemp == 0x0F) { CR = XM_CRMASK_CR6TRUE; @@ -1719,12 +1504,7 @@ inline XMVECTOR XM_CALLCONV XMVectorEqualIntR //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorNearEqual -( - FXMVECTOR V1, - FXMVECTOR V2, - FXMVECTOR Epsilon -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorNearEqual(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR Epsilon) noexcept { #if defined(_XM_NO_INTRINSICS_) @@ -1739,11 +1519,11 @@ inline XMVECTOR XM_CALLCONV XMVectorNearEqual fDeltaw = fabsf(fDeltaw); XMVECTORU32 Control = { { { - (fDeltax <= Epsilon.vector4_f32[0]) ? 0xFFFFFFFFU : 0, - (fDeltay <= Epsilon.vector4_f32[1]) ? 0xFFFFFFFFU : 0, - (fDeltaz <= Epsilon.vector4_f32[2]) ? 0xFFFFFFFFU : 0, - (fDeltaw <= Epsilon.vector4_f32[3]) ? 0xFFFFFFFFU : 0, - } } }; + (fDeltax <= Epsilon.vector4_f32[0]) ? 0xFFFFFFFFU : 0, + (fDeltay <= Epsilon.vector4_f32[1]) ? 0xFFFFFFFFU : 0, + (fDeltaz <= Epsilon.vector4_f32[2]) ? 0xFFFFFFFFU : 0, + (fDeltaw <= Epsilon.vector4_f32[3]) ? 0xFFFFFFFFU : 0, + } } }; return Control.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) @@ -1758,29 +1538,25 @@ inline XMVECTOR XM_CALLCONV XMVectorNearEqual XMVECTOR vDelta = _mm_sub_ps(V1, V2); // Get the absolute value of the difference XMVECTOR vTemp = _mm_setzero_ps(); - vTemp = _mm_sub_ps(vTemp, vDelta); - vTemp = _mm_max_ps(vTemp, vDelta); - vTemp = _mm_cmple_ps(vTemp, Epsilon); + vTemp = _mm_sub_ps(vTemp, vDelta); + vTemp = _mm_max_ps(vTemp, vDelta); + vTemp = _mm_cmple_ps(vTemp, Epsilon); return vTemp; #endif } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorNotEqual -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorNotEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) XMVECTORU32 Control = { { { - (V1.vector4_f32[0] != V2.vector4_f32[0]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[1] != V2.vector4_f32[1]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[2] != V2.vector4_f32[2]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[3] != V2.vector4_f32[3]) ? 0xFFFFFFFF : 0, - } } }; + (V1.vector4_f32[0] != V2.vector4_f32[0]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[1] != V2.vector4_f32[1]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[2] != V2.vector4_f32[2]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[3] != V2.vector4_f32[3]) ? 0xFFFFFFFF : 0, + } } }; return Control.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) @@ -1792,25 +1568,18 @@ inline XMVECTOR XM_CALLCONV XMVectorNotEqual //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorNotEqualInt -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorNotEqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 Control = { { { - (V1.vector4_u32[0] != V2.vector4_u32[0]) ? 0xFFFFFFFFU : 0, - (V1.vector4_u32[1] != V2.vector4_u32[1]) ? 0xFFFFFFFFU : 0, - (V1.vector4_u32[2] != V2.vector4_u32[2]) ? 0xFFFFFFFFU : 0, - (V1.vector4_u32[3] != V2.vector4_u32[3]) ? 0xFFFFFFFFU : 0 - } } }; + XMVECTORU32 Control = { { { (V1.vector4_u32[0] != V2.vector4_u32[0]) ? 0xFFFFFFFFU : 0, + (V1.vector4_u32[1] != V2.vector4_u32[1]) ? 0xFFFFFFFFU : 0, + (V1.vector4_u32[2] != V2.vector4_u32[2]) ? 0xFFFFFFFFU : 0, + (V1.vector4_u32[3] != V2.vector4_u32[3]) ? 0xFFFFFFFFU : 0 } } }; return Control.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vmvnq_u32( - vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)))); + return vreinterpretq_f32_u32(vmvnq_u32(vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)))); #elif defined(_XM_SSE_INTRINSICS_) __m128i V = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); return _mm_xor_ps(_mm_castsi128_ps(V), g_XMNegOneMask); @@ -1819,20 +1588,14 @@ inline XMVECTOR XM_CALLCONV XMVectorNotEqualInt //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorGreater -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorGreater(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 Control = { { { - (V1.vector4_f32[0] > V2.vector4_f32[0]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[1] > V2.vector4_f32[1]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[2] > V2.vector4_f32[2]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[3] > V2.vector4_f32[3]) ? 0xFFFFFFFF : 0 - } } }; + XMVECTORU32 Control = { { { (V1.vector4_f32[0] > V2.vector4_f32[0]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[1] > V2.vector4_f32[1]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[2] > V2.vector4_f32[2]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[3] > V2.vector4_f32[3]) ? 0xFFFFFFFF : 0 } } }; return Control.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) @@ -1844,13 +1607,7 @@ inline XMVECTOR XM_CALLCONV XMVectorGreater //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorGreaterR -( - uint32_t* pCR, - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMVectorGreaterR(uint32_t* pCR, FXMVECTOR V1, FXMVECTOR V2) noexcept { assert(pCR != nullptr); #if defined(_XM_NO_INTRINSICS_) @@ -1876,11 +1633,11 @@ inline XMVECTOR XM_CALLCONV XMVectorGreaterR return Control.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcgtq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); - uint32_t CR = 0; + uint32x4_t vResult = vcgtq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); + uint32_t CR = 0; if (r == 0xFFFFFFFFU) { // All elements are greater @@ -1895,8 +1652,8 @@ inline XMVECTOR XM_CALLCONV XMVectorGreaterR return vreinterpretq_f32_u32(vResult); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vTemp = _mm_cmpgt_ps(V1, V2); - uint32_t CR = 0; - int iTest = _mm_movemask_ps(vTemp); + uint32_t CR = 0; + int iTest = _mm_movemask_ps(vTemp); if (iTest == 0xf) { CR = XM_CRMASK_CR6TRUE; @@ -1913,20 +1670,14 @@ inline XMVECTOR XM_CALLCONV XMVectorGreaterR //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorGreaterOrEqual -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorGreaterOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 Control = { { { - (V1.vector4_f32[0] >= V2.vector4_f32[0]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[1] >= V2.vector4_f32[1]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[2] >= V2.vector4_f32[2]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[3] >= V2.vector4_f32[3]) ? 0xFFFFFFFF : 0 - } } }; + XMVECTORU32 Control = { { { (V1.vector4_f32[0] >= V2.vector4_f32[0]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[1] >= V2.vector4_f32[1]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[2] >= V2.vector4_f32[2]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[3] >= V2.vector4_f32[3]) ? 0xFFFFFFFF : 0 } } }; return Control.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) @@ -1938,13 +1689,7 @@ inline XMVECTOR XM_CALLCONV XMVectorGreaterOrEqual //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorGreaterOrEqualR -( - uint32_t* pCR, - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMVectorGreaterOrEqualR(uint32_t* pCR, FXMVECTOR V1, FXMVECTOR V2) noexcept { assert(pCR != nullptr); #if defined(_XM_NO_INTRINSICS_) @@ -1970,11 +1715,11 @@ inline XMVECTOR XM_CALLCONV XMVectorGreaterOrEqualR return Control.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcgeq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); - uint32_t CR = 0; + uint32x4_t vResult = vcgeq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); + uint32_t CR = 0; if (r == 0xFFFFFFFFU) { // All elements are greater or equal @@ -1989,8 +1734,8 @@ inline XMVECTOR XM_CALLCONV XMVectorGreaterOrEqualR return vreinterpretq_f32_u32(vResult); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vTemp = _mm_cmpge_ps(V1, V2); - uint32_t CR = 0; - int iTest = _mm_movemask_ps(vTemp); + uint32_t CR = 0; + int iTest = _mm_movemask_ps(vTemp); if (iTest == 0xf) { CR = XM_CRMASK_CR6TRUE; @@ -2007,20 +1752,14 @@ inline XMVECTOR XM_CALLCONV XMVectorGreaterOrEqualR //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorLess -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorLess(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 Control = { { { - (V1.vector4_f32[0] < V2.vector4_f32[0]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[1] < V2.vector4_f32[1]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[2] < V2.vector4_f32[2]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[3] < V2.vector4_f32[3]) ? 0xFFFFFFFF : 0 - } } }; + XMVECTORU32 Control = { { { (V1.vector4_f32[0] < V2.vector4_f32[0]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[1] < V2.vector4_f32[1]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[2] < V2.vector4_f32[2]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[3] < V2.vector4_f32[3]) ? 0xFFFFFFFF : 0 } } }; return Control.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) @@ -2032,20 +1771,14 @@ inline XMVECTOR XM_CALLCONV XMVectorLess //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorLessOrEqual -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorLessOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 Control = { { { - (V1.vector4_f32[0] <= V2.vector4_f32[0]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[1] <= V2.vector4_f32[1]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[2] <= V2.vector4_f32[2]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[3] <= V2.vector4_f32[3]) ? 0xFFFFFFFF : 0 - } } }; + XMVECTORU32 Control = { { { (V1.vector4_f32[0] <= V2.vector4_f32[0]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[1] <= V2.vector4_f32[1]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[2] <= V2.vector4_f32[2]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[3] <= V2.vector4_f32[3]) ? 0xFFFFFFFF : 0 } } }; return Control.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) @@ -2057,20 +1790,14 @@ inline XMVECTOR XM_CALLCONV XMVectorLessOrEqual //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorInBounds -( - FXMVECTOR V, - FXMVECTOR Bounds -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorInBounds(FXMVECTOR V, FXMVECTOR Bounds) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 Control = { { { - (V.vector4_f32[0] <= Bounds.vector4_f32[0] && V.vector4_f32[0] >= -Bounds.vector4_f32[0]) ? 0xFFFFFFFF : 0, - (V.vector4_f32[1] <= Bounds.vector4_f32[1] && V.vector4_f32[1] >= -Bounds.vector4_f32[1]) ? 0xFFFFFFFF : 0, - (V.vector4_f32[2] <= Bounds.vector4_f32[2] && V.vector4_f32[2] >= -Bounds.vector4_f32[2]) ? 0xFFFFFFFF : 0, - (V.vector4_f32[3] <= Bounds.vector4_f32[3] && V.vector4_f32[3] >= -Bounds.vector4_f32[3]) ? 0xFFFFFFFF : 0 - } } }; + XMVECTORU32 Control = { { { (V.vector4_f32[0] <= Bounds.vector4_f32[0] && V.vector4_f32[0] >= -Bounds.vector4_f32[0]) ? 0xFFFFFFFF : 0, + (V.vector4_f32[1] <= Bounds.vector4_f32[1] && V.vector4_f32[1] >= -Bounds.vector4_f32[1]) ? 0xFFFFFFFF : 0, + (V.vector4_f32[2] <= Bounds.vector4_f32[2] && V.vector4_f32[2] >= -Bounds.vector4_f32[2]) ? 0xFFFFFFFF : 0, + (V.vector4_f32[3] <= Bounds.vector4_f32[3] && V.vector4_f32[3] >= -Bounds.vector4_f32[3]) ? 0xFFFFFFFF : 0 } } }; return Control.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) @@ -2098,13 +1825,7 @@ inline XMVECTOR XM_CALLCONV XMVectorInBounds //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorInBoundsR -( - uint32_t* pCR, - FXMVECTOR V, - FXMVECTOR Bounds -) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMVectorInBoundsR(uint32_t* pCR, FXMVECTOR V, FXMVECTOR Bounds) noexcept { assert(pCR != nullptr); #if defined(_XM_NO_INTRINSICS_) @@ -2133,11 +1854,11 @@ inline XMVECTOR XM_CALLCONV XMVectorInBoundsR // Test if greater or equal (Reversed) vTemp2 = vcleq_f32(vreinterpretq_f32_u32(vTemp2), V); // Blend answers - vTemp1 = vandq_u32(vTemp1, vTemp2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vTemp1)), vget_high_u8(vreinterpretq_u8_u32(vTemp1))); + vTemp1 = vandq_u32(vTemp1, vTemp2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vTemp1)), vget_high_u8(vreinterpretq_u8_u32(vTemp1))); uint16x4x2_t vTemp3 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp3.val[1]), 1); - uint32_t CR = 0; + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp3.val[1]), 1); + uint32_t CR = 0; if (r == 0xFFFFFFFFU) { // All elements are in bounds @@ -2177,24 +1898,21 @@ inline XMVECTOR XM_CALLCONV XMVectorIsNaN(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 Control = { { { - XMISNAN(V.vector4_f32[0]) ? 0xFFFFFFFFU : 0, - XMISNAN(V.vector4_f32[1]) ? 0xFFFFFFFFU : 0, - XMISNAN(V.vector4_f32[2]) ? 0xFFFFFFFFU : 0, - XMISNAN(V.vector4_f32[3]) ? 0xFFFFFFFFU : 0 - } } }; + XMVECTORU32 Control = { { { XMISNAN(V.vector4_f32[0]) ? 0xFFFFFFFFU : 0, + XMISNAN(V.vector4_f32[1]) ? 0xFFFFFFFFU : 0, + XMISNAN(V.vector4_f32[2]) ? 0xFFFFFFFFU : 0, + XMISNAN(V.vector4_f32[3]) ? 0xFFFFFFFFU : 0 } } }; return Control.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) #if defined(__clang__) && __FINITE_MATH_ONLY__ - XMVECTORU32 vResult = { { { - isnan(vgetq_lane_f32(V, 0)) ? 0xFFFFFFFFU : 0, + XMVECTORU32 vResult = { { { isnan(vgetq_lane_f32(V, 0)) ? 0xFFFFFFFFU : 0, isnan(vgetq_lane_f32(V, 1)) ? 0xFFFFFFFFU : 0, isnan(vgetq_lane_f32(V, 2)) ? 0xFFFFFFFFU : 0, isnan(vgetq_lane_f32(V, 3)) ? 0xFFFFFFFFU : 0 } } }; return vResult.v; #else -// Test against itself. NaN is always not equal + // Test against itself. NaN is always not equal uint32x4_t vTempNan = vceqq_f32(V, V); // Flip results return vreinterpretq_f32_u32(vmvnq_u32(vTempNan)); @@ -2203,14 +1921,13 @@ inline XMVECTOR XM_CALLCONV XMVectorIsNaN(FXMVECTOR V) noexcept #if defined(__clang__) && __FINITE_MATH_ONLY__ XM_ALIGNED_DATA(16) float tmp[4]; _mm_store_ps(tmp, V); - XMVECTORU32 vResult = { { { - isnan(tmp[0]) ? 0xFFFFFFFFU : 0, + XMVECTORU32 vResult = { { { isnan(tmp[0]) ? 0xFFFFFFFFU : 0, isnan(tmp[1]) ? 0xFFFFFFFFU : 0, isnan(tmp[2]) ? 0xFFFFFFFFU : 0, isnan(tmp[3]) ? 0xFFFFFFFFU : 0 } } }; return vResult.v; #else -// Test against itself. NaN is always not equal + // Test against itself. NaN is always not equal return _mm_cmpneq_ps(V, V); #endif #endif @@ -2226,12 +1943,10 @@ inline XMVECTOR XM_CALLCONV XMVectorIsInfinite(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 Control = { { { - XMISINF(V.vector4_f32[0]) ? 0xFFFFFFFFU : 0, - XMISINF(V.vector4_f32[1]) ? 0xFFFFFFFFU : 0, - XMISINF(V.vector4_f32[2]) ? 0xFFFFFFFFU : 0, - XMISINF(V.vector4_f32[3]) ? 0xFFFFFFFFU : 0 - } } }; + XMVECTORU32 Control = { { { XMISINF(V.vector4_f32[0]) ? 0xFFFFFFFFU : 0, + XMISINF(V.vector4_f32[1]) ? 0xFFFFFFFFU : 0, + XMISINF(V.vector4_f32[2]) ? 0xFFFFFFFFU : 0, + XMISINF(V.vector4_f32[3]) ? 0xFFFFFFFFU : 0 } } }; return Control.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) @@ -2257,20 +1972,14 @@ inline XMVECTOR XM_CALLCONV XMVectorIsInfinite(FXMVECTOR V) noexcept //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorMin -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorMin(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - (V1.vector4_f32[0] < V2.vector4_f32[0]) ? V1.vector4_f32[0] : V2.vector4_f32[0], - (V1.vector4_f32[1] < V2.vector4_f32[1]) ? V1.vector4_f32[1] : V2.vector4_f32[1], - (V1.vector4_f32[2] < V2.vector4_f32[2]) ? V1.vector4_f32[2] : V2.vector4_f32[2], - (V1.vector4_f32[3] < V2.vector4_f32[3]) ? V1.vector4_f32[3] : V2.vector4_f32[3] - } } }; + XMVECTORF32 Result = { { { (V1.vector4_f32[0] < V2.vector4_f32[0]) ? V1.vector4_f32[0] : V2.vector4_f32[0], + (V1.vector4_f32[1] < V2.vector4_f32[1]) ? V1.vector4_f32[1] : V2.vector4_f32[1], + (V1.vector4_f32[2] < V2.vector4_f32[2]) ? V1.vector4_f32[2] : V2.vector4_f32[2], + (V1.vector4_f32[3] < V2.vector4_f32[3]) ? V1.vector4_f32[3] : V2.vector4_f32[3] } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) @@ -2282,20 +1991,14 @@ inline XMVECTOR XM_CALLCONV XMVectorMin //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorMax -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorMax(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - (V1.vector4_f32[0] > V2.vector4_f32[0]) ? V1.vector4_f32[0] : V2.vector4_f32[0], - (V1.vector4_f32[1] > V2.vector4_f32[1]) ? V1.vector4_f32[1] : V2.vector4_f32[1], - (V1.vector4_f32[2] > V2.vector4_f32[2]) ? V1.vector4_f32[2] : V2.vector4_f32[2], - (V1.vector4_f32[3] > V2.vector4_f32[3]) ? V1.vector4_f32[3] : V2.vector4_f32[3] - } } }; + XMVECTORF32 Result = { { { (V1.vector4_f32[0] > V2.vector4_f32[0]) ? V1.vector4_f32[0] : V2.vector4_f32[0], + (V1.vector4_f32[1] > V2.vector4_f32[1]) ? V1.vector4_f32[1] : V2.vector4_f32[1], + (V1.vector4_f32[2] > V2.vector4_f32[2]) ? V1.vector4_f32[2] : V2.vector4_f32[2], + (V1.vector4_f32[3] > V2.vector4_f32[3]) ? V1.vector4_f32[3] : V2.vector4_f32[3] } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) @@ -2328,7 +2031,7 @@ namespace MathInternal return i + 1.f; } -} +} // namespace MathInternal #if !defined(_XM_NO_INTRINSICS_) && defined(_MSC_VER) && !defined(__INTEL_COMPILER) #pragma float_control(push) @@ -2339,37 +2042,35 @@ inline XMVECTOR XM_CALLCONV XMVectorRound(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - MathInternal::round_to_nearest(V.vector4_f32[0]), - MathInternal::round_to_nearest(V.vector4_f32[1]), - MathInternal::round_to_nearest(V.vector4_f32[2]), - MathInternal::round_to_nearest(V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { MathInternal::round_to_nearest(V.vector4_f32[0]), + MathInternal::round_to_nearest(V.vector4_f32[1]), + MathInternal::round_to_nearest(V.vector4_f32[2]), + MathInternal::round_to_nearest(V.vector4_f32[3]) } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ return vrndnq_f32(V); #else - uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(V), g_XMNegativeZero); + uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(V), g_XMNegativeZero); float32x4_t sMagic = vreinterpretq_f32_u32(vorrq_u32(g_XMNoFraction, sign)); - float32x4_t R1 = vaddq_f32(V, sMagic); - R1 = vsubq_f32(R1, sMagic); - float32x4_t R2 = vabsq_f32(V); - uint32x4_t mask = vcleq_f32(R2, g_XMNoFraction); + float32x4_t R1 = vaddq_f32(V, sMagic); + R1 = vsubq_f32(R1, sMagic); + float32x4_t R2 = vabsq_f32(V); + uint32x4_t mask = vcleq_f32(R2, g_XMNoFraction); return vbslq_f32(mask, R1, V); #endif #elif defined(_XM_SSE4_INTRINSICS_) return _mm_round_ps(V, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC); #elif defined(_XM_SSE_INTRINSICS_) - __m128 sign = _mm_and_ps(V, g_XMNegativeZero); - __m128 sMagic = _mm_or_ps(g_XMNoFraction, sign); - __m128 R1 = _mm_add_ps(V, sMagic); - R1 = _mm_sub_ps(R1, sMagic); - __m128 R2 = _mm_and_ps(V, g_XMAbsMask); - __m128 mask = _mm_cmple_ps(R2, g_XMNoFraction); - R2 = _mm_andnot_ps(mask, V); - R1 = _mm_and_ps(R1, mask); + __m128 sign = _mm_and_ps(V, g_XMNegativeZero); + __m128 sMagic = _mm_or_ps(g_XMNoFraction, sign); + __m128 R1 = _mm_add_ps(V, sMagic); + R1 = _mm_sub_ps(R1, sMagic); + __m128 R2 = _mm_and_ps(V, g_XMAbsMask); + __m128 mask = _mm_cmple_ps(R2, g_XMNoFraction); + R2 = _mm_andnot_ps(mask, V); + R1 = _mm_and_ps(R1, mask); XMVECTOR vResult = _mm_xor_ps(R1, R2); return vResult; #endif @@ -2385,7 +2086,7 @@ inline XMVECTOR XM_CALLCONV XMVectorTruncate(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) XMVECTOR Result; - uint32_t i; + uint32_t i; // Avoid C4701 Result.vector4_f32[0] = 0.0f; @@ -2412,9 +2113,9 @@ inline XMVECTOR XM_CALLCONV XMVectorTruncate(FXMVECTOR V) noexcept return vrndq_f32(V); #else float32x4_t vTest = vabsq_f32(V); - vTest = vreinterpretq_f32_u32(vcltq_f32(vTest, g_XMNoFraction)); + vTest = vreinterpretq_f32_u32(vcltq_f32(vTest, g_XMNoFraction)); - int32x4_t vInt = vcvtq_s32_f32(V); + int32x4_t vInt = vcvtq_s32_f32(V); float32x4_t vResult = vcvtq_f32_s32(vInt); // All numbers less than 8388608 will use the round to int @@ -2436,7 +2137,7 @@ inline XMVECTOR XM_CALLCONV XMVectorTruncate(FXMVECTOR V) noexcept // All numbers less than 8388608 will use the round to int vResult = _mm_and_ps(vResult, _mm_castsi128_ps(vTest)); // All others, use the ORIGINAL value - vTest = _mm_andnot_si128(vTest, _mm_castps_si128(V)); + vTest = _mm_andnot_si128(vTest, _mm_castps_si128(V)); vResult = _mm_or_ps(vResult, _mm_castsi128_ps(vTest)); return vResult; #endif @@ -2447,26 +2148,21 @@ inline XMVECTOR XM_CALLCONV XMVectorTruncate(FXMVECTOR V) noexcept inline XMVECTOR XM_CALLCONV XMVectorFloor(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - floorf(V.vector4_f32[0]), - floorf(V.vector4_f32[1]), - floorf(V.vector4_f32[2]), - floorf(V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { floorf(V.vector4_f32[0]), floorf(V.vector4_f32[1]), floorf(V.vector4_f32[2]), floorf(V.vector4_f32[3]) } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ return vrndmq_f32(V); #else float32x4_t vTest = vabsq_f32(V); - vTest = vreinterpretq_f32_u32(vcltq_f32(vTest, g_XMNoFraction)); + vTest = vreinterpretq_f32_u32(vcltq_f32(vTest, g_XMNoFraction)); // Truncate - int32x4_t vInt = vcvtq_s32_f32(V); - float32x4_t vResult = vcvtq_f32_s32(vInt); - uint32x4_t vLargerMask = vcgtq_f32(vResult, V); + int32x4_t vInt = vcvtq_s32_f32(V); + float32x4_t vResult = vcvtq_f32_s32(vInt); + uint32x4_t vLargerMask = vcgtq_f32(vResult, V); // 0 -> 0, 0xffffffff -> -1.0f float32x4_t vLarger = vcvtq_f32_s32(vreinterpretq_s32_u32(vLargerMask)); - vResult = vaddq_f32(vResult, vLarger); + vResult = vaddq_f32(vResult, vLarger); // All numbers less than 8388608 will use the round to int // All others, use the ORIGINAL value return vbslq_f32(vreinterpretq_u32_f32(vTest), vResult, V); @@ -2476,18 +2172,18 @@ inline XMVECTOR XM_CALLCONV XMVectorFloor(FXMVECTOR V) noexcept #elif defined(_XM_SSE_INTRINSICS_) // To handle NAN, INF and numbers greater than 8388608, use masking __m128i vTest = _mm_and_si128(_mm_castps_si128(V), g_XMAbsMask); - vTest = _mm_cmplt_epi32(vTest, g_XMNoFraction); + vTest = _mm_cmplt_epi32(vTest, g_XMNoFraction); // Truncate - __m128i vInt = _mm_cvttps_epi32(V); + __m128i vInt = _mm_cvttps_epi32(V); XMVECTOR vResult = _mm_cvtepi32_ps(vInt); - __m128 vLarger = _mm_cmpgt_ps(vResult, V); + __m128 vLarger = _mm_cmpgt_ps(vResult, V); // 0 -> 0, 0xffffffff -> -1.0f vLarger = _mm_cvtepi32_ps(_mm_castps_si128(vLarger)); vResult = _mm_add_ps(vResult, vLarger); // All numbers less than 8388608 will use the round to int vResult = _mm_and_ps(vResult, _mm_castsi128_ps(vTest)); // All others, use the ORIGINAL value - vTest = _mm_andnot_si128(vTest, _mm_castps_si128(V)); + vTest = _mm_andnot_si128(vTest, _mm_castps_si128(V)); vResult = _mm_or_ps(vResult, _mm_castsi128_ps(vTest)); return vResult; #endif @@ -2498,26 +2194,21 @@ inline XMVECTOR XM_CALLCONV XMVectorFloor(FXMVECTOR V) noexcept inline XMVECTOR XM_CALLCONV XMVectorCeiling(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - ceilf(V.vector4_f32[0]), - ceilf(V.vector4_f32[1]), - ceilf(V.vector4_f32[2]), - ceilf(V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { ceilf(V.vector4_f32[0]), ceilf(V.vector4_f32[1]), ceilf(V.vector4_f32[2]), ceilf(V.vector4_f32[3]) } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ return vrndpq_f32(V); #else float32x4_t vTest = vabsq_f32(V); - vTest = vreinterpretq_f32_u32(vcltq_f32(vTest, g_XMNoFraction)); + vTest = vreinterpretq_f32_u32(vcltq_f32(vTest, g_XMNoFraction)); // Truncate - int32x4_t vInt = vcvtq_s32_f32(V); - float32x4_t vResult = vcvtq_f32_s32(vInt); - uint32x4_t vSmallerMask = vcltq_f32(vResult, V); + int32x4_t vInt = vcvtq_s32_f32(V); + float32x4_t vResult = vcvtq_f32_s32(vInt); + uint32x4_t vSmallerMask = vcltq_f32(vResult, V); // 0 -> 0, 0xffffffff -> -1.0f float32x4_t vSmaller = vcvtq_f32_s32(vreinterpretq_s32_u32(vSmallerMask)); - vResult = vsubq_f32(vResult, vSmaller); + vResult = vsubq_f32(vResult, vSmaller); // All numbers less than 8388608 will use the round to int // All others, use the ORIGINAL value return vbslq_f32(vreinterpretq_u32_f32(vTest), vResult, V); @@ -2527,18 +2218,18 @@ inline XMVECTOR XM_CALLCONV XMVectorCeiling(FXMVECTOR V) noexcept #elif defined(_XM_SSE_INTRINSICS_) // To handle NAN, INF and numbers greater than 8388608, use masking __m128i vTest = _mm_and_si128(_mm_castps_si128(V), g_XMAbsMask); - vTest = _mm_cmplt_epi32(vTest, g_XMNoFraction); + vTest = _mm_cmplt_epi32(vTest, g_XMNoFraction); // Truncate - __m128i vInt = _mm_cvttps_epi32(V); - XMVECTOR vResult = _mm_cvtepi32_ps(vInt); - __m128 vSmaller = _mm_cmplt_ps(vResult, V); + __m128i vInt = _mm_cvttps_epi32(V); + XMVECTOR vResult = _mm_cvtepi32_ps(vInt); + __m128 vSmaller = _mm_cmplt_ps(vResult, V); // 0 -> 0, 0xffffffff -> -1.0f vSmaller = _mm_cvtepi32_ps(_mm_castps_si128(vSmaller)); - vResult = _mm_sub_ps(vResult, vSmaller); + vResult = _mm_sub_ps(vResult, vSmaller); // All numbers less than 8388608 will use the round to int vResult = _mm_and_ps(vResult, _mm_castsi128_ps(vTest)); // All others, use the ORIGINAL value - vTest = _mm_andnot_si128(vTest, _mm_castps_si128(V)); + vTest = _mm_andnot_si128(vTest, _mm_castps_si128(V)); vResult = _mm_or_ps(vResult, _mm_castsi128_ps(vTest)); return vResult; #endif @@ -2546,12 +2237,7 @@ inline XMVECTOR XM_CALLCONV XMVectorCeiling(FXMVECTOR V) noexcept //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorClamp -( - FXMVECTOR V, - FXMVECTOR Min, - FXMVECTOR Max -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorClamp(FXMVECTOR V, FXMVECTOR Min, FXMVECTOR Max) noexcept { assert(XMVector4LessOrEqual(Min, Max)); @@ -2564,7 +2250,7 @@ inline XMVECTOR XM_CALLCONV XMVectorClamp #elif defined(_XM_ARM_NEON_INTRINSICS_) float32x4_t vResult = vmaxq_f32(Min, V); - vResult = vminq_f32(Max, vResult); + vResult = vminq_f32(Max, vResult); return vResult; #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vResult; @@ -2601,20 +2287,14 @@ inline XMVECTOR XM_CALLCONV XMVectorSaturate(FXMVECTOR V) noexcept // Bitwise logical operations //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorAndInt -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorAndInt(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 Result = { { { - V1.vector4_u32[0] & V2.vector4_u32[0], - V1.vector4_u32[1] & V2.vector4_u32[1], - V1.vector4_u32[2] & V2.vector4_u32[2], - V1.vector4_u32[3] & V2.vector4_u32[3] - } } }; + XMVECTORU32 Result = { { { V1.vector4_u32[0] & V2.vector4_u32[0], + V1.vector4_u32[1] & V2.vector4_u32[1], + V1.vector4_u32[2] & V2.vector4_u32[2], + V1.vector4_u32[3] & V2.vector4_u32[3] } } }; return Result; #elif defined(_XM_ARM_NEON_INTRINSICS_) @@ -2626,20 +2306,14 @@ inline XMVECTOR XM_CALLCONV XMVectorAndInt //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorAndCInt -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorAndCInt(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 Result = { { { - V1.vector4_u32[0] & ~V2.vector4_u32[0], - V1.vector4_u32[1] & ~V2.vector4_u32[1], - V1.vector4_u32[2] & ~V2.vector4_u32[2], - V1.vector4_u32[3] & ~V2.vector4_u32[3] - } } }; + XMVECTORU32 Result = { { { V1.vector4_u32[0] & ~V2.vector4_u32[0], + V1.vector4_u32[1] & ~V2.vector4_u32[1], + V1.vector4_u32[2] & ~V2.vector4_u32[2], + V1.vector4_u32[3] & ~V2.vector4_u32[3] } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) @@ -2652,20 +2326,14 @@ inline XMVECTOR XM_CALLCONV XMVectorAndCInt //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorOrInt -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorOrInt(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 Result = { { { - V1.vector4_u32[0] | V2.vector4_u32[0], - V1.vector4_u32[1] | V2.vector4_u32[1], - V1.vector4_u32[2] | V2.vector4_u32[2], - V1.vector4_u32[3] | V2.vector4_u32[3] - } } }; + XMVECTORU32 Result = { { { V1.vector4_u32[0] | V2.vector4_u32[0], + V1.vector4_u32[1] | V2.vector4_u32[1], + V1.vector4_u32[2] | V2.vector4_u32[2], + V1.vector4_u32[3] | V2.vector4_u32[3] } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) @@ -2678,20 +2346,14 @@ inline XMVECTOR XM_CALLCONV XMVectorOrInt //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorNorInt -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorNorInt(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 Result = { { { - ~(V1.vector4_u32[0] | V2.vector4_u32[0]), - ~(V1.vector4_u32[1] | V2.vector4_u32[1]), - ~(V1.vector4_u32[2] | V2.vector4_u32[2]), - ~(V1.vector4_u32[3] | V2.vector4_u32[3]) - } } }; + XMVECTORU32 Result = { { { ~(V1.vector4_u32[0] | V2.vector4_u32[0]), + ~(V1.vector4_u32[1] | V2.vector4_u32[1]), + ~(V1.vector4_u32[2] | V2.vector4_u32[2]), + ~(V1.vector4_u32[3] | V2.vector4_u32[3]) } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) @@ -2707,20 +2369,14 @@ inline XMVECTOR XM_CALLCONV XMVectorNorInt //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorXorInt -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorXorInt(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 Result = { { { - V1.vector4_u32[0] ^ V2.vector4_u32[0], - V1.vector4_u32[1] ^ V2.vector4_u32[1], - V1.vector4_u32[2] ^ V2.vector4_u32[2], - V1.vector4_u32[3] ^ V2.vector4_u32[3] - } } }; + XMVECTORU32 Result = { { { V1.vector4_u32[0] ^ V2.vector4_u32[0], + V1.vector4_u32[1] ^ V2.vector4_u32[1], + V1.vector4_u32[2] ^ V2.vector4_u32[2], + V1.vector4_u32[3] ^ V2.vector4_u32[3] } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) @@ -2741,12 +2397,7 @@ inline XMVECTOR XM_CALLCONV XMVectorNegate(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - -V.vector4_f32[0], - -V.vector4_f32[1], - -V.vector4_f32[2], - -V.vector4_f32[3] - } } }; + XMVECTORF32 Result = { { { -V.vector4_f32[0], -V.vector4_f32[1], -V.vector4_f32[2], -V.vector4_f32[3] } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) @@ -2762,20 +2413,14 @@ inline XMVECTOR XM_CALLCONV XMVectorNegate(FXMVECTOR V) noexcept //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorAdd -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorAdd(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - V1.vector4_f32[0] + V2.vector4_f32[0], - V1.vector4_f32[1] + V2.vector4_f32[1], - V1.vector4_f32[2] + V2.vector4_f32[2], - V1.vector4_f32[3] + V2.vector4_f32[3] - } } }; + XMVECTORF32 Result = { { { V1.vector4_f32[0] + V2.vector4_f32[0], + V1.vector4_f32[1] + V2.vector4_f32[1], + V1.vector4_f32[2] + V2.vector4_f32[2], + V1.vector4_f32[3] + V2.vector4_f32[3] } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) @@ -2792,10 +2437,7 @@ inline XMVECTOR XM_CALLCONV XMVectorSum(FXMVECTOR V) noexcept #if defined(_XM_NO_INTRINSICS_) XMVECTORF32 Result; - Result.f[0] = - Result.f[1] = - Result.f[2] = - Result.f[3] = V.vector4_f32[0] + V.vector4_f32[1] + V.vector4_f32[2] + V.vector4_f32[3]; + Result.f[0] = Result.f[1] = Result.f[2] = Result.f[3] = V.vector4_f32[0] + V.vector4_f32[1] + V.vector4_f32[2] + V.vector4_f32[3]; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) @@ -2805,28 +2447,24 @@ inline XMVECTOR XM_CALLCONV XMVectorSum(FXMVECTOR V) noexcept #else float32x2_t v1 = vget_low_f32(V); float32x2_t v2 = vget_high_f32(V); - v1 = vadd_f32(v1, v2); - v1 = vpadd_f32(v1, v1); + v1 = vadd_f32(v1, v2); + v1 = vpadd_f32(v1, v1); return vcombine_f32(v1, v1); #endif #elif defined(_XM_SSE3_INTRINSICS_) XMVECTOR vTemp = _mm_hadd_ps(V, V); return _mm_hadd_ps(vTemp, vTemp); #elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 3, 0, 1)); + XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 3, 0, 1)); XMVECTOR vTemp2 = _mm_add_ps(V, vTemp); - vTemp = XM_PERMUTE_PS(vTemp2, _MM_SHUFFLE(1, 0, 3, 2)); + vTemp = XM_PERMUTE_PS(vTemp2, _MM_SHUFFLE(1, 0, 3, 2)); return _mm_add_ps(vTemp, vTemp2); #endif } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorAddAngles -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorAddAngles(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) @@ -2838,10 +2476,10 @@ inline XMVECTOR XM_CALLCONV XMVectorAddAngles // will be -Pi <= Result < Pi. XMVECTOR Result = XMVectorAdd(V1, V2); - XMVECTOR Mask = XMVectorLess(Result, g_XMNegativePi.v); + XMVECTOR Mask = XMVectorLess(Result, g_XMNegativePi.v); XMVECTOR Offset = XMVectorSelect(Zero, g_XMTwoPi.v, Mask); - Mask = XMVectorGreaterOrEqual(Result, g_XMPi.v); + Mask = XMVectorGreaterOrEqual(Result, g_XMPi.v); Offset = XMVectorSelect(Offset, g_XMNegativeTwoPi.v, Mask); Result = XMVectorAdd(Result, Offset); @@ -2853,7 +2491,7 @@ inline XMVECTOR XM_CALLCONV XMVectorAddAngles float32x4_t vResult = vaddq_f32(V1, V2); // Less than Pi? uint32x4_t vOffset = vcltq_f32(vResult, g_XMNegativePi); - vOffset = vandq_u32(vOffset, g_XMTwoPi); + vOffset = vandq_u32(vOffset, g_XMTwoPi); // Add 2Pi to all entries less than -Pi vResult = vaddq_f32(vResult, vreinterpretq_f32_u32(vOffset)); // Greater than or equal to Pi? @@ -2867,7 +2505,7 @@ inline XMVECTOR XM_CALLCONV XMVectorAddAngles XMVECTOR vResult = _mm_add_ps(V1, V2); // Less than Pi? XMVECTOR vOffset = _mm_cmplt_ps(vResult, g_XMNegativePi); - vOffset = _mm_and_ps(vOffset, g_XMTwoPi); + vOffset = _mm_and_ps(vOffset, g_XMTwoPi); // Add 2Pi to all entries less than -Pi vResult = _mm_add_ps(vResult, vOffset); // Greater than or equal to Pi? @@ -2881,20 +2519,14 @@ inline XMVECTOR XM_CALLCONV XMVectorAddAngles //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorSubtract -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorSubtract(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - V1.vector4_f32[0] - V2.vector4_f32[0], - V1.vector4_f32[1] - V2.vector4_f32[1], - V1.vector4_f32[2] - V2.vector4_f32[2], - V1.vector4_f32[3] - V2.vector4_f32[3] - } } }; + XMVECTORF32 Result = { { { V1.vector4_f32[0] - V2.vector4_f32[0], + V1.vector4_f32[1] - V2.vector4_f32[1], + V1.vector4_f32[2] - V2.vector4_f32[2], + V1.vector4_f32[3] - V2.vector4_f32[3] } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) @@ -2906,11 +2538,7 @@ inline XMVECTOR XM_CALLCONV XMVectorSubtract //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorSubtractAngles -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorSubtractAngles(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) @@ -2922,10 +2550,10 @@ inline XMVECTOR XM_CALLCONV XMVectorSubtractAngles // will be -Pi <= Result < Pi. XMVECTOR Result = XMVectorSubtract(V1, V2); - XMVECTOR Mask = XMVectorLess(Result, g_XMNegativePi.v); + XMVECTOR Mask = XMVectorLess(Result, g_XMNegativePi.v); XMVECTOR Offset = XMVectorSelect(Zero, g_XMTwoPi.v, Mask); - Mask = XMVectorGreaterOrEqual(Result, g_XMPi.v); + Mask = XMVectorGreaterOrEqual(Result, g_XMPi.v); Offset = XMVectorSelect(Offset, g_XMNegativeTwoPi.v, Mask); Result = XMVectorAdd(Result, Offset); @@ -2937,7 +2565,7 @@ inline XMVECTOR XM_CALLCONV XMVectorSubtractAngles XMVECTOR vResult = vsubq_f32(V1, V2); // Less than Pi? uint32x4_t vOffset = vcltq_f32(vResult, g_XMNegativePi); - vOffset = vandq_u32(vOffset, g_XMTwoPi); + vOffset = vandq_u32(vOffset, g_XMTwoPi); // Add 2Pi to all entries less than -Pi vResult = vaddq_f32(vResult, vreinterpretq_f32_u32(vOffset)); // Greater than or equal to Pi? @@ -2951,7 +2579,7 @@ inline XMVECTOR XM_CALLCONV XMVectorSubtractAngles XMVECTOR vResult = _mm_sub_ps(V1, V2); // Less than Pi? XMVECTOR vOffset = _mm_cmplt_ps(vResult, g_XMNegativePi); - vOffset = _mm_and_ps(vOffset, g_XMTwoPi); + vOffset = _mm_and_ps(vOffset, g_XMTwoPi); // Add 2Pi to all entries less than -Pi vResult = _mm_add_ps(vResult, vOffset); // Greater than or equal to Pi? @@ -2965,19 +2593,13 @@ inline XMVECTOR XM_CALLCONV XMVectorSubtractAngles //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorMultiply -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorMultiply(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - V1.vector4_f32[0] * V2.vector4_f32[0], - V1.vector4_f32[1] * V2.vector4_f32[1], - V1.vector4_f32[2] * V2.vector4_f32[2], - V1.vector4_f32[3] * V2.vector4_f32[3] - } } }; + XMVECTORF32 Result = { { { V1.vector4_f32[0] * V2.vector4_f32[0], + V1.vector4_f32[1] * V2.vector4_f32[1], + V1.vector4_f32[2] * V2.vector4_f32[2], + V1.vector4_f32[3] * V2.vector4_f32[3] } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vmulq_f32(V1, V2); @@ -2988,20 +2610,13 @@ inline XMVECTOR XM_CALLCONV XMVectorMultiply //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorMultiplyAdd -( - FXMVECTOR V1, - FXMVECTOR V2, - FXMVECTOR V3 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorMultiplyAdd(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR V3) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - V1.vector4_f32[0] * V2.vector4_f32[0] + V3.vector4_f32[0], - V1.vector4_f32[1] * V2.vector4_f32[1] + V3.vector4_f32[1], - V1.vector4_f32[2] * V2.vector4_f32[2] + V3.vector4_f32[2], - V1.vector4_f32[3] * V2.vector4_f32[3] + V3.vector4_f32[3] - } } }; + XMVECTORF32 Result = { { { V1.vector4_f32[0] * V2.vector4_f32[0] + V3.vector4_f32[0], + V1.vector4_f32[1] * V2.vector4_f32[1] + V3.vector4_f32[1], + V1.vector4_f32[2] * V2.vector4_f32[2] + V3.vector4_f32[2], + V1.vector4_f32[3] * V2.vector4_f32[3] + V3.vector4_f32[3] } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ @@ -3016,19 +2631,13 @@ inline XMVECTOR XM_CALLCONV XMVectorMultiplyAdd //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorDivide -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorDivide(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - V1.vector4_f32[0] / V2.vector4_f32[0], - V1.vector4_f32[1] / V2.vector4_f32[1], - V1.vector4_f32[2] / V2.vector4_f32[2], - V1.vector4_f32[3] / V2.vector4_f32[3] - } } }; + XMVECTORF32 Result = { { { V1.vector4_f32[0] / V2.vector4_f32[0], + V1.vector4_f32[1] / V2.vector4_f32[1], + V1.vector4_f32[2] / V2.vector4_f32[2], + V1.vector4_f32[3] / V2.vector4_f32[3] } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ @@ -3036,10 +2645,10 @@ inline XMVECTOR XM_CALLCONV XMVectorDivide #else // 2 iterations of Newton-Raphson refinement of reciprocal float32x4_t Reciprocal = vrecpeq_f32(V2); - float32x4_t S = vrecpsq_f32(Reciprocal, V2); - Reciprocal = vmulq_f32(S, Reciprocal); - S = vrecpsq_f32(Reciprocal, V2); - Reciprocal = vmulq_f32(S, Reciprocal); + float32x4_t S = vrecpsq_f32(Reciprocal, V2); + Reciprocal = vmulq_f32(S, Reciprocal); + S = vrecpsq_f32(Reciprocal, V2); + Reciprocal = vmulq_f32(S, Reciprocal); return vmulq_f32(V1, Reciprocal); #endif #elif defined(_XM_SSE_INTRINSICS_) @@ -3049,20 +2658,13 @@ inline XMVECTOR XM_CALLCONV XMVectorDivide //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorNegativeMultiplySubtract -( - FXMVECTOR V1, - FXMVECTOR V2, - FXMVECTOR V3 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorNegativeMultiplySubtract(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR V3) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - V3.vector4_f32[0] - (V1.vector4_f32[0] * V2.vector4_f32[0]), - V3.vector4_f32[1] - (V1.vector4_f32[1] * V2.vector4_f32[1]), - V3.vector4_f32[2] - (V1.vector4_f32[2] * V2.vector4_f32[2]), - V3.vector4_f32[3] - (V1.vector4_f32[3] * V2.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { V3.vector4_f32[0] - (V1.vector4_f32[0] * V2.vector4_f32[0]), + V3.vector4_f32[1] - (V1.vector4_f32[1] * V2.vector4_f32[1]), + V3.vector4_f32[2] - (V1.vector4_f32[2] * V2.vector4_f32[2]), + V3.vector4_f32[3] - (V1.vector4_f32[3] * V2.vector4_f32[3]) } } }; return Result; #elif defined(_XM_ARM_NEON_INTRINSICS_) #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ @@ -3077,19 +2679,13 @@ inline XMVECTOR XM_CALLCONV XMVectorNegativeMultiplySubtract //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorScale -( - FXMVECTOR V, - float ScaleFactor -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorScale(FXMVECTOR V, float ScaleFactor) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - V.vector4_f32[0] * ScaleFactor, - V.vector4_f32[1] * ScaleFactor, - V.vector4_f32[2] * ScaleFactor, - V.vector4_f32[3] * ScaleFactor - } } }; + XMVECTORF32 Result = { { { V.vector4_f32[0] * ScaleFactor, + V.vector4_f32[1] * ScaleFactor, + V.vector4_f32[2] * ScaleFactor, + V.vector4_f32[3] * ScaleFactor } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vmulq_n_f32(V, ScaleFactor); @@ -3104,12 +2700,7 @@ inline XMVECTOR XM_CALLCONV XMVectorScale inline XMVECTOR XM_CALLCONV XMVectorReciprocalEst(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - 1.f / V.vector4_f32[0], - 1.f / V.vector4_f32[1], - 1.f / V.vector4_f32[2], - 1.f / V.vector4_f32[3] - } } }; + XMVECTORF32 Result = { { { 1.f / V.vector4_f32[0], 1.f / V.vector4_f32[1], 1.f / V.vector4_f32[2], 1.f / V.vector4_f32[3] } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vrecpeq_f32(V); @@ -3123,12 +2714,7 @@ inline XMVECTOR XM_CALLCONV XMVectorReciprocalEst(FXMVECTOR V) noexcept inline XMVECTOR XM_CALLCONV XMVectorReciprocal(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - 1.f / V.vector4_f32[0], - 1.f / V.vector4_f32[1], - 1.f / V.vector4_f32[2], - 1.f / V.vector4_f32[3] - } } }; + XMVECTORF32 Result = { { { 1.f / V.vector4_f32[0], 1.f / V.vector4_f32[1], 1.f / V.vector4_f32[2], 1.f / V.vector4_f32[3] } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ @@ -3137,9 +2723,9 @@ inline XMVECTOR XM_CALLCONV XMVectorReciprocal(FXMVECTOR V) noexcept #else // 2 iterations of Newton-Raphson refinement float32x4_t Reciprocal = vrecpeq_f32(V); - float32x4_t S = vrecpsq_f32(Reciprocal, V); - Reciprocal = vmulq_f32(S, Reciprocal); - S = vrecpsq_f32(Reciprocal, V); + float32x4_t S = vrecpsq_f32(Reciprocal, V); + Reciprocal = vmulq_f32(S, Reciprocal); + S = vrecpsq_f32(Reciprocal, V); return vmulq_f32(S, Reciprocal); #endif #elif defined(_XM_SSE_INTRINSICS_) @@ -3152,12 +2738,7 @@ inline XMVECTOR XM_CALLCONV XMVectorReciprocal(FXMVECTOR V) noexcept inline XMVECTOR XM_CALLCONV XMVectorSqrtEst(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - sqrtf(V.vector4_f32[0]), - sqrtf(V.vector4_f32[1]), - sqrtf(V.vector4_f32[2]), - sqrtf(V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { sqrtf(V.vector4_f32[0]), sqrtf(V.vector4_f32[1]), sqrtf(V.vector4_f32[2]), sqrtf(V.vector4_f32[3]) } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) // 1 iteration of Newton-Raphson refinment of sqrt @@ -3167,9 +2748,9 @@ inline XMVECTOR XM_CALLCONV XMVectorSqrtEst(FXMVECTOR V) noexcept float32x4_t S1 = vmulq_f32(S0, R0); XMVECTOR VEqualsInfinity = XMVectorEqualInt(V, g_XMInfinity.v); - XMVECTOR VEqualsZero = XMVectorEqual(V, vdupq_n_f32(0)); - XMVECTOR Result = vmulq_f32(V, S1); - XMVECTOR Select = XMVectorEqualInt(VEqualsInfinity, VEqualsZero); + XMVECTOR VEqualsZero = XMVectorEqual(V, vdupq_n_f32(0)); + XMVECTOR Result = vmulq_f32(V, S1); + XMVECTOR Select = XMVectorEqualInt(VEqualsInfinity, VEqualsZero); return XMVectorSelect(V, Result, Select); #elif defined(_XM_SSE_INTRINSICS_) return _mm_sqrt_ps(V); @@ -3181,12 +2762,7 @@ inline XMVECTOR XM_CALLCONV XMVectorSqrtEst(FXMVECTOR V) noexcept inline XMVECTOR XM_CALLCONV XMVectorSqrt(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - sqrtf(V.vector4_f32[0]), - sqrtf(V.vector4_f32[1]), - sqrtf(V.vector4_f32[2]), - sqrtf(V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { sqrtf(V.vector4_f32[0]), sqrtf(V.vector4_f32[1]), sqrtf(V.vector4_f32[2]), sqrtf(V.vector4_f32[3]) } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) // 3 iterations of Newton-Raphson refinment of sqrt @@ -3202,9 +2778,9 @@ inline XMVECTOR XM_CALLCONV XMVectorSqrt(FXMVECTOR V) noexcept float32x4_t S3 = vmulq_f32(S2, R2); XMVECTOR VEqualsInfinity = XMVectorEqualInt(V, g_XMInfinity.v); - XMVECTOR VEqualsZero = XMVectorEqual(V, vdupq_n_f32(0)); - XMVECTOR Result = vmulq_f32(V, S3); - XMVECTOR Select = XMVectorEqualInt(VEqualsInfinity, VEqualsZero); + XMVECTOR VEqualsZero = XMVectorEqual(V, vdupq_n_f32(0)); + XMVECTOR Result = vmulq_f32(V, S3); + XMVECTOR Select = XMVectorEqualInt(VEqualsInfinity, VEqualsZero); return XMVectorSelect(V, Result, Select); #elif defined(_XM_SSE_INTRINSICS_) return _mm_sqrt_ps(V); @@ -3216,12 +2792,9 @@ inline XMVECTOR XM_CALLCONV XMVectorSqrt(FXMVECTOR V) noexcept inline XMVECTOR XM_CALLCONV XMVectorReciprocalSqrtEst(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - 1.f / sqrtf(V.vector4_f32[0]), - 1.f / sqrtf(V.vector4_f32[1]), - 1.f / sqrtf(V.vector4_f32[2]), - 1.f / sqrtf(V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { + { { 1.f / sqrtf(V.vector4_f32[0]), 1.f / sqrtf(V.vector4_f32[1]), 1.f / sqrtf(V.vector4_f32[2]), 1.f / sqrtf(V.vector4_f32[3]) } } + }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vrsqrteq_f32(V); @@ -3235,12 +2808,9 @@ inline XMVECTOR XM_CALLCONV XMVectorReciprocalSqrtEst(FXMVECTOR V) noexcept inline XMVECTOR XM_CALLCONV XMVectorReciprocalSqrt(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - 1.f / sqrtf(V.vector4_f32[0]), - 1.f / sqrtf(V.vector4_f32[1]), - 1.f / sqrtf(V.vector4_f32[2]), - 1.f / sqrtf(V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { + { { 1.f / sqrtf(V.vector4_f32[0]), 1.f / sqrtf(V.vector4_f32[1]), 1.f / sqrtf(V.vector4_f32[2]), 1.f / sqrtf(V.vector4_f32[3]) } } + }; return Result; #elif defined(_XM_ARM_NEON_INTRINSICS_) // 2 iterations of Newton-Raphson refinement of reciprocal @@ -3256,7 +2826,7 @@ inline XMVECTOR XM_CALLCONV XMVectorReciprocalSqrt(FXMVECTOR V) noexcept return vmulq_f32(S1, R1); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vResult = _mm_sqrt_ps(V); - vResult = _mm_div_ps(g_XMOne, vResult); + vResult = _mm_div_ps(g_XMOne, vResult); return vResult; #endif } @@ -3266,34 +2836,29 @@ inline XMVECTOR XM_CALLCONV XMVectorReciprocalSqrt(FXMVECTOR V) noexcept inline XMVECTOR XM_CALLCONV XMVectorExp2(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - exp2f(V.vector4_f32[0]), - exp2f(V.vector4_f32[1]), - exp2f(V.vector4_f32[2]), - exp2f(V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { exp2f(V.vector4_f32[0]), exp2f(V.vector4_f32[1]), exp2f(V.vector4_f32[2]), exp2f(V.vector4_f32[3]) } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - int32x4_t itrunc = vcvtq_s32_f32(V); + int32x4_t itrunc = vcvtq_s32_f32(V); float32x4_t ftrunc = vcvtq_f32_s32(itrunc); - float32x4_t y = vsubq_f32(V, ftrunc); + float32x4_t y = vsubq_f32(V, ftrunc); float32x4_t poly = vmlaq_f32(g_XMExpEst6, g_XMExpEst7, y); - poly = vmlaq_f32(g_XMExpEst5, poly, y); - poly = vmlaq_f32(g_XMExpEst4, poly, y); - poly = vmlaq_f32(g_XMExpEst3, poly, y); - poly = vmlaq_f32(g_XMExpEst2, poly, y); - poly = vmlaq_f32(g_XMExpEst1, poly, y); - poly = vmlaq_f32(g_XMOne, poly, y); - - int32x4_t biased = vaddq_s32(itrunc, g_XMExponentBias); - biased = vshlq_n_s32(biased, 23); + poly = vmlaq_f32(g_XMExpEst5, poly, y); + poly = vmlaq_f32(g_XMExpEst4, poly, y); + poly = vmlaq_f32(g_XMExpEst3, poly, y); + poly = vmlaq_f32(g_XMExpEst2, poly, y); + poly = vmlaq_f32(g_XMExpEst1, poly, y); + poly = vmlaq_f32(g_XMOne, poly, y); + + int32x4_t biased = vaddq_s32(itrunc, g_XMExponentBias); + biased = vshlq_n_s32(biased, 23); float32x4_t result0 = XMVectorDivide(vreinterpretq_f32_s32(biased), poly); - biased = vaddq_s32(itrunc, g_XM253); - biased = vshlq_n_s32(biased, 23); + biased = vaddq_s32(itrunc, g_XM253); + biased = vshlq_n_s32(biased, 23); float32x4_t result1 = XMVectorDivide(vreinterpretq_f32_s32(biased), poly); - result1 = vmulq_f32(g_XMMinNormal.v, result1); + result1 = vmulq_f32(g_XMMinNormal.v, result1); // Use selection to handle the cases // if (V is NaN) -> QNaN; @@ -3306,23 +2871,23 @@ inline XMVECTOR XM_CALLCONV XMVectorExp2(FXMVECTOR V) noexcept // if (V < 128) -> result0 // else -> +inf - uint32x4_t comp = vcltq_s32(vreinterpretq_s32_f32(V), g_XMBin128); + uint32x4_t comp = vcltq_s32(vreinterpretq_s32_f32(V), g_XMBin128); float32x4_t result2 = vbslq_f32(comp, result0, g_XMInfinity); - comp = vcltq_s32(itrunc, g_XMSubnormalExponent); + comp = vcltq_s32(itrunc, g_XMSubnormalExponent); float32x4_t result3 = vbslq_f32(comp, result1, result0); - comp = vcltq_s32(vreinterpretq_s32_f32(V), g_XMBinNeg150); + comp = vcltq_s32(vreinterpretq_s32_f32(V), g_XMBinNeg150); float32x4_t result4 = vbslq_f32(comp, result3, g_XMZero); - int32x4_t sign = vandq_s32(vreinterpretq_s32_f32(V), g_XMNegativeZero); - comp = vceqq_s32(sign, g_XMNegativeZero); + int32x4_t sign = vandq_s32(vreinterpretq_s32_f32(V), g_XMNegativeZero); + comp = vceqq_s32(sign, g_XMNegativeZero); float32x4_t result5 = vbslq_f32(comp, result4, result2); - int32x4_t t0 = vandq_s32(vreinterpretq_s32_f32(V), g_XMQNaNTest); - int32x4_t t1 = vandq_s32(vreinterpretq_s32_f32(V), g_XMInfinity); - t0 = vreinterpretq_s32_u32(vceqq_s32(t0, g_XMZero)); - t1 = vreinterpretq_s32_u32(vceqq_s32(t1, g_XMInfinity)); + int32x4_t t0 = vandq_s32(vreinterpretq_s32_f32(V), g_XMQNaNTest); + int32x4_t t1 = vandq_s32(vreinterpretq_s32_f32(V), g_XMInfinity); + t0 = vreinterpretq_s32_u32(vceqq_s32(t0, g_XMZero)); + t1 = vreinterpretq_s32_u32(vceqq_s32(t1, g_XMInfinity)); int32x4_t isNaN = vbicq_s32(t1, t0); float32x4_t vResult = vbslq_f32(vreinterpretq_u32_s32(isNaN), g_XMQNaN, result5); @@ -3332,25 +2897,25 @@ inline XMVECTOR XM_CALLCONV XMVectorExp2(FXMVECTOR V) noexcept return Result; #elif defined(_XM_SSE_INTRINSICS_) __m128i itrunc = _mm_cvttps_epi32(V); - __m128 ftrunc = _mm_cvtepi32_ps(itrunc); - __m128 y = _mm_sub_ps(V, ftrunc); + __m128 ftrunc = _mm_cvtepi32_ps(itrunc); + __m128 y = _mm_sub_ps(V, ftrunc); __m128 poly = XM_FMADD_PS(g_XMExpEst7, y, g_XMExpEst6); - poly = XM_FMADD_PS(poly, y, g_XMExpEst5); - poly = XM_FMADD_PS(poly, y, g_XMExpEst4); - poly = XM_FMADD_PS(poly, y, g_XMExpEst3); - poly = XM_FMADD_PS(poly, y, g_XMExpEst2); - poly = XM_FMADD_PS(poly, y, g_XMExpEst1); - poly = XM_FMADD_PS(poly, y, g_XMOne); + poly = XM_FMADD_PS(poly, y, g_XMExpEst5); + poly = XM_FMADD_PS(poly, y, g_XMExpEst4); + poly = XM_FMADD_PS(poly, y, g_XMExpEst3); + poly = XM_FMADD_PS(poly, y, g_XMExpEst2); + poly = XM_FMADD_PS(poly, y, g_XMExpEst1); + poly = XM_FMADD_PS(poly, y, g_XMOne); __m128i biased = _mm_add_epi32(itrunc, g_XMExponentBias); - biased = _mm_slli_epi32(biased, 23); + biased = _mm_slli_epi32(biased, 23); __m128 result0 = _mm_div_ps(_mm_castsi128_ps(biased), poly); - biased = _mm_add_epi32(itrunc, g_XM253); - biased = _mm_slli_epi32(biased, 23); + biased = _mm_add_epi32(itrunc, g_XM253); + biased = _mm_slli_epi32(biased, 23); __m128 result1 = _mm_div_ps(_mm_castsi128_ps(biased), poly); - result1 = _mm_mul_ps(g_XMMinNormal.v, result1); + result1 = _mm_mul_ps(g_XMMinNormal.v, result1); // Use selection to handle the cases // if (V is NaN) -> QNaN; @@ -3363,35 +2928,35 @@ inline XMVECTOR XM_CALLCONV XMVectorExp2(FXMVECTOR V) noexcept // if (V < 128) -> result0 // else -> +inf - __m128i comp = _mm_cmplt_epi32(_mm_castps_si128(V), g_XMBin128); + __m128i comp = _mm_cmplt_epi32(_mm_castps_si128(V), g_XMBin128); __m128i select0 = _mm_and_si128(comp, _mm_castps_si128(result0)); __m128i select1 = _mm_andnot_si128(comp, g_XMInfinity); __m128i result2 = _mm_or_si128(select0, select1); - comp = _mm_cmplt_epi32(itrunc, g_XMSubnormalExponent); - select1 = _mm_and_si128(comp, _mm_castps_si128(result1)); - select0 = _mm_andnot_si128(comp, _mm_castps_si128(result0)); + comp = _mm_cmplt_epi32(itrunc, g_XMSubnormalExponent); + select1 = _mm_and_si128(comp, _mm_castps_si128(result1)); + select0 = _mm_andnot_si128(comp, _mm_castps_si128(result0)); __m128i result3 = _mm_or_si128(select0, select1); - comp = _mm_cmplt_epi32(_mm_castps_si128(V), g_XMBinNeg150); - select0 = _mm_and_si128(comp, result3); - select1 = _mm_andnot_si128(comp, g_XMZero); + comp = _mm_cmplt_epi32(_mm_castps_si128(V), g_XMBinNeg150); + select0 = _mm_and_si128(comp, result3); + select1 = _mm_andnot_si128(comp, g_XMZero); __m128i result4 = _mm_or_si128(select0, select1); - __m128i sign = _mm_and_si128(_mm_castps_si128(V), g_XMNegativeZero); - comp = _mm_cmpeq_epi32(sign, g_XMNegativeZero); - select0 = _mm_and_si128(comp, result4); - select1 = _mm_andnot_si128(comp, result2); + __m128i sign = _mm_and_si128(_mm_castps_si128(V), g_XMNegativeZero); + comp = _mm_cmpeq_epi32(sign, g_XMNegativeZero); + select0 = _mm_and_si128(comp, result4); + select1 = _mm_andnot_si128(comp, result2); __m128i result5 = _mm_or_si128(select0, select1); - __m128i t0 = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); - __m128i t1 = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); - t0 = _mm_cmpeq_epi32(t0, g_XMZero); - t1 = _mm_cmpeq_epi32(t1, g_XMInfinity); + __m128i t0 = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); + __m128i t1 = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); + t0 = _mm_cmpeq_epi32(t0, g_XMZero); + t1 = _mm_cmpeq_epi32(t1, g_XMInfinity); __m128i isNaN = _mm_andnot_si128(t0, t1); - select0 = _mm_and_si128(isNaN, g_XMQNaN); - select1 = _mm_andnot_si128(isNaN, result5); + select0 = _mm_and_si128(isNaN, g_XMQNaN); + select1 = _mm_andnot_si128(isNaN, result5); __m128i vResult = _mm_or_si128(select0, select1); return _mm_castsi128_ps(vResult); @@ -3404,12 +2969,9 @@ inline XMVECTOR XM_CALLCONV XMVectorExp10(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - powf(10.0f, V.vector4_f32[0]), - powf(10.0f, V.vector4_f32[1]), - powf(10.0f, V.vector4_f32[2]), - powf(10.0f, V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { + { { powf(10.0f, V.vector4_f32[0]), powf(10.0f, V.vector4_f32[1]), powf(10.0f, V.vector4_f32[2]), powf(10.0f, V.vector4_f32[3]) } } + }; return Result.v; #elif defined(_XM_SVML_INTRINSICS_) @@ -3428,12 +2990,7 @@ inline XMVECTOR XM_CALLCONV XMVectorExpE(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - expf(V.vector4_f32[0]), - expf(V.vector4_f32[1]), - expf(V.vector4_f32[2]), - expf(V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { expf(V.vector4_f32[0]), expf(V.vector4_f32[1]), expf(V.vector4_f32[2]), expf(V.vector4_f32[3]) } } }; return Result.v; #elif defined(_XM_SVML_INTRINSICS_) @@ -3461,24 +3018,24 @@ namespace MathInternal { inline __m128i multi_sll_epi32(__m128i value, __m128i count) noexcept { - __m128i v = _mm_shuffle_epi32(value, _MM_SHUFFLE(0, 0, 0, 0)); - __m128i c = _mm_shuffle_epi32(count, _MM_SHUFFLE(0, 0, 0, 0)); - c = _mm_and_si128(c, g_XMMaskX); + __m128i v = _mm_shuffle_epi32(value, _MM_SHUFFLE(0, 0, 0, 0)); + __m128i c = _mm_shuffle_epi32(count, _MM_SHUFFLE(0, 0, 0, 0)); + c = _mm_and_si128(c, g_XMMaskX); __m128i r0 = _mm_sll_epi32(v, c); - v = _mm_shuffle_epi32(value, _MM_SHUFFLE(1, 1, 1, 1)); - c = _mm_shuffle_epi32(count, _MM_SHUFFLE(1, 1, 1, 1)); - c = _mm_and_si128(c, g_XMMaskX); + v = _mm_shuffle_epi32(value, _MM_SHUFFLE(1, 1, 1, 1)); + c = _mm_shuffle_epi32(count, _MM_SHUFFLE(1, 1, 1, 1)); + c = _mm_and_si128(c, g_XMMaskX); __m128i r1 = _mm_sll_epi32(v, c); - v = _mm_shuffle_epi32(value, _MM_SHUFFLE(2, 2, 2, 2)); - c = _mm_shuffle_epi32(count, _MM_SHUFFLE(2, 2, 2, 2)); - c = _mm_and_si128(c, g_XMMaskX); + v = _mm_shuffle_epi32(value, _MM_SHUFFLE(2, 2, 2, 2)); + c = _mm_shuffle_epi32(count, _MM_SHUFFLE(2, 2, 2, 2)); + c = _mm_and_si128(c, g_XMMaskX); __m128i r2 = _mm_sll_epi32(v, c); - v = _mm_shuffle_epi32(value, _MM_SHUFFLE(3, 3, 3, 3)); - c = _mm_shuffle_epi32(count, _MM_SHUFFLE(3, 3, 3, 3)); - c = _mm_and_si128(c, g_XMMaskX); + v = _mm_shuffle_epi32(value, _MM_SHUFFLE(3, 3, 3, 3)); + c = _mm_shuffle_epi32(count, _MM_SHUFFLE(3, 3, 3, 3)); + c = _mm_and_si128(c, g_XMMaskX); __m128i r3 = _mm_sll_epi32(v, c); // (r0,r0,r1,r1) @@ -3492,24 +3049,24 @@ namespace MathInternal inline __m128i multi_srl_epi32(__m128i value, __m128i count) noexcept { - __m128i v = _mm_shuffle_epi32(value, _MM_SHUFFLE(0, 0, 0, 0)); - __m128i c = _mm_shuffle_epi32(count, _MM_SHUFFLE(0, 0, 0, 0)); - c = _mm_and_si128(c, g_XMMaskX); + __m128i v = _mm_shuffle_epi32(value, _MM_SHUFFLE(0, 0, 0, 0)); + __m128i c = _mm_shuffle_epi32(count, _MM_SHUFFLE(0, 0, 0, 0)); + c = _mm_and_si128(c, g_XMMaskX); __m128i r0 = _mm_srl_epi32(v, c); - v = _mm_shuffle_epi32(value, _MM_SHUFFLE(1, 1, 1, 1)); - c = _mm_shuffle_epi32(count, _MM_SHUFFLE(1, 1, 1, 1)); - c = _mm_and_si128(c, g_XMMaskX); + v = _mm_shuffle_epi32(value, _MM_SHUFFLE(1, 1, 1, 1)); + c = _mm_shuffle_epi32(count, _MM_SHUFFLE(1, 1, 1, 1)); + c = _mm_and_si128(c, g_XMMaskX); __m128i r1 = _mm_srl_epi32(v, c); - v = _mm_shuffle_epi32(value, _MM_SHUFFLE(2, 2, 2, 2)); - c = _mm_shuffle_epi32(count, _MM_SHUFFLE(2, 2, 2, 2)); - c = _mm_and_si128(c, g_XMMaskX); + v = _mm_shuffle_epi32(value, _MM_SHUFFLE(2, 2, 2, 2)); + c = _mm_shuffle_epi32(count, _MM_SHUFFLE(2, 2, 2, 2)); + c = _mm_and_si128(c, g_XMMaskX); __m128i r2 = _mm_srl_epi32(v, c); - v = _mm_shuffle_epi32(value, _MM_SHUFFLE(3, 3, 3, 3)); - c = _mm_shuffle_epi32(count, _MM_SHUFFLE(3, 3, 3, 3)); - c = _mm_and_si128(c, g_XMMaskX); + v = _mm_shuffle_epi32(value, _MM_SHUFFLE(3, 3, 3, 3)); + c = _mm_shuffle_epi32(count, _MM_SHUFFLE(3, 3, 3, 3)); + c = _mm_and_si128(c, g_XMMaskX); __m128i r3 = _mm_srl_epi32(v, c); // (r0,r0,r1,r1) @@ -3530,28 +3087,28 @@ namespace MathInternal __m128i v = value, r, c, b, s; - c = _mm_cmpgt_epi32(v, g_XM0000FFFF); // c = (v > 0xFFFF) - b = _mm_srli_epi32(c, 31); // b = (c ? 1 : 0) - r = _mm_slli_epi32(b, 4); // r = (b << 4) - v = multi_srl_epi32(v, r); // v = (v >> r) - - c = _mm_cmpgt_epi32(v, g_XM000000FF); // c = (v > 0xFF) - b = _mm_srli_epi32(c, 31); // b = (c ? 1 : 0) - s = _mm_slli_epi32(b, 3); // s = (b << 3) - v = multi_srl_epi32(v, s); // v = (v >> s) - r = _mm_or_si128(r, s); // r = (r | s) - - c = _mm_cmpgt_epi32(v, g_XM0000000F); // c = (v > 0xF) - b = _mm_srli_epi32(c, 31); // b = (c ? 1 : 0) - s = _mm_slli_epi32(b, 2); // s = (b << 2) - v = multi_srl_epi32(v, s); // v = (v >> s) - r = _mm_or_si128(r, s); // r = (r | s) - - c = _mm_cmpgt_epi32(v, g_XM00000003); // c = (v > 0x3) - b = _mm_srli_epi32(c, 31); // b = (c ? 1 : 0) - s = _mm_slli_epi32(b, 1); // s = (b << 1) - v = multi_srl_epi32(v, s); // v = (v >> s) - r = _mm_or_si128(r, s); // r = (r | s) + c = _mm_cmpgt_epi32(v, g_XM0000FFFF); // c = (v > 0xFFFF) + b = _mm_srli_epi32(c, 31); // b = (c ? 1 : 0) + r = _mm_slli_epi32(b, 4); // r = (b << 4) + v = multi_srl_epi32(v, r); // v = (v >> r) + + c = _mm_cmpgt_epi32(v, g_XM000000FF); // c = (v > 0xFF) + b = _mm_srli_epi32(c, 31); // b = (c ? 1 : 0) + s = _mm_slli_epi32(b, 3); // s = (b << 3) + v = multi_srl_epi32(v, s); // v = (v >> s) + r = _mm_or_si128(r, s); // r = (r | s) + + c = _mm_cmpgt_epi32(v, g_XM0000000F); // c = (v > 0xF) + b = _mm_srli_epi32(c, 31); // b = (c ? 1 : 0) + s = _mm_slli_epi32(b, 2); // s = (b << 2) + v = multi_srl_epi32(v, s); // v = (v >> s) + r = _mm_or_si128(r, s); // r = (r | s) + + c = _mm_cmpgt_epi32(v, g_XM00000003); // c = (v > 0x3) + b = _mm_srli_epi32(c, 31); // b = (c ? 1 : 0) + s = _mm_slli_epi32(b, 1); // s = (b << 1) + v = multi_srl_epi32(v, s); // v = (v >> s) + r = _mm_or_si128(r, s); // r = (r | s) s = _mm_srli_epi32(v, 1); r = _mm_or_si128(r, s); @@ -3572,32 +3129,32 @@ namespace MathInternal static const XMVECTORI32 g_XM0000000F = { { { 0x0000000F, 0x0000000F, 0x0000000F, 0x0000000F } } }; static const XMVECTORI32 g_XM00000003 = { { { 0x00000003, 0x00000003, 0x00000003, 0x00000003 } } }; - uint32x4_t c = vcgtq_s32(value, g_XM0000FFFF); // c = (v > 0xFFFF) - int32x4_t b = vshrq_n_s32(vreinterpretq_s32_u32(c), 31); // b = (c ? 1 : 0) - int32x4_t r = vshlq_n_s32(b, 4); // r = (b << 4) - r = vnegq_s32(r); - int32x4_t v = vshlq_s32(value, r); // v = (v >> r) - - c = vcgtq_s32(v, g_XM000000FF); // c = (v > 0xFF) - b = vshrq_n_s32(vreinterpretq_s32_u32(c), 31); // b = (c ? 1 : 0) - int32x4_t s = vshlq_n_s32(b, 3); // s = (b << 3) - s = vnegq_s32(s); - v = vshlq_s32(v, s); // v = (v >> s) - r = vorrq_s32(r, s); // r = (r | s) - - c = vcgtq_s32(v, g_XM0000000F); // c = (v > 0xF) - b = vshrq_n_s32(vreinterpretq_s32_u32(c), 31); // b = (c ? 1 : 0) - s = vshlq_n_s32(b, 2); // s = (b << 2) + uint32x4_t c = vcgtq_s32(value, g_XM0000FFFF); // c = (v > 0xFFFF) + int32x4_t b = vshrq_n_s32(vreinterpretq_s32_u32(c), 31); // b = (c ? 1 : 0) + int32x4_t r = vshlq_n_s32(b, 4); // r = (b << 4) + r = vnegq_s32(r); + int32x4_t v = vshlq_s32(value, r); // v = (v >> r) + + c = vcgtq_s32(v, g_XM000000FF); // c = (v > 0xFF) + b = vshrq_n_s32(vreinterpretq_s32_u32(c), 31); // b = (c ? 1 : 0) + int32x4_t s = vshlq_n_s32(b, 3); // s = (b << 3) + s = vnegq_s32(s); + v = vshlq_s32(v, s); // v = (v >> s) + r = vorrq_s32(r, s); // r = (r | s) + + c = vcgtq_s32(v, g_XM0000000F); // c = (v > 0xF) + b = vshrq_n_s32(vreinterpretq_s32_u32(c), 31); // b = (c ? 1 : 0) + s = vshlq_n_s32(b, 2); // s = (b << 2) s = vnegq_s32(s); - v = vshlq_s32(v, s); // v = (v >> s) - r = vorrq_s32(r, s); // r = (r | s) + v = vshlq_s32(v, s); // v = (v >> s) + r = vorrq_s32(r, s); // r = (r | s) - c = vcgtq_s32(v, g_XM00000003); // c = (v > 0x3) - b = vshrq_n_s32(vreinterpretq_s32_u32(c), 31); // b = (c ? 1 : 0) - s = vshlq_n_s32(b, 1); // s = (b << 1) + c = vcgtq_s32(v, g_XM00000003); // c = (v > 0x3) + b = vshrq_n_s32(vreinterpretq_s32_u32(c), 31); // b = (c ? 1 : 0) + s = vshlq_n_s32(b, 1); // s = (b << 1) s = vnegq_s32(s); - v = vshlq_s32(v, s); // v = (v >> s) - r = vorrq_s32(r, s); // r = (r | s) + v = vshlq_s32(v, s); // v = (v >> s) + r = vorrq_s32(r, s); // r = (r | s) s = vshrq_n_s32(v, 1); r = vorrq_s32(r, s); @@ -3613,44 +3170,39 @@ namespace MathInternal inline XMVECTOR XM_CALLCONV XMVectorLog2(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - log2f(V.vector4_f32[0]), - log2f(V.vector4_f32[1]), - log2f(V.vector4_f32[2]), - log2f(V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { log2f(V.vector4_f32[0]), log2f(V.vector4_f32[1]), log2f(V.vector4_f32[2]), log2f(V.vector4_f32[3]) } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - int32x4_t rawBiased = vandq_s32(vreinterpretq_s32_f32(V), g_XMInfinity); - int32x4_t trailing = vandq_s32(vreinterpretq_s32_f32(V), g_XMQNaNTest); + int32x4_t rawBiased = vandq_s32(vreinterpretq_s32_f32(V), g_XMInfinity); + int32x4_t trailing = vandq_s32(vreinterpretq_s32_f32(V), g_XMQNaNTest); uint32x4_t isExponentZero = vceqq_s32(vreinterpretq_s32_f32(g_XMZero), rawBiased); // Compute exponent and significand for normals. - int32x4_t biased = vshrq_n_s32(rawBiased, 23); + int32x4_t biased = vshrq_n_s32(rawBiased, 23); int32x4_t exponentNor = vsubq_s32(biased, g_XMExponentBias); int32x4_t trailingNor = trailing; // Compute exponent and significand for subnormals. - int32x4_t leading = MathInternal::GetLeadingBit(trailing); - int32x4_t shift = vsubq_s32(g_XMNumTrailing, leading); + int32x4_t leading = MathInternal::GetLeadingBit(trailing); + int32x4_t shift = vsubq_s32(g_XMNumTrailing, leading); int32x4_t exponentSub = vsubq_s32(g_XMSubnormalExponent, shift); int32x4_t trailingSub = vshlq_s32(trailing, shift); - trailingSub = vandq_s32(trailingSub, g_XMQNaNTest); - int32x4_t e = vbslq_s32(isExponentZero, exponentSub, exponentNor); - int32x4_t t = vbslq_s32(isExponentZero, trailingSub, trailingNor); + trailingSub = vandq_s32(trailingSub, g_XMQNaNTest); + int32x4_t e = vbslq_s32(isExponentZero, exponentSub, exponentNor); + int32x4_t t = vbslq_s32(isExponentZero, trailingSub, trailingNor); // Compute the approximation. - int32x4_t tmp = vorrq_s32(vreinterpretq_s32_f32(g_XMOne), t); - float32x4_t y = vsubq_f32(vreinterpretq_f32_s32(tmp), g_XMOne); + int32x4_t tmp = vorrq_s32(vreinterpretq_s32_f32(g_XMOne), t); + float32x4_t y = vsubq_f32(vreinterpretq_f32_s32(tmp), g_XMOne); float32x4_t log2 = vmlaq_f32(g_XMLogEst6, g_XMLogEst7, y); - log2 = vmlaq_f32(g_XMLogEst5, log2, y); - log2 = vmlaq_f32(g_XMLogEst4, log2, y); - log2 = vmlaq_f32(g_XMLogEst3, log2, y); - log2 = vmlaq_f32(g_XMLogEst2, log2, y); - log2 = vmlaq_f32(g_XMLogEst1, log2, y); - log2 = vmlaq_f32(g_XMLogEst0, log2, y); - log2 = vmlaq_f32(vcvtq_f32_s32(e), log2, y); + log2 = vmlaq_f32(g_XMLogEst5, log2, y); + log2 = vmlaq_f32(g_XMLogEst4, log2, y); + log2 = vmlaq_f32(g_XMLogEst3, log2, y); + log2 = vmlaq_f32(g_XMLogEst2, log2, y); + log2 = vmlaq_f32(g_XMLogEst1, log2, y); + log2 = vmlaq_f32(g_XMLogEst0, log2, y); + log2 = vmlaq_f32(vcvtq_f32_s32(e), log2, y); // if (x is NaN) -> QNaN // else if (V is positive) @@ -3661,66 +3213,66 @@ inline XMVECTOR XM_CALLCONV XMVectorLog2(FXMVECTOR V) noexcept // else -> -QNaN uint32x4_t isInfinite = vandq_u32(vreinterpretq_u32_f32(V), g_XMAbsMask); - isInfinite = vceqq_u32(isInfinite, g_XMInfinity); + isInfinite = vceqq_u32(isInfinite, g_XMInfinity); uint32x4_t isGreaterZero = vcgtq_f32(V, g_XMZero); - uint32x4_t isNotFinite = vcgtq_f32(V, g_XMInfinity); - uint32x4_t isPositive = vbicq_u32(isGreaterZero, isNotFinite); + uint32x4_t isNotFinite = vcgtq_f32(V, g_XMInfinity); + uint32x4_t isPositive = vbicq_u32(isGreaterZero, isNotFinite); uint32x4_t isZero = vandq_u32(vreinterpretq_u32_f32(V), g_XMAbsMask); - isZero = vceqq_u32(isZero, g_XMZero); + isZero = vceqq_u32(isZero, g_XMZero); - uint32x4_t t0 = vandq_u32(vreinterpretq_u32_f32(V), g_XMQNaNTest); - uint32x4_t t1 = vandq_u32(vreinterpretq_u32_f32(V), g_XMInfinity); - t0 = vceqq_u32(t0, g_XMZero); - t1 = vceqq_u32(t1, g_XMInfinity); + uint32x4_t t0 = vandq_u32(vreinterpretq_u32_f32(V), g_XMQNaNTest); + uint32x4_t t1 = vandq_u32(vreinterpretq_u32_f32(V), g_XMInfinity); + t0 = vceqq_u32(t0, g_XMZero); + t1 = vceqq_u32(t1, g_XMInfinity); uint32x4_t isNaN = vbicq_u32(t1, t0); float32x4_t result = vbslq_f32(isInfinite, g_XMInfinity, log2); - float32x4_t tmp2 = vbslq_f32(isZero, g_XMNegInfinity, g_XMNegQNaN); - result = vbslq_f32(isPositive, result, tmp2); - result = vbslq_f32(isNaN, g_XMQNaN, result); + float32x4_t tmp2 = vbslq_f32(isZero, g_XMNegInfinity, g_XMNegQNaN); + result = vbslq_f32(isPositive, result, tmp2); + result = vbslq_f32(isNaN, g_XMQNaN, result); return result; #elif defined(_XM_SVML_INTRINSICS_) XMVECTOR Result = _mm_log2_ps(V); return Result; #elif defined(_XM_SSE_INTRINSICS_) - __m128i rawBiased = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); - __m128i trailing = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); + __m128i rawBiased = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); + __m128i trailing = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); __m128i isExponentZero = _mm_cmpeq_epi32(g_XMZero, rawBiased); // Compute exponent and significand for normals. - __m128i biased = _mm_srli_epi32(rawBiased, 23); + __m128i biased = _mm_srli_epi32(rawBiased, 23); __m128i exponentNor = _mm_sub_epi32(biased, g_XMExponentBias); __m128i trailingNor = trailing; // Compute exponent and significand for subnormals. - __m128i leading = MathInternal::GetLeadingBit(trailing); - __m128i shift = _mm_sub_epi32(g_XMNumTrailing, leading); + __m128i leading = MathInternal::GetLeadingBit(trailing); + __m128i shift = _mm_sub_epi32(g_XMNumTrailing, leading); __m128i exponentSub = _mm_sub_epi32(g_XMSubnormalExponent, shift); __m128i trailingSub = MathInternal::multi_sll_epi32(trailing, shift); - trailingSub = _mm_and_si128(trailingSub, g_XMQNaNTest); + trailingSub = _mm_and_si128(trailingSub, g_XMQNaNTest); __m128i select0 = _mm_and_si128(isExponentZero, exponentSub); __m128i select1 = _mm_andnot_si128(isExponentZero, exponentNor); - __m128i e = _mm_or_si128(select0, select1); + __m128i e = _mm_or_si128(select0, select1); - select0 = _mm_and_si128(isExponentZero, trailingSub); - select1 = _mm_andnot_si128(isExponentZero, trailingNor); + select0 = _mm_and_si128(isExponentZero, trailingSub); + select1 = _mm_andnot_si128(isExponentZero, trailingNor); __m128i t = _mm_or_si128(select0, select1); // Compute the approximation. __m128i tmp = _mm_or_si128(g_XMOne, t); - __m128 y = _mm_sub_ps(_mm_castsi128_ps(tmp), g_XMOne); + __m128 y = _mm_sub_ps(_mm_castsi128_ps(tmp), g_XMOne); __m128 log2 = XM_FMADD_PS(g_XMLogEst7, y, g_XMLogEst6); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst5); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst4); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst3); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst2); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst1); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst0); - log2 = XM_FMADD_PS(log2, y, _mm_cvtepi32_ps(e)); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst5); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst4); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst3); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst2); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst1); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst0); + log2 = XM_FMADD_PS(log2, y, _mm_cvtepi32_ps(e)); // if (x is NaN) -> QNaN // else if (V is positive) @@ -3731,36 +3283,36 @@ inline XMVECTOR XM_CALLCONV XMVectorLog2(FXMVECTOR V) noexcept // else -> -QNaN __m128i isInfinite = _mm_and_si128(_mm_castps_si128(V), g_XMAbsMask); - isInfinite = _mm_cmpeq_epi32(isInfinite, g_XMInfinity); + isInfinite = _mm_cmpeq_epi32(isInfinite, g_XMInfinity); __m128i isGreaterZero = _mm_cmpgt_epi32(_mm_castps_si128(V), g_XMZero); - __m128i isNotFinite = _mm_cmpgt_epi32(_mm_castps_si128(V), g_XMInfinity); - __m128i isPositive = _mm_andnot_si128(isNotFinite, isGreaterZero); + __m128i isNotFinite = _mm_cmpgt_epi32(_mm_castps_si128(V), g_XMInfinity); + __m128i isPositive = _mm_andnot_si128(isNotFinite, isGreaterZero); __m128i isZero = _mm_and_si128(_mm_castps_si128(V), g_XMAbsMask); - isZero = _mm_cmpeq_epi32(isZero, g_XMZero); + isZero = _mm_cmpeq_epi32(isZero, g_XMZero); - __m128i t0 = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); - __m128i t1 = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); - t0 = _mm_cmpeq_epi32(t0, g_XMZero); - t1 = _mm_cmpeq_epi32(t1, g_XMInfinity); + __m128i t0 = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); + __m128i t1 = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); + t0 = _mm_cmpeq_epi32(t0, g_XMZero); + t1 = _mm_cmpeq_epi32(t1, g_XMInfinity); __m128i isNaN = _mm_andnot_si128(t0, t1); - select0 = _mm_and_si128(isInfinite, g_XMInfinity); - select1 = _mm_andnot_si128(isInfinite, _mm_castps_si128(log2)); + select0 = _mm_and_si128(isInfinite, g_XMInfinity); + select1 = _mm_andnot_si128(isInfinite, _mm_castps_si128(log2)); __m128i result = _mm_or_si128(select0, select1); select0 = _mm_and_si128(isZero, g_XMNegInfinity); select1 = _mm_andnot_si128(isZero, g_XMNegQNaN); - tmp = _mm_or_si128(select0, select1); + tmp = _mm_or_si128(select0, select1); select0 = _mm_and_si128(isPositive, result); select1 = _mm_andnot_si128(isPositive, tmp); - result = _mm_or_si128(select0, select1); + result = _mm_or_si128(select0, select1); select0 = _mm_and_si128(isNaN, g_XMQNaN); select1 = _mm_andnot_si128(isNaN, result); - result = _mm_or_si128(select0, select1); + result = _mm_or_si128(select0, select1); return _mm_castsi128_ps(result); #endif @@ -3772,45 +3324,40 @@ inline XMVECTOR XM_CALLCONV XMVectorLog10(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - log10f(V.vector4_f32[0]), - log10f(V.vector4_f32[1]), - log10f(V.vector4_f32[2]), - log10f(V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { log10f(V.vector4_f32[0]), log10f(V.vector4_f32[1]), log10f(V.vector4_f32[2]), log10f(V.vector4_f32[3]) } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - int32x4_t rawBiased = vandq_s32(vreinterpretq_s32_f32(V), g_XMInfinity); - int32x4_t trailing = vandq_s32(vreinterpretq_s32_f32(V), g_XMQNaNTest); + int32x4_t rawBiased = vandq_s32(vreinterpretq_s32_f32(V), g_XMInfinity); + int32x4_t trailing = vandq_s32(vreinterpretq_s32_f32(V), g_XMQNaNTest); uint32x4_t isExponentZero = vceqq_s32(g_XMZero, rawBiased); // Compute exponent and significand for normals. - int32x4_t biased = vshrq_n_s32(rawBiased, 23); + int32x4_t biased = vshrq_n_s32(rawBiased, 23); int32x4_t exponentNor = vsubq_s32(biased, g_XMExponentBias); int32x4_t trailingNor = trailing; // Compute exponent and significand for subnormals. - int32x4_t leading = MathInternal::GetLeadingBit(trailing); - int32x4_t shift = vsubq_s32(g_XMNumTrailing, leading); + int32x4_t leading = MathInternal::GetLeadingBit(trailing); + int32x4_t shift = vsubq_s32(g_XMNumTrailing, leading); int32x4_t exponentSub = vsubq_s32(g_XMSubnormalExponent, shift); int32x4_t trailingSub = vshlq_s32(trailing, shift); - trailingSub = vandq_s32(trailingSub, g_XMQNaNTest); - int32x4_t e = vbslq_s32(isExponentZero, exponentSub, exponentNor); - int32x4_t t = vbslq_s32(isExponentZero, trailingSub, trailingNor); + trailingSub = vandq_s32(trailingSub, g_XMQNaNTest); + int32x4_t e = vbslq_s32(isExponentZero, exponentSub, exponentNor); + int32x4_t t = vbslq_s32(isExponentZero, trailingSub, trailingNor); // Compute the approximation. - int32x4_t tmp = vorrq_s32(g_XMOne, t); - float32x4_t y = vsubq_f32(vreinterpretq_f32_s32(tmp), g_XMOne); + int32x4_t tmp = vorrq_s32(g_XMOne, t); + float32x4_t y = vsubq_f32(vreinterpretq_f32_s32(tmp), g_XMOne); float32x4_t log2 = vmlaq_f32(g_XMLogEst6, g_XMLogEst7, y); - log2 = vmlaq_f32(g_XMLogEst5, log2, y); - log2 = vmlaq_f32(g_XMLogEst4, log2, y); - log2 = vmlaq_f32(g_XMLogEst3, log2, y); - log2 = vmlaq_f32(g_XMLogEst2, log2, y); - log2 = vmlaq_f32(g_XMLogEst1, log2, y); - log2 = vmlaq_f32(g_XMLogEst0, log2, y); - log2 = vmlaq_f32(vcvtq_f32_s32(e), log2, y); + log2 = vmlaq_f32(g_XMLogEst5, log2, y); + log2 = vmlaq_f32(g_XMLogEst4, log2, y); + log2 = vmlaq_f32(g_XMLogEst3, log2, y); + log2 = vmlaq_f32(g_XMLogEst2, log2, y); + log2 = vmlaq_f32(g_XMLogEst1, log2, y); + log2 = vmlaq_f32(g_XMLogEst0, log2, y); + log2 = vmlaq_f32(vcvtq_f32_s32(e), log2, y); log2 = vmulq_f32(g_XMInvLg10, log2); @@ -3823,66 +3370,66 @@ inline XMVECTOR XM_CALLCONV XMVectorLog10(FXMVECTOR V) noexcept // else -> -QNaN uint32x4_t isInfinite = vandq_u32(vreinterpretq_u32_f32(V), g_XMAbsMask); - isInfinite = vceqq_u32(isInfinite, g_XMInfinity); + isInfinite = vceqq_u32(isInfinite, g_XMInfinity); uint32x4_t isGreaterZero = vcgtq_s32(vreinterpretq_s32_f32(V), g_XMZero); - uint32x4_t isNotFinite = vcgtq_s32(vreinterpretq_s32_f32(V), g_XMInfinity); - uint32x4_t isPositive = vbicq_u32(isGreaterZero, isNotFinite); + uint32x4_t isNotFinite = vcgtq_s32(vreinterpretq_s32_f32(V), g_XMInfinity); + uint32x4_t isPositive = vbicq_u32(isGreaterZero, isNotFinite); uint32x4_t isZero = vandq_u32(vreinterpretq_u32_f32(V), g_XMAbsMask); - isZero = vceqq_u32(isZero, g_XMZero); + isZero = vceqq_u32(isZero, g_XMZero); - uint32x4_t t0 = vandq_u32(vreinterpretq_u32_f32(V), g_XMQNaNTest); - uint32x4_t t1 = vandq_u32(vreinterpretq_u32_f32(V), g_XMInfinity); - t0 = vceqq_u32(t0, g_XMZero); - t1 = vceqq_u32(t1, g_XMInfinity); + uint32x4_t t0 = vandq_u32(vreinterpretq_u32_f32(V), g_XMQNaNTest); + uint32x4_t t1 = vandq_u32(vreinterpretq_u32_f32(V), g_XMInfinity); + t0 = vceqq_u32(t0, g_XMZero); + t1 = vceqq_u32(t1, g_XMInfinity); uint32x4_t isNaN = vbicq_u32(t1, t0); float32x4_t result = vbslq_f32(isInfinite, g_XMInfinity, log2); - float32x4_t tmp2 = vbslq_f32(isZero, g_XMNegInfinity, g_XMNegQNaN); - result = vbslq_f32(isPositive, result, tmp2); - result = vbslq_f32(isNaN, g_XMQNaN, result); + float32x4_t tmp2 = vbslq_f32(isZero, g_XMNegInfinity, g_XMNegQNaN); + result = vbslq_f32(isPositive, result, tmp2); + result = vbslq_f32(isNaN, g_XMQNaN, result); return result; #elif defined(_XM_SVML_INTRINSICS_) XMVECTOR Result = _mm_log10_ps(V); return Result; #elif defined(_XM_SSE_INTRINSICS_) - __m128i rawBiased = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); - __m128i trailing = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); + __m128i rawBiased = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); + __m128i trailing = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); __m128i isExponentZero = _mm_cmpeq_epi32(g_XMZero, rawBiased); // Compute exponent and significand for normals. - __m128i biased = _mm_srli_epi32(rawBiased, 23); + __m128i biased = _mm_srli_epi32(rawBiased, 23); __m128i exponentNor = _mm_sub_epi32(biased, g_XMExponentBias); __m128i trailingNor = trailing; // Compute exponent and significand for subnormals. - __m128i leading = MathInternal::GetLeadingBit(trailing); - __m128i shift = _mm_sub_epi32(g_XMNumTrailing, leading); + __m128i leading = MathInternal::GetLeadingBit(trailing); + __m128i shift = _mm_sub_epi32(g_XMNumTrailing, leading); __m128i exponentSub = _mm_sub_epi32(g_XMSubnormalExponent, shift); __m128i trailingSub = MathInternal::multi_sll_epi32(trailing, shift); - trailingSub = _mm_and_si128(trailingSub, g_XMQNaNTest); + trailingSub = _mm_and_si128(trailingSub, g_XMQNaNTest); __m128i select0 = _mm_and_si128(isExponentZero, exponentSub); __m128i select1 = _mm_andnot_si128(isExponentZero, exponentNor); - __m128i e = _mm_or_si128(select0, select1); + __m128i e = _mm_or_si128(select0, select1); - select0 = _mm_and_si128(isExponentZero, trailingSub); - select1 = _mm_andnot_si128(isExponentZero, trailingNor); + select0 = _mm_and_si128(isExponentZero, trailingSub); + select1 = _mm_andnot_si128(isExponentZero, trailingNor); __m128i t = _mm_or_si128(select0, select1); // Compute the approximation. __m128i tmp = _mm_or_si128(g_XMOne, t); - __m128 y = _mm_sub_ps(_mm_castsi128_ps(tmp), g_XMOne); + __m128 y = _mm_sub_ps(_mm_castsi128_ps(tmp), g_XMOne); __m128 log2 = XM_FMADD_PS(g_XMLogEst7, y, g_XMLogEst6); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst5); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst4); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst3); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst2); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst1); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst0); - log2 = XM_FMADD_PS(log2, y, _mm_cvtepi32_ps(e)); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst5); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst4); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst3); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst2); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst1); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst0); + log2 = XM_FMADD_PS(log2, y, _mm_cvtepi32_ps(e)); log2 = _mm_mul_ps(g_XMInvLg10, log2); @@ -3895,36 +3442,36 @@ inline XMVECTOR XM_CALLCONV XMVectorLog10(FXMVECTOR V) noexcept // else -> -QNaN __m128i isInfinite = _mm_and_si128(_mm_castps_si128(V), g_XMAbsMask); - isInfinite = _mm_cmpeq_epi32(isInfinite, g_XMInfinity); + isInfinite = _mm_cmpeq_epi32(isInfinite, g_XMInfinity); __m128i isGreaterZero = _mm_cmpgt_epi32(_mm_castps_si128(V), g_XMZero); - __m128i isNotFinite = _mm_cmpgt_epi32(_mm_castps_si128(V), g_XMInfinity); - __m128i isPositive = _mm_andnot_si128(isNotFinite, isGreaterZero); + __m128i isNotFinite = _mm_cmpgt_epi32(_mm_castps_si128(V), g_XMInfinity); + __m128i isPositive = _mm_andnot_si128(isNotFinite, isGreaterZero); __m128i isZero = _mm_and_si128(_mm_castps_si128(V), g_XMAbsMask); - isZero = _mm_cmpeq_epi32(isZero, g_XMZero); + isZero = _mm_cmpeq_epi32(isZero, g_XMZero); - __m128i t0 = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); - __m128i t1 = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); - t0 = _mm_cmpeq_epi32(t0, g_XMZero); - t1 = _mm_cmpeq_epi32(t1, g_XMInfinity); + __m128i t0 = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); + __m128i t1 = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); + t0 = _mm_cmpeq_epi32(t0, g_XMZero); + t1 = _mm_cmpeq_epi32(t1, g_XMInfinity); __m128i isNaN = _mm_andnot_si128(t0, t1); - select0 = _mm_and_si128(isInfinite, g_XMInfinity); - select1 = _mm_andnot_si128(isInfinite, _mm_castps_si128(log2)); + select0 = _mm_and_si128(isInfinite, g_XMInfinity); + select1 = _mm_andnot_si128(isInfinite, _mm_castps_si128(log2)); __m128i result = _mm_or_si128(select0, select1); select0 = _mm_and_si128(isZero, g_XMNegInfinity); select1 = _mm_andnot_si128(isZero, g_XMNegQNaN); - tmp = _mm_or_si128(select0, select1); + tmp = _mm_or_si128(select0, select1); select0 = _mm_and_si128(isPositive, result); select1 = _mm_andnot_si128(isPositive, tmp); - result = _mm_or_si128(select0, select1); + result = _mm_or_si128(select0, select1); select0 = _mm_and_si128(isNaN, g_XMQNaN); select1 = _mm_andnot_si128(isNaN, result); - result = _mm_or_si128(select0, select1); + result = _mm_or_si128(select0, select1); return _mm_castsi128_ps(result); #endif @@ -3936,45 +3483,40 @@ inline XMVECTOR XM_CALLCONV XMVectorLogE(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - logf(V.vector4_f32[0]), - logf(V.vector4_f32[1]), - logf(V.vector4_f32[2]), - logf(V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { logf(V.vector4_f32[0]), logf(V.vector4_f32[1]), logf(V.vector4_f32[2]), logf(V.vector4_f32[3]) } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - int32x4_t rawBiased = vandq_s32(vreinterpretq_s32_f32(V), g_XMInfinity); - int32x4_t trailing = vandq_s32(vreinterpretq_s32_f32(V), g_XMQNaNTest); + int32x4_t rawBiased = vandq_s32(vreinterpretq_s32_f32(V), g_XMInfinity); + int32x4_t trailing = vandq_s32(vreinterpretq_s32_f32(V), g_XMQNaNTest); uint32x4_t isExponentZero = vceqq_s32(g_XMZero, rawBiased); // Compute exponent and significand for normals. - int32x4_t biased = vshrq_n_s32(rawBiased, 23); + int32x4_t biased = vshrq_n_s32(rawBiased, 23); int32x4_t exponentNor = vsubq_s32(biased, g_XMExponentBias); int32x4_t trailingNor = trailing; // Compute exponent and significand for subnormals. - int32x4_t leading = MathInternal::GetLeadingBit(trailing); - int32x4_t shift = vsubq_s32(g_XMNumTrailing, leading); + int32x4_t leading = MathInternal::GetLeadingBit(trailing); + int32x4_t shift = vsubq_s32(g_XMNumTrailing, leading); int32x4_t exponentSub = vsubq_s32(g_XMSubnormalExponent, shift); int32x4_t trailingSub = vshlq_s32(trailing, shift); - trailingSub = vandq_s32(trailingSub, g_XMQNaNTest); - int32x4_t e = vbslq_s32(isExponentZero, exponentSub, exponentNor); - int32x4_t t = vbslq_s32(isExponentZero, trailingSub, trailingNor); + trailingSub = vandq_s32(trailingSub, g_XMQNaNTest); + int32x4_t e = vbslq_s32(isExponentZero, exponentSub, exponentNor); + int32x4_t t = vbslq_s32(isExponentZero, trailingSub, trailingNor); // Compute the approximation. - int32x4_t tmp = vorrq_s32(g_XMOne, t); - float32x4_t y = vsubq_f32(vreinterpretq_f32_s32(tmp), g_XMOne); + int32x4_t tmp = vorrq_s32(g_XMOne, t); + float32x4_t y = vsubq_f32(vreinterpretq_f32_s32(tmp), g_XMOne); float32x4_t log2 = vmlaq_f32(g_XMLogEst6, g_XMLogEst7, y); - log2 = vmlaq_f32(g_XMLogEst5, log2, y); - log2 = vmlaq_f32(g_XMLogEst4, log2, y); - log2 = vmlaq_f32(g_XMLogEst3, log2, y); - log2 = vmlaq_f32(g_XMLogEst2, log2, y); - log2 = vmlaq_f32(g_XMLogEst1, log2, y); - log2 = vmlaq_f32(g_XMLogEst0, log2, y); - log2 = vmlaq_f32(vcvtq_f32_s32(e), log2, y); + log2 = vmlaq_f32(g_XMLogEst5, log2, y); + log2 = vmlaq_f32(g_XMLogEst4, log2, y); + log2 = vmlaq_f32(g_XMLogEst3, log2, y); + log2 = vmlaq_f32(g_XMLogEst2, log2, y); + log2 = vmlaq_f32(g_XMLogEst1, log2, y); + log2 = vmlaq_f32(g_XMLogEst0, log2, y); + log2 = vmlaq_f32(vcvtq_f32_s32(e), log2, y); log2 = vmulq_f32(g_XMInvLgE, log2); @@ -3987,66 +3529,66 @@ inline XMVECTOR XM_CALLCONV XMVectorLogE(FXMVECTOR V) noexcept // else -> -QNaN uint32x4_t isInfinite = vandq_u32(vreinterpretq_u32_f32(V), g_XMAbsMask); - isInfinite = vceqq_u32(isInfinite, g_XMInfinity); + isInfinite = vceqq_u32(isInfinite, g_XMInfinity); uint32x4_t isGreaterZero = vcgtq_s32(vreinterpretq_s32_f32(V), g_XMZero); - uint32x4_t isNotFinite = vcgtq_s32(vreinterpretq_s32_f32(V), g_XMInfinity); - uint32x4_t isPositive = vbicq_u32(isGreaterZero, isNotFinite); + uint32x4_t isNotFinite = vcgtq_s32(vreinterpretq_s32_f32(V), g_XMInfinity); + uint32x4_t isPositive = vbicq_u32(isGreaterZero, isNotFinite); uint32x4_t isZero = vandq_u32(vreinterpretq_u32_f32(V), g_XMAbsMask); - isZero = vceqq_u32(isZero, g_XMZero); + isZero = vceqq_u32(isZero, g_XMZero); - uint32x4_t t0 = vandq_u32(vreinterpretq_u32_f32(V), g_XMQNaNTest); - uint32x4_t t1 = vandq_u32(vreinterpretq_u32_f32(V), g_XMInfinity); - t0 = vceqq_u32(t0, g_XMZero); - t1 = vceqq_u32(t1, g_XMInfinity); + uint32x4_t t0 = vandq_u32(vreinterpretq_u32_f32(V), g_XMQNaNTest); + uint32x4_t t1 = vandq_u32(vreinterpretq_u32_f32(V), g_XMInfinity); + t0 = vceqq_u32(t0, g_XMZero); + t1 = vceqq_u32(t1, g_XMInfinity); uint32x4_t isNaN = vbicq_u32(t1, t0); float32x4_t result = vbslq_f32(isInfinite, g_XMInfinity, log2); - float32x4_t tmp2 = vbslq_f32(isZero, g_XMNegInfinity, g_XMNegQNaN); - result = vbslq_f32(isPositive, result, tmp2); - result = vbslq_f32(isNaN, g_XMQNaN, result); + float32x4_t tmp2 = vbslq_f32(isZero, g_XMNegInfinity, g_XMNegQNaN); + result = vbslq_f32(isPositive, result, tmp2); + result = vbslq_f32(isNaN, g_XMQNaN, result); return result; #elif defined(_XM_SVML_INTRINSICS_) XMVECTOR Result = _mm_log_ps(V); return Result; #elif defined(_XM_SSE_INTRINSICS_) - __m128i rawBiased = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); - __m128i trailing = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); + __m128i rawBiased = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); + __m128i trailing = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); __m128i isExponentZero = _mm_cmpeq_epi32(g_XMZero, rawBiased); // Compute exponent and significand for normals. - __m128i biased = _mm_srli_epi32(rawBiased, 23); + __m128i biased = _mm_srli_epi32(rawBiased, 23); __m128i exponentNor = _mm_sub_epi32(biased, g_XMExponentBias); __m128i trailingNor = trailing; // Compute exponent and significand for subnormals. - __m128i leading = MathInternal::GetLeadingBit(trailing); - __m128i shift = _mm_sub_epi32(g_XMNumTrailing, leading); + __m128i leading = MathInternal::GetLeadingBit(trailing); + __m128i shift = _mm_sub_epi32(g_XMNumTrailing, leading); __m128i exponentSub = _mm_sub_epi32(g_XMSubnormalExponent, shift); __m128i trailingSub = MathInternal::multi_sll_epi32(trailing, shift); - trailingSub = _mm_and_si128(trailingSub, g_XMQNaNTest); + trailingSub = _mm_and_si128(trailingSub, g_XMQNaNTest); __m128i select0 = _mm_and_si128(isExponentZero, exponentSub); __m128i select1 = _mm_andnot_si128(isExponentZero, exponentNor); - __m128i e = _mm_or_si128(select0, select1); + __m128i e = _mm_or_si128(select0, select1); - select0 = _mm_and_si128(isExponentZero, trailingSub); - select1 = _mm_andnot_si128(isExponentZero, trailingNor); + select0 = _mm_and_si128(isExponentZero, trailingSub); + select1 = _mm_andnot_si128(isExponentZero, trailingNor); __m128i t = _mm_or_si128(select0, select1); // Compute the approximation. __m128i tmp = _mm_or_si128(g_XMOne, t); - __m128 y = _mm_sub_ps(_mm_castsi128_ps(tmp), g_XMOne); + __m128 y = _mm_sub_ps(_mm_castsi128_ps(tmp), g_XMOne); __m128 log2 = XM_FMADD_PS(g_XMLogEst7, y, g_XMLogEst6); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst5); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst4); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst3); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst2); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst1); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst0); - log2 = XM_FMADD_PS(log2, y, _mm_cvtepi32_ps(e)); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst5); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst4); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst3); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst2); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst1); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst0); + log2 = XM_FMADD_PS(log2, y, _mm_cvtepi32_ps(e)); log2 = _mm_mul_ps(g_XMInvLgE, log2); @@ -4059,36 +3601,36 @@ inline XMVECTOR XM_CALLCONV XMVectorLogE(FXMVECTOR V) noexcept // else -> -QNaN __m128i isInfinite = _mm_and_si128(_mm_castps_si128(V), g_XMAbsMask); - isInfinite = _mm_cmpeq_epi32(isInfinite, g_XMInfinity); + isInfinite = _mm_cmpeq_epi32(isInfinite, g_XMInfinity); __m128i isGreaterZero = _mm_cmpgt_epi32(_mm_castps_si128(V), g_XMZero); - __m128i isNotFinite = _mm_cmpgt_epi32(_mm_castps_si128(V), g_XMInfinity); - __m128i isPositive = _mm_andnot_si128(isNotFinite, isGreaterZero); + __m128i isNotFinite = _mm_cmpgt_epi32(_mm_castps_si128(V), g_XMInfinity); + __m128i isPositive = _mm_andnot_si128(isNotFinite, isGreaterZero); __m128i isZero = _mm_and_si128(_mm_castps_si128(V), g_XMAbsMask); - isZero = _mm_cmpeq_epi32(isZero, g_XMZero); + isZero = _mm_cmpeq_epi32(isZero, g_XMZero); - __m128i t0 = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); - __m128i t1 = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); - t0 = _mm_cmpeq_epi32(t0, g_XMZero); - t1 = _mm_cmpeq_epi32(t1, g_XMInfinity); + __m128i t0 = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); + __m128i t1 = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); + t0 = _mm_cmpeq_epi32(t0, g_XMZero); + t1 = _mm_cmpeq_epi32(t1, g_XMInfinity); __m128i isNaN = _mm_andnot_si128(t0, t1); - select0 = _mm_and_si128(isInfinite, g_XMInfinity); - select1 = _mm_andnot_si128(isInfinite, _mm_castps_si128(log2)); + select0 = _mm_and_si128(isInfinite, g_XMInfinity); + select1 = _mm_andnot_si128(isInfinite, _mm_castps_si128(log2)); __m128i result = _mm_or_si128(select0, select1); select0 = _mm_and_si128(isZero, g_XMNegInfinity); select1 = _mm_andnot_si128(isZero, g_XMNegQNaN); - tmp = _mm_or_si128(select0, select1); + tmp = _mm_or_si128(select0, select1); select0 = _mm_and_si128(isPositive, result); select1 = _mm_andnot_si128(isPositive, tmp); - result = _mm_or_si128(select0, select1); + result = _mm_or_si128(select0, select1); select0 = _mm_and_si128(isNaN, g_XMQNaN); select1 = _mm_andnot_si128(isNaN, result); - result = _mm_or_si128(select0, select1); + result = _mm_or_si128(select0, select1); return _mm_castsi128_ps(result); #endif @@ -4103,29 +3645,21 @@ inline XMVECTOR XM_CALLCONV XMVectorLog(FXMVECTOR V) noexcept //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorPow -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorPow(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - powf(V1.vector4_f32[0], V2.vector4_f32[0]), - powf(V1.vector4_f32[1], V2.vector4_f32[1]), - powf(V1.vector4_f32[2], V2.vector4_f32[2]), - powf(V1.vector4_f32[3], V2.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { powf(V1.vector4_f32[0], V2.vector4_f32[0]), + powf(V1.vector4_f32[1], V2.vector4_f32[1]), + powf(V1.vector4_f32[2], V2.vector4_f32[2]), + powf(V1.vector4_f32[3], V2.vector4_f32[3]) } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - XMVECTORF32 vResult = { { { - powf(vgetq_lane_f32(V1, 0), vgetq_lane_f32(V2, 0)), - powf(vgetq_lane_f32(V1, 1), vgetq_lane_f32(V2, 1)), - powf(vgetq_lane_f32(V1, 2), vgetq_lane_f32(V2, 2)), - powf(vgetq_lane_f32(V1, 3), vgetq_lane_f32(V2, 3)) - } } }; + XMVECTORF32 vResult = { { { powf(vgetq_lane_f32(V1, 0), vgetq_lane_f32(V2, 0)), + powf(vgetq_lane_f32(V1, 1), vgetq_lane_f32(V2, 1)), + powf(vgetq_lane_f32(V1, 2), vgetq_lane_f32(V2, 2)), + powf(vgetq_lane_f32(V1, 3), vgetq_lane_f32(V2, 3)) } } }; return vResult.v; #elif defined(_XM_SVML_INTRINSICS_) XMVECTOR Result = _mm_pow_ps(V1, V2); @@ -4135,11 +3669,7 @@ inline XMVECTOR XM_CALLCONV XMVectorPow XM_ALIGNED_DATA(16) float b[4]; _mm_store_ps(a, V1); _mm_store_ps(b, V2); - XMVECTOR vResult = _mm_setr_ps( - powf(a[0], b[0]), - powf(a[1], b[1]), - powf(a[2], b[2]), - powf(a[3], b[3])); + XMVECTOR vResult = _mm_setr_ps(powf(a[0], b[0]), powf(a[1], b[1]), powf(a[2], b[2]), powf(a[3], b[3])); return vResult; #endif } @@ -4149,47 +3679,38 @@ inline XMVECTOR XM_CALLCONV XMVectorPow inline XMVECTOR XM_CALLCONV XMVectorAbs(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - fabsf(V.vector4_f32[0]), - fabsf(V.vector4_f32[1]), - fabsf(V.vector4_f32[2]), - fabsf(V.vector4_f32[3]) - } } }; + XMVECTORF32 vResult = { { { fabsf(V.vector4_f32[0]), fabsf(V.vector4_f32[1]), fabsf(V.vector4_f32[2]), fabsf(V.vector4_f32[3]) } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) return vabsq_f32(V); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vResult = _mm_setzero_ps(); - vResult = _mm_sub_ps(vResult, V); - vResult = _mm_max_ps(vResult, V); + vResult = _mm_sub_ps(vResult, V); + vResult = _mm_max_ps(vResult, V); return vResult; #endif } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorMod -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorMod(FXMVECTOR V1, FXMVECTOR V2) noexcept { // V1 % V2 = V1 - V2 * truncate(V1 / V2) #if defined(_XM_NO_INTRINSICS_) XMVECTOR Quotient = XMVectorDivide(V1, V2); - Quotient = XMVectorTruncate(Quotient); - XMVECTOR Result = XMVectorNegativeMultiplySubtract(V2, Quotient, V1); + Quotient = XMVectorTruncate(Quotient); + XMVECTOR Result = XMVectorNegativeMultiplySubtract(V2, Quotient, V1); return Result; #elif defined(_XM_ARM_NEON_INTRINSICS_) XMVECTOR vResult = XMVectorDivide(V1, V2); - vResult = XMVectorTruncate(vResult); + vResult = XMVectorTruncate(vResult); return vmlsq_f32(V1, vResult, V2); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vResult = _mm_div_ps(V1, V2); - vResult = XMVectorTruncate(vResult); + vResult = XMVectorTruncate(vResult); return XM_FNMADD_PS(vResult, V2, V1); #endif } @@ -4204,8 +3725,8 @@ inline XMVECTOR XM_CALLCONV XMVectorModAngles(FXMVECTOR Angles) noexcept XMVECTOR Result; // Modulo the range of the given angles such that -XM_PI <= Angles < XM_PI - V = XMVectorMultiply(Angles, g_XMReciprocalTwoPi.v); - V = XMVectorRound(V); + V = XMVectorMultiply(Angles, g_XMReciprocalTwoPi.v); + V = XMVectorRound(V); Result = XMVectorNegativeMultiplySubtract(g_XMTwoPi.v, V, Angles); return Result; @@ -4231,41 +3752,36 @@ inline XMVECTOR XM_CALLCONV XMVectorSin(FXMVECTOR V) noexcept // 11-degree minimax approximation #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - sinf(V.vector4_f32[0]), - sinf(V.vector4_f32[1]), - sinf(V.vector4_f32[2]), - sinf(V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { sinf(V.vector4_f32[0]), sinf(V.vector4_f32[1]), sinf(V.vector4_f32[2]), sinf(V.vector4_f32[3]) } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) // Force the value within the bounds of pi XMVECTOR x = XMVectorModAngles(V); // Map in [-pi/2,pi/2] with sin(y) = sin(x). - uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), g_XMNegativeZero); - uint32x4_t c = vorrq_u32(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 + uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), g_XMNegativeZero); + uint32x4_t c = vorrq_u32(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 float32x4_t absx = vabsq_f32(x); float32x4_t rflx = vsubq_f32(vreinterpretq_f32_u32(c), x); - uint32x4_t comp = vcleq_f32(absx, g_XMHalfPi); - x = vbslq_f32(comp, x, rflx); + uint32x4_t comp = vcleq_f32(absx, g_XMHalfPi); + x = vbslq_f32(comp, x, rflx); float32x4_t x2 = vmulq_f32(x, x); // Compute polynomial approximation - const XMVECTOR SC1 = g_XMSinCoefficients1; - const XMVECTOR SC0 = g_XMSinCoefficients0; - XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(SC0), 1); - XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_low_f32(SC1), 0); + const XMVECTOR SC1 = g_XMSinCoefficients1; + const XMVECTOR SC0 = g_XMSinCoefficients0; + XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(SC0), 1); + XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_low_f32(SC1), 0); vConstants = vdupq_lane_f32(vget_high_f32(SC0), 0); - Result = vmlaq_f32(vConstants, Result, x2); + Result = vmlaq_f32(vConstants, Result, x2); vConstants = vdupq_lane_f32(vget_low_f32(SC0), 1); - Result = vmlaq_f32(vConstants, Result, x2); + Result = vmlaq_f32(vConstants, Result, x2); vConstants = vdupq_lane_f32(vget_low_f32(SC0), 0); - Result = vmlaq_f32(vConstants, Result, x2); + Result = vmlaq_f32(vConstants, Result, x2); Result = vmlaq_f32(g_XMOne, Result, x2); Result = vmulq_f32(Result, x); @@ -4278,32 +3794,32 @@ inline XMVECTOR XM_CALLCONV XMVectorSin(FXMVECTOR V) noexcept XMVECTOR x = XMVectorModAngles(V); // Map in [-pi/2,pi/2] with sin(y) = sin(x). - __m128 sign = _mm_and_ps(x, g_XMNegativeZero); - __m128 c = _mm_or_ps(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 - __m128 absx = _mm_andnot_ps(sign, x); // |x| - __m128 rflx = _mm_sub_ps(c, x); - __m128 comp = _mm_cmple_ps(absx, g_XMHalfPi); + __m128 sign = _mm_and_ps(x, g_XMNegativeZero); + __m128 c = _mm_or_ps(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 + __m128 absx = _mm_andnot_ps(sign, x); // |x| + __m128 rflx = _mm_sub_ps(c, x); + __m128 comp = _mm_cmple_ps(absx, g_XMHalfPi); __m128 select0 = _mm_and_ps(comp, x); __m128 select1 = _mm_andnot_ps(comp, rflx); - x = _mm_or_ps(select0, select1); + x = _mm_or_ps(select0, select1); __m128 x2 = _mm_mul_ps(x, x); // Compute polynomial approximation - const XMVECTOR SC1 = g_XMSinCoefficients1; - __m128 vConstantsB = XM_PERMUTE_PS(SC1, _MM_SHUFFLE(0, 0, 0, 0)); - const XMVECTOR SC0 = g_XMSinCoefficients0; - __m128 vConstants = XM_PERMUTE_PS(SC0, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); + const XMVECTOR SC1 = g_XMSinCoefficients1; + __m128 vConstantsB = XM_PERMUTE_PS(SC1, _MM_SHUFFLE(0, 0, 0, 0)); + const XMVECTOR SC0 = g_XMSinCoefficients0; + __m128 vConstants = XM_PERMUTE_PS(SC0, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); vConstants = XM_PERMUTE_PS(SC0, _MM_SHUFFLE(2, 2, 2, 2)); - Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, vConstants); vConstants = XM_PERMUTE_PS(SC0, _MM_SHUFFLE(1, 1, 1, 1)); - Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, vConstants); vConstants = XM_PERMUTE_PS(SC0, _MM_SHUFFLE(0, 0, 0, 0)); - Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, vConstants); Result = XM_FMADD_PS(Result, x2, g_XMOne); Result = _mm_mul_ps(Result, x); @@ -4318,42 +3834,37 @@ inline XMVECTOR XM_CALLCONV XMVectorCos(FXMVECTOR V) noexcept // 10-degree minimax approximation #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - cosf(V.vector4_f32[0]), - cosf(V.vector4_f32[1]), - cosf(V.vector4_f32[2]), - cosf(V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { cosf(V.vector4_f32[0]), cosf(V.vector4_f32[1]), cosf(V.vector4_f32[2]), cosf(V.vector4_f32[3]) } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) // Map V to x in [-pi,pi]. XMVECTOR x = XMVectorModAngles(V); // Map in [-pi/2,pi/2] with cos(y) = sign*cos(x). - uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), g_XMNegativeZero); - uint32x4_t c = vorrq_u32(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 - float32x4_t absx = vabsq_f32(x); - float32x4_t rflx = vsubq_f32(vreinterpretq_f32_u32(c), x); - uint32x4_t comp = vcleq_f32(absx, g_XMHalfPi); - x = vbslq_f32(comp, x, rflx); + uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), g_XMNegativeZero); + uint32x4_t c = vorrq_u32(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 + float32x4_t absx = vabsq_f32(x); + float32x4_t rflx = vsubq_f32(vreinterpretq_f32_u32(c), x); + uint32x4_t comp = vcleq_f32(absx, g_XMHalfPi); + x = vbslq_f32(comp, x, rflx); float32x4_t fsign = vbslq_f32(comp, g_XMOne, g_XMNegativeOne); float32x4_t x2 = vmulq_f32(x, x); // Compute polynomial approximation - const XMVECTOR CC1 = g_XMCosCoefficients1; - const XMVECTOR CC0 = g_XMCosCoefficients0; - XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(CC0), 1); - XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_low_f32(CC1), 0); + const XMVECTOR CC1 = g_XMCosCoefficients1; + const XMVECTOR CC0 = g_XMCosCoefficients0; + XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(CC0), 1); + XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_low_f32(CC1), 0); vConstants = vdupq_lane_f32(vget_high_f32(CC0), 0); - Result = vmlaq_f32(vConstants, Result, x2); + Result = vmlaq_f32(vConstants, Result, x2); vConstants = vdupq_lane_f32(vget_low_f32(CC0), 1); - Result = vmlaq_f32(vConstants, Result, x2); + Result = vmlaq_f32(vConstants, Result, x2); vConstants = vdupq_lane_f32(vget_low_f32(CC0), 0); - Result = vmlaq_f32(vConstants, Result, x2); + Result = vmlaq_f32(vConstants, Result, x2); Result = vmlaq_f32(g_XMOne, Result, x2); Result = vmulq_f32(Result, fsign); @@ -4366,35 +3877,35 @@ inline XMVECTOR XM_CALLCONV XMVectorCos(FXMVECTOR V) noexcept XMVECTOR x = XMVectorModAngles(V); // Map in [-pi/2,pi/2] with cos(y) = sign*cos(x). - XMVECTOR sign = _mm_and_ps(x, g_XMNegativeZero); - __m128 c = _mm_or_ps(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 - __m128 absx = _mm_andnot_ps(sign, x); // |x| - __m128 rflx = _mm_sub_ps(c, x); - __m128 comp = _mm_cmple_ps(absx, g_XMHalfPi); - __m128 select0 = _mm_and_ps(comp, x); - __m128 select1 = _mm_andnot_ps(comp, rflx); - x = _mm_or_ps(select0, select1); - select0 = _mm_and_ps(comp, g_XMOne); - select1 = _mm_andnot_ps(comp, g_XMNegativeOne); - sign = _mm_or_ps(select0, select1); + XMVECTOR sign = _mm_and_ps(x, g_XMNegativeZero); + __m128 c = _mm_or_ps(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 + __m128 absx = _mm_andnot_ps(sign, x); // |x| + __m128 rflx = _mm_sub_ps(c, x); + __m128 comp = _mm_cmple_ps(absx, g_XMHalfPi); + __m128 select0 = _mm_and_ps(comp, x); + __m128 select1 = _mm_andnot_ps(comp, rflx); + x = _mm_or_ps(select0, select1); + select0 = _mm_and_ps(comp, g_XMOne); + select1 = _mm_andnot_ps(comp, g_XMNegativeOne); + sign = _mm_or_ps(select0, select1); __m128 x2 = _mm_mul_ps(x, x); // Compute polynomial approximation - const XMVECTOR CC1 = g_XMCosCoefficients1; - __m128 vConstantsB = XM_PERMUTE_PS(CC1, _MM_SHUFFLE(0, 0, 0, 0)); - const XMVECTOR CC0 = g_XMCosCoefficients0; - __m128 vConstants = XM_PERMUTE_PS(CC0, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); + const XMVECTOR CC1 = g_XMCosCoefficients1; + __m128 vConstantsB = XM_PERMUTE_PS(CC1, _MM_SHUFFLE(0, 0, 0, 0)); + const XMVECTOR CC0 = g_XMCosCoefficients0; + __m128 vConstants = XM_PERMUTE_PS(CC0, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); vConstants = XM_PERMUTE_PS(CC0, _MM_SHUFFLE(2, 2, 2, 2)); - Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, vConstants); vConstants = XM_PERMUTE_PS(CC0, _MM_SHUFFLE(1, 1, 1, 1)); - Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, vConstants); vConstants = XM_PERMUTE_PS(CC0, _MM_SHUFFLE(0, 0, 0, 0)); - Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, vConstants); Result = XM_FMADD_PS(Result, x2, g_XMOne); Result = _mm_mul_ps(Result, sign); @@ -4404,13 +3915,7 @@ inline XMVECTOR XM_CALLCONV XMVectorCos(FXMVECTOR V) noexcept //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMVectorSinCos -( - XMVECTOR* pSin, - XMVECTOR* pCos, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMVectorSinCos(XMVECTOR* pSin, XMVECTOR* pCos, FXMVECTOR V) noexcept { assert(pSin != nullptr); assert(pCos != nullptr); @@ -4418,19 +3923,9 @@ inline void XM_CALLCONV XMVectorSinCos // 11/10-degree minimax approximation #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Sin = { { { - sinf(V.vector4_f32[0]), - sinf(V.vector4_f32[1]), - sinf(V.vector4_f32[2]), - sinf(V.vector4_f32[3]) - } } }; + XMVECTORF32 Sin = { { { sinf(V.vector4_f32[0]), sinf(V.vector4_f32[1]), sinf(V.vector4_f32[2]), sinf(V.vector4_f32[3]) } } }; - XMVECTORF32 Cos = { { { - cosf(V.vector4_f32[0]), - cosf(V.vector4_f32[1]), - cosf(V.vector4_f32[2]), - cosf(V.vector4_f32[3]) - } } }; + XMVECTORF32 Cos = { { { cosf(V.vector4_f32[0]), cosf(V.vector4_f32[1]), cosf(V.vector4_f32[2]), cosf(V.vector4_f32[3]) } } }; *pSin = Sin.v; *pCos = Cos.v; @@ -4439,51 +3934,51 @@ inline void XM_CALLCONV XMVectorSinCos XMVECTOR x = XMVectorModAngles(V); // Map in [-pi/2,pi/2] with cos(y) = sign*cos(x). - uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), g_XMNegativeZero); - uint32x4_t c = vorrq_u32(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 - float32x4_t absx = vabsq_f32(x); - float32x4_t rflx = vsubq_f32(vreinterpretq_f32_u32(c), x); - uint32x4_t comp = vcleq_f32(absx, g_XMHalfPi); - x = vbslq_f32(comp, x, rflx); + uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), g_XMNegativeZero); + uint32x4_t c = vorrq_u32(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 + float32x4_t absx = vabsq_f32(x); + float32x4_t rflx = vsubq_f32(vreinterpretq_f32_u32(c), x); + uint32x4_t comp = vcleq_f32(absx, g_XMHalfPi); + x = vbslq_f32(comp, x, rflx); float32x4_t fsign = vbslq_f32(comp, g_XMOne, g_XMNegativeOne); float32x4_t x2 = vmulq_f32(x, x); // Compute polynomial approximation for sine - const XMVECTOR SC1 = g_XMSinCoefficients1; - const XMVECTOR SC0 = g_XMSinCoefficients0; - XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(SC0), 1); - XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_low_f32(SC1), 0); + const XMVECTOR SC1 = g_XMSinCoefficients1; + const XMVECTOR SC0 = g_XMSinCoefficients0; + XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(SC0), 1); + XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_low_f32(SC1), 0); vConstants = vdupq_lane_f32(vget_high_f32(SC0), 0); - Result = vmlaq_f32(vConstants, Result, x2); + Result = vmlaq_f32(vConstants, Result, x2); vConstants = vdupq_lane_f32(vget_low_f32(SC0), 1); - Result = vmlaq_f32(vConstants, Result, x2); + Result = vmlaq_f32(vConstants, Result, x2); vConstants = vdupq_lane_f32(vget_low_f32(SC0), 0); - Result = vmlaq_f32(vConstants, Result, x2); + Result = vmlaq_f32(vConstants, Result, x2); Result = vmlaq_f32(g_XMOne, Result, x2); - *pSin = vmulq_f32(Result, x); + *pSin = vmulq_f32(Result, x); // Compute polynomial approximation for cosine const XMVECTOR CC1 = g_XMCosCoefficients1; const XMVECTOR CC0 = g_XMCosCoefficients0; - vConstants = vdupq_lane_f32(vget_high_f32(CC0), 1); - Result = vmlaq_lane_f32(vConstants, x2, vget_low_f32(CC1), 0); + vConstants = vdupq_lane_f32(vget_high_f32(CC0), 1); + Result = vmlaq_lane_f32(vConstants, x2, vget_low_f32(CC1), 0); vConstants = vdupq_lane_f32(vget_high_f32(CC0), 0); - Result = vmlaq_f32(vConstants, Result, x2); + Result = vmlaq_f32(vConstants, Result, x2); vConstants = vdupq_lane_f32(vget_low_f32(CC0), 1); - Result = vmlaq_f32(vConstants, Result, x2); + Result = vmlaq_f32(vConstants, Result, x2); vConstants = vdupq_lane_f32(vget_low_f32(CC0), 0); - Result = vmlaq_f32(vConstants, Result, x2); + Result = vmlaq_f32(vConstants, Result, x2); Result = vmlaq_f32(g_XMOne, Result, x2); - *pCos = vmulq_f32(Result, fsign); + *pCos = vmulq_f32(Result, fsign); #elif defined(_XM_SVML_INTRINSICS_) *pSin = _mm_sincos_ps(pCos, V); #elif defined(_XM_SSE_INTRINSICS_) @@ -4491,59 +3986,59 @@ inline void XM_CALLCONV XMVectorSinCos XMVECTOR x = XMVectorModAngles(V); // Map in [-pi/2,pi/2] with sin(y) = sin(x), cos(y) = sign*cos(x). - XMVECTOR sign = _mm_and_ps(x, g_XMNegativeZero); - __m128 c = _mm_or_ps(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 - __m128 absx = _mm_andnot_ps(sign, x); // |x| - __m128 rflx = _mm_sub_ps(c, x); - __m128 comp = _mm_cmple_ps(absx, g_XMHalfPi); - __m128 select0 = _mm_and_ps(comp, x); - __m128 select1 = _mm_andnot_ps(comp, rflx); - x = _mm_or_ps(select0, select1); - select0 = _mm_and_ps(comp, g_XMOne); - select1 = _mm_andnot_ps(comp, g_XMNegativeOne); - sign = _mm_or_ps(select0, select1); + XMVECTOR sign = _mm_and_ps(x, g_XMNegativeZero); + __m128 c = _mm_or_ps(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 + __m128 absx = _mm_andnot_ps(sign, x); // |x| + __m128 rflx = _mm_sub_ps(c, x); + __m128 comp = _mm_cmple_ps(absx, g_XMHalfPi); + __m128 select0 = _mm_and_ps(comp, x); + __m128 select1 = _mm_andnot_ps(comp, rflx); + x = _mm_or_ps(select0, select1); + select0 = _mm_and_ps(comp, g_XMOne); + select1 = _mm_andnot_ps(comp, g_XMNegativeOne); + sign = _mm_or_ps(select0, select1); __m128 x2 = _mm_mul_ps(x, x); // Compute polynomial approximation of sine - const XMVECTOR SC1 = g_XMSinCoefficients1; - __m128 vConstantsB = XM_PERMUTE_PS(SC1, _MM_SHUFFLE(0, 0, 0, 0)); - const XMVECTOR SC0 = g_XMSinCoefficients0; - __m128 vConstants = XM_PERMUTE_PS(SC0, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); + const XMVECTOR SC1 = g_XMSinCoefficients1; + __m128 vConstantsB = XM_PERMUTE_PS(SC1, _MM_SHUFFLE(0, 0, 0, 0)); + const XMVECTOR SC0 = g_XMSinCoefficients0; + __m128 vConstants = XM_PERMUTE_PS(SC0, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); vConstants = XM_PERMUTE_PS(SC0, _MM_SHUFFLE(2, 2, 2, 2)); - Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, vConstants); vConstants = XM_PERMUTE_PS(SC0, _MM_SHUFFLE(1, 1, 1, 1)); - Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, vConstants); vConstants = XM_PERMUTE_PS(SC0, _MM_SHUFFLE(0, 0, 0, 0)); - Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, vConstants); Result = XM_FMADD_PS(Result, x2, g_XMOne); Result = _mm_mul_ps(Result, x); - *pSin = Result; + *pSin = Result; // Compute polynomial approximation of cosine const XMVECTOR CC1 = g_XMCosCoefficients1; - vConstantsB = XM_PERMUTE_PS(CC1, _MM_SHUFFLE(0, 0, 0, 0)); + vConstantsB = XM_PERMUTE_PS(CC1, _MM_SHUFFLE(0, 0, 0, 0)); const XMVECTOR CC0 = g_XMCosCoefficients0; - vConstants = XM_PERMUTE_PS(CC0, _MM_SHUFFLE(3, 3, 3, 3)); - Result = XM_FMADD_PS(vConstantsB, x2, vConstants); + vConstants = XM_PERMUTE_PS(CC0, _MM_SHUFFLE(3, 3, 3, 3)); + Result = XM_FMADD_PS(vConstantsB, x2, vConstants); vConstants = XM_PERMUTE_PS(CC0, _MM_SHUFFLE(2, 2, 2, 2)); - Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, vConstants); vConstants = XM_PERMUTE_PS(CC0, _MM_SHUFFLE(1, 1, 1, 1)); - Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, vConstants); vConstants = XM_PERMUTE_PS(CC0, _MM_SHUFFLE(0, 0, 0, 0)); - Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, vConstants); Result = XM_FMADD_PS(Result, x2, g_XMOne); Result = _mm_mul_ps(Result, sign); - *pCos = Result; + *pCos = Result; #endif } @@ -4554,12 +4049,7 @@ inline XMVECTOR XM_CALLCONV XMVectorTan(FXMVECTOR V) noexcept // Cody and Waite algorithm to compute tangent. #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - tanf(V.vector4_f32[0]), - tanf(V.vector4_f32[1]), - tanf(V.vector4_f32[2]), - tanf(V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { tanf(V.vector4_f32[0]), tanf(V.vector4_f32[1]), tanf(V.vector4_f32[2]), tanf(V.vector4_f32[3]) } } }; return Result.v; #elif defined(_XM_SVML_INTRINSICS_) XMVECTOR Result = _mm_tan_ps(V); @@ -4568,15 +4058,15 @@ inline XMVECTOR XM_CALLCONV XMVectorTan(FXMVECTOR V) noexcept static const XMVECTORF32 TanCoefficients0 = { { { 1.0f, -4.667168334e-1f, 2.566383229e-2f, -3.118153191e-4f } } }; static const XMVECTORF32 TanCoefficients1 = { { { 4.981943399e-7f, -1.333835001e-1f, 3.424887824e-3f, -1.786170734e-5f } } }; - static const XMVECTORF32 TanConstants = { { { 1.570796371f, 6.077100628e-11f, 0.000244140625f, 0.63661977228f /*2 / Pi*/ } } }; - static const XMVECTORU32 Mask = { { { 0x1, 0x1, 0x1, 0x1 } } }; + static const XMVECTORF32 TanConstants = { { { 1.570796371f, 6.077100628e-11f, 0.000244140625f, 0.63661977228f /*2 / Pi*/ } } }; + static const XMVECTORU32 Mask = { { { 0x1, 0x1, 0x1, 0x1 } } }; XMVECTOR TwoDivPi = XMVectorSplatW(TanConstants.v); XMVECTOR Zero = XMVectorZero(); - XMVECTOR C0 = XMVectorSplatX(TanConstants.v); - XMVECTOR C1 = XMVectorSplatY(TanConstants.v); + XMVECTOR C0 = XMVectorSplatX(TanConstants.v); + XMVECTOR C1 = XMVectorSplatY(TanConstants.v); XMVECTOR Epsilon = XMVectorSplatZ(TanConstants.v); XMVECTOR VA = XMVectorMultiply(V, TwoDivPi); @@ -4612,24 +4102,24 @@ inline XMVECTOR XM_CALLCONV XMVectorTan(FXMVECTOR V) noexcept XMVECTOR T0 = XMVectorSplatX(TanCoefficients0.v); XMVECTOR VBIsEven = XMVectorAndInt(VB, Mask.v); - VBIsEven = XMVectorEqualInt(VBIsEven, Zero); - - XMVECTOR N = XMVectorMultiplyAdd(VC2, T7, T6); - XMVECTOR D = XMVectorMultiplyAdd(VC2, T4, T3); - N = XMVectorMultiplyAdd(VC2, N, T5); - D = XMVectorMultiplyAdd(VC2, D, T2); - N = XMVectorMultiply(VC2, N); - D = XMVectorMultiplyAdd(VC2, D, T1); - N = XMVectorMultiplyAdd(VC, N, VC); + VBIsEven = XMVectorEqualInt(VBIsEven, Zero); + + XMVECTOR N = XMVectorMultiplyAdd(VC2, T7, T6); + XMVECTOR D = XMVectorMultiplyAdd(VC2, T4, T3); + N = XMVectorMultiplyAdd(VC2, N, T5); + D = XMVectorMultiplyAdd(VC2, D, T2); + N = XMVectorMultiply(VC2, N); + D = XMVectorMultiplyAdd(VC2, D, T1); + N = XMVectorMultiplyAdd(VC, N, VC); XMVECTOR VCNearZero = XMVectorInBounds(VC, Epsilon); - D = XMVectorMultiplyAdd(VC2, D, T0); + D = XMVectorMultiplyAdd(VC2, D, T0); N = XMVectorSelect(N, VC, VCNearZero); D = XMVectorSelect(D, g_XMOne.v, VCNearZero); XMVECTOR R0 = XMVectorNegate(N); XMVECTOR R1 = XMVectorDivide(N, D); - R0 = XMVectorDivide(D, R0); + R0 = XMVectorDivide(D, R0); XMVECTOR VIsZero = XMVectorEqual(V, Zero); @@ -4647,15 +4137,11 @@ inline XMVECTOR XM_CALLCONV XMVectorTan(FXMVECTOR V) noexcept inline XMVECTOR XM_CALLCONV XMVectorSinH(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - sinhf(V.vector4_f32[0]), - sinhf(V.vector4_f32[1]), - sinhf(V.vector4_f32[2]), - sinhf(V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { sinhf(V.vector4_f32[0]), sinhf(V.vector4_f32[1]), sinhf(V.vector4_f32[2]), sinhf(V.vector4_f32[3]) } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 1.442695040888963f, 1.442695040888963f, 1.442695040888963f, 1.442695040888963f } } }; // 1.0f / ln(2.0f) + static const XMVECTORF32 Scale + = { { { 1.442695040888963f, 1.442695040888963f, 1.442695040888963f, 1.442695040888963f } } }; // 1.0f / ln(2.0f) XMVECTOR V1 = vmlaq_f32(g_XMNegativeOne.v, V, Scale.v); XMVECTOR V2 = vmlsq_f32(g_XMNegativeOne.v, V, Scale.v); @@ -4667,7 +4153,8 @@ inline XMVECTOR XM_CALLCONV XMVectorSinH(FXMVECTOR V) noexcept XMVECTOR Result = _mm_sinh_ps(V); return Result; #elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 1.442695040888963f, 1.442695040888963f, 1.442695040888963f, 1.442695040888963f } } }; // 1.0f / ln(2.0f) + static const XMVECTORF32 Scale + = { { { 1.442695040888963f, 1.442695040888963f, 1.442695040888963f, 1.442695040888963f } } }; // 1.0f / ln(2.0f) XMVECTOR V1 = XM_FMADD_PS(V, Scale, g_XMNegativeOne); XMVECTOR V2 = XM_FNMADD_PS(V, Scale, g_XMNegativeOne); @@ -4683,15 +4170,11 @@ inline XMVECTOR XM_CALLCONV XMVectorSinH(FXMVECTOR V) noexcept inline XMVECTOR XM_CALLCONV XMVectorCosH(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - coshf(V.vector4_f32[0]), - coshf(V.vector4_f32[1]), - coshf(V.vector4_f32[2]), - coshf(V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { coshf(V.vector4_f32[0]), coshf(V.vector4_f32[1]), coshf(V.vector4_f32[2]), coshf(V.vector4_f32[3]) } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 1.442695040888963f, 1.442695040888963f, 1.442695040888963f, 1.442695040888963f } } }; // 1.0f / ln(2.0f) + static const XMVECTORF32 Scale + = { { { 1.442695040888963f, 1.442695040888963f, 1.442695040888963f, 1.442695040888963f } } }; // 1.0f / ln(2.0f) XMVECTOR V1 = vmlaq_f32(g_XMNegativeOne.v, V, Scale.v); XMVECTOR V2 = vmlsq_f32(g_XMNegativeOne.v, V, Scale.v); @@ -4702,7 +4185,8 @@ inline XMVECTOR XM_CALLCONV XMVectorCosH(FXMVECTOR V) noexcept XMVECTOR Result = _mm_cosh_ps(V); return Result; #elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 1.442695040888963f, 1.442695040888963f, 1.442695040888963f, 1.442695040888963f } } }; // 1.0f / ln(2.0f) + static const XMVECTORF32 Scale + = { { { 1.442695040888963f, 1.442695040888963f, 1.442695040888963f, 1.442695040888963f } } }; // 1.0f / ln(2.0f) XMVECTOR V1 = XM_FMADD_PS(V, Scale.v, g_XMNegativeOne.v); XMVECTOR V2 = XM_FNMADD_PS(V, Scale.v, g_XMNegativeOne.v); @@ -4717,31 +4201,28 @@ inline XMVECTOR XM_CALLCONV XMVectorCosH(FXMVECTOR V) noexcept inline XMVECTOR XM_CALLCONV XMVectorTanH(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - tanhf(V.vector4_f32[0]), - tanhf(V.vector4_f32[1]), - tanhf(V.vector4_f32[2]), - tanhf(V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { tanhf(V.vector4_f32[0]), tanhf(V.vector4_f32[1]), tanhf(V.vector4_f32[2]), tanhf(V.vector4_f32[3]) } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 2.8853900817779268f, 2.8853900817779268f, 2.8853900817779268f, 2.8853900817779268f } } }; // 2.0f / ln(2.0f) + static const XMVECTORF32 Scale + = { { { 2.8853900817779268f, 2.8853900817779268f, 2.8853900817779268f, 2.8853900817779268f } } }; // 2.0f / ln(2.0f) XMVECTOR E = vmulq_f32(V, Scale.v); - E = XMVectorExp(E); - E = vmlaq_f32(g_XMOneHalf.v, E, g_XMOneHalf.v); - E = XMVectorReciprocal(E); + E = XMVectorExp(E); + E = vmlaq_f32(g_XMOneHalf.v, E, g_XMOneHalf.v); + E = XMVectorReciprocal(E); return vsubq_f32(g_XMOne.v, E); #elif defined(_XM_SVML_INTRINSICS_) XMVECTOR Result = _mm_tanh_ps(V); return Result; #elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 2.8853900817779268f, 2.8853900817779268f, 2.8853900817779268f, 2.8853900817779268f } } }; // 2.0f / ln(2.0f) + static const XMVECTORF32 Scale + = { { { 2.8853900817779268f, 2.8853900817779268f, 2.8853900817779268f, 2.8853900817779268f } } }; // 2.0f / ln(2.0f) XMVECTOR E = _mm_mul_ps(V, Scale.v); - E = XMVectorExp(E); - E = XM_FMADD_PS(E, g_XMOneHalf.v, g_XMOneHalf.v); - E = _mm_div_ps(g_XMOne.v, E); + E = XMVectorExp(E); + E = XM_FMADD_PS(E, g_XMOneHalf.v, g_XMOneHalf.v); + E = _mm_div_ps(g_XMOne.v, E); return _mm_sub_ps(g_XMOne.v, E); #endif } @@ -4753,95 +4234,90 @@ inline XMVECTOR XM_CALLCONV XMVectorASin(FXMVECTOR V) noexcept // 7-degree minimax approximation #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - asinf(V.vector4_f32[0]), - asinf(V.vector4_f32[1]), - asinf(V.vector4_f32[2]), - asinf(V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { asinf(V.vector4_f32[0]), asinf(V.vector4_f32[1]), asinf(V.vector4_f32[2]), asinf(V.vector4_f32[3]) } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t nonnegative = vcgeq_f32(V, g_XMZero); - float32x4_t x = vabsq_f32(V); + uint32x4_t nonnegative = vcgeq_f32(V, g_XMZero); + float32x4_t x = vabsq_f32(V); // Compute (1-|V|), clamp to zero to avoid sqrt of negative number. - float32x4_t oneMValue = vsubq_f32(g_XMOne, x); + float32x4_t oneMValue = vsubq_f32(g_XMOne, x); float32x4_t clampOneMValue = vmaxq_f32(g_XMZero, oneMValue); - float32x4_t root = XMVectorSqrt(clampOneMValue); + float32x4_t root = XMVectorSqrt(clampOneMValue); // Compute polynomial approximation - const XMVECTOR AC1 = g_XMArcCoefficients1; - XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(AC1), 0); - XMVECTOR t0 = vmlaq_lane_f32(vConstants, x, vget_high_f32(AC1), 1); + const XMVECTOR AC1 = g_XMArcCoefficients1; + XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(AC1), 0); + XMVECTOR t0 = vmlaq_lane_f32(vConstants, x, vget_high_f32(AC1), 1); vConstants = vdupq_lane_f32(vget_low_f32(AC1), 1); - t0 = vmlaq_f32(vConstants, t0, x); + t0 = vmlaq_f32(vConstants, t0, x); vConstants = vdupq_lane_f32(vget_low_f32(AC1), 0); - t0 = vmlaq_f32(vConstants, t0, x); + t0 = vmlaq_f32(vConstants, t0, x); const XMVECTOR AC0 = g_XMArcCoefficients0; - vConstants = vdupq_lane_f32(vget_high_f32(AC0), 1); - t0 = vmlaq_f32(vConstants, t0, x); + vConstants = vdupq_lane_f32(vget_high_f32(AC0), 1); + t0 = vmlaq_f32(vConstants, t0, x); vConstants = vdupq_lane_f32(vget_high_f32(AC0), 0); - t0 = vmlaq_f32(vConstants, t0, x); + t0 = vmlaq_f32(vConstants, t0, x); vConstants = vdupq_lane_f32(vget_low_f32(AC0), 1); - t0 = vmlaq_f32(vConstants, t0, x); + t0 = vmlaq_f32(vConstants, t0, x); vConstants = vdupq_lane_f32(vget_low_f32(AC0), 0); - t0 = vmlaq_f32(vConstants, t0, x); - t0 = vmulq_f32(t0, root); + t0 = vmlaq_f32(vConstants, t0, x); + t0 = vmulq_f32(t0, root); float32x4_t t1 = vsubq_f32(g_XMPi, t0); - t0 = vbslq_f32(nonnegative, t0, t1); - t0 = vsubq_f32(g_XMHalfPi, t0); + t0 = vbslq_f32(nonnegative, t0, t1); + t0 = vsubq_f32(g_XMHalfPi, t0); return t0; #elif defined(_XM_SVML_INTRINSICS_) XMVECTOR Result = _mm_asin_ps(V); return Result; #elif defined(_XM_SSE_INTRINSICS_) __m128 nonnegative = _mm_cmpge_ps(V, g_XMZero); - __m128 mvalue = _mm_sub_ps(g_XMZero, V); - __m128 x = _mm_max_ps(V, mvalue); // |V| + __m128 mvalue = _mm_sub_ps(g_XMZero, V); + __m128 x = _mm_max_ps(V, mvalue); // |V| // Compute (1-|V|), clamp to zero to avoid sqrt of negative number. - __m128 oneMValue = _mm_sub_ps(g_XMOne, x); + __m128 oneMValue = _mm_sub_ps(g_XMOne, x); __m128 clampOneMValue = _mm_max_ps(g_XMZero, oneMValue); - __m128 root = _mm_sqrt_ps(clampOneMValue); // sqrt(1-|V|) + __m128 root = _mm_sqrt_ps(clampOneMValue); // sqrt(1-|V|) // Compute polynomial approximation - const XMVECTOR AC1 = g_XMArcCoefficients1; - __m128 vConstantsB = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 vConstants = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(2, 2, 2, 2)); - __m128 t0 = XM_FMADD_PS(vConstantsB, x, vConstants); + const XMVECTOR AC1 = g_XMArcCoefficients1; + __m128 vConstantsB = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 vConstants = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 t0 = XM_FMADD_PS(vConstantsB, x, vConstants); vConstants = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(1, 1, 1, 1)); - t0 = XM_FMADD_PS(t0, x, vConstants); + t0 = XM_FMADD_PS(t0, x, vConstants); vConstants = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(0, 0, 0, 0)); - t0 = XM_FMADD_PS(t0, x, vConstants); + t0 = XM_FMADD_PS(t0, x, vConstants); const XMVECTOR AC0 = g_XMArcCoefficients0; - vConstants = XM_PERMUTE_PS(AC0, _MM_SHUFFLE(3, 3, 3, 3)); - t0 = XM_FMADD_PS(t0, x, vConstants); + vConstants = XM_PERMUTE_PS(AC0, _MM_SHUFFLE(3, 3, 3, 3)); + t0 = XM_FMADD_PS(t0, x, vConstants); vConstants = XM_PERMUTE_PS(AC0, _MM_SHUFFLE(2, 2, 2, 2)); - t0 = XM_FMADD_PS(t0, x, vConstants); + t0 = XM_FMADD_PS(t0, x, vConstants); vConstants = XM_PERMUTE_PS(AC0, _MM_SHUFFLE(1, 1, 1, 1)); - t0 = XM_FMADD_PS(t0, x, vConstants); + t0 = XM_FMADD_PS(t0, x, vConstants); vConstants = XM_PERMUTE_PS(AC0, _MM_SHUFFLE(0, 0, 0, 0)); - t0 = XM_FMADD_PS(t0, x, vConstants); - t0 = _mm_mul_ps(t0, root); + t0 = XM_FMADD_PS(t0, x, vConstants); + t0 = _mm_mul_ps(t0, root); __m128 t1 = _mm_sub_ps(g_XMPi, t0); - t0 = _mm_and_ps(nonnegative, t0); - t1 = _mm_andnot_ps(nonnegative, t1); - t0 = _mm_or_ps(t0, t1); - t0 = _mm_sub_ps(g_XMHalfPi, t0); + t0 = _mm_and_ps(nonnegative, t0); + t1 = _mm_andnot_ps(nonnegative, t1); + t0 = _mm_or_ps(t0, t1); + t0 = _mm_sub_ps(g_XMHalfPi, t0); return t0; #endif } @@ -4853,93 +4329,88 @@ inline XMVECTOR XM_CALLCONV XMVectorACos(FXMVECTOR V) noexcept // 7-degree minimax approximation #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - acosf(V.vector4_f32[0]), - acosf(V.vector4_f32[1]), - acosf(V.vector4_f32[2]), - acosf(V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { acosf(V.vector4_f32[0]), acosf(V.vector4_f32[1]), acosf(V.vector4_f32[2]), acosf(V.vector4_f32[3]) } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t nonnegative = vcgeq_f32(V, g_XMZero); - float32x4_t x = vabsq_f32(V); + uint32x4_t nonnegative = vcgeq_f32(V, g_XMZero); + float32x4_t x = vabsq_f32(V); // Compute (1-|V|), clamp to zero to avoid sqrt of negative number. - float32x4_t oneMValue = vsubq_f32(g_XMOne, x); + float32x4_t oneMValue = vsubq_f32(g_XMOne, x); float32x4_t clampOneMValue = vmaxq_f32(g_XMZero, oneMValue); - float32x4_t root = XMVectorSqrt(clampOneMValue); + float32x4_t root = XMVectorSqrt(clampOneMValue); // Compute polynomial approximation - const XMVECTOR AC1 = g_XMArcCoefficients1; - XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(AC1), 0); - XMVECTOR t0 = vmlaq_lane_f32(vConstants, x, vget_high_f32(AC1), 1); + const XMVECTOR AC1 = g_XMArcCoefficients1; + XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(AC1), 0); + XMVECTOR t0 = vmlaq_lane_f32(vConstants, x, vget_high_f32(AC1), 1); vConstants = vdupq_lane_f32(vget_low_f32(AC1), 1); - t0 = vmlaq_f32(vConstants, t0, x); + t0 = vmlaq_f32(vConstants, t0, x); vConstants = vdupq_lane_f32(vget_low_f32(AC1), 0); - t0 = vmlaq_f32(vConstants, t0, x); + t0 = vmlaq_f32(vConstants, t0, x); const XMVECTOR AC0 = g_XMArcCoefficients0; - vConstants = vdupq_lane_f32(vget_high_f32(AC0), 1); - t0 = vmlaq_f32(vConstants, t0, x); + vConstants = vdupq_lane_f32(vget_high_f32(AC0), 1); + t0 = vmlaq_f32(vConstants, t0, x); vConstants = vdupq_lane_f32(vget_high_f32(AC0), 0); - t0 = vmlaq_f32(vConstants, t0, x); + t0 = vmlaq_f32(vConstants, t0, x); vConstants = vdupq_lane_f32(vget_low_f32(AC0), 1); - t0 = vmlaq_f32(vConstants, t0, x); + t0 = vmlaq_f32(vConstants, t0, x); vConstants = vdupq_lane_f32(vget_low_f32(AC0), 0); - t0 = vmlaq_f32(vConstants, t0, x); - t0 = vmulq_f32(t0, root); + t0 = vmlaq_f32(vConstants, t0, x); + t0 = vmulq_f32(t0, root); float32x4_t t1 = vsubq_f32(g_XMPi, t0); - t0 = vbslq_f32(nonnegative, t0, t1); + t0 = vbslq_f32(nonnegative, t0, t1); return t0; #elif defined(_XM_SVML_INTRINSICS_) XMVECTOR Result = _mm_acos_ps(V); return Result; #elif defined(_XM_SSE_INTRINSICS_) __m128 nonnegative = _mm_cmpge_ps(V, g_XMZero); - __m128 mvalue = _mm_sub_ps(g_XMZero, V); - __m128 x = _mm_max_ps(V, mvalue); // |V| + __m128 mvalue = _mm_sub_ps(g_XMZero, V); + __m128 x = _mm_max_ps(V, mvalue); // |V| // Compute (1-|V|), clamp to zero to avoid sqrt of negative number. - __m128 oneMValue = _mm_sub_ps(g_XMOne, x); + __m128 oneMValue = _mm_sub_ps(g_XMOne, x); __m128 clampOneMValue = _mm_max_ps(g_XMZero, oneMValue); - __m128 root = _mm_sqrt_ps(clampOneMValue); // sqrt(1-|V|) + __m128 root = _mm_sqrt_ps(clampOneMValue); // sqrt(1-|V|) // Compute polynomial approximation - const XMVECTOR AC1 = g_XMArcCoefficients1; - __m128 vConstantsB = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 vConstants = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(2, 2, 2, 2)); - __m128 t0 = XM_FMADD_PS(vConstantsB, x, vConstants); + const XMVECTOR AC1 = g_XMArcCoefficients1; + __m128 vConstantsB = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 vConstants = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 t0 = XM_FMADD_PS(vConstantsB, x, vConstants); vConstants = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(1, 1, 1, 1)); - t0 = XM_FMADD_PS(t0, x, vConstants); + t0 = XM_FMADD_PS(t0, x, vConstants); vConstants = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(0, 0, 0, 0)); - t0 = XM_FMADD_PS(t0, x, vConstants); + t0 = XM_FMADD_PS(t0, x, vConstants); const XMVECTOR AC0 = g_XMArcCoefficients0; - vConstants = XM_PERMUTE_PS(AC0, _MM_SHUFFLE(3, 3, 3, 3)); - t0 = XM_FMADD_PS(t0, x, vConstants); + vConstants = XM_PERMUTE_PS(AC0, _MM_SHUFFLE(3, 3, 3, 3)); + t0 = XM_FMADD_PS(t0, x, vConstants); vConstants = XM_PERMUTE_PS(AC0, _MM_SHUFFLE(2, 2, 2, 2)); - t0 = XM_FMADD_PS(t0, x, vConstants); + t0 = XM_FMADD_PS(t0, x, vConstants); vConstants = XM_PERMUTE_PS(AC0, _MM_SHUFFLE(1, 1, 1, 1)); - t0 = XM_FMADD_PS(t0, x, vConstants); + t0 = XM_FMADD_PS(t0, x, vConstants); vConstants = XM_PERMUTE_PS(AC0, _MM_SHUFFLE(0, 0, 0, 0)); - t0 = XM_FMADD_PS(t0, x, vConstants); - t0 = _mm_mul_ps(t0, root); + t0 = XM_FMADD_PS(t0, x, vConstants); + t0 = _mm_mul_ps(t0, root); __m128 t1 = _mm_sub_ps(g_XMPi, t0); - t0 = _mm_and_ps(nonnegative, t0); - t1 = _mm_andnot_ps(nonnegative, t1); - t0 = _mm_or_ps(t0, t1); + t0 = _mm_and_ps(nonnegative, t0); + t1 = _mm_andnot_ps(nonnegative, t1); + t0 = _mm_or_ps(t0, t1); return t0; #endif } @@ -4951,131 +4422,120 @@ inline XMVECTOR XM_CALLCONV XMVectorATan(FXMVECTOR V) noexcept // 17-degree minimax approximation #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - atanf(V.vector4_f32[0]), - atanf(V.vector4_f32[1]), - atanf(V.vector4_f32[2]), - atanf(V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { atanf(V.vector4_f32[0]), atanf(V.vector4_f32[1]), atanf(V.vector4_f32[2]), atanf(V.vector4_f32[3]) } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) float32x4_t absV = vabsq_f32(V); float32x4_t invV = XMVectorReciprocal(V); - uint32x4_t comp = vcgtq_f32(V, g_XMOne); + uint32x4_t comp = vcgtq_f32(V, g_XMOne); float32x4_t sign = vbslq_f32(comp, g_XMOne, g_XMNegativeOne); - comp = vcleq_f32(absV, g_XMOne); - sign = vbslq_f32(comp, g_XMZero, sign); - float32x4_t x = vbslq_f32(comp, V, invV); + comp = vcleq_f32(absV, g_XMOne); + sign = vbslq_f32(comp, g_XMZero, sign); + float32x4_t x = vbslq_f32(comp, V, invV); float32x4_t x2 = vmulq_f32(x, x); // Compute polynomial approximation - const XMVECTOR TC1 = g_XMATanCoefficients1; - XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(TC1), 0); - XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_high_f32(TC1), 1); + const XMVECTOR TC1 = g_XMATanCoefficients1; + XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(TC1), 0); + XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_high_f32(TC1), 1); vConstants = vdupq_lane_f32(vget_low_f32(TC1), 1); - Result = vmlaq_f32(vConstants, Result, x2); + Result = vmlaq_f32(vConstants, Result, x2); vConstants = vdupq_lane_f32(vget_low_f32(TC1), 0); - Result = vmlaq_f32(vConstants, Result, x2); + Result = vmlaq_f32(vConstants, Result, x2); const XMVECTOR TC0 = g_XMATanCoefficients0; - vConstants = vdupq_lane_f32(vget_high_f32(TC0), 1); - Result = vmlaq_f32(vConstants, Result, x2); + vConstants = vdupq_lane_f32(vget_high_f32(TC0), 1); + Result = vmlaq_f32(vConstants, Result, x2); vConstants = vdupq_lane_f32(vget_high_f32(TC0), 0); - Result = vmlaq_f32(vConstants, Result, x2); + Result = vmlaq_f32(vConstants, Result, x2); vConstants = vdupq_lane_f32(vget_low_f32(TC0), 1); - Result = vmlaq_f32(vConstants, Result, x2); + Result = vmlaq_f32(vConstants, Result, x2); vConstants = vdupq_lane_f32(vget_low_f32(TC0), 0); - Result = vmlaq_f32(vConstants, Result, x2); + Result = vmlaq_f32(vConstants, Result, x2); Result = vmlaq_f32(g_XMOne, Result, x2); Result = vmulq_f32(Result, x); float32x4_t result1 = vmulq_f32(sign, g_XMHalfPi); - result1 = vsubq_f32(result1, Result); + result1 = vsubq_f32(result1, Result); - comp = vceqq_f32(sign, g_XMZero); + comp = vceqq_f32(sign, g_XMZero); Result = vbslq_f32(comp, Result, result1); return Result; #elif defined(_XM_SVML_INTRINSICS_) XMVECTOR Result = _mm_atan_ps(V); return Result; #elif defined(_XM_SSE_INTRINSICS_) - __m128 absV = XMVectorAbs(V); - __m128 invV = _mm_div_ps(g_XMOne, V); - __m128 comp = _mm_cmpgt_ps(V, g_XMOne); + __m128 absV = XMVectorAbs(V); + __m128 invV = _mm_div_ps(g_XMOne, V); + __m128 comp = _mm_cmpgt_ps(V, g_XMOne); __m128 select0 = _mm_and_ps(comp, g_XMOne); __m128 select1 = _mm_andnot_ps(comp, g_XMNegativeOne); - __m128 sign = _mm_or_ps(select0, select1); - comp = _mm_cmple_ps(absV, g_XMOne); - select0 = _mm_and_ps(comp, g_XMZero); - select1 = _mm_andnot_ps(comp, sign); - sign = _mm_or_ps(select0, select1); - select0 = _mm_and_ps(comp, V); - select1 = _mm_andnot_ps(comp, invV); - __m128 x = _mm_or_ps(select0, select1); + __m128 sign = _mm_or_ps(select0, select1); + comp = _mm_cmple_ps(absV, g_XMOne); + select0 = _mm_and_ps(comp, g_XMZero); + select1 = _mm_andnot_ps(comp, sign); + sign = _mm_or_ps(select0, select1); + select0 = _mm_and_ps(comp, V); + select1 = _mm_andnot_ps(comp, invV); + __m128 x = _mm_or_ps(select0, select1); __m128 x2 = _mm_mul_ps(x, x); // Compute polynomial approximation - const XMVECTOR TC1 = g_XMATanCoefficients1; - __m128 vConstantsB = XM_PERMUTE_PS(TC1, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 vConstants = XM_PERMUTE_PS(TC1, _MM_SHUFFLE(2, 2, 2, 2)); - __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); + const XMVECTOR TC1 = g_XMATanCoefficients1; + __m128 vConstantsB = XM_PERMUTE_PS(TC1, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 vConstants = XM_PERMUTE_PS(TC1, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); vConstants = XM_PERMUTE_PS(TC1, _MM_SHUFFLE(1, 1, 1, 1)); - Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, vConstants); vConstants = XM_PERMUTE_PS(TC1, _MM_SHUFFLE(0, 0, 0, 0)); - Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, vConstants); const XMVECTOR TC0 = g_XMATanCoefficients0; - vConstants = XM_PERMUTE_PS(TC0, _MM_SHUFFLE(3, 3, 3, 3)); - Result = XM_FMADD_PS(Result, x2, vConstants); + vConstants = XM_PERMUTE_PS(TC0, _MM_SHUFFLE(3, 3, 3, 3)); + Result = XM_FMADD_PS(Result, x2, vConstants); vConstants = XM_PERMUTE_PS(TC0, _MM_SHUFFLE(2, 2, 2, 2)); - Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, vConstants); vConstants = XM_PERMUTE_PS(TC0, _MM_SHUFFLE(1, 1, 1, 1)); - Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, vConstants); vConstants = XM_PERMUTE_PS(TC0, _MM_SHUFFLE(0, 0, 0, 0)); - Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, vConstants); Result = XM_FMADD_PS(Result, x2, g_XMOne); - Result = _mm_mul_ps(Result, x); + Result = _mm_mul_ps(Result, x); __m128 result1 = _mm_mul_ps(sign, g_XMHalfPi); - result1 = _mm_sub_ps(result1, Result); + result1 = _mm_sub_ps(result1, Result); - comp = _mm_cmpeq_ps(sign, g_XMZero); + comp = _mm_cmpeq_ps(sign, g_XMZero); select0 = _mm_and_ps(comp, Result); select1 = _mm_andnot_ps(comp, result1); - Result = _mm_or_ps(select0, select1); + Result = _mm_or_ps(select0, select1); return Result; #endif } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorATan2 -( - FXMVECTOR Y, - FXMVECTOR X -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorATan2(FXMVECTOR Y, FXMVECTOR X) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - atan2f(Y.vector4_f32[0], X.vector4_f32[0]), - atan2f(Y.vector4_f32[1], X.vector4_f32[1]), - atan2f(Y.vector4_f32[2], X.vector4_f32[2]), - atan2f(Y.vector4_f32[3], X.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { atan2f(Y.vector4_f32[0], X.vector4_f32[0]), + atan2f(Y.vector4_f32[1], X.vector4_f32[1]), + atan2f(Y.vector4_f32[2], X.vector4_f32[2]), + atan2f(Y.vector4_f32[3], X.vector4_f32[3]) } } }; return Result.v; #elif defined(_XM_SVML_INTRINSICS_) XMVECTOR Result = _mm_atan2_ps(Y, X); @@ -5096,32 +4556,32 @@ inline XMVECTOR XM_CALLCONV XMVectorATan2 static const XMVECTORF32 ATan2Constants = { { { XM_PI, XM_PIDIV2, XM_PIDIV4, XM_PI * 3.0f / 4.0f } } }; - XMVECTOR Zero = XMVectorZero(); + XMVECTOR Zero = XMVectorZero(); XMVECTOR ATanResultValid = XMVectorTrueInt(); - XMVECTOR Pi = XMVectorSplatX(ATan2Constants); - XMVECTOR PiOverTwo = XMVectorSplatY(ATan2Constants); - XMVECTOR PiOverFour = XMVectorSplatZ(ATan2Constants); + XMVECTOR Pi = XMVectorSplatX(ATan2Constants); + XMVECTOR PiOverTwo = XMVectorSplatY(ATan2Constants); + XMVECTOR PiOverFour = XMVectorSplatZ(ATan2Constants); XMVECTOR ThreePiOverFour = XMVectorSplatW(ATan2Constants); - XMVECTOR YEqualsZero = XMVectorEqual(Y, Zero); - XMVECTOR XEqualsZero = XMVectorEqual(X, Zero); - XMVECTOR XIsPositive = XMVectorAndInt(X, g_XMNegativeZero.v); - XIsPositive = XMVectorEqualInt(XIsPositive, Zero); + XMVECTOR YEqualsZero = XMVectorEqual(Y, Zero); + XMVECTOR XEqualsZero = XMVectorEqual(X, Zero); + XMVECTOR XIsPositive = XMVectorAndInt(X, g_XMNegativeZero.v); + XIsPositive = XMVectorEqualInt(XIsPositive, Zero); XMVECTOR YEqualsInfinity = XMVectorIsInfinite(Y); XMVECTOR XEqualsInfinity = XMVectorIsInfinite(X); - XMVECTOR YSign = XMVectorAndInt(Y, g_XMNegativeZero.v); - Pi = XMVectorOrInt(Pi, YSign); - PiOverTwo = XMVectorOrInt(PiOverTwo, YSign); - PiOverFour = XMVectorOrInt(PiOverFour, YSign); + XMVECTOR YSign = XMVectorAndInt(Y, g_XMNegativeZero.v); + Pi = XMVectorOrInt(Pi, YSign); + PiOverTwo = XMVectorOrInt(PiOverTwo, YSign); + PiOverFour = XMVectorOrInt(PiOverFour, YSign); ThreePiOverFour = XMVectorOrInt(ThreePiOverFour, YSign); - XMVECTOR R1 = XMVectorSelect(Pi, YSign, XIsPositive); - XMVECTOR R2 = XMVectorSelect(ATanResultValid, PiOverTwo, XEqualsZero); - XMVECTOR R3 = XMVectorSelect(R2, R1, YEqualsZero); - XMVECTOR R4 = XMVectorSelect(ThreePiOverFour, PiOverFour, XIsPositive); - XMVECTOR R5 = XMVectorSelect(PiOverTwo, R4, XEqualsInfinity); + XMVECTOR R1 = XMVectorSelect(Pi, YSign, XIsPositive); + XMVECTOR R2 = XMVectorSelect(ATanResultValid, PiOverTwo, XEqualsZero); + XMVECTOR R3 = XMVectorSelect(R2, R1, YEqualsZero); + XMVECTOR R4 = XMVectorSelect(ThreePiOverFour, PiOverFour, XIsPositive); + XMVECTOR R5 = XMVectorSelect(PiOverTwo, R4, XEqualsInfinity); XMVECTOR Result = XMVectorSelect(R3, R5, YEqualsInfinity); ATanResultValid = XMVectorEqualInt(Result, ATanResultValid); @@ -5144,34 +4604,29 @@ inline XMVECTOR XM_CALLCONV XMVectorSinEst(FXMVECTOR V) noexcept // 7-degree minimax approximation #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - sinf(V.vector4_f32[0]), - sinf(V.vector4_f32[1]), - sinf(V.vector4_f32[2]), - sinf(V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { sinf(V.vector4_f32[0]), sinf(V.vector4_f32[1]), sinf(V.vector4_f32[2]), sinf(V.vector4_f32[3]) } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) // Force the value within the bounds of pi XMVECTOR x = XMVectorModAngles(V); // Map in [-pi/2,pi/2] with sin(y) = sin(x). - uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), g_XMNegativeZero); - uint32x4_t c = vorrq_u32(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 + uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), g_XMNegativeZero); + uint32x4_t c = vorrq_u32(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 float32x4_t absx = vabsq_f32(x); float32x4_t rflx = vsubq_f32(vreinterpretq_f32_u32(c), x); - uint32x4_t comp = vcleq_f32(absx, g_XMHalfPi); - x = vbslq_f32(comp, x, rflx); + uint32x4_t comp = vcleq_f32(absx, g_XMHalfPi); + x = vbslq_f32(comp, x, rflx); float32x4_t x2 = vmulq_f32(x, x); // Compute polynomial approximation - const XMVECTOR SEC = g_XMSinCoefficients1; - XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(SEC), 0); - XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_high_f32(SEC), 1); + const XMVECTOR SEC = g_XMSinCoefficients1; + XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(SEC), 0); + XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_high_f32(SEC), 1); vConstants = vdupq_lane_f32(vget_low_f32(SEC), 1); - Result = vmlaq_f32(vConstants, Result, x2); + Result = vmlaq_f32(vConstants, Result, x2); Result = vmlaq_f32(g_XMOne, Result, x2); Result = vmulq_f32(Result, x); @@ -5184,27 +4639,27 @@ inline XMVECTOR XM_CALLCONV XMVectorSinEst(FXMVECTOR V) noexcept XMVECTOR x = XMVectorModAngles(V); // Map in [-pi/2,pi/2] with sin(y) = sin(x). - __m128 sign = _mm_and_ps(x, g_XMNegativeZero); - __m128 c = _mm_or_ps(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 - __m128 absx = _mm_andnot_ps(sign, x); // |x| - __m128 rflx = _mm_sub_ps(c, x); - __m128 comp = _mm_cmple_ps(absx, g_XMHalfPi); + __m128 sign = _mm_and_ps(x, g_XMNegativeZero); + __m128 c = _mm_or_ps(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 + __m128 absx = _mm_andnot_ps(sign, x); // |x| + __m128 rflx = _mm_sub_ps(c, x); + __m128 comp = _mm_cmple_ps(absx, g_XMHalfPi); __m128 select0 = _mm_and_ps(comp, x); __m128 select1 = _mm_andnot_ps(comp, rflx); - x = _mm_or_ps(select0, select1); + x = _mm_or_ps(select0, select1); __m128 x2 = _mm_mul_ps(x, x); // Compute polynomial approximation - const XMVECTOR SEC = g_XMSinCoefficients1; - __m128 vConstantsB = XM_PERMUTE_PS(SEC, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 vConstants = XM_PERMUTE_PS(SEC, _MM_SHUFFLE(2, 2, 2, 2)); - __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); + const XMVECTOR SEC = g_XMSinCoefficients1; + __m128 vConstantsB = XM_PERMUTE_PS(SEC, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 vConstants = XM_PERMUTE_PS(SEC, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); vConstants = XM_PERMUTE_PS(SEC, _MM_SHUFFLE(1, 1, 1, 1)); - Result = XM_FMADD_PS(Result, x2, vConstants); - Result = XM_FMADD_PS(Result, x2, g_XMOne); - Result = _mm_mul_ps(Result, x); + Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, g_XMOne); + Result = _mm_mul_ps(Result, x); return Result; #endif } @@ -5216,35 +4671,30 @@ inline XMVECTOR XM_CALLCONV XMVectorCosEst(FXMVECTOR V) noexcept // 6-degree minimax approximation #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - cosf(V.vector4_f32[0]), - cosf(V.vector4_f32[1]), - cosf(V.vector4_f32[2]), - cosf(V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { cosf(V.vector4_f32[0]), cosf(V.vector4_f32[1]), cosf(V.vector4_f32[2]), cosf(V.vector4_f32[3]) } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) // Map V to x in [-pi,pi]. XMVECTOR x = XMVectorModAngles(V); // Map in [-pi/2,pi/2] with cos(y) = sign*cos(x). - uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), g_XMNegativeZero); - uint32x4_t c = vorrq_u32(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 - float32x4_t absx = vabsq_f32(x); - float32x4_t rflx = vsubq_f32(vreinterpretq_f32_u32(c), x); - uint32x4_t comp = vcleq_f32(absx, g_XMHalfPi); - x = vbslq_f32(comp, x, rflx); + uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), g_XMNegativeZero); + uint32x4_t c = vorrq_u32(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 + float32x4_t absx = vabsq_f32(x); + float32x4_t rflx = vsubq_f32(vreinterpretq_f32_u32(c), x); + uint32x4_t comp = vcleq_f32(absx, g_XMHalfPi); + x = vbslq_f32(comp, x, rflx); float32x4_t fsign = vbslq_f32(comp, g_XMOne, g_XMNegativeOne); float32x4_t x2 = vmulq_f32(x, x); // Compute polynomial approximation - const XMVECTOR CEC = g_XMCosCoefficients1; - XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(CEC), 0); - XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_high_f32(CEC), 1); + const XMVECTOR CEC = g_XMCosCoefficients1; + XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(CEC), 0); + XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_high_f32(CEC), 1); vConstants = vdupq_lane_f32(vget_low_f32(CEC), 1); - Result = vmlaq_f32(vConstants, Result, x2); + Result = vmlaq_f32(vConstants, Result, x2); Result = vmlaq_f32(g_XMOne, Result, x2); Result = vmulq_f32(Result, fsign); @@ -5257,43 +4707,37 @@ inline XMVECTOR XM_CALLCONV XMVectorCosEst(FXMVECTOR V) noexcept XMVECTOR x = XMVectorModAngles(V); // Map in [-pi/2,pi/2] with cos(y) = sign*cos(x). - XMVECTOR sign = _mm_and_ps(x, g_XMNegativeZero); - __m128 c = _mm_or_ps(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 - __m128 absx = _mm_andnot_ps(sign, x); // |x| - __m128 rflx = _mm_sub_ps(c, x); - __m128 comp = _mm_cmple_ps(absx, g_XMHalfPi); - __m128 select0 = _mm_and_ps(comp, x); - __m128 select1 = _mm_andnot_ps(comp, rflx); - x = _mm_or_ps(select0, select1); - select0 = _mm_and_ps(comp, g_XMOne); - select1 = _mm_andnot_ps(comp, g_XMNegativeOne); - sign = _mm_or_ps(select0, select1); + XMVECTOR sign = _mm_and_ps(x, g_XMNegativeZero); + __m128 c = _mm_or_ps(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 + __m128 absx = _mm_andnot_ps(sign, x); // |x| + __m128 rflx = _mm_sub_ps(c, x); + __m128 comp = _mm_cmple_ps(absx, g_XMHalfPi); + __m128 select0 = _mm_and_ps(comp, x); + __m128 select1 = _mm_andnot_ps(comp, rflx); + x = _mm_or_ps(select0, select1); + select0 = _mm_and_ps(comp, g_XMOne); + select1 = _mm_andnot_ps(comp, g_XMNegativeOne); + sign = _mm_or_ps(select0, select1); __m128 x2 = _mm_mul_ps(x, x); // Compute polynomial approximation - const XMVECTOR CEC = g_XMCosCoefficients1; - __m128 vConstantsB = XM_PERMUTE_PS(CEC, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 vConstants = XM_PERMUTE_PS(CEC, _MM_SHUFFLE(2, 2, 2, 2)); - __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); + const XMVECTOR CEC = g_XMCosCoefficients1; + __m128 vConstantsB = XM_PERMUTE_PS(CEC, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 vConstants = XM_PERMUTE_PS(CEC, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); vConstants = XM_PERMUTE_PS(CEC, _MM_SHUFFLE(1, 1, 1, 1)); - Result = XM_FMADD_PS(Result, x2, vConstants); - Result = XM_FMADD_PS(Result, x2, g_XMOne); - Result = _mm_mul_ps(Result, sign); + Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, g_XMOne); + Result = _mm_mul_ps(Result, sign); return Result; #endif } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMVectorSinCosEst -( - XMVECTOR* pSin, - XMVECTOR* pCos, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMVectorSinCosEst(XMVECTOR* pSin, XMVECTOR* pCos, FXMVECTOR V) noexcept { assert(pSin != nullptr); assert(pCos != nullptr); @@ -5301,19 +4745,9 @@ inline void XM_CALLCONV XMVectorSinCosEst // 7/6-degree minimax approximation #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Sin = { { { - sinf(V.vector4_f32[0]), - sinf(V.vector4_f32[1]), - sinf(V.vector4_f32[2]), - sinf(V.vector4_f32[3]) - } } }; + XMVECTORF32 Sin = { { { sinf(V.vector4_f32[0]), sinf(V.vector4_f32[1]), sinf(V.vector4_f32[2]), sinf(V.vector4_f32[3]) } } }; - XMVECTORF32 Cos = { { { - cosf(V.vector4_f32[0]), - cosf(V.vector4_f32[1]), - cosf(V.vector4_f32[2]), - cosf(V.vector4_f32[3]) - } } }; + XMVECTORF32 Cos = { { { cosf(V.vector4_f32[0]), cosf(V.vector4_f32[1]), cosf(V.vector4_f32[2]), cosf(V.vector4_f32[3]) } } }; *pSin = Sin.v; *pCos = Cos.v; @@ -5322,79 +4756,79 @@ inline void XM_CALLCONV XMVectorSinCosEst XMVECTOR x = XMVectorModAngles(V); // Map in [-pi/2,pi/2] with cos(y) = sign*cos(x). - uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), g_XMNegativeZero); - uint32x4_t c = vorrq_u32(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 - float32x4_t absx = vabsq_f32(x); - float32x4_t rflx = vsubq_f32(vreinterpretq_f32_u32(c), x); - uint32x4_t comp = vcleq_f32(absx, g_XMHalfPi); - x = vbslq_f32(comp, x, rflx); + uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), g_XMNegativeZero); + uint32x4_t c = vorrq_u32(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 + float32x4_t absx = vabsq_f32(x); + float32x4_t rflx = vsubq_f32(vreinterpretq_f32_u32(c), x); + uint32x4_t comp = vcleq_f32(absx, g_XMHalfPi); + x = vbslq_f32(comp, x, rflx); float32x4_t fsign = vbslq_f32(comp, g_XMOne, g_XMNegativeOne); float32x4_t x2 = vmulq_f32(x, x); // Compute polynomial approximation for sine - const XMVECTOR SEC = g_XMSinCoefficients1; - XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(SEC), 0); - XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_high_f32(SEC), 1); + const XMVECTOR SEC = g_XMSinCoefficients1; + XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(SEC), 0); + XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_high_f32(SEC), 1); vConstants = vdupq_lane_f32(vget_low_f32(SEC), 1); - Result = vmlaq_f32(vConstants, Result, x2); + Result = vmlaq_f32(vConstants, Result, x2); Result = vmlaq_f32(g_XMOne, Result, x2); - *pSin = vmulq_f32(Result, x); + *pSin = vmulq_f32(Result, x); // Compute polynomial approximation const XMVECTOR CEC = g_XMCosCoefficients1; - vConstants = vdupq_lane_f32(vget_high_f32(CEC), 0); - Result = vmlaq_lane_f32(vConstants, x2, vget_high_f32(CEC), 1); + vConstants = vdupq_lane_f32(vget_high_f32(CEC), 0); + Result = vmlaq_lane_f32(vConstants, x2, vget_high_f32(CEC), 1); vConstants = vdupq_lane_f32(vget_low_f32(CEC), 1); - Result = vmlaq_f32(vConstants, Result, x2); + Result = vmlaq_f32(vConstants, Result, x2); Result = vmlaq_f32(g_XMOne, Result, x2); - *pCos = vmulq_f32(Result, fsign); + *pCos = vmulq_f32(Result, fsign); #elif defined(_XM_SSE_INTRINSICS_) // Force the value within the bounds of pi XMVECTOR x = XMVectorModAngles(V); // Map in [-pi/2,pi/2] with sin(y) = sin(x), cos(y) = sign*cos(x). - XMVECTOR sign = _mm_and_ps(x, g_XMNegativeZero); - __m128 c = _mm_or_ps(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 - __m128 absx = _mm_andnot_ps(sign, x); // |x| - __m128 rflx = _mm_sub_ps(c, x); - __m128 comp = _mm_cmple_ps(absx, g_XMHalfPi); - __m128 select0 = _mm_and_ps(comp, x); - __m128 select1 = _mm_andnot_ps(comp, rflx); - x = _mm_or_ps(select0, select1); - select0 = _mm_and_ps(comp, g_XMOne); - select1 = _mm_andnot_ps(comp, g_XMNegativeOne); - sign = _mm_or_ps(select0, select1); + XMVECTOR sign = _mm_and_ps(x, g_XMNegativeZero); + __m128 c = _mm_or_ps(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 + __m128 absx = _mm_andnot_ps(sign, x); // |x| + __m128 rflx = _mm_sub_ps(c, x); + __m128 comp = _mm_cmple_ps(absx, g_XMHalfPi); + __m128 select0 = _mm_and_ps(comp, x); + __m128 select1 = _mm_andnot_ps(comp, rflx); + x = _mm_or_ps(select0, select1); + select0 = _mm_and_ps(comp, g_XMOne); + select1 = _mm_andnot_ps(comp, g_XMNegativeOne); + sign = _mm_or_ps(select0, select1); __m128 x2 = _mm_mul_ps(x, x); // Compute polynomial approximation for sine - const XMVECTOR SEC = g_XMSinCoefficients1; - __m128 vConstantsB = XM_PERMUTE_PS(SEC, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 vConstants = XM_PERMUTE_PS(SEC, _MM_SHUFFLE(2, 2, 2, 2)); - __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); + const XMVECTOR SEC = g_XMSinCoefficients1; + __m128 vConstantsB = XM_PERMUTE_PS(SEC, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 vConstants = XM_PERMUTE_PS(SEC, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); vConstants = XM_PERMUTE_PS(SEC, _MM_SHUFFLE(1, 1, 1, 1)); - Result = XM_FMADD_PS(Result, x2, vConstants); - Result = XM_FMADD_PS(Result, x2, g_XMOne); - Result = _mm_mul_ps(Result, x); - *pSin = Result; + Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, g_XMOne); + Result = _mm_mul_ps(Result, x); + *pSin = Result; // Compute polynomial approximation for cosine const XMVECTOR CEC = g_XMCosCoefficients1; - vConstantsB = XM_PERMUTE_PS(CEC, _MM_SHUFFLE(3, 3, 3, 3)); - vConstants = XM_PERMUTE_PS(CEC, _MM_SHUFFLE(2, 2, 2, 2)); - Result = XM_FMADD_PS(vConstantsB, x2, vConstants); + vConstantsB = XM_PERMUTE_PS(CEC, _MM_SHUFFLE(3, 3, 3, 3)); + vConstants = XM_PERMUTE_PS(CEC, _MM_SHUFFLE(2, 2, 2, 2)); + Result = XM_FMADD_PS(vConstantsB, x2, vConstants); vConstants = XM_PERMUTE_PS(CEC, _MM_SHUFFLE(1, 1, 1, 1)); - Result = XM_FMADD_PS(Result, x2, vConstants); - Result = XM_FMADD_PS(Result, x2, g_XMOne); - Result = _mm_mul_ps(Result, sign); - *pCos = Result; + Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, g_XMOne); + Result = _mm_mul_ps(Result, sign); + *pCos = Result; #endif } @@ -5403,12 +4837,7 @@ inline void XM_CALLCONV XMVectorSinCosEst inline XMVECTOR XM_CALLCONV XMVectorTanEst(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - tanf(V.vector4_f32[0]), - tanf(V.vector4_f32[1]), - tanf(V.vector4_f32[2]), - tanf(V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { tanf(V.vector4_f32[0]), tanf(V.vector4_f32[1]), tanf(V.vector4_f32[2]), tanf(V.vector4_f32[3]) } } }; return Result.v; #elif defined(_XM_SVML_INTRINSICS_) XMVECTOR Result = _mm_tan_ps(V); @@ -5418,7 +4847,7 @@ inline XMVECTOR XM_CALLCONV XMVectorTanEst(FXMVECTOR V) noexcept XMVECTOR OneOverPi = XMVectorSplatW(g_XMTanEstCoefficients.v); XMVECTOR V1 = XMVectorMultiply(V, OneOverPi); - V1 = XMVectorRound(V1); + V1 = XMVectorRound(V1); V1 = XMVectorNegativeMultiplySubtract(g_XMPi.v, V1, V); @@ -5427,7 +4856,7 @@ inline XMVECTOR XM_CALLCONV XMVectorTanEst(FXMVECTOR V) noexcept XMVECTOR T2 = XMVectorSplatZ(g_XMTanEstCoefficients.v); XMVECTOR V2T2 = XMVectorNegativeMultiplySubtract(V1, V1, T2); - XMVECTOR V2 = XMVectorMultiply(V1, V1); + XMVECTOR V2 = XMVectorMultiply(V1, V1); XMVECTOR V1T0 = XMVectorMultiply(V1, T0); XMVECTOR V1T1 = XMVectorMultiply(V1, T1); @@ -5453,61 +4882,61 @@ inline XMVECTOR XM_CALLCONV XMVectorASinEst(FXMVECTOR V) noexcept Result.f[3] = asinf(V.vector4_f32[3]); return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t nonnegative = vcgeq_f32(V, g_XMZero); - float32x4_t x = vabsq_f32(V); + uint32x4_t nonnegative = vcgeq_f32(V, g_XMZero); + float32x4_t x = vabsq_f32(V); // Compute (1-|V|), clamp to zero to avoid sqrt of negative number. - float32x4_t oneMValue = vsubq_f32(g_XMOne, x); + float32x4_t oneMValue = vsubq_f32(g_XMOne, x); float32x4_t clampOneMValue = vmaxq_f32(g_XMZero, oneMValue); - float32x4_t root = XMVectorSqrt(clampOneMValue); + float32x4_t root = XMVectorSqrt(clampOneMValue); // Compute polynomial approximation - const XMVECTOR AEC = g_XMArcEstCoefficients; - XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(AEC), 0); - XMVECTOR t0 = vmlaq_lane_f32(vConstants, x, vget_high_f32(AEC), 1); + const XMVECTOR AEC = g_XMArcEstCoefficients; + XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(AEC), 0); + XMVECTOR t0 = vmlaq_lane_f32(vConstants, x, vget_high_f32(AEC), 1); vConstants = vdupq_lane_f32(vget_low_f32(AEC), 1); - t0 = vmlaq_f32(vConstants, t0, x); + t0 = vmlaq_f32(vConstants, t0, x); vConstants = vdupq_lane_f32(vget_low_f32(AEC), 0); - t0 = vmlaq_f32(vConstants, t0, x); - t0 = vmulq_f32(t0, root); + t0 = vmlaq_f32(vConstants, t0, x); + t0 = vmulq_f32(t0, root); float32x4_t t1 = vsubq_f32(g_XMPi, t0); - t0 = vbslq_f32(nonnegative, t0, t1); - t0 = vsubq_f32(g_XMHalfPi, t0); + t0 = vbslq_f32(nonnegative, t0, t1); + t0 = vsubq_f32(g_XMHalfPi, t0); return t0; #elif defined(_XM_SVML_INTRINSICS_) XMVECTOR Result = _mm_asin_ps(V); return Result; #elif defined(_XM_SSE_INTRINSICS_) __m128 nonnegative = _mm_cmpge_ps(V, g_XMZero); - __m128 mvalue = _mm_sub_ps(g_XMZero, V); - __m128 x = _mm_max_ps(V, mvalue); // |V| + __m128 mvalue = _mm_sub_ps(g_XMZero, V); + __m128 x = _mm_max_ps(V, mvalue); // |V| // Compute (1-|V|), clamp to zero to avoid sqrt of negative number. - __m128 oneMValue = _mm_sub_ps(g_XMOne, x); + __m128 oneMValue = _mm_sub_ps(g_XMOne, x); __m128 clampOneMValue = _mm_max_ps(g_XMZero, oneMValue); - __m128 root = _mm_sqrt_ps(clampOneMValue); // sqrt(1-|V|) + __m128 root = _mm_sqrt_ps(clampOneMValue); // sqrt(1-|V|) // Compute polynomial approximation - const XMVECTOR AEC = g_XMArcEstCoefficients; - __m128 vConstantsB = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(2, 2, 2, 2)); - __m128 t0 = XM_FMADD_PS(vConstantsB, x, vConstants); + const XMVECTOR AEC = g_XMArcEstCoefficients; + __m128 vConstantsB = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 t0 = XM_FMADD_PS(vConstantsB, x, vConstants); vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(1, 1, 1, 1)); - t0 = XM_FMADD_PS(t0, x, vConstants); + t0 = XM_FMADD_PS(t0, x, vConstants); vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(0, 0, 0, 0)); - t0 = XM_FMADD_PS(t0, x, vConstants); - t0 = _mm_mul_ps(t0, root); + t0 = XM_FMADD_PS(t0, x, vConstants); + t0 = _mm_mul_ps(t0, root); __m128 t1 = _mm_sub_ps(g_XMPi, t0); - t0 = _mm_and_ps(nonnegative, t0); - t1 = _mm_andnot_ps(nonnegative, t1); - t0 = _mm_or_ps(t0, t1); - t0 = _mm_sub_ps(g_XMHalfPi, t0); + t0 = _mm_and_ps(nonnegative, t0); + t1 = _mm_andnot_ps(nonnegative, t1); + t0 = _mm_or_ps(t0, t1); + t0 = _mm_sub_ps(g_XMHalfPi, t0); return t0; #endif } @@ -5519,67 +4948,62 @@ inline XMVECTOR XM_CALLCONV XMVectorACosEst(FXMVECTOR V) noexcept // 3-degree minimax approximation #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - acosf(V.vector4_f32[0]), - acosf(V.vector4_f32[1]), - acosf(V.vector4_f32[2]), - acosf(V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { acosf(V.vector4_f32[0]), acosf(V.vector4_f32[1]), acosf(V.vector4_f32[2]), acosf(V.vector4_f32[3]) } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t nonnegative = vcgeq_f32(V, g_XMZero); - float32x4_t x = vabsq_f32(V); + uint32x4_t nonnegative = vcgeq_f32(V, g_XMZero); + float32x4_t x = vabsq_f32(V); // Compute (1-|V|), clamp to zero to avoid sqrt of negative number. - float32x4_t oneMValue = vsubq_f32(g_XMOne, x); + float32x4_t oneMValue = vsubq_f32(g_XMOne, x); float32x4_t clampOneMValue = vmaxq_f32(g_XMZero, oneMValue); - float32x4_t root = XMVectorSqrt(clampOneMValue); + float32x4_t root = XMVectorSqrt(clampOneMValue); // Compute polynomial approximation - const XMVECTOR AEC = g_XMArcEstCoefficients; - XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(AEC), 0); - XMVECTOR t0 = vmlaq_lane_f32(vConstants, x, vget_high_f32(AEC), 1); + const XMVECTOR AEC = g_XMArcEstCoefficients; + XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(AEC), 0); + XMVECTOR t0 = vmlaq_lane_f32(vConstants, x, vget_high_f32(AEC), 1); vConstants = vdupq_lane_f32(vget_low_f32(AEC), 1); - t0 = vmlaq_f32(vConstants, t0, x); + t0 = vmlaq_f32(vConstants, t0, x); vConstants = vdupq_lane_f32(vget_low_f32(AEC), 0); - t0 = vmlaq_f32(vConstants, t0, x); - t0 = vmulq_f32(t0, root); + t0 = vmlaq_f32(vConstants, t0, x); + t0 = vmulq_f32(t0, root); float32x4_t t1 = vsubq_f32(g_XMPi, t0); - t0 = vbslq_f32(nonnegative, t0, t1); + t0 = vbslq_f32(nonnegative, t0, t1); return t0; #elif defined(_XM_SVML_INTRINSICS_) XMVECTOR Result = _mm_acos_ps(V); return Result; #elif defined(_XM_SSE_INTRINSICS_) __m128 nonnegative = _mm_cmpge_ps(V, g_XMZero); - __m128 mvalue = _mm_sub_ps(g_XMZero, V); - __m128 x = _mm_max_ps(V, mvalue); // |V| + __m128 mvalue = _mm_sub_ps(g_XMZero, V); + __m128 x = _mm_max_ps(V, mvalue); // |V| // Compute (1-|V|), clamp to zero to avoid sqrt of negative number. - __m128 oneMValue = _mm_sub_ps(g_XMOne, x); + __m128 oneMValue = _mm_sub_ps(g_XMOne, x); __m128 clampOneMValue = _mm_max_ps(g_XMZero, oneMValue); - __m128 root = _mm_sqrt_ps(clampOneMValue); // sqrt(1-|V|) + __m128 root = _mm_sqrt_ps(clampOneMValue); // sqrt(1-|V|) // Compute polynomial approximation - const XMVECTOR AEC = g_XMArcEstCoefficients; - __m128 vConstantsB = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(2, 2, 2, 2)); - __m128 t0 = XM_FMADD_PS(vConstantsB, x, vConstants); + const XMVECTOR AEC = g_XMArcEstCoefficients; + __m128 vConstantsB = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 t0 = XM_FMADD_PS(vConstantsB, x, vConstants); vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(1, 1, 1, 1)); - t0 = XM_FMADD_PS(t0, x, vConstants); + t0 = XM_FMADD_PS(t0, x, vConstants); vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(0, 0, 0, 0)); - t0 = XM_FMADD_PS(t0, x, vConstants); - t0 = _mm_mul_ps(t0, root); + t0 = XM_FMADD_PS(t0, x, vConstants); + t0 = _mm_mul_ps(t0, root); __m128 t1 = _mm_sub_ps(g_XMPi, t0); - t0 = _mm_and_ps(nonnegative, t0); - t1 = _mm_andnot_ps(nonnegative, t1); - t0 = _mm_or_ps(t0, t1); + t0 = _mm_and_ps(nonnegative, t0); + t1 = _mm_andnot_ps(nonnegative, t1); + t0 = _mm_or_ps(t0, t1); return t0; #endif } @@ -5591,105 +5015,96 @@ inline XMVECTOR XM_CALLCONV XMVectorATanEst(FXMVECTOR V) noexcept // 9-degree minimax approximation #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - atanf(V.vector4_f32[0]), - atanf(V.vector4_f32[1]), - atanf(V.vector4_f32[2]), - atanf(V.vector4_f32[3]) - } } }; + XMVECTORF32 Result = { { { atanf(V.vector4_f32[0]), atanf(V.vector4_f32[1]), atanf(V.vector4_f32[2]), atanf(V.vector4_f32[3]) } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) float32x4_t absV = vabsq_f32(V); float32x4_t invV = XMVectorReciprocalEst(V); - uint32x4_t comp = vcgtq_f32(V, g_XMOne); + uint32x4_t comp = vcgtq_f32(V, g_XMOne); float32x4_t sign = vbslq_f32(comp, g_XMOne, g_XMNegativeOne); - comp = vcleq_f32(absV, g_XMOne); - sign = vbslq_f32(comp, g_XMZero, sign); - float32x4_t x = vbslq_f32(comp, V, invV); + comp = vcleq_f32(absV, g_XMOne); + sign = vbslq_f32(comp, g_XMZero, sign); + float32x4_t x = vbslq_f32(comp, V, invV); float32x4_t x2 = vmulq_f32(x, x); // Compute polynomial approximation - const XMVECTOR AEC = g_XMATanEstCoefficients1; - XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(AEC), 0); - XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_high_f32(AEC), 1); + const XMVECTOR AEC = g_XMATanEstCoefficients1; + XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(AEC), 0); + XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_high_f32(AEC), 1); vConstants = vdupq_lane_f32(vget_low_f32(AEC), 1); - Result = vmlaq_f32(vConstants, Result, x2); + Result = vmlaq_f32(vConstants, Result, x2); vConstants = vdupq_lane_f32(vget_low_f32(AEC), 0); - Result = vmlaq_f32(vConstants, Result, x2); + Result = vmlaq_f32(vConstants, Result, x2); // ATanEstCoefficients0 is already splatted Result = vmlaq_f32(g_XMATanEstCoefficients0, Result, x2); Result = vmulq_f32(Result, x); float32x4_t result1 = vmulq_f32(sign, g_XMHalfPi); - result1 = vsubq_f32(result1, Result); + result1 = vsubq_f32(result1, Result); - comp = vceqq_f32(sign, g_XMZero); + comp = vceqq_f32(sign, g_XMZero); Result = vbslq_f32(comp, Result, result1); return Result; #elif defined(_XM_SVML_INTRINSICS_) XMVECTOR Result = _mm_atan_ps(V); return Result; #elif defined(_XM_SSE_INTRINSICS_) - __m128 absV = XMVectorAbs(V); - __m128 invV = _mm_div_ps(g_XMOne, V); - __m128 comp = _mm_cmpgt_ps(V, g_XMOne); + __m128 absV = XMVectorAbs(V); + __m128 invV = _mm_div_ps(g_XMOne, V); + __m128 comp = _mm_cmpgt_ps(V, g_XMOne); __m128 select0 = _mm_and_ps(comp, g_XMOne); __m128 select1 = _mm_andnot_ps(comp, g_XMNegativeOne); - __m128 sign = _mm_or_ps(select0, select1); - comp = _mm_cmple_ps(absV, g_XMOne); - select0 = _mm_and_ps(comp, g_XMZero); - select1 = _mm_andnot_ps(comp, sign); - sign = _mm_or_ps(select0, select1); - select0 = _mm_and_ps(comp, V); - select1 = _mm_andnot_ps(comp, invV); - __m128 x = _mm_or_ps(select0, select1); + __m128 sign = _mm_or_ps(select0, select1); + comp = _mm_cmple_ps(absV, g_XMOne); + select0 = _mm_and_ps(comp, g_XMZero); + select1 = _mm_andnot_ps(comp, sign); + sign = _mm_or_ps(select0, select1); + select0 = _mm_and_ps(comp, V); + select1 = _mm_andnot_ps(comp, invV); + __m128 x = _mm_or_ps(select0, select1); __m128 x2 = _mm_mul_ps(x, x); // Compute polynomial approximation - const XMVECTOR AEC = g_XMATanEstCoefficients1; - __m128 vConstantsB = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(2, 2, 2, 2)); - __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); + const XMVECTOR AEC = g_XMATanEstCoefficients1; + __m128 vConstantsB = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(1, 1, 1, 1)); - Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, vConstants); vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(0, 0, 0, 0)); - Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, vConstants); // ATanEstCoefficients0 is already splatted - Result = XM_FMADD_PS(Result, x2, g_XMATanEstCoefficients0); - Result = _mm_mul_ps(Result, x); + Result = XM_FMADD_PS(Result, x2, g_XMATanEstCoefficients0); + Result = _mm_mul_ps(Result, x); __m128 result1 = _mm_mul_ps(sign, g_XMHalfPi); - result1 = _mm_sub_ps(result1, Result); + result1 = _mm_sub_ps(result1, Result); - comp = _mm_cmpeq_ps(sign, g_XMZero); + comp = _mm_cmpeq_ps(sign, g_XMZero); select0 = _mm_and_ps(comp, Result); select1 = _mm_andnot_ps(comp, result1); - Result = _mm_or_ps(select0, select1); + Result = _mm_or_ps(select0, select1); return Result; #endif } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorATan2Est -( - FXMVECTOR Y, - FXMVECTOR X -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorATan2Est(FXMVECTOR Y, FXMVECTOR X) noexcept { #if defined(_XM_NO_INTRINSICS_) XMVECTORF32 Result = { { { - atan2f(Y.vector4_f32[0], X.vector4_f32[0]), - atan2f(Y.vector4_f32[1], X.vector4_f32[1]), - atan2f(Y.vector4_f32[2], X.vector4_f32[2]), - atan2f(Y.vector4_f32[3], X.vector4_f32[3]), - } } }; + atan2f(Y.vector4_f32[0], X.vector4_f32[0]), + atan2f(Y.vector4_f32[1], X.vector4_f32[1]), + atan2f(Y.vector4_f32[2], X.vector4_f32[2]), + atan2f(Y.vector4_f32[3], X.vector4_f32[3]), + } } }; return Result.v; #elif defined(_XM_SVML_INTRINSICS_) XMVECTOR Result = _mm_atan2_ps(Y, X); @@ -5698,38 +5113,38 @@ inline XMVECTOR XM_CALLCONV XMVectorATan2Est static const XMVECTORF32 ATan2Constants = { { { XM_PI, XM_PIDIV2, XM_PIDIV4, 2.3561944905f /* Pi*3/4 */ } } }; - const XMVECTOR Zero = XMVectorZero(); - XMVECTOR ATanResultValid = XMVectorTrueInt(); + const XMVECTOR Zero = XMVectorZero(); + XMVECTOR ATanResultValid = XMVectorTrueInt(); - XMVECTOR Pi = XMVectorSplatX(ATan2Constants); - XMVECTOR PiOverTwo = XMVectorSplatY(ATan2Constants); - XMVECTOR PiOverFour = XMVectorSplatZ(ATan2Constants); + XMVECTOR Pi = XMVectorSplatX(ATan2Constants); + XMVECTOR PiOverTwo = XMVectorSplatY(ATan2Constants); + XMVECTOR PiOverFour = XMVectorSplatZ(ATan2Constants); XMVECTOR ThreePiOverFour = XMVectorSplatW(ATan2Constants); - XMVECTOR YEqualsZero = XMVectorEqual(Y, Zero); - XMVECTOR XEqualsZero = XMVectorEqual(X, Zero); - XMVECTOR XIsPositive = XMVectorAndInt(X, g_XMNegativeZero.v); - XIsPositive = XMVectorEqualInt(XIsPositive, Zero); + XMVECTOR YEqualsZero = XMVectorEqual(Y, Zero); + XMVECTOR XEqualsZero = XMVectorEqual(X, Zero); + XMVECTOR XIsPositive = XMVectorAndInt(X, g_XMNegativeZero.v); + XIsPositive = XMVectorEqualInt(XIsPositive, Zero); XMVECTOR YEqualsInfinity = XMVectorIsInfinite(Y); XMVECTOR XEqualsInfinity = XMVectorIsInfinite(X); - XMVECTOR YSign = XMVectorAndInt(Y, g_XMNegativeZero.v); - Pi = XMVectorOrInt(Pi, YSign); - PiOverTwo = XMVectorOrInt(PiOverTwo, YSign); - PiOverFour = XMVectorOrInt(PiOverFour, YSign); + XMVECTOR YSign = XMVectorAndInt(Y, g_XMNegativeZero.v); + Pi = XMVectorOrInt(Pi, YSign); + PiOverTwo = XMVectorOrInt(PiOverTwo, YSign); + PiOverFour = XMVectorOrInt(PiOverFour, YSign); ThreePiOverFour = XMVectorOrInt(ThreePiOverFour, YSign); - XMVECTOR R1 = XMVectorSelect(Pi, YSign, XIsPositive); - XMVECTOR R2 = XMVectorSelect(ATanResultValid, PiOverTwo, XEqualsZero); - XMVECTOR R3 = XMVectorSelect(R2, R1, YEqualsZero); - XMVECTOR R4 = XMVectorSelect(ThreePiOverFour, PiOverFour, XIsPositive); - XMVECTOR R5 = XMVectorSelect(PiOverTwo, R4, XEqualsInfinity); + XMVECTOR R1 = XMVectorSelect(Pi, YSign, XIsPositive); + XMVECTOR R2 = XMVectorSelect(ATanResultValid, PiOverTwo, XEqualsZero); + XMVECTOR R3 = XMVectorSelect(R2, R1, YEqualsZero); + XMVECTOR R4 = XMVectorSelect(ThreePiOverFour, PiOverFour, XIsPositive); + XMVECTOR R5 = XMVectorSelect(PiOverTwo, R4, XEqualsInfinity); XMVECTOR Result = XMVectorSelect(R3, R5, YEqualsInfinity); ATanResultValid = XMVectorEqualInt(Result, ATanResultValid); XMVECTOR Reciprocal = XMVectorReciprocalEst(X); - XMVECTOR V = XMVectorMultiply(Y, Reciprocal); - XMVECTOR R0 = XMVectorATanEst(V); + XMVECTOR V = XMVectorMultiply(Y, Reciprocal); + XMVECTOR R0 = XMVectorATanEst(V); R1 = XMVectorSelect(Pi, g_XMNegativeZero, XIsPositive); R2 = XMVectorAdd(R0, R1); @@ -5743,18 +5158,13 @@ inline XMVECTOR XM_CALLCONV XMVectorATan2Est //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorLerp -( - FXMVECTOR V0, - FXMVECTOR V1, - float t -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorLerp(FXMVECTOR V0, FXMVECTOR V1, float t) noexcept { // V0 + t * (V1 - V0) #if defined(_XM_NO_INTRINSICS_) - XMVECTOR Scale = XMVectorReplicate(t); + XMVECTOR Scale = XMVectorReplicate(t); XMVECTOR Length = XMVectorSubtract(V1, V0); return XMVectorMultiplyAdd(Length, Scale, V0); @@ -5770,12 +5180,7 @@ inline XMVECTOR XM_CALLCONV XMVectorLerp //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorLerpV -( - FXMVECTOR V0, - FXMVECTOR V1, - FXMVECTOR T -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorLerpV(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR T) noexcept { // V0 + T * (V1 - V0) @@ -5795,14 +5200,8 @@ inline XMVECTOR XM_CALLCONV XMVectorLerpV //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorHermite -( - FXMVECTOR Position0, - FXMVECTOR Tangent0, - FXMVECTOR Position1, - GXMVECTOR Tangent1, - float t -) noexcept +inline XMVECTOR XM_CALLCONV +XMVectorHermite(FXMVECTOR Position0, FXMVECTOR Tangent0, FXMVECTOR Position1, GXMVECTOR Tangent1, float t) noexcept { // Result = (2 * t^3 - 3 * t^2 + 1) * Position0 + // (t^3 - 2 * t^2 + t) * Tangent0 + @@ -5820,9 +5219,9 @@ inline XMVECTOR XM_CALLCONV XMVectorHermite XMVECTOR T1 = XMVectorReplicate(t3 - t2); XMVECTOR Result = XMVectorMultiply(P0, Position0); - Result = XMVectorMultiplyAdd(T0, Tangent0, Result); - Result = XMVectorMultiplyAdd(P1, Position1, Result); - Result = XMVectorMultiplyAdd(T1, Tangent1, Result); + Result = XMVectorMultiplyAdd(T0, Tangent0, Result); + Result = XMVectorMultiplyAdd(P1, Position1, Result); + Result = XMVectorMultiplyAdd(T1, Tangent1, Result); return Result; @@ -5836,9 +5235,9 @@ inline XMVECTOR XM_CALLCONV XMVectorHermite float t1 = t3 - t2; XMVECTOR vResult = vmulq_n_f32(Position0, p0); - vResult = vmlaq_n_f32(vResult, Tangent0, t0); - vResult = vmlaq_n_f32(vResult, Position1, p1); - vResult = vmlaq_n_f32(vResult, Tangent1, t1); + vResult = vmlaq_n_f32(vResult, Tangent0, t0); + vResult = vmlaq_n_f32(vResult, Position1, p1); + vResult = vmlaq_n_f32(vResult, Tangent1, t1); return vResult; #elif defined(_XM_SSE_INTRINSICS_) float t2 = t * t; @@ -5850,23 +5249,17 @@ inline XMVECTOR XM_CALLCONV XMVectorHermite XMVECTOR T1 = _mm_set_ps1(t3 - t2); XMVECTOR vResult = _mm_mul_ps(P0, Position0); - vResult = XM_FMADD_PS(Tangent0, T0, vResult); - vResult = XM_FMADD_PS(Position1, P1, vResult); - vResult = XM_FMADD_PS(Tangent1, T1, vResult); + vResult = XM_FMADD_PS(Tangent0, T0, vResult); + vResult = XM_FMADD_PS(Position1, P1, vResult); + vResult = XM_FMADD_PS(Tangent1, T1, vResult); return vResult; #endif } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorHermiteV -( - FXMVECTOR Position0, - FXMVECTOR Tangent0, - FXMVECTOR Position1, - GXMVECTOR Tangent1, - HXMVECTOR T -) noexcept +inline XMVECTOR XM_CALLCONV +XMVectorHermiteV(FXMVECTOR Position0, FXMVECTOR Tangent0, FXMVECTOR Position1, GXMVECTOR Tangent1, HXMVECTOR T) noexcept { // Result = (2 * t^3 - 3 * t^2 + 1) * Position0 + // (t^3 - 2 * t^2 + t) * Tangent0 + @@ -5884,9 +5277,9 @@ inline XMVECTOR XM_CALLCONV XMVectorHermiteV XMVECTOR T1 = XMVectorReplicate(T3.vector4_f32[3] - T2.vector4_f32[3]); XMVECTOR Result = XMVectorMultiply(P0, Position0); - Result = XMVectorMultiplyAdd(T0, Tangent0, Result); - Result = XMVectorMultiplyAdd(P1, Position1, Result); - Result = XMVectorMultiplyAdd(T1, Tangent1, Result); + Result = XMVectorMultiplyAdd(T0, Tangent0, Result); + Result = XMVectorMultiplyAdd(P1, Position1, Result); + Result = XMVectorMultiplyAdd(T1, Tangent1, Result); return Result; @@ -5935,15 +5328,15 @@ inline XMVECTOR XM_CALLCONV XMVectorHermiteV // Now, I have the constants created // Mul the x constant to Position0 XMVECTOR vResult = XM_PERMUTE_PS(T3, _MM_SHUFFLE(0, 0, 0, 0)); - vResult = _mm_mul_ps(vResult, Position0); + vResult = _mm_mul_ps(vResult, Position0); // Mul the y constant to Tangent0 - T2 = XM_PERMUTE_PS(T3, _MM_SHUFFLE(1, 1, 1, 1)); + T2 = XM_PERMUTE_PS(T3, _MM_SHUFFLE(1, 1, 1, 1)); vResult = XM_FMADD_PS(T2, Tangent0, vResult); // Mul the z constant to Position1 - T2 = XM_PERMUTE_PS(T3, _MM_SHUFFLE(2, 2, 2, 2)); + T2 = XM_PERMUTE_PS(T3, _MM_SHUFFLE(2, 2, 2, 2)); vResult = XM_FMADD_PS(T2, Position1, vResult); // Mul the w constant to Tangent1 - T3 = XM_PERMUTE_PS(T3, _MM_SHUFFLE(3, 3, 3, 3)); + T3 = XM_PERMUTE_PS(T3, _MM_SHUFFLE(3, 3, 3, 3)); vResult = XM_FMADD_PS(T3, Tangent1, vResult); return vResult; #endif @@ -5951,14 +5344,8 @@ inline XMVECTOR XM_CALLCONV XMVectorHermiteV //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorCatmullRom -( - FXMVECTOR Position0, - FXMVECTOR Position1, - FXMVECTOR Position2, - GXMVECTOR Position3, - float t -) noexcept +inline XMVECTOR XM_CALLCONV +XMVectorCatmullRom(FXMVECTOR Position0, FXMVECTOR Position1, FXMVECTOR Position2, GXMVECTOR Position3, float t) noexcept { // Result = ((-t^3 + 2 * t^2 - t) * Position0 + // (3 * t^3 - 5 * t^2 + 2) * Position1 + @@ -5976,9 +5363,9 @@ inline XMVECTOR XM_CALLCONV XMVectorCatmullRom XMVECTOR P3 = XMVectorReplicate((t3 - t2) * 0.5f); XMVECTOR Result = XMVectorMultiply(P0, Position0); - Result = XMVectorMultiplyAdd(P1, Position1, Result); - Result = XMVectorMultiplyAdd(P2, Position2, Result); - Result = XMVectorMultiplyAdd(P3, Position3, Result); + Result = XMVectorMultiplyAdd(P1, Position1, Result); + Result = XMVectorMultiplyAdd(P2, Position2, Result); + Result = XMVectorMultiplyAdd(P3, Position3, Result); return Result; @@ -5995,7 +5382,7 @@ inline XMVECTOR XM_CALLCONV XMVectorCatmullRom XMVECTOR P0 = vmlaq_n_f32(P1, Position0, p0); XMVECTOR P3 = vmulq_n_f32(Position3, p3); XMVECTOR P2 = vmlaq_n_f32(P3, Position2, p2); - P0 = vaddq_f32(P0, P2); + P0 = vaddq_f32(P0, P2); return P0; #elif defined(_XM_SSE_INTRINSICS_) float t2 = t * t; @@ -6017,41 +5404,35 @@ inline XMVECTOR XM_CALLCONV XMVectorCatmullRom //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorCatmullRomV -( - FXMVECTOR Position0, - FXMVECTOR Position1, - FXMVECTOR Position2, - GXMVECTOR Position3, - HXMVECTOR T -) noexcept +inline XMVECTOR XM_CALLCONV +XMVectorCatmullRomV(FXMVECTOR Position0, FXMVECTOR Position1, FXMVECTOR Position2, GXMVECTOR Position3, HXMVECTOR T) noexcept { #if defined(_XM_NO_INTRINSICS_) - float fx = T.vector4_f32[0]; - float fy = T.vector4_f32[1]; - float fz = T.vector4_f32[2]; - float fw = T.vector4_f32[3]; - XMVECTORF32 vResult = { { { - 0.5f * ((-fx * fx * fx + 2 * fx * fx - fx) * Position0.vector4_f32[0] - + (3 * fx * fx * fx - 5 * fx * fx + 2) * Position1.vector4_f32[0] - + (-3 * fx * fx * fx + 4 * fx * fx + fx) * Position2.vector4_f32[0] - + (fx * fx * fx - fx * fx) * Position3.vector4_f32[0]), + float fx = T.vector4_f32[0]; + float fy = T.vector4_f32[1]; + float fz = T.vector4_f32[2]; + float fw = T.vector4_f32[3]; + XMVECTORF32 vResult = { { { 0.5f + * ((-fx * fx * fx + 2 * fx * fx - fx) * Position0.vector4_f32[0] + + (3 * fx * fx * fx - 5 * fx * fx + 2) * Position1.vector4_f32[0] + + (-3 * fx * fx * fx + 4 * fx * fx + fx) * Position2.vector4_f32[0] + + (fx * fx * fx - fx * fx) * Position3.vector4_f32[0]), - 0.5f * ((-fy * fy * fy + 2 * fy * fy - fy) * Position0.vector4_f32[1] - + (3 * fy * fy * fy - 5 * fy * fy + 2) * Position1.vector4_f32[1] - + (-3 * fy * fy * fy + 4 * fy * fy + fy) * Position2.vector4_f32[1] - + (fy * fy * fy - fy * fy) * Position3.vector4_f32[1]), + 0.5f + * ((-fy * fy * fy + 2 * fy * fy - fy) * Position0.vector4_f32[1] + + (3 * fy * fy * fy - 5 * fy * fy + 2) * Position1.vector4_f32[1] + + (-3 * fy * fy * fy + 4 * fy * fy + fy) * Position2.vector4_f32[1] + (fy * fy * fy - fy * fy) * Position3.vector4_f32[1]), - 0.5f * ((-fz * fz * fz + 2 * fz * fz - fz) * Position0.vector4_f32[2] - + (3 * fz * fz * fz - 5 * fz * fz + 2) * Position1.vector4_f32[2] - + (-3 * fz * fz * fz + 4 * fz * fz + fz) * Position2.vector4_f32[2] - + (fz * fz * fz - fz * fz) * Position3.vector4_f32[2]), + 0.5f + * ((-fz * fz * fz + 2 * fz * fz - fz) * Position0.vector4_f32[2] + + (3 * fz * fz * fz - 5 * fz * fz + 2) * Position1.vector4_f32[2] + + (-3 * fz * fz * fz + 4 * fz * fz + fz) * Position2.vector4_f32[2] + (fz * fz * fz - fz * fz) * Position3.vector4_f32[2]), - 0.5f * ((-fw * fw * fw + 2 * fw * fw - fw) * Position0.vector4_f32[3] - + (3 * fw * fw * fw - 5 * fw * fw + 2) * Position1.vector4_f32[3] - + (-3 * fw * fw * fw + 4 * fw * fw + fw) * Position2.vector4_f32[3] - + (fw * fw * fw - fw * fw) * Position3.vector4_f32[3]) - } } }; + 0.5f + * ((-fw * fw * fw + 2 * fw * fw - fw) * Position0.vector4_f32[3] + + (3 * fw * fw * fw - 5 * fw * fw + 2) * Position1.vector4_f32[3] + + (-3 * fw * fw * fw + 4 * fw * fw + fw) * Position2.vector4_f32[3] + + (fw * fw * fw - fw * fw) * Position3.vector4_f32[3]) } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) static const XMVECTORF32 Catmul2 = { { { 2.0f, 2.0f, 2.0f, 2.0f } } }; @@ -6063,21 +5444,21 @@ inline XMVECTOR XM_CALLCONV XMVectorCatmullRomV XMVECTOR T3 = vmulq_f32(T, T2); // Perform the Position0 term XMVECTOR vResult = vaddq_f32(T2, T2); - vResult = vsubq_f32(vResult, T); - vResult = vsubq_f32(vResult, T3); - vResult = vmulq_f32(vResult, Position0); + vResult = vsubq_f32(vResult, T); + vResult = vsubq_f32(vResult, T3); + vResult = vmulq_f32(vResult, Position0); // Perform the Position1 term and add XMVECTOR vTemp = vmulq_f32(T3, Catmul3); - vTemp = vmlsq_f32(vTemp, T2, Catmul5); - vTemp = vaddq_f32(vTemp, Catmul2); - vResult = vmlaq_f32(vResult, vTemp, Position1); + vTemp = vmlsq_f32(vTemp, T2, Catmul5); + vTemp = vaddq_f32(vTemp, Catmul2); + vResult = vmlaq_f32(vResult, vTemp, Position1); // Perform the Position2 term and add - vTemp = vmulq_f32(T2, Catmul4); - vTemp = vmlsq_f32(vTemp, T3, Catmul3); - vTemp = vaddq_f32(vTemp, T); + vTemp = vmulq_f32(T2, Catmul4); + vTemp = vmlsq_f32(vTemp, T3, Catmul3); + vTemp = vaddq_f32(vTemp, T); vResult = vmlaq_f32(vResult, vTemp, Position2); // Position3 is the last term - T3 = vsubq_f32(T3, T2); + T3 = vsubq_f32(T3, T2); vResult = vmlaq_f32(vResult, T3, Position3); // Multiply by 0.5f and exit vResult = vmulq_f32(vResult, g_XMOneHalf); @@ -6092,21 +5473,21 @@ inline XMVECTOR XM_CALLCONV XMVectorCatmullRomV XMVECTOR T3 = _mm_mul_ps(T, T2); // Perform the Position0 term XMVECTOR vResult = _mm_add_ps(T2, T2); - vResult = _mm_sub_ps(vResult, T); - vResult = _mm_sub_ps(vResult, T3); - vResult = _mm_mul_ps(vResult, Position0); + vResult = _mm_sub_ps(vResult, T); + vResult = _mm_sub_ps(vResult, T3); + vResult = _mm_mul_ps(vResult, Position0); // Perform the Position1 term and add XMVECTOR vTemp = _mm_mul_ps(T3, Catmul3); - vTemp = XM_FNMADD_PS(T2, Catmul5, vTemp); - vTemp = _mm_add_ps(vTemp, Catmul2); - vResult = XM_FMADD_PS(vTemp, Position1, vResult); + vTemp = XM_FNMADD_PS(T2, Catmul5, vTemp); + vTemp = _mm_add_ps(vTemp, Catmul2); + vResult = XM_FMADD_PS(vTemp, Position1, vResult); // Perform the Position2 term and add - vTemp = _mm_mul_ps(T2, Catmul4); - vTemp = XM_FNMADD_PS(T3, Catmul3, vTemp); - vTemp = _mm_add_ps(vTemp, T); + vTemp = _mm_mul_ps(T2, Catmul4); + vTemp = XM_FNMADD_PS(T3, Catmul3, vTemp); + vTemp = _mm_add_ps(vTemp, T); vResult = XM_FMADD_PS(vTemp, Position2, vResult); // Position3 is the last term - T3 = _mm_sub_ps(T3, T2); + T3 = _mm_sub_ps(T3, T2); vResult = XM_FMADD_PS(T3, Position3, vResult); // Multiply by 0.5f and exit vResult = _mm_mul_ps(vResult, g_XMOneHalf); @@ -6116,40 +5497,33 @@ inline XMVECTOR XM_CALLCONV XMVectorCatmullRomV //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorBaryCentric -( - FXMVECTOR Position0, - FXMVECTOR Position1, - FXMVECTOR Position2, - float f, - float g -) noexcept +inline XMVECTOR XM_CALLCONV XMVectorBaryCentric(FXMVECTOR Position0, FXMVECTOR Position1, FXMVECTOR Position2, float f, float g) noexcept { // Result = Position0 + f * (Position1 - Position0) + g * (Position2 - Position0) #if defined(_XM_NO_INTRINSICS_) - XMVECTOR P10 = XMVectorSubtract(Position1, Position0); + XMVECTOR P10 = XMVectorSubtract(Position1, Position0); XMVECTOR ScaleF = XMVectorReplicate(f); - XMVECTOR P20 = XMVectorSubtract(Position2, Position0); + XMVECTOR P20 = XMVectorSubtract(Position2, Position0); XMVECTOR ScaleG = XMVectorReplicate(g); XMVECTOR Result = XMVectorMultiplyAdd(P10, ScaleF, Position0); - Result = XMVectorMultiplyAdd(P20, ScaleG, Result); + Result = XMVectorMultiplyAdd(P20, ScaleG, Result); return Result; #elif defined(_XM_ARM_NEON_INTRINSICS_) XMVECTOR R1 = vsubq_f32(Position1, Position0); XMVECTOR R2 = vsubq_f32(Position2, Position0); - R1 = vmlaq_n_f32(Position0, R1, f); + R1 = vmlaq_n_f32(Position0, R1, f); return vmlaq_n_f32(R1, R2, g); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR R1 = _mm_sub_ps(Position1, Position0); XMVECTOR R2 = _mm_sub_ps(Position2, Position0); XMVECTOR SF = _mm_set_ps1(f); - R1 = XM_FMADD_PS(R1, SF, Position0); + R1 = XM_FMADD_PS(R1, SF, Position0); XMVECTOR SG = _mm_set_ps1(g); return XM_FMADD_PS(R2, SG, R1); #endif @@ -6157,14 +5531,8 @@ inline XMVECTOR XM_CALLCONV XMVectorBaryCentric //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorBaryCentricV -( - FXMVECTOR Position0, - FXMVECTOR Position1, - FXMVECTOR Position2, - GXMVECTOR F, - HXMVECTOR G -) noexcept +inline XMVECTOR XM_CALLCONV +XMVectorBaryCentricV(FXMVECTOR Position0, FXMVECTOR Position1, FXMVECTOR Position2, GXMVECTOR F, HXMVECTOR G) noexcept { // Result = Position0 + f * (Position1 - Position0) + g * (Position2 - Position0) @@ -6174,19 +5542,19 @@ inline XMVECTOR XM_CALLCONV XMVectorBaryCentricV XMVECTOR P20 = XMVectorSubtract(Position2, Position0); XMVECTOR Result = XMVectorMultiplyAdd(P10, F, Position0); - Result = XMVectorMultiplyAdd(P20, G, Result); + Result = XMVectorMultiplyAdd(P20, G, Result); return Result; #elif defined(_XM_ARM_NEON_INTRINSICS_) XMVECTOR R1 = vsubq_f32(Position1, Position0); XMVECTOR R2 = vsubq_f32(Position2, Position0); - R1 = vmlaq_f32(Position0, R1, F); + R1 = vmlaq_f32(Position0, R1, F); return vmlaq_f32(R1, R2, G); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR R1 = _mm_sub_ps(Position1, Position0); XMVECTOR R2 = _mm_sub_ps(Position2, Position0); - R1 = XM_FMADD_PS(R1, F, Position0); + R1 = XM_FMADD_PS(R1, F, Position0); return XM_FMADD_PS(R2, G, R1); #endif } @@ -6203,11 +5571,7 @@ inline XMVECTOR XM_CALLCONV XMVectorBaryCentricV //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector2Equal -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline bool XM_CALLCONV XMVector2Equal(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) return (((V1.vector4_f32[0] == V2.vector4_f32[0]) && (V1.vector4_f32[1] == V2.vector4_f32[1])) != 0); @@ -6221,25 +5585,18 @@ inline bool XM_CALLCONV XMVector2Equal #endif } - //------------------------------------------------------------------------------ -inline uint32_t XM_CALLCONV XMVector2EqualR -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline uint32_t XM_CALLCONV XMVector2EqualR(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) uint32_t CR = 0; - if ((V1.vector4_f32[0] == V2.vector4_f32[0]) && - (V1.vector4_f32[1] == V2.vector4_f32[1])) + if ((V1.vector4_f32[0] == V2.vector4_f32[0]) && (V1.vector4_f32[1] == V2.vector4_f32[1])) { CR = XM_CRMASK_CR6TRUE; } - else if ((V1.vector4_f32[0] != V2.vector4_f32[0]) && - (V1.vector4_f32[1] != V2.vector4_f32[1])) + else if ((V1.vector4_f32[0] != V2.vector4_f32[0]) && (V1.vector4_f32[1] != V2.vector4_f32[1])) { CR = XM_CRMASK_CR6FALSE; } @@ -6247,8 +5604,8 @@ inline uint32_t XM_CALLCONV XMVector2EqualR #elif defined(_XM_ARM_NEON_INTRINSICS_) uint32x2_t vTemp = vceq_f32(vget_low_f32(V1), vget_low_f32(V2)); - uint64_t r = vget_lane_u64(vreinterpret_u64_u32(vTemp), 0); - uint32_t CR = 0; + uint64_t r = vget_lane_u64(vreinterpret_u64_u32(vTemp), 0); + uint32_t CR = 0; if (r == 0xFFFFFFFFFFFFFFFFU) { CR = XM_CRMASK_CR6TRUE; @@ -6261,8 +5618,8 @@ inline uint32_t XM_CALLCONV XMVector2EqualR #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vTemp = _mm_cmpeq_ps(V1, V2); // z and w are don't care - int iTest = _mm_movemask_ps(vTemp) & 3; - uint32_t CR = 0; + int iTest = _mm_movemask_ps(vTemp) & 3; + uint32_t CR = 0; if (iTest == 3) { CR = XM_CRMASK_CR6TRUE; @@ -6277,11 +5634,7 @@ inline uint32_t XM_CALLCONV XMVector2EqualR //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector2EqualInt -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline bool XM_CALLCONV XMVector2EqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) return (((V1.vector4_u32[0] == V2.vector4_u32[0]) && (V1.vector4_u32[1] == V2.vector4_u32[1])) != 0); @@ -6296,22 +5649,16 @@ inline bool XM_CALLCONV XMVector2EqualInt //------------------------------------------------------------------------------ -inline uint32_t XM_CALLCONV XMVector2EqualIntR -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline uint32_t XM_CALLCONV XMVector2EqualIntR(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) uint32_t CR = 0; - if ((V1.vector4_u32[0] == V2.vector4_u32[0]) && - (V1.vector4_u32[1] == V2.vector4_u32[1])) + if ((V1.vector4_u32[0] == V2.vector4_u32[0]) && (V1.vector4_u32[1] == V2.vector4_u32[1])) { CR = XM_CRMASK_CR6TRUE; } - else if ((V1.vector4_u32[0] != V2.vector4_u32[0]) && - (V1.vector4_u32[1] != V2.vector4_u32[1])) + else if ((V1.vector4_u32[0] != V2.vector4_u32[0]) && (V1.vector4_u32[1] != V2.vector4_u32[1])) { CR = XM_CRMASK_CR6FALSE; } @@ -6319,8 +5666,8 @@ inline uint32_t XM_CALLCONV XMVector2EqualIntR #elif defined(_XM_ARM_NEON_INTRINSICS_) uint32x2_t vTemp = vceq_u32(vget_low_u32(vreinterpretq_u32_f32(V1)), vget_low_u32(vreinterpretq_u32_f32(V2))); - uint64_t r = vget_lane_u64(vreinterpret_u64_u32(vTemp), 0); - uint32_t CR = 0; + uint64_t r = vget_lane_u64(vreinterpret_u64_u32(vTemp), 0); + uint32_t CR = 0; if (r == 0xFFFFFFFFFFFFFFFFU) { CR = XM_CRMASK_CR6TRUE; @@ -6331,9 +5678,9 @@ inline uint32_t XM_CALLCONV XMVector2EqualIntR } return CR; #elif defined(_XM_SSE_INTRINSICS_) - __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); - int iTest = _mm_movemask_ps(_mm_castsi128_ps(vTemp)) & 3; - uint32_t CR = 0; + __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); + int iTest = _mm_movemask_ps(_mm_castsi128_ps(vTemp)) & 3; + uint32_t CR = 0; if (iTest == 3) { CR = XM_CRMASK_CR6TRUE; @@ -6348,18 +5695,12 @@ inline uint32_t XM_CALLCONV XMVector2EqualIntR //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector2NearEqual -( - FXMVECTOR V1, - FXMVECTOR V2, - FXMVECTOR Epsilon -) noexcept +inline bool XM_CALLCONV XMVector2NearEqual(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR Epsilon) noexcept { #if defined(_XM_NO_INTRINSICS_) float dx = fabsf(V1.vector4_f32[0] - V2.vector4_f32[0]); float dy = fabsf(V1.vector4_f32[1] - V2.vector4_f32[1]); - return ((dx <= Epsilon.vector4_f32[0]) && - (dy <= Epsilon.vector4_f32[1])); + return ((dx <= Epsilon.vector4_f32[0]) && (dy <= Epsilon.vector4_f32[1])); #elif defined(_XM_ARM_NEON_INTRINSICS_) float32x2_t vDelta = vsub_f32(vget_low_f32(V1), vget_low_f32(V2)); #if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) @@ -6374,9 +5715,9 @@ inline bool XM_CALLCONV XMVector2NearEqual XMVECTOR vDelta = _mm_sub_ps(V1, V2); // Get the absolute value of the difference XMVECTOR vTemp = _mm_setzero_ps(); - vTemp = _mm_sub_ps(vTemp, vDelta); - vTemp = _mm_max_ps(vTemp, vDelta); - vTemp = _mm_cmple_ps(vTemp, Epsilon); + vTemp = _mm_sub_ps(vTemp, vDelta); + vTemp = _mm_max_ps(vTemp, vDelta); + vTemp = _mm_cmple_ps(vTemp, Epsilon); // z and w are don't care return (((_mm_movemask_ps(vTemp) & 3) == 0x3) != 0); #endif @@ -6384,11 +5725,7 @@ inline bool XM_CALLCONV XMVector2NearEqual //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector2NotEqual -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline bool XM_CALLCONV XMVector2NotEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) return (((V1.vector4_f32[0] != V2.vector4_f32[0]) || (V1.vector4_f32[1] != V2.vector4_f32[1])) != 0); @@ -6404,11 +5741,7 @@ inline bool XM_CALLCONV XMVector2NotEqual //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector2NotEqualInt -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline bool XM_CALLCONV XMVector2NotEqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) return (((V1.vector4_u32[0] != V2.vector4_u32[0]) || (V1.vector4_u32[1] != V2.vector4_u32[1])) != 0); @@ -6423,11 +5756,7 @@ inline bool XM_CALLCONV XMVector2NotEqualInt //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector2Greater -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline bool XM_CALLCONV XMVector2Greater(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) return (((V1.vector4_f32[0] > V2.vector4_f32[0]) && (V1.vector4_f32[1] > V2.vector4_f32[1])) != 0); @@ -6443,22 +5772,16 @@ inline bool XM_CALLCONV XMVector2Greater //------------------------------------------------------------------------------ -inline uint32_t XM_CALLCONV XMVector2GreaterR -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline uint32_t XM_CALLCONV XMVector2GreaterR(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) uint32_t CR = 0; - if ((V1.vector4_f32[0] > V2.vector4_f32[0]) && - (V1.vector4_f32[1] > V2.vector4_f32[1])) + if ((V1.vector4_f32[0] > V2.vector4_f32[0]) && (V1.vector4_f32[1] > V2.vector4_f32[1])) { CR = XM_CRMASK_CR6TRUE; } - else if ((V1.vector4_f32[0] <= V2.vector4_f32[0]) && - (V1.vector4_f32[1] <= V2.vector4_f32[1])) + else if ((V1.vector4_f32[0] <= V2.vector4_f32[0]) && (V1.vector4_f32[1] <= V2.vector4_f32[1])) { CR = XM_CRMASK_CR6FALSE; } @@ -6466,8 +5789,8 @@ inline uint32_t XM_CALLCONV XMVector2GreaterR #elif defined(_XM_ARM_NEON_INTRINSICS_) uint32x2_t vTemp = vcgt_f32(vget_low_f32(V1), vget_low_f32(V2)); - uint64_t r = vget_lane_u64(vreinterpret_u64_u32(vTemp), 0); - uint32_t CR = 0; + uint64_t r = vget_lane_u64(vreinterpret_u64_u32(vTemp), 0); + uint32_t CR = 0; if (r == 0xFFFFFFFFFFFFFFFFU) { CR = XM_CRMASK_CR6TRUE; @@ -6479,8 +5802,8 @@ inline uint32_t XM_CALLCONV XMVector2GreaterR return CR; #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vTemp = _mm_cmpgt_ps(V1, V2); - int iTest = _mm_movemask_ps(vTemp) & 3; - uint32_t CR = 0; + int iTest = _mm_movemask_ps(vTemp) & 3; + uint32_t CR = 0; if (iTest == 3) { CR = XM_CRMASK_CR6TRUE; @@ -6495,11 +5818,7 @@ inline uint32_t XM_CALLCONV XMVector2GreaterR //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector2GreaterOrEqual -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline bool XM_CALLCONV XMVector2GreaterOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) return (((V1.vector4_f32[0] >= V2.vector4_f32[0]) && (V1.vector4_f32[1] >= V2.vector4_f32[1])) != 0); @@ -6514,22 +5833,16 @@ inline bool XM_CALLCONV XMVector2GreaterOrEqual //------------------------------------------------------------------------------ -inline uint32_t XM_CALLCONV XMVector2GreaterOrEqualR -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline uint32_t XM_CALLCONV XMVector2GreaterOrEqualR(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) uint32_t CR = 0; - if ((V1.vector4_f32[0] >= V2.vector4_f32[0]) && - (V1.vector4_f32[1] >= V2.vector4_f32[1])) + if ((V1.vector4_f32[0] >= V2.vector4_f32[0]) && (V1.vector4_f32[1] >= V2.vector4_f32[1])) { CR = XM_CRMASK_CR6TRUE; } - else if ((V1.vector4_f32[0] < V2.vector4_f32[0]) && - (V1.vector4_f32[1] < V2.vector4_f32[1])) + else if ((V1.vector4_f32[0] < V2.vector4_f32[0]) && (V1.vector4_f32[1] < V2.vector4_f32[1])) { CR = XM_CRMASK_CR6FALSE; } @@ -6537,8 +5850,8 @@ inline uint32_t XM_CALLCONV XMVector2GreaterOrEqualR #elif defined(_XM_ARM_NEON_INTRINSICS_) uint32x2_t vTemp = vcge_f32(vget_low_f32(V1), vget_low_f32(V2)); - uint64_t r = vget_lane_u64(vreinterpret_u64_u32(vTemp), 0); - uint32_t CR = 0; + uint64_t r = vget_lane_u64(vreinterpret_u64_u32(vTemp), 0); + uint32_t CR = 0; if (r == 0xFFFFFFFFFFFFFFFFU) { CR = XM_CRMASK_CR6TRUE; @@ -6550,8 +5863,8 @@ inline uint32_t XM_CALLCONV XMVector2GreaterOrEqualR return CR; #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vTemp = _mm_cmpge_ps(V1, V2); - int iTest = _mm_movemask_ps(vTemp) & 3; - uint32_t CR = 0; + int iTest = _mm_movemask_ps(vTemp) & 3; + uint32_t CR = 0; if (iTest == 3) { CR = XM_CRMASK_CR6TRUE; @@ -6566,11 +5879,7 @@ inline uint32_t XM_CALLCONV XMVector2GreaterOrEqualR //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector2Less -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline bool XM_CALLCONV XMVector2Less(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) return (((V1.vector4_f32[0] < V2.vector4_f32[0]) && (V1.vector4_f32[1] < V2.vector4_f32[1])) != 0); @@ -6585,11 +5894,7 @@ inline bool XM_CALLCONV XMVector2Less //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector2LessOrEqual -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline bool XM_CALLCONV XMVector2LessOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) return (((V1.vector4_f32[0] <= V2.vector4_f32[0]) && (V1.vector4_f32[1] <= V2.vector4_f32[1])) != 0); @@ -6604,18 +5909,15 @@ inline bool XM_CALLCONV XMVector2LessOrEqual //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector2InBounds -( - FXMVECTOR V, - FXMVECTOR Bounds -) noexcept +inline bool XM_CALLCONV XMVector2InBounds(FXMVECTOR V, FXMVECTOR Bounds) noexcept { #if defined(_XM_NO_INTRINSICS_) - return (((V.vector4_f32[0] <= Bounds.vector4_f32[0] && V.vector4_f32[0] >= -Bounds.vector4_f32[0]) && - (V.vector4_f32[1] <= Bounds.vector4_f32[1] && V.vector4_f32[1] >= -Bounds.vector4_f32[1])) != 0); + return (((V.vector4_f32[0] <= Bounds.vector4_f32[0] && V.vector4_f32[0] >= -Bounds.vector4_f32[0]) + && (V.vector4_f32[1] <= Bounds.vector4_f32[1] && V.vector4_f32[1] >= -Bounds.vector4_f32[1])) + != 0); #elif defined(_XM_ARM_NEON_INTRINSICS_) float32x2_t VL = vget_low_f32(V); - float32x2_t B = vget_low_f32(Bounds); + float32x2_t B = vget_low_f32(Bounds); // Test if less than or equal uint32x2_t ivTemp1 = vcle_f32(VL, B); // Negate the bounds @@ -6650,8 +5952,7 @@ inline bool XM_CALLCONV XMVector2InBounds inline bool XM_CALLCONV XMVector2IsNaN(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - return (XMISNAN(V.vector4_f32[0]) || - XMISNAN(V.vector4_f32[1])); + return (XMISNAN(V.vector4_f32[0]) || XMISNAN(V.vector4_f32[1])); #elif defined(_XM_ARM_NEON_INTRINSICS_) #if defined(__clang__) && __FINITE_MATH_ONLY__ return isnan(vgetq_lane_f32(V, 0)) || isnan(vgetq_lane_f32(V, 1)); @@ -6668,7 +5969,7 @@ inline bool XM_CALLCONV XMVector2IsNaN(FXMVECTOR V) noexcept _mm_store_ps(tmp, V); return isnan(tmp[0]) || isnan(tmp[1]); #else -// Test against itself. NaN is always not equal + // Test against itself. NaN is always not equal XMVECTOR vTempNan = _mm_cmpneq_ps(V, V); // If x or y are NaN, the mask is non-zero return ((_mm_movemask_ps(vTempNan) & 3) != 0); @@ -6686,8 +5987,7 @@ inline bool XM_CALLCONV XMVector2IsInfinite(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - return (XMISINF(V.vector4_f32[0]) || - XMISINF(V.vector4_f32[1])); + return (XMISINF(V.vector4_f32[0]) || XMISINF(V.vector4_f32[1])); #elif defined(_XM_ARM_NEON_INTRINSICS_) // Mask off the sign bit uint32x2_t vTemp = vand_u32(vget_low_u32(vreinterpretq_u32_f32(V)), vget_low_u32(g_XMAbsMask)); @@ -6711,32 +6011,25 @@ inline bool XM_CALLCONV XMVector2IsInfinite(FXMVECTOR V) noexcept //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector2Dot -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVector2Dot(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) XMVECTORF32 Result; - Result.f[0] = - Result.f[1] = - Result.f[2] = - Result.f[3] = V1.vector4_f32[0] * V2.vector4_f32[0] + V1.vector4_f32[1] * V2.vector4_f32[1]; + Result.f[0] = Result.f[1] = Result.f[2] = Result.f[3] = V1.vector4_f32[0] * V2.vector4_f32[0] + V1.vector4_f32[1] * V2.vector4_f32[1]; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) // Perform the dot product on x and y float32x2_t vTemp = vmul_f32(vget_low_f32(V1), vget_low_f32(V2)); - vTemp = vpadd_f32(vTemp, vTemp); + vTemp = vpadd_f32(vTemp, vTemp); return vcombine_f32(vTemp, vTemp); #elif defined(_XM_SSE4_INTRINSICS_) return _mm_dp_ps(V1, V2, 0x3f); #elif defined(_XM_SSE3_INTRINSICS_) XMVECTOR vDot = _mm_mul_ps(V1, V2); - vDot = _mm_hadd_ps(vDot, vDot); - vDot = _mm_moveldup_ps(vDot); + vDot = _mm_hadd_ps(vDot, vDot); + vDot = _mm_moveldup_ps(vDot); return vDot; #elif defined(_XM_SSE_INTRINSICS_) // Perform the dot product on x and y @@ -6752,28 +6045,21 @@ inline XMVECTOR XM_CALLCONV XMVector2Dot //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector2Cross -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVector2Cross(FXMVECTOR V1, FXMVECTOR V2) noexcept { // [ V1.x*V2.y - V1.y*V2.x, V1.x*V2.y - V1.y*V2.x ] #if defined(_XM_NO_INTRINSICS_) - float fCross = (V1.vector4_f32[0] * V2.vector4_f32[1]) - (V1.vector4_f32[1] * V2.vector4_f32[0]); + float fCross = (V1.vector4_f32[0] * V2.vector4_f32[1]) - (V1.vector4_f32[1] * V2.vector4_f32[0]); XMVECTORF32 vResult; - vResult.f[0] = - vResult.f[1] = - vResult.f[2] = - vResult.f[3] = fCross; + vResult.f[0] = vResult.f[1] = vResult.f[2] = vResult.f[3] = fCross; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) static const XMVECTORF32 Negate = { { { 1.f, -1.f, 0, 0 } } }; float32x2_t vTemp = vmul_f32(vget_low_f32(V1), vrev64_f32(vget_low_f32(V2))); - vTemp = vmul_f32(vTemp, vget_low_f32(Negate)); - vTemp = vpadd_f32(vTemp, vTemp); + vTemp = vmul_f32(vTemp, vget_low_f32(Negate)); + vTemp = vpadd_f32(vTemp, vTemp); return vcombine_f32(vTemp, vTemp); #elif defined(_XM_SSE_INTRINSICS_) // Swap x and y @@ -6812,7 +6098,7 @@ inline XMVECTOR XM_CALLCONV XMVector2ReciprocalLengthEst(FXMVECTOR V) noexcept float32x2_t VL = vget_low_f32(V); // Dot2 float32x2_t vTemp = vmul_f32(VL, VL); - vTemp = vpadd_f32(vTemp, vTemp); + vTemp = vpadd_f32(vTemp, vTemp); // Reciprocal sqrt (estimate) vTemp = vrsqrte_f32(vTemp); return vcombine_f32(vTemp, vTemp); @@ -6821,9 +6107,9 @@ inline XMVECTOR XM_CALLCONV XMVector2ReciprocalLengthEst(FXMVECTOR V) noexcept return _mm_rsqrt_ps(vTemp); #elif defined(_XM_SSE3_INTRINSICS_) XMVECTOR vLengthSq = _mm_mul_ps(V, V); - XMVECTOR vTemp = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_rsqrt_ss(vTemp); - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); + XMVECTOR vTemp = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_rsqrt_ss(vTemp); + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); return vLengthSq; #elif defined(_XM_SSE_INTRINSICS_) // Perform the dot product on x and y @@ -6853,26 +6139,26 @@ inline XMVECTOR XM_CALLCONV XMVector2ReciprocalLength(FXMVECTOR V) noexcept float32x2_t VL = vget_low_f32(V); // Dot2 float32x2_t vTemp = vmul_f32(VL, VL); - vTemp = vpadd_f32(vTemp, vTemp); + vTemp = vpadd_f32(vTemp, vTemp); // Reciprocal sqrt - float32x2_t S0 = vrsqrte_f32(vTemp); - float32x2_t P0 = vmul_f32(vTemp, S0); - float32x2_t R0 = vrsqrts_f32(P0, S0); - float32x2_t S1 = vmul_f32(S0, R0); - float32x2_t P1 = vmul_f32(vTemp, S1); - float32x2_t R1 = vrsqrts_f32(P1, S1); + float32x2_t S0 = vrsqrte_f32(vTemp); + float32x2_t P0 = vmul_f32(vTemp, S0); + float32x2_t R0 = vrsqrts_f32(P0, S0); + float32x2_t S1 = vmul_f32(S0, R0); + float32x2_t P1 = vmul_f32(vTemp, S1); + float32x2_t R1 = vrsqrts_f32(P1, S1); float32x2_t Result = vmul_f32(S1, R1); return vcombine_f32(Result, Result); #elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vTemp = _mm_dp_ps(V, V, 0x3f); + XMVECTOR vTemp = _mm_dp_ps(V, V, 0x3f); XMVECTOR vLengthSq = _mm_sqrt_ps(vTemp); return _mm_div_ps(g_XMOne, vLengthSq); #elif defined(_XM_SSE3_INTRINSICS_) XMVECTOR vLengthSq = _mm_mul_ps(V, V); - XMVECTOR vTemp = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_sqrt_ss(vTemp); - vLengthSq = _mm_div_ss(g_XMOne, vLengthSq); - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); + XMVECTOR vTemp = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_sqrt_ss(vTemp); + vLengthSq = _mm_div_ss(g_XMOne, vLengthSq); + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); return vLengthSq; #elif defined(_XM_SSE_INTRINSICS_) // Perform the dot product on x and y @@ -6902,23 +6188,23 @@ inline XMVECTOR XM_CALLCONV XMVector2LengthEst(FXMVECTOR V) noexcept #elif defined(_XM_ARM_NEON_INTRINSICS_) float32x2_t VL = vget_low_f32(V); // Dot2 - float32x2_t vTemp = vmul_f32(VL, VL); - vTemp = vpadd_f32(vTemp, vTemp); - const float32x2_t zero = vdup_n_f32(0); - uint32x2_t VEqualsZero = vceq_f32(vTemp, zero); + float32x2_t vTemp = vmul_f32(VL, VL); + vTemp = vpadd_f32(vTemp, vTemp); + const float32x2_t zero = vdup_n_f32(0); + uint32x2_t VEqualsZero = vceq_f32(vTemp, zero); // Sqrt (estimate) float32x2_t Result = vrsqrte_f32(vTemp); - Result = vmul_f32(vTemp, Result); - Result = vbsl_f32(VEqualsZero, zero, Result); + Result = vmul_f32(vTemp, Result); + Result = vbsl_f32(VEqualsZero, zero, Result); return vcombine_f32(Result, Result); #elif defined(_XM_SSE4_INTRINSICS_) XMVECTOR vTemp = _mm_dp_ps(V, V, 0x3f); return _mm_sqrt_ps(vTemp); #elif defined(_XM_SSE3_INTRINSICS_) XMVECTOR vLengthSq = _mm_mul_ps(V, V); - XMVECTOR vTemp = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_sqrt_ss(vTemp); - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); + XMVECTOR vTemp = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_sqrt_ss(vTemp); + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); return vLengthSq; #elif defined(_XM_SSE_INTRINSICS_) // Perform the dot product on x and y @@ -6947,29 +6233,29 @@ inline XMVECTOR XM_CALLCONV XMVector2Length(FXMVECTOR V) noexcept #elif defined(_XM_ARM_NEON_INTRINSICS_) float32x2_t VL = vget_low_f32(V); // Dot2 - float32x2_t vTemp = vmul_f32(VL, VL); - vTemp = vpadd_f32(vTemp, vTemp); - const float32x2_t zero = vdup_n_f32(0); - uint32x2_t VEqualsZero = vceq_f32(vTemp, zero); + float32x2_t vTemp = vmul_f32(VL, VL); + vTemp = vpadd_f32(vTemp, vTemp); + const float32x2_t zero = vdup_n_f32(0); + uint32x2_t VEqualsZero = vceq_f32(vTemp, zero); // Sqrt - float32x2_t S0 = vrsqrte_f32(vTemp); - float32x2_t P0 = vmul_f32(vTemp, S0); - float32x2_t R0 = vrsqrts_f32(P0, S0); - float32x2_t S1 = vmul_f32(S0, R0); - float32x2_t P1 = vmul_f32(vTemp, S1); - float32x2_t R1 = vrsqrts_f32(P1, S1); + float32x2_t S0 = vrsqrte_f32(vTemp); + float32x2_t P0 = vmul_f32(vTemp, S0); + float32x2_t R0 = vrsqrts_f32(P0, S0); + float32x2_t S1 = vmul_f32(S0, R0); + float32x2_t P1 = vmul_f32(vTemp, S1); + float32x2_t R1 = vrsqrts_f32(P1, S1); float32x2_t Result = vmul_f32(S1, R1); - Result = vmul_f32(vTemp, Result); - Result = vbsl_f32(VEqualsZero, zero, Result); + Result = vmul_f32(vTemp, Result); + Result = vbsl_f32(VEqualsZero, zero, Result); return vcombine_f32(Result, Result); #elif defined(_XM_SSE4_INTRINSICS_) XMVECTOR vTemp = _mm_dp_ps(V, V, 0x3f); return _mm_sqrt_ps(vTemp); #elif defined(_XM_SSE3_INTRINSICS_) XMVECTOR vLengthSq = _mm_mul_ps(V, V); - XMVECTOR vTemp = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_sqrt_ss(vTemp); - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); + XMVECTOR vTemp = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_sqrt_ss(vTemp); + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); return vLengthSq; #elif defined(_XM_SSE_INTRINSICS_) // Perform the dot product on x and y @@ -7001,22 +6287,22 @@ inline XMVECTOR XM_CALLCONV XMVector2NormalizeEst(FXMVECTOR V) noexcept float32x2_t VL = vget_low_f32(V); // Dot2 float32x2_t vTemp = vmul_f32(VL, VL); - vTemp = vpadd_f32(vTemp, vTemp); + vTemp = vpadd_f32(vTemp, vTemp); // Reciprocal sqrt (estimate) vTemp = vrsqrte_f32(vTemp); // Normalize float32x2_t Result = vmul_f32(VL, vTemp); return vcombine_f32(Result, Result); #elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vTemp = _mm_dp_ps(V, V, 0x3f); + XMVECTOR vTemp = _mm_dp_ps(V, V, 0x3f); XMVECTOR vResult = _mm_rsqrt_ps(vTemp); return _mm_mul_ps(vResult, V); #elif defined(_XM_SSE3_INTRINSICS_) XMVECTOR vLengthSq = _mm_mul_ps(V, V); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_rsqrt_ss(vLengthSq); - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); - vLengthSq = _mm_mul_ps(vLengthSq, V); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_rsqrt_ss(vLengthSq); + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); + vLengthSq = _mm_mul_ps(vLengthSq, V); return vLengthSq; #elif defined(_XM_SSE_INTRINSICS_) // Perform the dot product on x and y @@ -7039,7 +6325,7 @@ inline XMVECTOR XM_CALLCONV XMVector2Normalize(FXMVECTOR V) noexcept #if defined(_XM_NO_INTRINSICS_) XMVECTOR vResult = XMVector2Length(V); - float fLength = vResult.vector4_f32[0]; + float fLength = vResult.vector4_f32[0]; // Prevent divide by zero if (fLength > 0) @@ -7056,10 +6342,10 @@ inline XMVECTOR XM_CALLCONV XMVector2Normalize(FXMVECTOR V) noexcept #elif defined(_XM_ARM_NEON_INTRINSICS_) float32x2_t VL = vget_low_f32(V); // Dot2 - float32x2_t vTemp = vmul_f32(VL, VL); - vTemp = vpadd_f32(vTemp, vTemp); + float32x2_t vTemp = vmul_f32(VL, VL); + vTemp = vpadd_f32(vTemp, vTemp); uint32x2_t VEqualsZero = vceq_f32(vTemp, vdup_n_f32(0)); - uint32x2_t VEqualsInf = vceq_f32(vTemp, vget_low_f32(g_XMInfinity)); + uint32x2_t VEqualsInf = vceq_f32(vTemp, vget_low_f32(g_XMInfinity)); // Reciprocal sqrt (2 iterations of Newton-Raphson) float32x2_t S0 = vrsqrte_f32(vTemp); float32x2_t P0 = vmul_f32(vTemp, S0); @@ -7067,11 +6353,11 @@ inline XMVECTOR XM_CALLCONV XMVector2Normalize(FXMVECTOR V) noexcept float32x2_t S1 = vmul_f32(S0, R0); float32x2_t P1 = vmul_f32(vTemp, S1); float32x2_t R1 = vrsqrts_f32(P1, S1); - vTemp = vmul_f32(S1, R1); + vTemp = vmul_f32(S1, R1); // Normalize float32x2_t Result = vmul_f32(VL, vTemp); - Result = vbsl_f32(VEqualsZero, vdup_n_f32(0), Result); - Result = vbsl_f32(VEqualsInf, vget_low_f32(g_XMQNaN), Result); + Result = vbsl_f32(VEqualsZero, vdup_n_f32(0), Result); + Result = vbsl_f32(VEqualsInf, vget_low_f32(g_XMQNaN), Result); return vcombine_f32(Result, Result); #elif defined(_XM_SSE4_INTRINSICS_) XMVECTOR vLengthSq = _mm_dp_ps(V, V, 0x3f); @@ -7091,13 +6377,13 @@ inline XMVECTOR XM_CALLCONV XMVector2Normalize(FXMVECTOR V) noexcept // Select qnan or result based on infinite length XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); - vResult = _mm_or_ps(vTemp1, vTemp2); + vResult = _mm_or_ps(vTemp1, vTemp2); return vResult; #elif defined(_XM_SSE3_INTRINSICS_) // Perform the dot product on x and y only XMVECTOR vLengthSq = _mm_mul_ps(V, V); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_moveldup_ps(vLengthSq); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_moveldup_ps(vLengthSq); // Prepare for the division XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); // Create zero with a single instruction @@ -7114,14 +6400,14 @@ inline XMVECTOR XM_CALLCONV XMVector2Normalize(FXMVECTOR V) noexcept // Select qnan or result based on infinite length XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); - vResult = _mm_or_ps(vTemp1, vTemp2); + vResult = _mm_or_ps(vTemp1, vTemp2); return vResult; #elif defined(_XM_SSE_INTRINSICS_) // Perform the dot product on x and y only XMVECTOR vLengthSq = _mm_mul_ps(V, V); - XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 1, 1, 1)); - vLengthSq = _mm_add_ss(vLengthSq, vTemp); - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); + XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 1, 1, 1)); + vLengthSq = _mm_add_ss(vLengthSq, vTemp); + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); // Prepare for the division XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); // Create zero with a single instruction @@ -7138,19 +6424,14 @@ inline XMVECTOR XM_CALLCONV XMVector2Normalize(FXMVECTOR V) noexcept // Select qnan or result based on infinite length XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); - vResult = _mm_or_ps(vTemp1, vTemp2); + vResult = _mm_or_ps(vTemp1, vTemp2); return vResult; #endif } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector2ClampLength -( - FXMVECTOR V, - float LengthMin, - float LengthMax -) noexcept +inline XMVECTOR XM_CALLCONV XMVector2ClampLength(FXMVECTOR V, float LengthMin, float LengthMax) noexcept { XMVECTOR ClampMax = XMVectorReplicate(LengthMax); XMVECTOR ClampMin = XMVectorReplicate(LengthMin); @@ -7159,12 +6440,7 @@ inline XMVECTOR XM_CALLCONV XMVector2ClampLength //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector2ClampLengthV -( - FXMVECTOR V, - FXMVECTOR LengthMin, - FXMVECTOR LengthMax -) noexcept +inline XMVECTOR XM_CALLCONV XMVector2ClampLengthV(FXMVECTOR V, FXMVECTOR LengthMin, FXMVECTOR LengthMax) noexcept { assert((XMVectorGetY(LengthMin) == XMVectorGetX(LengthMin))); assert((XMVectorGetY(LengthMax) == XMVectorGetX(LengthMax))); @@ -7179,38 +6455,34 @@ inline XMVECTOR XM_CALLCONV XMVector2ClampLengthV XMVECTOR RcpLength = XMVectorReciprocalSqrt(LengthSq); XMVECTOR InfiniteLength = XMVectorEqualInt(LengthSq, g_XMInfinity.v); - XMVECTOR ZeroLength = XMVectorEqual(LengthSq, Zero); + XMVECTOR ZeroLength = XMVectorEqual(LengthSq, Zero); XMVECTOR Length = XMVectorMultiply(LengthSq, RcpLength); XMVECTOR Normal = XMVectorMultiply(V, RcpLength); XMVECTOR Select = XMVectorEqualInt(InfiniteLength, ZeroLength); - Length = XMVectorSelect(LengthSq, Length, Select); - Normal = XMVectorSelect(LengthSq, Normal, Select); + Length = XMVectorSelect(LengthSq, Length, Select); + Normal = XMVectorSelect(LengthSq, Normal, Select); XMVECTOR ControlMax = XMVectorGreater(Length, LengthMax); XMVECTOR ControlMin = XMVectorLess(Length, LengthMin); XMVECTOR ClampLength = XMVectorSelect(Length, LengthMax, ControlMax); - ClampLength = XMVectorSelect(ClampLength, LengthMin, ControlMin); + ClampLength = XMVectorSelect(ClampLength, LengthMin, ControlMin); XMVECTOR Result = XMVectorMultiply(Normal, ClampLength); // Preserve the original vector (with no precision loss) if the length falls within the given range XMVECTOR Control = XMVectorEqualInt(ControlMax, ControlMin); - Result = XMVectorSelect(Result, V, Control); + Result = XMVectorSelect(Result, V, Control); return Result; } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector2Reflect -( - FXMVECTOR Incident, - FXMVECTOR Normal -) noexcept +inline XMVECTOR XM_CALLCONV XMVector2Reflect(FXMVECTOR Incident, FXMVECTOR Normal) noexcept { // Result = Incident - (2 * dot(Incident, Normal)) * Normal @@ -7223,12 +6495,7 @@ inline XMVECTOR XM_CALLCONV XMVector2Reflect //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector2Refract -( - FXMVECTOR Incident, - FXMVECTOR Normal, - float RefractionIndex -) noexcept +inline XMVECTOR XM_CALLCONV XMVector2Refract(FXMVECTOR Incident, FXMVECTOR Normal, float RefractionIndex) noexcept { XMVECTOR Index = XMVectorReplicate(RefractionIndex); return XMVector2RefractV(Incident, Normal, Index); @@ -7237,12 +6504,7 @@ inline XMVECTOR XM_CALLCONV XMVector2Refract //------------------------------------------------------------------------------ // Return the refraction of a 2D vector -inline XMVECTOR XM_CALLCONV XMVector2RefractV -( - FXMVECTOR Incident, - FXMVECTOR Normal, - FXMVECTOR RefractionIndex -) noexcept +inline XMVECTOR XM_CALLCONV XMVector2RefractV(FXMVECTOR Incident, FXMVECTOR Normal, FXMVECTOR RefractionIndex) noexcept { // Result = RefractionIndex * Incident - Normal * (RefractionIndex * dot(Incident, Normal) + // sqrt(1 - RefractionIndex * RefractionIndex * (1 - dot(Incident, Normal) * dot(Incident, Normal)))) @@ -7253,10 +6515,11 @@ inline XMVECTOR XM_CALLCONV XMVector2RefractV // R = 1.0f - RefractionIndex * RefractionIndex * (1.0f - IDotN * IDotN) float RY = 1.0f - (IDotN * IDotN); float RX = 1.0f - (RY * RefractionIndex.vector4_f32[0] * RefractionIndex.vector4_f32[0]); - RY = 1.0f - (RY * RefractionIndex.vector4_f32[1] * RefractionIndex.vector4_f32[1]); + RY = 1.0f - (RY * RefractionIndex.vector4_f32[1] * RefractionIndex.vector4_f32[1]); if (RX >= 0.0f) { - RX = (RefractionIndex.vector4_f32[0] * Incident.vector4_f32[0]) - (Normal.vector4_f32[0] * ((RefractionIndex.vector4_f32[0] * IDotN) + sqrtf(RX))); + RX = (RefractionIndex.vector4_f32[0] * Incident.vector4_f32[0]) + - (Normal.vector4_f32[0] * ((RefractionIndex.vector4_f32[0] * IDotN) + sqrtf(RX))); } else { @@ -7264,7 +6527,8 @@ inline XMVECTOR XM_CALLCONV XMVector2RefractV } if (RY >= 0.0f) { - RY = (RefractionIndex.vector4_f32[1] * Incident.vector4_f32[1]) - (Normal.vector4_f32[1] * ((RefractionIndex.vector4_f32[1] * IDotN) + sqrtf(RY))); + RY = (RefractionIndex.vector4_f32[1] * Incident.vector4_f32[1]) + - (Normal.vector4_f32[1] * ((RefractionIndex.vector4_f32[1] * IDotN) + sqrtf(RY))); } else { @@ -7279,8 +6543,8 @@ inline XMVECTOR XM_CALLCONV XMVector2RefractV return vResult; #elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t IL = vget_low_f32(Incident); - float32x2_t NL = vget_low_f32(Normal); + float32x2_t IL = vget_low_f32(Incident); + float32x2_t NL = vget_low_f32(Normal); float32x2_t RIL = vget_low_f32(RefractionIndex); // Get the 2D Dot product of Incident-Normal float32x2_t vTemp = vmul_f32(IL, NL); @@ -7299,13 +6563,13 @@ inline XMVECTOR XM_CALLCONV XMVector2RefractV float32x2_t P1 = vmul_f32(vTemp, S1); float32x2_t R1 = vrsqrts_f32(P1, S1); float32x2_t S2 = vmul_f32(S1, R1); - vTemp = vmul_f32(vTemp, S2); + vTemp = vmul_f32(vTemp, S2); // R = RefractionIndex * IDotN + sqrt(R) vTemp = vmla_f32(vTemp, RIL, IDotN); // Result = RefractionIndex * Incident - Normal * R float32x2_t vResult = vmul_f32(RIL, IL); - vResult = vmls_f32(vResult, vTemp, NL); - vResult = vreinterpret_f32_u32(vand_u32(vreinterpret_u32_f32(vResult), vMask)); + vResult = vmls_f32(vResult, vTemp, NL); + vResult = vreinterpret_f32_u32(vand_u32(vreinterpret_u32_f32(vResult), vMask)); return vcombine_f32(vResult, vResult); #elif defined(_XM_SSE_INTRINSICS_) // Result = RefractionIndex * Incident - Normal * (RefractionIndex * dot(Incident, Normal) + @@ -7314,8 +6578,8 @@ inline XMVECTOR XM_CALLCONV XMVector2RefractV XMVECTOR IDotN = XMVector2Dot(Incident, Normal); // vTemp = 1.0f - RefractionIndex * RefractionIndex * (1.0f - IDotN * IDotN) XMVECTOR vTemp = XM_FNMADD_PS(IDotN, IDotN, g_XMOne); - vTemp = _mm_mul_ps(vTemp, RefractionIndex); - vTemp = XM_FNMADD_PS(vTemp, RefractionIndex, g_XMOne); + vTemp = _mm_mul_ps(vTemp, RefractionIndex); + vTemp = XM_FNMADD_PS(vTemp, RefractionIndex, g_XMOne); // If any terms are <=0, sqrt() will fail, punt to zero XMVECTOR vMask = _mm_cmpgt_ps(vTemp, g_XMZero); // R = RefractionIndex * IDotN + sqrt(R) @@ -7323,8 +6587,8 @@ inline XMVECTOR XM_CALLCONV XMVector2RefractV vTemp = XM_FMADD_PS(RefractionIndex, IDotN, vTemp); // Result = RefractionIndex * Incident - Normal * R XMVECTOR vResult = _mm_mul_ps(RefractionIndex, Incident); - vResult = XM_FNMADD_PS(vTemp, Normal, vResult); - vResult = _mm_and_ps(vResult, vMask); + vResult = XM_FNMADD_PS(vTemp, Normal, vResult); + vResult = _mm_and_ps(vResult, vMask); return vResult; #endif } @@ -7335,63 +6599,46 @@ inline XMVECTOR XM_CALLCONV XMVector2Orthogonal(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - -V.vector4_f32[1], - V.vector4_f32[0], - 0.f, - 0.f - } } }; + XMVECTORF32 Result = { { { -V.vector4_f32[1], V.vector4_f32[0], 0.f, 0.f } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) static const XMVECTORF32 Negate = { { { -1.f, 1.f, 0, 0 } } }; - const float32x2_t zero = vdup_n_f32(0); + const float32x2_t zero = vdup_n_f32(0); - float32x2_t VL = vget_low_f32(V); + float32x2_t VL = vget_low_f32(V); float32x2_t Result = vmul_f32(vrev64_f32(VL), vget_low_f32(Negate)); return vcombine_f32(Result, zero); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 2, 0, 1)); - vResult = _mm_mul_ps(vResult, g_XMNegateX); + vResult = _mm_mul_ps(vResult, g_XMNegateX); return vResult; #endif } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector2AngleBetweenNormalsEst -( - FXMVECTOR N1, - FXMVECTOR N2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVector2AngleBetweenNormalsEst(FXMVECTOR N1, FXMVECTOR N2) noexcept { XMVECTOR Result = XMVector2Dot(N1, N2); - Result = XMVectorClamp(Result, g_XMNegativeOne.v, g_XMOne.v); - Result = XMVectorACosEst(Result); + Result = XMVectorClamp(Result, g_XMNegativeOne.v, g_XMOne.v); + Result = XMVectorACosEst(Result); return Result; } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector2AngleBetweenNormals -( - FXMVECTOR N1, - FXMVECTOR N2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVector2AngleBetweenNormals(FXMVECTOR N1, FXMVECTOR N2) noexcept { XMVECTOR Result = XMVector2Dot(N1, N2); - Result = XMVectorClamp(Result, g_XMNegativeOne, g_XMOne); - Result = XMVectorACos(Result); + Result = XMVectorClamp(Result, g_XMNegativeOne, g_XMOne); + Result = XMVectorACos(Result); return Result; } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector2AngleBetweenVectors -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVector2AngleBetweenVectors(FXMVECTOR V1, FXMVECTOR V2) noexcept { XMVECTOR L1 = XMVector2ReciprocalLength(V1); XMVECTOR L2 = XMVector2ReciprocalLength(V2); @@ -7401,19 +6648,14 @@ inline XMVECTOR XM_CALLCONV XMVector2AngleBetweenVectors L1 = XMVectorMultiply(L1, L2); XMVECTOR CosAngle = XMVectorMultiply(Dot, L1); - CosAngle = XMVectorClamp(CosAngle, g_XMNegativeOne.v, g_XMOne.v); + CosAngle = XMVectorClamp(CosAngle, g_XMNegativeOne.v, g_XMOne.v); return XMVectorACos(CosAngle); } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector2LinePointDistance -( - FXMVECTOR LinePoint1, - FXMVECTOR LinePoint2, - FXMVECTOR Point -) noexcept +inline XMVECTOR XM_CALLCONV XMVector2LinePointDistance(FXMVECTOR LinePoint1, FXMVECTOR LinePoint2, FXMVECTOR Point) noexcept { // Given a vector PointVector from LinePoint1 to Point and a vector // LineVector from LinePoint1 to LinePoint2, the scaled distance @@ -7423,28 +6665,25 @@ inline XMVECTOR XM_CALLCONV XMVector2LinePointDistance // PointProjectionScale = dot(PointVector, LineVector) / LengthSq(LineVector) XMVECTOR PointVector = XMVectorSubtract(Point, LinePoint1); - XMVECTOR LineVector = XMVectorSubtract(LinePoint2, LinePoint1); + XMVECTOR LineVector = XMVectorSubtract(LinePoint2, LinePoint1); XMVECTOR LengthSq = XMVector2LengthSq(LineVector); XMVECTOR PointProjectionScale = XMVector2Dot(PointVector, LineVector); - PointProjectionScale = XMVectorDivide(PointProjectionScale, LengthSq); + PointProjectionScale = XMVectorDivide(PointProjectionScale, LengthSq); XMVECTOR DistanceVector = XMVectorMultiply(LineVector, PointProjectionScale); - DistanceVector = XMVectorSubtract(PointVector, DistanceVector); + DistanceVector = XMVectorSubtract(PointVector, DistanceVector); return XMVector2Length(DistanceVector); } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector2IntersectLine -( - FXMVECTOR Line1Point1, - FXMVECTOR Line1Point2, - FXMVECTOR Line2Point1, - GXMVECTOR Line2Point2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVector2IntersectLine(FXMVECTOR Line1Point1, + FXMVECTOR Line1Point2, + FXMVECTOR Line2Point1, + GXMVECTOR Line2Point2) noexcept { #if defined(_XM_NO_INTRINSICS_) || defined(_XM_ARM_NEON_INTRINSICS_) @@ -7455,7 +6694,7 @@ inline XMVECTOR XM_CALLCONV XMVector2IntersectLine XMVECTOR C1 = XMVector2Cross(V1, V2); XMVECTOR C2 = XMVector2Cross(V2, V3); - XMVECTOR Result; + XMVECTOR Result; const XMVECTOR Zero = XMVectorZero(); if (XMVector2NearEqual(C1, Zero, g_XMEpsilon.v)) { @@ -7474,8 +6713,8 @@ inline XMVECTOR XM_CALLCONV XMVector2IntersectLine { // Intersection point = Line1Point1 + V1 * (C2 / C1) XMVECTOR Scale = XMVectorReciprocal(C1); - Scale = XMVectorMultiply(C2, Scale); - Result = XMVectorMultiplyAdd(V1, Scale, Line1Point1); + Scale = XMVectorMultiply(C2, Scale); + Result = XMVectorMultiplyAdd(V1, Scale, Line1Point1); } return Result; @@ -7489,37 +6728,33 @@ inline XMVECTOR XM_CALLCONV XMVector2IntersectLine XMVECTOR C2 = XMVector2Cross(V2, V3); // If C1 is not close to epsilon, use the calculated value XMVECTOR vResultMask = _mm_setzero_ps(); - vResultMask = _mm_sub_ps(vResultMask, C1); - vResultMask = _mm_max_ps(vResultMask, C1); + vResultMask = _mm_sub_ps(vResultMask, C1); + vResultMask = _mm_max_ps(vResultMask, C1); // 0xFFFFFFFF if the calculated value is to be used vResultMask = _mm_cmpgt_ps(vResultMask, g_XMEpsilon); // If C1 is close to epsilon, which fail type is it? INFINITY or NAN? XMVECTOR vFailMask = _mm_setzero_ps(); - vFailMask = _mm_sub_ps(vFailMask, C2); - vFailMask = _mm_max_ps(vFailMask, C2); - vFailMask = _mm_cmple_ps(vFailMask, g_XMEpsilon); - XMVECTOR vFail = _mm_and_ps(vFailMask, g_XMInfinity); - vFailMask = _mm_andnot_ps(vFailMask, g_XMQNaN); + vFailMask = _mm_sub_ps(vFailMask, C2); + vFailMask = _mm_max_ps(vFailMask, C2); + vFailMask = _mm_cmple_ps(vFailMask, g_XMEpsilon); + XMVECTOR vFail = _mm_and_ps(vFailMask, g_XMInfinity); + vFailMask = _mm_andnot_ps(vFailMask, g_XMQNaN); // vFail is NAN or INF vFail = _mm_or_ps(vFail, vFailMask); // Intersection point = Line1Point1 + V1 * (C2 / C1) XMVECTOR vResult = _mm_div_ps(C2, C1); - vResult = XM_FMADD_PS(vResult, V1, Line1Point1); + vResult = XM_FMADD_PS(vResult, V1, Line1Point1); // Use result, or failure value - vResult = _mm_and_ps(vResult, vResultMask); + vResult = _mm_and_ps(vResult, vResultMask); vResultMask = _mm_andnot_ps(vResultMask, vFail); - vResult = _mm_or_ps(vResult, vResultMask); + vResult = _mm_or_ps(vResult, vResultMask); return vResult; #endif } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector2Transform -( - FXMVECTOR V, - FXMMATRIX M -) noexcept +inline XMVECTOR XM_CALLCONV XMVector2Transform(FXMVECTOR V, FXMMATRIX M) noexcept { #if defined(_XM_NO_INTRINSICS_) @@ -7527,35 +6762,31 @@ inline XMVECTOR XM_CALLCONV XMVector2Transform XMVECTOR X = XMVectorSplatX(V); XMVECTOR Result = XMVectorMultiplyAdd(Y, M.r[1], M.r[3]); - Result = XMVectorMultiplyAdd(X, M.r[0], Result); + Result = XMVectorMultiplyAdd(X, M.r[0], Result); return Result; #elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t VL = vget_low_f32(V); + float32x2_t VL = vget_low_f32(V); float32x4_t Result = vmlaq_lane_f32(M.r[3], M.r[1], VL, 1); // Y - return vmlaq_lane_f32(Result, M.r[0], VL, 0); // X + return vmlaq_lane_f32(Result, M.r[0], VL, 0); // X #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = XM_FMADD_PS(vResult, M.r[1], M.r[3]); - XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); // X - vResult = XM_FMADD_PS(vTemp, M.r[0], vResult); + vResult = XM_FMADD_PS(vResult, M.r[1], M.r[3]); + XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); // X + vResult = XM_FMADD_PS(vTemp, M.r[0], vResult); return vResult; #endif } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMFLOAT4* XM_CALLCONV XMVector2TransformStream -( - XMFLOAT4* pOutputStream, - size_t OutputStride, - const XMFLOAT2* pInputStream, - size_t InputStride, - size_t VectorCount, - FXMMATRIX M -) noexcept +_Use_decl_annotations_ inline XMFLOAT4* XM_CALLCONV XMVector2TransformStream(XMFLOAT4* pOutputStream, + size_t OutputStride, + const XMFLOAT2* pInputStream, + size_t InputStride, + size_t VectorCount, + FXMMATRIX M) noexcept { assert(pOutputStream != nullptr); assert(pInputStream != nullptr); @@ -7568,7 +6799,7 @@ inline XMFLOAT4* XM_CALLCONV XMVector2TransformStream #if defined(_XM_NO_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); const XMVECTOR row0 = M.r[0]; @@ -7582,18 +6813,18 @@ inline XMFLOAT4* XM_CALLCONV XMVector2TransformStream XMVECTOR X = XMVectorSplatX(V); XMVECTOR Result = XMVectorMultiplyAdd(Y, row1, row3); - Result = XMVectorMultiplyAdd(X, row0, Result); + Result = XMVectorMultiplyAdd(X, row0, Result); - #ifdef _PREFAST_ - #pragma prefast(push) - #pragma prefast(disable : 26015, "PREfast noise: Esp:1307" ) - #endif +#ifdef _PREFAST_ +#pragma prefast(push) +#pragma prefast(disable : 26015, "PREfast noise: Esp:1307") +#endif XMStoreFloat4(reinterpret_cast(pOutputVector), Result); - #ifdef _PREFAST_ - #pragma prefast(pop) - #endif +#ifdef _PREFAST_ +#pragma prefast(pop) +#endif pInputVector += InputStride; pOutputVector += OutputStride; @@ -7602,14 +6833,14 @@ inline XMFLOAT4* XM_CALLCONV XMVector2TransformStream return pOutputStream; #elif defined(_XM_ARM_NEON_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); const XMVECTOR row0 = M.r[0]; const XMVECTOR row1 = M.r[1]; const XMVECTOR row3 = M.r[3]; - size_t i = 0; + size_t i = 0; size_t four = VectorCount >> 2; if (four > 0) { @@ -7620,27 +6851,27 @@ inline XMFLOAT4* XM_CALLCONV XMVector2TransformStream float32x4x2_t V = vld2q_f32(reinterpret_cast(pInputVector)); pInputVector += sizeof(XMFLOAT2) * 4; - float32x2_t r3 = vget_low_f32(row3); - float32x2_t r = vget_low_f32(row0); - XMVECTOR vResult0 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Ax+M - XMVECTOR vResult1 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Bx+N + float32x2_t r3 = vget_low_f32(row3); + float32x2_t r = vget_low_f32(row0); + XMVECTOR vResult0 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Ax+M + XMVECTOR vResult1 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Bx+N XM_PREFETCH(pInputVector); - r3 = vget_high_f32(row3); - r = vget_high_f32(row0); + r3 = vget_high_f32(row3); + r = vget_high_f32(row0); XMVECTOR vResult2 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Cx+O XMVECTOR vResult3 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Dx+P XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); - r = vget_low_f32(row1); + r = vget_low_f32(row1); vResult0 = vmlaq_lane_f32(vResult0, V.val[1], r, 0); // Ax+Ey+M vResult1 = vmlaq_lane_f32(vResult1, V.val[1], r, 1); // Bx+Fy+N XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 2)); - r = vget_high_f32(row1); + r = vget_high_f32(row1); vResult2 = vmlaq_lane_f32(vResult2, V.val[1], r, 0); // Cx+Gy+O vResult3 = vmlaq_lane_f32(vResult3, V.val[1], r, 1); // Dx+Hy+P @@ -7665,8 +6896,8 @@ inline XMFLOAT4* XM_CALLCONV XMVector2TransformStream float32x2_t V = vld1_f32(reinterpret_cast(pInputVector)); pInputVector += InputStride; - XMVECTOR vResult = vmlaq_lane_f32(row3, row0, V, 0); // X - vResult = vmlaq_lane_f32(vResult, row1, V, 1); // Y + XMVECTOR vResult = vmlaq_lane_f32(row3, row0, V, 0); // X + vResult = vmlaq_lane_f32(vResult, row1, V, 1); // Y vst1q_f32(reinterpret_cast(pOutputVector), vResult); pOutputVector += OutputStride; @@ -7674,10 +6905,10 @@ inline XMFLOAT4* XM_CALLCONV XMVector2TransformStream return pOutputStream; #elif defined(_XM_AVX2_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); - size_t i = 0; + size_t i = 0; size_t four = VectorCount >> 2; if (four > 0) { @@ -7702,12 +6933,12 @@ inline XMFLOAT4* XM_CALLCONV XMVector2TransformStream __m256 Y1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); __m256 X1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); - __m256 vTempB = _mm256_fmadd_ps(Y1, row1, row3); + __m256 vTempB = _mm256_fmadd_ps(Y1, row1, row3); __m256 vTempB2 = _mm256_fmadd_ps(Y2, row1, row3); - __m256 vTempA = _mm256_mul_ps(X1, row0); + __m256 vTempA = _mm256_mul_ps(X1, row0); __m256 vTempA2 = _mm256_mul_ps(X2, row0); - vTempA = _mm256_add_ps(vTempA, vTempB); - vTempA2 = _mm256_add_ps(vTempA2, vTempB2); + vTempA = _mm256_add_ps(vTempA, vTempB); + vTempA2 = _mm256_add_ps(vTempA2, vTempB2); X1 = _mm256_insertf128_ps(vTempA, _mm256_castps256_ps128(vTempA2), 1); XM256_STREAM_PS(reinterpret_cast(pOutputVector), X1); @@ -7733,12 +6964,12 @@ inline XMFLOAT4* XM_CALLCONV XMVector2TransformStream __m256 Y1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); __m256 X1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); - __m256 vTempB = _mm256_fmadd_ps(Y1, row1, row3); + __m256 vTempB = _mm256_fmadd_ps(Y1, row1, row3); __m256 vTempB2 = _mm256_fmadd_ps(Y2, row1, row3); - __m256 vTempA = _mm256_mul_ps(X1, row0); + __m256 vTempA = _mm256_mul_ps(X1, row0); __m256 vTempA2 = _mm256_mul_ps(X2, row0); - vTempA = _mm256_add_ps(vTempA, vTempB); - vTempA2 = _mm256_add_ps(vTempA2, vTempB2); + vTempA = _mm256_add_ps(vTempA, vTempB); + vTempA2 = _mm256_add_ps(vTempA2, vTempB2); X1 = _mm256_insertf128_ps(vTempA, _mm256_castps256_ps128(vTempA2), 1); _mm256_storeu_ps(reinterpret_cast(pOutputVector), X1); @@ -7765,12 +6996,12 @@ inline XMFLOAT4* XM_CALLCONV XMVector2TransformStream __m256 Y1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); __m256 X1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); - __m256 vTempB = _mm256_fmadd_ps(Y1, row1, row3); + __m256 vTempB = _mm256_fmadd_ps(Y1, row1, row3); __m256 vTempB2 = _mm256_fmadd_ps(Y2, row1, row3); - __m256 vTempA = _mm256_mul_ps(X1, row0); + __m256 vTempA = _mm256_mul_ps(X1, row0); __m256 vTempA2 = _mm256_mul_ps(X2, row0); - vTempA = _mm256_add_ps(vTempA, vTempB); - vTempA2 = _mm256_add_ps(vTempA2, vTempB2); + vTempA = _mm256_add_ps(vTempA, vTempB); + vTempA2 = _mm256_add_ps(vTempA2, vTempB2); _mm_storeu_ps(reinterpret_cast(pOutputVector), _mm256_castps256_ps128(vTempA)); pOutputVector += OutputStride; @@ -7804,9 +7035,9 @@ inline XMFLOAT4* XM_CALLCONV XMVector2TransformStream XMVECTOR Y = XM_PERMUTE_PS(xy, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(xy, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); + XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); XMVECTOR vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp2); _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -7817,14 +7048,14 @@ inline XMFLOAT4* XM_CALLCONV XMVector2TransformStream return pOutputStream; #elif defined(_XM_SSE_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); const XMVECTOR row0 = M.r[0]; const XMVECTOR row1 = M.r[1]; const XMVECTOR row3 = M.r[3]; - size_t i = 0; + size_t i = 0; size_t two = VectorCount >> 1; if (two > 0) { @@ -7841,9 +7072,9 @@ inline XMFLOAT4* XM_CALLCONV XMVector2TransformStream XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); + XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); XMVECTOR vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp2); XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -7851,9 +7082,9 @@ inline XMFLOAT4* XM_CALLCONV XMVector2TransformStream Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); X = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - vTemp = XM_FMADD_PS(Y, row1, row3); + vTemp = XM_FMADD_PS(Y, row1, row3); vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp2); XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -7872,9 +7103,9 @@ inline XMFLOAT4* XM_CALLCONV XMVector2TransformStream XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); + XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); XMVECTOR vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp2); _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -7882,9 +7113,9 @@ inline XMFLOAT4* XM_CALLCONV XMVector2TransformStream Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); X = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - vTemp = XM_FMADD_PS(Y, row1, row3); + vTemp = XM_FMADD_PS(Y, row1, row3); vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp2); _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -7908,9 +7139,9 @@ inline XMFLOAT4* XM_CALLCONV XMVector2TransformStream XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); + XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); XMVECTOR vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp2); XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -7927,9 +7158,9 @@ inline XMFLOAT4* XM_CALLCONV XMVector2TransformStream XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); + XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); XMVECTOR vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp2); _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -7947,9 +7178,9 @@ inline XMFLOAT4* XM_CALLCONV XMVector2TransformStream XMVECTOR Y = XM_PERMUTE_PS(xy, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(xy, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); + XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); XMVECTOR vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp2); _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -7964,17 +7195,13 @@ inline XMFLOAT4* XM_CALLCONV XMVector2TransformStream //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector2TransformCoord -( - FXMVECTOR V, - FXMMATRIX M -) noexcept +inline XMVECTOR XM_CALLCONV XMVector2TransformCoord(FXMVECTOR V, FXMMATRIX M) noexcept { XMVECTOR Y = XMVectorSplatY(V); XMVECTOR X = XMVectorSplatX(V); XMVECTOR Result = XMVectorMultiplyAdd(Y, M.r[1], M.r[3]); - Result = XMVectorMultiplyAdd(X, M.r[0], Result); + Result = XMVectorMultiplyAdd(X, M.r[0], Result); XMVECTOR W = XMVectorSplatW(Result); return XMVectorDivide(Result, W); @@ -7982,16 +7209,12 @@ inline XMVECTOR XM_CALLCONV XMVector2TransformCoord //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream -( - XMFLOAT2* pOutputStream, - size_t OutputStride, - const XMFLOAT2* pInputStream, - size_t InputStride, - size_t VectorCount, - FXMMATRIX M -) noexcept +_Use_decl_annotations_ inline XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream(XMFLOAT2* pOutputStream, + size_t OutputStride, + const XMFLOAT2* pInputStream, + size_t InputStride, + size_t VectorCount, + FXMMATRIX M) noexcept { assert(pOutputStream != nullptr); assert(pInputStream != nullptr); @@ -8004,7 +7227,7 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream #if defined(_XM_NO_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); const XMVECTOR row0 = M.r[0]; @@ -8018,22 +7241,22 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream XMVECTOR X = XMVectorSplatX(V); XMVECTOR Result = XMVectorMultiplyAdd(Y, row1, row3); - Result = XMVectorMultiplyAdd(X, row0, Result); + Result = XMVectorMultiplyAdd(X, row0, Result); XMVECTOR W = XMVectorSplatW(Result); Result = XMVectorDivide(Result, W); - #ifdef _PREFAST_ - #pragma prefast(push) - #pragma prefast(disable : 26015, "PREfast noise: Esp:1307" ) - #endif +#ifdef _PREFAST_ +#pragma prefast(push) +#pragma prefast(disable : 26015, "PREfast noise: Esp:1307") +#endif XMStoreFloat2(reinterpret_cast(pOutputVector), Result); - #ifdef _PREFAST_ - #pragma prefast(pop) - #endif +#ifdef _PREFAST_ +#pragma prefast(pop) +#endif pInputVector += InputStride; pOutputVector += OutputStride; @@ -8042,14 +7265,14 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream return pOutputStream; #elif defined(_XM_ARM_NEON_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); const XMVECTOR row0 = M.r[0]; const XMVECTOR row1 = M.r[1]; const XMVECTOR row3 = M.r[3]; - size_t i = 0; + size_t i = 0; size_t four = VectorCount >> 2; if (four > 0) { @@ -8060,20 +7283,20 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream float32x4x2_t V = vld2q_f32(reinterpret_cast(pInputVector)); pInputVector += sizeof(XMFLOAT2) * 4; - float32x2_t r3 = vget_low_f32(row3); - float32x2_t r = vget_low_f32(row0); - XMVECTOR vResult0 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Ax+M - XMVECTOR vResult1 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Bx+N + float32x2_t r3 = vget_low_f32(row3); + float32x2_t r = vget_low_f32(row0); + XMVECTOR vResult0 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Ax+M + XMVECTOR vResult1 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Bx+N XM_PREFETCH(pInputVector); - r3 = vget_high_f32(row3); - r = vget_high_f32(row0); + r3 = vget_high_f32(row3); + r = vget_high_f32(row0); XMVECTOR W = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Dx+P XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); - r = vget_low_f32(row1); + r = vget_low_f32(row1); vResult0 = vmlaq_lane_f32(vResult0, V.val[1], r, 0); // Ax+Ey+M vResult1 = vmlaq_lane_f32(vResult1, V.val[1], r, 1); // Bx+Fy+N @@ -8084,20 +7307,20 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 3)); - #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ +#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ V.val[0] = vdivq_f32(vResult0, W); V.val[1] = vdivq_f32(vResult1, W); - #else - // 2 iterations of Newton-Raphson refinement of reciprocal +#else + // 2 iterations of Newton-Raphson refinement of reciprocal float32x4_t Reciprocal = vrecpeq_f32(W); - float32x4_t S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); - S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); + float32x4_t S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); + S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); V.val[0] = vmulq_f32(vResult0, Reciprocal); V.val[1] = vmulq_f32(vResult1, Reciprocal); - #endif +#endif vst2q_f32(reinterpret_cast(pOutputVector), V); pOutputVector += sizeof(XMFLOAT2) * 4; @@ -8112,26 +7335,26 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream float32x2_t V = vld1_f32(reinterpret_cast(pInputVector)); pInputVector += InputStride; - XMVECTOR vResult = vmlaq_lane_f32(row3, row0, V, 0); // X - vResult = vmlaq_lane_f32(vResult, row1, V, 1); // Y + XMVECTOR vResult = vmlaq_lane_f32(row3, row0, V, 0); // X + vResult = vmlaq_lane_f32(vResult, row1, V, 1); // Y - V = vget_high_f32(vResult); + V = vget_high_f32(vResult); float32x2_t W = vdup_lane_f32(V, 1); - #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ +#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ V = vget_low_f32(vResult); V = vdiv_f32(V, W); - #else - // 2 iterations of Newton-Raphson refinement of reciprocal for W +#else + // 2 iterations of Newton-Raphson refinement of reciprocal for W float32x2_t Reciprocal = vrecpe_f32(W); - float32x2_t S = vrecps_f32(Reciprocal, W); - Reciprocal = vmul_f32(S, Reciprocal); - S = vrecps_f32(Reciprocal, W); - Reciprocal = vmul_f32(S, Reciprocal); + float32x2_t S = vrecps_f32(Reciprocal, W); + Reciprocal = vmul_f32(S, Reciprocal); + S = vrecps_f32(Reciprocal, W); + Reciprocal = vmul_f32(S, Reciprocal); V = vget_low_f32(vResult); V = vmul_f32(V, Reciprocal); - #endif +#endif vst1_f32(reinterpret_cast(pOutputVector), V); pOutputVector += OutputStride; @@ -8139,10 +7362,10 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream return pOutputStream; #elif defined(_XM_AVX2_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); - size_t i = 0; + size_t i = 0; size_t four = VectorCount >> 2; if (four > 0) { @@ -8167,17 +7390,17 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream __m256 Y1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); __m256 X1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); - __m256 vTempB = _mm256_fmadd_ps(Y1, row1, row3); + __m256 vTempB = _mm256_fmadd_ps(Y1, row1, row3); __m256 vTempB2 = _mm256_fmadd_ps(Y2, row1, row3); - __m256 vTempA = _mm256_mul_ps(X1, row0); + __m256 vTempA = _mm256_mul_ps(X1, row0); __m256 vTempA2 = _mm256_mul_ps(X2, row0); - vTempA = _mm256_add_ps(vTempA, vTempB); - vTempA2 = _mm256_add_ps(vTempA2, vTempB2); + vTempA = _mm256_add_ps(vTempA, vTempB); + vTempA2 = _mm256_add_ps(vTempA2, vTempB2); __m256 W = _mm256_shuffle_ps(vTempA, vTempA, _MM_SHUFFLE(3, 3, 3, 3)); - vTempA = _mm256_div_ps(vTempA, W); + vTempA = _mm256_div_ps(vTempA, W); - W = _mm256_shuffle_ps(vTempA2, vTempA2, _MM_SHUFFLE(3, 3, 3, 3)); + W = _mm256_shuffle_ps(vTempA2, vTempA2, _MM_SHUFFLE(3, 3, 3, 3)); vTempA2 = _mm256_div_ps(vTempA2, W); X1 = _mm256_shuffle_ps(vTempA, vTempA2, 0x44); @@ -8200,17 +7423,17 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream __m256 Y1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); __m256 X1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); - __m256 vTempB = _mm256_fmadd_ps(Y1, row1, row3); + __m256 vTempB = _mm256_fmadd_ps(Y1, row1, row3); __m256 vTempB2 = _mm256_fmadd_ps(Y2, row1, row3); - __m256 vTempA = _mm256_mul_ps(X1, row0); + __m256 vTempA = _mm256_mul_ps(X1, row0); __m256 vTempA2 = _mm256_mul_ps(X2, row0); - vTempA = _mm256_add_ps(vTempA, vTempB); - vTempA2 = _mm256_add_ps(vTempA2, vTempB2); + vTempA = _mm256_add_ps(vTempA, vTempB); + vTempA2 = _mm256_add_ps(vTempA2, vTempB2); __m256 W = _mm256_shuffle_ps(vTempA, vTempA, _MM_SHUFFLE(3, 3, 3, 3)); - vTempA = _mm256_div_ps(vTempA, W); + vTempA = _mm256_div_ps(vTempA, W); - W = _mm256_shuffle_ps(vTempA2, vTempA2, _MM_SHUFFLE(3, 3, 3, 3)); + W = _mm256_shuffle_ps(vTempA2, vTempA2, _MM_SHUFFLE(3, 3, 3, 3)); vTempA2 = _mm256_div_ps(vTempA2, W); X1 = _mm256_shuffle_ps(vTempA, vTempA2, 0x44); @@ -8234,33 +7457,29 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream __m256 Y1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); __m256 X1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); - __m256 vTempB = _mm256_fmadd_ps(Y1, row1, row3); + __m256 vTempB = _mm256_fmadd_ps(Y1, row1, row3); __m256 vTempB2 = _mm256_fmadd_ps(Y2, row1, row3); - __m256 vTempA = _mm256_mul_ps(X1, row0); + __m256 vTempA = _mm256_mul_ps(X1, row0); __m256 vTempA2 = _mm256_mul_ps(X2, row0); - vTempA = _mm256_add_ps(vTempA, vTempB); - vTempA2 = _mm256_add_ps(vTempA2, vTempB2); + vTempA = _mm256_add_ps(vTempA, vTempB); + vTempA2 = _mm256_add_ps(vTempA2, vTempB2); __m256 W = _mm256_shuffle_ps(vTempA, vTempA, _MM_SHUFFLE(3, 3, 3, 3)); - vTempA = _mm256_div_ps(vTempA, W); + vTempA = _mm256_div_ps(vTempA, W); - W = _mm256_shuffle_ps(vTempA2, vTempA2, _MM_SHUFFLE(3, 3, 3, 3)); + W = _mm256_shuffle_ps(vTempA2, vTempA2, _MM_SHUFFLE(3, 3, 3, 3)); vTempA2 = _mm256_div_ps(vTempA2, W); - _mm_store_sd(reinterpret_cast(pOutputVector), - _mm_castps_pd(_mm256_castps256_ps128(vTempA))); + _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(_mm256_castps256_ps128(vTempA))); pOutputVector += OutputStride; - _mm_store_sd(reinterpret_cast(pOutputVector), - _mm_castps_pd(_mm256_castps256_ps128(vTempA2))); + _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(_mm256_castps256_ps128(vTempA2))); pOutputVector += OutputStride; - _mm_store_sd(reinterpret_cast(pOutputVector), - _mm_castps_pd(_mm256_extractf128_ps(vTempA, 1))); + _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(_mm256_extractf128_ps(vTempA, 1))); pOutputVector += OutputStride; - _mm_store_sd(reinterpret_cast(pOutputVector), - _mm_castps_pd(_mm256_extractf128_ps(vTempA2, 1))); + _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(_mm256_extractf128_ps(vTempA2, 1))); pOutputVector += OutputStride; i += 4; @@ -8283,12 +7502,12 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream XMVECTOR Y = XM_PERMUTE_PS(xy, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(xy, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); + XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); XMVECTOR vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp2); XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - vTemp = _mm_div_ps(vTemp, W); + vTemp = _mm_div_ps(vTemp, W); _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(vTemp)); pOutputVector += OutputStride; @@ -8299,14 +7518,14 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream return pOutputStream; #elif defined(_XM_SSE_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); const XMVECTOR row0 = M.r[0]; const XMVECTOR row1 = M.r[1]; const XMVECTOR row3 = M.r[3]; - size_t i = 0; + size_t i = 0; size_t two = VectorCount >> 1; if (two > 0) { @@ -8326,9 +7545,9 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); + XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); XMVECTOR vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp2); XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); @@ -8338,9 +7557,9 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); X = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - vTemp = XM_FMADD_PS(Y, row1, row3); + vTemp = XM_FMADD_PS(Y, row1, row3); vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp2); W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); @@ -8366,9 +7585,9 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); + XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); XMVECTOR vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp2); XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); @@ -8378,9 +7597,9 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); X = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - vTemp = XM_FMADD_PS(Y, row1, row3); + vTemp = XM_FMADD_PS(Y, row1, row3); vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp2); W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); @@ -8407,9 +7626,9 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); + XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); XMVECTOR vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp2); XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); @@ -8422,9 +7641,9 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); X = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - vTemp = XM_FMADD_PS(Y, row1, row3); + vTemp = XM_FMADD_PS(Y, row1, row3); vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp2); W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); @@ -8450,9 +7669,9 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); + XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); XMVECTOR vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp2); XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); @@ -8473,9 +7692,9 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream XMVECTOR Y = XM_PERMUTE_PS(xy, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(xy, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); + XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); XMVECTOR vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp2); XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); @@ -8494,11 +7713,7 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector2TransformNormal -( - FXMVECTOR V, - FXMMATRIX M -) noexcept +inline XMVECTOR XM_CALLCONV XMVector2TransformNormal(FXMVECTOR V, FXMMATRIX M) noexcept { #if defined(_XM_NO_INTRINSICS_) @@ -8506,35 +7721,31 @@ inline XMVECTOR XM_CALLCONV XMVector2TransformNormal XMVECTOR X = XMVectorSplatX(V); XMVECTOR Result = XMVectorMultiply(Y, M.r[1]); - Result = XMVectorMultiplyAdd(X, M.r[0], Result); + Result = XMVectorMultiplyAdd(X, M.r[0], Result); return Result; #elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t VL = vget_low_f32(V); + float32x2_t VL = vget_low_f32(V); float32x4_t Result = vmulq_lane_f32(M.r[1], VL, 1); // Y - return vmlaq_lane_f32(Result, M.r[0], VL, 0); // X + return vmlaq_lane_f32(Result, M.r[0], VL, 0); // X #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = _mm_mul_ps(vResult, M.r[1]); - XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); // X - vResult = XM_FMADD_PS(vTemp, M.r[0], vResult); + vResult = _mm_mul_ps(vResult, M.r[1]); + XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); // X + vResult = XM_FMADD_PS(vTemp, M.r[0], vResult); return vResult; #endif } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMFLOAT2* XM_CALLCONV XMVector2TransformNormalStream -( - XMFLOAT2* pOutputStream, - size_t OutputStride, - const XMFLOAT2* pInputStream, - size_t InputStride, - size_t VectorCount, - FXMMATRIX M -) noexcept +_Use_decl_annotations_ inline XMFLOAT2* XM_CALLCONV XMVector2TransformNormalStream(XMFLOAT2* pOutputStream, + size_t OutputStride, + const XMFLOAT2* pInputStream, + size_t InputStride, + size_t VectorCount, + FXMMATRIX M) noexcept { assert(pOutputStream != nullptr); assert(pInputStream != nullptr); @@ -8547,7 +7758,7 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformNormalStream #if defined(_XM_NO_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); const XMVECTOR row0 = M.r[0]; @@ -8560,18 +7771,18 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformNormalStream XMVECTOR X = XMVectorSplatX(V); XMVECTOR Result = XMVectorMultiply(Y, row1); - Result = XMVectorMultiplyAdd(X, row0, Result); + Result = XMVectorMultiplyAdd(X, row0, Result); - #ifdef _PREFAST_ - #pragma prefast(push) - #pragma prefast(disable : 26015, "PREfast noise: Esp:1307" ) - #endif +#ifdef _PREFAST_ +#pragma prefast(push) +#pragma prefast(disable : 26015, "PREfast noise: Esp:1307") +#endif XMStoreFloat2(reinterpret_cast(pOutputVector), Result); - #ifdef _PREFAST_ - #pragma prefast(pop) - #endif +#ifdef _PREFAST_ +#pragma prefast(pop) +#endif pInputVector += InputStride; pOutputVector += OutputStride; @@ -8580,13 +7791,13 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformNormalStream return pOutputStream; #elif defined(_XM_ARM_NEON_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); const XMVECTOR row0 = M.r[0]; const XMVECTOR row1 = M.r[1]; - size_t i = 0; + size_t i = 0; size_t four = VectorCount >> 2; if (four > 0) { @@ -8597,14 +7808,14 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformNormalStream float32x4x2_t V = vld2q_f32(reinterpret_cast(pInputVector)); pInputVector += sizeof(XMFLOAT2) * 4; - float32x2_t r = vget_low_f32(row0); - XMVECTOR vResult0 = vmulq_lane_f32(V.val[0], r, 0); // Ax - XMVECTOR vResult1 = vmulq_lane_f32(V.val[0], r, 1); // Bx + float32x2_t r = vget_low_f32(row0); + XMVECTOR vResult0 = vmulq_lane_f32(V.val[0], r, 0); // Ax + XMVECTOR vResult1 = vmulq_lane_f32(V.val[0], r, 1); // Bx XM_PREFETCH(pInputVector); XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); - r = vget_low_f32(row1); + r = vget_low_f32(row1); vResult0 = vmlaq_lane_f32(vResult0, V.val[1], r, 0); // Ax+Ey vResult1 = vmlaq_lane_f32(vResult1, V.val[1], r, 1); // Bx+Fy @@ -8627,8 +7838,8 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformNormalStream float32x2_t V = vld1_f32(reinterpret_cast(pInputVector)); pInputVector += InputStride; - XMVECTOR vResult = vmulq_lane_f32(row0, V, 0); // X - vResult = vmlaq_lane_f32(vResult, row1, V, 1); // Y + XMVECTOR vResult = vmulq_lane_f32(row0, V, 0); // X + vResult = vmlaq_lane_f32(vResult, row1, V, 1); // Y V = vget_low_f32(vResult); vst1_f32(reinterpret_cast(pOutputVector), V); @@ -8637,10 +7848,10 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformNormalStream return pOutputStream; #elif defined(_XM_AVX2_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); - size_t i = 0; + size_t i = 0; size_t four = VectorCount >> 2; if (four > 0) { @@ -8666,8 +7877,8 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformNormalStream __m256 vTempA = _mm256_mul_ps(Y1, row1); __m256 vTempB = _mm256_mul_ps(Y2, row1); - vTempA = _mm256_fmadd_ps(X1, row0, vTempA); - vTempB = _mm256_fmadd_ps(X2, row0, vTempB); + vTempA = _mm256_fmadd_ps(X1, row0, vTempA); + vTempB = _mm256_fmadd_ps(X2, row0, vTempB); X1 = _mm256_shuffle_ps(vTempA, vTempB, 0x44); XM256_STREAM_PS(reinterpret_cast(pOutputVector), X1); @@ -8691,8 +7902,8 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformNormalStream __m256 vTempA = _mm256_mul_ps(Y1, row1); __m256 vTempB = _mm256_mul_ps(Y2, row1); - vTempA = _mm256_fmadd_ps(X1, row0, vTempA); - vTempB = _mm256_fmadd_ps(X2, row0, vTempB); + vTempA = _mm256_fmadd_ps(X1, row0, vTempA); + vTempB = _mm256_fmadd_ps(X2, row0, vTempB); X1 = _mm256_shuffle_ps(vTempA, vTempB, 0x44); _mm256_storeu_ps(reinterpret_cast(pOutputVector), X1); @@ -8717,23 +7928,19 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformNormalStream __m256 vTempA = _mm256_mul_ps(Y1, row1); __m256 vTempB = _mm256_mul_ps(Y2, row1); - vTempA = _mm256_fmadd_ps(X1, row0, vTempA); - vTempB = _mm256_fmadd_ps(X2, row0, vTempB); + vTempA = _mm256_fmadd_ps(X1, row0, vTempA); + vTempB = _mm256_fmadd_ps(X2, row0, vTempB); - _mm_store_sd(reinterpret_cast(pOutputVector), - _mm_castps_pd(_mm256_castps256_ps128(vTempA))); + _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(_mm256_castps256_ps128(vTempA))); pOutputVector += OutputStride; - _mm_store_sd(reinterpret_cast(pOutputVector), - _mm_castps_pd(_mm256_castps256_ps128(vTempB))); + _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(_mm256_castps256_ps128(vTempB))); pOutputVector += OutputStride; - _mm_store_sd(reinterpret_cast(pOutputVector), - _mm_castps_pd(_mm256_extractf128_ps(vTempA, 1))); + _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(_mm256_extractf128_ps(vTempA, 1))); pOutputVector += OutputStride; - _mm_store_sd(reinterpret_cast(pOutputVector), - _mm_castps_pd(_mm256_extractf128_ps(vTempB, 1))); + _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(_mm256_extractf128_ps(vTempB, 1))); pOutputVector += OutputStride; i += 4; @@ -8756,7 +7963,7 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformNormalStream XMVECTOR X = XM_PERMUTE_PS(xy, _MM_SHUFFLE(0, 0, 0, 0)); XMVECTOR vTemp = _mm_mul_ps(Y, row1); - vTemp = XM_FMADD_PS(X, row0, vTemp); + vTemp = XM_FMADD_PS(X, row0, vTemp); _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(vTemp)); pOutputVector += OutputStride; @@ -8767,13 +7974,13 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformNormalStream return pOutputStream; #elif defined(_XM_SSE_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); const XMVECTOR row0 = M.r[0]; const XMVECTOR row1 = M.r[1]; - size_t i = 0; + size_t i = 0; size_t two = VectorCount >> 1; if (two > 0) { @@ -8794,13 +8001,13 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformNormalStream XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); XMVECTOR vTemp = _mm_mul_ps(Y, row1); - XMVECTOR V1 = XM_FMADD_PS(X, row0, vTemp); + XMVECTOR V1 = XM_FMADD_PS(X, row0, vTemp); // Result 2 Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); X = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - vTemp = _mm_mul_ps(Y, row1); + vTemp = _mm_mul_ps(Y, row1); XMVECTOR V2 = XM_FMADD_PS(X, row0, vTemp); vTemp = _mm_movelh_ps(V1, V2); @@ -8824,13 +8031,13 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformNormalStream XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); XMVECTOR vTemp = _mm_mul_ps(Y, row1); - XMVECTOR V1 = XM_FMADD_PS(X, row0, vTemp); + XMVECTOR V1 = XM_FMADD_PS(X, row0, vTemp); // Result 2 Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); X = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - vTemp = _mm_mul_ps(Y, row1); + vTemp = _mm_mul_ps(Y, row1); XMVECTOR V2 = XM_FMADD_PS(X, row0, vTemp); vTemp = _mm_movelh_ps(V1, V2); @@ -8855,7 +8062,7 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformNormalStream XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); XMVECTOR vTemp = _mm_mul_ps(Y, row1); - vTemp = XM_FMADD_PS(X, row0, vTemp); + vTemp = XM_FMADD_PS(X, row0, vTemp); _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(vTemp)); pOutputVector += OutputStride; @@ -8888,7 +8095,7 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformNormalStream XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); XMVECTOR vTemp = _mm_mul_ps(Y, row1); - vTemp = XM_FMADD_PS(X, row0, vTemp); + vTemp = XM_FMADD_PS(X, row0, vTemp); _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(vTemp)); pOutputVector += OutputStride; @@ -8906,7 +8113,7 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformNormalStream XMVECTOR X = XM_PERMUTE_PS(xy, _MM_SHUFFLE(0, 0, 0, 0)); XMVECTOR vTemp = _mm_mul_ps(Y, row1); - vTemp = XM_FMADD_PS(X, row0, vTemp); + vTemp = XM_FMADD_PS(X, row0, vTemp); _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(vTemp)); pOutputVector += OutputStride; @@ -8931,18 +8138,16 @@ inline XMFLOAT2* XM_CALLCONV XMVector2TransformNormalStream //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector3Equal -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline bool XM_CALLCONV XMVector3Equal(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] == V2.vector4_f32[0]) && (V1.vector4_f32[1] == V2.vector4_f32[1]) && (V1.vector4_f32[2] == V2.vector4_f32[2])) != 0); + return ( + ((V1.vector4_f32[0] == V2.vector4_f32[0]) && (V1.vector4_f32[1] == V2.vector4_f32[1]) && (V1.vector4_f32[2] == V2.vector4_f32[2])) + != 0); #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32x4_t vResult = vceqq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) == 0xFFFFFFU); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vTemp = _mm_cmpeq_ps(V1, V2); @@ -8952,32 +8157,25 @@ inline bool XM_CALLCONV XMVector3Equal //------------------------------------------------------------------------------ -inline uint32_t XM_CALLCONV XMVector3EqualR -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline uint32_t XM_CALLCONV XMVector3EqualR(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) uint32_t CR = 0; - if ((V1.vector4_f32[0] == V2.vector4_f32[0]) && - (V1.vector4_f32[1] == V2.vector4_f32[1]) && - (V1.vector4_f32[2] == V2.vector4_f32[2])) + if ((V1.vector4_f32[0] == V2.vector4_f32[0]) && (V1.vector4_f32[1] == V2.vector4_f32[1]) && (V1.vector4_f32[2] == V2.vector4_f32[2])) { CR = XM_CRMASK_CR6TRUE; } - else if ((V1.vector4_f32[0] != V2.vector4_f32[0]) && - (V1.vector4_f32[1] != V2.vector4_f32[1]) && - (V1.vector4_f32[2] != V2.vector4_f32[2])) + else if ((V1.vector4_f32[0] != V2.vector4_f32[0]) && (V1.vector4_f32[1] != V2.vector4_f32[1]) + && (V1.vector4_f32[2] != V2.vector4_f32[2])) { CR = XM_CRMASK_CR6FALSE; } return CR; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU; + uint32x4_t vResult = vceqq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU; uint32_t CR = 0; if (r == 0xFFFFFFU) @@ -8991,8 +8189,8 @@ inline uint32_t XM_CALLCONV XMVector3EqualR return CR; #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vTemp = _mm_cmpeq_ps(V1, V2); - int iTest = _mm_movemask_ps(vTemp) & 7; - uint32_t CR = 0; + int iTest = _mm_movemask_ps(vTemp) & 7; + uint32_t CR = 0; if (iTest == 7) { CR = XM_CRMASK_CR6TRUE; @@ -9007,18 +8205,16 @@ inline uint32_t XM_CALLCONV XMVector3EqualR //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector3EqualInt -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline bool XM_CALLCONV XMVector3EqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_u32[0] == V2.vector4_u32[0]) && (V1.vector4_u32[1] == V2.vector4_u32[1]) && (V1.vector4_u32[2] == V2.vector4_u32[2])) != 0); + return ( + ((V1.vector4_u32[0] == V2.vector4_u32[0]) && (V1.vector4_u32[1] == V2.vector4_u32[1]) && (V1.vector4_u32[2] == V2.vector4_u32[2])) + != 0); #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) == 0xFFFFFFU); #elif defined(_XM_SSE_INTRINSICS_) __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); @@ -9028,32 +8224,25 @@ inline bool XM_CALLCONV XMVector3EqualInt //------------------------------------------------------------------------------ -inline uint32_t XM_CALLCONV XMVector3EqualIntR -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline uint32_t XM_CALLCONV XMVector3EqualIntR(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) uint32_t CR = 0; - if ((V1.vector4_u32[0] == V2.vector4_u32[0]) && - (V1.vector4_u32[1] == V2.vector4_u32[1]) && - (V1.vector4_u32[2] == V2.vector4_u32[2])) + if ((V1.vector4_u32[0] == V2.vector4_u32[0]) && (V1.vector4_u32[1] == V2.vector4_u32[1]) && (V1.vector4_u32[2] == V2.vector4_u32[2])) { CR = XM_CRMASK_CR6TRUE; } - else if ((V1.vector4_u32[0] != V2.vector4_u32[0]) && - (V1.vector4_u32[1] != V2.vector4_u32[1]) && - (V1.vector4_u32[2] != V2.vector4_u32[2])) + else if ((V1.vector4_u32[0] != V2.vector4_u32[0]) && (V1.vector4_u32[1] != V2.vector4_u32[1]) + && (V1.vector4_u32[2] != V2.vector4_u32[2])) { CR = XM_CRMASK_CR6FALSE; } return CR; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU; + uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU; uint32_t CR = 0; if (r == 0xFFFFFFU) @@ -9066,9 +8255,9 @@ inline uint32_t XM_CALLCONV XMVector3EqualIntR } return CR; #elif defined(_XM_SSE_INTRINSICS_) - __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); - int iTemp = _mm_movemask_ps(_mm_castsi128_ps(vTemp)) & 7; - uint32_t CR = 0; + __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); + int iTemp = _mm_movemask_ps(_mm_castsi128_ps(vTemp)) & 7; + uint32_t CR = 0; if (iTemp == 7) { CR = XM_CRMASK_CR6TRUE; @@ -9083,12 +8272,7 @@ inline uint32_t XM_CALLCONV XMVector3EqualIntR //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector3NearEqual -( - FXMVECTOR V1, - FXMVECTOR V2, - FXMVECTOR Epsilon -) noexcept +inline bool XM_CALLCONV XMVector3NearEqual(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR Epsilon) noexcept { #if defined(_XM_NO_INTRINSICS_) float dx, dy, dz; @@ -9096,9 +8280,7 @@ inline bool XM_CALLCONV XMVector3NearEqual dx = fabsf(V1.vector4_f32[0] - V2.vector4_f32[0]); dy = fabsf(V1.vector4_f32[1] - V2.vector4_f32[1]); dz = fabsf(V1.vector4_f32[2] - V2.vector4_f32[2]); - return (((dx <= Epsilon.vector4_f32[0]) && - (dy <= Epsilon.vector4_f32[1]) && - (dz <= Epsilon.vector4_f32[2])) != 0); + return (((dx <= Epsilon.vector4_f32[0]) && (dy <= Epsilon.vector4_f32[1]) && (dz <= Epsilon.vector4_f32[2])) != 0); #elif defined(_XM_ARM_NEON_INTRINSICS_) float32x4_t vDelta = vsubq_f32(V1, V2); #if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) @@ -9106,7 +8288,7 @@ inline bool XM_CALLCONV XMVector3NearEqual #else uint32x4_t vResult = vcleq_f32(vabsq_f32(vDelta), Epsilon); #endif - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) == 0xFFFFFFU); #elif defined(_XM_SSE_INTRINSICS_) @@ -9114,9 +8296,9 @@ inline bool XM_CALLCONV XMVector3NearEqual XMVECTOR vDelta = _mm_sub_ps(V1, V2); // Get the absolute value of the difference XMVECTOR vTemp = _mm_setzero_ps(); - vTemp = _mm_sub_ps(vTemp, vDelta); - vTemp = _mm_max_ps(vTemp, vDelta); - vTemp = _mm_cmple_ps(vTemp, Epsilon); + vTemp = _mm_sub_ps(vTemp, vDelta); + vTemp = _mm_max_ps(vTemp, vDelta); + vTemp = _mm_cmple_ps(vTemp, Epsilon); // w is don't care return (((_mm_movemask_ps(vTemp) & 7) == 0x7) != 0); #endif @@ -9124,18 +8306,16 @@ inline bool XM_CALLCONV XMVector3NearEqual //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector3NotEqual -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline bool XM_CALLCONV XMVector3NotEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] != V2.vector4_f32[0]) || (V1.vector4_f32[1] != V2.vector4_f32[1]) || (V1.vector4_f32[2] != V2.vector4_f32[2])) != 0); + return ( + ((V1.vector4_f32[0] != V2.vector4_f32[0]) || (V1.vector4_f32[1] != V2.vector4_f32[1]) || (V1.vector4_f32[2] != V2.vector4_f32[2])) + != 0); #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32x4_t vResult = vceqq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) != 0xFFFFFFU); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vTemp = _mm_cmpeq_ps(V1, V2); @@ -9145,18 +8325,16 @@ inline bool XM_CALLCONV XMVector3NotEqual //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector3NotEqualInt -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline bool XM_CALLCONV XMVector3NotEqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_u32[0] != V2.vector4_u32[0]) || (V1.vector4_u32[1] != V2.vector4_u32[1]) || (V1.vector4_u32[2] != V2.vector4_u32[2])) != 0); + return ( + ((V1.vector4_u32[0] != V2.vector4_u32[0]) || (V1.vector4_u32[1] != V2.vector4_u32[1]) || (V1.vector4_u32[2] != V2.vector4_u32[2])) + != 0); #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) != 0xFFFFFFU); #elif defined(_XM_SSE_INTRINSICS_) __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); @@ -9166,18 +8344,15 @@ inline bool XM_CALLCONV XMVector3NotEqualInt //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector3Greater -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline bool XM_CALLCONV XMVector3Greater(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] > V2.vector4_f32[0]) && (V1.vector4_f32[1] > V2.vector4_f32[1]) && (V1.vector4_f32[2] > V2.vector4_f32[2])) != 0); + return (((V1.vector4_f32[0] > V2.vector4_f32[0]) && (V1.vector4_f32[1] > V2.vector4_f32[1]) && (V1.vector4_f32[2] > V2.vector4_f32[2])) + != 0); #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcgtq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32x4_t vResult = vcgtq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) == 0xFFFFFFU); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vTemp = _mm_cmpgt_ps(V1, V2); @@ -9187,33 +8362,26 @@ inline bool XM_CALLCONV XMVector3Greater //------------------------------------------------------------------------------ -inline uint32_t XM_CALLCONV XMVector3GreaterR -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline uint32_t XM_CALLCONV XMVector3GreaterR(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) uint32_t CR = 0; - if ((V1.vector4_f32[0] > V2.vector4_f32[0]) && - (V1.vector4_f32[1] > V2.vector4_f32[1]) && - (V1.vector4_f32[2] > V2.vector4_f32[2])) + if ((V1.vector4_f32[0] > V2.vector4_f32[0]) && (V1.vector4_f32[1] > V2.vector4_f32[1]) && (V1.vector4_f32[2] > V2.vector4_f32[2])) { CR = XM_CRMASK_CR6TRUE; } - else if ((V1.vector4_f32[0] <= V2.vector4_f32[0]) && - (V1.vector4_f32[1] <= V2.vector4_f32[1]) && - (V1.vector4_f32[2] <= V2.vector4_f32[2])) + else if ((V1.vector4_f32[0] <= V2.vector4_f32[0]) && (V1.vector4_f32[1] <= V2.vector4_f32[1]) + && (V1.vector4_f32[2] <= V2.vector4_f32[2])) { CR = XM_CRMASK_CR6FALSE; } return CR; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcgtq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU; + uint32x4_t vResult = vcgtq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU; uint32_t CR = 0; if (r == 0xFFFFFFU) @@ -9227,8 +8395,8 @@ inline uint32_t XM_CALLCONV XMVector3GreaterR return CR; #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vTemp = _mm_cmpgt_ps(V1, V2); - uint32_t CR = 0; - int iTest = _mm_movemask_ps(vTemp) & 7; + uint32_t CR = 0; + int iTest = _mm_movemask_ps(vTemp) & 7; if (iTest == 7) { CR = XM_CRMASK_CR6TRUE; @@ -9243,18 +8411,16 @@ inline uint32_t XM_CALLCONV XMVector3GreaterR //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector3GreaterOrEqual -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline bool XM_CALLCONV XMVector3GreaterOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] >= V2.vector4_f32[0]) && (V1.vector4_f32[1] >= V2.vector4_f32[1]) && (V1.vector4_f32[2] >= V2.vector4_f32[2])) != 0); + return ( + ((V1.vector4_f32[0] >= V2.vector4_f32[0]) && (V1.vector4_f32[1] >= V2.vector4_f32[1]) && (V1.vector4_f32[2] >= V2.vector4_f32[2])) + != 0); #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcgeq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32x4_t vResult = vcgeq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) == 0xFFFFFFU); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vTemp = _mm_cmpge_ps(V1, V2); @@ -9264,34 +8430,26 @@ inline bool XM_CALLCONV XMVector3GreaterOrEqual //------------------------------------------------------------------------------ -inline uint32_t XM_CALLCONV XMVector3GreaterOrEqualR -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline uint32_t XM_CALLCONV XMVector3GreaterOrEqualR(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) uint32_t CR = 0; - if ((V1.vector4_f32[0] >= V2.vector4_f32[0]) && - (V1.vector4_f32[1] >= V2.vector4_f32[1]) && - (V1.vector4_f32[2] >= V2.vector4_f32[2])) + if ((V1.vector4_f32[0] >= V2.vector4_f32[0]) && (V1.vector4_f32[1] >= V2.vector4_f32[1]) && (V1.vector4_f32[2] >= V2.vector4_f32[2])) { CR = XM_CRMASK_CR6TRUE; } - else if ((V1.vector4_f32[0] < V2.vector4_f32[0]) && - (V1.vector4_f32[1] < V2.vector4_f32[1]) && - (V1.vector4_f32[2] < V2.vector4_f32[2])) + else if ((V1.vector4_f32[0] < V2.vector4_f32[0]) && (V1.vector4_f32[1] < V2.vector4_f32[1]) && (V1.vector4_f32[2] < V2.vector4_f32[2])) { CR = XM_CRMASK_CR6FALSE; } return CR; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcgeq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU; + uint32x4_t vResult = vcgeq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU; uint32_t CR = 0; if (r == 0xFFFFFFU) @@ -9305,8 +8463,8 @@ inline uint32_t XM_CALLCONV XMVector3GreaterOrEqualR return CR; #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vTemp = _mm_cmpge_ps(V1, V2); - uint32_t CR = 0; - int iTest = _mm_movemask_ps(vTemp) & 7; + uint32_t CR = 0; + int iTest = _mm_movemask_ps(vTemp) & 7; if (iTest == 7) { CR = XM_CRMASK_CR6TRUE; @@ -9321,18 +8479,15 @@ inline uint32_t XM_CALLCONV XMVector3GreaterOrEqualR //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector3Less -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline bool XM_CALLCONV XMVector3Less(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] < V2.vector4_f32[0]) && (V1.vector4_f32[1] < V2.vector4_f32[1]) && (V1.vector4_f32[2] < V2.vector4_f32[2])) != 0); + return (((V1.vector4_f32[0] < V2.vector4_f32[0]) && (V1.vector4_f32[1] < V2.vector4_f32[1]) && (V1.vector4_f32[2] < V2.vector4_f32[2])) + != 0); #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcltq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32x4_t vResult = vcltq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) == 0xFFFFFFU); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vTemp = _mm_cmplt_ps(V1, V2); @@ -9342,18 +8497,16 @@ inline bool XM_CALLCONV XMVector3Less //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector3LessOrEqual -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline bool XM_CALLCONV XMVector3LessOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] <= V2.vector4_f32[0]) && (V1.vector4_f32[1] <= V2.vector4_f32[1]) && (V1.vector4_f32[2] <= V2.vector4_f32[2])) != 0); + return ( + ((V1.vector4_f32[0] <= V2.vector4_f32[0]) && (V1.vector4_f32[1] <= V2.vector4_f32[1]) && (V1.vector4_f32[2] <= V2.vector4_f32[2])) + != 0); #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcleq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32x4_t vResult = vcleq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) == 0xFFFFFFU); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vTemp = _mm_cmple_ps(V1, V2); @@ -9363,16 +8516,13 @@ inline bool XM_CALLCONV XMVector3LessOrEqual //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector3InBounds -( - FXMVECTOR V, - FXMVECTOR Bounds -) noexcept +inline bool XM_CALLCONV XMVector3InBounds(FXMVECTOR V, FXMVECTOR Bounds) noexcept { #if defined(_XM_NO_INTRINSICS_) - return (((V.vector4_f32[0] <= Bounds.vector4_f32[0] && V.vector4_f32[0] >= -Bounds.vector4_f32[0]) && - (V.vector4_f32[1] <= Bounds.vector4_f32[1] && V.vector4_f32[1] >= -Bounds.vector4_f32[1]) && - (V.vector4_f32[2] <= Bounds.vector4_f32[2] && V.vector4_f32[2] >= -Bounds.vector4_f32[2])) != 0); + return (((V.vector4_f32[0] <= Bounds.vector4_f32[0] && V.vector4_f32[0] >= -Bounds.vector4_f32[0]) + && (V.vector4_f32[1] <= Bounds.vector4_f32[1] && V.vector4_f32[1] >= -Bounds.vector4_f32[1]) + && (V.vector4_f32[2] <= Bounds.vector4_f32[2] && V.vector4_f32[2] >= -Bounds.vector4_f32[2])) + != 0); #elif defined(_XM_ARM_NEON_INTRINSICS_) // Test if less than or equal uint32x4_t ivTemp1 = vcleq_f32(V, Bounds); @@ -9383,7 +8533,7 @@ inline bool XM_CALLCONV XMVector3InBounds // Blend answers ivTemp1 = vandq_u32(ivTemp1, ivTemp2); // in bounds? - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(ivTemp1)), vget_high_u8(vreinterpretq_u8_u32(ivTemp1))); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(ivTemp1)), vget_high_u8(vreinterpretq_u8_u32(ivTemp1))); uint16x4x2_t vTemp3 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); return ((vget_lane_u32(vreinterpret_u32_u16(vTemp3.val[1]), 1) & 0xFFFFFFU) == 0xFFFFFFU); #elif defined(_XM_SSE_INTRINSICS_) @@ -9413,18 +8563,16 @@ inline bool XM_CALLCONV XMVector3IsNaN(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - return (XMISNAN(V.vector4_f32[0]) || - XMISNAN(V.vector4_f32[1]) || - XMISNAN(V.vector4_f32[2])); + return (XMISNAN(V.vector4_f32[0]) || XMISNAN(V.vector4_f32[1]) || XMISNAN(V.vector4_f32[2])); #elif defined(_XM_ARM_NEON_INTRINSICS_) #if defined(__clang__) && __FINITE_MATH_ONLY__ return isnan(vgetq_lane_f32(V, 0)) || isnan(vgetq_lane_f32(V, 1)) || isnan(vgetq_lane_f32(V, 2)); #else -// Test against itself. NaN is always not equal - uint32x4_t vTempNan = vceqq_f32(V, V); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vTempNan)), vget_high_u8(vreinterpretq_u8_u32(vTempNan))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + // Test against itself. NaN is always not equal + uint32x4_t vTempNan = vceqq_f32(V, V); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vTempNan)), vget_high_u8(vreinterpretq_u8_u32(vTempNan))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); // If x or y or z are NaN, the mask is zero return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) != 0xFFFFFFU); #endif @@ -9434,7 +8582,7 @@ inline bool XM_CALLCONV XMVector3IsNaN(FXMVECTOR V) noexcept _mm_store_ps(tmp, V); return isnan(tmp[0]) || isnan(tmp[1]) || isnan(tmp[2]); #else -// Test against itself. NaN is always not equal + // Test against itself. NaN is always not equal XMVECTOR vTempNan = _mm_cmpneq_ps(V, V); // If x or y or z are NaN, the mask is non-zero return ((_mm_movemask_ps(vTempNan) & 7) != 0); @@ -9451,16 +8599,14 @@ inline bool XM_CALLCONV XMVector3IsNaN(FXMVECTOR V) noexcept inline bool XM_CALLCONV XMVector3IsInfinite(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - return (XMISINF(V.vector4_f32[0]) || - XMISINF(V.vector4_f32[1]) || - XMISINF(V.vector4_f32[2])); + return (XMISINF(V.vector4_f32[0]) || XMISINF(V.vector4_f32[1]) || XMISINF(V.vector4_f32[2])); #elif defined(_XM_ARM_NEON_INTRINSICS_) // Mask off the sign bit uint32x4_t vTempInf = vandq_u32(vreinterpretq_u32_f32(V), g_XMAbsMask); // Compare to infinity vTempInf = vceqq_f32(vreinterpretq_f32_u32(vTempInf), g_XMInfinity); // If any are infinity, the signs are true. - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vTempInf)), vget_high_u8(vreinterpretq_u8_u32(vTempInf))); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vTempInf)), vget_high_u8(vreinterpretq_u8_u32(vTempInf))); uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) != 0); #elif defined(_XM_SSE_INTRINSICS_) @@ -9479,34 +8625,27 @@ inline bool XM_CALLCONV XMVector3IsInfinite(FXMVECTOR V) noexcept //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector3Dot -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVector3Dot(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) float fValue = V1.vector4_f32[0] * V2.vector4_f32[0] + V1.vector4_f32[1] * V2.vector4_f32[1] + V1.vector4_f32[2] * V2.vector4_f32[2]; XMVECTORF32 vResult; - vResult.f[0] = - vResult.f[1] = - vResult.f[2] = - vResult.f[3] = fValue; + vResult.f[0] = vResult.f[1] = vResult.f[2] = vResult.f[3] = fValue; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) float32x4_t vTemp = vmulq_f32(V1, V2); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vpadd_f32(v1, v1); - v2 = vdup_lane_f32(v2, 0); - v1 = vadd_f32(v1, v2); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vpadd_f32(v1, v1); + v2 = vdup_lane_f32(v2, 0); + v1 = vadd_f32(v1, v2); return vcombine_f32(v1, v1); #elif defined(_XM_SSE4_INTRINSICS_) return _mm_dp_ps(V1, V2, 0x7f); #elif defined(_XM_SSE3_INTRINSICS_) XMVECTOR vTemp = _mm_mul_ps(V1, V2); - vTemp = _mm_and_ps(vTemp, g_XMMask3); - vTemp = _mm_hadd_ps(vTemp, vTemp); + vTemp = _mm_and_ps(vTemp, g_XMMask3); + vTemp = _mm_hadd_ps(vTemp, vTemp); return _mm_hadd_ps(vTemp, vTemp); #elif defined(_XM_SSE_INTRINSICS_) // Perform the dot product @@ -9526,21 +8665,15 @@ inline XMVECTOR XM_CALLCONV XMVector3Dot //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector3Cross -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVector3Cross(FXMVECTOR V1, FXMVECTOR V2) noexcept { // [ V1.y*V2.z - V1.z*V2.y, V1.z*V2.x - V1.x*V2.z, V1.x*V2.y - V1.y*V2.x ] #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - (V1.vector4_f32[1] * V2.vector4_f32[2]) - (V1.vector4_f32[2] * V2.vector4_f32[1]), - (V1.vector4_f32[2] * V2.vector4_f32[0]) - (V1.vector4_f32[0] * V2.vector4_f32[2]), - (V1.vector4_f32[0] * V2.vector4_f32[1]) - (V1.vector4_f32[1] * V2.vector4_f32[0]), - 0.0f - } } }; + XMVECTORF32 vResult = { { { (V1.vector4_f32[1] * V2.vector4_f32[2]) - (V1.vector4_f32[2] * V2.vector4_f32[1]), + (V1.vector4_f32[2] * V2.vector4_f32[0]) - (V1.vector4_f32[0] * V2.vector4_f32[2]), + (V1.vector4_f32[0] * V2.vector4_f32[1]) - (V1.vector4_f32[1] * V2.vector4_f32[0]), + 0.0f } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) float32x2_t v1xy = vget_low_f32(V1); @@ -9553,8 +8686,8 @@ inline XMVECTOR XM_CALLCONV XMVector3Cross float32x2_t v2zz = vdup_lane_f32(vget_high_f32(V2), 0); XMVECTOR vResult = vmulq_f32(vcombine_f32(v1yx, v1xy), vcombine_f32(v2zz, v2yx)); - vResult = vmlsq_f32(vResult, vcombine_f32(v1zz, v1yx), vcombine_f32(v2yx, v2xy)); - vResult = vreinterpretq_f32_u32(veorq_u32(vreinterpretq_u32_f32(vResult), g_XMFlipY)); + vResult = vmlsq_f32(vResult, vcombine_f32(v1zz, v1yx), vcombine_f32(v2yx, v2xy)); + vResult = vreinterpretq_f32_u32(veorq_u32(vreinterpretq_u32_f32(vResult), g_XMFlipY)); return vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(vResult), g_XMMask3)); #elif defined(_XM_SSE_INTRINSICS_) // y1,z1,x1,w1 @@ -9597,11 +8730,11 @@ inline XMVECTOR XM_CALLCONV XMVector3ReciprocalLengthEst(FXMVECTOR V) noexcept #elif defined(_XM_ARM_NEON_INTRINSICS_) // Dot3 float32x4_t vTemp = vmulq_f32(V, V); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vpadd_f32(v1, v1); - v2 = vdup_lane_f32(v2, 0); - v1 = vadd_f32(v1, v2); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vpadd_f32(v1, v1); + v2 = vdup_lane_f32(v2, 0); + v1 = vadd_f32(v1, v2); // Reciprocal sqrt (estimate) v2 = vrsqrte_f32(v1); return vcombine_f32(v2, v2); @@ -9610,10 +8743,10 @@ inline XMVECTOR XM_CALLCONV XMVector3ReciprocalLengthEst(FXMVECTOR V) noexcept return _mm_rsqrt_ps(vTemp); #elif defined(_XM_SSE3_INTRINSICS_) XMVECTOR vLengthSq = _mm_mul_ps(V, V); - vLengthSq = _mm_and_ps(vLengthSq, g_XMMask3); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_rsqrt_ps(vLengthSq); + vLengthSq = _mm_and_ps(vLengthSq, g_XMMask3); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_rsqrt_ps(vLengthSq); return vLengthSq; #elif defined(_XM_SSE_INTRINSICS_) // Perform the dot product on x,y and z @@ -9650,31 +8783,31 @@ inline XMVECTOR XM_CALLCONV XMVector3ReciprocalLength(FXMVECTOR V) noexcept #elif defined(_XM_ARM_NEON_INTRINSICS_) // Dot3 float32x4_t vTemp = vmulq_f32(V, V); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vpadd_f32(v1, v1); - v2 = vdup_lane_f32(v2, 0); - v1 = vadd_f32(v1, v2); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vpadd_f32(v1, v1); + v2 = vdup_lane_f32(v2, 0); + v1 = vadd_f32(v1, v2); // Reciprocal sqrt - float32x2_t S0 = vrsqrte_f32(v1); - float32x2_t P0 = vmul_f32(v1, S0); - float32x2_t R0 = vrsqrts_f32(P0, S0); - float32x2_t S1 = vmul_f32(S0, R0); - float32x2_t P1 = vmul_f32(v1, S1); - float32x2_t R1 = vrsqrts_f32(P1, S1); + float32x2_t S0 = vrsqrte_f32(v1); + float32x2_t P0 = vmul_f32(v1, S0); + float32x2_t R0 = vrsqrts_f32(P0, S0); + float32x2_t S1 = vmul_f32(S0, R0); + float32x2_t P1 = vmul_f32(v1, S1); + float32x2_t R1 = vrsqrts_f32(P1, S1); float32x2_t Result = vmul_f32(S1, R1); return vcombine_f32(Result, Result); #elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vTemp = _mm_dp_ps(V, V, 0x7f); + XMVECTOR vTemp = _mm_dp_ps(V, V, 0x7f); XMVECTOR vLengthSq = _mm_sqrt_ps(vTemp); return _mm_div_ps(g_XMOne, vLengthSq); #elif defined(_XM_SSE3_INTRINSICS_) XMVECTOR vDot = _mm_mul_ps(V, V); - vDot = _mm_and_ps(vDot, g_XMMask3); - vDot = _mm_hadd_ps(vDot, vDot); - vDot = _mm_hadd_ps(vDot, vDot); - vDot = _mm_sqrt_ps(vDot); - vDot = _mm_div_ps(g_XMOne, vDot); + vDot = _mm_and_ps(vDot, g_XMMask3); + vDot = _mm_hadd_ps(vDot, vDot); + vDot = _mm_hadd_ps(vDot, vDot); + vDot = _mm_sqrt_ps(vDot); + vDot = _mm_div_ps(g_XMOne, vDot); return vDot; #elif defined(_XM_SSE_INTRINSICS_) // Perform the dot product @@ -9712,28 +8845,28 @@ inline XMVECTOR XM_CALLCONV XMVector3LengthEst(FXMVECTOR V) noexcept #elif defined(_XM_ARM_NEON_INTRINSICS_) // Dot3 - float32x4_t vTemp = vmulq_f32(V, V); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vpadd_f32(v1, v1); - v2 = vdup_lane_f32(v2, 0); - v1 = vadd_f32(v1, v2); - const float32x2_t zero = vdup_n_f32(0); - uint32x2_t VEqualsZero = vceq_f32(v1, zero); + float32x4_t vTemp = vmulq_f32(V, V); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vpadd_f32(v1, v1); + v2 = vdup_lane_f32(v2, 0); + v1 = vadd_f32(v1, v2); + const float32x2_t zero = vdup_n_f32(0); + uint32x2_t VEqualsZero = vceq_f32(v1, zero); // Sqrt (estimate) float32x2_t Result = vrsqrte_f32(v1); - Result = vmul_f32(v1, Result); - Result = vbsl_f32(VEqualsZero, zero, Result); + Result = vmul_f32(v1, Result); + Result = vbsl_f32(VEqualsZero, zero, Result); return vcombine_f32(Result, Result); #elif defined(_XM_SSE4_INTRINSICS_) XMVECTOR vTemp = _mm_dp_ps(V, V, 0x7f); return _mm_sqrt_ps(vTemp); #elif defined(_XM_SSE3_INTRINSICS_) XMVECTOR vLengthSq = _mm_mul_ps(V, V); - vLengthSq = _mm_and_ps(vLengthSq, g_XMMask3); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_sqrt_ps(vLengthSq); + vLengthSq = _mm_and_ps(vLengthSq, g_XMMask3); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_sqrt_ps(vLengthSq); return vLengthSq; #elif defined(_XM_SSE_INTRINSICS_) // Perform the dot product on x,y and z @@ -9769,34 +8902,34 @@ inline XMVECTOR XM_CALLCONV XMVector3Length(FXMVECTOR V) noexcept #elif defined(_XM_ARM_NEON_INTRINSICS_) // Dot3 - float32x4_t vTemp = vmulq_f32(V, V); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vpadd_f32(v1, v1); - v2 = vdup_lane_f32(v2, 0); - v1 = vadd_f32(v1, v2); - const float32x2_t zero = vdup_n_f32(0); - uint32x2_t VEqualsZero = vceq_f32(v1, zero); + float32x4_t vTemp = vmulq_f32(V, V); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vpadd_f32(v1, v1); + v2 = vdup_lane_f32(v2, 0); + v1 = vadd_f32(v1, v2); + const float32x2_t zero = vdup_n_f32(0); + uint32x2_t VEqualsZero = vceq_f32(v1, zero); // Sqrt - float32x2_t S0 = vrsqrte_f32(v1); - float32x2_t P0 = vmul_f32(v1, S0); - float32x2_t R0 = vrsqrts_f32(P0, S0); - float32x2_t S1 = vmul_f32(S0, R0); - float32x2_t P1 = vmul_f32(v1, S1); - float32x2_t R1 = vrsqrts_f32(P1, S1); + float32x2_t S0 = vrsqrte_f32(v1); + float32x2_t P0 = vmul_f32(v1, S0); + float32x2_t R0 = vrsqrts_f32(P0, S0); + float32x2_t S1 = vmul_f32(S0, R0); + float32x2_t P1 = vmul_f32(v1, S1); + float32x2_t R1 = vrsqrts_f32(P1, S1); float32x2_t Result = vmul_f32(S1, R1); - Result = vmul_f32(v1, Result); - Result = vbsl_f32(VEqualsZero, zero, Result); + Result = vmul_f32(v1, Result); + Result = vbsl_f32(VEqualsZero, zero, Result); return vcombine_f32(Result, Result); #elif defined(_XM_SSE4_INTRINSICS_) XMVECTOR vTemp = _mm_dp_ps(V, V, 0x7f); return _mm_sqrt_ps(vTemp); #elif defined(_XM_SSE3_INTRINSICS_) XMVECTOR vLengthSq = _mm_mul_ps(V, V); - vLengthSq = _mm_and_ps(vLengthSq, g_XMMask3); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_sqrt_ps(vLengthSq); + vLengthSq = _mm_and_ps(vLengthSq, g_XMMask3); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_sqrt_ps(vLengthSq); return vLengthSq; #elif defined(_XM_SSE_INTRINSICS_) // Perform the dot product on x,y and z @@ -9833,26 +8966,26 @@ inline XMVECTOR XM_CALLCONV XMVector3NormalizeEst(FXMVECTOR V) noexcept #elif defined(_XM_ARM_NEON_INTRINSICS_) // Dot3 float32x4_t vTemp = vmulq_f32(V, V); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vpadd_f32(v1, v1); - v2 = vdup_lane_f32(v2, 0); - v1 = vadd_f32(v1, v2); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vpadd_f32(v1, v1); + v2 = vdup_lane_f32(v2, 0); + v1 = vadd_f32(v1, v2); // Reciprocal sqrt (estimate) v2 = vrsqrte_f32(v1); // Normalize return vmulq_f32(V, vcombine_f32(v2, v2)); #elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vTemp = _mm_dp_ps(V, V, 0x7f); + XMVECTOR vTemp = _mm_dp_ps(V, V, 0x7f); XMVECTOR vResult = _mm_rsqrt_ps(vTemp); return _mm_mul_ps(vResult, V); #elif defined(_XM_SSE3_INTRINSICS_) XMVECTOR vDot = _mm_mul_ps(V, V); - vDot = _mm_and_ps(vDot, g_XMMask3); - vDot = _mm_hadd_ps(vDot, vDot); - vDot = _mm_hadd_ps(vDot, vDot); - vDot = _mm_rsqrt_ps(vDot); - vDot = _mm_mul_ps(vDot, V); + vDot = _mm_and_ps(vDot, g_XMMask3); + vDot = _mm_hadd_ps(vDot, vDot); + vDot = _mm_hadd_ps(vDot, vDot); + vDot = _mm_rsqrt_ps(vDot); + vDot = _mm_mul_ps(vDot, V); return vDot; #elif defined(_XM_SSE_INTRINSICS_) // Perform the dot product @@ -9880,7 +9013,7 @@ inline XMVECTOR XM_CALLCONV XMVector3NormalizeEst(FXMVECTOR V) noexcept inline XMVECTOR XM_CALLCONV XMVector3Normalize(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - float fLength; + float fLength; XMVECTOR vResult; vResult = XMVector3Length(V); @@ -9900,14 +9033,14 @@ inline XMVECTOR XM_CALLCONV XMVector3Normalize(FXMVECTOR V) noexcept #elif defined(_XM_ARM_NEON_INTRINSICS_) // Dot3 - float32x4_t vTemp = vmulq_f32(V, V); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vpadd_f32(v1, v1); - v2 = vdup_lane_f32(v2, 0); - v1 = vadd_f32(v1, v2); + float32x4_t vTemp = vmulq_f32(V, V); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vpadd_f32(v1, v1); + v2 = vdup_lane_f32(v2, 0); + v1 = vadd_f32(v1, v2); uint32x2_t VEqualsZero = vceq_f32(v1, vdup_n_f32(0)); - uint32x2_t VEqualsInf = vceq_f32(v1, vget_low_f32(g_XMInfinity)); + uint32x2_t VEqualsInf = vceq_f32(v1, vget_low_f32(g_XMInfinity)); // Reciprocal sqrt (2 iterations of Newton-Raphson) float32x2_t S0 = vrsqrte_f32(v1); float32x2_t P0 = vmul_f32(v1, S0); @@ -9915,10 +9048,10 @@ inline XMVECTOR XM_CALLCONV XMVector3Normalize(FXMVECTOR V) noexcept float32x2_t S1 = vmul_f32(S0, R0); float32x2_t P1 = vmul_f32(v1, S1); float32x2_t R1 = vrsqrts_f32(P1, S1); - v2 = vmul_f32(S1, R1); + v2 = vmul_f32(S1, R1); // Normalize XMVECTOR vResult = vmulq_f32(V, vcombine_f32(v2, v2)); - vResult = vbslq_f32(vcombine_u32(VEqualsZero, VEqualsZero), vdupq_n_f32(0), vResult); + vResult = vbslq_f32(vcombine_u32(VEqualsZero, VEqualsZero), vdupq_n_f32(0), vResult); return vbslq_f32(vcombine_u32(VEqualsInf, VEqualsInf), g_XMQNaN, vResult); #elif defined(_XM_SSE4_INTRINSICS_) XMVECTOR vLengthSq = _mm_dp_ps(V, V, 0x7f); @@ -9938,14 +9071,14 @@ inline XMVECTOR XM_CALLCONV XMVector3Normalize(FXMVECTOR V) noexcept // Select qnan or result based on infinite length XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); - vResult = _mm_or_ps(vTemp1, vTemp2); + vResult = _mm_or_ps(vTemp1, vTemp2); return vResult; #elif defined(_XM_SSE3_INTRINSICS_) // Perform the dot product on x,y and z only XMVECTOR vLengthSq = _mm_mul_ps(V, V); - vLengthSq = _mm_and_ps(vLengthSq, g_XMMask3); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_and_ps(vLengthSq, g_XMMask3); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); // Prepare for the division XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); // Create zero with a single instruction @@ -9962,16 +9095,16 @@ inline XMVECTOR XM_CALLCONV XMVector3Normalize(FXMVECTOR V) noexcept // Select qnan or result based on infinite length XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); - vResult = _mm_or_ps(vTemp1, vTemp2); + vResult = _mm_or_ps(vTemp1, vTemp2); return vResult; #elif defined(_XM_SSE_INTRINSICS_) // Perform the dot product on x,y and z only XMVECTOR vLengthSq = _mm_mul_ps(V, V); - XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(2, 1, 2, 1)); - vLengthSq = _mm_add_ss(vLengthSq, vTemp); - vTemp = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(1, 1, 1, 1)); - vLengthSq = _mm_add_ss(vLengthSq, vTemp); - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); + XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(2, 1, 2, 1)); + vLengthSq = _mm_add_ss(vLengthSq, vTemp); + vTemp = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(1, 1, 1, 1)); + vLengthSq = _mm_add_ss(vLengthSq, vTemp); + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); // Prepare for the division XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); // Create zero with a single instruction @@ -9988,19 +9121,14 @@ inline XMVECTOR XM_CALLCONV XMVector3Normalize(FXMVECTOR V) noexcept // Select qnan or result based on infinite length XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); - vResult = _mm_or_ps(vTemp1, vTemp2); + vResult = _mm_or_ps(vTemp1, vTemp2); return vResult; #endif } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector3ClampLength -( - FXMVECTOR V, - float LengthMin, - float LengthMax -) noexcept +inline XMVECTOR XM_CALLCONV XMVector3ClampLength(FXMVECTOR V, float LengthMin, float LengthMax) noexcept { XMVECTOR ClampMax = XMVectorReplicate(LengthMax); XMVECTOR ClampMin = XMVectorReplicate(LengthMin); @@ -10010,12 +9138,7 @@ inline XMVECTOR XM_CALLCONV XMVector3ClampLength //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector3ClampLengthV -( - FXMVECTOR V, - FXMVECTOR LengthMin, - FXMVECTOR LengthMax -) noexcept +inline XMVECTOR XM_CALLCONV XMVector3ClampLengthV(FXMVECTOR V, FXMVECTOR LengthMin, FXMVECTOR LengthMax) noexcept { assert((XMVectorGetY(LengthMin) == XMVectorGetX(LengthMin)) && (XMVectorGetZ(LengthMin) == XMVectorGetX(LengthMin))); assert((XMVectorGetY(LengthMax) == XMVectorGetX(LengthMax)) && (XMVectorGetZ(LengthMax) == XMVectorGetX(LengthMax))); @@ -10030,56 +9153,47 @@ inline XMVECTOR XM_CALLCONV XMVector3ClampLengthV XMVECTOR RcpLength = XMVectorReciprocalSqrt(LengthSq); XMVECTOR InfiniteLength = XMVectorEqualInt(LengthSq, g_XMInfinity.v); - XMVECTOR ZeroLength = XMVectorEqual(LengthSq, Zero); + XMVECTOR ZeroLength = XMVectorEqual(LengthSq, Zero); XMVECTOR Normal = XMVectorMultiply(V, RcpLength); XMVECTOR Length = XMVectorMultiply(LengthSq, RcpLength); XMVECTOR Select = XMVectorEqualInt(InfiniteLength, ZeroLength); - Length = XMVectorSelect(LengthSq, Length, Select); - Normal = XMVectorSelect(LengthSq, Normal, Select); + Length = XMVectorSelect(LengthSq, Length, Select); + Normal = XMVectorSelect(LengthSq, Normal, Select); XMVECTOR ControlMax = XMVectorGreater(Length, LengthMax); XMVECTOR ControlMin = XMVectorLess(Length, LengthMin); XMVECTOR ClampLength = XMVectorSelect(Length, LengthMax, ControlMax); - ClampLength = XMVectorSelect(ClampLength, LengthMin, ControlMin); + ClampLength = XMVectorSelect(ClampLength, LengthMin, ControlMin); XMVECTOR Result = XMVectorMultiply(Normal, ClampLength); // Preserve the original vector (with no precision loss) if the length falls within the given range XMVECTOR Control = XMVectorEqualInt(ControlMax, ControlMin); - Result = XMVectorSelect(Result, V, Control); + Result = XMVectorSelect(Result, V, Control); return Result; } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector3Reflect -( - FXMVECTOR Incident, - FXMVECTOR Normal -) noexcept +inline XMVECTOR XM_CALLCONV XMVector3Reflect(FXMVECTOR Incident, FXMVECTOR Normal) noexcept { // Result = Incident - (2 * dot(Incident, Normal)) * Normal XMVECTOR Result = XMVector3Dot(Incident, Normal); - Result = XMVectorAdd(Result, Result); - Result = XMVectorNegativeMultiplySubtract(Result, Normal, Incident); + Result = XMVectorAdd(Result, Result); + Result = XMVectorNegativeMultiplySubtract(Result, Normal, Incident); return Result; } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector3Refract -( - FXMVECTOR Incident, - FXMVECTOR Normal, - float RefractionIndex -) noexcept +inline XMVECTOR XM_CALLCONV XMVector3Refract(FXMVECTOR Incident, FXMVECTOR Normal, float RefractionIndex) noexcept { XMVECTOR Index = XMVectorReplicate(RefractionIndex); return XMVector3RefractV(Incident, Normal, Index); @@ -10087,26 +9201,21 @@ inline XMVECTOR XM_CALLCONV XMVector3Refract //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector3RefractV -( - FXMVECTOR Incident, - FXMVECTOR Normal, - FXMVECTOR RefractionIndex -) noexcept +inline XMVECTOR XM_CALLCONV XMVector3RefractV(FXMVECTOR Incident, FXMVECTOR Normal, FXMVECTOR RefractionIndex) noexcept { // Result = RefractionIndex * Incident - Normal * (RefractionIndex * dot(Incident, Normal) + // sqrt(1 - RefractionIndex * RefractionIndex * (1 - dot(Incident, Normal) * dot(Incident, Normal)))) #if defined(_XM_NO_INTRINSICS_) - const XMVECTOR Zero = XMVectorZero(); + const XMVECTOR Zero = XMVectorZero(); XMVECTOR IDotN = XMVector3Dot(Incident, Normal); // R = 1.0f - RefractionIndex * RefractionIndex * (1.0f - IDotN * IDotN) XMVECTOR R = XMVectorNegativeMultiplySubtract(IDotN, IDotN, g_XMOne.v); - R = XMVectorMultiply(R, RefractionIndex); - R = XMVectorNegativeMultiplySubtract(R, RefractionIndex, g_XMOne.v); + R = XMVectorMultiply(R, RefractionIndex); + R = XMVectorNegativeMultiplySubtract(R, RefractionIndex, g_XMOne.v); if (XMVector4LessOrEqual(R, Zero)) { @@ -10121,7 +9230,7 @@ inline XMVECTOR XM_CALLCONV XMVector3RefractV // Result = RefractionIndex * Incident - Normal * R XMVECTOR Result = XMVectorMultiply(RefractionIndex, Incident); - Result = XMVectorNegativeMultiplySubtract(Normal, R, Result); + Result = XMVectorNegativeMultiplySubtract(Normal, R, Result); return Result; } @@ -10131,12 +9240,12 @@ inline XMVECTOR XM_CALLCONV XMVector3RefractV // R = 1.0f - RefractionIndex * RefractionIndex * (1.0f - IDotN * IDotN) float32x4_t R = vmlsq_f32(g_XMOne, IDotN, IDotN); - R = vmulq_f32(R, RefractionIndex); - R = vmlsq_f32(g_XMOne, R, RefractionIndex); + R = vmulq_f32(R, RefractionIndex); + R = vmlsq_f32(g_XMOne, R, RefractionIndex); - uint32x4_t isrzero = vcleq_f32(R, g_XMZero); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(isrzero)), vget_high_u8(vreinterpretq_u8_u32(isrzero))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32x4_t isrzero = vcleq_f32(R, g_XMZero); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(isrzero)), vget_high_u8(vreinterpretq_u8_u32(isrzero))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); float32x4_t vResult; if (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU) @@ -10154,7 +9263,7 @@ inline XMVECTOR XM_CALLCONV XMVector3RefractV float32x4_t P1 = vmulq_f32(R, S1); float32x4_t R1 = vrsqrtsq_f32(P1, S1); float32x4_t S2 = vmulq_f32(S1, R1); - R = vmulq_f32(R, S2); + R = vmulq_f32(R, S2); // R = RefractionIndex * IDotN + sqrt(R) R = vmlaq_f32(R, RefractionIndex, IDotN); // Result = RefractionIndex * Incident - Normal * R @@ -10167,9 +9276,9 @@ inline XMVECTOR XM_CALLCONV XMVector3RefractV // sqrt(1 - RefractionIndex * RefractionIndex * (1 - dot(Incident, Normal) * dot(Incident, Normal)))) XMVECTOR IDotN = XMVector3Dot(Incident, Normal); // R = 1.0f - RefractionIndex * RefractionIndex * (1.0f - IDotN * IDotN) - XMVECTOR R = XM_FNMADD_PS(IDotN, IDotN, g_XMOne); + XMVECTOR R = XM_FNMADD_PS(IDotN, IDotN, g_XMOne); XMVECTOR R2 = _mm_mul_ps(RefractionIndex, RefractionIndex); - R = XM_FNMADD_PS(R, R2, g_XMOne); + R = XM_FNMADD_PS(R, R2, g_XMOne); XMVECTOR vResult = _mm_cmple_ps(R, g_XMZero); if (_mm_movemask_ps(vResult) == 0x0f) @@ -10195,12 +9304,12 @@ inline XMVECTOR XM_CALLCONV XMVector3RefractV inline XMVECTOR XM_CALLCONV XMVector3Orthogonal(FXMVECTOR V) noexcept { XMVECTOR Zero = XMVectorZero(); - XMVECTOR Z = XMVectorSplatZ(V); + XMVECTOR Z = XMVectorSplatZ(V); XMVECTOR YZYY = XMVectorSwizzle(V); XMVECTOR NegativeV = XMVectorSubtract(Zero, V); - XMVECTOR ZIsNegative = XMVectorLess(Z, Zero); + XMVECTOR ZIsNegative = XMVectorLess(Z, Zero); XMVECTOR YZYYIsNegative = XMVectorLess(YZYY, Zero); XMVECTOR S = XMVectorAdd(YZYY, Z); @@ -10216,39 +9325,27 @@ inline XMVECTOR XM_CALLCONV XMVector3Orthogonal(FXMVECTOR V) noexcept //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector3AngleBetweenNormalsEst -( - FXMVECTOR N1, - FXMVECTOR N2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVector3AngleBetweenNormalsEst(FXMVECTOR N1, FXMVECTOR N2) noexcept { XMVECTOR Result = XMVector3Dot(N1, N2); - Result = XMVectorClamp(Result, g_XMNegativeOne.v, g_XMOne.v); - Result = XMVectorACosEst(Result); + Result = XMVectorClamp(Result, g_XMNegativeOne.v, g_XMOne.v); + Result = XMVectorACosEst(Result); return Result; } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector3AngleBetweenNormals -( - FXMVECTOR N1, - FXMVECTOR N2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVector3AngleBetweenNormals(FXMVECTOR N1, FXMVECTOR N2) noexcept { XMVECTOR Result = XMVector3Dot(N1, N2); - Result = XMVectorClamp(Result, g_XMNegativeOne.v, g_XMOne.v); - Result = XMVectorACos(Result); + Result = XMVectorClamp(Result, g_XMNegativeOne.v, g_XMOne.v); + Result = XMVectorACos(Result); return Result; } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector3AngleBetweenVectors -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVector3AngleBetweenVectors(FXMVECTOR V1, FXMVECTOR V2) noexcept { XMVECTOR L1 = XMVector3ReciprocalLength(V1); XMVECTOR L2 = XMVector3ReciprocalLength(V2); @@ -10258,19 +9355,14 @@ inline XMVECTOR XM_CALLCONV XMVector3AngleBetweenVectors L1 = XMVectorMultiply(L1, L2); XMVECTOR CosAngle = XMVectorMultiply(Dot, L1); - CosAngle = XMVectorClamp(CosAngle, g_XMNegativeOne.v, g_XMOne.v); + CosAngle = XMVectorClamp(CosAngle, g_XMNegativeOne.v, g_XMOne.v); return XMVectorACos(CosAngle); } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector3LinePointDistance -( - FXMVECTOR LinePoint1, - FXMVECTOR LinePoint2, - FXMVECTOR Point -) noexcept +inline XMVECTOR XM_CALLCONV XMVector3LinePointDistance(FXMVECTOR LinePoint1, FXMVECTOR LinePoint2, FXMVECTOR Point) noexcept { // Given a vector PointVector from LinePoint1 to Point and a vector // LineVector from LinePoint1 to LinePoint2, the scaled distance @@ -10280,29 +9372,25 @@ inline XMVECTOR XM_CALLCONV XMVector3LinePointDistance // PointProjectionScale = dot(PointVector, LineVector) / LengthSq(LineVector) XMVECTOR PointVector = XMVectorSubtract(Point, LinePoint1); - XMVECTOR LineVector = XMVectorSubtract(LinePoint2, LinePoint1); + XMVECTOR LineVector = XMVectorSubtract(LinePoint2, LinePoint1); XMVECTOR LengthSq = XMVector3LengthSq(LineVector); XMVECTOR PointProjectionScale = XMVector3Dot(PointVector, LineVector); - PointProjectionScale = XMVectorDivide(PointProjectionScale, LengthSq); + PointProjectionScale = XMVectorDivide(PointProjectionScale, LengthSq); XMVECTOR DistanceVector = XMVectorMultiply(LineVector, PointProjectionScale); - DistanceVector = XMVectorSubtract(PointVector, DistanceVector); + DistanceVector = XMVectorSubtract(PointVector, DistanceVector); return XMVector3Length(DistanceVector); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMVector3ComponentsFromNormal -( - XMVECTOR* pParallel, - XMVECTOR* pPerpendicular, - FXMVECTOR V, - FXMVECTOR Normal -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMVector3ComponentsFromNormal(XMVECTOR* pParallel, + XMVECTOR* pPerpendicular, + FXMVECTOR V, + FXMVECTOR Normal) noexcept { assert(pParallel != nullptr); assert(pPerpendicular != nullptr); @@ -10311,21 +9399,17 @@ inline void XM_CALLCONV XMVector3ComponentsFromNormal XMVECTOR Parallel = XMVectorMultiply(Normal, Scale); - *pParallel = Parallel; + *pParallel = Parallel; *pPerpendicular = XMVectorSubtract(V, Parallel); } //------------------------------------------------------------------------------ // Transform a vector using a rotation expressed as a unit quaternion -inline XMVECTOR XM_CALLCONV XMVector3Rotate -( - FXMVECTOR V, - FXMVECTOR RotationQuaternion -) noexcept +inline XMVECTOR XM_CALLCONV XMVector3Rotate(FXMVECTOR V, FXMVECTOR RotationQuaternion) noexcept { - XMVECTOR A = XMVectorSelect(g_XMSelect1110.v, V, g_XMSelect1110.v); - XMVECTOR Q = XMQuaternionConjugate(RotationQuaternion); + XMVECTOR A = XMVectorSelect(g_XMSelect1110.v, V, g_XMSelect1110.v); + XMVECTOR Q = XMQuaternionConjugate(RotationQuaternion); XMVECTOR Result = XMQuaternionMultiply(Q, A); return XMQuaternionMultiply(Result, RotationQuaternion); } @@ -10333,25 +9417,17 @@ inline XMVECTOR XM_CALLCONV XMVector3Rotate //------------------------------------------------------------------------------ // Transform a vector using the inverse of a rotation expressed as a unit quaternion -inline XMVECTOR XM_CALLCONV XMVector3InverseRotate -( - FXMVECTOR V, - FXMVECTOR RotationQuaternion -) noexcept +inline XMVECTOR XM_CALLCONV XMVector3InverseRotate(FXMVECTOR V, FXMVECTOR RotationQuaternion) noexcept { - XMVECTOR A = XMVectorSelect(g_XMSelect1110.v, V, g_XMSelect1110.v); + XMVECTOR A = XMVectorSelect(g_XMSelect1110.v, V, g_XMSelect1110.v); XMVECTOR Result = XMQuaternionMultiply(RotationQuaternion, A); - XMVECTOR Q = XMQuaternionConjugate(RotationQuaternion); + XMVECTOR Q = XMQuaternionConjugate(RotationQuaternion); return XMQuaternionMultiply(Result, Q); } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector3Transform -( - FXMVECTOR V, - FXMMATRIX M -) noexcept +inline XMVECTOR XM_CALLCONV XMVector3Transform(FXMVECTOR V, FXMMATRIX M) noexcept { #if defined(_XM_NO_INTRINSICS_) @@ -10360,23 +9436,23 @@ inline XMVECTOR XM_CALLCONV XMVector3Transform XMVECTOR X = XMVectorSplatX(V); XMVECTOR Result = XMVectorMultiplyAdd(Z, M.r[2], M.r[3]); - Result = XMVectorMultiplyAdd(Y, M.r[1], Result); - Result = XMVectorMultiplyAdd(X, M.r[0], Result); + Result = XMVectorMultiplyAdd(Y, M.r[1], Result); + Result = XMVectorMultiplyAdd(X, M.r[0], Result); return Result; #elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t VL = vget_low_f32(V); - XMVECTOR vResult = vmlaq_lane_f32(M.r[3], M.r[0], VL, 0); // X - vResult = vmlaq_lane_f32(vResult, M.r[1], VL, 1); // Y - return vmlaq_lane_f32(vResult, M.r[2], vget_high_f32(V), 0); // Z + float32x2_t VL = vget_low_f32(V); + XMVECTOR vResult = vmlaq_lane_f32(M.r[3], M.r[0], VL, 0); // X + vResult = vmlaq_lane_f32(vResult, M.r[1], VL, 1); // Y + return vmlaq_lane_f32(vResult, M.r[2], vget_high_f32(V), 0); // Z #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); // Z - vResult = XM_FMADD_PS(vResult, M.r[2], M.r[3]); - XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = XM_FMADD_PS(vTemp, M.r[1], vResult); - vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); // X - vResult = XM_FMADD_PS(vTemp, M.r[0], vResult); + vResult = XM_FMADD_PS(vResult, M.r[2], M.r[3]); + XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y + vResult = XM_FMADD_PS(vTemp, M.r[1], vResult); + vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); // X + vResult = XM_FMADD_PS(vTemp, M.r[0], vResult); return vResult; #endif } @@ -10385,19 +9461,15 @@ inline XMVECTOR XM_CALLCONV XMVector3Transform #ifdef _PREFAST_ #pragma prefast(push) -#pragma prefast(disable : 26015 26019, "PREfast noise: Esp:1307" ) +#pragma prefast(disable : 26015 26019, "PREfast noise: Esp:1307") #endif -_Use_decl_annotations_ -inline XMFLOAT4* XM_CALLCONV XMVector3TransformStream -( - XMFLOAT4* pOutputStream, - size_t OutputStride, - const XMFLOAT3* pInputStream, - size_t InputStride, - size_t VectorCount, - FXMMATRIX M -) noexcept +_Use_decl_annotations_ inline XMFLOAT4* XM_CALLCONV XMVector3TransformStream(XMFLOAT4* pOutputStream, + size_t OutputStride, + const XMFLOAT3* pInputStream, + size_t InputStride, + size_t VectorCount, + FXMMATRIX M) noexcept { assert(pOutputStream != nullptr); assert(pInputStream != nullptr); @@ -10410,7 +9482,7 @@ inline XMFLOAT4* XM_CALLCONV XMVector3TransformStream #if defined(_XM_NO_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); const XMVECTOR row0 = M.r[0]; @@ -10426,8 +9498,8 @@ inline XMFLOAT4* XM_CALLCONV XMVector3TransformStream XMVECTOR X = XMVectorSplatX(V); XMVECTOR Result = XMVectorMultiplyAdd(Z, row2, row3); - Result = XMVectorMultiplyAdd(Y, row1, Result); - Result = XMVectorMultiplyAdd(X, row0, Result); + Result = XMVectorMultiplyAdd(Y, row1, Result); + Result = XMVectorMultiplyAdd(X, row0, Result); XMStoreFloat4(reinterpret_cast(pOutputVector), Result); @@ -10438,7 +9510,7 @@ inline XMFLOAT4* XM_CALLCONV XMVector3TransformStream return pOutputStream; #elif defined(_XM_ARM_NEON_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); const XMVECTOR row0 = M.r[0]; @@ -10446,7 +9518,7 @@ inline XMFLOAT4* XM_CALLCONV XMVector3TransformStream const XMVECTOR row2 = M.r[2]; const XMVECTOR row3 = M.r[3]; - size_t i = 0; + size_t i = 0; size_t four = VectorCount >> 2; if (four > 0) { @@ -10457,39 +9529,39 @@ inline XMFLOAT4* XM_CALLCONV XMVector3TransformStream float32x4x3_t V = vld3q_f32(reinterpret_cast(pInputVector)); pInputVector += sizeof(XMFLOAT3) * 4; - float32x2_t r3 = vget_low_f32(row3); - float32x2_t r = vget_low_f32(row0); - XMVECTOR vResult0 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Ax+M - XMVECTOR vResult1 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Bx+N + float32x2_t r3 = vget_low_f32(row3); + float32x2_t r = vget_low_f32(row0); + XMVECTOR vResult0 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Ax+M + XMVECTOR vResult1 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Bx+N XM_PREFETCH(pInputVector); - r3 = vget_high_f32(row3); - r = vget_high_f32(row0); + r3 = vget_high_f32(row3); + r = vget_high_f32(row0); XMVECTOR vResult2 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Cx+O XMVECTOR vResult3 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Dx+P XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); - r = vget_low_f32(row1); + r = vget_low_f32(row1); vResult0 = vmlaq_lane_f32(vResult0, V.val[1], r, 0); // Ax+Ey+M vResult1 = vmlaq_lane_f32(vResult1, V.val[1], r, 1); // Bx+Fy+N XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 2)); - r = vget_high_f32(row1); + r = vget_high_f32(row1); vResult2 = vmlaq_lane_f32(vResult2, V.val[1], r, 0); // Cx+Gy+O vResult3 = vmlaq_lane_f32(vResult3, V.val[1], r, 1); // Dx+Hy+P XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 3)); - r = vget_low_f32(row2); + r = vget_low_f32(row2); vResult0 = vmlaq_lane_f32(vResult0, V.val[2], r, 0); // Ax+Ey+Iz+M vResult1 = vmlaq_lane_f32(vResult1, V.val[2], r, 1); // Bx+Fy+Jz+N XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 4)); - r = vget_high_f32(row2); + r = vget_high_f32(row2); vResult2 = vmlaq_lane_f32(vResult2, V.val[2], r, 0); // Cx+Gy+Kz+O vResult3 = vmlaq_lane_f32(vResult3, V.val[2], r, 1); // Dx+Hy+Lz+P @@ -10511,14 +9583,14 @@ inline XMFLOAT4* XM_CALLCONV XMVector3TransformStream for (; i < VectorCount; i++) { - float32x2_t VL = vld1_f32(reinterpret_cast(pInputVector)); + float32x2_t VL = vld1_f32(reinterpret_cast(pInputVector)); float32x2_t zero = vdup_n_f32(0); - float32x2_t VH = vld1_lane_f32(reinterpret_cast(pInputVector) + 2, zero, 0); + float32x2_t VH = vld1_lane_f32(reinterpret_cast(pInputVector) + 2, zero, 0); pInputVector += InputStride; - XMVECTOR vResult = vmlaq_lane_f32(row3, row0, VL, 0); // X - vResult = vmlaq_lane_f32(vResult, row1, VL, 1); // Y - vResult = vmlaq_lane_f32(vResult, row2, VH, 0); // Z + XMVECTOR vResult = vmlaq_lane_f32(row3, row0, VL, 0); // X + vResult = vmlaq_lane_f32(vResult, row1, VL, 1); // Y + vResult = vmlaq_lane_f32(vResult, row2, VH, 0); // Z vst1q_f32(reinterpret_cast(pOutputVector), vResult); pOutputVector += OutputStride; @@ -10526,7 +9598,7 @@ inline XMFLOAT4* XM_CALLCONV XMVector3TransformStream return pOutputStream; #elif defined(_XM_SSE_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); const XMVECTOR row0 = M.r[0]; @@ -10534,7 +9606,7 @@ inline XMFLOAT4* XM_CALLCONV XMVector3TransformStream const XMVECTOR row2 = M.r[2]; const XMVECTOR row3 = M.r[3]; - size_t i = 0; + size_t i = 0; size_t four = VectorCount >> 2; if (four > 0) { @@ -10558,11 +9630,11 @@ inline XMFLOAT4* XM_CALLCONV XMVector3TransformStream XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); + XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); XMVECTOR vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -10571,11 +9643,11 @@ inline XMFLOAT4* XM_CALLCONV XMVector3TransformStream Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp = XM_FMADD_PS(Z, row2, row3); vTemp2 = _mm_mul_ps(Y, row1); vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -10584,11 +9656,11 @@ inline XMFLOAT4* XM_CALLCONV XMVector3TransformStream Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp = XM_FMADD_PS(Z, row2, row3); vTemp2 = _mm_mul_ps(Y, row1); vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -10597,11 +9669,11 @@ inline XMFLOAT4* XM_CALLCONV XMVector3TransformStream Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp = XM_FMADD_PS(Z, row2, row3); vTemp2 = _mm_mul_ps(Y, row1); vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -10626,11 +9698,11 @@ inline XMFLOAT4* XM_CALLCONV XMVector3TransformStream XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); + XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); XMVECTOR vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -10639,11 +9711,11 @@ inline XMFLOAT4* XM_CALLCONV XMVector3TransformStream Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp = XM_FMADD_PS(Z, row2, row3); vTemp2 = _mm_mul_ps(Y, row1); vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -10652,11 +9724,11 @@ inline XMFLOAT4* XM_CALLCONV XMVector3TransformStream Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp = XM_FMADD_PS(Z, row2, row3); vTemp2 = _mm_mul_ps(Y, row1); vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -10665,11 +9737,11 @@ inline XMFLOAT4* XM_CALLCONV XMVector3TransformStream Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp = XM_FMADD_PS(Z, row2, row3); vTemp2 = _mm_mul_ps(Y, row1); vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -10691,11 +9763,11 @@ inline XMFLOAT4* XM_CALLCONV XMVector3TransformStream XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); + XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); XMVECTOR vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -10713,11 +9785,11 @@ inline XMFLOAT4* XM_CALLCONV XMVector3TransformStream XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); + XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); XMVECTOR vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -10736,19 +9808,15 @@ inline XMFLOAT4* XM_CALLCONV XMVector3TransformStream //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector3TransformCoord -( - FXMVECTOR V, - FXMMATRIX M -) noexcept +inline XMVECTOR XM_CALLCONV XMVector3TransformCoord(FXMVECTOR V, FXMMATRIX M) noexcept { XMVECTOR Z = XMVectorSplatZ(V); XMVECTOR Y = XMVectorSplatY(V); XMVECTOR X = XMVectorSplatX(V); XMVECTOR Result = XMVectorMultiplyAdd(Z, M.r[2], M.r[3]); - Result = XMVectorMultiplyAdd(Y, M.r[1], Result); - Result = XMVectorMultiplyAdd(X, M.r[0], Result); + Result = XMVectorMultiplyAdd(Y, M.r[1], Result); + Result = XMVectorMultiplyAdd(X, M.r[0], Result); XMVECTOR W = XMVectorSplatW(Result); return XMVectorDivide(Result, W); @@ -10758,19 +9826,15 @@ inline XMVECTOR XM_CALLCONV XMVector3TransformCoord #ifdef _PREFAST_ #pragma prefast(push) -#pragma prefast(disable : 26015 26019, "PREfast noise: Esp:1307" ) +#pragma prefast(disable : 26015 26019, "PREfast noise: Esp:1307") #endif -_Use_decl_annotations_ -inline XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream -( - XMFLOAT3* pOutputStream, - size_t OutputStride, - const XMFLOAT3* pInputStream, - size_t InputStride, - size_t VectorCount, - FXMMATRIX M -) noexcept +_Use_decl_annotations_ inline XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream(XMFLOAT3* pOutputStream, + size_t OutputStride, + const XMFLOAT3* pInputStream, + size_t InputStride, + size_t VectorCount, + FXMMATRIX M) noexcept { assert(pOutputStream != nullptr); assert(pInputStream != nullptr); @@ -10783,7 +9847,7 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream #if defined(_XM_NO_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); const XMVECTOR row0 = M.r[0]; @@ -10799,8 +9863,8 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream XMVECTOR X = XMVectorSplatX(V); XMVECTOR Result = XMVectorMultiplyAdd(Z, row2, row3); - Result = XMVectorMultiplyAdd(Y, row1, Result); - Result = XMVectorMultiplyAdd(X, row0, Result); + Result = XMVectorMultiplyAdd(Y, row1, Result); + Result = XMVectorMultiplyAdd(X, row0, Result); XMVECTOR W = XMVectorSplatW(Result); @@ -10815,7 +9879,7 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream return pOutputStream; #elif defined(_XM_ARM_NEON_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); const XMVECTOR row0 = M.r[0]; @@ -10823,7 +9887,7 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream const XMVECTOR row2 = M.r[2]; const XMVECTOR row3 = M.r[3]; - size_t i = 0; + size_t i = 0; size_t four = VectorCount >> 2; if (four > 0) { @@ -10834,60 +9898,60 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream float32x4x3_t V = vld3q_f32(reinterpret_cast(pInputVector)); pInputVector += sizeof(XMFLOAT3) * 4; - float32x2_t r3 = vget_low_f32(row3); - float32x2_t r = vget_low_f32(row0); - XMVECTOR vResult0 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Ax+M - XMVECTOR vResult1 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Bx+N + float32x2_t r3 = vget_low_f32(row3); + float32x2_t r = vget_low_f32(row0); + XMVECTOR vResult0 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Ax+M + XMVECTOR vResult1 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Bx+N XM_PREFETCH(pInputVector); - r3 = vget_high_f32(row3); - r = vget_high_f32(row0); + r3 = vget_high_f32(row3); + r = vget_high_f32(row0); XMVECTOR vResult2 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Cx+O - XMVECTOR W = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Dx+P + XMVECTOR W = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Dx+P XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); - r = vget_low_f32(row1); + r = vget_low_f32(row1); vResult0 = vmlaq_lane_f32(vResult0, V.val[1], r, 0); // Ax+Ey+M vResult1 = vmlaq_lane_f32(vResult1, V.val[1], r, 1); // Bx+Fy+N XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 2)); - r = vget_high_f32(row1); + r = vget_high_f32(row1); vResult2 = vmlaq_lane_f32(vResult2, V.val[1], r, 0); // Cx+Gy+O - W = vmlaq_lane_f32(W, V.val[1], r, 1); // Dx+Hy+P + W = vmlaq_lane_f32(W, V.val[1], r, 1); // Dx+Hy+P XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 3)); - r = vget_low_f32(row2); + r = vget_low_f32(row2); vResult0 = vmlaq_lane_f32(vResult0, V.val[2], r, 0); // Ax+Ey+Iz+M vResult1 = vmlaq_lane_f32(vResult1, V.val[2], r, 1); // Bx+Fy+Jz+N XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 4)); - r = vget_high_f32(row2); + r = vget_high_f32(row2); vResult2 = vmlaq_lane_f32(vResult2, V.val[2], r, 0); // Cx+Gy+Kz+O - W = vmlaq_lane_f32(W, V.val[2], r, 1); // Dx+Hy+Lz+P + W = vmlaq_lane_f32(W, V.val[2], r, 1); // Dx+Hy+Lz+P XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 5)); - #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ +#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ V.val[0] = vdivq_f32(vResult0, W); V.val[1] = vdivq_f32(vResult1, W); V.val[2] = vdivq_f32(vResult2, W); - #else - // 2 iterations of Newton-Raphson refinement of reciprocal +#else + // 2 iterations of Newton-Raphson refinement of reciprocal float32x4_t Reciprocal = vrecpeq_f32(W); - float32x4_t S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); - S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); + float32x4_t S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); + S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); V.val[0] = vmulq_f32(vResult0, Reciprocal); V.val[1] = vmulq_f32(vResult1, Reciprocal); V.val[2] = vmulq_f32(vResult2, Reciprocal); - #endif +#endif vst3q_f32(reinterpret_cast(pOutputVector), V); pOutputVector += sizeof(XMFLOAT3) * 4; @@ -10899,30 +9963,30 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream for (; i < VectorCount; i++) { - float32x2_t VL = vld1_f32(reinterpret_cast(pInputVector)); + float32x2_t VL = vld1_f32(reinterpret_cast(pInputVector)); float32x2_t zero = vdup_n_f32(0); - float32x2_t VH = vld1_lane_f32(reinterpret_cast(pInputVector) + 2, zero, 0); + float32x2_t VH = vld1_lane_f32(reinterpret_cast(pInputVector) + 2, zero, 0); pInputVector += InputStride; - XMVECTOR vResult = vmlaq_lane_f32(row3, row0, VL, 0); // X - vResult = vmlaq_lane_f32(vResult, row1, VL, 1); // Y - vResult = vmlaq_lane_f32(vResult, row2, VH, 0); // Z + XMVECTOR vResult = vmlaq_lane_f32(row3, row0, VL, 0); // X + vResult = vmlaq_lane_f32(vResult, row1, VL, 1); // Y + vResult = vmlaq_lane_f32(vResult, row2, VH, 0); // Z - VH = vget_high_f32(vResult); + VH = vget_high_f32(vResult); XMVECTOR W = vdupq_lane_f32(VH, 1); - #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ +#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ vResult = vdivq_f32(vResult, W); - #else - // 2 iterations of Newton-Raphson refinement of reciprocal for W +#else + // 2 iterations of Newton-Raphson refinement of reciprocal for W float32x4_t Reciprocal = vrecpeq_f32(W); - float32x4_t S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); - S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); + float32x4_t S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); + S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); vResult = vmulq_f32(vResult, Reciprocal); - #endif +#endif VL = vget_low_f32(vResult); vst1_f32(reinterpret_cast(pOutputVector), VL); @@ -10932,7 +9996,7 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream return pOutputStream; #elif defined(_XM_SSE_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); const XMVECTOR row0 = M.r[0]; @@ -10940,7 +10004,7 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream const XMVECTOR row2 = M.r[2]; const XMVECTOR row3 = M.r[3]; - size_t i = 0; + size_t i = 0; size_t four = VectorCount >> 2; if (four > 0) { @@ -10966,11 +10030,11 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); + XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); XMVECTOR vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); @@ -10981,11 +10045,11 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp = XM_FMADD_PS(Z, row2, row3); vTemp2 = _mm_mul_ps(Y, row1); vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); @@ -10996,11 +10060,11 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp = XM_FMADD_PS(Z, row2, row3); vTemp2 = _mm_mul_ps(Y, row1); vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); @@ -11011,11 +10075,11 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp = XM_FMADD_PS(Z, row2, row3); vTemp2 = _mm_mul_ps(Y, row1); vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); @@ -11048,11 +10112,11 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); + XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); XMVECTOR vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); @@ -11063,11 +10127,11 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp = XM_FMADD_PS(Z, row2, row3); vTemp2 = _mm_mul_ps(Y, row1); vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); @@ -11078,11 +10142,11 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp = XM_FMADD_PS(Z, row2, row3); vTemp2 = _mm_mul_ps(Y, row1); vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); @@ -11093,11 +10157,11 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp = XM_FMADD_PS(Z, row2, row3); vTemp2 = _mm_mul_ps(Y, row1); vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); @@ -11131,11 +10195,11 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); + XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); XMVECTOR vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); @@ -11148,11 +10212,11 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp = XM_FMADD_PS(Z, row2, row3); vTemp2 = _mm_mul_ps(Y, row1); vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); @@ -11165,11 +10229,11 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp = XM_FMADD_PS(Z, row2, row3); vTemp2 = _mm_mul_ps(Y, row1); vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); @@ -11182,11 +10246,11 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp = XM_FMADD_PS(Z, row2, row3); vTemp2 = _mm_mul_ps(Y, row1); vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); @@ -11209,11 +10273,11 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); + XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); XMVECTOR vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); @@ -11235,11 +10299,7 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector3TransformNormal -( - FXMVECTOR V, - FXMMATRIX M -) noexcept +inline XMVECTOR XM_CALLCONV XMVector3TransformNormal(FXMVECTOR V, FXMMATRIX M) noexcept { #if defined(_XM_NO_INTRINSICS_) @@ -11248,23 +10308,23 @@ inline XMVECTOR XM_CALLCONV XMVector3TransformNormal XMVECTOR X = XMVectorSplatX(V); XMVECTOR Result = XMVectorMultiply(Z, M.r[2]); - Result = XMVectorMultiplyAdd(Y, M.r[1], Result); - Result = XMVectorMultiplyAdd(X, M.r[0], Result); + Result = XMVectorMultiplyAdd(Y, M.r[1], Result); + Result = XMVectorMultiplyAdd(X, M.r[0], Result); return Result; #elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t VL = vget_low_f32(V); - XMVECTOR vResult = vmulq_lane_f32(M.r[0], VL, 0); // X - vResult = vmlaq_lane_f32(vResult, M.r[1], VL, 1); // Y - return vmlaq_lane_f32(vResult, M.r[2], vget_high_f32(V), 0); // Z + float32x2_t VL = vget_low_f32(V); + XMVECTOR vResult = vmulq_lane_f32(M.r[0], VL, 0); // X + vResult = vmlaq_lane_f32(vResult, M.r[1], VL, 1); // Y + return vmlaq_lane_f32(vResult, M.r[2], vget_high_f32(V), 0); // Z #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); // Z - vResult = _mm_mul_ps(vResult, M.r[2]); - XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = XM_FMADD_PS(vTemp, M.r[1], vResult); - vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); // X - vResult = XM_FMADD_PS(vTemp, M.r[0], vResult); + vResult = _mm_mul_ps(vResult, M.r[2]); + XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y + vResult = XM_FMADD_PS(vTemp, M.r[1], vResult); + vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); // X + vResult = XM_FMADD_PS(vTemp, M.r[0], vResult); return vResult; #endif } @@ -11273,19 +10333,15 @@ inline XMVECTOR XM_CALLCONV XMVector3TransformNormal #ifdef _PREFAST_ #pragma prefast(push) -#pragma prefast(disable : 26015 26019, "PREfast noise: Esp:1307" ) +#pragma prefast(disable : 26015 26019, "PREfast noise: Esp:1307") #endif -_Use_decl_annotations_ -inline XMFLOAT3* XM_CALLCONV XMVector3TransformNormalStream -( - XMFLOAT3* pOutputStream, - size_t OutputStride, - const XMFLOAT3* pInputStream, - size_t InputStride, - size_t VectorCount, - FXMMATRIX M -) noexcept +_Use_decl_annotations_ inline XMFLOAT3* XM_CALLCONV XMVector3TransformNormalStream(XMFLOAT3* pOutputStream, + size_t OutputStride, + const XMFLOAT3* pInputStream, + size_t InputStride, + size_t VectorCount, + FXMMATRIX M) noexcept { assert(pOutputStream != nullptr); assert(pInputStream != nullptr); @@ -11298,7 +10354,7 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformNormalStream #if defined(_XM_NO_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); const XMVECTOR row0 = M.r[0]; @@ -11313,8 +10369,8 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformNormalStream XMVECTOR X = XMVectorSplatX(V); XMVECTOR Result = XMVectorMultiply(Z, row2); - Result = XMVectorMultiplyAdd(Y, row1, Result); - Result = XMVectorMultiplyAdd(X, row0, Result); + Result = XMVectorMultiplyAdd(Y, row1, Result); + Result = XMVectorMultiplyAdd(X, row0, Result); XMStoreFloat3(reinterpret_cast(pOutputVector), Result); @@ -11325,14 +10381,14 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformNormalStream return pOutputStream; #elif defined(_XM_ARM_NEON_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); const XMVECTOR row0 = M.r[0]; const XMVECTOR row1 = M.r[1]; const XMVECTOR row2 = M.r[2]; - size_t i = 0; + size_t i = 0; size_t four = VectorCount >> 2; if (four > 0) { @@ -11343,35 +10399,35 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformNormalStream float32x4x3_t V = vld3q_f32(reinterpret_cast(pInputVector)); pInputVector += sizeof(XMFLOAT3) * 4; - float32x2_t r = vget_low_f32(row0); - XMVECTOR vResult0 = vmulq_lane_f32(V.val[0], r, 0); // Ax - XMVECTOR vResult1 = vmulq_lane_f32(V.val[0], r, 1); // Bx + float32x2_t r = vget_low_f32(row0); + XMVECTOR vResult0 = vmulq_lane_f32(V.val[0], r, 0); // Ax + XMVECTOR vResult1 = vmulq_lane_f32(V.val[0], r, 1); // Bx XM_PREFETCH(pInputVector); - r = vget_high_f32(row0); + r = vget_high_f32(row0); XMVECTOR vResult2 = vmulq_lane_f32(V.val[0], r, 0); // Cx XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); - r = vget_low_f32(row1); + r = vget_low_f32(row1); vResult0 = vmlaq_lane_f32(vResult0, V.val[1], r, 0); // Ax+Ey vResult1 = vmlaq_lane_f32(vResult1, V.val[1], r, 1); // Bx+Fy XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 2)); - r = vget_high_f32(row1); + r = vget_high_f32(row1); vResult2 = vmlaq_lane_f32(vResult2, V.val[1], r, 0); // Cx+Gy XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 3)); - r = vget_low_f32(row2); + r = vget_low_f32(row2); vResult0 = vmlaq_lane_f32(vResult0, V.val[2], r, 0); // Ax+Ey+Iz vResult1 = vmlaq_lane_f32(vResult1, V.val[2], r, 1); // Bx+Fy+Jz XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 4)); - r = vget_high_f32(row2); + r = vget_high_f32(row2); vResult2 = vmlaq_lane_f32(vResult2, V.val[2], r, 0); // Cx+Gy+Kz XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 5)); @@ -11390,14 +10446,14 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformNormalStream for (; i < VectorCount; i++) { - float32x2_t VL = vld1_f32(reinterpret_cast(pInputVector)); + float32x2_t VL = vld1_f32(reinterpret_cast(pInputVector)); float32x2_t zero = vdup_n_f32(0); - float32x2_t VH = vld1_lane_f32(reinterpret_cast(pInputVector) + 2, zero, 0); + float32x2_t VH = vld1_lane_f32(reinterpret_cast(pInputVector) + 2, zero, 0); pInputVector += InputStride; - XMVECTOR vResult = vmulq_lane_f32(row0, VL, 0); // X - vResult = vmlaq_lane_f32(vResult, row1, VL, 1); // Y - vResult = vmlaq_lane_f32(vResult, row2, VH, 0); // Z + XMVECTOR vResult = vmulq_lane_f32(row0, VL, 0); // X + vResult = vmlaq_lane_f32(vResult, row1, VL, 1); // Y + vResult = vmlaq_lane_f32(vResult, row2, VH, 0); // Z VL = vget_low_f32(vResult); vst1_f32(reinterpret_cast(pOutputVector), VL); @@ -11407,14 +10463,14 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformNormalStream return pOutputStream; #elif defined(_XM_SSE_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); const XMVECTOR row0 = M.r[0]; const XMVECTOR row1 = M.r[1]; const XMVECTOR row2 = M.r[2]; - size_t i = 0; + size_t i = 0; size_t four = VectorCount >> 2; if (four > 0) { @@ -11440,44 +10496,44 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformNormalStream XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = _mm_mul_ps(Z, row2); + XMVECTOR vTemp = _mm_mul_ps(Z, row2); XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); XMVECTOR vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - V1 = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + V1 = _mm_add_ps(vTemp, vTemp3); // Result 2 Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = _mm_mul_ps(Z, row2); + vTemp = _mm_mul_ps(Z, row2); vTemp2 = _mm_mul_ps(Y, row1); vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - V2 = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + V2 = _mm_add_ps(vTemp, vTemp3); // Result 3 Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = _mm_mul_ps(Z, row2); + vTemp = _mm_mul_ps(Z, row2); vTemp2 = _mm_mul_ps(Y, row1); vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - V3 = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + V3 = _mm_add_ps(vTemp, vTemp3); // Result 4 Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = _mm_mul_ps(Z, row2); + vTemp = _mm_mul_ps(Z, row2); vTemp2 = _mm_mul_ps(Y, row1); vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - V4 = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + V4 = _mm_add_ps(vTemp, vTemp3); // Pack and store the vectors XM3PACK4INTO3(vTemp); @@ -11506,44 +10562,44 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformNormalStream XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = _mm_mul_ps(Z, row2); + XMVECTOR vTemp = _mm_mul_ps(Z, row2); XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); XMVECTOR vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - V1 = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + V1 = _mm_add_ps(vTemp, vTemp3); // Result 2 Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = _mm_mul_ps(Z, row2); + vTemp = _mm_mul_ps(Z, row2); vTemp2 = _mm_mul_ps(Y, row1); vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - V2 = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + V2 = _mm_add_ps(vTemp, vTemp3); // Result 3 Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = _mm_mul_ps(Z, row2); + vTemp = _mm_mul_ps(Z, row2); vTemp2 = _mm_mul_ps(Y, row1); vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - V3 = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + V3 = _mm_add_ps(vTemp, vTemp3); // Result 4 Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = _mm_mul_ps(Z, row2); + vTemp = _mm_mul_ps(Z, row2); vTemp2 = _mm_mul_ps(Y, row1); vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - V4 = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + V4 = _mm_add_ps(vTemp, vTemp3); // Pack and store the vectors XM3PACK4INTO3(vTemp); @@ -11573,11 +10629,11 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformNormalStream XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = _mm_mul_ps(Z, row2); + XMVECTOR vTemp = _mm_mul_ps(Z, row2); XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); XMVECTOR vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -11587,11 +10643,11 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformNormalStream Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = _mm_mul_ps(Z, row2); + vTemp = _mm_mul_ps(Z, row2); vTemp2 = _mm_mul_ps(Y, row1); vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -11601,11 +10657,11 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformNormalStream Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = _mm_mul_ps(Z, row2); + vTemp = _mm_mul_ps(Z, row2); vTemp2 = _mm_mul_ps(Y, row1); vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -11615,11 +10671,11 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformNormalStream Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = _mm_mul_ps(Z, row2); + vTemp = _mm_mul_ps(Z, row2); vTemp2 = _mm_mul_ps(Y, row1); vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -11639,11 +10695,11 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformNormalStream XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = _mm_mul_ps(Z, row2); + XMVECTOR vTemp = _mm_mul_ps(Z, row2); XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); XMVECTOR vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -11661,28 +10717,25 @@ inline XMFLOAT3* XM_CALLCONV XMVector3TransformNormalStream //------------------------------------------------------------------------------ -inline 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 +inline 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 { - const float HalfViewportWidth = ViewportWidth * 0.5f; + const float HalfViewportWidth = ViewportWidth * 0.5f; const float HalfViewportHeight = ViewportHeight * 0.5f; - XMVECTOR Scale = XMVectorSet(HalfViewportWidth, -HalfViewportHeight, ViewportMaxZ - ViewportMinZ, 0.0f); + XMVECTOR Scale = XMVectorSet(HalfViewportWidth, -HalfViewportHeight, ViewportMaxZ - ViewportMinZ, 0.0f); XMVECTOR Offset = XMVectorSet(ViewportX + HalfViewportWidth, ViewportY + HalfViewportHeight, ViewportMinZ, 0.0f); XMMATRIX Transform = XMMatrixMultiply(World, View); - Transform = XMMatrixMultiply(Transform, Projection); + Transform = XMMatrixMultiply(Transform, Projection); XMVECTOR Result = XMVector3TransformCoord(V, Transform); @@ -11695,27 +10748,23 @@ inline XMVECTOR XM_CALLCONV XMVector3Project #ifdef _PREFAST_ #pragma prefast(push) -#pragma prefast(disable : 26015 26019, "PREfast noise: Esp:1307" ) -#endif - -_Use_decl_annotations_ -inline XMFLOAT3* XM_CALLCONV XMVector3ProjectStream -( - XMFLOAT3* pOutputStream, - size_t OutputStride, - const XMFLOAT3* pInputStream, - size_t InputStride, - size_t VectorCount, - float ViewportX, - float ViewportY, - float ViewportWidth, - float ViewportHeight, - float ViewportMinZ, - float ViewportMaxZ, - FXMMATRIX Projection, - CXMMATRIX View, - CXMMATRIX World -) noexcept +#pragma prefast(disable : 26015 26019, "PREfast noise: Esp:1307") +#endif + +_Use_decl_annotations_ inline XMFLOAT3* XM_CALLCONV XMVector3ProjectStream(XMFLOAT3* pOutputStream, + size_t OutputStride, + const XMFLOAT3* pInputStream, + size_t InputStride, + size_t VectorCount, + float ViewportX, + float ViewportY, + float ViewportWidth, + float ViewportHeight, + float ViewportMinZ, + float ViewportMaxZ, + FXMMATRIX Projection, + CXMMATRIX View, + CXMMATRIX World) noexcept { assert(pOutputStream != nullptr); assert(pInputStream != nullptr); @@ -11728,16 +10777,16 @@ inline XMFLOAT3* XM_CALLCONV XMVector3ProjectStream #if defined(_XM_NO_INTRINSICS_) - const float HalfViewportWidth = ViewportWidth * 0.5f; + const float HalfViewportWidth = ViewportWidth * 0.5f; const float HalfViewportHeight = ViewportHeight * 0.5f; - XMVECTOR Scale = XMVectorSet(HalfViewportWidth, -HalfViewportHeight, ViewportMaxZ - ViewportMinZ, 1.0f); + XMVECTOR Scale = XMVectorSet(HalfViewportWidth, -HalfViewportHeight, ViewportMaxZ - ViewportMinZ, 1.0f); XMVECTOR Offset = XMVectorSet(ViewportX + HalfViewportWidth, ViewportY + HalfViewportHeight, ViewportMinZ, 0.0f); XMMATRIX Transform = XMMatrixMultiply(World, View); - Transform = XMMatrixMultiply(Transform, Projection); + Transform = XMMatrixMultiply(Transform, Projection); - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); for (size_t i = 0; i < VectorCount; i++) @@ -11745,7 +10794,7 @@ inline XMFLOAT3* XM_CALLCONV XMVector3ProjectStream XMVECTOR V = XMLoadFloat3(reinterpret_cast(pInputVector)); XMVECTOR Result = XMVector3TransformCoord(V, Transform); - Result = XMVectorMultiplyAdd(Result, Scale, Offset); + Result = XMVectorMultiplyAdd(Result, Scale, Offset); XMStoreFloat3(reinterpret_cast(pOutputVector), Result); @@ -11756,16 +10805,16 @@ inline XMFLOAT3* XM_CALLCONV XMVector3ProjectStream return pOutputStream; #elif defined(_XM_ARM_NEON_INTRINSICS_) - const float HalfViewportWidth = ViewportWidth * 0.5f; + const float HalfViewportWidth = ViewportWidth * 0.5f; const float HalfViewportHeight = ViewportHeight * 0.5f; XMMATRIX Transform = XMMatrixMultiply(World, View); - Transform = XMMatrixMultiply(Transform, Projection); + Transform = XMMatrixMultiply(Transform, Projection); - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); - size_t i = 0; + size_t i = 0; size_t four = VectorCount >> 2; if (four > 0) { @@ -11784,60 +10833,60 @@ inline XMFLOAT3* XM_CALLCONV XMVector3ProjectStream float32x4x3_t V = vld3q_f32(reinterpret_cast(pInputVector)); pInputVector += sizeof(XMFLOAT3) * 4; - float32x2_t r3 = vget_low_f32(Transform.r[3]); - float32x2_t r = vget_low_f32(Transform.r[0]); - XMVECTOR vResult0 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Ax+M - XMVECTOR vResult1 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Bx+N + float32x2_t r3 = vget_low_f32(Transform.r[3]); + float32x2_t r = vget_low_f32(Transform.r[0]); + XMVECTOR vResult0 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Ax+M + XMVECTOR vResult1 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Bx+N XM_PREFETCH(pInputVector); - r3 = vget_high_f32(Transform.r[3]); - r = vget_high_f32(Transform.r[0]); + r3 = vget_high_f32(Transform.r[3]); + r = vget_high_f32(Transform.r[0]); XMVECTOR vResult2 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Cx+O - XMVECTOR W = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Dx+P + XMVECTOR W = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Dx+P XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); - r = vget_low_f32(Transform.r[1]); + r = vget_low_f32(Transform.r[1]); vResult0 = vmlaq_lane_f32(vResult0, V.val[1], r, 0); // Ax+Ey+M vResult1 = vmlaq_lane_f32(vResult1, V.val[1], r, 1); // Bx+Fy+N XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 2)); - r = vget_high_f32(Transform.r[1]); + r = vget_high_f32(Transform.r[1]); vResult2 = vmlaq_lane_f32(vResult2, V.val[1], r, 0); // Cx+Gy+O - W = vmlaq_lane_f32(W, V.val[1], r, 1); // Dx+Hy+P + W = vmlaq_lane_f32(W, V.val[1], r, 1); // Dx+Hy+P XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 3)); - r = vget_low_f32(Transform.r[2]); + r = vget_low_f32(Transform.r[2]); vResult0 = vmlaq_lane_f32(vResult0, V.val[2], r, 0); // Ax+Ey+Iz+M vResult1 = vmlaq_lane_f32(vResult1, V.val[2], r, 1); // Bx+Fy+Jz+N XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 4)); - r = vget_high_f32(Transform.r[2]); + r = vget_high_f32(Transform.r[2]); vResult2 = vmlaq_lane_f32(vResult2, V.val[2], r, 0); // Cx+Gy+Kz+O - W = vmlaq_lane_f32(W, V.val[2], r, 1); // Dx+Hy+Lz+P + W = vmlaq_lane_f32(W, V.val[2], r, 1); // Dx+Hy+Lz+P XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 5)); - #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ +#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ vResult0 = vdivq_f32(vResult0, W); vResult1 = vdivq_f32(vResult1, W); vResult2 = vdivq_f32(vResult2, W); - #else - // 2 iterations of Newton-Raphson refinement of reciprocal +#else + // 2 iterations of Newton-Raphson refinement of reciprocal float32x4_t Reciprocal = vrecpeq_f32(W); - float32x4_t S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); - S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); + float32x4_t S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); + S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); vResult0 = vmulq_f32(vResult0, Reciprocal); vResult1 = vmulq_f32(vResult1, Reciprocal); vResult2 = vmulq_f32(vResult2, Reciprocal); - #endif +#endif V.val[0] = vmlaq_f32(OffsetX, vResult0, ScaleX); V.val[1] = vmlaq_f32(OffsetY, vResult1, ScaleY); @@ -11853,35 +10902,35 @@ inline XMFLOAT3* XM_CALLCONV XMVector3ProjectStream if (i < VectorCount) { - XMVECTOR Scale = XMVectorSet(HalfViewportWidth, -HalfViewportHeight, ViewportMaxZ - ViewportMinZ, 1.0f); + XMVECTOR Scale = XMVectorSet(HalfViewportWidth, -HalfViewportHeight, ViewportMaxZ - ViewportMinZ, 1.0f); XMVECTOR Offset = XMVectorSet(ViewportX + HalfViewportWidth, ViewportY + HalfViewportHeight, ViewportMinZ, 0.0f); for (; i < VectorCount; i++) { - float32x2_t VL = vld1_f32(reinterpret_cast(pInputVector)); + float32x2_t VL = vld1_f32(reinterpret_cast(pInputVector)); float32x2_t zero = vdup_n_f32(0); - float32x2_t VH = vld1_lane_f32(reinterpret_cast(pInputVector) + 2, zero, 0); + float32x2_t VH = vld1_lane_f32(reinterpret_cast(pInputVector) + 2, zero, 0); pInputVector += InputStride; XMVECTOR vResult = vmlaq_lane_f32(Transform.r[3], Transform.r[0], VL, 0); // X - vResult = vmlaq_lane_f32(vResult, Transform.r[1], VL, 1); // Y - vResult = vmlaq_lane_f32(vResult, Transform.r[2], VH, 0); // Z + vResult = vmlaq_lane_f32(vResult, Transform.r[1], VL, 1); // Y + vResult = vmlaq_lane_f32(vResult, Transform.r[2], VH, 0); // Z - VH = vget_high_f32(vResult); + VH = vget_high_f32(vResult); XMVECTOR W = vdupq_lane_f32(VH, 1); - #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ +#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ vResult = vdivq_f32(vResult, W); - #else - // 2 iterations of Newton-Raphson refinement of reciprocal for W +#else + // 2 iterations of Newton-Raphson refinement of reciprocal for W float32x4_t Reciprocal = vrecpeq_f32(W); - float32x4_t S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); - S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); + float32x4_t S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); + S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); vResult = vmulq_f32(vResult, Reciprocal); - #endif +#endif vResult = vmlaq_f32(Offset, vResult, Scale); @@ -11894,19 +10943,19 @@ inline XMFLOAT3* XM_CALLCONV XMVector3ProjectStream return pOutputStream; #elif defined(_XM_SSE_INTRINSICS_) - const float HalfViewportWidth = ViewportWidth * 0.5f; + const float HalfViewportWidth = ViewportWidth * 0.5f; const float HalfViewportHeight = ViewportHeight * 0.5f; - XMVECTOR Scale = XMVectorSet(HalfViewportWidth, -HalfViewportHeight, ViewportMaxZ - ViewportMinZ, 1.0f); + XMVECTOR Scale = XMVectorSet(HalfViewportWidth, -HalfViewportHeight, ViewportMaxZ - ViewportMinZ, 1.0f); XMVECTOR Offset = XMVectorSet(ViewportX + HalfViewportWidth, ViewportY + HalfViewportHeight, ViewportMinZ, 0.0f); XMMATRIX Transform = XMMatrixMultiply(World, View); - Transform = XMMatrixMultiply(Transform, Projection); + Transform = XMMatrixMultiply(Transform, Projection); - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); - size_t i = 0; + size_t i = 0; size_t four = VectorCount >> 2; if (four > 0) { @@ -11932,60 +10981,60 @@ inline XMFLOAT3* XM_CALLCONV XMVector3ProjectStream XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); XMVECTOR vTemp2 = _mm_mul_ps(Y, Transform.r[1]); XMVECTOR vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - vTemp = _mm_div_ps(vTemp, W); - V1 = XM_FMADD_PS(vTemp, Scale, Offset); + vTemp = _mm_div_ps(vTemp, W); + V1 = XM_FMADD_PS(vTemp, Scale, Offset); // Result 2 Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); vTemp2 = _mm_mul_ps(Y, Transform.r[1]); vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); vTemp = _mm_div_ps(vTemp, W); - V2 = XM_FMADD_PS(vTemp, Scale, Offset); + V2 = XM_FMADD_PS(vTemp, Scale, Offset); // Result 3 Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); vTemp2 = _mm_mul_ps(Y, Transform.r[1]); vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); vTemp = _mm_div_ps(vTemp, W); - V3 = XM_FMADD_PS(vTemp, Scale, Offset); + V3 = XM_FMADD_PS(vTemp, Scale, Offset); // Result 4 Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); vTemp2 = _mm_mul_ps(Y, Transform.r[1]); vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); vTemp = _mm_div_ps(vTemp, W); - V4 = XM_FMADD_PS(vTemp, Scale, Offset); + V4 = XM_FMADD_PS(vTemp, Scale, Offset); // Pack and store the vectors XM3PACK4INTO3(vTemp); @@ -12014,60 +11063,60 @@ inline XMFLOAT3* XM_CALLCONV XMVector3ProjectStream XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); XMVECTOR vTemp2 = _mm_mul_ps(Y, Transform.r[1]); XMVECTOR vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - vTemp = _mm_div_ps(vTemp, W); - V1 = XM_FMADD_PS(vTemp, Scale, Offset); + vTemp = _mm_div_ps(vTemp, W); + V1 = XM_FMADD_PS(vTemp, Scale, Offset); // Result 2 Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); vTemp2 = _mm_mul_ps(Y, Transform.r[1]); vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); vTemp = _mm_div_ps(vTemp, W); - V2 = XM_FMADD_PS(vTemp, Scale, Offset); + V2 = XM_FMADD_PS(vTemp, Scale, Offset); // Result 3 Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); vTemp2 = _mm_mul_ps(Y, Transform.r[1]); vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); vTemp = _mm_div_ps(vTemp, W); - V3 = XM_FMADD_PS(vTemp, Scale, Offset); + V3 = XM_FMADD_PS(vTemp, Scale, Offset); // Result 4 Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); vTemp2 = _mm_mul_ps(Y, Transform.r[1]); vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); vTemp = _mm_div_ps(vTemp, W); - V4 = XM_FMADD_PS(vTemp, Scale, Offset); + V4 = XM_FMADD_PS(vTemp, Scale, Offset); // Pack and store the vectors XM3PACK4INTO3(vTemp); @@ -12097,15 +11146,15 @@ inline XMFLOAT3* XM_CALLCONV XMVector3ProjectStream XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); XMVECTOR vTemp2 = _mm_mul_ps(Y, Transform.r[1]); XMVECTOR vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - vTemp = _mm_div_ps(vTemp, W); - vTemp = XM_FMADD_PS(vTemp, Scale, Offset); + vTemp = _mm_div_ps(vTemp, W); + vTemp = XM_FMADD_PS(vTemp, Scale, Offset); XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -12115,13 +11164,13 @@ inline XMFLOAT3* XM_CALLCONV XMVector3ProjectStream Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); vTemp2 = _mm_mul_ps(Y, Transform.r[1]); vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); vTemp = _mm_div_ps(vTemp, W); vTemp = XM_FMADD_PS(vTemp, Scale, Offset); @@ -12133,13 +11182,13 @@ inline XMFLOAT3* XM_CALLCONV XMVector3ProjectStream Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); vTemp2 = _mm_mul_ps(Y, Transform.r[1]); vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); vTemp = _mm_div_ps(vTemp, W); vTemp = XM_FMADD_PS(vTemp, Scale, Offset); @@ -12151,13 +11200,13 @@ inline XMFLOAT3* XM_CALLCONV XMVector3ProjectStream Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); vTemp2 = _mm_mul_ps(Y, Transform.r[1]); vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); vTemp = _mm_div_ps(vTemp, W); vTemp = XM_FMADD_PS(vTemp, Scale, Offset); @@ -12179,15 +11228,15 @@ inline XMFLOAT3* XM_CALLCONV XMVector3ProjectStream XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); XMVECTOR vTemp2 = _mm_mul_ps(Y, Transform.r[1]); XMVECTOR vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - vTemp = _mm_div_ps(vTemp, W); - vTemp = XM_FMADD_PS(vTemp, Scale, Offset); + vTemp = _mm_div_ps(vTemp, W); + vTemp = XM_FMADD_PS(vTemp, Scale, Offset); XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -12205,31 +11254,28 @@ inline XMFLOAT3* XM_CALLCONV XMVector3ProjectStream //------------------------------------------------------------------------------ -inline 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 +inline 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 { static const XMVECTORF32 D = { { { -1.0f, 1.0f, 0.0f, 0.0f } } }; XMVECTOR Scale = XMVectorSet(ViewportWidth * 0.5f, -ViewportHeight * 0.5f, ViewportMaxZ - ViewportMinZ, 1.0f); - Scale = XMVectorReciprocal(Scale); + Scale = XMVectorReciprocal(Scale); XMVECTOR Offset = XMVectorSet(-ViewportX, -ViewportY, -ViewportMinZ, 0.0f); - Offset = XMVectorMultiplyAdd(Scale, Offset, D.v); + Offset = XMVectorMultiplyAdd(Scale, Offset, D.v); XMMATRIX Transform = XMMatrixMultiply(World, View); - Transform = XMMatrixMultiply(Transform, Projection); - Transform = XMMatrixInverse(nullptr, Transform); + Transform = XMMatrixMultiply(Transform, Projection); + Transform = XMMatrixInverse(nullptr, Transform); XMVECTOR Result = XMVectorMultiplyAdd(V, Scale, Offset); @@ -12240,27 +11286,23 @@ inline XMVECTOR XM_CALLCONV XMVector3Unproject #ifdef _PREFAST_ #pragma prefast(push) -#pragma prefast(disable : 26015 26019, "PREfast noise: Esp:1307" ) -#endif - -_Use_decl_annotations_ -inline XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream -( - XMFLOAT3* pOutputStream, - size_t OutputStride, - const XMFLOAT3* pInputStream, - size_t InputStride, - size_t VectorCount, - float ViewportX, - float ViewportY, - float ViewportWidth, - float ViewportHeight, - float ViewportMinZ, - float ViewportMaxZ, - FXMMATRIX Projection, - CXMMATRIX View, - CXMMATRIX World -) noexcept +#pragma prefast(disable : 26015 26019, "PREfast noise: Esp:1307") +#endif + +_Use_decl_annotations_ inline XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream(XMFLOAT3* pOutputStream, + size_t OutputStride, + const XMFLOAT3* pInputStream, + size_t InputStride, + size_t VectorCount, + float ViewportX, + float ViewportY, + float ViewportWidth, + float ViewportHeight, + float ViewportMinZ, + float ViewportMaxZ, + FXMMATRIX Projection, + CXMMATRIX View, + CXMMATRIX World) noexcept { assert(pOutputStream != nullptr); assert(pInputStream != nullptr); @@ -12276,16 +11318,16 @@ inline XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream static const XMVECTORF32 D = { { { -1.0f, 1.0f, 0.0f, 0.0f } } }; XMVECTOR Scale = XMVectorSet(ViewportWidth * 0.5f, -ViewportHeight * 0.5f, ViewportMaxZ - ViewportMinZ, 1.0f); - Scale = XMVectorReciprocal(Scale); + Scale = XMVectorReciprocal(Scale); XMVECTOR Offset = XMVectorSet(-ViewportX, -ViewportY, -ViewportMinZ, 0.0f); - Offset = XMVectorMultiplyAdd(Scale, Offset, D.v); + Offset = XMVectorMultiplyAdd(Scale, Offset, D.v); XMMATRIX Transform = XMMatrixMultiply(World, View); - Transform = XMMatrixMultiply(Transform, Projection); - Transform = XMMatrixInverse(nullptr, Transform); + Transform = XMMatrixMultiply(Transform, Projection); + Transform = XMMatrixInverse(nullptr, Transform); - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); for (size_t i = 0; i < VectorCount; i++) @@ -12306,10 +11348,10 @@ inline XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream #elif defined(_XM_ARM_NEON_INTRINSICS_) XMMATRIX Transform = XMMatrixMultiply(World, View); - Transform = XMMatrixMultiply(Transform, Projection); - Transform = XMMatrixInverse(nullptr, Transform); + Transform = XMMatrixMultiply(Transform, Projection); + Transform = XMMatrixInverse(nullptr, Transform); - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); float sx = 1.f / (ViewportWidth * 0.5f); @@ -12320,7 +11362,7 @@ inline XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream float oy = (-ViewportY * sy) + 1.f; float oz = (-ViewportMinZ * sz); - size_t i = 0; + size_t i = 0; size_t four = VectorCount >> 2; if (four > 0) { @@ -12331,72 +11373,72 @@ inline XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream float32x4x3_t V = vld3q_f32(reinterpret_cast(pInputVector)); pInputVector += sizeof(XMFLOAT3) * 4; - XMVECTOR ScaleX = vdupq_n_f32(sx); + XMVECTOR ScaleX = vdupq_n_f32(sx); XMVECTOR OffsetX = vdupq_n_f32(ox); - XMVECTOR VX = vmlaq_f32(OffsetX, ScaleX, V.val[0]); + XMVECTOR VX = vmlaq_f32(OffsetX, ScaleX, V.val[0]); - float32x2_t r3 = vget_low_f32(Transform.r[3]); - float32x2_t r = vget_low_f32(Transform.r[0]); - XMVECTOR vResult0 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), VX, r, 0); // Ax+M - XMVECTOR vResult1 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), VX, r, 1); // Bx+N + float32x2_t r3 = vget_low_f32(Transform.r[3]); + float32x2_t r = vget_low_f32(Transform.r[0]); + XMVECTOR vResult0 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), VX, r, 0); // Ax+M + XMVECTOR vResult1 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), VX, r, 1); // Bx+N XM_PREFETCH(pInputVector); - r3 = vget_high_f32(Transform.r[3]); - r = vget_high_f32(Transform.r[0]); + r3 = vget_high_f32(Transform.r[3]); + r = vget_high_f32(Transform.r[0]); XMVECTOR vResult2 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), VX, r, 0); // Cx+O - XMVECTOR W = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), VX, r, 1); // Dx+P + XMVECTOR W = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), VX, r, 1); // Dx+P XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); - XMVECTOR ScaleY = vdupq_n_f32(sy); + XMVECTOR ScaleY = vdupq_n_f32(sy); XMVECTOR OffsetY = vdupq_n_f32(oy); - XMVECTOR VY = vmlaq_f32(OffsetY, ScaleY, V.val[1]); + XMVECTOR VY = vmlaq_f32(OffsetY, ScaleY, V.val[1]); - r = vget_low_f32(Transform.r[1]); + r = vget_low_f32(Transform.r[1]); vResult0 = vmlaq_lane_f32(vResult0, VY, r, 0); // Ax+Ey+M vResult1 = vmlaq_lane_f32(vResult1, VY, r, 1); // Bx+Fy+N XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 2)); - r = vget_high_f32(Transform.r[1]); + r = vget_high_f32(Transform.r[1]); vResult2 = vmlaq_lane_f32(vResult2, VY, r, 0); // Cx+Gy+O - W = vmlaq_lane_f32(W, VY, r, 1); // Dx+Hy+P + W = vmlaq_lane_f32(W, VY, r, 1); // Dx+Hy+P XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 3)); - XMVECTOR ScaleZ = vdupq_n_f32(sz); + XMVECTOR ScaleZ = vdupq_n_f32(sz); XMVECTOR OffsetZ = vdupq_n_f32(oz); - XMVECTOR VZ = vmlaq_f32(OffsetZ, ScaleZ, V.val[2]); + XMVECTOR VZ = vmlaq_f32(OffsetZ, ScaleZ, V.val[2]); - r = vget_low_f32(Transform.r[2]); + r = vget_low_f32(Transform.r[2]); vResult0 = vmlaq_lane_f32(vResult0, VZ, r, 0); // Ax+Ey+Iz+M vResult1 = vmlaq_lane_f32(vResult1, VZ, r, 1); // Bx+Fy+Jz+N XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 4)); - r = vget_high_f32(Transform.r[2]); + r = vget_high_f32(Transform.r[2]); vResult2 = vmlaq_lane_f32(vResult2, VZ, r, 0); // Cx+Gy+Kz+O - W = vmlaq_lane_f32(W, VZ, r, 1); // Dx+Hy+Lz+P + W = vmlaq_lane_f32(W, VZ, r, 1); // Dx+Hy+Lz+P XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 5)); - #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ +#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ V.val[0] = vdivq_f32(vResult0, W); V.val[1] = vdivq_f32(vResult1, W); V.val[2] = vdivq_f32(vResult2, W); - #else - // 2 iterations of Newton-Raphson refinement of reciprocal +#else + // 2 iterations of Newton-Raphson refinement of reciprocal float32x4_t Reciprocal = vrecpeq_f32(W); - float32x4_t S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); - S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); + float32x4_t S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); + S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); V.val[0] = vmulq_f32(vResult0, Reciprocal); V.val[1] = vmulq_f32(vResult1, Reciprocal); V.val[2] = vmulq_f32(vResult2, Reciprocal); - #endif +#endif vst3q_f32(reinterpret_cast(pOutputVector), V); pOutputVector += sizeof(XMFLOAT3) * 4; @@ -12408,45 +11450,43 @@ inline XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream if (i < VectorCount) { - float32x2_t ScaleL = vcreate_f32( - static_cast(*reinterpret_cast(&sx)) - | (static_cast(*reinterpret_cast(&sy)) << 32)); + float32x2_t ScaleL = vcreate_f32(static_cast(*reinterpret_cast(&sx)) + | (static_cast(*reinterpret_cast(&sy)) << 32)); float32x2_t ScaleH = vcreate_f32(static_cast(*reinterpret_cast(&sz))); - float32x2_t OffsetL = vcreate_f32( - static_cast(*reinterpret_cast(&ox)) - | (static_cast(*reinterpret_cast(&oy)) << 32)); + float32x2_t OffsetL = vcreate_f32(static_cast(*reinterpret_cast(&ox)) + | (static_cast(*reinterpret_cast(&oy)) << 32)); float32x2_t OffsetH = vcreate_f32(static_cast(*reinterpret_cast(&oz))); for (; i < VectorCount; i++) { - float32x2_t VL = vld1_f32(reinterpret_cast(pInputVector)); + float32x2_t VL = vld1_f32(reinterpret_cast(pInputVector)); float32x2_t zero = vdup_n_f32(0); - float32x2_t VH = vld1_lane_f32(reinterpret_cast(pInputVector) + 2, zero, 0); + float32x2_t VH = vld1_lane_f32(reinterpret_cast(pInputVector) + 2, zero, 0); pInputVector += InputStride; VL = vmla_f32(OffsetL, VL, ScaleL); VH = vmla_f32(OffsetH, VH, ScaleH); XMVECTOR vResult = vmlaq_lane_f32(Transform.r[3], Transform.r[0], VL, 0); // X - vResult = vmlaq_lane_f32(vResult, Transform.r[1], VL, 1); // Y - vResult = vmlaq_lane_f32(vResult, Transform.r[2], VH, 0); // Z + vResult = vmlaq_lane_f32(vResult, Transform.r[1], VL, 1); // Y + vResult = vmlaq_lane_f32(vResult, Transform.r[2], VH, 0); // Z - VH = vget_high_f32(vResult); + VH = vget_high_f32(vResult); XMVECTOR W = vdupq_lane_f32(VH, 1); - #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ +#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ vResult = vdivq_f32(vResult, W); - #else - // 2 iterations of Newton-Raphson refinement of reciprocal for W +#else + // 2 iterations of Newton-Raphson refinement of reciprocal for W float32x4_t Reciprocal = vrecpeq_f32(W); - float32x4_t S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); - S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); + float32x4_t S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); + S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); vResult = vmulq_f32(vResult, Reciprocal); - #endif +#endif VL = vget_low_f32(vResult); vst1_f32(reinterpret_cast(pOutputVector), VL); @@ -12460,20 +11500,20 @@ inline XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream static const XMVECTORF32 D = { { { -1.0f, 1.0f, 0.0f, 0.0f } } }; XMVECTOR Scale = XMVectorSet(ViewportWidth * 0.5f, -ViewportHeight * 0.5f, ViewportMaxZ - ViewportMinZ, 1.0f); - Scale = XMVectorReciprocal(Scale); + Scale = XMVectorReciprocal(Scale); XMVECTOR Offset = XMVectorSet(-ViewportX, -ViewportY, -ViewportMinZ, 0.0f); - Offset = _mm_mul_ps(Scale, Offset); - Offset = _mm_add_ps(Offset, D); + Offset = _mm_mul_ps(Scale, Offset); + Offset = _mm_add_ps(Offset, D); XMMATRIX Transform = XMMatrixMultiply(World, View); - Transform = XMMatrixMultiply(Transform, Projection); - Transform = XMMatrixInverse(nullptr, Transform); + Transform = XMMatrixMultiply(Transform, Projection); + Transform = XMMatrixInverse(nullptr, Transform); - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); - size_t i = 0; + size_t i = 0; size_t four = VectorCount >> 2; if (four > 0) { @@ -12501,14 +11541,14 @@ inline XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); XMVECTOR vTemp2 = _mm_mul_ps(Y, Transform.r[1]); XMVECTOR vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - V1 = _mm_div_ps(vTemp, W); + V1 = _mm_div_ps(vTemp, W); // Result 2 V2 = XM_FMADD_PS(V2, Scale, Offset); @@ -12517,13 +11557,13 @@ inline XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); vTemp2 = _mm_mul_ps(Y, Transform.r[1]); vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); V2 = _mm_div_ps(vTemp, W); // Result 3 @@ -12533,13 +11573,13 @@ inline XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); vTemp2 = _mm_mul_ps(Y, Transform.r[1]); vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); V3 = _mm_div_ps(vTemp, W); // Result 4 @@ -12549,13 +11589,13 @@ inline XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); vTemp2 = _mm_mul_ps(Y, Transform.r[1]); vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); V4 = _mm_div_ps(vTemp, W); // Pack and store the vectors @@ -12587,14 +11627,14 @@ inline XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); XMVECTOR vTemp2 = _mm_mul_ps(Y, Transform.r[1]); XMVECTOR vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - V1 = _mm_div_ps(vTemp, W); + V1 = _mm_div_ps(vTemp, W); // Result 2 V2 = XM_FMADD_PS(V2, Scale, Offset); @@ -12603,13 +11643,13 @@ inline XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); vTemp2 = _mm_mul_ps(Y, Transform.r[1]); vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); V2 = _mm_div_ps(vTemp, W); // Result 3 @@ -12619,13 +11659,13 @@ inline XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); vTemp2 = _mm_mul_ps(Y, Transform.r[1]); vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); V3 = _mm_div_ps(vTemp, W); // Result 4 @@ -12635,13 +11675,13 @@ inline XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); vTemp2 = _mm_mul_ps(Y, Transform.r[1]); vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); V4 = _mm_div_ps(vTemp, W); // Pack and store the vectors @@ -12674,14 +11714,14 @@ inline XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); XMVECTOR vTemp2 = _mm_mul_ps(Y, Transform.r[1]); XMVECTOR vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - vTemp = _mm_div_ps(vTemp, W); + vTemp = _mm_div_ps(vTemp, W); XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -12693,13 +11733,13 @@ inline XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); vTemp2 = _mm_mul_ps(Y, Transform.r[1]); vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); vTemp = _mm_div_ps(vTemp, W); XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); @@ -12712,13 +11752,13 @@ inline XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); vTemp2 = _mm_mul_ps(Y, Transform.r[1]); vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); vTemp = _mm_div_ps(vTemp, W); XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); @@ -12731,13 +11771,13 @@ inline XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); vTemp2 = _mm_mul_ps(Y, Transform.r[1]); vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); vTemp = _mm_div_ps(vTemp, W); XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); @@ -12761,14 +11801,14 @@ inline XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); XMVECTOR vTemp2 = _mm_mul_ps(Y, Transform.r[1]); XMVECTOR vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - vTemp = _mm_div_ps(vTemp, W); + vTemp = _mm_div_ps(vTemp, W); XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); pOutputVector += OutputStride; @@ -12796,18 +11836,16 @@ inline XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector4Equal -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline bool XM_CALLCONV XMVector4Equal(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] == V2.vector4_f32[0]) && (V1.vector4_f32[1] == V2.vector4_f32[1]) && (V1.vector4_f32[2] == V2.vector4_f32[2]) && (V1.vector4_f32[3] == V2.vector4_f32[3])) != 0); + return (((V1.vector4_f32[0] == V2.vector4_f32[0]) && (V1.vector4_f32[1] == V2.vector4_f32[1]) + && (V1.vector4_f32[2] == V2.vector4_f32[2]) && (V1.vector4_f32[3] == V2.vector4_f32[3])) + != 0); #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32x4_t vResult = vceqq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vTemp = _mm_cmpeq_ps(V1, V2); @@ -12819,37 +11857,29 @@ inline bool XM_CALLCONV XMVector4Equal //------------------------------------------------------------------------------ -inline uint32_t XM_CALLCONV XMVector4EqualR -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline uint32_t XM_CALLCONV XMVector4EqualR(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) uint32_t CR = 0; - if ((V1.vector4_f32[0] == V2.vector4_f32[0]) && - (V1.vector4_f32[1] == V2.vector4_f32[1]) && - (V1.vector4_f32[2] == V2.vector4_f32[2]) && - (V1.vector4_f32[3] == V2.vector4_f32[3])) + if ((V1.vector4_f32[0] == V2.vector4_f32[0]) && (V1.vector4_f32[1] == V2.vector4_f32[1]) && (V1.vector4_f32[2] == V2.vector4_f32[2]) + && (V1.vector4_f32[3] == V2.vector4_f32[3])) { CR = XM_CRMASK_CR6TRUE; } - else if ((V1.vector4_f32[0] != V2.vector4_f32[0]) && - (V1.vector4_f32[1] != V2.vector4_f32[1]) && - (V1.vector4_f32[2] != V2.vector4_f32[2]) && - (V1.vector4_f32[3] != V2.vector4_f32[3])) + else if ((V1.vector4_f32[0] != V2.vector4_f32[0]) && (V1.vector4_f32[1] != V2.vector4_f32[1]) + && (V1.vector4_f32[2] != V2.vector4_f32[2]) && (V1.vector4_f32[3] != V2.vector4_f32[3])) { CR = XM_CRMASK_CR6FALSE; } return CR; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); + uint32x4_t vResult = vceqq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); uint32_t CR = 0; if (r == 0xFFFFFFFFU) @@ -12863,13 +11893,13 @@ inline uint32_t XM_CALLCONV XMVector4EqualR return CR; #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vTemp = _mm_cmpeq_ps(V1, V2); - int iTest = _mm_movemask_ps(vTemp); - uint32_t CR = 0; - if (iTest == 0xf) // All equal? + int iTest = _mm_movemask_ps(vTemp); + uint32_t CR = 0; + if (iTest == 0xf) // All equal? { CR = XM_CRMASK_CR6TRUE; } - else if (iTest == 0) // All not equal? + else if (iTest == 0) // All not equal? { CR = XM_CRMASK_CR6FALSE; } @@ -12879,18 +11909,16 @@ inline uint32_t XM_CALLCONV XMVector4EqualR //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector4EqualInt -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline bool XM_CALLCONV XMVector4EqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_u32[0] == V2.vector4_u32[0]) && (V1.vector4_u32[1] == V2.vector4_u32[1]) && (V1.vector4_u32[2] == V2.vector4_u32[2]) && (V1.vector4_u32[3] == V2.vector4_u32[3])) != 0); + return (((V1.vector4_u32[0] == V2.vector4_u32[0]) && (V1.vector4_u32[1] == V2.vector4_u32[1]) + && (V1.vector4_u32[2] == V2.vector4_u32[2]) && (V1.vector4_u32[3] == V2.vector4_u32[3])) + != 0); #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU); #elif defined(_XM_SSE_INTRINSICS_) __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); @@ -12902,35 +11930,27 @@ inline bool XM_CALLCONV XMVector4EqualInt //------------------------------------------------------------------------------ -inline uint32_t XM_CALLCONV XMVector4EqualIntR -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline uint32_t XM_CALLCONV XMVector4EqualIntR(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) uint32_t CR = 0; - if (V1.vector4_u32[0] == V2.vector4_u32[0] && - V1.vector4_u32[1] == V2.vector4_u32[1] && - V1.vector4_u32[2] == V2.vector4_u32[2] && - V1.vector4_u32[3] == V2.vector4_u32[3]) + if (V1.vector4_u32[0] == V2.vector4_u32[0] && V1.vector4_u32[1] == V2.vector4_u32[1] && V1.vector4_u32[2] == V2.vector4_u32[2] + && V1.vector4_u32[3] == V2.vector4_u32[3]) { CR = XM_CRMASK_CR6TRUE; } - else if (V1.vector4_u32[0] != V2.vector4_u32[0] && - V1.vector4_u32[1] != V2.vector4_u32[1] && - V1.vector4_u32[2] != V2.vector4_u32[2] && - V1.vector4_u32[3] != V2.vector4_u32[3]) + else if (V1.vector4_u32[0] != V2.vector4_u32[0] && V1.vector4_u32[1] != V2.vector4_u32[1] && V1.vector4_u32[2] != V2.vector4_u32[2] + && V1.vector4_u32[3] != V2.vector4_u32[3]) { CR = XM_CRMASK_CR6FALSE; } return CR; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); + uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); uint32_t CR = 0; if (r == 0xFFFFFFFFU) @@ -12943,14 +11963,14 @@ inline uint32_t XM_CALLCONV XMVector4EqualIntR } return CR; #elif defined(_XM_SSE_INTRINSICS_) - __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); - int iTest = _mm_movemask_ps(_mm_castsi128_ps(vTemp)); - uint32_t CR = 0; - if (iTest == 0xf) // All equal? + __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); + int iTest = _mm_movemask_ps(_mm_castsi128_ps(vTemp)); + uint32_t CR = 0; + if (iTest == 0xf) // All equal? { CR = XM_CRMASK_CR6TRUE; } - else if (iTest == 0) // All not equal? + else if (iTest == 0) // All not equal? { CR = XM_CRMASK_CR6FALSE; } @@ -12958,12 +11978,7 @@ inline uint32_t XM_CALLCONV XMVector4EqualIntR #endif } -inline bool XM_CALLCONV XMVector4NearEqual -( - FXMVECTOR V1, - FXMVECTOR V2, - FXMVECTOR Epsilon -) noexcept +inline bool XM_CALLCONV XMVector4NearEqual(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR Epsilon) noexcept { #if defined(_XM_NO_INTRINSICS_) float dx, dy, dz, dw; @@ -12972,10 +11987,9 @@ inline bool XM_CALLCONV XMVector4NearEqual dy = fabsf(V1.vector4_f32[1] - V2.vector4_f32[1]); dz = fabsf(V1.vector4_f32[2] - V2.vector4_f32[2]); dw = fabsf(V1.vector4_f32[3] - V2.vector4_f32[3]); - return (((dx <= Epsilon.vector4_f32[0]) && - (dy <= Epsilon.vector4_f32[1]) && - (dz <= Epsilon.vector4_f32[2]) && - (dw <= Epsilon.vector4_f32[3])) != 0); + return (((dx <= Epsilon.vector4_f32[0]) && (dy <= Epsilon.vector4_f32[1]) && (dz <= Epsilon.vector4_f32[2]) + && (dw <= Epsilon.vector4_f32[3])) + != 0); #elif defined(_XM_ARM_NEON_INTRINSICS_) float32x4_t vDelta = vsubq_f32(V1, V2); #if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) @@ -12983,7 +11997,7 @@ inline bool XM_CALLCONV XMVector4NearEqual #else uint32x4_t vResult = vcleq_f32(vabsq_f32(vDelta), Epsilon); #endif - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU); #elif defined(_XM_SSE_INTRINSICS_) @@ -12991,27 +12005,25 @@ inline bool XM_CALLCONV XMVector4NearEqual XMVECTOR vDelta = _mm_sub_ps(V1, V2); // Get the absolute value of the difference XMVECTOR vTemp = _mm_setzero_ps(); - vTemp = _mm_sub_ps(vTemp, vDelta); - vTemp = _mm_max_ps(vTemp, vDelta); - vTemp = _mm_cmple_ps(vTemp, Epsilon); + vTemp = _mm_sub_ps(vTemp, vDelta); + vTemp = _mm_max_ps(vTemp, vDelta); + vTemp = _mm_cmple_ps(vTemp, Epsilon); return ((_mm_movemask_ps(vTemp) == 0xf) != 0); #endif } //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector4NotEqual -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline bool XM_CALLCONV XMVector4NotEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] != V2.vector4_f32[0]) || (V1.vector4_f32[1] != V2.vector4_f32[1]) || (V1.vector4_f32[2] != V2.vector4_f32[2]) || (V1.vector4_f32[3] != V2.vector4_f32[3])) != 0); + return (((V1.vector4_f32[0] != V2.vector4_f32[0]) || (V1.vector4_f32[1] != V2.vector4_f32[1]) + || (V1.vector4_f32[2] != V2.vector4_f32[2]) || (V1.vector4_f32[3] != V2.vector4_f32[3])) + != 0); #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32x4_t vResult = vceqq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) != 0xFFFFFFFFU); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vTemp = _mm_cmpneq_ps(V1, V2); @@ -13023,18 +12035,16 @@ inline bool XM_CALLCONV XMVector4NotEqual //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector4NotEqualInt -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline bool XM_CALLCONV XMVector4NotEqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_u32[0] != V2.vector4_u32[0]) || (V1.vector4_u32[1] != V2.vector4_u32[1]) || (V1.vector4_u32[2] != V2.vector4_u32[2]) || (V1.vector4_u32[3] != V2.vector4_u32[3])) != 0); + return (((V1.vector4_u32[0] != V2.vector4_u32[0]) || (V1.vector4_u32[1] != V2.vector4_u32[1]) + || (V1.vector4_u32[2] != V2.vector4_u32[2]) || (V1.vector4_u32[3] != V2.vector4_u32[3])) + != 0); #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) != 0xFFFFFFFFU); #elif defined(_XM_SSE_INTRINSICS_) __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); @@ -13046,18 +12056,16 @@ inline bool XM_CALLCONV XMVector4NotEqualInt //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector4Greater -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline bool XM_CALLCONV XMVector4Greater(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] > V2.vector4_f32[0]) && (V1.vector4_f32[1] > V2.vector4_f32[1]) && (V1.vector4_f32[2] > V2.vector4_f32[2]) && (V1.vector4_f32[3] > V2.vector4_f32[3])) != 0); + return (((V1.vector4_f32[0] > V2.vector4_f32[0]) && (V1.vector4_f32[1] > V2.vector4_f32[1]) && (V1.vector4_f32[2] > V2.vector4_f32[2]) + && (V1.vector4_f32[3] > V2.vector4_f32[3])) + != 0); #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcgtq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32x4_t vResult = vcgtq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vTemp = _mm_cmpgt_ps(V1, V2); @@ -13069,35 +12077,27 @@ inline bool XM_CALLCONV XMVector4Greater //------------------------------------------------------------------------------ -inline uint32_t XM_CALLCONV XMVector4GreaterR -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline uint32_t XM_CALLCONV XMVector4GreaterR(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) uint32_t CR = 0; - if (V1.vector4_f32[0] > V2.vector4_f32[0] && - V1.vector4_f32[1] > V2.vector4_f32[1] && - V1.vector4_f32[2] > V2.vector4_f32[2] && - V1.vector4_f32[3] > V2.vector4_f32[3]) + if (V1.vector4_f32[0] > V2.vector4_f32[0] && V1.vector4_f32[1] > V2.vector4_f32[1] && V1.vector4_f32[2] > V2.vector4_f32[2] + && V1.vector4_f32[3] > V2.vector4_f32[3]) { CR = XM_CRMASK_CR6TRUE; } - else if (V1.vector4_f32[0] <= V2.vector4_f32[0] && - V1.vector4_f32[1] <= V2.vector4_f32[1] && - V1.vector4_f32[2] <= V2.vector4_f32[2] && - V1.vector4_f32[3] <= V2.vector4_f32[3]) + else if (V1.vector4_f32[0] <= V2.vector4_f32[0] && V1.vector4_f32[1] <= V2.vector4_f32[1] && V1.vector4_f32[2] <= V2.vector4_f32[2] + && V1.vector4_f32[3] <= V2.vector4_f32[3]) { CR = XM_CRMASK_CR6FALSE; } return CR; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcgtq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); + uint32x4_t vResult = vcgtq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); uint32_t CR = 0; if (r == 0xFFFFFFFFU) @@ -13110,9 +12110,9 @@ inline uint32_t XM_CALLCONV XMVector4GreaterR } return CR; #elif defined(_XM_SSE_INTRINSICS_) - uint32_t CR = 0; + uint32_t CR = 0; XMVECTOR vTemp = _mm_cmpgt_ps(V1, V2); - int iTest = _mm_movemask_ps(vTemp); + int iTest = _mm_movemask_ps(vTemp); if (iTest == 0xf) { CR = XM_CRMASK_CR6TRUE; @@ -13127,18 +12127,16 @@ inline uint32_t XM_CALLCONV XMVector4GreaterR //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector4GreaterOrEqual -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline bool XM_CALLCONV XMVector4GreaterOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] >= V2.vector4_f32[0]) && (V1.vector4_f32[1] >= V2.vector4_f32[1]) && (V1.vector4_f32[2] >= V2.vector4_f32[2]) && (V1.vector4_f32[3] >= V2.vector4_f32[3])) != 0); + return (((V1.vector4_f32[0] >= V2.vector4_f32[0]) && (V1.vector4_f32[1] >= V2.vector4_f32[1]) + && (V1.vector4_f32[2] >= V2.vector4_f32[2]) && (V1.vector4_f32[3] >= V2.vector4_f32[3])) + != 0); #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcgeq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32x4_t vResult = vcgeq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vTemp = _mm_cmpge_ps(V1, V2); @@ -13150,35 +12148,27 @@ inline bool XM_CALLCONV XMVector4GreaterOrEqual //------------------------------------------------------------------------------ -inline uint32_t XM_CALLCONV XMVector4GreaterOrEqualR -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline uint32_t XM_CALLCONV XMVector4GreaterOrEqualR(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) uint32_t CR = 0; - if ((V1.vector4_f32[0] >= V2.vector4_f32[0]) && - (V1.vector4_f32[1] >= V2.vector4_f32[1]) && - (V1.vector4_f32[2] >= V2.vector4_f32[2]) && - (V1.vector4_f32[3] >= V2.vector4_f32[3])) + if ((V1.vector4_f32[0] >= V2.vector4_f32[0]) && (V1.vector4_f32[1] >= V2.vector4_f32[1]) && (V1.vector4_f32[2] >= V2.vector4_f32[2]) + && (V1.vector4_f32[3] >= V2.vector4_f32[3])) { CR = XM_CRMASK_CR6TRUE; } - else if ((V1.vector4_f32[0] < V2.vector4_f32[0]) && - (V1.vector4_f32[1] < V2.vector4_f32[1]) && - (V1.vector4_f32[2] < V2.vector4_f32[2]) && - (V1.vector4_f32[3] < V2.vector4_f32[3])) + else if ((V1.vector4_f32[0] < V2.vector4_f32[0]) && (V1.vector4_f32[1] < V2.vector4_f32[1]) && (V1.vector4_f32[2] < V2.vector4_f32[2]) + && (V1.vector4_f32[3] < V2.vector4_f32[3])) { CR = XM_CRMASK_CR6FALSE; } return CR; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcgeq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); + uint32x4_t vResult = vcgeq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); uint32_t CR = 0; if (r == 0xFFFFFFFFU) @@ -13191,9 +12181,9 @@ inline uint32_t XM_CALLCONV XMVector4GreaterOrEqualR } return CR; #elif defined(_XM_SSE_INTRINSICS_) - uint32_t CR = 0; + uint32_t CR = 0; XMVECTOR vTemp = _mm_cmpge_ps(V1, V2); - int iTest = _mm_movemask_ps(vTemp); + int iTest = _mm_movemask_ps(vTemp); if (iTest == 0x0f) { CR = XM_CRMASK_CR6TRUE; @@ -13208,18 +12198,16 @@ inline uint32_t XM_CALLCONV XMVector4GreaterOrEqualR //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector4Less -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline bool XM_CALLCONV XMVector4Less(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] < V2.vector4_f32[0]) && (V1.vector4_f32[1] < V2.vector4_f32[1]) && (V1.vector4_f32[2] < V2.vector4_f32[2]) && (V1.vector4_f32[3] < V2.vector4_f32[3])) != 0); + return (((V1.vector4_f32[0] < V2.vector4_f32[0]) && (V1.vector4_f32[1] < V2.vector4_f32[1]) && (V1.vector4_f32[2] < V2.vector4_f32[2]) + && (V1.vector4_f32[3] < V2.vector4_f32[3])) + != 0); #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcltq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32x4_t vResult = vcltq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vTemp = _mm_cmplt_ps(V1, V2); @@ -13231,18 +12219,16 @@ inline bool XM_CALLCONV XMVector4Less //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector4LessOrEqual -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline bool XM_CALLCONV XMVector4LessOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] <= V2.vector4_f32[0]) && (V1.vector4_f32[1] <= V2.vector4_f32[1]) && (V1.vector4_f32[2] <= V2.vector4_f32[2]) && (V1.vector4_f32[3] <= V2.vector4_f32[3])) != 0); + return (((V1.vector4_f32[0] <= V2.vector4_f32[0]) && (V1.vector4_f32[1] <= V2.vector4_f32[1]) + && (V1.vector4_f32[2] <= V2.vector4_f32[2]) && (V1.vector4_f32[3] <= V2.vector4_f32[3])) + != 0); #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcleq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32x4_t vResult = vcleq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vTemp = _mm_cmple_ps(V1, V2); @@ -13254,17 +12240,14 @@ inline bool XM_CALLCONV XMVector4LessOrEqual //------------------------------------------------------------------------------ -inline bool XM_CALLCONV XMVector4InBounds -( - FXMVECTOR V, - FXMVECTOR Bounds -) noexcept +inline bool XM_CALLCONV XMVector4InBounds(FXMVECTOR V, FXMVECTOR Bounds) noexcept { #if defined(_XM_NO_INTRINSICS_) - return (((V.vector4_f32[0] <= Bounds.vector4_f32[0] && V.vector4_f32[0] >= -Bounds.vector4_f32[0]) && - (V.vector4_f32[1] <= Bounds.vector4_f32[1] && V.vector4_f32[1] >= -Bounds.vector4_f32[1]) && - (V.vector4_f32[2] <= Bounds.vector4_f32[2] && V.vector4_f32[2] >= -Bounds.vector4_f32[2]) && - (V.vector4_f32[3] <= Bounds.vector4_f32[3] && V.vector4_f32[3] >= -Bounds.vector4_f32[3])) != 0); + return (((V.vector4_f32[0] <= Bounds.vector4_f32[0] && V.vector4_f32[0] >= -Bounds.vector4_f32[0]) + && (V.vector4_f32[1] <= Bounds.vector4_f32[1] && V.vector4_f32[1] >= -Bounds.vector4_f32[1]) + && (V.vector4_f32[2] <= Bounds.vector4_f32[2] && V.vector4_f32[2] >= -Bounds.vector4_f32[2]) + && (V.vector4_f32[3] <= Bounds.vector4_f32[3] && V.vector4_f32[3] >= -Bounds.vector4_f32[3])) + != 0); #elif defined(_XM_ARM_NEON_INTRINSICS_) // Test if less than or equal uint32x4_t ivTemp1 = vcleq_f32(V, Bounds); @@ -13275,7 +12258,7 @@ inline bool XM_CALLCONV XMVector4InBounds // Blend answers ivTemp1 = vandq_u32(ivTemp1, ivTemp2); // in bounds? - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(ivTemp1)), vget_high_u8(vreinterpretq_u8_u32(ivTemp1))); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(ivTemp1)), vget_high_u8(vreinterpretq_u8_u32(ivTemp1))); uint16x4x2_t vTemp3 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); return (vget_lane_u32(vreinterpret_u32_u16(vTemp3.val[1]), 1) == 0xFFFFFFFFU); #elif defined(_XM_SSE_INTRINSICS_) @@ -13304,18 +12287,15 @@ inline bool XM_CALLCONV XMVector4InBounds inline bool XM_CALLCONV XMVector4IsNaN(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - return (XMISNAN(V.vector4_f32[0]) || - XMISNAN(V.vector4_f32[1]) || - XMISNAN(V.vector4_f32[2]) || - XMISNAN(V.vector4_f32[3])); + return (XMISNAN(V.vector4_f32[0]) || XMISNAN(V.vector4_f32[1]) || XMISNAN(V.vector4_f32[2]) || XMISNAN(V.vector4_f32[3])); #elif defined(_XM_ARM_NEON_INTRINSICS_) #if defined(__clang__) && __FINITE_MATH_ONLY__ return isnan(vgetq_lane_f32(V, 0)) || isnan(vgetq_lane_f32(V, 1)) || isnan(vgetq_lane_f32(V, 2)) || isnan(vgetq_lane_f32(V, 3)); #else -// Test against itself. NaN is always not equal - uint32x4_t vTempNan = vceqq_f32(V, V); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vTempNan)), vget_high_u8(vreinterpretq_u8_u32(vTempNan))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + // Test against itself. NaN is always not equal + uint32x4_t vTempNan = vceqq_f32(V, V); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vTempNan)), vget_high_u8(vreinterpretq_u8_u32(vTempNan))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); // If any are NaN, the mask is zero return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) != 0xFFFFFFFFU); #endif @@ -13325,7 +12305,7 @@ inline bool XM_CALLCONV XMVector4IsNaN(FXMVECTOR V) noexcept _mm_store_ps(tmp, V); return isnan(tmp[0]) || isnan(tmp[1]) || isnan(tmp[2]) || isnan(tmp[3]); #else -// Test against itself. NaN is always not equal + // Test against itself. NaN is always not equal XMVECTOR vTempNan = _mm_cmpneq_ps(V, V); // If any are NaN, the mask is non-zero return (_mm_movemask_ps(vTempNan) != 0); @@ -13343,10 +12323,7 @@ inline bool XM_CALLCONV XMVector4IsInfinite(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - return (XMISINF(V.vector4_f32[0]) || - XMISINF(V.vector4_f32[1]) || - XMISINF(V.vector4_f32[2]) || - XMISINF(V.vector4_f32[3])); + return (XMISINF(V.vector4_f32[0]) || XMISINF(V.vector4_f32[1]) || XMISINF(V.vector4_f32[2]) || XMISINF(V.vector4_f32[3])); #elif defined(_XM_ARM_NEON_INTRINSICS_) // Mask off the sign bit @@ -13354,7 +12331,7 @@ inline bool XM_CALLCONV XMVector4IsInfinite(FXMVECTOR V) noexcept // Compare to infinity vTempInf = vceqq_f32(vreinterpretq_f32_u32(vTempInf), g_XMInfinity); // If any are infinity, the signs are true. - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vTempInf)), vget_high_u8(vreinterpretq_u8_u32(vTempInf))); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vTempInf)), vget_high_u8(vreinterpretq_u8_u32(vTempInf))); uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) != 0); #elif defined(_XM_SSE_INTRINSICS_) @@ -13373,53 +12350,42 @@ inline bool XM_CALLCONV XMVector4IsInfinite(FXMVECTOR V) noexcept //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector4Dot -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVector4Dot(FXMVECTOR V1, FXMVECTOR V2) noexcept { #if defined(_XM_NO_INTRINSICS_) XMVECTORF32 Result; - Result.f[0] = - Result.f[1] = - Result.f[2] = - Result.f[3] = V1.vector4_f32[0] * V2.vector4_f32[0] + V1.vector4_f32[1] * V2.vector4_f32[1] + V1.vector4_f32[2] * V2.vector4_f32[2] + V1.vector4_f32[3] * V2.vector4_f32[3]; + Result.f[0] = Result.f[1] = Result.f[2] = Result.f[3] = V1.vector4_f32[0] * V2.vector4_f32[0] + V1.vector4_f32[1] * V2.vector4_f32[1] + + V1.vector4_f32[2] * V2.vector4_f32[2] + V1.vector4_f32[3] * V2.vector4_f32[3]; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) float32x4_t vTemp = vmulq_f32(V1, V2); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vadd_f32(v1, v2); - v1 = vpadd_f32(v1, v1); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vadd_f32(v1, v2); + v1 = vpadd_f32(v1, v1); return vcombine_f32(v1, v1); #elif defined(_XM_SSE4_INTRINSICS_) return _mm_dp_ps(V1, V2, 0xff); #elif defined(_XM_SSE3_INTRINSICS_) XMVECTOR vTemp = _mm_mul_ps(V1, V2); - vTemp = _mm_hadd_ps(vTemp, vTemp); + vTemp = _mm_hadd_ps(vTemp, vTemp); return _mm_hadd_ps(vTemp, vTemp); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vTemp2 = V2; - XMVECTOR vTemp = _mm_mul_ps(V1, vTemp2); - vTemp2 = _mm_shuffle_ps(vTemp2, vTemp, _MM_SHUFFLE(1, 0, 0, 0)); // Copy X to the Z position and Y to the W position - vTemp2 = _mm_add_ps(vTemp2, vTemp); // Add Z = X+Z; W = Y+W; - vTemp = _mm_shuffle_ps(vTemp, vTemp2, _MM_SHUFFLE(0, 3, 0, 0)); // Copy W to the Z position - vTemp = _mm_add_ps(vTemp, vTemp2); // Add Z and W together - return XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(2, 2, 2, 2)); // Splat Z and return + XMVECTOR vTemp = _mm_mul_ps(V1, vTemp2); + vTemp2 = _mm_shuffle_ps(vTemp2, vTemp, _MM_SHUFFLE(1, 0, 0, 0)); // Copy X to the Z position and Y to the W position + vTemp2 = _mm_add_ps(vTemp2, vTemp); // Add Z = X+Z; W = Y+W; + vTemp = _mm_shuffle_ps(vTemp, vTemp2, _MM_SHUFFLE(0, 3, 0, 0)); // Copy W to the Z position + vTemp = _mm_add_ps(vTemp, vTemp2); // Add Z and W together + return XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(2, 2, 2, 2)); // Splat Z and return #endif } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector4Cross -( - FXMVECTOR V1, - FXMVECTOR V2, - FXMVECTOR V3 -) noexcept +inline XMVECTOR XM_CALLCONV XMVector4Cross(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR V3) noexcept { // [ ((v2.z*v3.w-v2.w*v3.z)*v1.y)-((v2.y*v3.w-v2.w*v3.y)*v1.z)+((v2.y*v3.z-v2.z*v3.y)*v1.w), // ((v2.w*v3.z-v2.z*v3.w)*v1.x)-((v2.w*v3.x-v2.x*v3.w)*v1.z)+((v2.z*v3.x-v2.x*v3.z)*v1.w), @@ -13429,11 +12395,19 @@ inline XMVECTOR XM_CALLCONV XMVector4Cross #if defined(_XM_NO_INTRINSICS_) XMVECTORF32 Result = { { { - (((V2.vector4_f32[2] * V3.vector4_f32[3]) - (V2.vector4_f32[3] * V3.vector4_f32[2])) * V1.vector4_f32[1]) - (((V2.vector4_f32[1] * V3.vector4_f32[3]) - (V2.vector4_f32[3] * V3.vector4_f32[1])) * V1.vector4_f32[2]) + (((V2.vector4_f32[1] * V3.vector4_f32[2]) - (V2.vector4_f32[2] * V3.vector4_f32[1])) * V1.vector4_f32[3]), - (((V2.vector4_f32[3] * V3.vector4_f32[2]) - (V2.vector4_f32[2] * V3.vector4_f32[3])) * V1.vector4_f32[0]) - (((V2.vector4_f32[3] * V3.vector4_f32[0]) - (V2.vector4_f32[0] * V3.vector4_f32[3])) * V1.vector4_f32[2]) + (((V2.vector4_f32[2] * V3.vector4_f32[0]) - (V2.vector4_f32[0] * V3.vector4_f32[2])) * V1.vector4_f32[3]), - (((V2.vector4_f32[1] * V3.vector4_f32[3]) - (V2.vector4_f32[3] * V3.vector4_f32[1])) * V1.vector4_f32[0]) - (((V2.vector4_f32[0] * V3.vector4_f32[3]) - (V2.vector4_f32[3] * V3.vector4_f32[0])) * V1.vector4_f32[1]) + (((V2.vector4_f32[0] * V3.vector4_f32[1]) - (V2.vector4_f32[1] * V3.vector4_f32[0])) * V1.vector4_f32[3]), - (((V2.vector4_f32[2] * V3.vector4_f32[1]) - (V2.vector4_f32[1] * V3.vector4_f32[2])) * V1.vector4_f32[0]) - (((V2.vector4_f32[2] * V3.vector4_f32[0]) - (V2.vector4_f32[0] * V3.vector4_f32[2])) * V1.vector4_f32[1]) + (((V2.vector4_f32[1] * V3.vector4_f32[0]) - (V2.vector4_f32[0] * V3.vector4_f32[1])) * V1.vector4_f32[2]), - } } }; + (((V2.vector4_f32[2] * V3.vector4_f32[3]) - (V2.vector4_f32[3] * V3.vector4_f32[2])) * V1.vector4_f32[1]) + - (((V2.vector4_f32[1] * V3.vector4_f32[3]) - (V2.vector4_f32[3] * V3.vector4_f32[1])) * V1.vector4_f32[2]) + + (((V2.vector4_f32[1] * V3.vector4_f32[2]) - (V2.vector4_f32[2] * V3.vector4_f32[1])) * V1.vector4_f32[3]), + (((V2.vector4_f32[3] * V3.vector4_f32[2]) - (V2.vector4_f32[2] * V3.vector4_f32[3])) * V1.vector4_f32[0]) + - (((V2.vector4_f32[3] * V3.vector4_f32[0]) - (V2.vector4_f32[0] * V3.vector4_f32[3])) * V1.vector4_f32[2]) + + (((V2.vector4_f32[2] * V3.vector4_f32[0]) - (V2.vector4_f32[0] * V3.vector4_f32[2])) * V1.vector4_f32[3]), + (((V2.vector4_f32[1] * V3.vector4_f32[3]) - (V2.vector4_f32[3] * V3.vector4_f32[1])) * V1.vector4_f32[0]) + - (((V2.vector4_f32[0] * V3.vector4_f32[3]) - (V2.vector4_f32[3] * V3.vector4_f32[0])) * V1.vector4_f32[1]) + + (((V2.vector4_f32[0] * V3.vector4_f32[1]) - (V2.vector4_f32[1] * V3.vector4_f32[0])) * V1.vector4_f32[3]), + (((V2.vector4_f32[2] * V3.vector4_f32[1]) - (V2.vector4_f32[1] * V3.vector4_f32[2])) * V1.vector4_f32[0]) + - (((V2.vector4_f32[2] * V3.vector4_f32[0]) - (V2.vector4_f32[0] * V3.vector4_f32[2])) * V1.vector4_f32[1]) + + (((V2.vector4_f32[1] * V3.vector4_f32[0]) - (V2.vector4_f32[0] * V3.vector4_f32[1])) * V1.vector4_f32[2]), + } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) @@ -13451,9 +12425,9 @@ inline XMVECTOR XM_CALLCONV XMVector4Cross const float32x2_t v3xy = vget_low_f32(V3); const float32x2_t v3wy = vbsl_f32(select, v3wz, v3xy); - float32x4_t vTemp1 = vcombine_f32(v2zw, v2yz); - float32x4_t vTemp2 = vcombine_f32(v3wz, v3wy); - XMVECTOR vResult = vmulq_f32(vTemp1, vTemp2); + float32x4_t vTemp1 = vcombine_f32(v2zw, v2yz); + float32x4_t vTemp2 = vcombine_f32(v3wz, v3wy); + XMVECTOR vResult = vmulq_f32(vTemp1, vTemp2); // - V2wzwy * V3zwyz const float32x2_t v2wy = vbsl_f32(select, v2wz, v2xy); @@ -13461,15 +12435,15 @@ inline XMVECTOR XM_CALLCONV XMVector4Cross const float32x2_t v3yx = vrev64_f32(v3xy); const float32x2_t v3yz = vbsl_f32(select, v3yx, v3wz); - vTemp1 = vcombine_f32(v2wz, v2wy); - vTemp2 = vcombine_f32(v3zw, v3yz); + vTemp1 = vcombine_f32(v2wz, v2wy); + vTemp2 = vcombine_f32(v3zw, v3yz); vResult = vmlsq_f32(vResult, vTemp1, vTemp2); // term1 * V1yxxx const float32x2_t v1xy = vget_low_f32(V1); const float32x2_t v1yx = vrev64_f32(v1xy); - vTemp1 = vcombine_f32(v1yx, vdup_lane_f32(v1yx, 1)); + vTemp1 = vcombine_f32(v1yx, vdup_lane_f32(v1yx, 1)); vResult = vmulq_f32(vResult, vTemp1); // Term2: V2ywxz * V3wxwx @@ -13478,8 +12452,8 @@ inline XMVECTOR XM_CALLCONV XMVector4Cross const float32x2_t v3wx = vbsl_f32(select, v3wz, v3yx); - vTemp1 = vcombine_f32(v2yw, v2xz); - vTemp2 = vcombine_f32(v3wx, v3wx); + vTemp1 = vcombine_f32(v2yw, v2xz); + vTemp2 = vcombine_f32(v3wx, v3wx); float32x4_t vTerm = vmulq_f32(vTemp1, vTemp2); // - V2wxwx * V3ywxz @@ -13490,12 +12464,12 @@ inline XMVECTOR XM_CALLCONV XMVector4Cross vTemp1 = vcombine_f32(v2wx, v2wx); vTemp2 = vcombine_f32(v3yw, v3xz); - vTerm = vmlsq_f32(vTerm, vTemp1, vTemp2); + vTerm = vmlsq_f32(vTerm, vTemp1, vTemp2); // vResult - term2 * V1zzyy const float32x2_t v1zw = vget_high_f32(V1); - vTemp1 = vcombine_f32(vdup_lane_f32(v1zw, 0), vdup_lane_f32(v1yx, 0)); + vTemp1 = vcombine_f32(vdup_lane_f32(v1zw, 0), vdup_lane_f32(v1yx, 0)); vResult = vmlsq_f32(vResult, vTerm, vTemp1); // Term3: V2yzxy * V3zxyx @@ -13503,14 +12477,14 @@ inline XMVECTOR XM_CALLCONV XMVector4Cross vTemp1 = vcombine_f32(v2yz, v2xy); vTemp2 = vcombine_f32(v3zx, v3yx); - vTerm = vmulq_f32(vTemp1, vTemp2); + vTerm = vmulq_f32(vTemp1, vTemp2); // - V2zxyx * V3yzxy const float32x2_t v2zx = vrev64_f32(v2xz); vTemp1 = vcombine_f32(v2zx, v2yx); vTemp2 = vcombine_f32(v3yz, v3xy); - vTerm = vmlsq_f32(vTerm, vTemp1, vTemp2); + vTerm = vmlsq_f32(vTerm, vTemp1, vTemp2); // vResult + term3 * V1wwwz const float32x2_t v1wz = vrev64_f32(v1zw); @@ -13520,15 +12494,15 @@ inline XMVECTOR XM_CALLCONV XMVector4Cross #elif defined(_XM_SSE_INTRINSICS_) // V2zwyz * V3wzwy XMVECTOR vResult = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 1, 3, 2)); - XMVECTOR vTemp3 = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 3, 2, 3)); - vResult = _mm_mul_ps(vResult, vTemp3); + XMVECTOR vTemp3 = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 3, 2, 3)); + vResult = _mm_mul_ps(vResult, vTemp3); // - V2wzwy * V3zwyz XMVECTOR vTemp2 = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 3, 2, 3)); - vTemp3 = XM_PERMUTE_PS(vTemp3, _MM_SHUFFLE(1, 3, 0, 1)); - vResult = XM_FNMADD_PS(vTemp2, vTemp3, vResult); + vTemp3 = XM_PERMUTE_PS(vTemp3, _MM_SHUFFLE(1, 3, 0, 1)); + vResult = XM_FNMADD_PS(vTemp2, vTemp3, vResult); // term1 * V1yxxx XMVECTOR vTemp1 = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 1)); - vResult = _mm_mul_ps(vResult, vTemp1); + vResult = _mm_mul_ps(vResult, vTemp1); // V2ywxz * V3wxwx vTemp2 = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 0, 3, 1)); @@ -13539,7 +12513,7 @@ inline XMVECTOR XM_CALLCONV XMVector4Cross vTemp1 = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 0, 3, 1)); vTemp3 = XM_FNMADD_PS(vTemp2, vTemp1, vTemp3); // vResult - temp * V1zzyy - vTemp1 = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 2, 2)); + vTemp1 = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 2, 2)); vResult = XM_FNMADD_PS(vTemp1, vTemp3, vResult); // V2yzxy * V3zxyx @@ -13551,7 +12525,7 @@ inline XMVECTOR XM_CALLCONV XMVector4Cross vTemp1 = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 0, 2, 1)); vTemp3 = XM_FNMADD_PS(vTemp1, vTemp2, vTemp3); // vResult + term * V1wwwz - vTemp1 = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 3, 3, 3)); + vTemp1 = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 3, 3, 3)); vResult = XM_FMADD_PS(vTemp3, vTemp1, vResult); return vResult; #endif @@ -13580,10 +12554,10 @@ inline XMVECTOR XM_CALLCONV XMVector4ReciprocalLengthEst(FXMVECTOR V) noexcept #elif defined(_XM_ARM_NEON_INTRINSICS_) // Dot4 float32x4_t vTemp = vmulq_f32(V, V); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vadd_f32(v1, v2); - v1 = vpadd_f32(v1, v1); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vadd_f32(v1, v2); + v1 = vpadd_f32(v1, v1); // Reciprocal sqrt (estimate) v2 = vrsqrte_f32(v1); return vcombine_f32(v2, v2); @@ -13592,9 +12566,9 @@ inline XMVECTOR XM_CALLCONV XMVector4ReciprocalLengthEst(FXMVECTOR V) noexcept return _mm_rsqrt_ps(vTemp); #elif defined(_XM_SSE3_INTRINSICS_) XMVECTOR vLengthSq = _mm_mul_ps(V, V); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_rsqrt_ps(vLengthSq); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_rsqrt_ps(vLengthSq); return vLengthSq; #elif defined(_XM_SSE_INTRINSICS_) // Perform the dot product on x,y,z and w @@ -13633,29 +12607,29 @@ inline XMVECTOR XM_CALLCONV XMVector4ReciprocalLength(FXMVECTOR V) noexcept #elif defined(_XM_ARM_NEON_INTRINSICS_) // Dot4 float32x4_t vTemp = vmulq_f32(V, V); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vadd_f32(v1, v2); - v1 = vpadd_f32(v1, v1); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vadd_f32(v1, v2); + v1 = vpadd_f32(v1, v1); // Reciprocal sqrt - float32x2_t S0 = vrsqrte_f32(v1); - float32x2_t P0 = vmul_f32(v1, S0); - float32x2_t R0 = vrsqrts_f32(P0, S0); - float32x2_t S1 = vmul_f32(S0, R0); - float32x2_t P1 = vmul_f32(v1, S1); - float32x2_t R1 = vrsqrts_f32(P1, S1); + float32x2_t S0 = vrsqrte_f32(v1); + float32x2_t P0 = vmul_f32(v1, S0); + float32x2_t R0 = vrsqrts_f32(P0, S0); + float32x2_t S1 = vmul_f32(S0, R0); + float32x2_t P1 = vmul_f32(v1, S1); + float32x2_t R1 = vrsqrts_f32(P1, S1); float32x2_t Result = vmul_f32(S1, R1); return vcombine_f32(Result, Result); #elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vTemp = _mm_dp_ps(V, V, 0xff); + XMVECTOR vTemp = _mm_dp_ps(V, V, 0xff); XMVECTOR vLengthSq = _mm_sqrt_ps(vTemp); return _mm_div_ps(g_XMOne, vLengthSq); #elif defined(_XM_SSE3_INTRINSICS_) XMVECTOR vLengthSq = _mm_mul_ps(V, V); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_sqrt_ps(vLengthSq); - vLengthSq = _mm_div_ps(g_XMOne, vLengthSq); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_sqrt_ps(vLengthSq); + vLengthSq = _mm_div_ps(g_XMOne, vLengthSq); return vLengthSq; #elif defined(_XM_SSE_INTRINSICS_) // Perform the dot product on x,y,z and w @@ -13695,26 +12669,26 @@ inline XMVECTOR XM_CALLCONV XMVector4LengthEst(FXMVECTOR V) noexcept #elif defined(_XM_ARM_NEON_INTRINSICS_) // Dot4 - float32x4_t vTemp = vmulq_f32(V, V); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vadd_f32(v1, v2); - v1 = vpadd_f32(v1, v1); - const float32x2_t zero = vdup_n_f32(0); - uint32x2_t VEqualsZero = vceq_f32(v1, zero); + float32x4_t vTemp = vmulq_f32(V, V); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vadd_f32(v1, v2); + v1 = vpadd_f32(v1, v1); + const float32x2_t zero = vdup_n_f32(0); + uint32x2_t VEqualsZero = vceq_f32(v1, zero); // Sqrt (estimate) float32x2_t Result = vrsqrte_f32(v1); - Result = vmul_f32(v1, Result); - Result = vbsl_f32(VEqualsZero, zero, Result); + Result = vmul_f32(v1, Result); + Result = vbsl_f32(VEqualsZero, zero, Result); return vcombine_f32(Result, Result); #elif defined(_XM_SSE4_INTRINSICS_) XMVECTOR vTemp = _mm_dp_ps(V, V, 0xff); return _mm_sqrt_ps(vTemp); #elif defined(_XM_SSE3_INTRINSICS_) XMVECTOR vLengthSq = _mm_mul_ps(V, V); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_sqrt_ps(vLengthSq); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_sqrt_ps(vLengthSq); return vLengthSq; #elif defined(_XM_SSE_INTRINSICS_) // Perform the dot product on x,y,z and w @@ -13752,32 +12726,32 @@ inline XMVECTOR XM_CALLCONV XMVector4Length(FXMVECTOR V) noexcept #elif defined(_XM_ARM_NEON_INTRINSICS_) // Dot4 - float32x4_t vTemp = vmulq_f32(V, V); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vadd_f32(v1, v2); - v1 = vpadd_f32(v1, v1); - const float32x2_t zero = vdup_n_f32(0); - uint32x2_t VEqualsZero = vceq_f32(v1, zero); + float32x4_t vTemp = vmulq_f32(V, V); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vadd_f32(v1, v2); + v1 = vpadd_f32(v1, v1); + const float32x2_t zero = vdup_n_f32(0); + uint32x2_t VEqualsZero = vceq_f32(v1, zero); // Sqrt - float32x2_t S0 = vrsqrte_f32(v1); - float32x2_t P0 = vmul_f32(v1, S0); - float32x2_t R0 = vrsqrts_f32(P0, S0); - float32x2_t S1 = vmul_f32(S0, R0); - float32x2_t P1 = vmul_f32(v1, S1); - float32x2_t R1 = vrsqrts_f32(P1, S1); + float32x2_t S0 = vrsqrte_f32(v1); + float32x2_t P0 = vmul_f32(v1, S0); + float32x2_t R0 = vrsqrts_f32(P0, S0); + float32x2_t S1 = vmul_f32(S0, R0); + float32x2_t P1 = vmul_f32(v1, S1); + float32x2_t R1 = vrsqrts_f32(P1, S1); float32x2_t Result = vmul_f32(S1, R1); - Result = vmul_f32(v1, Result); - Result = vbsl_f32(VEqualsZero, zero, Result); + Result = vmul_f32(v1, Result); + Result = vbsl_f32(VEqualsZero, zero, Result); return vcombine_f32(Result, Result); #elif defined(_XM_SSE4_INTRINSICS_) XMVECTOR vTemp = _mm_dp_ps(V, V, 0xff); return _mm_sqrt_ps(vTemp); #elif defined(_XM_SSE3_INTRINSICS_) XMVECTOR vLengthSq = _mm_mul_ps(V, V); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_sqrt_ps(vLengthSq); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_sqrt_ps(vLengthSq); return vLengthSq; #elif defined(_XM_SSE_INTRINSICS_) // Perform the dot product on x,y,z and w @@ -13816,24 +12790,24 @@ inline XMVECTOR XM_CALLCONV XMVector4NormalizeEst(FXMVECTOR V) noexcept #elif defined(_XM_ARM_NEON_INTRINSICS_) // Dot4 float32x4_t vTemp = vmulq_f32(V, V); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vadd_f32(v1, v2); - v1 = vpadd_f32(v1, v1); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vadd_f32(v1, v2); + v1 = vpadd_f32(v1, v1); // Reciprocal sqrt (estimate) v2 = vrsqrte_f32(v1); // Normalize return vmulq_f32(V, vcombine_f32(v2, v2)); #elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vTemp = _mm_dp_ps(V, V, 0xff); + XMVECTOR vTemp = _mm_dp_ps(V, V, 0xff); XMVECTOR vResult = _mm_rsqrt_ps(vTemp); return _mm_mul_ps(vResult, V); #elif defined(_XM_SSE3_INTRINSICS_) XMVECTOR vDot = _mm_mul_ps(V, V); - vDot = _mm_hadd_ps(vDot, vDot); - vDot = _mm_hadd_ps(vDot, vDot); - vDot = _mm_rsqrt_ps(vDot); - vDot = _mm_mul_ps(vDot, V); + vDot = _mm_hadd_ps(vDot, vDot); + vDot = _mm_hadd_ps(vDot, vDot); + vDot = _mm_rsqrt_ps(vDot); + vDot = _mm_mul_ps(vDot, V); return vDot; #elif defined(_XM_SSE_INTRINSICS_) // Perform the dot product on x,y,z and w @@ -13863,7 +12837,7 @@ inline XMVECTOR XM_CALLCONV XMVector4NormalizeEst(FXMVECTOR V) noexcept inline XMVECTOR XM_CALLCONV XMVector4Normalize(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - float fLength; + float fLength; XMVECTOR vResult; vResult = XMVector4Length(V); @@ -13883,13 +12857,13 @@ inline XMVECTOR XM_CALLCONV XMVector4Normalize(FXMVECTOR V) noexcept #elif defined(_XM_ARM_NEON_INTRINSICS_) // Dot4 - float32x4_t vTemp = vmulq_f32(V, V); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vadd_f32(v1, v2); - v1 = vpadd_f32(v1, v1); + float32x4_t vTemp = vmulq_f32(V, V); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vadd_f32(v1, v2); + v1 = vpadd_f32(v1, v1); uint32x2_t VEqualsZero = vceq_f32(v1, vdup_n_f32(0)); - uint32x2_t VEqualsInf = vceq_f32(v1, vget_low_f32(g_XMInfinity)); + uint32x2_t VEqualsInf = vceq_f32(v1, vget_low_f32(g_XMInfinity)); // Reciprocal sqrt (2 iterations of Newton-Raphson) float32x2_t S0 = vrsqrte_f32(v1); float32x2_t P0 = vmul_f32(v1, S0); @@ -13897,10 +12871,10 @@ inline XMVECTOR XM_CALLCONV XMVector4Normalize(FXMVECTOR V) noexcept float32x2_t S1 = vmul_f32(S0, R0); float32x2_t P1 = vmul_f32(v1, S1); float32x2_t R1 = vrsqrts_f32(P1, S1); - v2 = vmul_f32(S1, R1); + v2 = vmul_f32(S1, R1); // Normalize XMVECTOR vResult = vmulq_f32(V, vcombine_f32(v2, v2)); - vResult = vbslq_f32(vcombine_u32(VEqualsZero, VEqualsZero), vdupq_n_f32(0), vResult); + vResult = vbslq_f32(vcombine_u32(VEqualsZero, VEqualsZero), vdupq_n_f32(0), vResult); return vbslq_f32(vcombine_u32(VEqualsInf, VEqualsInf), g_XMQNaN, vResult); #elif defined(_XM_SSE4_INTRINSICS_) XMVECTOR vLengthSq = _mm_dp_ps(V, V, 0xff); @@ -13920,13 +12894,13 @@ inline XMVECTOR XM_CALLCONV XMVector4Normalize(FXMVECTOR V) noexcept // Select qnan or result based on infinite length XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); - vResult = _mm_or_ps(vTemp1, vTemp2); + vResult = _mm_or_ps(vTemp1, vTemp2); return vResult; #elif defined(_XM_SSE3_INTRINSICS_) // Perform the dot product on x,y,z and w XMVECTOR vLengthSq = _mm_mul_ps(V, V); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); // Prepare for the division XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); // Create zero with a single instruction @@ -13943,7 +12917,7 @@ inline XMVECTOR XM_CALLCONV XMVector4Normalize(FXMVECTOR V) noexcept // Select qnan or result based on infinite length XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); - vResult = _mm_or_ps(vTemp1, vTemp2); + vResult = _mm_or_ps(vTemp1, vTemp2); return vResult; #elif defined(_XM_SSE_INTRINSICS_) // Perform the dot product on x,y,z and w @@ -13976,19 +12950,14 @@ inline XMVECTOR XM_CALLCONV XMVector4Normalize(FXMVECTOR V) noexcept // Select qnan or result based on infinite length XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); - vResult = _mm_or_ps(vTemp1, vTemp2); + vResult = _mm_or_ps(vTemp1, vTemp2); return vResult; #endif } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector4ClampLength -( - FXMVECTOR V, - float LengthMin, - float LengthMax -) noexcept +inline XMVECTOR XM_CALLCONV XMVector4ClampLength(FXMVECTOR V, float LengthMin, float LengthMax) noexcept { XMVECTOR ClampMax = XMVectorReplicate(LengthMax); XMVECTOR ClampMin = XMVectorReplicate(LengthMin); @@ -13998,15 +12967,12 @@ inline XMVECTOR XM_CALLCONV XMVector4ClampLength //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector4ClampLengthV -( - FXMVECTOR V, - FXMVECTOR LengthMin, - FXMVECTOR LengthMax -) noexcept +inline XMVECTOR XM_CALLCONV XMVector4ClampLengthV(FXMVECTOR V, FXMVECTOR LengthMin, FXMVECTOR LengthMax) noexcept { - assert((XMVectorGetY(LengthMin) == XMVectorGetX(LengthMin)) && (XMVectorGetZ(LengthMin) == XMVectorGetX(LengthMin)) && (XMVectorGetW(LengthMin) == XMVectorGetX(LengthMin))); - assert((XMVectorGetY(LengthMax) == XMVectorGetX(LengthMax)) && (XMVectorGetZ(LengthMax) == XMVectorGetX(LengthMax)) && (XMVectorGetW(LengthMax) == XMVectorGetX(LengthMax))); + assert((XMVectorGetY(LengthMin) == XMVectorGetX(LengthMin)) && (XMVectorGetZ(LengthMin) == XMVectorGetX(LengthMin)) + && (XMVectorGetW(LengthMin) == XMVectorGetX(LengthMin))); + assert((XMVectorGetY(LengthMax) == XMVectorGetX(LengthMax)) && (XMVectorGetZ(LengthMax) == XMVectorGetX(LengthMax)) + && (XMVectorGetW(LengthMax) == XMVectorGetX(LengthMax))); assert(XMVector4GreaterOrEqual(LengthMin, XMVectorZero())); assert(XMVector4GreaterOrEqual(LengthMax, XMVectorZero())); assert(XMVector4GreaterOrEqual(LengthMax, LengthMin)); @@ -14018,56 +12984,47 @@ inline XMVECTOR XM_CALLCONV XMVector4ClampLengthV XMVECTOR RcpLength = XMVectorReciprocalSqrt(LengthSq); XMVECTOR InfiniteLength = XMVectorEqualInt(LengthSq, g_XMInfinity.v); - XMVECTOR ZeroLength = XMVectorEqual(LengthSq, Zero); + XMVECTOR ZeroLength = XMVectorEqual(LengthSq, Zero); XMVECTOR Normal = XMVectorMultiply(V, RcpLength); XMVECTOR Length = XMVectorMultiply(LengthSq, RcpLength); XMVECTOR Select = XMVectorEqualInt(InfiniteLength, ZeroLength); - Length = XMVectorSelect(LengthSq, Length, Select); - Normal = XMVectorSelect(LengthSq, Normal, Select); + Length = XMVectorSelect(LengthSq, Length, Select); + Normal = XMVectorSelect(LengthSq, Normal, Select); XMVECTOR ControlMax = XMVectorGreater(Length, LengthMax); XMVECTOR ControlMin = XMVectorLess(Length, LengthMin); XMVECTOR ClampLength = XMVectorSelect(Length, LengthMax, ControlMax); - ClampLength = XMVectorSelect(ClampLength, LengthMin, ControlMin); + ClampLength = XMVectorSelect(ClampLength, LengthMin, ControlMin); XMVECTOR Result = XMVectorMultiply(Normal, ClampLength); // Preserve the original vector (with no precision loss) if the length falls within the given range XMVECTOR Control = XMVectorEqualInt(ControlMax, ControlMin); - Result = XMVectorSelect(Result, V, Control); + Result = XMVectorSelect(Result, V, Control); return Result; } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector4Reflect -( - FXMVECTOR Incident, - FXMVECTOR Normal -) noexcept +inline XMVECTOR XM_CALLCONV XMVector4Reflect(FXMVECTOR Incident, FXMVECTOR Normal) noexcept { // Result = Incident - (2 * dot(Incident, Normal)) * Normal XMVECTOR Result = XMVector4Dot(Incident, Normal); - Result = XMVectorAdd(Result, Result); - Result = XMVectorNegativeMultiplySubtract(Result, Normal, Incident); + Result = XMVectorAdd(Result, Result); + Result = XMVectorNegativeMultiplySubtract(Result, Normal, Incident); return Result; } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector4Refract -( - FXMVECTOR Incident, - FXMVECTOR Normal, - float RefractionIndex -) noexcept +inline XMVECTOR XM_CALLCONV XMVector4Refract(FXMVECTOR Incident, FXMVECTOR Normal, float RefractionIndex) noexcept { XMVECTOR Index = XMVectorReplicate(RefractionIndex); return XMVector4RefractV(Incident, Normal, Index); @@ -14075,18 +13032,13 @@ inline XMVECTOR XM_CALLCONV XMVector4Refract //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector4RefractV -( - FXMVECTOR Incident, - FXMVECTOR Normal, - FXMVECTOR RefractionIndex -) noexcept +inline XMVECTOR XM_CALLCONV XMVector4RefractV(FXMVECTOR Incident, FXMVECTOR Normal, FXMVECTOR RefractionIndex) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTOR IDotN; - XMVECTOR R; - const XMVECTOR Zero = XMVectorZero(); + XMVECTOR IDotN; + XMVECTOR R; + const XMVECTOR Zero = XMVectorZero(); // Result = RefractionIndex * Incident - Normal * (RefractionIndex * dot(Incident, Normal) + // sqrt(1 - RefractionIndex * RefractionIndex * (1 - dot(Incident, Normal) * dot(Incident, Normal)))) @@ -14123,12 +13075,12 @@ inline XMVECTOR XM_CALLCONV XMVector4RefractV // R = 1.0f - RefractionIndex * RefractionIndex * (1.0f - IDotN * IDotN) float32x4_t R = vmlsq_f32(g_XMOne, IDotN, IDotN); - R = vmulq_f32(R, RefractionIndex); - R = vmlsq_f32(g_XMOne, R, RefractionIndex); + R = vmulq_f32(R, RefractionIndex); + R = vmlsq_f32(g_XMOne, R, RefractionIndex); - uint32x4_t isrzero = vcleq_f32(R, g_XMZero); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(isrzero)), vget_high_u8(vreinterpretq_u8_u32(isrzero))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32x4_t isrzero = vcleq_f32(R, g_XMZero); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(isrzero)), vget_high_u8(vreinterpretq_u8_u32(isrzero))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); float32x4_t vResult; if (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU) @@ -14146,7 +13098,7 @@ inline XMVECTOR XM_CALLCONV XMVector4RefractV float32x4_t P1 = vmulq_f32(R, S1); float32x4_t R1 = vrsqrtsq_f32(P1, S1); float32x4_t S2 = vmulq_f32(S1, R1); - R = vmulq_f32(R, S2); + R = vmulq_f32(R, S2); // R = RefractionIndex * IDotN + sqrt(R) R = vmlaq_f32(R, RefractionIndex, IDotN); // Result = RefractionIndex * Incident - Normal * R @@ -14158,9 +13110,9 @@ inline XMVECTOR XM_CALLCONV XMVector4RefractV XMVECTOR IDotN = XMVector4Dot(Incident, Normal); // R = 1.0f - RefractionIndex * RefractionIndex * (1.0f - IDotN * IDotN) - XMVECTOR R = XM_FNMADD_PS(IDotN, IDotN, g_XMOne); + XMVECTOR R = XM_FNMADD_PS(IDotN, IDotN, g_XMOne); XMVECTOR R2 = _mm_mul_ps(RefractionIndex, RefractionIndex); - R = XM_FNMADD_PS(R, R2, g_XMOne); + R = XM_FNMADD_PS(R, R2, g_XMOne); XMVECTOR vResult = _mm_cmple_ps(R, g_XMZero); if (_mm_movemask_ps(vResult) == 0x0f) @@ -14187,12 +13139,7 @@ inline XMVECTOR XM_CALLCONV XMVector4Orthogonal(FXMVECTOR V) noexcept { #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - V.vector4_f32[2], - V.vector4_f32[3], - -V.vector4_f32[0], - -V.vector4_f32[1] - } } }; + XMVECTORF32 Result = { { { V.vector4_f32[2], V.vector4_f32[3], -V.vector4_f32[0], -V.vector4_f32[1] } } }; return Result.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) @@ -14201,48 +13148,36 @@ inline XMVECTOR XM_CALLCONV XMVector4Orthogonal(FXMVECTOR V) noexcept float32x4_t Result = vcombine_f32(vget_high_f32(V), vget_low_f32(V)); return vmulq_f32(Result, Negate); #elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 FlipZW = { { { 1.0f, 1.0f, -1.0f, -1.0f } } }; - XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 0, 3, 2)); - vResult = _mm_mul_ps(vResult, FlipZW); + static const XMVECTORF32 FlipZW = { { { 1.0f, 1.0f, -1.0f, -1.0f } } }; + XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 0, 3, 2)); + vResult = _mm_mul_ps(vResult, FlipZW); return vResult; #endif } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector4AngleBetweenNormalsEst -( - FXMVECTOR N1, - FXMVECTOR N2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVector4AngleBetweenNormalsEst(FXMVECTOR N1, FXMVECTOR N2) noexcept { XMVECTOR Result = XMVector4Dot(N1, N2); - Result = XMVectorClamp(Result, g_XMNegativeOne.v, g_XMOne.v); - Result = XMVectorACosEst(Result); + Result = XMVectorClamp(Result, g_XMNegativeOne.v, g_XMOne.v); + Result = XMVectorACosEst(Result); return Result; } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector4AngleBetweenNormals -( - FXMVECTOR N1, - FXMVECTOR N2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVector4AngleBetweenNormals(FXMVECTOR N1, FXMVECTOR N2) noexcept { XMVECTOR Result = XMVector4Dot(N1, N2); - Result = XMVectorClamp(Result, g_XMNegativeOne.v, g_XMOne.v); - Result = XMVectorACos(Result); + Result = XMVectorClamp(Result, g_XMNegativeOne.v, g_XMOne.v); + Result = XMVectorACos(Result); return Result; } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector4AngleBetweenVectors -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept +inline XMVECTOR XM_CALLCONV XMVector4AngleBetweenVectors(FXMVECTOR V1, FXMVECTOR V2) noexcept { XMVECTOR L1 = XMVector4ReciprocalLength(V1); XMVECTOR L2 = XMVector4ReciprocalLength(V2); @@ -14252,59 +13187,55 @@ inline XMVECTOR XM_CALLCONV XMVector4AngleBetweenVectors L1 = XMVectorMultiply(L1, L2); XMVECTOR CosAngle = XMVectorMultiply(Dot, L1); - CosAngle = XMVectorClamp(CosAngle, g_XMNegativeOne.v, g_XMOne.v); + CosAngle = XMVectorClamp(CosAngle, g_XMNegativeOne.v, g_XMOne.v); return XMVectorACos(CosAngle); } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVector4Transform -( - FXMVECTOR V, - FXMMATRIX M -) noexcept +inline XMVECTOR XM_CALLCONV XMVector4Transform(FXMVECTOR V, FXMMATRIX M) noexcept { #if defined(_XM_NO_INTRINSICS_) - float fX = (M.m[0][0] * V.vector4_f32[0]) + (M.m[1][0] * V.vector4_f32[1]) + (M.m[2][0] * V.vector4_f32[2]) + (M.m[3][0] * V.vector4_f32[3]); - float fY = (M.m[0][1] * V.vector4_f32[0]) + (M.m[1][1] * V.vector4_f32[1]) + (M.m[2][1] * V.vector4_f32[2]) + (M.m[3][1] * V.vector4_f32[3]); - float fZ = (M.m[0][2] * V.vector4_f32[0]) + (M.m[1][2] * V.vector4_f32[1]) + (M.m[2][2] * V.vector4_f32[2]) + (M.m[3][2] * V.vector4_f32[3]); - float fW = (M.m[0][3] * V.vector4_f32[0]) + (M.m[1][3] * V.vector4_f32[1]) + (M.m[2][3] * V.vector4_f32[2]) + (M.m[3][3] * V.vector4_f32[3]); + float fX + = (M.m[0][0] * V.vector4_f32[0]) + (M.m[1][0] * V.vector4_f32[1]) + (M.m[2][0] * V.vector4_f32[2]) + (M.m[3][0] * V.vector4_f32[3]); + float fY + = (M.m[0][1] * V.vector4_f32[0]) + (M.m[1][1] * V.vector4_f32[1]) + (M.m[2][1] * V.vector4_f32[2]) + (M.m[3][1] * V.vector4_f32[3]); + float fZ + = (M.m[0][2] * V.vector4_f32[0]) + (M.m[1][2] * V.vector4_f32[1]) + (M.m[2][2] * V.vector4_f32[2]) + (M.m[3][2] * V.vector4_f32[3]); + float fW + = (M.m[0][3] * V.vector4_f32[0]) + (M.m[1][3] * V.vector4_f32[1]) + (M.m[2][3] * V.vector4_f32[2]) + (M.m[3][3] * V.vector4_f32[3]); XMVECTORF32 vResult = { { { fX, fY, fZ, fW } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t VL = vget_low_f32(V); - XMVECTOR vResult = vmulq_lane_f32(M.r[0], VL, 0); // X - vResult = vmlaq_lane_f32(vResult, M.r[1], VL, 1); // Y - float32x2_t VH = vget_high_f32(V); - vResult = vmlaq_lane_f32(vResult, M.r[2], VH, 0); // Z - return vmlaq_lane_f32(vResult, M.r[3], VH, 1); // W + float32x2_t VL = vget_low_f32(V); + XMVECTOR vResult = vmulq_lane_f32(M.r[0], VL, 0); // X + vResult = vmlaq_lane_f32(vResult, M.r[1], VL, 1); // Y + float32x2_t VH = vget_high_f32(V); + vResult = vmlaq_lane_f32(vResult, M.r[2], VH, 0); // Z + return vmlaq_lane_f32(vResult, M.r[3], VH, 1); // W #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); // W - vResult = _mm_mul_ps(vResult, M.r[3]); - XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); // Z - vResult = XM_FMADD_PS(vTemp, M.r[2], vResult); - vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = XM_FMADD_PS(vTemp, M.r[1], vResult); - vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); // X - vResult = XM_FMADD_PS(vTemp, M.r[0], vResult); + vResult = _mm_mul_ps(vResult, M.r[3]); + XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); // Z + vResult = XM_FMADD_PS(vTemp, M.r[2], vResult); + vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y + vResult = XM_FMADD_PS(vTemp, M.r[1], vResult); + vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); // X + vResult = XM_FMADD_PS(vTemp, M.r[0], vResult); return vResult; #endif } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMFLOAT4* XM_CALLCONV XMVector4TransformStream -( - XMFLOAT4* pOutputStream, - size_t OutputStride, - const XMFLOAT4* pInputStream, - size_t InputStride, - size_t VectorCount, - FXMMATRIX M -) noexcept +_Use_decl_annotations_ inline XMFLOAT4* XM_CALLCONV XMVector4TransformStream(XMFLOAT4* pOutputStream, + size_t OutputStride, + const XMFLOAT4* pInputStream, + size_t InputStride, + size_t VectorCount, + FXMMATRIX M) noexcept { assert(pOutputStream != nullptr); assert(pInputStream != nullptr); @@ -14317,7 +13248,7 @@ inline XMFLOAT4* XM_CALLCONV XMVector4TransformStream #if defined(_XM_NO_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); const XMVECTOR row0 = M.r[0]; @@ -14334,20 +13265,20 @@ inline XMFLOAT4* XM_CALLCONV XMVector4TransformStream XMVECTOR X = XMVectorSplatX(V); XMVECTOR Result = XMVectorMultiply(W, row3); - Result = XMVectorMultiplyAdd(Z, row2, Result); - Result = XMVectorMultiplyAdd(Y, row1, Result); - Result = XMVectorMultiplyAdd(X, row0, Result); + Result = XMVectorMultiplyAdd(Z, row2, Result); + Result = XMVectorMultiplyAdd(Y, row1, Result); + Result = XMVectorMultiplyAdd(X, row0, Result); - #ifdef _PREFAST_ - #pragma prefast(push) - #pragma prefast(disable : 26015, "PREfast noise: Esp:1307" ) - #endif +#ifdef _PREFAST_ +#pragma prefast(push) +#pragma prefast(disable : 26015, "PREfast noise: Esp:1307") +#endif XMStoreFloat4(reinterpret_cast(pOutputVector), Result); - #ifdef _PREFAST_ - #pragma prefast(pop) - #endif +#ifdef _PREFAST_ +#pragma prefast(pop) +#endif pInputVector += InputStride; pOutputVector += OutputStride; @@ -14356,7 +13287,7 @@ inline XMFLOAT4* XM_CALLCONV XMVector4TransformStream return pOutputStream; #elif defined(_XM_ARM_NEON_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); const XMVECTOR row0 = M.r[0]; @@ -14364,7 +13295,7 @@ inline XMFLOAT4* XM_CALLCONV XMVector4TransformStream const XMVECTOR row2 = M.r[2]; const XMVECTOR row3 = M.r[3]; - size_t i = 0; + size_t i = 0; size_t four = VectorCount >> 2; if (four > 0) { @@ -14375,49 +13306,49 @@ inline XMFLOAT4* XM_CALLCONV XMVector4TransformStream float32x4x4_t V = vld4q_f32(reinterpret_cast(pInputVector)); pInputVector += sizeof(XMFLOAT4) * 4; - float32x2_t r = vget_low_f32(row0); - XMVECTOR vResult0 = vmulq_lane_f32(V.val[0], r, 0); // Ax - XMVECTOR vResult1 = vmulq_lane_f32(V.val[0], r, 1); // Bx + float32x2_t r = vget_low_f32(row0); + XMVECTOR vResult0 = vmulq_lane_f32(V.val[0], r, 0); // Ax + XMVECTOR vResult1 = vmulq_lane_f32(V.val[0], r, 1); // Bx XM_PREFETCH(pInputVector); - r = vget_high_f32(row0); + r = vget_high_f32(row0); XMVECTOR vResult2 = vmulq_lane_f32(V.val[0], r, 0); // Cx XMVECTOR vResult3 = vmulq_lane_f32(V.val[0], r, 1); // Dx XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); - r = vget_low_f32(row1); + r = vget_low_f32(row1); vResult0 = vmlaq_lane_f32(vResult0, V.val[1], r, 0); // Ax+Ey vResult1 = vmlaq_lane_f32(vResult1, V.val[1], r, 1); // Bx+Fy XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 2)); - r = vget_high_f32(row1); + r = vget_high_f32(row1); vResult2 = vmlaq_lane_f32(vResult2, V.val[1], r, 0); // Cx+Gy vResult3 = vmlaq_lane_f32(vResult3, V.val[1], r, 1); // Dx+Hy XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 3)); - r = vget_low_f32(row2); + r = vget_low_f32(row2); vResult0 = vmlaq_lane_f32(vResult0, V.val[2], r, 0); // Ax+Ey+Iz vResult1 = vmlaq_lane_f32(vResult1, V.val[2], r, 1); // Bx+Fy+Jz XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 4)); - r = vget_high_f32(row2); + r = vget_high_f32(row2); vResult2 = vmlaq_lane_f32(vResult2, V.val[2], r, 0); // Cx+Gy+Kz vResult3 = vmlaq_lane_f32(vResult3, V.val[2], r, 1); // Dx+Hy+Lz XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 5)); - r = vget_low_f32(row3); + r = vget_low_f32(row3); vResult0 = vmlaq_lane_f32(vResult0, V.val[3], r, 0); // Ax+Ey+Iz+Mw vResult1 = vmlaq_lane_f32(vResult1, V.val[3], r, 1); // Bx+Fy+Jz+Nw XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 6)); - r = vget_high_f32(row3); + r = vget_high_f32(row3); vResult2 = vmlaq_lane_f32(vResult2, V.val[3], r, 0); // Cx+Gy+Kz+Ow vResult3 = vmlaq_lane_f32(vResult3, V.val[3], r, 1); // Dx+Hy+Lz+Pw @@ -14441,12 +13372,12 @@ inline XMFLOAT4* XM_CALLCONV XMVector4TransformStream XMVECTOR V = vld1q_f32(reinterpret_cast(pInputVector)); pInputVector += InputStride; - float32x2_t VL = vget_low_f32(V); - XMVECTOR vResult = vmulq_lane_f32(row0, VL, 0); // X - vResult = vmlaq_lane_f32(vResult, row1, VL, 1); // Y - float32x2_t VH = vget_high_f32(V); - vResult = vmlaq_lane_f32(vResult, row2, VH, 0); // Z - vResult = vmlaq_lane_f32(vResult, row3, VH, 1); // W + float32x2_t VL = vget_low_f32(V); + XMVECTOR vResult = vmulq_lane_f32(row0, VL, 0); // X + vResult = vmlaq_lane_f32(vResult, row1, VL, 1); // Y + float32x2_t VH = vget_high_f32(V); + vResult = vmlaq_lane_f32(vResult, row2, VH, 0); // Z + vResult = vmlaq_lane_f32(vResult, row3, VH, 1); // W vst1q_f32(reinterpret_cast(pOutputVector), vResult); pOutputVector += OutputStride; @@ -14454,10 +13385,10 @@ inline XMFLOAT4* XM_CALLCONV XMVector4TransformStream return pOutputStream; #elif defined(_XM_AVX2_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); - size_t i = 0; + size_t i = 0; size_t two = VectorCount >> 1; if (two > 0) { @@ -14583,7 +13514,7 @@ inline XMFLOAT4* XM_CALLCONV XMVector4TransformStream return pOutputStream; #elif defined(_XM_SSE_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); + auto pInputVector = reinterpret_cast(pInputStream); auto pOutputVector = reinterpret_cast(pOutputStream); const XMVECTOR row0 = M.r[0]; @@ -14706,25 +13637,21 @@ inline XMFLOAT4* XM_CALLCONV XMVector4TransformStream //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV operator+ (FXMVECTOR V) noexcept +inline XMVECTOR XM_CALLCONV operator+(FXMVECTOR V) noexcept { return V; } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV operator- (FXMVECTOR V) noexcept +inline XMVECTOR XM_CALLCONV operator-(FXMVECTOR V) noexcept { return XMVectorNegate(V); } //------------------------------------------------------------------------------ -inline XMVECTOR& XM_CALLCONV operator+= -( - XMVECTOR& V1, - FXMVECTOR V2 - ) noexcept +inline XMVECTOR& XM_CALLCONV operator+=(XMVECTOR& V1, FXMVECTOR V2) noexcept { V1 = XMVectorAdd(V1, V2); return V1; @@ -14732,11 +13659,7 @@ inline XMVECTOR& XM_CALLCONV operator+= //------------------------------------------------------------------------------ -inline XMVECTOR& XM_CALLCONV operator-= -( - XMVECTOR& V1, - FXMVECTOR V2 - ) noexcept +inline XMVECTOR& XM_CALLCONV operator-=(XMVECTOR& V1, FXMVECTOR V2) noexcept { V1 = XMVectorSubtract(V1, V2); return V1; @@ -14744,11 +13667,7 @@ inline XMVECTOR& XM_CALLCONV operator-= //------------------------------------------------------------------------------ -inline XMVECTOR& XM_CALLCONV operator*= -( - XMVECTOR& V1, - FXMVECTOR V2 - ) noexcept +inline XMVECTOR& XM_CALLCONV operator*=(XMVECTOR& V1, FXMVECTOR V2) noexcept { V1 = XMVectorMultiply(V1, V2); return V1; @@ -14756,11 +13675,7 @@ inline XMVECTOR& XM_CALLCONV operator*= //------------------------------------------------------------------------------ -inline XMVECTOR& XM_CALLCONV operator/= -( - XMVECTOR& V1, - FXMVECTOR V2 - ) noexcept +inline XMVECTOR& XM_CALLCONV operator/=(XMVECTOR& V1, FXMVECTOR V2) noexcept { V1 = XMVectorDivide(V1, V2); return V1; @@ -14768,11 +13683,7 @@ inline XMVECTOR& XM_CALLCONV operator/= //------------------------------------------------------------------------------ -inline XMVECTOR& operator*= -( - XMVECTOR& V, - const float S - ) noexcept +inline XMVECTOR& operator*=(XMVECTOR& V, const float S) noexcept { V = XMVectorScale(V, S); return V; @@ -14780,79 +13691,51 @@ inline XMVECTOR& operator*= //------------------------------------------------------------------------------ -inline XMVECTOR& operator/= -( - XMVECTOR& V, - const float S - ) noexcept +inline XMVECTOR& operator/=(XMVECTOR& V, const float S) noexcept { XMVECTOR vS = XMVectorReplicate(S); - V = XMVectorDivide(V, vS); + V = XMVectorDivide(V, vS); return V; } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV operator+ -( - FXMVECTOR V1, - FXMVECTOR V2 - ) noexcept +inline XMVECTOR XM_CALLCONV operator+(FXMVECTOR V1, FXMVECTOR V2) noexcept { return XMVectorAdd(V1, V2); } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV operator- -( - FXMVECTOR V1, - FXMVECTOR V2 - ) noexcept +inline XMVECTOR XM_CALLCONV operator-(FXMVECTOR V1, FXMVECTOR V2) noexcept { return XMVectorSubtract(V1, V2); } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV operator* -( - FXMVECTOR V1, - FXMVECTOR V2 - ) noexcept +inline XMVECTOR XM_CALLCONV operator*(FXMVECTOR V1, FXMVECTOR V2) noexcept { return XMVectorMultiply(V1, V2); } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV operator/ -( - FXMVECTOR V1, - FXMVECTOR V2 - ) noexcept +inline XMVECTOR XM_CALLCONV operator/(FXMVECTOR V1, FXMVECTOR V2) noexcept { return XMVectorDivide(V1, V2); } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV operator* -( - FXMVECTOR V, - const float S - ) noexcept +inline XMVECTOR XM_CALLCONV operator*(FXMVECTOR V, const float S) noexcept { return XMVectorScale(V, S); } //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV operator/ -( - FXMVECTOR V, - const float S - ) noexcept +inline XMVECTOR XM_CALLCONV operator/(FXMVECTOR V, const float S) noexcept { XMVECTOR vS = XMVectorReplicate(S); return XMVectorDivide(V, vS); @@ -14860,11 +13743,7 @@ inline XMVECTOR XM_CALLCONV operator/ //------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV operator* -( - float S, - FXMVECTOR V - ) noexcept +inline XMVECTOR XM_CALLCONV operator*(float S, FXMVECTOR V) noexcept { return XMVectorScale(V, S); } @@ -14880,4 +13759,3 @@ inline XMVECTOR XM_CALLCONV operator* #undef XM3UNPACK3INTO4 #undef XM3PACK4INTO3 #endif - diff --git a/Inc/DirectXPackedVector.h b/Inc/DirectXPackedVector.h index 3fcaf432..c849bf79 100644 --- a/Inc/DirectXPackedVector.h +++ b/Inc/DirectXPackedVector.h @@ -16,57 +16,63 @@ namespace DirectX namespace PackedVector { - #ifdef _MSC_VER - #pragma warning(push) - #pragma warning(disable:4201 4365 4324 4996) - // C4201: nonstandard extension used - // C4365: Off by default noise - // C4324: alignment padding warnings - // C4996: deprecation warnings - #endif - - #ifdef __clang__ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wgnu-anonymous-struct" - #pragma clang diagnostic ignored "-Wnested-anon-types" - #endif - - //------------------------------------------------------------------------------ - // ARGB Color; 8-8-8-8 bit unsigned normalized integer components packed into - // a 32 bit integer. The normalized color is packed into 32 bits using 8 bit - // unsigned, normalized integers for the alpha, red, green, and blue components. - // The alpha component is stored in the most significant bits and the blue - // component in the least significant bits (A8R8G8B8): - // [32] aaaaaaaa rrrrrrrr gggggggg bbbbbbbb [0] +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4201 4365 4324 4996) + // C4201: nonstandard extension used + // C4365: Off by default noise + // C4324: alignment padding warnings + // C4996: deprecation warnings +#endif + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu-anonymous-struct" +#pragma clang diagnostic ignored "-Wnested-anon-types" +#endif + + //------------------------------------------------------------------------------ + // ARGB Color; 8-8-8-8 bit unsigned normalized integer components packed into + // a 32 bit integer. The normalized color is packed into 32 bits using 8 bit + // unsigned, normalized integers for the alpha, red, green, and blue components. + // The alpha component is stored in the most significant bits and the blue + // component in the least significant bits (A8R8G8B8): + // [32] aaaaaaaa rrrrrrrr gggggggg bbbbbbbb [0] struct XMCOLOR { union { struct { - uint8_t b; // Blue: 0/255 to 255/255 - uint8_t g; // Green: 0/255 to 255/255 - uint8_t r; // Red: 0/255 to 255/255 - uint8_t a; // Alpha: 0/255 to 255/255 + uint8_t b; // Blue: 0/255 to 255/255 + uint8_t g; // Green: 0/255 to 255/255 + uint8_t r; // Red: 0/255 to 255/255 + uint8_t a; // Alpha: 0/255 to 255/255 }; uint32_t c; }; XMCOLOR() = default; - XMCOLOR(const XMCOLOR&) = default; + XMCOLOR(const XMCOLOR&) = default; XMCOLOR& operator=(const XMCOLOR&) = default; - XMCOLOR(XMCOLOR&&) = default; + XMCOLOR(XMCOLOR&&) = default; XMCOLOR& operator=(XMCOLOR&&) = default; - constexpr XMCOLOR(uint32_t Color) noexcept : c(Color) {} + constexpr XMCOLOR(uint32_t Color) noexcept + : c(Color) + {} XMCOLOR(float _r, float _g, float _b, float _a) noexcept; explicit XMCOLOR(_In_reads_(4) const float* pArray) noexcept; - operator uint32_t () const noexcept { return c; } + operator uint32_t() const noexcept { return c; } - XMCOLOR& operator= (const uint32_t Color) noexcept { c = Color; return *this; } + XMCOLOR& operator=(const uint32_t Color) noexcept + { + c = Color; + return *this; + } }; //------------------------------------------------------------------------------ @@ -90,19 +96,31 @@ namespace DirectX XMHALF2() = default; - XMHALF2(const XMHALF2&) = default; + XMHALF2(const XMHALF2&) = default; XMHALF2& operator=(const XMHALF2&) = default; - XMHALF2(XMHALF2&&) = default; + XMHALF2(XMHALF2&&) = default; XMHALF2& operator=(XMHALF2&&) = default; - explicit constexpr XMHALF2(uint32_t Packed) noexcept : v(Packed) {} - constexpr XMHALF2(HALF _x, HALF _y) noexcept : x(_x), y(_y) {} - explicit XMHALF2(_In_reads_(2) const HALF* pArray) noexcept : x(pArray[0]), y(pArray[1]) {} + explicit constexpr XMHALF2(uint32_t Packed) noexcept + : v(Packed) + {} + constexpr XMHALF2(HALF _x, HALF _y) noexcept + : x(_x), + y(_y) + {} + explicit XMHALF2(_In_reads_(2) const HALF* pArray) noexcept + : x(pArray[0]), + y(pArray[1]) + {} XMHALF2(float _x, float _y) noexcept; explicit XMHALF2(_In_reads_(2) const float* pArray) noexcept; - XMHALF2& operator= (uint32_t Packed) noexcept { v = Packed; return *this; } + XMHALF2& operator=(uint32_t Packed) noexcept + { + v = Packed; + return *this; + } }; //------------------------------------------------------------------------------ @@ -121,19 +139,31 @@ namespace DirectX XMSHORTN2() = default; - XMSHORTN2(const XMSHORTN2&) = default; + XMSHORTN2(const XMSHORTN2&) = default; XMSHORTN2& operator=(const XMSHORTN2&) = default; - XMSHORTN2(XMSHORTN2&&) = default; + XMSHORTN2(XMSHORTN2&&) = default; XMSHORTN2& operator=(XMSHORTN2&&) = default; - explicit constexpr XMSHORTN2(uint32_t Packed) noexcept : v(Packed) {} - constexpr XMSHORTN2(int16_t _x, int16_t _y) noexcept : x(_x), y(_y) {} - explicit XMSHORTN2(_In_reads_(2) const int16_t* pArray) noexcept : x(pArray[0]), y(pArray[1]) {} + explicit constexpr XMSHORTN2(uint32_t Packed) noexcept + : v(Packed) + {} + constexpr XMSHORTN2(int16_t _x, int16_t _y) noexcept + : x(_x), + y(_y) + {} + explicit XMSHORTN2(_In_reads_(2) const int16_t* pArray) noexcept + : x(pArray[0]), + y(pArray[1]) + {} XMSHORTN2(float _x, float _y) noexcept; explicit XMSHORTN2(_In_reads_(2) const float* pArray) noexcept; - XMSHORTN2& operator= (uint32_t Packed) noexcept { v = Packed; return *this; } + XMSHORTN2& operator=(uint32_t Packed) noexcept + { + v = Packed; + return *this; + } }; // 2D Vector; 16 bit signed integer components @@ -151,19 +181,31 @@ namespace DirectX XMSHORT2() = default; - XMSHORT2(const XMSHORT2&) = default; + XMSHORT2(const XMSHORT2&) = default; XMSHORT2& operator=(const XMSHORT2&) = default; - XMSHORT2(XMSHORT2&&) = default; + XMSHORT2(XMSHORT2&&) = default; XMSHORT2& operator=(XMSHORT2&&) = default; - explicit constexpr XMSHORT2(uint32_t Packed) noexcept : v(Packed) {} - constexpr XMSHORT2(int16_t _x, int16_t _y) noexcept : x(_x), y(_y) {} - explicit XMSHORT2(_In_reads_(2) const int16_t* pArray) noexcept : x(pArray[0]), y(pArray[1]) {} + explicit constexpr XMSHORT2(uint32_t Packed) noexcept + : v(Packed) + {} + constexpr XMSHORT2(int16_t _x, int16_t _y) noexcept + : x(_x), + y(_y) + {} + explicit XMSHORT2(_In_reads_(2) const int16_t* pArray) noexcept + : x(pArray[0]), + y(pArray[1]) + {} XMSHORT2(float _x, float _y) noexcept; explicit XMSHORT2(_In_reads_(2) const float* pArray) noexcept; - XMSHORT2& operator= (uint32_t Packed) noexcept { v = Packed; return *this; } + XMSHORT2& operator=(uint32_t Packed) noexcept + { + v = Packed; + return *this; + } }; // 2D Vector; 16 bit unsigned normalized integer components @@ -181,19 +223,31 @@ namespace DirectX XMUSHORTN2() = default; - XMUSHORTN2(const XMUSHORTN2&) = default; + XMUSHORTN2(const XMUSHORTN2&) = default; XMUSHORTN2& operator=(const XMUSHORTN2&) = default; - XMUSHORTN2(XMUSHORTN2&&) = default; + XMUSHORTN2(XMUSHORTN2&&) = default; XMUSHORTN2& operator=(XMUSHORTN2&&) = default; - explicit constexpr XMUSHORTN2(uint32_t Packed) noexcept : v(Packed) {} - constexpr XMUSHORTN2(uint16_t _x, uint16_t _y) noexcept : x(_x), y(_y) {} - explicit XMUSHORTN2(_In_reads_(2) const uint16_t* pArray) noexcept : x(pArray[0]), y(pArray[1]) {} + explicit constexpr XMUSHORTN2(uint32_t Packed) noexcept + : v(Packed) + {} + constexpr XMUSHORTN2(uint16_t _x, uint16_t _y) noexcept + : x(_x), + y(_y) + {} + explicit XMUSHORTN2(_In_reads_(2) const uint16_t* pArray) noexcept + : x(pArray[0]), + y(pArray[1]) + {} XMUSHORTN2(float _x, float _y) noexcept; explicit XMUSHORTN2(_In_reads_(2) const float* pArray) noexcept; - XMUSHORTN2& operator= (uint32_t Packed) noexcept { v = Packed; return *this; } + XMUSHORTN2& operator=(uint32_t Packed) noexcept + { + v = Packed; + return *this; + } }; // 2D Vector; 16 bit unsigned integer components @@ -211,19 +265,31 @@ namespace DirectX XMUSHORT2() = default; - XMUSHORT2(const XMUSHORT2&) = default; + XMUSHORT2(const XMUSHORT2&) = default; XMUSHORT2& operator=(const XMUSHORT2&) = default; - XMUSHORT2(XMUSHORT2&&) = default; + XMUSHORT2(XMUSHORT2&&) = default; XMUSHORT2& operator=(XMUSHORT2&&) = default; - explicit constexpr XMUSHORT2(uint32_t Packed) noexcept : v(Packed) {} - constexpr XMUSHORT2(uint16_t _x, uint16_t _y) noexcept : x(_x), y(_y) {} - explicit XMUSHORT2(_In_reads_(2) const uint16_t* pArray) noexcept : x(pArray[0]), y(pArray[1]) {} + explicit constexpr XMUSHORT2(uint32_t Packed) noexcept + : v(Packed) + {} + constexpr XMUSHORT2(uint16_t _x, uint16_t _y) noexcept + : x(_x), + y(_y) + {} + explicit XMUSHORT2(_In_reads_(2) const uint16_t* pArray) noexcept + : x(pArray[0]), + y(pArray[1]) + {} XMUSHORT2(float _x, float _y) noexcept; explicit XMUSHORT2(_In_reads_(2) const float* pArray) noexcept; - XMUSHORT2& operator= (uint32_t Packed) noexcept { v = Packed; return *this; } + XMUSHORT2& operator=(uint32_t Packed) noexcept + { + v = Packed; + return *this; + } }; //------------------------------------------------------------------------------ @@ -242,19 +308,31 @@ namespace DirectX XMBYTEN2() = default; - XMBYTEN2(const XMBYTEN2&) = default; + XMBYTEN2(const XMBYTEN2&) = default; XMBYTEN2& operator=(const XMBYTEN2&) = default; - XMBYTEN2(XMBYTEN2&&) = default; + XMBYTEN2(XMBYTEN2&&) = default; XMBYTEN2& operator=(XMBYTEN2&&) = default; - explicit constexpr XMBYTEN2(uint16_t Packed) noexcept : v(Packed) {} - constexpr XMBYTEN2(int8_t _x, int8_t _y) noexcept : x(_x), y(_y) {} - explicit XMBYTEN2(_In_reads_(2) const int8_t* pArray) noexcept : x(pArray[0]), y(pArray[1]) {} + explicit constexpr XMBYTEN2(uint16_t Packed) noexcept + : v(Packed) + {} + constexpr XMBYTEN2(int8_t _x, int8_t _y) noexcept + : x(_x), + y(_y) + {} + explicit XMBYTEN2(_In_reads_(2) const int8_t* pArray) noexcept + : x(pArray[0]), + y(pArray[1]) + {} XMBYTEN2(float _x, float _y) noexcept; explicit XMBYTEN2(_In_reads_(2) const float* pArray) noexcept; - XMBYTEN2& operator= (uint16_t Packed) noexcept { v = Packed; return *this; } + XMBYTEN2& operator=(uint16_t Packed) noexcept + { + v = Packed; + return *this; + } }; // 2D Vector; 8 bit signed integer components @@ -272,19 +350,31 @@ namespace DirectX XMBYTE2() = default; - XMBYTE2(const XMBYTE2&) = default; + XMBYTE2(const XMBYTE2&) = default; XMBYTE2& operator=(const XMBYTE2&) = default; - XMBYTE2(XMBYTE2&&) = default; + XMBYTE2(XMBYTE2&&) = default; XMBYTE2& operator=(XMBYTE2&&) = default; - explicit constexpr XMBYTE2(uint16_t Packed) noexcept : v(Packed) {} - constexpr XMBYTE2(int8_t _x, int8_t _y) noexcept : x(_x), y(_y) {} - explicit XMBYTE2(_In_reads_(2) const int8_t* pArray) noexcept : x(pArray[0]), y(pArray[1]) {} + explicit constexpr XMBYTE2(uint16_t Packed) noexcept + : v(Packed) + {} + constexpr XMBYTE2(int8_t _x, int8_t _y) noexcept + : x(_x), + y(_y) + {} + explicit XMBYTE2(_In_reads_(2) const int8_t* pArray) noexcept + : x(pArray[0]), + y(pArray[1]) + {} XMBYTE2(float _x, float _y) noexcept; explicit XMBYTE2(_In_reads_(2) const float* pArray) noexcept; - XMBYTE2& operator= (uint16_t Packed) noexcept { v = Packed; return *this; } + XMBYTE2& operator=(uint16_t Packed) noexcept + { + v = Packed; + return *this; + } }; // 2D Vector; 8 bit unsigned normalized integer components @@ -302,19 +392,31 @@ namespace DirectX XMUBYTEN2() = default; - XMUBYTEN2(const XMUBYTEN2&) = default; + XMUBYTEN2(const XMUBYTEN2&) = default; XMUBYTEN2& operator=(const XMUBYTEN2&) = default; - XMUBYTEN2(XMUBYTEN2&&) = default; + XMUBYTEN2(XMUBYTEN2&&) = default; XMUBYTEN2& operator=(XMUBYTEN2&&) = default; - explicit constexpr XMUBYTEN2(uint16_t Packed) noexcept : v(Packed) {} - constexpr XMUBYTEN2(uint8_t _x, uint8_t _y) noexcept : x(_x), y(_y) {} - explicit XMUBYTEN2(_In_reads_(2) const uint8_t* pArray) noexcept : x(pArray[0]), y(pArray[1]) {} + explicit constexpr XMUBYTEN2(uint16_t Packed) noexcept + : v(Packed) + {} + constexpr XMUBYTEN2(uint8_t _x, uint8_t _y) noexcept + : x(_x), + y(_y) + {} + explicit XMUBYTEN2(_In_reads_(2) const uint8_t* pArray) noexcept + : x(pArray[0]), + y(pArray[1]) + {} XMUBYTEN2(float _x, float _y) noexcept; explicit XMUBYTEN2(_In_reads_(2) const float* pArray) noexcept; - XMUBYTEN2& operator= (uint16_t Packed) noexcept { v = Packed; return *this; } + XMUBYTEN2& operator=(uint16_t Packed) noexcept + { + v = Packed; + return *this; + } }; // 2D Vector; 8 bit unsigned integer components @@ -332,19 +434,31 @@ namespace DirectX XMUBYTE2() = default; - XMUBYTE2(const XMUBYTE2&) = default; + XMUBYTE2(const XMUBYTE2&) = default; XMUBYTE2& operator=(const XMUBYTE2&) = default; - XMUBYTE2(XMUBYTE2&&) = default; + XMUBYTE2(XMUBYTE2&&) = default; XMUBYTE2& operator=(XMUBYTE2&&) = default; - explicit constexpr XMUBYTE2(uint16_t Packed) noexcept : v(Packed) {} - constexpr XMUBYTE2(uint8_t _x, uint8_t _y) noexcept : x(_x), y(_y) {} - explicit XMUBYTE2(_In_reads_(2) const uint8_t* pArray) noexcept : x(pArray[0]), y(pArray[1]) {} + explicit constexpr XMUBYTE2(uint16_t Packed) noexcept + : v(Packed) + {} + constexpr XMUBYTE2(uint8_t _x, uint8_t _y) noexcept + : x(_x), + y(_y) + {} + explicit XMUBYTE2(_In_reads_(2) const uint8_t* pArray) noexcept + : x(pArray[0]), + y(pArray[1]) + {} XMUBYTE2(float _x, float _y) noexcept; explicit XMUBYTE2(_In_reads_(2) const float* pArray) noexcept; - XMUBYTE2& operator= (uint16_t Packed) noexcept { v = Packed; return *this; } + XMUBYTE2& operator=(uint16_t Packed) noexcept + { + v = Packed; + return *this; + } }; //------------------------------------------------------------------------------ @@ -355,30 +469,44 @@ namespace DirectX { struct { - uint16_t x : 5; // 0 to 31 - uint16_t y : 6; // 0 to 63 - uint16_t z : 5; // 0 to 31 + uint16_t x : 5; // 0 to 31 + uint16_t y : 6; // 0 to 63 + uint16_t z : 5; // 0 to 31 }; uint16_t v; }; XMU565() = default; - XMU565(const XMU565&) = default; + XMU565(const XMU565&) = default; XMU565& operator=(const XMU565&) = default; - XMU565(XMU565&&) = default; + XMU565(XMU565&&) = default; XMU565& operator=(XMU565&&) = default; - explicit constexpr XMU565(uint16_t Packed) noexcept : v(Packed) {} - constexpr XMU565(uint8_t _x, uint8_t _y, uint8_t _z) noexcept : x(_x), y(_y), z(_z) {} - explicit XMU565(_In_reads_(3) const uint8_t* pArray) noexcept : x(pArray[0]), y(pArray[1]), z(pArray[2]) {} + explicit constexpr XMU565(uint16_t Packed) noexcept + : v(Packed) + {} + constexpr XMU565(uint8_t _x, uint8_t _y, uint8_t _z) noexcept + : x(_x), + y(_y), + z(_z) + {} + explicit XMU565(_In_reads_(3) const uint8_t* pArray) noexcept + : x(pArray[0]), + y(pArray[1]), + z(pArray[2]) + {} XMU565(float _x, float _y, float _z) noexcept; explicit XMU565(_In_reads_(3) const float* pArray) noexcept; - operator uint16_t () const noexcept { return v; } + operator uint16_t() const noexcept { return v; } - XMU565& operator= (uint16_t Packed) noexcept { v = Packed; return *this; } + XMU565& operator=(uint16_t Packed) noexcept + { + v = Packed; + return *this; + } }; //------------------------------------------------------------------------------ @@ -408,19 +536,25 @@ namespace DirectX XMFLOAT3PK() = default; - XMFLOAT3PK(const XMFLOAT3PK&) = default; + XMFLOAT3PK(const XMFLOAT3PK&) = default; XMFLOAT3PK& operator=(const XMFLOAT3PK&) = default; - XMFLOAT3PK(XMFLOAT3PK&&) = default; + XMFLOAT3PK(XMFLOAT3PK&&) = default; XMFLOAT3PK& operator=(XMFLOAT3PK&&) = default; - explicit constexpr XMFLOAT3PK(uint32_t Packed) noexcept : v(Packed) {} + explicit constexpr XMFLOAT3PK(uint32_t Packed) noexcept + : v(Packed) + {} XMFLOAT3PK(float _x, float _y, float _z) noexcept; explicit XMFLOAT3PK(_In_reads_(3) const float* pArray) noexcept; - operator uint32_t () const noexcept { return v; } + operator uint32_t() const noexcept { return v; } - XMFLOAT3PK& operator= (uint32_t Packed) noexcept { v = Packed; return *this; } + XMFLOAT3PK& operator=(uint32_t Packed) noexcept + { + v = Packed; + return *this; + } }; //------------------------------------------------------------------------------ @@ -440,26 +574,32 @@ namespace DirectX uint32_t xm : 9; // x-mantissa uint32_t ym : 9; // y-mantissa uint32_t zm : 9; // z-mantissa - uint32_t e : 5; // shared exponent + uint32_t e : 5; // shared exponent }; uint32_t v; }; XMFLOAT3SE() = default; - XMFLOAT3SE(const XMFLOAT3SE&) = default; + XMFLOAT3SE(const XMFLOAT3SE&) = default; XMFLOAT3SE& operator=(const XMFLOAT3SE&) = default; - XMFLOAT3SE(XMFLOAT3SE&&) = default; + XMFLOAT3SE(XMFLOAT3SE&&) = default; XMFLOAT3SE& operator=(XMFLOAT3SE&&) = default; - explicit constexpr XMFLOAT3SE(uint32_t Packed) noexcept : v(Packed) {} + explicit constexpr XMFLOAT3SE(uint32_t Packed) noexcept + : v(Packed) + {} XMFLOAT3SE(float _x, float _y, float _z) noexcept; explicit XMFLOAT3SE(_In_reads_(3) const float* pArray) noexcept; - operator uint32_t () const noexcept { return v; } + operator uint32_t() const noexcept { return v; } - XMFLOAT3SE& operator= (uint32_t Packed) noexcept { v = Packed; return *this; } + XMFLOAT3SE& operator=(uint32_t Packed) noexcept + { + v = Packed; + return *this; + } }; //------------------------------------------------------------------------------ @@ -480,19 +620,35 @@ namespace DirectX XMHALF4() = default; - XMHALF4(const XMHALF4&) = default; + XMHALF4(const XMHALF4&) = default; XMHALF4& operator=(const XMHALF4&) = default; - XMHALF4(XMHALF4&&) = default; + XMHALF4(XMHALF4&&) = default; XMHALF4& operator=(XMHALF4&&) = default; - explicit constexpr XMHALF4(uint64_t Packed) noexcept : v(Packed) {} - constexpr XMHALF4(HALF _x, HALF _y, HALF _z, HALF _w) noexcept : x(_x), y(_y), z(_z), w(_w) {} - explicit XMHALF4(_In_reads_(4) const HALF* pArray) noexcept : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} + explicit constexpr XMHALF4(uint64_t Packed) noexcept + : v(Packed) + {} + constexpr XMHALF4(HALF _x, HALF _y, HALF _z, HALF _w) noexcept + : x(_x), + y(_y), + z(_z), + w(_w) + {} + explicit XMHALF4(_In_reads_(4) const HALF* pArray) noexcept + : x(pArray[0]), + y(pArray[1]), + z(pArray[2]), + w(pArray[3]) + {} XMHALF4(float _x, float _y, float _z, float _w) noexcept; explicit XMHALF4(_In_reads_(4) const float* pArray) noexcept; - XMHALF4& operator= (uint64_t Packed) noexcept { v = Packed; return *this; } + XMHALF4& operator=(uint64_t Packed) noexcept + { + v = Packed; + return *this; + } }; //------------------------------------------------------------------------------ @@ -513,19 +669,35 @@ namespace DirectX XMSHORTN4() = default; - XMSHORTN4(const XMSHORTN4&) = default; + XMSHORTN4(const XMSHORTN4&) = default; XMSHORTN4& operator=(const XMSHORTN4&) = default; - XMSHORTN4(XMSHORTN4&&) = default; + XMSHORTN4(XMSHORTN4&&) = default; XMSHORTN4& operator=(XMSHORTN4&&) = default; - explicit constexpr XMSHORTN4(uint64_t Packed) noexcept : v(Packed) {} - constexpr XMSHORTN4(int16_t _x, int16_t _y, int16_t _z, int16_t _w) noexcept : x(_x), y(_y), z(_z), w(_w) {} - explicit XMSHORTN4(_In_reads_(4) const int16_t* pArray) noexcept : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} + explicit constexpr XMSHORTN4(uint64_t Packed) noexcept + : v(Packed) + {} + constexpr XMSHORTN4(int16_t _x, int16_t _y, int16_t _z, int16_t _w) noexcept + : x(_x), + y(_y), + z(_z), + w(_w) + {} + explicit XMSHORTN4(_In_reads_(4) const int16_t* pArray) noexcept + : x(pArray[0]), + y(pArray[1]), + z(pArray[2]), + w(pArray[3]) + {} XMSHORTN4(float _x, float _y, float _z, float _w) noexcept; explicit XMSHORTN4(_In_reads_(4) const float* pArray) noexcept; - XMSHORTN4& operator= (uint64_t Packed) noexcept { v = Packed; return *this; } + XMSHORTN4& operator=(uint64_t Packed) noexcept + { + v = Packed; + return *this; + } }; // 4D Vector; 16 bit signed integer components @@ -545,19 +717,35 @@ namespace DirectX XMSHORT4() = default; - XMSHORT4(const XMSHORT4&) = default; + XMSHORT4(const XMSHORT4&) = default; XMSHORT4& operator=(const XMSHORT4&) = default; - XMSHORT4(XMSHORT4&&) = default; + XMSHORT4(XMSHORT4&&) = default; XMSHORT4& operator=(XMSHORT4&&) = default; - explicit constexpr XMSHORT4(uint64_t Packed) noexcept : v(Packed) {} - constexpr XMSHORT4(int16_t _x, int16_t _y, int16_t _z, int16_t _w) noexcept : x(_x), y(_y), z(_z), w(_w) {} - explicit XMSHORT4(_In_reads_(4) const int16_t* pArray) noexcept : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} + explicit constexpr XMSHORT4(uint64_t Packed) noexcept + : v(Packed) + {} + constexpr XMSHORT4(int16_t _x, int16_t _y, int16_t _z, int16_t _w) noexcept + : x(_x), + y(_y), + z(_z), + w(_w) + {} + explicit XMSHORT4(_In_reads_(4) const int16_t* pArray) noexcept + : x(pArray[0]), + y(pArray[1]), + z(pArray[2]), + w(pArray[3]) + {} XMSHORT4(float _x, float _y, float _z, float _w) noexcept; explicit XMSHORT4(_In_reads_(4) const float* pArray) noexcept; - XMSHORT4& operator= (uint64_t Packed) noexcept { v = Packed; return *this; } + XMSHORT4& operator=(uint64_t Packed) noexcept + { + v = Packed; + return *this; + } }; // 4D Vector; 16 bit unsigned normalized integer components @@ -577,19 +765,35 @@ namespace DirectX XMUSHORTN4() = default; - XMUSHORTN4(const XMUSHORTN4&) = default; + XMUSHORTN4(const XMUSHORTN4&) = default; XMUSHORTN4& operator=(const XMUSHORTN4&) = default; - XMUSHORTN4(XMUSHORTN4&&) = default; + XMUSHORTN4(XMUSHORTN4&&) = default; XMUSHORTN4& operator=(XMUSHORTN4&&) = default; - explicit constexpr XMUSHORTN4(uint64_t Packed) noexcept : v(Packed) {} - constexpr XMUSHORTN4(uint16_t _x, uint16_t _y, uint16_t _z, uint16_t _w) noexcept : x(_x), y(_y), z(_z), w(_w) {} - explicit XMUSHORTN4(_In_reads_(4) const uint16_t* pArray) noexcept : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} + explicit constexpr XMUSHORTN4(uint64_t Packed) noexcept + : v(Packed) + {} + constexpr XMUSHORTN4(uint16_t _x, uint16_t _y, uint16_t _z, uint16_t _w) noexcept + : x(_x), + y(_y), + z(_z), + w(_w) + {} + explicit XMUSHORTN4(_In_reads_(4) const uint16_t* pArray) noexcept + : x(pArray[0]), + y(pArray[1]), + z(pArray[2]), + w(pArray[3]) + {} XMUSHORTN4(float _x, float _y, float _z, float _w) noexcept; explicit XMUSHORTN4(_In_reads_(4) const float* pArray) noexcept; - XMUSHORTN4& operator= (uint64_t Packed) noexcept { v = Packed; return *this; } + XMUSHORTN4& operator=(uint64_t Packed) noexcept + { + v = Packed; + return *this; + } }; // 4D Vector; 16 bit unsigned integer components @@ -609,19 +813,35 @@ namespace DirectX XMUSHORT4() = default; - XMUSHORT4(const XMUSHORT4&) = default; + XMUSHORT4(const XMUSHORT4&) = default; XMUSHORT4& operator=(const XMUSHORT4&) = default; - XMUSHORT4(XMUSHORT4&&) = default; + XMUSHORT4(XMUSHORT4&&) = default; XMUSHORT4& operator=(XMUSHORT4&&) = default; - explicit constexpr XMUSHORT4(uint64_t Packed) noexcept : v(Packed) {} - constexpr XMUSHORT4(uint16_t _x, uint16_t _y, uint16_t _z, uint16_t _w) noexcept : x(_x), y(_y), z(_z), w(_w) {} - explicit XMUSHORT4(_In_reads_(4) const uint16_t* pArray) noexcept : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} + explicit constexpr XMUSHORT4(uint64_t Packed) noexcept + : v(Packed) + {} + constexpr XMUSHORT4(uint16_t _x, uint16_t _y, uint16_t _z, uint16_t _w) noexcept + : x(_x), + y(_y), + z(_z), + w(_w) + {} + explicit XMUSHORT4(_In_reads_(4) const uint16_t* pArray) noexcept + : x(pArray[0]), + y(pArray[1]), + z(pArray[2]), + w(pArray[3]) + {} XMUSHORT4(float _x, float _y, float _z, float _w) noexcept; explicit XMUSHORT4(_In_reads_(4) const float* pArray) noexcept; - XMUSHORT4& operator= (uint32_t Packed) noexcept { v = Packed; return *this; } + XMUSHORT4& operator=(uint32_t Packed) noexcept + { + v = Packed; + return *this; + } }; //------------------------------------------------------------------------------ @@ -637,29 +857,35 @@ namespace DirectX { struct { - int32_t x : 10; // -511/511 to 511/511 - int32_t y : 10; // -511/511 to 511/511 - int32_t z : 10; // -511/511 to 511/511 - uint32_t w : 2; // 0/3 to 3/3 + int32_t x : 10; // -511/511 to 511/511 + int32_t y : 10; // -511/511 to 511/511 + int32_t z : 10; // -511/511 to 511/511 + uint32_t w : 2; // 0/3 to 3/3 }; uint32_t v; }; XMXDECN4() = default; - XMXDECN4(const XMXDECN4&) = default; + XMXDECN4(const XMXDECN4&) = default; XMXDECN4& operator=(const XMXDECN4&) = default; - XMXDECN4(XMXDECN4&&) = default; + XMXDECN4(XMXDECN4&&) = default; XMXDECN4& operator=(XMXDECN4&&) = default; - explicit constexpr XMXDECN4(uint32_t Packed) : v(Packed) {} + explicit constexpr XMXDECN4(uint32_t Packed) + : v(Packed) + {} XMXDECN4(float _x, float _y, float _z, float _w) noexcept; explicit XMXDECN4(_In_reads_(4) const float* pArray) noexcept; - operator uint32_t () const noexcept { return v; } + operator uint32_t() const noexcept { return v; } - XMXDECN4& operator= (uint32_t Packed) noexcept { v = Packed; return *this; } + XMXDECN4& operator=(uint32_t Packed) noexcept + { + v = Packed; + return *this; + } }; // 4D Vector; 10-10-10-2 bit components packed into a 32 bit integer @@ -674,29 +900,35 @@ namespace DirectX { struct { - int32_t x : 10; // -511 to 511 - int32_t y : 10; // -511 to 511 - int32_t z : 10; // -511 to 511 - uint32_t w : 2; // 0 to 3 + int32_t x : 10; // -511 to 511 + int32_t y : 10; // -511 to 511 + int32_t z : 10; // -511 to 511 + uint32_t w : 2; // 0 to 3 }; uint32_t v; }; XMXDEC4() = default; - XMXDEC4(const XMXDEC4&) = default; + XMXDEC4(const XMXDEC4&) = default; XMXDEC4& operator=(const XMXDEC4&) = default; - XMXDEC4(XMXDEC4&&) = default; + XMXDEC4(XMXDEC4&&) = default; XMXDEC4& operator=(XMXDEC4&&) = default; - explicit constexpr XMXDEC4(uint32_t Packed) noexcept : v(Packed) {} + explicit constexpr XMXDEC4(uint32_t Packed) noexcept + : v(Packed) + {} XMXDEC4(float _x, float _y, float _z, float _w) noexcept; explicit XMXDEC4(_In_reads_(4) const float* pArray) noexcept; - operator uint32_t () const noexcept { return v; } + operator uint32_t() const noexcept { return v; } - XMXDEC4& operator= (uint32_t Packed) noexcept { v = Packed; return *this; } + XMXDEC4& operator=(uint32_t Packed) noexcept + { + v = Packed; + return *this; + } }; // 4D Vector; 10-10-10-2 bit normalized components packed into a 32 bit integer @@ -711,29 +943,35 @@ namespace DirectX { struct { - int32_t x : 10; // -511/511 to 511/511 - int32_t y : 10; // -511/511 to 511/511 - int32_t z : 10; // -511/511 to 511/511 - int32_t w : 2; // -1/1 to 1/1 + int32_t x : 10; // -511/511 to 511/511 + int32_t y : 10; // -511/511 to 511/511 + int32_t z : 10; // -511/511 to 511/511 + int32_t w : 2; // -1/1 to 1/1 }; uint32_t v; }; XMDECN4() = default; - XMDECN4(const XMDECN4&) = default; + XMDECN4(const XMDECN4&) = default; XMDECN4& operator=(const XMDECN4&) = default; - XMDECN4(XMDECN4&&) = default; + XMDECN4(XMDECN4&&) = default; XMDECN4& operator=(XMDECN4&&) = default; - explicit constexpr XMDECN4(uint32_t Packed) noexcept : v(Packed) {} + explicit constexpr XMDECN4(uint32_t Packed) noexcept + : v(Packed) + {} XMDECN4(float _x, float _y, float _z, float _w) noexcept; explicit XMDECN4(_In_reads_(4) const float* pArray) noexcept; - operator uint32_t () const noexcept { return v; } + operator uint32_t() const noexcept { return v; } - XMDECN4& operator= (uint32_t Packed) noexcept { v = Packed; return *this; } + XMDECN4& operator=(uint32_t Packed) noexcept + { + v = Packed; + return *this; + } }; // 4D Vector; 10-10-10-2 bit components packed into a 32 bit integer @@ -748,29 +986,35 @@ namespace DirectX { struct { - int32_t x : 10; // -511 to 511 - int32_t y : 10; // -511 to 511 - int32_t z : 10; // -511 to 511 - int32_t w : 2; // -1 to 1 + int32_t x : 10; // -511 to 511 + int32_t y : 10; // -511 to 511 + int32_t z : 10; // -511 to 511 + int32_t w : 2; // -1 to 1 }; uint32_t v; }; XMDEC4() = default; - XMDEC4(const XMDEC4&) = default; + XMDEC4(const XMDEC4&) = default; XMDEC4& operator=(const XMDEC4&) = default; - XMDEC4(XMDEC4&&) = default; + XMDEC4(XMDEC4&&) = default; XMDEC4& operator=(XMDEC4&&) = default; - explicit constexpr XMDEC4(uint32_t Packed) noexcept : v(Packed) {} + explicit constexpr XMDEC4(uint32_t Packed) noexcept + : v(Packed) + {} XMDEC4(float _x, float _y, float _z, float _w) noexcept; explicit XMDEC4(_In_reads_(4) const float* pArray) noexcept; - operator uint32_t () const noexcept { return v; } + operator uint32_t() const noexcept { return v; } - XMDEC4& operator= (uint32_t Packed) noexcept { v = Packed; return *this; } + XMDEC4& operator=(uint32_t Packed) noexcept + { + v = Packed; + return *this; + } }; // 4D Vector; 10-10-10-2 bit normalized components packed into a 32 bit integer @@ -785,29 +1029,35 @@ namespace DirectX { struct { - uint32_t x : 10; // 0/1023 to 1023/1023 - uint32_t y : 10; // 0/1023 to 1023/1023 - uint32_t z : 10; // 0/1023 to 1023/1023 - uint32_t w : 2; // 0/3 to 3/3 + uint32_t x : 10; // 0/1023 to 1023/1023 + uint32_t y : 10; // 0/1023 to 1023/1023 + uint32_t z : 10; // 0/1023 to 1023/1023 + uint32_t w : 2; // 0/3 to 3/3 }; uint32_t v; }; XMUDECN4() = default; - XMUDECN4(const XMUDECN4&) = default; + XMUDECN4(const XMUDECN4&) = default; XMUDECN4& operator=(const XMUDECN4&) = default; - XMUDECN4(XMUDECN4&&) = default; + XMUDECN4(XMUDECN4&&) = default; XMUDECN4& operator=(XMUDECN4&&) = default; - explicit constexpr XMUDECN4(uint32_t Packed) noexcept : v(Packed) {} + explicit constexpr XMUDECN4(uint32_t Packed) noexcept + : v(Packed) + {} XMUDECN4(float _x, float _y, float _z, float _w) noexcept; explicit XMUDECN4(_In_reads_(4) const float* pArray) noexcept; - operator uint32_t () const noexcept { return v; } + operator uint32_t() const noexcept { return v; } - XMUDECN4& operator= (uint32_t Packed) noexcept { v = Packed; return *this; } + XMUDECN4& operator=(uint32_t Packed) noexcept + { + v = Packed; + return *this; + } }; // 4D Vector; 10-10-10-2 bit components packed into a 32 bit integer @@ -822,29 +1072,35 @@ namespace DirectX { struct { - uint32_t x : 10; // 0 to 1023 - uint32_t y : 10; // 0 to 1023 - uint32_t z : 10; // 0 to 1023 - uint32_t w : 2; // 0 to 3 + uint32_t x : 10; // 0 to 1023 + uint32_t y : 10; // 0 to 1023 + uint32_t z : 10; // 0 to 1023 + uint32_t w : 2; // 0 to 3 }; uint32_t v; }; XMUDEC4() = default; - XMUDEC4(const XMUDEC4&) = default; + XMUDEC4(const XMUDEC4&) = default; XMUDEC4& operator=(const XMUDEC4&) = default; - XMUDEC4(XMUDEC4&&) = default; + XMUDEC4(XMUDEC4&&) = default; XMUDEC4& operator=(XMUDEC4&&) = default; - explicit constexpr XMUDEC4(uint32_t Packed) noexcept : v(Packed) {} + explicit constexpr XMUDEC4(uint32_t Packed) noexcept + : v(Packed) + {} XMUDEC4(float _x, float _y, float _z, float _w) noexcept; explicit XMUDEC4(_In_reads_(4) const float* pArray) noexcept; - operator uint32_t () const noexcept { return v; } + operator uint32_t() const noexcept { return v; } - XMUDEC4& operator= (uint32_t Packed) noexcept { v = Packed; return *this; } + XMUDEC4& operator=(uint32_t Packed) noexcept + { + v = Packed; + return *this; + } }; //------------------------------------------------------------------------------ @@ -865,19 +1121,35 @@ namespace DirectX XMBYTEN4() = default; - XMBYTEN4(const XMBYTEN4&) = default; + XMBYTEN4(const XMBYTEN4&) = default; XMBYTEN4& operator=(const XMBYTEN4&) = default; - XMBYTEN4(XMBYTEN4&&) = default; + XMBYTEN4(XMBYTEN4&&) = default; XMBYTEN4& operator=(XMBYTEN4&&) = default; - constexpr XMBYTEN4(int8_t _x, int8_t _y, int8_t _z, int8_t _w) noexcept : x(_x), y(_y), z(_z), w(_w) {} - explicit constexpr XMBYTEN4(uint32_t Packed) noexcept : v(Packed) {} - explicit XMBYTEN4(_In_reads_(4) const int8_t* pArray) noexcept : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} + constexpr XMBYTEN4(int8_t _x, int8_t _y, int8_t _z, int8_t _w) noexcept + : x(_x), + y(_y), + z(_z), + w(_w) + {} + explicit constexpr XMBYTEN4(uint32_t Packed) noexcept + : v(Packed) + {} + explicit XMBYTEN4(_In_reads_(4) const int8_t* pArray) noexcept + : x(pArray[0]), + y(pArray[1]), + z(pArray[2]), + w(pArray[3]) + {} XMBYTEN4(float _x, float _y, float _z, float _w) noexcept; explicit XMBYTEN4(_In_reads_(4) const float* pArray) noexcept; - XMBYTEN4& operator= (uint32_t Packed) noexcept { v = Packed; return *this; } + XMBYTEN4& operator=(uint32_t Packed) noexcept + { + v = Packed; + return *this; + } }; // 4D Vector; 8 bit signed integer components @@ -897,19 +1169,35 @@ namespace DirectX XMBYTE4() = default; - XMBYTE4(const XMBYTE4&) = default; + XMBYTE4(const XMBYTE4&) = default; XMBYTE4& operator=(const XMBYTE4&) = default; - XMBYTE4(XMBYTE4&&) = default; + XMBYTE4(XMBYTE4&&) = default; XMBYTE4& operator=(XMBYTE4&&) = default; - constexpr XMBYTE4(int8_t _x, int8_t _y, int8_t _z, int8_t _w) noexcept : x(_x), y(_y), z(_z), w(_w) {} - explicit constexpr XMBYTE4(uint32_t Packed) noexcept : v(Packed) {} - explicit XMBYTE4(_In_reads_(4) const int8_t* pArray) noexcept : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} + constexpr XMBYTE4(int8_t _x, int8_t _y, int8_t _z, int8_t _w) noexcept + : x(_x), + y(_y), + z(_z), + w(_w) + {} + explicit constexpr XMBYTE4(uint32_t Packed) noexcept + : v(Packed) + {} + explicit XMBYTE4(_In_reads_(4) const int8_t* pArray) noexcept + : x(pArray[0]), + y(pArray[1]), + z(pArray[2]), + w(pArray[3]) + {} XMBYTE4(float _x, float _y, float _z, float _w) noexcept; explicit XMBYTE4(_In_reads_(4) const float* pArray) noexcept; - XMBYTE4& operator= (uint32_t Packed) noexcept { v = Packed; return *this; } + XMBYTE4& operator=(uint32_t Packed) noexcept + { + v = Packed; + return *this; + } }; // 4D Vector; 8 bit unsigned normalized integer components @@ -929,19 +1217,35 @@ namespace DirectX XMUBYTEN4() = default; - XMUBYTEN4(const XMUBYTEN4&) = default; + XMUBYTEN4(const XMUBYTEN4&) = default; XMUBYTEN4& operator=(const XMUBYTEN4&) = default; - XMUBYTEN4(XMUBYTEN4&&) = default; + XMUBYTEN4(XMUBYTEN4&&) = default; XMUBYTEN4& operator=(XMUBYTEN4&&) = default; - constexpr XMUBYTEN4(uint8_t _x, uint8_t _y, uint8_t _z, uint8_t _w) noexcept : x(_x), y(_y), z(_z), w(_w) {} - explicit constexpr XMUBYTEN4(uint32_t Packed) noexcept : v(Packed) {} - explicit XMUBYTEN4(_In_reads_(4) const uint8_t* pArray) noexcept : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} + constexpr XMUBYTEN4(uint8_t _x, uint8_t _y, uint8_t _z, uint8_t _w) noexcept + : x(_x), + y(_y), + z(_z), + w(_w) + {} + explicit constexpr XMUBYTEN4(uint32_t Packed) noexcept + : v(Packed) + {} + explicit XMUBYTEN4(_In_reads_(4) const uint8_t* pArray) noexcept + : x(pArray[0]), + y(pArray[1]), + z(pArray[2]), + w(pArray[3]) + {} XMUBYTEN4(float _x, float _y, float _z, float _w) noexcept; explicit XMUBYTEN4(_In_reads_(4) const float* pArray) noexcept; - XMUBYTEN4& operator= (uint32_t Packed) noexcept { v = Packed; return *this; } + XMUBYTEN4& operator=(uint32_t Packed) noexcept + { + v = Packed; + return *this; + } }; // 4D Vector; 8 bit unsigned integer components @@ -961,19 +1265,35 @@ namespace DirectX XMUBYTE4() = default; - XMUBYTE4(const XMUBYTE4&) = default; + XMUBYTE4(const XMUBYTE4&) = default; XMUBYTE4& operator=(const XMUBYTE4&) = default; - XMUBYTE4(XMUBYTE4&&) = default; + XMUBYTE4(XMUBYTE4&&) = default; XMUBYTE4& operator=(XMUBYTE4&&) = default; - constexpr XMUBYTE4(uint8_t _x, uint8_t _y, uint8_t _z, uint8_t _w) noexcept : x(_x), y(_y), z(_z), w(_w) {} - explicit constexpr XMUBYTE4(uint32_t Packed) noexcept : v(Packed) {} - explicit XMUBYTE4(_In_reads_(4) const uint8_t* pArray) noexcept : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} + constexpr XMUBYTE4(uint8_t _x, uint8_t _y, uint8_t _z, uint8_t _w) noexcept + : x(_x), + y(_y), + z(_z), + w(_w) + {} + explicit constexpr XMUBYTE4(uint32_t Packed) noexcept + : v(Packed) + {} + explicit XMUBYTE4(_In_reads_(4) const uint8_t* pArray) noexcept + : x(pArray[0]), + y(pArray[1]), + z(pArray[2]), + w(pArray[3]) + {} XMUBYTE4(float _x, float _y, float _z, float _w) noexcept; explicit XMUBYTE4(_In_reads_(4) const float* pArray) noexcept; - XMUBYTE4& operator= (uint32_t Packed) noexcept { v = Packed; return *this; } + XMUBYTE4& operator=(uint32_t Packed) noexcept + { + v = Packed; + return *this; + } }; //------------------------------------------------------------------------------ @@ -984,31 +1304,47 @@ namespace DirectX { struct { - uint16_t x : 4; // 0 to 15 - uint16_t y : 4; // 0 to 15 - uint16_t z : 4; // 0 to 15 - uint16_t w : 4; // 0 to 15 + uint16_t x : 4; // 0 to 15 + uint16_t y : 4; // 0 to 15 + uint16_t z : 4; // 0 to 15 + uint16_t w : 4; // 0 to 15 }; uint16_t v; }; XMUNIBBLE4() = default; - XMUNIBBLE4(const XMUNIBBLE4&) = default; + XMUNIBBLE4(const XMUNIBBLE4&) = default; XMUNIBBLE4& operator=(const XMUNIBBLE4&) = default; - XMUNIBBLE4(XMUNIBBLE4&&) = default; + XMUNIBBLE4(XMUNIBBLE4&&) = default; XMUNIBBLE4& operator=(XMUNIBBLE4&&) = default; - explicit constexpr XMUNIBBLE4(uint16_t Packed) noexcept : v(Packed) {} - constexpr XMUNIBBLE4(uint8_t _x, uint8_t _y, uint8_t _z, uint8_t _w) noexcept : x(_x), y(_y), z(_z), w(_w) {} - explicit XMUNIBBLE4(_In_reads_(4) const uint8_t* pArray) noexcept : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} + explicit constexpr XMUNIBBLE4(uint16_t Packed) noexcept + : v(Packed) + {} + constexpr XMUNIBBLE4(uint8_t _x, uint8_t _y, uint8_t _z, uint8_t _w) noexcept + : x(_x), + y(_y), + z(_z), + w(_w) + {} + explicit XMUNIBBLE4(_In_reads_(4) const uint8_t* pArray) noexcept + : x(pArray[0]), + y(pArray[1]), + z(pArray[2]), + w(pArray[3]) + {} XMUNIBBLE4(float _x, float _y, float _z, float _w) noexcept; explicit XMUNIBBLE4(_In_reads_(4) const float* pArray) noexcept; - operator uint16_t () const noexcept { return v; } + operator uint16_t() const noexcept { return v; } - XMUNIBBLE4& operator= (uint16_t Packed) noexcept { v = Packed; return *this; } + XMUNIBBLE4& operator=(uint16_t Packed) noexcept + { + v = Packed; + return *this; + } }; //------------------------------------------------------------------------------ @@ -1019,56 +1355,74 @@ namespace DirectX { struct { - uint16_t x : 5; // 0 to 31 - uint16_t y : 5; // 0 to 31 - uint16_t z : 5; // 0 to 31 - uint16_t w : 1; // 0 or 1 + uint16_t x : 5; // 0 to 31 + uint16_t y : 5; // 0 to 31 + uint16_t z : 5; // 0 to 31 + uint16_t w : 1; // 0 or 1 }; uint16_t v; }; XMU555() = default; - XMU555(const XMU555&) = default; + XMU555(const XMU555&) = default; XMU555& operator=(const XMU555&) = default; - XMU555(XMU555&&) = default; + XMU555(XMU555&&) = default; XMU555& operator=(XMU555&&) = default; - explicit constexpr XMU555(uint16_t Packed) noexcept : v(Packed) {} - constexpr XMU555(uint8_t _x, uint8_t _y, uint8_t _z, bool _w) noexcept : x(_x), y(_y), z(_z), w(_w ? 0x1 : 0) {} - XMU555(_In_reads_(3) const uint8_t* pArray, _In_ bool _w) noexcept : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(_w ? 0x1 : 0) {} + explicit constexpr XMU555(uint16_t Packed) noexcept + : v(Packed) + {} + constexpr XMU555(uint8_t _x, uint8_t _y, uint8_t _z, bool _w) noexcept + : x(_x), + y(_y), + z(_z), + w(_w ? 0x1 : 0) + {} + XMU555(_In_reads_(3) const uint8_t* pArray, _In_ bool _w) noexcept + : x(pArray[0]), + y(pArray[1]), + z(pArray[2]), + w(_w ? 0x1 : 0) + {} XMU555(float _x, float _y, float _z, bool _w) noexcept; XMU555(_In_reads_(3) const float* pArray, _In_ bool _w) noexcept; - operator uint16_t () const noexcept { return v; } + operator uint16_t() const noexcept { return v; } - XMU555& operator= (uint16_t Packed) noexcept { v = Packed; return *this; } + XMU555& operator=(uint16_t Packed) noexcept + { + v = Packed; + return *this; + } }; - #ifdef __clang__ - #pragma clang diagnostic pop - #endif - #ifdef _MSC_VER - #pragma warning(pop) - #endif +#ifdef __clang__ +#pragma clang diagnostic pop +#endif +#ifdef _MSC_VER +#pragma warning(pop) +#endif - /**************************************************************************** - * - * Data conversion operations - * - ****************************************************************************/ + /**************************************************************************** + * + * Data conversion operations + * + ****************************************************************************/ - float XMConvertHalfToFloat(HALF Value) noexcept; + float XMConvertHalfToFloat(HALF Value) noexcept; float* XMConvertHalfToFloatStream(_Out_writes_bytes_(sizeof(float) + OutputStride * (HalfCount - 1)) float* pOutputStream, - _In_ size_t OutputStride, - _In_reads_bytes_(sizeof(HALF) + InputStride * (HalfCount - 1)) const HALF* pInputStream, - _In_ size_t InputStride, _In_ size_t HalfCount) noexcept; - HALF XMConvertFloatToHalf(float Value) noexcept; - HALF* XMConvertFloatToHalfStream(_Out_writes_bytes_(sizeof(HALF) + OutputStride * (FloatCount - 1)) HALF* pOutputStream, - _In_ size_t OutputStride, - _In_reads_bytes_(sizeof(float) + InputStride * (FloatCount - 1)) const float* pInputStream, - _In_ size_t InputStride, _In_ size_t FloatCount) noexcept; + _In_ size_t OutputStride, + _In_reads_bytes_(sizeof(HALF) + InputStride * (HalfCount - 1)) const HALF* pInputStream, + _In_ size_t InputStride, + _In_ size_t HalfCount) noexcept; + HALF XMConvertFloatToHalf(float Value) noexcept; + HALF* XMConvertFloatToHalfStream(_Out_writes_bytes_(sizeof(HALF) + OutputStride * (FloatCount - 1)) HALF* pOutputStream, + _In_ size_t OutputStride, + _In_reads_bytes_(sizeof(float) + InputStride * (FloatCount - 1)) const float* pInputStream, + _In_ size_t InputStride, + _In_ size_t FloatCount) noexcept; /**************************************************************************** * @@ -1076,184 +1430,183 @@ namespace DirectX * ****************************************************************************/ - XMVECTOR XM_CALLCONV XMLoadColor(_In_ const XMCOLOR* pSource) noexcept; - - XMVECTOR XM_CALLCONV XMLoadHalf2(_In_ const XMHALF2* pSource) noexcept; - XMVECTOR XM_CALLCONV XMLoadShortN2(_In_ const XMSHORTN2* pSource) noexcept; - XMVECTOR XM_CALLCONV XMLoadShort2(_In_ const XMSHORT2* pSource) noexcept; - XMVECTOR XM_CALLCONV XMLoadUShortN2(_In_ const XMUSHORTN2* pSource) noexcept; - XMVECTOR XM_CALLCONV XMLoadUShort2(_In_ const XMUSHORT2* pSource) noexcept; - XMVECTOR XM_CALLCONV XMLoadByteN2(_In_ const XMBYTEN2* pSource) noexcept; - XMVECTOR XM_CALLCONV XMLoadByte2(_In_ const XMBYTE2* pSource) noexcept; - XMVECTOR XM_CALLCONV XMLoadUByteN2(_In_ const XMUBYTEN2* pSource) noexcept; - XMVECTOR XM_CALLCONV XMLoadUByte2(_In_ const XMUBYTE2* pSource) noexcept; - - XMVECTOR XM_CALLCONV XMLoadU565(_In_ const XMU565* pSource) noexcept; - XMVECTOR XM_CALLCONV XMLoadFloat3PK(_In_ const XMFLOAT3PK* pSource) noexcept; - XMVECTOR XM_CALLCONV XMLoadFloat3SE(_In_ const XMFLOAT3SE* pSource) noexcept; - - XMVECTOR XM_CALLCONV XMLoadHalf4(_In_ const XMHALF4* pSource) noexcept; - XMVECTOR XM_CALLCONV XMLoadShortN4(_In_ const XMSHORTN4* pSource) noexcept; - XMVECTOR XM_CALLCONV XMLoadShort4(_In_ const XMSHORT4* pSource) noexcept; - XMVECTOR XM_CALLCONV XMLoadUShortN4(_In_ const XMUSHORTN4* pSource) noexcept; - XMVECTOR XM_CALLCONV XMLoadUShort4(_In_ const XMUSHORT4* pSource) noexcept; - XMVECTOR XM_CALLCONV XMLoadXDecN4(_In_ const XMXDECN4* pSource) noexcept; - XMVECTOR XM_CALLCONV XMLoadUDecN4(_In_ const XMUDECN4* pSource) noexcept; - XMVECTOR XM_CALLCONV XMLoadUDecN4_XR(_In_ const XMUDECN4* pSource) noexcept; - XMVECTOR XM_CALLCONV XMLoadUDec4(_In_ const XMUDEC4* pSource) noexcept; - XMVECTOR XM_CALLCONV XMLoadByteN4(_In_ const XMBYTEN4* pSource) noexcept; - XMVECTOR XM_CALLCONV XMLoadByte4(_In_ const XMBYTE4* pSource) noexcept; - XMVECTOR XM_CALLCONV XMLoadUByteN4(_In_ const XMUBYTEN4* pSource) noexcept; - XMVECTOR XM_CALLCONV XMLoadUByte4(_In_ const XMUBYTE4* pSource) noexcept; - XMVECTOR XM_CALLCONV XMLoadUNibble4(_In_ const XMUNIBBLE4* pSource) noexcept; - XMVECTOR XM_CALLCONV XMLoadU555(_In_ const XMU555* pSource) noexcept; - - #ifdef _MSC_VER - #pragma warning(push) - #pragma warning(disable : 4996) - // C4996: ignore deprecation warning - #endif - - #ifdef __clang__ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wdeprecated-declarations" - #endif - - #ifdef __GNUC__ - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wdeprecated-declarations" - #endif + XMVECTOR XM_CALLCONV XMLoadColor(_In_ const XMCOLOR* pSource) noexcept; + + XMVECTOR XM_CALLCONV XMLoadHalf2(_In_ const XMHALF2* pSource) noexcept; + XMVECTOR XM_CALLCONV XMLoadShortN2(_In_ const XMSHORTN2* pSource) noexcept; + XMVECTOR XM_CALLCONV XMLoadShort2(_In_ const XMSHORT2* pSource) noexcept; + XMVECTOR XM_CALLCONV XMLoadUShortN2(_In_ const XMUSHORTN2* pSource) noexcept; + XMVECTOR XM_CALLCONV XMLoadUShort2(_In_ const XMUSHORT2* pSource) noexcept; + XMVECTOR XM_CALLCONV XMLoadByteN2(_In_ const XMBYTEN2* pSource) noexcept; + XMVECTOR XM_CALLCONV XMLoadByte2(_In_ const XMBYTE2* pSource) noexcept; + XMVECTOR XM_CALLCONV XMLoadUByteN2(_In_ const XMUBYTEN2* pSource) noexcept; + XMVECTOR XM_CALLCONV XMLoadUByte2(_In_ const XMUBYTE2* pSource) noexcept; + + XMVECTOR XM_CALLCONV XMLoadU565(_In_ const XMU565* pSource) noexcept; + XMVECTOR XM_CALLCONV XMLoadFloat3PK(_In_ const XMFLOAT3PK* pSource) noexcept; + XMVECTOR XM_CALLCONV XMLoadFloat3SE(_In_ const XMFLOAT3SE* pSource) noexcept; + + XMVECTOR XM_CALLCONV XMLoadHalf4(_In_ const XMHALF4* pSource) noexcept; + XMVECTOR XM_CALLCONV XMLoadShortN4(_In_ const XMSHORTN4* pSource) noexcept; + XMVECTOR XM_CALLCONV XMLoadShort4(_In_ const XMSHORT4* pSource) noexcept; + XMVECTOR XM_CALLCONV XMLoadUShortN4(_In_ const XMUSHORTN4* pSource) noexcept; + XMVECTOR XM_CALLCONV XMLoadUShort4(_In_ const XMUSHORT4* pSource) noexcept; + XMVECTOR XM_CALLCONV XMLoadXDecN4(_In_ const XMXDECN4* pSource) noexcept; + XMVECTOR XM_CALLCONV XMLoadUDecN4(_In_ const XMUDECN4* pSource) noexcept; + XMVECTOR XM_CALLCONV XMLoadUDecN4_XR(_In_ const XMUDECN4* pSource) noexcept; + XMVECTOR XM_CALLCONV XMLoadUDec4(_In_ const XMUDEC4* pSource) noexcept; + XMVECTOR XM_CALLCONV XMLoadByteN4(_In_ const XMBYTEN4* pSource) noexcept; + XMVECTOR XM_CALLCONV XMLoadByte4(_In_ const XMBYTE4* pSource) noexcept; + XMVECTOR XM_CALLCONV XMLoadUByteN4(_In_ const XMUBYTEN4* pSource) noexcept; + XMVECTOR XM_CALLCONV XMLoadUByte4(_In_ const XMUBYTE4* pSource) noexcept; + XMVECTOR XM_CALLCONV XMLoadUNibble4(_In_ const XMUNIBBLE4* pSource) noexcept; + XMVECTOR XM_CALLCONV XMLoadU555(_In_ const XMU555* pSource) noexcept; + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4996) + // C4996: ignore deprecation warning +#endif + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#endif + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif XM_DEPRECATED - XMVECTOR XM_CALLCONV XMLoadDecN4(_In_ const XMDECN4* pSource) noexcept; + XMVECTOR XM_CALLCONV XMLoadDecN4(_In_ const XMDECN4* pSource) noexcept; XM_DEPRECATED - XMVECTOR XM_CALLCONV XMLoadDec4(_In_ const XMDEC4* pSource) noexcept; + XMVECTOR XM_CALLCONV XMLoadDec4(_In_ const XMDEC4* pSource) noexcept; XM_DEPRECATED - XMVECTOR XM_CALLCONV XMLoadXDec4(_In_ const XMXDEC4* pSource) noexcept; - - #ifdef __GNUC__ - #pragma GCC diagnostic pop - #endif - #ifdef __clang__ - #pragma clang diagnostic pop - #endif - #ifdef _MSC_VER - #pragma warning(pop) - #endif - - /**************************************************************************** - * - * Store operations - * - ****************************************************************************/ - - void XM_CALLCONV XMStoreColor(_Out_ XMCOLOR* pDestination, _In_ FXMVECTOR V) noexcept; - - void XM_CALLCONV XMStoreHalf2(_Out_ XMHALF2* pDestination, _In_ FXMVECTOR V) noexcept; - void XM_CALLCONV XMStoreShortN2(_Out_ XMSHORTN2* pDestination, _In_ FXMVECTOR V) noexcept; - void XM_CALLCONV XMStoreShort2(_Out_ XMSHORT2* pDestination, _In_ FXMVECTOR V) noexcept; - void XM_CALLCONV XMStoreUShortN2(_Out_ XMUSHORTN2* pDestination, _In_ FXMVECTOR V) noexcept; - void XM_CALLCONV XMStoreUShort2(_Out_ XMUSHORT2* pDestination, _In_ FXMVECTOR V) noexcept; - void XM_CALLCONV XMStoreByteN2(_Out_ XMBYTEN2* pDestination, _In_ FXMVECTOR V) noexcept; - void XM_CALLCONV XMStoreByte2(_Out_ XMBYTE2* pDestination, _In_ FXMVECTOR V) noexcept; - void XM_CALLCONV XMStoreUByteN2(_Out_ XMUBYTEN2* pDestination, _In_ FXMVECTOR V) noexcept; - void XM_CALLCONV XMStoreUByte2(_Out_ XMUBYTE2* pDestination, _In_ FXMVECTOR V) noexcept; - - void XM_CALLCONV XMStoreU565(_Out_ XMU565* pDestination, _In_ FXMVECTOR V) noexcept; - void XM_CALLCONV XMStoreFloat3PK(_Out_ XMFLOAT3PK* pDestination, _In_ FXMVECTOR V) noexcept; - void XM_CALLCONV XMStoreFloat3SE(_Out_ XMFLOAT3SE* pDestination, _In_ FXMVECTOR V) noexcept; - - void XM_CALLCONV XMStoreHalf4(_Out_ XMHALF4* pDestination, _In_ FXMVECTOR V) noexcept; - void XM_CALLCONV XMStoreShortN4(_Out_ XMSHORTN4* pDestination, _In_ FXMVECTOR V) noexcept; - void XM_CALLCONV XMStoreShort4(_Out_ XMSHORT4* pDestination, _In_ FXMVECTOR V) noexcept; - void XM_CALLCONV XMStoreUShortN4(_Out_ XMUSHORTN4* pDestination, _In_ FXMVECTOR V) noexcept; - void XM_CALLCONV XMStoreUShort4(_Out_ XMUSHORT4* pDestination, _In_ FXMVECTOR V) noexcept; - void XM_CALLCONV XMStoreXDecN4(_Out_ XMXDECN4* pDestination, _In_ FXMVECTOR V) noexcept; - void XM_CALLCONV XMStoreUDecN4(_Out_ XMUDECN4* pDestination, _In_ FXMVECTOR V) noexcept; - void XM_CALLCONV XMStoreUDecN4_XR(_Out_ XMUDECN4* pDestination, _In_ FXMVECTOR V) noexcept; - void XM_CALLCONV XMStoreUDec4(_Out_ XMUDEC4* pDestination, _In_ FXMVECTOR V) noexcept; - void XM_CALLCONV XMStoreByteN4(_Out_ XMBYTEN4* pDestination, _In_ FXMVECTOR V) noexcept; - void XM_CALLCONV XMStoreByte4(_Out_ XMBYTE4* pDestination, _In_ FXMVECTOR V) noexcept; - void XM_CALLCONV XMStoreUByteN4(_Out_ XMUBYTEN4* pDestination, _In_ FXMVECTOR V) noexcept; - void XM_CALLCONV XMStoreUByte4(_Out_ XMUBYTE4* pDestination, _In_ FXMVECTOR V) noexcept; - void XM_CALLCONV XMStoreUNibble4(_Out_ XMUNIBBLE4* pDestination, _In_ FXMVECTOR V) noexcept; - void XM_CALLCONV XMStoreU555(_Out_ XMU555* pDestination, _In_ FXMVECTOR V) noexcept; - - #ifdef _MSC_VER - #pragma warning(push) - #pragma warning(disable : 4996) - // C4996: ignore deprecation warning - #endif - - #ifdef __clang__ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wdeprecated-declarations" - #endif - - #ifdef __GNUC__ - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wdeprecated-declarations" - #endif + XMVECTOR XM_CALLCONV XMLoadXDec4(_In_ const XMXDEC4* pSource) noexcept; + +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif +#ifdef __clang__ +#pragma clang diagnostic pop +#endif +#ifdef _MSC_VER +#pragma warning(pop) +#endif + + /**************************************************************************** + * + * Store operations + * + ****************************************************************************/ + + void XM_CALLCONV XMStoreColor(_Out_ XMCOLOR* pDestination, _In_ FXMVECTOR V) noexcept; + + void XM_CALLCONV XMStoreHalf2(_Out_ XMHALF2* pDestination, _In_ FXMVECTOR V) noexcept; + void XM_CALLCONV XMStoreShortN2(_Out_ XMSHORTN2* pDestination, _In_ FXMVECTOR V) noexcept; + void XM_CALLCONV XMStoreShort2(_Out_ XMSHORT2* pDestination, _In_ FXMVECTOR V) noexcept; + void XM_CALLCONV XMStoreUShortN2(_Out_ XMUSHORTN2* pDestination, _In_ FXMVECTOR V) noexcept; + void XM_CALLCONV XMStoreUShort2(_Out_ XMUSHORT2* pDestination, _In_ FXMVECTOR V) noexcept; + void XM_CALLCONV XMStoreByteN2(_Out_ XMBYTEN2* pDestination, _In_ FXMVECTOR V) noexcept; + void XM_CALLCONV XMStoreByte2(_Out_ XMBYTE2* pDestination, _In_ FXMVECTOR V) noexcept; + void XM_CALLCONV XMStoreUByteN2(_Out_ XMUBYTEN2* pDestination, _In_ FXMVECTOR V) noexcept; + void XM_CALLCONV XMStoreUByte2(_Out_ XMUBYTE2* pDestination, _In_ FXMVECTOR V) noexcept; + + void XM_CALLCONV XMStoreU565(_Out_ XMU565* pDestination, _In_ FXMVECTOR V) noexcept; + void XM_CALLCONV XMStoreFloat3PK(_Out_ XMFLOAT3PK* pDestination, _In_ FXMVECTOR V) noexcept; + void XM_CALLCONV XMStoreFloat3SE(_Out_ XMFLOAT3SE* pDestination, _In_ FXMVECTOR V) noexcept; + + void XM_CALLCONV XMStoreHalf4(_Out_ XMHALF4* pDestination, _In_ FXMVECTOR V) noexcept; + void XM_CALLCONV XMStoreShortN4(_Out_ XMSHORTN4* pDestination, _In_ FXMVECTOR V) noexcept; + void XM_CALLCONV XMStoreShort4(_Out_ XMSHORT4* pDestination, _In_ FXMVECTOR V) noexcept; + void XM_CALLCONV XMStoreUShortN4(_Out_ XMUSHORTN4* pDestination, _In_ FXMVECTOR V) noexcept; + void XM_CALLCONV XMStoreUShort4(_Out_ XMUSHORT4* pDestination, _In_ FXMVECTOR V) noexcept; + void XM_CALLCONV XMStoreXDecN4(_Out_ XMXDECN4* pDestination, _In_ FXMVECTOR V) noexcept; + void XM_CALLCONV XMStoreUDecN4(_Out_ XMUDECN4* pDestination, _In_ FXMVECTOR V) noexcept; + void XM_CALLCONV XMStoreUDecN4_XR(_Out_ XMUDECN4* pDestination, _In_ FXMVECTOR V) noexcept; + void XM_CALLCONV XMStoreUDec4(_Out_ XMUDEC4* pDestination, _In_ FXMVECTOR V) noexcept; + void XM_CALLCONV XMStoreByteN4(_Out_ XMBYTEN4* pDestination, _In_ FXMVECTOR V) noexcept; + void XM_CALLCONV XMStoreByte4(_Out_ XMBYTE4* pDestination, _In_ FXMVECTOR V) noexcept; + void XM_CALLCONV XMStoreUByteN4(_Out_ XMUBYTEN4* pDestination, _In_ FXMVECTOR V) noexcept; + void XM_CALLCONV XMStoreUByte4(_Out_ XMUBYTE4* pDestination, _In_ FXMVECTOR V) noexcept; + void XM_CALLCONV XMStoreUNibble4(_Out_ XMUNIBBLE4* pDestination, _In_ FXMVECTOR V) noexcept; + void XM_CALLCONV XMStoreU555(_Out_ XMU555* pDestination, _In_ FXMVECTOR V) noexcept; + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4996) + // C4996: ignore deprecation warning +#endif + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#endif + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif XM_DEPRECATED - void XM_CALLCONV XMStoreDecN4(_Out_ XMDECN4* pDestination, _In_ FXMVECTOR V) noexcept; + void XM_CALLCONV XMStoreDecN4(_Out_ XMDECN4* pDestination, _In_ FXMVECTOR V) noexcept; XM_DEPRECATED - void XM_CALLCONV XMStoreDec4(_Out_ XMDEC4* pDestination, _In_ FXMVECTOR V) noexcept; + void XM_CALLCONV XMStoreDec4(_Out_ XMDEC4* pDestination, _In_ FXMVECTOR V) noexcept; XM_DEPRECATED - void XM_CALLCONV XMStoreXDec4(_Out_ XMXDEC4* pDestination, _In_ FXMVECTOR V) noexcept; - - #ifdef __GNUC__ - #pragma GCC diagnostic pop - #endif - #ifdef __clang__ - #pragma clang diagnostic pop - #endif - #ifdef _MSC_VER - #pragma warning(pop) - #endif - - /**************************************************************************** - * - * Implementation - * - ****************************************************************************/ - #ifdef _MSC_VER - #pragma warning(push) - #pragma warning(disable:4068 4214 4204 4365 4616 6001 6101) - // C4068/4616: ignore unknown pragmas - // C4214/4204: nonstandard extension used - // C4365: 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 "-Wunknown-warning-option" - #pragma clang diagnostic ignored "-Wunsafe-buffer-usage" - #endif - - #include "DirectXPackedVector.inl" - - #ifdef __clang__ - #pragma clang diagnostic pop - #endif - #ifdef _PREFAST_ - #pragma prefast(pop) - #endif - #ifdef _MSC_VER - #pragma warning(pop) - #endif + void XM_CALLCONV XMStoreXDec4(_Out_ XMXDEC4* pDestination, _In_ FXMVECTOR V) noexcept; + +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif +#ifdef __clang__ +#pragma clang diagnostic pop +#endif +#ifdef _MSC_VER +#pragma warning(pop) +#endif + + /**************************************************************************** + * + * Implementation + * + ****************************************************************************/ +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4068 4214 4204 4365 4616 6001 6101) + // C4068/4616: ignore unknown pragmas + // C4214/4204: nonstandard extension used + // C4365: 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 "-Wunknown-warning-option" +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" +#endif + +#include "DirectXPackedVector.inl" + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif +#ifdef _PREFAST_ +#pragma prefast(pop) +#endif +#ifdef _MSC_VER +#pragma warning(pop) +#endif } // namespace PackedVector } // namespace DirectX - diff --git a/Inc/DirectXPackedVector.inl b/Inc/DirectXPackedVector.inl index be99cecc..4771649b 100644 --- a/Inc/DirectXPackedVector.inl +++ b/Inc/DirectXPackedVector.inl @@ -21,10 +21,11 @@ inline float XMConvertHalfToFloat(HALF Value) noexcept { #if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) __m128i V1 = _mm_cvtsi32_si128(static_cast(Value)); - __m128 V2 = _mm_cvtph_ps(V1); + __m128 V2 = _mm_cvtph_ps(V1); return _mm_cvtss_f32(V2); -#elif defined(_XM_ARM_NEON_INTRINSICS_) && (defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__) && !defined(_XM_NO_INTRINSICS_) && (!defined(__GNUC__) || (__ARM_FP & 2)) - uint16x4_t vHalf = vdup_n_u16(Value); +#elif defined(_XM_ARM_NEON_INTRINSICS_) && (defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__) \ + && !defined(_XM_NO_INTRINSICS_) && (!defined(__GNUC__) || (__ARM_FP & 2)) + uint16x4_t vHalf = vdup_n_u16(Value); float32x4_t vFloat = vcvt_f32_f16(vreinterpret_f16_u16(vHalf)); return vgetq_lane_f32(vFloat, 0); #else @@ -35,11 +36,11 @@ inline float XMConvertHalfToFloat(HALF Value) noexcept { Exponent = 0x8f; } - else if (Exponent != 0) // The value is normalized + else if (Exponent != 0) // The value is normalized { Exponent = static_cast((static_cast(Value) >> 10) & 0x1F); } - else if (Mantissa != 0) // The value is denormalized + else if (Mantissa != 0) // The value is denormalized { // Normalize the value in the resulting float Exponent = 1; @@ -48,20 +49,18 @@ inline float XMConvertHalfToFloat(HALF Value) noexcept { Exponent--; Mantissa <<= 1; - } - while ((Mantissa & 0x0400) == 0); + } while ((Mantissa & 0x0400) == 0); Mantissa &= 0x03FF; } - else // The value is zero + else // The value is zero { Exponent = static_cast(-112); } - uint32_t Result = - ((static_cast(Value) & 0x8000) << 16) // Sign - | ((Exponent + 112) << 23) // Exponent - | (Mantissa << 13); // Mantissa + uint32_t Result = ((static_cast(Value) & 0x8000) << 16) // Sign + | ((Exponent + 112) << 23) // Exponent + | (Mantissa << 13); // Mantissa return reinterpret_cast(&Result)[0]; #endif // !_XM_F16C_INTRINSICS_ @@ -70,18 +69,14 @@ inline float XMConvertHalfToFloat(HALF Value) noexcept //------------------------------------------------------------------------------ #ifdef _PREFAST_ #pragma prefast(push) -#pragma prefast(disable : 26015 26019, "PREfast noise: Esp:1307" ) +#pragma prefast(disable : 26015 26019, "PREfast noise: Esp:1307") #endif -_Use_decl_annotations_ -inline float* XMConvertHalfToFloatStream -( - float* pOutputStream, - size_t OutputStride, - const HALF* pInputStream, - size_t InputStride, - size_t HalfCount -) noexcept +_Use_decl_annotations_ inline float* XMConvertHalfToFloatStream(float* pOutputStream, + size_t OutputStride, + const HALF* pInputStream, + size_t InputStride, + size_t HalfCount) noexcept { assert(pOutputStream); assert(pInputStream); @@ -93,10 +88,10 @@ inline float* XMConvertHalfToFloatStream _Analysis_assume_(OutputStride >= sizeof(float)); #if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - auto pHalf = reinterpret_cast(pInputStream); + auto pHalf = reinterpret_cast(pInputStream); auto pFloat = reinterpret_cast(pOutputStream); - size_t i = 0; + size_t i = 0; size_t four = HalfCount >> 2; if (four > 0) { @@ -174,11 +169,11 @@ inline float* XMConvertHalfToFloatStream pHalf += InputStride; __m128i HV = _mm_setzero_si128(); - HV = _mm_insert_epi16(HV, H1, 0); - HV = _mm_insert_epi16(HV, H2, 1); - HV = _mm_insert_epi16(HV, H3, 2); - HV = _mm_insert_epi16(HV, H4, 3); - __m128 FV = _mm_cvtph_ps(HV); + HV = _mm_insert_epi16(HV, H1, 0); + HV = _mm_insert_epi16(HV, H2, 1); + HV = _mm_insert_epi16(HV, H3, 2); + HV = _mm_insert_epi16(HV, H4, 3); + __m128 FV = _mm_cvtph_ps(HV); XM_STREAM_PS(reinterpret_cast(pFloat), FV); pFloat += OutputStride * 4; @@ -200,11 +195,11 @@ inline float* XMConvertHalfToFloatStream pHalf += InputStride; __m128i HV = _mm_setzero_si128(); - HV = _mm_insert_epi16(HV, H1, 0); - HV = _mm_insert_epi16(HV, H2, 1); - HV = _mm_insert_epi16(HV, H3, 2); - HV = _mm_insert_epi16(HV, H4, 3); - __m128 FV = _mm_cvtph_ps(HV); + HV = _mm_insert_epi16(HV, H1, 0); + HV = _mm_insert_epi16(HV, H2, 1); + HV = _mm_insert_epi16(HV, H3, 2); + HV = _mm_insert_epi16(HV, H4, 3); + __m128 FV = _mm_cvtph_ps(HV); _mm_storeu_ps(reinterpret_cast(pFloat), FV); pFloat += OutputStride * 4; @@ -227,11 +222,11 @@ inline float* XMConvertHalfToFloatStream pHalf += InputStride; __m128i HV = _mm_setzero_si128(); - HV = _mm_insert_epi16(HV, H1, 0); - HV = _mm_insert_epi16(HV, H2, 1); - HV = _mm_insert_epi16(HV, H3, 2); - HV = _mm_insert_epi16(HV, H4, 3); - __m128 FV = _mm_cvtph_ps(HV); + HV = _mm_insert_epi16(HV, H1, 0); + HV = _mm_insert_epi16(HV, H2, 1); + HV = _mm_insert_epi16(HV, H3, 2); + HV = _mm_insert_epi16(HV, H4, 3); + __m128 FV = _mm_cvtph_ps(HV); _mm_store_ss(reinterpret_cast(pFloat), FV); pFloat += OutputStride; @@ -256,11 +251,12 @@ inline float* XMConvertHalfToFloatStream XM_SFENCE(); return pOutputStream; -#elif defined(_XM_ARM_NEON_INTRINSICS_) && (defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) ||__aarch64__) && !defined(_XM_NO_INTRINSICS_) && (!defined(__GNUC__) || (__ARM_FP & 2)) - auto pHalf = reinterpret_cast(pInputStream); +#elif defined(_XM_ARM_NEON_INTRINSICS_) && (defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__) \ + && !defined(_XM_NO_INTRINSICS_) && (!defined(__GNUC__) || (__ARM_FP & 2)) + auto pHalf = reinterpret_cast(pInputStream); auto pFloat = reinterpret_cast(pOutputStream); - size_t i = 0; + size_t i = 0; size_t four = HalfCount >> 2; if (four > 0) { @@ -317,7 +313,7 @@ inline float* XMConvertHalfToFloatStream uint16_t H4 = *reinterpret_cast(pHalf); pHalf += InputStride; - uint64_t iHalf = uint64_t(H1) | (uint64_t(H2) << 16) | (uint64_t(H3) << 32) | (uint64_t(H4) << 48); + uint64_t iHalf = uint64_t(H1) | (uint64_t(H2) << 16) | (uint64_t(H3) << 32) | (uint64_t(H4) << 48); uint16x4_t vHalf = vcreate_u16(iHalf); float32x4_t vFloat = vcvt_f32_f16(vreinterpret_f16_u16(vHalf)); @@ -341,7 +337,7 @@ inline float* XMConvertHalfToFloatStream uint16_t H4 = *reinterpret_cast(pHalf); pHalf += InputStride; - uint64_t iHalf = uint64_t(H1) | (uint64_t(H2) << 16) | (uint64_t(H3) << 32) | (uint64_t(H4) << 48); + uint64_t iHalf = uint64_t(H1) | (uint64_t(H2) << 16) | (uint64_t(H3) << 32) | (uint64_t(H4) << 48); uint16x4_t vHalf = vcreate_u16(iHalf); float32x4_t vFloat = vcvt_f32_f16(vreinterpret_f16_u16(vHalf)); @@ -368,7 +364,7 @@ inline float* XMConvertHalfToFloatStream return pOutputStream; #else - auto pHalf = reinterpret_cast(pInputStream); + auto pHalf = reinterpret_cast(pInputStream); auto pFloat = reinterpret_cast(pOutputStream); for (size_t i = 0; i < HalfCount; i++) @@ -387,19 +383,20 @@ inline float* XMConvertHalfToFloatStream inline HALF XMConvertFloatToHalf(float Value) noexcept { #if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - __m128 V1 = _mm_set_ss(Value); + __m128 V1 = _mm_set_ss(Value); __m128i V2 = _mm_cvtps_ph(V1, _MM_FROUND_TO_NEAREST_INT); return static_cast(_mm_extract_epi16(V2, 0)); -#elif defined(_XM_ARM_NEON_INTRINSICS_) && (defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__) && !defined(_XM_NO_INTRINSICS_) && (!defined(__GNUC__) || (__ARM_FP & 2)) +#elif defined(_XM_ARM_NEON_INTRINSICS_) && (defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__) \ + && !defined(_XM_NO_INTRINSICS_) && (!defined(__GNUC__) || (__ARM_FP & 2)) float32x4_t vFloat = vdupq_n_f32(Value); - float16x4_t vHalf = vcvt_f16_f32(vFloat); + float16x4_t vHalf = vcvt_f16_f32(vFloat); return vget_lane_u16(vreinterpret_u16_f16(vHalf), 0); #else uint32_t Result; - auto IValue = reinterpret_cast(&Value)[0]; - uint32_t Sign = (IValue & 0x80000000U) >> 16U; - IValue = IValue & 0x7FFFFFFFU; // Hack off the sign + auto IValue = reinterpret_cast(&Value)[0]; + uint32_t Sign = (IValue & 0x80000000U) >> 16U; + IValue = IValue & 0x7FFFFFFFU; // Hack off the sign if (IValue >= 0x47800000 /*e+16*/) { // The number is too large to be represented as a half. Return infinity or NaN @@ -414,9 +411,9 @@ inline HALF XMConvertFloatToHalf(float Value) noexcept // The number is too small to be represented as a normalized half. // Convert it to a denormalized value. uint32_t Shift = 125U - (IValue >> 23U); - IValue = 0x800000U | (IValue & 0x7FFFFFU); - Result = IValue >> (Shift + 1); - uint32_t s = (IValue & ((1U << Shift) - 1)) != 0; + IValue = 0x800000U | (IValue & 0x7FFFFFU); + Result = IValue >> (Shift + 1); + uint32_t s = (IValue & ((1U << Shift) - 1)) != 0; Result += (Result | s) & ((IValue >> Shift) & 1U); } else @@ -430,15 +427,11 @@ inline HALF XMConvertFloatToHalf(float Value) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline HALF* XMConvertFloatToHalfStream -( - HALF* pOutputStream, - size_t OutputStride, - const float* pInputStream, - size_t InputStride, - size_t FloatCount -) noexcept +_Use_decl_annotations_ inline HALF* XMConvertFloatToHalfStream(HALF* pOutputStream, + size_t OutputStride, + const float* pInputStream, + size_t InputStride, + size_t FloatCount) noexcept { assert(pOutputStream); assert(pInputStream); @@ -451,9 +444,9 @@ inline HALF* XMConvertFloatToHalfStream #if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) auto pFloat = reinterpret_cast(pInputStream); - auto pHalf = reinterpret_cast(pOutputStream); + auto pHalf = reinterpret_cast(pOutputStream); - size_t i = 0; + size_t i = 0; size_t four = FloatCount >> 2; if (four > 0) { @@ -557,7 +550,7 @@ inline HALF* XMConvertFloatToHalfStream __m128 FV = _mm_blend_ps(FV1, FV2, 0x2); __m128 FT = _mm_blend_ps(FV3, FV4, 0x8); - FV = _mm_blend_ps(FV, FT, 0xC); + FV = _mm_blend_ps(FV, FT, 0xC); __m128i HV = _mm_cvtps_ph(FV, _MM_FROUND_TO_NEAREST_INT); @@ -585,7 +578,7 @@ inline HALF* XMConvertFloatToHalfStream __m128 FV = _mm_blend_ps(FV1, FV2, 0x2); __m128 FT = _mm_blend_ps(FV3, FV4, 0x8); - FV = _mm_blend_ps(FV, FT, 0xC); + FV = _mm_blend_ps(FV, FT, 0xC); __m128i HV = _mm_cvtps_ph(FV, _MM_FROUND_TO_NEAREST_INT); @@ -610,11 +603,12 @@ inline HALF* XMConvertFloatToHalfStream } return pOutputStream; -#elif defined(_XM_ARM_NEON_INTRINSICS_) && (defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__) && !defined(_XM_NO_INTRINSICS_) && (!defined(__GNUC__) || (__ARM_FP & 2)) +#elif defined(_XM_ARM_NEON_INTRINSICS_) && (defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__) \ + && !defined(_XM_NO_INTRINSICS_) && (!defined(__GNUC__) || (__ARM_FP & 2)) auto pFloat = reinterpret_cast(pInputStream); - auto pHalf = reinterpret_cast(pOutputStream); + auto pHalf = reinterpret_cast(pOutputStream); - size_t i = 0; + size_t i = 0; size_t four = FloatCount >> 2; if (four > 0) { @@ -663,7 +657,7 @@ inline HALF* XMConvertFloatToHalfStream for (size_t j = 0; j < four; ++j) { float32x4_t vFloat = vdupq_n_f32(0); - vFloat = vld1q_lane_f32(reinterpret_cast(pFloat), vFloat, 0); + vFloat = vld1q_lane_f32(reinterpret_cast(pFloat), vFloat, 0); pFloat += InputStride; vFloat = vld1q_lane_f32(reinterpret_cast(pFloat), vFloat, 1); @@ -688,7 +682,7 @@ inline HALF* XMConvertFloatToHalfStream for (size_t j = 0; j < four; ++j) { float32x4_t vFloat = vdupq_n_f32(0); - vFloat = vld1q_lane_f32(reinterpret_cast(pFloat), vFloat, 0); + vFloat = vld1q_lane_f32(reinterpret_cast(pFloat), vFloat, 0); pFloat += InputStride; vFloat = vld1q_lane_f32(reinterpret_cast(pFloat), vFloat, 1); @@ -725,7 +719,7 @@ inline HALF* XMConvertFloatToHalfStream return pOutputStream; #else auto pFloat = reinterpret_cast(pInputStream); - auto pHalf = reinterpret_cast(pOutputStream); + auto pHalf = reinterpret_cast(pOutputStream); for (size_t i = 0; i < FloatCount; i++) { @@ -749,31 +743,28 @@ inline HALF* XMConvertFloatToHalfStream #ifdef _PREFAST_ #pragma prefast(push) -#pragma prefast(disable:28931, "PREfast noise: Esp:1266") +#pragma prefast(disable : 28931, "PREfast noise: Esp:1266") #endif -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadColor(const XMCOLOR* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadColor(const XMCOLOR* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) // int32_t -> Float conversions are done in one instruction. // uint32_t -> Float calls a runtime function. Keep in int32_t - auto iColor = static_cast(pSource->c); - XMVECTORF32 vColor = { { { - static_cast((iColor >> 16) & 0xFF)* (1.0f / 255.0f), - static_cast((iColor >> 8) & 0xFF)* (1.0f / 255.0f), - static_cast(iColor & 0xFF)* (1.0f / 255.0f), - static_cast((iColor >> 24) & 0xFF)* (1.0f / 255.0f) - } } }; + auto iColor = static_cast(pSource->c); + XMVECTORF32 vColor = { { { static_cast((iColor >> 16) & 0xFF) * (1.0f / 255.0f), + static_cast((iColor >> 8) & 0xFF) * (1.0f / 255.0f), + static_cast(iColor & 0xFF) * (1.0f / 255.0f), + static_cast((iColor >> 24) & 0xFF) * (1.0f / 255.0f) } } }; return vColor.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32_t bgra = pSource->c; - uint32_t rgba = (bgra & 0xFF00FF00) | ((bgra >> 16) & 0xFF) | ((bgra << 16) & 0xFF0000); - uint32x2_t vInt8 = vdup_n_u32(rgba); - uint16x8_t vInt16 = vmovl_u8(vreinterpret_u8_u32(vInt8)); - uint32x4_t vInt = vmovl_u16(vget_low_u16(vInt16)); - float32x4_t R = vcvtq_f32_u32(vInt); + uint32_t bgra = pSource->c; + uint32_t rgba = (bgra & 0xFF00FF00) | ((bgra >> 16) & 0xFF) | ((bgra << 16) & 0xFF0000); + uint32x2_t vInt8 = vdup_n_u32(rgba); + uint16x8_t vInt16 = vmovl_u8(vreinterpret_u8_u32(vInt8)); + uint32x4_t vInt = vmovl_u16(vget_low_u16(vInt16)); + float32x4_t R = vcvtq_f32_u32(vInt); return vmulq_n_f32(R, 1.0f / 255.0f); #elif defined(_XM_SSE_INTRINSICS_) // Splat the color in all four entries @@ -792,43 +783,34 @@ inline XMVECTOR XM_CALLCONV XMLoadColor(const XMCOLOR* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadHalf2(const XMHALF2* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadHalf2(const XMHALF2* pSource) noexcept { assert(pSource); #if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) __m128 V = _mm_load_ss(reinterpret_cast(pSource)); return _mm_cvtph_ps(_mm_castps_si128(V)); #else - XMVECTORF32 vResult = { { { - XMConvertHalfToFloat(pSource->x), - XMConvertHalfToFloat(pSource->y), - 0.0f, - 0.0f - } } }; + XMVECTORF32 vResult = { { { XMConvertHalfToFloat(pSource->x), XMConvertHalfToFloat(pSource->y), 0.0f, 0.0f } } }; return vResult.v; #endif // !_XM_F16C_INTRINSICS_ } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadShortN2(const XMSHORTN2* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadShortN2(const XMSHORTN2* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - (pSource->x == -32768) ? -1.f : (static_cast(pSource->x)* (1.0f / 32767.0f)), - (pSource->y == -32768) ? -1.f : (static_cast(pSource->y)* (1.0f / 32767.0f)), - 0.0f, - 0.0f - } } }; + XMVECTORF32 vResult = { { { (pSource->x == -32768) ? -1.f : (static_cast(pSource->x) * (1.0f / 32767.0f)), + (pSource->y == -32768) ? -1.f : (static_cast(pSource->y) * (1.0f / 32767.0f)), + 0.0f, + 0.0f } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) uint32x2_t vInt16 = vld1_dup_u32(reinterpret_cast(pSource)); - int32x4_t vInt = vmovl_s16(vreinterpret_s16_u32(vInt16)); - vInt = vandq_s32(vInt, g_XMMaskXY); - float32x4_t R = vcvtq_f32_s32(vInt); - R = vmulq_n_f32(R, 1.0f / 32767.0f); + int32x4_t vInt = vmovl_s16(vreinterpret_s16_u32(vInt16)); + vInt = vandq_s32(vInt, g_XMMaskXY); + float32x4_t R = vcvtq_f32_s32(vInt); + R = vmulq_n_f32(R, 1.0f / 32767.0f); return vmaxq_f32(R, vdupq_n_f32(-1.f)); #elif defined(_XM_SSE_INTRINSICS_) // Splat the two shorts in all four entries (WORD alignment okay, @@ -850,22 +832,16 @@ inline XMVECTOR XM_CALLCONV XMLoadShortN2(const XMSHORTN2* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadShort2(const XMSHORT2* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadShort2(const XMSHORT2* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - static_cast(pSource->x), - static_cast(pSource->y), - 0.f, - 0.f - } } }; + XMVECTORF32 vResult = { { { static_cast(pSource->x), static_cast(pSource->y), 0.f, 0.f } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) uint32x2_t vInt16 = vld1_dup_u32(reinterpret_cast(pSource)); - int32x4_t vInt = vmovl_s16(vreinterpret_s16_u32(vInt16)); - vInt = vandq_s32(vInt, g_XMMaskXY); + int32x4_t vInt = vmovl_s16(vreinterpret_s16_u32(vInt16)); + vInt = vandq_s32(vInt, g_XMMaskXY); return vcvtq_f32_s32(vInt); #elif defined(_XM_SSE_INTRINSICS_) // Splat the two shorts in all four entries (WORD alignment okay, @@ -885,27 +861,21 @@ inline XMVECTOR XM_CALLCONV XMLoadShort2(const XMSHORT2* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUShortN2(const XMUSHORTN2* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadUShortN2(const XMUSHORTN2* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - static_cast(pSource->x) / 65535.0f, - static_cast(pSource->y) / 65535.0f, - 0.f, - 0.f - } } }; + XMVECTORF32 vResult = { { { static_cast(pSource->x) / 65535.0f, static_cast(pSource->y) / 65535.0f, 0.f, 0.f } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) uint32x2_t vInt16 = vld1_dup_u32(reinterpret_cast(pSource)); - uint32x4_t vInt = vmovl_u16(vreinterpret_u16_u32(vInt16)); - vInt = vandq_u32(vInt, g_XMMaskXY); - float32x4_t R = vcvtq_f32_u32(vInt); - R = vmulq_n_f32(R, 1.0f / 65535.0f); + uint32x4_t vInt = vmovl_u16(vreinterpret_u16_u32(vInt16)); + vInt = vandq_u32(vInt, g_XMMaskXY); + float32x4_t R = vcvtq_f32_u32(vInt); + R = vmulq_n_f32(R, 1.0f / 65535.0f); return vmaxq_f32(R, vdupq_n_f32(-1.f)); #elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 FixupY16 = { { { 1.0f / 65535.0f, 1.0f / (65535.0f * 65536.0f), 0.0f, 0.0f } } }; + static const XMVECTORF32 FixupY16 = { { { 1.0f / 65535.0f, 1.0f / (65535.0f * 65536.0f), 0.0f, 0.0f } } }; static const XMVECTORF32 FixaddY16 = { { { 0, 32768.0f * 65536.0f, 0, 0 } } }; // Splat the two shorts in all four entries (WORD alignment okay, // DWORD alignment preferred) @@ -925,22 +895,16 @@ inline XMVECTOR XM_CALLCONV XMLoadUShortN2(const XMUSHORTN2* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUShort2(const XMUSHORT2* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadUShort2(const XMUSHORT2* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - static_cast(pSource->x), - static_cast(pSource->y), - 0.f, - 0.f - } } }; + XMVECTORF32 vResult = { { { static_cast(pSource->x), static_cast(pSource->y), 0.f, 0.f } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) uint32x2_t vInt16 = vld1_dup_u32(reinterpret_cast(pSource)); - uint32x4_t vInt = vmovl_u16(vreinterpret_u16_u32(vInt16)); - vInt = vandq_u32(vInt, g_XMMaskXY); + uint32x4_t vInt = vmovl_u16(vreinterpret_u16_u32(vInt16)); + vInt = vandq_u32(vInt, g_XMMaskXY); return vcvtq_f32_u32(vInt); #elif defined(_XM_SSE_INTRINSICS_) static const XMVECTORF32 FixaddY16 = { { { 0, 32768.0f, 0, 0 } } }; @@ -962,31 +926,28 @@ inline XMVECTOR XM_CALLCONV XMLoadUShort2(const XMUSHORT2* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadByteN2(const XMBYTEN2* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadByteN2(const XMBYTEN2* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - (pSource->x == -128) ? -1.f : (static_cast(pSource->x)* (1.0f / 127.0f)), - (pSource->y == -128) ? -1.f : (static_cast(pSource->y)* (1.0f / 127.0f)), - 0.0f, - 0.0f - } } }; + XMVECTORF32 vResult = { { { (pSource->x == -128) ? -1.f : (static_cast(pSource->x) * (1.0f / 127.0f)), + (pSource->y == -128) ? -1.f : (static_cast(pSource->y) * (1.0f / 127.0f)), + 0.0f, + 0.0f } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint16x4_t vInt8 = vld1_dup_u16(reinterpret_cast(pSource)); - int16x8_t vInt16 = vmovl_s8(vreinterpret_s8_u16(vInt8)); - int32x4_t vInt = vmovl_s16(vget_low_s16(vInt16)); - vInt = vandq_s32(vInt, g_XMMaskXY); - float32x4_t R = vcvtq_f32_s32(vInt); - R = vmulq_n_f32(R, 1.0f / 127.0f); + uint16x4_t vInt8 = vld1_dup_u16(reinterpret_cast(pSource)); + int16x8_t vInt16 = vmovl_s8(vreinterpret_s8_u16(vInt8)); + int32x4_t vInt = vmovl_s16(vget_low_s16(vInt16)); + vInt = vandq_s32(vInt, g_XMMaskXY); + float32x4_t R = vcvtq_f32_s32(vInt); + R = vmulq_n_f32(R, 1.0f / 127.0f); return vmaxq_f32(R, vdupq_n_f32(-1.f)); #elif defined(_XM_SSE_INTRINSICS_) static const XMVECTORF32 Scale = { { { 1.0f / 127.0f, 1.0f / (127.0f * 256.0f), 0, 0 } } }; - static const XMVECTORU32 Mask = { { { 0xFF, 0xFF00, 0, 0 } } }; + static const XMVECTORU32 Mask = { { { 0xFF, 0xFF00, 0, 0 } } }; // Splat the color in all four entries (x,z,y,w) - __m128i vInt = XM_LOADU_SI16(&pSource->v); + __m128i vInt = XM_LOADU_SI16(&pSource->v); XMVECTOR vTemp = XM_PERMUTE_PS(_mm_castsi128_ps(vInt), _MM_SHUFFLE(0, 0, 0, 0)); // Mask vTemp = _mm_and_ps(vTemp, Mask); @@ -1004,29 +965,23 @@ inline XMVECTOR XM_CALLCONV XMLoadByteN2(const XMBYTEN2* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadByte2(const XMBYTE2* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadByte2(const XMBYTE2* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - static_cast(pSource->x), - static_cast(pSource->y), - 0.0f, - 0.0f - } } }; + XMVECTORF32 vResult = { { { static_cast(pSource->x), static_cast(pSource->y), 0.0f, 0.0f } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint16x4_t vInt8 = vld1_dup_u16(reinterpret_cast(pSource)); - int16x8_t vInt16 = vmovl_s8(vreinterpret_s8_u16(vInt8)); - int32x4_t vInt = vmovl_s16(vget_low_s16(vInt16)); - vInt = vandq_s32(vInt, g_XMMaskXY); + uint16x4_t vInt8 = vld1_dup_u16(reinterpret_cast(pSource)); + int16x8_t vInt16 = vmovl_s8(vreinterpret_s8_u16(vInt8)); + int32x4_t vInt = vmovl_s16(vget_low_s16(vInt16)); + vInt = vandq_s32(vInt, g_XMMaskXY); return vcvtq_f32_s32(vInt); #elif defined(_XM_SSE_INTRINSICS_) static const XMVECTORF32 Scale = { { { 1.0f, 1.0f / 256.0f, 1.0f / 65536.0f, 1.0f / (65536.0f * 256.0f) } } }; - static const XMVECTORU32 Mask = { { { 0xFF, 0xFF00, 0, 0 } } }; + static const XMVECTORU32 Mask = { { { 0xFF, 0xFF00, 0, 0 } } }; // Splat the color in all four entries (x,z,y,w) - __m128i vInt = XM_LOADU_SI16(&pSource->v); + __m128i vInt = XM_LOADU_SI16(&pSource->v); XMVECTOR vTemp = XM_PERMUTE_PS(_mm_castsi128_ps(vInt), _MM_SHUFFLE(0, 0, 0, 0)); // Mask vTemp = _mm_and_ps(vTemp, Mask); @@ -1042,30 +997,25 @@ inline XMVECTOR XM_CALLCONV XMLoadByte2(const XMBYTE2* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUByteN2(const XMUBYTEN2* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadUByteN2(const XMUBYTEN2* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - static_cast(pSource->x)* (1.0f / 255.0f), - static_cast(pSource->y)* (1.0f / 255.0f), - 0.0f, - 0.0f - } } }; + XMVECTORF32 vResult + = { { { static_cast(pSource->x) * (1.0f / 255.0f), static_cast(pSource->y) * (1.0f / 255.0f), 0.0f, 0.0f } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint16x4_t vInt8 = vld1_dup_u16(reinterpret_cast(pSource)); + uint16x4_t vInt8 = vld1_dup_u16(reinterpret_cast(pSource)); uint16x8_t vInt16 = vmovl_u8(vreinterpret_u8_u16(vInt8)); - uint32x4_t vInt = vmovl_u16(vget_low_u16(vInt16)); - vInt = vandq_u32(vInt, g_XMMaskXY); - float32x4_t R = vcvtq_f32_u32(vInt); + uint32x4_t vInt = vmovl_u16(vget_low_u16(vInt16)); + vInt = vandq_u32(vInt, g_XMMaskXY); + float32x4_t R = vcvtq_f32_u32(vInt); return vmulq_n_f32(R, 1.0f / 255.0f); #elif defined(_XM_SSE_INTRINSICS_) static const XMVECTORF32 Scale = { { { 1.0f / 255.0f, 1.0f / (255.0f * 256.0f), 0, 0 } } }; - static const XMVECTORU32 Mask = { { { 0xFF, 0xFF00, 0, 0 } } }; + static const XMVECTORU32 Mask = { { { 0xFF, 0xFF00, 0, 0 } } }; // Splat the color in all four entries (x,z,y,w) - __m128i vInt = XM_LOADU_SI16(&pSource->v); + __m128i vInt = XM_LOADU_SI16(&pSource->v); XMVECTOR vTemp = XM_PERMUTE_PS(_mm_castsi128_ps(vInt), _MM_SHUFFLE(0, 0, 0, 0)); // Mask vTemp = _mm_and_ps(vTemp, Mask); @@ -1081,29 +1031,23 @@ inline XMVECTOR XM_CALLCONV XMLoadUByteN2(const XMUBYTEN2* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUByte2(const XMUBYTE2* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadUByte2(const XMUBYTE2* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - static_cast(pSource->x), - static_cast(pSource->y), - 0.0f, - 0.0f - } } }; + XMVECTORF32 vResult = { { { static_cast(pSource->x), static_cast(pSource->y), 0.0f, 0.0f } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint16x4_t vInt8 = vld1_dup_u16(reinterpret_cast(pSource)); + uint16x4_t vInt8 = vld1_dup_u16(reinterpret_cast(pSource)); uint16x8_t vInt16 = vmovl_u8(vreinterpret_u8_u16(vInt8)); - uint32x4_t vInt = vmovl_u16(vget_low_u16(vInt16)); - vInt = vandq_u32(vInt, g_XMMaskXY); + uint32x4_t vInt = vmovl_u16(vget_low_u16(vInt16)); + vInt = vandq_u32(vInt, g_XMMaskXY); return vcvtq_f32_u32(vInt); #elif defined(_XM_SSE_INTRINSICS_) static const XMVECTORF32 Scale = { { { 1.0f, 1.0f / 256.0f, 0, 0 } } }; - static const XMVECTORU32 Mask = { { { 0xFF, 0xFF00, 0, 0 } } }; + static const XMVECTORU32 Mask = { { { 0xFF, 0xFF00, 0, 0 } } }; // Splat the color in all four entries (x,z,y,w) - __m128i vInt = XM_LOADU_SI16(&pSource->v); + __m128i vInt = XM_LOADU_SI16(&pSource->v); XMVECTOR vTemp = XM_PERMUTE_PS(_mm_castsi128_ps(vInt), _MM_SHUFFLE(0, 0, 0, 0)); // Mask vTemp = _mm_and_ps(vTemp, Mask); @@ -1119,31 +1063,30 @@ inline XMVECTOR XM_CALLCONV XMLoadUByte2(const XMUBYTE2* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadU565(const XMU565* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadU565(const XMU565* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) XMVECTORF32 vResult = { { { - float(pSource->v & 0x1F), - float((pSource->v >> 5) & 0x3F), - float((pSource->v >> 11) & 0x1F), - 0.f, - } } }; + float(pSource->v & 0x1F), + float((pSource->v >> 5) & 0x3F), + float((pSource->v >> 11) & 0x1F), + 0.f, + } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) static const XMVECTORI32 U565And = { { { 0x1F, 0x3F << 5, 0x1F << 11, 0 } } }; static const XMVECTORF32 U565Mul = { { { 1.0f, 1.0f / 32.0f, 1.0f / 2048.f, 0 } } }; - uint16x4_t vInt16 = vld1_dup_u16(reinterpret_cast(pSource)); - uint32x4_t vInt = vmovl_u16(vInt16); - vInt = vandq_u32(vInt, U565And); - float32x4_t R = vcvtq_f32_u32(vInt); + uint16x4_t vInt16 = vld1_dup_u16(reinterpret_cast(pSource)); + uint32x4_t vInt = vmovl_u16(vInt16); + vInt = vandq_u32(vInt, U565And); + float32x4_t R = vcvtq_f32_u32(vInt); return vmulq_f32(R, U565Mul); #elif defined(_XM_SSE_INTRINSICS_) static const XMVECTORI32 U565And = { { { 0x1F, 0x3F << 5, 0x1F << 11, 0 } } }; static const XMVECTORF32 U565Mul = { { { 1.0f, 1.0f / 32.0f, 1.0f / 2048.f, 0 } } }; // Get the 16 bit value and splat it - __m128i vInt = XM_LOADU_SI16(&pSource->v); + __m128i vInt = XM_LOADU_SI16(&pSource->v); XMVECTOR vResult = XM_PERMUTE_PS(_mm_castsi128_ps(vInt), _MM_SHUFFLE(0, 0, 0, 0)); // Mask off x, y and z vResult = _mm_and_ps(vResult, U565And); @@ -1156,14 +1099,13 @@ inline XMVECTOR XM_CALLCONV XMLoadU565(const XMU565* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadFloat3PK(const XMFLOAT3PK* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadFloat3PK(const XMFLOAT3PK* pSource) noexcept { assert(pSource); XM_ALIGNED_DATA(16) uint32_t Result[4]; - uint32_t Mantissa; - uint32_t Exponent; + uint32_t Mantissa; + uint32_t Exponent; // X Channel (6-bit mantissa) Mantissa = pSource->xm; @@ -1187,8 +1129,7 @@ inline XMVECTOR XM_CALLCONV XMLoadFloat3PK(const XMFLOAT3PK* pSource) noexcept { Exponent--; Mantissa <<= 1; - } - while ((Mantissa & 0x40) == 0); + } while ((Mantissa & 0x40) == 0); Mantissa &= 0x3F; } @@ -1222,8 +1163,7 @@ inline XMVECTOR XM_CALLCONV XMLoadFloat3PK(const XMFLOAT3PK* pSource) noexcept { Exponent--; Mantissa <<= 1; - } - while ((Mantissa & 0x40) == 0); + } while ((Mantissa & 0x40) == 0); Mantissa &= 0x3F; } @@ -1257,8 +1197,7 @@ inline XMVECTOR XM_CALLCONV XMLoadFloat3PK(const XMFLOAT3PK* pSource) noexcept { Exponent--; Mantissa <<= 1; - } - while ((Mantissa & 0x20) == 0); + } while ((Mantissa & 0x20) == 0); Mantissa &= 0x1F; } @@ -1274,35 +1213,38 @@ inline XMVECTOR XM_CALLCONV XMLoadFloat3PK(const XMFLOAT3PK* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadFloat3SE(const XMFLOAT3SE* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadFloat3SE(const XMFLOAT3SE* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) - union { float f; int32_t i; } fi; - fi.i = 0x33800000 + (pSource->e << 23); + union + { + float f; + int32_t i; + } fi; + fi.i = 0x33800000 + (pSource->e << 23); float Scale = fi.f; - XMVECTORF32 v = { { { - Scale * float(pSource->xm), - Scale * float(pSource->ym), - Scale * float(pSource->zm), - 1.0f } } }; + XMVECTORF32 v = { { { Scale * float(pSource->xm), Scale * float(pSource->ym), Scale * float(pSource->zm), 1.0f } } }; return v; #elif defined(_XM_ARM_NEON_INTRINSICS_) // Build scale factor from shared exponent - union { float f; int32_t i; } fi; + union + { + float f; + int32_t i; + } fi; fi.i = 0x33800000 + (pSource->e << 23); // Extract 9-bit mantissas into vector lanes uint32x4_t mantissas = vdupq_n_u32(0); - mantissas = vsetq_lane_u32(pSource->xm, mantissas, 0); - mantissas = vsetq_lane_u32(pSource->ym, mantissas, 1); - mantissas = vsetq_lane_u32(pSource->zm, mantissas, 2); + mantissas = vsetq_lane_u32(pSource->xm, mantissas, 0); + mantissas = vsetq_lane_u32(pSource->ym, mantissas, 1); + mantissas = vsetq_lane_u32(pSource->zm, mantissas, 2); // Convert to float, scale, and set w = 1.0f float32x4_t result = vmulq_n_f32(vcvtq_f32_u32(mantissas), fi.f); @@ -1311,16 +1253,16 @@ inline XMVECTOR XM_CALLCONV XMLoadFloat3SE(const XMFLOAT3SE* pSource) noexcept #elif defined(_XM_SSE_INTRINSICS_) // Build scale factor from shared exponent - union { float f; int32_t i; } fi; + union + { + float f; + int32_t i; + } fi; fi.i = 0x33800000 + (pSource->e << 23); // Extract 9-bit mantissas, convert to float, and scale - __m128i mantissas = _mm_set_epi32( - 0, - static_cast(pSource->zm), - static_cast(pSource->ym), - static_cast(pSource->xm)); - __m128 result = _mm_mul_ps(_mm_cvtepi32_ps(mantissas), _mm_set1_ps(fi.f)); + __m128i mantissas = _mm_set_epi32(0, static_cast(pSource->zm), static_cast(pSource->ym), static_cast(pSource->xm)); + __m128 result = _mm_mul_ps(_mm_cvtepi32_ps(mantissas), _mm_set1_ps(fi.f)); // Set w = 1.0f (w lane is +0.0f so bitwise OR inserts 1.0f cleanly) return _mm_or_ps(result, g_XMIdentityR3); @@ -1329,42 +1271,36 @@ inline XMVECTOR XM_CALLCONV XMLoadFloat3SE(const XMFLOAT3SE* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadHalf4(const XMHALF4* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadHalf4(const XMHALF4* pSource) noexcept { assert(pSource); #if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) __m128i V = _mm_loadl_epi64(reinterpret_cast(pSource)); return _mm_cvtph_ps(V); #else - XMVECTORF32 vResult = { { { - XMConvertHalfToFloat(pSource->x), - XMConvertHalfToFloat(pSource->y), - XMConvertHalfToFloat(pSource->z), - XMConvertHalfToFloat(pSource->w) - } } }; + XMVECTORF32 vResult = { { { XMConvertHalfToFloat(pSource->x), + XMConvertHalfToFloat(pSource->y), + XMConvertHalfToFloat(pSource->z), + XMConvertHalfToFloat(pSource->w) } } }; return vResult.v; #endif // !_XM_F16C_INTRINSICS_ } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadShortN4(const XMSHORTN4* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadShortN4(const XMSHORTN4* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - (pSource->x == -32768) ? -1.f : (static_cast(pSource->x)* (1.0f / 32767.0f)), - (pSource->y == -32768) ? -1.f : (static_cast(pSource->y)* (1.0f / 32767.0f)), - (pSource->z == -32768) ? -1.f : (static_cast(pSource->z)* (1.0f / 32767.0f)), - (pSource->w == -32768) ? -1.f : (static_cast(pSource->w)* (1.0f / 32767.0f)) - } } }; + XMVECTORF32 vResult = { { { (pSource->x == -32768) ? -1.f : (static_cast(pSource->x) * (1.0f / 32767.0f)), + (pSource->y == -32768) ? -1.f : (static_cast(pSource->y) * (1.0f / 32767.0f)), + (pSource->z == -32768) ? -1.f : (static_cast(pSource->z) * (1.0f / 32767.0f)), + (pSource->w == -32768) ? -1.f : (static_cast(pSource->w) * (1.0f / 32767.0f)) } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - int16x4_t vInt = vld1_s16(reinterpret_cast(pSource)); - int32x4_t V = vmovl_s16(vInt); + int16x4_t vInt = vld1_s16(reinterpret_cast(pSource)); + int32x4_t V = vmovl_s16(vInt); float32x4_t vResult = vcvtq_f32_s32(V); - vResult = vmulq_n_f32(vResult, 1.0f / 32767.0f); + vResult = vmulq_n_f32(vResult, 1.0f / 32767.0f); return vmaxq_f32(vResult, vdupq_n_f32(-1.f)); #elif defined(_XM_SSE_INTRINSICS_) // Splat the color in all four entries (x,z,y,w) @@ -1387,21 +1323,18 @@ inline XMVECTOR XM_CALLCONV XMLoadShortN4(const XMSHORTN4* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadShort4(const XMSHORT4* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadShort4(const XMSHORT4* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - static_cast(pSource->x), - static_cast(pSource->y), - static_cast(pSource->z), - static_cast(pSource->w) - } } }; + XMVECTORF32 vResult = { { { static_cast(pSource->x), + static_cast(pSource->y), + static_cast(pSource->z), + static_cast(pSource->w) } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) int16x4_t vInt = vld1_s16(reinterpret_cast(pSource)); - int32x4_t V = vmovl_s16(vInt); + int32x4_t V = vmovl_s16(vInt); return vcvtq_f32_s32(V); #elif defined(_XM_SSE_INTRINSICS_) // Splat the color in all four entries (x,z,y,w) @@ -1422,25 +1355,23 @@ inline XMVECTOR XM_CALLCONV XMLoadShort4(const XMSHORT4* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUShortN4(const XMUSHORTN4* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadUShortN4(const XMUSHORTN4* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - static_cast(pSource->x) / 65535.0f, - static_cast(pSource->y) / 65535.0f, - static_cast(pSource->z) / 65535.0f, - static_cast(pSource->w) / 65535.0f - } } }; + XMVECTORF32 vResult = { { { static_cast(pSource->x) / 65535.0f, + static_cast(pSource->y) / 65535.0f, + static_cast(pSource->z) / 65535.0f, + static_cast(pSource->w) / 65535.0f } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint16x4_t vInt = vld1_u16(reinterpret_cast(pSource)); - uint32x4_t V = vmovl_u16(vInt); + uint16x4_t vInt = vld1_u16(reinterpret_cast(pSource)); + uint32x4_t V = vmovl_u16(vInt); float32x4_t vResult = vcvtq_f32_u32(V); return vmulq_n_f32(vResult, 1.0f / 65535.0f); #elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 FixupY16W16 = { { { 1.0f / 65535.0f, 1.0f / 65535.0f, 1.0f / (65535.0f * 65536.0f), 1.0f / (65535.0f * 65536.0f) } } }; + static const XMVECTORF32 FixupY16W16 + = { { { 1.0f / 65535.0f, 1.0f / 65535.0f, 1.0f / (65535.0f * 65536.0f), 1.0f / (65535.0f * 65536.0f) } } }; static const XMVECTORF32 FixaddY16W16 = { { { 0, 0, 32768.0f * 65536.0f, 32768.0f * 65536.0f } } }; // Splat the color in all four entries (x,z,y,w) __m128d vIntd = _mm_load1_pd(reinterpret_cast(&pSource->x)); @@ -1460,21 +1391,18 @@ inline XMVECTOR XM_CALLCONV XMLoadUShortN4(const XMUSHORTN4* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUShort4(const XMUSHORT4* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadUShort4(const XMUSHORT4* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - static_cast(pSource->x), - static_cast(pSource->y), - static_cast(pSource->z), - static_cast(pSource->w) - } } }; + XMVECTORF32 vResult = { { { static_cast(pSource->x), + static_cast(pSource->y), + static_cast(pSource->z), + static_cast(pSource->w) } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) uint16x4_t vInt = vld1_u16(reinterpret_cast(pSource)); - uint32x4_t V = vmovl_u16(vInt); + uint32x4_t V = vmovl_u16(vInt); return vcvtq_f32_u32(V); #elif defined(_XM_SSE_INTRINSICS_) static const XMVECTORF32 FixaddY16W16 = { { { 0, 0, 32768.0f, 32768.0f } } }; @@ -1496,8 +1424,7 @@ inline XMVECTOR XM_CALLCONV XMLoadUShort4(const XMUSHORT4* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadXDecN4(const XMXDECN4* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadXDecN4(const XMXDECN4* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) @@ -1507,20 +1434,19 @@ inline XMVECTOR XM_CALLCONV XMLoadXDecN4(const XMXDECN4* pSource) noexcept uint32_t ElementY = (pSource->v >> 10) & 0x3FF; uint32_t ElementZ = (pSource->v >> 20) & 0x3FF; - XMVECTORF32 vResult = { { { - (ElementX == 0x200) ? -1.f : (static_cast(static_cast(ElementX | SignExtend[ElementX >> 9])) / 511.0f), + XMVECTORF32 vResult + = { { { (ElementX == 0x200) ? -1.f : (static_cast(static_cast(ElementX | SignExtend[ElementX >> 9])) / 511.0f), (ElementY == 0x200) ? -1.f : (static_cast(static_cast(ElementY | SignExtend[ElementY >> 9])) / 511.0f), (ElementZ == 0x200) ? -1.f : (static_cast(static_cast(ElementZ | SignExtend[ElementZ >> 9])) / 511.0f), - static_cast(pSource->v >> 30) / 3.0f - } } }; + static_cast(pSource->v >> 30) / 3.0f } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) uint32x4_t vInt = vld1q_dup_u32(reinterpret_cast(pSource)); - vInt = vandq_u32(vInt, g_XMMaskA2B10G10R10); - vInt = veorq_u32(vInt, g_XMFlipA2B10G10R10); - float32x4_t R = vcvtq_f32_s32(vreinterpretq_s32_u32(vInt)); - R = vaddq_f32(R, g_XMFixAA2B10G10R10); - R = vmulq_f32(R, g_XMNormalizeA2B10G10R10); + vInt = vandq_u32(vInt, g_XMMaskA2B10G10R10); + vInt = veorq_u32(vInt, g_XMFlipA2B10G10R10); + float32x4_t R = vcvtq_f32_s32(vreinterpretq_s32_u32(vInt)); + R = vaddq_f32(R, g_XMFixAA2B10G10R10); + R = vmulq_f32(R, g_XMNormalizeA2B10G10R10); return vmaxq_f32(R, vdupq_n_f32(-1.0f)); #elif defined(_XM_SSE_INTRINSICS_) // Splat the color in all four entries @@ -1557,8 +1483,7 @@ inline XMVECTOR XM_CALLCONV XMLoadXDecN4(const XMXDECN4* pSource) noexcept #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #endif -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadXDec4(const XMXDEC4* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadXDec4(const XMXDEC4* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) @@ -1568,21 +1493,19 @@ inline XMVECTOR XM_CALLCONV XMLoadXDec4(const XMXDEC4* pSource) noexcept uint32_t ElementY = (pSource->v >> 10) & 0x3FF; uint32_t ElementZ = (pSource->v >> 20) & 0x3FF; - XMVECTORF32 vResult = { { { - static_cast(static_cast(ElementX | SignExtend[ElementX >> 9])), - static_cast(static_cast(ElementY | SignExtend[ElementY >> 9])), - static_cast(static_cast(ElementZ | SignExtend[ElementZ >> 9])), - static_cast(pSource->v >> 30) - } } }; + XMVECTORF32 vResult = { { { static_cast(static_cast(ElementX | SignExtend[ElementX >> 9])), + static_cast(static_cast(ElementY | SignExtend[ElementY >> 9])), + static_cast(static_cast(ElementZ | SignExtend[ElementZ >> 9])), + static_cast(pSource->v >> 30) } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) static const XMVECTORU32 XDec4Xor = { { { 0x200, 0x200 << 10, 0x200 << 20, 0x80000000 } } }; static const XMVECTORF32 XDec4Add = { { { -512.0f, -512.0f * 1024.0f, -512.0f * 1024.0f * 1024.0f, 32768 * 65536.0f } } }; - uint32x4_t vInt = vld1q_dup_u32(reinterpret_cast(pSource)); - vInt = vandq_u32(vInt, g_XMMaskDec4); - vInt = veorq_u32(vInt, XDec4Xor); - float32x4_t R = vcvtq_f32_s32(vreinterpretq_s32_u32(vInt)); - R = vaddq_f32(R, XDec4Add); + uint32x4_t vInt = vld1q_dup_u32(reinterpret_cast(pSource)); + vInt = vandq_u32(vInt, g_XMMaskDec4); + vInt = veorq_u32(vInt, XDec4Xor); + float32x4_t R = vcvtq_f32_s32(vreinterpretq_s32_u32(vInt)); + R = vaddq_f32(R, XDec4Add); return vmulq_f32(R, g_XMMulDec4); #elif defined(_XM_SSE_INTRINSICS_) static const XMVECTORU32 XDec4Xor = { { { 0x200, 0x200 << 10, 0x200 << 20, 0x80000000 } } }; @@ -1614,8 +1537,7 @@ inline XMVECTOR XM_CALLCONV XMLoadXDec4(const XMXDEC4* pSource) noexcept #endif //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUDecN4(const XMUDECN4* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadUDecN4(const XMUDECN4* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) @@ -1624,22 +1546,26 @@ inline XMVECTOR XM_CALLCONV XMLoadUDecN4(const XMUDECN4* pSource) noexcept uint32_t ElementY = (pSource->v >> 10) & 0x3FF; uint32_t ElementZ = (pSource->v >> 20) & 0x3FF; - XMVECTORF32 vResult = { { { - static_cast(ElementX) / 1023.0f, - static_cast(ElementY) / 1023.0f, - static_cast(ElementZ) / 1023.0f, - static_cast(pSource->v >> 30) / 3.0f - } } }; + XMVECTORF32 vResult = { { { static_cast(ElementX) / 1023.0f, + static_cast(ElementY) / 1023.0f, + static_cast(ElementZ) / 1023.0f, + static_cast(pSource->v >> 30) / 3.0f } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 UDecN4Mul = { { { 1.0f / 1023.0f, 1.0f / (1023.0f * 1024.0f), 1.0f / (1023.0f * 1024.0f * 1024.0f), 1.0f / (3.0f * 1024.0f * 1024.0f * 1024.0f) } } }; - uint32x4_t vInt = vld1q_dup_u32(reinterpret_cast(pSource)); - vInt = vandq_u32(vInt, g_XMMaskDec4); - float32x4_t R = vcvtq_f32_u32(vInt); + static const XMVECTORF32 UDecN4Mul = { { { 1.0f / 1023.0f, + 1.0f / (1023.0f * 1024.0f), + 1.0f / (1023.0f * 1024.0f * 1024.0f), + 1.0f / (3.0f * 1024.0f * 1024.0f * 1024.0f) } } }; + uint32x4_t vInt = vld1q_dup_u32(reinterpret_cast(pSource)); + vInt = vandq_u32(vInt, g_XMMaskDec4); + float32x4_t R = vcvtq_f32_u32(vInt); return vmulq_f32(R, UDecN4Mul); #elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 UDecN4Mul = { { { 1.0f / 1023.0f, 1.0f / (1023.0f * 1024.0f), 1.0f / (1023.0f * 1024.0f * 1024.0f), 1.0f / (3.0f * 1024.0f * 1024.0f * 1024.0f) } } }; + static const XMVECTORF32 UDecN4Mul = { { { 1.0f / 1023.0f, + 1.0f / (1023.0f * 1024.0f), + 1.0f / (1023.0f * 1024.0f * 1024.0f), + 1.0f / (3.0f * 1024.0f * 1024.0f * 1024.0f) } } }; // Splat the color in all four entries XMVECTOR vTemp = _mm_load_ps1(reinterpret_cast(&pSource->v)); // Shift R&0xFF0000, G&0xFF00, B&0xFF, A&0xFF000000 @@ -1656,10 +1582,8 @@ inline XMVECTOR XM_CALLCONV XMLoadUDecN4(const XMUDECN4* pSource) noexcept #endif } - //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUDecN4_XR(const XMUDECN4* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadUDecN4_XR(const XMUDECN4* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) @@ -1668,27 +1592,29 @@ inline XMVECTOR XM_CALLCONV XMLoadUDecN4_XR(const XMUDECN4* pSource) noexcept int32_t ElementY = (pSource->v >> 10) & 0x3FF; int32_t ElementZ = (pSource->v >> 20) & 0x3FF; - XMVECTORF32 vResult = { { { - static_cast(ElementX - 0x180) / 510.0f, - static_cast(ElementY - 0x180) / 510.0f, - static_cast(ElementZ - 0x180) / 510.0f, - static_cast(pSource->v >> 30) / 3.0f - } } }; + XMVECTORF32 vResult = { { { static_cast(ElementX - 0x180) / 510.0f, + static_cast(ElementY - 0x180) / 510.0f, + static_cast(ElementZ - 0x180) / 510.0f, + static_cast(pSource->v >> 30) / 3.0f } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 XRMul = { { { 1.0f / 510.0f, 1.0f / (510.0f * 1024.0f), 1.0f / (510.0f * 1024.0f * 1024.0f), 1.0f / (3.0f * 1024.0f * 1024.0f * 1024.0f) } } }; + static const XMVECTORF32 XRMul = { + { { 1.0f / 510.0f, 1.0f / (510.0f * 1024.0f), 1.0f / (510.0f * 1024.0f * 1024.0f), 1.0f / (3.0f * 1024.0f * 1024.0f * 1024.0f) } } + }; static const XMVECTORI32 XRBias = { { { 0x180, 0x180 * 1024, 0x180 * 1024 * 1024, 0 } } }; - uint32x4_t vInt = vld1q_dup_u32(reinterpret_cast(pSource)); - vInt = vandq_u32(vInt, g_XMMaskDec4); - int32x4_t vTemp = vsubq_s32(vreinterpretq_s32_u32(vInt), XRBias); - vTemp = veorq_s32(vTemp, g_XMFlipW); - float32x4_t R = vcvtq_f32_s32(vTemp); - R = vaddq_f32(R, g_XMAddUDec4); + uint32x4_t vInt = vld1q_dup_u32(reinterpret_cast(pSource)); + vInt = vandq_u32(vInt, g_XMMaskDec4); + int32x4_t vTemp = vsubq_s32(vreinterpretq_s32_u32(vInt), XRBias); + vTemp = veorq_s32(vTemp, g_XMFlipW); + float32x4_t R = vcvtq_f32_s32(vTemp); + R = vaddq_f32(R, g_XMAddUDec4); return vmulq_f32(R, XRMul); #elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 XRMul = { { { 1.0f / 510.0f, 1.0f / (510.0f * 1024.0f), 1.0f / (510.0f * 1024.0f * 1024.0f), 1.0f / (3.0f * 1024.0f * 1024.0f * 1024.0f) } } }; + static const XMVECTORF32 XRMul = { + { { 1.0f / 510.0f, 1.0f / (510.0f * 1024.0f), 1.0f / (510.0f * 1024.0f * 1024.0f), 1.0f / (3.0f * 1024.0f * 1024.0f * 1024.0f) } } + }; static const XMVECTORI32 XRBias = { { { 0x180, 0x180 * 1024, 0x180 * 1024 * 1024, 0 } } }; // Splat the color in all four entries XMVECTOR vTemp = _mm_load_ps1(reinterpret_cast(&pSource->v)); @@ -1707,10 +1633,8 @@ inline XMVECTOR XM_CALLCONV XMLoadUDecN4_XR(const XMUDECN4* pSource) noexcept #endif } - //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUDec4(const XMUDEC4* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadUDec4(const XMUDEC4* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) @@ -1718,17 +1642,15 @@ inline XMVECTOR XM_CALLCONV XMLoadUDec4(const XMUDEC4* pSource) noexcept uint32_t ElementY = (pSource->v >> 10) & 0x3FF; uint32_t ElementZ = (pSource->v >> 20) & 0x3FF; - XMVECTORF32 vResult = { { { - static_cast(ElementX), - static_cast(ElementY), - static_cast(ElementZ), - static_cast(pSource->v >> 30) - } } }; + XMVECTORF32 vResult = { { { static_cast(ElementX), + static_cast(ElementY), + static_cast(ElementZ), + static_cast(pSource->v >> 30) } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) uint32x4_t vInt = vld1q_dup_u32(reinterpret_cast(pSource)); - vInt = vandq_u32(vInt, g_XMMaskDec4); - float32x4_t R = vcvtq_f32_u32(vInt); + vInt = vandq_u32(vInt, g_XMMaskDec4); + float32x4_t R = vcvtq_f32_u32(vInt); return vmulq_f32(R, g_XMMulDec4); #elif defined(_XM_SSE_INTRINSICS_) // Splat the color in all four entries @@ -1764,12 +1686,11 @@ inline XMVECTOR XM_CALLCONV XMLoadUDec4(const XMUDEC4* pSource) noexcept #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #endif -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadDecN4(const XMDECN4* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadDecN4(const XMDECN4* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) - static const uint32_t SignExtend[] = { 0x00000000, 0xFFFFFC00 }; + static const uint32_t SignExtend[] = { 0x00000000, 0xFFFFFC00 }; static const uint32_t SignExtendW[] = { 0x00000000, 0xFFFFFFFC }; uint32_t ElementX = pSource->v & 0x3FF; @@ -1777,24 +1698,25 @@ inline XMVECTOR XM_CALLCONV XMLoadDecN4(const XMDECN4* pSource) noexcept uint32_t ElementZ = (pSource->v >> 20) & 0x3FF; uint32_t ElementW = pSource->v >> 30; - XMVECTORF32 vResult = { { { - (ElementX == 0x200) ? -1.f : (static_cast(static_cast(ElementX | SignExtend[ElementX >> 9])) / 511.0f), + XMVECTORF32 vResult + = { { { (ElementX == 0x200) ? -1.f : (static_cast(static_cast(ElementX | SignExtend[ElementX >> 9])) / 511.0f), (ElementY == 0x200) ? -1.f : (static_cast(static_cast(ElementY | SignExtend[ElementY >> 9])) / 511.0f), (ElementZ == 0x200) ? -1.f : (static_cast(static_cast(ElementZ | SignExtend[ElementZ >> 9])) / 511.0f), - (ElementW == 0x2) ? -1.f : static_cast(static_cast(ElementW | SignExtendW[(ElementW >> 1) & 1])) - } } }; + (ElementW == 0x2) ? -1.f : static_cast(static_cast(ElementW | SignExtendW[(ElementW >> 1) & 1])) } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 DecN4Mul = { { { 1.0f / 511.0f, 1.0f / (511.0f * 1024.0f), 1.0f / (511.0f * 1024.0f * 1024.0f), 1.0f / (1024.0f * 1024.0f * 1024.0f) } } }; + static const XMVECTORF32 DecN4Mul + = { { { 1.0f / 511.0f, 1.0f / (511.0f * 1024.0f), 1.0f / (511.0f * 1024.0f * 1024.0f), 1.0f / (1024.0f * 1024.0f * 1024.0f) } } }; uint32x4_t vInt = vld1q_dup_u32(reinterpret_cast(pSource)); - vInt = vandq_u32(vInt, g_XMMaskDec4); - vInt = veorq_u32(vInt, g_XMXorDec4); - float32x4_t R = vcvtq_f32_s32(vreinterpretq_s32_u32(vInt)); - R = vaddq_f32(R, g_XMAddDec4); - R = vmulq_f32(R, DecN4Mul); + vInt = vandq_u32(vInt, g_XMMaskDec4); + vInt = veorq_u32(vInt, g_XMXorDec4); + float32x4_t R = vcvtq_f32_s32(vreinterpretq_s32_u32(vInt)); + R = vaddq_f32(R, g_XMAddDec4); + R = vmulq_f32(R, DecN4Mul); return vmaxq_f32(R, vdupq_n_f32(-1.0f)); #elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 DecN4Mul = { { { 1.0f / 511.0f, 1.0f / (511.0f * 1024.0f), 1.0f / (511.0f * 1024.0f * 1024.0f), 1.0f / (1024.0f * 1024.0f * 1024.0f) } } }; + static const XMVECTORF32 DecN4Mul + = { { { 1.0f / 511.0f, 1.0f / (511.0f * 1024.0f), 1.0f / (511.0f * 1024.0f * 1024.0f), 1.0f / (1024.0f * 1024.0f * 1024.0f) } } }; // Splat the color in all four entries XMVECTOR vTemp = _mm_load_ps1(reinterpret_cast(&pSource->v)); // Shift R&0xFF0000, G&0xFF00, B&0xFF, A&0xFF000000 @@ -1813,12 +1735,11 @@ inline XMVECTOR XM_CALLCONV XMLoadDecN4(const XMDECN4* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadDec4(const XMDEC4* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadDec4(const XMDEC4* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) - static const uint32_t SignExtend[] = { 0x00000000, 0xFFFFFC00 }; + static const uint32_t SignExtend[] = { 0x00000000, 0xFFFFFC00 }; static const uint32_t SignExtendW[] = { 0x00000000, 0xFFFFFFFC }; uint32_t ElementX = pSource->v & 0x3FF; @@ -1826,19 +1747,17 @@ inline XMVECTOR XM_CALLCONV XMLoadDec4(const XMDEC4* pSource) noexcept uint32_t ElementZ = (pSource->v >> 20) & 0x3FF; uint32_t ElementW = pSource->v >> 30; - XMVECTORF32 vResult = { { { - static_cast(static_cast(ElementX | SignExtend[ElementX >> 9])), - static_cast(static_cast(ElementY | SignExtend[ElementY >> 9])), - static_cast(static_cast(ElementZ | SignExtend[ElementZ >> 9])), - static_cast(static_cast(ElementW | SignExtendW[ElementW >> 1])) - } } }; + XMVECTORF32 vResult = { { { static_cast(static_cast(ElementX | SignExtend[ElementX >> 9])), + static_cast(static_cast(ElementY | SignExtend[ElementY >> 9])), + static_cast(static_cast(ElementZ | SignExtend[ElementZ >> 9])), + static_cast(static_cast(ElementW | SignExtendW[ElementW >> 1])) } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) uint32x4_t vInt = vld1q_dup_u32(reinterpret_cast(pSource)); - vInt = vandq_u32(vInt, g_XMMaskDec4); - vInt = veorq_u32(vInt, g_XMXorDec4); - float32x4_t R = vcvtq_f32_s32(vreinterpretq_s32_u32(vInt)); - R = vaddq_f32(R, g_XMAddDec4); + vInt = vandq_u32(vInt, g_XMMaskDec4); + vInt = veorq_u32(vInt, g_XMXorDec4); + float32x4_t R = vcvtq_f32_s32(vreinterpretq_s32_u32(vInt)); + R = vaddq_f32(R, g_XMAddDec4); return vmulq_f32(R, g_XMMulDec4); #elif defined(_XM_SSE_INTRINSICS_) // Splat the color in all four entries @@ -1868,26 +1787,24 @@ inline XMVECTOR XM_CALLCONV XMLoadDec4(const XMDEC4* pSource) noexcept #endif //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUByteN4(const XMUBYTEN4* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadUByteN4(const XMUBYTEN4* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - static_cast(pSource->x) / 255.0f, - static_cast(pSource->y) / 255.0f, - static_cast(pSource->z) / 255.0f, - static_cast(pSource->w) / 255.0f - } } }; + XMVECTORF32 vResult = { { { static_cast(pSource->x) / 255.0f, + static_cast(pSource->y) / 255.0f, + static_cast(pSource->z) / 255.0f, + static_cast(pSource->w) / 255.0f } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t vInt8 = vld1_dup_u32(reinterpret_cast(pSource)); - uint16x8_t vInt16 = vmovl_u8(vreinterpret_u8_u32(vInt8)); - uint32x4_t vInt = vmovl_u16(vget_low_u16(vInt16)); - float32x4_t R = vcvtq_f32_u32(vInt); + uint32x2_t vInt8 = vld1_dup_u32(reinterpret_cast(pSource)); + uint16x8_t vInt16 = vmovl_u8(vreinterpret_u8_u32(vInt8)); + uint32x4_t vInt = vmovl_u16(vget_low_u16(vInt16)); + float32x4_t R = vcvtq_f32_u32(vInt); return vmulq_n_f32(R, 1.0f / 255.0f); #elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 LoadUByteN4Mul = { { { 1.0f / 255.0f, 1.0f / (255.0f * 256.0f), 1.0f / (255.0f * 65536.0f), 1.0f / (255.0f * 65536.0f * 256.0f) } } }; + static const XMVECTORF32 LoadUByteN4Mul + = { { { 1.0f / 255.0f, 1.0f / (255.0f * 256.0f), 1.0f / (255.0f * 65536.0f), 1.0f / (255.0f * 65536.0f * 256.0f) } } }; // Splat the color in all four entries (x,z,y,w) XMVECTOR vTemp = _mm_load1_ps(reinterpret_cast(&pSource->x)); // Mask x&0ff,y&0xff00,z&0xff0000,w&0xff000000 @@ -1905,22 +1822,19 @@ inline XMVECTOR XM_CALLCONV XMLoadUByteN4(const XMUBYTEN4* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUByte4(const XMUBYTE4* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadUByte4(const XMUBYTE4* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - static_cast(pSource->x), - static_cast(pSource->y), - static_cast(pSource->z), - static_cast(pSource->w) - } } }; + XMVECTORF32 vResult = { { { static_cast(pSource->x), + static_cast(pSource->y), + static_cast(pSource->z), + static_cast(pSource->w) } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t vInt8 = vld1_dup_u32(reinterpret_cast(pSource)); + uint32x2_t vInt8 = vld1_dup_u32(reinterpret_cast(pSource)); uint16x8_t vInt16 = vmovl_u8(vreinterpret_u8_u32(vInt8)); - uint32x4_t vInt = vmovl_u16(vget_low_u16(vInt16)); + uint32x4_t vInt = vmovl_u16(vget_low_u16(vInt16)); return vcvtq_f32_u32(vInt); #elif defined(_XM_SSE_INTRINSICS_) static const XMVECTORF32 LoadUByte4Mul = { { { 1.0f, 1.0f / 256.0f, 1.0f / 65536.0f, 1.0f / (65536.0f * 256.0f) } } }; @@ -1941,27 +1855,25 @@ inline XMVECTOR XM_CALLCONV XMLoadUByte4(const XMUBYTE4* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadByteN4(const XMBYTEN4* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadByteN4(const XMBYTEN4* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - (pSource->x == -128) ? -1.f : (static_cast(pSource->x) / 127.0f), - (pSource->y == -128) ? -1.f : (static_cast(pSource->y) / 127.0f), - (pSource->z == -128) ? -1.f : (static_cast(pSource->z) / 127.0f), - (pSource->w == -128) ? -1.f : (static_cast(pSource->w) / 127.0f) - } } }; + XMVECTORF32 vResult = { { { (pSource->x == -128) ? -1.f : (static_cast(pSource->x) / 127.0f), + (pSource->y == -128) ? -1.f : (static_cast(pSource->y) / 127.0f), + (pSource->z == -128) ? -1.f : (static_cast(pSource->z) / 127.0f), + (pSource->w == -128) ? -1.f : (static_cast(pSource->w) / 127.0f) } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t vInt8 = vld1_dup_u32(reinterpret_cast(pSource)); - int16x8_t vInt16 = vmovl_s8(vreinterpret_s8_u32(vInt8)); - int32x4_t vInt = vmovl_s16(vget_low_s16(vInt16)); - float32x4_t R = vcvtq_f32_s32(vInt); - R = vmulq_n_f32(R, 1.0f / 127.0f); + uint32x2_t vInt8 = vld1_dup_u32(reinterpret_cast(pSource)); + int16x8_t vInt16 = vmovl_s8(vreinterpret_s8_u32(vInt8)); + int32x4_t vInt = vmovl_s16(vget_low_s16(vInt16)); + float32x4_t R = vcvtq_f32_s32(vInt); + R = vmulq_n_f32(R, 1.0f / 127.0f); return vmaxq_f32(R, vdupq_n_f32(-1.f)); #elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 LoadByteN4Mul = { { { 1.0f / 127.0f, 1.0f / (127.0f * 256.0f), 1.0f / (127.0f * 65536.0f), 1.0f / (127.0f * 65536.0f * 256.0f) } } }; + static const XMVECTORF32 LoadByteN4Mul + = { { { 1.0f / 127.0f, 1.0f / (127.0f * 256.0f), 1.0f / (127.0f * 65536.0f), 1.0f / (127.0f * 65536.0f * 256.0f) } } }; // Splat the color in all four entries (x,z,y,w) XMVECTOR vTemp = _mm_load1_ps(reinterpret_cast(&pSource->x)); // Mask x&0ff,y&0xff00,z&0xff0000,w&0xff000000 @@ -1980,22 +1892,19 @@ inline XMVECTOR XM_CALLCONV XMLoadByteN4(const XMBYTEN4* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadByte4(const XMBYTE4* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadByte4(const XMBYTE4* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - static_cast(pSource->x), - static_cast(pSource->y), - static_cast(pSource->z), - static_cast(pSource->w) - } } }; + XMVECTORF32 vResult = { { { static_cast(pSource->x), + static_cast(pSource->y), + static_cast(pSource->z), + static_cast(pSource->w) } } }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t vInt8 = vld1_dup_u32(reinterpret_cast(pSource)); - int16x8_t vInt16 = vmovl_s8(vreinterpret_s8_u32(vInt8)); - int32x4_t vInt = vmovl_s16(vget_low_s16(vInt16)); + uint32x2_t vInt8 = vld1_dup_u32(reinterpret_cast(pSource)); + int16x8_t vInt16 = vmovl_s8(vreinterpret_s8_u32(vInt8)); + int32x4_t vInt = vmovl_s16(vget_low_s16(vInt16)); return vcvtq_f32_s32(vInt); #elif defined(_XM_SSE_INTRINSICS_) static const XMVECTORF32 LoadByte4Mul = { { { 1.0f, 1.0f / 256.0f, 1.0f / 65536.0f, 1.0f / (65536.0f * 256.0f) } } }; @@ -2016,31 +1925,27 @@ inline XMVECTOR XM_CALLCONV XMLoadByte4(const XMBYTE4* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUNibble4(const XMUNIBBLE4* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadUNibble4(const XMUNIBBLE4* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - float(pSource->v & 0xF), - float((pSource->v >> 4) & 0xF), - float((pSource->v >> 8) & 0xF), - float((pSource->v >> 12) & 0xF) - } } }; + XMVECTORF32 vResult = { + { { float(pSource->v & 0xF), float((pSource->v >> 4) & 0xF), float((pSource->v >> 8) & 0xF), float((pSource->v >> 12) & 0xF) } } + }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) static const XMVECTORI32 UNibble4And = { { { 0xF, 0xF0, 0xF00, 0xF000 } } }; static const XMVECTORF32 UNibble4Mul = { { { 1.0f, 1.0f / 16.f, 1.0f / 256.f, 1.0f / 4096.f } } }; - uint16x4_t vInt16 = vld1_dup_u16(reinterpret_cast(pSource)); - uint32x4_t vInt = vmovl_u16(vInt16); - vInt = vandq_u32(vInt, UNibble4And); - float32x4_t R = vcvtq_f32_u32(vInt); + uint16x4_t vInt16 = vld1_dup_u16(reinterpret_cast(pSource)); + uint32x4_t vInt = vmovl_u16(vInt16); + vInt = vandq_u32(vInt, UNibble4And); + float32x4_t R = vcvtq_f32_u32(vInt); return vmulq_f32(R, UNibble4Mul); #elif defined(_XM_SSE_INTRINSICS_) static const XMVECTORI32 UNibble4And = { { { 0xF, 0xF0, 0xF00, 0xF000 } } }; static const XMVECTORF32 UNibble4Mul = { { { 1.0f, 1.0f / 16.f, 1.0f / 256.f, 1.0f / 4096.f } } }; // Get the 16 bit value and splat it - __m128i vInt = XM_LOADU_SI16(&pSource->v); + __m128i vInt = XM_LOADU_SI16(&pSource->v); XMVECTOR vResult = XM_PERMUTE_PS(_mm_castsi128_ps(vInt), _MM_SHUFFLE(0, 0, 0, 0)); // Mask off x, y and z vResult = _mm_and_ps(vResult, UNibble4And); @@ -2053,31 +1958,27 @@ inline XMVECTOR XM_CALLCONV XMLoadUNibble4(const XMUNIBBLE4* pSource) noexcept } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadU555(const XMU555* pSource) noexcept +_Use_decl_annotations_ inline XMVECTOR XM_CALLCONV XMLoadU555(const XMU555* pSource) noexcept { assert(pSource); #if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - float(pSource->v & 0x1F), - float((pSource->v >> 5) & 0x1F), - float((pSource->v >> 10) & 0x1F), - float((pSource->v >> 15) & 0x1) - } } }; + XMVECTORF32 vResult = { + { { float(pSource->v & 0x1F), float((pSource->v >> 5) & 0x1F), float((pSource->v >> 10) & 0x1F), float((pSource->v >> 15) & 0x1) } } + }; return vResult.v; #elif defined(_XM_ARM_NEON_INTRINSICS_) static const XMVECTORI32 U555And = { { { 0x1F, 0x1F << 5, 0x1F << 10, 0x8000 } } }; static const XMVECTORF32 U555Mul = { { { 1.0f, 1.0f / 32.f, 1.0f / 1024.f, 1.0f / 32768.f } } }; - uint16x4_t vInt16 = vld1_dup_u16(reinterpret_cast(pSource)); - uint32x4_t vInt = vmovl_u16(vInt16); - vInt = vandq_u32(vInt, U555And); - float32x4_t R = vcvtq_f32_u32(vInt); + uint16x4_t vInt16 = vld1_dup_u16(reinterpret_cast(pSource)); + uint32x4_t vInt = vmovl_u16(vInt16); + vInt = vandq_u32(vInt, U555And); + float32x4_t R = vcvtq_f32_u32(vInt); return vmulq_f32(R, U555Mul); #elif defined(_XM_SSE_INTRINSICS_) static const XMVECTORI32 U555And = { { { 0x1F, 0x1F << 5, 0x1F << 10, 0x8000 } } }; static const XMVECTORF32 U555Mul = { { { 1.0f, 1.0f / 32.f, 1.0f / 1024.f, 1.0f / 32768.f } } }; // Get the 16bit value and splat it - __m128i vInt = XM_LOADU_SI16(&pSource->v); + __m128i vInt = XM_LOADU_SI16(&pSource->v); XMVECTOR vResult = XM_PERMUTE_PS(_mm_castsi128_ps(vInt), _MM_SHUFFLE(0, 0, 0, 0)); // Mask off x, y and z vResult = _mm_and_ps(vResult, U555And); @@ -2098,38 +1999,31 @@ inline XMVECTOR XM_CALLCONV XMLoadU555(const XMU555* pSource) noexcept * Vector and matrix store operations * ****************************************************************************/ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreColor -( - XMCOLOR* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreColor(XMCOLOR* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) XMVECTOR N = XMVectorSaturate(V); - N = XMVectorMultiply(N, g_UByteMax); - N = XMVectorRound(N); + N = XMVectorMultiply(N, g_UByteMax); + N = XMVectorRound(N); XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); - pDestination->c = (static_cast(tmp.w) << 24) | - (static_cast(tmp.x) << 16) | - (static_cast(tmp.y) << 8) | - static_cast(tmp.z); + pDestination->c = (static_cast(tmp.w) << 24) | (static_cast(tmp.x) << 16) | (static_cast(tmp.y) << 8) + | static_cast(tmp.z); #elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0)); - R = vminq_f32(R, vdupq_n_f32(1.0f)); - R = vmulq_n_f32(R, 255.0f); - R = XMVectorRound(R); + float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0)); + R = vminq_f32(R, vdupq_n_f32(1.0f)); + R = vmulq_n_f32(R, 255.0f); + R = XMVectorRound(R); uint32x4_t vInt32 = vcvtq_u32_f32(R); uint16x4_t vInt16 = vqmovn_u32(vInt32); - uint8x8_t vInt8 = vqmovn_u16(vcombine_u16(vInt16, vInt16)); - uint32_t rgba = vget_lane_u32(vreinterpret_u32_u8(vInt8), 0); - pDestination->c = (rgba & 0xFF00FF00) | ((rgba >> 16) & 0xFF) | ((rgba << 16) & 0xFF0000); + uint8x8_t vInt8 = vqmovn_u16(vcombine_u16(vInt16, vInt16)); + uint32_t rgba = vget_lane_u32(vreinterpret_u32_u8(vInt8), 0); + pDestination->c = (rgba & 0xFF00FF00) | ((rgba >> 16) & 0xFF) | ((rgba << 16) & 0xFF0000); #elif defined(_XM_SSE_INTRINSICS_) // Set <0 to 0 XMVECTOR vResult = _mm_max_ps(V, g_XMZero); @@ -2151,12 +2045,7 @@ inline void XM_CALLCONV XMStoreColor } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreHalf2 -( - XMHALF2* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreHalf2(XMHALF2* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) @@ -2169,19 +2058,14 @@ inline void XM_CALLCONV XMStoreHalf2 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreShortN2 -( - XMSHORTN2* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreShortN2(XMSHORTN2* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) XMVECTOR N = XMVectorClamp(V, g_XMNegativeOne.v, g_XMOne.v); - N = XMVectorMultiply(N, g_ShortMax); - N = XMVectorRound(N); + N = XMVectorMultiply(N, g_ShortMax); + N = XMVectorRound(N); XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); @@ -2190,35 +2074,30 @@ inline void XM_CALLCONV XMStoreShortN2 pDestination->y = static_cast(tmp.y); #elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t R = vmaxq_f32(V, vdupq_n_f32(-1.f)); - R = vminq_f32(R, vdupq_n_f32(1.0f)); - R = vmulq_n_f32(R, 32767.0f); + float32x4_t R = vmaxq_f32(V, vdupq_n_f32(-1.f)); + R = vminq_f32(R, vdupq_n_f32(1.0f)); + R = vmulq_n_f32(R, 32767.0f); int32x4_t vInt32 = vcvtq_s32_f32(R); int16x4_t vInt16 = vqmovn_s32(vInt32); vst1_lane_u32(&pDestination->v, vreinterpret_u32_s16(vInt16), 0); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vResult = _mm_max_ps(V, g_XMNegativeOne); - vResult = _mm_min_ps(vResult, g_XMOne); - vResult = _mm_mul_ps(vResult, g_ShortMax); + vResult = _mm_min_ps(vResult, g_XMOne); + vResult = _mm_mul_ps(vResult, g_ShortMax); __m128i vResulti = _mm_cvtps_epi32(vResult); - vResulti = _mm_packs_epi32(vResulti, vResulti); + vResulti = _mm_packs_epi32(vResulti, vResulti); _mm_store_ss(reinterpret_cast(&pDestination->x), _mm_castsi128_ps(vResulti)); #endif } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreShort2 -( - XMSHORT2* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreShort2(XMSHORT2* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) XMVECTOR N = XMVectorClamp(V, g_ShortMin, g_ShortMax); - N = XMVectorRound(N); + N = XMVectorRound(N); XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); @@ -2227,15 +2106,15 @@ inline void XM_CALLCONV XMStoreShort2 pDestination->y = static_cast(tmp.y); #elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t R = vmaxq_f32(V, vdupq_n_f32(-32767.f)); - R = vminq_f32(R, vdupq_n_f32(32767.0f)); + float32x4_t R = vmaxq_f32(V, vdupq_n_f32(-32767.f)); + R = vminq_f32(R, vdupq_n_f32(32767.0f)); int32x4_t vInt32 = vcvtq_s32_f32(R); int16x4_t vInt16 = vqmovn_s32(vInt32); vst1_lane_u32(&pDestination->v, vreinterpret_u32_s16(vInt16), 0); #elif defined(_XM_SSE_INTRINSICS_) // Bounds check XMVECTOR vResult = _mm_max_ps(V, g_ShortMin); - vResult = _mm_min_ps(vResult, g_ShortMax); + vResult = _mm_min_ps(vResult, g_ShortMax); // Convert to int with rounding __m128i vInt = _mm_cvtps_epi32(vResult); // Pack the ints into shorts @@ -2245,19 +2124,14 @@ inline void XM_CALLCONV XMStoreShort2 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUShortN2 -( - XMUSHORTN2* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreUShortN2(XMUSHORTN2* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) XMVECTOR N = XMVectorSaturate(V); - N = XMVectorMultiplyAdd(N, g_UShortMax, g_XMOneHalf.v); - N = XMVectorTruncate(N); + N = XMVectorMultiplyAdd(N, g_UShortMax, g_XMOneHalf.v); + N = XMVectorTruncate(N); XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); @@ -2266,19 +2140,19 @@ inline void XM_CALLCONV XMStoreUShortN2 pDestination->y = static_cast(tmp.y); #elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0.f)); - R = vminq_f32(R, vdupq_n_f32(1.0f)); - R = vmulq_n_f32(R, 65535.0f); - R = vaddq_f32(R, g_XMOneHalf); + float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0.f)); + R = vminq_f32(R, vdupq_n_f32(1.0f)); + R = vmulq_n_f32(R, 65535.0f); + R = vaddq_f32(R, g_XMOneHalf); uint32x4_t vInt32 = vcvtq_u32_f32(R); uint16x4_t vInt16 = vqmovn_u32(vInt32); vst1_lane_u32(&pDestination->v, vreinterpret_u32_u16(vInt16), 0); #elif defined(_XM_SSE_INTRINSICS_) // Bounds check XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - vResult = _mm_min_ps(vResult, g_XMOne); - vResult = _mm_mul_ps(vResult, g_UShortMax); - vResult = _mm_add_ps(vResult, g_XMOneHalf); + vResult = _mm_min_ps(vResult, g_XMOne); + vResult = _mm_mul_ps(vResult, g_UShortMax); + vResult = _mm_add_ps(vResult, g_XMOneHalf); // Convert to int __m128i vInt = _mm_cvttps_epi32(vResult); // Since the SSE pack instruction clamps using signed rules, @@ -2289,18 +2163,13 @@ inline void XM_CALLCONV XMStoreUShortN2 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUShort2 -( - XMUSHORT2* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreUShort2(XMUSHORT2* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) XMVECTOR N = XMVectorClamp(V, XMVectorZero(), g_UShortMax); - N = XMVectorRound(N); + N = XMVectorRound(N); XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); @@ -2309,15 +2178,15 @@ inline void XM_CALLCONV XMStoreUShort2 pDestination->y = static_cast(tmp.y); #elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0.f)); - R = vminq_f32(R, vdupq_n_f32(65535.0f)); + float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0.f)); + R = vminq_f32(R, vdupq_n_f32(65535.0f)); uint32x4_t vInt32 = vcvtq_u32_f32(R); uint16x4_t vInt16 = vqmovn_u32(vInt32); vst1_lane_u32(&pDestination->v, vreinterpret_u32_u16(vInt16), 0); #elif defined(_XM_SSE_INTRINSICS_) // Bounds check XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - vResult = _mm_min_ps(vResult, g_UShortMax); + vResult = _mm_min_ps(vResult, g_UShortMax); // Convert to int with rounding __m128i vInt = _mm_cvtps_epi32(vResult); // Since the SSE pack instruction clamps using signed rules, @@ -2328,19 +2197,14 @@ inline void XM_CALLCONV XMStoreUShort2 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreByteN2 -( - XMBYTEN2* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreByteN2(XMBYTEN2* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) XMVECTOR N = XMVectorClamp(V, g_XMNegativeOne.v, g_XMOne.v); - N = XMVectorMultiply(N, g_ByteMax); - N = XMVectorRound(N); + N = XMVectorMultiply(N, g_ByteMax); + N = XMVectorRound(N); XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); @@ -2349,41 +2213,36 @@ inline void XM_CALLCONV XMStoreByteN2 pDestination->y = static_cast(tmp.y); #elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t R = vmaxq_f32(V, vdupq_n_f32(-1.f)); - R = vminq_f32(R, vdupq_n_f32(1.0f)); - R = vmulq_n_f32(R, 127.0f); + float32x4_t R = vmaxq_f32(V, vdupq_n_f32(-1.f)); + R = vminq_f32(R, vdupq_n_f32(1.0f)); + R = vmulq_n_f32(R, 127.0f); int32x4_t vInt32 = vcvtq_s32_f32(R); int16x4_t vInt16 = vqmovn_s32(vInt32); - int8x8_t vInt8 = vqmovn_s16(vcombine_s16(vInt16, vInt16)); + int8x8_t vInt8 = vqmovn_s16(vcombine_s16(vInt16, vInt16)); vst1_lane_u16(reinterpret_cast(pDestination), vreinterpret_u16_s8(vInt8), 0); #elif defined(_XM_SSE_INTRINSICS_) // Clamp to bounds XMVECTOR vResult = _mm_max_ps(V, g_XMNegativeOne); - vResult = _mm_min_ps(vResult, g_XMOne); + vResult = _mm_min_ps(vResult, g_XMOne); // Scale by multiplication vResult = _mm_mul_ps(vResult, g_ByteMax); // Convert to int by rounding __m128i vInt = _mm_cvtps_epi32(vResult); // No SSE operations will write to 16-bit values, so we have to extract them manually - auto x = static_cast(_mm_extract_epi16(vInt, 0)); - auto y = static_cast(_mm_extract_epi16(vInt, 2)); + auto x = static_cast(_mm_extract_epi16(vInt, 0)); + auto y = static_cast(_mm_extract_epi16(vInt, 2)); pDestination->v = static_cast(((static_cast(y) & 0xFF) << 8) | (static_cast(x) & 0xFF)); #endif } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreByte2 -( - XMBYTE2* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreByte2(XMBYTE2* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) XMVECTOR N = XMVectorClamp(V, g_ByteMin, g_ByteMax); - N = XMVectorRound(N); + N = XMVectorRound(N); XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); @@ -2392,39 +2251,34 @@ inline void XM_CALLCONV XMStoreByte2 pDestination->y = static_cast(tmp.y); #elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t R = vmaxq_f32(V, vdupq_n_f32(-127.f)); - R = vminq_f32(R, vdupq_n_f32(127.0f)); + float32x4_t R = vmaxq_f32(V, vdupq_n_f32(-127.f)); + R = vminq_f32(R, vdupq_n_f32(127.0f)); int32x4_t vInt32 = vcvtq_s32_f32(R); int16x4_t vInt16 = vqmovn_s32(vInt32); - int8x8_t vInt8 = vqmovn_s16(vcombine_s16(vInt16, vInt16)); + int8x8_t vInt8 = vqmovn_s16(vcombine_s16(vInt16, vInt16)); vst1_lane_u16(reinterpret_cast(pDestination), vreinterpret_u16_s8(vInt8), 0); #elif defined(_XM_SSE_INTRINSICS_) // Clamp to bounds XMVECTOR vResult = _mm_max_ps(V, g_ByteMin); - vResult = _mm_min_ps(vResult, g_ByteMax); + vResult = _mm_min_ps(vResult, g_ByteMax); // Convert to int by rounding __m128i vInt = _mm_cvtps_epi32(vResult); // No SSE operations will write to 16-bit values, so we have to extract them manually - auto x = static_cast(_mm_extract_epi16(vInt, 0)); - auto y = static_cast(_mm_extract_epi16(vInt, 2)); + auto x = static_cast(_mm_extract_epi16(vInt, 0)); + auto y = static_cast(_mm_extract_epi16(vInt, 2)); pDestination->v = static_cast(((static_cast(y) & 0xFF) << 8) | (static_cast(x) & 0xFF)); #endif } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUByteN2 -( - XMUBYTEN2* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreUByteN2(XMUBYTEN2* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) XMVECTOR N = XMVectorSaturate(V); - N = XMVectorMultiplyAdd(N, g_UByteMax, g_XMOneHalf.v); - N = XMVectorTruncate(N); + N = XMVectorMultiplyAdd(N, g_UByteMax, g_XMOneHalf.v); + N = XMVectorTruncate(N); XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); @@ -2433,43 +2287,38 @@ inline void XM_CALLCONV XMStoreUByteN2 pDestination->y = static_cast(tmp.y); #elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0.f)); - R = vminq_f32(R, vdupq_n_f32(1.0f)); - R = vmulq_n_f32(R, 255.0f); - R = vaddq_f32(R, g_XMOneHalf); + float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0.f)); + R = vminq_f32(R, vdupq_n_f32(1.0f)); + R = vmulq_n_f32(R, 255.0f); + R = vaddq_f32(R, g_XMOneHalf); uint32x4_t vInt32 = vcvtq_u32_f32(R); uint16x4_t vInt16 = vqmovn_u32(vInt32); - uint8x8_t vInt8 = vqmovn_u16(vcombine_u16(vInt16, vInt16)); + uint8x8_t vInt8 = vqmovn_u16(vcombine_u16(vInt16, vInt16)); vst1_lane_u16(reinterpret_cast(pDestination), vreinterpret_u16_u8(vInt8), 0); #elif defined(_XM_SSE_INTRINSICS_) // Clamp to bounds XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - vResult = _mm_min_ps(vResult, g_XMOne); + vResult = _mm_min_ps(vResult, g_XMOne); // Scale by multiplication vResult = _mm_mul_ps(vResult, g_UByteMax); vResult = _mm_add_ps(vResult, g_XMOneHalf); // Convert to int __m128i vInt = _mm_cvttps_epi32(vResult); // No SSE operations will write to 16-bit values, so we have to extract them manually - auto x = static_cast(_mm_extract_epi16(vInt, 0)); - auto y = static_cast(_mm_extract_epi16(vInt, 2)); + auto x = static_cast(_mm_extract_epi16(vInt, 0)); + auto y = static_cast(_mm_extract_epi16(vInt, 2)); pDestination->v = static_cast(((static_cast(y) & 0xFF) << 8) | (static_cast(x) & 0xFF)); #endif } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUByte2 -( - XMUBYTE2* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreUByte2(XMUBYTE2* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) XMVECTOR N = XMVectorClamp(V, XMVectorZero(), g_UByteMax); - N = XMVectorRound(N); + N = XMVectorRound(N); XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); @@ -2478,85 +2327,71 @@ inline void XM_CALLCONV XMStoreUByte2 pDestination->y = static_cast(tmp.y); #elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0.f)); - R = vminq_f32(R, vdupq_n_f32(255.0f)); + float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0.f)); + R = vminq_f32(R, vdupq_n_f32(255.0f)); uint32x4_t vInt32 = vcvtq_u32_f32(R); uint16x4_t vInt16 = vqmovn_u32(vInt32); - uint8x8_t vInt8 = vqmovn_u16(vcombine_u16(vInt16, vInt16)); + uint8x8_t vInt8 = vqmovn_u16(vcombine_u16(vInt16, vInt16)); vst1_lane_u16(reinterpret_cast(pDestination), vreinterpret_u16_u8(vInt8), 0); #elif defined(_XM_SSE_INTRINSICS_) // Clamp to bounds XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - vResult = _mm_min_ps(vResult, g_UByteMax); + vResult = _mm_min_ps(vResult, g_UByteMax); // Convert to int by rounding __m128i vInt = _mm_cvtps_epi32(vResult); // No SSE operations will write to 16-bit values, so we have to extract them manually - auto x = static_cast(_mm_extract_epi16(vInt, 0)); - auto y = static_cast(_mm_extract_epi16(vInt, 2)); + auto x = static_cast(_mm_extract_epi16(vInt, 0)); + auto y = static_cast(_mm_extract_epi16(vInt, 2)); pDestination->v = static_cast(((static_cast(y) & 0xFF) << 8) | (static_cast(x) & 0xFF)); #endif } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreU565 -( - XMU565* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreU565(XMU565* pDestination, FXMVECTOR V) noexcept { assert(pDestination); static const XMVECTORF32 Max = { { { 31.0f, 63.0f, 31.0f, 0.0f } } }; #if defined(_XM_NO_INTRINSICS_) XMVECTOR N = XMVectorClamp(V, XMVectorZero(), Max.v); - N = XMVectorRound(N); + N = XMVectorRound(N); XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); pDestination->v = static_cast( - ((static_cast(tmp.z) & 0x1F) << 11) - | ((static_cast(tmp.y) & 0x3F) << 5) - | ((static_cast(tmp.x) & 0x1F))); + ((static_cast(tmp.z) & 0x1F) << 11) | ((static_cast(tmp.y) & 0x3F) << 5) | ((static_cast(tmp.x) & 0x1F))); #elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 1.0f, 32.f, 32.f * 64.f, 0.f } } }; - static const XMVECTORU32 Mask = { { { 0x1F, 0x3F << 5, 0x1F << 11, 0 } } }; - float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0)); - vResult = vminq_f32(vResult, Max); - vResult = vmulq_f32(vResult, Scale); - uint32x4_t vResulti = vcvtq_u32_f32(vResult); - vResulti = vandq_u32(vResulti, Mask); + static const XMVECTORF32 Scale = { { { 1.0f, 32.f, 32.f * 64.f, 0.f } } }; + static const XMVECTORU32 Mask = { { { 0x1F, 0x3F << 5, 0x1F << 11, 0 } } }; + float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0)); + vResult = vminq_f32(vResult, Max); + vResult = vmulq_f32(vResult, Scale); + uint32x4_t vResulti = vcvtq_u32_f32(vResult); + vResulti = vandq_u32(vResulti, Mask); // Do a horizontal or of 4 entries uint32x2_t vTemp = vget_low_u32(vResulti); - uint32x2_t vhi = vget_high_u32(vResulti); - vTemp = vorr_u32(vTemp, vhi); - vTemp = vpadd_u32(vTemp, vTemp); + uint32x2_t vhi = vget_high_u32(vResulti); + vTemp = vorr_u32(vTemp, vhi); + vTemp = vpadd_u32(vTemp, vTemp); vst1_lane_u16(&pDestination->v, vreinterpret_u16_u32(vTemp), 0); #elif defined(_XM_SSE_INTRINSICS_) // Bounds check XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - vResult = _mm_min_ps(vResult, Max); + vResult = _mm_min_ps(vResult, Max); // Convert to int with rounding __m128i vInt = _mm_cvtps_epi32(vResult); // No SSE operations will write to 16-bit values, so we have to extract them manually - auto x = static_cast(_mm_extract_epi16(vInt, 0)); - auto y = static_cast(_mm_extract_epi16(vInt, 2)); - auto z = static_cast(_mm_extract_epi16(vInt, 4)); + auto x = static_cast(_mm_extract_epi16(vInt, 0)); + auto y = static_cast(_mm_extract_epi16(vInt, 2)); + auto z = static_cast(_mm_extract_epi16(vInt, 4)); pDestination->v = static_cast( - ((static_cast(z) & 0x1F) << 11) - | ((static_cast(y) & 0x3F) << 5) - | ((static_cast(x) & 0x1F))); + ((static_cast(z) & 0x1F) << 11) | ((static_cast(y) & 0x3F) << 5) | ((static_cast(x) & 0x1F))); #endif } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat3PK -( - XMFLOAT3PK* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreFloat3PK(XMFLOAT3PK* pDestination, FXMVECTOR V) noexcept { assert(pDestination); @@ -2569,7 +2404,7 @@ inline void XM_CALLCONV XMStoreFloat3PK for (uint32_t j = 0; j < 2; ++j) { uint32_t Sign = IValue[j] & 0x80000000; - uint32_t I = IValue[j] & 0x7FFFFFFF; + uint32_t I = IValue[j] & 0x7FFFFFFF; if ((I & 0x7F800000) == 0x7F800000) { @@ -2602,7 +2437,7 @@ inline void XM_CALLCONV XMStoreFloat3PK // The number is too small to be represented as a normalized float11 // Convert it to a denormalized value. uint32_t Shift = 113U - (I >> 23U); - I = (0x800000U | (I & 0x7FFFFFU)) >> Shift; + I = (0x800000U | (I & 0x7FFFFFU)) >> Shift; } else { @@ -2616,7 +2451,7 @@ inline void XM_CALLCONV XMStoreFloat3PK // Z Channel (5-bit exponent, 5-bit mantissa) uint32_t Sign = IValue[2] & 0x80000000; - uint32_t I = IValue[2] & 0x7FFFFFFF; + uint32_t I = IValue[2] & 0x7FFFFFFF; if ((I & 0x7F800000) == 0x7F800000) { @@ -2649,7 +2484,7 @@ inline void XM_CALLCONV XMStoreFloat3PK // The number is too small to be represented as a normalized float10 // Convert it to a denormalized value. uint32_t Shift = 113U - (I >> 23U); - I = (0x800000U | (I & 0x7FFFFFU)) >> Shift; + I = (0x800000U | (I & 0x7FFFFFU)) >> Shift; } else { @@ -2661,18 +2496,11 @@ inline void XM_CALLCONV XMStoreFloat3PK } // Pack Result into memory - pDestination->v = (Result[0] & 0x7ff) - | ((Result[1] & 0x7ff) << 11) - | ((Result[2] & 0x3ff) << 22); + pDestination->v = (Result[0] & 0x7ff) | ((Result[1] & 0x7ff) << 11) | ((Result[2] & 0x3ff) << 22); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat3SE -( - XMFLOAT3SE* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreFloat3SE(XMFLOAT3SE* pDestination, FXMVECTOR V) noexcept { assert(pDestination); @@ -2688,19 +2516,23 @@ inline void XM_CALLCONV XMStoreFloat3SE float y = (tmp.y >= 0.f) ? ((tmp.y > maxf9) ? maxf9 : tmp.y) : 0.f; float z = (tmp.z >= 0.f) ? ((tmp.z > maxf9) ? maxf9 : tmp.z) : 0.f; - const float max_xy = (x > y) ? x : y; + const float max_xy = (x > y) ? x : y; const float max_xyz = (max_xy > z) ? max_xy : z; const float maxColor = (max_xyz > minf9) ? max_xyz : minf9; - union { float f; int32_t i; } fi; + union + { + float f; + int32_t i; + } fi; fi.f = maxColor; fi.i += 0x00004000; // round up leaving 9 bits in fraction (including assumed 1) - auto exp = static_cast(fi.i) >> 23; + auto exp = static_cast(fi.i) >> 23; pDestination->e = exp - 0x6f; - fi.i = static_cast(0x83000000 - (exp << 23)); + fi.i = static_cast(0x83000000 - (exp << 23)); float ScaleR = fi.f; pDestination->xm = static_cast(MathInternal::round_to_nearest(x * ScaleR)); @@ -2710,39 +2542,44 @@ inline void XM_CALLCONV XMStoreFloat3SE #elif defined(_XM_ARM_NEON_INTRINSICS_) static const XMVECTORF32 MaxFloat9 = { { { float(0x1FF << 7), float(0x1FF << 7), float(0x1FF << 7), float(0x1FF << 7) } } }; - static constexpr float minf9 = float(1.f / (1 << 16)); + static constexpr float minf9 = float(1.f / (1 << 16)); // Clamp to [0, maxf9] then zero w lane float32x4_t clamped = vminq_f32(vmaxq_f32(V, vdupq_n_f32(0)), MaxFloat9); - clamped = vsetq_lane_f32(0.0f, clamped, 3); + clamped = vsetq_lane_f32(0.0f, clamped, 3); // Horizontal max of xyz for shared exponent #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ float maxVal = vmaxvq_f32(clamped); #else - float32x2_t vlow = vget_low_f32(clamped); - float32x2_t vhigh = vget_high_f32(clamped); + float32x2_t vlow = vget_low_f32(clamped); + float32x2_t vhigh = vget_high_f32(clamped); float32x2_t maxPair = vpmax_f32(vlow, vhigh); - maxPair = vpmax_f32(maxPair, maxPair); - float maxVal = vget_lane_f32(maxPair, 0); + maxPair = vpmax_f32(maxPair, maxPair); + float maxVal = vget_lane_f32(maxPair, 0); #endif - if (maxVal < minf9) maxVal = minf9; + if (maxVal < minf9) + maxVal = minf9; // Compute shared exponent (inherently scalar) - union { float f; int32_t i; } fi; + union + { + float f; + int32_t i; + } fi; fi.f = maxVal; fi.i += 0x00004000; // round up leaving 9 bits in fraction (including assumed 1) auto exp = static_cast(fi.i) >> 23; - fi.i = static_cast(0x83000000 - (exp << 23)); + fi.i = static_cast(0x83000000 - (exp << 23)); // Scale all channels and convert to integer float32x4_t scaled = vmulq_n_f32(clamped, fi.f); #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ uint32x4_t ints = vcvtnq_u32_f32(scaled); #else - scaled = vaddq_f32(scaled, vdupq_n_f32(0.5f)); + scaled = vaddq_f32(scaled, vdupq_n_f32(0.5f)); uint32x4_t ints = vcvtq_u32_f32(scaled); #endif @@ -2750,38 +2587,42 @@ inline void XM_CALLCONV XMStoreFloat3SE pDestination->xm = vgetq_lane_u32(ints, 0) & 0x1FF; pDestination->ym = vgetq_lane_u32(ints, 1) & 0x1FF; pDestination->zm = vgetq_lane_u32(ints, 2) & 0x1FF; - pDestination->e = exp - 0x6f; + pDestination->e = exp - 0x6f; #elif defined(_XM_SSE_INTRINSICS_) static const XMVECTORF32 MaxFloat9 = { { { float(0x1FF << 7), float(0x1FF << 7), float(0x1FF << 7), float(0x1FF << 7) } } }; - static constexpr float minf9 = float(1.f / (1 << 16)); + static constexpr float minf9 = float(1.f / (1 << 16)); // Clamp to [0, maxf9] then mask w to zero __m128 clamped = _mm_min_ps(_mm_max_ps(V, _mm_setzero_ps()), MaxFloat9); - clamped = _mm_and_ps(clamped, g_XMMask3); + clamped = _mm_and_ps(clamped, g_XMMask3); // Horizontal max of xyz for shared exponent __m128 maxV = clamped; __m128 temp = XM_PERMUTE_PS(maxV, _MM_SHUFFLE(1, 1, 1, 1)); - maxV = _mm_max_ps(maxV, temp); - temp = XM_PERMUTE_PS(clamped, _MM_SHUFFLE(2, 2, 2, 2)); - maxV = _mm_max_ps(maxV, temp); + maxV = _mm_max_ps(maxV, temp); + temp = XM_PERMUTE_PS(clamped, _MM_SHUFFLE(2, 2, 2, 2)); + maxV = _mm_max_ps(maxV, temp); // Ensure minimum threshold maxV = _mm_max_ss(maxV, _mm_set_ss(minf9)); // Compute shared exponent (inherently scalar) - union { float f; int32_t i; } fi; + union + { + float f; + int32_t i; + } fi; _mm_store_ss(&fi.f, maxV); fi.i += 0x00004000; // round up leaving 9 bits in fraction (including assumed 1) auto exp = static_cast(fi.i) >> 23; - fi.i = static_cast(0x83000000 - (exp << 23)); + fi.i = static_cast(0x83000000 - (exp << 23)); // Scale all channels and round to nearest integer - __m128 scaled = _mm_mul_ps(clamped, _mm_set1_ps(fi.f)); - __m128i ints = _mm_cvtps_epi32(scaled); + __m128 scaled = _mm_mul_ps(clamped, _mm_set1_ps(fi.f)); + __m128i ints = _mm_cvtps_epi32(scaled); // Extract and pack into bitfields XM_ALIGNED_DATA(16) uint32_t ivals[4]; @@ -2790,17 +2631,12 @@ inline void XM_CALLCONV XMStoreFloat3SE pDestination->xm = ivals[0] & 0x1FF; pDestination->ym = ivals[1] & 0x1FF; pDestination->zm = ivals[2] & 0x1FF; - pDestination->e = exp - 0x6f; + pDestination->e = exp - 0x6f; #endif } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreHalf4 -( - XMHALF4* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreHalf4(XMHALF4* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) @@ -2818,19 +2654,14 @@ inline void XM_CALLCONV XMStoreHalf4 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreShortN4 -( - XMSHORTN4* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreShortN4(XMSHORTN4* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) XMVECTOR N = XMVectorClamp(V, g_XMNegativeOne.v, g_XMOne.v); - N = XMVectorMultiply(N, g_ShortMax); - N = XMVectorRound(N); + N = XMVectorMultiply(N, g_ShortMax); + N = XMVectorRound(N); XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); @@ -2842,33 +2673,28 @@ inline void XM_CALLCONV XMStoreShortN4 #elif defined(_XM_ARM_NEON_INTRINSICS_) float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(-1.f)); - vResult = vminq_f32(vResult, vdupq_n_f32(1.0f)); - vResult = vmulq_n_f32(vResult, 32767.0f); - int16x4_t vInt = vmovn_s32(vcvtq_s32_f32(vResult)); + vResult = vminq_f32(vResult, vdupq_n_f32(1.0f)); + vResult = vmulq_n_f32(vResult, 32767.0f); + int16x4_t vInt = vmovn_s32(vcvtq_s32_f32(vResult)); vst1_s16(reinterpret_cast(pDestination), vInt); #elif defined(_XM_SSE_INTRINSICS_) XMVECTOR vResult = _mm_max_ps(V, g_XMNegativeOne); - vResult = _mm_min_ps(vResult, g_XMOne); - vResult = _mm_mul_ps(vResult, g_ShortMax); + vResult = _mm_min_ps(vResult, g_XMOne); + vResult = _mm_mul_ps(vResult, g_ShortMax); __m128i vResulti = _mm_cvtps_epi32(vResult); - vResulti = _mm_packs_epi32(vResulti, vResulti); + vResulti = _mm_packs_epi32(vResulti, vResulti); _mm_store_sd(reinterpret_cast(&pDestination->x), _mm_castsi128_pd(vResulti)); #endif } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreShort4 -( - XMSHORT4* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreShort4(XMSHORT4* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) XMVECTOR N = XMVectorClamp(V, g_ShortMin, g_ShortMax); - N = XMVectorRound(N); + N = XMVectorRound(N); XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); @@ -2880,13 +2706,13 @@ inline void XM_CALLCONV XMStoreShort4 #elif defined(_XM_ARM_NEON_INTRINSICS_) float32x4_t vResult = vmaxq_f32(V, g_ShortMin); - vResult = vminq_f32(vResult, g_ShortMax); - int16x4_t vInt = vmovn_s32(vcvtq_s32_f32(vResult)); + vResult = vminq_f32(vResult, g_ShortMax); + int16x4_t vInt = vmovn_s32(vcvtq_s32_f32(vResult)); vst1_s16(reinterpret_cast(pDestination), vInt); #elif defined(_XM_SSE_INTRINSICS_) // Bounds check XMVECTOR vResult = _mm_max_ps(V, g_ShortMin); - vResult = _mm_min_ps(vResult, g_ShortMax); + vResult = _mm_min_ps(vResult, g_ShortMax); // Convert to int with rounding __m128i vInt = _mm_cvtps_epi32(vResult); // Pack the ints into shorts @@ -2896,19 +2722,14 @@ inline void XM_CALLCONV XMStoreShort4 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUShortN4 -( - XMUSHORTN4* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreUShortN4(XMUSHORTN4* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) XMVECTOR N = XMVectorSaturate(V); - N = XMVectorMultiplyAdd(N, g_UShortMax, g_XMOneHalf.v); - N = XMVectorTruncate(N); + N = XMVectorMultiplyAdd(N, g_UShortMax, g_XMOneHalf.v); + N = XMVectorTruncate(N); XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); @@ -2920,17 +2741,17 @@ inline void XM_CALLCONV XMStoreUShortN4 #elif defined(_XM_ARM_NEON_INTRINSICS_) float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0)); - vResult = vminq_f32(vResult, vdupq_n_f32(1.0f)); - vResult = vmulq_n_f32(vResult, 65535.0f); - vResult = vaddq_f32(vResult, g_XMOneHalf); - uint16x4_t vInt = vmovn_u32(vcvtq_u32_f32(vResult)); + vResult = vminq_f32(vResult, vdupq_n_f32(1.0f)); + vResult = vmulq_n_f32(vResult, 65535.0f); + vResult = vaddq_f32(vResult, g_XMOneHalf); + uint16x4_t vInt = vmovn_u32(vcvtq_u32_f32(vResult)); vst1_u16(reinterpret_cast(pDestination), vInt); #elif defined(_XM_SSE_INTRINSICS_) // Bounds check XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - vResult = _mm_min_ps(vResult, g_XMOne); - vResult = _mm_mul_ps(vResult, g_UShortMax); - vResult = _mm_add_ps(vResult, g_XMOneHalf); + vResult = _mm_min_ps(vResult, g_XMOne); + vResult = _mm_mul_ps(vResult, g_UShortMax); + vResult = _mm_add_ps(vResult, g_XMOneHalf); // Convert to int __m128i vInt = _mm_cvttps_epi32(vResult); // Since the SSE pack instruction clamps using signed rules, @@ -2943,18 +2764,13 @@ inline void XM_CALLCONV XMStoreUShortN4 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUShort4 -( - XMUSHORT4* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreUShort4(XMUSHORT4* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) XMVECTOR N = XMVectorClamp(V, XMVectorZero(), g_UShortMax); - N = XMVectorRound(N); + N = XMVectorRound(N); XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); @@ -2966,13 +2782,13 @@ inline void XM_CALLCONV XMStoreUShort4 #elif defined(_XM_ARM_NEON_INTRINSICS_) float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0)); - vResult = vminq_f32(vResult, g_UShortMax); - uint16x4_t vInt = vmovn_u32(vcvtq_u32_f32(vResult)); + vResult = vminq_f32(vResult, g_UShortMax); + uint16x4_t vInt = vmovn_u32(vcvtq_u32_f32(vResult)); vst1_u16(reinterpret_cast(pDestination), vInt); #elif defined(_XM_SSE_INTRINSICS_) // Bounds check XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - vResult = _mm_min_ps(vResult, g_UShortMax); + vResult = _mm_min_ps(vResult, g_UShortMax); // Convert to int with rounding __m128i vInt = _mm_cvtps_epi32(vResult); // Since the SSE pack instruction clamps using signed rules, @@ -2985,54 +2801,46 @@ inline void XM_CALLCONV XMStoreUShort4 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreXDecN4 -( - XMXDECN4* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreXDecN4(XMXDECN4* pDestination, FXMVECTOR V) noexcept { assert(pDestination); static const XMVECTORF32 Min = { { { -1.0f, -1.0f, -1.0f, 0.0f } } }; #if defined(_XM_NO_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 511.0f, 511.0f, 511.0f, 3.0f } } }; + static const XMVECTORF32 Scale = { { { 511.0f, 511.0f, 511.0f, 3.0f } } }; XMVECTOR N = XMVectorClamp(V, Min.v, g_XMOne.v); - N = XMVectorMultiply(N, Scale.v); - N = XMVectorRound(N); + N = XMVectorMultiply(N, Scale.v); + N = XMVectorRound(N); XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); - pDestination->v = static_cast( - (static_cast(tmp.w) << 30) - | ((static_cast(tmp.z) & 0x3FF) << 20) - | ((static_cast(tmp.y) & 0x3FF) << 10) - | (static_cast(tmp.x) & 0x3FF)); + pDestination->v = static_cast((static_cast(tmp.w) << 30) | ((static_cast(tmp.z) & 0x3FF) << 20) + | ((static_cast(tmp.y) & 0x3FF) << 10) | (static_cast(tmp.x) & 0x3FF)); #elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 511.0f, 511.0f * 1024.0f, 511.0f * 1048576.0f, 3.0f * 536870912.0f } } }; + static const XMVECTORF32 Scale = { { { 511.0f, 511.0f * 1024.0f, 511.0f * 1048576.0f, 3.0f * 536870912.0f } } }; static const XMVECTORI32 ScaleMask = { { { 0x3FF, 0x3FF << 10, 0x3FF << 20, 0x3 << 29 } } }; - float32x4_t vResult = vmaxq_f32(V, Min); - vResult = vminq_f32(vResult, vdupq_n_f32(1.0f)); - vResult = vmulq_f32(vResult, Scale); - int32x4_t vResulti = vcvtq_s32_f32(vResult); - vResulti = vandq_s32(vResulti, ScaleMask); - int32x4_t vResultw = vandq_s32(vResulti, g_XMMaskW); - vResulti = vaddq_s32(vResulti, vResultw); + float32x4_t vResult = vmaxq_f32(V, Min); + vResult = vminq_f32(vResult, vdupq_n_f32(1.0f)); + vResult = vmulq_f32(vResult, Scale); + int32x4_t vResulti = vcvtq_s32_f32(vResult); + vResulti = vandq_s32(vResulti, ScaleMask); + int32x4_t vResultw = vandq_s32(vResulti, g_XMMaskW); + vResulti = vaddq_s32(vResulti, vResultw); // Do a horizontal or of all 4 entries uint32x2_t vTemp = vget_low_u32(vreinterpretq_u32_s32(vResulti)); - uint32x2_t vhi = vget_high_u32(vreinterpretq_u32_s32(vResulti)); - vTemp = vorr_u32(vTemp, vhi); - vTemp = vpadd_u32(vTemp, vTemp); + uint32x2_t vhi = vget_high_u32(vreinterpretq_u32_s32(vResulti)); + vTemp = vorr_u32(vTemp, vhi); + vTemp = vpadd_u32(vTemp, vTemp); vst1_lane_u32(&pDestination->v, vTemp, 0); #elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 511.0f, 511.0f * 1024.0f, 511.0f * 1048576.0f, 3.0f * 536870912.0f } } }; + static const XMVECTORF32 Scale = { { { 511.0f, 511.0f * 1024.0f, 511.0f * 1048576.0f, 3.0f * 536870912.0f } } }; static const XMVECTORI32 ScaleMask = { { { 0x3FF, 0x3FF << 10, 0x3FF << 20, 0x3 << 29 } } }; - XMVECTOR vResult = _mm_max_ps(V, Min); - vResult = _mm_min_ps(vResult, g_XMOne); + XMVECTOR vResult = _mm_max_ps(V, Min); + vResult = _mm_min_ps(vResult, g_XMOne); // Scale by multiplication vResult = _mm_mul_ps(vResult, Scale); // Convert to int (W is unsigned) @@ -3041,13 +2849,13 @@ inline void XM_CALLCONV XMStoreXDecN4 vResulti = _mm_and_si128(vResulti, ScaleMask); // To fix W, add itself to shift it up to <<30 instead of <<29 __m128i vResultw = _mm_and_si128(vResulti, g_XMMaskW); - vResulti = _mm_add_epi32(vResulti, vResultw); + vResulti = _mm_add_epi32(vResulti, vResultw); // Do a horizontal or of all 4 entries - vResult = XM_PERMUTE_PS(_mm_castsi128_ps(vResulti), _MM_SHUFFLE(0, 3, 2, 1)); + vResult = XM_PERMUTE_PS(_mm_castsi128_ps(vResulti), _MM_SHUFFLE(0, 3, 2, 1)); vResulti = _mm_or_si128(vResulti, _mm_castps_si128(vResult)); - vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(0, 3, 2, 1)); + vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(0, 3, 2, 1)); vResulti = _mm_or_si128(vResulti, _mm_castps_si128(vResult)); - vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(0, 3, 2, 1)); + vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(0, 3, 2, 1)); vResulti = _mm_or_si128(vResulti, _mm_castps_si128(vResult)); _mm_store_ss(reinterpret_cast(&pDestination->v), _mm_castsi128_ps(vResulti)); #endif @@ -3070,12 +2878,7 @@ inline void XM_CALLCONV XMStoreXDecN4 #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #endif -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreXDec4 -( - XMXDEC4* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreXDec4(XMXDEC4* pDestination, FXMVECTOR V) noexcept { assert(pDestination); static const XMVECTORF32 MinXDec4 = { { { -511.0f, -511.0f, -511.0f, 0.0f } } }; @@ -3088,35 +2891,32 @@ inline void XM_CALLCONV XMStoreXDec4 XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); - pDestination->v = static_cast( - (static_cast(tmp.w) << 30) - | ((static_cast(tmp.z) & 0x3FF) << 20) - | ((static_cast(tmp.y) & 0x3FF) << 10) - | ((static_cast(tmp.x) & 0x3FF))); + pDestination->v = static_cast((static_cast(tmp.w) << 30) | ((static_cast(tmp.z) & 0x3FF) << 20) + | ((static_cast(tmp.y) & 0x3FF) << 10) | ((static_cast(tmp.x) & 0x3FF))); #elif defined(_XM_ARM_NEON_INTRINSICS_) static const XMVECTORF32 ScaleXDec4 = { { { 1.0f, 1024.0f / 2.0f, 1024.0f * 1024.0f, 1024.0f * 1024.0f * 1024.0f / 2.0f } } }; - static const XMVECTORI32 MaskXDec4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; - float32x4_t vResult = vmaxq_f32(V, MinXDec4); - vResult = vminq_f32(vResult, MaxXDec4); - vResult = vmulq_f32(vResult, ScaleXDec4); - int32x4_t vResulti = vcvtq_s32_f32(vResult); - vResulti = vandq_s32(vResulti, MaskXDec4); + static const XMVECTORI32 MaskXDec4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; + float32x4_t vResult = vmaxq_f32(V, MinXDec4); + vResult = vminq_f32(vResult, MaxXDec4); + vResult = vmulq_f32(vResult, ScaleXDec4); + int32x4_t vResulti = vcvtq_s32_f32(vResult); + vResulti = vandq_s32(vResulti, MaskXDec4); // Do a horizontal or of 4 entries - uint32x2_t vTemp = vget_low_u32(vreinterpretq_u32_s32(vResulti)); + uint32x2_t vTemp = vget_low_u32(vreinterpretq_u32_s32(vResulti)); uint32x2_t vTemp2 = vget_high_u32(vreinterpretq_u32_s32(vResulti)); - vTemp = vorr_u32(vTemp, vTemp2); + vTemp = vorr_u32(vTemp, vTemp2); // Perform a single bit left shift on y|w vTemp2 = vdup_lane_u32(vTemp, 1); vTemp2 = vadd_u32(vTemp2, vTemp2); - vTemp = vorr_u32(vTemp, vTemp2); + vTemp = vorr_u32(vTemp, vTemp2); vst1_lane_u32(&pDestination->v, vTemp, 0); #elif defined(_XM_SSE_INTRINSICS_) static const XMVECTORF32 ScaleXDec4 = { { { 1.0f, 1024.0f / 2.0f, 1024.0f * 1024.0f, 1024.0f * 1024.0f * 1024.0f / 2.0f } } }; - static const XMVECTORI32 MaskXDec4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; + static const XMVECTORI32 MaskXDec4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; // Clamp to bounds XMVECTOR vResult = _mm_max_ps(V, MinXDec4); - vResult = _mm_min_ps(vResult, MaxXDec4); + vResult = _mm_min_ps(vResult, MaxXDec4); // Scale by multiplication vResult = _mm_mul_ps(vResult, ScaleXDec4); // Convert to int @@ -3148,53 +2948,47 @@ inline void XM_CALLCONV XMStoreXDec4 #endif //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUDecN4 -( - XMUDECN4* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreUDecN4(XMUDECN4* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 1023.0f, 1023.0f, 1023.0f, 3.0f } } }; + static const XMVECTORF32 Scale = { { { 1023.0f, 1023.0f, 1023.0f, 3.0f } } }; XMVECTOR N = XMVectorSaturate(V); - N = XMVectorMultiply(N, Scale.v); + N = XMVectorMultiply(N, Scale.v); XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); - pDestination->v = static_cast( - (static_cast(tmp.w) << 30) - | ((static_cast(tmp.z) & 0x3FF) << 20) - | ((static_cast(tmp.y) & 0x3FF) << 10) - | ((static_cast(tmp.x) & 0x3FF))); + pDestination->v = static_cast((static_cast(tmp.w) << 30) | ((static_cast(tmp.z) & 0x3FF) << 20) + | ((static_cast(tmp.y) & 0x3FF) << 10) | ((static_cast(tmp.x) & 0x3FF))); #elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 ScaleUDecN4 = { { { 1023.0f, 1023.0f * 1024.0f * 0.5f, 1023.0f * 1024.0f * 1024.0f, 3.0f * 1024.0f * 1024.0f * 1024.0f * 0.5f } } }; + static const XMVECTORF32 ScaleUDecN4 + = { { { 1023.0f, 1023.0f * 1024.0f * 0.5f, 1023.0f * 1024.0f * 1024.0f, 3.0f * 1024.0f * 1024.0f * 1024.0f * 0.5f } } }; static const XMVECTORI32 MaskUDecN4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; - float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0.f)); - vResult = vminq_f32(vResult, vdupq_n_f32(1.f)); - vResult = vmulq_f32(vResult, ScaleUDecN4); - uint32x4_t vResulti = vcvtq_u32_f32(vResult); - vResulti = vandq_u32(vResulti, MaskUDecN4); + float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0.f)); + vResult = vminq_f32(vResult, vdupq_n_f32(1.f)); + vResult = vmulq_f32(vResult, ScaleUDecN4); + uint32x4_t vResulti = vcvtq_u32_f32(vResult); + vResulti = vandq_u32(vResulti, MaskUDecN4); // Do a horizontal or of 4 entries - uint32x2_t vTemp = vget_low_u32(vResulti); + uint32x2_t vTemp = vget_low_u32(vResulti); uint32x2_t vTemp2 = vget_high_u32(vResulti); - vTemp = vorr_u32(vTemp, vTemp2); + vTemp = vorr_u32(vTemp, vTemp2); // Perform a single bit left shift on y|w vTemp2 = vdup_lane_u32(vTemp, 1); vTemp2 = vadd_u32(vTemp2, vTemp2); - vTemp = vorr_u32(vTemp, vTemp2); + vTemp = vorr_u32(vTemp, vTemp2); vst1_lane_u32(&pDestination->v, vTemp, 0); #elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 ScaleUDecN4 = { { { 1023.0f, 1023.0f * 1024.0f * 0.5f, 1023.0f * 1024.0f * 1024.0f, 3.0f * 1024.0f * 1024.0f * 1024.0f * 0.5f } } }; + static const XMVECTORF32 ScaleUDecN4 + = { { { 1023.0f, 1023.0f * 1024.0f * 0.5f, 1023.0f * 1024.0f * 1024.0f, 3.0f * 1024.0f * 1024.0f * 1024.0f * 0.5f } } }; static const XMVECTORI32 MaskUDecN4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; // Clamp to bounds XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - vResult = _mm_min_ps(vResult, g_XMOne); + vResult = _mm_min_ps(vResult, g_XMOne); // Scale by multiplication vResult = _mm_mul_ps(vResult, ScaleUDecN4); // Convert to int @@ -3216,52 +3010,44 @@ inline void XM_CALLCONV XMStoreUDecN4 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUDecN4_XR -( - XMUDECN4* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreUDecN4_XR(XMUDECN4* pDestination, FXMVECTOR V) noexcept { assert(pDestination); static const XMVECTORF32 Scale = { { { 510.0f, 510.0f, 510.0f, 3.0f } } }; - static const XMVECTORF32 Bias = { { { 384.0f, 384.0f, 384.0f, 0.0f } } }; - static const XMVECTORF32 C = { { { 1023.f, 1023.f, 1023.f, 3.f } } }; + static const XMVECTORF32 Bias = { { { 384.0f, 384.0f, 384.0f, 0.0f } } }; + static const XMVECTORF32 C = { { { 1023.f, 1023.f, 1023.f, 3.f } } }; #if defined(_XM_NO_INTRINSICS_) XMVECTOR N = XMVectorMultiplyAdd(V, Scale, Bias); - N = XMVectorClamp(N, g_XMZero, C); + N = XMVectorClamp(N, g_XMZero, C); XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); - pDestination->v = static_cast( - (static_cast(tmp.w) << 30) - | ((static_cast(tmp.z) & 0x3FF) << 20) - | ((static_cast(tmp.y) & 0x3FF) << 10) - | ((static_cast(tmp.x) & 0x3FF))); + pDestination->v = static_cast((static_cast(tmp.w) << 30) | ((static_cast(tmp.z) & 0x3FF) << 20) + | ((static_cast(tmp.y) & 0x3FF) << 10) | ((static_cast(tmp.x) & 0x3FF))); #elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 Shift = { { { 1.0f, 1024.0f * 0.5f, 1024.0f * 1024.0f, 1024.0f * 1024.0f * 1024.0f * 0.5f } } }; + static const XMVECTORF32 Shift = { { { 1.0f, 1024.0f * 0.5f, 1024.0f * 1024.0f, 1024.0f * 1024.0f * 1024.0f * 0.5f } } }; static const XMVECTORU32 MaskUDecN4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; - float32x4_t vResult = vmlaq_f32(Bias, V, Scale); - vResult = vmaxq_f32(vResult, vdupq_n_f32(0.f)); - vResult = vminq_f32(vResult, C); - vResult = vmulq_f32(vResult, Shift); - uint32x4_t vResulti = vcvtq_u32_f32(vResult); - vResulti = vandq_u32(vResulti, MaskUDecN4); + float32x4_t vResult = vmlaq_f32(Bias, V, Scale); + vResult = vmaxq_f32(vResult, vdupq_n_f32(0.f)); + vResult = vminq_f32(vResult, C); + vResult = vmulq_f32(vResult, Shift); + uint32x4_t vResulti = vcvtq_u32_f32(vResult); + vResulti = vandq_u32(vResulti, MaskUDecN4); // Do a horizontal or of 4 entries - uint32x2_t vTemp = vget_low_u32(vResulti); + uint32x2_t vTemp = vget_low_u32(vResulti); uint32x2_t vTemp2 = vget_high_u32(vResulti); - vTemp = vorr_u32(vTemp, vTemp2); + vTemp = vorr_u32(vTemp, vTemp2); // Perform a single bit left shift on y|w vTemp2 = vdup_lane_u32(vTemp, 1); vTemp2 = vadd_u32(vTemp2, vTemp2); - vTemp = vorr_u32(vTemp, vTemp2); + vTemp = vorr_u32(vTemp, vTemp2); vst1_lane_u32(&pDestination->v, vTemp, 0); #elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 Shift = { { { 1.0f, 1024.0f * 0.5f, 1024.0f * 1024.0f, 1024.0f * 1024.0f * 1024.0f * 0.5f } } }; + static const XMVECTORF32 Shift = { { { 1.0f, 1024.0f * 0.5f, 1024.0f * 1024.0f, 1024.0f * 1024.0f * 1024.0f * 0.5f } } }; static const XMVECTORU32 MaskUDecN4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; // Scale & bias XMVECTOR vResult = XM_FMADD_PS(V, Scale, Bias); @@ -3289,12 +3075,7 @@ inline void XM_CALLCONV XMStoreUDecN4_XR } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUDec4 -( - XMUDEC4* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreUDec4(XMUDEC4* pDestination, FXMVECTOR V) noexcept { assert(pDestination); static const XMVECTORF32 MaxUDec4 = { { { 1023.0f, 1023.0f, 1023.0f, 3.0f } } }; @@ -3306,35 +3087,32 @@ inline void XM_CALLCONV XMStoreUDec4 XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); - pDestination->v = static_cast( - (static_cast(tmp.w) << 30) - | ((static_cast(tmp.z) & 0x3FF) << 20) - | ((static_cast(tmp.y) & 0x3FF) << 10) - | ((static_cast(tmp.x) & 0x3FF))); + pDestination->v = static_cast((static_cast(tmp.w) << 30) | ((static_cast(tmp.z) & 0x3FF) << 20) + | ((static_cast(tmp.y) & 0x3FF) << 10) | ((static_cast(tmp.x) & 0x3FF))); #elif defined(_XM_ARM_NEON_INTRINSICS_) static const XMVECTORF32 ScaleUDec4 = { { { 1.0f, 1024.0f / 2.0f, 1024.0f * 1024.0f, 1024.0f * 1024.0f * 1024.0f / 2.0f } } }; - static const XMVECTORI32 MaskUDec4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; - float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0.f)); - vResult = vminq_f32(vResult, MaxUDec4); - vResult = vmulq_f32(vResult, ScaleUDec4); - uint32x4_t vResulti = vcvtq_u32_f32(vResult); - vResulti = vandq_u32(vResulti, MaskUDec4); + static const XMVECTORI32 MaskUDec4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; + float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0.f)); + vResult = vminq_f32(vResult, MaxUDec4); + vResult = vmulq_f32(vResult, ScaleUDec4); + uint32x4_t vResulti = vcvtq_u32_f32(vResult); + vResulti = vandq_u32(vResulti, MaskUDec4); // Do a horizontal or of 4 entries - uint32x2_t vTemp = vget_low_u32(vResulti); + uint32x2_t vTemp = vget_low_u32(vResulti); uint32x2_t vTemp2 = vget_high_u32(vResulti); - vTemp = vorr_u32(vTemp, vTemp2); + vTemp = vorr_u32(vTemp, vTemp2); // Perform a single bit left shift on y|w vTemp2 = vdup_lane_u32(vTemp, 1); vTemp2 = vadd_u32(vTemp2, vTemp2); - vTemp = vorr_u32(vTemp, vTemp2); + vTemp = vorr_u32(vTemp, vTemp2); vst1_lane_u32(&pDestination->v, vTemp, 0); #elif defined(_XM_SSE_INTRINSICS_) static const XMVECTORF32 ScaleUDec4 = { { { 1.0f, 1024.0f / 2.0f, 1024.0f * 1024.0f, 1024.0f * 1024.0f * 1024.0f / 2.0f } } }; - static const XMVECTORI32 MaskUDec4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; + static const XMVECTORI32 MaskUDec4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; // Clamp to bounds XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - vResult = _mm_min_ps(vResult, MaxUDec4); + vResult = _mm_min_ps(vResult, MaxUDec4); // Scale by multiplication vResult = _mm_mul_ps(vResult, ScaleUDec4); // Convert to int @@ -3372,12 +3150,7 @@ inline void XM_CALLCONV XMStoreUDec4 #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #endif -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreDecN4 -( - XMDECN4* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreDecN4(XMDECN4* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) @@ -3385,35 +3158,34 @@ inline void XM_CALLCONV XMStoreDecN4 static const XMVECTORF32 Scale = { { { 511.0f, 511.0f, 511.0f, 1.0f } } }; XMVECTOR N = XMVectorClamp(V, g_XMNegativeOne.v, g_XMOne.v); - N = XMVectorMultiply(N, Scale.v); + N = XMVectorMultiply(N, Scale.v); XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); - pDestination->v = static_cast( - (static_cast(tmp.w) << 30) - | ((static_cast(tmp.z) & 0x3FF) << 20) - | ((static_cast(tmp.y) & 0x3FF) << 10) - | ((static_cast(tmp.x) & 0x3FF))); + pDestination->v = static_cast((static_cast(tmp.w) << 30) | ((static_cast(tmp.z) & 0x3FF) << 20) + | ((static_cast(tmp.y) & 0x3FF) << 10) | ((static_cast(tmp.x) & 0x3FF))); #elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 ScaleDecN4 = { { { 511.0f, 511.0f * 1024.0f, 511.0f * 1024.0f * 1024.0f, 1.0f * 1024.0f * 1024.0f * 1024.0f } } }; + static const XMVECTORF32 ScaleDecN4 + = { { { 511.0f, 511.0f * 1024.0f, 511.0f * 1024.0f * 1024.0f, 1.0f * 1024.0f * 1024.0f * 1024.0f } } }; float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(-1.f)); - vResult = vminq_f32(vResult, vdupq_n_f32(1.f)); - vResult = vmulq_f32(vResult, ScaleDecN4); - int32x4_t vResulti = vcvtq_s32_f32(vResult); - vResulti = vandq_s32(vResulti, g_XMMaskDec4); + vResult = vminq_f32(vResult, vdupq_n_f32(1.f)); + vResult = vmulq_f32(vResult, ScaleDecN4); + int32x4_t vResulti = vcvtq_s32_f32(vResult); + vResulti = vandq_s32(vResulti, g_XMMaskDec4); // Do a horizontal or of 4 entries uint32x2_t vTemp = vget_low_u32(vreinterpretq_u32_s32(vResulti)); - uint32x2_t vhi = vget_high_u32(vreinterpretq_u32_s32(vResulti)); - vTemp = vorr_u32(vTemp, vhi); - vTemp = vpadd_u32(vTemp, vTemp); + uint32x2_t vhi = vget_high_u32(vreinterpretq_u32_s32(vResulti)); + vTemp = vorr_u32(vTemp, vhi); + vTemp = vpadd_u32(vTemp, vTemp); vst1_lane_u32(&pDestination->v, vTemp, 0); #elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 ScaleDecN4 = { { { 511.0f, 511.0f * 1024.0f, 511.0f * 1024.0f * 1024.0f, 1.0f * 1024.0f * 1024.0f * 1024.0f } } }; + static const XMVECTORF32 ScaleDecN4 + = { { { 511.0f, 511.0f * 1024.0f, 511.0f * 1024.0f * 1024.0f, 1.0f * 1024.0f * 1024.0f * 1024.0f } } }; // Clamp to bounds XMVECTOR vResult = _mm_max_ps(V, g_XMNegativeOne); - vResult = _mm_min_ps(vResult, g_XMOne); + vResult = _mm_min_ps(vResult, g_XMOne); // Scale by multiplication vResult = _mm_mul_ps(vResult, ScaleDecN4); // Convert to int @@ -3433,12 +3205,7 @@ inline void XM_CALLCONV XMStoreDecN4 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreDec4 -( - XMDEC4* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreDec4(XMDEC4* pDestination, FXMVECTOR V) noexcept { assert(pDestination); static const XMVECTORF32 MinDec4 = { { { -511.0f, -511.0f, -511.0f, -1.0f } } }; @@ -3451,30 +3218,27 @@ inline void XM_CALLCONV XMStoreDec4 XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); - pDestination->v = static_cast( - (static_cast(tmp.w) << 30) - | ((static_cast(tmp.z) & 0x3FF) << 20) - | ((static_cast(tmp.y) & 0x3FF) << 10) - | ((static_cast(tmp.x) & 0x3FF))); + pDestination->v = static_cast((static_cast(tmp.w) << 30) | ((static_cast(tmp.z) & 0x3FF) << 20) + | ((static_cast(tmp.y) & 0x3FF) << 10) | ((static_cast(tmp.x) & 0x3FF))); #elif defined(_XM_ARM_NEON_INTRINSICS_) static const XMVECTORF32 ScaleDec4 = { { { 1.0f, 1024.0f, 1024.0f * 1024.0f, 1024.0f * 1024.0f * 1024.0f } } }; - float32x4_t vResult = vmaxq_f32(V, MinDec4); - vResult = vminq_f32(vResult, MaxDec4); - vResult = vmulq_f32(vResult, ScaleDec4); - int32x4_t vResulti = vcvtq_s32_f32(vResult); - vResulti = vandq_s32(vResulti, g_XMMaskDec4); + float32x4_t vResult = vmaxq_f32(V, MinDec4); + vResult = vminq_f32(vResult, MaxDec4); + vResult = vmulq_f32(vResult, ScaleDec4); + int32x4_t vResulti = vcvtq_s32_f32(vResult); + vResulti = vandq_s32(vResulti, g_XMMaskDec4); // Do a horizontal or of all 4 entries uint32x2_t vTemp = vget_low_u32(vreinterpretq_u32_s32(vResulti)); - uint32x2_t vhi = vget_high_u32(vreinterpretq_u32_s32(vResulti)); - vTemp = vorr_u32(vTemp, vhi); - vTemp = vpadd_u32(vTemp, vTemp); + uint32x2_t vhi = vget_high_u32(vreinterpretq_u32_s32(vResulti)); + vTemp = vorr_u32(vTemp, vhi); + vTemp = vpadd_u32(vTemp, vTemp); vst1_lane_u32(&pDestination->v, vTemp, 0); #elif defined(_XM_SSE_INTRINSICS_) static const XMVECTORF32 ScaleDec4 = { { { 1.0f, 1024.0f, 1024.0f * 1024.0f, 1024.0f * 1024.0f * 1024.0f } } }; // Clamp to bounds XMVECTOR vResult = _mm_max_ps(V, MinDec4); - vResult = _mm_min_ps(vResult, MaxDec4); + vResult = _mm_min_ps(vResult, MaxDec4); // Scale by multiplication vResult = _mm_mul_ps(vResult, ScaleDec4); // Convert to int @@ -3504,19 +3268,14 @@ inline void XM_CALLCONV XMStoreDec4 #endif //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUByteN4 -( - XMUBYTEN4* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreUByteN4(XMUBYTEN4* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) XMVECTOR N = XMVectorSaturate(V); - N = XMVectorMultiply(N, g_UByteMax); - N = XMVectorTruncate(N); + N = XMVectorMultiply(N, g_UByteMax); + N = XMVectorTruncate(N); XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); @@ -3527,19 +3286,20 @@ inline void XM_CALLCONV XMStoreUByteN4 pDestination->w = static_cast(tmp.w); #elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0)); - R = vminq_f32(R, vdupq_n_f32(1.0f)); - R = vmulq_n_f32(R, 255.0f); + float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0)); + R = vminq_f32(R, vdupq_n_f32(1.0f)); + R = vmulq_n_f32(R, 255.0f); uint32x4_t vInt32 = vcvtq_u32_f32(R); uint16x4_t vInt16 = vqmovn_u32(vInt32); - uint8x8_t vInt8 = vqmovn_u16(vcombine_u16(vInt16, vInt16)); + uint8x8_t vInt8 = vqmovn_u16(vcombine_u16(vInt16, vInt16)); vst1_lane_u32(&pDestination->v, vreinterpret_u32_u8(vInt8), 0); #elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 ScaleUByteN4 = { { { 255.0f, 255.0f * 256.0f * 0.5f, 255.0f * 256.0f * 256.0f, 255.0f * 256.0f * 256.0f * 256.0f * 0.5f } } }; + static const XMVECTORF32 ScaleUByteN4 + = { { { 255.0f, 255.0f * 256.0f * 0.5f, 255.0f * 256.0f * 256.0f, 255.0f * 256.0f * 256.0f * 256.0f * 0.5f } } }; static const XMVECTORI32 MaskUByteN4 = { { { 0xFF, 0xFF << (8 - 1), 0xFF << 16, 0xFF << (24 - 1) } } }; // Clamp to bounds XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - vResult = _mm_min_ps(vResult, g_XMOne); + vResult = _mm_min_ps(vResult, g_XMOne); // Scale by multiplication vResult = _mm_mul_ps(vResult, ScaleUByteN4); // Convert to int @@ -3561,18 +3321,13 @@ inline void XM_CALLCONV XMStoreUByteN4 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUByte4 -( - XMUBYTE4* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreUByte4(XMUBYTE4* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) XMVECTOR N = XMVectorClamp(V, XMVectorZero(), g_UByteMax); - N = XMVectorRound(N); + N = XMVectorRound(N); XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); @@ -3583,18 +3338,18 @@ inline void XM_CALLCONV XMStoreUByte4 pDestination->w = static_cast(tmp.w); #elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0)); - R = vminq_f32(R, vdupq_n_f32(255.0f)); + float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0)); + R = vminq_f32(R, vdupq_n_f32(255.0f)); uint32x4_t vInt32 = vcvtq_u32_f32(R); uint16x4_t vInt16 = vqmovn_u32(vInt32); - uint8x8_t vInt8 = vqmovn_u16(vcombine_u16(vInt16, vInt16)); + uint8x8_t vInt8 = vqmovn_u16(vcombine_u16(vInt16, vInt16)); vst1_lane_u32(&pDestination->v, vreinterpret_u32_u8(vInt8), 0); #elif defined(_XM_SSE_INTRINSICS_) static const XMVECTORF32 ScaleUByte4 = { { { 1.0f, 256.0f * 0.5f, 256.0f * 256.0f, 256.0f * 256.0f * 256.0f * 0.5f } } }; - static const XMVECTORI32 MaskUByte4 = { { { 0xFF, 0xFF << (8 - 1), 0xFF << 16, 0xFF << (24 - 1) } } }; + static const XMVECTORI32 MaskUByte4 = { { { 0xFF, 0xFF << (8 - 1), 0xFF << 16, 0xFF << (24 - 1) } } }; // Clamp to bounds XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - vResult = _mm_min_ps(vResult, g_UByteMax); + vResult = _mm_min_ps(vResult, g_UByteMax); // Scale by multiplication vResult = _mm_mul_ps(vResult, ScaleUByte4); // Convert to int by rounding @@ -3616,19 +3371,14 @@ inline void XM_CALLCONV XMStoreUByte4 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreByteN4 -( - XMBYTEN4* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreByteN4(XMBYTEN4* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) XMVECTOR N = XMVectorClamp(V, g_XMNegativeOne.v, g_XMOne.v); - N = XMVectorMultiply(N, g_ByteMax); - N = XMVectorTruncate(N); + N = XMVectorMultiply(N, g_ByteMax); + N = XMVectorTruncate(N); XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); @@ -3639,19 +3389,19 @@ inline void XM_CALLCONV XMStoreByteN4 pDestination->w = static_cast(tmp.w); #elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t R = vmaxq_f32(V, vdupq_n_f32(-1.f)); - R = vminq_f32(R, vdupq_n_f32(1.0f)); - R = vmulq_n_f32(R, 127.0f); + float32x4_t R = vmaxq_f32(V, vdupq_n_f32(-1.f)); + R = vminq_f32(R, vdupq_n_f32(1.0f)); + R = vmulq_n_f32(R, 127.0f); int32x4_t vInt32 = vcvtq_s32_f32(R); int16x4_t vInt16 = vqmovn_s32(vInt32); - int8x8_t vInt8 = vqmovn_s16(vcombine_s16(vInt16, vInt16)); + int8x8_t vInt8 = vqmovn_s16(vcombine_s16(vInt16, vInt16)); vst1_lane_u32(&pDestination->v, vreinterpret_u32_s8(vInt8), 0); #elif defined(_XM_SSE_INTRINSICS_) static const XMVECTORF32 ScaleByteN4 = { { { 127.0f, 127.0f * 256.0f, 127.0f * 256.0f * 256.0f, 127.0f * 256.0f * 256.0f * 256.0f } } }; - static const XMVECTORI32 MaskByteN4 = { { { 0xFF, 0xFF << 8, 0xFF << 16, static_cast(0xFF000000) } } }; + static const XMVECTORI32 MaskByteN4 = { { { 0xFF, 0xFF << 8, 0xFF << 16, static_cast(0xFF000000) } } }; // Clamp to bounds XMVECTOR vResult = _mm_max_ps(V, g_XMNegativeOne); - vResult = _mm_min_ps(vResult, g_XMOne); + vResult = _mm_min_ps(vResult, g_XMOne); // Scale by multiplication vResult = _mm_mul_ps(vResult, ScaleByteN4); // Convert to int @@ -3671,18 +3421,13 @@ inline void XM_CALLCONV XMStoreByteN4 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreByte4 -( - XMBYTE4* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreByte4(XMBYTE4* pDestination, FXMVECTOR V) noexcept { assert(pDestination); #if defined(_XM_NO_INTRINSICS_) XMVECTOR N = XMVectorClamp(V, g_ByteMin, g_ByteMax); - N = XMVectorRound(N); + N = XMVectorRound(N); XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); @@ -3693,18 +3438,18 @@ inline void XM_CALLCONV XMStoreByte4 pDestination->w = static_cast(tmp.w); #elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t R = vmaxq_f32(V, vdupq_n_f32(-127.f)); - R = vminq_f32(R, vdupq_n_f32(127.f)); + float32x4_t R = vmaxq_f32(V, vdupq_n_f32(-127.f)); + R = vminq_f32(R, vdupq_n_f32(127.f)); int32x4_t vInt32 = vcvtq_s32_f32(R); int16x4_t vInt16 = vqmovn_s32(vInt32); - int8x8_t vInt8 = vqmovn_s16(vcombine_s16(vInt16, vInt16)); + int8x8_t vInt8 = vqmovn_s16(vcombine_s16(vInt16, vInt16)); vst1_lane_u32(&pDestination->v, vreinterpret_u32_s8(vInt8), 0); #elif defined(_XM_SSE_INTRINSICS_) static const XMVECTORF32 ScaleByte4 = { { { 1.0f, 256.0f, 256.0f * 256.0f, 256.0f * 256.0f * 256.0f } } }; - static const XMVECTORI32 MaskByte4 = { { { 0xFF, 0xFF << 8, 0xFF << 16, static_cast(0xFF000000) } } }; + static const XMVECTORI32 MaskByte4 = { { { 0xFF, 0xFF << 8, 0xFF << 16, static_cast(0xFF000000) } } }; // Clamp to bounds XMVECTOR vResult = _mm_max_ps(V, g_ByteMin); - vResult = _mm_min_ps(vResult, g_ByteMax); + vResult = _mm_min_ps(vResult, g_ByteMax); // Scale by multiplication vResult = _mm_mul_ps(vResult, ScaleByte4); // Convert to int by rounding @@ -3724,121 +3469,98 @@ inline void XM_CALLCONV XMStoreByte4 } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUNibble4 -( - XMUNIBBLE4* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreUNibble4(XMUNIBBLE4* pDestination, FXMVECTOR V) noexcept { assert(pDestination); static const XMVECTORF32 Max = { { { 15.0f, 15.0f, 15.0f, 15.0f } } }; #if defined(_XM_NO_INTRINSICS_) XMVECTOR N = XMVectorClamp(V, XMVectorZero(), Max.v); - N = XMVectorRound(N); + N = XMVectorRound(N); XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); - pDestination->v = static_cast( - ((static_cast(tmp.w) & 0xF) << 12) - | ((static_cast(tmp.z) & 0xF) << 8) - | ((static_cast(tmp.y) & 0xF) << 4) - | (static_cast(tmp.x) & 0xF)); + pDestination->v = static_cast(((static_cast(tmp.w) & 0xF) << 12) | ((static_cast(tmp.z) & 0xF) << 8) + | ((static_cast(tmp.y) & 0xF) << 4) | (static_cast(tmp.x) & 0xF)); #elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 1.0f, 16.f, 16.f * 16.f, 16.f * 16.f * 16.f } } }; - static const XMVECTORU32 Mask = { { { 0xF, 0xF << 4, 0xF << 8, 0xF << 12 } } }; - float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0)); - vResult = vminq_f32(vResult, Max); - vResult = vmulq_f32(vResult, Scale); - uint32x4_t vResulti = vcvtq_u32_f32(vResult); - vResulti = vandq_u32(vResulti, Mask); + static const XMVECTORF32 Scale = { { { 1.0f, 16.f, 16.f * 16.f, 16.f * 16.f * 16.f } } }; + static const XMVECTORU32 Mask = { { { 0xF, 0xF << 4, 0xF << 8, 0xF << 12 } } }; + float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0)); + vResult = vminq_f32(vResult, Max); + vResult = vmulq_f32(vResult, Scale); + uint32x4_t vResulti = vcvtq_u32_f32(vResult); + vResulti = vandq_u32(vResulti, Mask); // Do a horizontal or of 4 entries uint32x2_t vTemp = vget_low_u32(vResulti); - uint32x2_t vhi = vget_high_u32(vResulti); - vTemp = vorr_u32(vTemp, vhi); - vTemp = vpadd_u32(vTemp, vTemp); + uint32x2_t vhi = vget_high_u32(vResulti); + vTemp = vorr_u32(vTemp, vhi); + vTemp = vpadd_u32(vTemp, vTemp); vst1_lane_u16(&pDestination->v, vreinterpret_u16_u32(vTemp), 0); #elif defined(_XM_SSE_INTRINSICS_) // Bounds check XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - vResult = _mm_min_ps(vResult, Max); + vResult = _mm_min_ps(vResult, Max); // Convert to int with rounding __m128i vInt = _mm_cvtps_epi32(vResult); // No SSE operations will write to 16-bit values, so we have to extract them manually - auto x = static_cast(_mm_extract_epi16(vInt, 0)); - auto y = static_cast(_mm_extract_epi16(vInt, 2)); - auto z = static_cast(_mm_extract_epi16(vInt, 4)); - auto w = static_cast(_mm_extract_epi16(vInt, 6)); - pDestination->v = static_cast( - ((static_cast(w) & 0xF) << 12) - | ((static_cast(z) & 0xF) << 8) - | ((static_cast(y) & 0xF) << 4) - | ((static_cast(x) & 0xF))); + auto x = static_cast(_mm_extract_epi16(vInt, 0)); + auto y = static_cast(_mm_extract_epi16(vInt, 2)); + auto z = static_cast(_mm_extract_epi16(vInt, 4)); + auto w = static_cast(_mm_extract_epi16(vInt, 6)); + pDestination->v = static_cast(((static_cast(w) & 0xF) << 12) | ((static_cast(z) & 0xF) << 8) + | ((static_cast(y) & 0xF) << 4) | ((static_cast(x) & 0xF))); #endif } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreU555 -( - XMU555* pDestination, - FXMVECTOR V -) noexcept +_Use_decl_annotations_ inline void XM_CALLCONV XMStoreU555(XMU555* pDestination, FXMVECTOR V) noexcept { assert(pDestination); static const XMVECTORF32 Max = { { { 31.0f, 31.0f, 31.0f, 1.0f } } }; #if defined(_XM_NO_INTRINSICS_) XMVECTOR N = XMVectorClamp(V, XMVectorZero(), Max.v); - N = XMVectorRound(N); + N = XMVectorRound(N); XMFLOAT4A tmp; XMStoreFloat4A(&tmp, N); - pDestination->v = static_cast( - ((tmp.w > 0.f) ? 0x8000 : 0) - | ((static_cast(tmp.z) & 0x1F) << 10) - | ((static_cast(tmp.y) & 0x1F) << 5) - | (static_cast(tmp.x) & 0x1F)); + pDestination->v = static_cast(((tmp.w > 0.f) ? 0x8000 : 0) | ((static_cast(tmp.z) & 0x1F) << 10) + | ((static_cast(tmp.y) & 0x1F) << 5) | (static_cast(tmp.x) & 0x1F)); #elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 1.0f, 32.f / 2.f, 32.f * 32.f, 32.f * 32.f * 32.f / 2.f } } }; - static const XMVECTORU32 Mask = { { { 0x1F, 0x1F << (5 - 1), 0x1F << 10, 0x1 << (15 - 1) } } }; - float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0)); - vResult = vminq_f32(vResult, Max); - vResult = vmulq_f32(vResult, Scale); - uint32x4_t vResulti = vcvtq_u32_f32(vResult); - vResulti = vandq_u32(vResulti, Mask); + static const XMVECTORF32 Scale = { { { 1.0f, 32.f / 2.f, 32.f * 32.f, 32.f * 32.f * 32.f / 2.f } } }; + static const XMVECTORU32 Mask = { { { 0x1F, 0x1F << (5 - 1), 0x1F << 10, 0x1 << (15 - 1) } } }; + float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0)); + vResult = vminq_f32(vResult, Max); + vResult = vmulq_f32(vResult, Scale); + uint32x4_t vResulti = vcvtq_u32_f32(vResult); + vResulti = vandq_u32(vResulti, Mask); // Do a horizontal or of 4 entries - uint32x2_t vTemp = vget_low_u32(vResulti); + uint32x2_t vTemp = vget_low_u32(vResulti); uint32x2_t vTemp2 = vget_high_u32(vResulti); - vTemp = vorr_u32(vTemp, vTemp2); + vTemp = vorr_u32(vTemp, vTemp2); // Perform a single bit left shift on y|w vTemp2 = vdup_lane_u32(vTemp, 1); vTemp2 = vadd_u32(vTemp2, vTemp2); - vTemp = vorr_u32(vTemp, vTemp2); + vTemp = vorr_u32(vTemp, vTemp2); vst1_lane_u16(&pDestination->v, vreinterpret_u16_u32(vTemp), 0); #elif defined(_XM_SSE_INTRINSICS_) // Bounds check XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - vResult = _mm_min_ps(vResult, Max); + vResult = _mm_min_ps(vResult, Max); // Convert to int with rounding __m128i vInt = _mm_cvtps_epi32(vResult); // No SSE operations will write to 16-bit values, so we have to extract them manually - auto x = static_cast(_mm_extract_epi16(vInt, 0)); - auto y = static_cast(_mm_extract_epi16(vInt, 2)); - auto z = static_cast(_mm_extract_epi16(vInt, 4)); - auto w = static_cast(_mm_extract_epi16(vInt, 6)); - pDestination->v = static_cast( - (static_cast(w) ? 0x8000 : 0) - | ((static_cast(z) & 0x1F) << 10) - | ((static_cast(y) & 0x1F) << 5) - | ((static_cast(x) & 0x1F))); + auto x = static_cast(_mm_extract_epi16(vInt, 0)); + auto y = static_cast(_mm_extract_epi16(vInt, 2)); + auto z = static_cast(_mm_extract_epi16(vInt, 4)); + auto w = static_cast(_mm_extract_epi16(vInt, 6)); + pDestination->v = static_cast((static_cast(w) ? 0x8000 : 0) | ((static_cast(z) & 0x1F) << 10) + | ((static_cast(y) & 0x1F) << 5) | ((static_cast(x) & 0x1F))); #endif } - /**************************************************************************** * * XMCOLOR operators @@ -3847,20 +3569,13 @@ inline void XM_CALLCONV XMStoreU555 //------------------------------------------------------------------------------ -inline XMCOLOR::XMCOLOR -( - float _r, - float _g, - float _b, - float _a -) noexcept +inline XMCOLOR::XMCOLOR(float _r, float _g, float _b, float _a) noexcept { XMStoreColor(this, XMVectorSet(_r, _g, _b, _a)); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMCOLOR::XMCOLOR(const float* pArray) noexcept +_Use_decl_annotations_ inline XMCOLOR::XMCOLOR(const float* pArray) noexcept { XMStoreColor(this, XMLoadFloat4(reinterpret_cast(pArray))); } @@ -3873,19 +3588,14 @@ inline XMCOLOR::XMCOLOR(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMHALF2::XMHALF2 -( - float _x, - float _y -) noexcept +inline XMHALF2::XMHALF2(float _x, float _y) noexcept { x = XMConvertFloatToHalf(_x); y = XMConvertFloatToHalf(_y); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMHALF2::XMHALF2(const float* pArray) noexcept +_Use_decl_annotations_ inline XMHALF2::XMHALF2(const float* pArray) noexcept { assert(pArray != nullptr); x = XMConvertFloatToHalf(pArray[0]); @@ -3900,18 +3610,13 @@ inline XMHALF2::XMHALF2(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMSHORTN2::XMSHORTN2 -( - float _x, - float _y -) noexcept +inline XMSHORTN2::XMSHORTN2(float _x, float _y) noexcept { XMStoreShortN2(this, XMVectorSet(_x, _y, 0.0f, 0.0f)); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMSHORTN2::XMSHORTN2(const float* pArray) noexcept +_Use_decl_annotations_ inline XMSHORTN2::XMSHORTN2(const float* pArray) noexcept { XMStoreShortN2(this, XMLoadFloat2(reinterpret_cast(pArray))); } @@ -3924,18 +3629,13 @@ inline XMSHORTN2::XMSHORTN2(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMSHORT2::XMSHORT2 -( - float _x, - float _y -) noexcept +inline XMSHORT2::XMSHORT2(float _x, float _y) noexcept { XMStoreShort2(this, XMVectorSet(_x, _y, 0.0f, 0.0f)); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMSHORT2::XMSHORT2(const float* pArray) noexcept +_Use_decl_annotations_ inline XMSHORT2::XMSHORT2(const float* pArray) noexcept { XMStoreShort2(this, XMLoadFloat2(reinterpret_cast(pArray))); } @@ -3948,18 +3648,13 @@ inline XMSHORT2::XMSHORT2(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMUSHORTN2::XMUSHORTN2 -( - float _x, - float _y -) noexcept +inline XMUSHORTN2::XMUSHORTN2(float _x, float _y) noexcept { XMStoreUShortN2(this, XMVectorSet(_x, _y, 0.0f, 0.0f)); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMUSHORTN2::XMUSHORTN2(const float* pArray) noexcept +_Use_decl_annotations_ inline XMUSHORTN2::XMUSHORTN2(const float* pArray) noexcept { XMStoreUShortN2(this, XMLoadFloat2(reinterpret_cast(pArray))); } @@ -3972,18 +3667,13 @@ inline XMUSHORTN2::XMUSHORTN2(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMUSHORT2::XMUSHORT2 -( - float _x, - float _y -) noexcept +inline XMUSHORT2::XMUSHORT2(float _x, float _y) noexcept { XMStoreUShort2(this, XMVectorSet(_x, _y, 0.0f, 0.0f)); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMUSHORT2::XMUSHORT2(const float* pArray) noexcept +_Use_decl_annotations_ inline XMUSHORT2::XMUSHORT2(const float* pArray) noexcept { XMStoreUShort2(this, XMLoadFloat2(reinterpret_cast(pArray))); } @@ -3996,18 +3686,13 @@ inline XMUSHORT2::XMUSHORT2(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMBYTEN2::XMBYTEN2 -( - float _x, - float _y -) noexcept +inline XMBYTEN2::XMBYTEN2(float _x, float _y) noexcept { XMStoreByteN2(this, XMVectorSet(_x, _y, 0.0f, 0.0f)); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMBYTEN2::XMBYTEN2(const float* pArray) noexcept +_Use_decl_annotations_ inline XMBYTEN2::XMBYTEN2(const float* pArray) noexcept { XMStoreByteN2(this, XMLoadFloat2(reinterpret_cast(pArray))); } @@ -4020,18 +3705,13 @@ inline XMBYTEN2::XMBYTEN2(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMBYTE2::XMBYTE2 -( - float _x, - float _y -) noexcept +inline XMBYTE2::XMBYTE2(float _x, float _y) noexcept { XMStoreByte2(this, XMVectorSet(_x, _y, 0.0f, 0.0f)); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMBYTE2::XMBYTE2(const float* pArray) noexcept +_Use_decl_annotations_ inline XMBYTE2::XMBYTE2(const float* pArray) noexcept { XMStoreByte2(this, XMLoadFloat2(reinterpret_cast(pArray))); } @@ -4044,18 +3724,13 @@ inline XMBYTE2::XMBYTE2(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMUBYTEN2::XMUBYTEN2 -( - float _x, - float _y -) noexcept +inline XMUBYTEN2::XMUBYTEN2(float _x, float _y) noexcept { XMStoreUByteN2(this, XMVectorSet(_x, _y, 0.0f, 0.0f)); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMUBYTEN2::XMUBYTEN2(const float* pArray) noexcept +_Use_decl_annotations_ inline XMUBYTEN2::XMUBYTEN2(const float* pArray) noexcept { XMStoreUByteN2(this, XMLoadFloat2(reinterpret_cast(pArray))); } @@ -4068,18 +3743,13 @@ inline XMUBYTEN2::XMUBYTEN2(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMUBYTE2::XMUBYTE2 -( - float _x, - float _y -) noexcept +inline XMUBYTE2::XMUBYTE2(float _x, float _y) noexcept { XMStoreUByte2(this, XMVectorSet(_x, _y, 0.0f, 0.0f)); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMUBYTE2::XMUBYTE2(const float* pArray) noexcept +_Use_decl_annotations_ inline XMUBYTE2::XMUBYTE2(const float* pArray) noexcept { XMStoreUByte2(this, XMLoadFloat2(reinterpret_cast(pArray))); } @@ -4090,18 +3760,12 @@ inline XMUBYTE2::XMUBYTE2(const float* pArray) noexcept * ****************************************************************************/ -inline XMU565::XMU565 -( - float _x, - float _y, - float _z -) noexcept +inline XMU565::XMU565(float _x, float _y, float _z) noexcept { XMStoreU565(this, XMVectorSet(_x, _y, _z, 0.0f)); } -_Use_decl_annotations_ -inline XMU565::XMU565(const float* pArray) noexcept +_Use_decl_annotations_ inline XMU565::XMU565(const float* pArray) noexcept { XMStoreU565(this, XMLoadFloat3(reinterpret_cast(pArray))); } @@ -4112,18 +3776,12 @@ inline XMU565::XMU565(const float* pArray) noexcept * ****************************************************************************/ -inline XMFLOAT3PK::XMFLOAT3PK -( - float _x, - float _y, - float _z -) noexcept +inline XMFLOAT3PK::XMFLOAT3PK(float _x, float _y, float _z) noexcept { XMStoreFloat3PK(this, XMVectorSet(_x, _y, _z, 0.0f)); } -_Use_decl_annotations_ -inline XMFLOAT3PK::XMFLOAT3PK(const float* pArray) noexcept +_Use_decl_annotations_ inline XMFLOAT3PK::XMFLOAT3PK(const float* pArray) noexcept { XMStoreFloat3PK(this, XMLoadFloat3(reinterpret_cast(pArray))); } @@ -4134,18 +3792,12 @@ inline XMFLOAT3PK::XMFLOAT3PK(const float* pArray) noexcept * ****************************************************************************/ -inline XMFLOAT3SE::XMFLOAT3SE -( - float _x, - float _y, - float _z -) noexcept +inline XMFLOAT3SE::XMFLOAT3SE(float _x, float _y, float _z) noexcept { XMStoreFloat3SE(this, XMVectorSet(_x, _y, _z, 0.0f)); } -_Use_decl_annotations_ -inline XMFLOAT3SE::XMFLOAT3SE(const float* pArray) noexcept +_Use_decl_annotations_ inline XMFLOAT3SE::XMFLOAT3SE(const float* pArray) noexcept { XMStoreFloat3SE(this, XMLoadFloat3(reinterpret_cast(pArray))); } @@ -4158,13 +3810,7 @@ inline XMFLOAT3SE::XMFLOAT3SE(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMHALF4::XMHALF4 -( - float _x, - float _y, - float _z, - float _w -) noexcept +inline XMHALF4::XMHALF4(float _x, float _y, float _z, float _w) noexcept { x = XMConvertFloatToHalf(_x); y = XMConvertFloatToHalf(_y); @@ -4174,8 +3820,7 @@ inline XMHALF4::XMHALF4 //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMHALF4::XMHALF4(const float* pArray) noexcept +_Use_decl_annotations_ inline XMHALF4::XMHALF4(const float* pArray) noexcept { XMConvertFloatToHalfStream(&x, sizeof(HALF), pArray, sizeof(float), 4); } @@ -4188,20 +3833,13 @@ inline XMHALF4::XMHALF4(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMSHORTN4::XMSHORTN4 -( - float _x, - float _y, - float _z, - float _w -) noexcept +inline XMSHORTN4::XMSHORTN4(float _x, float _y, float _z, float _w) noexcept { XMStoreShortN4(this, XMVectorSet(_x, _y, _z, _w)); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMSHORTN4::XMSHORTN4(const float* pArray) noexcept +_Use_decl_annotations_ inline XMSHORTN4::XMSHORTN4(const float* pArray) noexcept { XMStoreShortN4(this, XMLoadFloat4(reinterpret_cast(pArray))); } @@ -4214,20 +3852,13 @@ inline XMSHORTN4::XMSHORTN4(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMSHORT4::XMSHORT4 -( - float _x, - float _y, - float _z, - float _w -) noexcept +inline XMSHORT4::XMSHORT4(float _x, float _y, float _z, float _w) noexcept { XMStoreShort4(this, XMVectorSet(_x, _y, _z, _w)); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMSHORT4::XMSHORT4(const float* pArray) noexcept +_Use_decl_annotations_ inline XMSHORT4::XMSHORT4(const float* pArray) noexcept { XMStoreShort4(this, XMLoadFloat4(reinterpret_cast(pArray))); } @@ -4240,20 +3871,13 @@ inline XMSHORT4::XMSHORT4(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMUSHORTN4::XMUSHORTN4 -( - float _x, - float _y, - float _z, - float _w -) noexcept +inline XMUSHORTN4::XMUSHORTN4(float _x, float _y, float _z, float _w) noexcept { XMStoreUShortN4(this, XMVectorSet(_x, _y, _z, _w)); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMUSHORTN4::XMUSHORTN4(const float* pArray) noexcept +_Use_decl_annotations_ inline XMUSHORTN4::XMUSHORTN4(const float* pArray) noexcept { XMStoreUShortN4(this, XMLoadFloat4(reinterpret_cast(pArray))); } @@ -4266,20 +3890,13 @@ inline XMUSHORTN4::XMUSHORTN4(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMUSHORT4::XMUSHORT4 -( - float _x, - float _y, - float _z, - float _w -) noexcept +inline XMUSHORT4::XMUSHORT4(float _x, float _y, float _z, float _w) noexcept { XMStoreUShort4(this, XMVectorSet(_x, _y, _z, _w)); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMUSHORT4::XMUSHORT4(const float* pArray) noexcept +_Use_decl_annotations_ inline XMUSHORT4::XMUSHORT4(const float* pArray) noexcept { XMStoreUShort4(this, XMLoadFloat4(reinterpret_cast(pArray))); } @@ -4292,20 +3909,13 @@ inline XMUSHORT4::XMUSHORT4(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMXDECN4::XMXDECN4 -( - float _x, - float _y, - float _z, - float _w -) noexcept +inline XMXDECN4::XMXDECN4(float _x, float _y, float _z, float _w) noexcept { XMStoreXDecN4(this, XMVectorSet(_x, _y, _z, _w)); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMXDECN4::XMXDECN4(const float* pArray) noexcept +_Use_decl_annotations_ inline XMXDECN4::XMXDECN4(const float* pArray) noexcept { XMStoreXDecN4(this, XMLoadFloat4(reinterpret_cast(pArray))); } @@ -4333,20 +3943,13 @@ inline XMXDECN4::XMXDECN4(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMXDEC4::XMXDEC4 -( - float _x, - float _y, - float _z, - float _w -) noexcept +inline XMXDEC4::XMXDEC4(float _x, float _y, float _z, float _w) noexcept { XMStoreXDec4(this, XMVectorSet(_x, _y, _z, _w)); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMXDEC4::XMXDEC4(const float* pArray) noexcept +_Use_decl_annotations_ inline XMXDEC4::XMXDEC4(const float* pArray) noexcept { XMStoreXDec4(this, XMLoadFloat4(reinterpret_cast(pArray))); } @@ -4359,20 +3962,13 @@ inline XMXDEC4::XMXDEC4(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMDECN4::XMDECN4 -( - float _x, - float _y, - float _z, - float _w -) noexcept +inline XMDECN4::XMDECN4(float _x, float _y, float _z, float _w) noexcept { XMStoreDecN4(this, XMVectorSet(_x, _y, _z, _w)); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMDECN4::XMDECN4(const float* pArray) noexcept +_Use_decl_annotations_ inline XMDECN4::XMDECN4(const float* pArray) noexcept { XMStoreDecN4(this, XMLoadFloat4(reinterpret_cast(pArray))); } @@ -4385,20 +3981,13 @@ inline XMDECN4::XMDECN4(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMDEC4::XMDEC4 -( - float _x, - float _y, - float _z, - float _w -) noexcept +inline XMDEC4::XMDEC4(float _x, float _y, float _z, float _w) noexcept { XMStoreDec4(this, XMVectorSet(_x, _y, _z, _w)); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMDEC4::XMDEC4(const float* pArray) noexcept +_Use_decl_annotations_ inline XMDEC4::XMDEC4(const float* pArray) noexcept { XMStoreDec4(this, XMLoadFloat4(reinterpret_cast(pArray))); } @@ -4421,20 +4010,13 @@ inline XMDEC4::XMDEC4(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMUDECN4::XMUDECN4 -( - float _x, - float _y, - float _z, - float _w -) noexcept +inline XMUDECN4::XMUDECN4(float _x, float _y, float _z, float _w) noexcept { XMStoreUDecN4(this, XMVectorSet(_x, _y, _z, _w)); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMUDECN4::XMUDECN4(const float* pArray) noexcept +_Use_decl_annotations_ inline XMUDECN4::XMUDECN4(const float* pArray) noexcept { XMStoreUDecN4(this, XMLoadFloat4(reinterpret_cast(pArray))); } @@ -4447,20 +4029,13 @@ inline XMUDECN4::XMUDECN4(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMUDEC4::XMUDEC4 -( - float _x, - float _y, - float _z, - float _w -) noexcept +inline XMUDEC4::XMUDEC4(float _x, float _y, float _z, float _w) noexcept { XMStoreUDec4(this, XMVectorSet(_x, _y, _z, _w)); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMUDEC4::XMUDEC4(const float* pArray) noexcept +_Use_decl_annotations_ inline XMUDEC4::XMUDEC4(const float* pArray) noexcept { XMStoreUDec4(this, XMLoadFloat4(reinterpret_cast(pArray))); } @@ -4473,20 +4048,13 @@ inline XMUDEC4::XMUDEC4(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMBYTEN4::XMBYTEN4 -( - float _x, - float _y, - float _z, - float _w -) noexcept +inline XMBYTEN4::XMBYTEN4(float _x, float _y, float _z, float _w) noexcept { XMStoreByteN4(this, XMVectorSet(_x, _y, _z, _w)); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMBYTEN4::XMBYTEN4(const float* pArray) noexcept +_Use_decl_annotations_ inline XMBYTEN4::XMBYTEN4(const float* pArray) noexcept { XMStoreByteN4(this, XMLoadFloat4(reinterpret_cast(pArray))); } @@ -4499,20 +4067,13 @@ inline XMBYTEN4::XMBYTEN4(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMBYTE4::XMBYTE4 -( - float _x, - float _y, - float _z, - float _w -) noexcept +inline XMBYTE4::XMBYTE4(float _x, float _y, float _z, float _w) noexcept { XMStoreByte4(this, XMVectorSet(_x, _y, _z, _w)); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMBYTE4::XMBYTE4(const float* pArray) noexcept +_Use_decl_annotations_ inline XMBYTE4::XMBYTE4(const float* pArray) noexcept { XMStoreByte4(this, XMLoadFloat4(reinterpret_cast(pArray))); } @@ -4525,20 +4086,13 @@ inline XMBYTE4::XMBYTE4(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMUBYTEN4::XMUBYTEN4 -( - float _x, - float _y, - float _z, - float _w -) noexcept +inline XMUBYTEN4::XMUBYTEN4(float _x, float _y, float _z, float _w) noexcept { XMStoreUByteN4(this, XMVectorSet(_x, _y, _z, _w)); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMUBYTEN4::XMUBYTEN4(const float* pArray) noexcept +_Use_decl_annotations_ inline XMUBYTEN4::XMUBYTEN4(const float* pArray) noexcept { XMStoreUByteN4(this, XMLoadFloat4(reinterpret_cast(pArray))); } @@ -4551,20 +4105,13 @@ inline XMUBYTEN4::XMUBYTEN4(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMUBYTE4::XMUBYTE4 -( - float _x, - float _y, - float _z, - float _w -) noexcept +inline XMUBYTE4::XMUBYTE4(float _x, float _y, float _z, float _w) noexcept { XMStoreUByte4(this, XMVectorSet(_x, _y, _z, _w)); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMUBYTE4::XMUBYTE4(const float* pArray) noexcept +_Use_decl_annotations_ inline XMUBYTE4::XMUBYTE4(const float* pArray) noexcept { XMStoreUByte4(this, XMLoadFloat4(reinterpret_cast(pArray))); } @@ -4577,20 +4124,13 @@ inline XMUBYTE4::XMUBYTE4(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMUNIBBLE4::XMUNIBBLE4 -( - float _x, - float _y, - float _z, - float _w -) noexcept +inline XMUNIBBLE4::XMUNIBBLE4(float _x, float _y, float _z, float _w) noexcept { XMStoreUNibble4(this, XMVectorSet(_x, _y, _z, _w)); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMUNIBBLE4::XMUNIBBLE4(const float* pArray) noexcept +_Use_decl_annotations_ inline XMUNIBBLE4::XMUNIBBLE4(const float* pArray) noexcept { XMStoreUNibble4(this, XMLoadFloat4(reinterpret_cast(pArray))); } @@ -4603,26 +4143,14 @@ inline XMUNIBBLE4::XMUNIBBLE4(const float* pArray) noexcept //------------------------------------------------------------------------------ -inline XMU555::XMU555 -( - float _x, - float _y, - float _z, - bool _w -) noexcept +inline XMU555::XMU555(float _x, float _y, float _z, bool _w) noexcept { XMStoreU555(this, XMVectorSet(_x, _y, _z, ((_w) ? 1.0f : 0.0f))); } //------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMU555::XMU555 -( - const float* pArray, - bool _w -) noexcept +_Use_decl_annotations_ inline XMU555::XMU555(const float* pArray, bool _w) noexcept { XMVECTOR V = XMLoadFloat3(reinterpret_cast(pArray)); XMStoreU555(this, XMVectorSetW(V, ((_w) ? 1.0f : 0.0f))); } - diff --git a/MatrixStack/DirectXMatrixStack.h b/MatrixStack/DirectXMatrixStack.h index 905e1c49..8e4f10bc 100644 --- a/MatrixStack/DirectXMatrixStack.h +++ b/MatrixStack/DirectXMatrixStack.h @@ -22,30 +22,29 @@ #include - namespace DirectX { class MatrixStack { public: - MatrixStack(size_t startSize = 16) noexcept(false) : - m_stackSize(0), - m_current(0), - m_stack(nullptr) + MatrixStack(size_t startSize = 16) noexcept(false) + : m_stackSize(0), + m_current(0), + m_stack(nullptr) { assert(startSize > 0); Allocate(startSize); LoadIdentity(); } - MatrixStack(MatrixStack&&) = default; - MatrixStack& operator= (MatrixStack&&) = default; + MatrixStack(MatrixStack&&) = default; + MatrixStack& operator=(MatrixStack&&) = default; - MatrixStack(MatrixStack const&) = delete; - MatrixStack& operator= (MatrixStack const&) = delete; + MatrixStack(MatrixStack const&) = delete; + MatrixStack& operator=(MatrixStack const&) = delete; const XMMATRIX XM_CALLCONV Top() const noexcept { return m_stack[m_current]; } - const XMMATRIX* GetTop() const noexcept { return &m_stack[m_current]; } + const XMMATRIX* GetTop() const noexcept { return &m_stack[m_current]; } size_t Size() const noexcept { return (m_current + 1); } @@ -71,22 +70,13 @@ namespace DirectX } // Loads identity into the top of the matrix stack. - void LoadIdentity() noexcept - { - m_stack[m_current] = XMMatrixIdentity(); - } + void LoadIdentity() noexcept { m_stack[m_current] = XMMatrixIdentity(); } // Load a matrix into the top of the matrix stack. - void XM_CALLCONV LoadMatrix(FXMMATRIX matrix) noexcept - { - m_stack[m_current] = matrix; - } + void XM_CALLCONV LoadMatrix(FXMMATRIX matrix) noexcept { m_stack[m_current] = matrix; } // Multiply a matrix by the top of the stack, store result in top. - void XM_CALLCONV MultiplyMatrix(FXMMATRIX matrix) noexcept - { - m_stack[m_current] = XMMatrixMultiply(m_stack[m_current], matrix); - } + void XM_CALLCONV MultiplyMatrix(FXMMATRIX matrix) noexcept { m_stack[m_current] = XMMatrixMultiply(m_stack[m_current], matrix); } // Pre-multiplies a matrix by the top of the stack, store result in top. void XM_CALLCONV MultiplyMatrixLocal(FXMMATRIX matrix) noexcept @@ -97,130 +87,129 @@ namespace DirectX // Add a rotation about X to stack top. void XM_CALLCONV RotateX(float angle) noexcept { - XMMATRIX mat = XMMatrixRotationX(angle); + XMMATRIX mat = XMMatrixRotationX(angle); m_stack[m_current] = XMMatrixMultiply(m_stack[m_current], mat); } void XM_CALLCONV RotateXLocal(float angle) noexcept { - XMMATRIX mat = XMMatrixRotationX(angle); + XMMATRIX mat = XMMatrixRotationX(angle); m_stack[m_current] = XMMatrixMultiply(mat, m_stack[m_current]); } // Add a rotation about Y to stack top. void XM_CALLCONV RotateY(float angle) noexcept { - XMMATRIX mat = XMMatrixRotationY(angle); + XMMATRIX mat = XMMatrixRotationY(angle); m_stack[m_current] = XMMatrixMultiply(m_stack[m_current], mat); } void XM_CALLCONV RotateYLocal(float angle) noexcept { - XMMATRIX mat = XMMatrixRotationY(angle); + XMMATRIX mat = XMMatrixRotationY(angle); m_stack[m_current] = XMMatrixMultiply(mat, m_stack[m_current]); } // Add a rotation about Z to stack top. void XM_CALLCONV RotateZ(float angle) noexcept { - XMMATRIX mat = XMMatrixRotationZ(angle); + XMMATRIX mat = XMMatrixRotationZ(angle); m_stack[m_current] = XMMatrixMultiply(m_stack[m_current], mat); } void XM_CALLCONV RotateZLocal(float angle) noexcept { - XMMATRIX mat = XMMatrixRotationZ(angle); + XMMATRIX mat = XMMatrixRotationZ(angle); m_stack[m_current] = XMMatrixMultiply(mat, m_stack[m_current]); } // Add a rotation around an axis to stack top. void XM_CALLCONV RotateAxis(FXMVECTOR axis, float angle) noexcept { - XMMATRIX mat = XMMatrixRotationAxis(axis, angle); + XMMATRIX mat = XMMatrixRotationAxis(axis, angle); m_stack[m_current] = XMMatrixMultiply(m_stack[m_current], mat); } void XM_CALLCONV RotateAxisLocal(FXMVECTOR axis, float angle) noexcept { - XMMATRIX mat = XMMatrixRotationAxis(axis, angle); + XMMATRIX mat = XMMatrixRotationAxis(axis, angle); m_stack[m_current] = XMMatrixMultiply(mat, m_stack[m_current]); } // Add a rotation by roll/pitch/yaw to the stack top. void RotateRollPitchYaw(float pitch, float yaw, float roll) noexcept { - XMMATRIX mat = XMMatrixRotationRollPitchYaw(pitch, yaw, roll); + XMMATRIX mat = XMMatrixRotationRollPitchYaw(pitch, yaw, roll); m_stack[m_current] = XMMatrixMultiply(m_stack[m_current], mat); } void RotateRollPitchYawLocal(float pitch, float yaw, float roll) noexcept { - XMMATRIX mat = XMMatrixRotationRollPitchYaw(pitch, yaw, roll); + XMMATRIX mat = XMMatrixRotationRollPitchYaw(pitch, yaw, roll); m_stack[m_current] = XMMatrixMultiply(mat, m_stack[m_current]); } // Add a rotation by a quaternion stack top. void XM_CALLCONV RotateByQuaternion(FXMVECTOR quat) noexcept { - XMMATRIX mat = XMMatrixRotationQuaternion(quat); + XMMATRIX mat = XMMatrixRotationQuaternion(quat); m_stack[m_current] = XMMatrixMultiply(m_stack[m_current], mat); } void XM_CALLCONV RotateByQuaternionLocal(FXMVECTOR quat) noexcept { - XMMATRIX mat = XMMatrixRotationQuaternion(quat); + XMMATRIX mat = XMMatrixRotationQuaternion(quat); m_stack[m_current] = XMMatrixMultiply(mat, m_stack[m_current]); } // Add a scale to the stack top. void Scale(float x, float y, float z) noexcept { - XMMATRIX mat = XMMatrixScaling(x, y, z); + XMMATRIX mat = XMMatrixScaling(x, y, z); m_stack[m_current] = XMMatrixMultiply(m_stack[m_current], mat); } void ScaleLocal(float x, float y, float z) noexcept { - XMMATRIX mat = XMMatrixScaling(x, y, z); + XMMATRIX mat = XMMatrixScaling(x, y, z); m_stack[m_current] = XMMatrixMultiply(mat, m_stack[m_current]); } // Add a translation to the stack top. void Translate(float x, float y, float z) noexcept { - XMMATRIX mat = XMMatrixTranslation(x, y, z); + XMMATRIX mat = XMMatrixTranslation(x, y, z); m_stack[m_current] = XMMatrixMultiply(m_stack[m_current], mat); } void TranslateLocal(float x, float y, float z) noexcept { - XMMATRIX mat = XMMatrixTranslation(x, y, z); + XMMATRIX mat = XMMatrixTranslation(x, y, z); m_stack[m_current] = XMMatrixMultiply(mat, m_stack[m_current]); } private: - struct matrix_deleter { void operator()(void* p) noexcept { - #ifdef _WIN32 +#ifdef _WIN32 _aligned_free(p); - #else +#else free(p); - #endif +#endif } }; void Allocate(size_t newSize) { - #ifdef _WIN32 +#ifdef _WIN32 void* ptr = _aligned_malloc(newSize * sizeof(XMMATRIX), 16); - #else - // This C++17 Standard Library function is currently NOT - // implemented for the Microsoft Standard C++ Library. +#else + // This C++17 Standard Library function is currently NOT + // implemented for the Microsoft Standard C++ Library. void* ptr = aligned_alloc(16, newSize * sizeof(XMMATRIX)); - #endif +#endif if (!ptr) throw std::bad_alloc(); @@ -234,8 +223,8 @@ namespace DirectX m_stackSize = newSize; } - size_t m_stackSize; - size_t m_current; - std::unique_ptr m_stack; + size_t m_stackSize; + size_t m_current; + std::unique_ptr m_stack; }; } // namespace DirectX diff --git a/SHMath/DirectXSH.cpp b/SHMath/DirectXSH.cpp index ddcb3fc7..47a6c4cc 100644 --- a/SHMath/DirectXSH.cpp +++ b/SHMath/DirectXSH.cpp @@ -8,7 +8,7 @@ //------------------------------------------------------------------------------------- #ifdef _MSC_VER -#pragma warning( disable : 4619 4456 5264) +#pragma warning(disable : 4619 4456 5264) // C4619 #pragma warning warnings // C4456 declaration hides previous local declaration // C5264 'const' variable is not used @@ -31,52 +31,55 @@ using namespace DirectX; namespace { #ifdef _PREFAST_ -#pragma prefast(disable:246, "generated code by maple (nested const variable definitions)") +#pragma prefast(disable : 246, "generated code by maple (nested const variable definitions)") #endif - const float fExtraNormFac[XM_SH_MAXORDER] = { 2.0f*sqrtf(XM_PI), 2.0f / 3.0f*sqrtf(3.0f*XM_PI), 2.0f / 5.0f*sqrtf(5.0f*XM_PI), 2.0f / 7.0f*sqrtf(7.0f*XM_PI), 2.0f / 3.0f*sqrtf(XM_PI), 2.0f / 11.0f*sqrtf(11.0f*XM_PI) }; + const float fExtraNormFac[XM_SH_MAXORDER] = { 2.0f * sqrtf(XM_PI), + 2.0f / 3.0f * sqrtf(3.0f * XM_PI), + 2.0f / 5.0f * sqrtf(5.0f * XM_PI), + 2.0f / 7.0f * sqrtf(7.0f * XM_PI), + 2.0f / 3.0f * sqrtf(XM_PI), + 2.0f / 11.0f * sqrtf(11.0f * XM_PI) }; // computes the integral of a constant function over a solid angular // extent. No error checking - only used internaly. This function // only returns the Yl0 coefficients, since the rest are zero for // circularly symmetric functions. - const float ComputeCapInt_t1 = sqrtf(0.3141593E1f); - const float ComputeCapInt_t5 = sqrtf(3.0f); + const float ComputeCapInt_t1 = sqrtf(0.3141593E1f); + const float ComputeCapInt_t5 = sqrtf(3.0f); const float ComputeCapInt_t11 = sqrtf(5.0f); const float ComputeCapInt_t18 = sqrtf(7.0f); const float ComputeCapInt_t32 = sqrtf(11.0f); - inline void ComputeCapInt(const size_t order, float angle, float *pR) + inline void ComputeCapInt(const size_t order, float angle, float* pR) { const float t2 = cosf(angle); - const float t3 = ComputeCapInt_t1*t2; + const float t3 = ComputeCapInt_t1 * t2; const float t7 = sinf(angle); - const float t8 = t7*t7; - + const float t8 = t7 * t7; pR[0] = -t3 + ComputeCapInt_t1; - pR[1] = ComputeCapInt_t5*ComputeCapInt_t1*t8 / 2.0f; + pR[1] = ComputeCapInt_t5 * ComputeCapInt_t1 * t8 / 2.0f; if (order > 2) { - const float t13 = t2*t2; + const float t13 = t2 * t2; - pR[2] = -ComputeCapInt_t11*ComputeCapInt_t1*t2*(t13 - 1.0f) / 2.0f; + pR[2] = -ComputeCapInt_t11 * ComputeCapInt_t1 * t2 * (t13 - 1.0f) / 2.0f; if (order > 3) { - const float t19 = ComputeCapInt_t18*ComputeCapInt_t1; - const float t20 = t13*t13; + const float t19 = ComputeCapInt_t18 * ComputeCapInt_t1; + const float t20 = t13 * t13; - pR[3] = -5.0f / 8.0f*t19*t20 + 3.0f / 4.0f*t19*t13 - t19 / 8.0f; + pR[3] = -5.0f / 8.0f * t19 * t20 + 3.0f / 4.0f * t19 * t13 - t19 / 8.0f; if (order > 4) { - - pR[4] = -3.0f / 8.0f*t3*(7.0f*t20 - 10.0f*t13 + 3.0f); + pR[4] = -3.0f / 8.0f * t3 * (7.0f * t20 - 10.0f * t13 + 3.0f); if (order > 5) { - const float t33 = ComputeCapInt_t32*ComputeCapInt_t1; - pR[5] = -21.0f / 16.0f*t33*t20*t13 + 35.0f / 16.0f*t33*t20 - 15.0f / 16.0f*t33*t13 + t33 / 16.0f; + const float t33 = ComputeCapInt_t32 * ComputeCapInt_t1; + pR[5] = -21.0f / 16.0f * t33 * t20 * t13 + 35.0f / 16.0f * t33 * t20 - 15.0f / 16.0f * t33 * t13 + t33 / 16.0f; } } } @@ -90,27 +93,29 @@ namespace const float fCW0 = 0.25f; const float fCW1 = 0.5f; const float fCW2 = 5.0f / 16.0f; - //const float fCW3 = 0.0f; + // const float fCW3 = 0.0f; const float fCW4 = -3.0f / 32.0f; - //const float fCW5 = 0.0f; + // const float fCW5 = 0.0f; // order has to be at least linear... float fRet = fCW0 + fCW1; - if (order > 2) fRet += fCW2; - if (order > 4) fRet += fCW4; + if (order > 2) + fRet += fCW2; + if (order > 4) + fRet += fCW4; // odd degrees >= 3 evaluate to zero integrated against cosine... return fRet; } - const float SHEvalHemisphereLight_fSqrtPi = sqrtf(XM_PI); + const float SHEvalHemisphereLight_fSqrtPi = sqrtf(XM_PI); const float SHEvalHemisphereLight_fSqrtPi3 = sqrtf(XM_PI / 3.0f); using REAL = float; -#define CONSTANT(x) (x ## f) +#define CONSTANT(x) (x##f) // routine generated programmatically for evaluating SH basis for degree 1 // inputs (x,y,z) are a point on the sphere (i.e., must be unit length) @@ -122,11 +127,10 @@ namespace // l=0 const REAL p_0_0 = CONSTANT(0.282094791773878140); - b[0] = p_0_0; // l=0,m=0 + b[0] = p_0_0; // l=0,m=0 // l=1 - const REAL p_1_0 = CONSTANT(0.488602511902919920)*z; - b[2] = p_1_0; // l=1,m=0 - + const REAL p_1_0 = CONSTANT(0.488602511902919920) * z; + b[2] = p_1_0; // l=1,m=0 /* m=1 */ @@ -135,8 +139,8 @@ namespace // l=1 const REAL p_1_1 = CONSTANT(-0.488602511902919920); - b[1] = p_1_1*s1; // l=1,m=-1 - b[3] = p_1_1*c1; // l=1,m=+1 + b[1] = p_1_1 * s1; // l=1,m=-1 + b[3] = p_1_1 * c1; // l=1,m=+1 } // routine generated programmatically for evaluating SH basis for degree 2 @@ -145,21 +149,19 @@ namespace // inline void sh_eval_basis_2(REAL x, REAL y, REAL z, REAL b[9]) { - const REAL z2 = z*z; - + const REAL z2 = z * z; /* m=0 */ // l=0 const REAL p_0_0 = CONSTANT(0.282094791773878140); - b[0] = p_0_0; // l=0,m=0 + b[0] = p_0_0; // l=0,m=0 // l=1 - const REAL p_1_0 = CONSTANT(0.488602511902919920)*z; - b[2] = p_1_0; // l=1,m=0 + const REAL p_1_0 = CONSTANT(0.488602511902919920) * z; + b[2] = p_1_0; // l=1,m=0 // l=2 - const REAL p_2_0 = CONSTANT(0.946174695757560080)*z2 + CONSTANT(-0.315391565252520050); - b[6] = p_2_0; // l=2,m=0 - + const REAL p_2_0 = CONSTANT(0.946174695757560080) * z2 + CONSTANT(-0.315391565252520050); + b[6] = p_2_0; // l=2,m=0 /* m=1 */ @@ -168,23 +170,22 @@ namespace // l=1 const REAL p_1_1 = CONSTANT(-0.488602511902919920); - b[1] = p_1_1*s1; // l=1,m=-1 - b[3] = p_1_1*c1; // l=1,m=+1 + b[1] = p_1_1 * s1; // l=1,m=-1 + b[3] = p_1_1 * c1; // l=1,m=+1 // l=2 - const REAL p_2_1 = CONSTANT(-1.092548430592079200)*z; - b[5] = p_2_1*s1; // l=2,m=-1 - b[7] = p_2_1*c1; // l=2,m=+1 - + const REAL p_2_1 = CONSTANT(-1.092548430592079200) * z; + b[5] = p_2_1 * s1; // l=2,m=-1 + b[7] = p_2_1 * c1; // l=2,m=+1 /* m=2 */ - const REAL s2 = x*s1 + y*c1; - const REAL c2 = x*c1 - y*s1; + const REAL s2 = x * s1 + y * c1; + const REAL c2 = x * c1 - y * s1; // l=2 const REAL p_2_2 = CONSTANT(0.546274215296039590); - b[4] = p_2_2*s2; // l=2,m=-2 - b[8] = p_2_2*c2; // l=2,m=+2 + b[4] = p_2_2 * s2; // l=2,m=-2 + b[8] = p_2_2 * c2; // l=2,m=+2 } // routine generated programmatically for evaluating SH basis for degree 3 @@ -193,24 +194,22 @@ namespace // void sh_eval_basis_3(REAL x, REAL y, REAL z, REAL b[16]) { - const REAL z2 = z*z; - + const REAL z2 = z * z; /* m=0 */ // l=0 const REAL p_0_0 = CONSTANT(0.282094791773878140); - b[0] = p_0_0; // l=0,m=0 + b[0] = p_0_0; // l=0,m=0 // l=1 - const REAL p_1_0 = CONSTANT(0.488602511902919920)*z; - b[2] = p_1_0; // l=1,m=0 + const REAL p_1_0 = CONSTANT(0.488602511902919920) * z; + b[2] = p_1_0; // l=1,m=0 // l=2 - const REAL p_2_0 = CONSTANT(0.946174695757560080)*z2 + CONSTANT(-0.315391565252520050); - b[6] = p_2_0; // l=2,m=0 + const REAL p_2_0 = CONSTANT(0.946174695757560080) * z2 + CONSTANT(-0.315391565252520050); + b[6] = p_2_0; // l=2,m=0 // l=3 - const REAL p_3_0 = z*(CONSTANT(1.865881662950577000)*z2 + CONSTANT(-1.119528997770346200)); - b[12] = p_3_0; // l=3,m=0 - + const REAL p_3_0 = z * (CONSTANT(1.865881662950577000) * z2 + CONSTANT(-1.119528997770346200)); + b[12] = p_3_0; // l=3,m=0 /* m=1 */ @@ -219,42 +218,40 @@ namespace // l=1 const REAL p_1_1 = CONSTANT(-0.488602511902919920); - b[1] = p_1_1*s1; // l=1,m=-1 - b[3] = p_1_1*c1; // l=1,m=+1 + b[1] = p_1_1 * s1; // l=1,m=-1 + b[3] = p_1_1 * c1; // l=1,m=+1 // l=2 - const REAL p_2_1 = CONSTANT(-1.092548430592079200)*z; - b[5] = p_2_1*s1; // l=2,m=-1 - b[7] = p_2_1*c1; // l=2,m=+1 + const REAL p_2_1 = CONSTANT(-1.092548430592079200) * z; + b[5] = p_2_1 * s1; // l=2,m=-1 + b[7] = p_2_1 * c1; // l=2,m=+1 // l=3 - const REAL p_3_1 = CONSTANT(-2.285228997322328800)*z2 + CONSTANT(0.457045799464465770); - b[11] = p_3_1*s1; // l=3,m=-1 - b[13] = p_3_1*c1; // l=3,m=+1 - + const REAL p_3_1 = CONSTANT(-2.285228997322328800) * z2 + CONSTANT(0.457045799464465770); + b[11] = p_3_1 * s1; // l=3,m=-1 + b[13] = p_3_1 * c1; // l=3,m=+1 /* m=2 */ - const REAL s2 = x*s1 + y*c1; - const REAL c2 = x*c1 - y*s1; + const REAL s2 = x * s1 + y * c1; + const REAL c2 = x * c1 - y * s1; // l=2 const REAL p_2_2 = CONSTANT(0.546274215296039590); - b[4] = p_2_2*s2; // l=2,m=-2 - b[8] = p_2_2*c2; // l=2,m=+2 + b[4] = p_2_2 * s2; // l=2,m=-2 + b[8] = p_2_2 * c2; // l=2,m=+2 // l=3 - const REAL p_3_2 = CONSTANT(1.445305721320277100)*z; - b[10] = p_3_2*s2; // l=3,m=-2 - b[14] = p_3_2*c2; // l=3,m=+2 - + const REAL p_3_2 = CONSTANT(1.445305721320277100) * z; + b[10] = p_3_2 * s2; // l=3,m=-2 + b[14] = p_3_2 * c2; // l=3,m=+2 /* m=3 */ - const REAL s3 = x*s2 + y*c2; - const REAL c3 = x*c2 - y*s2; + const REAL s3 = x * s2 + y * c2; + const REAL c3 = x * c2 - y * s2; // l=3 const REAL p_3_3 = CONSTANT(-0.590043589926643520); - b[9] = p_3_3*s3; // l=3,m=-3 - b[15] = p_3_3*c3; // l=3,m=+3 + b[9] = p_3_3 * s3; // l=3,m=-3 + b[15] = p_3_3 * c3; // l=3,m=+3 } // routine generated programmatically for evaluating SH basis for degree 4 @@ -263,27 +260,25 @@ namespace // void sh_eval_basis_4(REAL x, REAL y, REAL z, REAL b[25]) { - const REAL z2 = z*z; - + const REAL z2 = z * z; /* m=0 */ // l=0 const REAL p_0_0 = CONSTANT(0.282094791773878140); - b[0] = p_0_0; // l=0,m=0 + b[0] = p_0_0; // l=0,m=0 // l=1 - const REAL p_1_0 = CONSTANT(0.488602511902919920)*z; - b[2] = p_1_0; // l=1,m=0 + const REAL p_1_0 = CONSTANT(0.488602511902919920) * z; + b[2] = p_1_0; // l=1,m=0 // l=2 - const REAL p_2_0 = CONSTANT(0.946174695757560080)*z2 + CONSTANT(-0.315391565252520050); - b[6] = p_2_0; // l=2,m=0 + const REAL p_2_0 = CONSTANT(0.946174695757560080) * z2 + CONSTANT(-0.315391565252520050); + b[6] = p_2_0; // l=2,m=0 // l=3 - const REAL p_3_0 = z*(CONSTANT(1.865881662950577000)*z2 + CONSTANT(-1.119528997770346200)); - b[12] = p_3_0; // l=3,m=0 + const REAL p_3_0 = z * (CONSTANT(1.865881662950577000) * z2 + CONSTANT(-1.119528997770346200)); + b[12] = p_3_0; // l=3,m=0 // l=4 - const REAL p_4_0 = CONSTANT(1.984313483298443000)*z*p_3_0 + CONSTANT(-1.006230589874905300)*p_2_0; - b[20] = p_4_0; // l=4,m=0 - + const REAL p_4_0 = CONSTANT(1.984313483298443000) * z * p_3_0 + CONSTANT(-1.006230589874905300) * p_2_0; + b[20] = p_4_0; // l=4,m=0 /* m=1 */ @@ -292,65 +287,62 @@ namespace // l=1 const REAL p_1_1 = CONSTANT(-0.488602511902919920); - b[1] = p_1_1*s1; // l=1,m=-1 - b[3] = p_1_1*c1; // l=1,m=+1 + b[1] = p_1_1 * s1; // l=1,m=-1 + b[3] = p_1_1 * c1; // l=1,m=+1 // l=2 - const REAL p_2_1 = CONSTANT(-1.092548430592079200)*z; - b[5] = p_2_1*s1; // l=2,m=-1 - b[7] = p_2_1*c1; // l=2,m=+1 + const REAL p_2_1 = CONSTANT(-1.092548430592079200) * z; + b[5] = p_2_1 * s1; // l=2,m=-1 + b[7] = p_2_1 * c1; // l=2,m=+1 // l=3 - const REAL p_3_1 = CONSTANT(-2.285228997322328800)*z2 + CONSTANT(0.457045799464465770); - b[11] = p_3_1*s1; // l=3,m=-1 - b[13] = p_3_1*c1; // l=3,m=+1 + const REAL p_3_1 = CONSTANT(-2.285228997322328800) * z2 + CONSTANT(0.457045799464465770); + b[11] = p_3_1 * s1; // l=3,m=-1 + b[13] = p_3_1 * c1; // l=3,m=+1 // l=4 - const REAL p_4_1 = z*(CONSTANT(-4.683325804901024000)*z2 + CONSTANT(2.007139630671867200)); - b[19] = p_4_1*s1; // l=4,m=-1 - b[21] = p_4_1*c1; // l=4,m=+1 - + const REAL p_4_1 = z * (CONSTANT(-4.683325804901024000) * z2 + CONSTANT(2.007139630671867200)); + b[19] = p_4_1 * s1; // l=4,m=-1 + b[21] = p_4_1 * c1; // l=4,m=+1 /* m=2 */ - const REAL s2 = x*s1 + y*c1; - const REAL c2 = x*c1 - y*s1; + const REAL s2 = x * s1 + y * c1; + const REAL c2 = x * c1 - y * s1; // l=2 const REAL p_2_2 = CONSTANT(0.546274215296039590); - b[4] = p_2_2*s2; // l=2,m=-2 - b[8] = p_2_2*c2; // l=2,m=+2 + b[4] = p_2_2 * s2; // l=2,m=-2 + b[8] = p_2_2 * c2; // l=2,m=+2 // l=3 - const REAL p_3_2 = CONSTANT(1.445305721320277100)*z; - b[10] = p_3_2*s2; // l=3,m=-2 - b[14] = p_3_2*c2; // l=3,m=+2 + const REAL p_3_2 = CONSTANT(1.445305721320277100) * z; + b[10] = p_3_2 * s2; // l=3,m=-2 + b[14] = p_3_2 * c2; // l=3,m=+2 // l=4 - const REAL p_4_2 = CONSTANT(3.311611435151459800)*z2 + CONSTANT(-0.473087347878779980); - b[18] = p_4_2*s2; // l=4,m=-2 - b[22] = p_4_2*c2; // l=4,m=+2 - + const REAL p_4_2 = CONSTANT(3.311611435151459800) * z2 + CONSTANT(-0.473087347878779980); + b[18] = p_4_2 * s2; // l=4,m=-2 + b[22] = p_4_2 * c2; // l=4,m=+2 /* m=3 */ - const REAL s3 = x*s2 + y*c2; - const REAL c3 = x*c2 - y*s2; + const REAL s3 = x * s2 + y * c2; + const REAL c3 = x * c2 - y * s2; // l=3 const REAL p_3_3 = CONSTANT(-0.590043589926643520); - b[9] = p_3_3*s3; // l=3,m=-3 - b[15] = p_3_3*c3; // l=3,m=+3 + b[9] = p_3_3 * s3; // l=3,m=-3 + b[15] = p_3_3 * c3; // l=3,m=+3 // l=4 - const REAL p_4_3 = CONSTANT(-1.770130769779930200)*z; - b[17] = p_4_3*s3; // l=4,m=-3 - b[23] = p_4_3*c3; // l=4,m=+3 - + const REAL p_4_3 = CONSTANT(-1.770130769779930200) * z; + b[17] = p_4_3 * s3; // l=4,m=-3 + b[23] = p_4_3 * c3; // l=4,m=+3 /* m=4 */ - const REAL s4 = x*s3 + y*c3; - const REAL c4 = x*c3 - y*s3; + const REAL s4 = x * s3 + y * c3; + const REAL c4 = x * c3 - y * s3; // l=4 const REAL p_4_4 = CONSTANT(0.625835735449176030); - b[16] = p_4_4*s4; // l=4,m=-4 - b[24] = p_4_4*c4; // l=4,m=+4 + b[16] = p_4_4 * s4; // l=4,m=-4 + b[24] = p_4_4 * c4; // l=4,m=+4 } // routine generated programmatically for evaluating SH basis for degree 5 @@ -359,30 +351,28 @@ namespace // void sh_eval_basis_5(REAL x, REAL y, REAL z, REAL b[36]) { - const REAL z2 = z*z; - + const REAL z2 = z * z; /* m=0 */ // l=0 const REAL p_0_0 = CONSTANT(0.282094791773878140); - b[0] = p_0_0; // l=0,m=0 + b[0] = p_0_0; // l=0,m=0 // l=1 - const REAL p_1_0 = CONSTANT(0.488602511902919920)*z; - b[2] = p_1_0; // l=1,m=0 + const REAL p_1_0 = CONSTANT(0.488602511902919920) * z; + b[2] = p_1_0; // l=1,m=0 // l=2 - const REAL p_2_0 = CONSTANT(0.946174695757560080)*z2 + CONSTANT(-0.315391565252520050); - b[6] = p_2_0; // l=2,m=0 + const REAL p_2_0 = CONSTANT(0.946174695757560080) * z2 + CONSTANT(-0.315391565252520050); + b[6] = p_2_0; // l=2,m=0 // l=3 - const REAL p_3_0 = z*(CONSTANT(1.865881662950577000)*z2 + CONSTANT(-1.119528997770346200)); - b[12] = p_3_0; // l=3,m=0 + const REAL p_3_0 = z * (CONSTANT(1.865881662950577000) * z2 + CONSTANT(-1.119528997770346200)); + b[12] = p_3_0; // l=3,m=0 // l=4 - const REAL p_4_0 = CONSTANT(1.984313483298443000)*z*p_3_0 + CONSTANT(-1.006230589874905300)*p_2_0; - b[20] = p_4_0; // l=4,m=0 + const REAL p_4_0 = CONSTANT(1.984313483298443000) * z * p_3_0 + CONSTANT(-1.006230589874905300) * p_2_0; + b[20] = p_4_0; // l=4,m=0 // l=5 - const REAL p_5_0 = CONSTANT(1.989974874213239700)*z*p_4_0 + CONSTANT(-1.002853072844814000)*p_3_0; - b[30] = p_5_0; // l=5,m=0 - + const REAL p_5_0 = CONSTANT(1.989974874213239700) * z * p_4_0 + CONSTANT(-1.002853072844814000) * p_3_0; + b[30] = p_5_0; // l=5,m=0 /* m=1 */ @@ -391,127 +381,123 @@ namespace // l=1 const REAL p_1_1 = CONSTANT(-0.488602511902919920); - b[1] = p_1_1*s1; // l=1,m=-1 - b[3] = p_1_1*c1; // l=1,m=+1 + b[1] = p_1_1 * s1; // l=1,m=-1 + b[3] = p_1_1 * c1; // l=1,m=+1 // l=2 - const REAL p_2_1 = CONSTANT(-1.092548430592079200)*z; - b[5] = p_2_1*s1; // l=2,m=-1 - b[7] = p_2_1*c1; // l=2,m=+1 + const REAL p_2_1 = CONSTANT(-1.092548430592079200) * z; + b[5] = p_2_1 * s1; // l=2,m=-1 + b[7] = p_2_1 * c1; // l=2,m=+1 // l=3 - const REAL p_3_1 = CONSTANT(-2.285228997322328800)*z2 + CONSTANT(0.457045799464465770); - b[11] = p_3_1*s1; // l=3,m=-1 - b[13] = p_3_1*c1; // l=3,m=+1 + const REAL p_3_1 = CONSTANT(-2.285228997322328800) * z2 + CONSTANT(0.457045799464465770); + b[11] = p_3_1 * s1; // l=3,m=-1 + b[13] = p_3_1 * c1; // l=3,m=+1 // l=4 - const REAL p_4_1 = z*(CONSTANT(-4.683325804901024000)*z2 + CONSTANT(2.007139630671867200)); - b[19] = p_4_1*s1; // l=4,m=-1 - b[21] = p_4_1*c1; // l=4,m=+1 + const REAL p_4_1 = z * (CONSTANT(-4.683325804901024000) * z2 + CONSTANT(2.007139630671867200)); + b[19] = p_4_1 * s1; // l=4,m=-1 + b[21] = p_4_1 * c1; // l=4,m=+1 // l=5 - const REAL p_5_1 = CONSTANT(2.031009601158990200)*z*p_4_1 + CONSTANT(-0.991031208965114650)*p_3_1; - b[29] = p_5_1*s1; // l=5,m=-1 - b[31] = p_5_1*c1; // l=5,m=+1 - + const REAL p_5_1 = CONSTANT(2.031009601158990200) * z * p_4_1 + CONSTANT(-0.991031208965114650) * p_3_1; + b[29] = p_5_1 * s1; // l=5,m=-1 + b[31] = p_5_1 * c1; // l=5,m=+1 /* m=2 */ - const REAL s2 = x*s1 + y*c1; - const REAL c2 = x*c1 - y*s1; + const REAL s2 = x * s1 + y * c1; + const REAL c2 = x * c1 - y * s1; // l=2 const REAL p_2_2 = CONSTANT(0.546274215296039590); - b[4] = p_2_2*s2; // l=2,m=-2 - b[8] = p_2_2*c2; // l=2,m=+2 + b[4] = p_2_2 * s2; // l=2,m=-2 + b[8] = p_2_2 * c2; // l=2,m=+2 // l=3 - const REAL p_3_2 = CONSTANT(1.445305721320277100)*z; - b[10] = p_3_2*s2; // l=3,m=-2 - b[14] = p_3_2*c2; // l=3,m=+2 + const REAL p_3_2 = CONSTANT(1.445305721320277100) * z; + b[10] = p_3_2 * s2; // l=3,m=-2 + b[14] = p_3_2 * c2; // l=3,m=+2 // l=4 - const REAL p_4_2 = CONSTANT(3.311611435151459800)*z2 + CONSTANT(-0.473087347878779980); - b[18] = p_4_2*s2; // l=4,m=-2 - b[22] = p_4_2*c2; // l=4,m=+2 + const REAL p_4_2 = CONSTANT(3.311611435151459800) * z2 + CONSTANT(-0.473087347878779980); + b[18] = p_4_2 * s2; // l=4,m=-2 + b[22] = p_4_2 * c2; // l=4,m=+2 // l=5 - const REAL p_5_2 = z*(CONSTANT(7.190305177459987500)*z2 + CONSTANT(-2.396768392486662100)); - b[28] = p_5_2*s2; // l=5,m=-2 - b[32] = p_5_2*c2; // l=5,m=+2 - + const REAL p_5_2 = z * (CONSTANT(7.190305177459987500) * z2 + CONSTANT(-2.396768392486662100)); + b[28] = p_5_2 * s2; // l=5,m=-2 + b[32] = p_5_2 * c2; // l=5,m=+2 /* m=3 */ - const REAL s3 = x*s2 + y*c2; - const REAL c3 = x*c2 - y*s2; + const REAL s3 = x * s2 + y * c2; + const REAL c3 = x * c2 - y * s2; // l=3 const REAL p_3_3 = CONSTANT(-0.590043589926643520); - b[9] = p_3_3*s3; // l=3,m=-3 - b[15] = p_3_3*c3; // l=3,m=+3 + b[9] = p_3_3 * s3; // l=3,m=-3 + b[15] = p_3_3 * c3; // l=3,m=+3 // l=4 - const REAL p_4_3 = CONSTANT(-1.770130769779930200)*z; - b[17] = p_4_3*s3; // l=4,m=-3 - b[23] = p_4_3*c3; // l=4,m=+3 + const REAL p_4_3 = CONSTANT(-1.770130769779930200) * z; + b[17] = p_4_3 * s3; // l=4,m=-3 + b[23] = p_4_3 * c3; // l=4,m=+3 // l=5 - const REAL p_5_3 = CONSTANT(-4.403144694917253700)*z2 + CONSTANT(0.489238299435250430); - b[27] = p_5_3*s3; // l=5,m=-3 - b[33] = p_5_3*c3; // l=5,m=+3 - + const REAL p_5_3 = CONSTANT(-4.403144694917253700) * z2 + CONSTANT(0.489238299435250430); + b[27] = p_5_3 * s3; // l=5,m=-3 + b[33] = p_5_3 * c3; // l=5,m=+3 /* m=4 */ - const REAL s4 = x*s3 + y*c3; - const REAL c4 = x*c3 - y*s3; + const REAL s4 = x * s3 + y * c3; + const REAL c4 = x * c3 - y * s3; // l=4 const REAL p_4_4 = CONSTANT(0.625835735449176030); - b[16] = p_4_4*s4; // l=4,m=-4 - b[24] = p_4_4*c4; // l=4,m=+4 + b[16] = p_4_4 * s4; // l=4,m=-4 + b[24] = p_4_4 * c4; // l=4,m=+4 // l=5 - const REAL p_5_4 = CONSTANT(2.075662314881041100)*z; - b[26] = p_5_4*s4; // l=5,m=-4 - b[34] = p_5_4*c4; // l=5,m=+4 - + const REAL p_5_4 = CONSTANT(2.075662314881041100) * z; + b[26] = p_5_4 * s4; // l=5,m=-4 + b[34] = p_5_4 * c4; // l=5,m=+4 /* m=5 */ - const REAL s5 = x*s4 + y*c4; - const REAL c5 = x*c4 - y*s4; + const REAL s5 = x * s4 + y * c4; + const REAL c5 = x * c4 - y * s4; // l=5 const REAL p_5_5 = CONSTANT(-0.656382056840170150); - b[25] = p_5_5*s5; // l=5,m=-5 - b[35] = p_5_5*c5; // l=5,m=+5 + b[25] = p_5_5 * s5; // l=5,m=-5 + b[35] = p_5_5 * c5; // l=5,m=+5 } - const REAL M_PIjs = (REAL)(4.0*atan(1.0)); + const REAL M_PIjs = (REAL)(4.0 * atan(1.0)); const REAL maxang = (REAL)(M_PIjs / 2); - const int NSH0 = 1; - const int NSH1 = 4; - const int NSH2 = 9; - const int NSH3 = 16; - const int NSH4 = 25; - const int NSH5 = 36; - const int NSH6 = 49; - const int NSH7 = 64; - const int NSH8 = 81; - const int NSH9 = 100; - const int NL0 = 1; - const int NL1 = 3; - const int NL2 = 5; - const int NL3 = 7; - const int NL4 = 9; - const int NL5 = 11; - const int NL6 = 13; - const int NL7 = 15; - const int NL8 = 17; - const int NL9 = 19; - - inline void rot(REAL ct, REAL st, REAL x, REAL y, REAL &xout, REAL &yout) + const int NSH0 = 1; + const int NSH1 = 4; + const int NSH2 = 9; + const int NSH3 = 16; + const int NSH4 = 25; + const int NSH5 = 36; + const int NSH6 = 49; + const int NSH7 = 64; + const int NSH8 = 81; + const int NSH9 = 100; + const int NL0 = 1; + const int NL1 = 3; + const int NL2 = 5; + const int NL3 = 7; + const int NL4 = 9; + const int NL5 = 11; + const int NL6 = 13; + const int NL7 = 15; + const int NL8 = 17; + const int NL9 = 19; + + inline void rot(REAL ct, REAL st, REAL x, REAL y, REAL& xout, REAL& yout) { - xout = x*ct - y*st; - yout = y*ct + x*st; + xout = x * ct - y * st; + yout = y * ct + x * st; } - inline void rot_inv(REAL ct, REAL st, REAL x, REAL y, REAL &xout, REAL &yout) + inline void rot_inv(REAL ct, REAL st, REAL x, REAL y, REAL& xout, REAL& yout) { - xout = x*ct + y*st; - yout = y*ct - x*st; + xout = x * ct + y * st; + yout = y * ct - x * st; } inline void rot_1(REAL ct, REAL st, REAL ctm[1], REAL stm[1]) @@ -522,50 +508,50 @@ namespace inline void rot_2(REAL ct, REAL st, REAL ctm[2], REAL stm[2]) { - REAL ct2 = CONSTANT(2.0)*ct; - ctm[0] = ct; - stm[0] = st; - ctm[1] = ct2*ct - CONSTANT(1.0); - stm[1] = ct2*st; + REAL ct2 = CONSTANT(2.0) * ct; + ctm[0] = ct; + stm[0] = st; + ctm[1] = ct2 * ct - CONSTANT(1.0); + stm[1] = ct2 * st; } inline void rot_3(REAL ct, REAL st, REAL ctm[3], REAL stm[3]) { - REAL ct2 = CONSTANT(2.0)*ct; - ctm[0] = ct; - stm[0] = st; - ctm[1] = ct2*ct - CONSTANT(1.0); - stm[1] = ct2*st; - ctm[2] = ct2*ctm[1] - ct; - stm[2] = ct2*stm[1] - st; + REAL ct2 = CONSTANT(2.0) * ct; + ctm[0] = ct; + stm[0] = st; + ctm[1] = ct2 * ct - CONSTANT(1.0); + stm[1] = ct2 * st; + ctm[2] = ct2 * ctm[1] - ct; + stm[2] = ct2 * stm[1] - st; } inline void rot_4(REAL ct, REAL st, REAL ctm[4], REAL stm[4]) { - REAL ct2 = CONSTANT(2.0)*ct; - ctm[0] = ct; - stm[0] = st; - ctm[1] = ct2*ct - CONSTANT(1.0); - stm[1] = ct2*st; - ctm[2] = ct2*ctm[1] - ct; - stm[2] = ct2*stm[1] - st; - ctm[3] = ct2*ctm[2] - ctm[1]; - stm[3] = ct2*stm[2] - stm[1]; + REAL ct2 = CONSTANT(2.0) * ct; + ctm[0] = ct; + stm[0] = st; + ctm[1] = ct2 * ct - CONSTANT(1.0); + stm[1] = ct2 * st; + ctm[2] = ct2 * ctm[1] - ct; + stm[2] = ct2 * stm[1] - st; + ctm[3] = ct2 * ctm[2] - ctm[1]; + stm[3] = ct2 * stm[2] - stm[1]; } inline void rot_5(REAL ct, REAL st, REAL ctm[5], REAL stm[5]) { - REAL ct2 = CONSTANT(2.0)*ct; - ctm[0] = ct; - stm[0] = st; - ctm[1] = ct2*ct - CONSTANT(1.0); - stm[1] = ct2*st; - ctm[2] = ct2*ctm[1] - ct; - stm[2] = ct2*stm[1] - st; - ctm[3] = ct2*ctm[2] - ctm[1]; - stm[3] = ct2*stm[2] - stm[1]; - ctm[4] = ct2*ctm[3] - ctm[2]; - stm[4] = ct2*stm[3] - stm[2]; + REAL ct2 = CONSTANT(2.0) * ct; + ctm[0] = ct; + stm[0] = st; + ctm[1] = ct2 * ct - CONSTANT(1.0); + stm[1] = ct2 * st; + ctm[2] = ct2 * ctm[1] - ct; + stm[2] = ct2 * stm[1] - st; + ctm[3] = ct2 * ctm[2] - ctm[1]; + stm[3] = ct2 * stm[2] - stm[1]; + ctm[4] = ct2 * ctm[3] - ctm[2]; + stm[4] = ct2 * stm[3] - stm[2]; } inline void sh_rotz_1(REAL ctm[1], REAL stm[1], REAL y[NL1], REAL yr[NL1]) @@ -610,170 +596,170 @@ namespace // rotation code generated programmatically by rotatex (2000x4000 samples, eps=1e-008) - const REAL fx_1_001 = (REAL)(sqrt(1.0) / 1.0); // 1 + const REAL fx_1_001 = (REAL)(sqrt(1.0) / 1.0); // 1 const REAL fx_1_002 = (REAL)(-sqrt(1.0) / 1.0); // -1.00000030843 inline void sh_rotx90_1(REAL y[], REAL yr[]) { - yr[0] = fx_1_001*y[1]; - yr[1] = fx_1_002*y[0]; - yr[2] = fx_1_001*y[2]; + yr[0] = fx_1_001 * y[1]; + yr[1] = fx_1_002 * y[0]; + yr[2] = fx_1_001 * y[2]; }; inline void sh_rotx90_inv_1(REAL y[], REAL yr[]) { - yr[0] = fx_1_002*y[1]; - yr[1] = fx_1_001*y[0]; - yr[2] = fx_1_001*y[2]; + yr[0] = fx_1_002 * y[1]; + yr[1] = fx_1_001 * y[0]; + yr[2] = fx_1_001 * y[2]; } - const REAL fx_2_001 = (REAL)(sqrt(4.0) / 2.0); // 1 + const REAL fx_2_001 = (REAL)(sqrt(4.0) / 2.0); // 1 const REAL fx_2_002 = (REAL)(-sqrt(4.0) / 2.0); // -1 const REAL fx_2_003 = (REAL)(-sqrt(1.0) / 2.0); // -0.500000257021 const REAL fx_2_004 = (REAL)(-sqrt(3.0) / 2.0); // -0.866025848959 - const REAL fx_2_005 = (REAL)(sqrt(1.0) / 2.0); // 0.5 + const REAL fx_2_005 = (REAL)(sqrt(1.0) / 2.0); // 0.5 inline void sh_rotx90_2(REAL y[], REAL yr[]) { - yr[0] = fx_2_001*y[3]; - yr[1] = fx_2_002*y[1]; - yr[2] = fx_2_003*y[2] + fx_2_004*y[4]; - yr[3] = fx_2_002*y[0]; - yr[4] = fx_2_004*y[2] + fx_2_005*y[4]; + yr[0] = fx_2_001 * y[3]; + yr[1] = fx_2_002 * y[1]; + yr[2] = fx_2_003 * y[2] + fx_2_004 * y[4]; + yr[3] = fx_2_002 * y[0]; + yr[4] = fx_2_004 * y[2] + fx_2_005 * y[4]; }; inline void sh_rotx90_inv_2(REAL y[], REAL yr[]) { - yr[0] = fx_2_002*y[3]; - yr[1] = fx_2_002*y[1]; - yr[2] = fx_2_003*y[2] + fx_2_004*y[4]; - yr[3] = fx_2_001*y[0]; - yr[4] = fx_2_004*y[2] + fx_2_005*y[4]; + yr[0] = fx_2_002 * y[3]; + yr[1] = fx_2_002 * y[1]; + yr[2] = fx_2_003 * y[2] + fx_2_004 * y[4]; + yr[3] = fx_2_001 * y[0]; + yr[4] = fx_2_004 * y[2] + fx_2_005 * y[4]; } const REAL fx_3_001 = (REAL)(-sqrt(10.0) / 4.0); // -0.790569415042 - const REAL fx_3_002 = (REAL)(sqrt(6.0) / 4.0); // 0.612372435696 + const REAL fx_3_002 = (REAL)(sqrt(6.0) / 4.0); // 0.612372435696 const REAL fx_3_003 = (REAL)(-sqrt(16.0) / 4.0); // -1 - const REAL fx_3_004 = (REAL)(-sqrt(6.0) / 4.0); // -0.612372435695 - const REAL fx_3_005 = (REAL)(-sqrt(1.0) / 4.0); // -0.25 + const REAL fx_3_004 = (REAL)(-sqrt(6.0) / 4.0); // -0.612372435695 + const REAL fx_3_005 = (REAL)(-sqrt(1.0) / 4.0); // -0.25 const REAL fx_3_006 = (REAL)(-sqrt(15.0) / 4.0); // -0.968245836551 - const REAL fx_3_007 = (REAL)(sqrt(1.0) / 4.0); // 0.25 - const REAL fx_3_008 = (REAL)(sqrt(10.0) / 4.0); // 0.790569983984 + const REAL fx_3_007 = (REAL)(sqrt(1.0) / 4.0); // 0.25 + const REAL fx_3_008 = (REAL)(sqrt(10.0) / 4.0); // 0.790569983984 inline void sh_rotx90_3(REAL y[], REAL yr[]) { - yr[0] = fx_3_001*y[3] + fx_3_002*y[5]; - yr[1] = fx_3_003*y[1]; - yr[2] = fx_3_004*y[3] + fx_3_001*y[5]; - yr[3] = fx_3_008*y[0] + fx_3_002*y[2]; - yr[4] = fx_3_005*y[4] + fx_3_006*y[6]; - yr[5] = fx_3_004*y[0] - fx_3_001*y[2]; - yr[6] = fx_3_006*y[4] + fx_3_007*y[6]; + yr[0] = fx_3_001 * y[3] + fx_3_002 * y[5]; + yr[1] = fx_3_003 * y[1]; + yr[2] = fx_3_004 * y[3] + fx_3_001 * y[5]; + yr[3] = fx_3_008 * y[0] + fx_3_002 * y[2]; + yr[4] = fx_3_005 * y[4] + fx_3_006 * y[6]; + yr[5] = fx_3_004 * y[0] - fx_3_001 * y[2]; + yr[6] = fx_3_006 * y[4] + fx_3_007 * y[6]; }; inline void sh_rotx90_inv_3(REAL y[], REAL yr[]) { - yr[0] = fx_3_008*y[3] + fx_3_004*y[5]; - yr[1] = fx_3_003*y[1]; - yr[2] = fx_3_002*y[3] - fx_3_001*y[5]; - yr[3] = fx_3_001*y[0] + fx_3_004*y[2]; - yr[4] = fx_3_005*y[4] + fx_3_006*y[6]; - yr[5] = fx_3_002*y[0] + fx_3_001*y[2]; - yr[6] = fx_3_006*y[4] + fx_3_007*y[6]; + yr[0] = fx_3_008 * y[3] + fx_3_004 * y[5]; + yr[1] = fx_3_003 * y[1]; + yr[2] = fx_3_002 * y[3] - fx_3_001 * y[5]; + yr[3] = fx_3_001 * y[0] + fx_3_004 * y[2]; + yr[4] = fx_3_005 * y[4] + fx_3_006 * y[6]; + yr[5] = fx_3_002 * y[0] + fx_3_001 * y[2]; + yr[6] = fx_3_006 * y[4] + fx_3_007 * y[6]; } const REAL fx_4_001 = (REAL)(-sqrt(56.0) / 8.0); // -0.935414346694 - const REAL fx_4_002 = (REAL)(sqrt(8.0) / 8.0); // 0.353553390593 + const REAL fx_4_002 = (REAL)(sqrt(8.0) / 8.0); // 0.353553390593 const REAL fx_4_003 = (REAL)(-sqrt(36.0) / 8.0); // -0.75 - const REAL fx_4_004 = (REAL)(sqrt(28.0) / 8.0); // 0.661437827766 - const REAL fx_4_005 = (REAL)(-sqrt(8.0) / 8.0); // -0.353553390593 - const REAL fx_4_006 = (REAL)(sqrt(36.0) / 8.0); // 0.749999999999 - const REAL fx_4_007 = (REAL)(sqrt(9.0) / 8.0); // 0.37500034698 - const REAL fx_4_008 = (REAL)(sqrt(20.0) / 8.0); // 0.559017511622 - const REAL fx_4_009 = (REAL)(sqrt(35.0) / 8.0); // 0.739510657141 - const REAL fx_4_010 = (REAL)(sqrt(16.0) / 8.0); // 0.5 + const REAL fx_4_004 = (REAL)(sqrt(28.0) / 8.0); // 0.661437827766 + const REAL fx_4_005 = (REAL)(-sqrt(8.0) / 8.0); // -0.353553390593 + const REAL fx_4_006 = (REAL)(sqrt(36.0) / 8.0); // 0.749999999999 + const REAL fx_4_007 = (REAL)(sqrt(9.0) / 8.0); // 0.37500034698 + const REAL fx_4_008 = (REAL)(sqrt(20.0) / 8.0); // 0.559017511622 + const REAL fx_4_009 = (REAL)(sqrt(35.0) / 8.0); // 0.739510657141 + const REAL fx_4_010 = (REAL)(sqrt(16.0) / 8.0); // 0.5 const REAL fx_4_011 = (REAL)(-sqrt(28.0) / 8.0); // -0.661437827766 - const REAL fx_4_012 = (REAL)(sqrt(1.0) / 8.0); // 0.125 - const REAL fx_4_013 = (REAL)(sqrt(56.0) / 8.0); // 0.935414346692 + const REAL fx_4_012 = (REAL)(sqrt(1.0) / 8.0); // 0.125 + const REAL fx_4_013 = (REAL)(sqrt(56.0) / 8.0); // 0.935414346692 inline void sh_rotx90_4(REAL y[], REAL yr[]) { - yr[0] = fx_4_001*y[5] + fx_4_002*y[7]; - yr[1] = fx_4_003*y[1] + fx_4_004*y[3]; - yr[2] = fx_4_005*y[5] + fx_4_001*y[7]; - yr[3] = fx_4_004*y[1] + fx_4_006*y[3]; - yr[4] = fx_4_007*y[4] + fx_4_008*y[6] + fx_4_009*y[8]; - yr[5] = fx_4_013*y[0] + fx_4_002*y[2]; - yr[6] = fx_4_008*y[4] + fx_4_010*y[6] + fx_4_011*y[8]; - yr[7] = fx_4_005*y[0] - fx_4_001*y[2]; - yr[8] = fx_4_009*y[4] + fx_4_011*y[6] + fx_4_012*y[8]; + yr[0] = fx_4_001 * y[5] + fx_4_002 * y[7]; + yr[1] = fx_4_003 * y[1] + fx_4_004 * y[3]; + yr[2] = fx_4_005 * y[5] + fx_4_001 * y[7]; + yr[3] = fx_4_004 * y[1] + fx_4_006 * y[3]; + yr[4] = fx_4_007 * y[4] + fx_4_008 * y[6] + fx_4_009 * y[8]; + yr[5] = fx_4_013 * y[0] + fx_4_002 * y[2]; + yr[6] = fx_4_008 * y[4] + fx_4_010 * y[6] + fx_4_011 * y[8]; + yr[7] = fx_4_005 * y[0] - fx_4_001 * y[2]; + yr[8] = fx_4_009 * y[4] + fx_4_011 * y[6] + fx_4_012 * y[8]; }; inline void sh_rotx90_inv_4(REAL y[], REAL yr[]) { - yr[0] = fx_4_013*y[5] + fx_4_005*y[7]; - yr[1] = fx_4_003*y[1] + fx_4_004*y[3]; - yr[2] = fx_4_002*y[5] - fx_4_001*y[7]; - yr[3] = fx_4_004*y[1] + fx_4_006*y[3]; - yr[4] = fx_4_007*y[4] + fx_4_008*y[6] + fx_4_009*y[8]; - yr[5] = fx_4_001*y[0] + fx_4_005*y[2]; - yr[6] = fx_4_008*y[4] + fx_4_010*y[6] + fx_4_011*y[8]; - yr[7] = fx_4_002*y[0] + fx_4_001*y[2]; - yr[8] = fx_4_009*y[4] + fx_4_011*y[6] + fx_4_012*y[8]; + yr[0] = fx_4_013 * y[5] + fx_4_005 * y[7]; + yr[1] = fx_4_003 * y[1] + fx_4_004 * y[3]; + yr[2] = fx_4_002 * y[5] - fx_4_001 * y[7]; + yr[3] = fx_4_004 * y[1] + fx_4_006 * y[3]; + yr[4] = fx_4_007 * y[4] + fx_4_008 * y[6] + fx_4_009 * y[8]; + yr[5] = fx_4_001 * y[0] + fx_4_005 * y[2]; + yr[6] = fx_4_008 * y[4] + fx_4_010 * y[6] + fx_4_011 * y[8]; + yr[7] = fx_4_002 * y[0] + fx_4_001 * y[2]; + yr[8] = fx_4_009 * y[4] + fx_4_011 * y[6] + fx_4_012 * y[8]; } - const REAL fx_5_001 = (REAL)(sqrt(126.0) / 16.0); // 0.70156076002 + const REAL fx_5_001 = (REAL)(sqrt(126.0) / 16.0); // 0.70156076002 const REAL fx_5_002 = (REAL)(-sqrt(120.0) / 16.0); // -0.684653196882 - const REAL fx_5_003 = (REAL)(sqrt(10.0) / 16.0); // 0.197642353761 - const REAL fx_5_004 = (REAL)(-sqrt(64.0) / 16.0); // -0.5 - const REAL fx_5_005 = (REAL)(sqrt(192.0) / 16.0); // 0.866025403784 - const REAL fx_5_006 = (REAL)(sqrt(70.0) / 16.0); // 0.522912516584 - const REAL fx_5_007 = (REAL)(sqrt(24.0) / 16.0); // 0.306186217848 + const REAL fx_5_003 = (REAL)(sqrt(10.0) / 16.0); // 0.197642353761 + const REAL fx_5_004 = (REAL)(-sqrt(64.0) / 16.0); // -0.5 + const REAL fx_5_005 = (REAL)(sqrt(192.0) / 16.0); // 0.866025403784 + const REAL fx_5_006 = (REAL)(sqrt(70.0) / 16.0); // 0.522912516584 + const REAL fx_5_007 = (REAL)(sqrt(24.0) / 16.0); // 0.306186217848 const REAL fx_5_008 = (REAL)(-sqrt(162.0) / 16.0); // -0.795495128835 - const REAL fx_5_009 = (REAL)(sqrt(64.0) / 16.0); // 0.5 - const REAL fx_5_010 = (REAL)(sqrt(60.0) / 16.0); // 0.484122918274 - const REAL fx_5_011 = (REAL)(sqrt(112.0) / 16.0); // 0.661437827763 - const REAL fx_5_012 = (REAL)(sqrt(84.0) / 16.0); // 0.572821961867 - const REAL fx_5_013 = (REAL)(sqrt(4.0) / 16.0); // 0.125 - const REAL fx_5_014 = (REAL)(sqrt(42.0) / 16.0); // 0.405046293649 - const REAL fx_5_015 = (REAL)(sqrt(210.0) / 16.0); // 0.905711046633 - const REAL fx_5_016 = (REAL)(sqrt(169.0) / 16.0); // 0.8125 - const REAL fx_5_017 = (REAL)(-sqrt(45.0) / 16.0); // -0.419262745781 - const REAL fx_5_018 = (REAL)(sqrt(1.0) / 16.0); // 0.0625 + const REAL fx_5_009 = (REAL)(sqrt(64.0) / 16.0); // 0.5 + const REAL fx_5_010 = (REAL)(sqrt(60.0) / 16.0); // 0.484122918274 + const REAL fx_5_011 = (REAL)(sqrt(112.0) / 16.0); // 0.661437827763 + const REAL fx_5_012 = (REAL)(sqrt(84.0) / 16.0); // 0.572821961867 + const REAL fx_5_013 = (REAL)(sqrt(4.0) / 16.0); // 0.125 + const REAL fx_5_014 = (REAL)(sqrt(42.0) / 16.0); // 0.405046293649 + const REAL fx_5_015 = (REAL)(sqrt(210.0) / 16.0); // 0.905711046633 + const REAL fx_5_016 = (REAL)(sqrt(169.0) / 16.0); // 0.8125 + const REAL fx_5_017 = (REAL)(-sqrt(45.0) / 16.0); // -0.419262745781 + const REAL fx_5_018 = (REAL)(sqrt(1.0) / 16.0); // 0.0625 const REAL fx_5_019 = (REAL)(-sqrt(126.0) / 16.0); // -0.701561553415 - const REAL fx_5_020 = (REAL)(sqrt(120.0) / 16.0); // 0.684653196881 - const REAL fx_5_021 = (REAL)(-sqrt(10.0) / 16.0); // -0.197642353761 - const REAL fx_5_022 = (REAL)(-sqrt(70.0) / 16.0); // -0.522913107945 - const REAL fx_5_023 = (REAL)(-sqrt(60.0) / 16.0); // -0.48412346577 + const REAL fx_5_020 = (REAL)(sqrt(120.0) / 16.0); // 0.684653196881 + const REAL fx_5_021 = (REAL)(-sqrt(10.0) / 16.0); // -0.197642353761 + const REAL fx_5_022 = (REAL)(-sqrt(70.0) / 16.0); // -0.522913107945 + const REAL fx_5_023 = (REAL)(-sqrt(60.0) / 16.0); // -0.48412346577 inline void sh_rotx90_5(REAL y[], REAL yr[]) { - yr[0] = fx_5_001*y[5] + fx_5_002*y[7] + fx_5_003*y[9]; - yr[1] = fx_5_004*y[1] + fx_5_005*y[3]; - yr[2] = fx_5_006*y[5] + fx_5_007*y[7] + fx_5_008*y[9]; - yr[3] = fx_5_005*y[1] + fx_5_009*y[3]; - yr[4] = fx_5_010*y[5] + fx_5_011*y[7] + fx_5_012*y[9]; - yr[5] = fx_5_019*y[0] + fx_5_022*y[2] + fx_5_023*y[4]; - yr[6] = fx_5_013*y[6] + fx_5_014*y[8] + fx_5_015*y[10]; - yr[7] = fx_5_020*y[0] - fx_5_007*y[2] - fx_5_011*y[4]; - yr[8] = fx_5_014*y[6] + fx_5_016*y[8] + fx_5_017*y[10]; - yr[9] = fx_5_021*y[0] - fx_5_008*y[2] - fx_5_012*y[4]; - yr[10] = fx_5_015*y[6] + fx_5_017*y[8] + fx_5_018*y[10]; + yr[0] = fx_5_001 * y[5] + fx_5_002 * y[7] + fx_5_003 * y[9]; + yr[1] = fx_5_004 * y[1] + fx_5_005 * y[3]; + yr[2] = fx_5_006 * y[5] + fx_5_007 * y[7] + fx_5_008 * y[9]; + yr[3] = fx_5_005 * y[1] + fx_5_009 * y[3]; + yr[4] = fx_5_010 * y[5] + fx_5_011 * y[7] + fx_5_012 * y[9]; + yr[5] = fx_5_019 * y[0] + fx_5_022 * y[2] + fx_5_023 * y[4]; + yr[6] = fx_5_013 * y[6] + fx_5_014 * y[8] + fx_5_015 * y[10]; + yr[7] = fx_5_020 * y[0] - fx_5_007 * y[2] - fx_5_011 * y[4]; + yr[8] = fx_5_014 * y[6] + fx_5_016 * y[8] + fx_5_017 * y[10]; + yr[9] = fx_5_021 * y[0] - fx_5_008 * y[2] - fx_5_012 * y[4]; + yr[10] = fx_5_015 * y[6] + fx_5_017 * y[8] + fx_5_018 * y[10]; }; inline void sh_rotx90_inv_5(REAL y[], REAL yr[]) { - yr[0] = fx_5_019*y[5] + fx_5_020*y[7] + fx_5_021*y[9]; - yr[1] = fx_5_004*y[1] + fx_5_005*y[3]; - yr[2] = fx_5_022*y[5] - fx_5_007*y[7] - fx_5_008*y[9]; - yr[3] = fx_5_005*y[1] + fx_5_009*y[3]; - yr[4] = fx_5_023*y[5] - fx_5_011*y[7] - fx_5_012*y[9]; - yr[5] = fx_5_001*y[0] + fx_5_006*y[2] + fx_5_010*y[4]; - yr[6] = fx_5_013*y[6] + fx_5_014*y[8] + fx_5_015*y[10]; - yr[7] = fx_5_002*y[0] + fx_5_007*y[2] + fx_5_011*y[4]; - yr[8] = fx_5_014*y[6] + fx_5_016*y[8] + fx_5_017*y[10]; - yr[9] = fx_5_003*y[0] + fx_5_008*y[2] + fx_5_012*y[4]; - yr[10] = fx_5_015*y[6] + fx_5_017*y[8] + fx_5_018*y[10]; + yr[0] = fx_5_019 * y[5] + fx_5_020 * y[7] + fx_5_021 * y[9]; + yr[1] = fx_5_004 * y[1] + fx_5_005 * y[3]; + yr[2] = fx_5_022 * y[5] - fx_5_007 * y[7] - fx_5_008 * y[9]; + yr[3] = fx_5_005 * y[1] + fx_5_009 * y[3]; + yr[4] = fx_5_023 * y[5] - fx_5_011 * y[7] - fx_5_012 * y[9]; + yr[5] = fx_5_001 * y[0] + fx_5_006 * y[2] + fx_5_010 * y[4]; + yr[6] = fx_5_013 * y[6] + fx_5_014 * y[8] + fx_5_015 * y[10]; + yr[7] = fx_5_002 * y[0] + fx_5_007 * y[2] + fx_5_011 * y[4]; + yr[8] = fx_5_014 * y[6] + fx_5_016 * y[8] + fx_5_017 * y[10]; + yr[9] = fx_5_003 * y[0] + fx_5_008 * y[2] + fx_5_012 * y[4]; + yr[10] = fx_5_015 * y[6] + fx_5_017 * y[8] + fx_5_018 * y[10]; } inline void sh_rot_1(REAL m[3 * 3], REAL y[NL1], REAL yr[NL1]) @@ -831,29 +817,32 @@ namespace Finds cosine,sine pairs for zyz rotation (i.e. rotation R_z2 R_y R_z1 v). The rotation is one which maps mx to (1,0,0) and mz to (0,0,1). */ - inline void zyz(REAL m[3 * 3], REAL &zc1, REAL &zs1, REAL &yc, REAL &ys, REAL &zc2, REAL &zs2) + inline void zyz(REAL m[3 * 3], REAL& zc1, REAL& zs1, REAL& yc, REAL& ys, REAL& zc2, REAL& zs2) { REAL cz = m[8]; // rotate so that (cx,cy,0) aligns to (1,0,0) - REAL cxylen = (REAL)sqrtf(1.0f - cz*cz); + REAL cxylen = (REAL)sqrtf(1.0f - cz * cz); if (cxylen >= ROT_TOL) { // if above is a NaN, will do the correct thing - yc = cz; - ys = cxylen; + yc = cz; + ys = cxylen; REAL len67inv = 1.0f / sqrtf(m[6] * m[6] + m[7] * m[7]); - zc1 = -m[6] * len67inv; - zs1 = m[7] * len67inv; + zc1 = -m[6] * len67inv; + zs1 = m[7] * len67inv; REAL len25inv = 1.0f / sqrtf(m[2] * m[2] + m[5] * m[5]); - zc2 = m[2] * len25inv; - zs2 = m[5] * len25inv; + zc2 = m[2] * len25inv; + zs2 = m[5] * len25inv; } else - { // m[6],m[7],m[8] already aligned to (0,0,1) - zc1 = 1.0; zs1 = 0.0; // identity - yc = cz; ys = 0.0; // identity - zc2 = m[0] * cz; zs2 = -m[1]; // align x axis (mx[0],mx[1],0) to (1,0,0) + { // m[6],m[7],m[8] already aligned to (0,0,1) + zc1 = 1.0; + zs1 = 0.0; // identity + yc = cz; + ys = 0.0; // identity + zc2 = m[0] * cz; + zs2 = -m[1]; // align x axis (mx[0],mx[1],0) to (1,0,0) } } @@ -965,31 +954,26 @@ namespace } // simple matrix vector multiply for a square matrix (only used by ZRotation) - inline void SimpMatMul(size_t dim, const float *matrix, const float *input, float *result) + inline void SimpMatMul(size_t dim, const float* matrix, const float* input, float* result) { for (size_t iR = 0; iR < dim; ++iR) { - result[iR + 0] = matrix[iR*dim + 0] * input[0]; + result[iR + 0] = matrix[iR * dim + 0] * input[0]; for (size_t iC = 1; iC < dim; ++iC) { - result[iR] += matrix[iR*dim + iC] * input[iC]; + result[iR] += matrix[iR * dim + iC] * input[iC]; } } } }; // anonymous namespace - //------------------------------------------------------------------------------------- // Evaluates the Spherical Harmonic basis functions // // https://msdn.microsoft.com/en-us/library/windows/desktop/bb205448.aspx //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -float* XM_CALLCONV DirectX::XMSHEvalDirection( - float *result, - size_t order, - FXMVECTOR dir) noexcept +_Use_decl_annotations_ float* XM_CALLCONV DirectX::XMSHEvalDirection(float* result, size_t order, FXMVECTOR dir) noexcept { if (!result) return nullptr; @@ -1003,46 +987,28 @@ float* XM_CALLCONV DirectX::XMSHEvalDirection( switch (order) { - case 2: - sh_eval_basis_1(fX, fY, fZ, result); - break; + case 2: sh_eval_basis_1(fX, fY, fZ, result); break; - case 3: - sh_eval_basis_2(fX, fY, fZ, result); - break; + case 3: sh_eval_basis_2(fX, fY, fZ, result); break; - case 4: - sh_eval_basis_3(fX, fY, fZ, result); - break; + case 4: sh_eval_basis_3(fX, fY, fZ, result); break; - case 5: - sh_eval_basis_4(fX, fY, fZ, result); - break; + case 5: sh_eval_basis_4(fX, fY, fZ, result); break; - case 6: - sh_eval_basis_5(fX, fY, fZ, result); - break; + case 6: sh_eval_basis_5(fX, fY, fZ, result); break; - default: - assert(order < XM_SH_MINORDER || order > XM_SH_MAXORDER); - return nullptr; + default: assert(order < XM_SH_MINORDER || order > XM_SH_MAXORDER); return nullptr; } return result; } - //------------------------------------------------------------------------------------- // Rotates SH vector by a rotation matrix // // https://msdn.microsoft.com/en-us/library/windows/desktop/bb204992.aspx //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -float* XM_CALLCONV DirectX::XMSHRotate( - float *result, - size_t order, - FXMMATRIX rotMatrix, - const float *input) noexcept +_Use_decl_annotations_ float* XM_CALLCONV DirectX::XMSHRotate(float* result, size_t order, FXMMATRIX rotMatrix, const float* input) noexcept { if (!result || !input) return nullptr; @@ -1053,7 +1019,7 @@ float* XM_CALLCONV DirectX::XMSHRotate( XMFLOAT3X3 mat; XMStoreFloat3x3(&mat, rotMatrix); - float mRot[3 * 3]; + float mRot[3 * 3]; const float r00 = mRot[0 * 3 + 0] = mat._11; const float r10 = mRot[1 * 3 + 0] = mat._12; const float r20 = mRot[2 * 3 + 0] = mat._13; @@ -1070,116 +1036,101 @@ float* XM_CALLCONV DirectX::XMSHRotate( switch (order) { - case 2: - { - // do linear by hand... + case 2: { + // do linear by hand... - result[1] = r11*input[1] - r12*input[2] + r10*input[3]; - result[2] = -r21*input[1] + r22*input[2] - r20*input[3]; - result[3] = r01*input[1] - r02*input[2] + r00*input[3]; - } - break; - - case 3: + result[1] = r11 * input[1] - r12 * input[2] + r10 * input[3]; + result[2] = -r21 * input[1] + r22 * input[2] - r20 * input[3]; + result[3] = r01 * input[1] - r02 * input[2] + r00 * input[3]; + } + break; + + case 3: { + float R[25]; + // do linear by hand... + + result[1] = r11 * input[1] - r12 * input[2] + r10 * input[3]; + result[2] = -r21 * input[1] + r22 * input[2] - r20 * input[3]; + result[3] = r01 * input[1] - r02 * input[2] + r00 * input[3]; + + // direct code for quadratics is faster than ZYZ reccurence relations + + const float t41 = r01 * r00; + const float t43 = r11 * r10; + const float t48 = r11 * r12; + const float t50 = r01 * r02; + const float t55 = r02 * r02; + const float t57 = r22 * r22; + const float t58 = r12 * r12; + const float t61 = r00 * r02; + const float t63 = r10 * r12; + const float t68 = r10 * r10; + const float t70 = r01 * r01; + const float t72 = r11 * r11; + const float t74 = r00 * r00; + const float t76 = r21 * r21; + const float t78 = r20 * r20; + + const float v173 = 0.1732050808e1f; + const float v577 = 0.5773502693e0f; + const float v115 = 0.1154700539e1f; + const float v288 = 0.2886751347e0f; + const float v866 = 0.8660254040e0f; + + R[0] = r11 * r00 + r01 * r10; + R[1] = -r01 * r12 - r11 * r02; + R[2] = v173 * r02 * r12; + R[3] = -r10 * r02 - r00 * r12; + R[4] = r00 * r10 - r01 * r11; + R[5] = -r11 * r20 - r21 * r10; + R[6] = r11 * r22 + r21 * r12; + R[7] = -v173 * r22 * r12; + R[8] = r20 * r12 + r10 * r22; + R[9] = -r10 * r20 + r11 * r21; + R[10] = -v577 * (t41 + t43) + v115 * r21 * r20; + R[11] = v577 * (t48 + t50) - v115 * r21 * r22; + R[12] = -0.5000000000e0f * (t55 + t58) + t57; + R[13] = v577 * (t61 + t63) - v115 * r20 * r22; + R[14] = v288 * (t70 - t68 + t72 - t74) - v577 * (t76 - t78); + R[15] = -r01 * r20 - r21 * r00; + R[16] = r01 * r22 + r21 * r02; + R[17] = -v173 * r22 * r02; + R[18] = r00 * r22 + r20 * r02; + R[19] = -r00 * r20 + r01 * r21; + R[20] = t41 - t43; + R[21] = -t50 + t48; + R[22] = v866 * (t55 - t58); + R[23] = t63 - t61; + R[24] = 0.5000000000e0f * (t74 - t68 - t70 + t72); + + // blow the matrix multiply out by hand, looping is ineficient on a P4... + for (unsigned int iR = 0; iR < 5; iR++) { - float R[25]; - // do linear by hand... - - result[1] = r11*input[1] - r12*input[2] + r10*input[3]; - result[2] = -r21*input[1] + r22*input[2] - r20*input[3]; - result[3] = r01*input[1] - r02*input[2] + r00*input[3]; - - // direct code for quadratics is faster than ZYZ reccurence relations - - const float t41 = r01 * r00; - const float t43 = r11 * r10; - const float t48 = r11 * r12; - const float t50 = r01 * r02; - const float t55 = r02 * r02; - const float t57 = r22 * r22; - const float t58 = r12 * r12; - const float t61 = r00 * r02; - const float t63 = r10 * r12; - const float t68 = r10 * r10; - const float t70 = r01 * r01; - const float t72 = r11 * r11; - const float t74 = r00 * r00; - const float t76 = r21 * r21; - const float t78 = r20 * r20; - - const float v173 = 0.1732050808e1f; - const float v577 = 0.5773502693e0f; - const float v115 = 0.1154700539e1f; - const float v288 = 0.2886751347e0f; - const float v866 = 0.8660254040e0f; - - R[0] = r11 * r00 + r01 * r10; - R[1] = -r01 * r12 - r11 * r02; - R[2] = v173 * r02 * r12; - R[3] = -r10 * r02 - r00 * r12; - R[4] = r00 * r10 - r01 * r11; - R[5] = -r11 * r20 - r21 * r10; - R[6] = r11 * r22 + r21 * r12; - R[7] = -v173 * r22 * r12; - R[8] = r20 * r12 + r10 * r22; - R[9] = -r10 * r20 + r11 * r21; - R[10] = -v577* (t41 + t43) + v115 * r21 * r20; - R[11] = v577* (t48 + t50) - v115 * r21 * r22; - R[12] = -0.5000000000e0f * (t55 + t58) + t57; - R[13] = v577 * (t61 + t63) - v115 * r20 * r22; - R[14] = v288 * (t70 - t68 + t72 - t74) - v577 * (t76 - t78); - R[15] = -r01 * r20 - r21 * r00; - R[16] = r01 * r22 + r21 * r02; - R[17] = -v173 * r22 * r02; - R[18] = r00 * r22 + r20 * r02; - R[19] = -r00 * r20 + r01 * r21; - R[20] = t41 - t43; - R[21] = -t50 + t48; - R[22] = v866 * (t55 - t58); - R[23] = t63 - t61; - R[24] = 0.5000000000e0f *(t74 - t68 - t70 + t72); - - // blow the matrix multiply out by hand, looping is ineficient on a P4... - for (unsigned int iR = 0; iR < 5; iR++) - { - const unsigned int uBase = iR * 5; - result[4 + iR] = R[uBase + 0] * input[4] + R[uBase + 1] * input[5] + R[uBase + 2] * input[6] + R[uBase + 3] * input[7] + R[uBase + 4] * input[8]; - } + const unsigned int uBase = iR * 5; + result[4 + iR] = R[uBase + 0] * input[4] + R[uBase + 1] * input[5] + R[uBase + 2] * input[6] + R[uBase + 3] * input[7] + + R[uBase + 4] * input[8]; } - break; + } + break; - case 4: - sh3_rot(mRot, const_cast(input), result); - break; + case 4: sh3_rot(mRot, const_cast(input), result); break; - case 5: - sh4_rot(mRot, const_cast(input), result); - break; + case 5: sh4_rot(mRot, const_cast(input), result); break; - case 6: - sh5_rot(mRot, const_cast(input), result); - break; + case 6: sh5_rot(mRot, const_cast(input), result); break; - default: - assert(order < XM_SH_MINORDER || order > XM_SH_MAXORDER); - return nullptr; + default: assert(order < XM_SH_MINORDER || order > XM_SH_MAXORDER); return nullptr; } return result; } - //------------------------------------------------------------------------------------- // Rotates the SH vector in the Z axis by an angle // // https://msdn.microsoft.com/en-us/library/windows/desktop/bb205461.aspx //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -float* DirectX::XMSHRotateZ( - float *result, - size_t order, - float angle, - const float *input) noexcept +_Use_decl_annotations_ float* DirectX::XMSHRotateZ(float* result, size_t order, float angle, const float* input) noexcept { if (!result || !input) return nullptr; @@ -1190,7 +1141,7 @@ float* DirectX::XMSHRotateZ( if (order < XM_SH_MINORDER || order > XM_SH_MAXORDER) return nullptr; - float R[(2 * (XM_SH_MAXORDER - 1) + 1)*(2 * (XM_SH_MAXORDER - 1) + 1)]; // used to store rotation matrices... + float R[(2 * (XM_SH_MAXORDER - 1) + 1) * (2 * (XM_SH_MAXORDER - 1) + 1)]; // used to store rotation matrices... // these are actually very sparse matrices, most of the entries are zero's... @@ -1199,140 +1150,144 @@ float* DirectX::XMSHRotateZ( const float t1 = ca; const float t2 = sa; - R[0] = t1; - R[1] = 0.0f; - R[2] = t2; - R[3] = 0.0f; - R[4] = 1.0f; - R[5] = 0.0f; - R[6] = -t2; - R[7] = 0.0f; - R[8] = t1; + R[0] = t1; + R[1] = 0.0f; + R[2] = t2; + R[3] = 0.0f; + R[4] = 1.0f; + R[5] = 0.0f; + R[6] = -t2; + R[7] = 0.0f; + R[8] = t1; result[0] = input[0]; SimpMatMul(3, R, input + 1, result + 1); if (order > 2) { - for (int j = 0; j < 5 * 5; j++) R[j] = 0.0f; + for (int j = 0; j < 5 * 5; j++) + R[j] = 0.0f; const float t1 = sa; - const float t2 = t1*t1; + const float t2 = t1 * t1; const float t3 = ca; - const float t4 = t3*t3; + const float t4 = t3 * t3; const float t5 = -t2 + t4; - const float t7 = 2.0f*t3*t1; - R[0] = t5; - R[4] = t7; - R[6] = t3; - R[8] = t1; - R[12] = 1.0f; - R[16] = -t1; - R[18] = t3; - R[20] = -t7; - R[24] = t5; + const float t7 = 2.0f * t3 * t1; + R[0] = t5; + R[4] = t7; + R[6] = t3; + R[8] = t1; + R[12] = 1.0f; + R[16] = -t1; + R[18] = t3; + R[20] = -t7; + R[24] = t5; SimpMatMul(5, R, input + 4, result + 4); // un-roll matrix/vector multiply if (order > 3) { - for (int j = 0; j < 7 * 7; j++) R[j] = 0.0f; - const float t1 = ca; - const float t2 = t1*t1; - const float t4 = sa; - const float t5 = t4*t4; - const float t8 = t2*t1 - 3.0f*t1*t5; - const float t12 = 3.0f*t4*t2 - t5*t4; + for (int j = 0; j < 7 * 7; j++) + R[j] = 0.0f; + const float t1 = ca; + const float t2 = t1 * t1; + const float t4 = sa; + const float t5 = t4 * t4; + const float t8 = t2 * t1 - 3.0f * t1 * t5; + const float t12 = 3.0f * t4 * t2 - t5 * t4; const float t13 = -t5 + t2; - const float t15 = 2.0f*t1*t4; - R[0] = t8; - R[6] = t12; - R[8] = t13; - R[12] = t15; - R[16] = t1; - R[18] = t4; - R[24] = 1.0f; - R[30] = -t4; - R[32] = t1; - R[36] = -t15; - R[40] = t13; - R[42] = -t12; - R[48] = t8; + const float t15 = 2.0f * t1 * t4; + R[0] = t8; + R[6] = t12; + R[8] = t13; + R[12] = t15; + R[16] = t1; + R[18] = t4; + R[24] = 1.0f; + R[30] = -t4; + R[32] = t1; + R[36] = -t15; + R[40] = t13; + R[42] = -t12; + R[48] = t8; SimpMatMul(7, R, input + 9, result + 9); if (order > 4) { - for (int j = 0; j <= 9 * 9; j++) R[j] = 0.0f; - const float t1 = ca; - const float t2 = t1*t1; - const float t3 = t2*t2; - const float t4 = sa; - const float t5 = t4*t4; - const float t6 = t5*t5; - const float t9 = t3 + t6 - 6.0f*t5*t2; - const float t10 = t5*t4; - const float t12 = t2*t1; - const float t14 = -t10*t1 + t4*t12; - const float t17 = t12 - 3.0f*t1*t5; - const float t20 = 3.0f*t4*t2 - t10; + for (int j = 0; j <= 9 * 9; j++) + R[j] = 0.0f; + const float t1 = ca; + const float t2 = t1 * t1; + const float t3 = t2 * t2; + const float t4 = sa; + const float t5 = t4 * t4; + const float t6 = t5 * t5; + const float t9 = t3 + t6 - 6.0f * t5 * t2; + const float t10 = t5 * t4; + const float t12 = t2 * t1; + const float t14 = -t10 * t1 + t4 * t12; + const float t17 = t12 - 3.0f * t1 * t5; + const float t20 = 3.0f * t4 * t2 - t10; const float t21 = -t5 + t2; - const float t23 = 2.0f*t1*t4; - R[0] = t9; - R[8] = 4.0f*t14; - R[10] = t17; - R[16] = t20; - R[20] = t21; - R[24] = t23; - R[30] = t1; - R[32] = t4; - R[40] = 1.0f; - R[48] = -t4; - R[50] = t1; - R[56] = -t23; - R[60] = t21; - R[64] = -t20; - R[70] = t17; - R[72] = -4.0f*t14; - R[80] = t9; + const float t23 = 2.0f * t1 * t4; + R[0] = t9; + R[8] = 4.0f * t14; + R[10] = t17; + R[16] = t20; + R[20] = t21; + R[24] = t23; + R[30] = t1; + R[32] = t4; + R[40] = 1.0f; + R[48] = -t4; + R[50] = t1; + R[56] = -t23; + R[60] = t21; + R[64] = -t20; + R[70] = t17; + R[72] = -4.0f * t14; + R[80] = t9; SimpMatMul(9, R, input + 16, result + 16); if (order > 5) { - for (int j = 0; j < 11 * 11; j++) R[j] = 0.0f; - const float t1 = ca; - const float t2 = sa; - const float t3 = t2*t2; - const float t4 = t3*t3; - const float t7 = t1*t1; - const float t8 = t7*t1; - const float t11 = t7*t7; - const float t13 = 5.0f*t1*t4 - 10.0f*t3*t8 + t11*t1; - const float t14 = t3*t2; - const float t20 = -10.0f*t14*t7 + 5.0f*t2*t11 + t4*t2; - const float t23 = t11 + t4 - 6.0f*t3*t7; - const float t26 = -t14*t1 + t2*t8; - const float t29 = t8 - 3.0f*t1*t3; - const float t32 = 3.0f*t2*t7 - t14; + for (int j = 0; j < 11 * 11; j++) + R[j] = 0.0f; + const float t1 = ca; + const float t2 = sa; + const float t3 = t2 * t2; + const float t4 = t3 * t3; + const float t7 = t1 * t1; + const float t8 = t7 * t1; + const float t11 = t7 * t7; + const float t13 = 5.0f * t1 * t4 - 10.0f * t3 * t8 + t11 * t1; + const float t14 = t3 * t2; + const float t20 = -10.0f * t14 * t7 + 5.0f * t2 * t11 + t4 * t2; + const float t23 = t11 + t4 - 6.0f * t3 * t7; + const float t26 = -t14 * t1 + t2 * t8; + const float t29 = t8 - 3.0f * t1 * t3; + const float t32 = 3.0f * t2 * t7 - t14; const float t33 = -t3 + t7; - const float t35 = 2.0f*t1*t2; - R[0] = t13; - R[10] = t20; - R[12] = t23; - R[20] = 4.0f*t26; - R[24] = t29; - R[30] = t32; - R[36] = t33; - R[40] = t35; - R[48] = t1; - R[50] = t2; - R[60] = 1.0f; - R[70] = -t2; - R[72] = t1; - R[80] = -t35; - R[84] = t33; - R[90] = -t32; - R[96] = t29; - R[100] = -4.0f*t26; - R[108] = t23; - R[110] = -t20; - R[120] = t13; + const float t35 = 2.0f * t1 * t2; + R[0] = t13; + R[10] = t20; + R[12] = t23; + R[20] = 4.0f * t26; + R[24] = t29; + R[30] = t32; + R[36] = t33; + R[40] = t35; + R[48] = t1; + R[50] = t2; + R[60] = 1.0f; + R[70] = -t2; + R[72] = t1; + R[80] = -t35; + R[84] = t33; + R[90] = -t32; + R[96] = t29; + R[100] = -4.0f * t26; + R[108] = t23; + R[110] = -t20; + R[120] = t13; SimpMatMul(11, R, input + 25, result + 25); } } @@ -1342,23 +1297,17 @@ float* DirectX::XMSHRotateZ( return result; } - //------------------------------------------------------------------------------------- // Adds two SH vectors, result[i] = inputA[i] + inputB[i]; // // https://msdn.microsoft.com/en-us/library/windows/desktop/bb205438.aspx //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -float* DirectX::XMSHAdd( - float *result, - size_t order, - const float *inputA, - const float *inputB) noexcept +_Use_decl_annotations_ float* DirectX::XMSHAdd(float* result, size_t order, const float* inputA, const float* inputB) noexcept { if (!result || !inputA || !inputB) return nullptr; - const size_t numcoeff = order*order; + const size_t numcoeff = order * order; for (size_t i = 0; i < numcoeff; ++i) { @@ -1368,23 +1317,17 @@ float* DirectX::XMSHAdd( return result; } - //------------------------------------------------------------------------------------- // Scales a SH vector, result[i] = input[i] * scale; // // https://msdn.microsoft.com/en-us/library/windows/desktop/bb204994.aspx //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -float* DirectX::XMSHScale( - float *result, - size_t order, - const float *input, - float scale) noexcept +_Use_decl_annotations_ float* DirectX::XMSHScale(float* result, size_t order, const float* input, float scale) noexcept { if (!result || !input) return nullptr; - const size_t numcoeff = order*order; + const size_t numcoeff = order * order; for (size_t i = 0; i < numcoeff; ++i) { @@ -1394,24 +1337,19 @@ float* DirectX::XMSHScale( return result; } - //------------------------------------------------------------------------------------- // Computes the dot product of two SH vectors // // https://msdn.microsoft.com/en-us/library/windows/desktop/bb205446.aspx //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -float DirectX::XMSHDot( - size_t order, - const float *inputA, - const float *inputB) noexcept +_Use_decl_annotations_ float DirectX::XMSHDot(size_t order, const float* inputA, const float* inputB) noexcept { if (!inputA || !inputB) return 0.f; float result = inputA[0] * inputB[0]; - const size_t numcoeff = order*order; + const size_t numcoeff = order * order; for (size_t i = 1; i < numcoeff; ++i) { @@ -1421,7 +1359,6 @@ float DirectX::XMSHDot( return result; } - //------------------------------------------------------------------------------------- // Computes the product of two functions represented using SH (f and g), where: // result[i] = int(y_i(s) * f(s) * g(s)), where y_i(s) is the ith SH basis @@ -1432,3043 +1369,3159 @@ float DirectX::XMSHDot( // that the product commutes (f*g == g*f) but doesn't associate // (f*(g*h) != (f*g)*h. //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -float* DirectX::XMSHMultiply( - float *result, - size_t order, - const float *inputF, - const float *inputG) noexcept +_Use_decl_annotations_ float* DirectX::XMSHMultiply(float* result, size_t order, const float* inputF, const float* inputG) noexcept { switch (order) { - case 2: - return XMSHMultiply2(result, inputF, inputG); + case 2: return XMSHMultiply2(result, inputF, inputG); - case 3: - return XMSHMultiply3(result, inputF, inputG); + case 3: return XMSHMultiply3(result, inputF, inputG); - case 4: - return XMSHMultiply4(result, inputF, inputG); + case 4: return XMSHMultiply4(result, inputF, inputG); - case 5: - return XMSHMultiply5(result, inputF, inputG); + case 5: return XMSHMultiply5(result, inputF, inputG); - case 6: - return XMSHMultiply6(result, inputF, inputG); + case 6: return XMSHMultiply6(result, inputF, inputG); - default: - assert(order < XM_SH_MINORDER || order > XM_SH_MAXORDER); - return nullptr; + default: assert(order < XM_SH_MINORDER || order > XM_SH_MAXORDER); return nullptr; } } - //------------------------------------------------------------------------------------- // https://msdn.microsoft.com/en-us/library/windows/desktop/bb205454.aspx //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -float* DirectX::XMSHMultiply2( - float *y, - const float *f, - const float *g) noexcept +_Use_decl_annotations_ float* DirectX::XMSHMultiply2(float* y, const float* f, const float* g) noexcept { if (!y || !f || !g) return nullptr; REAL tf, tg, t; // [0,0]: 0, - y[0] = CONSTANT(0.282094792935999980)*f[0] * g[0]; + y[0] = CONSTANT(0.282094792935999980) * f[0] * g[0]; // [1,1]: 0, - tf = CONSTANT(0.282094791773000010)*f[0]; - tg = CONSTANT(0.282094791773000010)*g[0]; - y[1] = tf*g[1] + tg*f[1]; - t = f[1] * g[1]; - y[0] += CONSTANT(0.282094791773000010)*t; + tf = CONSTANT(0.282094791773000010) * f[0]; + tg = CONSTANT(0.282094791773000010) * g[0]; + y[1] = tf * g[1] + tg * f[1]; + t = f[1] * g[1]; + y[0] += CONSTANT(0.282094791773000010) * t; // [2,2]: 0, - tf = CONSTANT(0.282094795249000000)*f[0]; - tg = CONSTANT(0.282094795249000000)*g[0]; - y[2] = tf*g[2] + tg*f[2]; - t = f[2] * g[2]; - y[0] += CONSTANT(0.282094795249000000)*t; + tf = CONSTANT(0.282094795249000000) * f[0]; + tg = CONSTANT(0.282094795249000000) * g[0]; + y[2] = tf * g[2] + tg * f[2]; + t = f[2] * g[2]; + y[0] += CONSTANT(0.282094795249000000) * t; // [3,3]: 0, - tf = CONSTANT(0.282094791773000010)*f[0]; - tg = CONSTANT(0.282094791773000010)*g[0]; - y[3] = tf*g[3] + tg*f[3]; - t = f[3] * g[3]; - y[0] += CONSTANT(0.282094791773000010)*t; + tf = CONSTANT(0.282094791773000010) * f[0]; + tg = CONSTANT(0.282094791773000010) * g[0]; + y[3] = tf * g[3] + tg * f[3]; + t = f[3] * g[3]; + y[0] += CONSTANT(0.282094791773000010) * t; // multiply count=20 return y; } - //------------------------------------------------------------------------------------- // https://msdn.microsoft.com/en-us/library/windows/desktop/bb232906.aspx //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -float* DirectX::XMSHMultiply3( - float *y, - const float *f, - const float *g) noexcept +_Use_decl_annotations_ float* DirectX::XMSHMultiply3(float* y, const float* f, const float* g) noexcept { if (!y || !f || !g) return nullptr; REAL tf, tg, t; // [0,0]: 0, - y[0] = CONSTANT(0.282094792935999980)*f[0] * g[0]; + y[0] = CONSTANT(0.282094792935999980) * f[0] * g[0]; // [1,1]: 0,6,8, - tf = CONSTANT(0.282094791773000010)*f[0] + CONSTANT(-0.126156626101000010)*f[6] + CONSTANT(-0.218509686119999990)*f[8]; - tg = CONSTANT(0.282094791773000010)*g[0] + CONSTANT(-0.126156626101000010)*g[6] + CONSTANT(-0.218509686119999990)*g[8]; - y[1] = tf*g[1] + tg*f[1]; - t = f[1] * g[1]; - y[0] += CONSTANT(0.282094791773000010)*t; - y[6] = CONSTANT(-0.126156626101000010)*t; - y[8] = CONSTANT(-0.218509686119999990)*t; + tf = CONSTANT(0.282094791773000010) * f[0] + CONSTANT(-0.126156626101000010) * f[6] + CONSTANT(-0.218509686119999990) * f[8]; + tg = CONSTANT(0.282094791773000010) * g[0] + CONSTANT(-0.126156626101000010) * g[6] + CONSTANT(-0.218509686119999990) * g[8]; + y[1] = tf * g[1] + tg * f[1]; + t = f[1] * g[1]; + y[0] += CONSTANT(0.282094791773000010) * t; + y[6] = CONSTANT(-0.126156626101000010) * t; + y[8] = CONSTANT(-0.218509686119999990) * t; // [1,2]: 5, - tf = CONSTANT(0.218509686118000010)*f[5]; - tg = CONSTANT(0.218509686118000010)*g[5]; - y[1] += tf*g[2] + tg*f[2]; - y[2] = tf*g[1] + tg*f[1]; - t = f[1] * g[2] + f[2] * g[1]; - y[5] = CONSTANT(0.218509686118000010)*t; + tf = CONSTANT(0.218509686118000010) * f[5]; + tg = CONSTANT(0.218509686118000010) * g[5]; + y[1] += tf * g[2] + tg * f[2]; + y[2] = tf * g[1] + tg * f[1]; + t = f[1] * g[2] + f[2] * g[1]; + y[5] = CONSTANT(0.218509686118000010) * t; // [1,3]: 4, - tf = CONSTANT(0.218509686114999990)*f[4]; - tg = CONSTANT(0.218509686114999990)*g[4]; - y[1] += tf*g[3] + tg*f[3]; - y[3] = tf*g[1] + tg*f[1]; - t = f[1] * g[3] + f[3] * g[1]; - y[4] = CONSTANT(0.218509686114999990)*t; + tf = CONSTANT(0.218509686114999990) * f[4]; + tg = CONSTANT(0.218509686114999990) * g[4]; + y[1] += tf * g[3] + tg * f[3]; + y[3] = tf * g[1] + tg * f[1]; + t = f[1] * g[3] + f[3] * g[1]; + y[4] = CONSTANT(0.218509686114999990) * t; // [2,2]: 0,6, - tf = CONSTANT(0.282094795249000000)*f[0] + CONSTANT(0.252313259986999990)*f[6]; - tg = CONSTANT(0.282094795249000000)*g[0] + CONSTANT(0.252313259986999990)*g[6]; - y[2] += tf*g[2] + tg*f[2]; + tf = CONSTANT(0.282094795249000000) * f[0] + CONSTANT(0.252313259986999990) * f[6]; + tg = CONSTANT(0.282094795249000000) * g[0] + CONSTANT(0.252313259986999990) * g[6]; + y[2] += tf * g[2] + tg * f[2]; t = f[2] * g[2]; - y[0] += CONSTANT(0.282094795249000000)*t; - y[6] += CONSTANT(0.252313259986999990)*t; + y[0] += CONSTANT(0.282094795249000000) * t; + y[6] += CONSTANT(0.252313259986999990) * t; // [2,3]: 7, - tf = CONSTANT(0.218509686118000010)*f[7]; - tg = CONSTANT(0.218509686118000010)*g[7]; - y[2] += tf*g[3] + tg*f[3]; - y[3] += tf*g[2] + tg*f[2]; - t = f[2] * g[3] + f[3] * g[2]; - y[7] = CONSTANT(0.218509686118000010)*t; + tf = CONSTANT(0.218509686118000010) * f[7]; + tg = CONSTANT(0.218509686118000010) * g[7]; + y[2] += tf * g[3] + tg * f[3]; + y[3] += tf * g[2] + tg * f[2]; + t = f[2] * g[3] + f[3] * g[2]; + y[7] = CONSTANT(0.218509686118000010) * t; // [3,3]: 0,6,8, - tf = CONSTANT(0.282094791773000010)*f[0] + CONSTANT(-0.126156626101000010)*f[6] + CONSTANT(0.218509686119999990)*f[8]; - tg = CONSTANT(0.282094791773000010)*g[0] + CONSTANT(-0.126156626101000010)*g[6] + CONSTANT(0.218509686119999990)*g[8]; - y[3] += tf*g[3] + tg*f[3]; + tf = CONSTANT(0.282094791773000010) * f[0] + CONSTANT(-0.126156626101000010) * f[6] + CONSTANT(0.218509686119999990) * f[8]; + tg = CONSTANT(0.282094791773000010) * g[0] + CONSTANT(-0.126156626101000010) * g[6] + CONSTANT(0.218509686119999990) * g[8]; + y[3] += tf * g[3] + tg * f[3]; t = f[3] * g[3]; - y[0] += CONSTANT(0.282094791773000010)*t; - y[6] += CONSTANT(-0.126156626101000010)*t; - y[8] += CONSTANT(0.218509686119999990)*t; + y[0] += CONSTANT(0.282094791773000010) * t; + y[6] += CONSTANT(-0.126156626101000010) * t; + y[8] += CONSTANT(0.218509686119999990) * t; // [4,4]: 0,6, - tf = CONSTANT(0.282094791770000020)*f[0] + CONSTANT(-0.180223751576000010)*f[6]; - tg = CONSTANT(0.282094791770000020)*g[0] + CONSTANT(-0.180223751576000010)*g[6]; - y[4] += tf*g[4] + tg*f[4]; + tf = CONSTANT(0.282094791770000020) * f[0] + CONSTANT(-0.180223751576000010) * f[6]; + tg = CONSTANT(0.282094791770000020) * g[0] + CONSTANT(-0.180223751576000010) * g[6]; + y[4] += tf * g[4] + tg * f[4]; t = f[4] * g[4]; - y[0] += CONSTANT(0.282094791770000020)*t; - y[6] += CONSTANT(-0.180223751576000010)*t; + y[0] += CONSTANT(0.282094791770000020) * t; + y[6] += CONSTANT(-0.180223751576000010) * t; // [4,5]: 7, - tf = CONSTANT(0.156078347226000000)*f[7]; - tg = CONSTANT(0.156078347226000000)*g[7]; - y[4] += tf*g[5] + tg*f[5]; - y[5] += tf*g[4] + tg*f[4]; + tf = CONSTANT(0.156078347226000000) * f[7]; + tg = CONSTANT(0.156078347226000000) * g[7]; + y[4] += tf * g[5] + tg * f[5]; + y[5] += tf * g[4] + tg * f[4]; t = f[4] * g[5] + f[5] * g[4]; - y[7] += CONSTANT(0.156078347226000000)*t; + y[7] += CONSTANT(0.156078347226000000) * t; // [5,5]: 0,6,8, - tf = CONSTANT(0.282094791773999990)*f[0] + CONSTANT(0.090111875786499998)*f[6] + CONSTANT(-0.156078347227999990)*f[8]; - tg = CONSTANT(0.282094791773999990)*g[0] + CONSTANT(0.090111875786499998)*g[6] + CONSTANT(-0.156078347227999990)*g[8]; - y[5] += tf*g[5] + tg*f[5]; + tf = CONSTANT(0.282094791773999990) * f[0] + CONSTANT(0.090111875786499998) * f[6] + CONSTANT(-0.156078347227999990) * f[8]; + tg = CONSTANT(0.282094791773999990) * g[0] + CONSTANT(0.090111875786499998) * g[6] + CONSTANT(-0.156078347227999990) * g[8]; + y[5] += tf * g[5] + tg * f[5]; t = f[5] * g[5]; - y[0] += CONSTANT(0.282094791773999990)*t; - y[6] += CONSTANT(0.090111875786499998)*t; - y[8] += CONSTANT(-0.156078347227999990)*t; + y[0] += CONSTANT(0.282094791773999990) * t; + y[6] += CONSTANT(0.090111875786499998) * t; + y[8] += CONSTANT(-0.156078347227999990) * t; // [6,6]: 0,6, - tf = CONSTANT(0.282094797560000000)*f[0]; - tg = CONSTANT(0.282094797560000000)*g[0]; - y[6] += tf*g[6] + tg*f[6]; + tf = CONSTANT(0.282094797560000000) * f[0]; + tg = CONSTANT(0.282094797560000000) * g[0]; + y[6] += tf * g[6] + tg * f[6]; t = f[6] * g[6]; - y[0] += CONSTANT(0.282094797560000000)*t; - y[6] += CONSTANT(0.180223764527000010)*t; + y[0] += CONSTANT(0.282094797560000000) * t; + y[6] += CONSTANT(0.180223764527000010) * t; // [7,7]: 0,6,8, - tf = CONSTANT(0.282094791773999990)*f[0] + CONSTANT(0.090111875786499998)*f[6] + CONSTANT(0.156078347227999990)*f[8]; - tg = CONSTANT(0.282094791773999990)*g[0] + CONSTANT(0.090111875786499998)*g[6] + CONSTANT(0.156078347227999990)*g[8]; - y[7] += tf*g[7] + tg*f[7]; + tf = CONSTANT(0.282094791773999990) * f[0] + CONSTANT(0.090111875786499998) * f[6] + CONSTANT(0.156078347227999990) * f[8]; + tg = CONSTANT(0.282094791773999990) * g[0] + CONSTANT(0.090111875786499998) * g[6] + CONSTANT(0.156078347227999990) * g[8]; + y[7] += tf * g[7] + tg * f[7]; t = f[7] * g[7]; - y[0] += CONSTANT(0.282094791773999990)*t; - y[6] += CONSTANT(0.090111875786499998)*t; - y[8] += CONSTANT(0.156078347227999990)*t; + y[0] += CONSTANT(0.282094791773999990) * t; + y[6] += CONSTANT(0.090111875786499998) * t; + y[8] += CONSTANT(0.156078347227999990) * t; // [8,8]: 0,6, - tf = CONSTANT(0.282094791770000020)*f[0] + CONSTANT(-0.180223751576000010)*f[6]; - tg = CONSTANT(0.282094791770000020)*g[0] + CONSTANT(-0.180223751576000010)*g[6]; - y[8] += tf*g[8] + tg*f[8]; + tf = CONSTANT(0.282094791770000020) * f[0] + CONSTANT(-0.180223751576000010) * f[6]; + tg = CONSTANT(0.282094791770000020) * g[0] + CONSTANT(-0.180223751576000010) * g[6]; + y[8] += tf * g[8] + tg * f[8]; t = f[8] * g[8]; - y[0] += CONSTANT(0.282094791770000020)*t; - y[6] += CONSTANT(-0.180223751576000010)*t; + y[0] += CONSTANT(0.282094791770000020) * t; + y[6] += CONSTANT(-0.180223751576000010) * t; // multiply count=120 return y; } - //------------------------------------------------------------------------------------- // https://msdn.microsoft.com/en-us/library/windows/desktop/bb232907.aspx //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -float* DirectX::XMSHMultiply4( - float *y, - const float *f, - const float *g) noexcept +_Use_decl_annotations_ float* DirectX::XMSHMultiply4(float* y, const float* f, const float* g) noexcept { if (!y || !f || !g) return nullptr; REAL tf, tg, t; // [0,0]: 0, - y[0] = CONSTANT(0.282094792935999980)*f[0] * g[0]; + y[0] = CONSTANT(0.282094792935999980) * f[0] * g[0]; // [1,1]: 0,6,8, - tf = CONSTANT(0.282094791773000010)*f[0] + CONSTANT(-0.126156626101000010)*f[6] + CONSTANT(-0.218509686119999990)*f[8]; - tg = CONSTANT(0.282094791773000010)*g[0] + CONSTANT(-0.126156626101000010)*g[6] + CONSTANT(-0.218509686119999990)*g[8]; - y[1] = tf*g[1] + tg*f[1]; - t = f[1] * g[1]; - y[0] += CONSTANT(0.282094791773000010)*t; - y[6] = CONSTANT(-0.126156626101000010)*t; - y[8] = CONSTANT(-0.218509686119999990)*t; + tf = CONSTANT(0.282094791773000010) * f[0] + CONSTANT(-0.126156626101000010) * f[6] + CONSTANT(-0.218509686119999990) * f[8]; + tg = CONSTANT(0.282094791773000010) * g[0] + CONSTANT(-0.126156626101000010) * g[6] + CONSTANT(-0.218509686119999990) * g[8]; + y[1] = tf * g[1] + tg * f[1]; + t = f[1] * g[1]; + y[0] += CONSTANT(0.282094791773000010) * t; + y[6] = CONSTANT(-0.126156626101000010) * t; + y[8] = CONSTANT(-0.218509686119999990) * t; // [1,4]: 3,13,15, - tf = CONSTANT(0.218509686114999990)*f[3] + CONSTANT(-0.058399170082300000)*f[13] + CONSTANT(-0.226179013157999990)*f[15]; - tg = CONSTANT(0.218509686114999990)*g[3] + CONSTANT(-0.058399170082300000)*g[13] + CONSTANT(-0.226179013157999990)*g[15]; - y[1] += tf*g[4] + tg*f[4]; - y[4] = tf*g[1] + tg*f[1]; - t = f[1] * g[4] + f[4] * g[1]; - y[3] = CONSTANT(0.218509686114999990)*t; - y[13] = CONSTANT(-0.058399170082300000)*t; - y[15] = CONSTANT(-0.226179013157999990)*t; + tf = CONSTANT(0.218509686114999990) * f[3] + CONSTANT(-0.058399170082300000) * f[13] + CONSTANT(-0.226179013157999990) * f[15]; + tg = CONSTANT(0.218509686114999990) * g[3] + CONSTANT(-0.058399170082300000) * g[13] + CONSTANT(-0.226179013157999990) * g[15]; + y[1] += tf * g[4] + tg * f[4]; + y[4] = tf * g[1] + tg * f[1]; + t = f[1] * g[4] + f[4] * g[1]; + y[3] = CONSTANT(0.218509686114999990) * t; + y[13] = CONSTANT(-0.058399170082300000) * t; + y[15] = CONSTANT(-0.226179013157999990) * t; // [1,5]: 2,12,14, - tf = CONSTANT(0.218509686118000010)*f[2] + CONSTANT(-0.143048168103000000)*f[12] + CONSTANT(-0.184674390923000000)*f[14]; - tg = CONSTANT(0.218509686118000010)*g[2] + CONSTANT(-0.143048168103000000)*g[12] + CONSTANT(-0.184674390923000000)*g[14]; - y[1] += tf*g[5] + tg*f[5]; - y[5] = tf*g[1] + tg*f[1]; - t = f[1] * g[5] + f[5] * g[1]; - y[2] = CONSTANT(0.218509686118000010)*t; - y[12] = CONSTANT(-0.143048168103000000)*t; - y[14] = CONSTANT(-0.184674390923000000)*t; + tf = CONSTANT(0.218509686118000010) * f[2] + CONSTANT(-0.143048168103000000) * f[12] + CONSTANT(-0.184674390923000000) * f[14]; + tg = CONSTANT(0.218509686118000010) * g[2] + CONSTANT(-0.143048168103000000) * g[12] + CONSTANT(-0.184674390923000000) * g[14]; + y[1] += tf * g[5] + tg * f[5]; + y[5] = tf * g[1] + tg * f[1]; + t = f[1] * g[5] + f[5] * g[1]; + y[2] = CONSTANT(0.218509686118000010) * t; + y[12] = CONSTANT(-0.143048168103000000) * t; + y[14] = CONSTANT(-0.184674390923000000) * t; // [1,6]: 11, - tf = CONSTANT(0.202300659402999990)*f[11]; - tg = CONSTANT(0.202300659402999990)*g[11]; - y[1] += tf*g[6] + tg*f[6]; - y[6] += tf*g[1] + tg*f[1]; - t = f[1] * g[6] + f[6] * g[1]; - y[11] = CONSTANT(0.202300659402999990)*t; + tf = CONSTANT(0.202300659402999990) * f[11]; + tg = CONSTANT(0.202300659402999990) * g[11]; + y[1] += tf * g[6] + tg * f[6]; + y[6] += tf * g[1] + tg * f[1]; + t = f[1] * g[6] + f[6] * g[1]; + y[11] = CONSTANT(0.202300659402999990) * t; // [1,8]: 9,11, - tf = CONSTANT(0.226179013155000000)*f[9] + CONSTANT(0.058399170081799998)*f[11]; - tg = CONSTANT(0.226179013155000000)*g[9] + CONSTANT(0.058399170081799998)*g[11]; - y[1] += tf*g[8] + tg*f[8]; - y[8] += tf*g[1] + tg*f[1]; - t = f[1] * g[8] + f[8] * g[1]; - y[9] = CONSTANT(0.226179013155000000)*t; - y[11] += CONSTANT(0.058399170081799998)*t; + tf = CONSTANT(0.226179013155000000) * f[9] + CONSTANT(0.058399170081799998) * f[11]; + tg = CONSTANT(0.226179013155000000) * g[9] + CONSTANT(0.058399170081799998) * g[11]; + y[1] += tf * g[8] + tg * f[8]; + y[8] += tf * g[1] + tg * f[1]; + t = f[1] * g[8] + f[8] * g[1]; + y[9] = CONSTANT(0.226179013155000000) * t; + y[11] += CONSTANT(0.058399170081799998) * t; // [2,2]: 0,6, - tf = CONSTANT(0.282094795249000000)*f[0] + CONSTANT(0.252313259986999990)*f[6]; - tg = CONSTANT(0.282094795249000000)*g[0] + CONSTANT(0.252313259986999990)*g[6]; - y[2] += tf*g[2] + tg*f[2]; + tf = CONSTANT(0.282094795249000000) * f[0] + CONSTANT(0.252313259986999990) * f[6]; + tg = CONSTANT(0.282094795249000000) * g[0] + CONSTANT(0.252313259986999990) * g[6]; + y[2] += tf * g[2] + tg * f[2]; t = f[2] * g[2]; - y[0] += CONSTANT(0.282094795249000000)*t; - y[6] += CONSTANT(0.252313259986999990)*t; + y[0] += CONSTANT(0.282094795249000000) * t; + y[6] += CONSTANT(0.252313259986999990) * t; // [2,6]: 12, - tf = CONSTANT(0.247766706973999990)*f[12]; - tg = CONSTANT(0.247766706973999990)*g[12]; - y[2] += tf*g[6] + tg*f[6]; - y[6] += tf*g[2] + tg*f[2]; + tf = CONSTANT(0.247766706973999990) * f[12]; + tg = CONSTANT(0.247766706973999990) * g[12]; + y[2] += tf * g[6] + tg * f[6]; + y[6] += tf * g[2] + tg * f[2]; t = f[2] * g[6] + f[6] * g[2]; - y[12] += CONSTANT(0.247766706973999990)*t; + y[12] += CONSTANT(0.247766706973999990) * t; // [3,3]: 0,6,8, - tf = CONSTANT(0.282094791773000010)*f[0] + CONSTANT(-0.126156626101000010)*f[6] + CONSTANT(0.218509686119999990)*f[8]; - tg = CONSTANT(0.282094791773000010)*g[0] + CONSTANT(-0.126156626101000010)*g[6] + CONSTANT(0.218509686119999990)*g[8]; - y[3] += tf*g[3] + tg*f[3]; + tf = CONSTANT(0.282094791773000010) * f[0] + CONSTANT(-0.126156626101000010) * f[6] + CONSTANT(0.218509686119999990) * f[8]; + tg = CONSTANT(0.282094791773000010) * g[0] + CONSTANT(-0.126156626101000010) * g[6] + CONSTANT(0.218509686119999990) * g[8]; + y[3] += tf * g[3] + tg * f[3]; t = f[3] * g[3]; - y[0] += CONSTANT(0.282094791773000010)*t; - y[6] += CONSTANT(-0.126156626101000010)*t; - y[8] += CONSTANT(0.218509686119999990)*t; + y[0] += CONSTANT(0.282094791773000010) * t; + y[6] += CONSTANT(-0.126156626101000010) * t; + y[8] += CONSTANT(0.218509686119999990) * t; // [3,6]: 13, - tf = CONSTANT(0.202300659402999990)*f[13]; - tg = CONSTANT(0.202300659402999990)*g[13]; - y[3] += tf*g[6] + tg*f[6]; - y[6] += tf*g[3] + tg*f[3]; + tf = CONSTANT(0.202300659402999990) * f[13]; + tg = CONSTANT(0.202300659402999990) * g[13]; + y[3] += tf * g[6] + tg * f[6]; + y[6] += tf * g[3] + tg * f[3]; t = f[3] * g[6] + f[6] * g[3]; - y[13] += CONSTANT(0.202300659402999990)*t; + y[13] += CONSTANT(0.202300659402999990) * t; // [3,7]: 2,12,14, - tf = CONSTANT(0.218509686118000010)*f[2] + CONSTANT(-0.143048168103000000)*f[12] + CONSTANT(0.184674390923000000)*f[14]; - tg = CONSTANT(0.218509686118000010)*g[2] + CONSTANT(-0.143048168103000000)*g[12] + CONSTANT(0.184674390923000000)*g[14]; - y[3] += tf*g[7] + tg*f[7]; - y[7] = tf*g[3] + tg*f[3]; - t = f[3] * g[7] + f[7] * g[3]; - y[2] += CONSTANT(0.218509686118000010)*t; - y[12] += CONSTANT(-0.143048168103000000)*t; - y[14] += CONSTANT(0.184674390923000000)*t; + tf = CONSTANT(0.218509686118000010) * f[2] + CONSTANT(-0.143048168103000000) * f[12] + CONSTANT(0.184674390923000000) * f[14]; + tg = CONSTANT(0.218509686118000010) * g[2] + CONSTANT(-0.143048168103000000) * g[12] + CONSTANT(0.184674390923000000) * g[14]; + y[3] += tf * g[7] + tg * f[7]; + y[7] = tf * g[3] + tg * f[3]; + t = f[3] * g[7] + f[7] * g[3]; + y[2] += CONSTANT(0.218509686118000010) * t; + y[12] += CONSTANT(-0.143048168103000000) * t; + y[14] += CONSTANT(0.184674390923000000) * t; // [3,8]: 13,15, - tf = CONSTANT(-0.058399170081799998)*f[13] + CONSTANT(0.226179013155000000)*f[15]; - tg = CONSTANT(-0.058399170081799998)*g[13] + CONSTANT(0.226179013155000000)*g[15]; - y[3] += tf*g[8] + tg*f[8]; - y[8] += tf*g[3] + tg*f[3]; + tf = CONSTANT(-0.058399170081799998) * f[13] + CONSTANT(0.226179013155000000) * f[15]; + tg = CONSTANT(-0.058399170081799998) * g[13] + CONSTANT(0.226179013155000000) * g[15]; + y[3] += tf * g[8] + tg * f[8]; + y[8] += tf * g[3] + tg * f[3]; t = f[3] * g[8] + f[8] * g[3]; - y[13] += CONSTANT(-0.058399170081799998)*t; - y[15] += CONSTANT(0.226179013155000000)*t; + y[13] += CONSTANT(-0.058399170081799998) * t; + y[15] += CONSTANT(0.226179013155000000) * t; // [4,4]: 0,6, - tf = CONSTANT(0.282094791770000020)*f[0] + CONSTANT(-0.180223751576000010)*f[6]; - tg = CONSTANT(0.282094791770000020)*g[0] + CONSTANT(-0.180223751576000010)*g[6]; - y[4] += tf*g[4] + tg*f[4]; + tf = CONSTANT(0.282094791770000020) * f[0] + CONSTANT(-0.180223751576000010) * f[6]; + tg = CONSTANT(0.282094791770000020) * g[0] + CONSTANT(-0.180223751576000010) * g[6]; + y[4] += tf * g[4] + tg * f[4]; t = f[4] * g[4]; - y[0] += CONSTANT(0.282094791770000020)*t; - y[6] += CONSTANT(-0.180223751576000010)*t; + y[0] += CONSTANT(0.282094791770000020) * t; + y[6] += CONSTANT(-0.180223751576000010) * t; // [4,5]: 7, - tf = CONSTANT(0.156078347226000000)*f[7]; - tg = CONSTANT(0.156078347226000000)*g[7]; - y[4] += tf*g[5] + tg*f[5]; - y[5] += tf*g[4] + tg*f[4]; + tf = CONSTANT(0.156078347226000000) * f[7]; + tg = CONSTANT(0.156078347226000000) * g[7]; + y[4] += tf * g[5] + tg * f[5]; + y[5] += tf * g[4] + tg * f[4]; t = f[4] * g[5] + f[5] * g[4]; - y[7] += CONSTANT(0.156078347226000000)*t; + y[7] += CONSTANT(0.156078347226000000) * t; // [4,9]: 3,13, - tf = CONSTANT(0.226179013157999990)*f[3] + CONSTANT(-0.094031597258400004)*f[13]; - tg = CONSTANT(0.226179013157999990)*g[3] + CONSTANT(-0.094031597258400004)*g[13]; - y[4] += tf*g[9] + tg*f[9]; - y[9] += tf*g[4] + tg*f[4]; + tf = CONSTANT(0.226179013157999990) * f[3] + CONSTANT(-0.094031597258400004) * f[13]; + tg = CONSTANT(0.226179013157999990) * g[3] + CONSTANT(-0.094031597258400004) * g[13]; + y[4] += tf * g[9] + tg * f[9]; + y[9] += tf * g[4] + tg * f[4]; t = f[4] * g[9] + f[9] * g[4]; - y[3] += CONSTANT(0.226179013157999990)*t; - y[13] += CONSTANT(-0.094031597258400004)*t; + y[3] += CONSTANT(0.226179013157999990) * t; + y[13] += CONSTANT(-0.094031597258400004) * t; // [4,10]: 2,12, - tf = CONSTANT(0.184674390919999990)*f[2] + CONSTANT(-0.188063194517999990)*f[12]; - tg = CONSTANT(0.184674390919999990)*g[2] + CONSTANT(-0.188063194517999990)*g[12]; - y[4] += tf*g[10] + tg*f[10]; - y[10] = tf*g[4] + tg*f[4]; - t = f[4] * g[10] + f[10] * g[4]; - y[2] += CONSTANT(0.184674390919999990)*t; - y[12] += CONSTANT(-0.188063194517999990)*t; + tf = CONSTANT(0.184674390919999990) * f[2] + CONSTANT(-0.188063194517999990) * f[12]; + tg = CONSTANT(0.184674390919999990) * g[2] + CONSTANT(-0.188063194517999990) * g[12]; + y[4] += tf * g[10] + tg * f[10]; + y[10] = tf * g[4] + tg * f[4]; + t = f[4] * g[10] + f[10] * g[4]; + y[2] += CONSTANT(0.184674390919999990) * t; + y[12] += CONSTANT(-0.188063194517999990) * t; // [4,11]: 3,13,15, - tf = CONSTANT(-0.058399170082300000)*f[3] + CONSTANT(0.145673124078000010)*f[13] + CONSTANT(0.094031597258400004)*f[15]; - tg = CONSTANT(-0.058399170082300000)*g[3] + CONSTANT(0.145673124078000010)*g[13] + CONSTANT(0.094031597258400004)*g[15]; - y[4] += tf*g[11] + tg*f[11]; - y[11] += tf*g[4] + tg*f[4]; + tf = CONSTANT(-0.058399170082300000) * f[3] + CONSTANT(0.145673124078000010) * f[13] + CONSTANT(0.094031597258400004) * f[15]; + tg = CONSTANT(-0.058399170082300000) * g[3] + CONSTANT(0.145673124078000010) * g[13] + CONSTANT(0.094031597258400004) * g[15]; + y[4] += tf * g[11] + tg * f[11]; + y[11] += tf * g[4] + tg * f[4]; t = f[4] * g[11] + f[11] * g[4]; - y[3] += CONSTANT(-0.058399170082300000)*t; - y[13] += CONSTANT(0.145673124078000010)*t; - y[15] += CONSTANT(0.094031597258400004)*t; + y[3] += CONSTANT(-0.058399170082300000) * t; + y[13] += CONSTANT(0.145673124078000010) * t; + y[15] += CONSTANT(0.094031597258400004) * t; // [5,5]: 0,6,8, - tf = CONSTANT(0.282094791773999990)*f[0] + CONSTANT(0.090111875786499998)*f[6] + CONSTANT(-0.156078347227999990)*f[8]; - tg = CONSTANT(0.282094791773999990)*g[0] + CONSTANT(0.090111875786499998)*g[6] + CONSTANT(-0.156078347227999990)*g[8]; - y[5] += tf*g[5] + tg*f[5]; + tf = CONSTANT(0.282094791773999990) * f[0] + CONSTANT(0.090111875786499998) * f[6] + CONSTANT(-0.156078347227999990) * f[8]; + tg = CONSTANT(0.282094791773999990) * g[0] + CONSTANT(0.090111875786499998) * g[6] + CONSTANT(-0.156078347227999990) * g[8]; + y[5] += tf * g[5] + tg * f[5]; t = f[5] * g[5]; - y[0] += CONSTANT(0.282094791773999990)*t; - y[6] += CONSTANT(0.090111875786499998)*t; - y[8] += CONSTANT(-0.156078347227999990)*t; + y[0] += CONSTANT(0.282094791773999990) * t; + y[6] += CONSTANT(0.090111875786499998) * t; + y[8] += CONSTANT(-0.156078347227999990) * t; // [5,9]: 14, - tf = CONSTANT(0.148677009677999990)*f[14]; - tg = CONSTANT(0.148677009677999990)*g[14]; - y[5] += tf*g[9] + tg*f[9]; - y[9] += tf*g[5] + tg*f[5]; + tf = CONSTANT(0.148677009677999990) * f[14]; + tg = CONSTANT(0.148677009677999990) * g[14]; + y[5] += tf * g[9] + tg * f[9]; + y[9] += tf * g[5] + tg * f[5]; t = f[5] * g[9] + f[9] * g[5]; - y[14] += CONSTANT(0.148677009677999990)*t; + y[14] += CONSTANT(0.148677009677999990) * t; // [5,10]: 3,13,15, - tf = CONSTANT(0.184674390919999990)*f[3] + CONSTANT(0.115164716490000000)*f[13] + CONSTANT(-0.148677009678999990)*f[15]; - tg = CONSTANT(0.184674390919999990)*g[3] + CONSTANT(0.115164716490000000)*g[13] + CONSTANT(-0.148677009678999990)*g[15]; - y[5] += tf*g[10] + tg*f[10]; - y[10] += tf*g[5] + tg*f[5]; + tf = CONSTANT(0.184674390919999990) * f[3] + CONSTANT(0.115164716490000000) * f[13] + CONSTANT(-0.148677009678999990) * f[15]; + tg = CONSTANT(0.184674390919999990) * g[3] + CONSTANT(0.115164716490000000) * g[13] + CONSTANT(-0.148677009678999990) * g[15]; + y[5] += tf * g[10] + tg * f[10]; + y[10] += tf * g[5] + tg * f[5]; t = f[5] * g[10] + f[10] * g[5]; - y[3] += CONSTANT(0.184674390919999990)*t; - y[13] += CONSTANT(0.115164716490000000)*t; - y[15] += CONSTANT(-0.148677009678999990)*t; + y[3] += CONSTANT(0.184674390919999990) * t; + y[13] += CONSTANT(0.115164716490000000) * t; + y[15] += CONSTANT(-0.148677009678999990) * t; // [5,11]: 2,12,14, - tf = CONSTANT(0.233596680327000010)*f[2] + CONSTANT(0.059470803871800003)*f[12] + CONSTANT(-0.115164716491000000)*f[14]; - tg = CONSTANT(0.233596680327000010)*g[2] + CONSTANT(0.059470803871800003)*g[12] + CONSTANT(-0.115164716491000000)*g[14]; - y[5] += tf*g[11] + tg*f[11]; - y[11] += tf*g[5] + tg*f[5]; + tf = CONSTANT(0.233596680327000010) * f[2] + CONSTANT(0.059470803871800003) * f[12] + CONSTANT(-0.115164716491000000) * f[14]; + tg = CONSTANT(0.233596680327000010) * g[2] + CONSTANT(0.059470803871800003) * g[12] + CONSTANT(-0.115164716491000000) * g[14]; + y[5] += tf * g[11] + tg * f[11]; + y[11] += tf * g[5] + tg * f[5]; t = f[5] * g[11] + f[11] * g[5]; - y[2] += CONSTANT(0.233596680327000010)*t; - y[12] += CONSTANT(0.059470803871800003)*t; - y[14] += CONSTANT(-0.115164716491000000)*t; + y[2] += CONSTANT(0.233596680327000010) * t; + y[12] += CONSTANT(0.059470803871800003) * t; + y[14] += CONSTANT(-0.115164716491000000) * t; // [6,6]: 0,6, - tf = CONSTANT(0.282094797560000000)*f[0]; - tg = CONSTANT(0.282094797560000000)*g[0]; - y[6] += tf*g[6] + tg*f[6]; + tf = CONSTANT(0.282094797560000000) * f[0]; + tg = CONSTANT(0.282094797560000000) * g[0]; + y[6] += tf * g[6] + tg * f[6]; t = f[6] * g[6]; - y[0] += CONSTANT(0.282094797560000000)*t; - y[6] += CONSTANT(0.180223764527000010)*t; + y[0] += CONSTANT(0.282094797560000000) * t; + y[6] += CONSTANT(0.180223764527000010) * t; // [7,7]: 6,0,8, - tf = CONSTANT(0.090111875786499998)*f[6] + CONSTANT(0.282094791773999990)*f[0] + CONSTANT(0.156078347227999990)*f[8]; - tg = CONSTANT(0.090111875786499998)*g[6] + CONSTANT(0.282094791773999990)*g[0] + CONSTANT(0.156078347227999990)*g[8]; - y[7] += tf*g[7] + tg*f[7]; + tf = CONSTANT(0.090111875786499998) * f[6] + CONSTANT(0.282094791773999990) * f[0] + CONSTANT(0.156078347227999990) * f[8]; + tg = CONSTANT(0.090111875786499998) * g[6] + CONSTANT(0.282094791773999990) * g[0] + CONSTANT(0.156078347227999990) * g[8]; + y[7] += tf * g[7] + tg * f[7]; t = f[7] * g[7]; - y[6] += CONSTANT(0.090111875786499998)*t; - y[0] += CONSTANT(0.282094791773999990)*t; - y[8] += CONSTANT(0.156078347227999990)*t; + y[6] += CONSTANT(0.090111875786499998) * t; + y[0] += CONSTANT(0.282094791773999990) * t; + y[8] += CONSTANT(0.156078347227999990) * t; // [7,10]: 9,1,11, - tf = CONSTANT(0.148677009678999990)*f[9] + CONSTANT(0.184674390919999990)*f[1] + CONSTANT(0.115164716490000000)*f[11]; - tg = CONSTANT(0.148677009678999990)*g[9] + CONSTANT(0.184674390919999990)*g[1] + CONSTANT(0.115164716490000000)*g[11]; - y[7] += tf*g[10] + tg*f[10]; - y[10] += tf*g[7] + tg*f[7]; + tf = CONSTANT(0.148677009678999990) * f[9] + CONSTANT(0.184674390919999990) * f[1] + CONSTANT(0.115164716490000000) * f[11]; + tg = CONSTANT(0.148677009678999990) * g[9] + CONSTANT(0.184674390919999990) * g[1] + CONSTANT(0.115164716490000000) * g[11]; + y[7] += tf * g[10] + tg * f[10]; + y[10] += tf * g[7] + tg * f[7]; t = f[7] * g[10] + f[10] * g[7]; - y[9] += CONSTANT(0.148677009678999990)*t; - y[1] += CONSTANT(0.184674390919999990)*t; - y[11] += CONSTANT(0.115164716490000000)*t; + y[9] += CONSTANT(0.148677009678999990) * t; + y[1] += CONSTANT(0.184674390919999990) * t; + y[11] += CONSTANT(0.115164716490000000) * t; // [7,13]: 12,2,14, - tf = CONSTANT(0.059470803871800003)*f[12] + CONSTANT(0.233596680327000010)*f[2] + CONSTANT(0.115164716491000000)*f[14]; - tg = CONSTANT(0.059470803871800003)*g[12] + CONSTANT(0.233596680327000010)*g[2] + CONSTANT(0.115164716491000000)*g[14]; - y[7] += tf*g[13] + tg*f[13]; - y[13] += tf*g[7] + tg*f[7]; + tf = CONSTANT(0.059470803871800003) * f[12] + CONSTANT(0.233596680327000010) * f[2] + CONSTANT(0.115164716491000000) * f[14]; + tg = CONSTANT(0.059470803871800003) * g[12] + CONSTANT(0.233596680327000010) * g[2] + CONSTANT(0.115164716491000000) * g[14]; + y[7] += tf * g[13] + tg * f[13]; + y[13] += tf * g[7] + tg * f[7]; t = f[7] * g[13] + f[13] * g[7]; - y[12] += CONSTANT(0.059470803871800003)*t; - y[2] += CONSTANT(0.233596680327000010)*t; - y[14] += CONSTANT(0.115164716491000000)*t; + y[12] += CONSTANT(0.059470803871800003) * t; + y[2] += CONSTANT(0.233596680327000010) * t; + y[14] += CONSTANT(0.115164716491000000) * t; // [7,14]: 15, - tf = CONSTANT(0.148677009677999990)*f[15]; - tg = CONSTANT(0.148677009677999990)*g[15]; - y[7] += tf*g[14] + tg*f[14]; - y[14] += tf*g[7] + tg*f[7]; + tf = CONSTANT(0.148677009677999990) * f[15]; + tg = CONSTANT(0.148677009677999990) * g[15]; + y[7] += tf * g[14] + tg * f[14]; + y[14] += tf * g[7] + tg * f[7]; t = f[7] * g[14] + f[14] * g[7]; - y[15] += CONSTANT(0.148677009677999990)*t; + y[15] += CONSTANT(0.148677009677999990) * t; // [8,8]: 0,6, - tf = CONSTANT(0.282094791770000020)*f[0] + CONSTANT(-0.180223751576000010)*f[6]; - tg = CONSTANT(0.282094791770000020)*g[0] + CONSTANT(-0.180223751576000010)*g[6]; - y[8] += tf*g[8] + tg*f[8]; + tf = CONSTANT(0.282094791770000020) * f[0] + CONSTANT(-0.180223751576000010) * f[6]; + tg = CONSTANT(0.282094791770000020) * g[0] + CONSTANT(-0.180223751576000010) * g[6]; + y[8] += tf * g[8] + tg * f[8]; t = f[8] * g[8]; - y[0] += CONSTANT(0.282094791770000020)*t; - y[6] += CONSTANT(-0.180223751576000010)*t; + y[0] += CONSTANT(0.282094791770000020) * t; + y[6] += CONSTANT(-0.180223751576000010) * t; // [8,9]: 11, - tf = CONSTANT(-0.094031597259499999)*f[11]; - tg = CONSTANT(-0.094031597259499999)*g[11]; - y[8] += tf*g[9] + tg*f[9]; - y[9] += tf*g[8] + tg*f[8]; + tf = CONSTANT(-0.094031597259499999) * f[11]; + tg = CONSTANT(-0.094031597259499999) * g[11]; + y[8] += tf * g[9] + tg * f[9]; + y[9] += tf * g[8] + tg * f[8]; t = f[8] * g[9] + f[9] * g[8]; - y[11] += CONSTANT(-0.094031597259499999)*t; + y[11] += CONSTANT(-0.094031597259499999) * t; // [8,13]: 15, - tf = CONSTANT(-0.094031597259499999)*f[15]; - tg = CONSTANT(-0.094031597259499999)*g[15]; - y[8] += tf*g[13] + tg*f[13]; - y[13] += tf*g[8] + tg*f[8]; + tf = CONSTANT(-0.094031597259499999) * f[15]; + tg = CONSTANT(-0.094031597259499999) * g[15]; + y[8] += tf * g[13] + tg * f[13]; + y[13] += tf * g[8] + tg * f[8]; t = f[8] * g[13] + f[13] * g[8]; - y[15] += CONSTANT(-0.094031597259499999)*t; + y[15] += CONSTANT(-0.094031597259499999) * t; // [8,14]: 2,12, - tf = CONSTANT(0.184674390919999990)*f[2] + CONSTANT(-0.188063194517999990)*f[12]; - tg = CONSTANT(0.184674390919999990)*g[2] + CONSTANT(-0.188063194517999990)*g[12]; - y[8] += tf*g[14] + tg*f[14]; - y[14] += tf*g[8] + tg*f[8]; + tf = CONSTANT(0.184674390919999990) * f[2] + CONSTANT(-0.188063194517999990) * f[12]; + tg = CONSTANT(0.184674390919999990) * g[2] + CONSTANT(-0.188063194517999990) * g[12]; + y[8] += tf * g[14] + tg * f[14]; + y[14] += tf * g[8] + tg * f[8]; t = f[8] * g[14] + f[14] * g[8]; - y[2] += CONSTANT(0.184674390919999990)*t; - y[12] += CONSTANT(-0.188063194517999990)*t; + y[2] += CONSTANT(0.184674390919999990) * t; + y[12] += CONSTANT(-0.188063194517999990) * t; // [9,9]: 6,0, - tf = CONSTANT(-0.210261043508000010)*f[6] + CONSTANT(0.282094791766999970)*f[0]; - tg = CONSTANT(-0.210261043508000010)*g[6] + CONSTANT(0.282094791766999970)*g[0]; - y[9] += tf*g[9] + tg*f[9]; + tf = CONSTANT(-0.210261043508000010) * f[6] + CONSTANT(0.282094791766999970) * f[0]; + tg = CONSTANT(-0.210261043508000010) * g[6] + CONSTANT(0.282094791766999970) * g[0]; + y[9] += tf * g[9] + tg * f[9]; t = f[9] * g[9]; - y[6] += CONSTANT(-0.210261043508000010)*t; - y[0] += CONSTANT(0.282094791766999970)*t; + y[6] += CONSTANT(-0.210261043508000010) * t; + y[0] += CONSTANT(0.282094791766999970) * t; // [10,10]: 0, - tf = CONSTANT(0.282094791771999980)*f[0]; - tg = CONSTANT(0.282094791771999980)*g[0]; - y[10] += tf*g[10] + tg*f[10]; + tf = CONSTANT(0.282094791771999980) * f[0]; + tg = CONSTANT(0.282094791771999980) * g[0]; + y[10] += tf * g[10] + tg * f[10]; t = f[10] * g[10]; - y[0] += CONSTANT(0.282094791771999980)*t; + y[0] += CONSTANT(0.282094791771999980) * t; // [11,11]: 0,6,8, - tf = CONSTANT(0.282094791773999990)*f[0] + CONSTANT(0.126156626101000010)*f[6] + CONSTANT(-0.145673124078999990)*f[8]; - tg = CONSTANT(0.282094791773999990)*g[0] + CONSTANT(0.126156626101000010)*g[6] + CONSTANT(-0.145673124078999990)*g[8]; - y[11] += tf*g[11] + tg*f[11]; + tf = CONSTANT(0.282094791773999990) * f[0] + CONSTANT(0.126156626101000010) * f[6] + CONSTANT(-0.145673124078999990) * f[8]; + tg = CONSTANT(0.282094791773999990) * g[0] + CONSTANT(0.126156626101000010) * g[6] + CONSTANT(-0.145673124078999990) * g[8]; + y[11] += tf * g[11] + tg * f[11]; t = f[11] * g[11]; - y[0] += CONSTANT(0.282094791773999990)*t; - y[6] += CONSTANT(0.126156626101000010)*t; - y[8] += CONSTANT(-0.145673124078999990)*t; + y[0] += CONSTANT(0.282094791773999990) * t; + y[6] += CONSTANT(0.126156626101000010) * t; + y[8] += CONSTANT(-0.145673124078999990) * t; // [12,12]: 0,6, - tf = CONSTANT(0.282094799871999980)*f[0] + CONSTANT(0.168208852954000010)*f[6]; - tg = CONSTANT(0.282094799871999980)*g[0] + CONSTANT(0.168208852954000010)*g[6]; - y[12] += tf*g[12] + tg*f[12]; + tf = CONSTANT(0.282094799871999980) * f[0] + CONSTANT(0.168208852954000010) * f[6]; + tg = CONSTANT(0.282094799871999980) * g[0] + CONSTANT(0.168208852954000010) * g[6]; + y[12] += tf * g[12] + tg * f[12]; t = f[12] * g[12]; - y[0] += CONSTANT(0.282094799871999980)*t; - y[6] += CONSTANT(0.168208852954000010)*t; + y[0] += CONSTANT(0.282094799871999980) * t; + y[6] += CONSTANT(0.168208852954000010) * t; // [13,13]: 0,8,6, - tf = CONSTANT(0.282094791773999990)*f[0] + CONSTANT(0.145673124078999990)*f[8] + CONSTANT(0.126156626101000010)*f[6]; - tg = CONSTANT(0.282094791773999990)*g[0] + CONSTANT(0.145673124078999990)*g[8] + CONSTANT(0.126156626101000010)*g[6]; - y[13] += tf*g[13] + tg*f[13]; + tf = CONSTANT(0.282094791773999990) * f[0] + CONSTANT(0.145673124078999990) * f[8] + CONSTANT(0.126156626101000010) * f[6]; + tg = CONSTANT(0.282094791773999990) * g[0] + CONSTANT(0.145673124078999990) * g[8] + CONSTANT(0.126156626101000010) * g[6]; + y[13] += tf * g[13] + tg * f[13]; t = f[13] * g[13]; - y[0] += CONSTANT(0.282094791773999990)*t; - y[8] += CONSTANT(0.145673124078999990)*t; - y[6] += CONSTANT(0.126156626101000010)*t; + y[0] += CONSTANT(0.282094791773999990) * t; + y[8] += CONSTANT(0.145673124078999990) * t; + y[6] += CONSTANT(0.126156626101000010) * t; // [14,14]: 0, - tf = CONSTANT(0.282094791771999980)*f[0]; - tg = CONSTANT(0.282094791771999980)*g[0]; - y[14] += tf*g[14] + tg*f[14]; + tf = CONSTANT(0.282094791771999980) * f[0]; + tg = CONSTANT(0.282094791771999980) * g[0]; + y[14] += tf * g[14] + tg * f[14]; t = f[14] * g[14]; - y[0] += CONSTANT(0.282094791771999980)*t; + y[0] += CONSTANT(0.282094791771999980) * t; // [15,15]: 0,6, - tf = CONSTANT(0.282094791766999970)*f[0] + CONSTANT(-0.210261043508000010)*f[6]; - tg = CONSTANT(0.282094791766999970)*g[0] + CONSTANT(-0.210261043508000010)*g[6]; - y[15] += tf*g[15] + tg*f[15]; + tf = CONSTANT(0.282094791766999970) * f[0] + CONSTANT(-0.210261043508000010) * f[6]; + tg = CONSTANT(0.282094791766999970) * g[0] + CONSTANT(-0.210261043508000010) * g[6]; + y[15] += tf * g[15] + tg * f[15]; t = f[15] * g[15]; - y[0] += CONSTANT(0.282094791766999970)*t; - y[6] += CONSTANT(-0.210261043508000010)*t; + y[0] += CONSTANT(0.282094791766999970) * t; + y[6] += CONSTANT(-0.210261043508000010) * t; // multiply count=399 return y; } - //------------------------------------------------------------------------------------- // https://msdn.microsoft.com/en-us/library/windows/desktop/bb232908.aspx //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -float* DirectX::XMSHMultiply5( - float *y, - const float *f, - const float *g) noexcept +_Use_decl_annotations_ float* DirectX::XMSHMultiply5(float* y, const float* f, const float* g) noexcept { if (!y || !f || !g) return nullptr; REAL tf, tg, t; // [0,0]: 0, - y[0] = CONSTANT(0.282094792935999980)*f[0] * g[0]; + y[0] = CONSTANT(0.282094792935999980) * f[0] * g[0]; // [1,1]: 0,6,8, - tf = CONSTANT(0.282094791773000010)*f[0] + CONSTANT(-0.126156626101000010)*f[6] + CONSTANT(-0.218509686119999990)*f[8]; - tg = CONSTANT(0.282094791773000010)*g[0] + CONSTANT(-0.126156626101000010)*g[6] + CONSTANT(-0.218509686119999990)*g[8]; - y[1] = tf*g[1] + tg*f[1]; - t = f[1] * g[1]; - y[0] += CONSTANT(0.282094791773000010)*t; - y[6] = CONSTANT(-0.126156626101000010)*t; - y[8] = CONSTANT(-0.218509686119999990)*t; + tf = CONSTANT(0.282094791773000010) * f[0] + CONSTANT(-0.126156626101000010) * f[6] + CONSTANT(-0.218509686119999990) * f[8]; + tg = CONSTANT(0.282094791773000010) * g[0] + CONSTANT(-0.126156626101000010) * g[6] + CONSTANT(-0.218509686119999990) * g[8]; + y[1] = tf * g[1] + tg * f[1]; + t = f[1] * g[1]; + y[0] += CONSTANT(0.282094791773000010) * t; + y[6] = CONSTANT(-0.126156626101000010) * t; + y[8] = CONSTANT(-0.218509686119999990) * t; // [1,4]: 3,13,15, - tf = CONSTANT(0.218509686114999990)*f[3] + CONSTANT(-0.058399170082300000)*f[13] + CONSTANT(-0.226179013157999990)*f[15]; - tg = CONSTANT(0.218509686114999990)*g[3] + CONSTANT(-0.058399170082300000)*g[13] + CONSTANT(-0.226179013157999990)*g[15]; - y[1] += tf*g[4] + tg*f[4]; - y[4] = tf*g[1] + tg*f[1]; - t = f[1] * g[4] + f[4] * g[1]; - y[3] = CONSTANT(0.218509686114999990)*t; - y[13] = CONSTANT(-0.058399170082300000)*t; - y[15] = CONSTANT(-0.226179013157999990)*t; + tf = CONSTANT(0.218509686114999990) * f[3] + CONSTANT(-0.058399170082300000) * f[13] + CONSTANT(-0.226179013157999990) * f[15]; + tg = CONSTANT(0.218509686114999990) * g[3] + CONSTANT(-0.058399170082300000) * g[13] + CONSTANT(-0.226179013157999990) * g[15]; + y[1] += tf * g[4] + tg * f[4]; + y[4] = tf * g[1] + tg * f[1]; + t = f[1] * g[4] + f[4] * g[1]; + y[3] = CONSTANT(0.218509686114999990) * t; + y[13] = CONSTANT(-0.058399170082300000) * t; + y[15] = CONSTANT(-0.226179013157999990) * t; // [1,5]: 2,12,14, - tf = CONSTANT(0.218509686118000010)*f[2] + CONSTANT(-0.143048168103000000)*f[12] + CONSTANT(-0.184674390923000000)*f[14]; - tg = CONSTANT(0.218509686118000010)*g[2] + CONSTANT(-0.143048168103000000)*g[12] + CONSTANT(-0.184674390923000000)*g[14]; - y[1] += tf*g[5] + tg*f[5]; - y[5] = tf*g[1] + tg*f[1]; - t = f[1] * g[5] + f[5] * g[1]; - y[2] = CONSTANT(0.218509686118000010)*t; - y[12] = CONSTANT(-0.143048168103000000)*t; - y[14] = CONSTANT(-0.184674390923000000)*t; + tf = CONSTANT(0.218509686118000010) * f[2] + CONSTANT(-0.143048168103000000) * f[12] + CONSTANT(-0.184674390923000000) * f[14]; + tg = CONSTANT(0.218509686118000010) * g[2] + CONSTANT(-0.143048168103000000) * g[12] + CONSTANT(-0.184674390923000000) * g[14]; + y[1] += tf * g[5] + tg * f[5]; + y[5] = tf * g[1] + tg * f[1]; + t = f[1] * g[5] + f[5] * g[1]; + y[2] = CONSTANT(0.218509686118000010) * t; + y[12] = CONSTANT(-0.143048168103000000) * t; + y[14] = CONSTANT(-0.184674390923000000) * t; // [1,9]: 8,22,24, - tf = CONSTANT(0.226179013155000000)*f[8] + CONSTANT(-0.043528171378199997)*f[22] + CONSTANT(-0.230329432978999990)*f[24]; - tg = CONSTANT(0.226179013155000000)*g[8] + CONSTANT(-0.043528171378199997)*g[22] + CONSTANT(-0.230329432978999990)*g[24]; - y[1] += tf*g[9] + tg*f[9]; - y[9] = tf*g[1] + tg*f[1]; - t = f[1] * g[9] + f[9] * g[1]; - y[8] += CONSTANT(0.226179013155000000)*t; - y[22] = CONSTANT(-0.043528171378199997)*t; - y[24] = CONSTANT(-0.230329432978999990)*t; + tf = CONSTANT(0.226179013155000000) * f[8] + CONSTANT(-0.043528171378199997) * f[22] + CONSTANT(-0.230329432978999990) * f[24]; + tg = CONSTANT(0.226179013155000000) * g[8] + CONSTANT(-0.043528171378199997) * g[22] + CONSTANT(-0.230329432978999990) * g[24]; + y[1] += tf * g[9] + tg * f[9]; + y[9] = tf * g[1] + tg * f[1]; + t = f[1] * g[9] + f[9] * g[1]; + y[8] += CONSTANT(0.226179013155000000) * t; + y[22] = CONSTANT(-0.043528171378199997) * t; + y[24] = CONSTANT(-0.230329432978999990) * t; // [1,10]: 7,21,23, - tf = CONSTANT(0.184674390919999990)*f[7] + CONSTANT(-0.075393004386799994)*f[21] + CONSTANT(-0.199471140200000010)*f[23]; - tg = CONSTANT(0.184674390919999990)*g[7] + CONSTANT(-0.075393004386799994)*g[21] + CONSTANT(-0.199471140200000010)*g[23]; - y[1] += tf*g[10] + tg*f[10]; - y[10] = tf*g[1] + tg*f[1]; - t = f[1] * g[10] + f[10] * g[1]; - y[7] = CONSTANT(0.184674390919999990)*t; - y[21] = CONSTANT(-0.075393004386799994)*t; - y[23] = CONSTANT(-0.199471140200000010)*t; + tf = CONSTANT(0.184674390919999990) * f[7] + CONSTANT(-0.075393004386799994) * f[21] + CONSTANT(-0.199471140200000010) * f[23]; + tg = CONSTANT(0.184674390919999990) * g[7] + CONSTANT(-0.075393004386799994) * g[21] + CONSTANT(-0.199471140200000010) * g[23]; + y[1] += tf * g[10] + tg * f[10]; + y[10] = tf * g[1] + tg * f[1]; + t = f[1] * g[10] + f[10] * g[1]; + y[7] = CONSTANT(0.184674390919999990) * t; + y[21] = CONSTANT(-0.075393004386799994) * t; + y[23] = CONSTANT(-0.199471140200000010) * t; // [1,11]: 6,8,20,22, - tf = CONSTANT(0.202300659402999990)*f[6] + CONSTANT(0.058399170081799998)*f[8] + CONSTANT(-0.150786008773000000)*f[20] + CONSTANT(-0.168583882836999990)*f[22]; - tg = CONSTANT(0.202300659402999990)*g[6] + CONSTANT(0.058399170081799998)*g[8] + CONSTANT(-0.150786008773000000)*g[20] + CONSTANT(-0.168583882836999990)*g[22]; - y[1] += tf*g[11] + tg*f[11]; - y[11] = tf*g[1] + tg*f[1]; - t = f[1] * g[11] + f[11] * g[1]; - y[6] += CONSTANT(0.202300659402999990)*t; - y[8] += CONSTANT(0.058399170081799998)*t; - y[20] = CONSTANT(-0.150786008773000000)*t; - y[22] += CONSTANT(-0.168583882836999990)*t; + tf = CONSTANT(0.202300659402999990) * f[6] + CONSTANT(0.058399170081799998) * f[8] + CONSTANT(-0.150786008773000000) * f[20] + + CONSTANT(-0.168583882836999990) * f[22]; + tg = CONSTANT(0.202300659402999990) * g[6] + CONSTANT(0.058399170081799998) * g[8] + CONSTANT(-0.150786008773000000) * g[20] + + CONSTANT(-0.168583882836999990) * g[22]; + y[1] += tf * g[11] + tg * f[11]; + y[11] = tf * g[1] + tg * f[1]; + t = f[1] * g[11] + f[11] * g[1]; + y[6] += CONSTANT(0.202300659402999990) * t; + y[8] += CONSTANT(0.058399170081799998) * t; + y[20] = CONSTANT(-0.150786008773000000) * t; + y[22] += CONSTANT(-0.168583882836999990) * t; // [1,12]: 19, - tf = CONSTANT(0.194663900273000010)*f[19]; - tg = CONSTANT(0.194663900273000010)*g[19]; - y[1] += tf*g[12] + tg*f[12]; - y[12] += tf*g[1] + tg*f[1]; - t = f[1] * g[12] + f[12] * g[1]; - y[19] = CONSTANT(0.194663900273000010)*t; + tf = CONSTANT(0.194663900273000010) * f[19]; + tg = CONSTANT(0.194663900273000010) * g[19]; + y[1] += tf * g[12] + tg * f[12]; + y[12] += tf * g[1] + tg * f[1]; + t = f[1] * g[12] + f[12] * g[1]; + y[19] = CONSTANT(0.194663900273000010) * t; // [1,13]: 18, - tf = CONSTANT(0.168583882834000000)*f[18]; - tg = CONSTANT(0.168583882834000000)*g[18]; - y[1] += tf*g[13] + tg*f[13]; - y[13] += tf*g[1] + tg*f[1]; - t = f[1] * g[13] + f[13] * g[1]; - y[18] = CONSTANT(0.168583882834000000)*t; + tf = CONSTANT(0.168583882834000000) * f[18]; + tg = CONSTANT(0.168583882834000000) * g[18]; + y[1] += tf * g[13] + tg * f[13]; + y[13] += tf * g[1] + tg * f[1]; + t = f[1] * g[13] + f[13] * g[1]; + y[18] = CONSTANT(0.168583882834000000) * t; // [1,14]: 17,19, - tf = CONSTANT(0.199471140196999990)*f[17] + CONSTANT(0.075393004386399995)*f[19]; - tg = CONSTANT(0.199471140196999990)*g[17] + CONSTANT(0.075393004386399995)*g[19]; - y[1] += tf*g[14] + tg*f[14]; - y[14] += tf*g[1] + tg*f[1]; - t = f[1] * g[14] + f[14] * g[1]; - y[17] = CONSTANT(0.199471140196999990)*t; - y[19] += CONSTANT(0.075393004386399995)*t; + tf = CONSTANT(0.199471140196999990) * f[17] + CONSTANT(0.075393004386399995) * f[19]; + tg = CONSTANT(0.199471140196999990) * g[17] + CONSTANT(0.075393004386399995) * g[19]; + y[1] += tf * g[14] + tg * f[14]; + y[14] += tf * g[1] + tg * f[1]; + t = f[1] * g[14] + f[14] * g[1]; + y[17] = CONSTANT(0.199471140196999990) * t; + y[19] += CONSTANT(0.075393004386399995) * t; // [1,15]: 16,18, - tf = CONSTANT(0.230329432973999990)*f[16] + CONSTANT(0.043528171377799997)*f[18]; - tg = CONSTANT(0.230329432973999990)*g[16] + CONSTANT(0.043528171377799997)*g[18]; - y[1] += tf*g[15] + tg*f[15]; - y[15] += tf*g[1] + tg*f[1]; - t = f[1] * g[15] + f[15] * g[1]; - y[16] = CONSTANT(0.230329432973999990)*t; - y[18] += CONSTANT(0.043528171377799997)*t; + tf = CONSTANT(0.230329432973999990) * f[16] + CONSTANT(0.043528171377799997) * f[18]; + tg = CONSTANT(0.230329432973999990) * g[16] + CONSTANT(0.043528171377799997) * g[18]; + y[1] += tf * g[15] + tg * f[15]; + y[15] += tf * g[1] + tg * f[1]; + t = f[1] * g[15] + f[15] * g[1]; + y[16] = CONSTANT(0.230329432973999990) * t; + y[18] += CONSTANT(0.043528171377799997) * t; // [2,2]: 0,6, - tf = CONSTANT(0.282094795249000000)*f[0] + CONSTANT(0.252313259986999990)*f[6]; - tg = CONSTANT(0.282094795249000000)*g[0] + CONSTANT(0.252313259986999990)*g[6]; - y[2] += tf*g[2] + tg*f[2]; + tf = CONSTANT(0.282094795249000000) * f[0] + CONSTANT(0.252313259986999990) * f[6]; + tg = CONSTANT(0.282094795249000000) * g[0] + CONSTANT(0.252313259986999990) * g[6]; + y[2] += tf * g[2] + tg * f[2]; t = f[2] * g[2]; - y[0] += CONSTANT(0.282094795249000000)*t; - y[6] += CONSTANT(0.252313259986999990)*t; + y[0] += CONSTANT(0.282094795249000000) * t; + y[6] += CONSTANT(0.252313259986999990) * t; // [2,10]: 4,18, - tf = CONSTANT(0.184674390919999990)*f[4] + CONSTANT(0.213243618621000000)*f[18]; - tg = CONSTANT(0.184674390919999990)*g[4] + CONSTANT(0.213243618621000000)*g[18]; - y[2] += tf*g[10] + tg*f[10]; - y[10] += tf*g[2] + tg*f[2]; + tf = CONSTANT(0.184674390919999990) * f[4] + CONSTANT(0.213243618621000000) * f[18]; + tg = CONSTANT(0.184674390919999990) * g[4] + CONSTANT(0.213243618621000000) * g[18]; + y[2] += tf * g[10] + tg * f[10]; + y[10] += tf * g[2] + tg * f[2]; t = f[2] * g[10] + f[10] * g[2]; - y[4] += CONSTANT(0.184674390919999990)*t; - y[18] += CONSTANT(0.213243618621000000)*t; + y[4] += CONSTANT(0.184674390919999990) * t; + y[18] += CONSTANT(0.213243618621000000) * t; // [2,12]: 6,20, - tf = CONSTANT(0.247766706973999990)*f[6] + CONSTANT(0.246232537174000010)*f[20]; - tg = CONSTANT(0.247766706973999990)*g[6] + CONSTANT(0.246232537174000010)*g[20]; - y[2] += tf*g[12] + tg*f[12]; - y[12] += tf*g[2] + tg*f[2]; + tf = CONSTANT(0.247766706973999990) * f[6] + CONSTANT(0.246232537174000010) * f[20]; + tg = CONSTANT(0.247766706973999990) * g[6] + CONSTANT(0.246232537174000010) * g[20]; + y[2] += tf * g[12] + tg * f[12]; + y[12] += tf * g[2] + tg * f[2]; t = f[2] * g[12] + f[12] * g[2]; - y[6] += CONSTANT(0.247766706973999990)*t; - y[20] += CONSTANT(0.246232537174000010)*t; + y[6] += CONSTANT(0.247766706973999990) * t; + y[20] += CONSTANT(0.246232537174000010) * t; // [2,14]: 8,22, - tf = CONSTANT(0.184674390919999990)*f[8] + CONSTANT(0.213243618621000000)*f[22]; - tg = CONSTANT(0.184674390919999990)*g[8] + CONSTANT(0.213243618621000000)*g[22]; - y[2] += tf*g[14] + tg*f[14]; - y[14] += tf*g[2] + tg*f[2]; + tf = CONSTANT(0.184674390919999990) * f[8] + CONSTANT(0.213243618621000000) * f[22]; + tg = CONSTANT(0.184674390919999990) * g[8] + CONSTANT(0.213243618621000000) * g[22]; + y[2] += tf * g[14] + tg * f[14]; + y[14] += tf * g[2] + tg * f[2]; t = f[2] * g[14] + f[14] * g[2]; - y[8] += CONSTANT(0.184674390919999990)*t; - y[22] += CONSTANT(0.213243618621000000)*t; + y[8] += CONSTANT(0.184674390919999990) * t; + y[22] += CONSTANT(0.213243618621000000) * t; // [3,3]: 0,6,8, - tf = CONSTANT(0.282094791773000010)*f[0] + CONSTANT(-0.126156626101000010)*f[6] + CONSTANT(0.218509686119999990)*f[8]; - tg = CONSTANT(0.282094791773000010)*g[0] + CONSTANT(-0.126156626101000010)*g[6] + CONSTANT(0.218509686119999990)*g[8]; - y[3] += tf*g[3] + tg*f[3]; + tf = CONSTANT(0.282094791773000010) * f[0] + CONSTANT(-0.126156626101000010) * f[6] + CONSTANT(0.218509686119999990) * f[8]; + tg = CONSTANT(0.282094791773000010) * g[0] + CONSTANT(-0.126156626101000010) * g[6] + CONSTANT(0.218509686119999990) * g[8]; + y[3] += tf * g[3] + tg * f[3]; t = f[3] * g[3]; - y[0] += CONSTANT(0.282094791773000010)*t; - y[6] += CONSTANT(-0.126156626101000010)*t; - y[8] += CONSTANT(0.218509686119999990)*t; + y[0] += CONSTANT(0.282094791773000010) * t; + y[6] += CONSTANT(-0.126156626101000010) * t; + y[8] += CONSTANT(0.218509686119999990) * t; // [3,7]: 2,12,14, - tf = CONSTANT(0.218509686118000010)*f[2] + CONSTANT(-0.143048168103000000)*f[12] + CONSTANT(0.184674390923000000)*f[14]; - tg = CONSTANT(0.218509686118000010)*g[2] + CONSTANT(-0.143048168103000000)*g[12] + CONSTANT(0.184674390923000000)*g[14]; - y[3] += tf*g[7] + tg*f[7]; - y[7] += tf*g[3] + tg*f[3]; + tf = CONSTANT(0.218509686118000010) * f[2] + CONSTANT(-0.143048168103000000) * f[12] + CONSTANT(0.184674390923000000) * f[14]; + tg = CONSTANT(0.218509686118000010) * g[2] + CONSTANT(-0.143048168103000000) * g[12] + CONSTANT(0.184674390923000000) * g[14]; + y[3] += tf * g[7] + tg * f[7]; + y[7] += tf * g[3] + tg * f[3]; t = f[3] * g[7] + f[7] * g[3]; - y[2] += CONSTANT(0.218509686118000010)*t; - y[12] += CONSTANT(-0.143048168103000000)*t; - y[14] += CONSTANT(0.184674390923000000)*t; + y[2] += CONSTANT(0.218509686118000010) * t; + y[12] += CONSTANT(-0.143048168103000000) * t; + y[14] += CONSTANT(0.184674390923000000) * t; // [3,9]: 4,16,18, - tf = CONSTANT(0.226179013157999990)*f[4] + CONSTANT(0.230329432973999990)*f[16] + CONSTANT(-0.043528171377799997)*f[18]; - tg = CONSTANT(0.226179013157999990)*g[4] + CONSTANT(0.230329432973999990)*g[16] + CONSTANT(-0.043528171377799997)*g[18]; - y[3] += tf*g[9] + tg*f[9]; - y[9] += tf*g[3] + tg*f[3]; + tf = CONSTANT(0.226179013157999990) * f[4] + CONSTANT(0.230329432973999990) * f[16] + CONSTANT(-0.043528171377799997) * f[18]; + tg = CONSTANT(0.226179013157999990) * g[4] + CONSTANT(0.230329432973999990) * g[16] + CONSTANT(-0.043528171377799997) * g[18]; + y[3] += tf * g[9] + tg * f[9]; + y[9] += tf * g[3] + tg * f[3]; t = f[3] * g[9] + f[9] * g[3]; - y[4] += CONSTANT(0.226179013157999990)*t; - y[16] += CONSTANT(0.230329432973999990)*t; - y[18] += CONSTANT(-0.043528171377799997)*t; + y[4] += CONSTANT(0.226179013157999990) * t; + y[16] += CONSTANT(0.230329432973999990) * t; + y[18] += CONSTANT(-0.043528171377799997) * t; // [3,10]: 5,17,19, - tf = CONSTANT(0.184674390919999990)*f[5] + CONSTANT(0.199471140200000010)*f[17] + CONSTANT(-0.075393004386799994)*f[19]; - tg = CONSTANT(0.184674390919999990)*g[5] + CONSTANT(0.199471140200000010)*g[17] + CONSTANT(-0.075393004386799994)*g[19]; - y[3] += tf*g[10] + tg*f[10]; - y[10] += tf*g[3] + tg*f[3]; + tf = CONSTANT(0.184674390919999990) * f[5] + CONSTANT(0.199471140200000010) * f[17] + CONSTANT(-0.075393004386799994) * f[19]; + tg = CONSTANT(0.184674390919999990) * g[5] + CONSTANT(0.199471140200000010) * g[17] + CONSTANT(-0.075393004386799994) * g[19]; + y[3] += tf * g[10] + tg * f[10]; + y[10] += tf * g[3] + tg * f[3]; t = f[3] * g[10] + f[10] * g[3]; - y[5] += CONSTANT(0.184674390919999990)*t; - y[17] += CONSTANT(0.199471140200000010)*t; - y[19] += CONSTANT(-0.075393004386799994)*t; + y[5] += CONSTANT(0.184674390919999990) * t; + y[17] += CONSTANT(0.199471140200000010) * t; + y[19] += CONSTANT(-0.075393004386799994) * t; // [3,12]: 21, - tf = CONSTANT(0.194663900273000010)*f[21]; - tg = CONSTANT(0.194663900273000010)*g[21]; - y[3] += tf*g[12] + tg*f[12]; - y[12] += tf*g[3] + tg*f[3]; + tf = CONSTANT(0.194663900273000010) * f[21]; + tg = CONSTANT(0.194663900273000010) * g[21]; + y[3] += tf * g[12] + tg * f[12]; + y[12] += tf * g[3] + tg * f[3]; t = f[3] * g[12] + f[12] * g[3]; - y[21] += CONSTANT(0.194663900273000010)*t; + y[21] += CONSTANT(0.194663900273000010) * t; // [3,13]: 8,6,20,22, - tf = CONSTANT(-0.058399170081799998)*f[8] + CONSTANT(0.202300659402999990)*f[6] + CONSTANT(-0.150786008773000000)*f[20] + CONSTANT(0.168583882836999990)*f[22]; - tg = CONSTANT(-0.058399170081799998)*g[8] + CONSTANT(0.202300659402999990)*g[6] + CONSTANT(-0.150786008773000000)*g[20] + CONSTANT(0.168583882836999990)*g[22]; - y[3] += tf*g[13] + tg*f[13]; - y[13] += tf*g[3] + tg*f[3]; + tf = CONSTANT(-0.058399170081799998) * f[8] + CONSTANT(0.202300659402999990) * f[6] + CONSTANT(-0.150786008773000000) * f[20] + + CONSTANT(0.168583882836999990) * f[22]; + tg = CONSTANT(-0.058399170081799998) * g[8] + CONSTANT(0.202300659402999990) * g[6] + CONSTANT(-0.150786008773000000) * g[20] + + CONSTANT(0.168583882836999990) * g[22]; + y[3] += tf * g[13] + tg * f[13]; + y[13] += tf * g[3] + tg * f[3]; t = f[3] * g[13] + f[13] * g[3]; - y[8] += CONSTANT(-0.058399170081799998)*t; - y[6] += CONSTANT(0.202300659402999990)*t; - y[20] += CONSTANT(-0.150786008773000000)*t; - y[22] += CONSTANT(0.168583882836999990)*t; + y[8] += CONSTANT(-0.058399170081799998) * t; + y[6] += CONSTANT(0.202300659402999990) * t; + y[20] += CONSTANT(-0.150786008773000000) * t; + y[22] += CONSTANT(0.168583882836999990) * t; // [3,14]: 21,23, - tf = CONSTANT(-0.075393004386399995)*f[21] + CONSTANT(0.199471140196999990)*f[23]; - tg = CONSTANT(-0.075393004386399995)*g[21] + CONSTANT(0.199471140196999990)*g[23]; - y[3] += tf*g[14] + tg*f[14]; - y[14] += tf*g[3] + tg*f[3]; + tf = CONSTANT(-0.075393004386399995) * f[21] + CONSTANT(0.199471140196999990) * f[23]; + tg = CONSTANT(-0.075393004386399995) * g[21] + CONSTANT(0.199471140196999990) * g[23]; + y[3] += tf * g[14] + tg * f[14]; + y[14] += tf * g[3] + tg * f[3]; t = f[3] * g[14] + f[14] * g[3]; - y[21] += CONSTANT(-0.075393004386399995)*t; - y[23] += CONSTANT(0.199471140196999990)*t; + y[21] += CONSTANT(-0.075393004386399995) * t; + y[23] += CONSTANT(0.199471140196999990) * t; // [3,15]: 8,22,24, - tf = CONSTANT(0.226179013155000000)*f[8] + CONSTANT(-0.043528171378199997)*f[22] + CONSTANT(0.230329432978999990)*f[24]; - tg = CONSTANT(0.226179013155000000)*g[8] + CONSTANT(-0.043528171378199997)*g[22] + CONSTANT(0.230329432978999990)*g[24]; - y[3] += tf*g[15] + tg*f[15]; - y[15] += tf*g[3] + tg*f[3]; + tf = CONSTANT(0.226179013155000000) * f[8] + CONSTANT(-0.043528171378199997) * f[22] + CONSTANT(0.230329432978999990) * f[24]; + tg = CONSTANT(0.226179013155000000) * g[8] + CONSTANT(-0.043528171378199997) * g[22] + CONSTANT(0.230329432978999990) * g[24]; + y[3] += tf * g[15] + tg * f[15]; + y[15] += tf * g[3] + tg * f[3]; t = f[3] * g[15] + f[15] * g[3]; - y[8] += CONSTANT(0.226179013155000000)*t; - y[22] += CONSTANT(-0.043528171378199997)*t; - y[24] += CONSTANT(0.230329432978999990)*t; + y[8] += CONSTANT(0.226179013155000000) * t; + y[22] += CONSTANT(-0.043528171378199997) * t; + y[24] += CONSTANT(0.230329432978999990) * t; // [4,4]: 0,6,20,24, - tf = CONSTANT(0.282094791770000020)*f[0] + CONSTANT(-0.180223751576000010)*f[6] + CONSTANT(0.040299255967500003)*f[20] + CONSTANT(-0.238413613505999990)*f[24]; - tg = CONSTANT(0.282094791770000020)*g[0] + CONSTANT(-0.180223751576000010)*g[6] + CONSTANT(0.040299255967500003)*g[20] + CONSTANT(-0.238413613505999990)*g[24]; - y[4] += tf*g[4] + tg*f[4]; + tf = CONSTANT(0.282094791770000020) * f[0] + CONSTANT(-0.180223751576000010) * f[6] + CONSTANT(0.040299255967500003) * f[20] + + CONSTANT(-0.238413613505999990) * f[24]; + tg = CONSTANT(0.282094791770000020) * g[0] + CONSTANT(-0.180223751576000010) * g[6] + CONSTANT(0.040299255967500003) * g[20] + + CONSTANT(-0.238413613505999990) * g[24]; + y[4] += tf * g[4] + tg * f[4]; t = f[4] * g[4]; - y[0] += CONSTANT(0.282094791770000020)*t; - y[6] += CONSTANT(-0.180223751576000010)*t; - y[20] += CONSTANT(0.040299255967500003)*t; - y[24] += CONSTANT(-0.238413613505999990)*t; + y[0] += CONSTANT(0.282094791770000020) * t; + y[6] += CONSTANT(-0.180223751576000010) * t; + y[20] += CONSTANT(0.040299255967500003) * t; + y[24] += CONSTANT(-0.238413613505999990) * t; // [4,5]: 7,21,23, - tf = CONSTANT(0.156078347226000000)*f[7] + CONSTANT(-0.063718718434399996)*f[21] + CONSTANT(-0.168583882835000000)*f[23]; - tg = CONSTANT(0.156078347226000000)*g[7] + CONSTANT(-0.063718718434399996)*g[21] + CONSTANT(-0.168583882835000000)*g[23]; - y[4] += tf*g[5] + tg*f[5]; - y[5] += tf*g[4] + tg*f[4]; + tf = CONSTANT(0.156078347226000000) * f[7] + CONSTANT(-0.063718718434399996) * f[21] + CONSTANT(-0.168583882835000000) * f[23]; + tg = CONSTANT(0.156078347226000000) * g[7] + CONSTANT(-0.063718718434399996) * g[21] + CONSTANT(-0.168583882835000000) * g[23]; + y[4] += tf * g[5] + tg * f[5]; + y[5] += tf * g[4] + tg * f[4]; t = f[4] * g[5] + f[5] * g[4]; - y[7] += CONSTANT(0.156078347226000000)*t; - y[21] += CONSTANT(-0.063718718434399996)*t; - y[23] += CONSTANT(-0.168583882835000000)*t; + y[7] += CONSTANT(0.156078347226000000) * t; + y[21] += CONSTANT(-0.063718718434399996) * t; + y[23] += CONSTANT(-0.168583882835000000) * t; // [4,11]: 3,13,15, - tf = CONSTANT(-0.058399170082300000)*f[3] + CONSTANT(0.145673124078000010)*f[13] + CONSTANT(0.094031597258400004)*f[15]; - tg = CONSTANT(-0.058399170082300000)*g[3] + CONSTANT(0.145673124078000010)*g[13] + CONSTANT(0.094031597258400004)*g[15]; - y[4] += tf*g[11] + tg*f[11]; - y[11] += tf*g[4] + tg*f[4]; + tf = CONSTANT(-0.058399170082300000) * f[3] + CONSTANT(0.145673124078000010) * f[13] + CONSTANT(0.094031597258400004) * f[15]; + tg = CONSTANT(-0.058399170082300000) * g[3] + CONSTANT(0.145673124078000010) * g[13] + CONSTANT(0.094031597258400004) * g[15]; + y[4] += tf * g[11] + tg * f[11]; + y[11] += tf * g[4] + tg * f[4]; t = f[4] * g[11] + f[11] * g[4]; - y[3] += CONSTANT(-0.058399170082300000)*t; - y[13] += CONSTANT(0.145673124078000010)*t; - y[15] += CONSTANT(0.094031597258400004)*t; + y[3] += CONSTANT(-0.058399170082300000) * t; + y[13] += CONSTANT(0.145673124078000010) * t; + y[15] += CONSTANT(0.094031597258400004) * t; // [4,16]: 8,22, - tf = CONSTANT(0.238413613494000000)*f[8] + CONSTANT(-0.075080816693699995)*f[22]; - tg = CONSTANT(0.238413613494000000)*g[8] + CONSTANT(-0.075080816693699995)*g[22]; - y[4] += tf*g[16] + tg*f[16]; - y[16] += tf*g[4] + tg*f[4]; + tf = CONSTANT(0.238413613494000000) * f[8] + CONSTANT(-0.075080816693699995) * f[22]; + tg = CONSTANT(0.238413613494000000) * g[8] + CONSTANT(-0.075080816693699995) * g[22]; + y[4] += tf * g[16] + tg * f[16]; + y[16] += tf * g[4] + tg * f[4]; t = f[4] * g[16] + f[16] * g[4]; - y[8] += CONSTANT(0.238413613494000000)*t; - y[22] += CONSTANT(-0.075080816693699995)*t; + y[8] += CONSTANT(0.238413613494000000) * t; + y[22] += CONSTANT(-0.075080816693699995) * t; // [4,18]: 6,20,24, - tf = CONSTANT(0.156078347226000000)*f[6] + CONSTANT(-0.190364615029000010)*f[20] + CONSTANT(0.075080816691500005)*f[24]; - tg = CONSTANT(0.156078347226000000)*g[6] + CONSTANT(-0.190364615029000010)*g[20] + CONSTANT(0.075080816691500005)*g[24]; - y[4] += tf*g[18] + tg*f[18]; - y[18] += tf*g[4] + tg*f[4]; + tf = CONSTANT(0.156078347226000000) * f[6] + CONSTANT(-0.190364615029000010) * f[20] + CONSTANT(0.075080816691500005) * f[24]; + tg = CONSTANT(0.156078347226000000) * g[6] + CONSTANT(-0.190364615029000010) * g[20] + CONSTANT(0.075080816691500005) * g[24]; + y[4] += tf * g[18] + tg * f[18]; + y[18] += tf * g[4] + tg * f[4]; t = f[4] * g[18] + f[18] * g[4]; - y[6] += CONSTANT(0.156078347226000000)*t; - y[20] += CONSTANT(-0.190364615029000010)*t; - y[24] += CONSTANT(0.075080816691500005)*t; + y[6] += CONSTANT(0.156078347226000000) * t; + y[20] += CONSTANT(-0.190364615029000010) * t; + y[24] += CONSTANT(0.075080816691500005) * t; // [4,19]: 7,21,23, - tf = CONSTANT(-0.063718718434399996)*f[7] + CONSTANT(0.141889406569999990)*f[21] + CONSTANT(0.112621225039000000)*f[23]; - tg = CONSTANT(-0.063718718434399996)*g[7] + CONSTANT(0.141889406569999990)*g[21] + CONSTANT(0.112621225039000000)*g[23]; - y[4] += tf*g[19] + tg*f[19]; - y[19] += tf*g[4] + tg*f[4]; + tf = CONSTANT(-0.063718718434399996) * f[7] + CONSTANT(0.141889406569999990) * f[21] + CONSTANT(0.112621225039000000) * f[23]; + tg = CONSTANT(-0.063718718434399996) * g[7] + CONSTANT(0.141889406569999990) * g[21] + CONSTANT(0.112621225039000000) * g[23]; + y[4] += tf * g[19] + tg * f[19]; + y[19] += tf * g[4] + tg * f[4]; t = f[4] * g[19] + f[19] * g[4]; - y[7] += CONSTANT(-0.063718718434399996)*t; - y[21] += CONSTANT(0.141889406569999990)*t; - y[23] += CONSTANT(0.112621225039000000)*t; + y[7] += CONSTANT(-0.063718718434399996) * t; + y[21] += CONSTANT(0.141889406569999990) * t; + y[23] += CONSTANT(0.112621225039000000) * t; // [5,5]: 0,6,8,20,22, - tf = CONSTANT(0.282094791773999990)*f[0] + CONSTANT(0.090111875786499998)*f[6] + CONSTANT(-0.156078347227999990)*f[8] + CONSTANT(-0.161197023870999990)*f[20] + CONSTANT(-0.180223751574000000)*f[22]; - tg = CONSTANT(0.282094791773999990)*g[0] + CONSTANT(0.090111875786499998)*g[6] + CONSTANT(-0.156078347227999990)*g[8] + CONSTANT(-0.161197023870999990)*g[20] + CONSTANT(-0.180223751574000000)*g[22]; - y[5] += tf*g[5] + tg*f[5]; + tf = CONSTANT(0.282094791773999990) * f[0] + CONSTANT(0.090111875786499998) * f[6] + CONSTANT(-0.156078347227999990) * f[8] + + CONSTANT(-0.161197023870999990) * f[20] + CONSTANT(-0.180223751574000000) * f[22]; + tg = CONSTANT(0.282094791773999990) * g[0] + CONSTANT(0.090111875786499998) * g[6] + CONSTANT(-0.156078347227999990) * g[8] + + CONSTANT(-0.161197023870999990) * g[20] + CONSTANT(-0.180223751574000000) * g[22]; + y[5] += tf * g[5] + tg * f[5]; t = f[5] * g[5]; - y[0] += CONSTANT(0.282094791773999990)*t; - y[6] += CONSTANT(0.090111875786499998)*t; - y[8] += CONSTANT(-0.156078347227999990)*t; - y[20] += CONSTANT(-0.161197023870999990)*t; - y[22] += CONSTANT(-0.180223751574000000)*t; + y[0] += CONSTANT(0.282094791773999990) * t; + y[6] += CONSTANT(0.090111875786499998) * t; + y[8] += CONSTANT(-0.156078347227999990) * t; + y[20] += CONSTANT(-0.161197023870999990) * t; + y[22] += CONSTANT(-0.180223751574000000) * t; // [5,11]: 2,12,14, - tf = CONSTANT(0.233596680327000010)*f[2] + CONSTANT(0.059470803871800003)*f[12] + CONSTANT(-0.115164716491000000)*f[14]; - tg = CONSTANT(0.233596680327000010)*g[2] + CONSTANT(0.059470803871800003)*g[12] + CONSTANT(-0.115164716491000000)*g[14]; - y[5] += tf*g[11] + tg*f[11]; - y[11] += tf*g[5] + tg*f[5]; + tf = CONSTANT(0.233596680327000010) * f[2] + CONSTANT(0.059470803871800003) * f[12] + CONSTANT(-0.115164716491000000) * f[14]; + tg = CONSTANT(0.233596680327000010) * g[2] + CONSTANT(0.059470803871800003) * g[12] + CONSTANT(-0.115164716491000000) * g[14]; + y[5] += tf * g[11] + tg * f[11]; + y[11] += tf * g[5] + tg * f[5]; t = f[5] * g[11] + f[11] * g[5]; - y[2] += CONSTANT(0.233596680327000010)*t; - y[12] += CONSTANT(0.059470803871800003)*t; - y[14] += CONSTANT(-0.115164716491000000)*t; + y[2] += CONSTANT(0.233596680327000010) * t; + y[12] += CONSTANT(0.059470803871800003) * t; + y[14] += CONSTANT(-0.115164716491000000) * t; // [5,17]: 8,22,24, - tf = CONSTANT(0.168583882832999990)*f[8] + CONSTANT(0.132725386548000010)*f[22] + CONSTANT(-0.140463346189000000)*f[24]; - tg = CONSTANT(0.168583882832999990)*g[8] + CONSTANT(0.132725386548000010)*g[22] + CONSTANT(-0.140463346189000000)*g[24]; - y[5] += tf*g[17] + tg*f[17]; - y[17] += tf*g[5] + tg*f[5]; + tf = CONSTANT(0.168583882832999990) * f[8] + CONSTANT(0.132725386548000010) * f[22] + CONSTANT(-0.140463346189000000) * f[24]; + tg = CONSTANT(0.168583882832999990) * g[8] + CONSTANT(0.132725386548000010) * g[22] + CONSTANT(-0.140463346189000000) * g[24]; + y[5] += tf * g[17] + tg * f[17]; + y[17] += tf * g[5] + tg * f[5]; t = f[5] * g[17] + f[17] * g[5]; - y[8] += CONSTANT(0.168583882832999990)*t; - y[22] += CONSTANT(0.132725386548000010)*t; - y[24] += CONSTANT(-0.140463346189000000)*t; + y[8] += CONSTANT(0.168583882832999990) * t; + y[22] += CONSTANT(0.132725386548000010) * t; + y[24] += CONSTANT(-0.140463346189000000) * t; // [5,18]: 7,21,23, - tf = CONSTANT(0.180223751571000010)*f[7] + CONSTANT(0.090297865407399994)*f[21] + CONSTANT(-0.132725386549000010)*f[23]; - tg = CONSTANT(0.180223751571000010)*g[7] + CONSTANT(0.090297865407399994)*g[21] + CONSTANT(-0.132725386549000010)*g[23]; - y[5] += tf*g[18] + tg*f[18]; - y[18] += tf*g[5] + tg*f[5]; + tf = CONSTANT(0.180223751571000010) * f[7] + CONSTANT(0.090297865407399994) * f[21] + CONSTANT(-0.132725386549000010) * f[23]; + tg = CONSTANT(0.180223751571000010) * g[7] + CONSTANT(0.090297865407399994) * g[21] + CONSTANT(-0.132725386549000010) * g[23]; + y[5] += tf * g[18] + tg * f[18]; + y[18] += tf * g[5] + tg * f[5]; t = f[5] * g[18] + f[18] * g[5]; - y[7] += CONSTANT(0.180223751571000010)*t; - y[21] += CONSTANT(0.090297865407399994)*t; - y[23] += CONSTANT(-0.132725386549000010)*t; + y[7] += CONSTANT(0.180223751571000010) * t; + y[21] += CONSTANT(0.090297865407399994) * t; + y[23] += CONSTANT(-0.132725386549000010) * t; // [5,19]: 6,8,20,22, - tf = CONSTANT(0.220728115440999990)*f[6] + CONSTANT(0.063718718433900007)*f[8] + CONSTANT(0.044869370061299998)*f[20] + CONSTANT(-0.090297865408399999)*f[22]; - tg = CONSTANT(0.220728115440999990)*g[6] + CONSTANT(0.063718718433900007)*g[8] + CONSTANT(0.044869370061299998)*g[20] + CONSTANT(-0.090297865408399999)*g[22]; - y[5] += tf*g[19] + tg*f[19]; - y[19] += tf*g[5] + tg*f[5]; + tf = CONSTANT(0.220728115440999990) * f[6] + CONSTANT(0.063718718433900007) * f[8] + CONSTANT(0.044869370061299998) * f[20] + + CONSTANT(-0.090297865408399999) * f[22]; + tg = CONSTANT(0.220728115440999990) * g[6] + CONSTANT(0.063718718433900007) * g[8] + CONSTANT(0.044869370061299998) * g[20] + + CONSTANT(-0.090297865408399999) * g[22]; + y[5] += tf * g[19] + tg * f[19]; + y[19] += tf * g[5] + tg * f[5]; t = f[5] * g[19] + f[19] * g[5]; - y[6] += CONSTANT(0.220728115440999990)*t; - y[8] += CONSTANT(0.063718718433900007)*t; - y[20] += CONSTANT(0.044869370061299998)*t; - y[22] += CONSTANT(-0.090297865408399999)*t; + y[6] += CONSTANT(0.220728115440999990) * t; + y[8] += CONSTANT(0.063718718433900007) * t; + y[20] += CONSTANT(0.044869370061299998) * t; + y[22] += CONSTANT(-0.090297865408399999) * t; // [6,6]: 0,6,20, - tf = CONSTANT(0.282094797560000000)*f[0] + CONSTANT(0.241795553185999990)*f[20]; - tg = CONSTANT(0.282094797560000000)*g[0] + CONSTANT(0.241795553185999990)*g[20]; - y[6] += tf*g[6] + tg*f[6]; + tf = CONSTANT(0.282094797560000000) * f[0] + CONSTANT(0.241795553185999990) * f[20]; + tg = CONSTANT(0.282094797560000000) * g[0] + CONSTANT(0.241795553185999990) * g[20]; + y[6] += tf * g[6] + tg * f[6]; t = f[6] * g[6]; - y[0] += CONSTANT(0.282094797560000000)*t; - y[6] += CONSTANT(0.180223764527000010)*t; - y[20] += CONSTANT(0.241795553185999990)*t; + y[0] += CONSTANT(0.282094797560000000) * t; + y[6] += CONSTANT(0.180223764527000010) * t; + y[20] += CONSTANT(0.241795553185999990) * t; // [7,7]: 6,0,8,20,22, - tf = CONSTANT(0.090111875786499998)*f[6] + CONSTANT(0.282094791773999990)*f[0] + CONSTANT(0.156078347227999990)*f[8] + CONSTANT(-0.161197023870999990)*f[20] + CONSTANT(0.180223751574000000)*f[22]; - tg = CONSTANT(0.090111875786499998)*g[6] + CONSTANT(0.282094791773999990)*g[0] + CONSTANT(0.156078347227999990)*g[8] + CONSTANT(-0.161197023870999990)*g[20] + CONSTANT(0.180223751574000000)*g[22]; - y[7] += tf*g[7] + tg*f[7]; + tf = CONSTANT(0.090111875786499998) * f[6] + CONSTANT(0.282094791773999990) * f[0] + CONSTANT(0.156078347227999990) * f[8] + + CONSTANT(-0.161197023870999990) * f[20] + CONSTANT(0.180223751574000000) * f[22]; + tg = CONSTANT(0.090111875786499998) * g[6] + CONSTANT(0.282094791773999990) * g[0] + CONSTANT(0.156078347227999990) * g[8] + + CONSTANT(-0.161197023870999990) * g[20] + CONSTANT(0.180223751574000000) * g[22]; + y[7] += tf * g[7] + tg * f[7]; t = f[7] * g[7]; - y[6] += CONSTANT(0.090111875786499998)*t; - y[0] += CONSTANT(0.282094791773999990)*t; - y[8] += CONSTANT(0.156078347227999990)*t; - y[20] += CONSTANT(-0.161197023870999990)*t; - y[22] += CONSTANT(0.180223751574000000)*t; + y[6] += CONSTANT(0.090111875786499998) * t; + y[0] += CONSTANT(0.282094791773999990) * t; + y[8] += CONSTANT(0.156078347227999990) * t; + y[20] += CONSTANT(-0.161197023870999990) * t; + y[22] += CONSTANT(0.180223751574000000) * t; // [7,13]: 12,2,14, - tf = CONSTANT(0.059470803871800003)*f[12] + CONSTANT(0.233596680327000010)*f[2] + CONSTANT(0.115164716491000000)*f[14]; - tg = CONSTANT(0.059470803871800003)*g[12] + CONSTANT(0.233596680327000010)*g[2] + CONSTANT(0.115164716491000000)*g[14]; - y[7] += tf*g[13] + tg*f[13]; - y[13] += tf*g[7] + tg*f[7]; + tf = CONSTANT(0.059470803871800003) * f[12] + CONSTANT(0.233596680327000010) * f[2] + CONSTANT(0.115164716491000000) * f[14]; + tg = CONSTANT(0.059470803871800003) * g[12] + CONSTANT(0.233596680327000010) * g[2] + CONSTANT(0.115164716491000000) * g[14]; + y[7] += tf * g[13] + tg * f[13]; + y[13] += tf * g[7] + tg * f[7]; t = f[7] * g[13] + f[13] * g[7]; - y[12] += CONSTANT(0.059470803871800003)*t; - y[2] += CONSTANT(0.233596680327000010)*t; - y[14] += CONSTANT(0.115164716491000000)*t; + y[12] += CONSTANT(0.059470803871800003) * t; + y[2] += CONSTANT(0.233596680327000010) * t; + y[14] += CONSTANT(0.115164716491000000) * t; // [7,17]: 16,4,18, - tf = CONSTANT(0.140463346187999990)*f[16] + CONSTANT(0.168583882835000000)*f[4] + CONSTANT(0.132725386549000010)*f[18]; - tg = CONSTANT(0.140463346187999990)*g[16] + CONSTANT(0.168583882835000000)*g[4] + CONSTANT(0.132725386549000010)*g[18]; - y[7] += tf*g[17] + tg*f[17]; - y[17] += tf*g[7] + tg*f[7]; + tf = CONSTANT(0.140463346187999990) * f[16] + CONSTANT(0.168583882835000000) * f[4] + CONSTANT(0.132725386549000010) * f[18]; + tg = CONSTANT(0.140463346187999990) * g[16] + CONSTANT(0.168583882835000000) * g[4] + CONSTANT(0.132725386549000010) * g[18]; + y[7] += tf * g[17] + tg * f[17]; + y[17] += tf * g[7] + tg * f[7]; t = f[7] * g[17] + f[17] * g[7]; - y[16] += CONSTANT(0.140463346187999990)*t; - y[4] += CONSTANT(0.168583882835000000)*t; - y[18] += CONSTANT(0.132725386549000010)*t; + y[16] += CONSTANT(0.140463346187999990) * t; + y[4] += CONSTANT(0.168583882835000000) * t; + y[18] += CONSTANT(0.132725386549000010) * t; // [7,21]: 8,20,6,22, - tf = CONSTANT(-0.063718718433900007)*f[8] + CONSTANT(0.044869370061299998)*f[20] + CONSTANT(0.220728115440999990)*f[6] + CONSTANT(0.090297865408399999)*f[22]; - tg = CONSTANT(-0.063718718433900007)*g[8] + CONSTANT(0.044869370061299998)*g[20] + CONSTANT(0.220728115440999990)*g[6] + CONSTANT(0.090297865408399999)*g[22]; - y[7] += tf*g[21] + tg*f[21]; - y[21] += tf*g[7] + tg*f[7]; + tf = CONSTANT(-0.063718718433900007) * f[8] + CONSTANT(0.044869370061299998) * f[20] + CONSTANT(0.220728115440999990) * f[6] + + CONSTANT(0.090297865408399999) * f[22]; + tg = CONSTANT(-0.063718718433900007) * g[8] + CONSTANT(0.044869370061299998) * g[20] + CONSTANT(0.220728115440999990) * g[6] + + CONSTANT(0.090297865408399999) * g[22]; + y[7] += tf * g[21] + tg * f[21]; + y[21] += tf * g[7] + tg * f[7]; t = f[7] * g[21] + f[21] * g[7]; - y[8] += CONSTANT(-0.063718718433900007)*t; - y[20] += CONSTANT(0.044869370061299998)*t; - y[6] += CONSTANT(0.220728115440999990)*t; - y[22] += CONSTANT(0.090297865408399999)*t; + y[8] += CONSTANT(-0.063718718433900007) * t; + y[20] += CONSTANT(0.044869370061299998) * t; + y[6] += CONSTANT(0.220728115440999990) * t; + y[22] += CONSTANT(0.090297865408399999) * t; // [7,23]: 8,22,24, - tf = CONSTANT(0.168583882832999990)*f[8] + CONSTANT(0.132725386548000010)*f[22] + CONSTANT(0.140463346189000000)*f[24]; - tg = CONSTANT(0.168583882832999990)*g[8] + CONSTANT(0.132725386548000010)*g[22] + CONSTANT(0.140463346189000000)*g[24]; - y[7] += tf*g[23] + tg*f[23]; - y[23] += tf*g[7] + tg*f[7]; + tf = CONSTANT(0.168583882832999990) * f[8] + CONSTANT(0.132725386548000010) * f[22] + CONSTANT(0.140463346189000000) * f[24]; + tg = CONSTANT(0.168583882832999990) * g[8] + CONSTANT(0.132725386548000010) * g[22] + CONSTANT(0.140463346189000000) * g[24]; + y[7] += tf * g[23] + tg * f[23]; + y[23] += tf * g[7] + tg * f[7]; t = f[7] * g[23] + f[23] * g[7]; - y[8] += CONSTANT(0.168583882832999990)*t; - y[22] += CONSTANT(0.132725386548000010)*t; - y[24] += CONSTANT(0.140463346189000000)*t; + y[8] += CONSTANT(0.168583882832999990) * t; + y[22] += CONSTANT(0.132725386548000010) * t; + y[24] += CONSTANT(0.140463346189000000) * t; // [8,8]: 0,6,20,24, - tf = CONSTANT(0.282094791770000020)*f[0] + CONSTANT(-0.180223751576000010)*f[6] + CONSTANT(0.040299255967500003)*f[20] + CONSTANT(0.238413613505999990)*f[24]; - tg = CONSTANT(0.282094791770000020)*g[0] + CONSTANT(-0.180223751576000010)*g[6] + CONSTANT(0.040299255967500003)*g[20] + CONSTANT(0.238413613505999990)*g[24]; - y[8] += tf*g[8] + tg*f[8]; + tf = CONSTANT(0.282094791770000020) * f[0] + CONSTANT(-0.180223751576000010) * f[6] + CONSTANT(0.040299255967500003) * f[20] + + CONSTANT(0.238413613505999990) * f[24]; + tg = CONSTANT(0.282094791770000020) * g[0] + CONSTANT(-0.180223751576000010) * g[6] + CONSTANT(0.040299255967500003) * g[20] + + CONSTANT(0.238413613505999990) * g[24]; + y[8] += tf * g[8] + tg * f[8]; t = f[8] * g[8]; - y[0] += CONSTANT(0.282094791770000020)*t; - y[6] += CONSTANT(-0.180223751576000010)*t; - y[20] += CONSTANT(0.040299255967500003)*t; - y[24] += CONSTANT(0.238413613505999990)*t; + y[0] += CONSTANT(0.282094791770000020) * t; + y[6] += CONSTANT(-0.180223751576000010) * t; + y[20] += CONSTANT(0.040299255967500003) * t; + y[24] += CONSTANT(0.238413613505999990) * t; // [8,22]: 6,20,24, - tf = CONSTANT(0.156078347226000000)*f[6] + CONSTANT(-0.190364615029000010)*f[20] + CONSTANT(-0.075080816691500005)*f[24]; - tg = CONSTANT(0.156078347226000000)*g[6] + CONSTANT(-0.190364615029000010)*g[20] + CONSTANT(-0.075080816691500005)*g[24]; - y[8] += tf*g[22] + tg*f[22]; - y[22] += tf*g[8] + tg*f[8]; + tf = CONSTANT(0.156078347226000000) * f[6] + CONSTANT(-0.190364615029000010) * f[20] + CONSTANT(-0.075080816691500005) * f[24]; + tg = CONSTANT(0.156078347226000000) * g[6] + CONSTANT(-0.190364615029000010) * g[20] + CONSTANT(-0.075080816691500005) * g[24]; + y[8] += tf * g[22] + tg * f[22]; + y[22] += tf * g[8] + tg * f[8]; t = f[8] * g[22] + f[22] * g[8]; - y[6] += CONSTANT(0.156078347226000000)*t; - y[20] += CONSTANT(-0.190364615029000010)*t; - y[24] += CONSTANT(-0.075080816691500005)*t; + y[6] += CONSTANT(0.156078347226000000) * t; + y[20] += CONSTANT(-0.190364615029000010) * t; + y[24] += CONSTANT(-0.075080816691500005) * t; // [9,9]: 6,0,20, - tf = CONSTANT(-0.210261043508000010)*f[6] + CONSTANT(0.282094791766999970)*f[0] + CONSTANT(0.076934943209800002)*f[20]; - tg = CONSTANT(-0.210261043508000010)*g[6] + CONSTANT(0.282094791766999970)*g[0] + CONSTANT(0.076934943209800002)*g[20]; - y[9] += tf*g[9] + tg*f[9]; + tf = CONSTANT(-0.210261043508000010) * f[6] + CONSTANT(0.282094791766999970) * f[0] + CONSTANT(0.076934943209800002) * f[20]; + tg = CONSTANT(-0.210261043508000010) * g[6] + CONSTANT(0.282094791766999970) * g[0] + CONSTANT(0.076934943209800002) * g[20]; + y[9] += tf * g[9] + tg * f[9]; t = f[9] * g[9]; - y[6] += CONSTANT(-0.210261043508000010)*t; - y[0] += CONSTANT(0.282094791766999970)*t; - y[20] += CONSTANT(0.076934943209800002)*t; + y[6] += CONSTANT(-0.210261043508000010) * t; + y[0] += CONSTANT(0.282094791766999970) * t; + y[20] += CONSTANT(0.076934943209800002) * t; // [9,10]: 7,21, - tf = CONSTANT(0.148677009678999990)*f[7] + CONSTANT(-0.099322584599600000)*f[21]; - tg = CONSTANT(0.148677009678999990)*g[7] + CONSTANT(-0.099322584599600000)*g[21]; - y[9] += tf*g[10] + tg*f[10]; - y[10] += tf*g[9] + tg*f[9]; + tf = CONSTANT(0.148677009678999990) * f[7] + CONSTANT(-0.099322584599600000) * f[21]; + tg = CONSTANT(0.148677009678999990) * g[7] + CONSTANT(-0.099322584599600000) * g[21]; + y[9] += tf * g[10] + tg * f[10]; + y[10] += tf * g[9] + tg * f[9]; t = f[9] * g[10] + f[10] * g[9]; - y[7] += CONSTANT(0.148677009678999990)*t; - y[21] += CONSTANT(-0.099322584599600000)*t; + y[7] += CONSTANT(0.148677009678999990) * t; + y[21] += CONSTANT(-0.099322584599600000) * t; // [9,11]: 8,22,24, - tf = CONSTANT(-0.094031597259499999)*f[8] + CONSTANT(0.133255230518000010)*f[22] + CONSTANT(0.117520066950999990)*f[24]; - tg = CONSTANT(-0.094031597259499999)*g[8] + CONSTANT(0.133255230518000010)*g[22] + CONSTANT(0.117520066950999990)*g[24]; - y[9] += tf*g[11] + tg*f[11]; - y[11] += tf*g[9] + tg*f[9]; + tf = CONSTANT(-0.094031597259499999) * f[8] + CONSTANT(0.133255230518000010) * f[22] + CONSTANT(0.117520066950999990) * f[24]; + tg = CONSTANT(-0.094031597259499999) * g[8] + CONSTANT(0.133255230518000010) * g[22] + CONSTANT(0.117520066950999990) * g[24]; + y[9] += tf * g[11] + tg * f[11]; + y[11] += tf * g[9] + tg * f[9]; t = f[9] * g[11] + f[11] * g[9]; - y[8] += CONSTANT(-0.094031597259499999)*t; - y[22] += CONSTANT(0.133255230518000010)*t; - y[24] += CONSTANT(0.117520066950999990)*t; + y[8] += CONSTANT(-0.094031597259499999) * t; + y[22] += CONSTANT(0.133255230518000010) * t; + y[24] += CONSTANT(0.117520066950999990) * t; // [9,13]: 4,16,18, - tf = CONSTANT(-0.094031597258400004)*f[4] + CONSTANT(-0.117520066953000000)*f[16] + CONSTANT(0.133255230519000010)*f[18]; - tg = CONSTANT(-0.094031597258400004)*g[4] + CONSTANT(-0.117520066953000000)*g[16] + CONSTANT(0.133255230519000010)*g[18]; - y[9] += tf*g[13] + tg*f[13]; - y[13] += tf*g[9] + tg*f[9]; + tf = CONSTANT(-0.094031597258400004) * f[4] + CONSTANT(-0.117520066953000000) * f[16] + CONSTANT(0.133255230519000010) * f[18]; + tg = CONSTANT(-0.094031597258400004) * g[4] + CONSTANT(-0.117520066953000000) * g[16] + CONSTANT(0.133255230519000010) * g[18]; + y[9] += tf * g[13] + tg * f[13]; + y[13] += tf * g[9] + tg * f[9]; t = f[9] * g[13] + f[13] * g[9]; - y[4] += CONSTANT(-0.094031597258400004)*t; - y[16] += CONSTANT(-0.117520066953000000)*t; - y[18] += CONSTANT(0.133255230519000010)*t; + y[4] += CONSTANT(-0.094031597258400004) * t; + y[16] += CONSTANT(-0.117520066953000000) * t; + y[18] += CONSTANT(0.133255230519000010) * t; // [9,14]: 5,19, - tf = CONSTANT(0.148677009677999990)*f[5] + CONSTANT(-0.099322584600699995)*f[19]; - tg = CONSTANT(0.148677009677999990)*g[5] + CONSTANT(-0.099322584600699995)*g[19]; - y[9] += tf*g[14] + tg*f[14]; - y[14] += tf*g[9] + tg*f[9]; + tf = CONSTANT(0.148677009677999990) * f[5] + CONSTANT(-0.099322584600699995) * f[19]; + tg = CONSTANT(0.148677009677999990) * g[5] + CONSTANT(-0.099322584600699995) * g[19]; + y[9] += tf * g[14] + tg * f[14]; + y[14] += tf * g[9] + tg * f[9]; t = f[9] * g[14] + f[14] * g[9]; - y[5] += CONSTANT(0.148677009677999990)*t; - y[19] += CONSTANT(-0.099322584600699995)*t; + y[5] += CONSTANT(0.148677009677999990) * t; + y[19] += CONSTANT(-0.099322584600699995) * t; // [9,17]: 2,12, - tf = CONSTANT(0.162867503964999990)*f[2] + CONSTANT(-0.203550726872999990)*f[12]; - tg = CONSTANT(0.162867503964999990)*g[2] + CONSTANT(-0.203550726872999990)*g[12]; - y[9] += tf*g[17] + tg*f[17]; - y[17] += tf*g[9] + tg*f[9]; + tf = CONSTANT(0.162867503964999990) * f[2] + CONSTANT(-0.203550726872999990) * f[12]; + tg = CONSTANT(0.162867503964999990) * g[2] + CONSTANT(-0.203550726872999990) * g[12]; + y[9] += tf * g[17] + tg * f[17]; + y[17] += tf * g[9] + tg * f[9]; t = f[9] * g[17] + f[17] * g[9]; - y[2] += CONSTANT(0.162867503964999990)*t; - y[12] += CONSTANT(-0.203550726872999990)*t; + y[2] += CONSTANT(0.162867503964999990) * t; + y[12] += CONSTANT(-0.203550726872999990) * t; // [10,10]: 0,20,24, - tf = CONSTANT(0.282094791771999980)*f[0] + CONSTANT(-0.179514867494000000)*f[20] + CONSTANT(-0.151717754049000010)*f[24]; - tg = CONSTANT(0.282094791771999980)*g[0] + CONSTANT(-0.179514867494000000)*g[20] + CONSTANT(-0.151717754049000010)*g[24]; - y[10] += tf*g[10] + tg*f[10]; + tf = CONSTANT(0.282094791771999980) * f[0] + CONSTANT(-0.179514867494000000) * f[20] + CONSTANT(-0.151717754049000010) * f[24]; + tg = CONSTANT(0.282094791771999980) * g[0] + CONSTANT(-0.179514867494000000) * g[20] + CONSTANT(-0.151717754049000010) * g[24]; + y[10] += tf * g[10] + tg * f[10]; t = f[10] * g[10]; - y[0] += CONSTANT(0.282094791771999980)*t; - y[20] += CONSTANT(-0.179514867494000000)*t; - y[24] += CONSTANT(-0.151717754049000010)*t; + y[0] += CONSTANT(0.282094791771999980) * t; + y[20] += CONSTANT(-0.179514867494000000) * t; + y[24] += CONSTANT(-0.151717754049000010) * t; // [10,11]: 7,21,23, - tf = CONSTANT(0.115164716490000000)*f[7] + CONSTANT(0.102579924281000000)*f[21] + CONSTANT(-0.067850242288900006)*f[23]; - tg = CONSTANT(0.115164716490000000)*g[7] + CONSTANT(0.102579924281000000)*g[21] + CONSTANT(-0.067850242288900006)*g[23]; - y[10] += tf*g[11] + tg*f[11]; - y[11] += tf*g[10] + tg*f[10]; + tf = CONSTANT(0.115164716490000000) * f[7] + CONSTANT(0.102579924281000000) * f[21] + CONSTANT(-0.067850242288900006) * f[23]; + tg = CONSTANT(0.115164716490000000) * g[7] + CONSTANT(0.102579924281000000) * g[21] + CONSTANT(-0.067850242288900006) * g[23]; + y[10] += tf * g[11] + tg * f[11]; + y[11] += tf * g[10] + tg * f[10]; t = f[10] * g[11] + f[11] * g[10]; - y[7] += CONSTANT(0.115164716490000000)*t; - y[21] += CONSTANT(0.102579924281000000)*t; - y[23] += CONSTANT(-0.067850242288900006)*t; + y[7] += CONSTANT(0.115164716490000000) * t; + y[21] += CONSTANT(0.102579924281000000) * t; + y[23] += CONSTANT(-0.067850242288900006) * t; // [10,12]: 4,18, - tf = CONSTANT(-0.188063194517999990)*f[4] + CONSTANT(-0.044418410173299998)*f[18]; - tg = CONSTANT(-0.188063194517999990)*g[4] + CONSTANT(-0.044418410173299998)*g[18]; - y[10] += tf*g[12] + tg*f[12]; - y[12] += tf*g[10] + tg*f[10]; + tf = CONSTANT(-0.188063194517999990) * f[4] + CONSTANT(-0.044418410173299998) * f[18]; + tg = CONSTANT(-0.188063194517999990) * g[4] + CONSTANT(-0.044418410173299998) * g[18]; + y[10] += tf * g[12] + tg * f[12]; + y[12] += tf * g[10] + tg * f[10]; t = f[10] * g[12] + f[12] * g[10]; - y[4] += CONSTANT(-0.188063194517999990)*t; - y[18] += CONSTANT(-0.044418410173299998)*t; + y[4] += CONSTANT(-0.188063194517999990) * t; + y[18] += CONSTANT(-0.044418410173299998) * t; // [10,13]: 5,17,19, - tf = CONSTANT(0.115164716490000000)*f[5] + CONSTANT(0.067850242288900006)*f[17] + CONSTANT(0.102579924281000000)*f[19]; - tg = CONSTANT(0.115164716490000000)*g[5] + CONSTANT(0.067850242288900006)*g[17] + CONSTANT(0.102579924281000000)*g[19]; - y[10] += tf*g[13] + tg*f[13]; - y[13] += tf*g[10] + tg*f[10]; + tf = CONSTANT(0.115164716490000000) * f[5] + CONSTANT(0.067850242288900006) * f[17] + CONSTANT(0.102579924281000000) * f[19]; + tg = CONSTANT(0.115164716490000000) * g[5] + CONSTANT(0.067850242288900006) * g[17] + CONSTANT(0.102579924281000000) * g[19]; + y[10] += tf * g[13] + tg * f[13]; + y[13] += tf * g[10] + tg * f[10]; t = f[10] * g[13] + f[13] * g[10]; - y[5] += CONSTANT(0.115164716490000000)*t; - y[17] += CONSTANT(0.067850242288900006)*t; - y[19] += CONSTANT(0.102579924281000000)*t; + y[5] += CONSTANT(0.115164716490000000) * t; + y[17] += CONSTANT(0.067850242288900006) * t; + y[19] += CONSTANT(0.102579924281000000) * t; // [10,14]: 16, - tf = CONSTANT(0.151717754044999990)*f[16]; - tg = CONSTANT(0.151717754044999990)*g[16]; - y[10] += tf*g[14] + tg*f[14]; - y[14] += tf*g[10] + tg*f[10]; + tf = CONSTANT(0.151717754044999990) * f[16]; + tg = CONSTANT(0.151717754044999990) * g[16]; + y[10] += tf * g[14] + tg * f[14]; + y[14] += tf * g[10] + tg * f[10]; t = f[10] * g[14] + f[14] * g[10]; - y[16] += CONSTANT(0.151717754044999990)*t; + y[16] += CONSTANT(0.151717754044999990) * t; // [10,15]: 5,19, - tf = CONSTANT(-0.148677009678999990)*f[5] + CONSTANT(0.099322584599600000)*f[19]; - tg = CONSTANT(-0.148677009678999990)*g[5] + CONSTANT(0.099322584599600000)*g[19]; - y[10] += tf*g[15] + tg*f[15]; - y[15] += tf*g[10] + tg*f[10]; + tf = CONSTANT(-0.148677009678999990) * f[5] + CONSTANT(0.099322584599600000) * f[19]; + tg = CONSTANT(-0.148677009678999990) * g[5] + CONSTANT(0.099322584599600000) * g[19]; + y[10] += tf * g[15] + tg * f[15]; + y[15] += tf * g[10] + tg * f[10]; t = f[10] * g[15] + f[15] * g[10]; - y[5] += CONSTANT(-0.148677009678999990)*t; - y[19] += CONSTANT(0.099322584599600000)*t; + y[5] += CONSTANT(-0.148677009678999990) * t; + y[19] += CONSTANT(0.099322584599600000) * t; // [11,11]: 0,6,8,20,22, - tf = CONSTANT(0.282094791773999990)*f[0] + CONSTANT(0.126156626101000010)*f[6] + CONSTANT(-0.145673124078999990)*f[8] + CONSTANT(0.025644981070299999)*f[20] + CONSTANT(-0.114687841910000000)*f[22]; - tg = CONSTANT(0.282094791773999990)*g[0] + CONSTANT(0.126156626101000010)*g[6] + CONSTANT(-0.145673124078999990)*g[8] + CONSTANT(0.025644981070299999)*g[20] + CONSTANT(-0.114687841910000000)*g[22]; - y[11] += tf*g[11] + tg*f[11]; + tf = CONSTANT(0.282094791773999990) * f[0] + CONSTANT(0.126156626101000010) * f[6] + CONSTANT(-0.145673124078999990) * f[8] + + CONSTANT(0.025644981070299999) * f[20] + CONSTANT(-0.114687841910000000) * f[22]; + tg = CONSTANT(0.282094791773999990) * g[0] + CONSTANT(0.126156626101000010) * g[6] + CONSTANT(-0.145673124078999990) * g[8] + + CONSTANT(0.025644981070299999) * g[20] + CONSTANT(-0.114687841910000000) * g[22]; + y[11] += tf * g[11] + tg * f[11]; t = f[11] * g[11]; - y[0] += CONSTANT(0.282094791773999990)*t; - y[6] += CONSTANT(0.126156626101000010)*t; - y[8] += CONSTANT(-0.145673124078999990)*t; - y[20] += CONSTANT(0.025644981070299999)*t; - y[22] += CONSTANT(-0.114687841910000000)*t; + y[0] += CONSTANT(0.282094791773999990) * t; + y[6] += CONSTANT(0.126156626101000010) * t; + y[8] += CONSTANT(-0.145673124078999990) * t; + y[20] += CONSTANT(0.025644981070299999) * t; + y[22] += CONSTANT(-0.114687841910000000) * t; // [11,14]: 17, - tf = CONSTANT(0.067850242288500007)*f[17]; - tg = CONSTANT(0.067850242288500007)*g[17]; - y[11] += tf*g[14] + tg*f[14]; - y[14] += tf*g[11] + tg*f[11]; + tf = CONSTANT(0.067850242288500007) * f[17]; + tg = CONSTANT(0.067850242288500007) * g[17]; + y[11] += tf * g[14] + tg * f[14]; + y[14] += tf * g[11] + tg * f[11]; t = f[11] * g[14] + f[14] * g[11]; - y[17] += CONSTANT(0.067850242288500007)*t; + y[17] += CONSTANT(0.067850242288500007) * t; // [11,15]: 16, - tf = CONSTANT(-0.117520066953000000)*f[16]; - tg = CONSTANT(-0.117520066953000000)*g[16]; - y[11] += tf*g[15] + tg*f[15]; - y[15] += tf*g[11] + tg*f[11]; + tf = CONSTANT(-0.117520066953000000) * f[16]; + tg = CONSTANT(-0.117520066953000000) * g[16]; + y[11] += tf * g[15] + tg * f[15]; + y[15] += tf * g[11] + tg * f[11]; t = f[11] * g[15] + f[15] * g[11]; - y[16] += CONSTANT(-0.117520066953000000)*t; + y[16] += CONSTANT(-0.117520066953000000) * t; // [11,18]: 3,13,15, - tf = CONSTANT(0.168583882834000000)*f[3] + CONSTANT(0.114687841909000000)*f[13] + CONSTANT(-0.133255230519000010)*f[15]; - tg = CONSTANT(0.168583882834000000)*g[3] + CONSTANT(0.114687841909000000)*g[13] + CONSTANT(-0.133255230519000010)*g[15]; - y[11] += tf*g[18] + tg*f[18]; - y[18] += tf*g[11] + tg*f[11]; + tf = CONSTANT(0.168583882834000000) * f[3] + CONSTANT(0.114687841909000000) * f[13] + CONSTANT(-0.133255230519000010) * f[15]; + tg = CONSTANT(0.168583882834000000) * g[3] + CONSTANT(0.114687841909000000) * g[13] + CONSTANT(-0.133255230519000010) * g[15]; + y[11] += tf * g[18] + tg * f[18]; + y[18] += tf * g[11] + tg * f[11]; t = f[11] * g[18] + f[18] * g[11]; - y[3] += CONSTANT(0.168583882834000000)*t; - y[13] += CONSTANT(0.114687841909000000)*t; - y[15] += CONSTANT(-0.133255230519000010)*t; + y[3] += CONSTANT(0.168583882834000000) * t; + y[13] += CONSTANT(0.114687841909000000) * t; + y[15] += CONSTANT(-0.133255230519000010) * t; // [11,19]: 2,14,12, - tf = CONSTANT(0.238413613504000000)*f[2] + CONSTANT(-0.102579924282000000)*f[14] + CONSTANT(0.099322584599300004)*f[12]; - tg = CONSTANT(0.238413613504000000)*g[2] + CONSTANT(-0.102579924282000000)*g[14] + CONSTANT(0.099322584599300004)*g[12]; - y[11] += tf*g[19] + tg*f[19]; - y[19] += tf*g[11] + tg*f[11]; + tf = CONSTANT(0.238413613504000000) * f[2] + CONSTANT(-0.102579924282000000) * f[14] + CONSTANT(0.099322584599300004) * f[12]; + tg = CONSTANT(0.238413613504000000) * g[2] + CONSTANT(-0.102579924282000000) * g[14] + CONSTANT(0.099322584599300004) * g[12]; + y[11] += tf * g[19] + tg * f[19]; + y[19] += tf * g[11] + tg * f[11]; t = f[11] * g[19] + f[19] * g[11]; - y[2] += CONSTANT(0.238413613504000000)*t; - y[14] += CONSTANT(-0.102579924282000000)*t; - y[12] += CONSTANT(0.099322584599300004)*t; + y[2] += CONSTANT(0.238413613504000000) * t; + y[14] += CONSTANT(-0.102579924282000000) * t; + y[12] += CONSTANT(0.099322584599300004) * t; // [12,12]: 0,6,20, - tf = CONSTANT(0.282094799871999980)*f[0] + CONSTANT(0.168208852954000010)*f[6] + CONSTANT(0.153869910786000010)*f[20]; - tg = CONSTANT(0.282094799871999980)*g[0] + CONSTANT(0.168208852954000010)*g[6] + CONSTANT(0.153869910786000010)*g[20]; - y[12] += tf*g[12] + tg*f[12]; + tf = CONSTANT(0.282094799871999980) * f[0] + CONSTANT(0.168208852954000010) * f[6] + CONSTANT(0.153869910786000010) * f[20]; + tg = CONSTANT(0.282094799871999980) * g[0] + CONSTANT(0.168208852954000010) * g[6] + CONSTANT(0.153869910786000010) * g[20]; + y[12] += tf * g[12] + tg * f[12]; t = f[12] * g[12]; - y[0] += CONSTANT(0.282094799871999980)*t; - y[6] += CONSTANT(0.168208852954000010)*t; - y[20] += CONSTANT(0.153869910786000010)*t; + y[0] += CONSTANT(0.282094799871999980) * t; + y[6] += CONSTANT(0.168208852954000010) * t; + y[20] += CONSTANT(0.153869910786000010) * t; // [12,14]: 8,22, - tf = CONSTANT(-0.188063194517999990)*f[8] + CONSTANT(-0.044418410173299998)*f[22]; - tg = CONSTANT(-0.188063194517999990)*g[8] + CONSTANT(-0.044418410173299998)*g[22]; - y[12] += tf*g[14] + tg*f[14]; - y[14] += tf*g[12] + tg*f[12]; + tf = CONSTANT(-0.188063194517999990) * f[8] + CONSTANT(-0.044418410173299998) * f[22]; + tg = CONSTANT(-0.188063194517999990) * g[8] + CONSTANT(-0.044418410173299998) * g[22]; + y[12] += tf * g[14] + tg * f[14]; + y[14] += tf * g[12] + tg * f[12]; t = f[12] * g[14] + f[14] * g[12]; - y[8] += CONSTANT(-0.188063194517999990)*t; - y[22] += CONSTANT(-0.044418410173299998)*t; + y[8] += CONSTANT(-0.188063194517999990) * t; + y[22] += CONSTANT(-0.044418410173299998) * t; // [13,13]: 0,8,6,20,22, - tf = CONSTANT(0.282094791773999990)*f[0] + CONSTANT(0.145673124078999990)*f[8] + CONSTANT(0.126156626101000010)*f[6] + CONSTANT(0.025644981070299999)*f[20] + CONSTANT(0.114687841910000000)*f[22]; - tg = CONSTANT(0.282094791773999990)*g[0] + CONSTANT(0.145673124078999990)*g[8] + CONSTANT(0.126156626101000010)*g[6] + CONSTANT(0.025644981070299999)*g[20] + CONSTANT(0.114687841910000000)*g[22]; - y[13] += tf*g[13] + tg*f[13]; + tf = CONSTANT(0.282094791773999990) * f[0] + CONSTANT(0.145673124078999990) * f[8] + CONSTANT(0.126156626101000010) * f[6] + + CONSTANT(0.025644981070299999) * f[20] + CONSTANT(0.114687841910000000) * f[22]; + tg = CONSTANT(0.282094791773999990) * g[0] + CONSTANT(0.145673124078999990) * g[8] + CONSTANT(0.126156626101000010) * g[6] + + CONSTANT(0.025644981070299999) * g[20] + CONSTANT(0.114687841910000000) * g[22]; + y[13] += tf * g[13] + tg * f[13]; t = f[13] * g[13]; - y[0] += CONSTANT(0.282094791773999990)*t; - y[8] += CONSTANT(0.145673124078999990)*t; - y[6] += CONSTANT(0.126156626101000010)*t; - y[20] += CONSTANT(0.025644981070299999)*t; - y[22] += CONSTANT(0.114687841910000000)*t; + y[0] += CONSTANT(0.282094791773999990) * t; + y[8] += CONSTANT(0.145673124078999990) * t; + y[6] += CONSTANT(0.126156626101000010) * t; + y[20] += CONSTANT(0.025644981070299999) * t; + y[22] += CONSTANT(0.114687841910000000) * t; // [13,14]: 23, - tf = CONSTANT(0.067850242288500007)*f[23]; - tg = CONSTANT(0.067850242288500007)*g[23]; - y[13] += tf*g[14] + tg*f[14]; - y[14] += tf*g[13] + tg*f[13]; + tf = CONSTANT(0.067850242288500007) * f[23]; + tg = CONSTANT(0.067850242288500007) * g[23]; + y[13] += tf * g[14] + tg * f[14]; + y[14] += tf * g[13] + tg * f[13]; t = f[13] * g[14] + f[14] * g[13]; - y[23] += CONSTANT(0.067850242288500007)*t; + y[23] += CONSTANT(0.067850242288500007) * t; // [13,15]: 8,22,24, - tf = CONSTANT(-0.094031597259499999)*f[8] + CONSTANT(0.133255230518000010)*f[22] + CONSTANT(-0.117520066950999990)*f[24]; - tg = CONSTANT(-0.094031597259499999)*g[8] + CONSTANT(0.133255230518000010)*g[22] + CONSTANT(-0.117520066950999990)*g[24]; - y[13] += tf*g[15] + tg*f[15]; - y[15] += tf*g[13] + tg*f[13]; + tf = CONSTANT(-0.094031597259499999) * f[8] + CONSTANT(0.133255230518000010) * f[22] + CONSTANT(-0.117520066950999990) * f[24]; + tg = CONSTANT(-0.094031597259499999) * g[8] + CONSTANT(0.133255230518000010) * g[22] + CONSTANT(-0.117520066950999990) * g[24]; + y[13] += tf * g[15] + tg * f[15]; + y[15] += tf * g[13] + tg * f[13]; t = f[13] * g[15] + f[15] * g[13]; - y[8] += CONSTANT(-0.094031597259499999)*t; - y[22] += CONSTANT(0.133255230518000010)*t; - y[24] += CONSTANT(-0.117520066950999990)*t; + y[8] += CONSTANT(-0.094031597259499999) * t; + y[22] += CONSTANT(0.133255230518000010) * t; + y[24] += CONSTANT(-0.117520066950999990) * t; // [13,21]: 2,12,14, - tf = CONSTANT(0.238413613504000000)*f[2] + CONSTANT(0.099322584599300004)*f[12] + CONSTANT(0.102579924282000000)*f[14]; - tg = CONSTANT(0.238413613504000000)*g[2] + CONSTANT(0.099322584599300004)*g[12] + CONSTANT(0.102579924282000000)*g[14]; - y[13] += tf*g[21] + tg*f[21]; - y[21] += tf*g[13] + tg*f[13]; + tf = CONSTANT(0.238413613504000000) * f[2] + CONSTANT(0.099322584599300004) * f[12] + CONSTANT(0.102579924282000000) * f[14]; + tg = CONSTANT(0.238413613504000000) * g[2] + CONSTANT(0.099322584599300004) * g[12] + CONSTANT(0.102579924282000000) * g[14]; + y[13] += tf * g[21] + tg * f[21]; + y[21] += tf * g[13] + tg * f[13]; t = f[13] * g[21] + f[21] * g[13]; - y[2] += CONSTANT(0.238413613504000000)*t; - y[12] += CONSTANT(0.099322584599300004)*t; - y[14] += CONSTANT(0.102579924282000000)*t; + y[2] += CONSTANT(0.238413613504000000) * t; + y[12] += CONSTANT(0.099322584599300004) * t; + y[14] += CONSTANT(0.102579924282000000) * t; // [14,14]: 0,20,24, - tf = CONSTANT(0.282094791771999980)*f[0] + CONSTANT(-0.179514867494000000)*f[20] + CONSTANT(0.151717754049000010)*f[24]; - tg = CONSTANT(0.282094791771999980)*g[0] + CONSTANT(-0.179514867494000000)*g[20] + CONSTANT(0.151717754049000010)*g[24]; - y[14] += tf*g[14] + tg*f[14]; + tf = CONSTANT(0.282094791771999980) * f[0] + CONSTANT(-0.179514867494000000) * f[20] + CONSTANT(0.151717754049000010) * f[24]; + tg = CONSTANT(0.282094791771999980) * g[0] + CONSTANT(-0.179514867494000000) * g[20] + CONSTANT(0.151717754049000010) * g[24]; + y[14] += tf * g[14] + tg * f[14]; t = f[14] * g[14]; - y[0] += CONSTANT(0.282094791771999980)*t; - y[20] += CONSTANT(-0.179514867494000000)*t; - y[24] += CONSTANT(0.151717754049000010)*t; + y[0] += CONSTANT(0.282094791771999980) * t; + y[20] += CONSTANT(-0.179514867494000000) * t; + y[24] += CONSTANT(0.151717754049000010) * t; // [14,15]: 7,21, - tf = CONSTANT(0.148677009677999990)*f[7] + CONSTANT(-0.099322584600699995)*f[21]; - tg = CONSTANT(0.148677009677999990)*g[7] + CONSTANT(-0.099322584600699995)*g[21]; - y[14] += tf*g[15] + tg*f[15]; - y[15] += tf*g[14] + tg*f[14]; + tf = CONSTANT(0.148677009677999990) * f[7] + CONSTANT(-0.099322584600699995) * f[21]; + tg = CONSTANT(0.148677009677999990) * g[7] + CONSTANT(-0.099322584600699995) * g[21]; + y[14] += tf * g[15] + tg * f[15]; + y[15] += tf * g[14] + tg * f[14]; t = f[14] * g[15] + f[15] * g[14]; - y[7] += CONSTANT(0.148677009677999990)*t; - y[21] += CONSTANT(-0.099322584600699995)*t; + y[7] += CONSTANT(0.148677009677999990) * t; + y[21] += CONSTANT(-0.099322584600699995) * t; // [15,15]: 0,6,20, - tf = CONSTANT(0.282094791766999970)*f[0] + CONSTANT(-0.210261043508000010)*f[6] + CONSTANT(0.076934943209800002)*f[20]; - tg = CONSTANT(0.282094791766999970)*g[0] + CONSTANT(-0.210261043508000010)*g[6] + CONSTANT(0.076934943209800002)*g[20]; - y[15] += tf*g[15] + tg*f[15]; + tf = CONSTANT(0.282094791766999970) * f[0] + CONSTANT(-0.210261043508000010) * f[6] + CONSTANT(0.076934943209800002) * f[20]; + tg = CONSTANT(0.282094791766999970) * g[0] + CONSTANT(-0.210261043508000010) * g[6] + CONSTANT(0.076934943209800002) * g[20]; + y[15] += tf * g[15] + tg * f[15]; t = f[15] * g[15]; - y[0] += CONSTANT(0.282094791766999970)*t; - y[6] += CONSTANT(-0.210261043508000010)*t; - y[20] += CONSTANT(0.076934943209800002)*t; + y[0] += CONSTANT(0.282094791766999970) * t; + y[6] += CONSTANT(-0.210261043508000010) * t; + y[20] += CONSTANT(0.076934943209800002) * t; // [15,23]: 12,2, - tf = CONSTANT(-0.203550726872999990)*f[12] + CONSTANT(0.162867503964999990)*f[2]; - tg = CONSTANT(-0.203550726872999990)*g[12] + CONSTANT(0.162867503964999990)*g[2]; - y[15] += tf*g[23] + tg*f[23]; - y[23] += tf*g[15] + tg*f[15]; + tf = CONSTANT(-0.203550726872999990) * f[12] + CONSTANT(0.162867503964999990) * f[2]; + tg = CONSTANT(-0.203550726872999990) * g[12] + CONSTANT(0.162867503964999990) * g[2]; + y[15] += tf * g[23] + tg * f[23]; + y[23] += tf * g[15] + tg * f[15]; t = f[15] * g[23] + f[23] * g[15]; - y[12] += CONSTANT(-0.203550726872999990)*t; - y[2] += CONSTANT(0.162867503964999990)*t; + y[12] += CONSTANT(-0.203550726872999990) * t; + y[2] += CONSTANT(0.162867503964999990) * t; // [16,16]: 0,6,20, - tf = CONSTANT(0.282094791763999990)*f[0] + CONSTANT(-0.229375683829000000)*f[6] + CONSTANT(0.106525305981000000)*f[20]; - tg = CONSTANT(0.282094791763999990)*g[0] + CONSTANT(-0.229375683829000000)*g[6] + CONSTANT(0.106525305981000000)*g[20]; - y[16] += tf*g[16] + tg*f[16]; + tf = CONSTANT(0.282094791763999990) * f[0] + CONSTANT(-0.229375683829000000) * f[6] + CONSTANT(0.106525305981000000) * f[20]; + tg = CONSTANT(0.282094791763999990) * g[0] + CONSTANT(-0.229375683829000000) * g[6] + CONSTANT(0.106525305981000000) * g[20]; + y[16] += tf * g[16] + tg * f[16]; t = f[16] * g[16]; - y[0] += CONSTANT(0.282094791763999990)*t; - y[6] += CONSTANT(-0.229375683829000000)*t; - y[20] += CONSTANT(0.106525305981000000)*t; + y[0] += CONSTANT(0.282094791763999990) * t; + y[6] += CONSTANT(-0.229375683829000000) * t; + y[20] += CONSTANT(0.106525305981000000) * t; // [16,18]: 8,22, - tf = CONSTANT(-0.075080816693699995)*f[8] + CONSTANT(0.135045473380000000)*f[22]; - tg = CONSTANT(-0.075080816693699995)*g[8] + CONSTANT(0.135045473380000000)*g[22]; - y[16] += tf*g[18] + tg*f[18]; - y[18] += tf*g[16] + tg*f[16]; + tf = CONSTANT(-0.075080816693699995) * f[8] + CONSTANT(0.135045473380000000) * f[22]; + tg = CONSTANT(-0.075080816693699995) * g[8] + CONSTANT(0.135045473380000000) * g[22]; + y[16] += tf * g[18] + tg * f[18]; + y[18] += tf * g[16] + tg * f[16]; t = f[16] * g[18] + f[18] * g[16]; - y[8] += CONSTANT(-0.075080816693699995)*t; - y[22] += CONSTANT(0.135045473380000000)*t; + y[8] += CONSTANT(-0.075080816693699995) * t; + y[22] += CONSTANT(0.135045473380000000) * t; // [16,23]: 19,5, - tf = CONSTANT(-0.119098912754999990)*f[19] + CONSTANT(0.140463346187999990)*f[5]; - tg = CONSTANT(-0.119098912754999990)*g[19] + CONSTANT(0.140463346187999990)*g[5]; - y[16] += tf*g[23] + tg*f[23]; - y[23] += tf*g[16] + tg*f[16]; + tf = CONSTANT(-0.119098912754999990) * f[19] + CONSTANT(0.140463346187999990) * f[5]; + tg = CONSTANT(-0.119098912754999990) * g[19] + CONSTANT(0.140463346187999990) * g[5]; + y[16] += tf * g[23] + tg * f[23]; + y[23] += tf * g[16] + tg * f[16]; t = f[16] * g[23] + f[23] * g[16]; - y[19] += CONSTANT(-0.119098912754999990)*t; - y[5] += CONSTANT(0.140463346187999990)*t; + y[19] += CONSTANT(-0.119098912754999990) * t; + y[5] += CONSTANT(0.140463346187999990) * t; // [17,17]: 0,6,20, - tf = CONSTANT(0.282094791768999990)*f[0] + CONSTANT(-0.057343920955899998)*f[6] + CONSTANT(-0.159787958979000000)*f[20]; - tg = CONSTANT(0.282094791768999990)*g[0] + CONSTANT(-0.057343920955899998)*g[6] + CONSTANT(-0.159787958979000000)*g[20]; - y[17] += tf*g[17] + tg*f[17]; + tf = CONSTANT(0.282094791768999990) * f[0] + CONSTANT(-0.057343920955899998) * f[6] + CONSTANT(-0.159787958979000000) * f[20]; + tg = CONSTANT(0.282094791768999990) * g[0] + CONSTANT(-0.057343920955899998) * g[6] + CONSTANT(-0.159787958979000000) * g[20]; + y[17] += tf * g[17] + tg * f[17]; t = f[17] * g[17]; - y[0] += CONSTANT(0.282094791768999990)*t; - y[6] += CONSTANT(-0.057343920955899998)*t; - y[20] += CONSTANT(-0.159787958979000000)*t; + y[0] += CONSTANT(0.282094791768999990) * t; + y[6] += CONSTANT(-0.057343920955899998) * t; + y[20] += CONSTANT(-0.159787958979000000) * t; // [17,19]: 8,22,24, - tf = CONSTANT(-0.112621225039000000)*f[8] + CONSTANT(0.045015157794100001)*f[22] + CONSTANT(0.119098912753000000)*f[24]; - tg = CONSTANT(-0.112621225039000000)*g[8] + CONSTANT(0.045015157794100001)*g[22] + CONSTANT(0.119098912753000000)*g[24]; - y[17] += tf*g[19] + tg*f[19]; - y[19] += tf*g[17] + tg*f[17]; + tf = CONSTANT(-0.112621225039000000) * f[8] + CONSTANT(0.045015157794100001) * f[22] + CONSTANT(0.119098912753000000) * f[24]; + tg = CONSTANT(-0.112621225039000000) * g[8] + CONSTANT(0.045015157794100001) * g[22] + CONSTANT(0.119098912753000000) * g[24]; + y[17] += tf * g[19] + tg * f[19]; + y[19] += tf * g[17] + tg * f[17]; t = f[17] * g[19] + f[19] * g[17]; - y[8] += CONSTANT(-0.112621225039000000)*t; - y[22] += CONSTANT(0.045015157794100001)*t; - y[24] += CONSTANT(0.119098912753000000)*t; + y[8] += CONSTANT(-0.112621225039000000) * t; + y[22] += CONSTANT(0.045015157794100001) * t; + y[24] += CONSTANT(0.119098912753000000) * t; // [17,21]: 16,4,18, - tf = CONSTANT(-0.119098912754999990)*f[16] + CONSTANT(-0.112621225039000000)*f[4] + CONSTANT(0.045015157794399997)*f[18]; - tg = CONSTANT(-0.119098912754999990)*g[16] + CONSTANT(-0.112621225039000000)*g[4] + CONSTANT(0.045015157794399997)*g[18]; - y[17] += tf*g[21] + tg*f[21]; - y[21] += tf*g[17] + tg*f[17]; + tf = CONSTANT(-0.119098912754999990) * f[16] + CONSTANT(-0.112621225039000000) * f[4] + CONSTANT(0.045015157794399997) * f[18]; + tg = CONSTANT(-0.119098912754999990) * g[16] + CONSTANT(-0.112621225039000000) * g[4] + CONSTANT(0.045015157794399997) * g[18]; + y[17] += tf * g[21] + tg * f[21]; + y[21] += tf * g[17] + tg * f[17]; t = f[17] * g[21] + f[21] * g[17]; - y[16] += CONSTANT(-0.119098912754999990)*t; - y[4] += CONSTANT(-0.112621225039000000)*t; - y[18] += CONSTANT(0.045015157794399997)*t; + y[16] += CONSTANT(-0.119098912754999990) * t; + y[4] += CONSTANT(-0.112621225039000000) * t; + y[18] += CONSTANT(0.045015157794399997) * t; // [18,18]: 6,0,20,24, - tf = CONSTANT(0.065535909662600006)*f[6] + CONSTANT(0.282094791771999980)*f[0] + CONSTANT(-0.083698454702400005)*f[20] + CONSTANT(-0.135045473384000000)*f[24]; - tg = CONSTANT(0.065535909662600006)*g[6] + CONSTANT(0.282094791771999980)*g[0] + CONSTANT(-0.083698454702400005)*g[20] + CONSTANT(-0.135045473384000000)*g[24]; - y[18] += tf*g[18] + tg*f[18]; + tf = CONSTANT(0.065535909662600006) * f[6] + CONSTANT(0.282094791771999980) * f[0] + CONSTANT(-0.083698454702400005) * f[20] + + CONSTANT(-0.135045473384000000) * f[24]; + tg = CONSTANT(0.065535909662600006) * g[6] + CONSTANT(0.282094791771999980) * g[0] + CONSTANT(-0.083698454702400005) * g[20] + + CONSTANT(-0.135045473384000000) * g[24]; + y[18] += tf * g[18] + tg * f[18]; t = f[18] * g[18]; - y[6] += CONSTANT(0.065535909662600006)*t; - y[0] += CONSTANT(0.282094791771999980)*t; - y[20] += CONSTANT(-0.083698454702400005)*t; - y[24] += CONSTANT(-0.135045473384000000)*t; + y[6] += CONSTANT(0.065535909662600006) * t; + y[0] += CONSTANT(0.282094791771999980) * t; + y[20] += CONSTANT(-0.083698454702400005) * t; + y[24] += CONSTANT(-0.135045473384000000) * t; // [18,19]: 7,21,23, - tf = CONSTANT(0.090297865407399994)*f[7] + CONSTANT(0.102084782359000000)*f[21] + CONSTANT(-0.045015157794399997)*f[23]; - tg = CONSTANT(0.090297865407399994)*g[7] + CONSTANT(0.102084782359000000)*g[21] + CONSTANT(-0.045015157794399997)*g[23]; - y[18] += tf*g[19] + tg*f[19]; - y[19] += tf*g[18] + tg*f[18]; + tf = CONSTANT(0.090297865407399994) * f[7] + CONSTANT(0.102084782359000000) * f[21] + CONSTANT(-0.045015157794399997) * f[23]; + tg = CONSTANT(0.090297865407399994) * g[7] + CONSTANT(0.102084782359000000) * g[21] + CONSTANT(-0.045015157794399997) * g[23]; + y[18] += tf * g[19] + tg * f[19]; + y[19] += tf * g[18] + tg * f[18]; t = f[18] * g[19] + f[19] * g[18]; - y[7] += CONSTANT(0.090297865407399994)*t; - y[21] += CONSTANT(0.102084782359000000)*t; - y[23] += CONSTANT(-0.045015157794399997)*t; + y[7] += CONSTANT(0.090297865407399994) * t; + y[21] += CONSTANT(0.102084782359000000) * t; + y[23] += CONSTANT(-0.045015157794399997) * t; // [19,19]: 6,8,0,20,22, - tf = CONSTANT(0.139263808033999990)*f[6] + CONSTANT(-0.141889406570999990)*f[8] + CONSTANT(0.282094791773999990)*f[0] + CONSTANT(0.068480553847200004)*f[20] + CONSTANT(-0.102084782360000000)*f[22]; - tg = CONSTANT(0.139263808033999990)*g[6] + CONSTANT(-0.141889406570999990)*g[8] + CONSTANT(0.282094791773999990)*g[0] + CONSTANT(0.068480553847200004)*g[20] + CONSTANT(-0.102084782360000000)*g[22]; - y[19] += tf*g[19] + tg*f[19]; + tf = CONSTANT(0.139263808033999990) * f[6] + CONSTANT(-0.141889406570999990) * f[8] + CONSTANT(0.282094791773999990) * f[0] + + CONSTANT(0.068480553847200004) * f[20] + CONSTANT(-0.102084782360000000) * f[22]; + tg = CONSTANT(0.139263808033999990) * g[6] + CONSTANT(-0.141889406570999990) * g[8] + CONSTANT(0.282094791773999990) * g[0] + + CONSTANT(0.068480553847200004) * g[20] + CONSTANT(-0.102084782360000000) * g[22]; + y[19] += tf * g[19] + tg * f[19]; t = f[19] * g[19]; - y[6] += CONSTANT(0.139263808033999990)*t; - y[8] += CONSTANT(-0.141889406570999990)*t; - y[0] += CONSTANT(0.282094791773999990)*t; - y[20] += CONSTANT(0.068480553847200004)*t; - y[22] += CONSTANT(-0.102084782360000000)*t; + y[6] += CONSTANT(0.139263808033999990) * t; + y[8] += CONSTANT(-0.141889406570999990) * t; + y[0] += CONSTANT(0.282094791773999990) * t; + y[20] += CONSTANT(0.068480553847200004) * t; + y[22] += CONSTANT(-0.102084782360000000) * t; // [20,20]: 6,0,20, - tf = CONSTANT(0.163839797503000010)*f[6] + CONSTANT(0.282094802232000010)*f[0]; - tg = CONSTANT(0.163839797503000010)*g[6] + CONSTANT(0.282094802232000010)*g[0]; - y[20] += tf*g[20] + tg*f[20]; + tf = CONSTANT(0.163839797503000010) * f[6] + CONSTANT(0.282094802232000010) * f[0]; + tg = CONSTANT(0.163839797503000010) * g[6] + CONSTANT(0.282094802232000010) * g[0]; + y[20] += tf * g[20] + tg * f[20]; t = f[20] * g[20]; - y[6] += CONSTANT(0.163839797503000010)*t; - y[0] += CONSTANT(0.282094802232000010)*t; - y[20] += CONSTANT(0.136961139005999990)*t; + y[6] += CONSTANT(0.163839797503000010) * t; + y[0] += CONSTANT(0.282094802232000010) * t; + y[20] += CONSTANT(0.136961139005999990) * t; // [21,21]: 6,20,0,8,22, - tf = CONSTANT(0.139263808033999990)*f[6] + CONSTANT(0.068480553847200004)*f[20] + CONSTANT(0.282094791773999990)*f[0] + CONSTANT(0.141889406570999990)*f[8] + CONSTANT(0.102084782360000000)*f[22]; - tg = CONSTANT(0.139263808033999990)*g[6] + CONSTANT(0.068480553847200004)*g[20] + CONSTANT(0.282094791773999990)*g[0] + CONSTANT(0.141889406570999990)*g[8] + CONSTANT(0.102084782360000000)*g[22]; - y[21] += tf*g[21] + tg*f[21]; + tf = CONSTANT(0.139263808033999990) * f[6] + CONSTANT(0.068480553847200004) * f[20] + CONSTANT(0.282094791773999990) * f[0] + + CONSTANT(0.141889406570999990) * f[8] + CONSTANT(0.102084782360000000) * f[22]; + tg = CONSTANT(0.139263808033999990) * g[6] + CONSTANT(0.068480553847200004) * g[20] + CONSTANT(0.282094791773999990) * g[0] + + CONSTANT(0.141889406570999990) * g[8] + CONSTANT(0.102084782360000000) * g[22]; + y[21] += tf * g[21] + tg * f[21]; t = f[21] * g[21]; - y[6] += CONSTANT(0.139263808033999990)*t; - y[20] += CONSTANT(0.068480553847200004)*t; - y[0] += CONSTANT(0.282094791773999990)*t; - y[8] += CONSTANT(0.141889406570999990)*t; - y[22] += CONSTANT(0.102084782360000000)*t; + y[6] += CONSTANT(0.139263808033999990) * t; + y[20] += CONSTANT(0.068480553847200004) * t; + y[0] += CONSTANT(0.282094791773999990) * t; + y[8] += CONSTANT(0.141889406570999990) * t; + y[22] += CONSTANT(0.102084782360000000) * t; // [21,23]: 8,22,24, - tf = CONSTANT(-0.112621225039000000)*f[8] + CONSTANT(0.045015157794100001)*f[22] + CONSTANT(-0.119098912753000000)*f[24]; - tg = CONSTANT(-0.112621225039000000)*g[8] + CONSTANT(0.045015157794100001)*g[22] + CONSTANT(-0.119098912753000000)*g[24]; - y[21] += tf*g[23] + tg*f[23]; - y[23] += tf*g[21] + tg*f[21]; + tf = CONSTANT(-0.112621225039000000) * f[8] + CONSTANT(0.045015157794100001) * f[22] + CONSTANT(-0.119098912753000000) * f[24]; + tg = CONSTANT(-0.112621225039000000) * g[8] + CONSTANT(0.045015157794100001) * g[22] + CONSTANT(-0.119098912753000000) * g[24]; + y[21] += tf * g[23] + tg * f[23]; + y[23] += tf * g[21] + tg * f[21]; t = f[21] * g[23] + f[23] * g[21]; - y[8] += CONSTANT(-0.112621225039000000)*t; - y[22] += CONSTANT(0.045015157794100001)*t; - y[24] += CONSTANT(-0.119098912753000000)*t; + y[8] += CONSTANT(-0.112621225039000000) * t; + y[22] += CONSTANT(0.045015157794100001) * t; + y[24] += CONSTANT(-0.119098912753000000) * t; // [22,22]: 6,20,0,24, - tf = CONSTANT(0.065535909662600006)*f[6] + CONSTANT(-0.083698454702400005)*f[20] + CONSTANT(0.282094791771999980)*f[0] + CONSTANT(0.135045473384000000)*f[24]; - tg = CONSTANT(0.065535909662600006)*g[6] + CONSTANT(-0.083698454702400005)*g[20] + CONSTANT(0.282094791771999980)*g[0] + CONSTANT(0.135045473384000000)*g[24]; - y[22] += tf*g[22] + tg*f[22]; + tf = CONSTANT(0.065535909662600006) * f[6] + CONSTANT(-0.083698454702400005) * f[20] + CONSTANT(0.282094791771999980) * f[0] + + CONSTANT(0.135045473384000000) * f[24]; + tg = CONSTANT(0.065535909662600006) * g[6] + CONSTANT(-0.083698454702400005) * g[20] + CONSTANT(0.282094791771999980) * g[0] + + CONSTANT(0.135045473384000000) * g[24]; + y[22] += tf * g[22] + tg * f[22]; t = f[22] * g[22]; - y[6] += CONSTANT(0.065535909662600006)*t; - y[20] += CONSTANT(-0.083698454702400005)*t; - y[0] += CONSTANT(0.282094791771999980)*t; - y[24] += CONSTANT(0.135045473384000000)*t; + y[6] += CONSTANT(0.065535909662600006) * t; + y[20] += CONSTANT(-0.083698454702400005) * t; + y[0] += CONSTANT(0.282094791771999980) * t; + y[24] += CONSTANT(0.135045473384000000) * t; // [23,23]: 6,20,0, - tf = CONSTANT(-0.057343920955899998)*f[6] + CONSTANT(-0.159787958979000000)*f[20] + CONSTANT(0.282094791768999990)*f[0]; - tg = CONSTANT(-0.057343920955899998)*g[6] + CONSTANT(-0.159787958979000000)*g[20] + CONSTANT(0.282094791768999990)*g[0]; - y[23] += tf*g[23] + tg*f[23]; + tf = CONSTANT(-0.057343920955899998) * f[6] + CONSTANT(-0.159787958979000000) * f[20] + CONSTANT(0.282094791768999990) * f[0]; + tg = CONSTANT(-0.057343920955899998) * g[6] + CONSTANT(-0.159787958979000000) * g[20] + CONSTANT(0.282094791768999990) * g[0]; + y[23] += tf * g[23] + tg * f[23]; t = f[23] * g[23]; - y[6] += CONSTANT(-0.057343920955899998)*t; - y[20] += CONSTANT(-0.159787958979000000)*t; - y[0] += CONSTANT(0.282094791768999990)*t; + y[6] += CONSTANT(-0.057343920955899998) * t; + y[20] += CONSTANT(-0.159787958979000000) * t; + y[0] += CONSTANT(0.282094791768999990) * t; // [24,24]: 6,0,20, - tf = CONSTANT(-0.229375683829000000)*f[6] + CONSTANT(0.282094791763999990)*f[0] + CONSTANT(0.106525305981000000)*f[20]; - tg = CONSTANT(-0.229375683829000000)*g[6] + CONSTANT(0.282094791763999990)*g[0] + CONSTANT(0.106525305981000000)*g[20]; - y[24] += tf*g[24] + tg*f[24]; + tf = CONSTANT(-0.229375683829000000) * f[6] + CONSTANT(0.282094791763999990) * f[0] + CONSTANT(0.106525305981000000) * f[20]; + tg = CONSTANT(-0.229375683829000000) * g[6] + CONSTANT(0.282094791763999990) * g[0] + CONSTANT(0.106525305981000000) * g[20]; + y[24] += tf * g[24] + tg * f[24]; t = f[24] * g[24]; - y[6] += CONSTANT(-0.229375683829000000)*t; - y[0] += CONSTANT(0.282094791763999990)*t; - y[20] += CONSTANT(0.106525305981000000)*t; + y[6] += CONSTANT(-0.229375683829000000) * t; + y[0] += CONSTANT(0.282094791763999990) * t; + y[20] += CONSTANT(0.106525305981000000) * t; // multiply count=1135 return y; } - //------------------------------------------------------------------------------------- // https://msdn.microsoft.com/en-us/library/windows/desktop/bb232909.aspx //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -float* DirectX::XMSHMultiply6( - float *y, - const float *f, - const float *g) noexcept +_Use_decl_annotations_ float* DirectX::XMSHMultiply6(float* y, const float* f, const float* g) noexcept { if (!y || !f || !g) return nullptr; REAL tf, tg, t; // [0,0]: 0, - y[0] = CONSTANT(0.282094792935999980)*f[0] * g[0]; + y[0] = CONSTANT(0.282094792935999980) * f[0] * g[0]; // [1,1]: 0,6,8, - tf = CONSTANT(0.282094791773000010)*f[0] + CONSTANT(-0.126156626101000010)*f[6] + CONSTANT(-0.218509686119999990)*f[8]; - tg = CONSTANT(0.282094791773000010)*g[0] + CONSTANT(-0.126156626101000010)*g[6] + CONSTANT(-0.218509686119999990)*g[8]; - y[1] = tf*g[1] + tg*f[1]; - t = f[1] * g[1]; - y[0] += CONSTANT(0.282094791773000010)*t; - y[6] = CONSTANT(-0.126156626101000010)*t; - y[8] = CONSTANT(-0.218509686119999990)*t; + tf = CONSTANT(0.282094791773000010) * f[0] + CONSTANT(-0.126156626101000010) * f[6] + CONSTANT(-0.218509686119999990) * f[8]; + tg = CONSTANT(0.282094791773000010) * g[0] + CONSTANT(-0.126156626101000010) * g[6] + CONSTANT(-0.218509686119999990) * g[8]; + y[1] = tf * g[1] + tg * f[1]; + t = f[1] * g[1]; + y[0] += CONSTANT(0.282094791773000010) * t; + y[6] = CONSTANT(-0.126156626101000010) * t; + y[8] = CONSTANT(-0.218509686119999990) * t; // [1,4]: 3,13,15, - tf = CONSTANT(0.218509686114999990)*f[3] + CONSTANT(-0.058399170082300000)*f[13] + CONSTANT(-0.226179013157999990)*f[15]; - tg = CONSTANT(0.218509686114999990)*g[3] + CONSTANT(-0.058399170082300000)*g[13] + CONSTANT(-0.226179013157999990)*g[15]; - y[1] += tf*g[4] + tg*f[4]; - y[4] = tf*g[1] + tg*f[1]; - t = f[1] * g[4] + f[4] * g[1]; - y[3] = CONSTANT(0.218509686114999990)*t; - y[13] = CONSTANT(-0.058399170082300000)*t; - y[15] = CONSTANT(-0.226179013157999990)*t; + tf = CONSTANT(0.218509686114999990) * f[3] + CONSTANT(-0.058399170082300000) * f[13] + CONSTANT(-0.226179013157999990) * f[15]; + tg = CONSTANT(0.218509686114999990) * g[3] + CONSTANT(-0.058399170082300000) * g[13] + CONSTANT(-0.226179013157999990) * g[15]; + y[1] += tf * g[4] + tg * f[4]; + y[4] = tf * g[1] + tg * f[1]; + t = f[1] * g[4] + f[4] * g[1]; + y[3] = CONSTANT(0.218509686114999990) * t; + y[13] = CONSTANT(-0.058399170082300000) * t; + y[15] = CONSTANT(-0.226179013157999990) * t; // [1,5]: 2,12, - tf = CONSTANT(0.218509686118000010)*f[2] + CONSTANT(-0.143048168103000000)*f[12]; - tg = CONSTANT(0.218509686118000010)*g[2] + CONSTANT(-0.143048168103000000)*g[12]; - y[1] += tf*g[5] + tg*f[5]; - y[5] = tf*g[1] + tg*f[1]; - t = f[1] * g[5] + f[5] * g[1]; - y[2] = CONSTANT(0.218509686118000010)*t; - y[12] = CONSTANT(-0.143048168103000000)*t; + tf = CONSTANT(0.218509686118000010) * f[2] + CONSTANT(-0.143048168103000000) * f[12]; + tg = CONSTANT(0.218509686118000010) * g[2] + CONSTANT(-0.143048168103000000) * g[12]; + y[1] += tf * g[5] + tg * f[5]; + y[5] = tf * g[1] + tg * f[1]; + t = f[1] * g[5] + f[5] * g[1]; + y[2] = CONSTANT(0.218509686118000010) * t; + y[12] = CONSTANT(-0.143048168103000000) * t; // [1,11]: 6,8,20,22, - tf = CONSTANT(0.202300659402999990)*f[6] + CONSTANT(0.058399170081799998)*f[8] + CONSTANT(-0.150786008773000000)*f[20] + CONSTANT(-0.168583882836999990)*f[22]; - tg = CONSTANT(0.202300659402999990)*g[6] + CONSTANT(0.058399170081799998)*g[8] + CONSTANT(-0.150786008773000000)*g[20] + CONSTANT(-0.168583882836999990)*g[22]; - y[1] += tf*g[11] + tg*f[11]; - y[11] = tf*g[1] + tg*f[1]; - t = f[1] * g[11] + f[11] * g[1]; - y[6] += CONSTANT(0.202300659402999990)*t; - y[8] += CONSTANT(0.058399170081799998)*t; - y[20] = CONSTANT(-0.150786008773000000)*t; - y[22] = CONSTANT(-0.168583882836999990)*t; + tf = CONSTANT(0.202300659402999990) * f[6] + CONSTANT(0.058399170081799998) * f[8] + CONSTANT(-0.150786008773000000) * f[20] + + CONSTANT(-0.168583882836999990) * f[22]; + tg = CONSTANT(0.202300659402999990) * g[6] + CONSTANT(0.058399170081799998) * g[8] + CONSTANT(-0.150786008773000000) * g[20] + + CONSTANT(-0.168583882836999990) * g[22]; + y[1] += tf * g[11] + tg * f[11]; + y[11] = tf * g[1] + tg * f[1]; + t = f[1] * g[11] + f[11] * g[1]; + y[6] += CONSTANT(0.202300659402999990) * t; + y[8] += CONSTANT(0.058399170081799998) * t; + y[20] = CONSTANT(-0.150786008773000000) * t; + y[22] = CONSTANT(-0.168583882836999990) * t; // [1,16]: 15,33,35, - tf = CONSTANT(0.230329432973999990)*f[15] + CONSTANT(-0.034723468517399998)*f[33] + CONSTANT(-0.232932108051999990)*f[35]; - tg = CONSTANT(0.230329432973999990)*g[15] + CONSTANT(-0.034723468517399998)*g[33] + CONSTANT(-0.232932108051999990)*g[35]; - y[1] += tf*g[16] + tg*f[16]; - y[16] = tf*g[1] + tg*f[1]; - t = f[1] * g[16] + f[16] * g[1]; - y[15] += CONSTANT(0.230329432973999990)*t; - y[33] = CONSTANT(-0.034723468517399998)*t; - y[35] = CONSTANT(-0.232932108051999990)*t; + tf = CONSTANT(0.230329432973999990) * f[15] + CONSTANT(-0.034723468517399998) * f[33] + CONSTANT(-0.232932108051999990) * f[35]; + tg = CONSTANT(0.230329432973999990) * g[15] + CONSTANT(-0.034723468517399998) * g[33] + CONSTANT(-0.232932108051999990) * g[35]; + y[1] += tf * g[16] + tg * f[16]; + y[16] = tf * g[1] + tg * f[1]; + t = f[1] * g[16] + f[16] * g[1]; + y[15] += CONSTANT(0.230329432973999990) * t; + y[33] = CONSTANT(-0.034723468517399998) * t; + y[35] = CONSTANT(-0.232932108051999990) * t; // [1,18]: 15,13,31,33, - tf = CONSTANT(0.043528171377799997)*f[15] + CONSTANT(0.168583882834000000)*f[13] + CONSTANT(-0.085054779966799998)*f[31] + CONSTANT(-0.183739324705999990)*f[33]; - tg = CONSTANT(0.043528171377799997)*g[15] + CONSTANT(0.168583882834000000)*g[13] + CONSTANT(-0.085054779966799998)*g[31] + CONSTANT(-0.183739324705999990)*g[33]; - y[1] += tf*g[18] + tg*f[18]; - y[18] = tf*g[1] + tg*f[1]; - t = f[1] * g[18] + f[18] * g[1]; - y[15] += CONSTANT(0.043528171377799997)*t; - y[13] += CONSTANT(0.168583882834000000)*t; - y[31] = CONSTANT(-0.085054779966799998)*t; - y[33] += CONSTANT(-0.183739324705999990)*t; + tf = CONSTANT(0.043528171377799997) * f[15] + CONSTANT(0.168583882834000000) * f[13] + CONSTANT(-0.085054779966799998) * f[31] + + CONSTANT(-0.183739324705999990) * f[33]; + tg = CONSTANT(0.043528171377799997) * g[15] + CONSTANT(0.168583882834000000) * g[13] + CONSTANT(-0.085054779966799998) * g[31] + + CONSTANT(-0.183739324705999990) * g[33]; + y[1] += tf * g[18] + tg * f[18]; + y[18] = tf * g[1] + tg * f[1]; + t = f[1] * g[18] + f[18] * g[1]; + y[15] += CONSTANT(0.043528171377799997) * t; + y[13] += CONSTANT(0.168583882834000000) * t; + y[31] = CONSTANT(-0.085054779966799998) * t; + y[33] += CONSTANT(-0.183739324705999990) * t; // [1,19]: 14,12,30,32, - tf = CONSTANT(0.075393004386399995)*f[14] + CONSTANT(0.194663900273000010)*f[12] + CONSTANT(-0.155288072037000010)*f[30] + CONSTANT(-0.159122922869999990)*f[32]; - tg = CONSTANT(0.075393004386399995)*g[14] + CONSTANT(0.194663900273000010)*g[12] + CONSTANT(-0.155288072037000010)*g[30] + CONSTANT(-0.159122922869999990)*g[32]; - y[1] += tf*g[19] + tg*f[19]; - y[19] = tf*g[1] + tg*f[1]; - t = f[1] * g[19] + f[19] * g[1]; - y[14] = CONSTANT(0.075393004386399995)*t; - y[12] += CONSTANT(0.194663900273000010)*t; - y[30] = CONSTANT(-0.155288072037000010)*t; - y[32] = CONSTANT(-0.159122922869999990)*t; + tf = CONSTANT(0.075393004386399995) * f[14] + CONSTANT(0.194663900273000010) * f[12] + CONSTANT(-0.155288072037000010) * f[30] + + CONSTANT(-0.159122922869999990) * f[32]; + tg = CONSTANT(0.075393004386399995) * g[14] + CONSTANT(0.194663900273000010) * g[12] + CONSTANT(-0.155288072037000010) * g[30] + + CONSTANT(-0.159122922869999990) * g[32]; + y[1] += tf * g[19] + tg * f[19]; + y[19] = tf * g[1] + tg * f[1]; + t = f[1] * g[19] + f[19] * g[1]; + y[14] = CONSTANT(0.075393004386399995) * t; + y[12] += CONSTANT(0.194663900273000010) * t; + y[30] = CONSTANT(-0.155288072037000010) * t; + y[32] = CONSTANT(-0.159122922869999990) * t; // [1,24]: 9,25,27, - tf = CONSTANT(-0.230329432978999990)*f[9] + CONSTANT(0.232932108049000000)*f[25] + CONSTANT(0.034723468517100002)*f[27]; - tg = CONSTANT(-0.230329432978999990)*g[9] + CONSTANT(0.232932108049000000)*g[25] + CONSTANT(0.034723468517100002)*g[27]; - y[1] += tf*g[24] + tg*f[24]; - y[24] = tf*g[1] + tg*f[1]; - t = f[1] * g[24] + f[24] * g[1]; - y[9] = CONSTANT(-0.230329432978999990)*t; - y[25] = CONSTANT(0.232932108049000000)*t; - y[27] = CONSTANT(0.034723468517100002)*t; + tf = CONSTANT(-0.230329432978999990) * f[9] + CONSTANT(0.232932108049000000) * f[25] + CONSTANT(0.034723468517100002) * f[27]; + tg = CONSTANT(-0.230329432978999990) * g[9] + CONSTANT(0.232932108049000000) * g[25] + CONSTANT(0.034723468517100002) * g[27]; + y[1] += tf * g[24] + tg * f[24]; + y[24] = tf * g[1] + tg * f[1]; + t = f[1] * g[24] + f[24] * g[1]; + y[9] = CONSTANT(-0.230329432978999990) * t; + y[25] = CONSTANT(0.232932108049000000) * t; + y[27] = CONSTANT(0.034723468517100002) * t; // [1,29]: 22,20, - tf = CONSTANT(0.085054779965999999)*f[22] + CONSTANT(0.190188269815000010)*f[20]; - tg = CONSTANT(0.085054779965999999)*g[22] + CONSTANT(0.190188269815000010)*g[20]; - y[1] += tf*g[29] + tg*f[29]; - y[29] = tf*g[1] + tg*f[1]; - t = f[1] * g[29] + f[29] * g[1]; - y[22] += CONSTANT(0.085054779965999999)*t; - y[20] += CONSTANT(0.190188269815000010)*t; + tf = CONSTANT(0.085054779965999999) * f[22] + CONSTANT(0.190188269815000010) * f[20]; + tg = CONSTANT(0.085054779965999999) * g[22] + CONSTANT(0.190188269815000010) * g[20]; + y[1] += tf * g[29] + tg * f[29]; + y[29] = tf * g[1] + tg * f[1]; + t = f[1] * g[29] + f[29] * g[1]; + y[22] += CONSTANT(0.085054779965999999) * t; + y[20] += CONSTANT(0.190188269815000010) * t; // [2,2]: 0,6, - tf = CONSTANT(0.282094795249000000)*f[0] + CONSTANT(0.252313259986999990)*f[6]; - tg = CONSTANT(0.282094795249000000)*g[0] + CONSTANT(0.252313259986999990)*g[6]; - y[2] += tf*g[2] + tg*f[2]; + tf = CONSTANT(0.282094795249000000) * f[0] + CONSTANT(0.252313259986999990) * f[6]; + tg = CONSTANT(0.282094795249000000) * g[0] + CONSTANT(0.252313259986999990) * g[6]; + y[2] += tf * g[2] + tg * f[2]; t = f[2] * g[2]; - y[0] += CONSTANT(0.282094795249000000)*t; - y[6] += CONSTANT(0.252313259986999990)*t; + y[0] += CONSTANT(0.282094795249000000) * t; + y[6] += CONSTANT(0.252313259986999990) * t; // [2,12]: 6,20, - tf = CONSTANT(0.247766706973999990)*f[6] + CONSTANT(0.246232537174000010)*f[20]; - tg = CONSTANT(0.247766706973999990)*g[6] + CONSTANT(0.246232537174000010)*g[20]; - y[2] += tf*g[12] + tg*f[12]; - y[12] += tf*g[2] + tg*f[2]; + tf = CONSTANT(0.247766706973999990) * f[6] + CONSTANT(0.246232537174000010) * f[20]; + tg = CONSTANT(0.247766706973999990) * g[6] + CONSTANT(0.246232537174000010) * g[20]; + y[2] += tf * g[12] + tg * f[12]; + y[12] += tf * g[2] + tg * f[2]; t = f[2] * g[12] + f[12] * g[2]; - y[6] += CONSTANT(0.247766706973999990)*t; - y[20] += CONSTANT(0.246232537174000010)*t; + y[6] += CONSTANT(0.247766706973999990) * t; + y[20] += CONSTANT(0.246232537174000010) * t; // [2,20]: 30, - tf = CONSTANT(0.245532020560000010)*f[30]; - tg = CONSTANT(0.245532020560000010)*g[30]; - y[2] += tf*g[20] + tg*f[20]; - y[20] += tf*g[2] + tg*f[2]; + tf = CONSTANT(0.245532020560000010) * f[30]; + tg = CONSTANT(0.245532020560000010) * g[30]; + y[2] += tf * g[20] + tg * f[20]; + y[20] += tf * g[2] + tg * f[2]; t = f[2] * g[20] + f[20] * g[2]; - y[30] += CONSTANT(0.245532020560000010)*t; + y[30] += CONSTANT(0.245532020560000010) * t; // [3,3]: 0,6,8, - tf = CONSTANT(0.282094791773000010)*f[0] + CONSTANT(-0.126156626101000010)*f[6] + CONSTANT(0.218509686119999990)*f[8]; - tg = CONSTANT(0.282094791773000010)*g[0] + CONSTANT(-0.126156626101000010)*g[6] + CONSTANT(0.218509686119999990)*g[8]; - y[3] += tf*g[3] + tg*f[3]; + tf = CONSTANT(0.282094791773000010) * f[0] + CONSTANT(-0.126156626101000010) * f[6] + CONSTANT(0.218509686119999990) * f[8]; + tg = CONSTANT(0.282094791773000010) * g[0] + CONSTANT(-0.126156626101000010) * g[6] + CONSTANT(0.218509686119999990) * g[8]; + y[3] += tf * g[3] + tg * f[3]; t = f[3] * g[3]; - y[0] += CONSTANT(0.282094791773000010)*t; - y[6] += CONSTANT(-0.126156626101000010)*t; - y[8] += CONSTANT(0.218509686119999990)*t; + y[0] += CONSTANT(0.282094791773000010) * t; + y[6] += CONSTANT(-0.126156626101000010) * t; + y[8] += CONSTANT(0.218509686119999990) * t; // [3,7]: 2,12, - tf = CONSTANT(0.218509686118000010)*f[2] + CONSTANT(-0.143048168103000000)*f[12]; - tg = CONSTANT(0.218509686118000010)*g[2] + CONSTANT(-0.143048168103000000)*g[12]; - y[3] += tf*g[7] + tg*f[7]; - y[7] = tf*g[3] + tg*f[3]; - t = f[3] * g[7] + f[7] * g[3]; - y[2] += CONSTANT(0.218509686118000010)*t; - y[12] += CONSTANT(-0.143048168103000000)*t; + tf = CONSTANT(0.218509686118000010) * f[2] + CONSTANT(-0.143048168103000000) * f[12]; + tg = CONSTANT(0.218509686118000010) * g[2] + CONSTANT(-0.143048168103000000) * g[12]; + y[3] += tf * g[7] + tg * f[7]; + y[7] = tf * g[3] + tg * f[3]; + t = f[3] * g[7] + f[7] * g[3]; + y[2] += CONSTANT(0.218509686118000010) * t; + y[12] += CONSTANT(-0.143048168103000000) * t; // [3,13]: 8,6,20,22, - tf = CONSTANT(-0.058399170081799998)*f[8] + CONSTANT(0.202300659402999990)*f[6] + CONSTANT(-0.150786008773000000)*f[20] + CONSTANT(0.168583882836999990)*f[22]; - tg = CONSTANT(-0.058399170081799998)*g[8] + CONSTANT(0.202300659402999990)*g[6] + CONSTANT(-0.150786008773000000)*g[20] + CONSTANT(0.168583882836999990)*g[22]; - y[3] += tf*g[13] + tg*f[13]; - y[13] += tf*g[3] + tg*f[3]; + tf = CONSTANT(-0.058399170081799998) * f[8] + CONSTANT(0.202300659402999990) * f[6] + CONSTANT(-0.150786008773000000) * f[20] + + CONSTANT(0.168583882836999990) * f[22]; + tg = CONSTANT(-0.058399170081799998) * g[8] + CONSTANT(0.202300659402999990) * g[6] + CONSTANT(-0.150786008773000000) * g[20] + + CONSTANT(0.168583882836999990) * g[22]; + y[3] += tf * g[13] + tg * f[13]; + y[13] += tf * g[3] + tg * f[3]; t = f[3] * g[13] + f[13] * g[3]; - y[8] += CONSTANT(-0.058399170081799998)*t; - y[6] += CONSTANT(0.202300659402999990)*t; - y[20] += CONSTANT(-0.150786008773000000)*t; - y[22] += CONSTANT(0.168583882836999990)*t; + y[8] += CONSTANT(-0.058399170081799998) * t; + y[6] += CONSTANT(0.202300659402999990) * t; + y[20] += CONSTANT(-0.150786008773000000) * t; + y[22] += CONSTANT(0.168583882836999990) * t; // [3,16]: 9,25,27, - tf = CONSTANT(0.230329432973999990)*f[9] + CONSTANT(0.232932108051999990)*f[25] + CONSTANT(-0.034723468517399998)*f[27]; - tg = CONSTANT(0.230329432973999990)*g[9] + CONSTANT(0.232932108051999990)*g[25] + CONSTANT(-0.034723468517399998)*g[27]; - y[3] += tf*g[16] + tg*f[16]; - y[16] += tf*g[3] + tg*f[3]; + tf = CONSTANT(0.230329432973999990) * f[9] + CONSTANT(0.232932108051999990) * f[25] + CONSTANT(-0.034723468517399998) * f[27]; + tg = CONSTANT(0.230329432973999990) * g[9] + CONSTANT(0.232932108051999990) * g[25] + CONSTANT(-0.034723468517399998) * g[27]; + y[3] += tf * g[16] + tg * f[16]; + y[16] += tf * g[3] + tg * f[3]; t = f[3] * g[16] + f[16] * g[3]; - y[9] += CONSTANT(0.230329432973999990)*t; - y[25] += CONSTANT(0.232932108051999990)*t; - y[27] += CONSTANT(-0.034723468517399998)*t; + y[9] += CONSTANT(0.230329432973999990) * t; + y[25] += CONSTANT(0.232932108051999990) * t; + y[27] += CONSTANT(-0.034723468517399998) * t; // [3,21]: 12,14,30,32, - tf = CONSTANT(0.194663900273000010)*f[12] + CONSTANT(-0.075393004386399995)*f[14] + CONSTANT(-0.155288072037000010)*f[30] + CONSTANT(0.159122922869999990)*f[32]; - tg = CONSTANT(0.194663900273000010)*g[12] + CONSTANT(-0.075393004386399995)*g[14] + CONSTANT(-0.155288072037000010)*g[30] + CONSTANT(0.159122922869999990)*g[32]; - y[3] += tf*g[21] + tg*f[21]; - y[21] = tf*g[3] + tg*f[3]; - t = f[3] * g[21] + f[21] * g[3]; - y[12] += CONSTANT(0.194663900273000010)*t; - y[14] += CONSTANT(-0.075393004386399995)*t; - y[30] += CONSTANT(-0.155288072037000010)*t; - y[32] += CONSTANT(0.159122922869999990)*t; + tf = CONSTANT(0.194663900273000010) * f[12] + CONSTANT(-0.075393004386399995) * f[14] + CONSTANT(-0.155288072037000010) * f[30] + + CONSTANT(0.159122922869999990) * f[32]; + tg = CONSTANT(0.194663900273000010) * g[12] + CONSTANT(-0.075393004386399995) * g[14] + CONSTANT(-0.155288072037000010) * g[30] + + CONSTANT(0.159122922869999990) * g[32]; + y[3] += tf * g[21] + tg * f[21]; + y[21] = tf * g[3] + tg * f[3]; + t = f[3] * g[21] + f[21] * g[3]; + y[12] += CONSTANT(0.194663900273000010) * t; + y[14] += CONSTANT(-0.075393004386399995) * t; + y[30] += CONSTANT(-0.155288072037000010) * t; + y[32] += CONSTANT(0.159122922869999990) * t; // [3,24]: 15,33,35, - tf = CONSTANT(0.230329432978999990)*f[15] + CONSTANT(-0.034723468517100002)*f[33] + CONSTANT(0.232932108049000000)*f[35]; - tg = CONSTANT(0.230329432978999990)*g[15] + CONSTANT(-0.034723468517100002)*g[33] + CONSTANT(0.232932108049000000)*g[35]; - y[3] += tf*g[24] + tg*f[24]; - y[24] += tf*g[3] + tg*f[3]; + tf = CONSTANT(0.230329432978999990) * f[15] + CONSTANT(-0.034723468517100002) * f[33] + CONSTANT(0.232932108049000000) * f[35]; + tg = CONSTANT(0.230329432978999990) * g[15] + CONSTANT(-0.034723468517100002) * g[33] + CONSTANT(0.232932108049000000) * g[35]; + y[3] += tf * g[24] + tg * f[24]; + y[24] += tf * g[3] + tg * f[3]; t = f[3] * g[24] + f[24] * g[3]; - y[15] += CONSTANT(0.230329432978999990)*t; - y[33] += CONSTANT(-0.034723468517100002)*t; - y[35] += CONSTANT(0.232932108049000000)*t; + y[15] += CONSTANT(0.230329432978999990) * t; + y[33] += CONSTANT(-0.034723468517100002) * t; + y[35] += CONSTANT(0.232932108049000000) * t; // [3,31]: 20,22, - tf = CONSTANT(0.190188269815000010)*f[20] + CONSTANT(-0.085054779965999999)*f[22]; - tg = CONSTANT(0.190188269815000010)*g[20] + CONSTANT(-0.085054779965999999)*g[22]; - y[3] += tf*g[31] + tg*f[31]; - y[31] += tf*g[3] + tg*f[3]; + tf = CONSTANT(0.190188269815000010) * f[20] + CONSTANT(-0.085054779965999999) * f[22]; + tg = CONSTANT(0.190188269815000010) * g[20] + CONSTANT(-0.085054779965999999) * g[22]; + y[3] += tf * g[31] + tg * f[31]; + y[31] += tf * g[3] + tg * f[3]; t = f[3] * g[31] + f[31] * g[3]; - y[20] += CONSTANT(0.190188269815000010)*t; - y[22] += CONSTANT(-0.085054779965999999)*t; + y[20] += CONSTANT(0.190188269815000010) * t; + y[22] += CONSTANT(-0.085054779965999999) * t; // [4,4]: 0,6,20,24, - tf = CONSTANT(0.282094791770000020)*f[0] + CONSTANT(-0.180223751576000010)*f[6] + CONSTANT(0.040299255967500003)*f[20] + CONSTANT(-0.238413613505999990)*f[24]; - tg = CONSTANT(0.282094791770000020)*g[0] + CONSTANT(-0.180223751576000010)*g[6] + CONSTANT(0.040299255967500003)*g[20] + CONSTANT(-0.238413613505999990)*g[24]; - y[4] += tf*g[4] + tg*f[4]; + tf = CONSTANT(0.282094791770000020) * f[0] + CONSTANT(-0.180223751576000010) * f[6] + CONSTANT(0.040299255967500003) * f[20] + + CONSTANT(-0.238413613505999990) * f[24]; + tg = CONSTANT(0.282094791770000020) * g[0] + CONSTANT(-0.180223751576000010) * g[6] + CONSTANT(0.040299255967500003) * g[20] + + CONSTANT(-0.238413613505999990) * g[24]; + y[4] += tf * g[4] + tg * f[4]; t = f[4] * g[4]; - y[0] += CONSTANT(0.282094791770000020)*t; - y[6] += CONSTANT(-0.180223751576000010)*t; - y[20] += CONSTANT(0.040299255967500003)*t; - y[24] += CONSTANT(-0.238413613505999990)*t; + y[0] += CONSTANT(0.282094791770000020) * t; + y[6] += CONSTANT(-0.180223751576000010) * t; + y[20] += CONSTANT(0.040299255967500003) * t; + y[24] += CONSTANT(-0.238413613505999990) * t; // [4,5]: 7,21,23, - tf = CONSTANT(0.156078347226000000)*f[7] + CONSTANT(-0.063718718434399996)*f[21] + CONSTANT(-0.168583882835000000)*f[23]; - tg = CONSTANT(0.156078347226000000)*g[7] + CONSTANT(-0.063718718434399996)*g[21] + CONSTANT(-0.168583882835000000)*g[23]; - y[4] += tf*g[5] + tg*f[5]; - y[5] += tf*g[4] + tg*f[4]; + tf = CONSTANT(0.156078347226000000) * f[7] + CONSTANT(-0.063718718434399996) * f[21] + CONSTANT(-0.168583882835000000) * f[23]; + tg = CONSTANT(0.156078347226000000) * g[7] + CONSTANT(-0.063718718434399996) * g[21] + CONSTANT(-0.168583882835000000) * g[23]; + y[4] += tf * g[5] + tg * f[5]; + y[5] += tf * g[4] + tg * f[4]; t = f[4] * g[5] + f[5] * g[4]; - y[7] += CONSTANT(0.156078347226000000)*t; - y[21] += CONSTANT(-0.063718718434399996)*t; - y[23] = CONSTANT(-0.168583882835000000)*t; + y[7] += CONSTANT(0.156078347226000000) * t; + y[21] += CONSTANT(-0.063718718434399996) * t; + y[23] = CONSTANT(-0.168583882835000000) * t; // [4,9]: 3,13,31,35, - tf = CONSTANT(0.226179013157999990)*f[3] + CONSTANT(-0.094031597258400004)*f[13] + CONSTANT(0.016943317729299998)*f[31] + CONSTANT(-0.245532000542000000)*f[35]; - tg = CONSTANT(0.226179013157999990)*g[3] + CONSTANT(-0.094031597258400004)*g[13] + CONSTANT(0.016943317729299998)*g[31] + CONSTANT(-0.245532000542000000)*g[35]; - y[4] += tf*g[9] + tg*f[9]; - y[9] += tf*g[4] + tg*f[4]; + tf = CONSTANT(0.226179013157999990) * f[3] + CONSTANT(-0.094031597258400004) * f[13] + CONSTANT(0.016943317729299998) * f[31] + + CONSTANT(-0.245532000542000000) * f[35]; + tg = CONSTANT(0.226179013157999990) * g[3] + CONSTANT(-0.094031597258400004) * g[13] + CONSTANT(0.016943317729299998) * g[31] + + CONSTANT(-0.245532000542000000) * g[35]; + y[4] += tf * g[9] + tg * f[9]; + y[9] += tf * g[4] + tg * f[4]; t = f[4] * g[9] + f[9] * g[4]; - y[3] += CONSTANT(0.226179013157999990)*t; - y[13] += CONSTANT(-0.094031597258400004)*t; - y[31] += CONSTANT(0.016943317729299998)*t; - y[35] += CONSTANT(-0.245532000542000000)*t; + y[3] += CONSTANT(0.226179013157999990) * t; + y[13] += CONSTANT(-0.094031597258400004) * t; + y[31] += CONSTANT(0.016943317729299998) * t; + y[35] += CONSTANT(-0.245532000542000000) * t; // [4,10]: 2,12,30,34, - tf = CONSTANT(0.184674390919999990)*f[2] + CONSTANT(-0.188063194517999990)*f[12] + CONSTANT(0.053579475144400000)*f[30] + CONSTANT(-0.190188269816000010)*f[34]; - tg = CONSTANT(0.184674390919999990)*g[2] + CONSTANT(-0.188063194517999990)*g[12] + CONSTANT(0.053579475144400000)*g[30] + CONSTANT(-0.190188269816000010)*g[34]; - y[4] += tf*g[10] + tg*f[10]; - y[10] = tf*g[4] + tg*f[4]; - t = f[4] * g[10] + f[10] * g[4]; - y[2] += CONSTANT(0.184674390919999990)*t; - y[12] += CONSTANT(-0.188063194517999990)*t; - y[30] += CONSTANT(0.053579475144400000)*t; - y[34] = CONSTANT(-0.190188269816000010)*t; + tf = CONSTANT(0.184674390919999990) * f[2] + CONSTANT(-0.188063194517999990) * f[12] + CONSTANT(0.053579475144400000) * f[30] + + CONSTANT(-0.190188269816000010) * f[34]; + tg = CONSTANT(0.184674390919999990) * g[2] + CONSTANT(-0.188063194517999990) * g[12] + CONSTANT(0.053579475144400000) * g[30] + + CONSTANT(-0.190188269816000010) * g[34]; + y[4] += tf * g[10] + tg * f[10]; + y[10] = tf * g[4] + tg * f[4]; + t = f[4] * g[10] + f[10] * g[4]; + y[2] += CONSTANT(0.184674390919999990) * t; + y[12] += CONSTANT(-0.188063194517999990) * t; + y[30] += CONSTANT(0.053579475144400000) * t; + y[34] = CONSTANT(-0.190188269816000010) * t; // [4,11]: 3,13,15,31,33, - tf = CONSTANT(-0.058399170082300000)*f[3] + CONSTANT(0.145673124078000010)*f[13] + CONSTANT(0.094031597258400004)*f[15] + CONSTANT(-0.065621187395699998)*f[31] + CONSTANT(-0.141757966610000010)*f[33]; - tg = CONSTANT(-0.058399170082300000)*g[3] + CONSTANT(0.145673124078000010)*g[13] + CONSTANT(0.094031597258400004)*g[15] + CONSTANT(-0.065621187395699998)*g[31] + CONSTANT(-0.141757966610000010)*g[33]; - y[4] += tf*g[11] + tg*f[11]; - y[11] += tf*g[4] + tg*f[4]; + tf = CONSTANT(-0.058399170082300000) * f[3] + CONSTANT(0.145673124078000010) * f[13] + CONSTANT(0.094031597258400004) * f[15] + + CONSTANT(-0.065621187395699998) * f[31] + CONSTANT(-0.141757966610000010) * f[33]; + tg = CONSTANT(-0.058399170082300000) * g[3] + CONSTANT(0.145673124078000010) * g[13] + CONSTANT(0.094031597258400004) * g[15] + + CONSTANT(-0.065621187395699998) * g[31] + CONSTANT(-0.141757966610000010) * g[33]; + y[4] += tf * g[11] + tg * f[11]; + y[11] += tf * g[4] + tg * f[4]; t = f[4] * g[11] + f[11] * g[4]; - y[3] += CONSTANT(-0.058399170082300000)*t; - y[13] += CONSTANT(0.145673124078000010)*t; - y[15] += CONSTANT(0.094031597258400004)*t; - y[31] += CONSTANT(-0.065621187395699998)*t; - y[33] += CONSTANT(-0.141757966610000010)*t; + y[3] += CONSTANT(-0.058399170082300000) * t; + y[13] += CONSTANT(0.145673124078000010) * t; + y[15] += CONSTANT(0.094031597258400004) * t; + y[31] += CONSTANT(-0.065621187395699998) * t; + y[33] += CONSTANT(-0.141757966610000010) * t; // [4,16]: 8,22, - tf = CONSTANT(0.238413613494000000)*f[8] + CONSTANT(-0.075080816693699995)*f[22]; - tg = CONSTANT(0.238413613494000000)*g[8] + CONSTANT(-0.075080816693699995)*g[22]; - y[4] += tf*g[16] + tg*f[16]; - y[16] += tf*g[4] + tg*f[4]; + tf = CONSTANT(0.238413613494000000) * f[8] + CONSTANT(-0.075080816693699995) * f[22]; + tg = CONSTANT(0.238413613494000000) * g[8] + CONSTANT(-0.075080816693699995) * g[22]; + y[4] += tf * g[16] + tg * f[16]; + y[16] += tf * g[4] + tg * f[4]; t = f[4] * g[16] + f[16] * g[4]; - y[8] += CONSTANT(0.238413613494000000)*t; - y[22] += CONSTANT(-0.075080816693699995)*t; + y[8] += CONSTANT(0.238413613494000000) * t; + y[22] += CONSTANT(-0.075080816693699995) * t; // [4,18]: 6,20,24, - tf = CONSTANT(0.156078347226000000)*f[6] + CONSTANT(-0.190364615029000010)*f[20] + CONSTANT(0.075080816691500005)*f[24]; - tg = CONSTANT(0.156078347226000000)*g[6] + CONSTANT(-0.190364615029000010)*g[20] + CONSTANT(0.075080816691500005)*g[24]; - y[4] += tf*g[18] + tg*f[18]; - y[18] += tf*g[4] + tg*f[4]; + tf = CONSTANT(0.156078347226000000) * f[6] + CONSTANT(-0.190364615029000010) * f[20] + CONSTANT(0.075080816691500005) * f[24]; + tg = CONSTANT(0.156078347226000000) * g[6] + CONSTANT(-0.190364615029000010) * g[20] + CONSTANT(0.075080816691500005) * g[24]; + y[4] += tf * g[18] + tg * f[18]; + y[18] += tf * g[4] + tg * f[4]; t = f[4] * g[18] + f[18] * g[4]; - y[6] += CONSTANT(0.156078347226000000)*t; - y[20] += CONSTANT(-0.190364615029000010)*t; - y[24] += CONSTANT(0.075080816691500005)*t; + y[6] += CONSTANT(0.156078347226000000) * t; + y[20] += CONSTANT(-0.190364615029000010) * t; + y[24] += CONSTANT(0.075080816691500005) * t; // [4,19]: 7,21,23, - tf = CONSTANT(-0.063718718434399996)*f[7] + CONSTANT(0.141889406569999990)*f[21] + CONSTANT(0.112621225039000000)*f[23]; - tg = CONSTANT(-0.063718718434399996)*g[7] + CONSTANT(0.141889406569999990)*g[21] + CONSTANT(0.112621225039000000)*g[23]; - y[4] += tf*g[19] + tg*f[19]; - y[19] += tf*g[4] + tg*f[4]; + tf = CONSTANT(-0.063718718434399996) * f[7] + CONSTANT(0.141889406569999990) * f[21] + CONSTANT(0.112621225039000000) * f[23]; + tg = CONSTANT(-0.063718718434399996) * g[7] + CONSTANT(0.141889406569999990) * g[21] + CONSTANT(0.112621225039000000) * g[23]; + y[4] += tf * g[19] + tg * f[19]; + y[19] += tf * g[4] + tg * f[4]; t = f[4] * g[19] + f[19] * g[4]; - y[7] += CONSTANT(-0.063718718434399996)*t; - y[21] += CONSTANT(0.141889406569999990)*t; - y[23] += CONSTANT(0.112621225039000000)*t; + y[7] += CONSTANT(-0.063718718434399996) * t; + y[21] += CONSTANT(0.141889406569999990) * t; + y[23] += CONSTANT(0.112621225039000000) * t; // [4,25]: 15,33, - tf = CONSTANT(0.245532000542000000)*f[15] + CONSTANT(-0.062641347680800000)*f[33]; - tg = CONSTANT(0.245532000542000000)*g[15] + CONSTANT(-0.062641347680800000)*g[33]; - y[4] += tf*g[25] + tg*f[25]; - y[25] += tf*g[4] + tg*f[4]; + tf = CONSTANT(0.245532000542000000) * f[15] + CONSTANT(-0.062641347680800000) * f[33]; + tg = CONSTANT(0.245532000542000000) * g[15] + CONSTANT(-0.062641347680800000) * g[33]; + y[4] += tf * g[25] + tg * f[25]; + y[25] += tf * g[4] + tg * f[4]; t = f[4] * g[25] + f[25] * g[4]; - y[15] += CONSTANT(0.245532000542000000)*t; - y[33] += CONSTANT(-0.062641347680800000)*t; + y[15] += CONSTANT(0.245532000542000000) * t; + y[33] += CONSTANT(-0.062641347680800000) * t; // [4,26]: 14,32, - tf = CONSTANT(0.190188269806999990)*f[14] + CONSTANT(-0.097043558542400002)*f[32]; - tg = CONSTANT(0.190188269806999990)*g[14] + CONSTANT(-0.097043558542400002)*g[32]; - y[4] += tf*g[26] + tg*f[26]; - y[26] = tf*g[4] + tg*f[4]; - t = f[4] * g[26] + f[26] * g[4]; - y[14] += CONSTANT(0.190188269806999990)*t; - y[32] += CONSTANT(-0.097043558542400002)*t; + tf = CONSTANT(0.190188269806999990) * f[14] + CONSTANT(-0.097043558542400002) * f[32]; + tg = CONSTANT(0.190188269806999990) * g[14] + CONSTANT(-0.097043558542400002) * g[32]; + y[4] += tf * g[26] + tg * f[26]; + y[26] = tf * g[4] + tg * f[4]; + t = f[4] * g[26] + f[26] * g[4]; + y[14] += CONSTANT(0.190188269806999990) * t; + y[32] += CONSTANT(-0.097043558542400002) * t; // [4,27]: 13,31,35, - tf = CONSTANT(0.141757966610000010)*f[13] + CONSTANT(-0.121034582549000000)*f[31] + CONSTANT(0.062641347680800000)*f[35]; - tg = CONSTANT(0.141757966610000010)*g[13] + CONSTANT(-0.121034582549000000)*g[31] + CONSTANT(0.062641347680800000)*g[35]; - y[4] += tf*g[27] + tg*f[27]; - y[27] += tf*g[4] + tg*f[4]; + tf = CONSTANT(0.141757966610000010) * f[13] + CONSTANT(-0.121034582549000000) * f[31] + CONSTANT(0.062641347680800000) * f[35]; + tg = CONSTANT(0.141757966610000010) * g[13] + CONSTANT(-0.121034582549000000) * g[31] + CONSTANT(0.062641347680800000) * g[35]; + y[4] += tf * g[27] + tg * f[27]; + y[27] += tf * g[4] + tg * f[4]; t = f[4] * g[27] + f[27] * g[4]; - y[13] += CONSTANT(0.141757966610000010)*t; - y[31] += CONSTANT(-0.121034582549000000)*t; - y[35] += CONSTANT(0.062641347680800000)*t; + y[13] += CONSTANT(0.141757966610000010) * t; + y[31] += CONSTANT(-0.121034582549000000) * t; + y[35] += CONSTANT(0.062641347680800000) * t; // [4,28]: 12,30,34, - tf = CONSTANT(0.141757966609000000)*f[12] + CONSTANT(-0.191372478254000000)*f[30] + CONSTANT(0.097043558538899996)*f[34]; - tg = CONSTANT(0.141757966609000000)*g[12] + CONSTANT(-0.191372478254000000)*g[30] + CONSTANT(0.097043558538899996)*g[34]; - y[4] += tf*g[28] + tg*f[28]; - y[28] = tf*g[4] + tg*f[4]; - t = f[4] * g[28] + f[28] * g[4]; - y[12] += CONSTANT(0.141757966609000000)*t; - y[30] += CONSTANT(-0.191372478254000000)*t; - y[34] += CONSTANT(0.097043558538899996)*t; + tf = CONSTANT(0.141757966609000000) * f[12] + CONSTANT(-0.191372478254000000) * f[30] + CONSTANT(0.097043558538899996) * f[34]; + tg = CONSTANT(0.141757966609000000) * g[12] + CONSTANT(-0.191372478254000000) * g[30] + CONSTANT(0.097043558538899996) * g[34]; + y[4] += tf * g[28] + tg * f[28]; + y[28] = tf * g[4] + tg * f[4]; + t = f[4] * g[28] + f[28] * g[4]; + y[12] += CONSTANT(0.141757966609000000) * t; + y[30] += CONSTANT(-0.191372478254000000) * t; + y[34] += CONSTANT(0.097043558538899996) * t; // [4,29]: 13,15,31,33, - tf = CONSTANT(-0.065621187395699998)*f[13] + CONSTANT(-0.016943317729299998)*f[15] + CONSTANT(0.140070311613999990)*f[31] + CONSTANT(0.121034582549000000)*f[33]; - tg = CONSTANT(-0.065621187395699998)*g[13] + CONSTANT(-0.016943317729299998)*g[15] + CONSTANT(0.140070311613999990)*g[31] + CONSTANT(0.121034582549000000)*g[33]; - y[4] += tf*g[29] + tg*f[29]; - y[29] += tf*g[4] + tg*f[4]; + tf = CONSTANT(-0.065621187395699998) * f[13] + CONSTANT(-0.016943317729299998) * f[15] + CONSTANT(0.140070311613999990) * f[31] + + CONSTANT(0.121034582549000000) * f[33]; + tg = CONSTANT(-0.065621187395699998) * g[13] + CONSTANT(-0.016943317729299998) * g[15] + CONSTANT(0.140070311613999990) * g[31] + + CONSTANT(0.121034582549000000) * g[33]; + y[4] += tf * g[29] + tg * f[29]; + y[29] += tf * g[4] + tg * f[4]; t = f[4] * g[29] + f[29] * g[4]; - y[13] += CONSTANT(-0.065621187395699998)*t; - y[15] += CONSTANT(-0.016943317729299998)*t; - y[31] += CONSTANT(0.140070311613999990)*t; - y[33] += CONSTANT(0.121034582549000000)*t; + y[13] += CONSTANT(-0.065621187395699998) * t; + y[15] += CONSTANT(-0.016943317729299998) * t; + y[31] += CONSTANT(0.140070311613999990) * t; + y[33] += CONSTANT(0.121034582549000000) * t; // [5,5]: 0,6,8,20,22, - tf = CONSTANT(0.282094791773999990)*f[0] + CONSTANT(0.090111875786499998)*f[6] + CONSTANT(-0.156078347227999990)*f[8] + CONSTANT(-0.161197023870999990)*f[20] + CONSTANT(-0.180223751574000000)*f[22]; - tg = CONSTANT(0.282094791773999990)*g[0] + CONSTANT(0.090111875786499998)*g[6] + CONSTANT(-0.156078347227999990)*g[8] + CONSTANT(-0.161197023870999990)*g[20] + CONSTANT(-0.180223751574000000)*g[22]; - y[5] += tf*g[5] + tg*f[5]; + tf = CONSTANT(0.282094791773999990) * f[0] + CONSTANT(0.090111875786499998) * f[6] + CONSTANT(-0.156078347227999990) * f[8] + + CONSTANT(-0.161197023870999990) * f[20] + CONSTANT(-0.180223751574000000) * f[22]; + tg = CONSTANT(0.282094791773999990) * g[0] + CONSTANT(0.090111875786499998) * g[6] + CONSTANT(-0.156078347227999990) * g[8] + + CONSTANT(-0.161197023870999990) * g[20] + CONSTANT(-0.180223751574000000) * g[22]; + y[5] += tf * g[5] + tg * f[5]; t = f[5] * g[5]; - y[0] += CONSTANT(0.282094791773999990)*t; - y[6] += CONSTANT(0.090111875786499998)*t; - y[8] += CONSTANT(-0.156078347227999990)*t; - y[20] += CONSTANT(-0.161197023870999990)*t; - y[22] += CONSTANT(-0.180223751574000000)*t; + y[0] += CONSTANT(0.282094791773999990) * t; + y[6] += CONSTANT(0.090111875786499998) * t; + y[8] += CONSTANT(-0.156078347227999990) * t; + y[20] += CONSTANT(-0.161197023870999990) * t; + y[22] += CONSTANT(-0.180223751574000000) * t; // [5,10]: 3,13,15,31,33, - tf = CONSTANT(0.184674390919999990)*f[3] + CONSTANT(0.115164716490000000)*f[13] + CONSTANT(-0.148677009678999990)*f[15] + CONSTANT(-0.083004965974099995)*f[31] + CONSTANT(-0.179311220383999990)*f[33]; - tg = CONSTANT(0.184674390919999990)*g[3] + CONSTANT(0.115164716490000000)*g[13] + CONSTANT(-0.148677009678999990)*g[15] + CONSTANT(-0.083004965974099995)*g[31] + CONSTANT(-0.179311220383999990)*g[33]; - y[5] += tf*g[10] + tg*f[10]; - y[10] += tf*g[5] + tg*f[5]; + tf = CONSTANT(0.184674390919999990) * f[3] + CONSTANT(0.115164716490000000) * f[13] + CONSTANT(-0.148677009678999990) * f[15] + + CONSTANT(-0.083004965974099995) * f[31] + CONSTANT(-0.179311220383999990) * f[33]; + tg = CONSTANT(0.184674390919999990) * g[3] + CONSTANT(0.115164716490000000) * g[13] + CONSTANT(-0.148677009678999990) * g[15] + + CONSTANT(-0.083004965974099995) * g[31] + CONSTANT(-0.179311220383999990) * g[33]; + y[5] += tf * g[10] + tg * f[10]; + y[10] += tf * g[5] + tg * f[5]; t = f[5] * g[10] + f[10] * g[5]; - y[3] += CONSTANT(0.184674390919999990)*t; - y[13] += CONSTANT(0.115164716490000000)*t; - y[15] += CONSTANT(-0.148677009678999990)*t; - y[31] += CONSTANT(-0.083004965974099995)*t; - y[33] += CONSTANT(-0.179311220383999990)*t; + y[3] += CONSTANT(0.184674390919999990) * t; + y[13] += CONSTANT(0.115164716490000000) * t; + y[15] += CONSTANT(-0.148677009678999990) * t; + y[31] += CONSTANT(-0.083004965974099995) * t; + y[33] += CONSTANT(-0.179311220383999990) * t; // [5,11]: 2,12,14,30,32, - tf = CONSTANT(0.233596680327000010)*f[2] + CONSTANT(0.059470803871800003)*f[12] + CONSTANT(-0.115164716491000000)*f[14] + CONSTANT(-0.169433177294000010)*f[30] + CONSTANT(-0.173617342585000000)*f[32]; - tg = CONSTANT(0.233596680327000010)*g[2] + CONSTANT(0.059470803871800003)*g[12] + CONSTANT(-0.115164716491000000)*g[14] + CONSTANT(-0.169433177294000010)*g[30] + CONSTANT(-0.173617342585000000)*g[32]; - y[5] += tf*g[11] + tg*f[11]; - y[11] += tf*g[5] + tg*f[5]; + tf = CONSTANT(0.233596680327000010) * f[2] + CONSTANT(0.059470803871800003) * f[12] + CONSTANT(-0.115164716491000000) * f[14] + + CONSTANT(-0.169433177294000010) * f[30] + CONSTANT(-0.173617342585000000) * f[32]; + tg = CONSTANT(0.233596680327000010) * g[2] + CONSTANT(0.059470803871800003) * g[12] + CONSTANT(-0.115164716491000000) * g[14] + + CONSTANT(-0.169433177294000010) * g[30] + CONSTANT(-0.173617342585000000) * g[32]; + y[5] += tf * g[11] + tg * f[11]; + y[11] += tf * g[5] + tg * f[5]; t = f[5] * g[11] + f[11] * g[5]; - y[2] += CONSTANT(0.233596680327000010)*t; - y[12] += CONSTANT(0.059470803871800003)*t; - y[14] += CONSTANT(-0.115164716491000000)*t; - y[30] += CONSTANT(-0.169433177294000010)*t; - y[32] += CONSTANT(-0.173617342585000000)*t; + y[2] += CONSTANT(0.233596680327000010) * t; + y[12] += CONSTANT(0.059470803871800003) * t; + y[14] += CONSTANT(-0.115164716491000000) * t; + y[30] += CONSTANT(-0.169433177294000010) * t; + y[32] += CONSTANT(-0.173617342585000000) * t; // [5,14]: 9,1,27,29, - tf = CONSTANT(0.148677009677999990)*f[9] + CONSTANT(-0.184674390923000000)*f[1] + CONSTANT(0.179311220382000010)*f[27] + CONSTANT(0.083004965973399999)*f[29]; - tg = CONSTANT(0.148677009677999990)*g[9] + CONSTANT(-0.184674390923000000)*g[1] + CONSTANT(0.179311220382000010)*g[27] + CONSTANT(0.083004965973399999)*g[29]; - y[5] += tf*g[14] + tg*f[14]; - y[14] += tf*g[5] + tg*f[5]; + tf = CONSTANT(0.148677009677999990) * f[9] + CONSTANT(-0.184674390923000000) * f[1] + CONSTANT(0.179311220382000010) * f[27] + + CONSTANT(0.083004965973399999) * f[29]; + tg = CONSTANT(0.148677009677999990) * g[9] + CONSTANT(-0.184674390923000000) * g[1] + CONSTANT(0.179311220382000010) * g[27] + + CONSTANT(0.083004965973399999) * g[29]; + y[5] += tf * g[14] + tg * f[14]; + y[14] += tf * g[5] + tg * f[5]; t = f[5] * g[14] + f[14] * g[5]; - y[9] += CONSTANT(0.148677009677999990)*t; - y[1] += CONSTANT(-0.184674390923000000)*t; - y[27] += CONSTANT(0.179311220382000010)*t; - y[29] += CONSTANT(0.083004965973399999)*t; + y[9] += CONSTANT(0.148677009677999990) * t; + y[1] += CONSTANT(-0.184674390923000000) * t; + y[27] += CONSTANT(0.179311220382000010) * t; + y[29] += CONSTANT(0.083004965973399999) * t; // [5,17]: 8,22,24, - tf = CONSTANT(0.168583882832999990)*f[8] + CONSTANT(0.132725386548000010)*f[22] + CONSTANT(-0.140463346189000000)*f[24]; - tg = CONSTANT(0.168583882832999990)*g[8] + CONSTANT(0.132725386548000010)*g[22] + CONSTANT(-0.140463346189000000)*g[24]; - y[5] += tf*g[17] + tg*f[17]; - y[17] = tf*g[5] + tg*f[5]; - t = f[5] * g[17] + f[17] * g[5]; - y[8] += CONSTANT(0.168583882832999990)*t; - y[22] += CONSTANT(0.132725386548000010)*t; - y[24] += CONSTANT(-0.140463346189000000)*t; + tf = CONSTANT(0.168583882832999990) * f[8] + CONSTANT(0.132725386548000010) * f[22] + CONSTANT(-0.140463346189000000) * f[24]; + tg = CONSTANT(0.168583882832999990) * g[8] + CONSTANT(0.132725386548000010) * g[22] + CONSTANT(-0.140463346189000000) * g[24]; + y[5] += tf * g[17] + tg * f[17]; + y[17] = tf * g[5] + tg * f[5]; + t = f[5] * g[17] + f[17] * g[5]; + y[8] += CONSTANT(0.168583882832999990) * t; + y[22] += CONSTANT(0.132725386548000010) * t; + y[24] += CONSTANT(-0.140463346189000000) * t; // [5,18]: 7,21,23, - tf = CONSTANT(0.180223751571000010)*f[7] + CONSTANT(0.090297865407399994)*f[21] + CONSTANT(-0.132725386549000010)*f[23]; - tg = CONSTANT(0.180223751571000010)*g[7] + CONSTANT(0.090297865407399994)*g[21] + CONSTANT(-0.132725386549000010)*g[23]; - y[5] += tf*g[18] + tg*f[18]; - y[18] += tf*g[5] + tg*f[5]; + tf = CONSTANT(0.180223751571000010) * f[7] + CONSTANT(0.090297865407399994) * f[21] + CONSTANT(-0.132725386549000010) * f[23]; + tg = CONSTANT(0.180223751571000010) * g[7] + CONSTANT(0.090297865407399994) * g[21] + CONSTANT(-0.132725386549000010) * g[23]; + y[5] += tf * g[18] + tg * f[18]; + y[18] += tf * g[5] + tg * f[5]; t = f[5] * g[18] + f[18] * g[5]; - y[7] += CONSTANT(0.180223751571000010)*t; - y[21] += CONSTANT(0.090297865407399994)*t; - y[23] += CONSTANT(-0.132725386549000010)*t; + y[7] += CONSTANT(0.180223751571000010) * t; + y[21] += CONSTANT(0.090297865407399994) * t; + y[23] += CONSTANT(-0.132725386549000010) * t; // [5,19]: 6,8,20,22, - tf = CONSTANT(0.220728115440999990)*f[6] + CONSTANT(0.063718718433900007)*f[8] + CONSTANT(0.044869370061299998)*f[20] + CONSTANT(-0.090297865408399999)*f[22]; - tg = CONSTANT(0.220728115440999990)*g[6] + CONSTANT(0.063718718433900007)*g[8] + CONSTANT(0.044869370061299998)*g[20] + CONSTANT(-0.090297865408399999)*g[22]; - y[5] += tf*g[19] + tg*f[19]; - y[19] += tf*g[5] + tg*f[5]; + tf = CONSTANT(0.220728115440999990) * f[6] + CONSTANT(0.063718718433900007) * f[8] + CONSTANT(0.044869370061299998) * f[20] + + CONSTANT(-0.090297865408399999) * f[22]; + tg = CONSTANT(0.220728115440999990) * g[6] + CONSTANT(0.063718718433900007) * g[8] + CONSTANT(0.044869370061299998) * g[20] + + CONSTANT(-0.090297865408399999) * g[22]; + y[5] += tf * g[19] + tg * f[19]; + y[19] += tf * g[5] + tg * f[5]; t = f[5] * g[19] + f[19] * g[5]; - y[6] += CONSTANT(0.220728115440999990)*t; - y[8] += CONSTANT(0.063718718433900007)*t; - y[20] += CONSTANT(0.044869370061299998)*t; - y[22] += CONSTANT(-0.090297865408399999)*t; + y[6] += CONSTANT(0.220728115440999990) * t; + y[8] += CONSTANT(0.063718718433900007) * t; + y[20] += CONSTANT(0.044869370061299998) * t; + y[22] += CONSTANT(-0.090297865408399999) * t; // [5,26]: 15,33,35, - tf = CONSTANT(0.155288072035000000)*f[15] + CONSTANT(0.138662534056999990)*f[33] + CONSTANT(-0.132882365179999990)*f[35]; - tg = CONSTANT(0.155288072035000000)*g[15] + CONSTANT(0.138662534056999990)*g[33] + CONSTANT(-0.132882365179999990)*g[35]; - y[5] += tf*g[26] + tg*f[26]; - y[26] += tf*g[5] + tg*f[5]; + tf = CONSTANT(0.155288072035000000) * f[15] + CONSTANT(0.138662534056999990) * f[33] + CONSTANT(-0.132882365179999990) * f[35]; + tg = CONSTANT(0.155288072035000000) * g[15] + CONSTANT(0.138662534056999990) * g[33] + CONSTANT(-0.132882365179999990) * g[35]; + y[5] += tf * g[26] + tg * f[26]; + y[26] += tf * g[5] + tg * f[5]; t = f[5] * g[26] + f[26] * g[5]; - y[15] += CONSTANT(0.155288072035000000)*t; - y[33] += CONSTANT(0.138662534056999990)*t; - y[35] += CONSTANT(-0.132882365179999990)*t; + y[15] += CONSTANT(0.155288072035000000) * t; + y[33] += CONSTANT(0.138662534056999990) * t; + y[35] += CONSTANT(-0.132882365179999990) * t; // [5,28]: 15,13,31,33, - tf = CONSTANT(0.044827805096399997)*f[15] + CONSTANT(0.173617342584000000)*f[13] + CONSTANT(0.074118242118699995)*f[31] + CONSTANT(-0.114366930522000000)*f[33]; - tg = CONSTANT(0.044827805096399997)*g[15] + CONSTANT(0.173617342584000000)*g[13] + CONSTANT(0.074118242118699995)*g[31] + CONSTANT(-0.114366930522000000)*g[33]; - y[5] += tf*g[28] + tg*f[28]; - y[28] += tf*g[5] + tg*f[5]; + tf = CONSTANT(0.044827805096399997) * f[15] + CONSTANT(0.173617342584000000) * f[13] + CONSTANT(0.074118242118699995) * f[31] + + CONSTANT(-0.114366930522000000) * f[33]; + tg = CONSTANT(0.044827805096399997) * g[15] + CONSTANT(0.173617342584000000) * g[13] + CONSTANT(0.074118242118699995) * g[31] + + CONSTANT(-0.114366930522000000) * g[33]; + y[5] += tf * g[28] + tg * f[28]; + y[28] += tf * g[5] + tg * f[5]; t = f[5] * g[28] + f[28] * g[5]; - y[15] += CONSTANT(0.044827805096399997)*t; - y[13] += CONSTANT(0.173617342584000000)*t; - y[31] += CONSTANT(0.074118242118699995)*t; - y[33] += CONSTANT(-0.114366930522000000)*t; + y[15] += CONSTANT(0.044827805096399997) * t; + y[13] += CONSTANT(0.173617342584000000) * t; + y[31] += CONSTANT(0.074118242118699995) * t; + y[33] += CONSTANT(-0.114366930522000000) * t; // [5,29]: 12,30,32, - tf = CONSTANT(0.214317900578999990)*f[12] + CONSTANT(0.036165998945399999)*f[30] + CONSTANT(-0.074118242119099995)*f[32]; - tg = CONSTANT(0.214317900578999990)*g[12] + CONSTANT(0.036165998945399999)*g[30] + CONSTANT(-0.074118242119099995)*g[32]; - y[5] += tf*g[29] + tg*f[29]; - y[29] += tf*g[5] + tg*f[5]; + tf = CONSTANT(0.214317900578999990) * f[12] + CONSTANT(0.036165998945399999) * f[30] + CONSTANT(-0.074118242119099995) * f[32]; + tg = CONSTANT(0.214317900578999990) * g[12] + CONSTANT(0.036165998945399999) * g[30] + CONSTANT(-0.074118242119099995) * g[32]; + y[5] += tf * g[29] + tg * f[29]; + y[29] += tf * g[5] + tg * f[5]; t = f[5] * g[29] + f[29] * g[5]; - y[12] += CONSTANT(0.214317900578999990)*t; - y[30] += CONSTANT(0.036165998945399999)*t; - y[32] += CONSTANT(-0.074118242119099995)*t; + y[12] += CONSTANT(0.214317900578999990) * t; + y[30] += CONSTANT(0.036165998945399999) * t; + y[32] += CONSTANT(-0.074118242119099995) * t; // [5,32]: 9,27, - tf = CONSTANT(-0.044827805096799997)*f[9] + CONSTANT(0.114366930522000000)*f[27]; - tg = CONSTANT(-0.044827805096799997)*g[9] + CONSTANT(0.114366930522000000)*g[27]; - y[5] += tf*g[32] + tg*f[32]; - y[32] += tf*g[5] + tg*f[5]; + tf = CONSTANT(-0.044827805096799997) * f[9] + CONSTANT(0.114366930522000000) * f[27]; + tg = CONSTANT(-0.044827805096799997) * g[9] + CONSTANT(0.114366930522000000) * g[27]; + y[5] += tf * g[32] + tg * f[32]; + y[32] += tf * g[5] + tg * f[5]; t = f[5] * g[32] + f[32] * g[5]; - y[9] += CONSTANT(-0.044827805096799997)*t; - y[27] += CONSTANT(0.114366930522000000)*t; + y[9] += CONSTANT(-0.044827805096799997) * t; + y[27] += CONSTANT(0.114366930522000000) * t; // [5,34]: 9,27,25, - tf = CONSTANT(-0.155288072036000010)*f[9] + CONSTANT(-0.138662534059000000)*f[27] + CONSTANT(0.132882365179000010)*f[25]; - tg = CONSTANT(-0.155288072036000010)*g[9] + CONSTANT(-0.138662534059000000)*g[27] + CONSTANT(0.132882365179000010)*g[25]; - y[5] += tf*g[34] + tg*f[34]; - y[34] += tf*g[5] + tg*f[5]; + tf = CONSTANT(-0.155288072036000010) * f[9] + CONSTANT(-0.138662534059000000) * f[27] + CONSTANT(0.132882365179000010) * f[25]; + tg = CONSTANT(-0.155288072036000010) * g[9] + CONSTANT(-0.138662534059000000) * g[27] + CONSTANT(0.132882365179000010) * g[25]; + y[5] += tf * g[34] + tg * f[34]; + y[34] += tf * g[5] + tg * f[5]; t = f[5] * g[34] + f[34] * g[5]; - y[9] += CONSTANT(-0.155288072036000010)*t; - y[27] += CONSTANT(-0.138662534059000000)*t; - y[25] += CONSTANT(0.132882365179000010)*t; + y[9] += CONSTANT(-0.155288072036000010) * t; + y[27] += CONSTANT(-0.138662534059000000) * t; + y[25] += CONSTANT(0.132882365179000010) * t; // [6,6]: 0,6,20, - tf = CONSTANT(0.282094797560000000)*f[0] + CONSTANT(0.241795553185999990)*f[20]; - tg = CONSTANT(0.282094797560000000)*g[0] + CONSTANT(0.241795553185999990)*g[20]; - y[6] += tf*g[6] + tg*f[6]; + tf = CONSTANT(0.282094797560000000) * f[0] + CONSTANT(0.241795553185999990) * f[20]; + tg = CONSTANT(0.282094797560000000) * g[0] + CONSTANT(0.241795553185999990) * g[20]; + y[6] += tf * g[6] + tg * f[6]; t = f[6] * g[6]; - y[0] += CONSTANT(0.282094797560000000)*t; - y[6] += CONSTANT(0.180223764527000010)*t; - y[20] += CONSTANT(0.241795553185999990)*t; + y[0] += CONSTANT(0.282094797560000000) * t; + y[6] += CONSTANT(0.180223764527000010) * t; + y[20] += CONSTANT(0.241795553185999990) * t; // [7,7]: 6,0,8,20,22, - tf = CONSTANT(0.090111875786499998)*f[6] + CONSTANT(0.282094791773999990)*f[0] + CONSTANT(0.156078347227999990)*f[8] + CONSTANT(-0.161197023870999990)*f[20] + CONSTANT(0.180223751574000000)*f[22]; - tg = CONSTANT(0.090111875786499998)*g[6] + CONSTANT(0.282094791773999990)*g[0] + CONSTANT(0.156078347227999990)*g[8] + CONSTANT(-0.161197023870999990)*g[20] + CONSTANT(0.180223751574000000)*g[22]; - y[7] += tf*g[7] + tg*f[7]; + tf = CONSTANT(0.090111875786499998) * f[6] + CONSTANT(0.282094791773999990) * f[0] + CONSTANT(0.156078347227999990) * f[8] + + CONSTANT(-0.161197023870999990) * f[20] + CONSTANT(0.180223751574000000) * f[22]; + tg = CONSTANT(0.090111875786499998) * g[6] + CONSTANT(0.282094791773999990) * g[0] + CONSTANT(0.156078347227999990) * g[8] + + CONSTANT(-0.161197023870999990) * g[20] + CONSTANT(0.180223751574000000) * g[22]; + y[7] += tf * g[7] + tg * f[7]; t = f[7] * g[7]; - y[6] += CONSTANT(0.090111875786499998)*t; - y[0] += CONSTANT(0.282094791773999990)*t; - y[8] += CONSTANT(0.156078347227999990)*t; - y[20] += CONSTANT(-0.161197023870999990)*t; - y[22] += CONSTANT(0.180223751574000000)*t; + y[6] += CONSTANT(0.090111875786499998) * t; + y[0] += CONSTANT(0.282094791773999990) * t; + y[8] += CONSTANT(0.156078347227999990) * t; + y[20] += CONSTANT(-0.161197023870999990) * t; + y[22] += CONSTANT(0.180223751574000000) * t; // [7,10]: 9,1,11,27,29, - tf = CONSTANT(0.148677009678999990)*f[9] + CONSTANT(0.184674390919999990)*f[1] + CONSTANT(0.115164716490000000)*f[11] + CONSTANT(0.179311220383999990)*f[27] + CONSTANT(-0.083004965974099995)*f[29]; - tg = CONSTANT(0.148677009678999990)*g[9] + CONSTANT(0.184674390919999990)*g[1] + CONSTANT(0.115164716490000000)*g[11] + CONSTANT(0.179311220383999990)*g[27] + CONSTANT(-0.083004965974099995)*g[29]; - y[7] += tf*g[10] + tg*f[10]; - y[10] += tf*g[7] + tg*f[7]; + tf = CONSTANT(0.148677009678999990) * f[9] + CONSTANT(0.184674390919999990) * f[1] + CONSTANT(0.115164716490000000) * f[11] + + CONSTANT(0.179311220383999990) * f[27] + CONSTANT(-0.083004965974099995) * f[29]; + tg = CONSTANT(0.148677009678999990) * g[9] + CONSTANT(0.184674390919999990) * g[1] + CONSTANT(0.115164716490000000) * g[11] + + CONSTANT(0.179311220383999990) * g[27] + CONSTANT(-0.083004965974099995) * g[29]; + y[7] += tf * g[10] + tg * f[10]; + y[10] += tf * g[7] + tg * f[7]; t = f[7] * g[10] + f[10] * g[7]; - y[9] += CONSTANT(0.148677009678999990)*t; - y[1] += CONSTANT(0.184674390919999990)*t; - y[11] += CONSTANT(0.115164716490000000)*t; - y[27] += CONSTANT(0.179311220383999990)*t; - y[29] += CONSTANT(-0.083004965974099995)*t; + y[9] += CONSTANT(0.148677009678999990) * t; + y[1] += CONSTANT(0.184674390919999990) * t; + y[11] += CONSTANT(0.115164716490000000) * t; + y[27] += CONSTANT(0.179311220383999990) * t; + y[29] += CONSTANT(-0.083004965974099995) * t; // [7,13]: 12,2,14,30,32, - tf = CONSTANT(0.059470803871800003)*f[12] + CONSTANT(0.233596680327000010)*f[2] + CONSTANT(0.115164716491000000)*f[14] + CONSTANT(-0.169433177294000010)*f[30] + CONSTANT(0.173617342585000000)*f[32]; - tg = CONSTANT(0.059470803871800003)*g[12] + CONSTANT(0.233596680327000010)*g[2] + CONSTANT(0.115164716491000000)*g[14] + CONSTANT(-0.169433177294000010)*g[30] + CONSTANT(0.173617342585000000)*g[32]; - y[7] += tf*g[13] + tg*f[13]; - y[13] += tf*g[7] + tg*f[7]; + tf = CONSTANT(0.059470803871800003) * f[12] + CONSTANT(0.233596680327000010) * f[2] + CONSTANT(0.115164716491000000) * f[14] + + CONSTANT(-0.169433177294000010) * f[30] + CONSTANT(0.173617342585000000) * f[32]; + tg = CONSTANT(0.059470803871800003) * g[12] + CONSTANT(0.233596680327000010) * g[2] + CONSTANT(0.115164716491000000) * g[14] + + CONSTANT(-0.169433177294000010) * g[30] + CONSTANT(0.173617342585000000) * g[32]; + y[7] += tf * g[13] + tg * f[13]; + y[13] += tf * g[7] + tg * f[7]; t = f[7] * g[13] + f[13] * g[7]; - y[12] += CONSTANT(0.059470803871800003)*t; - y[2] += CONSTANT(0.233596680327000010)*t; - y[14] += CONSTANT(0.115164716491000000)*t; - y[30] += CONSTANT(-0.169433177294000010)*t; - y[32] += CONSTANT(0.173617342585000000)*t; + y[12] += CONSTANT(0.059470803871800003) * t; + y[2] += CONSTANT(0.233596680327000010) * t; + y[14] += CONSTANT(0.115164716491000000) * t; + y[30] += CONSTANT(-0.169433177294000010) * t; + y[32] += CONSTANT(0.173617342585000000) * t; // [7,14]: 3,15,31,33, - tf = CONSTANT(0.184674390923000000)*f[3] + CONSTANT(0.148677009677999990)*f[15] + CONSTANT(-0.083004965973399999)*f[31] + CONSTANT(0.179311220382000010)*f[33]; - tg = CONSTANT(0.184674390923000000)*g[3] + CONSTANT(0.148677009677999990)*g[15] + CONSTANT(-0.083004965973399999)*g[31] + CONSTANT(0.179311220382000010)*g[33]; - y[7] += tf*g[14] + tg*f[14]; - y[14] += tf*g[7] + tg*f[7]; + tf = CONSTANT(0.184674390923000000) * f[3] + CONSTANT(0.148677009677999990) * f[15] + CONSTANT(-0.083004965973399999) * f[31] + + CONSTANT(0.179311220382000010) * f[33]; + tg = CONSTANT(0.184674390923000000) * g[3] + CONSTANT(0.148677009677999990) * g[15] + CONSTANT(-0.083004965973399999) * g[31] + + CONSTANT(0.179311220382000010) * g[33]; + y[7] += tf * g[14] + tg * f[14]; + y[14] += tf * g[7] + tg * f[7]; t = f[7] * g[14] + f[14] * g[7]; - y[3] += CONSTANT(0.184674390923000000)*t; - y[15] += CONSTANT(0.148677009677999990)*t; - y[31] += CONSTANT(-0.083004965973399999)*t; - y[33] += CONSTANT(0.179311220382000010)*t; + y[3] += CONSTANT(0.184674390923000000) * t; + y[15] += CONSTANT(0.148677009677999990) * t; + y[31] += CONSTANT(-0.083004965973399999) * t; + y[33] += CONSTANT(0.179311220382000010) * t; // [7,17]: 16,4,18, - tf = CONSTANT(0.140463346187999990)*f[16] + CONSTANT(0.168583882835000000)*f[4] + CONSTANT(0.132725386549000010)*f[18]; - tg = CONSTANT(0.140463346187999990)*g[16] + CONSTANT(0.168583882835000000)*g[4] + CONSTANT(0.132725386549000010)*g[18]; - y[7] += tf*g[17] + tg*f[17]; - y[17] += tf*g[7] + tg*f[7]; + tf = CONSTANT(0.140463346187999990) * f[16] + CONSTANT(0.168583882835000000) * f[4] + CONSTANT(0.132725386549000010) * f[18]; + tg = CONSTANT(0.140463346187999990) * g[16] + CONSTANT(0.168583882835000000) * g[4] + CONSTANT(0.132725386549000010) * g[18]; + y[7] += tf * g[17] + tg * f[17]; + y[17] += tf * g[7] + tg * f[7]; t = f[7] * g[17] + f[17] * g[7]; - y[16] += CONSTANT(0.140463346187999990)*t; - y[4] += CONSTANT(0.168583882835000000)*t; - y[18] += CONSTANT(0.132725386549000010)*t; + y[16] += CONSTANT(0.140463346187999990) * t; + y[4] += CONSTANT(0.168583882835000000) * t; + y[18] += CONSTANT(0.132725386549000010) * t; // [7,21]: 8,20,6,22, - tf = CONSTANT(-0.063718718433900007)*f[8] + CONSTANT(0.044869370061299998)*f[20] + CONSTANT(0.220728115440999990)*f[6] + CONSTANT(0.090297865408399999)*f[22]; - tg = CONSTANT(-0.063718718433900007)*g[8] + CONSTANT(0.044869370061299998)*g[20] + CONSTANT(0.220728115440999990)*g[6] + CONSTANT(0.090297865408399999)*g[22]; - y[7] += tf*g[21] + tg*f[21]; - y[21] += tf*g[7] + tg*f[7]; + tf = CONSTANT(-0.063718718433900007) * f[8] + CONSTANT(0.044869370061299998) * f[20] + CONSTANT(0.220728115440999990) * f[6] + + CONSTANT(0.090297865408399999) * f[22]; + tg = CONSTANT(-0.063718718433900007) * g[8] + CONSTANT(0.044869370061299998) * g[20] + CONSTANT(0.220728115440999990) * g[6] + + CONSTANT(0.090297865408399999) * g[22]; + y[7] += tf * g[21] + tg * f[21]; + y[21] += tf * g[7] + tg * f[7]; t = f[7] * g[21] + f[21] * g[7]; - y[8] += CONSTANT(-0.063718718433900007)*t; - y[20] += CONSTANT(0.044869370061299998)*t; - y[6] += CONSTANT(0.220728115440999990)*t; - y[22] += CONSTANT(0.090297865408399999)*t; + y[8] += CONSTANT(-0.063718718433900007) * t; + y[20] += CONSTANT(0.044869370061299998) * t; + y[6] += CONSTANT(0.220728115440999990) * t; + y[22] += CONSTANT(0.090297865408399999) * t; // [7,23]: 8,22,24, - tf = CONSTANT(0.168583882832999990)*f[8] + CONSTANT(0.132725386548000010)*f[22] + CONSTANT(0.140463346189000000)*f[24]; - tg = CONSTANT(0.168583882832999990)*g[8] + CONSTANT(0.132725386548000010)*g[22] + CONSTANT(0.140463346189000000)*g[24]; - y[7] += tf*g[23] + tg*f[23]; - y[23] += tf*g[7] + tg*f[7]; + tf = CONSTANT(0.168583882832999990) * f[8] + CONSTANT(0.132725386548000010) * f[22] + CONSTANT(0.140463346189000000) * f[24]; + tg = CONSTANT(0.168583882832999990) * g[8] + CONSTANT(0.132725386548000010) * g[22] + CONSTANT(0.140463346189000000) * g[24]; + y[7] += tf * g[23] + tg * f[23]; + y[23] += tf * g[7] + tg * f[7]; t = f[7] * g[23] + f[23] * g[7]; - y[8] += CONSTANT(0.168583882832999990)*t; - y[22] += CONSTANT(0.132725386548000010)*t; - y[24] += CONSTANT(0.140463346189000000)*t; + y[8] += CONSTANT(0.168583882832999990) * t; + y[22] += CONSTANT(0.132725386548000010) * t; + y[24] += CONSTANT(0.140463346189000000) * t; // [7,26]: 9,25,27, - tf = CONSTANT(0.155288072035000000)*f[9] + CONSTANT(0.132882365179999990)*f[25] + CONSTANT(0.138662534056999990)*f[27]; - tg = CONSTANT(0.155288072035000000)*g[9] + CONSTANT(0.132882365179999990)*g[25] + CONSTANT(0.138662534056999990)*g[27]; - y[7] += tf*g[26] + tg*f[26]; - y[26] += tf*g[7] + tg*f[7]; + tf = CONSTANT(0.155288072035000000) * f[9] + CONSTANT(0.132882365179999990) * f[25] + CONSTANT(0.138662534056999990) * f[27]; + tg = CONSTANT(0.155288072035000000) * g[9] + CONSTANT(0.132882365179999990) * g[25] + CONSTANT(0.138662534056999990) * g[27]; + y[7] += tf * g[26] + tg * f[26]; + y[26] += tf * g[7] + tg * f[7]; t = f[7] * g[26] + f[26] * g[7]; - y[9] += CONSTANT(0.155288072035000000)*t; - y[25] += CONSTANT(0.132882365179999990)*t; - y[27] += CONSTANT(0.138662534056999990)*t; + y[9] += CONSTANT(0.155288072035000000) * t; + y[25] += CONSTANT(0.132882365179999990) * t; + y[27] += CONSTANT(0.138662534056999990) * t; // [7,28]: 27,11,9,29, - tf = CONSTANT(0.114366930522000000)*f[27] + CONSTANT(0.173617342584000000)*f[11] + CONSTANT(-0.044827805096399997)*f[9] + CONSTANT(0.074118242118699995)*f[29]; - tg = CONSTANT(0.114366930522000000)*g[27] + CONSTANT(0.173617342584000000)*g[11] + CONSTANT(-0.044827805096399997)*g[9] + CONSTANT(0.074118242118699995)*g[29]; - y[7] += tf*g[28] + tg*f[28]; - y[28] += tf*g[7] + tg*f[7]; + tf = CONSTANT(0.114366930522000000) * f[27] + CONSTANT(0.173617342584000000) * f[11] + CONSTANT(-0.044827805096399997) * f[9] + + CONSTANT(0.074118242118699995) * f[29]; + tg = CONSTANT(0.114366930522000000) * g[27] + CONSTANT(0.173617342584000000) * g[11] + CONSTANT(-0.044827805096399997) * g[9] + + CONSTANT(0.074118242118699995) * g[29]; + y[7] += tf * g[28] + tg * f[28]; + y[28] += tf * g[7] + tg * f[7]; t = f[7] * g[28] + f[28] * g[7]; - y[27] += CONSTANT(0.114366930522000000)*t; - y[11] += CONSTANT(0.173617342584000000)*t; - y[9] += CONSTANT(-0.044827805096399997)*t; - y[29] += CONSTANT(0.074118242118699995)*t; + y[27] += CONSTANT(0.114366930522000000) * t; + y[11] += CONSTANT(0.173617342584000000) * t; + y[9] += CONSTANT(-0.044827805096399997) * t; + y[29] += CONSTANT(0.074118242118699995) * t; // [7,31]: 30,12,32, - tf = CONSTANT(0.036165998945399999)*f[30] + CONSTANT(0.214317900578999990)*f[12] + CONSTANT(0.074118242119099995)*f[32]; - tg = CONSTANT(0.036165998945399999)*g[30] + CONSTANT(0.214317900578999990)*g[12] + CONSTANT(0.074118242119099995)*g[32]; - y[7] += tf*g[31] + tg*f[31]; - y[31] += tf*g[7] + tg*f[7]; + tf = CONSTANT(0.036165998945399999) * f[30] + CONSTANT(0.214317900578999990) * f[12] + CONSTANT(0.074118242119099995) * f[32]; + tg = CONSTANT(0.036165998945399999) * g[30] + CONSTANT(0.214317900578999990) * g[12] + CONSTANT(0.074118242119099995) * g[32]; + y[7] += tf * g[31] + tg * f[31]; + y[31] += tf * g[7] + tg * f[7]; t = f[7] * g[31] + f[31] * g[7]; - y[30] += CONSTANT(0.036165998945399999)*t; - y[12] += CONSTANT(0.214317900578999990)*t; - y[32] += CONSTANT(0.074118242119099995)*t; + y[30] += CONSTANT(0.036165998945399999) * t; + y[12] += CONSTANT(0.214317900578999990) * t; + y[32] += CONSTANT(0.074118242119099995) * t; // [7,32]: 15,33, - tf = CONSTANT(-0.044827805096799997)*f[15] + CONSTANT(0.114366930522000000)*f[33]; - tg = CONSTANT(-0.044827805096799997)*g[15] + CONSTANT(0.114366930522000000)*g[33]; - y[7] += tf*g[32] + tg*f[32]; - y[32] += tf*g[7] + tg*f[7]; + tf = CONSTANT(-0.044827805096799997) * f[15] + CONSTANT(0.114366930522000000) * f[33]; + tg = CONSTANT(-0.044827805096799997) * g[15] + CONSTANT(0.114366930522000000) * g[33]; + y[7] += tf * g[32] + tg * f[32]; + y[32] += tf * g[7] + tg * f[7]; t = f[7] * g[32] + f[32] * g[7]; - y[15] += CONSTANT(-0.044827805096799997)*t; - y[33] += CONSTANT(0.114366930522000000)*t; + y[15] += CONSTANT(-0.044827805096799997) * t; + y[33] += CONSTANT(0.114366930522000000) * t; // [7,34]: 15,33,35, - tf = CONSTANT(0.155288072036000010)*f[15] + CONSTANT(0.138662534059000000)*f[33] + CONSTANT(0.132882365179000010)*f[35]; - tg = CONSTANT(0.155288072036000010)*g[15] + CONSTANT(0.138662534059000000)*g[33] + CONSTANT(0.132882365179000010)*g[35]; - y[7] += tf*g[34] + tg*f[34]; - y[34] += tf*g[7] + tg*f[7]; + tf = CONSTANT(0.155288072036000010) * f[15] + CONSTANT(0.138662534059000000) * f[33] + CONSTANT(0.132882365179000010) * f[35]; + tg = CONSTANT(0.155288072036000010) * g[15] + CONSTANT(0.138662534059000000) * g[33] + CONSTANT(0.132882365179000010) * g[35]; + y[7] += tf * g[34] + tg * f[34]; + y[34] += tf * g[7] + tg * f[7]; t = f[7] * g[34] + f[34] * g[7]; - y[15] += CONSTANT(0.155288072036000010)*t; - y[33] += CONSTANT(0.138662534059000000)*t; - y[35] += CONSTANT(0.132882365179000010)*t; + y[15] += CONSTANT(0.155288072036000010) * t; + y[33] += CONSTANT(0.138662534059000000) * t; + y[35] += CONSTANT(0.132882365179000010) * t; // [8,8]: 0,6,20,24, - tf = CONSTANT(0.282094791770000020)*f[0] + CONSTANT(-0.180223751576000010)*f[6] + CONSTANT(0.040299255967500003)*f[20] + CONSTANT(0.238413613505999990)*f[24]; - tg = CONSTANT(0.282094791770000020)*g[0] + CONSTANT(-0.180223751576000010)*g[6] + CONSTANT(0.040299255967500003)*g[20] + CONSTANT(0.238413613505999990)*g[24]; - y[8] += tf*g[8] + tg*f[8]; + tf = CONSTANT(0.282094791770000020) * f[0] + CONSTANT(-0.180223751576000010) * f[6] + CONSTANT(0.040299255967500003) * f[20] + + CONSTANT(0.238413613505999990) * f[24]; + tg = CONSTANT(0.282094791770000020) * g[0] + CONSTANT(-0.180223751576000010) * g[6] + CONSTANT(0.040299255967500003) * g[20] + + CONSTANT(0.238413613505999990) * g[24]; + y[8] += tf * g[8] + tg * f[8]; t = f[8] * g[8]; - y[0] += CONSTANT(0.282094791770000020)*t; - y[6] += CONSTANT(-0.180223751576000010)*t; - y[20] += CONSTANT(0.040299255967500003)*t; - y[24] += CONSTANT(0.238413613505999990)*t; + y[0] += CONSTANT(0.282094791770000020) * t; + y[6] += CONSTANT(-0.180223751576000010) * t; + y[20] += CONSTANT(0.040299255967500003) * t; + y[24] += CONSTANT(0.238413613505999990) * t; // [8,9]: 1,11,25,29, - tf = CONSTANT(0.226179013155000000)*f[1] + CONSTANT(-0.094031597259499999)*f[11] + CONSTANT(0.245532000541000000)*f[25] + CONSTANT(0.016943317729199998)*f[29]; - tg = CONSTANT(0.226179013155000000)*g[1] + CONSTANT(-0.094031597259499999)*g[11] + CONSTANT(0.245532000541000000)*g[25] + CONSTANT(0.016943317729199998)*g[29]; - y[8] += tf*g[9] + tg*f[9]; - y[9] += tf*g[8] + tg*f[8]; + tf = CONSTANT(0.226179013155000000) * f[1] + CONSTANT(-0.094031597259499999) * f[11] + CONSTANT(0.245532000541000000) * f[25] + + CONSTANT(0.016943317729199998) * f[29]; + tg = CONSTANT(0.226179013155000000) * g[1] + CONSTANT(-0.094031597259499999) * g[11] + CONSTANT(0.245532000541000000) * g[25] + + CONSTANT(0.016943317729199998) * g[29]; + y[8] += tf * g[9] + tg * f[9]; + y[9] += tf * g[8] + tg * f[8]; t = f[8] * g[9] + f[9] * g[8]; - y[1] += CONSTANT(0.226179013155000000)*t; - y[11] += CONSTANT(-0.094031597259499999)*t; - y[25] += CONSTANT(0.245532000541000000)*t; - y[29] += CONSTANT(0.016943317729199998)*t; + y[1] += CONSTANT(0.226179013155000000) * t; + y[11] += CONSTANT(-0.094031597259499999) * t; + y[25] += CONSTANT(0.245532000541000000) * t; + y[29] += CONSTANT(0.016943317729199998) * t; // [8,14]: 2,12,30,34, - tf = CONSTANT(0.184674390919999990)*f[2] + CONSTANT(-0.188063194517999990)*f[12] + CONSTANT(0.053579475144400000)*f[30] + CONSTANT(0.190188269816000010)*f[34]; - tg = CONSTANT(0.184674390919999990)*g[2] + CONSTANT(-0.188063194517999990)*g[12] + CONSTANT(0.053579475144400000)*g[30] + CONSTANT(0.190188269816000010)*g[34]; - y[8] += tf*g[14] + tg*f[14]; - y[14] += tf*g[8] + tg*f[8]; + tf = CONSTANT(0.184674390919999990) * f[2] + CONSTANT(-0.188063194517999990) * f[12] + CONSTANT(0.053579475144400000) * f[30] + + CONSTANT(0.190188269816000010) * f[34]; + tg = CONSTANT(0.184674390919999990) * g[2] + CONSTANT(-0.188063194517999990) * g[12] + CONSTANT(0.053579475144400000) * g[30] + + CONSTANT(0.190188269816000010) * g[34]; + y[8] += tf * g[14] + tg * f[14]; + y[14] += tf * g[8] + tg * f[8]; t = f[8] * g[14] + f[14] * g[8]; - y[2] += CONSTANT(0.184674390919999990)*t; - y[12] += CONSTANT(-0.188063194517999990)*t; - y[30] += CONSTANT(0.053579475144400000)*t; - y[34] += CONSTANT(0.190188269816000010)*t; + y[2] += CONSTANT(0.184674390919999990) * t; + y[12] += CONSTANT(-0.188063194517999990) * t; + y[30] += CONSTANT(0.053579475144400000) * t; + y[34] += CONSTANT(0.190188269816000010) * t; // [8,15]: 13,3,31,35, - tf = CONSTANT(-0.094031597259499999)*f[13] + CONSTANT(0.226179013155000000)*f[3] + CONSTANT(0.016943317729199998)*f[31] + CONSTANT(0.245532000541000000)*f[35]; - tg = CONSTANT(-0.094031597259499999)*g[13] + CONSTANT(0.226179013155000000)*g[3] + CONSTANT(0.016943317729199998)*g[31] + CONSTANT(0.245532000541000000)*g[35]; - y[8] += tf*g[15] + tg*f[15]; - y[15] += tf*g[8] + tg*f[8]; + tf = CONSTANT(-0.094031597259499999) * f[13] + CONSTANT(0.226179013155000000) * f[3] + CONSTANT(0.016943317729199998) * f[31] + + CONSTANT(0.245532000541000000) * f[35]; + tg = CONSTANT(-0.094031597259499999) * g[13] + CONSTANT(0.226179013155000000) * g[3] + CONSTANT(0.016943317729199998) * g[31] + + CONSTANT(0.245532000541000000) * g[35]; + y[8] += tf * g[15] + tg * f[15]; + y[15] += tf * g[8] + tg * f[8]; t = f[8] * g[15] + f[15] * g[8]; - y[13] += CONSTANT(-0.094031597259499999)*t; - y[3] += CONSTANT(0.226179013155000000)*t; - y[31] += CONSTANT(0.016943317729199998)*t; - y[35] += CONSTANT(0.245532000541000000)*t; + y[13] += CONSTANT(-0.094031597259499999) * t; + y[3] += CONSTANT(0.226179013155000000) * t; + y[31] += CONSTANT(0.016943317729199998) * t; + y[35] += CONSTANT(0.245532000541000000) * t; // [8,22]: 6,20,24, - tf = CONSTANT(0.156078347226000000)*f[6] + CONSTANT(-0.190364615029000010)*f[20] + CONSTANT(-0.075080816691500005)*f[24]; - tg = CONSTANT(0.156078347226000000)*g[6] + CONSTANT(-0.190364615029000010)*g[20] + CONSTANT(-0.075080816691500005)*g[24]; - y[8] += tf*g[22] + tg*f[22]; - y[22] += tf*g[8] + tg*f[8]; + tf = CONSTANT(0.156078347226000000) * f[6] + CONSTANT(-0.190364615029000010) * f[20] + CONSTANT(-0.075080816691500005) * f[24]; + tg = CONSTANT(0.156078347226000000) * g[6] + CONSTANT(-0.190364615029000010) * g[20] + CONSTANT(-0.075080816691500005) * g[24]; + y[8] += tf * g[22] + tg * f[22]; + y[22] += tf * g[8] + tg * f[8]; t = f[8] * g[22] + f[22] * g[8]; - y[6] += CONSTANT(0.156078347226000000)*t; - y[20] += CONSTANT(-0.190364615029000010)*t; - y[24] += CONSTANT(-0.075080816691500005)*t; + y[6] += CONSTANT(0.156078347226000000) * t; + y[20] += CONSTANT(-0.190364615029000010) * t; + y[24] += CONSTANT(-0.075080816691500005) * t; // [8,26]: 10,28, - tf = CONSTANT(0.190188269806999990)*f[10] + CONSTANT(-0.097043558542400002)*f[28]; - tg = CONSTANT(0.190188269806999990)*g[10] + CONSTANT(-0.097043558542400002)*g[28]; - y[8] += tf*g[26] + tg*f[26]; - y[26] += tf*g[8] + tg*f[8]; + tf = CONSTANT(0.190188269806999990) * f[10] + CONSTANT(-0.097043558542400002) * f[28]; + tg = CONSTANT(0.190188269806999990) * g[10] + CONSTANT(-0.097043558542400002) * g[28]; + y[8] += tf * g[26] + tg * f[26]; + y[26] += tf * g[8] + tg * f[8]; t = f[8] * g[26] + f[26] * g[8]; - y[10] += CONSTANT(0.190188269806999990)*t; - y[28] += CONSTANT(-0.097043558542400002)*t; + y[10] += CONSTANT(0.190188269806999990) * t; + y[28] += CONSTANT(-0.097043558542400002) * t; // [8,27]: 25,11,29, - tf = CONSTANT(-0.062641347680800000)*f[25] + CONSTANT(0.141757966609000000)*f[11] + CONSTANT(-0.121034582550000010)*f[29]; - tg = CONSTANT(-0.062641347680800000)*g[25] + CONSTANT(0.141757966609000000)*g[11] + CONSTANT(-0.121034582550000010)*g[29]; - y[8] += tf*g[27] + tg*f[27]; - y[27] += tf*g[8] + tg*f[8]; + tf = CONSTANT(-0.062641347680800000) * f[25] + CONSTANT(0.141757966609000000) * f[11] + CONSTANT(-0.121034582550000010) * f[29]; + tg = CONSTANT(-0.062641347680800000) * g[25] + CONSTANT(0.141757966609000000) * g[11] + CONSTANT(-0.121034582550000010) * g[29]; + y[8] += tf * g[27] + tg * f[27]; + y[27] += tf * g[8] + tg * f[8]; t = f[8] * g[27] + f[27] * g[8]; - y[25] += CONSTANT(-0.062641347680800000)*t; - y[11] += CONSTANT(0.141757966609000000)*t; - y[29] += CONSTANT(-0.121034582550000010)*t; + y[25] += CONSTANT(-0.062641347680800000) * t; + y[11] += CONSTANT(0.141757966609000000) * t; + y[29] += CONSTANT(-0.121034582550000010) * t; // [8,32]: 30,12,34, - tf = CONSTANT(-0.191372478254000000)*f[30] + CONSTANT(0.141757966609000000)*f[12] + CONSTANT(-0.097043558538899996)*f[34]; - tg = CONSTANT(-0.191372478254000000)*g[30] + CONSTANT(0.141757966609000000)*g[12] + CONSTANT(-0.097043558538899996)*g[34]; - y[8] += tf*g[32] + tg*f[32]; - y[32] += tf*g[8] + tg*f[8]; + tf = CONSTANT(-0.191372478254000000) * f[30] + CONSTANT(0.141757966609000000) * f[12] + CONSTANT(-0.097043558538899996) * f[34]; + tg = CONSTANT(-0.191372478254000000) * g[30] + CONSTANT(0.141757966609000000) * g[12] + CONSTANT(-0.097043558538899996) * g[34]; + y[8] += tf * g[32] + tg * f[32]; + y[32] += tf * g[8] + tg * f[8]; t = f[8] * g[32] + f[32] * g[8]; - y[30] += CONSTANT(-0.191372478254000000)*t; - y[12] += CONSTANT(0.141757966609000000)*t; - y[34] += CONSTANT(-0.097043558538899996)*t; + y[30] += CONSTANT(-0.191372478254000000) * t; + y[12] += CONSTANT(0.141757966609000000) * t; + y[34] += CONSTANT(-0.097043558538899996) * t; // [8,33]: 13,31,35, - tf = CONSTANT(0.141757966609000000)*f[13] + CONSTANT(-0.121034582550000010)*f[31] + CONSTANT(-0.062641347680800000)*f[35]; - tg = CONSTANT(0.141757966609000000)*g[13] + CONSTANT(-0.121034582550000010)*g[31] + CONSTANT(-0.062641347680800000)*g[35]; - y[8] += tf*g[33] + tg*f[33]; - y[33] += tf*g[8] + tg*f[8]; + tf = CONSTANT(0.141757966609000000) * f[13] + CONSTANT(-0.121034582550000010) * f[31] + CONSTANT(-0.062641347680800000) * f[35]; + tg = CONSTANT(0.141757966609000000) * g[13] + CONSTANT(-0.121034582550000010) * g[31] + CONSTANT(-0.062641347680800000) * g[35]; + y[8] += tf * g[33] + tg * f[33]; + y[33] += tf * g[8] + tg * f[8]; t = f[8] * g[33] + f[33] * g[8]; - y[13] += CONSTANT(0.141757966609000000)*t; - y[31] += CONSTANT(-0.121034582550000010)*t; - y[35] += CONSTANT(-0.062641347680800000)*t; + y[13] += CONSTANT(0.141757966609000000) * t; + y[31] += CONSTANT(-0.121034582550000010) * t; + y[35] += CONSTANT(-0.062641347680800000) * t; // [9,9]: 6,0,20, - tf = CONSTANT(-0.210261043508000010)*f[6] + CONSTANT(0.282094791766999970)*f[0] + CONSTANT(0.076934943209800002)*f[20]; - tg = CONSTANT(-0.210261043508000010)*g[6] + CONSTANT(0.282094791766999970)*g[0] + CONSTANT(0.076934943209800002)*g[20]; - y[9] += tf*g[9] + tg*f[9]; + tf = CONSTANT(-0.210261043508000010) * f[6] + CONSTANT(0.282094791766999970) * f[0] + CONSTANT(0.076934943209800002) * f[20]; + tg = CONSTANT(-0.210261043508000010) * g[6] + CONSTANT(0.282094791766999970) * g[0] + CONSTANT(0.076934943209800002) * g[20]; + y[9] += tf * g[9] + tg * f[9]; t = f[9] * g[9]; - y[6] += CONSTANT(-0.210261043508000010)*t; - y[0] += CONSTANT(0.282094791766999970)*t; - y[20] += CONSTANT(0.076934943209800002)*t; + y[6] += CONSTANT(-0.210261043508000010) * t; + y[0] += CONSTANT(0.282094791766999970) * t; + y[20] += CONSTANT(0.076934943209800002) * t; // [9,17]: 2,12,30, - tf = CONSTANT(0.162867503964999990)*f[2] + CONSTANT(-0.203550726872999990)*f[12] + CONSTANT(0.098140130728100003)*f[30]; - tg = CONSTANT(0.162867503964999990)*g[2] + CONSTANT(-0.203550726872999990)*g[12] + CONSTANT(0.098140130728100003)*g[30]; - y[9] += tf*g[17] + tg*f[17]; - y[17] += tf*g[9] + tg*f[9]; + tf = CONSTANT(0.162867503964999990) * f[2] + CONSTANT(-0.203550726872999990) * f[12] + CONSTANT(0.098140130728100003) * f[30]; + tg = CONSTANT(0.162867503964999990) * g[2] + CONSTANT(-0.203550726872999990) * g[12] + CONSTANT(0.098140130728100003) * g[30]; + y[9] += tf * g[17] + tg * f[17]; + y[17] += tf * g[9] + tg * f[9]; t = f[9] * g[17] + f[17] * g[9]; - y[2] += CONSTANT(0.162867503964999990)*t; - y[12] += CONSTANT(-0.203550726872999990)*t; - y[30] += CONSTANT(0.098140130728100003)*t; + y[2] += CONSTANT(0.162867503964999990) * t; + y[12] += CONSTANT(-0.203550726872999990) * t; + y[30] += CONSTANT(0.098140130728100003) * t; // [9,18]: 3,13,31,35, - tf = CONSTANT(-0.043528171377799997)*f[3] + CONSTANT(0.133255230519000010)*f[13] + CONSTANT(-0.101584686310000010)*f[31] + CONSTANT(0.098140130731999994)*f[35]; - tg = CONSTANT(-0.043528171377799997)*g[3] + CONSTANT(0.133255230519000010)*g[13] + CONSTANT(-0.101584686310000010)*g[31] + CONSTANT(0.098140130731999994)*g[35]; - y[9] += tf*g[18] + tg*f[18]; - y[18] += tf*g[9] + tg*f[9]; + tf = CONSTANT(-0.043528171377799997) * f[3] + CONSTANT(0.133255230519000010) * f[13] + CONSTANT(-0.101584686310000010) * f[31] + + CONSTANT(0.098140130731999994) * f[35]; + tg = CONSTANT(-0.043528171377799997) * g[3] + CONSTANT(0.133255230519000010) * g[13] + CONSTANT(-0.101584686310000010) * g[31] + + CONSTANT(0.098140130731999994) * g[35]; + y[9] += tf * g[18] + tg * f[18]; + y[18] += tf * g[9] + tg * f[9]; t = f[9] * g[18] + f[18] * g[9]; - y[3] += CONSTANT(-0.043528171377799997)*t; - y[13] += CONSTANT(0.133255230519000010)*t; - y[31] += CONSTANT(-0.101584686310000010)*t; - y[35] += CONSTANT(0.098140130731999994)*t; + y[3] += CONSTANT(-0.043528171377799997) * t; + y[13] += CONSTANT(0.133255230519000010) * t; + y[31] += CONSTANT(-0.101584686310000010) * t; + y[35] += CONSTANT(0.098140130731999994) * t; // [9,19]: 14,32,34, - tf = CONSTANT(-0.099322584600699995)*f[14] + CONSTANT(0.126698363970000010)*f[32] + CONSTANT(0.131668802180999990)*f[34]; - tg = CONSTANT(-0.099322584600699995)*g[14] + CONSTANT(0.126698363970000010)*g[32] + CONSTANT(0.131668802180999990)*g[34]; - y[9] += tf*g[19] + tg*f[19]; - y[19] += tf*g[9] + tg*f[9]; + tf = CONSTANT(-0.099322584600699995) * f[14] + CONSTANT(0.126698363970000010) * f[32] + CONSTANT(0.131668802180999990) * f[34]; + tg = CONSTANT(-0.099322584600699995) * g[14] + CONSTANT(0.126698363970000010) * g[32] + CONSTANT(0.131668802180999990) * g[34]; + y[9] += tf * g[19] + tg * f[19]; + y[19] += tf * g[9] + tg * f[9]; t = f[9] * g[19] + f[19] * g[9]; - y[14] += CONSTANT(-0.099322584600699995)*t; - y[32] += CONSTANT(0.126698363970000010)*t; - y[34] += CONSTANT(0.131668802180999990)*t; + y[14] += CONSTANT(-0.099322584600699995) * t; + y[32] += CONSTANT(0.126698363970000010) * t; + y[34] += CONSTANT(0.131668802180999990) * t; // [9,22]: 1,11,25,29, - tf = CONSTANT(-0.043528171378199997)*f[1] + CONSTANT(0.133255230518000010)*f[11] + CONSTANT(-0.098140130732499997)*f[25] + CONSTANT(-0.101584686311000000)*f[29]; - tg = CONSTANT(-0.043528171378199997)*g[1] + CONSTANT(0.133255230518000010)*g[11] + CONSTANT(-0.098140130732499997)*g[25] + CONSTANT(-0.101584686311000000)*g[29]; - y[9] += tf*g[22] + tg*f[22]; - y[22] += tf*g[9] + tg*f[9]; + tf = CONSTANT(-0.043528171378199997) * f[1] + CONSTANT(0.133255230518000010) * f[11] + CONSTANT(-0.098140130732499997) * f[25] + + CONSTANT(-0.101584686311000000) * f[29]; + tg = CONSTANT(-0.043528171378199997) * g[1] + CONSTANT(0.133255230518000010) * g[11] + CONSTANT(-0.098140130732499997) * g[25] + + CONSTANT(-0.101584686311000000) * g[29]; + y[9] += tf * g[22] + tg * f[22]; + y[22] += tf * g[9] + tg * f[9]; t = f[9] * g[22] + f[22] * g[9]; - y[1] += CONSTANT(-0.043528171378199997)*t; - y[11] += CONSTANT(0.133255230518000010)*t; - y[25] += CONSTANT(-0.098140130732499997)*t; - y[29] += CONSTANT(-0.101584686311000000)*t; + y[1] += CONSTANT(-0.043528171378199997) * t; + y[11] += CONSTANT(0.133255230518000010) * t; + y[25] += CONSTANT(-0.098140130732499997) * t; + y[29] += CONSTANT(-0.101584686311000000) * t; // [9,27]: 6,20, - tf = CONSTANT(0.126792179874999990)*f[6] + CONSTANT(-0.196280261464999990)*f[20]; - tg = CONSTANT(0.126792179874999990)*g[6] + CONSTANT(-0.196280261464999990)*g[20]; - y[9] += tf*g[27] + tg*f[27]; - y[27] += tf*g[9] + tg*f[9]; + tf = CONSTANT(0.126792179874999990) * f[6] + CONSTANT(-0.196280261464999990) * f[20]; + tg = CONSTANT(0.126792179874999990) * g[6] + CONSTANT(-0.196280261464999990) * g[20]; + y[9] += tf * g[27] + tg * f[27]; + y[27] += tf * g[9] + tg * f[9]; t = f[9] * g[27] + f[27] * g[9]; - y[6] += CONSTANT(0.126792179874999990)*t; - y[20] += CONSTANT(-0.196280261464999990)*t; + y[6] += CONSTANT(0.126792179874999990) * t; + y[20] += CONSTANT(-0.196280261464999990) * t; // [10,10]: 0,20,24, - tf = CONSTANT(0.282094791771999980)*f[0] + CONSTANT(-0.179514867494000000)*f[20] + CONSTANT(-0.151717754049000010)*f[24]; - tg = CONSTANT(0.282094791771999980)*g[0] + CONSTANT(-0.179514867494000000)*g[20] + CONSTANT(-0.151717754049000010)*g[24]; - y[10] += tf*g[10] + tg*f[10]; + tf = CONSTANT(0.282094791771999980) * f[0] + CONSTANT(-0.179514867494000000) * f[20] + CONSTANT(-0.151717754049000010) * f[24]; + tg = CONSTANT(0.282094791771999980) * g[0] + CONSTANT(-0.179514867494000000) * g[20] + CONSTANT(-0.151717754049000010) * g[24]; + y[10] += tf * g[10] + tg * f[10]; t = f[10] * g[10]; - y[0] += CONSTANT(0.282094791771999980)*t; - y[20] += CONSTANT(-0.179514867494000000)*t; - y[24] += CONSTANT(-0.151717754049000010)*t; + y[0] += CONSTANT(0.282094791771999980) * t; + y[20] += CONSTANT(-0.179514867494000000) * t; + y[24] += CONSTANT(-0.151717754049000010) * t; // [10,16]: 14,32, - tf = CONSTANT(0.151717754044999990)*f[14] + CONSTANT(-0.077413979111300005)*f[32]; - tg = CONSTANT(0.151717754044999990)*g[14] + CONSTANT(-0.077413979111300005)*g[32]; - y[10] += tf*g[16] + tg*f[16]; - y[16] += tf*g[10] + tg*f[10]; + tf = CONSTANT(0.151717754044999990) * f[14] + CONSTANT(-0.077413979111300005) * f[32]; + tg = CONSTANT(0.151717754044999990) * g[14] + CONSTANT(-0.077413979111300005) * g[32]; + y[10] += tf * g[16] + tg * f[16]; + y[16] += tf * g[10] + tg * f[10]; t = f[10] * g[16] + f[16] * g[10]; - y[14] += CONSTANT(0.151717754044999990)*t; - y[32] += CONSTANT(-0.077413979111300005)*t; + y[14] += CONSTANT(0.151717754044999990) * t; + y[32] += CONSTANT(-0.077413979111300005) * t; // [10,17]: 13,3,31,35, - tf = CONSTANT(0.067850242288900006)*f[13] + CONSTANT(0.199471140200000010)*f[3] + CONSTANT(-0.113793659091000000)*f[31] + CONSTANT(-0.149911525925999990)*f[35]; - tg = CONSTANT(0.067850242288900006)*g[13] + CONSTANT(0.199471140200000010)*g[3] + CONSTANT(-0.113793659091000000)*g[31] + CONSTANT(-0.149911525925999990)*g[35]; - y[10] += tf*g[17] + tg*f[17]; - y[17] += tf*g[10] + tg*f[10]; + tf = CONSTANT(0.067850242288900006) * f[13] + CONSTANT(0.199471140200000010) * f[3] + CONSTANT(-0.113793659091000000) * f[31] + + CONSTANT(-0.149911525925999990) * f[35]; + tg = CONSTANT(0.067850242288900006) * g[13] + CONSTANT(0.199471140200000010) * g[3] + CONSTANT(-0.113793659091000000) * g[31] + + CONSTANT(-0.149911525925999990) * g[35]; + y[10] += tf * g[17] + tg * f[17]; + y[17] += tf * g[10] + tg * f[10]; t = f[10] * g[17] + f[17] * g[10]; - y[13] += CONSTANT(0.067850242288900006)*t; - y[3] += CONSTANT(0.199471140200000010)*t; - y[31] += CONSTANT(-0.113793659091000000)*t; - y[35] += CONSTANT(-0.149911525925999990)*t; + y[13] += CONSTANT(0.067850242288900006) * t; + y[3] += CONSTANT(0.199471140200000010) * t; + y[31] += CONSTANT(-0.113793659091000000) * t; + y[35] += CONSTANT(-0.149911525925999990) * t; // [10,18]: 12,2,30,34, - tf = CONSTANT(-0.044418410173299998)*f[12] + CONSTANT(0.213243618621000000)*f[2] + CONSTANT(-0.171327458205000000)*f[30] + CONSTANT(-0.101358691177000000)*f[34]; - tg = CONSTANT(-0.044418410173299998)*g[12] + CONSTANT(0.213243618621000000)*g[2] + CONSTANT(-0.171327458205000000)*g[30] + CONSTANT(-0.101358691177000000)*g[34]; - y[10] += tf*g[18] + tg*f[18]; - y[18] += tf*g[10] + tg*f[10]; + tf = CONSTANT(-0.044418410173299998) * f[12] + CONSTANT(0.213243618621000000) * f[2] + CONSTANT(-0.171327458205000000) * f[30] + + CONSTANT(-0.101358691177000000) * f[34]; + tg = CONSTANT(-0.044418410173299998) * g[12] + CONSTANT(0.213243618621000000) * g[2] + CONSTANT(-0.171327458205000000) * g[30] + + CONSTANT(-0.101358691177000000) * g[34]; + y[10] += tf * g[18] + tg * f[18]; + y[18] += tf * g[10] + tg * f[10]; t = f[10] * g[18] + f[18] * g[10]; - y[12] += CONSTANT(-0.044418410173299998)*t; - y[2] += CONSTANT(0.213243618621000000)*t; - y[30] += CONSTANT(-0.171327458205000000)*t; - y[34] += CONSTANT(-0.101358691177000000)*t; + y[12] += CONSTANT(-0.044418410173299998) * t; + y[2] += CONSTANT(0.213243618621000000) * t; + y[30] += CONSTANT(-0.171327458205000000) * t; + y[34] += CONSTANT(-0.101358691177000000) * t; // [10,19]: 3,15,13,31,33, - tf = CONSTANT(-0.075393004386799994)*f[3] + CONSTANT(0.099322584599600000)*f[15] + CONSTANT(0.102579924281000000)*f[13] + CONSTANT(0.097749909976500002)*f[31] + CONSTANT(-0.025339672794100002)*f[33]; - tg = CONSTANT(-0.075393004386799994)*g[3] + CONSTANT(0.099322584599600000)*g[15] + CONSTANT(0.102579924281000000)*g[13] + CONSTANT(0.097749909976500002)*g[31] + CONSTANT(-0.025339672794100002)*g[33]; - y[10] += tf*g[19] + tg*f[19]; - y[19] += tf*g[10] + tg*f[10]; + tf = CONSTANT(-0.075393004386799994) * f[3] + CONSTANT(0.099322584599600000) * f[15] + CONSTANT(0.102579924281000000) * f[13] + + CONSTANT(0.097749909976500002) * f[31] + CONSTANT(-0.025339672794100002) * f[33]; + tg = CONSTANT(-0.075393004386799994) * g[3] + CONSTANT(0.099322584599600000) * g[15] + CONSTANT(0.102579924281000000) * g[13] + + CONSTANT(0.097749909976500002) * g[31] + CONSTANT(-0.025339672794100002) * g[33]; + y[10] += tf * g[19] + tg * f[19]; + y[19] += tf * g[10] + tg * f[10]; t = f[10] * g[19] + f[19] * g[10]; - y[3] += CONSTANT(-0.075393004386799994)*t; - y[15] += CONSTANT(0.099322584599600000)*t; - y[13] += CONSTANT(0.102579924281000000)*t; - y[31] += CONSTANT(0.097749909976500002)*t; - y[33] += CONSTANT(-0.025339672794100002)*t; + y[3] += CONSTANT(-0.075393004386799994) * t; + y[15] += CONSTANT(0.099322584599600000) * t; + y[13] += CONSTANT(0.102579924281000000) * t; + y[31] += CONSTANT(0.097749909976500002) * t; + y[33] += CONSTANT(-0.025339672794100002) * t; // [10,21]: 11,1,9,27,29, - tf = CONSTANT(0.102579924281000000)*f[11] + CONSTANT(-0.075393004386799994)*f[1] + CONSTANT(-0.099322584599600000)*f[9] + CONSTANT(0.025339672794100002)*f[27] + CONSTANT(0.097749909976500002)*f[29]; - tg = CONSTANT(0.102579924281000000)*g[11] + CONSTANT(-0.075393004386799994)*g[1] + CONSTANT(-0.099322584599600000)*g[9] + CONSTANT(0.025339672794100002)*g[27] + CONSTANT(0.097749909976500002)*g[29]; - y[10] += tf*g[21] + tg*f[21]; - y[21] += tf*g[10] + tg*f[10]; + tf = CONSTANT(0.102579924281000000) * f[11] + CONSTANT(-0.075393004386799994) * f[1] + CONSTANT(-0.099322584599600000) * f[9] + + CONSTANT(0.025339672794100002) * f[27] + CONSTANT(0.097749909976500002) * f[29]; + tg = CONSTANT(0.102579924281000000) * g[11] + CONSTANT(-0.075393004386799994) * g[1] + CONSTANT(-0.099322584599600000) * g[9] + + CONSTANT(0.025339672794100002) * g[27] + CONSTANT(0.097749909976500002) * g[29]; + y[10] += tf * g[21] + tg * f[21]; + y[21] += tf * g[10] + tg * f[10]; t = f[10] * g[21] + f[21] * g[10]; - y[11] += CONSTANT(0.102579924281000000)*t; - y[1] += CONSTANT(-0.075393004386799994)*t; - y[9] += CONSTANT(-0.099322584599600000)*t; - y[27] += CONSTANT(0.025339672794100002)*t; - y[29] += CONSTANT(0.097749909976500002)*t; + y[11] += CONSTANT(0.102579924281000000) * t; + y[1] += CONSTANT(-0.075393004386799994) * t; + y[9] += CONSTANT(-0.099322584599600000) * t; + y[27] += CONSTANT(0.025339672794100002) * t; + y[29] += CONSTANT(0.097749909976500002) * t; // [10,23]: 11,1,25,29, - tf = CONSTANT(-0.067850242288900006)*f[11] + CONSTANT(-0.199471140200000010)*f[1] + CONSTANT(0.149911525925999990)*f[25] + CONSTANT(0.113793659091000000)*f[29]; - tg = CONSTANT(-0.067850242288900006)*g[11] + CONSTANT(-0.199471140200000010)*g[1] + CONSTANT(0.149911525925999990)*g[25] + CONSTANT(0.113793659091000000)*g[29]; - y[10] += tf*g[23] + tg*f[23]; - y[23] += tf*g[10] + tg*f[10]; + tf = CONSTANT(-0.067850242288900006) * f[11] + CONSTANT(-0.199471140200000010) * f[1] + CONSTANT(0.149911525925999990) * f[25] + + CONSTANT(0.113793659091000000) * f[29]; + tg = CONSTANT(-0.067850242288900006) * g[11] + CONSTANT(-0.199471140200000010) * g[1] + CONSTANT(0.149911525925999990) * g[25] + + CONSTANT(0.113793659091000000) * g[29]; + y[10] += tf * g[23] + tg * f[23]; + y[23] += tf * g[10] + tg * f[10]; t = f[10] * g[23] + f[23] * g[10]; - y[11] += CONSTANT(-0.067850242288900006)*t; - y[1] += CONSTANT(-0.199471140200000010)*t; - y[25] += CONSTANT(0.149911525925999990)*t; - y[29] += CONSTANT(0.113793659091000000)*t; + y[11] += CONSTANT(-0.067850242288900006) * t; + y[1] += CONSTANT(-0.199471140200000010) * t; + y[25] += CONSTANT(0.149911525925999990) * t; + y[29] += CONSTANT(0.113793659091000000) * t; // [10,28]: 6,20,24, - tf = CONSTANT(0.190188269814000000)*f[6] + CONSTANT(-0.065426753820500005)*f[20] + CONSTANT(0.077413979109600004)*f[24]; - tg = CONSTANT(0.190188269814000000)*g[6] + CONSTANT(-0.065426753820500005)*g[20] + CONSTANT(0.077413979109600004)*g[24]; - y[10] += tf*g[28] + tg*f[28]; - y[28] += tf*g[10] + tg*f[10]; + tf = CONSTANT(0.190188269814000000) * f[6] + CONSTANT(-0.065426753820500005) * f[20] + CONSTANT(0.077413979109600004) * f[24]; + tg = CONSTANT(0.190188269814000000) * g[6] + CONSTANT(-0.065426753820500005) * g[20] + CONSTANT(0.077413979109600004) * g[24]; + y[10] += tf * g[28] + tg * f[28]; + y[28] += tf * g[10] + tg * f[10]; t = f[10] * g[28] + f[28] * g[10]; - y[6] += CONSTANT(0.190188269814000000)*t; - y[20] += CONSTANT(-0.065426753820500005)*t; - y[24] += CONSTANT(0.077413979109600004)*t; + y[6] += CONSTANT(0.190188269814000000) * t; + y[20] += CONSTANT(-0.065426753820500005) * t; + y[24] += CONSTANT(0.077413979109600004) * t; // [11,11]: 0,6,8,20,22, - tf = CONSTANT(0.282094791773999990)*f[0] + CONSTANT(0.126156626101000010)*f[6] + CONSTANT(-0.145673124078999990)*f[8] + CONSTANT(0.025644981070299999)*f[20] + CONSTANT(-0.114687841910000000)*f[22]; - tg = CONSTANT(0.282094791773999990)*g[0] + CONSTANT(0.126156626101000010)*g[6] + CONSTANT(-0.145673124078999990)*g[8] + CONSTANT(0.025644981070299999)*g[20] + CONSTANT(-0.114687841910000000)*g[22]; - y[11] += tf*g[11] + tg*f[11]; + tf = CONSTANT(0.282094791773999990) * f[0] + CONSTANT(0.126156626101000010) * f[6] + CONSTANT(-0.145673124078999990) * f[8] + + CONSTANT(0.025644981070299999) * f[20] + CONSTANT(-0.114687841910000000) * f[22]; + tg = CONSTANT(0.282094791773999990) * g[0] + CONSTANT(0.126156626101000010) * g[6] + CONSTANT(-0.145673124078999990) * g[8] + + CONSTANT(0.025644981070299999) * g[20] + CONSTANT(-0.114687841910000000) * g[22]; + y[11] += tf * g[11] + tg * f[11]; t = f[11] * g[11]; - y[0] += CONSTANT(0.282094791773999990)*t; - y[6] += CONSTANT(0.126156626101000010)*t; - y[8] += CONSTANT(-0.145673124078999990)*t; - y[20] += CONSTANT(0.025644981070299999)*t; - y[22] += CONSTANT(-0.114687841910000000)*t; + y[0] += CONSTANT(0.282094791773999990) * t; + y[6] += CONSTANT(0.126156626101000010) * t; + y[8] += CONSTANT(-0.145673124078999990) * t; + y[20] += CONSTANT(0.025644981070299999) * t; + y[22] += CONSTANT(-0.114687841910000000) * t; // [11,16]: 15,33,35, - tf = CONSTANT(-0.117520066953000000)*f[15] + CONSTANT(0.119929220739999990)*f[33] + CONSTANT(0.134084945035999990)*f[35]; - tg = CONSTANT(-0.117520066953000000)*g[15] + CONSTANT(0.119929220739999990)*g[33] + CONSTANT(0.134084945035999990)*g[35]; - y[11] += tf*g[16] + tg*f[16]; - y[16] += tf*g[11] + tg*f[11]; + tf = CONSTANT(-0.117520066953000000) * f[15] + CONSTANT(0.119929220739999990) * f[33] + CONSTANT(0.134084945035999990) * f[35]; + tg = CONSTANT(-0.117520066953000000) * g[15] + CONSTANT(0.119929220739999990) * g[33] + CONSTANT(0.134084945035999990) * g[35]; + y[11] += tf * g[16] + tg * f[16]; + y[16] += tf * g[11] + tg * f[11]; t = f[11] * g[16] + f[16] * g[11]; - y[15] += CONSTANT(-0.117520066953000000)*t; - y[33] += CONSTANT(0.119929220739999990)*t; - y[35] += CONSTANT(0.134084945035999990)*t; + y[15] += CONSTANT(-0.117520066953000000) * t; + y[33] += CONSTANT(0.119929220739999990) * t; + y[35] += CONSTANT(0.134084945035999990) * t; // [11,18]: 3,13,15,31,33, - tf = CONSTANT(0.168583882834000000)*f[3] + CONSTANT(0.114687841909000000)*f[13] + CONSTANT(-0.133255230519000010)*f[15] + CONSTANT(0.075189952564900006)*f[31] + CONSTANT(-0.101990215611000000)*f[33]; - tg = CONSTANT(0.168583882834000000)*g[3] + CONSTANT(0.114687841909000000)*g[13] + CONSTANT(-0.133255230519000010)*g[15] + CONSTANT(0.075189952564900006)*g[31] + CONSTANT(-0.101990215611000000)*g[33]; - y[11] += tf*g[18] + tg*f[18]; - y[18] += tf*g[11] + tg*f[11]; + tf = CONSTANT(0.168583882834000000) * f[3] + CONSTANT(0.114687841909000000) * f[13] + CONSTANT(-0.133255230519000010) * f[15] + + CONSTANT(0.075189952564900006) * f[31] + CONSTANT(-0.101990215611000000) * f[33]; + tg = CONSTANT(0.168583882834000000) * g[3] + CONSTANT(0.114687841909000000) * g[13] + CONSTANT(-0.133255230519000010) * g[15] + + CONSTANT(0.075189952564900006) * g[31] + CONSTANT(-0.101990215611000000) * g[33]; + y[11] += tf * g[18] + tg * f[18]; + y[18] += tf * g[11] + tg * f[11]; t = f[11] * g[18] + f[18] * g[11]; - y[3] += CONSTANT(0.168583882834000000)*t; - y[13] += CONSTANT(0.114687841909000000)*t; - y[15] += CONSTANT(-0.133255230519000010)*t; - y[31] += CONSTANT(0.075189952564900006)*t; - y[33] += CONSTANT(-0.101990215611000000)*t; + y[3] += CONSTANT(0.168583882834000000) * t; + y[13] += CONSTANT(0.114687841909000000) * t; + y[15] += CONSTANT(-0.133255230519000010) * t; + y[31] += CONSTANT(0.075189952564900006) * t; + y[33] += CONSTANT(-0.101990215611000000) * t; // [11,19]: 2,14,12,30,32, - tf = CONSTANT(0.238413613504000000)*f[2] + CONSTANT(-0.102579924282000000)*f[14] + CONSTANT(0.099322584599300004)*f[12] + CONSTANT(0.009577496073830001)*f[30] + CONSTANT(-0.104682806112000000)*f[32]; - tg = CONSTANT(0.238413613504000000)*g[2] + CONSTANT(-0.102579924282000000)*g[14] + CONSTANT(0.099322584599300004)*g[12] + CONSTANT(0.009577496073830001)*g[30] + CONSTANT(-0.104682806112000000)*g[32]; - y[11] += tf*g[19] + tg*f[19]; - y[19] += tf*g[11] + tg*f[11]; + tf = CONSTANT(0.238413613504000000) * f[2] + CONSTANT(-0.102579924282000000) * f[14] + CONSTANT(0.099322584599300004) * f[12] + + CONSTANT(0.009577496073830001) * f[30] + CONSTANT(-0.104682806112000000) * f[32]; + tg = CONSTANT(0.238413613504000000) * g[2] + CONSTANT(-0.102579924282000000) * g[14] + CONSTANT(0.099322584599300004) * g[12] + + CONSTANT(0.009577496073830001) * g[30] + CONSTANT(-0.104682806112000000) * g[32]; + y[11] += tf * g[19] + tg * f[19]; + y[19] += tf * g[11] + tg * f[11]; t = f[11] * g[19] + f[19] * g[11]; - y[2] += CONSTANT(0.238413613504000000)*t; - y[14] += CONSTANT(-0.102579924282000000)*t; - y[12] += CONSTANT(0.099322584599300004)*t; - y[30] += CONSTANT(0.009577496073830001)*t; - y[32] += CONSTANT(-0.104682806112000000)*t; + y[2] += CONSTANT(0.238413613504000000) * t; + y[14] += CONSTANT(-0.102579924282000000) * t; + y[12] += CONSTANT(0.099322584599300004) * t; + y[30] += CONSTANT(0.009577496073830001) * t; + y[32] += CONSTANT(-0.104682806112000000) * t; // [11,24]: 9,25,27, - tf = CONSTANT(0.117520066950999990)*f[9] + CONSTANT(-0.134084945037000000)*f[25] + CONSTANT(-0.119929220742000010)*f[27]; - tg = CONSTANT(0.117520066950999990)*g[9] + CONSTANT(-0.134084945037000000)*g[25] + CONSTANT(-0.119929220742000010)*g[27]; - y[11] += tf*g[24] + tg*f[24]; - y[24] += tf*g[11] + tg*f[11]; + tf = CONSTANT(0.117520066950999990) * f[9] + CONSTANT(-0.134084945037000000) * f[25] + CONSTANT(-0.119929220742000010) * f[27]; + tg = CONSTANT(0.117520066950999990) * g[9] + CONSTANT(-0.134084945037000000) * g[25] + CONSTANT(-0.119929220742000010) * g[27]; + y[11] += tf * g[24] + tg * f[24]; + y[24] += tf * g[11] + tg * f[11]; t = f[11] * g[24] + f[24] * g[11]; - y[9] += CONSTANT(0.117520066950999990)*t; - y[25] += CONSTANT(-0.134084945037000000)*t; - y[27] += CONSTANT(-0.119929220742000010)*t; + y[9] += CONSTANT(0.117520066950999990) * t; + y[25] += CONSTANT(-0.134084945037000000) * t; + y[27] += CONSTANT(-0.119929220742000010) * t; // [11,29]: 6,20,22,8, - tf = CONSTANT(0.227318461243000010)*f[6] + CONSTANT(0.086019920779800002)*f[20] + CONSTANT(-0.075189952565200002)*f[22] + CONSTANT(0.065621187395299999)*f[8]; - tg = CONSTANT(0.227318461243000010)*g[6] + CONSTANT(0.086019920779800002)*g[20] + CONSTANT(-0.075189952565200002)*g[22] + CONSTANT(0.065621187395299999)*g[8]; - y[11] += tf*g[29] + tg*f[29]; - y[29] += tf*g[11] + tg*f[11]; + tf = CONSTANT(0.227318461243000010) * f[6] + CONSTANT(0.086019920779800002) * f[20] + CONSTANT(-0.075189952565200002) * f[22] + + CONSTANT(0.065621187395299999) * f[8]; + tg = CONSTANT(0.227318461243000010) * g[6] + CONSTANT(0.086019920779800002) * g[20] + CONSTANT(-0.075189952565200002) * g[22] + + CONSTANT(0.065621187395299999) * g[8]; + y[11] += tf * g[29] + tg * f[29]; + y[29] += tf * g[11] + tg * f[11]; t = f[11] * g[29] + f[29] * g[11]; - y[6] += CONSTANT(0.227318461243000010)*t; - y[20] += CONSTANT(0.086019920779800002)*t; - y[22] += CONSTANT(-0.075189952565200002)*t; - y[8] += CONSTANT(0.065621187395299999)*t; + y[6] += CONSTANT(0.227318461243000010) * t; + y[20] += CONSTANT(0.086019920779800002) * t; + y[22] += CONSTANT(-0.075189952565200002) * t; + y[8] += CONSTANT(0.065621187395299999) * t; // [12,12]: 0,6,20, - tf = CONSTANT(0.282094799871999980)*f[0] + CONSTANT(0.168208852954000010)*f[6] + CONSTANT(0.153869910786000010)*f[20]; - tg = CONSTANT(0.282094799871999980)*g[0] + CONSTANT(0.168208852954000010)*g[6] + CONSTANT(0.153869910786000010)*g[20]; - y[12] += tf*g[12] + tg*f[12]; + tf = CONSTANT(0.282094799871999980) * f[0] + CONSTANT(0.168208852954000010) * f[6] + CONSTANT(0.153869910786000010) * f[20]; + tg = CONSTANT(0.282094799871999980) * g[0] + CONSTANT(0.168208852954000010) * g[6] + CONSTANT(0.153869910786000010) * g[20]; + y[12] += tf * g[12] + tg * f[12]; t = f[12] * g[12]; - y[0] += CONSTANT(0.282094799871999980)*t; - y[6] += CONSTANT(0.168208852954000010)*t; - y[20] += CONSTANT(0.153869910786000010)*t; + y[0] += CONSTANT(0.282094799871999980) * t; + y[6] += CONSTANT(0.168208852954000010) * t; + y[20] += CONSTANT(0.153869910786000010) * t; // [12,30]: 20,6, - tf = CONSTANT(0.148373961712999990)*f[20] + CONSTANT(0.239614719999000000)*f[6]; - tg = CONSTANT(0.148373961712999990)*g[20] + CONSTANT(0.239614719999000000)*g[6]; - y[12] += tf*g[30] + tg*f[30]; - y[30] += tf*g[12] + tg*f[12]; + tf = CONSTANT(0.148373961712999990) * f[20] + CONSTANT(0.239614719999000000) * f[6]; + tg = CONSTANT(0.148373961712999990) * g[20] + CONSTANT(0.239614719999000000) * g[6]; + y[12] += tf * g[30] + tg * f[30]; + y[30] += tf * g[12] + tg * f[12]; t = f[12] * g[30] + f[30] * g[12]; - y[20] += CONSTANT(0.148373961712999990)*t; - y[6] += CONSTANT(0.239614719999000000)*t; + y[20] += CONSTANT(0.148373961712999990) * t; + y[6] += CONSTANT(0.239614719999000000) * t; // [13,13]: 0,8,6,20,22, - tf = CONSTANT(0.282094791773999990)*f[0] + CONSTANT(0.145673124078999990)*f[8] + CONSTANT(0.126156626101000010)*f[6] + CONSTANT(0.025644981070299999)*f[20] + CONSTANT(0.114687841910000000)*f[22]; - tg = CONSTANT(0.282094791773999990)*g[0] + CONSTANT(0.145673124078999990)*g[8] + CONSTANT(0.126156626101000010)*g[6] + CONSTANT(0.025644981070299999)*g[20] + CONSTANT(0.114687841910000000)*g[22]; - y[13] += tf*g[13] + tg*f[13]; + tf = CONSTANT(0.282094791773999990) * f[0] + CONSTANT(0.145673124078999990) * f[8] + CONSTANT(0.126156626101000010) * f[6] + + CONSTANT(0.025644981070299999) * f[20] + CONSTANT(0.114687841910000000) * f[22]; + tg = CONSTANT(0.282094791773999990) * g[0] + CONSTANT(0.145673124078999990) * g[8] + CONSTANT(0.126156626101000010) * g[6] + + CONSTANT(0.025644981070299999) * g[20] + CONSTANT(0.114687841910000000) * g[22]; + y[13] += tf * g[13] + tg * f[13]; t = f[13] * g[13]; - y[0] += CONSTANT(0.282094791773999990)*t; - y[8] += CONSTANT(0.145673124078999990)*t; - y[6] += CONSTANT(0.126156626101000010)*t; - y[20] += CONSTANT(0.025644981070299999)*t; - y[22] += CONSTANT(0.114687841910000000)*t; + y[0] += CONSTANT(0.282094791773999990) * t; + y[8] += CONSTANT(0.145673124078999990) * t; + y[6] += CONSTANT(0.126156626101000010) * t; + y[20] += CONSTANT(0.025644981070299999) * t; + y[22] += CONSTANT(0.114687841910000000) * t; // [13,16]: 9,25,27, - tf = CONSTANT(-0.117520066953000000)*f[9] + CONSTANT(-0.134084945035999990)*f[25] + CONSTANT(0.119929220739999990)*f[27]; - tg = CONSTANT(-0.117520066953000000)*g[9] + CONSTANT(-0.134084945035999990)*g[25] + CONSTANT(0.119929220739999990)*g[27]; - y[13] += tf*g[16] + tg*f[16]; - y[16] += tf*g[13] + tg*f[13]; + tf = CONSTANT(-0.117520066953000000) * f[9] + CONSTANT(-0.134084945035999990) * f[25] + CONSTANT(0.119929220739999990) * f[27]; + tg = CONSTANT(-0.117520066953000000) * g[9] + CONSTANT(-0.134084945035999990) * g[25] + CONSTANT(0.119929220739999990) * g[27]; + y[13] += tf * g[16] + tg * f[16]; + y[16] += tf * g[13] + tg * f[13]; t = f[13] * g[16] + f[16] * g[13]; - y[9] += CONSTANT(-0.117520066953000000)*t; - y[25] += CONSTANT(-0.134084945035999990)*t; - y[27] += CONSTANT(0.119929220739999990)*t; + y[9] += CONSTANT(-0.117520066953000000) * t; + y[25] += CONSTANT(-0.134084945035999990) * t; + y[27] += CONSTANT(0.119929220739999990) * t; // [13,21]: 2,12,14,30,32, - tf = CONSTANT(0.238413613504000000)*f[2] + CONSTANT(0.099322584599300004)*f[12] + CONSTANT(0.102579924282000000)*f[14] + CONSTANT(0.009577496073830001)*f[30] + CONSTANT(0.104682806112000000)*f[32]; - tg = CONSTANT(0.238413613504000000)*g[2] + CONSTANT(0.099322584599300004)*g[12] + CONSTANT(0.102579924282000000)*g[14] + CONSTANT(0.009577496073830001)*g[30] + CONSTANT(0.104682806112000000)*g[32]; - y[13] += tf*g[21] + tg*f[21]; - y[21] += tf*g[13] + tg*f[13]; + tf = CONSTANT(0.238413613504000000) * f[2] + CONSTANT(0.099322584599300004) * f[12] + CONSTANT(0.102579924282000000) * f[14] + + CONSTANT(0.009577496073830001) * f[30] + CONSTANT(0.104682806112000000) * f[32]; + tg = CONSTANT(0.238413613504000000) * g[2] + CONSTANT(0.099322584599300004) * g[12] + CONSTANT(0.102579924282000000) * g[14] + + CONSTANT(0.009577496073830001) * g[30] + CONSTANT(0.104682806112000000) * g[32]; + y[13] += tf * g[21] + tg * f[21]; + y[21] += tf * g[13] + tg * f[13]; t = f[13] * g[21] + f[21] * g[13]; - y[2] += CONSTANT(0.238413613504000000)*t; - y[12] += CONSTANT(0.099322584599300004)*t; - y[14] += CONSTANT(0.102579924282000000)*t; - y[30] += CONSTANT(0.009577496073830001)*t; - y[32] += CONSTANT(0.104682806112000000)*t; + y[2] += CONSTANT(0.238413613504000000) * t; + y[12] += CONSTANT(0.099322584599300004) * t; + y[14] += CONSTANT(0.102579924282000000) * t; + y[30] += CONSTANT(0.009577496073830001) * t; + y[32] += CONSTANT(0.104682806112000000) * t; // [13,24]: 15,33,35, - tf = CONSTANT(-0.117520066950999990)*f[15] + CONSTANT(0.119929220742000010)*f[33] + CONSTANT(-0.134084945037000000)*f[35]; - tg = CONSTANT(-0.117520066950999990)*g[15] + CONSTANT(0.119929220742000010)*g[33] + CONSTANT(-0.134084945037000000)*g[35]; - y[13] += tf*g[24] + tg*f[24]; - y[24] += tf*g[13] + tg*f[13]; + tf = CONSTANT(-0.117520066950999990) * f[15] + CONSTANT(0.119929220742000010) * f[33] + CONSTANT(-0.134084945037000000) * f[35]; + tg = CONSTANT(-0.117520066950999990) * g[15] + CONSTANT(0.119929220742000010) * g[33] + CONSTANT(-0.134084945037000000) * g[35]; + y[13] += tf * g[24] + tg * f[24]; + y[24] += tf * g[13] + tg * f[13]; t = f[13] * g[24] + f[24] * g[13]; - y[15] += CONSTANT(-0.117520066950999990)*t; - y[33] += CONSTANT(0.119929220742000010)*t; - y[35] += CONSTANT(-0.134084945037000000)*t; + y[15] += CONSTANT(-0.117520066950999990) * t; + y[33] += CONSTANT(0.119929220742000010) * t; + y[35] += CONSTANT(-0.134084945037000000) * t; // [13,31]: 6,22,20,8, - tf = CONSTANT(0.227318461243000010)*f[6] + CONSTANT(0.075189952565200002)*f[22] + CONSTANT(0.086019920779800002)*f[20] + CONSTANT(-0.065621187395299999)*f[8]; - tg = CONSTANT(0.227318461243000010)*g[6] + CONSTANT(0.075189952565200002)*g[22] + CONSTANT(0.086019920779800002)*g[20] + CONSTANT(-0.065621187395299999)*g[8]; - y[13] += tf*g[31] + tg*f[31]; - y[31] += tf*g[13] + tg*f[13]; + tf = CONSTANT(0.227318461243000010) * f[6] + CONSTANT(0.075189952565200002) * f[22] + CONSTANT(0.086019920779800002) * f[20] + + CONSTANT(-0.065621187395299999) * f[8]; + tg = CONSTANT(0.227318461243000010) * g[6] + CONSTANT(0.075189952565200002) * g[22] + CONSTANT(0.086019920779800002) * g[20] + + CONSTANT(-0.065621187395299999) * g[8]; + y[13] += tf * g[31] + tg * f[31]; + y[31] += tf * g[13] + tg * f[13]; t = f[13] * g[31] + f[31] * g[13]; - y[6] += CONSTANT(0.227318461243000010)*t; - y[22] += CONSTANT(0.075189952565200002)*t; - y[20] += CONSTANT(0.086019920779800002)*t; - y[8] += CONSTANT(-0.065621187395299999)*t; + y[6] += CONSTANT(0.227318461243000010) * t; + y[22] += CONSTANT(0.075189952565200002) * t; + y[20] += CONSTANT(0.086019920779800002) * t; + y[8] += CONSTANT(-0.065621187395299999) * t; // [14,14]: 0,20,24, - tf = CONSTANT(0.282094791771999980)*f[0] + CONSTANT(-0.179514867494000000)*f[20] + CONSTANT(0.151717754049000010)*f[24]; - tg = CONSTANT(0.282094791771999980)*g[0] + CONSTANT(-0.179514867494000000)*g[20] + CONSTANT(0.151717754049000010)*g[24]; - y[14] += tf*g[14] + tg*f[14]; + tf = CONSTANT(0.282094791771999980) * f[0] + CONSTANT(-0.179514867494000000) * f[20] + CONSTANT(0.151717754049000010) * f[24]; + tg = CONSTANT(0.282094791771999980) * g[0] + CONSTANT(-0.179514867494000000) * g[20] + CONSTANT(0.151717754049000010) * g[24]; + y[14] += tf * g[14] + tg * f[14]; t = f[14] * g[14]; - y[0] += CONSTANT(0.282094791771999980)*t; - y[20] += CONSTANT(-0.179514867494000000)*t; - y[24] += CONSTANT(0.151717754049000010)*t; + y[0] += CONSTANT(0.282094791771999980) * t; + y[20] += CONSTANT(-0.179514867494000000) * t; + y[24] += CONSTANT(0.151717754049000010) * t; // [14,17]: 11,1,25,29, - tf = CONSTANT(0.067850242288500007)*f[11] + CONSTANT(0.199471140196999990)*f[1] + CONSTANT(0.149911525925999990)*f[25] + CONSTANT(-0.113793659092000000)*f[29]; - tg = CONSTANT(0.067850242288500007)*g[11] + CONSTANT(0.199471140196999990)*g[1] + CONSTANT(0.149911525925999990)*g[25] + CONSTANT(-0.113793659092000000)*g[29]; - y[14] += tf*g[17] + tg*f[17]; - y[17] += tf*g[14] + tg*f[14]; + tf = CONSTANT(0.067850242288500007) * f[11] + CONSTANT(0.199471140196999990) * f[1] + CONSTANT(0.149911525925999990) * f[25] + + CONSTANT(-0.113793659092000000) * f[29]; + tg = CONSTANT(0.067850242288500007) * g[11] + CONSTANT(0.199471140196999990) * g[1] + CONSTANT(0.149911525925999990) * g[25] + + CONSTANT(-0.113793659092000000) * g[29]; + y[14] += tf * g[17] + tg * f[17]; + y[17] += tf * g[14] + tg * f[14]; t = f[14] * g[17] + f[17] * g[14]; - y[11] += CONSTANT(0.067850242288500007)*t; - y[1] += CONSTANT(0.199471140196999990)*t; - y[25] += CONSTANT(0.149911525925999990)*t; - y[29] += CONSTANT(-0.113793659092000000)*t; + y[11] += CONSTANT(0.067850242288500007) * t; + y[1] += CONSTANT(0.199471140196999990) * t; + y[25] += CONSTANT(0.149911525925999990) * t; + y[29] += CONSTANT(-0.113793659092000000) * t; // [14,22]: 12,2,30,34, - tf = CONSTANT(-0.044418410173299998)*f[12] + CONSTANT(0.213243618621000000)*f[2] + CONSTANT(-0.171327458205000000)*f[30] + CONSTANT(0.101358691177000000)*f[34]; - tg = CONSTANT(-0.044418410173299998)*g[12] + CONSTANT(0.213243618621000000)*g[2] + CONSTANT(-0.171327458205000000)*g[30] + CONSTANT(0.101358691177000000)*g[34]; - y[14] += tf*g[22] + tg*f[22]; - y[22] += tf*g[14] + tg*f[14]; + tf = CONSTANT(-0.044418410173299998) * f[12] + CONSTANT(0.213243618621000000) * f[2] + CONSTANT(-0.171327458205000000) * f[30] + + CONSTANT(0.101358691177000000) * f[34]; + tg = CONSTANT(-0.044418410173299998) * g[12] + CONSTANT(0.213243618621000000) * g[2] + CONSTANT(-0.171327458205000000) * g[30] + + CONSTANT(0.101358691177000000) * g[34]; + y[14] += tf * g[22] + tg * f[22]; + y[22] += tf * g[14] + tg * f[14]; t = f[14] * g[22] + f[22] * g[14]; - y[12] += CONSTANT(-0.044418410173299998)*t; - y[2] += CONSTANT(0.213243618621000000)*t; - y[30] += CONSTANT(-0.171327458205000000)*t; - y[34] += CONSTANT(0.101358691177000000)*t; + y[12] += CONSTANT(-0.044418410173299998) * t; + y[2] += CONSTANT(0.213243618621000000) * t; + y[30] += CONSTANT(-0.171327458205000000) * t; + y[34] += CONSTANT(0.101358691177000000) * t; // [14,23]: 13,3,31,35, - tf = CONSTANT(0.067850242288500007)*f[13] + CONSTANT(0.199471140196999990)*f[3] + CONSTANT(-0.113793659092000000)*f[31] + CONSTANT(0.149911525925999990)*f[35]; - tg = CONSTANT(0.067850242288500007)*g[13] + CONSTANT(0.199471140196999990)*g[3] + CONSTANT(-0.113793659092000000)*g[31] + CONSTANT(0.149911525925999990)*g[35]; - y[14] += tf*g[23] + tg*f[23]; - y[23] += tf*g[14] + tg*f[14]; + tf = CONSTANT(0.067850242288500007) * f[13] + CONSTANT(0.199471140196999990) * f[3] + CONSTANT(-0.113793659092000000) * f[31] + + CONSTANT(0.149911525925999990) * f[35]; + tg = CONSTANT(0.067850242288500007) * g[13] + CONSTANT(0.199471140196999990) * g[3] + CONSTANT(-0.113793659092000000) * g[31] + + CONSTANT(0.149911525925999990) * g[35]; + y[14] += tf * g[23] + tg * f[23]; + y[23] += tf * g[14] + tg * f[14]; t = f[14] * g[23] + f[23] * g[14]; - y[13] += CONSTANT(0.067850242288500007)*t; - y[3] += CONSTANT(0.199471140196999990)*t; - y[31] += CONSTANT(-0.113793659092000000)*t; - y[35] += CONSTANT(0.149911525925999990)*t; + y[13] += CONSTANT(0.067850242288500007) * t; + y[3] += CONSTANT(0.199471140196999990) * t; + y[31] += CONSTANT(-0.113793659092000000) * t; + y[35] += CONSTANT(0.149911525925999990) * t; // [14,32]: 20,6,24, - tf = CONSTANT(-0.065426753820500005)*f[20] + CONSTANT(0.190188269814000000)*f[6] + CONSTANT(-0.077413979109600004)*f[24]; - tg = CONSTANT(-0.065426753820500005)*g[20] + CONSTANT(0.190188269814000000)*g[6] + CONSTANT(-0.077413979109600004)*g[24]; - y[14] += tf*g[32] + tg*f[32]; - y[32] += tf*g[14] + tg*f[14]; + tf = CONSTANT(-0.065426753820500005) * f[20] + CONSTANT(0.190188269814000000) * f[6] + CONSTANT(-0.077413979109600004) * f[24]; + tg = CONSTANT(-0.065426753820500005) * g[20] + CONSTANT(0.190188269814000000) * g[6] + CONSTANT(-0.077413979109600004) * g[24]; + y[14] += tf * g[32] + tg * f[32]; + y[32] += tf * g[14] + tg * f[14]; t = f[14] * g[32] + f[32] * g[14]; - y[20] += CONSTANT(-0.065426753820500005)*t; - y[6] += CONSTANT(0.190188269814000000)*t; - y[24] += CONSTANT(-0.077413979109600004)*t; + y[20] += CONSTANT(-0.065426753820500005) * t; + y[6] += CONSTANT(0.190188269814000000) * t; + y[24] += CONSTANT(-0.077413979109600004) * t; // [15,15]: 0,6,20, - tf = CONSTANT(0.282094791766999970)*f[0] + CONSTANT(-0.210261043508000010)*f[6] + CONSTANT(0.076934943209800002)*f[20]; - tg = CONSTANT(0.282094791766999970)*g[0] + CONSTANT(-0.210261043508000010)*g[6] + CONSTANT(0.076934943209800002)*g[20]; - y[15] += tf*g[15] + tg*f[15]; + tf = CONSTANT(0.282094791766999970) * f[0] + CONSTANT(-0.210261043508000010) * f[6] + CONSTANT(0.076934943209800002) * f[20]; + tg = CONSTANT(0.282094791766999970) * g[0] + CONSTANT(-0.210261043508000010) * g[6] + CONSTANT(0.076934943209800002) * g[20]; + y[15] += tf * g[15] + tg * f[15]; t = f[15] * g[15]; - y[0] += CONSTANT(0.282094791766999970)*t; - y[6] += CONSTANT(-0.210261043508000010)*t; - y[20] += CONSTANT(0.076934943209800002)*t; + y[0] += CONSTANT(0.282094791766999970) * t; + y[6] += CONSTANT(-0.210261043508000010) * t; + y[20] += CONSTANT(0.076934943209800002) * t; // [15,21]: 14,32,34, - tf = CONSTANT(-0.099322584600699995)*f[14] + CONSTANT(0.126698363970000010)*f[32] + CONSTANT(-0.131668802180999990)*f[34]; - tg = CONSTANT(-0.099322584600699995)*g[14] + CONSTANT(0.126698363970000010)*g[32] + CONSTANT(-0.131668802180999990)*g[34]; - y[15] += tf*g[21] + tg*f[21]; - y[21] += tf*g[15] + tg*f[15]; + tf = CONSTANT(-0.099322584600699995) * f[14] + CONSTANT(0.126698363970000010) * f[32] + CONSTANT(-0.131668802180999990) * f[34]; + tg = CONSTANT(-0.099322584600699995) * g[14] + CONSTANT(0.126698363970000010) * g[32] + CONSTANT(-0.131668802180999990) * g[34]; + y[15] += tf * g[21] + tg * f[21]; + y[21] += tf * g[15] + tg * f[15]; t = f[15] * g[21] + f[21] * g[15]; - y[14] += CONSTANT(-0.099322584600699995)*t; - y[32] += CONSTANT(0.126698363970000010)*t; - y[34] += CONSTANT(-0.131668802180999990)*t; + y[14] += CONSTANT(-0.099322584600699995) * t; + y[32] += CONSTANT(0.126698363970000010) * t; + y[34] += CONSTANT(-0.131668802180999990) * t; // [15,22]: 13,3,31,35, - tf = CONSTANT(0.133255230518000010)*f[13] + CONSTANT(-0.043528171378199997)*f[3] + CONSTANT(-0.101584686311000000)*f[31] + CONSTANT(-0.098140130732499997)*f[35]; - tg = CONSTANT(0.133255230518000010)*g[13] + CONSTANT(-0.043528171378199997)*g[3] + CONSTANT(-0.101584686311000000)*g[31] + CONSTANT(-0.098140130732499997)*g[35]; - y[15] += tf*g[22] + tg*f[22]; - y[22] += tf*g[15] + tg*f[15]; + tf = CONSTANT(0.133255230518000010) * f[13] + CONSTANT(-0.043528171378199997) * f[3] + CONSTANT(-0.101584686311000000) * f[31] + + CONSTANT(-0.098140130732499997) * f[35]; + tg = CONSTANT(0.133255230518000010) * g[13] + CONSTANT(-0.043528171378199997) * g[3] + CONSTANT(-0.101584686311000000) * g[31] + + CONSTANT(-0.098140130732499997) * g[35]; + y[15] += tf * g[22] + tg * f[22]; + y[22] += tf * g[15] + tg * f[15]; t = f[15] * g[22] + f[22] * g[15]; - y[13] += CONSTANT(0.133255230518000010)*t; - y[3] += CONSTANT(-0.043528171378199997)*t; - y[31] += CONSTANT(-0.101584686311000000)*t; - y[35] += CONSTANT(-0.098140130732499997)*t; + y[13] += CONSTANT(0.133255230518000010) * t; + y[3] += CONSTANT(-0.043528171378199997) * t; + y[31] += CONSTANT(-0.101584686311000000) * t; + y[35] += CONSTANT(-0.098140130732499997) * t; // [15,23]: 12,2,30, - tf = CONSTANT(-0.203550726872999990)*f[12] + CONSTANT(0.162867503964999990)*f[2] + CONSTANT(0.098140130728100003)*f[30]; - tg = CONSTANT(-0.203550726872999990)*g[12] + CONSTANT(0.162867503964999990)*g[2] + CONSTANT(0.098140130728100003)*g[30]; - y[15] += tf*g[23] + tg*f[23]; - y[23] += tf*g[15] + tg*f[15]; + tf = CONSTANT(-0.203550726872999990) * f[12] + CONSTANT(0.162867503964999990) * f[2] + CONSTANT(0.098140130728100003) * f[30]; + tg = CONSTANT(-0.203550726872999990) * g[12] + CONSTANT(0.162867503964999990) * g[2] + CONSTANT(0.098140130728100003) * g[30]; + y[15] += tf * g[23] + tg * f[23]; + y[23] += tf * g[15] + tg * f[15]; t = f[15] * g[23] + f[23] * g[15]; - y[12] += CONSTANT(-0.203550726872999990)*t; - y[2] += CONSTANT(0.162867503964999990)*t; - y[30] += CONSTANT(0.098140130728100003)*t; + y[12] += CONSTANT(-0.203550726872999990) * t; + y[2] += CONSTANT(0.162867503964999990) * t; + y[30] += CONSTANT(0.098140130728100003) * t; // [15,33]: 6,20, - tf = CONSTANT(0.126792179874999990)*f[6] + CONSTANT(-0.196280261464999990)*f[20]; - tg = CONSTANT(0.126792179874999990)*g[6] + CONSTANT(-0.196280261464999990)*g[20]; - y[15] += tf*g[33] + tg*f[33]; - y[33] += tf*g[15] + tg*f[15]; + tf = CONSTANT(0.126792179874999990) * f[6] + CONSTANT(-0.196280261464999990) * f[20]; + tg = CONSTANT(0.126792179874999990) * g[6] + CONSTANT(-0.196280261464999990) * g[20]; + y[15] += tf * g[33] + tg * f[33]; + y[33] += tf * g[15] + tg * f[15]; t = f[15] * g[33] + f[33] * g[15]; - y[6] += CONSTANT(0.126792179874999990)*t; - y[20] += CONSTANT(-0.196280261464999990)*t; + y[6] += CONSTANT(0.126792179874999990) * t; + y[20] += CONSTANT(-0.196280261464999990) * t; // [16,16]: 0,6,20, - tf = CONSTANT(0.282094791763999990)*f[0] + CONSTANT(-0.229375683829000000)*f[6] + CONSTANT(0.106525305981000000)*f[20]; - tg = CONSTANT(0.282094791763999990)*g[0] + CONSTANT(-0.229375683829000000)*g[6] + CONSTANT(0.106525305981000000)*g[20]; - y[16] += tf*g[16] + tg*f[16]; + tf = CONSTANT(0.282094791763999990) * f[0] + CONSTANT(-0.229375683829000000) * f[6] + CONSTANT(0.106525305981000000) * f[20]; + tg = CONSTANT(0.282094791763999990) * g[0] + CONSTANT(-0.229375683829000000) * g[6] + CONSTANT(0.106525305981000000) * g[20]; + y[16] += tf * g[16] + tg * f[16]; t = f[16] * g[16]; - y[0] += CONSTANT(0.282094791763999990)*t; - y[6] += CONSTANT(-0.229375683829000000)*t; - y[20] += CONSTANT(0.106525305981000000)*t; + y[0] += CONSTANT(0.282094791763999990) * t; + y[6] += CONSTANT(-0.229375683829000000) * t; + y[20] += CONSTANT(0.106525305981000000) * t; // [16,18]: 8,22, - tf = CONSTANT(-0.075080816693699995)*f[8] + CONSTANT(0.135045473380000000)*f[22]; - tg = CONSTANT(-0.075080816693699995)*g[8] + CONSTANT(0.135045473380000000)*g[22]; - y[16] += tf*g[18] + tg*f[18]; - y[18] += tf*g[16] + tg*f[16]; + tf = CONSTANT(-0.075080816693699995) * f[8] + CONSTANT(0.135045473380000000) * f[22]; + tg = CONSTANT(-0.075080816693699995) * g[8] + CONSTANT(0.135045473380000000) * g[22]; + y[16] += tf * g[18] + tg * f[18]; + y[18] += tf * g[16] + tg * f[16]; t = f[16] * g[18] + f[18] * g[16]; - y[8] += CONSTANT(-0.075080816693699995)*t; - y[22] += CONSTANT(0.135045473380000000)*t; + y[8] += CONSTANT(-0.075080816693699995) * t; + y[22] += CONSTANT(0.135045473380000000) * t; // [16,23]: 19,5, - tf = CONSTANT(-0.119098912754999990)*f[19] + CONSTANT(0.140463346187999990)*f[5]; - tg = CONSTANT(-0.119098912754999990)*g[19] + CONSTANT(0.140463346187999990)*g[5]; - y[16] += tf*g[23] + tg*f[23]; - y[23] += tf*g[16] + tg*f[16]; + tf = CONSTANT(-0.119098912754999990) * f[19] + CONSTANT(0.140463346187999990) * f[5]; + tg = CONSTANT(-0.119098912754999990) * g[19] + CONSTANT(0.140463346187999990) * g[5]; + y[16] += tf * g[23] + tg * f[23]; + y[23] += tf * g[16] + tg * f[16]; t = f[16] * g[23] + f[23] * g[16]; - y[19] += CONSTANT(-0.119098912754999990)*t; - y[5] += CONSTANT(0.140463346187999990)*t; + y[19] += CONSTANT(-0.119098912754999990) * t; + y[5] += CONSTANT(0.140463346187999990) * t; // [16,26]: 12,2,30, - tf = CONSTANT(-0.207723503645000000)*f[12] + CONSTANT(0.147319200325000010)*f[2] + CONSTANT(0.130197596199999990)*f[30]; - tg = CONSTANT(-0.207723503645000000)*g[12] + CONSTANT(0.147319200325000010)*g[2] + CONSTANT(0.130197596199999990)*g[30]; - y[16] += tf*g[26] + tg*f[26]; - y[26] += tf*g[16] + tg*f[16]; + tf = CONSTANT(-0.207723503645000000) * f[12] + CONSTANT(0.147319200325000010) * f[2] + CONSTANT(0.130197596199999990) * f[30]; + tg = CONSTANT(-0.207723503645000000) * g[12] + CONSTANT(0.147319200325000010) * g[2] + CONSTANT(0.130197596199999990) * g[30]; + y[16] += tf * g[26] + tg * f[26]; + y[26] += tf * g[16] + tg * f[16]; t = f[16] * g[26] + f[26] * g[16]; - y[12] += CONSTANT(-0.207723503645000000)*t; - y[2] += CONSTANT(0.147319200325000010)*t; - y[30] += CONSTANT(0.130197596199999990)*t; + y[12] += CONSTANT(-0.207723503645000000) * t; + y[2] += CONSTANT(0.147319200325000010) * t; + y[30] += CONSTANT(0.130197596199999990) * t; // [16,28]: 14,32, - tf = CONSTANT(-0.077413979111300005)*f[14] + CONSTANT(0.128376561115000010)*f[32]; - tg = CONSTANT(-0.077413979111300005)*g[14] + CONSTANT(0.128376561115000010)*g[32]; - y[16] += tf*g[28] + tg*f[28]; - y[28] += tf*g[16] + tg*f[16]; + tf = CONSTANT(-0.077413979111300005) * f[14] + CONSTANT(0.128376561115000010) * f[32]; + tg = CONSTANT(-0.077413979111300005) * g[14] + CONSTANT(0.128376561115000010) * g[32]; + y[16] += tf * g[28] + tg * f[28]; + y[28] += tf * g[16] + tg * f[16]; t = f[16] * g[28] + f[28] * g[16]; - y[14] += CONSTANT(-0.077413979111300005)*t; - y[32] += CONSTANT(0.128376561115000010)*t; + y[14] += CONSTANT(-0.077413979111300005) * t; + y[32] += CONSTANT(0.128376561115000010) * t; // [16,29]: 15,33,35, - tf = CONSTANT(0.035835708931099997)*f[15] + CONSTANT(-0.118853600623999990)*f[33] + CONSTANT(-0.053152946071899999)*f[35]; - tg = CONSTANT(0.035835708931099997)*g[15] + CONSTANT(-0.118853600623999990)*g[33] + CONSTANT(-0.053152946071899999)*g[35]; - y[16] += tf*g[29] + tg*f[29]; - y[29] += tf*g[16] + tg*f[16]; + tf = CONSTANT(0.035835708931099997) * f[15] + CONSTANT(-0.118853600623999990) * f[33] + CONSTANT(-0.053152946071899999) * f[35]; + tg = CONSTANT(0.035835708931099997) * g[15] + CONSTANT(-0.118853600623999990) * g[33] + CONSTANT(-0.053152946071899999) * g[35]; + y[16] += tf * g[29] + tg * f[29]; + y[29] += tf * g[16] + tg * f[16]; t = f[16] * g[29] + f[29] * g[16]; - y[15] += CONSTANT(0.035835708931099997)*t; - y[33] += CONSTANT(-0.118853600623999990)*t; - y[35] += CONSTANT(-0.053152946071899999)*t; + y[15] += CONSTANT(0.035835708931099997) * t; + y[33] += CONSTANT(-0.118853600623999990) * t; + y[35] += CONSTANT(-0.053152946071899999) * t; // [16,31]: 27,9,25, - tf = CONSTANT(-0.118853600623999990)*f[27] + CONSTANT(0.035835708931099997)*f[9] + CONSTANT(0.053152946071899999)*f[25]; - tg = CONSTANT(-0.118853600623999990)*g[27] + CONSTANT(0.035835708931099997)*g[9] + CONSTANT(0.053152946071899999)*g[25]; - y[16] += tf*g[31] + tg*f[31]; - y[31] += tf*g[16] + tg*f[16]; + tf = CONSTANT(-0.118853600623999990) * f[27] + CONSTANT(0.035835708931099997) * f[9] + CONSTANT(0.053152946071899999) * f[25]; + tg = CONSTANT(-0.118853600623999990) * g[27] + CONSTANT(0.035835708931099997) * g[9] + CONSTANT(0.053152946071899999) * g[25]; + y[16] += tf * g[31] + tg * f[31]; + y[31] += tf * g[16] + tg * f[16]; t = f[16] * g[31] + f[31] * g[16]; - y[27] += CONSTANT(-0.118853600623999990)*t; - y[9] += CONSTANT(0.035835708931099997)*t; - y[25] += CONSTANT(0.053152946071899999)*t; + y[27] += CONSTANT(-0.118853600623999990) * t; + y[9] += CONSTANT(0.035835708931099997) * t; + y[25] += CONSTANT(0.053152946071899999) * t; // [17,17]: 0,6,20, - tf = CONSTANT(0.282094791768999990)*f[0] + CONSTANT(-0.057343920955899998)*f[6] + CONSTANT(-0.159787958979000000)*f[20]; - tg = CONSTANT(0.282094791768999990)*g[0] + CONSTANT(-0.057343920955899998)*g[6] + CONSTANT(-0.159787958979000000)*g[20]; - y[17] += tf*g[17] + tg*f[17]; + tf = CONSTANT(0.282094791768999990) * f[0] + CONSTANT(-0.057343920955899998) * f[6] + CONSTANT(-0.159787958979000000) * f[20]; + tg = CONSTANT(0.282094791768999990) * g[0] + CONSTANT(-0.057343920955899998) * g[6] + CONSTANT(-0.159787958979000000) * g[20]; + y[17] += tf * g[17] + tg * f[17]; t = f[17] * g[17]; - y[0] += CONSTANT(0.282094791768999990)*t; - y[6] += CONSTANT(-0.057343920955899998)*t; - y[20] += CONSTANT(-0.159787958979000000)*t; + y[0] += CONSTANT(0.282094791768999990) * t; + y[6] += CONSTANT(-0.057343920955899998) * t; + y[20] += CONSTANT(-0.159787958979000000) * t; // [17,19]: 8,22,24, - tf = CONSTANT(-0.112621225039000000)*f[8] + CONSTANT(0.045015157794100001)*f[22] + CONSTANT(0.119098912753000000)*f[24]; - tg = CONSTANT(-0.112621225039000000)*g[8] + CONSTANT(0.045015157794100001)*g[22] + CONSTANT(0.119098912753000000)*g[24]; - y[17] += tf*g[19] + tg*f[19]; - y[19] += tf*g[17] + tg*f[17]; + tf = CONSTANT(-0.112621225039000000) * f[8] + CONSTANT(0.045015157794100001) * f[22] + CONSTANT(0.119098912753000000) * f[24]; + tg = CONSTANT(-0.112621225039000000) * g[8] + CONSTANT(0.045015157794100001) * g[22] + CONSTANT(0.119098912753000000) * g[24]; + y[17] += tf * g[19] + tg * f[19]; + y[19] += tf * g[17] + tg * f[17]; t = f[17] * g[19] + f[19] * g[17]; - y[8] += CONSTANT(-0.112621225039000000)*t; - y[22] += CONSTANT(0.045015157794100001)*t; - y[24] += CONSTANT(0.119098912753000000)*t; + y[8] += CONSTANT(-0.112621225039000000) * t; + y[22] += CONSTANT(0.045015157794100001) * t; + y[24] += CONSTANT(0.119098912753000000) * t; // [17,21]: 16,4,18, - tf = CONSTANT(-0.119098912754999990)*f[16] + CONSTANT(-0.112621225039000000)*f[4] + CONSTANT(0.045015157794399997)*f[18]; - tg = CONSTANT(-0.119098912754999990)*g[16] + CONSTANT(-0.112621225039000000)*g[4] + CONSTANT(0.045015157794399997)*g[18]; - y[17] += tf*g[21] + tg*f[21]; - y[21] += tf*g[17] + tg*f[17]; + tf = CONSTANT(-0.119098912754999990) * f[16] + CONSTANT(-0.112621225039000000) * f[4] + CONSTANT(0.045015157794399997) * f[18]; + tg = CONSTANT(-0.119098912754999990) * g[16] + CONSTANT(-0.112621225039000000) * g[4] + CONSTANT(0.045015157794399997) * g[18]; + y[17] += tf * g[21] + tg * f[21]; + y[21] += tf * g[17] + tg * f[17]; t = f[17] * g[21] + f[21] * g[17]; - y[16] += CONSTANT(-0.119098912754999990)*t; - y[4] += CONSTANT(-0.112621225039000000)*t; - y[18] += CONSTANT(0.045015157794399997)*t; + y[16] += CONSTANT(-0.119098912754999990) * t; + y[4] += CONSTANT(-0.112621225039000000) * t; + y[18] += CONSTANT(0.045015157794399997) * t; // [17,26]: 3,13,31, - tf = CONSTANT(0.208340811096000000)*f[3] + CONSTANT(0.029982305185199998)*f[13] + CONSTANT(-0.118853600623999990)*f[31]; - tg = CONSTANT(0.208340811096000000)*g[3] + CONSTANT(0.029982305185199998)*g[13] + CONSTANT(-0.118853600623999990)*g[31]; - y[17] += tf*g[26] + tg*f[26]; - y[26] += tf*g[17] + tg*f[17]; + tf = CONSTANT(0.208340811096000000) * f[3] + CONSTANT(0.029982305185199998) * f[13] + CONSTANT(-0.118853600623999990) * f[31]; + tg = CONSTANT(0.208340811096000000) * g[3] + CONSTANT(0.029982305185199998) * g[13] + CONSTANT(-0.118853600623999990) * g[31]; + y[17] += tf * g[26] + tg * f[26]; + y[26] += tf * g[17] + tg * f[17]; t = f[17] * g[26] + f[26] * g[17]; - y[3] += CONSTANT(0.208340811096000000)*t; - y[13] += CONSTANT(0.029982305185199998)*t; - y[31] += CONSTANT(-0.118853600623999990)*t; + y[3] += CONSTANT(0.208340811096000000) * t; + y[13] += CONSTANT(0.029982305185199998) * t; + y[31] += CONSTANT(-0.118853600623999990) * t; // [17,27]: 12,2,30, - tf = CONSTANT(-0.103861751821000010)*f[12] + CONSTANT(0.196425600433000000)*f[2] + CONSTANT(-0.130197596204999990)*f[30]; - tg = CONSTANT(-0.103861751821000010)*g[12] + CONSTANT(0.196425600433000000)*g[2] + CONSTANT(-0.130197596204999990)*g[30]; - y[17] += tf*g[27] + tg*f[27]; - y[27] += tf*g[17] + tg*f[17]; + tf = CONSTANT(-0.103861751821000010) * f[12] + CONSTANT(0.196425600433000000) * f[2] + CONSTANT(-0.130197596204999990) * f[30]; + tg = CONSTANT(-0.103861751821000010) * g[12] + CONSTANT(0.196425600433000000) * g[2] + CONSTANT(-0.130197596204999990) * g[30]; + y[17] += tf * g[27] + tg * f[27]; + y[27] += tf * g[17] + tg * f[17]; t = f[17] * g[27] + f[27] * g[17]; - y[12] += CONSTANT(-0.103861751821000010)*t; - y[2] += CONSTANT(0.196425600433000000)*t; - y[30] += CONSTANT(-0.130197596204999990)*t; + y[12] += CONSTANT(-0.103861751821000010) * t; + y[2] += CONSTANT(0.196425600433000000) * t; + y[30] += CONSTANT(-0.130197596204999990) * t; // [17,28]: 13,3,31,35, - tf = CONSTANT(0.121172043789000000)*f[13] + CONSTANT(-0.060142811686500000)*f[3] + CONSTANT(0.034310079156700000)*f[31] + CONSTANT(0.099440056652200001)*f[35]; - tg = CONSTANT(0.121172043789000000)*g[13] + CONSTANT(-0.060142811686500000)*g[3] + CONSTANT(0.034310079156700000)*g[31] + CONSTANT(0.099440056652200001)*g[35]; - y[17] += tf*g[28] + tg*f[28]; - y[28] += tf*g[17] + tg*f[17]; + tf = CONSTANT(0.121172043789000000) * f[13] + CONSTANT(-0.060142811686500000) * f[3] + CONSTANT(0.034310079156700000) * f[31] + + CONSTANT(0.099440056652200001) * f[35]; + tg = CONSTANT(0.121172043789000000) * g[13] + CONSTANT(-0.060142811686500000) * g[3] + CONSTANT(0.034310079156700000) * g[31] + + CONSTANT(0.099440056652200001) * g[35]; + y[17] += tf * g[28] + tg * f[28]; + y[28] += tf * g[17] + tg * f[17]; t = f[17] * g[28] + f[28] * g[17]; - y[13] += CONSTANT(0.121172043789000000)*t; - y[3] += CONSTANT(-0.060142811686500000)*t; - y[31] += CONSTANT(0.034310079156700000)*t; - y[35] += CONSTANT(0.099440056652200001)*t; + y[13] += CONSTANT(0.121172043789000000) * t; + y[3] += CONSTANT(-0.060142811686500000) * t; + y[31] += CONSTANT(0.034310079156700000) * t; + y[35] += CONSTANT(0.099440056652200001) * t; // [17,32]: 11,1,25,29, - tf = CONSTANT(0.121172043788000010)*f[11] + CONSTANT(-0.060142811686900000)*f[1] + CONSTANT(-0.099440056652700004)*f[25] + CONSTANT(0.034310079156599997)*f[29]; - tg = CONSTANT(0.121172043788000010)*g[11] + CONSTANT(-0.060142811686900000)*g[1] + CONSTANT(-0.099440056652700004)*g[25] + CONSTANT(0.034310079156599997)*g[29]; - y[17] += tf*g[32] + tg*f[32]; - y[32] += tf*g[17] + tg*f[17]; + tf = CONSTANT(0.121172043788000010) * f[11] + CONSTANT(-0.060142811686900000) * f[1] + CONSTANT(-0.099440056652700004) * f[25] + + CONSTANT(0.034310079156599997) * f[29]; + tg = CONSTANT(0.121172043788000010) * g[11] + CONSTANT(-0.060142811686900000) * g[1] + CONSTANT(-0.099440056652700004) * g[25] + + CONSTANT(0.034310079156599997) * g[29]; + y[17] += tf * g[32] + tg * f[32]; + y[32] += tf * g[17] + tg * f[17]; t = f[17] * g[32] + f[32] * g[17]; - y[11] += CONSTANT(0.121172043788000010)*t; - y[1] += CONSTANT(-0.060142811686900000)*t; - y[25] += CONSTANT(-0.099440056652700004)*t; - y[29] += CONSTANT(0.034310079156599997)*t; + y[11] += CONSTANT(0.121172043788000010) * t; + y[1] += CONSTANT(-0.060142811686900000) * t; + y[25] += CONSTANT(-0.099440056652700004) * t; + y[29] += CONSTANT(0.034310079156599997) * t; // [17,34]: 29,11,1, - tf = CONSTANT(0.118853600623000000)*f[29] + CONSTANT(-0.029982305185400002)*f[11] + CONSTANT(-0.208340811100000000)*f[1]; - tg = CONSTANT(0.118853600623000000)*g[29] + CONSTANT(-0.029982305185400002)*g[11] + CONSTANT(-0.208340811100000000)*g[1]; - y[17] += tf*g[34] + tg*f[34]; - y[34] += tf*g[17] + tg*f[17]; + tf = CONSTANT(0.118853600623000000) * f[29] + CONSTANT(-0.029982305185400002) * f[11] + CONSTANT(-0.208340811100000000) * f[1]; + tg = CONSTANT(0.118853600623000000) * g[29] + CONSTANT(-0.029982305185400002) * g[11] + CONSTANT(-0.208340811100000000) * g[1]; + y[17] += tf * g[34] + tg * f[34]; + y[34] += tf * g[17] + tg * f[17]; t = f[17] * g[34] + f[34] * g[17]; - y[29] += CONSTANT(0.118853600623000000)*t; - y[11] += CONSTANT(-0.029982305185400002)*t; - y[1] += CONSTANT(-0.208340811100000000)*t; + y[29] += CONSTANT(0.118853600623000000) * t; + y[11] += CONSTANT(-0.029982305185400002) * t; + y[1] += CONSTANT(-0.208340811100000000) * t; // [18,18]: 6,0,20,24, - tf = CONSTANT(0.065535909662600006)*f[6] + CONSTANT(0.282094791771999980)*f[0] + CONSTANT(-0.083698454702400005)*f[20] + CONSTANT(-0.135045473384000000)*f[24]; - tg = CONSTANT(0.065535909662600006)*g[6] + CONSTANT(0.282094791771999980)*g[0] + CONSTANT(-0.083698454702400005)*g[20] + CONSTANT(-0.135045473384000000)*g[24]; - y[18] += tf*g[18] + tg*f[18]; + tf = CONSTANT(0.065535909662600006) * f[6] + CONSTANT(0.282094791771999980) * f[0] + CONSTANT(-0.083698454702400005) * f[20] + + CONSTANT(-0.135045473384000000) * f[24]; + tg = CONSTANT(0.065535909662600006) * g[6] + CONSTANT(0.282094791771999980) * g[0] + CONSTANT(-0.083698454702400005) * g[20] + + CONSTANT(-0.135045473384000000) * g[24]; + y[18] += tf * g[18] + tg * f[18]; t = f[18] * g[18]; - y[6] += CONSTANT(0.065535909662600006)*t; - y[0] += CONSTANT(0.282094791771999980)*t; - y[20] += CONSTANT(-0.083698454702400005)*t; - y[24] += CONSTANT(-0.135045473384000000)*t; + y[6] += CONSTANT(0.065535909662600006) * t; + y[0] += CONSTANT(0.282094791771999980) * t; + y[20] += CONSTANT(-0.083698454702400005) * t; + y[24] += CONSTANT(-0.135045473384000000) * t; // [18,19]: 7,21,23, - tf = CONSTANT(0.090297865407399994)*f[7] + CONSTANT(0.102084782359000000)*f[21] + CONSTANT(-0.045015157794399997)*f[23]; - tg = CONSTANT(0.090297865407399994)*g[7] + CONSTANT(0.102084782359000000)*g[21] + CONSTANT(-0.045015157794399997)*g[23]; - y[18] += tf*g[19] + tg*f[19]; - y[19] += tf*g[18] + tg*f[18]; + tf = CONSTANT(0.090297865407399994) * f[7] + CONSTANT(0.102084782359000000) * f[21] + CONSTANT(-0.045015157794399997) * f[23]; + tg = CONSTANT(0.090297865407399994) * g[7] + CONSTANT(0.102084782359000000) * g[21] + CONSTANT(-0.045015157794399997) * g[23]; + y[18] += tf * g[19] + tg * f[19]; + y[19] += tf * g[18] + tg * f[18]; t = f[18] * g[19] + f[19] * g[18]; - y[7] += CONSTANT(0.090297865407399994)*t; - y[21] += CONSTANT(0.102084782359000000)*t; - y[23] += CONSTANT(-0.045015157794399997)*t; + y[7] += CONSTANT(0.090297865407399994) * t; + y[21] += CONSTANT(0.102084782359000000) * t; + y[23] += CONSTANT(-0.045015157794399997) * t; // [18,25]: 15,33, - tf = CONSTANT(-0.098140130731999994)*f[15] + CONSTANT(0.130197596202000000)*f[33]; - tg = CONSTANT(-0.098140130731999994)*g[15] + CONSTANT(0.130197596202000000)*g[33]; - y[18] += tf*g[25] + tg*f[25]; - y[25] += tf*g[18] + tg*f[18]; + tf = CONSTANT(-0.098140130731999994) * f[15] + CONSTANT(0.130197596202000000) * f[33]; + tg = CONSTANT(-0.098140130731999994) * g[15] + CONSTANT(0.130197596202000000) * g[33]; + y[18] += tf * g[25] + tg * f[25]; + y[25] += tf * g[18] + tg * f[18]; t = f[18] * g[25] + f[25] * g[18]; - y[15] += CONSTANT(-0.098140130731999994)*t; - y[33] += CONSTANT(0.130197596202000000)*t; + y[15] += CONSTANT(-0.098140130731999994) * t; + y[33] += CONSTANT(0.130197596202000000) * t; // [18,26]: 14,32, - tf = CONSTANT(0.101358691174000000)*f[14] + CONSTANT(0.084042186965900004)*f[32]; - tg = CONSTANT(0.101358691174000000)*g[14] + CONSTANT(0.084042186965900004)*g[32]; - y[18] += tf*g[26] + tg*f[26]; - y[26] += tf*g[18] + tg*f[18]; + tf = CONSTANT(0.101358691174000000) * f[14] + CONSTANT(0.084042186965900004) * f[32]; + tg = CONSTANT(0.101358691174000000) * g[14] + CONSTANT(0.084042186965900004) * g[32]; + y[18] += tf * g[26] + tg * f[26]; + y[26] += tf * g[18] + tg * f[18]; t = f[18] * g[26] + f[26] * g[18]; - y[14] += CONSTANT(0.101358691174000000)*t; - y[32] += CONSTANT(0.084042186965900004)*t; + y[14] += CONSTANT(0.101358691174000000) * t; + y[32] += CONSTANT(0.084042186965900004) * t; // [18,27]: 13,3,35, - tf = CONSTANT(0.101990215611000000)*f[13] + CONSTANT(0.183739324705999990)*f[3] + CONSTANT(-0.130197596202000000)*f[35]; - tg = CONSTANT(0.101990215611000000)*g[13] + CONSTANT(0.183739324705999990)*g[3] + CONSTANT(-0.130197596202000000)*g[35]; - y[18] += tf*g[27] + tg*f[27]; - y[27] += tf*g[18] + tg*f[18]; + tf = CONSTANT(0.101990215611000000) * f[13] + CONSTANT(0.183739324705999990) * f[3] + CONSTANT(-0.130197596202000000) * f[35]; + tg = CONSTANT(0.101990215611000000) * g[13] + CONSTANT(0.183739324705999990) * g[3] + CONSTANT(-0.130197596202000000) * g[35]; + y[18] += tf * g[27] + tg * f[27]; + y[27] += tf * g[18] + tg * f[18]; t = f[18] * g[27] + f[27] * g[18]; - y[13] += CONSTANT(0.101990215611000000)*t; - y[3] += CONSTANT(0.183739324705999990)*t; - y[35] += CONSTANT(-0.130197596202000000)*t; + y[13] += CONSTANT(0.101990215611000000) * t; + y[3] += CONSTANT(0.183739324705999990) * t; + y[35] += CONSTANT(-0.130197596202000000) * t; // [18,28]: 2,12,30,34, - tf = CONSTANT(0.225033795606000010)*f[2] + CONSTANT(0.022664492358099999)*f[12] + CONSTANT(-0.099440056651100006)*f[30] + CONSTANT(-0.084042186968800003)*f[34]; - tg = CONSTANT(0.225033795606000010)*g[2] + CONSTANT(0.022664492358099999)*g[12] + CONSTANT(-0.099440056651100006)*g[30] + CONSTANT(-0.084042186968800003)*g[34]; - y[18] += tf*g[28] + tg*f[28]; - y[28] += tf*g[18] + tg*f[18]; + tf = CONSTANT(0.225033795606000010) * f[2] + CONSTANT(0.022664492358099999) * f[12] + CONSTANT(-0.099440056651100006) * f[30] + + CONSTANT(-0.084042186968800003) * f[34]; + tg = CONSTANT(0.225033795606000010) * g[2] + CONSTANT(0.022664492358099999) * g[12] + CONSTANT(-0.099440056651100006) * g[30] + + CONSTANT(-0.084042186968800003) * g[34]; + y[18] += tf * g[28] + tg * f[28]; + y[28] += tf * g[18] + tg * f[18]; t = f[18] * g[28] + f[28] * g[18]; - y[2] += CONSTANT(0.225033795606000010)*t; - y[12] += CONSTANT(0.022664492358099999)*t; - y[30] += CONSTANT(-0.099440056651100006)*t; - y[34] += CONSTANT(-0.084042186968800003)*t; + y[2] += CONSTANT(0.225033795606000010) * t; + y[12] += CONSTANT(0.022664492358099999) * t; + y[30] += CONSTANT(-0.099440056651100006) * t; + y[34] += CONSTANT(-0.084042186968800003) * t; // [18,29]: 3,13,15,31, - tf = CONSTANT(-0.085054779966799998)*f[3] + CONSTANT(0.075189952564900006)*f[13] + CONSTANT(0.101584686310000010)*f[15] + CONSTANT(0.097043558538999999)*f[31]; - tg = CONSTANT(-0.085054779966799998)*g[3] + CONSTANT(0.075189952564900006)*g[13] + CONSTANT(0.101584686310000010)*g[15] + CONSTANT(0.097043558538999999)*g[31]; - y[18] += tf*g[29] + tg*f[29]; - y[29] += tf*g[18] + tg*f[18]; + tf = CONSTANT(-0.085054779966799998) * f[3] + CONSTANT(0.075189952564900006) * f[13] + CONSTANT(0.101584686310000010) * f[15] + + CONSTANT(0.097043558538999999) * f[31]; + tg = CONSTANT(-0.085054779966799998) * g[3] + CONSTANT(0.075189952564900006) * g[13] + CONSTANT(0.101584686310000010) * g[15] + + CONSTANT(0.097043558538999999) * g[31]; + y[18] += tf * g[29] + tg * f[29]; + y[29] += tf * g[18] + tg * f[18]; t = f[18] * g[29] + f[29] * g[18]; - y[3] += CONSTANT(-0.085054779966799998)*t; - y[13] += CONSTANT(0.075189952564900006)*t; - y[15] += CONSTANT(0.101584686310000010)*t; - y[31] += CONSTANT(0.097043558538999999)*t; + y[3] += CONSTANT(-0.085054779966799998) * t; + y[13] += CONSTANT(0.075189952564900006) * t; + y[15] += CONSTANT(0.101584686310000010) * t; + y[31] += CONSTANT(0.097043558538999999) * t; // [19,19]: 6,8,0,20,22, - tf = CONSTANT(0.139263808033999990)*f[6] + CONSTANT(-0.141889406570999990)*f[8] + CONSTANT(0.282094791773999990)*f[0] + CONSTANT(0.068480553847200004)*f[20] + CONSTANT(-0.102084782360000000)*f[22]; - tg = CONSTANT(0.139263808033999990)*g[6] + CONSTANT(-0.141889406570999990)*g[8] + CONSTANT(0.282094791773999990)*g[0] + CONSTANT(0.068480553847200004)*g[20] + CONSTANT(-0.102084782360000000)*g[22]; - y[19] += tf*g[19] + tg*f[19]; + tf = CONSTANT(0.139263808033999990) * f[6] + CONSTANT(-0.141889406570999990) * f[8] + CONSTANT(0.282094791773999990) * f[0] + + CONSTANT(0.068480553847200004) * f[20] + CONSTANT(-0.102084782360000000) * f[22]; + tg = CONSTANT(0.139263808033999990) * g[6] + CONSTANT(-0.141889406570999990) * g[8] + CONSTANT(0.282094791773999990) * g[0] + + CONSTANT(0.068480553847200004) * g[20] + CONSTANT(-0.102084782360000000) * g[22]; + y[19] += tf * g[19] + tg * f[19]; t = f[19] * g[19]; - y[6] += CONSTANT(0.139263808033999990)*t; - y[8] += CONSTANT(-0.141889406570999990)*t; - y[0] += CONSTANT(0.282094791773999990)*t; - y[20] += CONSTANT(0.068480553847200004)*t; - y[22] += CONSTANT(-0.102084782360000000)*t; + y[6] += CONSTANT(0.139263808033999990) * t; + y[8] += CONSTANT(-0.141889406570999990) * t; + y[0] += CONSTANT(0.282094791773999990) * t; + y[20] += CONSTANT(0.068480553847200004) * t; + y[22] += CONSTANT(-0.102084782360000000) * t; // [19,25]: 34, - tf = CONSTANT(-0.130197596205999990)*f[34]; - tg = CONSTANT(-0.130197596205999990)*g[34]; - y[19] += tf*g[25] + tg*f[25]; - y[25] += tf*g[19] + tg*f[19]; + tf = CONSTANT(-0.130197596205999990) * f[34]; + tg = CONSTANT(-0.130197596205999990) * g[34]; + y[19] += tf * g[25] + tg * f[25]; + y[25] += tf * g[19] + tg * f[19]; t = f[19] * g[25] + f[25] * g[19]; - y[34] += CONSTANT(-0.130197596205999990)*t; + y[34] += CONSTANT(-0.130197596205999990) * t; // [19,26]: 15,35, - tf = CONSTANT(-0.131668802182000000)*f[15] + CONSTANT(0.130197596204999990)*f[35]; - tg = CONSTANT(-0.131668802182000000)*g[15] + CONSTANT(0.130197596204999990)*g[35]; - y[19] += tf*g[26] + tg*f[26]; - y[26] += tf*g[19] + tg*f[19]; + tf = CONSTANT(-0.131668802182000000) * f[15] + CONSTANT(0.130197596204999990) * f[35]; + tg = CONSTANT(-0.131668802182000000) * g[15] + CONSTANT(0.130197596204999990) * g[35]; + y[19] += tf * g[26] + tg * f[26]; + y[26] += tf * g[19] + tg * f[19]; t = f[19] * g[26] + f[26] * g[19]; - y[15] += CONSTANT(-0.131668802182000000)*t; - y[35] += CONSTANT(0.130197596204999990)*t; + y[15] += CONSTANT(-0.131668802182000000) * t; + y[35] += CONSTANT(0.130197596204999990) * t; // [19,27]: 14,32, - tf = CONSTANT(0.025339672793899998)*f[14] + CONSTANT(0.084042186967699994)*f[32]; - tg = CONSTANT(0.025339672793899998)*g[14] + CONSTANT(0.084042186967699994)*g[32]; - y[19] += tf*g[27] + tg*f[27]; - y[27] += tf*g[19] + tg*f[19]; + tf = CONSTANT(0.025339672793899998) * f[14] + CONSTANT(0.084042186967699994) * f[32]; + tg = CONSTANT(0.025339672793899998) * g[14] + CONSTANT(0.084042186967699994) * g[32]; + y[19] += tf * g[27] + tg * f[27]; + y[27] += tf * g[19] + tg * f[19]; t = f[19] * g[27] + f[27] * g[19]; - y[14] += CONSTANT(0.025339672793899998)*t; - y[32] += CONSTANT(0.084042186967699994)*t; + y[14] += CONSTANT(0.025339672793899998) * t; + y[32] += CONSTANT(0.084042186967699994) * t; // [19,28]: 13,3,15,31,33, - tf = CONSTANT(0.104682806111000000)*f[13] + CONSTANT(0.159122922869999990)*f[3] + CONSTANT(-0.126698363970000010)*f[15] + CONSTANT(0.090775936911399999)*f[31] + CONSTANT(-0.084042186968400004)*f[33]; - tg = CONSTANT(0.104682806111000000)*g[13] + CONSTANT(0.159122922869999990)*g[3] + CONSTANT(-0.126698363970000010)*g[15] + CONSTANT(0.090775936911399999)*g[31] + CONSTANT(-0.084042186968400004)*g[33]; - y[19] += tf*g[28] + tg*f[28]; - y[28] += tf*g[19] + tg*f[19]; + tf = CONSTANT(0.104682806111000000) * f[13] + CONSTANT(0.159122922869999990) * f[3] + CONSTANT(-0.126698363970000010) * f[15] + + CONSTANT(0.090775936911399999) * f[31] + CONSTANT(-0.084042186968400004) * f[33]; + tg = CONSTANT(0.104682806111000000) * g[13] + CONSTANT(0.159122922869999990) * g[3] + CONSTANT(-0.126698363970000010) * g[15] + + CONSTANT(0.090775936911399999) * g[31] + CONSTANT(-0.084042186968400004) * g[33]; + y[19] += tf * g[28] + tg * f[28]; + y[28] += tf * g[19] + tg * f[19]; t = f[19] * g[28] + f[28] * g[19]; - y[13] += CONSTANT(0.104682806111000000)*t; - y[3] += CONSTANT(0.159122922869999990)*t; - y[15] += CONSTANT(-0.126698363970000010)*t; - y[31] += CONSTANT(0.090775936911399999)*t; - y[33] += CONSTANT(-0.084042186968400004)*t; + y[13] += CONSTANT(0.104682806111000000) * t; + y[3] += CONSTANT(0.159122922869999990) * t; + y[15] += CONSTANT(-0.126698363970000010) * t; + y[31] += CONSTANT(0.090775936911399999) * t; + y[33] += CONSTANT(-0.084042186968400004) * t; // [19,29]: 12,14,2,30,32, - tf = CONSTANT(0.115089467124000010)*f[12] + CONSTANT(-0.097749909977199997)*f[14] + CONSTANT(0.240571246744999990)*f[2] + CONSTANT(0.053152946072499999)*f[30] + CONSTANT(-0.090775936912099994)*f[32]; - tg = CONSTANT(0.115089467124000010)*g[12] + CONSTANT(-0.097749909977199997)*g[14] + CONSTANT(0.240571246744999990)*g[2] + CONSTANT(0.053152946072499999)*g[30] + CONSTANT(-0.090775936912099994)*g[32]; - y[19] += tf*g[29] + tg*f[29]; - y[29] += tf*g[19] + tg*f[19]; + tf = CONSTANT(0.115089467124000010) * f[12] + CONSTANT(-0.097749909977199997) * f[14] + CONSTANT(0.240571246744999990) * f[2] + + CONSTANT(0.053152946072499999) * f[30] + CONSTANT(-0.090775936912099994) * f[32]; + tg = CONSTANT(0.115089467124000010) * g[12] + CONSTANT(-0.097749909977199997) * g[14] + CONSTANT(0.240571246744999990) * g[2] + + CONSTANT(0.053152946072499999) * g[30] + CONSTANT(-0.090775936912099994) * g[32]; + y[19] += tf * g[29] + tg * f[29]; + y[29] += tf * g[19] + tg * f[19]; t = f[19] * g[29] + f[29] * g[19]; - y[12] += CONSTANT(0.115089467124000010)*t; - y[14] += CONSTANT(-0.097749909977199997)*t; - y[2] += CONSTANT(0.240571246744999990)*t; - y[30] += CONSTANT(0.053152946072499999)*t; - y[32] += CONSTANT(-0.090775936912099994)*t; + y[12] += CONSTANT(0.115089467124000010) * t; + y[14] += CONSTANT(-0.097749909977199997) * t; + y[2] += CONSTANT(0.240571246744999990) * t; + y[30] += CONSTANT(0.053152946072499999) * t; + y[32] += CONSTANT(-0.090775936912099994) * t; // [20,20]: 6,0,20, - tf = CONSTANT(0.163839797503000010)*f[6] + CONSTANT(0.282094802232000010)*f[0]; - tg = CONSTANT(0.163839797503000010)*g[6] + CONSTANT(0.282094802232000010)*g[0]; - y[20] += tf*g[20] + tg*f[20]; + tf = CONSTANT(0.163839797503000010) * f[6] + CONSTANT(0.282094802232000010) * f[0]; + tg = CONSTANT(0.163839797503000010) * g[6] + CONSTANT(0.282094802232000010) * g[0]; + y[20] += tf * g[20] + tg * f[20]; t = f[20] * g[20]; - y[6] += CONSTANT(0.163839797503000010)*t; - y[0] += CONSTANT(0.282094802232000010)*t; - y[20] += CONSTANT(0.136961139005999990)*t; + y[6] += CONSTANT(0.163839797503000010) * t; + y[0] += CONSTANT(0.282094802232000010) * t; + y[20] += CONSTANT(0.136961139005999990) * t; // [21,21]: 6,20,0,8,22, - tf = CONSTANT(0.139263808033999990)*f[6] + CONSTANT(0.068480553847200004)*f[20] + CONSTANT(0.282094791773999990)*f[0] + CONSTANT(0.141889406570999990)*f[8] + CONSTANT(0.102084782360000000)*f[22]; - tg = CONSTANT(0.139263808033999990)*g[6] + CONSTANT(0.068480553847200004)*g[20] + CONSTANT(0.282094791773999990)*g[0] + CONSTANT(0.141889406570999990)*g[8] + CONSTANT(0.102084782360000000)*g[22]; - y[21] += tf*g[21] + tg*f[21]; + tf = CONSTANT(0.139263808033999990) * f[6] + CONSTANT(0.068480553847200004) * f[20] + CONSTANT(0.282094791773999990) * f[0] + + CONSTANT(0.141889406570999990) * f[8] + CONSTANT(0.102084782360000000) * f[22]; + tg = CONSTANT(0.139263808033999990) * g[6] + CONSTANT(0.068480553847200004) * g[20] + CONSTANT(0.282094791773999990) * g[0] + + CONSTANT(0.141889406570999990) * g[8] + CONSTANT(0.102084782360000000) * g[22]; + y[21] += tf * g[21] + tg * f[21]; t = f[21] * g[21]; - y[6] += CONSTANT(0.139263808033999990)*t; - y[20] += CONSTANT(0.068480553847200004)*t; - y[0] += CONSTANT(0.282094791773999990)*t; - y[8] += CONSTANT(0.141889406570999990)*t; - y[22] += CONSTANT(0.102084782360000000)*t; + y[6] += CONSTANT(0.139263808033999990) * t; + y[20] += CONSTANT(0.068480553847200004) * t; + y[0] += CONSTANT(0.282094791773999990) * t; + y[8] += CONSTANT(0.141889406570999990) * t; + y[22] += CONSTANT(0.102084782360000000) * t; // [21,23]: 8,22,24, - tf = CONSTANT(-0.112621225039000000)*f[8] + CONSTANT(0.045015157794100001)*f[22] + CONSTANT(-0.119098912753000000)*f[24]; - tg = CONSTANT(-0.112621225039000000)*g[8] + CONSTANT(0.045015157794100001)*g[22] + CONSTANT(-0.119098912753000000)*g[24]; - y[21] += tf*g[23] + tg*f[23]; - y[23] += tf*g[21] + tg*f[21]; + tf = CONSTANT(-0.112621225039000000) * f[8] + CONSTANT(0.045015157794100001) * f[22] + CONSTANT(-0.119098912753000000) * f[24]; + tg = CONSTANT(-0.112621225039000000) * g[8] + CONSTANT(0.045015157794100001) * g[22] + CONSTANT(-0.119098912753000000) * g[24]; + y[21] += tf * g[23] + tg * f[23]; + y[23] += tf * g[21] + tg * f[21]; t = f[21] * g[23] + f[23] * g[21]; - y[8] += CONSTANT(-0.112621225039000000)*t; - y[22] += CONSTANT(0.045015157794100001)*t; - y[24] += CONSTANT(-0.119098912753000000)*t; + y[8] += CONSTANT(-0.112621225039000000) * t; + y[22] += CONSTANT(0.045015157794100001) * t; + y[24] += CONSTANT(-0.119098912753000000) * t; // [21,26]: 9,25, - tf = CONSTANT(-0.131668802182000000)*f[9] + CONSTANT(-0.130197596204999990)*f[25]; - tg = CONSTANT(-0.131668802182000000)*g[9] + CONSTANT(-0.130197596204999990)*g[25]; - y[21] += tf*g[26] + tg*f[26]; - y[26] += tf*g[21] + tg*f[21]; + tf = CONSTANT(-0.131668802182000000) * f[9] + CONSTANT(-0.130197596204999990) * f[25]; + tg = CONSTANT(-0.131668802182000000) * g[9] + CONSTANT(-0.130197596204999990) * g[25]; + y[21] += tf * g[26] + tg * f[26]; + y[26] += tf * g[21] + tg * f[21]; t = f[21] * g[26] + f[26] * g[21]; - y[9] += CONSTANT(-0.131668802182000000)*t; - y[25] += CONSTANT(-0.130197596204999990)*t; + y[9] += CONSTANT(-0.131668802182000000) * t; + y[25] += CONSTANT(-0.130197596204999990) * t; // [21,28]: 27,1,11,9,29, - tf = CONSTANT(0.084042186968400004)*f[27] + CONSTANT(0.159122922869999990)*f[1] + CONSTANT(0.104682806111000000)*f[11] + CONSTANT(0.126698363970000010)*f[9] + CONSTANT(0.090775936911399999)*f[29]; - tg = CONSTANT(0.084042186968400004)*g[27] + CONSTANT(0.159122922869999990)*g[1] + CONSTANT(0.104682806111000000)*g[11] + CONSTANT(0.126698363970000010)*g[9] + CONSTANT(0.090775936911399999)*g[29]; - y[21] += tf*g[28] + tg*f[28]; - y[28] += tf*g[21] + tg*f[21]; + tf = CONSTANT(0.084042186968400004) * f[27] + CONSTANT(0.159122922869999990) * f[1] + CONSTANT(0.104682806111000000) * f[11] + + CONSTANT(0.126698363970000010) * f[9] + CONSTANT(0.090775936911399999) * f[29]; + tg = CONSTANT(0.084042186968400004) * g[27] + CONSTANT(0.159122922869999990) * g[1] + CONSTANT(0.104682806111000000) * g[11] + + CONSTANT(0.126698363970000010) * g[9] + CONSTANT(0.090775936911399999) * g[29]; + y[21] += tf * g[28] + tg * f[28]; + y[28] += tf * g[21] + tg * f[21]; t = f[21] * g[28] + f[28] * g[21]; - y[27] += CONSTANT(0.084042186968400004)*t; - y[1] += CONSTANT(0.159122922869999990)*t; - y[11] += CONSTANT(0.104682806111000000)*t; - y[9] += CONSTANT(0.126698363970000010)*t; - y[29] += CONSTANT(0.090775936911399999)*t; + y[27] += CONSTANT(0.084042186968400004) * t; + y[1] += CONSTANT(0.159122922869999990) * t; + y[11] += CONSTANT(0.104682806111000000) * t; + y[9] += CONSTANT(0.126698363970000010) * t; + y[29] += CONSTANT(0.090775936911399999) * t; // [21,31]: 14,2,30,12,32, - tf = CONSTANT(0.097749909977199997)*f[14] + CONSTANT(0.240571246744999990)*f[2] + CONSTANT(0.053152946072499999)*f[30] + CONSTANT(0.115089467124000010)*f[12] + CONSTANT(0.090775936912099994)*f[32]; - tg = CONSTANT(0.097749909977199997)*g[14] + CONSTANT(0.240571246744999990)*g[2] + CONSTANT(0.053152946072499999)*g[30] + CONSTANT(0.115089467124000010)*g[12] + CONSTANT(0.090775936912099994)*g[32]; - y[21] += tf*g[31] + tg*f[31]; - y[31] += tf*g[21] + tg*f[21]; + tf = CONSTANT(0.097749909977199997) * f[14] + CONSTANT(0.240571246744999990) * f[2] + CONSTANT(0.053152946072499999) * f[30] + + CONSTANT(0.115089467124000010) * f[12] + CONSTANT(0.090775936912099994) * f[32]; + tg = CONSTANT(0.097749909977199997) * g[14] + CONSTANT(0.240571246744999990) * g[2] + CONSTANT(0.053152946072499999) * g[30] + + CONSTANT(0.115089467124000010) * g[12] + CONSTANT(0.090775936912099994) * g[32]; + y[21] += tf * g[31] + tg * f[31]; + y[31] += tf * g[21] + tg * f[21]; t = f[21] * g[31] + f[31] * g[21]; - y[14] += CONSTANT(0.097749909977199997)*t; - y[2] += CONSTANT(0.240571246744999990)*t; - y[30] += CONSTANT(0.053152946072499999)*t; - y[12] += CONSTANT(0.115089467124000010)*t; - y[32] += CONSTANT(0.090775936912099994)*t; + y[14] += CONSTANT(0.097749909977199997) * t; + y[2] += CONSTANT(0.240571246744999990) * t; + y[30] += CONSTANT(0.053152946072499999) * t; + y[12] += CONSTANT(0.115089467124000010) * t; + y[32] += CONSTANT(0.090775936912099994) * t; // [21,33]: 32,14, - tf = CONSTANT(0.084042186967699994)*f[32] + CONSTANT(0.025339672793899998)*f[14]; - tg = CONSTANT(0.084042186967699994)*g[32] + CONSTANT(0.025339672793899998)*g[14]; - y[21] += tf*g[33] + tg*f[33]; - y[33] += tf*g[21] + tg*f[21]; + tf = CONSTANT(0.084042186967699994) * f[32] + CONSTANT(0.025339672793899998) * f[14]; + tg = CONSTANT(0.084042186967699994) * g[32] + CONSTANT(0.025339672793899998) * g[14]; + y[21] += tf * g[33] + tg * f[33]; + y[33] += tf * g[21] + tg * f[21]; t = f[21] * g[33] + f[33] * g[21]; - y[32] += CONSTANT(0.084042186967699994)*t; - y[14] += CONSTANT(0.025339672793899998)*t; + y[32] += CONSTANT(0.084042186967699994) * t; + y[14] += CONSTANT(0.025339672793899998) * t; // [21,34]: 35, - tf = CONSTANT(-0.130197596205999990)*f[35]; - tg = CONSTANT(-0.130197596205999990)*g[35]; - y[21] += tf*g[34] + tg*f[34]; - y[34] += tf*g[21] + tg*f[21]; + tf = CONSTANT(-0.130197596205999990) * f[35]; + tg = CONSTANT(-0.130197596205999990) * g[35]; + y[21] += tf * g[34] + tg * f[34]; + y[34] += tf * g[21] + tg * f[21]; t = f[21] * g[34] + f[34] * g[21]; - y[35] += CONSTANT(-0.130197596205999990)*t; + y[35] += CONSTANT(-0.130197596205999990) * t; // [22,22]: 6,20,0,24, - tf = CONSTANT(0.065535909662600006)*f[6] + CONSTANT(-0.083698454702400005)*f[20] + CONSTANT(0.282094791771999980)*f[0] + CONSTANT(0.135045473384000000)*f[24]; - tg = CONSTANT(0.065535909662600006)*g[6] + CONSTANT(-0.083698454702400005)*g[20] + CONSTANT(0.282094791771999980)*g[0] + CONSTANT(0.135045473384000000)*g[24]; - y[22] += tf*g[22] + tg*f[22]; + tf = CONSTANT(0.065535909662600006) * f[6] + CONSTANT(-0.083698454702400005) * f[20] + CONSTANT(0.282094791771999980) * f[0] + + CONSTANT(0.135045473384000000) * f[24]; + tg = CONSTANT(0.065535909662600006) * g[6] + CONSTANT(-0.083698454702400005) * g[20] + CONSTANT(0.282094791771999980) * g[0] + + CONSTANT(0.135045473384000000) * g[24]; + y[22] += tf * g[22] + tg * f[22]; t = f[22] * g[22]; - y[6] += CONSTANT(0.065535909662600006)*t; - y[20] += CONSTANT(-0.083698454702400005)*t; - y[0] += CONSTANT(0.282094791771999980)*t; - y[24] += CONSTANT(0.135045473384000000)*t; + y[6] += CONSTANT(0.065535909662600006) * t; + y[20] += CONSTANT(-0.083698454702400005) * t; + y[0] += CONSTANT(0.282094791771999980) * t; + y[24] += CONSTANT(0.135045473384000000) * t; // [22,26]: 10,28, - tf = CONSTANT(0.101358691174000000)*f[10] + CONSTANT(0.084042186965900004)*f[28]; - tg = CONSTANT(0.101358691174000000)*g[10] + CONSTANT(0.084042186965900004)*g[28]; - y[22] += tf*g[26] + tg*f[26]; - y[26] += tf*g[22] + tg*f[22]; + tf = CONSTANT(0.101358691174000000) * f[10] + CONSTANT(0.084042186965900004) * f[28]; + tg = CONSTANT(0.101358691174000000) * g[10] + CONSTANT(0.084042186965900004) * g[28]; + y[22] += tf * g[26] + tg * f[26]; + y[26] += tf * g[22] + tg * f[22]; t = f[22] * g[26] + f[26] * g[22]; - y[10] += CONSTANT(0.101358691174000000)*t; - y[28] += CONSTANT(0.084042186965900004)*t; + y[10] += CONSTANT(0.101358691174000000) * t; + y[28] += CONSTANT(0.084042186965900004) * t; // [22,27]: 1,11,25, - tf = CONSTANT(0.183739324704000010)*f[1] + CONSTANT(0.101990215611000000)*f[11] + CONSTANT(0.130197596200999990)*f[25]; - tg = CONSTANT(0.183739324704000010)*g[1] + CONSTANT(0.101990215611000000)*g[11] + CONSTANT(0.130197596200999990)*g[25]; - y[22] += tf*g[27] + tg*f[27]; - y[27] += tf*g[22] + tg*f[22]; + tf = CONSTANT(0.183739324704000010) * f[1] + CONSTANT(0.101990215611000000) * f[11] + CONSTANT(0.130197596200999990) * f[25]; + tg = CONSTANT(0.183739324704000010) * g[1] + CONSTANT(0.101990215611000000) * g[11] + CONSTANT(0.130197596200999990) * g[25]; + y[22] += tf * g[27] + tg * f[27]; + y[27] += tf * g[22] + tg * f[22]; t = f[22] * g[27] + f[27] * g[22]; - y[1] += CONSTANT(0.183739324704000010)*t; - y[11] += CONSTANT(0.101990215611000000)*t; - y[25] += CONSTANT(0.130197596200999990)*t; + y[1] += CONSTANT(0.183739324704000010) * t; + y[11] += CONSTANT(0.101990215611000000) * t; + y[25] += CONSTANT(0.130197596200999990) * t; // [22,32]: 2,30,12,34, - tf = CONSTANT(0.225033795606000010)*f[2] + CONSTANT(-0.099440056651100006)*f[30] + CONSTANT(0.022664492358099999)*f[12] + CONSTANT(0.084042186968800003)*f[34]; - tg = CONSTANT(0.225033795606000010)*g[2] + CONSTANT(-0.099440056651100006)*g[30] + CONSTANT(0.022664492358099999)*g[12] + CONSTANT(0.084042186968800003)*g[34]; - y[22] += tf*g[32] + tg*f[32]; - y[32] += tf*g[22] + tg*f[22]; + tf = CONSTANT(0.225033795606000010) * f[2] + CONSTANT(-0.099440056651100006) * f[30] + CONSTANT(0.022664492358099999) * f[12] + + CONSTANT(0.084042186968800003) * f[34]; + tg = CONSTANT(0.225033795606000010) * g[2] + CONSTANT(-0.099440056651100006) * g[30] + CONSTANT(0.022664492358099999) * g[12] + + CONSTANT(0.084042186968800003) * g[34]; + y[22] += tf * g[32] + tg * f[32]; + y[32] += tf * g[22] + tg * f[22]; t = f[22] * g[32] + f[32] * g[22]; - y[2] += CONSTANT(0.225033795606000010)*t; - y[30] += CONSTANT(-0.099440056651100006)*t; - y[12] += CONSTANT(0.022664492358099999)*t; - y[34] += CONSTANT(0.084042186968800003)*t; + y[2] += CONSTANT(0.225033795606000010) * t; + y[30] += CONSTANT(-0.099440056651100006) * t; + y[12] += CONSTANT(0.022664492358099999) * t; + y[34] += CONSTANT(0.084042186968800003) * t; // [22,33]: 3,13,35, - tf = CONSTANT(0.183739324704000010)*f[3] + CONSTANT(0.101990215611000000)*f[13] + CONSTANT(0.130197596200999990)*f[35]; - tg = CONSTANT(0.183739324704000010)*g[3] + CONSTANT(0.101990215611000000)*g[13] + CONSTANT(0.130197596200999990)*g[35]; - y[22] += tf*g[33] + tg*f[33]; - y[33] += tf*g[22] + tg*f[22]; + tf = CONSTANT(0.183739324704000010) * f[3] + CONSTANT(0.101990215611000000) * f[13] + CONSTANT(0.130197596200999990) * f[35]; + tg = CONSTANT(0.183739324704000010) * g[3] + CONSTANT(0.101990215611000000) * g[13] + CONSTANT(0.130197596200999990) * g[35]; + y[22] += tf * g[33] + tg * f[33]; + y[33] += tf * g[22] + tg * f[22]; t = f[22] * g[33] + f[33] * g[22]; - y[3] += CONSTANT(0.183739324704000010)*t; - y[13] += CONSTANT(0.101990215611000000)*t; - y[35] += CONSTANT(0.130197596200999990)*t; + y[3] += CONSTANT(0.183739324704000010) * t; + y[13] += CONSTANT(0.101990215611000000) * t; + y[35] += CONSTANT(0.130197596200999990) * t; // [23,23]: 6,20,0, - tf = CONSTANT(-0.057343920955899998)*f[6] + CONSTANT(-0.159787958979000000)*f[20] + CONSTANT(0.282094791768999990)*f[0]; - tg = CONSTANT(-0.057343920955899998)*g[6] + CONSTANT(-0.159787958979000000)*g[20] + CONSTANT(0.282094791768999990)*g[0]; - y[23] += tf*g[23] + tg*f[23]; + tf = CONSTANT(-0.057343920955899998) * f[6] + CONSTANT(-0.159787958979000000) * f[20] + CONSTANT(0.282094791768999990) * f[0]; + tg = CONSTANT(-0.057343920955899998) * g[6] + CONSTANT(-0.159787958979000000) * g[20] + CONSTANT(0.282094791768999990) * g[0]; + y[23] += tf * g[23] + tg * f[23]; t = f[23] * g[23]; - y[6] += CONSTANT(-0.057343920955899998)*t; - y[20] += CONSTANT(-0.159787958979000000)*t; - y[0] += CONSTANT(0.282094791768999990)*t; + y[6] += CONSTANT(-0.057343920955899998) * t; + y[20] += CONSTANT(-0.159787958979000000) * t; + y[0] += CONSTANT(0.282094791768999990) * t; // [23,26]: 1,11,29, - tf = CONSTANT(0.208340811096000000)*f[1] + CONSTANT(0.029982305185199998)*f[11] + CONSTANT(-0.118853600623999990)*f[29]; - tg = CONSTANT(0.208340811096000000)*g[1] + CONSTANT(0.029982305185199998)*g[11] + CONSTANT(-0.118853600623999990)*g[29]; - y[23] += tf*g[26] + tg*f[26]; - y[26] += tf*g[23] + tg*f[23]; + tf = CONSTANT(0.208340811096000000) * f[1] + CONSTANT(0.029982305185199998) * f[11] + CONSTANT(-0.118853600623999990) * f[29]; + tg = CONSTANT(0.208340811096000000) * g[1] + CONSTANT(0.029982305185199998) * g[11] + CONSTANT(-0.118853600623999990) * g[29]; + y[23] += tf * g[26] + tg * f[26]; + y[26] += tf * g[23] + tg * f[23]; t = f[23] * g[26] + f[26] * g[23]; - y[1] += CONSTANT(0.208340811096000000)*t; - y[11] += CONSTANT(0.029982305185199998)*t; - y[29] += CONSTANT(-0.118853600623999990)*t; + y[1] += CONSTANT(0.208340811096000000) * t; + y[11] += CONSTANT(0.029982305185199998) * t; + y[29] += CONSTANT(-0.118853600623999990) * t; // [23,28]: 25,11,1,29, - tf = CONSTANT(-0.099440056652200001)*f[25] + CONSTANT(-0.121172043789000000)*f[11] + CONSTANT(0.060142811686500000)*f[1] + CONSTANT(-0.034310079156700000)*f[29]; - tg = CONSTANT(-0.099440056652200001)*g[25] + CONSTANT(-0.121172043789000000)*g[11] + CONSTANT(0.060142811686500000)*g[1] + CONSTANT(-0.034310079156700000)*g[29]; - y[23] += tf*g[28] + tg*f[28]; - y[28] += tf*g[23] + tg*f[23]; + tf = CONSTANT(-0.099440056652200001) * f[25] + CONSTANT(-0.121172043789000000) * f[11] + CONSTANT(0.060142811686500000) * f[1] + + CONSTANT(-0.034310079156700000) * f[29]; + tg = CONSTANT(-0.099440056652200001) * g[25] + CONSTANT(-0.121172043789000000) * g[11] + CONSTANT(0.060142811686500000) * g[1] + + CONSTANT(-0.034310079156700000) * g[29]; + y[23] += tf * g[28] + tg * f[28]; + y[28] += tf * g[23] + tg * f[23]; t = f[23] * g[28] + f[28] * g[23]; - y[25] += CONSTANT(-0.099440056652200001)*t; - y[11] += CONSTANT(-0.121172043789000000)*t; - y[1] += CONSTANT(0.060142811686500000)*t; - y[29] += CONSTANT(-0.034310079156700000)*t; + y[25] += CONSTANT(-0.099440056652200001) * t; + y[11] += CONSTANT(-0.121172043789000000) * t; + y[1] += CONSTANT(0.060142811686500000) * t; + y[29] += CONSTANT(-0.034310079156700000) * t; // [23,32]: 31,13,3,35, - tf = CONSTANT(0.034310079156599997)*f[31] + CONSTANT(0.121172043788000010)*f[13] + CONSTANT(-0.060142811686900000)*f[3] + CONSTANT(-0.099440056652700004)*f[35]; - tg = CONSTANT(0.034310079156599997)*g[31] + CONSTANT(0.121172043788000010)*g[13] + CONSTANT(-0.060142811686900000)*g[3] + CONSTANT(-0.099440056652700004)*g[35]; - y[23] += tf*g[32] + tg*f[32]; - y[32] += tf*g[23] + tg*f[23]; + tf = CONSTANT(0.034310079156599997) * f[31] + CONSTANT(0.121172043788000010) * f[13] + CONSTANT(-0.060142811686900000) * f[3] + + CONSTANT(-0.099440056652700004) * f[35]; + tg = CONSTANT(0.034310079156599997) * g[31] + CONSTANT(0.121172043788000010) * g[13] + CONSTANT(-0.060142811686900000) * g[3] + + CONSTANT(-0.099440056652700004) * g[35]; + y[23] += tf * g[32] + tg * f[32]; + y[32] += tf * g[23] + tg * f[23]; t = f[23] * g[32] + f[32] * g[23]; - y[31] += CONSTANT(0.034310079156599997)*t; - y[13] += CONSTANT(0.121172043788000010)*t; - y[3] += CONSTANT(-0.060142811686900000)*t; - y[35] += CONSTANT(-0.099440056652700004)*t; + y[31] += CONSTANT(0.034310079156599997) * t; + y[13] += CONSTANT(0.121172043788000010) * t; + y[3] += CONSTANT(-0.060142811686900000) * t; + y[35] += CONSTANT(-0.099440056652700004) * t; // [23,33]: 2,30,12, - tf = CONSTANT(0.196425600433000000)*f[2] + CONSTANT(-0.130197596204999990)*f[30] + CONSTANT(-0.103861751821000010)*f[12]; - tg = CONSTANT(0.196425600433000000)*g[2] + CONSTANT(-0.130197596204999990)*g[30] + CONSTANT(-0.103861751821000010)*g[12]; - y[23] += tf*g[33] + tg*f[33]; - y[33] += tf*g[23] + tg*f[23]; + tf = CONSTANT(0.196425600433000000) * f[2] + CONSTANT(-0.130197596204999990) * f[30] + CONSTANT(-0.103861751821000010) * f[12]; + tg = CONSTANT(0.196425600433000000) * g[2] + CONSTANT(-0.130197596204999990) * g[30] + CONSTANT(-0.103861751821000010) * g[12]; + y[23] += tf * g[33] + tg * f[33]; + y[33] += tf * g[23] + tg * f[23]; t = f[23] * g[33] + f[33] * g[23]; - y[2] += CONSTANT(0.196425600433000000)*t; - y[30] += CONSTANT(-0.130197596204999990)*t; - y[12] += CONSTANT(-0.103861751821000010)*t; + y[2] += CONSTANT(0.196425600433000000) * t; + y[30] += CONSTANT(-0.130197596204999990) * t; + y[12] += CONSTANT(-0.103861751821000010) * t; // [23,34]: 3,13,31, - tf = CONSTANT(0.208340811100000000)*f[3] + CONSTANT(0.029982305185400002)*f[13] + CONSTANT(-0.118853600623000000)*f[31]; - tg = CONSTANT(0.208340811100000000)*g[3] + CONSTANT(0.029982305185400002)*g[13] + CONSTANT(-0.118853600623000000)*g[31]; - y[23] += tf*g[34] + tg*f[34]; - y[34] += tf*g[23] + tg*f[23]; + tf = CONSTANT(0.208340811100000000) * f[3] + CONSTANT(0.029982305185400002) * f[13] + CONSTANT(-0.118853600623000000) * f[31]; + tg = CONSTANT(0.208340811100000000) * g[3] + CONSTANT(0.029982305185400002) * g[13] + CONSTANT(-0.118853600623000000) * g[31]; + y[23] += tf * g[34] + tg * f[34]; + y[34] += tf * g[23] + tg * f[23]; t = f[23] * g[34] + f[34] * g[23]; - y[3] += CONSTANT(0.208340811100000000)*t; - y[13] += CONSTANT(0.029982305185400002)*t; - y[31] += CONSTANT(-0.118853600623000000)*t; + y[3] += CONSTANT(0.208340811100000000) * t; + y[13] += CONSTANT(0.029982305185400002) * t; + y[31] += CONSTANT(-0.118853600623000000) * t; // [24,24]: 6,0,20, - tf = CONSTANT(-0.229375683829000000)*f[6] + CONSTANT(0.282094791763999990)*f[0] + CONSTANT(0.106525305981000000)*f[20]; - tg = CONSTANT(-0.229375683829000000)*g[6] + CONSTANT(0.282094791763999990)*g[0] + CONSTANT(0.106525305981000000)*g[20]; - y[24] += tf*g[24] + tg*f[24]; + tf = CONSTANT(-0.229375683829000000) * f[6] + CONSTANT(0.282094791763999990) * f[0] + CONSTANT(0.106525305981000000) * f[20]; + tg = CONSTANT(-0.229375683829000000) * g[6] + CONSTANT(0.282094791763999990) * g[0] + CONSTANT(0.106525305981000000) * g[20]; + y[24] += tf * g[24] + tg * f[24]; t = f[24] * g[24]; - y[6] += CONSTANT(-0.229375683829000000)*t; - y[0] += CONSTANT(0.282094791763999990)*t; - y[20] += CONSTANT(0.106525305981000000)*t; + y[6] += CONSTANT(-0.229375683829000000) * t; + y[0] += CONSTANT(0.282094791763999990) * t; + y[20] += CONSTANT(0.106525305981000000) * t; // [24,29]: 9,27,25, - tf = CONSTANT(-0.035835708931400000)*f[9] + CONSTANT(0.118853600623000000)*f[27] + CONSTANT(0.053152946071199997)*f[25]; - tg = CONSTANT(-0.035835708931400000)*g[9] + CONSTANT(0.118853600623000000)*g[27] + CONSTANT(0.053152946071199997)*g[25]; - y[24] += tf*g[29] + tg*f[29]; - y[29] += tf*g[24] + tg*f[24]; + tf = CONSTANT(-0.035835708931400000) * f[9] + CONSTANT(0.118853600623000000) * f[27] + CONSTANT(0.053152946071199997) * f[25]; + tg = CONSTANT(-0.035835708931400000) * g[9] + CONSTANT(0.118853600623000000) * g[27] + CONSTANT(0.053152946071199997) * g[25]; + y[24] += tf * g[29] + tg * f[29]; + y[29] += tf * g[24] + tg * f[24]; t = f[24] * g[29] + f[29] * g[24]; - y[9] += CONSTANT(-0.035835708931400000)*t; - y[27] += CONSTANT(0.118853600623000000)*t; - y[25] += CONSTANT(0.053152946071199997)*t; + y[9] += CONSTANT(-0.035835708931400000) * t; + y[27] += CONSTANT(0.118853600623000000) * t; + y[25] += CONSTANT(0.053152946071199997) * t; // [24,31]: 15,33,35, - tf = CONSTANT(0.035835708931400000)*f[15] + CONSTANT(-0.118853600623000000)*f[33] + CONSTANT(0.053152946071199997)*f[35]; - tg = CONSTANT(0.035835708931400000)*g[15] + CONSTANT(-0.118853600623000000)*g[33] + CONSTANT(0.053152946071199997)*g[35]; - y[24] += tf*g[31] + tg*f[31]; - y[31] += tf*g[24] + tg*f[24]; + tf = CONSTANT(0.035835708931400000) * f[15] + CONSTANT(-0.118853600623000000) * f[33] + CONSTANT(0.053152946071199997) * f[35]; + tg = CONSTANT(0.035835708931400000) * g[15] + CONSTANT(-0.118853600623000000) * g[33] + CONSTANT(0.053152946071199997) * g[35]; + y[24] += tf * g[31] + tg * f[31]; + y[31] += tf * g[24] + tg * f[24]; t = f[24] * g[31] + f[31] * g[24]; - y[15] += CONSTANT(0.035835708931400000)*t; - y[33] += CONSTANT(-0.118853600623000000)*t; - y[35] += CONSTANT(0.053152946071199997)*t; + y[15] += CONSTANT(0.035835708931400000) * t; + y[33] += CONSTANT(-0.118853600623000000) * t; + y[35] += CONSTANT(0.053152946071199997) * t; // [24,34]: 12,30,2, - tf = CONSTANT(-0.207723503645000000)*f[12] + CONSTANT(0.130197596199999990)*f[30] + CONSTANT(0.147319200325000010)*f[2]; - tg = CONSTANT(-0.207723503645000000)*g[12] + CONSTANT(0.130197596199999990)*g[30] + CONSTANT(0.147319200325000010)*g[2]; - y[24] += tf*g[34] + tg*f[34]; - y[34] += tf*g[24] + tg*f[24]; + tf = CONSTANT(-0.207723503645000000) * f[12] + CONSTANT(0.130197596199999990) * f[30] + CONSTANT(0.147319200325000010) * f[2]; + tg = CONSTANT(-0.207723503645000000) * g[12] + CONSTANT(0.130197596199999990) * g[30] + CONSTANT(0.147319200325000010) * g[2]; + y[24] += tf * g[34] + tg * f[34]; + y[34] += tf * g[24] + tg * f[24]; t = f[24] * g[34] + f[34] * g[24]; - y[12] += CONSTANT(-0.207723503645000000)*t; - y[30] += CONSTANT(0.130197596199999990)*t; - y[2] += CONSTANT(0.147319200325000010)*t; + y[12] += CONSTANT(-0.207723503645000000) * t; + y[30] += CONSTANT(0.130197596199999990) * t; + y[2] += CONSTANT(0.147319200325000010) * t; // [25,25]: 0,6,20, - tf = CONSTANT(0.282094791761999970)*f[0] + CONSTANT(-0.242608896358999990)*f[6] + CONSTANT(0.130197596198000000)*f[20]; - tg = CONSTANT(0.282094791761999970)*g[0] + CONSTANT(-0.242608896358999990)*g[6] + CONSTANT(0.130197596198000000)*g[20]; - y[25] += tf*g[25] + tg*f[25]; + tf = CONSTANT(0.282094791761999970) * f[0] + CONSTANT(-0.242608896358999990) * f[6] + CONSTANT(0.130197596198000000) * f[20]; + tg = CONSTANT(0.282094791761999970) * g[0] + CONSTANT(-0.242608896358999990) * g[6] + CONSTANT(0.130197596198000000) * g[20]; + y[25] += tf * g[25] + tg * f[25]; t = f[25] * g[25]; - y[0] += CONSTANT(0.282094791761999970)*t; - y[6] += CONSTANT(-0.242608896358999990)*t; - y[20] += CONSTANT(0.130197596198000000)*t; + y[0] += CONSTANT(0.282094791761999970) * t; + y[6] += CONSTANT(-0.242608896358999990) * t; + y[20] += CONSTANT(0.130197596198000000) * t; // [26,26]: 6,20,0, - tf = CONSTANT(-0.097043558542400002)*f[6] + CONSTANT(-0.130197596207000000)*f[20] + CONSTANT(0.282094791766000000)*f[0]; - tg = CONSTANT(-0.097043558542400002)*g[6] + CONSTANT(-0.130197596207000000)*g[20] + CONSTANT(0.282094791766000000)*g[0]; - y[26] += tf*g[26] + tg*f[26]; + tf = CONSTANT(-0.097043558542400002) * f[6] + CONSTANT(-0.130197596207000000) * f[20] + CONSTANT(0.282094791766000000) * f[0]; + tg = CONSTANT(-0.097043558542400002) * g[6] + CONSTANT(-0.130197596207000000) * g[20] + CONSTANT(0.282094791766000000) * g[0]; + y[26] += tf * g[26] + tg * f[26]; t = f[26] * g[26]; - y[6] += CONSTANT(-0.097043558542400002)*t; - y[20] += CONSTANT(-0.130197596207000000)*t; - y[0] += CONSTANT(0.282094791766000000)*t; + y[6] += CONSTANT(-0.097043558542400002) * t; + y[20] += CONSTANT(-0.130197596207000000) * t; + y[0] += CONSTANT(0.282094791766000000) * t; // [27,27]: 0,20,6, - tf = CONSTANT(0.282094791770000020)*f[0] + CONSTANT(-0.130197596204999990)*f[20] + CONSTANT(0.016173926423100001)*f[6]; - tg = CONSTANT(0.282094791770000020)*g[0] + CONSTANT(-0.130197596204999990)*g[20] + CONSTANT(0.016173926423100001)*g[6]; - y[27] += tf*g[27] + tg*f[27]; + tf = CONSTANT(0.282094791770000020) * f[0] + CONSTANT(-0.130197596204999990) * f[20] + CONSTANT(0.016173926423100001) * f[6]; + tg = CONSTANT(0.282094791770000020) * g[0] + CONSTANT(-0.130197596204999990) * g[20] + CONSTANT(0.016173926423100001) * g[6]; + y[27] += tf * g[27] + tg * f[27]; t = f[27] * g[27]; - y[0] += CONSTANT(0.282094791770000020)*t; - y[20] += CONSTANT(-0.130197596204999990)*t; - y[6] += CONSTANT(0.016173926423100001)*t; + y[0] += CONSTANT(0.282094791770000020) * t; + y[20] += CONSTANT(-0.130197596204999990) * t; + y[6] += CONSTANT(0.016173926423100001) * t; // [28,28]: 6,0,20,24, - tf = CONSTANT(0.097043558538800007)*f[6] + CONSTANT(0.282094791771999980)*f[0] + CONSTANT(-0.021699599367299999)*f[20] + CONSTANT(-0.128376561118000000)*f[24]; - tg = CONSTANT(0.097043558538800007)*g[6] + CONSTANT(0.282094791771999980)*g[0] + CONSTANT(-0.021699599367299999)*g[20] + CONSTANT(-0.128376561118000000)*g[24]; - y[28] += tf*g[28] + tg*f[28]; + tf = CONSTANT(0.097043558538800007) * f[6] + CONSTANT(0.282094791771999980) * f[0] + CONSTANT(-0.021699599367299999) * f[20] + + CONSTANT(-0.128376561118000000) * f[24]; + tg = CONSTANT(0.097043558538800007) * g[6] + CONSTANT(0.282094791771999980) * g[0] + CONSTANT(-0.021699599367299999) * g[20] + + CONSTANT(-0.128376561118000000) * g[24]; + y[28] += tf * g[28] + tg * f[28]; t = f[28] * g[28]; - y[6] += CONSTANT(0.097043558538800007)*t; - y[0] += CONSTANT(0.282094791771999980)*t; - y[20] += CONSTANT(-0.021699599367299999)*t; - y[24] += CONSTANT(-0.128376561118000000)*t; + y[6] += CONSTANT(0.097043558538800007) * t; + y[0] += CONSTANT(0.282094791771999980) * t; + y[20] += CONSTANT(-0.021699599367299999) * t; + y[24] += CONSTANT(-0.128376561118000000) * t; // [29,29]: 20,6,0,22,8, - tf = CONSTANT(0.086798397468799998)*f[20] + CONSTANT(0.145565337808999990)*f[6] + CONSTANT(0.282094791773999990)*f[0] + CONSTANT(-0.097043558539500002)*f[22] + CONSTANT(-0.140070311615000000)*f[8]; - tg = CONSTANT(0.086798397468799998)*g[20] + CONSTANT(0.145565337808999990)*g[6] + CONSTANT(0.282094791773999990)*g[0] + CONSTANT(-0.097043558539500002)*g[22] + CONSTANT(-0.140070311615000000)*g[8]; - y[29] += tf*g[29] + tg*f[29]; + tf = CONSTANT(0.086798397468799998) * f[20] + CONSTANT(0.145565337808999990) * f[6] + CONSTANT(0.282094791773999990) * f[0] + + CONSTANT(-0.097043558539500002) * f[22] + CONSTANT(-0.140070311615000000) * f[8]; + tg = CONSTANT(0.086798397468799998) * g[20] + CONSTANT(0.145565337808999990) * g[6] + CONSTANT(0.282094791773999990) * g[0] + + CONSTANT(-0.097043558539500002) * g[22] + CONSTANT(-0.140070311615000000) * g[8]; + y[29] += tf * g[29] + tg * f[29]; t = f[29] * g[29]; - y[20] += CONSTANT(0.086798397468799998)*t; - y[6] += CONSTANT(0.145565337808999990)*t; - y[0] += CONSTANT(0.282094791773999990)*t; - y[22] += CONSTANT(-0.097043558539500002)*t; - y[8] += CONSTANT(-0.140070311615000000)*t; + y[20] += CONSTANT(0.086798397468799998) * t; + y[6] += CONSTANT(0.145565337808999990) * t; + y[0] += CONSTANT(0.282094791773999990) * t; + y[22] += CONSTANT(-0.097043558539500002) * t; + y[8] += CONSTANT(-0.140070311615000000) * t; // [30,30]: 0,20,6, - tf = CONSTANT(0.282094804531000000)*f[0] + CONSTANT(0.130197634486000000)*f[20] + CONSTANT(0.161739292769000010)*f[6]; - tg = CONSTANT(0.282094804531000000)*g[0] + CONSTANT(0.130197634486000000)*g[20] + CONSTANT(0.161739292769000010)*g[6]; - y[30] += tf*g[30] + tg*f[30]; + tf = CONSTANT(0.282094804531000000) * f[0] + CONSTANT(0.130197634486000000) * f[20] + CONSTANT(0.161739292769000010) * f[6]; + tg = CONSTANT(0.282094804531000000) * g[0] + CONSTANT(0.130197634486000000) * g[20] + CONSTANT(0.161739292769000010) * g[6]; + y[30] += tf * g[30] + tg * f[30]; t = f[30] * g[30]; - y[0] += CONSTANT(0.282094804531000000)*t; - y[20] += CONSTANT(0.130197634486000000)*t; - y[6] += CONSTANT(0.161739292769000010)*t; + y[0] += CONSTANT(0.282094804531000000) * t; + y[20] += CONSTANT(0.130197634486000000) * t; + y[6] += CONSTANT(0.161739292769000010) * t; // [31,31]: 6,8,20,22,0, - tf = CONSTANT(0.145565337808999990)*f[6] + CONSTANT(0.140070311615000000)*f[8] + CONSTANT(0.086798397468799998)*f[20] + CONSTANT(0.097043558539500002)*f[22] + CONSTANT(0.282094791773999990)*f[0]; - tg = CONSTANT(0.145565337808999990)*g[6] + CONSTANT(0.140070311615000000)*g[8] + CONSTANT(0.086798397468799998)*g[20] + CONSTANT(0.097043558539500002)*g[22] + CONSTANT(0.282094791773999990)*g[0]; - y[31] += tf*g[31] + tg*f[31]; + tf = CONSTANT(0.145565337808999990) * f[6] + CONSTANT(0.140070311615000000) * f[8] + CONSTANT(0.086798397468799998) * f[20] + + CONSTANT(0.097043558539500002) * f[22] + CONSTANT(0.282094791773999990) * f[0]; + tg = CONSTANT(0.145565337808999990) * g[6] + CONSTANT(0.140070311615000000) * g[8] + CONSTANT(0.086798397468799998) * g[20] + + CONSTANT(0.097043558539500002) * g[22] + CONSTANT(0.282094791773999990) * g[0]; + y[31] += tf * g[31] + tg * f[31]; t = f[31] * g[31]; - y[6] += CONSTANT(0.145565337808999990)*t; - y[8] += CONSTANT(0.140070311615000000)*t; - y[20] += CONSTANT(0.086798397468799998)*t; - y[22] += CONSTANT(0.097043558539500002)*t; - y[0] += CONSTANT(0.282094791773999990)*t; + y[6] += CONSTANT(0.145565337808999990) * t; + y[8] += CONSTANT(0.140070311615000000) * t; + y[20] += CONSTANT(0.086798397468799998) * t; + y[22] += CONSTANT(0.097043558539500002) * t; + y[0] += CONSTANT(0.282094791773999990) * t; // [32,32]: 0,24,20,6, - tf = CONSTANT(0.282094791771999980)*f[0] + CONSTANT(0.128376561118000000)*f[24] + CONSTANT(-0.021699599367299999)*f[20] + CONSTANT(0.097043558538800007)*f[6]; - tg = CONSTANT(0.282094791771999980)*g[0] + CONSTANT(0.128376561118000000)*g[24] + CONSTANT(-0.021699599367299999)*g[20] + CONSTANT(0.097043558538800007)*g[6]; - y[32] += tf*g[32] + tg*f[32]; + tf = CONSTANT(0.282094791771999980) * f[0] + CONSTANT(0.128376561118000000) * f[24] + CONSTANT(-0.021699599367299999) * f[20] + + CONSTANT(0.097043558538800007) * f[6]; + tg = CONSTANT(0.282094791771999980) * g[0] + CONSTANT(0.128376561118000000) * g[24] + CONSTANT(-0.021699599367299999) * g[20] + + CONSTANT(0.097043558538800007) * g[6]; + y[32] += tf * g[32] + tg * f[32]; t = f[32] * g[32]; - y[0] += CONSTANT(0.282094791771999980)*t; - y[24] += CONSTANT(0.128376561118000000)*t; - y[20] += CONSTANT(-0.021699599367299999)*t; - y[6] += CONSTANT(0.097043558538800007)*t; + y[0] += CONSTANT(0.282094791771999980) * t; + y[24] += CONSTANT(0.128376561118000000) * t; + y[20] += CONSTANT(-0.021699599367299999) * t; + y[6] += CONSTANT(0.097043558538800007) * t; // [33,33]: 6,20,0, - tf = CONSTANT(0.016173926423100001)*f[6] + CONSTANT(-0.130197596204999990)*f[20] + CONSTANT(0.282094791770000020)*f[0]; - tg = CONSTANT(0.016173926423100001)*g[6] + CONSTANT(-0.130197596204999990)*g[20] + CONSTANT(0.282094791770000020)*g[0]; - y[33] += tf*g[33] + tg*f[33]; + tf = CONSTANT(0.016173926423100001) * f[6] + CONSTANT(-0.130197596204999990) * f[20] + CONSTANT(0.282094791770000020) * f[0]; + tg = CONSTANT(0.016173926423100001) * g[6] + CONSTANT(-0.130197596204999990) * g[20] + CONSTANT(0.282094791770000020) * g[0]; + y[33] += tf * g[33] + tg * f[33]; t = f[33] * g[33]; - y[6] += CONSTANT(0.016173926423100001)*t; - y[20] += CONSTANT(-0.130197596204999990)*t; - y[0] += CONSTANT(0.282094791770000020)*t; + y[6] += CONSTANT(0.016173926423100001) * t; + y[20] += CONSTANT(-0.130197596204999990) * t; + y[0] += CONSTANT(0.282094791770000020) * t; // [34,34]: 20,6,0, - tf = CONSTANT(-0.130197596207000000)*f[20] + CONSTANT(-0.097043558542400002)*f[6] + CONSTANT(0.282094791766000000)*f[0]; - tg = CONSTANT(-0.130197596207000000)*g[20] + CONSTANT(-0.097043558542400002)*g[6] + CONSTANT(0.282094791766000000)*g[0]; - y[34] += tf*g[34] + tg*f[34]; + tf = CONSTANT(-0.130197596207000000) * f[20] + CONSTANT(-0.097043558542400002) * f[6] + CONSTANT(0.282094791766000000) * f[0]; + tg = CONSTANT(-0.130197596207000000) * g[20] + CONSTANT(-0.097043558542400002) * g[6] + CONSTANT(0.282094791766000000) * g[0]; + y[34] += tf * g[34] + tg * f[34]; t = f[34] * g[34]; - y[20] += CONSTANT(-0.130197596207000000)*t; - y[6] += CONSTANT(-0.097043558542400002)*t; - y[0] += CONSTANT(0.282094791766000000)*t; + y[20] += CONSTANT(-0.130197596207000000) * t; + y[6] += CONSTANT(-0.097043558542400002) * t; + y[0] += CONSTANT(0.282094791766000000) * t; // [35,35]: 6,0,20, - tf = CONSTANT(-0.242608896358999990)*f[6] + CONSTANT(0.282094791761999970)*f[0] + CONSTANT(0.130197596198000000)*f[20]; - tg = CONSTANT(-0.242608896358999990)*g[6] + CONSTANT(0.282094791761999970)*g[0] + CONSTANT(0.130197596198000000)*g[20]; - y[35] += tf*g[35] + tg*f[35]; + tf = CONSTANT(-0.242608896358999990) * f[6] + CONSTANT(0.282094791761999970) * f[0] + CONSTANT(0.130197596198000000) * f[20]; + tg = CONSTANT(-0.242608896358999990) * g[6] + CONSTANT(0.282094791761999970) * g[0] + CONSTANT(0.130197596198000000) * g[20]; + y[35] += tf * g[35] + tg * f[35]; t = f[35] * g[35]; - y[6] += CONSTANT(-0.242608896358999990)*t; - y[0] += CONSTANT(0.282094791761999970)*t; - y[20] += CONSTANT(0.130197596198000000)*t; + y[6] += CONSTANT(-0.242608896358999990) * t; + y[0] += CONSTANT(0.282094791761999970) * t; + y[20] += CONSTANT(0.130197596198000000) * t; // multiply count=2527 return y; } - //------------------------------------------------------------------------------------- // Evaluates a directional light and returns spectral SH data. The output // vector is computed so that if the intensity of R/G/B is unit the resulting @@ -4478,14 +4531,8 @@ float* DirectX::XMSHMultiply6( // // https://msdn.microsoft.com/en-us/library/windows/desktop/bb204988.aspx //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -bool XM_CALLCONV DirectX::XMSHEvalDirectionalLight( - size_t order, - FXMVECTOR dir, - FXMVECTOR color, - float *resultR, - float *resultG, - float *resultB) noexcept +_Use_decl_annotations_ bool XM_CALLCONV +DirectX::XMSHEvalDirectionalLight(size_t order, FXMVECTOR dir, FXMVECTOR color, float* resultR, float* resultG, float* resultB) noexcept { if (!resultR) return false; @@ -4503,7 +4550,7 @@ bool XM_CALLCONV DirectX::XMSHEvalDirectionalLight( // now compute "normalization" and scale vector for each valid spectral band const float fNorm = XM_PI / CosWtInt(order); - const size_t numcoeff = order*order; + const size_t numcoeff = order * order; const float fRScale = fNorm * clr.x; @@ -4535,7 +4582,6 @@ bool XM_CALLCONV DirectX::XMSHEvalDirectionalLight( return true; } - //------------------------------------------------------------------------------------ // Evaluates a spherical light and returns spectral SH data. There is no // normalization of the intensity of the light like there is for directional @@ -4545,15 +4591,13 @@ bool XM_CALLCONV DirectX::XMSHEvalDirectionalLight( // // https://msdn.microsoft.com/en-us/library/windows/desktop/bb205451.aspx //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -bool XM_CALLCONV DirectX::XMSHEvalSphericalLight( - size_t order, - FXMVECTOR pos, - float radius, - FXMVECTOR color, - float *resultR, - float *resultG, - float *resultB) noexcept +_Use_decl_annotations_ bool XM_CALLCONV DirectX::XMSHEvalSphericalLight(size_t order, + FXMVECTOR pos, + float radius, + FXMVECTOR color, + float* resultR, + float* resultG, + float* resultB) noexcept { if (!resultR) return false; @@ -4565,12 +4609,12 @@ bool XM_CALLCONV DirectX::XMSHEvalSphericalLight( // WARNING: fDist should not be < radius - otherwise light contains origin - //const float fSinConeAngle = (fDist <= radius) ? 0.99999f : radius/fDist; + // const float fSinConeAngle = (fDist <= radius) ? 0.99999f : radius/fDist; const float fConeAngle = (fDist <= radius) ? (XM_PIDIV2) : asinf(radius / fDist); XMVECTOR dir = XMVector3Normalize(pos); - float fTmpDir[XM_SH_MAXORDER* XM_SH_MAXORDER]; // rotation "vector" + float fTmpDir[XM_SH_MAXORDER * XM_SH_MAXORDER]; // rotation "vector" float fTmpL0[XM_SH_MAXORDER]; // @@ -4590,7 +4634,7 @@ bool XM_CALLCONV DirectX::XMSHEvalSphericalLight( // no default normalization is done for this case, have to be careful how // you represent the coefficients... - const float fNewNorm = 1.0f;///(fSinConeAngle*fSinConeAngle); + const float fNewNorm = 1.0f; ///(fSinConeAngle*fSinConeAngle); ComputeCapInt(order, fConeAngle, fTmpL0); @@ -4603,29 +4647,17 @@ bool XM_CALLCONV DirectX::XMSHEvalSphericalLight( switch (order) { - case 2: - sh_eval_basis_1(fX, fY, fZ, fTmpDir); - break; + case 2: sh_eval_basis_1(fX, fY, fZ, fTmpDir); break; - case 3: - sh_eval_basis_2(fX, fY, fZ, fTmpDir); - break; + case 3: sh_eval_basis_2(fX, fY, fZ, fTmpDir); break; - case 4: - sh_eval_basis_3(fX, fY, fZ, fTmpDir); - break; + case 4: sh_eval_basis_3(fX, fY, fZ, fTmpDir); break; - case 5: - sh_eval_basis_4(fX, fY, fZ, fTmpDir); - break; + case 5: sh_eval_basis_4(fX, fY, fZ, fTmpDir); break; - case 6: - sh_eval_basis_5(fX, fY, fZ, fTmpDir); - break; + case 6: sh_eval_basis_5(fX, fY, fZ, fTmpDir); break; - default: - assert(order < XM_SH_MINORDER || order > XM_SH_MAXORDER); - return false; + default: assert(order < XM_SH_MINORDER || order > XM_SH_MAXORDER); return false; } XMFLOAT3A clr; @@ -4634,9 +4666,10 @@ bool XM_CALLCONV DirectX::XMSHEvalSphericalLight( for (size_t i = 0; i < order; ++i) { const size_t cNumCoefs = 2 * i + 1; - const size_t cStart = i*i; - const float fValUse = fTmpL0[i] * clr.x*fNewNorm*fExtraNormFac[i]; - for (size_t j = 0; j < cNumCoefs; ++j) resultR[cStart + j] = fTmpDir[cStart + j] * fValUse; + const size_t cStart = i * i; + const float fValUse = fTmpL0[i] * clr.x * fNewNorm * fExtraNormFac[i]; + for (size_t j = 0; j < cNumCoefs; ++j) + resultR[cStart + j] = fTmpDir[cStart + j] * fValUse; } if (resultG) @@ -4644,9 +4677,10 @@ bool XM_CALLCONV DirectX::XMSHEvalSphericalLight( for (size_t i = 0; i < order; ++i) { const size_t cNumCoefs = 2 * i + 1; - const size_t cStart = i*i; - const float fValUse = fTmpL0[i] * clr.y*fNewNorm*fExtraNormFac[i]; - for (size_t j = 0; j < cNumCoefs; ++j) resultG[cStart + j] = fTmpDir[cStart + j] * fValUse; + const size_t cStart = i * i; + const float fValUse = fTmpL0[i] * clr.y * fNewNorm * fExtraNormFac[i]; + for (size_t j = 0; j < cNumCoefs; ++j) + resultG[cStart + j] = fTmpDir[cStart + j] * fValUse; } } @@ -4655,16 +4689,16 @@ bool XM_CALLCONV DirectX::XMSHEvalSphericalLight( for (size_t i = 0; i < order; ++i) { const size_t cNumCoefs = 2 * i + 1; - const size_t cStart = i*i; - const float fValUse = fTmpL0[i] * clr.z*fNewNorm*fExtraNormFac[i]; - for (size_t j = 0; j < cNumCoefs; ++j) resultB[cStart + j] = fTmpDir[cStart + j] * fValUse; + const size_t cStart = i * i; + const float fValUse = fTmpL0[i] * clr.z * fNewNorm * fExtraNormFac[i]; + for (size_t j = 0; j < cNumCoefs; ++j) + resultB[cStart + j] = fTmpDir[cStart + j] * fValUse; } } return true; } - //------------------------------------------------------------------------------------- // Evaluates a light that is a cone of constant intensity and returns spectral // SH data. The output vector is computed so that if the intensity of R/G/B is @@ -4675,20 +4709,18 @@ bool XM_CALLCONV DirectX::XMSHEvalSphericalLight( // // https://msdn.microsoft.com/en-us/library/windows/desktop/bb204986.aspx //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -bool XM_CALLCONV DirectX::XMSHEvalConeLight( - size_t order, - FXMVECTOR dir, - float radius, - FXMVECTOR color, - float *resultR, - float *resultG, - float *resultB) noexcept +_Use_decl_annotations_ bool XM_CALLCONV DirectX::XMSHEvalConeLight(size_t order, + FXMVECTOR dir, + float radius, + FXMVECTOR color, + float* resultR, + float* resultG, + float* resultB) noexcept { if (!resultR) return false; - if (radius < 0.f || radius >(XM_PI*1.00001f)) + if (radius < 0.f || radius > (XM_PI * 1.00001f)) return false; if (radius < 0.0001f) @@ -4702,9 +4734,9 @@ bool XM_CALLCONV DirectX::XMSHEvalConeLight( float fTmpDir[XM_SH_MAXORDER * XM_SH_MAXORDER]; const float fConeAngle = radius; - const float fAngCheck = (fConeAngle > XM_PIDIV2) ? (XM_PIDIV2) : fConeAngle; + const float fAngCheck = (fConeAngle > XM_PIDIV2) ? (XM_PIDIV2) : fConeAngle; - const float fNewNorm = 1.0f / (sinf(fAngCheck)*sinf(fAngCheck)); + const float fNewNorm = 1.0f / (sinf(fAngCheck) * sinf(fAngCheck)); ComputeCapInt(order, fConeAngle, fTmpL0); @@ -4717,29 +4749,17 @@ bool XM_CALLCONV DirectX::XMSHEvalConeLight( switch (order) { - case 2: - sh_eval_basis_1(fX, fY, fZ, fTmpDir); - break; + case 2: sh_eval_basis_1(fX, fY, fZ, fTmpDir); break; - case 3: - sh_eval_basis_2(fX, fY, fZ, fTmpDir); - break; + case 3: sh_eval_basis_2(fX, fY, fZ, fTmpDir); break; - case 4: - sh_eval_basis_3(fX, fY, fZ, fTmpDir); - break; + case 4: sh_eval_basis_3(fX, fY, fZ, fTmpDir); break; - case 5: - sh_eval_basis_4(fX, fY, fZ, fTmpDir); - break; + case 5: sh_eval_basis_4(fX, fY, fZ, fTmpDir); break; - case 6: - sh_eval_basis_5(fX, fY, fZ, fTmpDir); - break; + case 6: sh_eval_basis_5(fX, fY, fZ, fTmpDir); break; - default: - assert(order < XM_SH_MINORDER || order > XM_SH_MAXORDER); - return false; + default: assert(order < XM_SH_MINORDER || order > XM_SH_MAXORDER); return false; } XMFLOAT3A clr; @@ -4748,8 +4768,8 @@ bool XM_CALLCONV DirectX::XMSHEvalConeLight( for (size_t i = 0; i < order; ++i) { const size_t cNumCoefs = 2 * i + 1; - const size_t cStart = i*i; - const float fValUse = fTmpL0[i] * clr.x*fNewNorm*fExtraNormFac[i]; + const size_t cStart = i * i; + const float fValUse = fTmpL0[i] * clr.x * fNewNorm * fExtraNormFac[i]; for (size_t j = 0; j < cNumCoefs; ++j) resultR[cStart + j] = fTmpDir[cStart + j] * fValUse; } @@ -4759,8 +4779,8 @@ bool XM_CALLCONV DirectX::XMSHEvalConeLight( for (size_t i = 0; i < order; ++i) { const size_t cNumCoefs = 2 * i + 1; - const size_t cStart = i*i; - const float fValUse = fTmpL0[i] * clr.y*fNewNorm*fExtraNormFac[i]; + const size_t cStart = i * i; + const float fValUse = fTmpL0[i] * clr.y * fNewNorm * fExtraNormFac[i]; for (size_t j = 0; j < cNumCoefs; ++j) resultG[cStart + j] = fTmpDir[cStart + j] * fValUse; } @@ -4771,8 +4791,8 @@ bool XM_CALLCONV DirectX::XMSHEvalConeLight( for (size_t i = 0; i < order; ++i) { const size_t cNumCoefs = 2 * i + 1; - const size_t cStart = i*i; - const float fValUse = fTmpL0[i] * clr.z*fNewNorm*fExtraNormFac[i]; + const size_t cStart = i * i; + const float fValUse = fTmpL0[i] * clr.z * fNewNorm * fExtraNormFac[i]; for (size_t j = 0; j < cNumCoefs; ++j) resultB[cStart + j] = fTmpDir[cStart + j] * fValUse; } @@ -4782,7 +4802,6 @@ bool XM_CALLCONV DirectX::XMSHEvalConeLight( return true; } - //------------------------------------------------------------------------------------ // Evaluates a light that is a linear interpolant between two colors over the // sphere. The interpolant is linear along the axis of the two points, not @@ -4796,15 +4815,13 @@ bool XM_CALLCONV DirectX::XMSHEvalConeLight( // // https://msdn.microsoft.com/en-us/library/windows/desktop/bb204989.aspx //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -bool XM_CALLCONV DirectX::XMSHEvalHemisphereLight( - size_t order, - FXMVECTOR dir, - FXMVECTOR topColor, - FXMVECTOR bottomColor, - float *resultR, - float *resultG, - float *resultB) noexcept +_Use_decl_annotations_ bool XM_CALLCONV DirectX::XMSHEvalHemisphereLight(size_t order, + FXMVECTOR dir, + FXMVECTOR topColor, + FXMVECTOR bottomColor, + float* resultR, + float* resultG, + float* resultB) noexcept { if (!resultR) return false; @@ -4814,10 +4831,10 @@ bool XM_CALLCONV DirectX::XMSHEvalHemisphereLight( // seperate "R/G/B colors... - float fTmpDir[XM_SH_MAXORDER * XM_SH_MAXORDER]; // rotation "vector" + float fTmpDir[XM_SH_MAXORDER * XM_SH_MAXORDER]; // rotation "vector" float fTmpL0[XM_SH_MAXORDER]; - const float fNewNorm = 3.0f / 2.0f; // normalizes things for 1 sky color, 0 ground color... + const float fNewNorm = 3.0f / 2.0f; // normalizes things for 1 sky color, 0 ground color... XMFLOAT3A vd; XMStoreFloat3(&vd, dir); @@ -4834,76 +4851,82 @@ bool XM_CALLCONV DirectX::XMSHEvalHemisphereLight( XMFLOAT3A clrBottom; XMStoreFloat3A(&clrBottom, bottomColor); - float fA = clrTop.x; - float fAvrg = (clrTop.x + clrBottom.x)*0.5f; + float fA = clrTop.x; + float fAvrg = (clrTop.x + clrBottom.x) * 0.5f; - fTmpL0[0] = fAvrg*2.0f*SHEvalHemisphereLight_fSqrtPi; - fTmpL0[1] = (fA - fAvrg)*2.0f*SHEvalHemisphereLight_fSqrtPi3; + fTmpL0[0] = fAvrg * 2.0f * SHEvalHemisphereLight_fSqrtPi; + fTmpL0[1] = (fA - fAvrg) * 2.0f * SHEvalHemisphereLight_fSqrtPi3; size_t i = 0; for (; i < 2; ++i) { _Analysis_assume_(i < order); const size_t cNumCoefs = 2 * i + 1; - const size_t cStart = i*i; - const float fValUse = fTmpL0[i] * fNewNorm*fExtraNormFac[i]; - for (size_t j = 0; j < cNumCoefs; ++j) resultR[cStart + j] = fTmpDir[cStart + j] * fValUse; + const size_t cStart = i * i; + const float fValUse = fTmpL0[i] * fNewNorm * fExtraNormFac[i]; + for (size_t j = 0; j < cNumCoefs; ++j) + resultR[cStart + j] = fTmpDir[cStart + j] * fValUse; } for (; i < order; ++i) { const size_t cNumCoefs = 2 * i + 1; - const size_t cStart = i*i; - for (size_t j = 0; j < cNumCoefs; ++j) resultR[cStart + j] = 0.0f; + const size_t cStart = i * i; + for (size_t j = 0; j < cNumCoefs; ++j) + resultR[cStart + j] = 0.0f; } if (resultG) { - fA = clrTop.y; - fAvrg = (clrTop.y + clrBottom.y)*0.5f; + fA = clrTop.y; + fAvrg = (clrTop.y + clrBottom.y) * 0.5f; - fTmpL0[0] = fAvrg*2.0f*SHEvalHemisphereLight_fSqrtPi; - fTmpL0[1] = (fA - fAvrg)*2.0f*SHEvalHemisphereLight_fSqrtPi3; + fTmpL0[0] = fAvrg * 2.0f * SHEvalHemisphereLight_fSqrtPi; + fTmpL0[1] = (fA - fAvrg) * 2.0f * SHEvalHemisphereLight_fSqrtPi3; for (i = 0; i < 2; ++i) { _Analysis_assume_(i < order); const size_t cNumCoefs = 2 * i + 1; - const size_t cStart = i*i; - const float fValUse = fTmpL0[i] * fNewNorm*fExtraNormFac[i]; - for (size_t j = 0; j < cNumCoefs; ++j) resultG[cStart + j] = fTmpDir[cStart + j] * fValUse; + const size_t cStart = i * i; + const float fValUse = fTmpL0[i] * fNewNorm * fExtraNormFac[i]; + for (size_t j = 0; j < cNumCoefs; ++j) + resultG[cStart + j] = fTmpDir[cStart + j] * fValUse; } for (; i < order; ++i) { const size_t cNumCoefs = 2 * i + 1; - const size_t cStart = i*i; - for (size_t j = 0; j < cNumCoefs; ++j) resultG[cStart + j] = 0.0f; + const size_t cStart = i * i; + for (size_t j = 0; j < cNumCoefs; ++j) + resultG[cStart + j] = 0.0f; } } if (resultB) { - fA = clrTop.z; - fAvrg = (clrTop.z + clrBottom.z)*0.5f; + fA = clrTop.z; + fAvrg = (clrTop.z + clrBottom.z) * 0.5f; - fTmpL0[0] = fAvrg*2.0f*SHEvalHemisphereLight_fSqrtPi; - fTmpL0[1] = (fA - fAvrg)*2.0f*SHEvalHemisphereLight_fSqrtPi3; + fTmpL0[0] = fAvrg * 2.0f * SHEvalHemisphereLight_fSqrtPi; + fTmpL0[1] = (fA - fAvrg) * 2.0f * SHEvalHemisphereLight_fSqrtPi3; for (i = 0; i < 2; ++i) { _Analysis_assume_(i < order); const size_t cNumCoefs = 2 * i + 1; - const size_t cStart = i*i; - const float fValUse = fTmpL0[i] * fNewNorm*fExtraNormFac[i]; - for (size_t j = 0; j < cNumCoefs; ++j) resultB[cStart + j] = fTmpDir[cStart + j] * fValUse; + const size_t cStart = i * i; + const float fValUse = fTmpL0[i] * fNewNorm * fExtraNormFac[i]; + for (size_t j = 0; j < cNumCoefs; ++j) + resultB[cStart + j] = fTmpDir[cStart + j] * fValUse; } for (; i < order; ++i) { const size_t cNumCoefs = 2 * i + 1; - const size_t cStart = i*i; - for (size_t j = 0; j < cNumCoefs; ++j) resultB[cStart + j] = 0.0f; + const size_t cStart = i * i; + for (size_t j = 0; j < cNumCoefs; ++j) + resultB[cStart + j] = 0.0f; } } diff --git a/SHMath/DirectXSH.h b/SHMath/DirectXSH.h index 4601fd8a..fd9ca52a 100644 --- a/SHMath/DirectXSH.h +++ b/SHMath/DirectXSH.h @@ -18,55 +18,91 @@ namespace DirectX constexpr size_t XM_SH_MINORDER = 2; constexpr size_t XM_SH_MAXORDER = 6; - float* XM_CALLCONV XMSHEvalDirection(_Out_writes_(order*order) float *result, _In_ size_t order, _In_ FXMVECTOR dir) noexcept; - - float* XM_CALLCONV XMSHRotate(_Out_writes_(order*order) float *result, _In_ size_t order, _In_ FXMMATRIX rotMatrix, _In_reads_(order*order) const float *input) noexcept; - - float* XMSHRotateZ(_Out_writes_(order*order) float *result, _In_ size_t order, _In_ float angle, _In_reads_(order*order) const float *input) noexcept; - - float* XMSHAdd(_Out_writes_(order*order) float *result, _In_ size_t order, _In_reads_(order*order) const float *inputA, _In_reads_(order*order) const float *inputB) noexcept; - - float* XMSHScale(_Out_writes_(order*order) float *result, _In_ size_t order, _In_reads_(order*order) const float *input, _In_ float scale) noexcept; - - float XMSHDot(_In_ size_t order, _In_reads_(order*order) const float *inputA, _In_reads_(order*order) const float *inputB) noexcept; - - float* XMSHMultiply(_Out_writes_(order*order) float *result, _In_ size_t order, _In_reads_(order*order) const float *inputF, _In_reads_(order*order) const float *inputG) noexcept; - - float* XMSHMultiply2(_Out_writes_(4) float *result, _In_reads_(4) const float *inputF, _In_reads_(4) const float *inputG) noexcept; - - float* XMSHMultiply3(_Out_writes_(9) float *result, _In_reads_(9) const float *inputF, _In_reads_(9) const float *inputG) noexcept; - - float* XMSHMultiply4(_Out_writes_(16) float *result, _In_reads_(16) const float *inputF, _In_reads_(16) const float *inputG) noexcept; - - float* XMSHMultiply5(_Out_writes_(25) float *result, _In_reads_(25) const float *inputF, _In_reads_(25) const float *inputG) noexcept; - - float* XMSHMultiply6(_Out_writes_(36) float *result, _In_reads_(36) const float *inputF, _In_reads_(36) const float *inputG) noexcept; - - bool XM_CALLCONV XMSHEvalDirectionalLight( - _In_ size_t order, _In_ FXMVECTOR dir, _In_ FXMVECTOR color, - _Out_writes_(order*order) float *resultR, _Out_writes_opt_(order*order) float *resultG, _Out_writes_opt_(order*order) float *resultB) noexcept; - - bool XM_CALLCONV XMSHEvalSphericalLight( - _In_ size_t order, _In_ FXMVECTOR pos, _In_ float radius, _In_ FXMVECTOR color, - _Out_writes_(order*order) float *resultR, _Out_writes_opt_(order*order) float *resultG, _Out_writes_opt_(order*order) float *resultB) noexcept; - - bool XM_CALLCONV XMSHEvalConeLight( - _In_ size_t order, _In_ FXMVECTOR dir, _In_ float radius, _In_ FXMVECTOR color, - _Out_writes_(order*order) float *resultR, _Out_writes_opt_(order*order) float *resultG, _Out_writes_opt_(order*order) float *resultB) noexcept; - - bool XM_CALLCONV XMSHEvalHemisphereLight( - _In_ size_t order, _In_ FXMVECTOR dir, _In_ FXMVECTOR topColor, _In_ FXMVECTOR bottomColor, - _Out_writes_(order*order) float *resultR, _Out_writes_opt_(order*order) float *resultG, _Out_writes_opt_(order*order) float *resultB) noexcept; + float* XM_CALLCONV XMSHEvalDirection(_Out_writes_(order* order) float* result, _In_ size_t order, _In_ FXMVECTOR dir) noexcept; + + float* XM_CALLCONV XMSHRotate(_Out_writes_(order* order) float* result, + _In_ size_t order, + _In_ FXMMATRIX rotMatrix, + _In_reads_(order* order) const float* input) noexcept; + + float* XMSHRotateZ(_Out_writes_(order* order) float* result, + _In_ size_t order, + _In_ float angle, + _In_reads_(order* order) const float* input) noexcept; + + float* XMSHAdd(_Out_writes_(order* order) float* result, + _In_ size_t order, + _In_reads_(order* order) const float* inputA, + _In_reads_(order* order) const float* inputB) noexcept; + + float* XMSHScale(_Out_writes_(order* order) float* result, + _In_ size_t order, + _In_reads_(order* order) const float* input, + _In_ float scale) noexcept; + + float XMSHDot(_In_ size_t order, _In_reads_(order* order) const float* inputA, _In_reads_(order* order) const float* inputB) noexcept; + + float* XMSHMultiply(_Out_writes_(order* order) float* result, + _In_ size_t order, + _In_reads_(order* order) const float* inputF, + _In_reads_(order* order) const float* inputG) noexcept; + + float* XMSHMultiply2(_Out_writes_(4) float* result, _In_reads_(4) const float* inputF, _In_reads_(4) const float* inputG) noexcept; + + float* XMSHMultiply3(_Out_writes_(9) float* result, _In_reads_(9) const float* inputF, _In_reads_(9) const float* inputG) noexcept; + + float* XMSHMultiply4(_Out_writes_(16) float* result, _In_reads_(16) const float* inputF, _In_reads_(16) const float* inputG) noexcept; + + float* XMSHMultiply5(_Out_writes_(25) float* result, _In_reads_(25) const float* inputF, _In_reads_(25) const float* inputG) noexcept; + + float* XMSHMultiply6(_Out_writes_(36) float* result, _In_reads_(36) const float* inputF, _In_reads_(36) const float* inputG) noexcept; + + bool XM_CALLCONV XMSHEvalDirectionalLight(_In_ size_t order, + _In_ FXMVECTOR dir, + _In_ FXMVECTOR color, + _Out_writes_(order* order) float* resultR, + _Out_writes_opt_(order* order) float* resultG, + _Out_writes_opt_(order* order) float* resultB) noexcept; + + bool XM_CALLCONV XMSHEvalSphericalLight(_In_ size_t order, + _In_ FXMVECTOR pos, + _In_ float radius, + _In_ FXMVECTOR color, + _Out_writes_(order* order) float* resultR, + _Out_writes_opt_(order* order) float* resultG, + _Out_writes_opt_(order* order) float* resultB) noexcept; + + bool XM_CALLCONV XMSHEvalConeLight(_In_ size_t order, + _In_ FXMVECTOR dir, + _In_ float radius, + _In_ FXMVECTOR color, + _Out_writes_(order* order) float* resultR, + _Out_writes_opt_(order* order) float* resultG, + _Out_writes_opt_(order* order) float* resultB) noexcept; + + bool XM_CALLCONV XMSHEvalHemisphereLight(_In_ size_t order, + _In_ FXMVECTOR dir, + _In_ FXMVECTOR topColor, + _In_ FXMVECTOR bottomColor, + _Out_writes_(order* order) float* resultR, + _Out_writes_opt_(order* order) float* resultG, + _Out_writes_opt_(order* order) float* resultB) noexcept; #if defined(__d3d11_h__) || defined(__d3d11_x_h__) - HRESULT SHProjectCubeMap( - _In_ ID3D11DeviceContext *context, _In_ size_t order, _In_ ID3D11Texture2D *cubeMap, - _Out_writes_opt_(order*order) float *resultR, _Out_writes_opt_(order*order) float *resultG, _Out_writes_opt_(order*order) float *resultB) noexcept; + HRESULT SHProjectCubeMap(_In_ ID3D11DeviceContext* context, + _In_ size_t order, + _In_ ID3D11Texture2D* cubeMap, + _Out_writes_opt_(order* order) float* resultR, + _Out_writes_opt_(order* order) float* resultG, + _Out_writes_opt_(order* order) float* resultB) noexcept; #endif #if defined(__d3d12_h__) || defined(__d3d12_x_h__) || defined(__XBOX_D3D12_X__) - HRESULT SHProjectCubeMap( - _In_ size_t order, _In_ const D3D12_RESOURCE_DESC& desc, _In_ const D3D12_SUBRESOURCE_DATA cubeMap[6], - _Out_writes_opt_(order*order) float *resultR, _Out_writes_opt_(order*order) float *resultG, _Out_writes_opt_(order*order) float *resultB) noexcept; + HRESULT SHProjectCubeMap(_In_ size_t order, + _In_ const D3D12_RESOURCE_DESC& desc, + _In_ const D3D12_SUBRESOURCE_DATA cubeMap[6], + _Out_writes_opt_(order* order) float* resultR, + _Out_writes_opt_(order* order) float* resultG, + _Out_writes_opt_(order* order) float* resultB) noexcept; #endif } // namespace DirectX diff --git a/SHMath/DirectXSHD3D11.cpp b/SHMath/DirectXSHD3D11.cpp index 3b6b9998..ea04a532 100644 --- a/SHMath/DirectXSHD3D11.cpp +++ b/SHMath/DirectXSHD3D11.cpp @@ -8,7 +8,7 @@ //------------------------------------------------------------------------------------- #ifdef _MSC_VER -#pragma warning( disable : 4616 4619 4061 4265 4626 5039 ) +#pragma warning(disable : 4616 4619 4061 4265 4626 5039) // C4616/C4619 #pragma warning warnings // C4061 numerator 'identifier' in switch of enum 'enumeration' is not explicitly handled by a case label // C4265 class has virtual functions, but destructor is not virtual @@ -16,7 +16,7 @@ // C5039 pointer or reference to potentially throwing function passed to extern C function under - EHc #pragma warning(push) -#pragma warning(disable: 4365) +#pragma warning(disable : 4365) #endif #include #ifdef _MSC_VER @@ -46,7 +46,10 @@ using Microsoft::WRL::ComPtr; namespace { - struct aligned_deleter { void operator()(void* p) { _aligned_free(p); } }; + struct aligned_deleter + { + void operator()(void* p) { _aligned_free(p); } + }; using ScopedAlignedArrayXMVECTOR = std::unique_ptr; @@ -54,58 +57,59 @@ namespace // This code is lifted from DirectXTex https://go.microsoft.com/fwlink/?LinkId=248926 // If you need additional DXGI format support, see DirectXTexConvert.cpp //------------------------------------------------------------------------------------- -#define LOAD_SCANLINE( type, func )\ - if ( size >= sizeof(type) )\ - {\ - const type * __restrict sPtr = reinterpret_cast(pSource);\ - for( size_t icount = 0; icount < ( size - sizeof(type) + 1 ); icount += sizeof(type) )\ - {\ - if ( dPtr >= ePtr ) break;\ - *(dPtr++) = func( sPtr++ );\ - }\ - return true;\ - }\ - return false; - -#define LOAD_SCANLINE3( type, func, defvec )\ - if ( size >= sizeof(type) )\ - {\ - const type * __restrict sPtr = reinterpret_cast(pSource);\ - for( size_t icount = 0; icount < ( size - sizeof(type) + 1 ); icount += sizeof(type) )\ - {\ - XMVECTOR v = func( sPtr++ );\ - if ( dPtr >= ePtr ) break;\ - *(dPtr++) = XMVectorSelect( defvec, v, g_XMSelect1110 );\ - }\ - return true;\ - }\ - return false; - -#define LOAD_SCANLINE2( type, func, defvec )\ - if ( size >= sizeof(type) )\ - {\ - const type * __restrict sPtr = reinterpret_cast(pSource);\ - for( size_t icount = 0; icount < ( size - sizeof(type) + 1 ); icount += sizeof(type) )\ - {\ - XMVECTOR v = func( sPtr++ );\ - if ( dPtr >= ePtr ) break;\ - *(dPtr++) = XMVectorSelect( defvec, v, g_XMSelect1100 );\ - }\ - return true;\ - }\ - return false; +#define LOAD_SCANLINE(type, func) \ + if (size >= sizeof(type)) \ + { \ + const type* __restrict sPtr = reinterpret_cast(pSource); \ + for (size_t icount = 0; icount < (size - sizeof(type) + 1); icount += sizeof(type)) \ + { \ + if (dPtr >= ePtr) \ + break; \ + *(dPtr++) = func(sPtr++); \ + } \ + return true; \ + } \ + return false; + +#define LOAD_SCANLINE3(type, func, defvec) \ + if (size >= sizeof(type)) \ + { \ + const type* __restrict sPtr = reinterpret_cast(pSource); \ + for (size_t icount = 0; icount < (size - sizeof(type) + 1); icount += sizeof(type)) \ + { \ + XMVECTOR v = func(sPtr++); \ + if (dPtr >= ePtr) \ + break; \ + *(dPtr++) = XMVectorSelect(defvec, v, g_XMSelect1110); \ + } \ + return true; \ + } \ + return false; + +#define LOAD_SCANLINE2(type, func, defvec) \ + if (size >= sizeof(type)) \ + { \ + const type* __restrict sPtr = reinterpret_cast(pSource); \ + for (size_t icount = 0; icount < (size - sizeof(type) + 1); icount += sizeof(type)) \ + { \ + XMVECTOR v = func(sPtr++); \ + if (dPtr >= ePtr) \ + break; \ + *(dPtr++) = XMVectorSelect(defvec, v, g_XMSelect1100); \ + } \ + return true; \ + } \ + return false; #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 6101) #endif - _Success_(return) - bool LoadScanline( - _Out_writes_(count) DirectX::XMVECTOR* pDestination, - size_t count, - _In_reads_bytes_(size) LPCVOID pSource, - size_t size, - DXGI_FORMAT format) + _Success_(return) bool LoadScanline(_Out_writes_(count) DirectX::XMVECTOR* pDestination, + size_t count, + _In_reads_bytes_(size) LPCVOID pSource, + size_t size, + DXGI_FORMAT format) { assert(pDestination && count > 0 && ((reinterpret_cast(pDestination) & 0xF) == 0)); assert(pSource && size > 0); @@ -120,27 +124,21 @@ namespace switch (format) { - case DXGI_FORMAT_R32G32B32A32_FLOAT: - { - size_t msize = (size > (sizeof(XMVECTOR)*count)) ? (sizeof(XMVECTOR)*count) : size; - memcpy_s(dPtr, sizeof(XMVECTOR)*count, pSource, msize); - } + case DXGI_FORMAT_R32G32B32A32_FLOAT: { + size_t msize = (size > (sizeof(XMVECTOR) * count)) ? (sizeof(XMVECTOR) * count) : size; + memcpy_s(dPtr, sizeof(XMVECTOR) * count, pSource, msize); + } return true; - case DXGI_FORMAT_R32G32B32_FLOAT: - LOAD_SCANLINE3(XMFLOAT3, XMLoadFloat3, g_XMIdentityR3) + case DXGI_FORMAT_R32G32B32_FLOAT: LOAD_SCANLINE3(XMFLOAT3, XMLoadFloat3, g_XMIdentityR3) - case DXGI_FORMAT_R16G16B16A16_FLOAT: - LOAD_SCANLINE(XMHALF4, XMLoadHalf4) + case DXGI_FORMAT_R16G16B16A16_FLOAT: LOAD_SCANLINE(XMHALF4, XMLoadHalf4) - case DXGI_FORMAT_R32G32_FLOAT: - LOAD_SCANLINE2(XMFLOAT2, XMLoadFloat2, g_XMIdentityR3) + case DXGI_FORMAT_R32G32_FLOAT: LOAD_SCANLINE2(XMFLOAT2, XMLoadFloat2, g_XMIdentityR3) - case DXGI_FORMAT_R11G11B10_FLOAT: - LOAD_SCANLINE3(XMFLOAT3PK, XMLoadFloat3PK, g_XMIdentityR3) + case DXGI_FORMAT_R11G11B10_FLOAT: LOAD_SCANLINE3(XMFLOAT3PK, XMLoadFloat3PK, g_XMIdentityR3) - case DXGI_FORMAT_R16G16_FLOAT: - LOAD_SCANLINE2(XMHALF2, XMLoadHalf2, g_XMIdentityR3) + case DXGI_FORMAT_R16G16_FLOAT: LOAD_SCANLINE2(XMHALF2, XMLoadHalf2, g_XMIdentityR3) case DXGI_FORMAT_R32_FLOAT: if (size >= sizeof(float)) @@ -149,7 +147,8 @@ namespace for (size_t icount = 0; icount < size; icount += sizeof(float)) { XMVECTOR v = XMLoadFloat(sPtr++); - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSelect(g_XMIdentityR3, v, g_XMSelect1000); } return true; @@ -159,38 +158,36 @@ namespace case DXGI_FORMAT_R16_FLOAT: if (size >= sizeof(HALF)) { - const HALF * __restrict sPtr = reinterpret_cast(pSource); + const HALF* __restrict sPtr = reinterpret_cast(pSource); for (size_t icount = 0; icount < size; icount += sizeof(HALF)) { - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSet(XMConvertHalfToFloat(*sPtr++), 0.f, 0.f, 1.f); } return true; } return false; - default: - return false; + default: return false; } } #ifdef _MSC_VER #pragma warning(pop) #endif -} // namespace anonymous +} // namespace //------------------------------------------------------------------------------------- // Projects a function represented in a cube map into spherical harmonics. // // https://msdn.microsoft.com/en-us/library/windows/desktop/ff476300.aspx //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::SHProjectCubeMap( - ID3D11DeviceContext *context, - size_t order, - ID3D11Texture2D *cubeMap, - float *resultR, - float *resultG, - float* resultB) noexcept +_Use_decl_annotations_ HRESULT DirectX::SHProjectCubeMap(ID3D11DeviceContext* context, + size_t order, + ID3D11Texture2D* cubeMap, + float* resultR, + float* resultG, + float* resultB) noexcept { if (!context || !cubeMap) return E_INVALIDARG; @@ -201,9 +198,7 @@ HRESULT DirectX::SHProjectCubeMap( D3D11_TEXTURE2D_DESC desc; cubeMap->GetDesc(&desc); - if ((desc.ArraySize != 6) - || (desc.Width != desc.Height) - || (desc.SampleDesc.Count > 1)) + if ((desc.ArraySize != 6) || (desc.Width != desc.Height) || (desc.SampleDesc.Count > 1)) return E_FAIL; switch (desc.Format) @@ -219,8 +214,7 @@ HRESULT DirectX::SHProjectCubeMap( // See LoadScanline to support more pixel formats break; - default: - return E_FAIL; + default: return E_FAIL; } //--- Create a staging resource copy (if needed) to be able to read data @@ -230,9 +224,9 @@ HRESULT DirectX::SHProjectCubeMap( if (!(desc.CPUAccessFlags & D3D11_CPU_ACCESS_READ)) { D3D11_TEXTURE2D_DESC sdesc = desc; - sdesc.BindFlags = 0; - sdesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - sdesc.Usage = D3D11_USAGE_STAGING; + sdesc.BindFlags = 0; + sdesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + sdesc.Usage = D3D11_USAGE_STAGING; ComPtr device; context->GetDevice(&device); @@ -251,12 +245,12 @@ HRESULT DirectX::SHProjectCubeMap( assert(texture != nullptr); //--- Setup for SH projection - ScopedAlignedArrayXMVECTOR scanline(reinterpret_cast(_aligned_malloc(sizeof(XMVECTOR)*desc.Width, 16))); + ScopedAlignedArrayXMVECTOR scanline(reinterpret_cast(_aligned_malloc(sizeof(XMVECTOR) * desc.Width, 16))); if (!scanline) return E_OUTOFMEMORY; assert(desc.Width > 0); - float fSize = static_cast(desc.Width); + float fSize = static_cast(desc.Width); float fPicSize = 1.0f / fSize; // index from [0,W-1], f(0) maps to -1 + 1/W, f(W-1) maps to 1 - 1/w @@ -266,20 +260,20 @@ HRESULT DirectX::SHProjectCubeMap( // angle, where the final value was 1.0 instead of 1-1/w... float fB = -1.0f + 1.0f / fSize; - float fS = (desc.Width > 1) ? (2.0f*(1.0f - 1.0f / fSize) / (fSize - 1.0f)) : 0.f; + float fS = (desc.Width > 1) ? (2.0f * (1.0f - 1.0f / fSize) / (fSize - 1.0f)) : 0.f; // clear out accumulation variables float fWt = 0.0f; if (resultR) - memset(resultR, 0, sizeof(float)*order*order); + memset(resultR, 0, sizeof(float) * order * order); if (resultG) - memset(resultG, 0, sizeof(float)*order*order); + memset(resultG, 0, sizeof(float) * order * order); if (resultB) - memset(resultB, 0, sizeof(float)*order*order); + memset(resultB, 0, sizeof(float) * order * order); - float shBuff[XM_SH_MAXORDER*XM_SH_MAXORDER] = {}; - float shBuffB[XM_SH_MAXORDER*XM_SH_MAXORDER] = {}; + float shBuff[XM_SH_MAXORDER * XM_SH_MAXORDER] = {}; + float shBuffB[XM_SH_MAXORDER * XM_SH_MAXORDER] = {}; //--- Process each face of the cubemap for (UINT face = 0; face < 6; ++face) @@ -287,11 +281,11 @@ HRESULT DirectX::SHProjectCubeMap( UINT dindex = D3D11CalcSubresource(0, face, desc.MipLevels); D3D11_MAPPED_SUBRESOURCE mapped; - HRESULT hr = context->Map(texture, dindex, D3D11_MAP_READ, 0, &mapped); + HRESULT hr = context->Map(texture, dindex, D3D11_MAP_READ, 0, &mapped); if (FAILED(hr)) return hr; - const uint8_t *pSrc = reinterpret_cast(mapped.pData); + const uint8_t* pSrc = reinterpret_cast(mapped.pData); for (UINT y = 0; y < desc.Height; ++y) { XMVECTOR* ptr = scanline.get(); @@ -354,9 +348,9 @@ HRESULT DirectX::SHProjectCubeMap( } XMVECTOR dir = XMVectorSet(ix, iy, iz, 0); - dir = XMVector3Normalize(dir); + dir = XMVector3Normalize(dir); - const float fDiffSolid = 4.0f / ((1.0f + u * u + v * v)*sqrtf(1.0f + u * u + v * v)); + const float fDiffSolid = 4.0f / ((1.0f + u * u + v * v) * sqrtf(1.0f + u * u + v * v)); fWt += fDiffSolid; XMSHEvalDirection(shBuff, order, dir); @@ -364,9 +358,12 @@ HRESULT DirectX::SHProjectCubeMap( XMFLOAT3A clr; XMStoreFloat3A(&clr, *pixel); - if (resultR) XMSHAdd(resultR, order, resultR, XMSHScale(shBuffB, order, shBuff, clr.x*fDiffSolid)); - if (resultG) XMSHAdd(resultG, order, resultG, XMSHScale(shBuffB, order, shBuff, clr.y*fDiffSolid)); - if (resultB) XMSHAdd(resultB, order, resultB, XMSHScale(shBuffB, order, shBuff, clr.z*fDiffSolid)); + if (resultR) + XMSHAdd(resultR, order, resultR, XMSHScale(shBuffB, order, shBuff, clr.x * fDiffSolid)); + if (resultG) + XMSHAdd(resultG, order, resultG, XMSHScale(shBuffB, order, shBuff, clr.y * fDiffSolid)); + if (resultB) + XMSHAdd(resultB, order, resultB, XMSHScale(shBuffB, order, shBuff, clr.z * fDiffSolid)); } pSrc += mapped.RowPitch; @@ -375,11 +372,14 @@ HRESULT DirectX::SHProjectCubeMap( context->Unmap(texture, dindex); } - const float fNormProj = (4.0f*XM_PI) / fWt; + const float fNormProj = (4.0f * XM_PI) / fWt; - if (resultR) XMSHScale(resultR, order, resultR, fNormProj); - if (resultG) XMSHScale(resultG, order, resultG, fNormProj); - if (resultB) XMSHScale(resultB, order, resultB, fNormProj); + if (resultR) + XMSHScale(resultR, order, resultR, fNormProj); + if (resultG) + XMSHScale(resultG, order, resultG, fNormProj); + if (resultB) + XMSHScale(resultB, order, resultB, fNormProj); return S_OK; } diff --git a/SHMath/DirectXSHD3D12.cpp b/SHMath/DirectXSHD3D12.cpp index 6eb79b29..25eeef72 100644 --- a/SHMath/DirectXSHD3D12.cpp +++ b/SHMath/DirectXSHD3D12.cpp @@ -8,7 +8,7 @@ //------------------------------------------------------------------------------------- #ifdef _MSC_VER -#pragma warning( disable : 4616 4619 4061 4265 4626 5039 ) +#pragma warning(disable : 4616 4619 4061 4265 4626 5039) // C4616/C4619 #pragma warning warnings // C4061 numerator 'identifier' in switch of enum 'enumeration' is not explicitly handled by a case label // C4265 class has virtual functions, but destructor is not virtual @@ -49,7 +49,10 @@ using Microsoft::WRL::ComPtr; namespace { - struct aligned_deleter { void operator()(void* p) { _aligned_free(p); } }; + struct aligned_deleter + { + void operator()(void* p) { _aligned_free(p); } + }; using ScopedAlignedArrayXMVECTOR = std::unique_ptr; @@ -57,58 +60,59 @@ namespace // This code is lifted from DirectXTex https://go.microsoft.com/fwlink/?LinkId=248926 // If you need additional DXGI format support, see DirectXTexConvert.cpp //------------------------------------------------------------------------------------- -#define LOAD_SCANLINE( type, func )\ - if ( size >= sizeof(type) )\ - {\ - const type * __restrict sPtr = reinterpret_cast(pSource);\ - for( size_t icount = 0; icount < ( size - sizeof(type) + 1 ); icount += sizeof(type) )\ - {\ - if ( dPtr >= ePtr ) break;\ - *(dPtr++) = func( sPtr++ );\ - }\ - return true;\ - }\ - return false; - -#define LOAD_SCANLINE3( type, func, defvec )\ - if ( size >= sizeof(type) )\ - {\ - const type * __restrict sPtr = reinterpret_cast(pSource);\ - for( size_t icount = 0; icount < ( size - sizeof(type) + 1 ); icount += sizeof(type) )\ - {\ - XMVECTOR v = func( sPtr++ );\ - if ( dPtr >= ePtr ) break;\ - *(dPtr++) = XMVectorSelect( defvec, v, g_XMSelect1110 );\ - }\ - return true;\ - }\ - return false; - -#define LOAD_SCANLINE2( type, func, defvec )\ - if ( size >= sizeof(type) )\ - {\ - const type * __restrict sPtr = reinterpret_cast(pSource);\ - for( size_t icount = 0; icount < ( size - sizeof(type) + 1 ); icount += sizeof(type) )\ - {\ - XMVECTOR v = func( sPtr++ );\ - if ( dPtr >= ePtr ) break;\ - *(dPtr++) = XMVectorSelect( defvec, v, g_XMSelect1100 );\ - }\ - return true;\ - }\ - return false; +#define LOAD_SCANLINE(type, func) \ + if (size >= sizeof(type)) \ + { \ + const type* __restrict sPtr = reinterpret_cast(pSource); \ + for (size_t icount = 0; icount < (size - sizeof(type) + 1); icount += sizeof(type)) \ + { \ + if (dPtr >= ePtr) \ + break; \ + *(dPtr++) = func(sPtr++); \ + } \ + return true; \ + } \ + return false; + +#define LOAD_SCANLINE3(type, func, defvec) \ + if (size >= sizeof(type)) \ + { \ + const type* __restrict sPtr = reinterpret_cast(pSource); \ + for (size_t icount = 0; icount < (size - sizeof(type) + 1); icount += sizeof(type)) \ + { \ + XMVECTOR v = func(sPtr++); \ + if (dPtr >= ePtr) \ + break; \ + *(dPtr++) = XMVectorSelect(defvec, v, g_XMSelect1110); \ + } \ + return true; \ + } \ + return false; + +#define LOAD_SCANLINE2(type, func, defvec) \ + if (size >= sizeof(type)) \ + { \ + const type* __restrict sPtr = reinterpret_cast(pSource); \ + for (size_t icount = 0; icount < (size - sizeof(type) + 1); icount += sizeof(type)) \ + { \ + XMVECTOR v = func(sPtr++); \ + if (dPtr >= ePtr) \ + break; \ + *(dPtr++) = XMVectorSelect(defvec, v, g_XMSelect1100); \ + } \ + return true; \ + } \ + return false; #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 6101) #endif - _Success_(return) - bool LoadScanline( - _Out_writes_(count) DirectX::XMVECTOR* pDestination, - size_t count, - _In_reads_bytes_(size) LPCVOID pSource, - size_t size, - DXGI_FORMAT format) + _Success_(return) bool LoadScanline(_Out_writes_(count) DirectX::XMVECTOR* pDestination, + size_t count, + _In_reads_bytes_(size) LPCVOID pSource, + size_t size, + DXGI_FORMAT format) { assert(pDestination && count > 0 && ((reinterpret_cast(pDestination) & 0xF) == 0)); assert(pSource && size > 0); @@ -123,27 +127,21 @@ namespace switch (format) { - case DXGI_FORMAT_R32G32B32A32_FLOAT: - { - size_t msize = (size > (sizeof(XMVECTOR)*count)) ? (sizeof(XMVECTOR)*count) : size; - memcpy_s(dPtr, sizeof(XMVECTOR)*count, pSource, msize); - } + case DXGI_FORMAT_R32G32B32A32_FLOAT: { + size_t msize = (size > (sizeof(XMVECTOR) * count)) ? (sizeof(XMVECTOR) * count) : size; + memcpy_s(dPtr, sizeof(XMVECTOR) * count, pSource, msize); + } return true; - case DXGI_FORMAT_R32G32B32_FLOAT: - LOAD_SCANLINE3(XMFLOAT3, XMLoadFloat3, g_XMIdentityR3) + case DXGI_FORMAT_R32G32B32_FLOAT: LOAD_SCANLINE3(XMFLOAT3, XMLoadFloat3, g_XMIdentityR3) - case DXGI_FORMAT_R16G16B16A16_FLOAT: - LOAD_SCANLINE(XMHALF4, XMLoadHalf4) + case DXGI_FORMAT_R16G16B16A16_FLOAT: LOAD_SCANLINE(XMHALF4, XMLoadHalf4) - case DXGI_FORMAT_R32G32_FLOAT: - LOAD_SCANLINE2(XMFLOAT2, XMLoadFloat2, g_XMIdentityR3) + case DXGI_FORMAT_R32G32_FLOAT: LOAD_SCANLINE2(XMFLOAT2, XMLoadFloat2, g_XMIdentityR3) - case DXGI_FORMAT_R11G11B10_FLOAT: - LOAD_SCANLINE3(XMFLOAT3PK, XMLoadFloat3PK, g_XMIdentityR3) + case DXGI_FORMAT_R11G11B10_FLOAT: LOAD_SCANLINE3(XMFLOAT3PK, XMLoadFloat3PK, g_XMIdentityR3) - case DXGI_FORMAT_R16G16_FLOAT: - LOAD_SCANLINE2(XMHALF2, XMLoadHalf2, g_XMIdentityR3) + case DXGI_FORMAT_R16G16_FLOAT: LOAD_SCANLINE2(XMHALF2, XMLoadHalf2, g_XMIdentityR3) case DXGI_FORMAT_R32_FLOAT: if (size >= sizeof(float)) @@ -152,7 +150,8 @@ namespace for (size_t icount = 0; icount < size; icount += sizeof(float)) { XMVECTOR v = XMLoadFloat(sPtr++); - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSelect(g_XMIdentityR3, v, g_XMSelect1000); } return true; @@ -162,45 +161,41 @@ namespace case DXGI_FORMAT_R16_FLOAT: if (size >= sizeof(HALF)) { - const HALF * __restrict sPtr = reinterpret_cast(pSource); + const HALF* __restrict sPtr = reinterpret_cast(pSource); for (size_t icount = 0; icount < size; icount += sizeof(HALF)) { - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSet(XMConvertHalfToFloat(*sPtr++), 0.f, 0.f, 1.f); } return true; } return false; - default: - return false; + default: return false; } } #ifdef _MSC_VER #pragma warning(pop) #endif -} // namespace anonymous +} // namespace //------------------------------------------------------------------------------------- // Projects a function represented in a cube map into spherical harmonics. // // https://msdn.microsoft.com/en-us/library/windows/desktop/ff476300.aspx //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::SHProjectCubeMap( - size_t order, - const D3D12_RESOURCE_DESC& desc, - const D3D12_SUBRESOURCE_DATA cubeMap[6], - float *resultR, - float *resultG, - float *resultB) noexcept +_Use_decl_annotations_ HRESULT DirectX::SHProjectCubeMap(size_t order, + const D3D12_RESOURCE_DESC& desc, + const D3D12_SUBRESOURCE_DATA cubeMap[6], + float* resultR, + float* resultG, + float* resultB) noexcept { if (order < XM_SH_MINORDER || order > XM_SH_MAXORDER) return E_INVALIDARG; - if (desc.Dimension != D3D12_RESOURCE_DIMENSION_TEXTURE2D - || (desc.DepthOrArraySize != 6) - || (desc.Width != desc.Height) + if (desc.Dimension != D3D12_RESOURCE_DIMENSION_TEXTURE2D || (desc.DepthOrArraySize != 6) || (desc.Width != desc.Height) || (desc.SampleDesc.Count > 1)) return E_FAIL; @@ -217,17 +212,17 @@ HRESULT DirectX::SHProjectCubeMap( // See LoadScanline to support more pixel formats break; - default: - return E_FAIL; + default: return E_FAIL; } //--- Setup for SH projection - ScopedAlignedArrayXMVECTOR scanline(reinterpret_cast(_aligned_malloc(static_cast(sizeof(XMVECTOR)*desc.Width), 16))); + ScopedAlignedArrayXMVECTOR scanline( + reinterpret_cast(_aligned_malloc(static_cast(sizeof(XMVECTOR) * desc.Width), 16))); if (!scanline) return E_OUTOFMEMORY; assert(desc.Width > 0); - float fSize = static_cast(desc.Width); + float fSize = static_cast(desc.Width); float fPicSize = 1.0f / fSize; // index from [0,W-1], f(0) maps to -1 + 1/W, f(W-1) maps to 1 - 1/w @@ -237,20 +232,20 @@ HRESULT DirectX::SHProjectCubeMap( // angle, where the final value was 1.0 instead of 1-1/w... float fB = -1.0f + 1.0f / fSize; - float fS = (desc.Width > 1) ? (2.0f*(1.0f - 1.0f / fSize) / (fSize - 1.0f)) : 0.f; + float fS = (desc.Width > 1) ? (2.0f * (1.0f - 1.0f / fSize) / (fSize - 1.0f)) : 0.f; // clear out accumulation variables float fWt = 0.0f; if (resultR) - memset(resultR, 0, sizeof(float)*order*order); + memset(resultR, 0, sizeof(float) * order * order); if (resultG) - memset(resultG, 0, sizeof(float)*order*order); + memset(resultG, 0, sizeof(float) * order * order); if (resultB) - memset(resultB, 0, sizeof(float)*order*order); + memset(resultB, 0, sizeof(float) * order * order); - float shBuff[XM_SH_MAXORDER*XM_SH_MAXORDER] = {}; - float shBuffB[XM_SH_MAXORDER*XM_SH_MAXORDER] = {}; + float shBuff[XM_SH_MAXORDER * XM_SH_MAXORDER] = {}; + float shBuffB[XM_SH_MAXORDER * XM_SH_MAXORDER] = {}; //--- Process each face of the cubemap for (UINT face = 0; face < 6; ++face) @@ -258,7 +253,7 @@ HRESULT DirectX::SHProjectCubeMap( if (!cubeMap[face].pData) return E_POINTER; - const uint8_t *pSrc = reinterpret_cast(cubeMap[face].pData); + const uint8_t* pSrc = reinterpret_cast(cubeMap[face].pData); for (UINT y = 0; y < desc.Height; ++y) { XMVECTOR* ptr = scanline.get(); @@ -320,9 +315,9 @@ HRESULT DirectX::SHProjectCubeMap( } XMVECTOR dir = XMVectorSet(ix, iy, iz, 0); - dir = XMVector3Normalize(dir); + dir = XMVector3Normalize(dir); - const float fDiffSolid = 4.0f / ((1.0f + u * u + v * v)*sqrtf(1.0f + u * u + v * v)); + const float fDiffSolid = 4.0f / ((1.0f + u * u + v * v) * sqrtf(1.0f + u * u + v * v)); fWt += fDiffSolid; XMSHEvalDirection(shBuff, order, dir); @@ -330,20 +325,26 @@ HRESULT DirectX::SHProjectCubeMap( XMFLOAT3A clr; XMStoreFloat3A(&clr, *pixel); - if (resultR) XMSHAdd(resultR, order, resultR, XMSHScale(shBuffB, order, shBuff, clr.x*fDiffSolid)); - if (resultG) XMSHAdd(resultG, order, resultG, XMSHScale(shBuffB, order, shBuff, clr.y*fDiffSolid)); - if (resultB) XMSHAdd(resultB, order, resultB, XMSHScale(shBuffB, order, shBuff, clr.z*fDiffSolid)); + if (resultR) + XMSHAdd(resultR, order, resultR, XMSHScale(shBuffB, order, shBuff, clr.x * fDiffSolid)); + if (resultG) + XMSHAdd(resultG, order, resultG, XMSHScale(shBuffB, order, shBuff, clr.y * fDiffSolid)); + if (resultB) + XMSHAdd(resultB, order, resultB, XMSHScale(shBuffB, order, shBuff, clr.z * fDiffSolid)); } pSrc += cubeMap[face].RowPitch; } } - const float fNormProj = (4.0f*XM_PI) / fWt; + const float fNormProj = (4.0f * XM_PI) / fWt; - if (resultR) XMSHScale(resultR, order, resultR, fNormProj); - if (resultG) XMSHScale(resultG, order, resultG, fNormProj); - if (resultB) XMSHScale(resultB, order, resultB, fNormProj); + if (resultR) + XMSHScale(resultR, order, resultR, fNormProj); + if (resultG) + XMSHScale(resultG, order, resultG, fNormProj); + if (resultB) + XMSHScale(resultB, order, resultB, fNormProj); return S_OK; } diff --git a/Stereo3D/Stereo3DMatrixHelper.cpp b/Stereo3D/Stereo3DMatrixHelper.cpp index a03bc823..cee46099 100644 --- a/Stereo3D/Stereo3DMatrixHelper.cpp +++ b/Stereo3D/Stereo3DMatrixHelper.cpp @@ -11,16 +11,13 @@ using namespace DirectX; namespace { - inline bool StereoProjectionHelper - ( - const STEREO_PARAMETERS& stereoParameters, - _Out_ float* fVirtualProjection, - _Out_ float* zNearWidth, - _Out_ float* zNearHeight, - float FovAngleY, - float AspectRatio, - float NearZ - ) + inline bool StereoProjectionHelper(const STEREO_PARAMETERS& stereoParameters, + _Out_ float* fVirtualProjection, + _Out_ float* zNearWidth, + _Out_ float* zNearHeight, + float FovAngleY, + float AspectRatio, + float NearZ) { // note that most people have difficulty fusing images into 3D // if the separation equals even just the human average. by @@ -43,21 +40,21 @@ namespace // the viewer than 1.6 degrees (divided by two for most // half-angle calculations) - static const float fMaxStereoDistance = 780; // inches (should be between 10 and 20m) - static const float fMaxVisualAcuityAngle = 1.6f * (XM_PI / 180.0f); // radians - static const float fInterocularDistance = 1.25f; // inches + static const float fMaxStereoDistance = 780; // inches (should be between 10 and 20m) + static const float fMaxVisualAcuityAngle = 1.6f * (XM_PI / 180.0f); // radians + static const float fInterocularDistance = 1.25f; // inches - float fDisplayHeight = stereoParameters.fDisplaySizeInches / sqrtf(AspectRatio * AspectRatio + 1.0f); - float fDisplayWidth = fDisplayHeight * AspectRatio; - float fHalfInterocular = 0.5f * fInterocularDistance * stereoParameters.fStereoExaggerationFactor; - float fHalfPixelWidth = fDisplayWidth / stereoParameters.fPixelResolutionWidth * 0.5f; + float fDisplayHeight = stereoParameters.fDisplaySizeInches / sqrtf(AspectRatio * AspectRatio + 1.0f); + float fDisplayWidth = fDisplayHeight * AspectRatio; + float fHalfInterocular = 0.5f * fInterocularDistance * stereoParameters.fStereoExaggerationFactor; + float fHalfPixelWidth = fDisplayWidth / stereoParameters.fPixelResolutionWidth * 0.5f; float fHalfMaximumAcuityAngle = fMaxVisualAcuityAngle * 0.5f * stereoParameters.fStereoExaggerationFactor; // float fHalfWidth = fDisplayWidth * 0.5f; float fMaxSeparationAcuityAngle = atanf(fHalfInterocular / fMaxStereoDistance); - float fMaxSeparationDistance = fHalfPixelWidth / tanf(fMaxSeparationAcuityAngle); + float fMaxSeparationDistance = fHalfPixelWidth / tanf(fMaxSeparationAcuityAngle); float fRefinedMaxStereoDistance = fMaxStereoDistance - fMaxSeparationDistance; - float fFovHalfAngle = FovAngleY / 2.0f; + float fFovHalfAngle = FovAngleY / 2.0f; bool ComfortableResult = true; if (fRefinedMaxStereoDistance < 0.0f || fMaxSeparationDistance > 0.1f * fMaxStereoDistance) @@ -67,49 +64,43 @@ namespace } float fRefinedMaxSeparationAcuityAngle = atanf(fHalfInterocular / (fRefinedMaxStereoDistance)); - float fPhysicalZNearDistance = fHalfInterocular / tanf(fHalfMaximumAcuityAngle); + float fPhysicalZNearDistance = fHalfInterocular / tanf(fHalfMaximumAcuityAngle); // float fScalingFactor = fHalfMaximumAcuityAngle / atanf(fHalfInterocular / stereoParameters.fViewerDistanceInches); float fNearZSeparation = tanf(fRefinedMaxSeparationAcuityAngle) * (fRefinedMaxStereoDistance - fPhysicalZNearDistance); // float fNearZSeparation2 = fHalfInterocular * (fRefinedMaxStereoDistance - fPhysicalZNearDistance) / fRefinedMaxStereoDistance; - (*zNearHeight) = cosf(fFovHalfAngle) / sinf(fFovHalfAngle); - (*zNearWidth) = (*zNearHeight) / AspectRatio; + (*zNearHeight) = cosf(fFovHalfAngle) / sinf(fFovHalfAngle); + (*zNearWidth) = (*zNearHeight) / AspectRatio; (*fVirtualProjection) = (fNearZSeparation * NearZ * (*zNearWidth * 4.0f)) / (2.0f * NearZ); return ComfortableResult; } -} +} // namespace //------------------------------------------------------------------------------ -void DirectX::StereoCreateDefaultParameters -( - STEREO_PARAMETERS& stereoParameters -) +void DirectX::StereoCreateDefaultParameters(STEREO_PARAMETERS& stereoParameters) { // Default assumption is 1920x1200 resolution, a 22" LCD monitor, and a 2' viewing distance - stereoParameters.fViewerDistanceInches = 24.0f; - stereoParameters.fPixelResolutionWidth = 1920.0f; + stereoParameters.fViewerDistanceInches = 24.0f; + stereoParameters.fPixelResolutionWidth = 1920.0f; stereoParameters.fPixelResolutionHeight = 1200.0f; - stereoParameters.fDisplaySizeInches = 22.0f; + stereoParameters.fDisplaySizeInches = 22.0f; - stereoParameters.fStereoSeparationFactor = 1.0f; + stereoParameters.fStereoSeparationFactor = 1.0f; stereoParameters.fStereoExaggerationFactor = 1.0f; } //------------------------------------------------------------------------------ -XMMATRIX DirectX::StereoProjectionFovLH -( - _In_opt_ const STEREO_PARAMETERS* pStereoParameters, - STEREO_CHANNEL Channel, - float FovAngleY, - float AspectRatio, - float NearZ, - float FarZ, - STEREO_MODE StereoMode -) +XMMATRIX DirectX::StereoProjectionFovLH(_In_opt_ const STEREO_PARAMETERS* pStereoParameters, + STEREO_CHANNEL Channel, + float FovAngleY, + float AspectRatio, + float NearZ, + float FarZ, + STEREO_MODE StereoMode) { assert(Channel == STEREO_CHANNEL_LEFT || Channel == STEREO_CHANNEL_RIGHT); assert(StereoMode == STEREO_MODE_NORMAL || StereoMode == STEREO_MODE_INVERTED); @@ -128,8 +119,8 @@ XMMATRIX DirectX::StereoProjectionFovLH assert(pStereoParameters->fStereoExaggerationFactor >= 1.0f && pStereoParameters->fStereoExaggerationFactor <= 2.0f); float fVirtualProjection = 0.0f; - float zNearWidth = 0.0f; - float zNearHeight = 0.0f; + float zNearWidth = 0.0f; + float zNearHeight = 0.0f; StereoProjectionHelper(*pStereoParameters, &fVirtualProjection, &zNearWidth, &zNearHeight, FovAngleY, AspectRatio, NearZ); fVirtualProjection *= pStereoParameters->fStereoSeparationFactor; // incorporate developer defined bias @@ -147,13 +138,13 @@ XMMATRIX DirectX::StereoProjectionFovLH { if (StereoMode > STEREO_MODE_NORMAL) { - XMMATRIX rots = XMMatrixRotationY(fInvertedAngle); - XMMATRIX trans = XMMatrixTranslation(-fVirtualProjection, 0, 0); + XMMATRIX rots = XMMatrixRotationY(fInvertedAngle); + XMMATRIX trans = XMMatrixTranslation(-fVirtualProjection, 0, 0); patchedProjection = XMMatrixMultiply(XMMatrixMultiply(rots, trans), proj); } else { - XMMATRIX trans = XMMatrixTranslation(-fVirtualProjection, 0, 0); + XMMATRIX trans = XMMatrixTranslation(-fVirtualProjection, 0, 0); patchedProjection = XMMatrixMultiply(trans, proj); } } @@ -161,13 +152,13 @@ XMMATRIX DirectX::StereoProjectionFovLH { if (StereoMode > STEREO_MODE_NORMAL) { - XMMATRIX rots = XMMatrixRotationY(-fInvertedAngle); - XMMATRIX trans = XMMatrixTranslation(fVirtualProjection, 0, 0); + XMMATRIX rots = XMMatrixRotationY(-fInvertedAngle); + XMMATRIX trans = XMMatrixTranslation(fVirtualProjection, 0, 0); patchedProjection = XMMatrixMultiply(XMMatrixMultiply(rots, trans), proj); } else { - XMMATRIX trans = XMMatrixTranslation(fVirtualProjection, 0, 0); + XMMATRIX trans = XMMatrixTranslation(fVirtualProjection, 0, 0); patchedProjection = XMMatrixMultiply(trans, proj); } } @@ -177,16 +168,13 @@ XMMATRIX DirectX::StereoProjectionFovLH //------------------------------------------------------------------------------ -XMMATRIX DirectX::StereoProjectionFovRH -( - _In_opt_ const STEREO_PARAMETERS* pStereoParameters, - STEREO_CHANNEL Channel, - float FovAngleY, - float AspectRatio, - float NearZ, - float FarZ, - STEREO_MODE StereoMode -) +XMMATRIX DirectX::StereoProjectionFovRH(_In_opt_ const STEREO_PARAMETERS* pStereoParameters, + STEREO_CHANNEL Channel, + float FovAngleY, + float AspectRatio, + float NearZ, + float FarZ, + STEREO_MODE StereoMode) { assert(Channel == STEREO_CHANNEL_LEFT || Channel == STEREO_CHANNEL_RIGHT); assert(StereoMode == STEREO_MODE_NORMAL || StereoMode == STEREO_MODE_INVERTED); @@ -205,8 +193,8 @@ XMMATRIX DirectX::StereoProjectionFovRH assert(pStereoParameters->fStereoExaggerationFactor >= 1.0f && pStereoParameters->fStereoExaggerationFactor <= 2.0f); float fVirtualProjection = 0.0f; - float zNearWidth = 0.0f; - float zNearHeight = 0.0f; + float zNearWidth = 0.0f; + float zNearHeight = 0.0f; StereoProjectionHelper(*pStereoParameters, &fVirtualProjection, &zNearWidth, &zNearHeight, FovAngleY, AspectRatio, NearZ); fVirtualProjection *= pStereoParameters->fStereoSeparationFactor; // incorporate developer defined bias @@ -228,13 +216,13 @@ XMMATRIX DirectX::StereoProjectionFovRH { if (StereoMode > STEREO_MODE_NORMAL) { - XMMATRIX rots = XMMatrixRotationY(fInvertedAngle); - XMMATRIX trans = XMMatrixTranslation(-fVirtualProjection, 0, 0); + XMMATRIX rots = XMMatrixRotationY(fInvertedAngle); + XMMATRIX trans = XMMatrixTranslation(-fVirtualProjection, 0, 0); patchedProjection = XMMatrixMultiply(XMMatrixMultiply(rots, trans), proj); } else { - XMMATRIX trans = XMMatrixTranslation(-fVirtualProjection, 0, 0); + XMMATRIX trans = XMMatrixTranslation(-fVirtualProjection, 0, 0); patchedProjection = XMMatrixMultiply(trans, proj); } } @@ -242,13 +230,13 @@ XMMATRIX DirectX::StereoProjectionFovRH { if (StereoMode > STEREO_MODE_NORMAL) { - XMMATRIX rots = XMMatrixRotationY(-fInvertedAngle); - XMMATRIX trans = XMMatrixTranslation(fVirtualProjection, 0, 0); + XMMATRIX rots = XMMatrixRotationY(-fInvertedAngle); + XMMATRIX trans = XMMatrixTranslation(fVirtualProjection, 0, 0); patchedProjection = XMMatrixMultiply(XMMatrixMultiply(rots, trans), proj); } else { - XMMATRIX trans = XMMatrixTranslation(fVirtualProjection, 0, 0); + XMMATRIX trans = XMMatrixTranslation(fVirtualProjection, 0, 0); patchedProjection = XMMatrixMultiply(trans, proj); } } diff --git a/Stereo3D/Stereo3DMatrixHelper.h b/Stereo3D/Stereo3DMatrixHelper.h index 86a74970..5ff54497 100644 --- a/Stereo3D/Stereo3DMatrixHelper.h +++ b/Stereo3D/Stereo3DMatrixHelper.h @@ -55,10 +55,18 @@ namespace DirectX void StereoCreateDefaultParameters(STEREO_PARAMETERS& stereoParameters); XMMATRIX StereoProjectionFovLH(_In_opt_ const STEREO_PARAMETERS* pStereoParameters, - STEREO_CHANNEL Channel, float FovAngleY, float AspectRatio, float NearZ, float FarZ, - STEREO_MODE StereoMode = STEREO_MODE_NORMAL); + STEREO_CHANNEL Channel, + float FovAngleY, + float AspectRatio, + float NearZ, + float FarZ, + STEREO_MODE StereoMode = STEREO_MODE_NORMAL); XMMATRIX StereoProjectionFovRH(_In_opt_ const STEREO_PARAMETERS* pStereoParameters, - STEREO_CHANNEL Channel, float FovAngleY, float AspectRatio, float NearZ, float FarZ, - STEREO_MODE StereoMode = STEREO_MODE_NORMAL); -} + STEREO_CHANNEL Channel, + float FovAngleY, + float AspectRatio, + float NearZ, + float FarZ, + STEREO_MODE StereoMode = STEREO_MODE_NORMAL); +} // namespace DirectX diff --git a/XDSP/XDSP.h b/XDSP/XDSP.h index c9998bd2..6ff6cf1a 100644 --- a/XDSP/XDSP.h +++ b/XDSP/XDSP.h @@ -24,7 +24,7 @@ #ifdef _MSC_VER #pragma warning(push) -#pragma warning(disable: 6001 6262) +#pragma warning(disable : 6001 6262) #endif #ifdef __clang__ @@ -35,36 +35,41 @@ namespace XDSP { - using XMVECTOR = DirectX::XMVECTOR; + using XMVECTOR = DirectX::XMVECTOR; using FXMVECTOR = DirectX::FXMVECTOR; using GXMVECTOR = DirectX::GXMVECTOR; using CXMVECTOR = DirectX::CXMVECTOR; using XMFLOAT4A = DirectX::XMFLOAT4A; - constexpr bool ISPOWEROF2(size_t n) { return (((n)&((n)-1)) == 0 && (n) != 0); } + constexpr bool ISPOWEROF2(size_t n) + { + return (((n) & ((n)-1)) == 0 && (n) != 0); + } // Parallel multiplication of four complex numbers, assuming real and imaginary values are stored in separate vectors. - inline void XM_CALLCONV vmulComplex( - _Out_ XMVECTOR& rResult, _Out_ XMVECTOR& iResult, - _In_ FXMVECTOR r1, _In_ FXMVECTOR i1, _In_ FXMVECTOR r2, _In_ GXMVECTOR i2) noexcept + inline void XM_CALLCONV vmulComplex(_Out_ XMVECTOR& rResult, + _Out_ XMVECTOR& iResult, + _In_ FXMVECTOR r1, + _In_ FXMVECTOR i1, + _In_ FXMVECTOR r2, + _In_ GXMVECTOR i2) noexcept { using namespace DirectX; // (r1, i1) * (r2, i2) = (r1r2 - i1i2, r1i2 + r2i1) const XMVECTOR vr1r2 = XMVectorMultiply(r1, r2); const XMVECTOR vr1i2 = XMVectorMultiply(r1, i2); - rResult = XMVectorNegativeMultiplySubtract(i1, i2, vr1r2); // real: (r1*r2 - i1*i2) - iResult = XMVectorMultiplyAdd(r2, i1, vr1i2); // imaginary: (r1*i2 + r2*i1) + rResult = XMVectorNegativeMultiplySubtract(i1, i2, vr1r2); // real: (r1*r2 - i1*i2) + iResult = XMVectorMultiplyAdd(r2, i1, vr1i2); // imaginary: (r1*i2 + r2*i1) } - inline void XM_CALLCONV vmulComplex( - _Inout_ XMVECTOR& r1, _Inout_ XMVECTOR& i1, _In_ FXMVECTOR r2, _In_ FXMVECTOR i2) noexcept + inline void XM_CALLCONV vmulComplex(_Inout_ XMVECTOR& r1, _Inout_ XMVECTOR& i1, _In_ FXMVECTOR r2, _In_ FXMVECTOR i2) noexcept { using namespace DirectX; // (r1, i1) * (r2, i2) = (r1r2 - i1i2, r1i2 + r2i1) const XMVECTOR vr1r2 = XMVectorMultiply(r1, r2); const XMVECTOR vr1i2 = XMVectorMultiply(r1, i2); - r1 = XMVectorNegativeMultiplySubtract(i1, i2, vr1r2); // real: (r1*r2 - i1*i2) - i1 = XMVectorMultiplyAdd(r2, i1, vr1i2); // imaginary: (r1*i2 + r2*i1) + r1 = XMVectorNegativeMultiplySubtract(i1, i2, vr1r2); // real: (r1*r2 - i1*i2) + i1 = XMVectorMultiplyAdd(r2, i1, vr1i2); // imaginary: (r1*i2 + r2*i1) } //---------------------------------------------------------------------------------- @@ -119,9 +124,9 @@ namespace XDSP const XMVECTOR iTemp = XMVectorMultiplyAdd(i1H, vDFT4SignBits1, i1L); // calculating Result - const XMVECTOR rZrWiZiW = XMVectorPermute<2, 3, 6, 7>(rTemp, iTemp); // [rTempZ|rTempW|iTempZ|iTempW] - const XMVECTOR rZiWrZiW = XMVectorSwizzle<0, 3, 0, 3>(rZrWiZiW); // [rTempZ|iTempW|rTempZ|iTempW] - const XMVECTOR iZrWiZrW = XMVectorSwizzle<2, 1, 2, 1>(rZrWiZiW); // [rTempZ|iTempW|rTempZ|iTempW] + const XMVECTOR rZrWiZiW = XMVectorPermute<2, 3, 6, 7>(rTemp, iTemp); // [rTempZ|rTempW|iTempZ|iTempW] + const XMVECTOR rZiWrZiW = XMVectorSwizzle<0, 3, 0, 3>(rZrWiZiW); // [rTempZ|iTempW|rTempZ|iTempW] + const XMVECTOR iZrWiZrW = XMVectorSwizzle<2, 1, 2, 1>(rZrWiZiW); // [rTempZ|iTempW|rTempZ|iTempW] // [rTempX| rTempY| rTempX| rTempY] + [rTempZ| iTempW|-rTempZ|-iTempW] // [iTempX| iTempY| iTempX| iTempY] + // [iTempZ|-rTempW|-iTempZ| rTempW] @@ -153,18 +158,17 @@ namespace XDSP // | 1 0 -1 0 | | (rTemp2,iTemp2) | | (rTemp0 - rTemp2, iTemp0 - iTemp2) | // | 0 1 0 j | | (rTemp3,iTemp3) | | (rTemp1 - iTemp3, iTemp1 + rTemp3) | //---------------------------------------------------------------------------------- - inline void ButterflyDIT4_4( - _Inout_ XMVECTOR& r0, - _Inout_ XMVECTOR& r1, - _Inout_ XMVECTOR& r2, - _Inout_ XMVECTOR& r3, - _Inout_ XMVECTOR& i0, - _Inout_ XMVECTOR& i1, - _Inout_ XMVECTOR& i2, - _Inout_ XMVECTOR& i3, + inline void ButterflyDIT4_4(_Inout_ XMVECTOR& r0, + _Inout_ XMVECTOR& r1, + _Inout_ XMVECTOR& r2, + _Inout_ XMVECTOR& r3, + _Inout_ XMVECTOR& i0, + _Inout_ XMVECTOR& i1, + _Inout_ XMVECTOR& i2, + _Inout_ XMVECTOR& i3, _In_reads_(uStride * 4) const XMVECTOR* __restrict pUnityTableReal, _In_reads_(uStride * 4) const XMVECTOR* __restrict pUnityTableImaginary, - _In_ size_t uStride, + _In_ size_t uStride, _In_ const bool fLast) noexcept { using namespace DirectX; @@ -214,10 +218,14 @@ namespace XDSP ButterflyDIT4_1(rTemp7, iTemp7); } - r0 = rTemp4; i0 = iTemp4; - r1 = rTemp5; i1 = iTemp5; - r2 = rTemp6; i2 = iTemp6; - r3 = rTemp7; i3 = iTemp7; + r0 = rTemp4; + i0 = iTemp4; + r1 = rTemp5; + i1 = iTemp5; + r2 = rTemp6; + i2 = iTemp6; + r3 = rTemp7; + i3 = iTemp7; } //================================================================================== @@ -233,8 +241,7 @@ namespace XDSP // pImaginary - [inout] imaginary components, must have at least uCount elements // uCount - [in] number of FFT iterations //---------------------------------------------------------------------------------- - inline void FFT4( - _Inout_updates_(uCount) XMVECTOR* __restrict pReal, + inline void FFT4(_Inout_updates_(uCount) XMVECTOR* __restrict pReal, _Inout_updates_(uCount) XMVECTOR* __restrict pImaginary, const size_t uCount = 1) noexcept { @@ -259,8 +266,7 @@ namespace XDSP // pImaginary - [inout] imaginary components, must have at least uCount*2 elements // uCount - [in] number of FFT iterations //---------------------------------------------------------------------------------- - inline void FFT8( - _Inout_updates_(uCount * 2) XMVECTOR* __restrict pReal, + inline void FFT8(_Inout_updates_(uCount * 2) XMVECTOR* __restrict pReal, _Inout_updates_(uCount * 2) XMVECTOR* __restrict pImaginary, _In_ const size_t uCount = 1) noexcept { @@ -282,9 +288,9 @@ namespace XDSP XMVECTOR* __restrict pR = pReal + uIndex * 2; XMVECTOR* __restrict pI = pImaginary + uIndex * 2; - XMVECTOR oddsR = XMVectorPermute<1, 3, 5, 7>(pR[0], pR[1]); + XMVECTOR oddsR = XMVectorPermute<1, 3, 5, 7>(pR[0], pR[1]); XMVECTOR evensR = XMVectorPermute<0, 2, 4, 6>(pR[0], pR[1]); - XMVECTOR oddsI = XMVectorPermute<1, 3, 5, 7>(pI[0], pI[1]); + XMVECTOR oddsI = XMVectorPermute<1, 3, 5, 7>(pI[0], pI[1]); XMVECTOR evensI = XMVectorPermute<0, 2, 4, 6>(pI[0], pI[1]); ButterflyDIT4_1(oddsR, oddsI); ButterflyDIT4_1(evensR, evensI); @@ -309,8 +315,7 @@ namespace XDSP // pImaginary - [inout] imaginary components, must have at least uCount*4 elements // uCount - [in] number of FFT iterations //---------------------------------------------------------------------------------- - inline void FFT16( - _Inout_updates_(uCount * 4) XMVECTOR* __restrict pReal, + inline void FFT16(_Inout_updates_(uCount * 4) XMVECTOR* __restrict pReal, _Inout_updates_(uCount * 4) XMVECTOR* __restrict pImaginary, _In_ const size_t uCount = 1) noexcept { @@ -322,19 +327,14 @@ namespace XDSP assert(reinterpret_cast(pImaginary) % 16 == 0); assert(ISPOWEROF2(uCount)); - static const XMVECTORF32 aUnityTableReal[4] = { - { { { 1.0f, 1.0f, 1.0f, 1.0f } } }, - { { { 1.0f, 0.92387950f, 0.70710677f, 0.38268343f } } }, - { { { 1.0f, 0.70710677f, -4.3711388e-008f, -0.70710677f } } }, - { { { 1.0f, 0.38268343f, -0.70710677f, -0.92387950f } } } - }; - static const XMVECTORF32 aUnityTableImaginary[4] = - { - { { { -0.0f, -0.0f, -0.0f, -0.0f } } }, + static const XMVECTORF32 aUnityTableReal[4] = { { { { 1.0f, 1.0f, 1.0f, 1.0f } } }, + { { { 1.0f, 0.92387950f, 0.70710677f, 0.38268343f } } }, + { { { 1.0f, 0.70710677f, -4.3711388e-008f, -0.70710677f } } }, + { { { 1.0f, 0.38268343f, -0.70710677f, -0.92387950f } } } }; + static const XMVECTORF32 aUnityTableImaginary[4] = { { { { -0.0f, -0.0f, -0.0f, -0.0f } } }, { { { -0.0f, -0.38268343f, -0.70710677f, -0.92387950f } } }, { { { -0.0f, -0.70710677f, -1.0f, -0.70710677f } } }, - { { { -0.0f, -0.92387950f, -0.70710677f, 0.38268343f } } } - }; + { { { -0.0f, -0.92387950f, -0.70710677f, 0.38268343f } } } }; for (size_t uIndex = 0; uIndex < uCount; ++uIndex) { @@ -348,7 +348,8 @@ namespace XDSP pImaginary[uIndex * 4 + 3], reinterpret_cast(aUnityTableReal), reinterpret_cast(aUnityTableImaginary), - 1, true); + 1, + true); } } @@ -366,10 +367,9 @@ namespace XDSP // uLength - [in] FFT length in samples, must be a power of 2 > 16 // uCount - [in] number of FFT iterations //---------------------------------------------------------------------------------- - inline void FFT( - _Inout_updates_((uLength * uCount) / 4) XMVECTOR* __restrict pReal, + inline void FFT(_Inout_updates_((uLength * uCount) / 4) XMVECTOR* __restrict pReal, _Inout_updates_((uLength * uCount) / 4) XMVECTOR* __restrict pImaginary, - _In_reads_(uLength * uCount) const XMVECTOR* __restrict pUnityTable, + _In_reads_(uLength* uCount) const XMVECTOR* __restrict pUnityTable, _In_ const size_t uLength, _In_ const size_t uCount = 1) noexcept { @@ -384,17 +384,17 @@ namespace XDSP assert(ISPOWEROF2(uLength)); assert(ISPOWEROF2(uCount)); - const XMVECTOR* __restrict pUnityTableReal = pUnityTable; + const XMVECTOR* __restrict pUnityTableReal = pUnityTable; const XMVECTOR* __restrict pUnityTableImaginary = pUnityTable + (uLength >> 2); - const size_t uTotal = uCount * uLength; - const size_t uTotal_vectors = uTotal >> 2; - const size_t uStage_vectors = uLength >> 2; - const size_t uStage_vectors_mask = uStage_vectors - 1; - const size_t uStride = uLength >> 4; // stride between butterfly elements - const size_t uStrideMask = uStride - 1; - const size_t uStride2 = uStride * 2; - const size_t uStride3 = uStride * 3; - const size_t uStrideInvMask = ~uStrideMask; + const size_t uTotal = uCount * uLength; + const size_t uTotal_vectors = uTotal >> 2; + const size_t uStage_vectors = uLength >> 2; + const size_t uStage_vectors_mask = uStage_vectors - 1; + const size_t uStride = uLength >> 4; // stride between butterfly elements + const size_t uStrideMask = uStride - 1; + const size_t uStride2 = uStride * 2; + const size_t uStride3 = uStride * 3; + const size_t uStrideInvMask = ~uStrideMask; for (size_t uIndex = 0; uIndex < (uTotal_vectors >> 2); ++uIndex) { @@ -409,7 +409,8 @@ namespace XDSP pImaginary[n + uStride3], pUnityTableReal + (n & uStage_vectors_mask), pUnityTableImaginary + (n & uStage_vectors_mask), - uStride, false); + uStride, + false); } if (uLength > 16 * 4) @@ -470,22 +471,22 @@ namespace XDSP XMVECTOR vSin, vCos; XMVECTOR viJP, vlS; - pUnityTable[j] = g_XMOne; + pUnityTable[j] = g_XMOne; pUnityTable[j + len * 4] = XMVectorZero(); vlS = XMVectorMultiply(vJP, vlStep); XMVectorSinCos(&vSin, &vCos, vlS); - pUnityTable[j + len] = vCos; + pUnityTable[j + len] = vCos; pUnityTable[j + len * 5] = XMVectorMultiply(vSin, g_XMNegativeOne); viJP = XMVectorAdd(vJP, vJP); - vlS = XMVectorMultiply(viJP, vlStep); + vlS = XMVectorMultiply(viJP, vlStep); XMVectorSinCos(&vSin, &vCos, vlS); pUnityTable[j + len * 2] = vCos; pUnityTable[j + len * 6] = XMVectorMultiply(vSin, g_XMNegativeOne); viJP = XMVectorAdd(viJP, vJP); - vlS = XMVectorMultiply(viJP, vlStep); + vlS = XMVectorMultiply(viJP, vlStep); XMVectorSinCos(&vSin, &vCos, vlS); pUnityTable[j + len * 3] = vCos; pUnityTable[j + len * 7] = XMVectorMultiply(vSin, g_XMNegativeOne); @@ -494,8 +495,7 @@ namespace XDSP } vlStep = XMVectorMultiply(vlStep, g_XMFour); pUnityTable += len * 8; - } - while (len > 4); + } while (len > 4); } //---------------------------------------------------------------------------------- @@ -507,12 +507,12 @@ namespace XDSP // Exponential values and bits correspond, so the reversed upper index can be omitted depending on the number of exponents. // // PARAMETERS: - // pOutput - [out] output buffer, receives samples in order of increasing frequency, cannot overlap pInput, must have at least (1<= 2 + // pOutput - [out] output buffer, receives samples in order of increasing frequency, cannot overlap pInput, must have at least + // (1<= 2 //---------------------------------------------------------------------------------- - inline void FFTUnswizzle( - _Out_writes_((1 << uLog2Length) / 4) XMVECTOR* __restrict pOutput, + inline void FFTUnswizzle(_Out_writes_((1 << uLog2Length) / 4) XMVECTOR* __restrict pOutput, _In_reads_((1 << uLog2Length) / 4) const XMVECTOR* __restrict pInput, _In_ const size_t uLog2Length) noexcept { @@ -522,7 +522,7 @@ namespace XDSP _Analysis_assume_(uLog2Length >= 2); float* __restrict pfOutput = reinterpret_cast(pOutput); - const size_t uLength = size_t(1) << (uLog2Length - 2); + const size_t uLength = size_t(1) << (uLog2Length - 2); static const unsigned char cSwizzleTable[256] = { // clang-format off @@ -553,11 +553,10 @@ namespace XDSP XMFLOAT4A f4a; XMStoreFloat4A(&f4a, pInput[uIndex]); const size_t n = uIndex * 4; - const size_t uAddr = (static_cast(cSwizzleTable[n & 0xff]) << 24) | - (static_cast(cSwizzleTable[(n >> 8) & 0xff]) << 16) | - (static_cast(cSwizzleTable[(n >> 16) & 0xff]) << 8) | - (static_cast(cSwizzleTable[(n >> 24)])); - pfOutput[uAddr >> uRev32] = f4a.x; + const size_t uAddr + = (static_cast(cSwizzleTable[n & 0xff]) << 24) | (static_cast(cSwizzleTable[(n >> 8) & 0xff]) << 16) + | (static_cast(cSwizzleTable[(n >> 16) & 0xff]) << 8) | (static_cast(cSwizzleTable[(n >> 24)])); + pfOutput[uAddr >> uRev32] = f4a.x; pfOutput[(0x40000000 | uAddr) >> uRev32] = f4a.y; pfOutput[(0x80000000 | uAddr) >> uRev32] = f4a.z; pfOutput[(0xC0000000 | uAddr) >> uRev32] = f4a.w; @@ -566,18 +565,18 @@ namespace XDSP else { // odd powers of two - const size_t uRev7 = size_t(1) << (uLog2Length - 3); + const size_t uRev7 = size_t(1) << (uLog2Length - 3); const size_t uRev32 = 32 - (uLog2Length - 3); for (size_t uIndex = 0; uIndex < uLength; ++uIndex) { XMFLOAT4A f4a; XMStoreFloat4A(&f4a, pInput[uIndex]); const size_t n = (uIndex >> 1); - size_t uAddr = (((static_cast(cSwizzleTable[n & 0xff]) << 24) | - (static_cast(cSwizzleTable[(n >> 8) & 0xff]) << 16) | - (static_cast(cSwizzleTable[(n >> 16) & 0xff]) << 8) | - (static_cast(cSwizzleTable[(n >> 24)]))) >> uRev32) | - ((uIndex & 1) * uRev7 * 4); + size_t uAddr + = (((static_cast(cSwizzleTable[n & 0xff]) << 24) | (static_cast(cSwizzleTable[(n >> 8) & 0xff]) << 16) + | (static_cast(cSwizzleTable[(n >> 16) & 0xff]) << 8) | (static_cast(cSwizzleTable[(n >> 24)]))) + >> uRev32) + | ((uIndex & 1) * uRev7 * 4); pfOutput[uAddr] = f4a.x; uAddr += uRev7; pfOutput[uAddr] = f4a.y; @@ -600,10 +599,9 @@ namespace XDSP // uLength - [in] FFT length in samples, must be a power of 2 >= 4 //---------------------------------------------------------------------------------- #ifdef _MSC_VER -#pragma warning(suppress: 6101) +#pragma warning(suppress : 6101) #endif - inline void FFTPolar( - _Out_writes_(uLength / 4) XMVECTOR* __restrict pOutput, + inline void FFTPolar(_Out_writes_(uLength / 4) XMVECTOR* __restrict pOutput, _In_reads_(uLength / 4) const XMVECTOR* __restrict pInputReal, _In_reads_(uLength / 4) const XMVECTOR* __restrict pInputImaginary, _In_ const size_t uLength) noexcept @@ -624,13 +622,13 @@ namespace XDSP for (size_t uIndex = 0; uIndex < (uLength >> 2); ++uIndex) { - XMVECTOR vReal = XMVectorMultiply(pInputReal[uIndex], vOneOverLength); + XMVECTOR vReal = XMVectorMultiply(pInputReal[uIndex], vOneOverLength); XMVECTOR vImaginary = XMVectorMultiply(pInputImaginary[uIndex], vOneOverLength); - XMVECTOR vRR = XMVectorMultiply(vReal, vReal); - XMVECTOR vII = XMVectorMultiply(vImaginary, vImaginary); - XMVECTOR vRRplusII = XMVectorAdd(vRR, vII); - XMVECTOR vTotal = XMVectorSqrt(vRRplusII); - pOutput[uIndex] = XMVectorAdd(vTotal, vTotal); + XMVECTOR vRR = XMVectorMultiply(vReal, vReal); + XMVECTOR vII = XMVectorMultiply(vImaginary, vImaginary); + XMVECTOR vRRplusII = XMVectorAdd(vRR, vII); + XMVECTOR vTotal = XMVectorSqrt(vRRplusII); + pOutput[uIndex] = XMVectorAdd(vTotal, vTotal); } } @@ -642,13 +640,12 @@ namespace XDSP // For example, audio of the form [LRLRLR] becomes [LLLRRR]. // // PARAMETERS: - // pOutput - [out] output buffer, receives samples in deinterleaved form, cannot overlap pInput, must have at least (uChannelCount*uFrameCount)/4 elements - // pInput - [in] input buffer, cannot overlap pOutput, must have at least (uChannelCount*uFrameCount)/4 elements - // uChannelCount - [in] number of channels, must be > 1 - // uFrameCount - [in] number of frames of valid data, must be > 0 + // pOutput - [out] output buffer, receives samples in deinterleaved form, cannot overlap pInput, must have at least + // (uChannelCount*uFrameCount)/4 elements pInput - [in] input buffer, cannot overlap pOutput, must have at least + // (uChannelCount*uFrameCount)/4 elements uChannelCount - [in] number of channels, must be > 1 uFrameCount - [in] number of frames + // of valid data, must be > 0 //---------------------------------------------------------------------------------- - inline void Deinterleave( - _Out_writes_((uChannelCount * uFrameCount) / 4) XMVECTOR* __restrict pOutput, + inline void Deinterleave(_Out_writes_((uChannelCount * uFrameCount) / 4) XMVECTOR* __restrict pOutput, _In_reads_((uChannelCount * uFrameCount) / 4) const XMVECTOR* __restrict pInput, _In_ const size_t uChannelCount, _In_ const size_t uFrameCount) noexcept @@ -658,7 +655,7 @@ namespace XDSP assert(uChannelCount > 1); assert(uFrameCount > 0); - float* __restrict pfOutput = reinterpret_cast(pOutput); + float* __restrict pfOutput = reinterpret_cast(pOutput); const float* __restrict pfInput = reinterpret_cast(pInput); for (size_t uChannel = 0; uChannel < uChannelCount; ++uChannel) @@ -678,13 +675,12 @@ namespace XDSP // For example, audio of the form [LLLRRR] becomes [LRLRLR]. // // PARAMETERS: - // pOutput - [out] output buffer, receives samples in interleaved form, cannot overlap pInput, must have at least (uChannelCount*uFrameCount)/4 elements - // pInput - [in] input buffer, cannot overlap pOutput, must have at least (uChannelCount*uFrameCount)/4 elements - // uChannelCount - [in] number of channels, must be > 1 - // uFrameCount - [in] number of frames of valid data, must be > 0 + // pOutput - [out] output buffer, receives samples in interleaved form, cannot overlap pInput, must have at least + // (uChannelCount*uFrameCount)/4 elements pInput - [in] input buffer, cannot overlap pOutput, must have at least + // (uChannelCount*uFrameCount)/4 elements uChannelCount - [in] number of channels, must be > 1 uFrameCount - [in] number of frames + // of valid data, must be > 0 //---------------------------------------------------------------------------------- - inline void Interleave( - _Out_writes_((uChannelCount * uFrameCount) / 4) XMVECTOR* __restrict pOutput, + inline void Interleave(_Out_writes_((uChannelCount * uFrameCount) / 4) XMVECTOR* __restrict pOutput, _In_reads_((uChannelCount * uFrameCount) / 4) const XMVECTOR* __restrict pInput, _In_ const size_t uChannelCount, _In_ const size_t uFrameCount) noexcept @@ -694,7 +690,7 @@ namespace XDSP assert(uChannelCount > 1); assert(uFrameCount > 0); - float* __restrict pfOutput = reinterpret_cast(pOutput); + float* __restrict pfOutput = reinterpret_cast(pOutput); const float* __restrict pfInput = reinterpret_cast(pInput); for (size_t uChannel = 0; uChannel < uChannelCount; ++uChannel) @@ -719,8 +715,7 @@ namespace XDSP // uChannelCount - [in] number of channels, must be within [1, 6] // uLog2Length - [in] LOG (base 2) of FFT length in frames, must within [2, 9] //---------------------------------------------------------------------------------- - inline void FFTInterleaved( - _Inout_updates_(((1 << uLog2Length) * uChannelCount) / 4) XMVECTOR* __restrict pReal, + inline void FFTInterleaved(_Inout_updates_(((1 << uLog2Length) * uChannelCount) / 4) XMVECTOR* __restrict pReal, _Out_writes_(((1 << uLog2Length) * uChannelCount) / 4) XMVECTOR* __restrict pImaginary, _In_reads_(1 << uLog2Length) const XMVECTOR* __restrict pUnityTable, _In_ const size_t uChannelCount, @@ -737,7 +732,7 @@ namespace XDSP XM_ALIGNED_DATA(16) XMVECTOR vRealTemp[768]; XM_ALIGNED_DATA(16) XMVECTOR vImaginaryTemp[768]; - const size_t uLength = size_t(1) << uLog2Length; + const size_t uLength = size_t(1) << uLog2Length; if (uChannelCount > 1) { @@ -798,8 +793,7 @@ namespace XDSP // uChannelCount - [in] number of channels, must be > 0 // uLog2Length - [in] LOG (base 2) of FFT length in frames, must within [2, 9] //---------------------------------------------------------------------------------- - inline void IFFTDeinterleaved( - _Inout_updates_(((1 << uLog2Length) * uChannelCount) / 4) XMVECTOR* __restrict pReal, + inline void IFFTDeinterleaved(_Inout_updates_(((1 << uLog2Length) * uChannelCount) / 4) XMVECTOR* __restrict pReal, _In_reads_(((1 << uLog2Length) * uChannelCount) / 4) const XMVECTOR* __restrict pImaginary, _In_reads_(1 << uLog2Length) const XMVECTOR* __restrict pUnityTable, _In_ const size_t uChannelCount, @@ -818,7 +812,7 @@ namespace XDSP assert(uLog2Length >= 2 && uLog2Length <= 9); _Analysis_assume_(uLog2Length >= 2 && uLog2Length <= 9); - XM_ALIGNED_DATA(16) XMVECTOR vRealTemp[768] = {}; + XM_ALIGNED_DATA(16) XMVECTOR vRealTemp[768] = {}; XM_ALIGNED_DATA(16) XMVECTOR vImaginaryTemp[768] = {}; const size_t uLength = size_t(1) << uLog2Length; @@ -827,7 +821,7 @@ namespace XDSP const XMVECTOR vRnm = XMVectorReplicate(-1.0f / float(uLength)); for (size_t u = 0; u < uChannelCount * (uLength >> 2); u++) { - vRealTemp[u] = XMVectorMultiply(pReal[u], vRnp); + vRealTemp[u] = XMVectorMultiply(pReal[u], vRnp); vImaginaryTemp[u] = XMVectorMultiply(pImaginary[u], vRnm); } From 77d39b32fda3cb48917084a3828e514ea6b9f698 Mon Sep 17 00:00:00 2001 From: Chuck Walbourn Date: Mon, 21 Sep 2026 09:53:56 -0700 Subject: [PATCH 6/7] Workaround for spaceship operator --- Inc/DirectXMath.h | 168 ++++++++++++++++++++++++++-------------------- 1 file changed, 97 insertions(+), 71 deletions(-) diff --git a/Inc/DirectXMath.h b/Inc/DirectXMath.h index bd93fa4f..8f1c6978 100644 --- a/Inc/DirectXMath.h +++ b/Inc/DirectXMath.h @@ -738,8 +738,10 @@ namespace DirectX {} #if (__cplusplus >= 202002L) - bool operator==(const XMFLOAT2&) const = default; - auto operator<= > (const XMFLOAT2&) const = default; + // clang-format off + bool operator==(const XMFLOAT2&) const = default; + auto operator<=>(const XMFLOAT2&) const = default; + // clang-format on #endif }; @@ -774,8 +776,10 @@ namespace DirectX {} #if (__cplusplus >= 202002L) - bool operator==(const XMINT2&) const = default; - auto operator<= > (const XMINT2&) const = default; + // clang-format off + bool operator==(const XMINT2&) const = default; + auto operator<=>(const XMINT2&) const = default; + // clang-format on #endif }; @@ -803,8 +807,10 @@ namespace DirectX {} #if (__cplusplus >= 202002L) - bool operator==(const XMUINT2&) const = default; - auto operator<= > (const XMUINT2&) const = default; + // clang-format off + bool operator==(const XMUINT2&) const = default; + auto operator<=>(const XMUINT2&) const = default; + // clang-format on #endif }; @@ -836,8 +842,10 @@ namespace DirectX {} #if (__cplusplus >= 202002L) - bool operator==(const XMFLOAT3&) const = default; - auto operator<= > (const XMFLOAT3&) const = default; + // clang-format off + bool operator==(const XMFLOAT3&) const = default; + auto operator<=>(const XMFLOAT3&) const = default; + // clang-format on #endif }; @@ -875,8 +883,10 @@ namespace DirectX {} #if (__cplusplus >= 202002L) - bool operator==(const XMINT3&) const = default; - auto operator<= > (const XMINT3&) const = default; + // clang-format off + bool operator==(const XMINT3&) const = default; + auto operator<=>(const XMINT3&) const = default; + // clang-format on #endif }; @@ -907,8 +917,10 @@ namespace DirectX {} #if (__cplusplus >= 202002L) - bool operator==(const XMUINT3&) const = default; - auto operator<= > (const XMUINT3&) const = default; + // clang-format off + bool operator==(const XMUINT3&) const = default; + auto operator<=>(const XMUINT3&) const = default; + // clang-format on #endif }; @@ -943,8 +955,10 @@ namespace DirectX {} #if (__cplusplus >= 202002L) - bool operator==(const XMFLOAT4&) const = default; - auto operator<= > (const XMFLOAT4&) const = default; + // clang-format off + bool operator==(const XMFLOAT4&) const = default; + auto operator<=>(const XMFLOAT4&) const = default; + // clang-format on #endif }; @@ -985,8 +999,10 @@ namespace DirectX {} #if (__cplusplus >= 202002L) - bool operator==(const XMINT4&) const = default; - auto operator<= > (const XMINT4&) const = default; + // clang-format off + bool operator==(const XMINT4&) const = default; + auto operator<=>(const XMINT4&) const = default; + // clang-format on #endif }; @@ -1020,8 +1036,10 @@ namespace DirectX {} #if (__cplusplus >= 202002L) - bool operator==(const XMUINT4&) const = default; - auto operator<= > (const XMUINT4&) const = default; + // clang-format off + bool operator==(const XMUINT4&) const = default; + auto operator<=>(const XMUINT4&) const = default; + // clang-format on #endif }; @@ -1079,26 +1097,28 @@ namespace DirectX && _32 == M._32 && _33 == M._33; } - constexpr auto operator<= > (const XMFLOAT3X3& M) const noexcept + // clang-format off + constexpr auto operator<=>(const XMFLOAT3X3& M) const noexcept { - if (auto cmp = _11 <= > M._11; cmp != 0) + if (auto cmp = _11 <=> M._11; cmp != 0) return cmp; - if (auto cmp = _12 <= > M._12; cmp != 0) + if (auto cmp = _12 <=> M._12; cmp != 0) return cmp; - if (auto cmp = _13 <= > M._13; cmp != 0) + if (auto cmp = _13 <=> M._13; cmp != 0) return cmp; - if (auto cmp = _21 <= > M._21; cmp != 0) + if (auto cmp = _21 <=> M._21; cmp != 0) return cmp; - if (auto cmp = _22 <= > M._22; cmp != 0) + if (auto cmp = _22 <=> M._22; cmp != 0) return cmp; - if (auto cmp = _23 <= > M._23; cmp != 0) + if (auto cmp = _23 <=> M._23; cmp != 0) return cmp; - if (auto cmp = _31 <= > M._31; cmp != 0) + if (auto cmp = _31 <=> M._31; cmp != 0) return cmp; - if (auto cmp = _32 <= > M._32; cmp != 0) + if (auto cmp = _32 <=> M._32; cmp != 0) return cmp; - return _33 <= > M._33; + return _33 <=> M._33; } + // clang-format on #endif }; @@ -1164,32 +1184,34 @@ namespace DirectX && _32 == M._32 && _33 == M._33 && _41 == M._41 && _42 == M._42 && _43 == M._43; } - constexpr auto operator<= > (const XMFLOAT4X3& M) const noexcept + // clang-format off + constexpr auto operator<=>(const XMFLOAT4X3& M) const noexcept { - if (auto cmp = _11 <= > M._11; cmp != 0) + if (auto cmp = _11 <=> M._11; cmp != 0) return cmp; - if (auto cmp = _12 <= > M._12; cmp != 0) + if (auto cmp = _12 <=> M._12; cmp != 0) return cmp; - if (auto cmp = _13 <= > M._13; cmp != 0) + if (auto cmp = _13 <=> M._13; cmp != 0) return cmp; - if (auto cmp = _21 <= > M._21; cmp != 0) + if (auto cmp = _21 <=> M._21; cmp != 0) return cmp; - if (auto cmp = _22 <= > M._22; cmp != 0) + if (auto cmp = _22 <=> M._22; cmp != 0) return cmp; - if (auto cmp = _23 <= > M._23; cmp != 0) + if (auto cmp = _23 <=> M._23; cmp != 0) return cmp; - if (auto cmp = _31 <= > M._31; cmp != 0) + if (auto cmp = _31 <=> M._31; cmp != 0) return cmp; - if (auto cmp = _32 <= > M._32; cmp != 0) + if (auto cmp = _32 <=> M._32; cmp != 0) return cmp; - if (auto cmp = _33 <= > M._33; cmp != 0) + if (auto cmp = _33 <=> M._33; cmp != 0) return cmp; - if (auto cmp = _41 <= > M._41; cmp != 0) + if (auto cmp = _41 <=> M._41; cmp != 0) return cmp; - if (auto cmp = _42 <= > M._42; cmp != 0) + if (auto cmp = _42 <=> M._42; cmp != 0) return cmp; - return _43 <= > M._43; + return _43 <=> M._43; } + // clang-format on #endif }; @@ -1260,32 +1282,34 @@ namespace DirectX && _24 == M._24 && _31 == M._31 && _32 == M._32 && _33 == M._33 && _34 == M._34; } - constexpr auto operator<= > (const XMFLOAT3X4& M) const noexcept + // clang-format off + constexpr auto operator<=>(const XMFLOAT3X4& M) const noexcept { - if (auto cmp = _11 <= > M._11; cmp != 0) + if (auto cmp = _11 <=> M._11; cmp != 0) return cmp; - if (auto cmp = _12 <= > M._12; cmp != 0) + if (auto cmp = _12 <=> M._12; cmp != 0) return cmp; - if (auto cmp = _13 <= > M._13; cmp != 0) + if (auto cmp = _13 <=> M._13; cmp != 0) return cmp; - if (auto cmp = _14 <= > M._14; cmp != 0) + if (auto cmp = _14 <=> M._14; cmp != 0) return cmp; - if (auto cmp = _21 <= > M._21; cmp != 0) + if (auto cmp = _21 <=> M._21; cmp != 0) return cmp; - if (auto cmp = _22 <= > M._22; cmp != 0) + if (auto cmp = _22 <=> M._22; cmp != 0) return cmp; - if (auto cmp = _23 <= > M._23; cmp != 0) + if (auto cmp = _23 <=> M._23; cmp != 0) return cmp; - if (auto cmp = _24 <= > M._24; cmp != 0) + if (auto cmp = _24 <=> M._24; cmp != 0) return cmp; - if (auto cmp = _31 <= > M._31; cmp != 0) + if (auto cmp = _31 <=> M._31; cmp != 0) return cmp; - if (auto cmp = _32 <= > M._32; cmp != 0) + if (auto cmp = _32 <=> M._32; cmp != 0) return cmp; - if (auto cmp = _33 <= > M._33; cmp != 0) + if (auto cmp = _33 <=> M._33; cmp != 0) return cmp; - return _34 <= > M._34; + return _34 <=> M._34; } + // clang-format on #endif }; @@ -1365,40 +1389,42 @@ namespace DirectX && _43 == M._43 && _44 == M._44; } - constexpr auto operator<= > (const XMFLOAT4X4& M) const noexcept + // clang-format off + constexpr auto operator<=>(const XMFLOAT4X4& M) const noexcept { - if (auto cmp = _11 <= > M._11; cmp != 0) + if (auto cmp = _11 <=> M._11; cmp != 0) return cmp; - if (auto cmp = _12 <= > M._12; cmp != 0) + if (auto cmp = _12 <=> M._12; cmp != 0) return cmp; - if (auto cmp = _13 <= > M._13; cmp != 0) + if (auto cmp = _13 <=> M._13; cmp != 0) return cmp; - if (auto cmp = _14 <= > M._14; cmp != 0) + if (auto cmp = _14 <=> M._14; cmp != 0) return cmp; - if (auto cmp = _21 <= > M._21; cmp != 0) + if (auto cmp = _21 <=> M._21; cmp != 0) return cmp; - if (auto cmp = _22 <= > M._22; cmp != 0) + if (auto cmp = _22 <=> M._22; cmp != 0) return cmp; - if (auto cmp = _23 <= > M._23; cmp != 0) + if (auto cmp = _23 <=> M._23; cmp != 0) return cmp; - if (auto cmp = _24 <= > M._24; cmp != 0) + if (auto cmp = _24 <=> M._24; cmp != 0) return cmp; - if (auto cmp = _31 <= > M._31; cmp != 0) + if (auto cmp = _31 <=> M._31; cmp != 0) return cmp; - if (auto cmp = _32 <= > M._32; cmp != 0) + if (auto cmp = _32 <=> M._32; cmp != 0) return cmp; - if (auto cmp = _33 <= > M._33; cmp != 0) + if (auto cmp = _33 <=> M._33; cmp != 0) return cmp; - if (auto cmp = _34 <= > M._34; cmp != 0) + if (auto cmp = _34 <=> M._34; cmp != 0) return cmp; - if (auto cmp = _41 <= > M._41; cmp != 0) + if (auto cmp = _41 <=> M._41; cmp != 0) return cmp; - if (auto cmp = _42 <= > M._42; cmp != 0) + if (auto cmp = _42 <=> M._42; cmp != 0) return cmp; - if (auto cmp = _43 <= > M._43; cmp != 0) + if (auto cmp = _43 <=> M._43; cmp != 0) return cmp; - return _44 <= > M._44; + return _44 <=> M._44; } + // clang-format on #endif }; From 8fc80b1f111ae69466bdda0438209ace29c61a63 Mon Sep 17 00:00:00 2001 From: Chuck Walbourn Date: Mon, 21 Sep 2026 09:56:19 -0700 Subject: [PATCH 7/7] Update clang format for C++20 --- .github/linters/.clang-format | 2 +- Inc/DirectXMath.h | 28 +--------------------------- 2 files changed, 2 insertions(+), 28 deletions(-) diff --git a/.github/linters/.clang-format b/.github/linters/.clang-format index 842e0331..9fadeff8 100644 --- a/.github/linters/.clang-format +++ b/.github/linters/.clang-format @@ -82,6 +82,6 @@ SpacesInAngles: false SpacesInCStyleCastParentheses: false SpacesInContainerLiterals: false SpacesInParentheses: false -Standard: c++17 +Standard: c++20 TabWidth: 4 UseTab: Never diff --git a/Inc/DirectXMath.h b/Inc/DirectXMath.h index 8f1c6978..d9b96653 100644 --- a/Inc/DirectXMath.h +++ b/Inc/DirectXMath.h @@ -738,10 +738,8 @@ namespace DirectX {} #if (__cplusplus >= 202002L) - // clang-format off bool operator==(const XMFLOAT2&) const = default; auto operator<=>(const XMFLOAT2&) const = default; - // clang-format on #endif }; @@ -776,10 +774,8 @@ namespace DirectX {} #if (__cplusplus >= 202002L) - // clang-format off bool operator==(const XMINT2&) const = default; auto operator<=>(const XMINT2&) const = default; - // clang-format on #endif }; @@ -807,10 +803,8 @@ namespace DirectX {} #if (__cplusplus >= 202002L) - // clang-format off bool operator==(const XMUINT2&) const = default; auto operator<=>(const XMUINT2&) const = default; - // clang-format on #endif }; @@ -842,10 +836,8 @@ namespace DirectX {} #if (__cplusplus >= 202002L) - // clang-format off bool operator==(const XMFLOAT3&) const = default; auto operator<=>(const XMFLOAT3&) const = default; - // clang-format on #endif }; @@ -883,10 +875,8 @@ namespace DirectX {} #if (__cplusplus >= 202002L) - // clang-format off bool operator==(const XMINT3&) const = default; auto operator<=>(const XMINT3&) const = default; - // clang-format on #endif }; @@ -917,10 +907,8 @@ namespace DirectX {} #if (__cplusplus >= 202002L) - // clang-format off bool operator==(const XMUINT3&) const = default; auto operator<=>(const XMUINT3&) const = default; - // clang-format on #endif }; @@ -955,10 +943,8 @@ namespace DirectX {} #if (__cplusplus >= 202002L) - // clang-format off bool operator==(const XMFLOAT4&) const = default; auto operator<=>(const XMFLOAT4&) const = default; - // clang-format on #endif }; @@ -999,10 +985,8 @@ namespace DirectX {} #if (__cplusplus >= 202002L) - // clang-format off bool operator==(const XMINT4&) const = default; auto operator<=>(const XMINT4&) const = default; - // clang-format on #endif }; @@ -1036,10 +1020,8 @@ namespace DirectX {} #if (__cplusplus >= 202002L) - // clang-format off - bool operator==(const XMUINT4&) const = default; + bool operator==(const XMUINT4&) const = default; auto operator<=>(const XMUINT4&) const = default; - // clang-format on #endif }; @@ -1097,7 +1079,6 @@ namespace DirectX && _32 == M._32 && _33 == M._33; } - // clang-format off constexpr auto operator<=>(const XMFLOAT3X3& M) const noexcept { if (auto cmp = _11 <=> M._11; cmp != 0) @@ -1118,7 +1099,6 @@ namespace DirectX return cmp; return _33 <=> M._33; } - // clang-format on #endif }; @@ -1184,7 +1164,6 @@ namespace DirectX && _32 == M._32 && _33 == M._33 && _41 == M._41 && _42 == M._42 && _43 == M._43; } - // clang-format off constexpr auto operator<=>(const XMFLOAT4X3& M) const noexcept { if (auto cmp = _11 <=> M._11; cmp != 0) @@ -1211,7 +1190,6 @@ namespace DirectX return cmp; return _43 <=> M._43; } - // clang-format on #endif }; @@ -1282,7 +1260,6 @@ namespace DirectX && _24 == M._24 && _31 == M._31 && _32 == M._32 && _33 == M._33 && _34 == M._34; } - // clang-format off constexpr auto operator<=>(const XMFLOAT3X4& M) const noexcept { if (auto cmp = _11 <=> M._11; cmp != 0) @@ -1309,7 +1286,6 @@ namespace DirectX return cmp; return _34 <=> M._34; } - // clang-format on #endif }; @@ -1389,7 +1365,6 @@ namespace DirectX && _43 == M._43 && _44 == M._44; } - // clang-format off constexpr auto operator<=>(const XMFLOAT4X4& M) const noexcept { if (auto cmp = _11 <=> M._11; cmp != 0) @@ -1424,7 +1399,6 @@ namespace DirectX return cmp; return _44 <=> M._44; } - // clang-format on #endif };