// This code is in the public domain -- castanyo@yahoo.es

#pragma once
#ifndef NV_MESH_RASTER_H
#define NV_MESH_RASTER_H

/** @file Raster.h
 * @brief Rasterization library.
 *
 * This is just a standard scanline rasterizer that I took from one of my old
 * projects. The perspective correction wasn't necessary so I just removed it.
**/

#include "nvmath/Vector.h"
#include "nvmesh/nvmesh.h"

namespace nv
{

    namespace Raster 
    {
        enum Mode {
            Mode_Nearest,
            Mode_Antialiased,
            //Mode_Conservative
        };


        /// A callback to sample the environment. Return false to terminate rasterization.
        typedef bool (NV_CDECL * SamplingCallback)(void * param, int x, int y, Vector3::Arg bar, Vector3::Arg dx, Vector3::Arg dy, float coverage);

        // Process the given triangle. Returns false if rasterization was interrupted by the callback.
        NVMESH_API bool drawTriangle(Mode mode, Vector2::Arg extents, bool enableScissors, const Vector2 v[3], SamplingCallback cb, void * param);

        // Process the given quad. Returns false if rasterization was interrupted by the callback.
        NVMESH_API bool drawQuad(Mode mode, Vector2::Arg extents, bool enableScissors, const Vector2 v[4], SamplingCallback cb, void * param);

        typedef bool (NV_CDECL * LineSamplingCallback)(void * param, int x, int y, float t, float d);    // t is the position along the segment, d is the distance to the line.

        // Process the given line.
        NVMESH_API void drawLine(bool antialias, Vector2::Arg extents, bool enableScissors, const Vector2 v[2], LineSamplingCallback cb, void * param);

        // Draw vertical or horizontal segments. For degenerate triangles.
        //NVMESH_API void drawSegment(Vector2::Arg extents, bool enableScissors, const Vector2 v[2], SamplingCallback cb, void * param);
    }
}


#endif // NV_MESH_RASTER_H