From 95bd48a7b0556adab5250cae766ee9dd9c6b2cde Mon Sep 17 00:00:00 2001 From: KonAki Date: Sun, 11 Oct 2026 21:57:22 +0800 Subject: konsofren: 3D is opt-in with KONSOFREN_3D, build.sh sets it for 3d, model and sector --- src/engine.c | 55 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 44 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/engine.c b/src/engine.c index 1594032..362e522 100644 --- a/src/engine.c +++ b/src/engine.c @@ -1,11 +1,17 @@ #include "konprogram.h" +/* the starting point for a game. with the 3d module (./build.sh -m 3d) it is a spinning cube, without it a square that bounces around */ + typedef struct demo { +#ifdef KONSOFREN_3D kon_camera_t camera; kon_material_t material; kon_light_t light; - float angle; int ortho; +#else + float x, y, vx, vy; +#endif + float angle; } demo_t; static int init(kon_program_t *program, void *user) @@ -13,23 +19,36 @@ static int init(kon_program_t *program, void *user) demo_t *demo = user; (void)program; +#ifdef KONSOFREN_3D demo->camera = kon_cameraDefault(); demo->camera.position = KON_VEC3(3, 3, 6); demo->material = kon_materialColor(0xFFC8C8FF); demo->light = kon_lightDefault(); +#else + demo->x = 40.0f; + demo->y = 30.0f; + demo->vx = 70.0f; + demo->vy = 50.0f; +#endif return 1; } static int event(kon_program_t *program, const kon_event_t *ev, void *user) { - demo_t *demo = user; - (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; +#ifdef KONSOFREN_3D + { + demo_t *demo = user; + + 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; + } } +#else + (void)ev; (void)user; +#endif return 0; } @@ -37,18 +56,32 @@ static void update(kon_program_t *program, double dt, void *user) { demo_t *demo = user; - (void)program; demo->angle += (float)dt; +#ifndef KONSOFREN_3D + demo->x += demo->vx * (float)dt; + demo->y += demo->vy * (float)dt; + if (demo->x < 0.0f || demo->x > (float)program->display->game->width - 24.0f) demo->vx = -demo->vx; + if (demo->y < 0.0f || demo->y > (float)program->display->game->height - 24.0f) demo->vy = -demo->vy; +#else + (void)program; +#endif } static void draw(kon_program_t *program, kon_framebuffer_t *game, void *user) { 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); (void)program; - kon_drawMesh(game, viewProjection, model, &kon_cubeMesh, &demo->material, &demo->light, KON_RENDER_DEFAULT); +#ifdef KONSOFREN_3D + { + 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); + + kon_drawMesh(game, viewProjection, model, &kon_cubeMesh, &demo->material, &demo->light, KON_RENDER_DEFAULT); + } +#else + kon_fillRectangle(game, (int)demo->x, (int)demo->y, 24, 24, 0xFFF2A7C3); +#endif } int main(void) -- cgit