116 lines
2.9 KiB
C
116 lines
2.9 KiB
C
/**
|
|
* Copyright (c) 2026 Dominic Masters
|
|
*
|
|
* This software is released under the MIT License.
|
|
* https://opensource.org/licenses/MIT
|
|
*/
|
|
|
|
#include "mesh.h"
|
|
#include "util/memory.h"
|
|
#include "assert/assert.h"
|
|
#include "util/math.h"
|
|
|
|
errorret_t meshInit(
|
|
mesh_t *mesh,
|
|
const meshprimitivetype_t primitiveType,
|
|
const int32_t vertexCount,
|
|
const meshvertex_t *vertices
|
|
) {
|
|
assertNotNull(mesh, "Mesh cannot be NULL");
|
|
assertNotNull(vertices, "Vertices cannot be NULL");
|
|
assertTrue(vertexCount > 0, "Vertex count must be greater than 0");
|
|
|
|
memoryZero(mesh, sizeof(mesh_t));
|
|
|
|
errorChain(meshInitPlatform(mesh, primitiveType, vertexCount, vertices));
|
|
errorOk();
|
|
}
|
|
|
|
errorret_t meshFlush(
|
|
mesh_t *mesh,
|
|
const int32_t vertexOffset,
|
|
const int32_t vertexCount
|
|
) {
|
|
#ifdef meshFlushPlatform
|
|
assertNotNull(mesh, "Mesh cannot be NULL");
|
|
assertTrue(vertexOffset >= 0, "Vertex offset must be non-negative.");
|
|
assertTrue(
|
|
vertexCount == -1 || vertexCount > 0, "Vertex count incorrect."
|
|
);
|
|
|
|
int32_t vertCount = meshGetVertexCount(mesh);
|
|
assertTrue(
|
|
vertexOffset < (vertCount - 1), "Need at least one vert to draw"
|
|
);
|
|
|
|
int32_t drawCount = vertexCount;
|
|
if(vertexCount == -1) {
|
|
drawCount = vertCount - vertexOffset;
|
|
}
|
|
|
|
errorChain(meshFlushPlatform(mesh, vertexOffset, vertexCount));
|
|
#endif
|
|
errorOk();
|
|
}
|
|
|
|
errorret_t meshDraw(
|
|
const mesh_t *mesh,
|
|
const int32_t vertexOffset,
|
|
const int32_t vertexCount
|
|
) {
|
|
assertNotNull(mesh, "Mesh cannot be NULL");
|
|
assertTrue(vertexOffset >= 0, "Vertex offset must be non-negative");
|
|
assertTrue(vertexCount == -1 || vertexCount > 0, "Incorrect vert count");
|
|
|
|
int32_t vertDrawCount = vertexCount;
|
|
if(vertexCount == -1) {
|
|
const int32_t totalVertices = meshGetVertexCount(mesh);
|
|
vertDrawCount = totalVertices - vertexOffset;
|
|
}
|
|
|
|
if(vertDrawCount == 0) {
|
|
errorOk();
|
|
}
|
|
assertTrue(
|
|
vertexOffset + vertDrawCount <= meshGetVertexCount(mesh),
|
|
"Vertex offset and count must be within vertex count bounds"
|
|
);
|
|
|
|
errorChain(meshDrawPlatform(mesh, vertexOffset, vertDrawCount));
|
|
errorOk();
|
|
}
|
|
|
|
void meshGetBounds(
|
|
const mesh_t *mesh,
|
|
vec3 outMin,
|
|
vec3 outMax
|
|
) {
|
|
assertNotNull(mesh, "Mesh cannot be NULL");
|
|
assertNotNull(outMin, "Output min cannot be NULL");
|
|
assertNotNull(outMax, "Output max cannot be NULL");
|
|
|
|
for(int i = 0; i < 3; i++) {
|
|
outMin[i] = FLT_MAX;
|
|
outMax[i] = -FLT_MAX;
|
|
}
|
|
|
|
for(uint32_t i = 0; i < mesh->vertexCount; i++) {
|
|
meshvertex_t vert = mesh->vertices[i];
|
|
for(int j = 0; j < 3; j++) {
|
|
outMin[j] = mathMin(outMin[j], vert.pos[j]);
|
|
outMax[j] = mathMax(outMax[j], vert.pos[j]);
|
|
}
|
|
}
|
|
}
|
|
|
|
int32_t meshGetVertexCount(const mesh_t *mesh) {
|
|
assertNotNull(mesh, "Mesh cannot be NULL");
|
|
return meshGetVertexCountPlatform(mesh);
|
|
}
|
|
|
|
errorret_t meshDispose(mesh_t *mesh) {
|
|
assertNotNull(mesh, "Mesh cannot be NULL");
|
|
errorChain(meshDisposePlatform(mesh));
|
|
memoryZero(mesh, sizeof(mesh_t));
|
|
errorOk();
|
|
} |