#include "Material/Material.h" #include bool material_collection_init(uint8_t size, material_collection_t* materials) { if (size > 254) { size = 254; } material_collection_t temp = {0}; temp.buffer = (material_t*)malloc(size * sizeof(material_t)); if (temp.buffer == NULL) { return false; } temp.size = (uint8_t)size; temp.count = 0; *materials = temp; return true; } void material_collection_resize(material_collection_t* materials, size_t size) { if (size > 254) { size = 254; // Limit the count to 254 to fit in a uint8_t } material_t* temp = (material_t*)realloc(materials->buffer, size * sizeof(material_t)); if (temp != NULL) { materials->buffer = temp; materials->size = (uint8_t)size; } } void material_collection_free(material_collection_t* materials) { if (materials->buffer != NULL) { free(materials->buffer); materials->buffer = NULL; } } 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) { material_t material = {0}; if (collection->count >= collection->size) { material_collection_resize(collection, collection->size * 2); } memcpy(material.properties, properties, properties_size); material.compute_surface_data = surface_data; material.sample_bsdf = sample; material.sample_bsdf_pdf = sample_pdf; material.evaluate_bsdf = evaluate; material_entity_t entity = {.id = collection->count}; collection->buffer[collection->count] = material; collection->count++; return entity; } vec3s sample_material_bsdf(const material_t* material, vec3s normal, vec3s wo, vec2s uv, uint32_t sample_index, uint32_t bounce, float* pdf_out) { vec3s wi = glms_vec3_zero(); if (material->compute_surface_data != NULL && material->sample_bsdf != NULL) { shading_context_t context = { .normal = normal, .wo = wo, .uv = uv, }; wi = material->sample_bsdf(&context, material->properties, material->compute_surface_data, sample_index, bounce, pdf_out); } return wi; } float sample_material_bsdf_pdf(const material_t* material, vec3s normal, vec3s wo, vec3s wi, vec2s uv) { float pdf = 0.0f; if (material->compute_surface_data != NULL && material->sample_bsdf_pdf != NULL) { shading_context_t context = { .normal = normal, .wo = wo, .wi = wi, .uv = uv, }; pdf = material->sample_bsdf_pdf(&context, material->properties, material->compute_surface_data); } return pdf; } vec3s evaluate_material_bsdf(const material_t* material, const shading_context_t* context) { vec3s bsdf_color = glms_vec3_zero(); if (material->compute_surface_data != NULL && material->evaluate_bsdf != NULL) { bsdf_color = material->evaluate_bsdf(context, material->properties, material->compute_surface_data); } return bsdf_color; }