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]); } }
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); } }