/** * Copyright (c) 2026 Dominic Masters * * This software is released under the MIT License. * https://opensource.org/licenses/MIT */ #include "triprism.h" #include "assert/assert.h" mesh_t TRIPRISM_MESH_SIMPLE; meshvertex_t TRIPRISM_MESH_SIMPLE_VERTICES[TRIPRISM_VERTEX_COUNT]; errorret_t triPrismInit() { triPrismBuffer( TRIPRISM_MESH_SIMPLE_VERTICES, 0.0f, 0.0f, /* p0: bottom-left */ 1.0f, 0.0f, /* p1: bottom-right */ 0.5f, 1.0f, /* p2: apex */ 0.0f, 1.0f /* minZ, maxZ */ #if MESH_ENABLE_COLOR , COLOR_WHITE_4B #endif ); errorChain(meshInit( &TRIPRISM_MESH_SIMPLE, TRIPRISM_PRIMITIVE_TYPE, TRIPRISM_VERTEX_COUNT, TRIPRISM_MESH_SIMPLE_VERTICES )); errorOk(); } void triPrismBuffer( meshvertex_t *vertices, const float_t x0, const float_t y0, const float_t x1, const float_t y1, const float_t x2, const float_t y2, const float_t minZ, const float_t maxZ #if MESH_ENABLE_COLOR , const color_t color #endif ) { assertNotNull(vertices, "Vertices cannot be NULL"); /* Helper macro: write one vertex then advance index. */ int32_t vi = 0; #if MESH_ENABLE_COLOR #define PRISM_VERT(px, py, pz, u, v) \ vertices[vi].color = color; \ vertices[vi].pos[0] = (px); \ vertices[vi].pos[1] = (py); \ vertices[vi].pos[2] = (pz); \ vertices[vi].uv[0] = (u); \ vertices[vi].uv[1] = (v); \ vi++; #else #define PRISM_VERT(px, py, pz, u, v) \ vertices[vi].pos[0] = (px); \ vertices[vi].pos[1] = (py); \ vertices[vi].pos[2] = (pz); \ vertices[vi].uv[0] = (u); \ vertices[vi].uv[1] = (v); \ vi++; #endif /* --- Front face (z = maxZ), CCW from +Z --- */ PRISM_VERT(x0, y0, maxZ, 0.0f, 0.0f) PRISM_VERT(x1, y1, maxZ, 1.0f, 0.0f) PRISM_VERT(x2, y2, maxZ, 0.5f, 1.0f) /* --- Back face (z = minZ), CCW from -Z (reverse winding) --- */ PRISM_VERT(x2, y2, minZ, 0.5f, 1.0f) PRISM_VERT(x1, y1, minZ, 1.0f, 0.0f) PRISM_VERT(x0, y0, minZ, 0.0f, 0.0f) /* --- Side face 0: edge p0->p1 --- */ PRISM_VERT(x0, y0, minZ, 0.0f, 0.0f) PRISM_VERT(x1, y1, minZ, 1.0f, 0.0f) PRISM_VERT(x1, y1, maxZ, 1.0f, 1.0f) PRISM_VERT(x0, y0, minZ, 0.0f, 0.0f) PRISM_VERT(x1, y1, maxZ, 1.0f, 1.0f) PRISM_VERT(x0, y0, maxZ, 0.0f, 1.0f) /* --- Side face 1: edge p1->p2 --- */ PRISM_VERT(x1, y1, minZ, 0.0f, 0.0f) PRISM_VERT(x2, y2, minZ, 1.0f, 0.0f) PRISM_VERT(x2, y2, maxZ, 1.0f, 1.0f) PRISM_VERT(x1, y1, minZ, 0.0f, 0.0f) PRISM_VERT(x2, y2, maxZ, 1.0f, 1.0f) PRISM_VERT(x1, y1, maxZ, 0.0f, 1.0f) /* --- Side face 2: edge p2->p0 --- */ PRISM_VERT(x2, y2, minZ, 0.0f, 0.0f) PRISM_VERT(x0, y0, minZ, 1.0f, 0.0f) PRISM_VERT(x0, y0, maxZ, 1.0f, 1.0f) PRISM_VERT(x2, y2, minZ, 0.0f, 0.0f) PRISM_VERT(x0, y0, maxZ, 1.0f, 1.0f) PRISM_VERT(x2, y2, maxZ, 0.0f, 1.0f) #undef PRISM_VERT }