public void BuildMesh(float xOffset, float yOffset, TextureCamera camera) { // Hole sort it if needed: Path.HoleSort(); // How many samples? int samples = 0; int triCount = 0; int moveToCount = 0; float accuracy = TextureCameras.Accuracy; VectorPoint current = Path.FirstPathNode; while (current != null) { if (current.IsClose || current.Next == null) { moveToCount--; } if (!current.HasLine) { // Ignore moveto's - Hop to the next one: moveToCount++; current = current.Next; continue; } if (current.IsCurve || !TextureCameras.SD) { // It's a curve (or a HD line) - get the line length: VectorLine line = current as VectorLine; float length = line.Length; // And just add on extra points: int count = (int)(length / accuracy); if (count <= 0) { count = 1; } samples += count; // Anything that isn't a moveto also has 6 additional triangle indices (2 tris): triCount += count * 6; } else { // Add the end node: samples++; // Anything that isn't a moveto also has 6 additional triangle indices (2 tris): triCount += 6; } // Hop to the next one: current = current.Next; } // Each sample point has an associated line. // Each line generates 6 vertices and 4 triangles. int vertCount = samples * 6; triCount += samples * 4 * 3; // Triangulation set next. int triangulatedVerts = 0; current = Path.FirstPathNode; while (current != null) { if (current.HasLine && current.IsCurve) { VectorLine line = current as VectorLine; int extraPoints = (int)(line.Length / TextureCameras.TriangulationAccuracy); if (extraPoints <= 0) { extraPoints = 1; } triangulatedVerts += extraPoints; } else { triangulatedVerts++; } if (current.IsClose || current.Next == null) { // End of a main contour. vertCount += triangulatedVerts; if (triangulatedVerts > 2) { triCount += (triangulatedVerts - 2) * 3; } triangulatedVerts = 0; } // Hop to the next one: current = current.Next; } camera.Triangulator.Clockwise = true; Mesh = TextureCameras.GetBuffer(); // For each MoveToPair (moveToCount/2), add 4 tri's [2 tris for each "gap"]: if (moveToCount != 0) { moveToCount = moveToCount >> 1; triCount += 12 * moveToCount; } Mesh.RequireSize(vertCount, triCount); // Map offsets: xOffset += OffsetX * Mesh.XScaleFactor; yOffset += OffsetY * Mesh.YScaleFactor; // Let's get generating! Mesh.AddMesh(Path, xOffset - ((float)X * 0.1f), yOffset + ((float)Y * 0.1f), camera.Triangulator); }
/// <summary>Gets the number of verts/tris to use.</summary> public int GetVertCount(VectorPath path, out int triCount) { // Hole sort it if needed: path.HoleSort(); if (path.Width == 0f) { path.RecalculateMeta(); } // How many samples? int samples = 0; triCount = 0; int moveToCount = 0; float accuracy = TextureCameras.Accuracy; VectorPoint current = path.FirstPathNode; while (current != null) { if (current.IsClose || current.Next == null) { moveToCount--; } if (!current.HasLine) { // Ignore moveto's - Hop to the next one: moveToCount++; current = current.Next; continue; } if (current.IsCurve || !TextureCameras.SD) { // It's a curve (or a HD line) - get the line length: VectorLine line = current as VectorLine; float length = line.Length; // And just add on extra points: int count = (int)(length / accuracy); if (count <= 0) { count = 1; } samples += count; // Anything that isn't a moveto also has 6 additional triangle indices (2 tris): triCount += count * 6; } else { // Add the end node: samples++; // Anything that isn't a moveto also has 6 additional triangle indices (2 tris): triCount += 6; } // Hop to the next one: current = current.Next; } // Each sample point has an associated line. // Each line generates 2 vertices and 2 triangles. int vertCount = samples * 2; triCount += samples * 2 * 3; // Triangulation set next. int triangulatedVerts = 0; current = path.FirstPathNode; while (current != null) { if (current.HasLine && current.IsCurve) { VectorLine line = current as VectorLine; int extraPoints = (int)(line.Length / TextureCameras.Accuracy); if (extraPoints <= 0) { extraPoints = 1; } triangulatedVerts += extraPoints; } else { triangulatedVerts++; } if (current.IsClose || current.Next == null) { // End of a main contour. vertCount += triangulatedVerts; if (triangulatedVerts > 2) { triCount += (triangulatedVerts - 2) * 3; } triangulatedVerts = 0; } // Hop to the next one: current = current.Next; } // For each MoveToPair (moveToCount/2), add 2 tri's [Completes the shape]: if (moveToCount != 0) { moveToCount = moveToCount >> 1; triCount += 2 * 3 * moveToCount; } return(vertCount); }