diff --git a/src/display/camera.c b/src/display/camera.c index f43cfb1..9582815 100644 --- a/src/display/camera.c +++ b/src/display/camera.c @@ -11,6 +11,10 @@ #include "display/framebuffer/framebuffer.h" void cameraInit(camera_t *camera) { + cameraInitPerspective(camera); +} + +void cameraInitPerspective(camera_t *camera) { assertNotNull(camera, "Not a camera component"); camera->projType = CAMERA_PROJECTION_TYPE_PERSPECTIVE; @@ -24,6 +28,22 @@ void cameraInit(camera_t *camera) { glm_vec3_copy((vec3){ 0.0f, 0.0f, 0.0f }, camera->lookat.target); } +void cameraInitOrthographic(camera_t *camera) { + assertNotNull(camera, "Not a camera component"); + + camera->projType = CAMERA_PROJECTION_TYPE_ORTHOGRAPHIC; + camera->orthographic.left = 0.0f; + camera->orthographic.right = (float_t)frameBufferGetWidth(FRAMEBUFFER_BOUND); + camera->orthographic.bottom = 0.0f; + camera->orthographic.top = (float_t)frameBufferGetHeight(FRAMEBUFFER_BOUND); + camera->nearClip = -1.0f; + camera->farClip = 1.0f; + + camera->viewType = CAMERA_VIEW_TYPE_2D; + glm_vec3_copy((vec3){ 0.0f, 0.0f, 0.0f }, camera->_2d.position); + camera->_2d.zoom = 1.0f; +} + void cameraPushMatrix(camera_t *camera) { assertNotNull(camera, "Not a camera component"); diff --git a/src/display/camera.h b/src/display/camera.h index 0c7231d..8fc7bce 100644 --- a/src/display/camera.h +++ b/src/display/camera.h @@ -59,10 +59,20 @@ typedef struct { } camera_t; /** - * Initializes a camera to default values. + * Initializes a camera to default values. This calls cameraInitPerspective. */ void cameraInit(camera_t *camera); +/** + * Initializes a camera for perspective projection. + */ +void cameraInitPerspective(camera_t *camera); + +/** + * Initializes a camera for orthographic projection. + */ +void cameraInitOrthographic(camera_t *camera); + /** * Pushes the camera's view matrix onto the matrix stack. * diff --git a/src/display/display.c b/src/display/display.c index f6ab470..d9e1166 100644 --- a/src/display/display.c +++ b/src/display/display.c @@ -63,6 +63,11 @@ errorret_t displayInit(void) { glEnableClientState(GL_VERTEX_ARRAY); #endif + // Commands + + // Variables + consoleRegVar("fps", "0", NULL); + quadInit(); frameBufferInitBackbuffer(); spriteBatchInit(); diff --git a/src/game/minesweeper/CMakeLists.txt b/src/game/minesweeper/CMakeLists.txt index 7868b61..86f2d8e 100644 --- a/src/game/minesweeper/CMakeLists.txt +++ b/src/game/minesweeper/CMakeLists.txt @@ -9,4 +9,5 @@ target_sources(${DUSK_TARGET_NAME} game.c ) -# Subdirs \ No newline at end of file +# Subdirs +add_subdirectory(ui) \ No newline at end of file diff --git a/src/game/minesweeper/game.c b/src/game/minesweeper/game.c index 10bacba..8b7bbcd 100644 --- a/src/game/minesweeper/game.c +++ b/src/game/minesweeper/game.c @@ -6,19 +6,22 @@ */ #include "game/game.h" +#include "game/minesweeper/ui/ui.h" errorret_t gameInit(void) { + uiInit(); + errorOk(); } void gameUpdate(void) { - + } void gameRender(void) { - + uiRender(); } void gameDispose(void) { - + uiDispose(); } \ No newline at end of file diff --git a/src/game/minesweeper/ui/CMakeLists.txt b/src/game/minesweeper/ui/CMakeLists.txt new file mode 100644 index 0000000..8684c52 --- /dev/null +++ b/src/game/minesweeper/ui/CMakeLists.txt @@ -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 + ui.c +) + +# Subdirs \ No newline at end of file diff --git a/src/game/minesweeper/ui/ui.c b/src/game/minesweeper/ui/ui.c new file mode 100644 index 0000000..c64435d --- /dev/null +++ b/src/game/minesweeper/ui/ui.c @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2025 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#include "ui.h" +#include "ui/uifps.h" +#include "ui/uiconsole.h" +#include "display/framebuffer/framebuffer.h" + +#include "display/tileset/tileset_minogram.h" + +ui_t UI; + +void uiInit(void) { + cameraInitOrthographic(&UI.camera); + + UI.minogramTileset = (tileset_t*)&TILESET_MINOGRAM; + + assetManagerLoadAsset( + UI.minogramTileset->image, + &UI.minogramAsset, + &UI.minogramRef + ); +} + +void uiRender(void) { + int32_t w = frameBufferGetWidth(FRAMEBUFFER_BOUND); + int32_t h = frameBufferGetHeight(FRAMEBUFFER_BOUND); + + UI.camera.orthographic.left = 0; + UI.camera.orthographic.right = w; + UI.camera.orthographic.bottom = h; + UI.camera.orthographic.top = 0; + + cameraPushMatrix(&UI.camera); + + uiFPSRender(UI.minogramTileset, &UI.minogramAsset->alphaImage.texture); + uiConsoleRender(UI.minogramTileset, &UI.minogramAsset->alphaImage.texture); + + cameraPopMatrix(); +} + +void uiDispose(void) { + +} \ No newline at end of file diff --git a/src/game/minesweeper/ui/ui.h b/src/game/minesweeper/ui/ui.h new file mode 100644 index 0000000..0283751 --- /dev/null +++ b/src/game/minesweeper/ui/ui.h @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2025 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#pragma once +#include "dusk.h" +#include "display/camera.h" +#include "asset/assetmanager.h" +#include "display/tileset.h" + +typedef struct { + camera_t camera; + + tileset_t *minogramTileset; + asset_t *minogramAsset; + ref_t minogramRef; +} ui_t; + +extern ui_t UI; + +/** + * Initializes the Minesweeper UI. + */ +void uiInit(void); + +/** + * Renders the Minesweeper UI. + */ +void uiRender(void); + +/** + * Disposes of the Minesweeper UI. + */ +void uiDispose(void); \ No newline at end of file diff --git a/src/ui/uiconsole.c b/src/ui/uiconsole.c index 5fc82c0..a678b66 100644 --- a/src/ui/uiconsole.c +++ b/src/ui/uiconsole.c @@ -11,7 +11,6 @@ void uiConsoleRender(const tileset_t *tileset, texture_t *texture) { if(!CONSOLE.visible) return; - consolePrint("Test\n"); int32_t i = CONSOLE_HISTORY_MAX - 1; char_t *line; diff --git a/src/ui/uifps.c b/src/ui/uifps.c index 8853978..4978fc5 100644 --- a/src/ui/uifps.c +++ b/src/ui/uifps.c @@ -10,6 +10,7 @@ #include "console/console.h" #include "util/string.h" #include "ui/uitext.h" +#include "display/framebuffer/framebuffer.h" void uiFPSRender(const tileset_t *tileset, texture_t *texture) { if(stringCompare(consoleVarGet("fps")->value, "0") == 0) { @@ -31,6 +32,11 @@ void uiFPSRender(const tileset_t *tileset, texture_t *texture) { fps >= 30.0f ? COLOR_YELLOW : COLOR_RED ); - - uiTextDraw(0, 0, buffer, color, tileset, texture); + + int32_t w, h; + uiTextMeasure(buffer, tileset, &w, &h); + uiTextDraw( + frameBufferGetWidth(FRAMEBUFFER_BOUND) - w, 0, + buffer, color, tileset, texture + ); } \ No newline at end of file