/* 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 ClipRect { std::int_fast32_t left; std::int_fast32_t right; std::int_fast32_t top; std::int_fast32_t bottom; }; 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 struct FrameTime { std::chrono::time_point now; std::chrono::duration delta; }; export enum class OpaqueType { FullyOpaque, // All pixels have A of 255 SemiOpaque, // All pixels have A of 0 or 255 (no blending needed) Transparent // Color blending is used }; 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 double SCALEDOUBLEU = 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 SCALEBOUNDLESSU = std::numeric_limits::max(); export constexpr double SCALEDOUBLEBOUNDLESSU = static_cast(std::numeric_limits::max()); export constexpr std::int_fast32_t FractionalToMapped(double f) { return std::int_fast32_t(f * SCALEDOUBLE); } export constexpr std::uint_fast32_t FractionalToMappedU(double f) { return std::uint_fast32_t(f * SCALEDOUBLEU); } 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 RelativeToAbsolute(std::int_fast32_t relative, std::int_fast32_t full) { return static_cast( (static_cast<__int128>(relative) * full) / SCALE ); } export constexpr std::int_fast32_t BoundToBoundless(std::int_fast32_t bound) { return bound * BOUND; } export constexpr std::int_fast32_t BoundlessToBound(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 std::uint_fast32_t FractionalToMappedBoundlessU(double f) { return std::uint_fast32_t(f * SCALEDOUBLEBOUNDLESSU); } 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 enum class CrafterKeys { // Alphabetic keys A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, // Numeric keys _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, // Function keys F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, // Control keys Escape, Tab, Enter, Space, Backspace, Delete, Insert, Home, End, PageUp, PageDown, CapsLock, NumLock, ScrollLock, // Modifier keys LeftShift, RightShift, LeftCtrl, RightCtrl, LeftAlt, RightAlt, LeftSuper, RightSuper, // Arrow keys Up, Down, Left, Right, // Keypad keys keypad_0, keypad_1, keypad_2, keypad_3, keypad_4, keypad_5, keypad_6, keypad_7, keypad_8, keypad_9, keypad_enter, keypad_plus, keypad_minus, keypad_multiply, keypad_divide, keypad_decimal, // Punctuation and special keys grave, minus, equal, bracket_left, bracket_right, backslash, semicolon, quote, comma, period, slash, print_screen, pause, menu, // Additional keys volume_up, volume_down, volume_mute, media_play, media_stop, media_prev, media_next, browser_back, browser_forward, browser_refresh, browser_stop, browser_search, browser_home, launch_mail, launch_calculator, launch_media_player, CrafterKeysMax }; }