118 lines
2.8 KiB
C
118 lines
2.8 KiB
C
#include "Material/Material.h"
|
|
#include <string.h>
|
|
|
|
bool material_collection_init(size_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)
|
|
{
|
|
for (uint8_t i = 0; i < materials->count; i++)
|
|
{
|
|
void* data = materials->buffer[i].data;
|
|
if (data != NULL)
|
|
{
|
|
free(data);
|
|
}
|
|
}
|
|
|
|
free(materials->buffer);
|
|
materials->buffer = NULL;
|
|
}
|
|
}
|
|
|
|
material_entity_t material_create(sample_bsdf_f sample, sample_bsdf_pdf_f sample_pdf, evaluate_bsdf_f evaluate, void* data, size_t size_of_data, material_collection_t* collection)
|
|
{
|
|
material_t material = {0};
|
|
|
|
if (collection->count >= collection->size)
|
|
{
|
|
material_collection_resize(collection, collection->size * 2);
|
|
}
|
|
|
|
material.sample_bsdf = sample;
|
|
material.sample_bsdf_pdf = sample_pdf;
|
|
material.evaluate_bsdf = evaluate;
|
|
material.data = malloc(size_of_data);
|
|
if (material.data == NULL)
|
|
{
|
|
return (material_entity_t){.id = 255};
|
|
}
|
|
|
|
memcpy(material.data, data, size_of_data);
|
|
|
|
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, uint32_t sample_index, uint32_t bounce, float* pdf_out)
|
|
{
|
|
vec3s wi = glms_vec3_zero();
|
|
if (material->sample_bsdf != NULL)
|
|
{
|
|
wi = material->sample_bsdf(material->data, normal, wo, sample_index, bounce, pdf_out);
|
|
}
|
|
|
|
return wi;
|
|
}
|
|
|
|
float sample_material_bsdf_pdf(const material_t* material, vec3s normal, vec3s wo, vec3s wi)
|
|
{
|
|
float pdf = 0.0f;
|
|
if (material->sample_bsdf_pdf != NULL)
|
|
{
|
|
pdf = material->sample_bsdf_pdf(material->data, normal, wo, wi);
|
|
}
|
|
|
|
return pdf;
|
|
}
|
|
|
|
vec3s evaluate_material_bsdf(const material_t* material, const shading_context_t* context)
|
|
{
|
|
vec3s bsdf_color = glms_vec3_zero();
|
|
if (material->evaluate_bsdf != NULL)
|
|
{
|
|
bsdf_color = material->evaluate_bsdf(context, material->data);
|
|
}
|
|
|
|
return bsdf_color;
|
|
}
|