3d游戏引擎的math矩阵实现

发布于:2025-05-13 ⋅ 阅读:(11) ⋅ 点赞:(0)

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

};