You've already forked pico-launcher
mirror of
https://github.com/LNH-team/pico-launcher.git
synced 2026-01-09 16:28:48 -08:00
119 lines
3.5 KiB
C++
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);
|
|
}
|