#ifndef TRIANGLE_H #define TRIANGLE_H #include "Common.h" #include "Geometry/AABB.h" #include typedef struct { vec3s position; vec3s normal; vec3s color; vec2s uv; } vertex_t; typedef struct { vertex_t vertices[3]; vec3s face_normal; uint8_t material_id; } triangle_t; //TODO: Handle triangle remove, we can use something like sparse set. typedef struct { uint64_t count; uint64_t size; triangle_t* buffer; } triangle_collection_t; bool triangle_collection_init(size_t size, triangle_collection_t* triangles); void triangle_collection_resize(triangle_collection_t* collection, size_t size); void triangle_collection_free(triangle_collection_t* collection); void triangle_create(vertex_t v1, vertex_t v2, vertex_t v3, uint8_t material_id, triangle_collection_t* collection); inline vec3s triangle_centroid(const triangle_t triangle) { return glms_vec3_scale(glms_vec3_add(glms_vec3_add(triangle.vertices[0].position, triangle.vertices[1].position), triangle.vertices[2].position), 1.0f / 3.0f); } inline aabb_t compute_bounds_triangle(triangle_t triangle) { aabb_t bounds; bounds.min = glms_vec3_minv(triangle.vertices[0].position, glms_vec3_minv(triangle.vertices[1].position, triangle.vertices[2].position)); bounds.max = glms_vec3_maxv(triangle.vertices[0].position, glms_vec3_maxv(triangle.vertices[1].position, triangle.vertices[2].position)); return bounds; } #endif // TRIANGLE_H