/* Crafter®.Graphics 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 */ export module Crafter.Graphics:Types; import std; namespace Crafter { export struct MousePoint { std::int_fast32_t x; std::int_fast32_t y; }; export struct MouseMoveEvent { MousePoint lastMousePos; MousePoint currentMousePos; MousePoint mouseDelta; }; export struct ScaleData { std::int_fast32_t x; std::int_fast32_t y; std::int_fast32_t width; std::int_fast32_t height; }; export struct __attribute__((packed)) Pixel_BU8_GU8_RU8_AU8 { std::uint8_t b; std::uint8_t g; std::uint8_t r; std::uint8_t a; }; export struct __attribute__((packed)) Pixel_RU8_GU8_BU8_AU8 { std::uint8_t r; std::uint8_t g; std::uint8_t b; std::uint8_t a; }; export struct __attribute__((packed)) Vertex { float x; float y; float z; float w; }; export struct __attribute__((packed)) VertexUV { float x; float y; float z; float w; float u; float v; float pad[2]; }; export struct __attribute__((packed)) VertexRGBA { float x; float y; float z; float w; float r; float g; float b; float a; }; export struct __attribute__((packed)) HeightRGBA { float height; float pad[3]; float r; float g; float b; float a; }; export constexpr std::int_fast32_t BOUND = 9; export constexpr std::int_fast32_t SCALE = std::numeric_limits::max() / BOUND; export constexpr double SCALEDOUBLE = static_cast(std::numeric_limits::max()) / BOUND; export constexpr std::int_fast32_t SCALEBOUNDLESS = std::numeric_limits::max(); export constexpr double SCALEDOUBLEBOUNDLESS = static_cast(std::numeric_limits::max()); export constexpr std::int_fast32_t FractionalToMapped(double f) { return std::int_fast32_t(f * SCALEDOUBLE); } export constexpr double MappedToFractional(std::int_fast32_t mapped) { return static_cast(mapped) / SCALEDOUBLE; } export constexpr std::int_fast32_t MappedToPixel(std::int_fast32_t mapped, std::int_fast32_t width) { return mapped / (SCALE / width); } export constexpr std::int_fast32_t PixelToMapped(std::int_fast32_t pixel, std::int_fast32_t width) { return pixel * (SCALE / width); } export constexpr std::int_fast32_t BoundToBoundless(std::int_fast32_t bound) { return bound * BOUND; } export constexpr std::int_fast32_t FractionalToMappedBoundless(double f) { return std::int_fast32_t(f * SCALEDOUBLEBOUNDLESS); } export constexpr double MappedToFractionalBoundless(std::int_fast32_t mapped) { return static_cast(mapped) / SCALEDOUBLEBOUNDLESS; } export constexpr std::int_fast32_t MappedToPixelBoundless(std::int_fast32_t mapped, std::int_fast32_t width) { return mapped / (SCALEBOUNDLESS / width); } export constexpr std::int_fast32_t PixelToMappedBoundless(std::int_fast32_t pixel, std::int_fast32_t width) { return pixel * (SCALEBOUNDLESS / width); } // export constexpr double bound = 10; // export constexpr std::uint_fast32_t FractionalToMapped(double fractional) { // constexpr double min_x = -bound; // constexpr double max_x = bound + 1.0; // constexpr double range_x = max_x - min_x; // constexpr double MAXD = static_cast( // std::numeric_limits::max() // ); // // Normalize to [0,1] // double t = (fractional - min_x) / range_x; // // Clamp (important for constexpr safety and edge behavior) // if (t < 0.0) t = 0.0; // if (t > 1.0) t = 1.0; // return static_cast(t * MAXD); // } // export constexpr double MappedToFractional(std::uint_fast32_t mapped) { // constexpr double min_x = -bound; // constexpr double max_x = bound + 1.0; // constexpr double range_x = max_x - min_x; // constexpr double MAXD = static_cast( // std::numeric_limits::max() // ); // double t = static_cast(mapped) / MAXD; // return min_x + t * range_x; // } // export constexpr std::int_fast32_t MappedToPixel(std::uint_fast32_t mapped, std::uint_fast32_t size) { // constexpr double MAXD = static_cast( // std::numeric_limits::max() // ); // // scale mapped ∈ [0, MAX] to pixel ∈ [0, size] // double t = static_cast(mapped) / MAXD; // // Clamp (shouldn't be necessary, but protects constexpr eval) // if (t < 0.0) t = 0.0; // if (t > 1.0) t = 1.0; // return static_cast(t * static_cast(size)); // } }