/** * Copyright (c) 2026 Dominic Masters * * This software is released under the MIT License. * https://opensource.org/licenses/MIT */ #include "quad.h" #include "assert/assert.h" mesh_t QUAD_MESH_SIMPLE; meshvertex_t QUAD_MESH_SIMPLE_VERTICES[QUAD_VERTEX_COUNT] = { { #if MESH_ENABLE_COLOR .color = COLOR_WHITE_4B, #endif .uv = { 0.0f, 0.0f }, .pos = { 0.0f, 0.0f, 0.0f } }, { #if MESH_ENABLE_COLOR .color = COLOR_WHITE_4B, #endif .uv = { 1.0f, 0.0f }, .pos = { 1.0f, 0.0f, 0.0f } }, { #if MESH_ENABLE_COLOR .color = COLOR_WHITE_4B, #endif .uv = { 1.0f, 1.0f }, .pos = { 1.0f, 1.0f, 0.0f } }, { #if MESH_ENABLE_COLOR .color = COLOR_WHITE_4B, #endif .uv = { 0.0f, 0.0f }, .pos = { 0.0f, 0.0f, 0.0f } }, { #if MESH_ENABLE_COLOR .color = COLOR_WHITE_4B, #endif .uv = { 1.0f, 1.0f }, .pos = { 1.0f, 1.0f, 0.0f } }, { #if MESH_ENABLE_COLOR .color = COLOR_WHITE_4B, #endif .uv = { 0.0f, 1.0f }, .pos = { 0.0f, 1.0f, 0.0f } } }; errorret_t quadInit() { errorChain(meshInit( &QUAD_MESH_SIMPLE, QUAD_PRIMITIVE_TYPE, QUAD_VERTEX_COUNT, QUAD_MESH_SIMPLE_VERTICES )); errorOk(); } void quadBuffer( meshvertex_t *vertices, const float_t minX, const float_t minY, const float_t maxX, const float_t maxY, const float_t u0, const float_t v0, const float_t u1, const float_t v1 #if MESH_ENABLE_COLOR , const color_t color #endif ) { const float_t z = 0.0f; // Z coordinate for 2D rendering assertNotNull(vertices, "Vertices cannot be NULL"); // First triangle #if MESH_ENABLE_COLOR vertices[0].color = color; #endif vertices[0].uv[0] = u0; vertices[0].uv[1] = v1; vertices[0].pos[0] = minX; vertices[0].pos[1] = maxY; vertices[0].pos[2] = z; #if MESH_ENABLE_COLOR vertices[1].color = color; #endif vertices[1].uv[0] = u1; vertices[1].uv[1] = v0; vertices[1].pos[0] = maxX; vertices[1].pos[1] = minY; vertices[1].pos[2] = z; #if MESH_ENABLE_COLOR vertices[2].color = color; #endif vertices[2].uv[0] = u0; vertices[2].uv[1] = v0; vertices[2].pos[0] = minX; vertices[2].pos[1] = minY; vertices[2].pos[2] = z; // Second triangle #if MESH_ENABLE_COLOR vertices[3].color = color; #endif vertices[3].uv[0] = u0; vertices[3].uv[1] = v1; vertices[3].pos[0] = minX; vertices[3].pos[1] = maxY; vertices[3].pos[2] = z; #if MESH_ENABLE_COLOR vertices[4].color = color; #endif vertices[4].uv[0] = u1; vertices[4].uv[1] = v1; vertices[4].pos[0] = maxX; vertices[4].pos[1] = maxY; vertices[4].pos[2] = z; #if MESH_ENABLE_COLOR vertices[5].color = color; #endif vertices[5].uv[0] = u1; vertices[5].uv[1] = v0; vertices[5].pos[0] = maxX; vertices[5].pos[1] = minY; vertices[5].pos[2] = z; } void quadBuffer3D( meshvertex_t *vertices, const vec3 min, const vec3 max, const vec2 uvMin, const vec2 uvMax #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"); assertNotNull(uvMin, "UV Min vector cannot be NULL"); assertNotNull(uvMax, "UV Max vector cannot be NULL"); // First triangle #if MESH_ENABLE_COLOR vertices[0].color = color; #endif vertices[0].uv[0] = uvMin[0]; vertices[0].uv[1] = uvMin[1]; vertices[0].pos[0] = min[0]; vertices[0].pos[1] = min[1]; vertices[0].pos[2] = min[2]; #if MESH_ENABLE_COLOR vertices[1].color = color; #endif vertices[1].uv[0] = uvMax[0]; vertices[1].uv[1] = uvMin[1]; vertices[1].pos[0] = max[0]; vertices[1].pos[1] = min[1]; vertices[1].pos[2] = min[2]; #if MESH_ENABLE_COLOR vertices[2].color = color; #endif vertices[2].uv[0] = uvMax[0]; vertices[2].uv[1] = uvMax[1]; vertices[2].pos[0] = max[0]; vertices[2].pos[1] = max[1]; vertices[2].pos[2] = min[2]; // Second triangle #if MESH_ENABLE_COLOR vertices[3].color = color; #endif vertices[3].uv[0] = uvMin[0]; vertices[3].uv[1] = uvMin[1]; vertices[3].pos[0] = min[0]; vertices[3].pos[1] = min[1]; vertices[3].pos[2] = min[2]; #if MESH_ENABLE_COLOR vertices[4].color = color; #endif vertices[4].uv[0] = uvMax[0]; vertices[4].uv[1] = uvMax[1]; vertices[4].pos[0] = max[0]; vertices[4].pos[1] = max[1]; vertices[4].pos[2] = min[2]; #if MESH_ENABLE_COLOR vertices[5].color = color; #endif vertices[5].uv[0] = uvMin[0]; vertices[5].uv[1] = uvMax[1]; vertices[5].pos[0] = min[0]; vertices[5].pos[1] = max[1]; vertices[5].pos[2] = min[2]; }