115 lines
3.3 KiB
C
115 lines
3.3 KiB
C
/**
|
|
* 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
|
|
}
|