1#ifndef TEST_SCENE_H
2#define TEST_SCENE_H
3
4#include "mgmath.h"
5#include "util.h"
6#include "client/camera.h"
7#include "renderer/renderer.h"
8#include "renderer/test_block.h"
9
10typedef struct {
11 MGMesh mesh;
12 MGTexture texture;
13} Block;
14
15static Block brick = { MGMESH_INVALID, MGTEXTURE_INVALID };
16static Block dirt = { MGMESH_INVALID, MGTEXTURE_INVALID };
17static Block stone = { MGMESH_INVALID, MGTEXTURE_INVALID };
18static MGCamera cam;
19
20void test_scene_create(void)
21{
22 brick.mesh = block_mesh_create();
23 if (brick.mesh == MGMESH_INVALID)
24 mg_die(MG_ERR_MESH_CREATE, "Failed to create test block mesh");
25
26 brick.texture = renderer_texture_load("assets/resourcepacks/default/blocks/brick.png");
27 if (brick.texture == MGTEXTURE_INVALID)
28 mg_die(MG_ERR_TEXTURE_LOAD, "Failed to load test block texture");
29
30 dirt.mesh = block_mesh_create();
31 if (dirt.mesh == MGMESH_INVALID)
32 mg_die(MG_ERR_MESH_CREATE, "Failed to create test block mesh");
33
34 dirt.texture = renderer_texture_load("assets/resourcepacks/default/blocks/dirt.png");
35 if (dirt.texture == MGTEXTURE_INVALID)
36 mg_die(MG_ERR_TEXTURE_LOAD, "Failed to load test block texture");
37
38 stone.mesh = block_mesh_create();
39 if (stone.mesh == MGMESH_INVALID)
40 mg_die(MG_ERR_MESH_CREATE, "Failed to create test block mesh");
41
42 stone.texture = renderer_texture_load("assets/resourcepacks/default/blocks/stone.png");
43 if (stone.texture == MGTEXTURE_INVALID)
44 mg_die(MG_ERR_TEXTURE_LOAD, "Failed to load test block texture");
45
46 camera_init(&cam, MG_V3(3.0f, 3.0f, 3.0f));
47 cam.yaw = MG_AngleDeg(-140.0f);
48 cam.pitch = MG_AngleDeg(-20.0f);
49}
50
51void test_scene_draw(MGContext* ctx)
52{
53 MGMat4 proj;
54 MGMat4 view;
55 MGMat4 model;
56 MGMat4 mvp;
57 i32 width;
58 i32 height;
59 float aspect;
60
61 platform_get_drawable_size(ctx, &width, &height);
62
63 if (width <= 0 || height <= 0)
64 return;
65
66 aspect = (float)width / (float)height;
67
68 proj = camera_get_proj(&cam, aspect);
69 view = camera_get_view(&cam);
70
71 model = MG_Translate(MG_V3(0.0f, 0.0f, 0.0f));
72 mvp = MG_MulM4(proj, MG_MulM4(view, model));
73 renderer_mesh_draw(brick.mesh, brick.texture, &mvp);
74
75 model = MG_Translate(MG_V3(1.0f, 0.0f, 0.0f));
76 mvp = MG_MulM4(proj, MG_MulM4(view, model));
77 renderer_mesh_draw(dirt.mesh, dirt.texture, &mvp);
78
79 model = MG_Translate(MG_V3(2.0f, 0.0f, 0.0f));
80 mvp = MG_MulM4(proj, MG_MulM4(view, model));
81 renderer_mesh_draw(stone.mesh, stone.texture, &mvp);
82}
83
84void test_scene_destroy(void)
85{
86 renderer_mesh_destroy(brick.mesh);
87 renderer_texture_destroy(brick.texture);
88 brick.mesh = MGMESH_INVALID;
89 brick.texture = MGTEXTURE_INVALID;
90
91 renderer_mesh_destroy(dirt.mesh);
92 renderer_texture_destroy(dirt.texture);
93 dirt.mesh = MGMESH_INVALID;
94 dirt.texture = MGTEXTURE_INVALID;
95
96 renderer_mesh_destroy(stone.mesh);
97 renderer_texture_destroy(stone.texture);
98 stone.mesh = MGMESH_INVALID;
99 stone.texture = MGTEXTURE_INVALID;
100}
101
102#endif /* TEST_SCENE_H */
103