Exemplo n.º 1
0
        private void DrawTriangle(VertexPT [] triVs)
        {
            if (culling != Culling.None)
            {
                // Cull by normal
                //double3 n = GetPerspectiveTriangleNormal ( new double3 [] { triVs [0].P, triVs [1].P, triVs [2].P },
                //    culling == Culling.Ccw ? CycleDir.Ccw : CycleDir.Cw );

                //if ( ( n & double3.UnitZ ) >= 0 )
                //    return;

                // Cull by order
                CycleDir triOrder = GetPerspectiveTriangleOrder(new double3 [] { triVs [0].P, triVs [1].P, triVs [2].P });

                if ((triOrder == CycleDir.Ccw && culling == Culling.Ccw) ||
                    (triOrder == CycleDir.Cw && culling == Culling.Cw))
                {
                    return;
                }
            }

            VertexPT [][] vss = ClipTriangleByZ(
                triVs,
                nearZ, 1);

            foreach (VertexPT [] clippedVs in vss)
            {
                DrawClippedAndCulledTriangle(clippedVs [0], clippedVs [1], clippedVs [2]);
            }
        }
Exemplo n.º 2
0
        double3 GetPerspectiveTriangleNormal(double3 [] pts, CycleDir cycleDir)
        {
            for (int i = 0; i < pts.Length; i++)
            {
                double z = pts [i].z <= 0 ? 1e-5 : pts [i].z;
                pts [i].xy /= z;
            }

            if (cycleDir == CycleDir.Cw)
            {
                return(((pts [1] - pts [0]) * (pts [2] - pts [1])).Normalized);
            }
            else
            {
                return(((pts [2] - pts [1]) * (pts [1] - pts [0])).Normalized);
            }
        }