Example scene layout.

This commit is contained in:
2025-02-24 12:56:03 -06:00
parent 39a0547830
commit 2a0af3c256
16 changed files with 161 additions and 134 deletions

View File

@ -6,7 +6,6 @@
# Libs # Libs
target_link_libraries(${DUSK_TARGET_NAME} target_link_libraries(${DUSK_TARGET_NAME}
PUBLIC PUBLIC
cglm
) )
# Includes # Includes
@ -24,5 +23,5 @@ target_sources(${DUSK_TARGET_NAME}
# Subdirs # Subdirs
add_subdirectory(assert) add_subdirectory(assert)
add_subdirectory(entity) add_subdirectory(render)
add_subdirectory(display) add_subdirectory(entity)

View File

@ -1,44 +0,0 @@
/**
* Copyright (c) 2025 Dominic Masters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
#include "camera.h"
void cameraInit(camera_t *camera) {
glm_mat4_identity(camera->projection);
glm_mat4_identity(camera->view);
}
void cameraLookAt(
camera_t *camera,
const vec3 eye,
const vec3 center,
const vec3 up
) {
glm_lookat(eye, center, up, camera->view);
}
void cameraPerspective(
camera_t *camera,
float aspect,
float fovy,
float zNear,
float zFar
) {
glm_perspective(fovy, aspect, zNear, zFar, camera->projection);
}
void cameraOrtho(
camera_t *camera,
float left,
float right,
float bottom,
float top,
float near,
float far
) {
glm_ortho(left, right, bottom, top, near, far, camera->projection);
}

View File

@ -1,74 +0,0 @@
/**
* Copyright (c) 2025 Dominic Masters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
#pragma once
#include "dusk.h"
typedef struct {
mat4 projection;
mat4 view;
} camera_t;
/**
* Initializes the camera.
*
* @param camera The camera to initialize.
*/
void cameraInit(camera_t *camera);
/**
* Changes a camera to look at a specific point.
*
* @param camera The camera to modify.
* @param eye The position of the camera.
* @param center The point to look at.
* @param up The up vector.
*/
void cameraLookAt(
camera_t *camera,
const vec3 eye,
const vec3 center,
const vec3 up
);
/**
* Changes the camera's perspective.
*
* @param camera The camera to modify.
* @param fovy The field of view in the y direction.
* @param aspect The aspect ratio.
* @param zNear The near plane.
* @param zFar The far plane.
*/
void cameraPerspective(
camera_t *camera,
const float fovy,
const float aspect,
const float zNear,
const float zFar
);
/**
* Changes the camera's orthographic perspective.
*
* @param camera The camera to modify.
* @param left The left plane.
* @param right The right plane.
* @param bottom The bottom plane.
* @param top The top plane.
* @param near The near plane.
* @param far The far plane.
*/
void cameraOrtho(
camera_t *camera,
const float left,
const float right,
const float bottom,
const float top,
const float near,
const float far
);

View File

@ -14,13 +14,6 @@
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#include <stdarg.h> #include <stdarg.h>
#include <cglm/cglm.h>
#include <float.h>
#include <pthread.h>
#include <unistd.h>
typedef float float_t;
typedef double double_t;
typedef bool bool_t; typedef bool bool_t;
typedef char char_t; typedef char char_t;

View File

@ -7,19 +7,24 @@
#include "game.h" #include "game.h"
#include "input.h" #include "input.h"
#include "render/scene.h"
game_t GAME;
void gameInit() { void gameInit() {
memset(&GAME, 0, sizeof(game_t));
inputInit(); inputInit();
sceneInit();
} }
void gameUpdate() { void gameUpdate() {
GAME.tick++;
inputUpdate(); inputUpdate();
sceneUpdate();
if(inputWasPressed(INPUT_MENU)) {
// Quit
printf("Quit\n");
}
} }
void gameDispose() { void gameDispose() {
} }

View File

@ -10,6 +10,12 @@
#define GAME_TICK_RATE 60 #define GAME_TICK_RATE 60
typedef struct {
uint32_t tick;
} game_t;
extern game_t GAME;
/** /**
* Initializes the game. * Initializes the game.
*/ */

View File

@ -7,6 +7,7 @@
target_sources(${DUSK_TARGET_NAME} target_sources(${DUSK_TARGET_NAME}
PRIVATE PRIVATE
entity.c entity.c
overworld.c
) )
# Subdirs # Subdirs

View File

@ -0,0 +1,25 @@
/**
* Copyright (c) 2025 Dominic Masters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
#include "overworld.h"
void overworldInit() {
}
void overworldSceneInit() {
}
void overworldSceneDeinit() {
}
void overworldUpdate() {
}

View 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 "dusk.h"
void overworldInit();
void overworldSceneInit();
void overworldSceneDeinit();
void overworldUpdate();

View File

@ -6,7 +6,7 @@
# Sources # Sources
target_sources(${DUSK_TARGET_NAME} target_sources(${DUSK_TARGET_NAME}
PRIVATE PRIVATE
camera.c scene.c
) )
# Subdirs # Subdirs

47
src/dusk/render/scene.c Normal file
View File

@ -0,0 +1,47 @@
/**
* Copyright (c) 2025 Dominic Masters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
#include "scene.h"
#include "assert/assert.h"
#include "overworld/overworld.h"
scenetypecallback_t SCENE_CALLBACKS[] = {
{ NULL, NULL, NULL, NULL },// SCENE_TYPE_INITIAL
{ overworldInit, overworldSceneInit, overworldSceneDeinit, overworldUpdate },
};
scene_t SCENE;
void sceneInit() {
memset(&SCENE, 0, sizeof(scene_t));
for(uint8_t i = 0; i < SCENE_TYPE_COUNT; i++) {
if(SCENE_CALLBACKS[i].onInit) SCENE_CALLBACKS[i].onInit();
}
sceneSet(SCENE_TYPE_OVERWORLD);// Testing
}
void sceneUpdate() {
assertTrue(SCENE.current < SCENE_TYPE_COUNT, "Invalid Scene Type");
if(SCENE.next != SCENE.current) {
SCENE.current = SCENE.next;
if(SCENE_CALLBACKS[SCENE.current].onActive) {
SCENE_CALLBACKS[SCENE.current].onActive();
}
}
if(SCENE_CALLBACKS[SCENE.current].onUpdate) {
SCENE_CALLBACKS[SCENE.current].onUpdate();
}
}
void sceneSet(const scenetype_t scene) {
assertTrue(SCENE.next < SCENE_TYPE_COUNT, "Invalid Scene Type");
SCENE.next = scene;
}

47
src/dusk/render/scene.h Normal file
View File

@ -0,0 +1,47 @@
/**
* Copyright (c) 2025 Dominic Masters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
#pragma once
#include "dusk.h"
typedef enum {
SCENE_TYPE_INITIAL,
SCENE_TYPE_OVERWORLD,
} scenetype_t;
#define SCENE_TYPE_COUNT 2
typedef struct {
scenetype_t current;
scenetype_t next;
} scene_t;
typedef struct {
void (*onInit)();
void (*onActive)();
void (*onInactive)();
void (*onUpdate)();
} scenetypecallback_t;
extern scene_t SCENE;
/**
* Initializes the scene system.
*/
void sceneInit();
/**
* Updates the scene system.
*/
void sceneUpdate();
/**
* Sets the current scene. This will happen at the start of the next tick.
*
* @param scene The scene to set.
*/
void sceneSet(const scenetype_t scene);

View File

@ -9,6 +9,7 @@ target_link_libraries(${DUSK_TARGET_NAME}
archive_static archive_static
m m
spng_static spng_static
cglm
) )
# Includes # Includes

View File

@ -10,6 +10,13 @@
#include "duskglimpl.h" #include "duskglimpl.h"
#include <libgen.h> #include <libgen.h>
#include <cglm/cglm.h>
#include <float.h>
#include <pthread.h>
#include <unistd.h>
typedef float float_t;
typedef double double_t;
extern char_t EXECUTABLE_PATH[]; extern char_t EXECUTABLE_PATH[];
extern char_t EXECUTABLE_DIRECTORY[]; extern char_t EXECUTABLE_DIRECTORY[];