small3dlib uint/magnolia / include / renderer / test_scene.h
  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