From 6a90d6306de83daf59cd98504c7cf5b94ba5eab9 Mon Sep 17 00:00:00 2001 From: IonutParau Date: Sat, 26 Jul 2025 16:45:08 +0200 Subject: [PATCH] color mapping changes --- src/components/screen.c | 48 ++++++++++++++++++++++++++++++++++------- src/emulator.c | 26 ++++++++++++++++++++-- src/neonucleus.h | 6 +++++- src/utils.c | 2 +- 4 files changed, 70 insertions(+), 12 deletions(-) diff --git a/src/components/screen.c b/src/components/screen.c index fc03536..1621bbc 100644 --- a/src/components/screen.c +++ b/src/components/screen.c @@ -360,6 +360,27 @@ void nn_getStd4BitPalette(int color[16]) { color[15] = nni_mcBlack; // black } +void nn_getLegacy4BitPalette(int color[16]) { + // taken from https://github.com/MightyPirates/OpenComputers/blob/master-MC1.12/src/main/scala/li/cil/oc/util/PackedColor.scala + + color[0] = 0xFFFFFF; + color[1] = 0xFFCC33; + color[2] = 0xCC66CC; + color[3] = 0x6699FF; + color[4] = 0xFFFF33; + color[5] = 0x33CC33; + color[6] = 0xFF6699; + color[7] = 0x333333; + color[8] = 0xCCCCCC; + color[9] = 0x336699; + color[10] = 0x9933CC; + color[11] = 0x333399; + color[12] = 0x663300; + color[13] = 0x336600; + color[14] = 0xFF3333; + color[15] = 0x000000; +} + void nn_getStd8BitPalette(int color[256]) { // source: https://ocdoc.cil.li/component:gpu int reds[6] = {0x00, 0x33, 0x66, 0x99, 0xCC, 0xFF}; @@ -399,17 +420,28 @@ static nn_bool_t nni_4bit_did = false; static int nni_8bit_colors[256]; static nn_bool_t nni_8bit_did = false; -int nn_mapDepth(int color, int depth) { +static int nni_4bitl_colors[16]; +static nn_bool_t nni_4bitl_did = false; + +int nn_mapDepth(int color, int depth, nn_bool_t legacy) { if(depth == 1) { - if(color == 0) return nni_mcBlack; - return nni_mcWhite; + if(color == 0) return nni_mcBlack; + return nni_mcWhite; } if(depth == 4) { - if(!nni_4bit_did) { - nni_4bit_did = true; - nn_getStd4BitPalette(nni_4bit_colors); - } - return nn_mapColor(color, nni_4bit_colors, 16); + if(legacy) { + if(!nni_4bitl_did) { + nni_4bitl_did = true; + nn_getLegacy4BitPalette(nni_4bitl_colors); + } + return nn_mapColor(color, nni_4bitl_colors, 16); + } else { + if(!nni_4bit_did) { + nni_4bit_did = true; + nn_getStd4BitPalette(nni_4bit_colors); + } + return nn_mapColor(color, nni_4bit_colors, 16); + } } if(depth == 8) { if(!nni_8bit_did) { diff --git a/src/emulator.c b/src/emulator.c index 8a9413d..720d53f 100644 --- a/src/emulator.c +++ b/src/emulator.c @@ -557,8 +557,11 @@ typedef struct ne_premappedPixel { int mappedFgRes; int mappedBgFor; int mappedBgRes; + nn_bool_t legacyColors; } ne_premappedPixel; +bool ne_legacyColors = false; + ne_premappedPixel ne_getPremap(ne_premappedPixel *pixels, nn_screen *screen, int x, int y) { int maxW, maxH; nn_maxResolution(screen, &maxW, &maxH); @@ -570,6 +573,11 @@ ne_premappedPixel ne_getPremap(ne_premappedPixel *pixels, nn_screen *screen, int nn_scrchr_t pixel = nn_getPixel(screen, x, y); int fg = pixel.fg; int bg = pixel.bg; + + if(premapped.legacyColors != ne_legacyColors) { + premapped.legacyColors = ne_legacyColors; + premapped.mappedDepth = -1; + } if(premapped.mappedDepth != depth) { premapped.mappedDepth = depth; @@ -578,14 +586,15 @@ ne_premappedPixel ne_getPremap(ne_premappedPixel *pixels, nn_screen *screen, int } bool miss = false; + if(premapped.mappedFgFor != fg) { premapped.mappedFgFor = fg; - premapped.mappedFgRes = nn_mapDepth(fg, depth); + premapped.mappedFgRes = nn_mapDepth(fg, depth, ne_legacyColors); miss = true; } if(premapped.mappedBgFor != bg) { premapped.mappedBgFor = bg; - premapped.mappedBgRes = nn_mapDepth(bg, depth); + premapped.mappedBgRes = nn_mapDepth(bg, depth, ne_legacyColors); miss = true; } premapped.codepoint = pixel.codepoint; @@ -914,6 +923,19 @@ int main(int argc, char **argv) { } render: + if(IsKeyPressed(KEY_F1)) { + nn_setDepth(s, 1); + } + if(IsKeyPressed(KEY_F2)) { + nn_setDepth(s, 4); + } + if(IsKeyPressed(KEY_F3)) { + nn_setDepth(s, 8); + } + if(IsKeyPressed(KEY_F4)) { + ne_legacyColors = !ne_legacyColors; + } + BeginDrawing(); ClearBackground(BLACK); diff --git a/src/neonucleus.h b/src/neonucleus.h index 351ee3f..1e8493a 100644 --- a/src/neonucleus.h +++ b/src/neonucleus.h @@ -894,10 +894,14 @@ const char *nn_depthName(int depth); double nn_colorDistance(int colorA, int colorB); int nn_mapColor(int color, int *palette, int paletteSize); -int nn_mapDepth(int color, int depth); +int nn_mapDepth(int color, int depth, nn_bool_t legacy); void nn_getStd4BitPalette(int color[16]); void nn_getStd8BitPalette(int color[256]); +// Std4bit uses actual MC dye colors, except for white and black +// Legacy uses OC's versions that were brightened +void nn_getLegacy4BitPalette(int color[16]); + void nn_setPixel(nn_screen *screen, int x, int y, nn_scrchr_t pixel); nn_scrchr_t nn_getPixel(nn_screen *screen, int x, int y); diff --git a/src/utils.c b/src/utils.c index 1646b6a..97e1f7d 100644 --- a/src/utils.c +++ b/src/utils.c @@ -218,7 +218,7 @@ double nn_colorDistance(int colorA, int colorB) { delta.g = a.g - b.g; delta.b = a.b - b.b; - return delta.r*delta.r + delta.g*delta.g + delta.b*delta.b; + return 0.2126 * delta.r*delta.r + 0.7152 * delta.g*delta.g + 0.0722 * delta.b*delta.b; } int nn_mapColor(int color, int *palette, int paletteSize) {