public void DrawTriangle(ColorRGB color, VertexBuffer vbx, int triangleIndice) { vbx.Volume.Triangles[triangleIndice].TransformWorld(vbx); var surface = RendererContext.Surface; PainterUtils.SortTrianglePoints(vbx, surface, triangleIndice, out var v0, out var v1, out var v2); var p0 = v0.ScreenPoint; var p1 = v1.ScreenPoint; var p2 = v2.ScreenPoint; var yStart = (int)Math.Max(p0.Y, 0); var yEnd = (int)Math.Min(p2.Y, surface.Height - 1); // Out if clipped if (yStart > yEnd) { return; } var yMiddle = MathUtils.Clamp((int)p1.Y, yStart, yEnd); // This has to move elsewhere var lightPos = new Vector3(0, 10, 10); // computing the cos of the angle between the light vector and the normal vector // it will return a value between 0 and 1 that will be used as the intensity of the color var nl0 = MathUtils.ComputeNDotL(v0.WorldPoint, v0.WorldNormal, lightPos); var nl1 = MathUtils.ComputeNDotL(v1.WorldPoint, v1.WorldNormal, lightPos); var nl2 = MathUtils.ComputeNDotL(v2.WorldPoint, v2.WorldNormal, lightPos); if (PainterUtils.Cross2D(p0, p1, p2) > 0) { // P0 // P1 // P2 paintHalfTriangle(yStart, (int)yMiddle - 1, color, p0, p2, p0, p1, nl0, nl2, nl0, nl1); paintHalfTriangle((int)yMiddle, yEnd, color, p0, p2, p1, p2, nl0, nl2, nl1, nl2); } else { // P0 // P1 // P2 paintHalfTriangle(yStart, (int)yMiddle - 1, color, p0, p1, p0, p2, nl0, nl1, nl0, nl2); paintHalfTriangle((int)yMiddle, yEnd, color, p1, p2, p0, p2, nl1, nl2, nl0, nl2); } }
public void DrawTriangle(ColorRGB color, VertexBuffer vbx, int triangleIndice) { vbx.Volume.Triangles[triangleIndice].TransformWorld(vbx); var surface = RendererContext.Surface; PainterUtils.SortTrianglePoints(vbx, surface, triangleIndice, out var v0, out var v1, out var v2); var p0 = v0.ScreenPoint; var p1 = v1.ScreenPoint; var p2 = v2.ScreenPoint; var yStart = (int)Math.Max(p0.Y, 0); var yEnd = (int)Math.Min(p2.Y, surface.Height - 1); // Out if clipped if (yStart > yEnd) { return; } var yMiddle = MathUtils.Clamp((int)p1.Y, yStart, yEnd); var lightPos = new Vector3(0, 10, 10); var vertexNormal = (v0.WorldNormal + v1.WorldNormal + v2.WorldNormal) / 3; var vertexCenter = (v0.WorldPoint + v1.WorldPoint + v2.WorldPoint) / 3; color = MathUtils.ComputeNDotL(vertexCenter, vertexNormal, lightPos) * color; if (PainterUtils.Cross2D(p0, p1, p2) > 0) { // P0 // P1 // P2 paintHalfTriangle(yStart, (int)yMiddle - 1, color, p0, p2, p0, p1); paintHalfTriangle((int)yMiddle, yEnd, color, p0, p2, p1, p2); } else { // P0 // P1 // P2 paintHalfTriangle(yStart, (int)yMiddle - 1, color, p0, p1, p0, p2); paintHalfTriangle((int)yMiddle, yEnd, color, p1, p2, p0, p2); } }
public void DrawTriangle(ColorRGB color, VertexBuffer vbx, int triangleIndice) { var surface = RendererContext.Surface; PainterUtils.SortTrianglePoints(vbx, surface, triangleIndice, out var v0, out var v1, out var v2); var p0 = v0.ScreenPoint; var p1 = v1.ScreenPoint; var p2 = v2.ScreenPoint; var yStart = (int)Math.Max(p0.Y, 0); var yEnd = (int)Math.Min(p2.Y, surface.Height - 1); // Out if clipped if (yStart > yEnd) { return; } var yMiddle = MathUtils.Clamp((int)p1.Y, yStart, yEnd); if (PainterUtils.Cross2D(p0, p1, p2) > 0) { // P0 // P1 // P2 paintHalfTriangle(yStart, (int)yMiddle - 1, color, p0, p2, p0, p1); paintHalfTriangle((int)yMiddle, yEnd, color, p0, p2, p1, p2); } else { // P0 // P1 // P2 paintHalfTriangle(yStart, (int)yMiddle - 1, color, p0, p1, p0, p2); paintHalfTriangle((int)yMiddle, yEnd, color, p1, p2, p0, p2); } }