/** * Copyright (c) 2026 Dominic Masters * * This software is released under the MIT License. * https://opensource.org/licenses/MIT */ #include "cube.h" #include "assert/assert.h" mesh_t CUBE_MESH_SIMPLE; meshvertex_t CUBE_MESH_SIMPLE_VERTICES[CUBE_VERTEX_COUNT]; errorret_t cubeInit() { vec3 min = { 0.0f, 0.0f, 0.0f }; vec3 max = { 1.0f, 1.0f, 1.0f }; cubeBuffer( CUBE_MESH_SIMPLE_VERTICES, min, max #if MESH_ENABLE_COLOR , COLOR_WHITE_4B #endif ); errorChain(meshInit( &CUBE_MESH_SIMPLE, CUBE_PRIMITIVE_TYPE, CUBE_VERTEX_COUNT, CUBE_MESH_SIMPLE_VERTICES )); errorOk(); } // Helper macro: set one vertex position, UV and color. #if MESH_ENABLE_COLOR #define CUBE_VERT(i, px, py, pz, u, v) \ vertices[i].color = color; \ vertices[i].pos[0] = (px); \ vertices[i].pos[1] = (py); \ vertices[i].pos[2] = (pz); \ vertices[i].uv[0] = (u); \ vertices[i].uv[1] = (v); #else #define CUBE_VERT(i, px, py, pz, u, v) \ vertices[i].pos[0] = (px); \ vertices[i].pos[1] = (py); \ vertices[i].pos[2] = (pz); \ vertices[i].uv[0] = (u); \ vertices[i].uv[1] = (v); #endif void cubeBuffer( meshvertex_t *vertices, const vec3 min, const vec3 max #if MESH_ENABLE_COLOR , const color_t color #endif ) { assertNotNull(vertices, "Vertices cannot be NULL"); assertNotNull(min, "Min vector cannot be NULL"); assertNotNull(max, "Max vector cannot be NULL"); const float_t x0 = min[0], y0 = min[1], z0 = min[2]; const float_t x1 = max[0], y1 = max[1], z1 = max[2]; // Front face (+Z normal): CCW when viewed from +Z CUBE_VERT( 0, x0, y0, z1, 0.0f, 0.0f); CUBE_VERT( 1, x1, y0, z1, 1.0f, 0.0f); CUBE_VERT( 2, x1, y1, z1, 1.0f, 1.0f); CUBE_VERT( 3, x0, y0, z1, 0.0f, 0.0f); CUBE_VERT( 4, x1, y1, z1, 1.0f, 1.0f); CUBE_VERT( 5, x0, y1, z1, 0.0f, 1.0f); // Back face (-Z normal): CCW when viewed from -Z CUBE_VERT( 6, x1, y0, z0, 0.0f, 0.0f); CUBE_VERT( 7, x0, y0, z0, 1.0f, 0.0f); CUBE_VERT( 8, x0, y1, z0, 1.0f, 1.0f); CUBE_VERT( 9, x1, y0, z0, 0.0f, 0.0f); CUBE_VERT(10, x0, y1, z0, 1.0f, 1.0f); CUBE_VERT(11, x1, y1, z0, 0.0f, 1.0f); // Right face (+X normal): CCW when viewed from +X CUBE_VERT(12, x1, y0, z1, 0.0f, 0.0f); CUBE_VERT(13, x1, y0, z0, 1.0f, 0.0f); CUBE_VERT(14, x1, y1, z0, 1.0f, 1.0f); CUBE_VERT(15, x1, y0, z1, 0.0f, 0.0f); CUBE_VERT(16, x1, y1, z0, 1.0f, 1.0f); CUBE_VERT(17, x1, y1, z1, 0.0f, 1.0f); // Left face (-X normal): CCW when viewed from -X CUBE_VERT(18, x0, y0, z0, 0.0f, 0.0f); CUBE_VERT(19, x0, y0, z1, 1.0f, 0.0f); CUBE_VERT(20, x0, y1, z1, 1.0f, 1.0f); CUBE_VERT(21, x0, y0, z0, 0.0f, 0.0f); CUBE_VERT(22, x0, y1, z1, 1.0f, 1.0f); CUBE_VERT(23, x0, y1, z0, 0.0f, 1.0f); // Top face (+Y normal): CCW when viewed from +Y CUBE_VERT(24, x0, y1, z1, 0.0f, 0.0f); CUBE_VERT(25, x1, y1, z1, 1.0f, 0.0f); CUBE_VERT(26, x1, y1, z0, 1.0f, 1.0f); CUBE_VERT(27, x0, y1, z1, 0.0f, 0.0f); CUBE_VERT(28, x1, y1, z0, 1.0f, 1.0f); CUBE_VERT(29, x0, y1, z0, 0.0f, 1.0f); // Bottom face (-Y normal): CCW when viewed from -Y CUBE_VERT(30, x0, y0, z0, 0.0f, 0.0f); CUBE_VERT(31, x1, y0, z0, 1.0f, 0.0f); CUBE_VERT(32, x1, y0, z1, 1.0f, 1.0f); CUBE_VERT(33, x0, y0, z0, 0.0f, 0.0f); CUBE_VERT(34, x1, y0, z1, 1.0f, 1.0f); CUBE_VERT(35, x0, y0, z1, 0.0f, 1.0f); #undef CUBE_VERT }