2025-05-07 19:18:58 +02:00
|
|
|
/*
|
|
|
|
|
Crafter.Math
|
|
|
|
|
Copyright (C) 2025 Catcrafts
|
|
|
|
|
Catcrafts.net
|
|
|
|
|
|
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
|
|
|
modify it under the terms of the GNU Lesser General Public
|
|
|
|
|
License as published by the Free Software Foundation; either
|
|
|
|
|
version 3.0 of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
|
Lesser General Public License for more details.
|
|
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
|
|
|
License along with this library; if not, write to the Free Software
|
|
|
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
|
*/
|
2025-05-05 02:01:44 +02:00
|
|
|
|
|
|
|
|
module;
|
|
|
|
|
|
|
|
|
|
#include <cstdint>
|
|
|
|
|
#include <stdfloat>
|
2025-05-05 05:14:39 +02:00
|
|
|
#include <numeric>
|
2025-05-05 02:01:44 +02:00
|
|
|
|
|
|
|
|
export module Crafter.Math:Misc;
|
|
|
|
|
|
|
|
|
|
export namespace Crafter {
|
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
|
|
|
// DirectXMathMisc.inl -- SIMD C++ Math library
|
|
|
|
|
//
|
|
|
|
|
// Copyright (c) Microsoft Corporation.
|
|
|
|
|
// Licensed under the MIT License.
|
|
|
|
|
//
|
|
|
|
|
// http://go.microsoft.com/fwlink/?LinkID=615560
|
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inline void XMScalarSinCos(float* pSin, float* pCos, float Value) noexcept
|
|
|
|
|
{
|
|
|
|
|
// Map Value to y in [-pi,pi], x = 2*pi*quotient + remainder.
|
|
|
|
|
float quotient = XM_1DIV2PI * Value;
|
|
|
|
|
if (Value >= 0.0f)
|
|
|
|
|
{
|
|
|
|
|
quotient = static_cast<float>(static_cast<int>(quotient + 0.5f));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
quotient = static_cast<float>(static_cast<int>(quotient - 0.5f));
|
|
|
|
|
}
|
|
|
|
|
float y = Value - XM_2PI * quotient;
|
|
|
|
|
|
|
|
|
|
// Map y to [-pi/2,pi/2] with sin(y) = sin(Value).
|
|
|
|
|
float sign;
|
|
|
|
|
if (y > XM_PIDIV2)
|
|
|
|
|
{
|
|
|
|
|
y = XM_PI - y;
|
|
|
|
|
sign = -1.0f;
|
|
|
|
|
}
|
|
|
|
|
else if (y < -XM_PIDIV2)
|
|
|
|
|
{
|
|
|
|
|
y = -XM_PI - y;
|
|
|
|
|
sign = -1.0f;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
sign = +1.0f;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
float y2 = y * y;
|
|
|
|
|
|
|
|
|
|
// 11-degree minimax approximation
|
|
|
|
|
*pSin = (((((-2.3889859e-08f * y2 + 2.7525562e-06f) * y2 - 0.00019840874f) * y2 + 0.0083333310f) * y2 - 0.16666667f) * y2 + 1.0f) * y;
|
|
|
|
|
|
|
|
|
|
// 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;
|
|
|
|
|
}
|
2025-05-05 05:14:39 +02:00
|
|
|
|
|
|
|
|
constexpr float ToRadian(float degrees) {
|
|
|
|
|
return degrees * (std::numbers::pi / 180);
|
|
|
|
|
}
|
2025-05-05 02:01:44 +02:00
|
|
|
}
|