summaryrefslogtreecommitdiff
path: root/src/engine.c
blob: 1594032e2e6b3422d1605d8c0a36ebe80f581c88 (plain)
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
#include "konprogram.h"

typedef struct demo {
	kon_camera_t camera;
	kon_material_t material;
	kon_light_t light;
	float angle;
	int ortho;
} demo_t;

static int init(kon_program_t *program, void *user)
{
	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 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;
	}
	return 0;
}

static void update(kon_program_t *program, double dt, void *user)
{
	demo_t *demo = user;

	(void)program;
	demo->angle += (float)dt;
}

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);
}

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);
}