Vastly improve UI

This commit is contained in:
2024-10-05 09:16:41 -05:00
parent 704002e671
commit 27ce6526e6
10 changed files with 170 additions and 84 deletions

View File

@ -8,6 +8,17 @@
#include "color.h"
#include "assert/assert.h"
const color4f_t COLOR4F_COLOR_MAP[COLOR_COUNT] = {
COLOR4F_BLACK,
COLOR4F_WHITE,
COLOR4F(0.8f, 0.0f, 0.0f, 1.0f),
COLOR4F(0.0f, 0.5f, 0.0f, 1.0f),
COLOR4F(0.0f, 0.0f, 0.8f, 1.0f),
COLOR4F(0.8f, 0.8f, 0.0f, 1.0f),
COLOR4F(0.8f, 0.0f, 0.8f, 1.0f),
COLOR4F(0.0f, 0.8f, 0.8f, 1.0f)
};
void color4fCopy(const color4f_t src, color4f_t dest) {
memcpy(dest, src, sizeof(color4f_t));
}
}

View File

@ -8,6 +8,9 @@
#pragma once
#include "dawn.h"
typedef float_t color3f_t[3];
typedef float_t color4f_t[4];
// Simple colors, used by the frame system.
#define COLOR_BLACK 0x00
#define COLOR_WHITE 0x01
@ -18,10 +21,7 @@
#define COLOR_MAGENTA 0x06
#define COLOR_CYAN 0x07
typedef float_t color3f_t[3];
typedef float_t color4f_t[4];
typedef color4f_t color_t;
#define COLOR_COUNT COLOR_CYAN+1
#define COLOR3F(r,g,b) ((color3f_t){ r, g, b })
#define COLOR3F_RED COLOR3F(1, 0, 0)
@ -68,6 +68,8 @@ typedef color4f_t color_t;
#define COLOR4F_TRANSPARENT_WHITE COLOR4F(1, 1, 1, 0)
#define COLOR4F_TRANSPARENT COLOR4F_TRANSPARENT_BLACK
extern const color4f_t COLOR4F_COLOR_MAP[COLOR_COUNT];
/**
* Copies a color.
*

View File

@ -17,28 +17,7 @@ uint8_t FRAME_COLOR[FRAME_HEIGHT * FRAME_WIDTH];
void frameInit() {
memset(FRAME_BUFFER, ' ', FRAME_HEIGHT * FRAME_WIDTH);
// Draw UI top and bottom borders
for(uint16_t x = 0; x < FRAME_WIDTH; x++) {
char_t c = x == 0 || x == FRAME_WIDTH-1 ? '+' : '-';
int32_t i = (FRAME_HEIGHT - 1) * FRAME_WIDTH + x;
FRAME_BUFFER[i] = c;
FRAME_COLOR[i] = COLOR_WHITE;
i = (FRAME_HEIGHT - FRAME_BOTTOM_UI_HEIGHT) * FRAME_WIDTH + x;
FRAME_BUFFER[i] = c;
FRAME_COLOR[i] = COLOR_WHITE;
}
for(uint16_t y = FRAME_HEIGHT - FRAME_BOTTOM_UI_HEIGHT + 1; y < FRAME_HEIGHT - 1; y++) {
int32_t i = y * FRAME_WIDTH;
FRAME_BUFFER[i] = '|';
FRAME_COLOR[i] = COLOR_WHITE;
i = y * FRAME_WIDTH + FRAME_WIDTH - 1;
FRAME_BUFFER[i] = '|';
FRAME_COLOR[i] = COLOR_WHITE;
}
frameUIReset();
}
void frameUpdate() {
@ -74,21 +53,41 @@ void frameUpdate() {
FRAME_BUFFER[i++] = symbolGetCharByTile(tile);
}
}
}
// UI Area.
if(textboxIsOpen()) {
const char_t *text = TEXTBOX.text;
for(uint16_t x = 1; x < FRAME_WIDTH - 1; x++) {
if(*text == '\0') break;
FRAME_BUFFER[(FRAME_HEIGHT - 2) * FRAME_WIDTH + x] = *text++;
FRAME_COLOR[(FRAME_HEIGHT - 2) * FRAME_WIDTH + x] = COLOR_WHITE;
}
FRAME_BUFFER[(FRAME_HEIGHT * FRAME_WIDTH) - 4] = ' ';
FRAME_BUFFER[(FRAME_HEIGHT * FRAME_WIDTH) - 3] = '>';
FRAME_BUFFER[(FRAME_HEIGHT * FRAME_WIDTH) - 2] = ' ';
} else {
FRAME_BUFFER[(FRAME_HEIGHT * FRAME_WIDTH) - 4] = '-';
FRAME_BUFFER[(FRAME_HEIGHT * FRAME_WIDTH) - 3] = '-';
FRAME_BUFFER[(FRAME_HEIGHT * FRAME_WIDTH) - 2] = '-';
void frameUIReset() {
memset(
FRAME_BUFFER + (FRAME_HEIGHT - FRAME_BOTTOM_UI_HEIGHT) * FRAME_WIDTH,
' ',
FRAME_WIDTH * FRAME_BOTTOM_UI_HEIGHT
);
memset(
FRAME_COLOR + (FRAME_HEIGHT - FRAME_BOTTOM_UI_HEIGHT) * FRAME_WIDTH,
COLOR_WHITE,
FRAME_WIDTH * FRAME_BOTTOM_UI_HEIGHT
);
// Draw UI top and bottom borders
for(uint16_t x = 0; x < FRAME_WIDTH; x++) {
char_t c = x == 0 || x == FRAME_WIDTH-1 ? '+' : '-';
int32_t i = (FRAME_HEIGHT - 1) * FRAME_WIDTH + x;
FRAME_BUFFER[i] = c;
i = (FRAME_HEIGHT - FRAME_BOTTOM_UI_HEIGHT) * FRAME_WIDTH + x;
FRAME_BUFFER[i] = c;
}
// Draw UI left and right borders
for(
uint16_t y = FRAME_HEIGHT - FRAME_BOTTOM_UI_HEIGHT + 1;
y < FRAME_HEIGHT - 1;
y++
) {
int32_t i = y * FRAME_WIDTH;
FRAME_BUFFER[i] = '|';
i = y * FRAME_WIDTH + FRAME_WIDTH - 1;
FRAME_BUFFER[i] = '|';
}
}

View File

@ -14,7 +14,7 @@
#define FRAME_WIDTH FRAME_PIXEL_WIDTH/FRAME_CHAR_SIZE
#define FRAME_HEIGHT FRAME_PIXEL_HEIGHT/FRAME_CHAR_SIZE
#define FRAME_BOTTOM_UI_HEIGHT 6
#define FRAME_BOTTOM_UI_HEIGHT 8
extern char_t FRAME_BUFFER[FRAME_HEIGHT * FRAME_WIDTH];
extern uint8_t FRAME_COLOR[FRAME_HEIGHT * FRAME_WIDTH];
@ -27,4 +27,9 @@ void frameInit();
/**
* Updates the terminal frame.
*/
void frameUpdate();
void frameUpdate();
/**
* Resets the UI area of the frame.
*/
void frameUIReset();

View File

@ -28,7 +28,6 @@ char_t symbolGetCharByTile(const tile_t tile) {
return '#';
case TILE_ID_WATER:
// Take remainder
int32_t j = (int32_t)(TIME.time * 2) % 4;
switch(j) {
case 0: return '/';