// Copyright 2009-2021 Intel Corporation
// SPDX-License-Identifier: Apache-2.0

#pragma once
#include <math/vec.h>
// #include "helper.hpp"

struct Sample;

namespace embree {
    enum LightType {
        LIGHT_AMBIENT,
        LIGHT_POINT,
        LIGHT_DIRECTIONAL,
        LIGHT_SPOT,
        LIGHT_DISTANT,
        LIGHT_TRIANGLE,
        LIGHT_QUAD,
    };

    struct Light {
        //Light_SampleFunc sample;
        //Light_EvalFunc eval;
        LightType type;
    };

    struct Light_EvalRes {
        Vec3fa 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 Light* self,
                                            const Sample& sp, /*! point to evaluate illumination for >*/
                                            const Vec3fa& dir); /*! direction towards the light source >*/

    Light_EvalRes Light_eval(const Light* self, const Sample& sp, const Vec3fa& dir);

    inline void Light_Constructor(Light* self) {
        //self->eval = GET_FUNCTION_POINTER(Light_eval);
    }


    struct Light_SampleRes {
        Vec3fa weight; //!< radiance that arrives at the given point divided by pdf
        Vec3fa 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 Light* self,
                                                const Sample& sp, /*! point to generate the sample for >*/
                                                const Vec2f& s); /*! random numbers to generate the sample >*/
} // namespace embree
