Example #1
0
    void FillTriangle(Vertex v1, Vertex v2, Vertex v3, Bitmap texture)
    {
        var     screenSpace = Matrix4Utils.ScreenSpace(Width / 2, Height / 2);
        Matrix4 iden        = Matrix4.Identity;
        Vertex  minYVert    = v1.Transform(screenSpace, iden).PerspectiveDivide();
        Vertex  midYVert    = v2.Transform(screenSpace, iden).PerspectiveDivide();
        Vertex  maxYVert    = v3.Transform(screenSpace, iden).PerspectiveDivide();

        if (minYVert.TriangleAreaTimesTwo(maxYVert, midYVert) >= 0)
        {
            return;
        }

        if (maxYVert.Y < midYVert.Y)
        {
            Swap(ref maxYVert, ref midYVert);
        }
        if (midYVert.Y < minYVert.Y)
        {
            Swap(ref midYVert, ref minYVert);
        }
        if (maxYVert.Y < midYVert.Y)
        {
            Swap(ref maxYVert, ref midYVert);
        }

        float a = minYVert.TriangleAreaTimesTwo(maxYVert, midYVert);

        ScanTriangle(minYVert, midYVert, maxYVert, a >= 0, texture);
    }