many improvements

This commit is contained in:
IonutParau 2025-07-04 19:17:09 +02:00
parent 9447da090b
commit df5eeeda7c
2 changed files with 115 additions and 25 deletions

View File

@ -293,20 +293,29 @@ void nn_getStd8BitPalette(int color[256]) {
color[255] = 0xF0F0F0; color[255] = 0xF0F0F0;
} }
static int nni_4bit_colors[16];
static bool nni_4bit_did = false;
static int nni_8bit_colors[256];
static bool nni_8bit_did = false;
int nn_mapDepth(int color, int depth) { int nn_mapDepth(int color, int depth) {
if(depth == 1) { if(depth == 1) {
if(color == 0) return 0; if(color == 0) return 0;
return 0xFFFFFF; return 0xFFFFFF;
} }
if(depth == 4) { if(depth == 4) {
int palette[16]; if(!nni_4bit_did) {
nn_getStd4BitPalette(palette); nni_4bit_did = true;
return nn_mapColor(color, palette, 16); nn_getStd4BitPalette(nni_4bit_colors);
}
return nn_mapColor(color, nni_4bit_colors, 16);
} }
if(depth == 8) { if(depth == 8) {
int palette[256]; if(!nni_8bit_did) {
nn_getStd8BitPalette(palette); nni_8bit_did = true;
return nn_mapColor(color, palette, 256); nn_getStd8BitPalette(nni_8bit_colors);
}
return nn_mapColor(color, nni_8bit_colors, 256);
} }
return color; return color;
} }

View File

@ -502,6 +502,66 @@ int keycode_to_oc(int keycode) {
return 0; return 0;
} }
typedef struct ne_premappedPixel {
int codepoint;
int mappedDepth;
int mappedFgFor;
int mappedFgRes;
int mappedBgFor;
int mappedBgRes;
} ne_premappedPixel;
ne_premappedPixel ne_getPremap(ne_premappedPixel *pixels, nn_screen *screen, int x, int y) {
int maxW, maxH;
nn_maxResolution(screen, &maxW, &maxH);
int depth = nn_getDepth(screen);
int i = y * maxW + x;
ne_premappedPixel premapped = pixels[i];
nn_scrchr_t pixel = nn_getPixel(screen, x, y);
int fg = pixel.fg;
int bg = pixel.bg;
if(premapped.mappedDepth != depth) {
premapped.mappedDepth = depth;
premapped.mappedFgFor = -1;
premapped.mappedBgFor = -1;
}
bool miss = false;
if(premapped.mappedFgFor != fg) {
premapped.mappedFgFor = fg;
premapped.mappedFgRes = nn_mapDepth(fg, depth);
miss = true;
}
if(premapped.mappedBgFor != bg) {
premapped.mappedBgFor = bg;
premapped.mappedBgRes = nn_mapDepth(bg, depth);
miss = true;
}
premapped.codepoint = pixel.codepoint;
pixels[i] = premapped;
return premapped;
}
ne_premappedPixel *ne_allocPremap(int width, int height) {
int len = width * height;
ne_premappedPixel *pixels = malloc(sizeof(ne_premappedPixel) * len);
for(int i = 0; i < len; i++) pixels[i] = (ne_premappedPixel) {
.mappedDepth = -1,
.mappedFgFor = -1,
.mappedBgFor = -1,
};
return pixels;
}
typedef struct ne_pressedKey {
int charcode;
int keycode;
} ne_pressedKey;
int main() { int main() {
printf("Setting up universe\n"); printf("Setting up universe\n");
nn_Alloc alloc = nn_libcAllocator(); nn_Alloc alloc = nn_libcAllocator();
@ -592,11 +652,15 @@ int main() {
nn_addDrive(computer, "drive.img", 4, &genericDrive); nn_addDrive(computer, "drive.img", 4, &genericDrive);
nn_screen *s = nn_newScreen(&alloc, 80, 32, 16, 16, 256); int maxWidth = 80, maxHeight = 32;
nn_screen *s = nn_newScreen(&alloc, maxWidth, maxHeight, 16, 16, 256);
nn_addKeyboard(s, "shitty keyboard"); nn_addKeyboard(s, "shitty keyboard");
nn_mountKeyboard(computer, "shitty keyboard", 2); nn_mountKeyboard(computer, "shitty keyboard", 2);
nn_addScreen(computer, "Main Screen", 2, s); nn_addScreen(computer, "Main Screen", 2, s);
ne_premappedPixel *premap = ne_allocPremap(maxWidth, maxHeight);
// somewhat matches tier 3 in OC in terms of perTick // somewhat matches tier 3 in OC in terms of perTick
nn_gpuControl gpuCtrl = { nn_gpuControl gpuCtrl = {
.totalVRAM = 16*1024, .totalVRAM = 16*1024,
@ -621,16 +685,15 @@ int main() {
Font unscii = LoadFont("unscii-16-full.ttf"); Font unscii = LoadFont("unscii-16-full.ttf");
double lastTime = nn_realTime(); static ne_pressedKey release_check_list[256];
memset(release_check_list, 0, sizeof(ne_pressedKey)*256);
static int release_check_list[256];
memset(release_check_list, 0, sizeof(int)*256);
uint8_t release_check_ptr; uint8_t release_check_ptr;
SetExitKey(KEY_NULL); SetExitKey(KEY_NULL);
while(true) { while(true) {
if(WindowShouldClose()) break; if(WindowShouldClose()) break;
nn_setEnergyInfo(computer, 5000, 5000);
while (true) { // TODO: find out if we can check if the keycode and unicode are for the same key event or not while (true) { // TODO: find out if we can check if the keycode and unicode are for the same key event or not
int keycode = GetKeyPressed(); int keycode = GetKeyPressed();
@ -641,7 +704,9 @@ int main() {
} }
if (keycode != 0) { if (keycode != 0) {
release_check_list[release_check_ptr++] = keycode; release_check_list[release_check_ptr].keycode = keycode;
release_check_list[release_check_ptr].charcode = unicode;
release_check_ptr++;
} }
nn_value values[5]; nn_value values[5];
@ -661,15 +726,15 @@ int main() {
} }
for (int i = 0; i < 256; i++) { for (int i = 0; i < 256; i++) {
int key = release_check_list[i]; ne_pressedKey *key = release_check_list + i;
if (key != 0) { if (key->keycode != 0) {
if (IsKeyReleased(key)) { if (IsKeyPressedRepeat(key->keycode)) {
// omg // omg
nn_value values[5]; nn_value values[5];
values[0] = nn_values_cstring("key_up"); values[0] = nn_values_cstring("key_down");
values[1] = nn_values_cstring("shitty keyboard"); values[1] = nn_values_cstring("shitty keyboard");
values[2] = nn_values_integer(0); // we can't really know, unless we store it, which i am way too lazy to do. values[2] = nn_values_integer(key->charcode);
values[3] = nn_values_integer(keycode_to_oc(key)); values[3] = nn_values_integer(keycode_to_oc(key->keycode));
values[4] = nn_values_cstring("USER"); values[4] = nn_values_cstring("USER");
const char* error = nn_pushSignal(computer, values, 5); const char* error = nn_pushSignal(computer, values, 5);
@ -679,13 +744,27 @@ int main() {
printf("error happened when eventing the keyboarding: %s\n", error);;;;;; printf("error happened when eventing the keyboarding: %s\n", error);;;;;;
} }
} }
if (IsKeyReleased(key->keycode)) {
// omg
nn_value values[5];
values[0] = nn_values_cstring("key_up");
values[1] = nn_values_cstring("shitty keyboard");
values[2] = nn_values_integer(key->charcode);
values[3] = nn_values_integer(keycode_to_oc(key->keycode));
values[4] = nn_values_cstring("USER");
const char* error = nn_pushSignal(computer, values, 5);
if (error != NULL) {
// well fuck
printf("error happened when eventing the keyboarding: %s\n", error);;;;;;
}
key->keycode = 0;
}
} }
} }
double now = nn_realTime(); double dt = GetFrameTime();
double dt = now - lastTime;
if(dt == 0) dt = 1.0/60;
lastTime = now;
double heat = nn_getTemperature(computer); double heat = nn_getTemperature(computer);
double roomHeat = nn_getRoomTemperature(computer); double roomHeat = nn_getRoomTemperature(computer);
@ -730,11 +809,11 @@ render:
for(size_t x = 0; x < scrW; x++) { for(size_t x = 0; x < scrW; x++) {
for(size_t y = 0; y < scrH; y++) { for(size_t y = 0; y < scrH; y++) {
nn_scrchr_t p = nn_getPixel(s, x, y); ne_premappedPixel p = ne_getPremap(premap, s, x, y);
// fuck palettes // fuck palettes
Color fgColor = ne_processColor(nn_mapDepth(p.fg, depth)); Color fgColor = ne_processColor(p.mappedFgRes);
Color bgColor = ne_processColor(nn_mapDepth(p.bg, depth)); Color bgColor = ne_processColor(p.mappedBgRes);
DrawRectangle(x * pixelWidth, y * pixelHeight, pixelWidth, pixelHeight, bgColor); DrawRectangle(x * pixelWidth, y * pixelHeight, pixelWidth, pixelHeight, bgColor);
DrawTextCodepoint(unscii, p.codepoint, (Vector2) {x * pixelWidth, y * pixelHeight}, pixelHeight - 5, fgColor); DrawTextCodepoint(unscii, p.codepoint, (Vector2) {x * pixelWidth, y * pixelHeight}, pixelHeight - 5, fgColor);
} }
@ -748,6 +827,7 @@ render:
size_t memTotal = nn_getComputerMemoryTotal(computer); size_t memTotal = nn_getComputerMemoryTotal(computer);
DrawText(TextFormat("Heat: %.02lf Memory Used: %.2lf%%", heat, (double)memUsage / memTotal * 100), 10, GetScreenHeight() - 30, 20, heatColor); DrawText(TextFormat("Heat: %.02lf Memory Used: %.2lf%%", heat, (double)memUsage / memTotal * 100), 10, GetScreenHeight() - 30, 20, heatColor);
DrawFPS(10, 10);
EndDrawing(); EndDrawing();
} }
@ -756,5 +836,6 @@ render:
nn_deleteComputer(computer); nn_deleteComputer(computer);
nn_unsafeDeleteUniverse(universe); nn_unsafeDeleteUniverse(universe);
CloseWindow(); CloseWindow();
free(premap);
return 0; return 0;
} }