#ifndef TRIANGLE_H #define TRIANGLE_H #include "Common.h" #include "Geometry/AABB.h" #include typedef struct { vec3s point_1; vec3s point_2; vec3s point_3; vec3s normal_1; vec3s normal_2; vec3s normal_3; vec3s normal_face; // Interpolated normal, not used in the triangle itself, but for ray intersection. 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_with_normals(vec3s point1, vec3s point2, vec3s point3, vec3s normal1, vec3s normal2, vec3s normal3, uint8_t material_id, triangle_collection_t* collection); void triangle_create(vec3s point1, vec3s point2, vec3s point3, 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.point_1, triangle.point_2), triangle.point_3), 1.0f / 3.0f); } inline aabb_t compute_bounds_triangle(triangle_t triangle) { aabb_t bounds; bounds.min = glms_vec3_minv(triangle.point_1, glms_vec3_minv(triangle.point_2, triangle.point_3)); bounds.max = glms_vec3_maxv(triangle.point_1, glms_vec3_maxv(triangle.point_2, triangle.point_3)); return bounds; } #endif // TRIANGLE_H