private static void CreateVertexColoredMesh(Point[] vertices, Color[] colors, IRenderPackage package, TessellationParameters parameters) { package.RequiresPerVertexColoration = true; for (var i = 0; i <= vertices.Count() - 3; i += 3) { var ptA = vertices[i]; var ptB = vertices[i + 1]; var ptC = vertices[i + 2]; if (ptA.IsAlmostEqualTo(ptB) || ptB.IsAlmostEqualTo(ptC) || ptA.IsAlmostEqualTo(ptC)) { continue; } var alongLine = false; using (var l = Line.ByStartPointEndPoint(ptA, ptC)) { alongLine = ptB.DistanceTo(l) < 0.00001; } if (alongLine) { continue; } var cA = colors[i]; var cB = colors[i + 1]; var cC = colors[i + 2]; var s1 = ptB.AsVector().Subtract(ptA.AsVector()).Normalized(); var s2 = ptC.AsVector().Subtract(ptA.AsVector()).Normalized(); var n = s1.Cross(s2); package.AddTriangleVertex(ptA.X, ptA.Y, ptA.Z); package.AddTriangleVertexNormal(n.X, n.Y, n.Z); package.AddTriangleVertexColor(cA.Red, cA.Green, cA.Blue, cA.Alpha); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertex(ptB.X, ptB.Y, ptB.Z); package.AddTriangleVertexNormal(n.X, n.Y, n.Z); package.AddTriangleVertexColor(cB.Red, cB.Green, cB.Blue, cB.Alpha); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertex(ptC.X, ptC.Y, ptC.Z); package.AddTriangleVertexNormal(n.X, n.Y, n.Z); package.AddTriangleVertexColor(cC.Red, cC.Green, cC.Blue, cC.Alpha); package.AddTriangleVertexUV(0, 0); } }
private static void CreatePlaneTessellation(IRenderPackage package, Plane plane) { package.RequiresPerVertexColoration = true; var s = 2.5; var cs = CoordinateSystem.ByPlane(plane); var a = Point.ByCartesianCoordinates(cs, s, s, 0); var b = Point.ByCartesianCoordinates(cs, -s, s, 0); var c = Point.ByCartesianCoordinates(cs, -s, -s, 0); var d = Point.ByCartesianCoordinates(cs, s, -s, 0); //Add two triangles to represent the plane package.AddTriangleVertex(a.X, a.Y, a.Z); package.AddTriangleVertex(b.X, b.Y, b.Z); package.AddTriangleVertex(c.X, c.Y, c.Z); package.AddTriangleVertex(c.X, c.Y, c.Z); package.AddTriangleVertex(d.X, d.Y, d.Z); package.AddTriangleVertex(a.X, a.Y, a.Z); //Add the mesh vertex UV, normal, and color data for the 6 triangle vertices for (var i = 0; i < 6; i++) { package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexNormal(plane.Normal.X, plane.Normal.Y, plane.Normal.Z); package.AddTriangleVertexColor(0, 0, 0, 10); } // Draw plane edges package.AddLineStripVertex(a.X, a.Y, a.Z); package.AddLineStripVertex(b.X, b.Y, b.Z); package.AddLineStripVertex(b.X, b.Y, b.Z); package.AddLineStripVertex(c.X, c.Y, c.Z); package.AddLineStripVertex(c.X, c.Y, c.Z); package.AddLineStripVertex(d.X, d.Y, d.Z); package.AddLineStripVertex(d.X, d.Y, d.Z); package.AddLineStripVertex(a.X, a.Y, a.Z); // Draw normal package.AddLineStripVertex(plane.Origin.X, plane.Origin.Y, plane.Origin.Z); var nEnd = plane.Origin.Add(plane.Normal.Scale(2.5)); package.AddLineStripVertex(nEnd.X, nEnd.Y, nEnd.Z); //Add the line vertex data for the plane line geometry (4 plane edges and 1 normal). for (var i = 0; i < 5; i++) { package.AddLineStripVertexCount(2); package.AddLineStripVertexColor(MidTone, MidTone, MidTone, 255); package.AddLineStripVertexColor(MidTone, MidTone, MidTone, 255); } //dispose helper geometry a.Dispose(); b.Dispose(); c.Dispose(); d.Dispose(); cs.Dispose(); }
private void PushTriangleVertex(IRenderPackage package, Point p, Vector n) { package.AddTriangleVertex(p.X, p.Y, p.Z); package.AddTriangleVertexColor(255, 255, 255, 255); package.AddTriangleVertexNormal(n.X, n.Y, n.Z); package.AddTriangleVertexUV(0, 0); }
private void AddColoredQuadToPackage(IRenderPackage package) { for (int i = 0; i < m_vertices.Length; i++) { package.AddTriangleVertex(m_vertices[i].X, m_vertices[i].Y, m_vertices[i].Z); package.AddTriangleVertexColor(m_vertexColors[i].R, m_vertexColors[i].G, m_vertexColors[i].B, m_vertexColors[i].A); package.AddTriangleVertexNormal(m_normals[i].X, m_normals[i].Y, m_normals[i].Z); package.AddTriangleVertexUV(0, 0); } }
private static void AddColoredQuadToPackage(IRenderPackage package) { // Triangle 1 package.AddTriangleVertex(0, 0, 0); package.AddTriangleVertex(1, 0, 0); package.AddTriangleVertex(1, 1, 0); // For each vertex, add a color. package.AddTriangleVertexColor(255, 0, 0, 255); package.AddTriangleVertexColor(0, 255, 0, 255); package.AddTriangleVertexColor(0, 0, 255, 255); //Triangle 2 package.AddTriangleVertex(0, 0, 0); package.AddTriangleVertex(1, 1, 0); package.AddTriangleVertex(0, 1, 0); package.AddTriangleVertexColor(255, 0, 0, 255); package.AddTriangleVertexColor(0, 255, 0, 255); package.AddTriangleVertexColor(0, 0, 255, 255); package.AddTriangleVertexNormal(0, 0, 1); package.AddTriangleVertexNormal(0, 0, 1); package.AddTriangleVertexNormal(0, 0, 1); package.AddTriangleVertexNormal(0, 0, 1); package.AddTriangleVertexNormal(0, 0, 1); package.AddTriangleVertexNormal(0, 0, 1); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); }
void IGraphicItem.Tessellate(IRenderPackage package, TessellationParameters parameters) { if (!_preview) { return; } uint fid; for (int i = 0; i < Faces.Length; i++) { fid = 3 * Faces[i]; package.AddTriangleVertex(verticesTrans[fid], verticesTrans[fid + 1], verticesTrans[fid + 2]); package.AddTriangleVertexColor(_red, _green, _blue, _alpha); package.AddTriangleVertexNormal(normalTrans[fid], normalTrans[fid + 1], normalTrans[fid + 2]); package.AddTriangleVertexUV(0, 0); } }
/// <summary> /// Pushes an uncolored quad into a package. /// </summary> private static void PushQuadIntoPackage(IRenderPackage package) { package.AddTriangleVertex(0, 0, 0); package.AddTriangleVertex(1, 0, 0); package.AddTriangleVertex(1, 1, 0); package.AddTriangleVertex(0, 0, 0); package.AddTriangleVertex(1, 1, 0); package.AddTriangleVertex(0, 1, 0); package.AddTriangleVertexNormal(0, 0, 1); package.AddTriangleVertexNormal(0, 0, 1); package.AddTriangleVertexNormal(0, 0, 1); package.AddTriangleVertexNormal(0, 0, 1); package.AddTriangleVertexNormal(0, 0, 1); package.AddTriangleVertexNormal(0, 0, 1); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); }
private static void CreateVertexColoredMesh(Point[] vertices, Color[] colors, IRenderPackage package, TessellationParameters parameters) { package.RequiresPerVertexColoration = true; for (var i = 0; i <= vertices.Count()-3; i+=3) { var ptA = vertices[i]; var ptB = vertices[i+1]; var ptC = vertices[i+2]; if (ptA.IsAlmostEqualTo(ptB) || ptB.IsAlmostEqualTo(ptC) || ptA.IsAlmostEqualTo(ptC)) { continue; } var alongLine = false; using (var l = Line.ByStartPointEndPoint(ptA, ptC)) { alongLine = ptB.DistanceTo(l) < 0.00001; } if (alongLine) { continue; } var cA = colors[i]; var cB = colors[i+1]; var cC = colors[i+2]; var s1 = ptB.AsVector().Subtract(ptA.AsVector()).Normalized(); var s2 = ptC.AsVector().Subtract(ptA.AsVector()).Normalized(); var n = s1.Cross(s2); package.AddTriangleVertex(ptA.X, ptA.Y, ptA.Z); package.AddTriangleVertexNormal(n.X, n.Y, n.Z); package.AddTriangleVertexColor(cA.Red, cA.Green, cA.Blue, cA.Alpha); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertex(ptB.X, ptB.Y, ptB.Z); package.AddTriangleVertexNormal(n.X, n.Y, n.Z); package.AddTriangleVertexColor(cB.Red, cB.Green, cB.Blue, cB.Alpha); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertex(ptC.X, ptC.Y, ptC.Z); package.AddTriangleVertexNormal(n.X, n.Y, n.Z); package.AddTriangleVertexColor(cC.Red, cC.Green, cC.Blue, cC.Alpha); package.AddTriangleVertexUV(0, 0); } }
/// <summary> /// Pushes an uncolored quad into a package. /// </summary> private static void PushQuadIntoPackage(IRenderPackage package) { package.AddTriangleVertex(0,0,0); package.AddTriangleVertex(1,0,0); package.AddTriangleVertex(1,1,0); package.AddTriangleVertex(0,0,0); package.AddTriangleVertex(1,1,0); package.AddTriangleVertex(0,1,0); package.AddTriangleVertexNormal(0, 0, 1); package.AddTriangleVertexNormal(0, 0, 1); package.AddTriangleVertexNormal(0, 0, 1); package.AddTriangleVertexNormal(0, 0, 1); package.AddTriangleVertexNormal(0, 0, 1); package.AddTriangleVertexNormal(0, 0, 1); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); }
private void PushTriangleVertex(IRenderPackage package, Point p, Vector n) { package.AddTriangleVertex(p.X, p.Y, p.Z); package.AddTriangleVertexColor(255, 255, 255, 255); package.AddTriangleVertexNormal(n.X,n.Y,n.Z); package.AddTriangleVertexUV(0,0); }
private void AddColoredQuadToPackage(IRenderPackage package) { // For each quad for (int i = 0; i < vertices.Count; i += 6) { // Meshes // Triangle 1 package.AddTriangleVertex(vertices[i].X, vertices[i].Y, vertices[i].Z); package.AddTriangleVertex(vertices[i + 1].X, vertices[i + 1].Y, vertices[i + 1].Z); package.AddTriangleVertex(vertices[i + 2].X, vertices[i + 2].Y, vertices[i + 2].Z); package.AddTriangleVertexColor(32, 178, 170, 255); package.AddTriangleVertexColor(32, 178, 170, 255); package.AddTriangleVertexColor(32, 178, 170, 255); package.AddTriangleVertexNormal(0, 0, 1); package.AddTriangleVertexNormal(0, 0, 1); package.AddTriangleVertexNormal(0, 0, 1); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); // Triangle 2 package.AddTriangleVertex(vertices[i + 3].X, vertices[i + 3].Y, vertices[i + 3].Z); package.AddTriangleVertex(vertices[i + 4].X, vertices[i + 4].Y, vertices[i + 4].Z); package.AddTriangleVertex(vertices[i + 5].X, vertices[i + 5].Y, vertices[i + 5].Z); package.AddTriangleVertexColor(32, 178, 170, 255); package.AddTriangleVertexColor(32, 178, 170, 255); package.AddTriangleVertexColor(32, 178, 170, 255); package.AddTriangleVertexNormal(0, 0, 1); package.AddTriangleVertexNormal(0, 0, 1); package.AddTriangleVertexNormal(0, 0, 1); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); // Edges // NOTE: this could be reduced to less than 6 vertices // but for the purposes of this example it is more clear // Triangle 1 package.AddLineStripVertex(vertices[i].X, vertices[i].Y, vertices[i].Z); package.AddLineStripVertex(vertices[i + 1].X, vertices[i + 1].Y, vertices[i + 1].Z); package.AddLineStripVertex(vertices[i + 2].X, vertices[i + 2].Y, vertices[i + 2].Z); // Triangle 2 package.AddLineStripVertex(vertices[i + 3].X, vertices[i + 3].Y, vertices[i + 3].Z); package.AddLineStripVertex(vertices[i + 4].X, vertices[i + 4].Y, vertices[i + 4].Z); package.AddLineStripVertex(vertices[i + 5].X, vertices[i + 5].Y, vertices[i + 5].Z); package.AddLineStripVertexColor(0, 0, 0, 255); package.AddLineStripVertexColor(0, 0, 0, 255); package.AddLineStripVertexColor(0, 0, 0, 255); package.AddLineStripVertexColor(0, 0, 0, 255); package.AddLineStripVertexColor(0, 0, 0, 255); package.AddLineStripVertexColor(0, 0, 0, 255); package.AddLineStripVertexCount(6); } }
/// <summary> /// This method uses the MIConvexHull Delaunay triangulator to create a /// Delaunay tessellation of a given u and v distribution on the surface. /// It adds to this tessellation all the points on the surface's trim /// curves. Triangles are then deleted from the tessellation based on whether /// the sum of their vertices' distances from the surface are greater than a /// threshold. /// </summary> /// <param name="surface">The surface on which to apply the tessellation.</param> /// <param name="package">The IRenderPackage object into which the graphics data will be pushed.</param> /// <param name="uDiv">The number of divisions of the grid on the surface in the U direction.</param> /// <param name="vDiv">The number of divisions of the grid on the surface in the V direction.</param> private static void DelaunayTesselate(Surface surface, IRenderPackage package, int uDiv, int vDiv, IEnumerable <UV> additionalUVs) { var uvs = new List <UV>(); for (var i = 0; i <= uDiv; i += 1) { for (var j = 0; j <= vDiv; j += 1) { var u = (double)i / uDiv; var v = (double)j / vDiv; var uv = UV.ByCoordinates(u, v); uvs.Add(uv); } } uvs.AddRange(additionalUVs); var curves = surface.PerimeterCurves(); var coords = GetEdgeCoordinates(curves, 100, surface); curves.ForEach(c => c.Dispose()); var verts = uvs.Select(Vertex2.FromUV).Concat(coords.Select(Vertex2.FromUV)).ToList(); var config = new TriangulationComputationConfig { PointTranslationType = PointTranslationType.TranslateInternal, PlaneDistanceTolerance = 0.000001, // the translation radius should be lower than PlaneDistanceTolerance / 2 PointTranslationGenerator = TriangulationComputationConfig.RandomShiftByRadius(0.0000001, 0) }; var triangulation = DelaunayTriangulation <Vertex2, Cell2> .Create(verts, config); foreach (var cell in triangulation.Cells) { var v1 = cell.Vertices[0].AsVector(); var pt1 = surface.PointAtParameter(v1.X, v1.Y); var n1 = surface.NormalAtParameter(v1.X, v1.Y); var v2 = cell.Vertices[1].AsVector(); var pt2 = surface.PointAtParameter(v2.X, v2.Y); var n2 = surface.NormalAtParameter(v2.X, v2.Y); var v3 = cell.Vertices[2].AsVector(); var pt3 = surface.PointAtParameter(v3.X, v3.Y); var n3 = surface.NormalAtParameter(v3.X, v3.Y); // Calculate the aggregate distance of all vertex // locations from the surface. Triangles not on the surface // will have a higher aggregate value. var sumDist = pt1.DistanceTo(surface) + pt2.DistanceTo(surface) + pt3.DistanceTo(surface); if (sumDist > 0.05) { continue; } package.AddTriangleVertex(pt1.X, pt1.Y, pt1.Z); package.AddTriangleVertexNormal(n1.X, n1.Y, n1.Z); package.AddTriangleVertexUV(v1.X, v1.Y); package.AddTriangleVertexColor(0, 0, 0, 255); package.AddTriangleVertex(pt2.X, pt2.Y, pt2.Z); package.AddTriangleVertexNormal(n2.X, n2.Y, n2.Z); package.AddTriangleVertexUV(v2.X, v2.Y); package.AddTriangleVertexColor(0, 0, 0, 255); package.AddTriangleVertex(pt3.X, pt3.Y, pt3.Z); package.AddTriangleVertexNormal(n3.X, n3.Y, n3.Z); package.AddTriangleVertexUV(v3.X, v3.Y); package.AddTriangleVertexColor(0, 0, 0, 255); package.AddLineStripVertex(pt1.X, pt1.Y, pt1.Z); package.AddLineStripVertex(pt2.X, pt2.Y, pt2.Z); package.AddLineStripVertexColor(100, 100, 100, 255); package.AddLineStripVertexColor(100, 100, 100, 255); package.AddLineStripVertexCount(2); package.AddLineStripVertex(pt2.X, pt2.Y, pt2.Z); package.AddLineStripVertex(pt3.X, pt3.Y, pt3.Z); package.AddLineStripVertexColor(100, 100, 100, 255); package.AddLineStripVertexColor(100, 100, 100, 255); package.AddLineStripVertexCount(2); package.AddLineStripVertex(pt3.X, pt3.Y, pt3.Z); package.AddLineStripVertex(pt1.X, pt1.Y, pt1.Z); package.AddLineStripVertexColor(100, 100, 100, 255); package.AddLineStripVertexColor(100, 100, 100, 255); package.AddLineStripVertexCount(2); v1.Dispose(); v2.Dispose(); v3.Dispose(); pt1.Dispose(); pt2.Dispose(); pt3.Dispose(); n1.Dispose(); n2.Dispose(); n3.Dispose(); } }
public void Tessellate(IRenderPackage package, TessellationParameters parameters) { package.RequiresPerVertexColoration = true; Geo.Point OP1 = this._webAxis.StartPoint; Geo.Point OP2 = this._webAxis.EndPoint; Geo.Vector webAxis = Geo.Vector.ByTwoPoints(OP1, OP2); Geo.Vector normal = _webNormal; Geo.Vector lateral = webAxis.Cross(normal); lateral = lateral.Normalized(); lateral = lateral.Scale(1.75); normal = normal.Normalized(); normal = normal.Scale(1.5); Geo.Vector lateralR = Geo.Vector.ByCoordinates(lateral.X * -1, lateral.Y * -1, lateral.Z * -1); Geo.Vector webAxisR = Geo.Vector.ByCoordinates(webAxis.X * -1, webAxis.Y * -1, webAxis.Z * -1); Geo.Vector normalR = Geo.Vector.ByCoordinates(normal.X * -1, normal.Y * -1, normal.Z * -1); Geo.Point p0 = OP1.Add(normal.Add(lateral)); Geo.Point p1 = OP2.Add(normal.Add(lateral)); Geo.Point p2 = OP1.Add(lateral); Geo.Point p3 = OP2.Add(lateral); Geo.Point p6 = OP1.Add(normal.Add(lateralR)); Geo.Point p7 = OP2.Add(normal.Add(lateralR)); Geo.Point p4 = OP1.Add(lateralR); Geo.Point p5 = OP2.Add(lateralR); lateral = lateral.Normalized().Scale(1.25); lateralR = lateralR.Normalized().Scale(1.25); Geo.Point p8 = OP1.Add(lateralR).Add(normal); Geo.Point p9 = OP2.Add(lateralR).Add(normal); Geo.Point p10 = OP1.Add(lateral).Add(normal); Geo.Point p11 = OP2.Add(lateral).Add(normal); //////////// // // // // // // // // // // Geo.Point[] pts = { p0, p1, p2, p1, p2, p3, p2, p3, p4, p3, p4, p5, p4, p5, p6, p5, p6, p7, p0, p1, p10, p1, p10, p11, p6, p7, p8, p7, p8, p9 }; Geo.Vector[] vectors = { lateral, normal, lateral.Reverse(), normal.Reverse(), normal.Reverse() }; byte[] colors = { 100, 100, 100, 100, 110, 110, 110, 110, 110, 110 }; var faces = new List <List <int> > { new List <int> { 0, 1, 2 }, new List <int> { 3, 4, 5 }, new List <int> { 6, 7, 8 }, new List <int> { 9, 10, 11 }, new List <int> { 12, 13, 14 }, new List <int> { 15, 16, 17 }, new List <int> { 18, 19, 20 }, new List <int> { 21, 22, 23 }, new List <int> { 24, 25, 26 }, new List <int> { 27, 28, 29 } }; for (int i = 0; i < faces.Count; i++) { package.AddTriangleVertex(pts[faces[i][0]].X, pts[faces[i][0]].Y, pts[faces[i][0]].Z); package.AddTriangleVertex(pts[faces[i][1]].X, pts[faces[i][1]].Y, pts[faces[i][1]].Z); package.AddTriangleVertex(pts[faces[i][2]].X, pts[faces[i][2]].Y, pts[faces[i][2]].Z); package.AddTriangleVertexColor(colors[i], colors[i], colors[i], 255); package.AddTriangleVertexColor(colors[i], colors[i], colors[i], 255); package.AddTriangleVertexColor(colors[i], colors[i], colors[i], 255); package.AddTriangleVertexNormal(vectors[i / 2].X, vectors[i / 2].Y, vectors[i / 2].Z); package.AddTriangleVertexNormal(vectors[i / 2].X, vectors[i / 2].Y, vectors[i / 2].Z); package.AddTriangleVertexNormal(vectors[i / 2].X, vectors[i / 2].Y, vectors[i / 2].Z); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); } foreach (hOperation op in operations) { Geo.Point opPoint = this._webAxis.PointAtParameter(op._loc / this._webAxis.Length); byte r = 255; byte g = 66; byte b = 57; byte a = 255; switch (op._type) { case Operation.WEB: package.AddPointVertex(opPoint.X, opPoint.Y, opPoint.Z); package.AddPointVertexColor(r, g, b, a); lateral = lateral.Normalized().Scale(15.0 / 16.0); lateralR = lateralR.Normalized().Scale(15.0 / 16.0); package.AddPointVertex(opPoint.Add(lateral).X, opPoint.Add(lateral).Y, opPoint.Add(lateral).Z); package.AddPointVertexColor(r, g, b, a); package.AddPointVertex(opPoint.Add(lateralR).X, opPoint.Add(lateralR).Y, opPoint.Add(lateralR).Z); package.AddPointVertexColor(r, g, b, a); break; case Operation.DIMPLE: lateral = lateral.Normalized().Scale(1.0); lateralR = lateralR.Normalized().Scale(1.0); normal = normal.Normalized().Scale(0.75); package.AddLineStripVertex(opPoint.Add(lateral.Add(normal)).X, opPoint.Add(lateral.Add(normal)).Y, opPoint.Add(lateral.Add(normal)).Z); lateral = lateral.Normalized().Scale(2.5); package.AddLineStripVertex(opPoint.Add(lateral.Add(normal)).X, opPoint.Add(lateral.Add(normal)).Y, opPoint.Add(lateral.Add(normal)).Z); package.AddLineStripVertexColor(r, g, b, a); package.AddLineStripVertexColor(r, g, b, a); package.AddLineStripVertexCount(2); lateral = lateral.Normalized().Scale(1.75); package.AddPointVertex(opPoint.Add(lateral.Add(normal)).X, opPoint.Add(lateral.Add(normal)).Y, opPoint.Add(lateral.Add(normal)).Z); package.AddPointVertexColor(r, g, b, a); package.AddLineStripVertex(opPoint.Add(lateralR.Add(normal)).X, opPoint.Add(lateralR.Add(normal)).Y, opPoint.Add(lateralR.Add(normal)).Z); lateralR = lateralR.Normalized().Scale(2.5); package.AddLineStripVertex(opPoint.Add(lateralR.Add(normal)).X, opPoint.Add(lateralR.Add(normal)).Y, opPoint.Add(lateralR.Add(normal)).Z); package.AddLineStripVertexColor(r, g, b, a); package.AddLineStripVertexColor(r, g, b, a); package.AddLineStripVertexCount(2); lateralR = lateralR.Normalized().Scale(1.75); package.AddPointVertex(opPoint.Add(lateralR.Add(normal)).X, opPoint.Add(lateralR.Add(normal)).Y, opPoint.Add(lateralR.Add(normal)).Z); package.AddPointVertexColor(r, g, b, a); break; case Operation.SWAGE: lateral = lateral.Normalized().Scale(1.25); lateralR = lateralR.Normalized().Scale(1.25); webAxis = webAxis.Normalized().Scale(.875); webAxisR = webAxisR.Normalized().Scale(.875); package.AddLineStripVertex(opPoint.Add(lateral.Add(webAxis)).X, opPoint.Add(lateral.Add(webAxis)).Y, opPoint.Add(lateral.Add(webAxis)).Z); package.AddLineStripVertex(opPoint.Add(lateral.Add(webAxisR)).X, opPoint.Add(lateral.Add(webAxisR)).Y, opPoint.Add(lateral.Add(webAxisR)).Z); package.AddLineStripVertexColor(r, g, b, a); package.AddLineStripVertexColor(r, g, b, a); package.AddLineStripVertexCount(2); package.AddLineStripVertex(opPoint.Add(lateralR.Add(webAxis)).X, opPoint.Add(lateralR.Add(webAxis)).Y, opPoint.Add(lateralR.Add(webAxis)).Z); package.AddLineStripVertex(opPoint.Add(lateralR.Add(webAxisR)).X, opPoint.Add(lateralR.Add(webAxisR)).Y, opPoint.Add(lateralR.Add(webAxisR)).Z); package.AddLineStripVertexColor(r, g, b, a); package.AddLineStripVertexColor(r, g, b, a); package.AddLineStripVertexCount(2); break; case Operation.BOLT: lateral = lateral.Normalized().Scale(0.25); lateralR = lateralR.Normalized().Scale(0.25); webAxis = webAxis.Normalized().Scale(0.25); webAxisR = webAxisR.Normalized().Scale(0.25); normal = normal.Normalized().Scale(0.01); normalR = normalR.Normalized().Scale(0.01); Geo.Point[] boltPts = { opPoint.Add(lateral.Add(webAxis.Add(normal))), opPoint.Add(lateral.Add(webAxisR.Add(normal))), opPoint.Add(lateralR.Add(webAxisR.Add(normal))), opPoint.Add(lateralR.Add(webAxis.Add(normal))) }; package.AddTriangleVertex(boltPts[0].X, boltPts[0].Y, boltPts[0].Z); package.AddTriangleVertex(boltPts[1].X, boltPts[1].Y, boltPts[1].Z); package.AddTriangleVertex(boltPts[2].X, boltPts[2].Y, boltPts[2].Z); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertex(boltPts[0].X, boltPts[0].Y, boltPts[0].Z); package.AddTriangleVertex(boltPts[2].X, boltPts[2].Y, boltPts[2].Z); package.AddTriangleVertex(boltPts[3].X, boltPts[3].Y, boltPts[3].Z); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); boltPts = new Geo.Point[] { opPoint.Add(lateral.Add(webAxis.Add(normalR))), opPoint.Add(lateral.Add(webAxisR.Add(normalR))), opPoint.Add(lateralR.Add(webAxisR.Add(normalR))), opPoint.Add(lateralR.Add(webAxis.Add(normalR))) }; package.AddTriangleVertex(boltPts[0].X, boltPts[0].Y, boltPts[0].Z); package.AddTriangleVertex(boltPts[1].X, boltPts[1].Y, boltPts[1].Z); package.AddTriangleVertex(boltPts[2].X, boltPts[2].Y, boltPts[2].Z); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertex(boltPts[0].X, boltPts[0].Y, boltPts[0].Z); package.AddTriangleVertex(boltPts[2].X, boltPts[2].Y, boltPts[2].Z); package.AddTriangleVertex(boltPts[3].X, boltPts[3].Y, boltPts[3].Z); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); break; case Operation.SERVICE_HOLE: lateral = lateral.Normalized().Scale(0.5); lateralR = lateralR.Normalized().Scale(0.5); webAxis = webAxis.Normalized().Scale(0.5); webAxisR = webAxisR.Normalized().Scale(0.5); normal = normal.Normalized().Scale(0.01); normalR = normalR.Normalized().Scale(0.01); Geo.Point[] servicePts = new Geo.Point[] { opPoint.Add(lateral.Add(webAxis.Add(normal))), opPoint.Add(lateral.Add(webAxisR.Add(normal))), opPoint.Add(lateralR.Add(webAxisR.Add(normal))), opPoint.Add(lateralR.Add(webAxis.Add(normal))) }; package.AddTriangleVertex(servicePts[0].X, servicePts[0].Y, servicePts[0].Z); package.AddTriangleVertex(servicePts[1].X, servicePts[1].Y, servicePts[1].Z); package.AddTriangleVertex(servicePts[2].X, servicePts[2].Y, servicePts[2].Z); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertex(servicePts[0].X, servicePts[0].Y, servicePts[0].Z); package.AddTriangleVertex(servicePts[2].X, servicePts[2].Y, servicePts[2].Z); package.AddTriangleVertex(servicePts[3].X, servicePts[3].Y, servicePts[3].Z); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); servicePts = new Geo.Point[] { opPoint.Add(lateral.Add(webAxis.Add(normalR))), opPoint.Add(lateral.Add(webAxisR.Add(normalR))), opPoint.Add(lateralR.Add(webAxisR.Add(normalR))), opPoint.Add(lateralR.Add(webAxis.Add(normalR))) }; package.AddTriangleVertex(servicePts[0].X, servicePts[0].Y, servicePts[0].Z); package.AddTriangleVertex(servicePts[1].X, servicePts[1].Y, servicePts[1].Z); package.AddTriangleVertex(servicePts[2].X, servicePts[2].Y, servicePts[2].Z); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertex(servicePts[0].X, servicePts[0].Y, servicePts[0].Z); package.AddTriangleVertex(servicePts[2].X, servicePts[2].Y, servicePts[2].Z); package.AddTriangleVertex(servicePts[3].X, servicePts[3].Y, servicePts[3].Z); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); break; case Operation.NOTCH: lateral = lateral.Normalized().Scale(1.75); lateralR = lateralR.Normalized().Scale(1.75); webAxis = webAxis.Normalized().Scale(0.875); webAxisR = webAxisR.Normalized().Scale(0.875); normal = normal.Normalized().Scale(0.01); normalR = normalR.Normalized().Scale(0.01); Geo.Point[] notchPts = { opPoint.Add(lateral.Add(webAxis.Add(normal))), opPoint.Add(lateral.Add(webAxisR.Add(normal))), opPoint.Add(lateralR.Add(webAxisR.Add(normal))), opPoint.Add(lateralR.Add(webAxis.Add(normal))) }; package.AddTriangleVertex(notchPts[0].X, notchPts[0].Y, notchPts[0].Z); package.AddTriangleVertex(notchPts[1].X, notchPts[1].Y, notchPts[1].Z); package.AddTriangleVertex(notchPts[2].X, notchPts[2].Y, notchPts[2].Z); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertex(notchPts[0].X, notchPts[0].Y, notchPts[0].Z); package.AddTriangleVertex(notchPts[2].X, notchPts[2].Y, notchPts[2].Z); package.AddTriangleVertex(notchPts[3].X, notchPts[3].Y, notchPts[3].Z); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); notchPts = new Geo.Point[] { opPoint.Add(lateral.Add(webAxis.Add(normalR))), opPoint.Add(lateral.Add(webAxisR.Add(normalR))), opPoint.Add(lateralR.Add(webAxisR.Add(normalR))), opPoint.Add(lateralR.Add(webAxis.Add(normalR))) }; package.AddTriangleVertex(notchPts[0].X, notchPts[0].Y, notchPts[0].Z); package.AddTriangleVertex(notchPts[1].X, notchPts[1].Y, notchPts[1].Z); package.AddTriangleVertex(notchPts[2].X, notchPts[2].Y, notchPts[2].Z); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertex(notchPts[0].X, notchPts[0].Y, notchPts[0].Z); package.AddTriangleVertex(notchPts[2].X, notchPts[2].Y, notchPts[2].Z); package.AddTriangleVertex(notchPts[3].X, notchPts[3].Y, notchPts[3].Z); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); break; case Operation.LIP_CUT: lateral = lateral.Normalized().Scale(1.75); lateralR = lateralR.Normalized().Scale(1.75); webAxis = webAxis.Normalized().Scale(0.875); webAxisR = webAxisR.Normalized().Scale(0.875); normal = normal.Normalized().Scale(1.51); normalR = normalR.Normalized().Scale(0.01); Geo.Vector lateral2 = lateral.Normalized().Scale(1.25); Geo.Vector lateral2R = lateralR.Normalized().Scale(1.25); Geo.Point[] lipPts = { opPoint.Add(webAxis).Add(lateral).Add(normal), opPoint.Add(webAxisR).Add(lateral).Add(normal), opPoint.Add(webAxis).Add(lateral2).Add(normal), opPoint.Add(webAxisR).Add(lateral2).Add(normal) }; package.AddTriangleVertex(lipPts[0].X, lipPts[0].Y, lipPts[0].Z); package.AddTriangleVertex(lipPts[1].X, lipPts[1].Y, lipPts[1].Z); package.AddTriangleVertex(lipPts[2].X, lipPts[2].Y, lipPts[2].Z); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertex(lipPts[1].X, lipPts[1].Y, lipPts[1].Z); package.AddTriangleVertex(lipPts[2].X, lipPts[2].Y, lipPts[2].Z); package.AddTriangleVertex(lipPts[3].X, lipPts[3].Y, lipPts[3].Z); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); lipPts = new Geo.Point[] { opPoint.Add(webAxis).Add(lateralR).Add(normal), opPoint.Add(webAxisR).Add(lateralR).Add(normal), opPoint.Add(webAxis).Add(lateral2R).Add(normal), opPoint.Add(webAxisR).Add(lateral2R).Add(normal) }; package.AddTriangleVertex(lipPts[0].X, lipPts[0].Y, lipPts[0].Z); package.AddTriangleVertex(lipPts[1].X, lipPts[1].Y, lipPts[1].Z); package.AddTriangleVertex(lipPts[2].X, lipPts[2].Y, lipPts[2].Z); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertex(lipPts[1].X, lipPts[1].Y, lipPts[1].Z); package.AddTriangleVertex(lipPts[2].X, lipPts[2].Y, lipPts[2].Z); package.AddTriangleVertex(lipPts[3].X, lipPts[3].Y, lipPts[3].Z); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexNormal(normal.X, normal.Y, normal.Z); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); break; case Operation.END_TRUSS: lateral = lateral.Normalized().Scale(1.76); lateralR = lateralR.Normalized().Scale(1.76); if (opPoint.DistanceTo(this._webAxis.StartPoint) < opPoint.DistanceTo(this._webAxis.EndPoint)) { webAxis = webAxis.Normalized().Scale(0.5); } else { webAxis = webAxisR.Normalized().Scale(0.5); } normal = normal.Normalized().Scale(1.50); Geo.Vector normal2 = normal.Normalized().Scale(1.0); Geo.Vector normal3 = normal.Normalized().Scale(0.5); normalR = normalR.Normalized().Scale(0.01); lateral2 = lateral.Normalized().Scale(1.25); lateral2R = lateralR.Normalized().Scale(1.25); Geo.Point[] endTrussPts = { opPoint.Add(lateral).Add(normal2), opPoint.Add(lateral).Add(normal).Add(webAxis), opPoint.Add(lateral).Add(normal) }; package.AddTriangleVertex(endTrussPts[0].X, endTrussPts[0].Y, endTrussPts[0].Z); package.AddTriangleVertex(endTrussPts[1].X, endTrussPts[1].Y, endTrussPts[1].Z); package.AddTriangleVertex(endTrussPts[2].X, endTrussPts[2].Y, endTrussPts[2].Z); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexNormal(lateral.X, lateral.Y, lateral.Z); package.AddTriangleVertexNormal(lateral.X, lateral.Y, lateral.Z); package.AddTriangleVertexNormal(lateral.X, lateral.Y, lateral.Z); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); endTrussPts = new Geo.Point[] { opPoint.Add(lateral).Add(normal3), opPoint.Add(lateral).Add(webAxis), opPoint.Add(lateral) }; package.AddTriangleVertex(endTrussPts[0].X, endTrussPts[0].Y, endTrussPts[0].Z); package.AddTriangleVertex(endTrussPts[1].X, endTrussPts[1].Y, endTrussPts[1].Z); package.AddTriangleVertex(endTrussPts[2].X, endTrussPts[2].Y, endTrussPts[2].Z); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexNormal(lateral.X, lateral.Y, lateral.Z); package.AddTriangleVertexNormal(lateral.X, lateral.Y, lateral.Z); package.AddTriangleVertexNormal(lateral.X, lateral.Y, lateral.Z); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); endTrussPts = new Geo.Point[] { opPoint.Add(lateralR).Add(normal2), opPoint.Add(lateralR).Add(normal).Add(webAxis), opPoint.Add(lateralR).Add(normal) }; package.AddTriangleVertex(endTrussPts[0].X, endTrussPts[0].Y, endTrussPts[0].Z); package.AddTriangleVertex(endTrussPts[1].X, endTrussPts[1].Y, endTrussPts[1].Z); package.AddTriangleVertex(endTrussPts[2].X, endTrussPts[2].Y, endTrussPts[2].Z); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexNormal(lateralR.X, lateralR.Y, lateralR.Z); package.AddTriangleVertexNormal(lateralR.X, lateralR.Y, lateralR.Z); package.AddTriangleVertexNormal(lateralR.X, lateralR.Y, lateralR.Z); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); endTrussPts = new Geo.Point[] { opPoint.Add(lateralR).Add(normal3), opPoint.Add(lateralR).Add(webAxis), opPoint.Add(lateralR) }; package.AddTriangleVertex(endTrussPts[0].X, endTrussPts[0].Y, endTrussPts[0].Z); package.AddTriangleVertex(endTrussPts[1].X, endTrussPts[1].Y, endTrussPts[1].Z); package.AddTriangleVertex(endTrussPts[2].X, endTrussPts[2].Y, endTrussPts[2].Z); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexColor(r, g, b, a); package.AddTriangleVertexNormal(lateralR.X, lateralR.Y, lateralR.Z); package.AddTriangleVertexNormal(lateralR.X, lateralR.Y, lateralR.Z); package.AddTriangleVertexNormal(lateralR.X, lateralR.Y, lateralR.Z); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); package.AddTriangleVertexUV(0, 0); break; default: package.AddPointVertex(opPoint.X, opPoint.Y, opPoint.Z); package.AddPointVertexColor(r, g, b, a); break; } } }