sandbox
Loading...
Searching...
No Matches
sprites_module.hpp
1// SPDX-License-Identifier: MIT
2#ifndef LIBSBX_SPRITES_SPRITES_MODULE_HPP_
3#define LIBSBX_SPRITES_SPRITES_MODULE_HPP_
4
5#include <vector>
6#include <variant>
7#include <array>
8#include <algorithm>
9
10#include <magic_enum/magic_enum.hpp>
11
12#include <libsbx/utility/enum.hpp>
13#include <libsbx/utility/overload.hpp>
14
15#include <libsbx/core/engine.hpp>
16
17#include <libsbx/math/vector2.hpp>
18#include <libsbx/math/vector3.hpp>
19#include <libsbx/math/matrix4x4.hpp>
20
21#include <libsbx/graphics/images/image.hpp>
22#include <libsbx/graphics/images/separate_image2d_array.hpp>
23
24#include <libsbx/scenes/scenes_module.hpp>
25
26namespace sbx::sprites {
27
28enum class sprite_space : std::uint32_t {
29 screen_overlay = 0,
30 screen_camera = 1,
31 world = 2
32}; // enum class sprite_space
33
35 math::color base_color{1.0f, 1.0f, 1.0f, 1.0f};
36 graphics::image2d_handle albedo_image{};
37 math::color emissive_factor{0.0f, 0.0f, 0.0f, 1.0f};
38 float emissive_strength{0.0f};
39 graphics::image2d_handle emissive_image{};
40 math::vector2 size{100.0f, 100.0f};
41 math::vector2 pivot{0.5f, 0.5f};
42 math::vector2 position{0.0f, 0.0f};
43 std::int32_t sort_order{0};
44}; // struct screen_overlay_sprite
45
47 math::color base_color{1.0f, 1.0f, 1.0f, 1.0f};
48 graphics::image2d_handle albedo_image{};
49 math::color emissive_factor{0.0f, 0.0f, 0.0f, 1.0f};
50 float emissive_strength{0.0f};
51 graphics::image2d_handle emissive_image{};
52 math::vector2 size{100.0f, 100.0f};
53 math::vector2 pivot{0.5f, 0.5f};
54 math::vector2 position{0.0f, 0.0f};
55 float depth{0.0f};
56 std::int32_t sort_order{0};
57}; // struct screen_camera_sprite
58
60 math::color base_color{1.0f, 1.0f, 1.0f, 1.0f};
61 graphics::image2d_handle albedo_image{};
62 math::color emissive_factor{0.0f, 0.0f, 0.0f, 1.0f};
63 float emissive_strength{0.0f};
64 graphics::image2d_handle emissive_image{};
65 math::vector2 size{1.0f, 1.0f};
66 math::vector2 pivot{0.5f, 0.5f};
67 bool is_billboard{false};
68}; // struct world_sprite
69
70using sprite = std::variant<screen_overlay_sprite, screen_camera_sprite, world_sprite>;
71
72[[nodiscard]] inline auto get_sprite_space(const sprite& sprite) -> sprite_space {
73 return static_cast<sprite_space>(sprite.index());
74}
75
77
78public:
79
80 inline static constexpr auto flag_is_billboard = 0x00000001u;
81 inline static constexpr auto flag_msdf_text = 0x00000002u;
82
84 math::matrix4x4 model;
85 math::color base_color;
86 math::color emissive_factor;
87 math::vector2 size;
88 math::vector2 pivot;
89 math::vector2 uv_min;
90 math::vector2 uv_max;
91 std::float_t emissive_strength;
92 std::uint32_t albedo_image_index;
93 std::uint32_t emissive_image_index;
94 std::int32_t sort_order;
95 std::uint32_t flags;
96 std::float_t sdf_px_range;
97 std::uint32_t padding0;
98 std::uint32_t padding1;
99 }; // struct sprite_instance
100
101 sprite_batch() = default;
102
103 auto clear() -> void;
104
105 auto add(const sprite_instance& instance) -> void;
106
107 auto sort() -> void;
108
109 [[nodiscard]] auto instances() const -> const std::vector<sprite_instance>&;
110
111 [[nodiscard]] auto size() const -> std::size_t;
112
113 [[nodiscard]] auto is_empty() const -> bool;
114
115 [[nodiscard]] auto data() const -> const sprite_instance*;
116
117 [[nodiscard]] auto byte_size() const -> std::size_t;
118
119private:
120
121 std::vector<sprite_instance> _instances;
122
123}; // class sprite_batch
124
125class sprites_module : public core::module<sprites_module> {
126
127 inline static constexpr auto mode_count = magic_enum::enum_count<sprite_space>();
128
129 inline static const auto is_registered = register_module(stage::normal, dependencies<scenes::scenes_module>{});
130
131public:
132
134
135 ~sprites_module() override = default;
136
137 auto update() -> void override;
138
139 auto submit(sprite_space space, const sprite_batch::sprite_instance& instance) -> void;
140
141 [[nodiscard]] auto register_image(graphics::image2d_handle image) -> std::uint32_t;
142
143 [[nodiscard]] auto register_image(const std::string& attachment) -> std::uint32_t;
144
145 [[nodiscard]] auto batch(sprite_space space) -> sprite_batch&;
146
147 [[nodiscard]] auto batch(sprite_space space) const -> const sprite_batch&;
148
149 [[nodiscard]] auto images() -> graphics::separate_image2d_array&;
150
151 [[nodiscard]] auto images() const -> const graphics::separate_image2d_array&;
152
153private:
154
155 auto _collect_sprites() -> void;
156
157 std::array<sprite_batch, mode_count> _batches;
159
160}; // class sprites_module
161
162} // namespace sbx::sprites
163
164#endif // LIBSBX_SPRITES_SPRITES_MODULE_HPP_
Definition: resource_storage.hpp:18
Definition: separate_image2d_array.hpp:16
Definition: matrix4x4.hpp:26
A vector in two-dimensional space.
Definition: vector2.hpp:28
RGBA color value type.
Definition: color.hpp:48
Definition: sprites_module.hpp:76
Definition: sprites_module.hpp:125
Definition: sprites_module.hpp:46
Definition: sprites_module.hpp:34
Definition: sprites_module.hpp:83
Definition: sprites_module.hpp:59