This is the documentation for Enlighten.

module Triangle Rasteriser

2D triangle rasterizer

A triangle is defined by three sets of floating-point coordinates A pixel is defined as the product of two half-open sets [x,x+1)*[y,y+1) Thus any point is specifically inside one pixel

The aim of this rasterizer is to produce a VERY GOOD rasterization which is suitable for multiple purposes; thus, speed is less of a factor. Formally, instead of producing the set of pixels whose centers lie within the triangle, we produce a set of pixels which overlap the triangle AT ALL and, for each pixel, we produce a set of vertices which define the convex intersection of the pixel square and the triangle. This allows us to calculate the "correct" centroid-sampled position, calculate atlas masks, etc.

To ensure proper seaming between adjacent triangles, all edges are scan-converted from top to bottom.

Note: pixel coordinates are in usual "screen space" i.e. all coordinates positive, (0,0) is top-left

Classes

Name Description
Geo::RastFragment

stores a fragment of a triangle i.e. a triangle clipped to a pixel box

Geo::RastTri

records details of the input triangle

Geo::RastVert

stores a rasterization vertex, including barycentric coordinates

Functions

Name Description
GetArea()

get signed area of fragment polygon; it's flipped if area < 0

GetBarycentricCoords(float, float, float &, float &)

Gets the barycentric coords of the given point (x, y).

GetBarycentricCoords(float, float, float &, float &)

get barycentric coordinates of a point in the pixel

GetCentroid(RastVert &)

get centroid of fragment polygon (average of vertex positions)

IsPtInPoly(float, float)

is a given point in the fragment polygon?

RasterizeTriangle(float, float, float, float, float, float, RasterizationClient, void *)

rasterize a triangle

RasterizeWindingAgnosticTriangle(float, float, float, float, float, float, RasterizationClient, void *)

rasterize a triangle regardless of winding order

RastTri(float, float, float, float, float, float)

Constructor.

RastVert()

Constructors.

RastVert(float, float, float, float)

Constructors.

Variables

Name Description
float m_dX2

x2-x1, y2-y1

float m_dX3

x3-x1, y3-y1

float m_dY2

x2-x1, y2-y1

float m_dY3

x3-x1, y3-y1

Geo::u32 m_NumPts

number of points in fragment polygon

const RastVert * m_Points

fragment polygon points; coordinates are in [0,1]x[0,1] i.e.

const RastTri * m_Tri

reference to triangle that owns this fragment

float m_U

Barycentric coordinates.

float m_V

Barycentric coordinates.

float m_X

Vertex position.

Geo::s32 m_X

integer coordinates of (top-left of) pixel

float m_X1

x1, y1

float m_Y

Vertex position.

Geo::s32 m_Y

integer coordinates of (top-left of) pixel

float m_Y1

x1, y1

Typedefs

Name Description
void(* RasterizationClient)(const RastFragment *fragment, void *user)

callback function for rasterization


float Geo::RastFragment::GetArea


public: float GetArea() const


get signed area of fragment polygon; it's flipped if area < 0


void Geo::RastTri::GetBarycentricCoords


public: void GetBarycentricCoords
(
    float x,
    float y,
    float & u,
    float & v
) const


Gets the barycentric coords of the given point (x, y).


void Geo::RastFragment::GetBarycentricCoords


public: void GetBarycentricCoords
(
    float x,
    float y,
    float & u,
    float & v
) const


get barycentric coordinates of a point in the pixel


void Geo::RastFragment::GetCentroid


public: void GetCentroid
(
    RastVert & out
) const


get centroid of fragment polygon (average of vertex positions)


bool Geo::RastFragment::IsPtInPoly


public: bool IsPtInPoly
(
    float x,
    float y
) const


is a given point in the fragment polygon?


void Geo::RasterizeTriangle


public: void RasterizeTriangle
(
    float x1,
    float y1,
    float x2,
    float y2,
    float x3,
    float y3,
    RasterizationClient emitter,
    void * user
)


rasterize a triangle


void Geo::RasterizeWindingAgnosticTriangle


public: void RasterizeWindingAgnosticTriangle
(
    float x1,
    float y1,
    float x2,
    float y2,
    float x3,
    float y3,
    RasterizationClient emitter,
    void * user
)


rasterize a triangle regardless of winding order


Geo::RastTri::RastTri


public: RastTri
(
    float x1,
    float y1,
    float x2,
    float y2,
    float x3,
    float y3
)


Constructor.


Geo::RastVert::RastVert


public: RastVert()


Constructors.


Geo::RastVert::RastVert


public: RastVert
(
    float x,
    float y,
    float u,
    float v
)


Constructors.