Added three binary files: `golden_gate_hills_1k.hdr`, `rogland_sunset_1k.hdr`, and `studio_small_03_1k.hdr`. Added a new inline function `weight_nee_light` in `BSDF.h` to compute the weighted contribution of light based on the next event estimation (NEE). Added a new function pointer type `sky_free_f` in `Light.h` for freeing sky light data. Added a new structure `hdr_sky_data_t` in `SkyLight.h` to hold HDR sky data, including texture and intensity. Changed the `RAY_EPSILON` definition in `Common.h` to a new value. Changed the `light_collection_free` function in `Light.h` to include freeing sky light data if it exists. Changed the `sky_create_hdr_sky` function in `SkyLight.h` to initialize HDR sky data and compute marginal and conditional distributions. Changed the `texture_load` function in `Texture.h` to accept a `stride` parameter for different texture formats. Changed the `evaluate_bsdf_directional` function in `LightEvaluation.c` to handle light intensity checks. Changed the `evaluate_bsdf_const_sky` function in `SkyLight.c` to use a pointer for sky data and added checks for intensity. Removed TODO comments related to handling triangle and material removal in `Triangle.h` and `Light.h`. Removed the old `weight_sky_light` function in `SkyLight.h` and replaced it with the new `weight_nee_light` function. Updated the `scene_setup` function in `main.c` to change camera position and light direction, and to load HDR textures. Increased the sample count in the rendering configuration in `main.c` for better quality rendering.
54 lines
1.4 KiB
C
54 lines
1.4 KiB
C
#ifndef TRIANGLE_H
|
|
#define TRIANGLE_H
|
|
|
|
#include "Common.h"
|
|
#include "Geometry/AABB.h"
|
|
#include <stdint.h>
|
|
|
|
typedef struct
|
|
{
|
|
vec3s position;
|
|
vec3s normal;
|
|
vec3s tangent;
|
|
vec3s color;
|
|
vec2s uv;
|
|
} vertex_t;
|
|
|
|
typedef struct
|
|
{
|
|
vertex_t vertices[3];
|
|
vec3s face_normal;
|
|
|
|
uint8_t material_id;
|
|
} triangle_t;
|
|
|
|
// TODO: Handle material remove, we can use a lookup array.
|
|
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
|