diff options
Diffstat (limited to 'src/engine.c')
| -rw-r--r-- | src/engine.c | 205 |
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); } |
