commit 9f15095

shrub  ·  2026-07-30 14:12:56 +0000 UTC
parent fca4c34
clang format and license
17 files changed,  +194, -177
+12, -0
 1@@ -0,0 +1,12 @@
 2+AlignEscapedNewlines: DontAlign
 3+AlignTrailingComments: false
 4+BreakBeforeBraces: Linux
 5+ColumnLimit: 0
 6+Cpp11BracedListStyle: false
 7+IndentCaseLabels: false
 8+IndentPPDirectives: None
 9+IndentWidth: 8
10+PointerAlignment: Left
11+SortIncludes: false
12+TabWidth: 8
13+UseTab: ForIndentation
+13, -0
 1@@ -0,0 +1,13 @@
 2+Copyright (c) the magnolia contributors
 3+
 4+Permission to use, copy, modify, and distribute this software for any
 5+purpose with or without fee is hereby granted, provided that the above
 6+copyright notice and this permission notice appear in all copies.
 7+
 8+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 9+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+1, -2
 1@@ -11,7 +11,7 @@ typedef struct {
 2 
 3 	float fov;
 4 	float near; /* near plane */
 5-	float far;  /* far plane */
 6+	float far; /* far plane */
 7 } MGCamera;
 8 
 9 /* initialise camera at `pos` */
10@@ -36,4 +36,3 @@ MGMat4 camera_get_view(const MGCamera* cam);
11 MGMat4 camera_get_proj(const MGCamera* cam, float aspect);
12 
13 #endif /* CLIENT_CAMERA_H */
14-
+1, -2
 1@@ -41,7 +41,7 @@ MGVec4 MG_V4(float x, float y, float z, float w);
 2 MGVec3 MG_AddV3(MGVec3 left, MGVec3 right);
 3 MGVec3 MG_SubV3(MGVec3 left, MGVec3 right);
 4 MGVec3 MG_MulV3F(MGVec3 left, float right);
 5-float  MG_DotV3(MGVec3 left, MGVec3 right);
 6+float MG_DotV3(MGVec3 left, MGVec3 right);
 7 MGVec3 MG_Cross(MGVec3 left, MGVec3 right);
 8 MGVec3 MG_NormV3(MGVec3 vec);
 9 
10@@ -53,4 +53,3 @@ MGMat4 MG_Perspective_RH_NO(float fov_y, float aspect, float near_z, float far_z
11 MGMat4 MG_LookAt_RH(MGVec3 eye, MGVec3 center, MGVec3 up);
12 
13 #endif /* MGMATH_H */
14-
+6, -6
 1@@ -17,13 +17,13 @@ typedef struct {
 2 } MGVidBE;
 3 
 4 typedef struct {
 5-	MGWindow*   win;
 6-	MGVidBE     vbe;
 7+	MGWindow* win;
 8+	MGVidBE vbe;
 9 	const char* title;
10-	i32         x;
11-	i32         y;
12-	i32         width;
13-	i32         height;
14+	i32 x;
15+	i32 y;
16+	i32 width;
17+	i32 height;
18 } MGContext;
19 
20 /* get drawable screen size. usually different due to hi-dpi options
+7, -8
 1@@ -6,10 +6,10 @@
 2 #include "platform/platform.h"
 3 
 4 typedef u32 MGMesh;
 5-#define MGMESH_INVALID ((MGMesh) 0)
 6+#define MGMESH_INVALID ((MGMesh)0)
 7 
 8 typedef u32 MGTexture;
 9-#define MGTEXTURE_INVALID ((MGTexture) 0)
10+#define MGTEXTURE_INVALID ((MGTexture)0)
11 
12 typedef struct {
13 	float x;
14@@ -19,14 +19,14 @@ typedef struct {
15 	float u;
16 	float v;
17 
18-	u32   col;
19+	u32 col;
20 } MGVertex;
21 
22 typedef struct {
23-	const MGVertex* vtc;  /* vertices */
24-	u32             vtcc; /* vertices count */
25-	const u16*      idc;  /* indecies */
26-	u32             idcc; /* indecies count */
27+	const MGVertex* vtc; /* vertices */
28+	u32 vtcc; /* vertices count */
29+	const u16* idc; /* indecies */
30+	u32 idcc; /* indecies count */
31 } MGMeshDesc;
32 
33 /* create renderer with chosen context
34@@ -58,4 +58,3 @@ MGTexture renderer_texture_load(const char* path);
35 void renderer_texture_destroy(MGTexture id);
36 
37 #endif /* RENDERER_H */
38-
+30, -30
 1@@ -4,52 +4,52 @@
 2 #include "renderer/renderer.h"
 3 
 4 #define RGBA(r, g, b, a) ( \
 5-	((u32)(r)      ) | \
 6-	((u32)(g) <<  8) | \
 7-	((u32)(b) << 16) | \
 8-	((u32)(a) << 24)   \
 9-)
10+    ((u32)(r)) | \
11+    ((u32)(g) << 8) | \
12+    ((u32)(b) << 16) | \
13+    ((u32)(a) << 24))
14 
15 MGMesh block_mesh_create(void);
16 
17 static const MGVertex vtc[24] = {
18 	/* north: -z */
19-	{0.0f, 0.0f, 0.0f, 0.0f, 1.0f, RGBA(255, 0, 0, 255)},
20-	{0.0f, 1.0f, 0.0f, 0.0f, 0.0f, RGBA(255, 0, 0, 255)},
21-	{1.0f, 1.0f, 0.0f, 1.0f, 0.0f, RGBA(255, 0, 0, 255)},
22-	{1.0f, 0.0f, 0.0f, 1.0f, 1.0f, RGBA(255, 0, 0, 255)},
23+	{ 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, RGBA(255, 0, 0, 255) },
24+	{ 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, RGBA(255, 0, 0, 255) },
25+	{ 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, RGBA(255, 0, 0, 255) },
26+	{ 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, RGBA(255, 0, 0, 255) },
27 
28 	/* south: +z */
29-	{1.0f, 0.0f, 1.0f, 0.0f, 1.0f, RGBA(0, 255, 0, 255)},
30-	{1.0f, 1.0f, 1.0f, 0.0f, 0.0f, RGBA(0, 255, 0, 255)},
31-	{0.0f, 1.0f, 1.0f, 1.0f, 0.0f, RGBA(0, 255, 0, 255)},
32-	{0.0f, 0.0f, 1.0f, 1.0f, 1.0f, RGBA(0, 255, 0, 255)},
33+	{ 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, RGBA(0, 255, 0, 255) },
34+	{ 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, RGBA(0, 255, 0, 255) },
35+	{ 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, RGBA(0, 255, 0, 255) },
36+	{ 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, RGBA(0, 255, 0, 255) },
37 
38 	/* west: -x */
39-	{0.0f, 0.0f, 1.0f, 0.0f, 1.0f, RGBA(0, 0, 255, 255)},
40-	{0.0f, 1.0f, 1.0f, 0.0f, 0.0f, RGBA(0, 0, 255, 255)},
41-	{0.0f, 1.0f, 0.0f, 1.0f, 0.0f, RGBA(0, 0, 255, 255)},
42-	{0.0f, 0.0f, 0.0f, 1.0f, 1.0f, RGBA(0, 0, 255, 255)},
43+	{ 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, RGBA(0, 0, 255, 255) },
44+	{ 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, RGBA(0, 0, 255, 255) },
45+	{ 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, RGBA(0, 0, 255, 255) },
46+	{ 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, RGBA(0, 0, 255, 255) },
47 
48 	/* east: +x */
49-	{1.0f, 0.0f, 0.0f, 0.0f, 1.0f, RGBA(255, 255, 0, 255)},
50-	{1.0f, 1.0f, 0.0f, 0.0f, 0.0f, RGBA(255, 255, 0, 255)},
51-	{1.0f, 1.0f, 1.0f, 1.0f, 0.0f, RGBA(255, 255, 0, 255)},
52-	{1.0f, 0.0f, 1.0f, 1.0f, 1.0f, RGBA(255, 255, 0, 255)},
53+	{ 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, RGBA(255, 255, 0, 255) },
54+	{ 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, RGBA(255, 255, 0, 255) },
55+	{ 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, RGBA(255, 255, 0, 255) },
56+	{ 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, RGBA(255, 255, 0, 255) },
57 
58 	/* bottom: -y */
59-	{0.0f, 0.0f, 1.0f, 0.0f, 1.0f, RGBA(255, 0, 255, 255)},
60-	{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, RGBA(255, 0, 255, 255)},
61-	{1.0f, 0.0f, 0.0f, 1.0f, 0.0f, RGBA(255, 0, 255, 255)},
62-	{1.0f, 0.0f, 1.0f, 1.0f, 1.0f, RGBA(255, 0, 255, 255)},
63+	{ 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, RGBA(255, 0, 255, 255) },
64+	{ 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, RGBA(255, 0, 255, 255) },
65+	{ 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, RGBA(255, 0, 255, 255) },
66+	{ 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, RGBA(255, 0, 255, 255) },
67 
68 	/* top: +y */
69-	{0.0f, 1.0f, 0.0f, 0.0f, 1.0f, RGBA(0, 255, 255, 255)},
70-	{0.0f, 1.0f, 1.0f, 0.0f, 0.0f, RGBA(0, 255, 255, 255)},
71-	{1.0f, 1.0f, 1.0f, 1.0f, 0.0f, RGBA(0, 255, 255, 255)},
72-	{1.0f, 1.0f, 0.0f, 1.0f, 1.0f, RGBA(0, 255, 255, 255)}
73+	{ 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, RGBA(0, 255, 255, 255) },
74+	{ 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, RGBA(0, 255, 255, 255) },
75+	{ 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, RGBA(0, 255, 255, 255) },
76+	{ 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, RGBA(0, 255, 255, 255) }
77 };
78 
79+/* clang-format off */
80 static const u16 idc[36] = {
81 	0,  1,  2,  0,  2,  3,
82 	4,  5,  6,  4,  6,  7,
83@@ -58,6 +58,7 @@ static const u16 idc[36] = {
84 	16, 17, 18, 16, 18, 19,
85 	20, 21, 22, 20, 22, 23,
86 };
87+/* clang-format on */
88 
89 MGMesh block_mesh_create(void)
90 {
91@@ -66,4 +67,3 @@ MGMesh block_mesh_create(void)
92 }
93 
94 #endif /* TEST_BLOCK_H */
95-
+1, -2
 1@@ -8,7 +8,7 @@
 2 #include "renderer/test_block.h"
 3 
 4 typedef struct {
 5-	MGMesh    mesh;
 6+	MGMesh mesh;
 7 	MGTexture texture;
 8 } Block;
 9 
10@@ -100,4 +100,3 @@ void test_scene_destroy(void)
11 }
12 
13 #endif /* TEST_SCENE_H */
14-
+5, -6
 1@@ -3,14 +3,13 @@
 2 
 3 #include <stdint.h>
 4 
 5-typedef int8_t   i8;
 6-typedef int16_t  i16;
 7-typedef int32_t  i32;
 8-typedef int64_t  i64;
 9-typedef uint8_t  u8;
10+typedef int8_t i8;
11+typedef int16_t i16;
12+typedef int32_t i32;
13+typedef int64_t i64;
14+typedef uint8_t u8;
15 typedef uint16_t u16;
16 typedef uint32_t u32;
17 typedef uint64_t u64;
18 
19 #endif /* TYPES_H */
20-
+16, -17
 1@@ -2,39 +2,38 @@
 2 #define UTIL_H
 3 
 4 typedef enum { /* TODO: rename to MG_EC_... */
 5-	MG_ERR_EXIT_SUCCESS,
 6-	MG_ERR_EXIT_FAILURE,
 7+	       MG_ERR_EXIT_SUCCESS,
 8+	       MG_ERR_EXIT_FAILURE,
 9 
10-	MG_ERR_SDL_INIT,
11-	MG_ERR_SDL_CREATE_WIN,
12+	       MG_ERR_SDL_INIT,
13+	       MG_ERR_SDL_CREATE_WIN,
14 
15-	MG_ERR_GL_CTX_CREATE,
16-	MG_ERR_GL_CTX_ACTIVATE,
17+	       MG_ERR_GL_CTX_CREATE,
18+	       MG_ERR_GL_CTX_ACTIVATE,
19 
20-	MG_ERR_SHADER_CREATE,
21+	       MG_ERR_SHADER_CREATE,
22 
23-	MG_ERR_PIPELINE_CREATE,
24+	       MG_ERR_PIPELINE_CREATE,
25 
26-	MG_ERR_MESH_CREATE,
27+	       MG_ERR_MESH_CREATE,
28 
29-	MG_ERR_TEXTURE_LOAD,
30-	MG_ERR_TEXTURE_CREATE,
31-	MG_ERR_SAMPLER_CREATE,
32-	MG_ERR_VIEW_CREATE,
33+	       MG_ERR_TEXTURE_LOAD,
34+	       MG_ERR_TEXTURE_CREATE,
35+	       MG_ERR_SAMPLER_CREATE,
36+	       MG_ERR_VIEW_CREATE,
37 
38-	MG_ERR_REN_CREATE,
39+	       MG_ERR_REN_CREATE,
40 
41-	MG_ERR_LAST
42+	       MG_ERR_LAST
43 } MGErrorCodes;
44 
45 typedef enum {
46 	LOG_INF, /* info */
47 	LOG_ERR, /* error */
48-	LOG_DBG  /* debug */
49+	LOG_DBG /* debug */
50 } LogType;
51 
52 void mg_die(MGErrorCodes ec, const char* fmt, ...);
53 void mg_log(LogType lt, const char* fmt, ...);
54 
55 #endif /* UTIL_H */
56-
+0, -1
1@@ -70,4 +70,3 @@ MGMat4 camera_get_proj(const MGCamera* cam, float aspect)
2 {
3 	return MG_Perspective_RH_NO(cam->fov, aspect, cam->near, cam->far);
4 }
5-
+7, -4
 1@@ -8,9 +8,13 @@
 2 #include "renderer/test_scene.h"
 3 
 4 static MGContext ctx = {
 5-	NULL, {NULL},
 6+	NULL,
 7+	{ NULL },
 8 	"Magnolia",
 9-	0, 0, 1024, 768,
10+	0,
11+	0,
12+	1024,
13+	768,
14 };
15 
16 static void input(void)
17@@ -49,7 +53,7 @@ static void input(void)
18 	move = MG_MulV3F(move, 4.0f * dt); /* arbritrary movement speed */
19 	camera_move(&cam, move);
20 	SDL_GetRelativeMouseState(&mx, &my);
21-	camera_rotate(&cam, mx * sensitivity, -my*sensitivity);
22+	camera_rotate(&cam, mx * sensitivity, -my * sensitivity);
23 }
24 
25 int main(void)
26@@ -77,4 +81,3 @@ int main(void)
27 	platform_shutdown(&ctx);
28 	return MG_ERR_EXIT_SUCCESS;
29 }
30-
+3, -5
 1@@ -168,9 +168,7 @@ MGMat4 MG_Perspective_RH_NO(float fov_y, float aspect, float near_z, float far_z
 2 MGMat4 MG_LookAt_RH(MGVec3 eye, MGVec3 center, MGVec3 up)
 3 {
 4 	return mg_from_hmm_m4(HMM_LookAt_RH(
 5-		mg_to_hmm_v3(eye),
 6-		mg_to_hmm_v3(center),
 7-		mg_to_hmm_v3(up)
 8-	));
 9+	    mg_to_hmm_v3(eye),
10+	    mg_to_hmm_v3(center),
11+	    mg_to_hmm_v3(up)));
12 }
13-
+6, -7
 1@@ -14,7 +14,7 @@ void platform_get_drawable_size(MGContext* ctx, i32* width, i32* height)
 2 
 3 void platform_init(MGContext* ctx)
 4 {
 5-	(void) ctx;
 6+	(void)ctx;
 7 	if (SDL_Init(SDL_INIT_VIDEO) != 0)
 8 		mg_die(MG_ERR_SDL_INIT, "SDL_Init failed: %s", SDL_GetError());
 9 
10@@ -22,7 +22,7 @@ void platform_init(MGContext* ctx)
11 	/* TODO: OpenGL specifis */
12 	SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
13 	SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
14-	SDL_GL_SetAttribute( SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
15+	SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
16 	SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
17 	SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
18 #endif
19@@ -33,7 +33,7 @@ i32 platform_poll(MGContext* ctx)
20 {
21 	SDL_Event ev;
22 	while (SDL_PollEvent(&ev)) {
23-		switch(ev.type) {
24+		switch (ev.type) {
25 		case SDL_QUIT:
26 			return 0;
27 
28@@ -86,15 +86,14 @@ void platform_shutdown(MGContext* ctx)
29 
30 void platform_window_create(MGContext* ctx)
31 {
32-	u32 flags = SDL_WINDOW_RESIZABLE|SDL_WINDOW_ALLOW_HIGHDPI;
33+	u32 flags = SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI;
34 #ifdef MG_RENDERER_SOKOL
35 	flags |= SDL_WINDOW_OPENGL;
36 #endif
37 
38 	ctx->win = SDL_CreateWindow(
39-		ctx->title, ctx->x, ctx->y, ctx->width, ctx->height,
40-		flags
41-	);
42+	    ctx->title, ctx->x, ctx->y, ctx->width, ctx->height,
43+	    flags);
44 
45 	if (!ctx->win)
46 		mg_die(MG_ERR_SDL_CREATE_WIN, "Failed to create window: %s", SDL_GetError());
+26, -25
  1@@ -23,35 +23,35 @@
  2 
  3 typedef struct {
  4 	MGVertex* vtc; /* vertices */
  5-	u16*      idc; /* indices */
  6-	u32       ic;  /* index count */
  7-	i8        used;
  8+	u16* idc; /* indices */
  9+	u32 ic; /* index count */
 10+	i8 used;
 11 } RendererMesh;
 12 
 13 typedef struct {
 14 	u8* pixels;
 15 	i32 width;
 16 	i32 height;
 17-	i8  used;
 18+	i8 used;
 19 } RendererTexture;
 20 
 21 typedef struct {
 22-	MGContext*  ctx;
 23-	i8         pass; /* basically a bool; in
 24-	                    render pass or not */
 25+	MGContext* ctx;
 26+	i8 pass; /* basically a bool; in
 27+	            render pass or not */
 28 
 29 	SDL_Texture* screen_texture;
 30-	u32*        framebuffer;
 31-	i32         width;
 32-	i32         height;
 33+	u32* framebuffer;
 34+	i32 width;
 35+	i32 height;
 36 
 37-	RendererMesh    meshes[MAX_MESHES];
 38+	RendererMesh meshes[MAX_MESHES];
 39 	RendererTexture textures[MAX_TEXTURES];
 40 
 41-	RendererMesh*    active_mesh;
 42+	RendererMesh* active_mesh;
 43 	RendererTexture* active_texture;
 44-	u32              active_triangle;
 45-	i32              tri_uvs[6];
 46+	u32 active_triangle;
 47+	i32 tri_uvs[6];
 48 } RendererState;
 49 
 50 typedef struct {
 51@@ -110,12 +110,11 @@ static void create_screen_texture(i32 width, i32 height)
 52 		SDL_DestroyTexture(ren.screen_texture);
 53 
 54 	ren.screen_texture = SDL_CreateTexture(
 55-		ren.ctx->vbe.renderer,
 56-		SDL_PIXELFORMAT_RGBA8888,
 57-		SDL_TEXTUREACCESS_STREAMING,
 58-		width,
 59-		height
 60-	);
 61+	    ren.ctx->vbe.renderer,
 62+	    SDL_PIXELFORMAT_RGBA8888,
 63+	    SDL_TEXTUREACCESS_STREAMING,
 64+	    width,
 65+	    height);
 66 
 67 	if (!ren.screen_texture)
 68 		mg_die(MG_ERR_REN_CREATE, "Failed to create small3dlib texture: %s", SDL_GetError());
 69@@ -244,10 +243,12 @@ static u32 sample_texture(const RendererMesh* mesh, const RendererTexture* textu
 70 
 71 	x = (barycentric[0] * ren.tri_uvs[0] +
 72 	     barycentric[1] * ren.tri_uvs[2] +
 73-	     barycentric[2] * ren.tri_uvs[4]) / (S3L_F / 8);
 74+	     barycentric[2] * ren.tri_uvs[4]) /
 75+	    (S3L_F / 8);
 76 	y = (barycentric[0] * ren.tri_uvs[1] +
 77 	     barycentric[1] * ren.tri_uvs[3] +
 78-	     barycentric[2] * ren.tri_uvs[5]) / (S3L_F / 8);
 79+	     barycentric[2] * ren.tri_uvs[5]) /
 80+	    (S3L_F / 8);
 81 
 82 	x %= texture->width;
 83 	y %= texture->height;
 84@@ -365,7 +366,7 @@ MGMesh renderer_backend_mesh_create(const MGMeshDesc* desc)
 85 	if (!mesh->vtc || !mesh->idc) {
 86 		free(mesh->vtc);
 87 		free(mesh->idc);
 88-		*mesh = (RendererMesh){0};
 89+		*mesh = (RendererMesh){ 0 };
 90 		mg_log(LOG_ERR, "Failed to allocate mesh data");
 91 		return MGMESH_INVALID;
 92 	}
 93@@ -444,7 +445,7 @@ void renderer_backend_mesh_destroy(MGMesh id)
 94 
 95 	free(mesh->idc);
 96 	free(mesh->vtc);
 97-	*mesh = (RendererMesh){0};
 98+	*mesh = (RendererMesh){ 0 };
 99 }
100 
101 MGTexture renderer_backend_texture_load(const char* path)
102@@ -495,5 +496,5 @@ void renderer_backend_texture_destroy(MGTexture id)
103 		return;
104 
105 	stbi_image_free(texture->pixels);
106-	*texture = (RendererTexture){0};
107+	*texture = (RendererTexture){ 0 };
108 }
+60, -61
  1@@ -13,26 +13,26 @@
  2 typedef struct {
  3 	sg_buffer vb; /* vertex buffer */
  4 	sg_buffer ib; /* index buffer */
  5-	u32       ic; /* index count */
  6-	i8        used;
  7+	u32 ic; /* index count */
  8+	i8 used;
  9 } RendererMesh;
 10 
 11 typedef struct {
 12 	sg_image image;
 13-	sg_view  view;
 14-	i8       used;
 15+	sg_view view;
 16+	i8 used;
 17 } RendererTexture;
 18 
 19 typedef struct {
 20 	MGContext* ctx;
 21-	i8         pass; /* basically a bool; in
 22-	                    render pass or not */
 23+	i8 pass; /* basically a bool; in
 24+	            render pass or not */
 25 
 26-	sg_shader   shader;
 27+	sg_shader shader;
 28 	sg_pipeline pipeline;
 29-	sg_sampler  sampler;
 30+	sg_sampler sampler;
 31 
 32-	RendererMesh    meshes[MAX_MESHES];
 33+	RendererMesh meshes[MAX_MESHES];
 34 	RendererTexture textures[MAX_MESHES];
 35 } RendererState;
 36 
 37@@ -48,40 +48,40 @@ static void sokol_log(const char* tag, u32 level, u32 item, const char* msg, u32
 38 static RendererState ren;
 39 /* TODO: textures */
 40 static const char* vsdr =
 41-"#version 410\n"
 42-"layout(location=0) in vec3 position;\n"
 43-"layout(location=1) in vec2 texcoord0;\n"
 44-"layout(location=2) in vec4 color0;\n"
 45-"\n"
 46-"uniform mat4 mvp;\n"
 47-"\n"
 48-"out vec2 uv;\n"
 49-"out vec4 colour;\n"
 50-"\n"
 51-"void main(void)\n"
 52-"{\n"
 53-"    gl_Position = mvp * vec4(position, 1.0);\n"
 54-"    uv = texcoord0;\n"
 55-"    colour = color0;\n"
 56-"}\n";
 57+    "#version 410\n"
 58+    "layout(location=0) in vec3 position;\n"
 59+    "layout(location=1) in vec2 texcoord0;\n"
 60+    "layout(location=2) in vec4 color0;\n"
 61+    "\n"
 62+    "uniform mat4 mvp;\n"
 63+    "\n"
 64+    "out vec2 uv;\n"
 65+    "out vec4 colour;\n"
 66+    "\n"
 67+    "void main(void)\n"
 68+    "{\n"
 69+    "    gl_Position = mvp * vec4(position, 1.0);\n"
 70+    "    uv = texcoord0;\n"
 71+    "    colour = color0;\n"
 72+    "}\n";
 73 static const char* fsdr =
 74-"#version 410\n"
 75-"in vec2 uv;\n"
 76-"in vec4 colour;\n"
 77-"\n"
 78-"uniform sampler2D tex;\n"
 79-"\n"
 80-"out vec4 frag_colour;\n"
 81-"\n"
 82-"void main(void)\n"
 83-"{\n"
 84-"    frag_colour = texture(tex, uv);\n"
 85-"}\n";
 86+    "#version 410\n"
 87+    "in vec2 uv;\n"
 88+    "in vec4 colour;\n"
 89+    "\n"
 90+    "uniform sampler2D tex;\n"
 91+    "\n"
 92+    "out vec4 frag_colour;\n"
 93+    "\n"
 94+    "void main(void)\n"
 95+    "{\n"
 96+    "    frag_colour = texture(tex, uv);\n"
 97+    "}\n";
 98 
 99 static void create_pipelines(void)
100 {
101-	sg_shader_desc shader_desc = {0};
102-	sg_pipeline_desc pipeline_desc = {0};
103+	sg_shader_desc shader_desc = { 0 };
104+	sg_pipeline_desc pipeline_desc = { 0 };
105 
106 	/* shader descriptor */
107 	shader_desc.vertex_func.source = vsdr;
108@@ -92,8 +92,8 @@ static void create_pipelines(void)
109 	shader_desc.uniform_blocks[0].stage = SG_SHADERSTAGE_VERTEX;
110 	shader_desc.uniform_blocks[0].size = sizeof(float) * 16; /* size of mvp matrix */
111 	shader_desc.uniform_blocks[0].layout = SG_UNIFORMLAYOUT_STD140;
112-	shader_desc.uniform_blocks[0] .glsl_uniforms[0].glsl_name = "mvp";
113-	shader_desc.uniform_blocks[0] .glsl_uniforms[0].type = SG_UNIFORMTYPE_MAT4;
114+	shader_desc.uniform_blocks[0].glsl_uniforms[0].glsl_name = "mvp";
115+	shader_desc.uniform_blocks[0].glsl_uniforms[0].type = SG_UNIFORMTYPE_MAT4;
116 
117 	/* textures */
118 	shader_desc.views[0].texture.stage = SG_SHADERSTAGE_FRAGMENT;
119@@ -129,7 +129,7 @@ static void create_pipelines(void)
120 
121 static void create_sampler(void)
122 {
123-	sg_sampler_desc desc = {0};
124+	sg_sampler_desc desc = { 0 };
125 
126 	desc.min_filter = SG_FILTER_NEAREST;
127 	desc.mag_filter = SG_FILTER_NEAREST;
128@@ -151,17 +151,16 @@ static void sokol_log(const char* tag, u32 level, u32 item, const char* msg, u32
129 	type = level <= 1 ? LOG_ERR : LOG_DBG;
130 
131 	mg_log(
132-		type, "%s: %s [%s:%u]",
133-		tag ? tag : "Sokol",
134-		msg ? msg : "No message",
135-		file ? file : "Unknown",
136-		ln
137-	);
138+	    type, "%s: %s [%s:%u]",
139+	    tag ? tag : "Sokol",
140+	    msg ? msg : "No message",
141+	    file ? file : "Unknown",
142+	    ln);
143 }
144 
145 void renderer_backend_create(MGContext* ctx)
146 {
147-	sg_desc desc = {0};
148+	sg_desc desc = { 0 };
149 
150 	ren.ctx = ctx;
151 	ren.pass = 0;
152@@ -182,7 +181,7 @@ void renderer_backend_create(MGContext* ctx)
153 
154 void renderer_backend_begin(void)
155 {
156-	sg_pass pass = {0};
157+	sg_pass pass = { 0 };
158 	i32 width;
159 	i32 height;
160 
161@@ -250,7 +249,7 @@ void renderer_backend_destroy(void)
162 
163 MGMesh renderer_backend_mesh_create(const MGMeshDesc* desc)
164 {
165-	sg_buffer_desc buffer_desc = {0};
166+	sg_buffer_desc buffer_desc = { 0 };
167 	RendererMesh* mesh;
168 	u32 id;
169 
170@@ -275,7 +274,7 @@ MGMesh renderer_backend_mesh_create(const MGMeshDesc* desc)
171 	mesh->vb = sg_make_buffer(&buffer_desc);
172 
173 	/* index buffer */
174-	buffer_desc = (sg_buffer_desc){0};
175+	buffer_desc = (sg_buffer_desc){ 0 };
176 	buffer_desc.usage.vertex_buffer = false;
177 	buffer_desc.usage.index_buffer = true;
178 	buffer_desc.usage.immutable = true;
179@@ -291,7 +290,7 @@ MGMesh renderer_backend_mesh_create(const MGMeshDesc* desc)
180 		if (sg_query_buffer_state(mesh->ib) == SG_RESOURCESTATE_VALID)
181 			sg_destroy_buffer(mesh->ib);
182 
183-		*mesh = (RendererMesh){0};
184+		*mesh = (RendererMesh){ 0 };
185 		mg_log(LOG_ERR, "Failed to create mesh buffers");
186 		return MGMESH_INVALID;
187 	}
188@@ -305,7 +304,7 @@ void renderer_backend_mesh_draw(MGMesh mesh, MGTexture texture, const MGMat4* mv
189 {
190 	RendererMesh* rmesh;
191 	RendererTexture* rtexture;
192-	sg_bindings bindings = {0};
193+	sg_bindings bindings = { 0 };
194 	sg_range uniforms;
195 
196 	if (!ren.pass || !mvp)
197@@ -351,13 +350,13 @@ void renderer_backend_mesh_destroy(MGMesh id)
198 	sg_destroy_buffer(mesh->ib);
199 	sg_destroy_buffer(mesh->vb);
200 
201-	*mesh = (RendererMesh){0};
202+	*mesh = (RendererMesh){ 0 };
203 }
204 
205 MGTexture renderer_backend_texture_load(const char* path)
206 {
207-	sg_image_desc image_desc = {0};
208-	sg_view_desc view_desc = {0};
209+	sg_image_desc image_desc = { 0 };
210+	sg_view_desc view_desc = { 0 };
211 	RendererTexture* texture;
212 	stbi_uc* pixels;
213 	int width;
214@@ -390,12 +389,12 @@ MGTexture renderer_backend_texture_load(const char* path)
215 	image_desc.height = height;
216 	image_desc.pixel_format = SG_PIXELFORMAT_RGBA8;
217 	image_desc.data.mip_levels[0].ptr = pixels;
218-	image_desc.data.mip_levels[0].size =width * height * 4;
219+	image_desc.data.mip_levels[0].size = width * height * 4;
220 
221 	texture->image = sg_make_image(&image_desc);
222 	stbi_image_free(pixels);
223 	if (sg_query_image_state(texture->image) != SG_RESOURCESTATE_VALID) {
224-		*texture = (RendererTexture){0};
225+		*texture = (RendererTexture){ 0 };
226 		mg_log(LOG_ERR, "Failed to create texture: %s", path);
227 		return MGTEXTURE_INVALID;
228 	}
229@@ -405,7 +404,7 @@ MGTexture renderer_backend_texture_load(const char* path)
230 
231 	if (sg_query_view_state(texture->view) != SG_RESOURCESTATE_VALID) {
232 		sg_destroy_image(texture->image);
233-		*texture = (RendererTexture){0};
234+		*texture = (RendererTexture){ 0 };
235 		mg_log(LOG_ERR, "Failed to create texture view: %s", path);
236 		return MGTEXTURE_INVALID;
237 	}
238@@ -430,5 +429,5 @@ void renderer_backend_texture_destroy(MGTexture id)
239 	sg_destroy_view(texture->view);
240 	sg_destroy_image(texture->image);
241 
242-	*texture = (RendererTexture){0};
243+	*texture = (RendererTexture){ 0 };
244 }
+0, -1
1@@ -47,4 +47,3 @@ void mg_log(LogType lt, const char* fmt, ...)
2 	vlog(fd, fmt, ap);
3 	va_end(ap);
4 }
5-