Initial upload
This commit is contained in:
80
source/Material.c
Normal file
80
source/Material.c
Normal file
@@ -0,0 +1,80 @@
|
||||
#include "Material.h"
|
||||
|
||||
material_collection_t material_collection_create(size_t size)
|
||||
{
|
||||
if (size > 254)
|
||||
{
|
||||
size = 254; // Limit the count to 254 to fit in a uint8_t
|
||||
}
|
||||
|
||||
material_collection_t collection = {0};
|
||||
collection.buffer = (material_t*)malloc(size * sizeof(material_t));
|
||||
collection.size = (uint8_t)size;
|
||||
return collection;
|
||||
}
|
||||
|
||||
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 = 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_t material_create(const sample_bsdf_f sample, const evaluate_bsdf_f evaluate, void* 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.evaluate_bsdf = evaluate;
|
||||
material.data = data;
|
||||
material.id = collection->count;
|
||||
|
||||
collection->buffer[collection->count] = material;
|
||||
collection->count++;
|
||||
|
||||
return material;
|
||||
}
|
||||
|
||||
vec3s sample_material_bsdf(material_t* material, const vec3s normal, const vec3s wo, float* pdf_out)
|
||||
{
|
||||
vec3s wi = glms_vec3_zero();
|
||||
if (material->sample_bsdf != NULL)
|
||||
{
|
||||
wi = material->sample_bsdf(material->data, normal, wo, pdf_out);
|
||||
}
|
||||
|
||||
return wi;
|
||||
}
|
||||
|
||||
vec3s evaluate_material_bsdf(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;
|
||||
}
|
||||
Reference in New Issue
Block a user