summaryrefslogtreecommitdiff
path: root/src/engine.c
diff options
context:
space:
mode:
authorKonAki <konaki@anokonaki.org>2026-10-11 21:57:22 +0800
committerKonAki <konaki@anokonaki.org>2026-10-11 21:57:22 +0800
commit95bd48a7b0556adab5250cae766ee9dd9c6b2cde (patch)
treea29b83a4f436d6c58321a44977e4eb6d30f7c8d8 /src/engine.c
parent42630ebee76996a37f5104e6e11b860f31634dab (diff)
konsofren: 3D is opt-in with KONSOFREN_3D, build.sh sets it for 3d, model and sector
Diffstat (limited to 'src/engine.c')
-rw-r--r--src/engine.c55
1 files changed, 44 insertions, 11 deletions
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)