107 lines
2.9 KiB
C
107 lines
2.9 KiB
C
/**
|
|
* 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
|
|
}
|