1.Math.h
#pragma once
#include "CommonHeaders.h"
#include "MathTypes.h"
#include "PrimitiveTypes.h"
namespace primal::math
{
template<typename T>
constexpr T clamp(T value, T min, T max)
{
return (value < min) ? min : (value > max) ? max : value;
}
template<u32 bits>
constexpr u32 pack_unit_float(f32 f)
{
static_assert(bits <= sizeof(u32) * 8);
assert(f >= 0.f && f <= 1.f);
constexpr f32 intervals{ (f32)((1ui32 << bits) - 1) };
return (u32)(intervals * f + 0.5f);
}
template<u32 bits>
constexpr f32 unpack_to_unit_float(u32 i)
{
static_assert(bits <= sizeof(u32) * 8);
assert(i < (1ui32)<<bits);
constexpr f32 intervals{ (u32)((1ui32 << bits) - 1) };
return (f32)i / intervals;
}
template<u32 bits>
constexpr u32 pack_float(f32 f, f32 min, f32 max)
{
assert(min < max);
assert(f <= max && f >= min);
const f32 distance{(f - min) / (max - min)};
return pack_unit_float<bits>(distance);
}
template<u32 bits>
constexpr f32 unpack_to_float(u32 i, f32 min, f32 max)
{
assert(min < max);
return unpack_to_unit_float<bits>(i) * (max - min) + min;
}
}
2.
MathTypes.h
#pragma once
#include "CommonHeaders.h"
#include "DirectXMath.h"
namespace primal::math
{
constexpr float pi = 3.14f;
//constexpr float pi = 2.f * pi;
constexpr float epsilon = 1e-5f;
#if defined(_WIN64)
/*
typedef const DirectX& XMFLOAT2;
typedef const DirectX& XMFLOAT2A;
typedef const DirectX& XMFLOAT3;
typedef const DirectX& XMFLOAT3A;
typedef const DirectX& XMFLOAT4;
typedef const DirectX& XMFLOAT4A;
typedef const DirectX& XMUINT2;
typedef const DirectX& XMUINT3;
typedef const DirectX& XMUINT4;
typedef const DirectX& XMINT2;
typedef const DirectX& XMINT3;
typedef const DirectX& XMINT4;
typedef const DirectX& XMFLOAT3X3;
typedef const DirectX& XMFLOAT4X4;
typedef const DirectX& XMFLOAT4X4A;
*/
using v2 = DirectX::XMFLOAT2;
using v2a = DirectX::XMFLOAT2A;
using v3 = DirectX::XMFLOAT3;
using v3a = DirectX::XMFLOAT3A;
using v4 = DirectX::XMFLOAT4;
using v4a = DirectX::XMFLOAT4A;
using u32v2 = DirectX::XMUINT2;
using u32v3 = DirectX::XMUINT3;
using u32v4 = DirectX::XMUINT4;
using s32v2 = DirectX::XMINT2;
using s32v3 = DirectX::XMINT3;
using s32v4 = DirectX::XMINT4;
using m3x3 = DirectX::XMFLOAT3X3;
using m4x4 = DirectX::XMFLOAT4X4;
using m4x4a = DirectX::XMFLOAT4X4A;
#endif
};