Example #1
0
        private void AddPath(ref Mesh mesh, ref int meshCount, ref int vertexCount)
        {
            var pathLength = Random.Range(PathLengthMin, PathLengthMax);
            var lineCount  = 2 + (int)(pathLength * PathDetail);
            var quadCount  = lineCount - 1;
            var vertices   = quadCount * 2 + 2;

            if (vertexCount + vertices > 65000)
            {
                BakeMesh(mesh);

                mesh        = GetMesh(meshCount);
                meshCount  += 1;
                vertexCount = 0;
            }

            var angle      = Random.Range(-Mathf.PI, Mathf.PI);
            var speed      = 1.0f / PointDetail;
            var detailStep = 1.0f / PathDetail;
            var pointStep  = detailStep * PointDetail;
            var pointFrac  = 0.0f;
            var pointA     = GetStart(angle + Mathf.PI);
            var pointB     = GetNext(pointA, angle, speed);
            var pointC     = GetNext(pointB, angle, speed);
            var pointD     = GetNext(pointC, angle, speed);
            var coordFrac  = 0.0f;
            var edgeFrac   = -1.0f;
            var edgeStep   = 2.0f / lineCount;
            var coordStep  = detailStep * TrailTile;

            var angleA    = angle;
            var angleB    = GetNextAngle(angleA);
            var angleC    = GetNextAngle(angleB);
            var angleD    = GetNextAngle(angleC);
            var angleFrac = 0.0f;
            var angleStep = detailStep * AnimAngleDetail;

            var strengthA    = 0.0f;
            var strengthB    = GetNextStrength();
            var strengthC    = GetNextStrength();
            var strengthD    = GetNextStrength();
            var strengthFrac = 0.0f;
            var strengthStep = detailStep * AnimStrengthDetail;

            var colorA    = GetNextColor();
            var colorB    = GetNextColor();
            var colorC    = GetNextColor();
            var colorD    = GetNextColor();
            var colorFrac = 0.0f;
            var colorStep = detailStep * ColorsDetail;

            var heightA    = GetNextHeight();
            var heightB    = GetNextHeight();
            var heightC    = GetNextHeight();
            var heightD    = GetNextHeight();
            var heightFrac = 0.0f;
            var heightStep = detailStep * TrailHeightsDetail;

            for (var i = 0; i < lineCount; i++)
            {
                while (pointFrac >= 1.0f)
                {
                    Shift(ref pointA, ref pointB, ref pointC, pointD, ref pointFrac); pointD = GetNext(pointC, angle, speed);
                }

                while (angleFrac >= 1.0f)
                {
                    Shift(ref angleA, ref angleB, ref angleC, angleD, ref angleFrac); angleD = GetNextAngle(angleC);
                }

                while (strengthFrac >= 1.0f)
                {
                    Shift(ref strengthA, ref strengthB, ref strengthC, strengthD, ref strengthFrac); strengthD = GetNextStrength();
                }

                while (colorFrac >= 1.0f)
                {
                    Shift(ref colorA, ref colorB, ref colorC, colorD, ref colorFrac); colorD = GetNextColor();
                }

                while (heightFrac >= 1.0f)
                {
                    Shift(ref heightA, ref heightB, ref heightC, heightD, ref heightFrac); heightD = GetNextHeight();
                }

                var point   = SgtHelper.HermiteInterpolate3(pointA, pointB, pointC, pointD, pointFrac);
                var animAng = SgtHelper.HermiteInterpolate(angleA, angleB, angleC, angleD, angleFrac);
                var animStr = SgtHelper.HermiteInterpolate(strengthA, strengthB, strengthC, strengthD, strengthFrac);
                var color   = SgtHelper.HermiteInterpolate(colorA, colorB, colorC, colorD, colorFrac);
                var height  = SgtHelper.HermiteInterpolate(heightA, heightB, heightC, heightD, heightFrac);

                // Fade edges
                color.a *= Mathf.SmoothStep(1.0f, 0.0f, Mathf.Pow(Mathf.Abs(edgeFrac), TrailEdgeFade));

                coords0.Add(new Vector4(coordFrac, 0.0f, animAng, animStr));
                coords0.Add(new Vector4(coordFrac, height, animAng, animStr));

                positions.Add(point);
                positions.Add(point);

                colors.Add(color);
                colors.Add(color);

                pointFrac    += pointStep;
                edgeFrac     += edgeStep;
                coordFrac    += coordStep;
                angleFrac    += angleStep;
                strengthFrac += strengthStep;
                colorFrac    += colorStep;
                heightFrac   += heightStep;
            }

            var vector = positions[1] - positions[0];

            normals.Add(GetNormal(vector, vector));
            normals.Add(GetNormal(vector, vector));

            for (var i = 2; i < lineCount; i++)
            {
                var nextVector = positions[i] - positions[i - 1];

                normals.Add(GetNormal(vector, nextVector));
                normals.Add(GetNormal(vector, nextVector));

                vector = nextVector;
            }

            normals.Add(GetNormal(vector, vector));
            normals.Add(GetNormal(vector, vector));

            for (var i = 0; i < quadCount; i++)
            {
                var offset = vertexCount + i * 2;

                indices.Add(offset + 0);
                indices.Add(offset + 1);
                indices.Add(offset + 2);

                indices.Add(offset + 3);
                indices.Add(offset + 2);
                indices.Add(offset + 1);
            }

            vertexCount += vertices;
        }