diff --git a/src/graphics/core/PaletteAtlasBuilder.cpp b/src/graphics/core/PaletteAtlasBuilder.cpp new file mode 100644 index 000000000..b87a3cb35 --- /dev/null +++ b/src/graphics/core/PaletteAtlasBuilder.cpp @@ -0,0 +1,26 @@ +#include "PaletteAtlasBuilder.hpp" + +#include "../core/Atlas.hpp" +#include "../core/ImageData.hpp" + +PaletteAtlasBuilder::PaletteAtlasBuilder() = default; + +void PaletteAtlasBuilder::put(const std::string& name, const glm::vec4& color) { + entries[name] = { glm::clamp(color, glm::vec4(0.0f), glm::vec4(1.0f)) }; +} + +std::unique_ptr PaletteAtlasBuilder::build() const { + AtlasBuilder builder; + for (const auto& [name, entry] : entries) { + ubyte data[4] { + static_cast(entry.color.r * 255), + static_cast(entry.color.g * 255), + static_cast(entry.color.b * 255), + static_cast(entry.color.a * 255), + }; + builder.add(name, std::make_unique( + ImageFormat::RGBA8888, 1, 1, data + )); + } + return builder.build(1, true); +} diff --git a/src/graphics/core/PaletteAtlasBuilder.hpp b/src/graphics/core/PaletteAtlasBuilder.hpp new file mode 100644 index 000000000..7fd2077ec --- /dev/null +++ b/src/graphics/core/PaletteAtlasBuilder.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include +#include +#include + +class Atlas; + +class PaletteAtlasBuilder { +public: + struct Entry { + glm::vec4 color; + }; + + PaletteAtlasBuilder(); + + void put(const std::string& name, const glm::vec4& color); + + std::unique_ptr build() const; +private: + std::map entries; +};