Example #1
0
            protected override void UpdateTrail(PCTrail trail, float deltaTime)
            {
                if (trail.IsActiveTrail == false)
                {
                    return;
                }

                //TODO Must optimize this further, I don't need to keep recalculating point positions unless we are
                //dealng with the points between the last and 2nd last CP (+ the last CP itself)
                int trailPointIndex = 0;

                for (int i = 0; i < _controlPoints.Count; i++)
                {
                    trail.Points[trailPointIndex].Position = _controlPoints[i].p;

                    if (TrailData.UseForwardOverride)
                    {
                        trail.Points[trailPointIndex].Forward = _controlPoints[i].forward;
                    }

                    trailPointIndex++;

                    if (i < _controlPoints.Count - 1)
                    {
                        Vector3 Handle1, Handle2;
                        float   distanceBetween = Vector3.Distance(_controlPoints[i].p, _controlPoints[i + 1].p) / 2;
                        if (i == 0)
                        {
                            Handle1 = _controlPoints[i].p + (_controlPoints[i + 1].p - _controlPoints[i].p).normalized * distanceBetween;
                        }
                        else
                        {
                            Handle1 = _controlPoints[i].p + (_controlPoints[i + 1].p - _controlPoints[i - 1].p).normalized * distanceBetween;
                        }

                        int nextI = i + 1;

                        if (nextI == _controlPoints.Count - 1)
                        {
                            Handle2 = _controlPoints[nextI].p + (_controlPoints[nextI - 1].p - _controlPoints[nextI].p).normalized * distanceBetween;
                        }
                        else
                        {
                            Handle2 = _controlPoints[nextI].p + (_controlPoints[nextI - 1].p - _controlPoints[nextI + 1].p).normalized * distanceBetween;
                        }

                        PCTrailPoint currentHandle = trail.Points[trailPointIndex - 1];
                        PCTrailPoint nextHandle    = trail.Points[(trailPointIndex - 1) + PointsBetweenControlPoints + 1];


                        for (int pointBetween = 0; pointBetween < PointsBetweenControlPoints; pointBetween++)
                        {
                            float t = (((float)pointBetween + 1f) / ((float)PointsBetweenControlPoints + 1f));
                            trail.Points[trailPointIndex].Position = GetPointAlongCurve(_controlPoints[i].p, Handle1, _controlPoints[i + 1].p, Handle2, t, 0.3f);
                            trail.Points[trailPointIndex].SetTimeActive(Mathf.Lerp(currentHandle.TimeActive(), nextHandle.TimeActive(), t));

                            if (TrailData.UseForwardOverride)
                            {
                                trail.Points[trailPointIndex].Forward = Vector3.Lerp(currentHandle.Forward, nextHandle.Forward, t);
                            }


                            trailPointIndex++;
                        }
                    }
                }

                int lastControlPointPointIndex = ((_controlPoints.Count - 1) + ((_controlPoints.Count - 1) * PointsBetweenControlPoints));
                int prevControlPointPointIndex = lastControlPointPointIndex - PointsBetweenControlPoints - 1;
                int activePointCount           = lastControlPointPointIndex + 1;


                float distanceFromStart = trail.Points[prevControlPointPointIndex].GetDistanceFromStart();

                for (int i = prevControlPointPointIndex + 1; i < activePointCount; i++)
                {
                    distanceFromStart += Vector3.Distance(trail.Points[i - 1].Position, trail.Points[i].Position);
                    trail.Points[i].SetDistanceFromStart(distanceFromStart);
                }
            }
Example #2
0
            private void GenerateMesh(PCTrail trail)
            {
                trail.mesh.Clear(false);

                Vector3 camForward = Initialize.mainCam != null ? Initialize.mainCam.transform.forward : Vector3.forward;

                if (TrailData.UseForwardOverride)
                {
                    camForward = TrailData.ForwardOverride.normalized;
                }

                trail.activePointCount = NumberOfActivePoints(trail);

                if (trail.activePointCount < 2)
                {
                    return;
                }


                int vertIndex = 0;

                for (int i = 0; i < trail.Points.Count; i++)
                {
                    PCTrailPoint p         = trail.Points[i];
                    float        timeAlong = p.TimeActive() / TrailData.Lifetime;

                    if (p.TimeActive() > TrailData.Lifetime)
                    {
                        continue;
                    }

                    if (TrailData.UseForwardOverride && TrailData.ForwardOverrideRelative)
                    {
                        camForward = p.Forward;
                    }

                    Vector3 cross = Vector3.zero;

                    if (i < trail.Points.Count - 1)
                    {
                        cross =
                            Vector3.Cross((trail.Points[i + 1].Position - p.Position).normalized, camForward).
                            normalized;
                    }
                    else
                    {
                        cross =
                            Vector3.Cross((p.Position - trail.Points[i - 1].Position).normalized, camForward).
                            normalized;
                    }


                    //yuck! lets move these into their own functions some time
                    Color c = TrailData.StretchColorToFit ?
                              (TrailData.UsingSimpleColor ? Color.Lerp(TrailData.SimpleColorOverLifeStart, TrailData.SimpleColorOverLifeEnd, 1 - ((float)vertIndex / (float)trail.activePointCount / 2f)) : TrailData.ColorOverLife.Evaluate(1 - ((float)vertIndex / (float)trail.activePointCount / 2f))) :
                              (TrailData.UsingSimpleColor ? Color.Lerp(TrailData.SimpleColorOverLifeStart, TrailData.SimpleColorOverLifeEnd, timeAlong) : TrailData.ColorOverLife.Evaluate(timeAlong));

                    float s = TrailData.StretchSizeToFit ?
                              (TrailData.UsingSimpleSize ? Mathf.Lerp(TrailData.SimpleSizeOverLifeStart, TrailData.SimpleSizeOverLifeEnd, 1 - ((float)vertIndex / (float)trail.activePointCount / 2f)) : TrailData.SizeOverLife.Evaluate(1 - ((float)vertIndex / (float)trail.activePointCount / 2f))) :
                              (TrailData.UsingSimpleSize ? Mathf.Lerp(TrailData.SimpleSizeOverLifeStart, TrailData.SimpleSizeOverLifeEnd, timeAlong) : TrailData.SizeOverLife.Evaluate(timeAlong));


                    trail.verticies[vertIndex] = p.Position + cross * s;

                    if (TrailData.MaterialTileLength <= 0)
                    {
                        trail.uvs[vertIndex] = new Vector2((float)vertIndex / (float)trail.activePointCount / 2f, 0);
                    }
                    else
                    {
                        trail.uvs[vertIndex] = new Vector2(p.GetDistanceFromStart() / TrailData.MaterialTileLength, 0);
                    }

                    trail.normals[vertIndex] = camForward;
                    trail.colors[vertIndex]  = c;
                    vertIndex++;
                    trail.verticies[vertIndex] = p.Position - cross * s;

                    if (TrailData.MaterialTileLength <= 0)
                    {
                        trail.uvs[vertIndex] = new Vector2((float)vertIndex / (float)trail.activePointCount / 2f, 1);
                    }
                    else
                    {
                        trail.uvs[vertIndex] = new Vector2(p.GetDistanceFromStart() / TrailData.MaterialTileLength, 1);
                    }

                    trail.normals[vertIndex] = camForward;
                    trail.colors[vertIndex]  = c;

                    vertIndex++;
                }

                Vector2 finalPosition = trail.verticies[vertIndex - 1];

                for (int i = vertIndex; i < trail.verticies.Length; i++)
                {
                    trail.verticies[i] = finalPosition;
                }

                int indIndex = 0;

                for (int pointIndex = 0; pointIndex < 2 * (trail.activePointCount - 1); pointIndex++)
                {
                    if (pointIndex % 2 == 0)
                    {
                        trail.indicies[indIndex] = pointIndex;
                        indIndex++;
                        trail.indicies[indIndex] = pointIndex + 1;
                        indIndex++;
                        trail.indicies[indIndex] = pointIndex + 2;
                    }
                    else
                    {
                        trail.indicies[indIndex] = pointIndex + 2;
                        indIndex++;
                        trail.indicies[indIndex] = pointIndex + 1;
                        indIndex++;
                        trail.indicies[indIndex] = pointIndex;
                    }

                    indIndex++;
                }

                int finalIndex = trail.indicies[indIndex - 1];

                for (int i = indIndex; i < trail.indicies.Length; i++)
                {
                    trail.indicies[i] = finalIndex;
                }

                trail.mesh.vertices = trail.verticies;
                trail.mesh.SetIndices(trail.indicies, MeshTopology.Triangles, 0);
                trail.mesh.uv      = trail.uvs;
                trail.mesh.normals = trail.normals;
                trail.mesh.colors  = trail.colors;
            }