/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ #pragma once #if __has_include("fmt/format.h") #include #elif __has_include("spdlog/fmt/fmt.h") #include #else #error "Failed to find fmt include" #endif #include "Math/Math.hpp" #include "Math/ByteSize.hpp" #include "Math/DenseVector3i.hpp" #include "Math/Float16.hpp" #include "Math/Int24.hpp" #include "Math/Range.hpp" #include "Math/RGB10A2.hpp" #include "Math/RGB565.hpp" #include "Math/RGBA5551.hpp" #include "Math/Timestamp.hpp" #include "Math/UInt24.hpp" #include "Base/UUID.hpp" #include template<> struct fmt::formatter { template constexpr auto parse(ParseContext& ctx) { return ctx.begin(); } template auto format(const OpenVulkano::ByteSize& bs, FormatContext& ctx) const { return fmt::format_to(ctx.out(), "{}", bs.Format()); } }; template<> struct fmt::formatter : fmt::formatter { template auto format(const std::filesystem::path& path, format_context& ctx) const requires std::is_same_v { return formatter::format(path.native(), ctx); } template auto format(const std::filesystem::path& path, format_context& ctx) const requires std::is_same_v { return formatter::format(path.string(), ctx); } }; template struct fmt::formatter> : fmt::formatter { template auto format(const glm::vec<2, T, Q>& v, FormatContext& ctx) const { fmt::format_to(ctx.out(), "("); formatter::format(v.x, ctx); fmt::format_to(ctx.out(), ", "); formatter::format(v.y, ctx); return fmt::format_to(ctx.out(), ")"); } }; template struct fmt::formatter> : fmt::formatter { template auto format(const glm::vec<3, T, Q>& v, FormatContext& ctx) const { fmt::format_to(ctx.out(), "("); formatter::format(v.x, ctx); fmt::format_to(ctx.out(), ", "); formatter::format(v.y, ctx); fmt::format_to(ctx.out(), ", "); formatter::format(v.z, ctx); return fmt::format_to(ctx.out(), ")"); } }; template struct fmt::formatter> : fmt::formatter { template auto format(const glm::vec<4, T, Q>& v, FormatContext& ctx) const { fmt::format_to(ctx.out(), "("); formatter::format(v.x, ctx); fmt::format_to(ctx.out(), ", "); formatter::format(v.y, ctx); fmt::format_to(ctx.out(), ", "); formatter::format(v.z, ctx); fmt::format_to(ctx.out(), ", "); formatter::format(v.w, ctx); return fmt::format_to(ctx.out(), ")"); } }; template struct fmt::formatter> : fmt::formatter { template auto format(const glm::mat<2, 2, T, Q>& m, FormatContext& ctx) const { fmt::format_to(ctx.out(), "[["); formatter::format(m[0][0], ctx); fmt::format_to(ctx.out(), ", "); formatter::format(m[1][0], ctx); fmt::format_to(ctx.out(), "], ["); formatter::format(m[0][1], ctx); fmt::format_to(ctx.out(), ", "); formatter::format(m[1][1], ctx); return fmt::format_to(ctx.out(), "]]"); } }; template struct fmt::formatter> : fmt::formatter { template auto format(const glm::mat<3, 3, T, Q>& m, FormatContext& ctx) const { fmt::format_to(ctx.out(), "[["); formatter::format(m[0][0], ctx); fmt::format_to(ctx.out(), ", "); formatter::format(m[1][0], ctx); fmt::format_to(ctx.out(), ", "); formatter::format(m[2][0], ctx); fmt::format_to(ctx.out(), "], ["); formatter::format(m[0][1], ctx); fmt::format_to(ctx.out(), ", "); formatter::format(m[1][1], ctx); fmt::format_to(ctx.out(), ", "); formatter::format(m[2][1], ctx); fmt::format_to(ctx.out(), "], ["); formatter::format(m[0][2], ctx); fmt::format_to(ctx.out(), ", "); formatter::format(m[1][2], ctx); fmt::format_to(ctx.out(), ", "); formatter::format(m[2][2], ctx); return fmt::format_to(ctx.out(), "]]"); } }; template struct fmt::formatter> : fmt::formatter { template auto format(const glm::mat<4, 4, T, Q>& m, FormatContext& ctx) const { fmt::format_to(ctx.out(), "[["); formatter::format(m[0][0], ctx); fmt::format_to(ctx.out(), ", "); formatter::format(m[1][0], ctx); fmt::format_to(ctx.out(), ", "); formatter::format(m[2][0], ctx); fmt::format_to(ctx.out(), ", "); formatter::format(m[3][0], ctx); fmt::format_to(ctx.out(), "], ["); formatter::format(m[0][1], ctx); fmt::format_to(ctx.out(), ", "); formatter::format(m[1][1], ctx); fmt::format_to(ctx.out(), ", "); formatter::format(m[2][1], ctx); fmt::format_to(ctx.out(), ", "); formatter::format(m[3][1], ctx); fmt::format_to(ctx.out(), "], ["); formatter::format(m[0][2], ctx); fmt::format_to(ctx.out(), ", "); formatter::format(m[1][2], ctx); fmt::format_to(ctx.out(), ", "); formatter::format(m[2][2], ctx); fmt::format_to(ctx.out(), ", "); formatter::format(m[3][2], ctx); fmt::format_to(ctx.out(), "], ["); formatter::format(m[0][3], ctx); fmt::format_to(ctx.out(), ", "); formatter::format(m[1][3], ctx); fmt::format_to(ctx.out(), ", "); formatter::format(m[2][3], ctx); fmt::format_to(ctx.out(), ", "); formatter::format(m[3][3], ctx); return fmt::format_to(ctx.out(), "]]"); } }; template struct fmt::formatter> : fmt::formatter { template auto format(const glm::qua& q, FormatContext& ctx) const { fmt::format_to(ctx.out(), "("); formatter::format(q.w, ctx); fmt::format_to(ctx.out(), ", "); formatter::format(q.x, ctx); fmt::format_to(ctx.out(), ", "); formatter::format(q.y, ctx); fmt::format_to(ctx.out(), ", "); formatter::format(q.z, ctx); return fmt::format_to(ctx.out(), ")"); } }; template struct fmt::formatter> : fmt::formatter { template auto format(const OpenVulkano::Math::Range& range, FormatContext& ctx) const { fmt::format_to(ctx.out(), "["); formatter::format(range.min, ctx); fmt::format_to(ctx.out(), ", "); formatter::format(range.max, ctx); return fmt::format_to(ctx.out(), "]"); } }; template<> struct fmt::formatter : fmt::formatter { template constexpr auto parse(ParseContext& ctx) { return ctx.begin(); } template auto format(const OpenVulkano::UUID& uuid, FormatContext& ctx) const { return fmt::format_to(ctx.out(), "{}", uuid.string()); } }; template<> struct fmt::formatter { template constexpr auto parse(ParseContext& ctx) { return ctx.begin(); } template auto format(const OpenVulkano::Math::RGB565& color, FormatContext& ctx) const { return fmt::format_to(ctx.out(), "RGB565(r:{}, g:{}, b:{})", color.r, color.g, color.b); } }; template<> struct fmt::formatter { template constexpr auto parse(ParseContext& ctx) { return ctx.begin(); } template auto format(const OpenVulkano::Math::RGBA5551& color, FormatContext& ctx) const { return fmt::format_to(ctx.out(), "RGBA5551(r:{}, g:{}, b:{}, a:{})", color.r, color.g, color.b, color.a); } }; template struct fmt::formatter> { template constexpr auto parse(ParseContext& ctx) { return ctx.begin(); } template auto format(const OpenVulkano::Math::RGB10A2& color, FormatContext& ctx) const { return fmt::format_to(ctx.out(), "RGB10A2(r:{}, g:{}, b:{}, a:{})", color.r, color.g, color.b, color.a); } }; template struct fmt::formatter> { template constexpr auto parse(ParseContext& ctx) { return ctx.begin(); } template auto format(const OpenVulkano::Math::DenseVector3i& vec, FormatContext& ctx) const { return fmt::format_to(ctx.out(), "DenseVector3i({}, {}, {})", vec.X(), vec.Y(), vec.Z()); } }; template<> struct fmt::formatter { template constexpr auto parse(ParseContext& ctx) { return ctx.begin(); } template auto format(const OpenVulkano::Math::Timestamp& ts, FormatContext& ctx) const { return fmt::format_to(ctx.out(), "{}ns", ts.GetNanos()); } }; template<> struct fmt::formatter : fmt::formatter { template auto format(const UNDERLYING_FLOAT16_TYPE& f, FormatContext& ctx) const { return fmt::formatter::format(static_cast(f), ctx); } }; template<> struct fmt::formatter : fmt::formatter { template auto format(const OpenVulkano::int24& i, FormatContext& ctx) const { return fmt::formatter::format(static_cast(i), ctx); } }; template<> struct fmt::formatter : fmt::formatter { template auto format(const OpenVulkano::uint24& i, FormatContext& ctx) const { return fmt::formatter::format(static_cast(i), ctx); } };