Files
SimpleRayTracing/header/Material/Material.h
Misaki 3de6b83d32 Set C standard to C11 and add new assets
Changed CMakeLists.txt to set the C standard to C11.
Added multiple binary image files for new visual assets.
Added several new image files to enhance rendering capabilities.
Changed stb_image.h to improve support for various image formats.
Changed ray tracing engine to enhance ray creation and intersection.
Changed triangle structure to use a vertex array for better attribute handling.
Changed scene initialization to accommodate new texture management.
2025-04-29 01:43:52 +09:00

61 lines
2.4 KiB
C

#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