Time stuff
This commit is contained in:
12
src/dusksdl2/display/ui/CMakeLists.txt
Normal file
12
src/dusksdl2/display/ui/CMakeLists.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
# Copyright (c) 2025 Dominic Masters
|
||||
#
|
||||
# This software is released under the MIT License.
|
||||
# https://opensource.org/licenses/MIT
|
||||
|
||||
# Sources
|
||||
target_sources(${DUSK_TARGET_NAME}
|
||||
PRIVATE
|
||||
renderconsole.c
|
||||
renderfps.c
|
||||
rendertext.c
|
||||
)
|
||||
29
src/dusksdl2/display/ui/renderconsole.c
Normal file
29
src/dusksdl2/display/ui/renderconsole.c
Normal file
@@ -0,0 +1,29 @@
|
||||
/**
|
||||
* Copyright (c) 2025 Dominic Masters
|
||||
*
|
||||
* This software is released under the MIT License.
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#include "renderconsole.h"
|
||||
#include "console/console.h"
|
||||
#include "display/ui/rendertext.h"
|
||||
|
||||
void renderConsoleDraw(void) {
|
||||
if(!CONSOLE.visible) return;
|
||||
|
||||
int32_t i = 0;
|
||||
char_t *line;
|
||||
do {
|
||||
line = CONSOLE.line[i];
|
||||
if(line[0] == '\0') {
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
renderTextDraw(
|
||||
0, (CONSOLE_HISTORY_MAX - i - 1) * FONT_TILE_HEIGHT, line,
|
||||
0xFF, 0xFF, 0xFF
|
||||
);
|
||||
i++;
|
||||
} while(i < CONSOLE_HISTORY_MAX);
|
||||
}
|
||||
14
src/dusksdl2/display/ui/renderconsole.h
Normal file
14
src/dusksdl2/display/ui/renderconsole.h
Normal file
@@ -0,0 +1,14 @@
|
||||
/**
|
||||
* Copyright (c) 2025 Dominic Masters
|
||||
*
|
||||
* This software is released under the MIT License.
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include "dusksdl2.h"
|
||||
|
||||
/**
|
||||
* Draws the console overlay.
|
||||
*/
|
||||
void renderConsoleDraw(void);
|
||||
28
src/dusksdl2/display/ui/renderfps.c
Normal file
28
src/dusksdl2/display/ui/renderfps.c
Normal file
@@ -0,0 +1,28 @@
|
||||
/**
|
||||
* Copyright (c) 2025 Dominic Masters
|
||||
*
|
||||
* This software is released under the MIT License.
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#include "renderfps.h"
|
||||
#include "display/ui/rendertext.h"
|
||||
#include "time.h"
|
||||
|
||||
void renderFPSDraw(void) {
|
||||
float_t fps = 1.0f / TIME.delta;
|
||||
|
||||
char_t buffer[32];
|
||||
snprintf(buffer, sizeof(buffer), "FPS: %.1f", fps);
|
||||
|
||||
if(fps >= 50.0f) {
|
||||
// Green
|
||||
renderTextDraw(0, 0, buffer, 0x00, 0xFF, 0x00);
|
||||
} else if(fps >= 30.0f) {
|
||||
// Yellow
|
||||
renderTextDraw(0, 0, buffer, 0xFF, 0xFF, 0x00);
|
||||
} else {
|
||||
// Red
|
||||
renderTextDraw(0, 0, buffer, 0xFF, 0x00, 0x00);
|
||||
}
|
||||
}
|
||||
13
src/dusksdl2/display/ui/renderfps.h
Normal file
13
src/dusksdl2/display/ui/renderfps.h
Normal file
@@ -0,0 +1,13 @@
|
||||
/**
|
||||
* Copyright (c) 2025 Dominic Masters
|
||||
*
|
||||
* This software is released under the MIT License.
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
/**
|
||||
* Draws the FPS overlay.
|
||||
*/
|
||||
void renderFPSDraw(void);
|
||||
122
src/dusksdl2/display/ui/rendertext.c
Normal file
122
src/dusksdl2/display/ui/rendertext.c
Normal file
@@ -0,0 +1,122 @@
|
||||
/**
|
||||
* Copyright (c) 2025 Dominic Masters
|
||||
*
|
||||
* This software is released under the MIT License.
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#include "rendertext.h"
|
||||
#include "display/render.h"
|
||||
#include "assert/assert.h"
|
||||
#include "display/spritebatch/spritebatch.h"
|
||||
#include "util/memory.h"
|
||||
#include "util/math.h"
|
||||
|
||||
texture_t RENDER_TEXT_TEXTURE;
|
||||
|
||||
static mesh_t RENDER_TEXT_QUAD_MESH;
|
||||
|
||||
void renderTextInit(void) {
|
||||
const int32_t cols = FONT_COLUMN_COUNT;
|
||||
const int32_t rows = (FONT_TILE_COUNT + cols - 1) / cols;
|
||||
const int32_t inputFontWidth = cols * FONT_TILE_WIDTH;
|
||||
const int32_t inputFontHeight = rows * FONT_TILE_HEIGHT;
|
||||
|
||||
int32_t outputFontWidth = inputFontWidth;
|
||||
int32_t outputFontHeight = inputFontHeight;
|
||||
|
||||
// Round up to nearest power of 2
|
||||
#if PSP
|
||||
outputFontWidth = mathNextPowTwo(inputFontWidth);
|
||||
outputFontHeight = mathNextPowTwo(inputFontHeight);
|
||||
#endif
|
||||
|
||||
uint8_t *pixels = (uint8_t *)memoryAllocate(
|
||||
outputFontWidth * outputFontHeight *
|
||||
4 * sizeof(uint8_t)
|
||||
);
|
||||
|
||||
// Buffer the pixels.
|
||||
for(int tileIndex = 0; tileIndex < FONT_TILE_COUNT; ++tileIndex) {
|
||||
const int32_t tileX = (tileIndex % FONT_COLUMN_COUNT) * FONT_TILE_WIDTH;
|
||||
const int32_t tileY = (tileIndex / FONT_COLUMN_COUNT) * FONT_TILE_HEIGHT;
|
||||
const uint8_t* tile = TILE_PIXEL_DATA[tileIndex];
|
||||
|
||||
for (int y = 0; y < FONT_TILE_HEIGHT; ++y) {
|
||||
for (int x = 0; x < FONT_TILE_WIDTH; ++x) {
|
||||
const int32_t pixel = (tileY + y) * outputFontWidth + (tileX + x);
|
||||
const int32_t pixelOffset = pixel * 4;
|
||||
uint8_t value = tile[y * FONT_TILE_WIDTH + x];
|
||||
pixels[pixelOffset + 0] = value ? 0xFF : 0x00; // Red channel
|
||||
pixels[pixelOffset + 1] = value ? 0xFF : 0x00; // Green channel
|
||||
pixels[pixelOffset + 2] = value ? 0xFF : 0x00; // Blue channel
|
||||
pixels[pixelOffset + 3] = value ? 0xFF : 0x00; // Alpha channel
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
textureInit(&RENDER_TEXT_TEXTURE, outputFontWidth, outputFontHeight, pixels);
|
||||
memoryFree(pixels);
|
||||
}
|
||||
|
||||
void renderTextDrawChar(
|
||||
const float_t x,
|
||||
const float_t y,
|
||||
const char_t c,
|
||||
const uint8_t r,
|
||||
const uint8_t g,
|
||||
const uint8_t b
|
||||
) {
|
||||
int32_t tileIndex = (int32_t)(c) - FONT_CHAR_START;
|
||||
assertTrue(
|
||||
tileIndex >= 0 && tileIndex < FONT_TILE_COUNT,
|
||||
"Character is out of bounds for font tiles"
|
||||
);
|
||||
|
||||
const float_t w = (float)RENDER_TEXT_TEXTURE.width;
|
||||
const float_t h = (float)RENDER_TEXT_TEXTURE.height;
|
||||
const int32_t tileX = (tileIndex % FONT_COLUMN_COUNT);
|
||||
const int32_t tileY = (tileIndex / FONT_COLUMN_COUNT);
|
||||
|
||||
spriteBatchPush(
|
||||
&RENDER_TEXT_TEXTURE,
|
||||
x, y,
|
||||
x + FONT_TILE_WIDTH, y + FONT_TILE_HEIGHT,
|
||||
r, g, b, 0xFF,
|
||||
(tileX * FONT_TILE_WIDTH) / w,
|
||||
(tileY * FONT_TILE_HEIGHT) / h,
|
||||
((tileX + 1) * FONT_TILE_WIDTH) / w,
|
||||
((tileY + 1) * FONT_TILE_HEIGHT) / h
|
||||
);
|
||||
}
|
||||
|
||||
void renderTextDraw(
|
||||
const float_t x,
|
||||
const float_t y,
|
||||
const char_t *text,
|
||||
const uint8_t r,
|
||||
const uint8_t g,
|
||||
const uint8_t b
|
||||
) {
|
||||
assertNotNull(text, "Text cannot be NULL");
|
||||
|
||||
float_t posX = x;
|
||||
float_t posY = y;
|
||||
|
||||
char_t c;
|
||||
int32_t i = 0;
|
||||
while((c = text[i++]) != '\0') {
|
||||
if(c == '\n') {
|
||||
posX = x;
|
||||
posY += FONT_TILE_HEIGHT;
|
||||
continue;
|
||||
}
|
||||
|
||||
renderTextDrawChar(posX, posY, c, r, g, b);
|
||||
posX += FONT_TILE_WIDTH;
|
||||
}
|
||||
}
|
||||
|
||||
void renderTextDispose(void) {
|
||||
textureDispose(&RENDER_TEXT_TEXTURE);
|
||||
}
|
||||
61
src/dusksdl2/display/ui/rendertext.h
Normal file
61
src/dusksdl2/display/ui/rendertext.h
Normal file
@@ -0,0 +1,61 @@
|
||||
/**
|
||||
* Copyright (c) 2025 Dominic Masters
|
||||
*
|
||||
* This software is released under the MIT License.
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include "dusksdl2.h"
|
||||
#include "ui/font.h"
|
||||
#include "display/texture/texture.h"
|
||||
|
||||
extern texture_t RENDER_TEXT_TEXTURE;
|
||||
|
||||
/**
|
||||
* Initializes the text rendering system.
|
||||
*/
|
||||
void renderTextInit(void);
|
||||
|
||||
/**
|
||||
* Draws a single character at the specified position.
|
||||
*
|
||||
* @param x The x-coordinate to draw the character at.
|
||||
* @param y The y-coordinate to draw the character at.
|
||||
* @param c The character to draw.
|
||||
* @param r The red component of the color (0-255).
|
||||
* @param g The green component of the color (0-255).
|
||||
* @param b The blue component of the color (0-255).
|
||||
*/
|
||||
void renderTextDrawChar(
|
||||
const float_t x,
|
||||
const float_t y,
|
||||
const char_t c,
|
||||
const uint8_t r,
|
||||
const uint8_t g,
|
||||
const uint8_t b
|
||||
);
|
||||
|
||||
/**
|
||||
* Draws a string of text at the specified position.
|
||||
*
|
||||
* @param x The x-coordinate to draw the text at.
|
||||
* @param y The y-coordinate to draw the text at.
|
||||
* @param text The null-terminated string of text to draw.
|
||||
* @param r The red component of the color (0-255).
|
||||
* @param g The green component of the color (0-255).
|
||||
* @param b The blue component of the color (0-255).
|
||||
*/
|
||||
void renderTextDraw(
|
||||
const float_t x,
|
||||
const float_t y,
|
||||
const char_t *text,
|
||||
const uint8_t r,
|
||||
const uint8_t g,
|
||||
const uint8_t b
|
||||
);
|
||||
|
||||
/**
|
||||
* Disposes of the text rendering system, freeing any allocated resources.
|
||||
*/
|
||||
void renderTextDispose(void);
|
||||
Reference in New Issue
Block a user