#ifndef MATERIAL_H #define MATERIAL_H #include "Algorithm/Sobol.h" #include "Common.h" #define PROPERTY_SIZE 64 #define INVALID_MATERIAL_ID 255 typedef struct { vec3s normal; vec3s position; vec3s wi; vec3s wo; vec2s uv; } shading_context_t; typedef void (*compute_surface_data_f)(const shading_context_t* context, const void* properties, void* surface_data_out); typedef vec3s (*sample_bsdf_f)(const shading_context_t* context, const void* properties, const compute_surface_data_f compute_surface_data, uint32_t index, uint32_t bounce, float* pdf_out); typedef float (*sample_bsdf_pdf_f)(const shading_context_t* context, const void* properties, const compute_surface_data_f compute_surface_data); typedef vec3s (*evaluate_bsdf_f)(const shading_context_t* context, const void* properties, const compute_surface_data_f compute_surface_data); typedef struct { char properties[PROPERTY_SIZE]; // TODO: alpha, displacement, etc. vec3s emission; // We have to have emission outside of data because data is only for bsdf, and emission is not part of bsdf. Maybe another shading properties struct is needed if the number of properties increases. compute_surface_data_f compute_surface_data; sample_bsdf_f sample_bsdf; sample_bsdf_pdf_f sample_bsdf_pdf; evaluate_bsdf_f evaluate_bsdf; } material_t; typedef struct { uint8_t id; } material_entity_t; // TODO: Handle material remove, we can use something like sparse set. // NOTE: 255 is invalid typedef struct { uint8_t count; uint8_t size; material_t* buffer; } material_collection_t; bool material_collection_init(uint8_t size, material_collection_t* materials); void material_collection_resize(material_collection_t* materials, size_t size); void material_collection_free(material_collection_t* materials); material_entity_t material_create(const void* properties, size_t properties_size, compute_surface_data_f surface_data, sample_bsdf_f sample, sample_bsdf_pdf_f sample_pdf, evaluate_bsdf_f evaluate, material_collection_t* collection); vec3s sample_material_bsdf(const material_t* material, vec3s normal, vec3s wo, vec2s uv, uint32_t sample_index, uint32_t bounce, float* pdf_out); float sample_material_bsdf_pdf(const material_t* material, vec3s normal, vec3s wo, vec3s wi, vec2s uv); vec3s evaluate_material_bsdf(const material_t* material, const shading_context_t* context); #endif // MATERIAL_H