#ifndef __MATERIALS_H__ #define __MATERIALS_H__ __device__ float min_wavelength; __device__ float max_wavelength; __device__ float wavelength_step; __device__ unsigned int wavelength_size; enum { INIT = -1, MAX_DEPTH_REACHED, NO_HIT, BULK_ABSORB, SURFACE_ABSORB }; struct Material { float *refractive_index; float *absorption_length; float *scattering_length; }; struct Surface { float *absorption; float *reflection_diffuse; float *reflection_specular; }; __device__ Material materials[100]; __device__ Surface surfaces[100]; __device__ float interp_property(const float &x, const float *fp) { if (x < min_wavelength) return fp[0]; if (x > max_wavelength) return fp[wavelength_size-1]; unsigned int jl = (x-min_wavelength)/wavelength_step; float xl = min_wavelength + jl*wavelength_step; return xl + (x-xl)*(fp[jl+1]-fp[jl])/wavelength_step; } extern "C" { __global__ void set_wavelength_range(float _min_wavelength, float _max_wavelength, float _wavelength_step, unsigned int _wavelength_size) { min_wavelength = _min_wavelength; max_wavelength = _max_wavelength; wavelength_step = _wavelength_step; wavelength_size = _wavelength_size; } __global__ void set_material(int material_index, float *refractive_index, float *absorption_length, float *scattering_length) { materials[material_index].refractive_index = refractive_index; materials[material_index].absorption_length = absorption_length; materials[material_index].scattering_length = scattering_length; } __global__ void set_surface(int surface_index, float *absorption, float *reflection_diffuse, float *reflection_specular) { surfaces[surface_index].absorption = absorption; surfaces[surface_index].reflection_diffuse = reflection_diffuse; surfaces[surface_index].reflection_specular = reflection_specular; } } // extern "c" #endif