// Copyright 2009-2021 Intel Corporation // SPDX-License-Identifier: Apache-2.0 #pragma once #include "../device_default.isph" #include "../core/differential_geometry.isph" struct Light; enum TutorialLightType { LIGHT_AMBIENT, LIGHT_POINT, LIGHT_DIRECTIONAL, LIGHT_SPOT, LIGHT_DISTANT, LIGHT_TRIANGLE, LIGHT_QUAD, }; struct Light_SampleRes { Vec3f weight; //!< radiance that arrives at the given point divided by pdf Vec3f dir; //!< direction towards the light source float dist; //!< largest valid t_far value for a shadow ray float pdf; //!< probability density that this sample was taken }; //! compute the weighted radiance at a point caused by a sample on the light source // by convention, giving (0, 0) as "random" numbers should sample the "center" // of the light source (used by the raytracing renderers such as the OBJ renderer) typedef Light_SampleRes (*Light_SampleFunc)(const uniform Light* uniform self, const DifferentialGeometry& dg, /*! point to generate the sample for >*/ const Vec2f& s); /*! random numbers to generate the sample >*/ struct Light_EvalRes { Vec3f value; //!< radiance that arrives at the given point (not weighted by pdf) float dist; float pdf; //!< probability density that the direction would have been sampled }; //! compute the radiance, distance and pdf caused by the light source (pointed to by the given direction) typedef Light_EvalRes (*Light_EvalFunc)(const uniform Light* uniform self, const DifferentialGeometry& dg, /*! point to evaluate illumination for >*/ const Vec3f& dir); /*! direction towards the light source >*/ struct Light { //Light_SampleFunc sample; //Light_EvalFunc eval; TutorialLightType type; }; SYCL_EXTERNAL Light_EvalRes Light_eval(const uniform Light* uniform self, const DifferentialGeometry& dg, const Vec3f& dir); inline void Light_Constructor(uniform Light* uniform self) { //self->eval = GET_FUNCTION_POINTER(Light_eval); }