summaryrefslogtreecommitdiff
path: root/src/engine.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine.c')
-rw-r--r--src/engine.c205
1 files changed, 42 insertions, 163 deletions
diff --git a/src/engine.c b/src/engine.c
index 15fae3d..1594032 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -1,187 +1,66 @@
-#include "konwinlib.h"
-#include "konsofren.h"
-#include <stdlib.h>
+#include "konprogram.h"
-#include "kontime.h"
-
-#ifdef KON_MODULE_DEBUG
-#include "konassets.h"
-#include "konfont.h"
-#include "kondebug.h"
-#endif
-
-#define GAME_WIDTH 320
-#define GAME_HEIGHT 180
-
-typedef struct program {
- kon_window_t *window;
- kon_display_t *display;
+typedef struct demo {
kon_camera_t camera;
kon_material_t material;
kon_light_t light;
- kon_time last;
float angle;
-#ifdef KON_MODULE_DEBUG
- kon_assets_t *assets;
- kon_font_t *font;
- kon_debug_t *debug;
- float shakeLeft;
- int baseX, baseY;
-#endif
-} program_t;
+ int ortho;
+} demo_t;
-#ifdef KON_MODULE_DEBUG
-static void cmdOpacity(kon_debug_t *debug, void *user, int argc, char **argv)
+static int init(kon_program_t *program, void *user)
{
- program_t *program = user;
-
- (void)debug;
- if (argc > 1) kon_setWindowOpacity(program->window, (float)atof(argv[1]));
+ demo_t *demo = user;
+
+ (void)program;
+ demo->camera = kon_cameraDefault();
+ demo->camera.position = KON_VEC3(3, 3, 6);
+ demo->material = kon_materialColor(0xFFC8C8FF);
+ demo->light = kon_lightDefault();
+ return 1;
}
-static void cmdTopmost(kon_debug_t *debug, void *user, int argc, char **argv)
+static int event(kon_program_t *program, const kon_event_t *ev, void *user)
{
- program_t *program = user;
+ demo_t *demo = user;
- (void)debug;
- if (argc > 1) kon_setWindowTopmost(program->window, atoi(argv[1]) != 0);
-}
-
-static void cmdBorderless(kon_debug_t *debug, void *user, int argc, char **argv)
-{
- program_t *program = user;
-
- (void)debug;
- if (argc > 1) kon_setWindowDecorated(program->window, atoi(argv[1]) == 0);
+ (void)program;
+ if (ev->type == KON_EVENT_KEY_DOWN && ev->key == KON_KEY_O) {
+ demo->ortho = !demo->ortho;
+ demo->camera.projection = demo->ortho ? KON_PROJECTION_ORTHOGRAPHIC : KON_PROJECTION_PERSPECTIVE;
+ return 1;
+ }
+ return 0;
}
-static void cmdClickThrough(kon_debug_t *debug, void *user, int argc, char **argv)
+static void update(kon_program_t *program, double dt, void *user)
{
- program_t *program = user;
+ demo_t *demo = user;
- (void)debug;
- if (argc > 1) kon_setWindowClickThrough(program->window, atoi(argv[1]) != 0);
+ (void)program;
+ demo->angle += (float)dt;
}
-static void cmdMessage(kon_debug_t *debug, void *user, int argc, char **argv)
+static void draw(kon_program_t *program, kon_framebuffer_t *game, void *user)
{
- (void)debug; (void)user;
- kon_messageBox("konengine", argc > 1 ? argv[1] : "hello", KON_MESSAGE_INFO);
-}
+ demo_t *demo = user;
+ kon_mat4_t model = kon_mat4Rotate(kon_mat4Identity(), KON_VEC3(demo->angle * 0.5f, demo->angle, 0));
+ kon_mat4_t viewProjection = kon_cameraViewProjection(&demo->camera, game->width, game->height);
-static void cmdShake(kon_debug_t *debug, void *user, int argc, char **argv)
-{
- program_t *program = user;
-
- (void)debug; (void)argc; (void)argv;
- kon_getWindowPos(program->window, &program->baseX, &program->baseY);
- program->shakeLeft = 0.5f;
-}
-#endif
-
-static void frame(void *data)
-{
- program_t *program = (program_t *)data;
- kon_display_t *display = program->display;
- kon_event_t ev;
- kon_time now, dt;
- kon_mat4_t model, viewProjection;
-
- while (kon_pollEvent(program->window, &ev)) {
-#ifdef KON_MODULE_DEBUG
- if (kon_debugFeedEvent(program->debug, &ev)) continue;
-#endif
- if (ev.type == KON_EVENT_RESIZE) {
- kon_resizeDisplay(display, ev.width, ev.height);
- }
- if (ev.type == KON_EVENT_KEY_DOWN && ev.key == KON_KEY_O) {
- program->camera.projection = (program->camera.projection == KON_PROJECTION_PERSPECTIVE)
- ? KON_PROJECTION_ORTHOGRAPHIC : KON_PROJECTION_PERSPECTIVE;
- }
- }
-
- now = kon_getTime();
- dt = now - program->last;
- program->angle += (float)dt;
- program->last = now;
-
-#ifdef KON_MODULE_DEBUG
- if (program->shakeLeft > 0.0f) {
- program->shakeLeft -= (float)dt;
- if (program->shakeLeft > 0.0f) kon_setWindowPos(program->window, program->baseX + rand() % 21 - 10, program->baseY + rand() % 21 - 10);
- else kon_setWindowPos(program->window, program->baseX, program->baseY);
- }
-#endif
-
- model = kon_mat4Identity();
- model = kon_mat4Rotate(model, KON_VEC3(program->angle * 0.5f, program->angle, 0));
- viewProjection = kon_cameraViewProjection(&program->camera, display->game->width, display->game->height);
-
- kon_clearFramebuffer(display->game, KON_BACKGROUND_COLOR);
- kon_drawMesh(display->game, viewProjection, model, &kon_cubeMesh, &program->material, &program->light, KON_RENDER_DEFAULT);
-
- kon_presentDisplay(display);
-#ifdef KON_MODULE_DEBUG
- kon_debugFrame(program->debug);
- if (kon_debugQuitRequested(program->debug)) kon_setShouldClose(program->window, true);
- kon_debugDraw(program->debug, display->screen);
-#endif
- kon_blitPixels(program->window, display->screen->data, display->screen->width, display->screen->height);
- kon_sleep(0.008);
+ (void)program;
+ kon_drawMesh(game, viewProjection, model, &kon_cubeMesh, &demo->material, &demo->light, KON_RENDER_DEFAULT);
}
int main(void)
{
- program_t program = {0};
-
- if (!kon_init()) return 1;
-
- program.window = kon_createWindow("engine", 0, 0, 800, 600, KON_WINDOW_CENTER | KON_WINDOW_RESIZABLE);
- if (!program.window) return 1;
-#ifdef KON_DEVELOPER
- kon_setExitKey(program.window, KON_KEY_F10);
-#else
- kon_setExitKey(program.window, KON_KEY_ESCAPE);
-#endif
-
- program.display = kon_createDisplay(GAME_WIDTH, GAME_HEIGHT, 800, 600);
- if (!program.display) return 1;
-
- program.camera = kon_cameraDefault();
- program.camera.position = KON_VEC3(3, 3, 6);
- program.material = kon_materialColor(0xFFC8C8FF);
- program.light = kon_lightDefault();
- program.last = kon_getTime();
-
-#ifdef KON_MODULE_DEBUG
- program.assets = kon_assetsCreate(NULL, "assets");
- {
- kon_blob_t *ttf = kon_assetBlob(program.assets, "font.ttf");
-
- if (ttf) program.font = kon_loadFont(ttf->data, ttf->size, 14.0f);
- if (!program.font) program.font = kon_loadBuiltinFont(1);
- program.debug = kon_debugCreate(program.font);
- kon_debugSetAssets(program.debug, program.assets);
- kon_debugCommand(program.debug, "opacity", "window opacity 0 to 1", cmdOpacity, &program);
- kon_debugCommand(program.debug, "topmost", "topmost 0 or 1", cmdTopmost, &program);
- kon_debugCommand(program.debug, "borderless", "borderless 0 or 1", cmdBorderless, &program);
- kon_debugCommand(program.debug, "clickthrough", "clickthrough 0 or 1", cmdClickThrough, &program);
- kon_debugCommand(program.debug, "message", "message \"text\"", cmdMessage, &program);
- kon_debugCommand(program.debug, "shake", "shake the window", cmdShake, &program);
- kon_debugLog(program.debug, ttf ? "loaded font.ttf" : "no assets/font.ttf, using the built in font");
- }
-#endif
-
- kon_runMainLoop(program.window, frame, &program);
-
-#ifdef KON_MODULE_DEBUG
- kon_debugDestroy(program.debug);
- kon_freeFont(program.font);
- kon_assetsDestroy(program.assets);
-#endif
-
- kon_freeDisplay(program.display);
- kon_destroyWindow(program.window);
- kon_deinit();
- return 0;
+ demo_t demo = {0};
+ kon_programConfig_t config = {0};
+
+ config.title = "engine";
+ config.user = &demo;
+ config.init = init;
+ config.event = event;
+ config.update = update;
+ config.draw = draw;
+ return kon_programRun(&config);
}