1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
#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;
int ortho;
#else
float x, y, vx, vy;
#endif
float angle;
} demo_t;
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)
{
(void)program;
#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;
}
static void update(kon_program_t *program, double dt, void *user)
{
demo_t *demo = user;
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;
(void)program;
#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)
{
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);
}
|