public void AddPoint(float x, float y) { if (Triangulator != null) { x *= XScaleFactor; y *= YScaleFactor; x += XOffset; y += YOffset; // Create vert: Vector3 vert = new Vector3(x, y, -ExtrudeAmount - 0.05f); // Add triangulator vertex: Triangulator.AddVertex(vert, ref FirstInContour, ref LastInContour); // Add it: Vertices[CurrentVertex] = vert; Colours[CurrentVertex] = FrontColor; CurrentVertex++; return; } if (IsClosing && x == CloseX && y == CloseY) { Triangles[CurrentTriangle++] = CurrentVertex; Triangles[CurrentTriangle++] = StartIndex; Triangles[CurrentTriangle++] = CurrentVertex + 1; Triangles[CurrentTriangle++] = StartIndex; Triangles[CurrentTriangle++] = StartIndex + 1; Triangles[CurrentTriangle++] = CurrentVertex + 1; } x *= XScaleFactor; y *= YScaleFactor; x += XOffset; y += YOffset; // Triangles (connections): if (Moved) { // Clear moved: Moved = false; } else { Triangles[CurrentTriangle++] = CurrentVertex; Triangles[CurrentTriangle++] = CurrentVertex + 1; Triangles[CurrentTriangle++] = CurrentVertex - 2; Triangles[CurrentTriangle++] = CurrentVertex - 1; Triangles[CurrentTriangle++] = CurrentVertex - 2; Triangles[CurrentTriangle++] = CurrentVertex + 1; } // Top line: Colours[CurrentVertex] = FrontColor; Vertices[CurrentVertex] = new Vector3(x, y, -0.05f); CurrentVertex++; Colours[CurrentVertex] = FrontColor; Vertices[CurrentVertex] = new Vector3(x, y, -ExtrudeAmount - 0.05f); CurrentVertex++; PreviousX = x; PreviousY = y; }
public void AddPoint(float x, float y) { if (Triangulator != null) { x *= XScaleFactor; y *= YScaleFactor; x += XOffset; y += YOffset; // Create vert: Vector3 vert = new Vector3(x, y, 0f); // Add triangulator vertex: Triangulator.AddVertex(vert, ref FirstInContour, ref LastInContour); // Add it: Vertices[CurrentVertex] = vert; Colours[CurrentVertex] = White; CurrentVertex++; return; } if (IsClosing && x == CloseX && y == CloseY) { // Add the connection triangles back to the move to node: Triangles[CurrentTriangle++] = CurrentVertex + 1; Triangles[CurrentTriangle++] = StartIndex + 2; Triangles[CurrentTriangle++] = CurrentVertex + 3; Triangles[CurrentTriangle++] = CurrentVertex + 1; Triangles[CurrentTriangle++] = CurrentVertex + 5; Triangles[CurrentTriangle++] = StartIndex + 4; } x *= XScaleFactor; y *= YScaleFactor; x += XOffset; y += YOffset; // Get deltas: float dx = x - PreviousX; float dy = y - PreviousY; // Dx/dy (inner): float dxInner; float dyInner; // Previous values: float previousOuterDY; float previousOuterDX; float previousInnerDY; float previousInnerDX; // Spread of the SDF distance: float innerSpread; float outerSpread; if (DistanceSpread.Custom) { innerSpread = DistanceSpread.GetInner(x, y, CurrentVertex, TotalVertices); if (DistanceSpread.InnerOuterDiff) { outerSpread = DistanceSpread.GetOuter(x, y, CurrentVertex, TotalVertices); } else { outerSpread = innerSpread; } } else { innerSpread = DistanceSpread.DefaultInner; outerSpread = DistanceSpread.DefaultOuter; } if (Moved) { // Previous is the same: PreviousOuterSpread = outerSpread; PreviousInnerSpread = innerSpread; } // Previous got a different spread? bool previousDiff = (PreviousInnerSpread != innerSpread); float length; if (DistanceSpread.InnerOuterDiff) { float root = (float)Math.Sqrt((dx * dx) + (dy * dy)); // Normalise inner: length = innerSpread / root; dxInner = dx * length; dyInner = dy * length; if (previousDiff) { // Normalise them: length = PreviousInnerSpread / root; previousInnerDX = dx * length; previousInnerDY = dy * length; } else { previousInnerDY = dyInner; previousInnerDX = dxInner; } // Normalise outer: length = outerSpread / root; dx *= length; dy *= length; if (PreviousOuterSpread == outerSpread) { previousOuterDY = dy; previousOuterDX = dx; } else { // Normalise them: length = PreviousOuterSpread / outerSpread; previousOuterDX = dx * length; previousOuterDY = dy * length; } } else if (innerSpread == 0f) { if (previousDiff) { // Normalise using previous spread: // Note that because its different, we also know it's non-zero. length = PreviousInnerSpread / (float)Math.Sqrt((dx * dx) + (dy * dy)); previousOuterDY = dy * length; previousOuterDX = dx * length; } else { // Previous spread is also zero - results are all zero: previousOuterDY = 0f; previousOuterDX = 0f; } // Inner is the same: previousInnerDY = previousOuterDY; previousInnerDX = previousOuterDX; // All zero: dxInner = 0f; dyInner = 0f; dx = 0f; dy = 0f; } else { // Normalise them: length = innerSpread / (float)Math.Sqrt((dx * dx) + (dy * dy)); dx *= length; dy *= length; // Dx/dy (inner): dxInner = dx; dyInner = dy; if (previousDiff) { // What's the difference? length = PreviousInnerSpread / innerSpread; // Apply: previousOuterDY = dy * length; previousOuterDX = dx * length; } else { previousOuterDY = dy; previousOuterDX = dx; } // Inner is the same: previousInnerDY = previousOuterDY; previousInnerDX = previousOuterDX; } // Triangles (connections): if (Moved) { // Clear moved: Moved = false; } else { Triangles[CurrentTriangle++] = CurrentVertex; Triangles[CurrentTriangle++] = CurrentVertex + 2; Triangles[CurrentTriangle++] = CurrentVertex - 3; Triangles[CurrentTriangle++] = CurrentVertex; Triangles[CurrentTriangle++] = CurrentVertex + 4; Triangles[CurrentTriangle++] = CurrentVertex - 1; } // Triangles (outer): Triangles[CurrentTriangle++] = CurrentVertex; Triangles[CurrentTriangle++] = CurrentVertex + 2; Triangles[CurrentTriangle++] = CurrentVertex + 1; Triangles[CurrentTriangle++] = CurrentVertex + 1; Triangles[CurrentTriangle++] = CurrentVertex + 2; Triangles[CurrentTriangle++] = CurrentVertex + 3; // Triangles (inner): Triangles[CurrentTriangle++] = CurrentVertex; Triangles[CurrentTriangle++] = CurrentVertex + 1; Triangles[CurrentTriangle++] = CurrentVertex + 4; Triangles[CurrentTriangle++] = CurrentVertex + 1; Triangles[CurrentTriangle++] = CurrentVertex + 5; Triangles[CurrentTriangle++] = CurrentVertex + 4; Color32 inner; Color32 outer; if (Winding) { inner = White; outer = Black; } else { inner = Black; outer = White; } // Top line: Colours[CurrentVertex] = MidGrey; Vertices[CurrentVertex] = new Vector3(PreviousX, PreviousY, 1f); CurrentVertex++; Colours[CurrentVertex] = MidGrey; Vertices[CurrentVertex] = new Vector3(x, y, 1f); CurrentVertex++; // Bottom line (outer): Colours[CurrentVertex] = outer; Vertices[CurrentVertex] = new Vector3(PreviousX + previousOuterDY, PreviousY - previousOuterDX, 0f); CurrentVertex++; Colours[CurrentVertex] = outer; Vertices[CurrentVertex] = new Vector3(x + dy, y - dx, 0f); CurrentVertex++; // Bottom line (inner): Colours[CurrentVertex] = inner; Vertices[CurrentVertex] = new Vector3(PreviousX - previousInnerDY, PreviousY + previousInnerDX, 0f); CurrentVertex++; Colours[CurrentVertex] = inner; Vertices[CurrentVertex] = new Vector3(x - dyInner, y + dxInner, 0f); CurrentVertex++; PreviousX = x; PreviousY = y; PreviousOuterSpread = outerSpread; PreviousInnerSpread = innerSpread; }