Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
            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());
            }