Files
pico-launcher/arm9/source/gui/Rgb6Palette.cpp
2025-11-25 17:41:31 +01:00

119 lines
3.5 KiB
C++

#include "common.h"
#include "gui/VramContext.h"
#include "gui/Gx.h"
#include "core/math/ColorConverter.h"
#include "Rgb6Palette.h"
#define PLTT_IDX_15 0
#define PLTT_IDX_30 1
#define PLTT_IDX_31 2
struct color_mapping_t
{
u8 vtxColorComponent;
u8 plttIdx;
};
static const color_mapping_t sMappingTable[64] =
{
{ 0, PLTT_IDX_31 }, // 0
{ 1, PLTT_IDX_15 }, // 1
{ 2, PLTT_IDX_15 }, // 2
{ 1, PLTT_IDX_31 }, // 3
{ 4, PLTT_IDX_15 }, // 4
{ 2, PLTT_IDX_31 }, // 5
{ 6, PLTT_IDX_15 }, // 6
{ 3, PLTT_IDX_31 }, // 7
{ 8, PLTT_IDX_15 }, // 8
{ 4, PLTT_IDX_31 }, // 9
{ 10, PLTT_IDX_15 }, // 10
{ 5, PLTT_IDX_31 }, // 11
{ 12, PLTT_IDX_15 }, // 12
{ 6, PLTT_IDX_31 }, // 13
{ 14, PLTT_IDX_15 }, // 14
{ 7, PLTT_IDX_31 }, // 15
{ 16, PLTT_IDX_15 }, // 16
{ 8, PLTT_IDX_31 }, // 17
{ 18, PLTT_IDX_15 }, // 18
{ 9, PLTT_IDX_31 }, // 19
{ 20, PLTT_IDX_15 }, // 20
{ 10, PLTT_IDX_31 }, // 21
{ 22, PLTT_IDX_15 }, // 22
{ 11, PLTT_IDX_31 }, // 23
{ 24, PLTT_IDX_15 }, // 24
{ 12, PLTT_IDX_31 }, // 25
{ 26, PLTT_IDX_15 }, // 26
{ 13, PLTT_IDX_31 }, // 27
{ 28, PLTT_IDX_15 }, // 28
{ 14, PLTT_IDX_31 }, // 29
{ 30, PLTT_IDX_15 }, // 30
{ 15, PLTT_IDX_31 }, // 31
{ 16, PLTT_IDX_30 }, // 32
{ 16, PLTT_IDX_31 }, // 33
{ 17, PLTT_IDX_30 }, // 34
{ 17, PLTT_IDX_31 }, // 35
{ 18, PLTT_IDX_30 }, // 36
{ 18, PLTT_IDX_31 }, // 37
{ 19, PLTT_IDX_30 }, // 38
{ 19, PLTT_IDX_31 }, // 39
{ 20, PLTT_IDX_30 }, // 40
{ 20, PLTT_IDX_31 }, // 41
{ 21, PLTT_IDX_30 }, // 42
{ 21, PLTT_IDX_31 }, // 43
{ 22, PLTT_IDX_30 }, // 44
{ 22, PLTT_IDX_31 }, // 45
{ 23, PLTT_IDX_30 }, // 46
{ 23, PLTT_IDX_31 }, // 47
{ 24, PLTT_IDX_30 }, // 48
{ 24, PLTT_IDX_31 }, // 49
{ 25, PLTT_IDX_30 }, // 50
{ 25, PLTT_IDX_31 }, // 51
{ 26, PLTT_IDX_30 }, // 52
{ 26, PLTT_IDX_31 }, // 53
{ 27, PLTT_IDX_30 }, // 54
{ 27, PLTT_IDX_31 }, // 55
{ 28, PLTT_IDX_30 }, // 56
{ 28, PLTT_IDX_31 }, // 57
{ 29, PLTT_IDX_30 }, // 58
{ 29, PLTT_IDX_31 }, // 59
{ 30, PLTT_IDX_30 }, // 60
{ 31, PLTT_IDX_30 }, // 61
{ 31, PLTT_IDX_30 }, // 62 -> 61
{ 31, PLTT_IDX_31 } // 63
};
void Rgb6Palette::UploadGraphics(const VramContext& vramContext)
{
const auto paletteVramManager = vramContext.GetTexPlttVramManager();
if (paletteVramManager)
{
_vramOffset = paletteVramManager->Alloc(432);
static const u8 colorValues[3] = { 15, 30, 31 };
for (int r = 0; r < 3; r++)
{
for (int g = 0; g < 3; g++)
{
for (int b = 0; b < 3; b++)
{
int index = b * 3 * 3 + g * 3 + r;
paletteVramManager->GetVramAddress(_vramOffset)[index * 8]
= ColorConverter::ToXBGR555(Rgb<5, 5, 5>(colorValues[r], colorValues[g], colorValues[b]));
}
}
}
}
}
void Rgb6Palette::ApplyColor(const Rgb<6,6,6>& color) const
{
const auto& rConversion = sMappingTable[color.r];
const auto& gConversion = sMappingTable[color.g];
const auto& bConversion = sMappingTable[color.b];
Gx::Color(ColorConverter::ToXBGR555(Rgb<5, 5, 5>(
rConversion.vtxColorComponent, gConversion.vtxColorComponent, bConversion.vtxColorComponent)));
u32 colorOffset = bConversion.plttIdx * 3 * 3 + gConversion.plttIdx * 3 + rConversion.plttIdx;
Gx::TexPlttBase((_vramOffset >> 4) + colorOffset);
}