private void AddTopCap(ExtrusionPoint point, Orientation orientation) { _vertices.Add(point.Position); _vertices.AddRange(orientation.GetRing(_sideSegmentCount, point)); _normals.AddRange(Enumerable.Repeat(-orientation.Direction, _sideSegmentCount + 1)); _uvs.AddRange(Enumerable.Repeat(new Vector2(0, 0), _sideSegmentCount + 1)); }
private Mesh Generate() { _vertices = new List <Vector3>(); _normals = new List <Vector3>(); _uvs = new List <Vector2>(); var uOffset = 0f; var ringCount = 0; ExtrusionPoint currentPoint, nextPoint = null; var orientation = new Orientation(GetDirection(0)); for (int i = 0; i < _trajectory.Count - 1; i++) { currentPoint = _trajectory[i]; nextPoint = _trajectory[i + 1]; uOffset = i / (float)(_trajectory.Count - 1); var direction = GetDirection(i); orientation.TransformDirection(direction); if (_isCapped && i == 0) { AddTopCap(currentPoint, orientation); } AddRing(uOffset, currentPoint, orientation); ringCount++; } orientation.TransformDirection(GetDirection(_trajectory.Count - 1)); AddRing(uOffset, nextPoint, orientation); ringCount++; if (_isCapped) { AddBottomCap(nextPoint, orientation); } var mesh = new Mesh(); mesh.Vertices = _vertices; mesh.Normals = _normals; mesh.TexCoords = _uvs; mesh.Indices = GetIndices(ringCount); mesh.Type = PrimitiveType.Triangles; mesh.DrawStyle = PolygonMode.Fill; mesh.FrontFace = FrontFaceDirection.CounterClockwise; mesh.CalculateBounds(); _vertices = null; _normals = null; _uvs = null; return(mesh); }
public static ExtrusionPoint Lerp(ExtrusionPoint p1, ExtrusionPoint p2, float v) { var result = new ExtrusionPoint(); result.Radius = p1.Radius * (1 - v) + p2.Radius * v; result.Position = Vector3.Lerp(p1.Position, p2.Position, v); return(result); }
private void AddRing(float uOffset, ExtrusionPoint currentPoint, Orientation orientation) { var ringVertices = orientation.GetRing(_sideSegmentCount, currentPoint); var ringNormals = orientation.GetRingNormals(_sideSegmentCount); var ringUVs = orientation.GetRingUVs(_sideSegmentCount, uOffset); _vertices.AddRange(ringVertices); _normals.AddRange(ringNormals); _uvs.AddRange(ringUVs); }
public Vector3[] GetRing(int sideSegmentCount, ExtrusionPoint point) { var vertices = new List <Vector3>(); for (int i = 0; i < sideSegmentCount; i++) { var v = point.Radius * BasisX * MathF.Cos(MathF.PI * 2 * i / (sideSegmentCount - 1)) + point.Radius * BasisY * MathF.Sin(MathF.PI * 2 * i / (sideSegmentCount - 1)) + point.Position; vertices.Add(v); } return(vertices.ToArray()); }