Example #1
0
        private void ProcessScanLine(ScanLine data, Vertex va, Vertex vb, Vertex vc, Vertex vd, Color4 color)
        {
            Vector3 pointA = va.Coordinates;
            Vector3 pointB = vb.Coordinates;
            Vector3 pointC = vc.Coordinates;
            Vector3 pointD = vd.Coordinates;

            var gradient1 = pointA.Y != pointB.Y ? (data.CurrentY - pointA.Y) / (pointB.Y - pointA.Y) : 1;
            var gradient2 = pointC.Y != pointD.Y ? (data.CurrentY - pointC.Y) / (pointD.Y - pointC.Y) : 1;

            int sx = (int)Interpolate(pointA.X, pointB.X, gradient1);
            int ex = (int)Interpolate(pointC.X, pointD.X, gradient2);

            double z1 = Interpolate(pointA.Z, pointB.Z, gradient1);
            double z2 = Interpolate(pointC.Z, pointD.Z, gradient2);

            ShadingAlgorithm.InterpolateValue(data, gradient1, gradient2);

            // var snl = Interpolate(data.NormalAndLightDotProductA, data.NormalAndLightDotProductB, gradient1);
            // var enl = Interpolate(data.NormalAndLightDotProductC, data.NormalAndLightDotProductD, gradient2);

            for (var x = sx; x < ex; x++)
            {
                double gradient = (x - sx) / (double)(ex - sx);

                var z           = Interpolate(z1, z2, gradient);
                var ndotl       = ShadingAlgorithm.ComputeShadingCoefficient(gradient, data);
                var shaded      = color * (float)ndotl;
                var I           = (float)PhongReflection.PhongReflectionValue;
                var illuminated = new Color4(Check(shaded.Red + I), Check(shaded.Green + I), Check(shaded.Blue + I), shaded.Alpha);
                DrawPoint(new Vector3(x, data.CurrentY, (float)z), illuminated);
            }
        }
Example #2
0
 public void InterpolateValue(ScanLine scanLineData, float gradient1, float gradient2)
 {
 }
Example #3
0
 public double ComputeShadingCoefficient(double gradient, ScanLine scanLine)
 {
     return(scanLine.FaceNormalAndLightDotProduct);
 }
Example #4
0
        private void DrawTriangle(Vertex v1, Vertex v2, Vertex v3, Color4 color, Camera camera, Vector3 lightPos)
        {
            var data = new ScanLine {
            };

            data.FaceNormal = (v1.Normal + v2.Normal + v3.Normal) / 3;
            var facePoint = (v1.WorldCoordinates + v2.WorldCoordinates + v3.WorldCoordinates) / 3;

            data.FaceNormalAndLightDotProduct =
                ComputeNormalAndLightDotProduct(facePoint, data.FaceNormal,
                                                lightPos);

            PhongReflection.ComputePhongReflection(data.FaceNormal, lightPos, facePoint, camera.Position);

            Vertex[] sortedVertices = SortVertices(v1, v2, v3);
            v1 = sortedVertices[0];
            v2 = sortedVertices[1];
            v3 = sortedVertices[2];

            Vector3 p1 = v1.Coordinates;
            Vector3 p2 = v2.Coordinates;
            Vector3 p3 = v3.Coordinates;

            double nl1 = ComputeNormalAndLightDotProduct(v1.WorldCoordinates, v1.Normal, lightPos);
            double nl2 = ComputeNormalAndLightDotProduct(v2.WorldCoordinates, v2.Normal, lightPos);
            double nl3 = ComputeNormalAndLightDotProduct(v3.WorldCoordinates, v3.Normal, lightPos);


            var slopeP1P2 = ComputeInverseSlope(p1, p2);

            var slopeP1P3 = ComputeInverseSlope(p1, p3);

            if (slopeP1P2 > slopeP1P3)
            {
                for (var y = (int)p1.Y; y <= (int)p3.Y; y++)
                {
                    data.CurrentY = y;

                    if (y < p2.Y)
                    {
                        data.NormalAndLightDotProductA = nl1;
                        data.NormalAndLightDotProductB = nl3;
                        data.NormalAndLightDotProductC = nl1;
                        data.NormalAndLightDotProductD = nl2;
                        ProcessScanLine(data, v1, v3, v1, v2, color);
                    }
                    else
                    {
                        data.NormalAndLightDotProductA = nl1;
                        data.NormalAndLightDotProductB = nl3;
                        data.NormalAndLightDotProductC = nl2;
                        data.NormalAndLightDotProductD = nl3;
                        ProcessScanLine(data, v1, v3, v2, v3, color);
                    }
                }
            }
            else
            {
                for (var y = (int)p1.Y; y <= (int)p3.Y; y++)
                {
                    data.CurrentY = y;

                    if (y < p2.Y)
                    {
                        data.NormalAndLightDotProductA = nl1;
                        data.NormalAndLightDotProductB = nl2;
                        data.NormalAndLightDotProductC = nl1;
                        data.NormalAndLightDotProductD = nl3;
                        ProcessScanLine(data, v1, v2, v1, v3, color);
                    }
                    else
                    {
                        data.NormalAndLightDotProductA = nl2;
                        data.NormalAndLightDotProductB = nl3;
                        data.NormalAndLightDotProductC = nl1;
                        data.NormalAndLightDotProductD = nl3;
                        ProcessScanLine(data, v2, v3, v1, v3, color);
                    }
                }
            }
        }
Example #5
0
 public void InterpolateValue(ScanLine scanLineData, float gradient1, float gradient2)
 {
     startNormalLightDotProduct = Interpolate(scanLineData.NormalAndLightDotProductA, scanLineData.NormalAndLightDotProductB, gradient1);
     endNormalLightDotProduct   = Interpolate(scanLineData.NormalAndLightDotProductC, scanLineData.NormalAndLightDotProductD, gradient2);
 }
Example #6
0
 public double ComputeShadingCoefficient(double gradient, ScanLine scanLine)
 {
     return(Interpolate(startNormalLightDotProduct, endNormalLightDotProduct, gradient));
 }