Пример #1
0
    public override Racetrack ApplyRacetrack(Racetrack racetrack)
    {
        angle  = 0f;
        radius = 3f;
        //Generate(amountOfCPs);

        Vector3[] checkpoints = new Vector3[amountOfCPs];

        for (int i = 0; i < amountOfCPs; i++)
        {
            //GameObject instCp = (GameObject)Instantiate(prefabControlpoint, instTrack.transform);
            angle  += Random.Range(minAngle, maxAngle);
            radius += Random.Range(minRadius, maxRadius);

            Vector2 point = new Vector2(Mathf.Sin((angle * Mathf.PI) / 180f) * radius, Mathf.Cos((angle * Mathf.PI) / 180f) * radius);

            checkpoints[i] = new Vector3(point.x, 0f, point.y);

            //instCp.transform.position = new Vector3(point.x, 0f, point.y);

            //instCPs.Add(instCp);
        }


        ClosedSpline <Vector3> clSpline = new ClosedSpline <Vector3>(checkpoints);

        //if (instTrack != null)
        //{
        racetrack.track = clSpline;
        //}

        return(racetrack);
    }
Пример #2
0
    public void Refresh()
    {
        racetrack = new Racetrack();
        racetrack = track.ApplyRacetrack(racetrack);
        racetrack = width.ApplyRacetrack(racetrack);
        racetrack = height.ApplyRacetrack(racetrack);
        racetrack = bend.ApplyRacetrack(racetrack);

        int tries = 0;

        while (racetrackOkay(racetrack) == false)
        {
            tries++;
            racetrack = new Racetrack();
            racetrack = track.ApplyRacetrack(racetrack);
            racetrack = width.ApplyRacetrack(racetrack);
            racetrack = height.ApplyRacetrack(racetrack);
            racetrack = bend.ApplyRacetrack(racetrack);

            if (tries >= 2000)
            {
                break;
            }
        }

        Debug.Log("Tries: " + tries);

        racetrack = rendererProfiler.ApplyRacetrack(racetrack);
    }
Пример #3
0
    private bool racetrackOkay(Racetrack track)
    {
        for (int i = 0; i < rules.Count; i++)
        {
            if (rules[i].Check(track) == false)
            {
                return(false);
            }
        }

        return(true);
    }
Пример #4
0
 void Awake()
 {
     //if no instance of this exists, then assign this instance
     if (instance == null)
     {
         instance = this;
         DontDestroyOnLoad(gameObject);
     }
     else
     {
         DestroyImmediate(this);
     }
 }
Пример #5
0
    public override Racetrack ApplyRacetrack(Racetrack racetrack)
    {
        float[] cps = new float[racetrack.track.controlPoints.Length];
        for (int i = 0; i < cps.Length; i++)
        {
            cps[i] = Random.Range(widthMin, widthMax);
        }

        ClosedSpline <float> widthSpline = new ClosedSpline <float>(cps);

        racetrack.width = widthSpline;

        return(racetrack);
    }
Пример #6
0
    public override Racetrack ApplyRacetrack(Racetrack racetrack)
    {
        float[] cps = new float[checkpointsAmount];
        for (int i = 0; i < cps.Length; i++)
        {
            float heightThere = terrain.SampleHeight(racetrack.track.SplineAt(((float)i) / ((float)cps.Length)) * 20f);
            //Debug.Log("Height (" + (int)(racetrack.track.controlPoints[i].x * 20f + transform.position.x) + "," + (int)(racetrack.track.controlPoints[i].z * 20f + transform.position.z) + "): " + heightThere);
            cps[i] = heightThere;
        }

        ClosedSpline <float> heightSpline = new ClosedSpline <float>(cps);

        racetrack.height = heightSpline;

        return(racetrack);
    }
Пример #7
0
        public void Add(TrackWaypoint wp)
        {
            x_min = Math.Min(wp.X, x_min);
            x_max = Math.Max(wp.X, x_max);

            y_min = Math.Min(wp.Z, y_min);
            y_max = Math.Max(wp.Z, y_max);

            if (wp.Route == TrackRoute.MAIN)
            {
                Racetrack.Add(wp);
            }

            if (wp.Route == TrackRoute.PITLANE)
            {
                Pitlane.Add(wp);
            }
        }
Пример #8
0
    public override Racetrack ApplyRacetrack(Racetrack racetrack)
    {
        float[] cps = new float[checkpointsAmount];
        for (int i = 0; i < cps.Length; i++)
        {
            //Debug.Log("Height (" + (int)(racetrack.track.controlPoints[i].x * 20f + transform.position.x) + "," + (int)(racetrack.track.controlPoints[i].z * 20f + transform.position.z) + "): " + heightThere);


            Vector3   middlePosFirst = racetrack.track.SplineAt(((float)i) / ((float)cps.Length));
            Vector3[] tangentFirst   = racetrack.track.TangentAt(((float)i) / ((float)cps.Length));
            Vector3   forwardFirst   = tangentFirst[1] - tangentFirst[0];
            forwardFirst.Normalize();
            Vector3 sidewardsFirst = Quaternion.Euler(0f, 90f, 0f) * forwardFirst;
            sidewardsFirst.Normalize();

            Vector3 leftFirst  = (middlePosFirst - sidewardsFirst * racetrack.width.SplineAt(0f) * 0.5f);
            Vector3 rightFirst = (middlePosFirst + sidewardsFirst * racetrack.width.SplineAt(0f) * 0.5f);

            leftFirst  *= 20f;
            rightFirst *= 20f;

            float heightLeft  = terrain.SampleHeight(leftFirst);
            float heightRight = terrain.SampleHeight(rightFirst);

            Vector3 leftFirstH  = leftFirst;
            Vector3 rightFirstH = rightFirst;
            leftFirstH.y  = heightLeft;
            rightFirstH.y = heightRight;



            cps[i] = Vector3.Angle(leftFirst - rightFirst, leftFirstH - rightFirstH) * Mathf.Sign(heightRight - heightLeft);
        }

        ClosedSpline <float> heightSpline = new ClosedSpline <float>(cps);

        racetrack.bend = heightSpline;

        return(racetrack);
    }
Пример #9
0
 public void Finalize()
 {
     Racetrack = Racetrack.OrderBy(x => x.Meters).ToList();
     Pitlane   = Pitlane.OrderBy(x => x.Meters).ToList();
     Length    = Racetrack.Max(x => x.Meters);
 }
Пример #10
0
    public override bool Check(Racetrack racetrack)
    {
        float tolerance  = 0.1f;
        int   resolution = 400;

        List <Line> leftLines  = new List <Line>();
        List <Line> rightLines = new List <Line>();

        Vector3 middlePosFirst = racetrack.track.SplineAt(0f);

        Vector3[] tangentFirst = racetrack.track.TangentAt(0f);
        Vector3   forwardFirst = tangentFirst[1] - tangentFirst[0];

        forwardFirst.Normalize();
        Vector3 sidewardsFirst = Quaternion.Euler(0f, 90f, 0f) * forwardFirst;

        sidewardsFirst.Normalize();

        Vector2 leftFirst  = new Vector2((middlePosFirst - sidewardsFirst * racetrack.width.SplineAt(0f) * 0.5f).x, (middlePosFirst - sidewardsFirst * racetrack.width.SplineAt(0f) * 0.5f).z);
        Vector2 rightFirst = new Vector2((middlePosFirst + sidewardsFirst * racetrack.width.SplineAt(0f) * 0.5f).x, (middlePosFirst + sidewardsFirst * racetrack.width.SplineAt(0f) * 0.5f).z);

        for (int i = 1; i < resolution; i++)
        {
            float xPos = ((float)i) / ((float)resolution);

            Vector3   middlePos = racetrack.track.SplineAt(xPos);
            Vector3[] tangent   = racetrack.track.TangentAt(xPos);
            Vector3   forward   = tangent[1] - tangent[0];
            forward.Normalize();
            Vector3 sidewards = Quaternion.Euler(0f, 90f, 0f) * forward;
            sidewards.Normalize();


            Vector2 left  = new Vector2((middlePos - sidewards * racetrack.width.SplineAt(xPos) * 0.5f).x, (middlePos - sidewards * racetrack.width.SplineAt(xPos) * 0.5f).z);
            Vector2 right = new Vector2((middlePos + sidewards * racetrack.width.SplineAt(xPos) * 0.5f).x, (middlePos + sidewards * racetrack.width.SplineAt(xPos) * 0.5f).z);

            leftLines.Add(new Line(leftFirst, left));
            rightLines.Add(new Line(rightFirst, right));

            leftFirst  = left;
            rightFirst = right;

            for (int j = leftLines.Count - 2; j >= 0; j--)
            {
                Vector2 point;
                if (leftLines[j].IntersectsOffset(leftLines[leftLines.Count - 1], tolerance, out point))
                {
                    return(false);
                }
            }
            for (int j = rightLines.Count - 2; j >= 0; j--)
            {
                Vector2 point;
                if (rightLines[j].IntersectsOffset(rightLines[rightLines.Count - 1], tolerance, out point))
                {
                    return(false);
                }
            }
        }

        return(true);
    }
Пример #11
0
 public virtual bool Check(Racetrack racetrack)
 {
     return(true);
 }
Пример #12
0
 // Use this for initialization
 void Start()
 {
     rules = new List <RTRule>();
     rules.Add(new CurveRule());
     racetrack = new Racetrack();
 }
Пример #13
0
    public override Racetrack ApplyRacetrack(Racetrack racetrack)
    {
        if (instTrack != null)
        {
            Destroy(instTrack);
            instTrack = null;
        }
        instTrack = Instantiate(renderedTrackPrefab, transform);
        instTrack.transform.localPosition = Vector3.zero;

        Vector3[] leftCps  = new Vector3[racetrack.track.controlPoints.Length];
        Vector3[] rightCps = new Vector3[racetrack.track.controlPoints.Length];

        for (int i = 0; i < leftCps.Length; i++)
        {
            Vector3   cpPos     = racetrack.track.controlPoints[i];
            Vector3[] tangentCp = racetrack.track.TangentAt(((float)i) / ((float)leftCps.Length));
            Vector3   forwardCp = tangentCp[1] - tangentCp[0];
            forwardCp.Normalize();
            Vector3 sidewardsCp = Quaternion.Euler(0f, 90f, 0f) * forwardCp;
            sidewardsCp.Normalize();
            rightCps[i] = cpPos + sidewardsCp * racetrack.width.controlPoints[i] * 0.5f;
            leftCps[i]  = cpPos - sidewardsCp * racetrack.width.controlPoints[i] * 0.5f;
        }

        ClosedSpline <Vector3> leftTrack  = new ClosedSpline <Vector3>(leftCps);
        ClosedSpline <Vector3> rightTrack = new ClosedSpline <Vector3>(rightCps);



        MeshFilter meshFilter = instTrack.GetComponent <MeshFilter>();

        List <Vector3> vertices  = new List <Vector3>();
        List <int>     triangles = new List <int>();
        List <Vector2> uvs       = new List <Vector2>();

        List <int> trianglesWhite = new List <int>();

        List <int> trianglesGrass = new List <int>();


        float xPosFirst = 0f;

        /*Vector3 middlePosFirst = racetrack.track.SplineAt(xPosFirst);
         *
         * Vector3[] tangentFirst = racetrack.track.TangentAt(xPosFirst);
         *
         * Vector3 forwardFirst = tangentFirst[1] - tangentFirst[0];
         * forwardFirst.Normalize();
         * Vector3 sidewardsFirst = Quaternion.Euler(0f, 90f, 0f) * forwardFirst;
         *
         * sidewardsFirst.Normalize();
         *
         * Vector3 firstl_p = sidewardsFirst * -0.5f * racetrack.width.SplineAt(xPosFirst) + middlePosFirst;
         * Vector3 firstr_p = sidewardsFirst * 0.5f * racetrack.width.SplineAt(xPosFirst) + middlePosFirst;
         *
         * Vector3 firstl_whiteBegin = firstl_p + sidewardsFirst * whiteStripOffset;
         * Vector3 firstr_whiteBegin = firstr_p - sidewardsFirst * whiteStripOffset;
         *
         * Vector3 firstl_whiteInner = firstl_whiteBegin + sidewardsFirst * whiteStripWidth;
         * Vector3 firstr_whiteInner = firstr_whiteBegin - sidewardsFirst * whiteStripWidth;
         *
         * Vector3 firstl_grassSameHeight = firstl_p - sidewardsFirst * grassWidth;
         * Vector3 firstr_grassSameHeight = firstr_p + sidewardsFirst * grassWidth;
         *
         * Vector3 firstl_grassHill = firstl_grassSameHeight - sidewardsFirst * grassHillWidth + Vector3.Cross(sidewardsFirst, forwardFirst) * grassHillHeight;
         * Vector3 firstr_grassHill = firstr_grassSameHeight + sidewardsFirst * grassHillWidth + Vector3.Cross(sidewardsFirst, forwardFirst) * grassHillHeight;*/

        Vector3[] tangentFirstLeft = leftTrack.TangentAt(xPosFirst);
        Vector3   forwardFirstLeft = tangentFirstLeft[1] - tangentFirstLeft[0];

        forwardFirstLeft.Normalize();
        Vector3 sidewardsFirstLeft = Quaternion.Euler(0f, 90f, 0f) * forwardFirstLeft;

        sidewardsFirstLeft.Normalize();

        Vector3[] tangentFirstRight = rightTrack.TangentAt(xPosFirst);
        Vector3   forwardFirstRight = tangentFirstRight[1] - tangentFirstRight[0];

        forwardFirstRight.Normalize();
        Vector3 sidewardsFirstRight = Quaternion.Euler(0f, 90f, 0f) * forwardFirstRight;

        sidewardsFirstRight.Normalize();

        Vector3 firstl_p = leftTrack.SplineAt(xPosFirst);
        Vector3 firstr_p = rightTrack.SplineAt(xPosFirst);

        Vector3 firstl_whiteBegin = firstl_p + sidewardsFirstLeft * whiteStripOffset;
        Vector3 firstr_whiteBegin = firstr_p - sidewardsFirstRight * whiteStripOffset;

        Vector3 firstl_whiteInner = firstl_whiteBegin + sidewardsFirstLeft * whiteStripWidth;
        Vector3 firstr_whiteInner = firstr_whiteBegin - sidewardsFirstRight * whiteStripWidth;

        Vector3 firstl_grassSameHeight = firstl_p - sidewardsFirstLeft * grassWidth;
        Vector3 firstr_grassSameHeight = firstr_p + sidewardsFirstRight * grassWidth;

        Vector3 firstl_grassHill = firstl_grassSameHeight - sidewardsFirstLeft * grassHillWidth + Vector3.Cross(sidewardsFirstLeft, forwardFirstLeft) * grassHillHeight;
        Vector3 firstr_grassHill = firstr_grassSameHeight + sidewardsFirstRight * grassHillWidth + Vector3.Cross(sidewardsFirstRight, forwardFirstRight) * grassHillHeight;

        vertices.Add(firstl_grassHill);
        vertices.Add(firstl_grassSameHeight);
        vertices.Add(firstl_p);
        vertices.Add(firstl_whiteBegin);
        vertices.Add(firstl_whiteInner);
        vertices.Add(firstr_whiteInner);
        vertices.Add(firstr_whiteBegin);
        vertices.Add(firstr_p);
        vertices.Add(firstr_grassSameHeight);
        vertices.Add(firstr_grassHill);

        uvs.Add(new Vector2(firstl_grassHill.x, firstl_grassHill.z));
        uvs.Add(new Vector2(firstl_grassSameHeight.x, firstl_grassSameHeight.z));
        uvs.Add(new Vector2(firstl_p.x, firstl_p.z));
        uvs.Add(new Vector2(firstl_whiteBegin.x, firstl_whiteBegin.z));
        uvs.Add(new Vector2(firstl_whiteInner.x, firstl_whiteInner.z));
        uvs.Add(new Vector2(firstr_whiteInner.x, firstr_whiteInner.z));
        uvs.Add(new Vector2(firstr_whiteBegin.x, firstr_whiteBegin.z));
        uvs.Add(new Vector2(firstr_p.x, firstr_p.z));
        uvs.Add(new Vector2(firstr_grassSameHeight.x, firstr_grassSameHeight.z));
        uvs.Add(new Vector2(firstr_grassHill.x, firstr_grassHill.z));

        for (int i = 1; i < resolution; i++)
        {
            float xPos = ((float)i) / ((float)resolution);

            /*Vector3 middlePos = racetrack.track.SplineAt(xPos);
             *
             * Vector3[] tangent = racetrack.track.TangentAt(xPos);
             *
             * Vector3 forward = tangent[1] - tangent[0];
             * forward.Normalize();
             * Vector3 sidewards = Quaternion.Euler(0f, 90f, 0f) * forward;
             *
             * sidewards.Normalize();
             *
             * Vector3 l_p = sidewards * -0.5f * racetrack.width.SplineAt(xPos) + middlePos;
             * Vector3 r_p = sidewards * 0.5f * racetrack.width.SplineAt(xPos) + middlePos;
             *
             * Vector3 l_whiteBegin = l_p + sidewards * whiteStripOffset;
             * Vector3 r_whiteBegin = r_p - sidewards * whiteStripOffset;
             *
             * Vector3 l_whiteInner = l_whiteBegin + sidewards * whiteStripWidth;
             * Vector3 r_whiteInner = r_whiteBegin - sidewards * whiteStripWidth;
             *
             * Vector3 l_grassSameHeight = l_p - sidewards * grassWidth;
             * Vector3 r_grassSameHeight = r_p + sidewards * grassWidth;
             *
             * Vector3 l_grassHill = l_grassSameHeight - sidewards * grassHillWidth + Vector3.Cross(sidewards, forward) * grassHillHeight;
             * Vector3 r_grassHill = r_grassSameHeight + sidewards * grassHillWidth + Vector3.Cross(sidewards, forward) * grassHillHeight;*/

            Vector3[] tangentLeft = leftTrack.TangentAt(xPos);
            Vector3   forwardLeft = tangentLeft[1] - tangentLeft[0];
            forwardLeft.Normalize();
            Vector3 sidewardsLeft = Quaternion.Euler(0f, 90f, 0f) * forwardLeft;
            sidewardsLeft.Normalize();

            Vector3[] tangentRight = rightTrack.TangentAt(xPos);
            Vector3   forwardRight = tangentRight[1] - tangentRight[0];
            forwardRight.Normalize();
            Vector3 sidewardsRight = Quaternion.Euler(0f, 90f, 0f) * forwardRight;
            sidewardsRight.Normalize();

            Vector3 l_p = leftTrack.SplineAt(xPos);
            Vector3 r_p = rightTrack.SplineAt(xPos);

            Vector3 l_whiteBegin = l_p + sidewardsLeft * whiteStripOffset;
            Vector3 r_whiteBegin = r_p - sidewardsRight * whiteStripOffset;

            Vector3 l_whiteInner = l_whiteBegin + sidewardsLeft * whiteStripWidth;
            Vector3 r_whiteInner = r_whiteBegin - sidewardsRight * whiteStripWidth;

            Vector3 l_grassSameHeight = l_p - sidewardsLeft * grassWidth;
            Vector3 r_grassSameHeight = r_p + sidewardsRight * grassWidth;

            Vector3 l_grassHill = l_grassSameHeight - sidewardsLeft * grassHillWidth + Vector3.Cross(sidewardsLeft, forwardLeft) * grassHillHeight;
            Vector3 r_grassHill = r_grassSameHeight + sidewardsRight * grassHillWidth + Vector3.Cross(sidewardsRight, forwardRight) * grassHillHeight;


            vertices.Add(l_grassHill);
            vertices.Add(l_grassSameHeight);
            vertices.Add(l_p);
            vertices.Add(l_whiteBegin);
            vertices.Add(l_whiteInner);
            vertices.Add(r_whiteInner);
            vertices.Add(r_whiteBegin);
            vertices.Add(r_p);
            vertices.Add(r_grassSameHeight);
            vertices.Add(r_grassHill);

            uvs.Add(new Vector2(l_grassHill.x, l_grassHill.z));
            uvs.Add(new Vector2(l_grassSameHeight.x, l_grassSameHeight.z));
            uvs.Add(new Vector2(l_p.x, l_p.z));
            uvs.Add(new Vector2(l_whiteBegin.x, l_whiteBegin.z));
            uvs.Add(new Vector2(l_whiteInner.x, l_whiteInner.z));
            uvs.Add(new Vector2(r_whiteInner.x, r_whiteInner.z));
            uvs.Add(new Vector2(r_whiteBegin.x, r_whiteBegin.z));
            uvs.Add(new Vector2(r_p.x, r_p.z));
            uvs.Add(new Vector2(r_grassSameHeight.x, r_grassSameHeight.z));
            uvs.Add(new Vector2(r_grassHill.x, r_grassHill.z));

            triangles.Add((i - 1) * 10 + 2);
            triangles.Add((i - 0) * 10 + 2);
            triangles.Add((i - 1) * 10 + 3);
            triangles.Add((i - 1) * 10 + 3);
            triangles.Add((i - 0) * 10 + 2);
            triangles.Add((i - 0) * 10 + 3);

            triangles.Add((i - 1) * 10 + 4);
            triangles.Add((i - 0) * 10 + 4);
            triangles.Add((i - 1) * 10 + 5);
            triangles.Add((i - 1) * 10 + 5);
            triangles.Add((i - 0) * 10 + 4);
            triangles.Add((i - 0) * 10 + 5);

            triangles.Add((i - 1) * 10 + 6);
            triangles.Add((i - 0) * 10 + 6);
            triangles.Add((i - 1) * 10 + 7);
            triangles.Add((i - 1) * 10 + 7);
            triangles.Add((i - 0) * 10 + 6);
            triangles.Add((i - 0) * 10 + 7);



            trianglesWhite.Add((i - 1) * 10 + 3);
            trianglesWhite.Add((i - 0) * 10 + 3);
            trianglesWhite.Add((i - 1) * 10 + 4);
            trianglesWhite.Add((i - 1) * 10 + 4);
            trianglesWhite.Add((i - 0) * 10 + 3);
            trianglesWhite.Add((i - 0) * 10 + 4);

            trianglesWhite.Add((i - 1) * 10 + 5);
            trianglesWhite.Add((i - 0) * 10 + 5);
            trianglesWhite.Add((i - 1) * 10 + 6);
            trianglesWhite.Add((i - 1) * 10 + 6);
            trianglesWhite.Add((i - 0) * 10 + 5);
            trianglesWhite.Add((i - 0) * 10 + 6);



            trianglesGrass.Add((i - 1) * 10 + 0);
            trianglesGrass.Add((i - 0) * 10 + 0);
            trianglesGrass.Add((i - 1) * 10 + 1);
            trianglesGrass.Add((i - 1) * 10 + 1);
            trianglesGrass.Add((i - 0) * 10 + 0);
            trianglesGrass.Add((i - 0) * 10 + 1);

            trianglesGrass.Add((i - 1) * 10 + 1);
            trianglesGrass.Add((i - 0) * 10 + 1);
            trianglesGrass.Add((i - 1) * 10 + 2);
            trianglesGrass.Add((i - 1) * 10 + 2);
            trianglesGrass.Add((i - 0) * 10 + 1);
            trianglesGrass.Add((i - 0) * 10 + 2);

            trianglesGrass.Add((i - 1) * 10 + 7);
            trianglesGrass.Add((i - 0) * 10 + 7);
            trianglesGrass.Add((i - 1) * 10 + 8);
            trianglesGrass.Add((i - 1) * 10 + 8);
            trianglesGrass.Add((i - 0) * 10 + 7);
            trianglesGrass.Add((i - 0) * 10 + 8);

            trianglesGrass.Add((i - 1) * 10 + 8);
            trianglesGrass.Add((i - 0) * 10 + 8);
            trianglesGrass.Add((i - 1) * 10 + 9);
            trianglesGrass.Add((i - 1) * 10 + 9);
            trianglesGrass.Add((i - 0) * 10 + 8);
            trianglesGrass.Add((i - 0) * 10 + 9);
        }

        if (true)
        {
            #region Last One

            triangles.Add((resolution - 1) * 10 + 2);
            triangles.Add((0) * 10 + 2);
            triangles.Add((resolution - 1) * 10 + 3);
            triangles.Add((resolution - 1) * 10 + 3);
            triangles.Add((0) * 10 + 2);
            triangles.Add((0) * 10 + 3);

            triangles.Add((resolution - 1) * 10 + 4);
            triangles.Add((0) * 10 + 4);
            triangles.Add((resolution - 1) * 10 + 5);
            triangles.Add((resolution - 1) * 10 + 5);
            triangles.Add((0) * 10 + 4);
            triangles.Add((0) * 10 + 5);

            triangles.Add((resolution - 1) * 10 + 6);
            triangles.Add((0) * 10 + 6);
            triangles.Add((resolution - 1) * 10 + 7);
            triangles.Add((resolution - 1) * 10 + 7);
            triangles.Add((0) * 10 + 6);
            triangles.Add((0) * 10 + 7);



            trianglesWhite.Add((resolution - 1) * 10 + 3);
            trianglesWhite.Add((0) * 10 + 3);
            trianglesWhite.Add((resolution - 1) * 10 + 4);
            trianglesWhite.Add((resolution - 1) * 10 + 4);
            trianglesWhite.Add((0) * 10 + 3);
            trianglesWhite.Add((0) * 10 + 4);

            trianglesWhite.Add((resolution - 1) * 10 + 5);
            trianglesWhite.Add((0) * 10 + 5);
            trianglesWhite.Add((resolution - 1) * 10 + 6);
            trianglesWhite.Add((resolution - 1) * 10 + 6);
            trianglesWhite.Add((0) * 10 + 5);
            trianglesWhite.Add((0) * 10 + 6);



            trianglesGrass.Add((resolution - 1) * 10 + 0);
            trianglesGrass.Add((0) * 10 + 0);
            trianglesGrass.Add((resolution - 1) * 10 + 1);
            trianglesGrass.Add((resolution - 1) * 10 + 1);
            trianglesGrass.Add((0) * 10 + 0);
            trianglesGrass.Add((0) * 10 + 1);

            trianglesGrass.Add((resolution - 1) * 10 + 1);
            trianglesGrass.Add((0) * 10 + 1);
            trianglesGrass.Add((resolution - 1) * 10 + 2);
            trianglesGrass.Add((resolution - 1) * 10 + 2);
            trianglesGrass.Add((0) * 10 + 1);
            trianglesGrass.Add((0) * 10 + 2);

            trianglesGrass.Add((resolution - 1) * 10 + 7);
            trianglesGrass.Add((0) * 10 + 7);
            trianglesGrass.Add((resolution - 1) * 10 + 8);
            trianglesGrass.Add((resolution - 1) * 10 + 8);
            trianglesGrass.Add((0) * 10 + 7);
            trianglesGrass.Add((0) * 10 + 8);

            trianglesGrass.Add((resolution - 1) * 10 + 8);
            trianglesGrass.Add((0) * 10 + 8);
            trianglesGrass.Add((resolution - 1) * 10 + 9);
            trianglesGrass.Add((resolution - 1) * 10 + 9);
            trianglesGrass.Add((0) * 10 + 8);
            trianglesGrass.Add((0) * 10 + 9);
            #endregion
        }



        meshFilter.mesh.Clear();
        meshFilter.mesh.vertices = vertices.ToArray();
        meshFilter.mesh.uv       = uvs.ToArray();

        meshFilter.mesh.subMeshCount = 3;

        Debug.Log("Submeshcount: " + meshFilter.mesh.subMeshCount);

        meshFilter.mesh.SetTriangles(triangles.ToArray(), 0);
        meshFilter.mesh.SetTriangles(trianglesWhite.ToArray(), 1);
        meshFilter.mesh.SetTriangles(trianglesGrass.ToArray(), 2);

        meshFilter.mesh.RecalculateNormals();

        instTrack.GetComponent <MeshCollider>().sharedMesh = meshFilter.mesh;



        /*for (int i = 0; i < resolution; i++)
         * {
         *  float xPos = ((float)i) / ((float)resolution);
         *
         *  GameObject inst = (GameObject)Instantiate(prefabPoint);
         *  inst.transform.position = racetrack.track.SplineAt(xPos);
         * }*/

        return(racetrack);
    }
Пример #14
0
 public virtual Racetrack ApplyRacetrack(Racetrack racetrack)
 {
     return(racetrack);
 }
Пример #15
0
    public override Racetrack ApplyRacetrack(Racetrack racetrack)
    {
        List <Line> lines = new List <Line>();

        if (instTrack != null)
        {
            Destroy(instTrack);
            instTrack = null;
        }
        instTrack = Instantiate(renderedTrackPrefab, transform);
        instTrack.transform.localPosition = Vector3.zero;

        MeshFilter meshFilter = instTrack.GetComponent <MeshFilter>();

        List <Vector3> vertices  = new List <Vector3>();
        List <int>     triangles = new List <int>();
        List <Vector2> uvs       = new List <Vector2>();

        List <int> trianglesWhite = new List <int>();

        List <int> trianglesGrass = new List <int>();


        float xPosFirst = 0f;

        Vector3 middlePosFirst = racetrack.track.SplineAt(xPosFirst);

        Vector3[] tangentFirst = racetrack.track.TangentAt(xPosFirst);

        Vector3 forwardFirst = tangentFirst[1] - tangentFirst[0];

        forwardFirst.Normalize();
        Vector3 sidewardsFirst = Quaternion.Euler(0f, 90f, 0f) * forwardFirst;

        sidewardsFirst.Normalize();

        Vector3 firstl_p = sidewardsFirst * -0.5f * racetrack.width.SplineAt(xPosFirst) + middlePosFirst;
        Vector3 firstr_p = sidewardsFirst * 0.5f * racetrack.width.SplineAt(xPosFirst) + middlePosFirst;

        Vector3 middlePos_lOFirst = middlePosFirst - sidewardsFirst * 0.01f;
        Vector3 middlePos_rOFirst = middlePosFirst + sidewardsFirst * 0.01f;

        lines.Add(new Line(new Vector2(middlePos_lOFirst.x, middlePos_lOFirst.z), new Vector2(firstl_p.x, firstl_p.z)));
        lines.Add(new Line(new Vector2(middlePos_rOFirst.x, middlePos_rOFirst.z), new Vector2(firstr_p.x, firstr_p.z)));

        Vector3 firstl_whiteBegin = firstl_p + sidewardsFirst * whiteStripOffset;
        Vector3 firstr_whiteBegin = firstr_p - sidewardsFirst * whiteStripOffset;

        Vector3 firstl_whiteInner = firstl_whiteBegin + sidewardsFirst * whiteStripWidth;
        Vector3 firstr_whiteInner = firstr_whiteBegin - sidewardsFirst * whiteStripWidth;

        Vector3 firstl_grassSameHeight = firstl_p - sidewardsFirst * grassWidth;
        Vector3 firstr_grassSameHeight = firstr_p + sidewardsFirst * grassWidth;

        Vector3 firstl_grassHill = firstl_grassSameHeight - sidewardsFirst * grassHillWidth + Vector3.Cross(sidewardsFirst, forwardFirst) * grassHillHeight;
        Vector3 firstr_grassHill = firstr_grassSameHeight + sidewardsFirst * grassHillWidth + Vector3.Cross(sidewardsFirst, forwardFirst) * grassHillHeight;

        //Vector3 firstl_np = sidewardsFirst * -0.5f * racetrack.width.SplineAt(((float)i + 1) / ((float)resolution));
        //Vector3 firstr_np = sidewardsFirst * 0.5f * racetrack.width.SplineAt(((float)i + 1) / ((float)resolution));

        //vertices.Add(firstl_p);
        //vertices.Add(firstr_p);

        vertices.Add(firstl_grassHill);
        vertices.Add(firstl_grassSameHeight);
        vertices.Add(firstl_p);
        vertices.Add(firstl_whiteBegin);
        vertices.Add(firstl_whiteInner);
        vertices.Add(firstr_whiteInner);
        vertices.Add(firstr_whiteBegin);
        vertices.Add(firstr_p);
        vertices.Add(firstr_grassSameHeight);
        vertices.Add(firstr_grassHill);

        uvs.Add(new Vector2(firstl_grassHill.x, firstl_grassHill.z));
        uvs.Add(new Vector2(firstl_grassSameHeight.x, firstl_grassSameHeight.z));
        uvs.Add(new Vector2(firstl_p.x, firstl_p.z));
        uvs.Add(new Vector2(firstl_whiteBegin.x, firstl_whiteBegin.z));
        uvs.Add(new Vector2(firstl_whiteInner.x, firstl_whiteInner.z));
        uvs.Add(new Vector2(firstr_whiteInner.x, firstr_whiteInner.z));
        uvs.Add(new Vector2(firstr_whiteBegin.x, firstr_whiteBegin.z));
        uvs.Add(new Vector2(firstr_p.x, firstr_p.z));
        uvs.Add(new Vector2(firstr_grassSameHeight.x, firstr_grassSameHeight.z));
        uvs.Add(new Vector2(firstr_grassHill.x, firstr_grassHill.z));

        Vector3 old_l_grassHill       = firstl_grassHill;
        Vector3 old_l_grassSameHeight = firstl_grassSameHeight;
        Vector3 old_l_p               = firstl_p;
        Vector3 old_l_whiteBegin      = firstl_whiteBegin;
        Vector3 old_l_whiteInner      = firstl_whiteInner;
        Vector3 old_r_whiteInner      = firstr_whiteInner;
        Vector3 old_r_whiteBegin      = firstr_whiteBegin;
        Vector3 old_r_p               = firstr_p;
        Vector3 old_r_grassSameHeight = firstr_grassSameHeight;
        Vector3 old_r_grassHill       = firstr_grassHill;

        for (int i = 1; i < resolution; i++)
        {
            float xPos = ((float)i) / ((float)resolution);

            Vector3 middlePos = racetrack.track.SplineAt(xPos);

            Vector3[] tangent = racetrack.track.TangentAt(xPos);

            Vector3 forward = tangent[1] - tangent[0];
            forward.Normalize();
            Vector3 sidewards = Quaternion.Euler(0f, 90f, 0f) * forward;

            sidewards.Normalize();

            Vector3 l_p = sidewards * -0.5f * racetrack.width.SplineAt(xPos) + middlePos;
            Vector3 r_p = sidewards * 0.5f * racetrack.width.SplineAt(xPos) + middlePos;

            Vector3 l_whiteBegin = l_p + sidewards * whiteStripOffset;
            Vector3 r_whiteBegin = r_p - sidewards * whiteStripOffset;

            Vector3 l_whiteInner = l_whiteBegin + sidewards * whiteStripWidth;
            Vector3 r_whiteInner = r_whiteBegin - sidewards * whiteStripWidth;

            Vector3 l_grassSameHeight = l_p - sidewards * grassWidth;
            Vector3 r_grassSameHeight = r_p + sidewards * grassWidth;

            Vector3 l_grassHill = l_grassSameHeight - sidewards * grassHillWidth + Vector3.Cross(sidewards, forward) * grassHillHeight;
            Vector3 r_grassHill = r_grassSameHeight + sidewards * grassHillWidth + Vector3.Cross(sidewards, forward) * grassHillHeight;

            Vector3 middlePos_lO = middlePos - sidewards * 0.01f;
            Vector3 middlePos_rO = middlePos + sidewards * 0.01f;


            Line leftLine = new Line(new Vector2(middlePos_lO.x, middlePos_lO.z), new Vector2(l_p.x, l_p.z));
            if (checkLines(leftLine, lines) == false)
            {
                old_l_grassHill       = l_grassHill;
                old_l_grassSameHeight = l_grassSameHeight;
                old_l_p          = l_p;
                old_l_whiteBegin = l_whiteBegin;
                old_l_whiteInner = l_whiteInner;
            }
            lines.Add(new Line(new Vector2(middlePos_lO.x, middlePos_lO.z), new Vector2(l_p.x, l_p.z)));

            Line rightLine = new Line(new Vector2(middlePos_rO.x, middlePos_rO.z), new Vector2(r_p.x, r_p.z));
            if (checkLines(rightLine, lines) == false)
            {
                old_r_grassHill       = r_grassHill;
                old_r_grassSameHeight = r_grassSameHeight;
                old_r_p          = r_p;
                old_r_whiteBegin = r_whiteBegin;
                old_r_whiteInner = r_whiteInner;
            }
            lines.Add(new Line(new Vector2(middlePos_rO.x, middlePos_rO.z), new Vector2(r_p.x, r_p.z)));



            //Vector3 l_np = sidewards * -0.5f * racetrack.width.SplineAt(((float)i + 1) / ((float)resolution));
            //Vector3 r_np = sidewards * 0.5f * racetrack.width.SplineAt(((float)i + 1) / ((float)resolution));

            //vertices.Add(l_p);
            //vertices.Add(r_p);

            vertices.Add(old_l_grassHill);
            vertices.Add(old_l_grassSameHeight);
            vertices.Add(old_l_p);
            vertices.Add(old_l_whiteBegin);
            vertices.Add(old_l_whiteInner);
            vertices.Add(old_r_whiteInner);
            vertices.Add(old_r_whiteBegin);
            vertices.Add(old_r_p);
            vertices.Add(old_r_grassSameHeight);
            vertices.Add(old_r_grassHill);

            uvs.Add(new Vector2(l_grassHill.x, l_grassHill.z));
            uvs.Add(new Vector2(l_grassSameHeight.x, l_grassSameHeight.z));
            uvs.Add(new Vector2(l_p.x, l_p.z));
            uvs.Add(new Vector2(l_whiteBegin.x, l_whiteBegin.z));
            uvs.Add(new Vector2(l_whiteInner.x, l_whiteInner.z));
            uvs.Add(new Vector2(r_whiteInner.x, r_whiteInner.z));
            uvs.Add(new Vector2(r_whiteBegin.x, r_whiteBegin.z));
            uvs.Add(new Vector2(r_p.x, r_p.z));
            uvs.Add(new Vector2(r_grassSameHeight.x, r_grassSameHeight.z));
            uvs.Add(new Vector2(r_grassHill.x, r_grassHill.z));

            triangles.Add((i - 1) * 10 + 2);
            triangles.Add((i - 0) * 10 + 2);
            triangles.Add((i - 1) * 10 + 3);
            triangles.Add((i - 1) * 10 + 3);
            triangles.Add((i - 0) * 10 + 2);
            triangles.Add((i - 0) * 10 + 3);

            triangles.Add((i - 1) * 10 + 4);
            triangles.Add((i - 0) * 10 + 4);
            triangles.Add((i - 1) * 10 + 5);
            triangles.Add((i - 1) * 10 + 5);
            triangles.Add((i - 0) * 10 + 4);
            triangles.Add((i - 0) * 10 + 5);

            triangles.Add((i - 1) * 10 + 6);
            triangles.Add((i - 0) * 10 + 6);
            triangles.Add((i - 1) * 10 + 7);
            triangles.Add((i - 1) * 10 + 7);
            triangles.Add((i - 0) * 10 + 6);
            triangles.Add((i - 0) * 10 + 7);



            trianglesWhite.Add((i - 1) * 10 + 3);
            trianglesWhite.Add((i - 0) * 10 + 3);
            trianglesWhite.Add((i - 1) * 10 + 4);
            trianglesWhite.Add((i - 1) * 10 + 4);
            trianglesWhite.Add((i - 0) * 10 + 3);
            trianglesWhite.Add((i - 0) * 10 + 4);

            trianglesWhite.Add((i - 1) * 10 + 5);
            trianglesWhite.Add((i - 0) * 10 + 5);
            trianglesWhite.Add((i - 1) * 10 + 6);
            trianglesWhite.Add((i - 1) * 10 + 6);
            trianglesWhite.Add((i - 0) * 10 + 5);
            trianglesWhite.Add((i - 0) * 10 + 6);



            trianglesGrass.Add((i - 1) * 10 + 0);
            trianglesGrass.Add((i - 0) * 10 + 0);
            trianglesGrass.Add((i - 1) * 10 + 1);
            trianglesGrass.Add((i - 1) * 10 + 1);
            trianglesGrass.Add((i - 0) * 10 + 0);
            trianglesGrass.Add((i - 0) * 10 + 1);

            trianglesGrass.Add((i - 1) * 10 + 1);
            trianglesGrass.Add((i - 0) * 10 + 1);
            trianglesGrass.Add((i - 1) * 10 + 2);
            trianglesGrass.Add((i - 1) * 10 + 2);
            trianglesGrass.Add((i - 0) * 10 + 1);
            trianglesGrass.Add((i - 0) * 10 + 2);

            trianglesGrass.Add((i - 1) * 10 + 7);
            trianglesGrass.Add((i - 0) * 10 + 7);
            trianglesGrass.Add((i - 1) * 10 + 8);
            trianglesGrass.Add((i - 1) * 10 + 8);
            trianglesGrass.Add((i - 0) * 10 + 7);
            trianglesGrass.Add((i - 0) * 10 + 8);

            trianglesGrass.Add((i - 1) * 10 + 8);
            trianglesGrass.Add((i - 0) * 10 + 8);
            trianglesGrass.Add((i - 1) * 10 + 9);
            trianglesGrass.Add((i - 1) * 10 + 9);
            trianglesGrass.Add((i - 0) * 10 + 8);
            trianglesGrass.Add((i - 0) * 10 + 9);
        }

        if (true)
        {
            #region Last One

            /*float xPos = 0f;
             *
             * Vector3 middlePos = racetrack.track.SplineAt(xPos);
             *
             * Vector3[] tangent = racetrack.track.TangentAt(xPos);
             *
             * Vector3 forward = tangent[1] - tangent[0];
             * forward.Normalize();
             * Vector3 sidewards = Quaternion.Euler(0f, 90f, 0f) * forward;
             *
             * sidewards.Normalize();
             *
             * Vector3 l_p = sidewards * -0.5f * racetrack.width.SplineAt(xPos) + middlePos;
             * Vector3 r_p = sidewards * 0.5f * racetrack.width.SplineAt(xPos) + middlePos;
             *
             * Vector3 l_whiteBegin = l_p + sidewards * whiteStripOffset;
             * Vector3 r_whiteBegin = r_p - sidewards * whiteStripOffset;
             *
             * Vector3 l_whiteInner = l_whiteBegin + sidewards * whiteStripWidth;
             * Vector3 r_whiteInner = r_whiteBegin - sidewards * whiteStripWidth;
             *
             * Vector3 l_grassSameHeight = l_p - sidewards * grassWidth;
             * Vector3 r_grassSameHeight = r_p + sidewards * grassWidth;
             *
             * Vector3 l_grassHill = l_grassSameHeight - sidewards * grassHillWidth + Vector3.Cross(sidewards, forward) * grassHillHeight;
             * Vector3 r_grassHill = r_grassSameHeight + sidewards * grassHillWidth + Vector3.Cross(sidewards, forward) * grassHillHeight;
             *
             * //Vector3 l_np = sidewards * -0.5f * racetrack.width.SplineAt(((float)i + 1) / ((float)resolution));
             * //Vector3 r_np = sidewards * 0.5f * racetrack.width.SplineAt(((float)i + 1) / ((float)resolution));
             *
             * //vertices.Add(l_p);
             * //vertices.Add(r_p);
             *
             * vertices.Add(l_grassHill);
             * vertices.Add(l_grassSameHeight);
             * vertices.Add(l_p);
             * vertices.Add(l_whiteBegin);
             * vertices.Add(l_whiteInner);
             * vertices.Add(r_whiteInner);
             * vertices.Add(r_whiteBegin);
             * vertices.Add(r_p);
             * vertices.Add(r_grassSameHeight);
             * vertices.Add(r_grassHill);
             *
             * uvs.Add(new Vector2(l_grassHill.x, l_grassHill.z));
             * uvs.Add(new Vector2(l_grassSameHeight.x, l_grassSameHeight.z));
             * uvs.Add(new Vector2(l_p.x, l_p.z));
             * uvs.Add(new Vector2(l_whiteBegin.x, l_whiteBegin.z));
             * uvs.Add(new Vector2(l_whiteInner.x, l_whiteInner.z));
             * uvs.Add(new Vector2(r_whiteInner.x, r_whiteInner.z));
             * uvs.Add(new Vector2(r_whiteBegin.x, r_whiteBegin.z));
             * uvs.Add(new Vector2(r_p.x, r_p.z));
             * uvs.Add(new Vector2(r_grassSameHeight.x, r_grassSameHeight.z));
             * uvs.Add(new Vector2(r_grassHill.x, r_grassHill.z));*/

            triangles.Add((resolution - 1) * 10 + 2);
            triangles.Add((0) * 10 + 2);
            triangles.Add((resolution - 1) * 10 + 3);
            triangles.Add((resolution - 1) * 10 + 3);
            triangles.Add((0) * 10 + 2);
            triangles.Add((0) * 10 + 3);

            triangles.Add((resolution - 1) * 10 + 4);
            triangles.Add((0) * 10 + 4);
            triangles.Add((resolution - 1) * 10 + 5);
            triangles.Add((resolution - 1) * 10 + 5);
            triangles.Add((0) * 10 + 4);
            triangles.Add((0) * 10 + 5);

            triangles.Add((resolution - 1) * 10 + 6);
            triangles.Add((0) * 10 + 6);
            triangles.Add((resolution - 1) * 10 + 7);
            triangles.Add((resolution - 1) * 10 + 7);
            triangles.Add((0) * 10 + 6);
            triangles.Add((0) * 10 + 7);



            trianglesWhite.Add((resolution - 1) * 10 + 3);
            trianglesWhite.Add((0) * 10 + 3);
            trianglesWhite.Add((resolution - 1) * 10 + 4);
            trianglesWhite.Add((resolution - 1) * 10 + 4);
            trianglesWhite.Add((0) * 10 + 3);
            trianglesWhite.Add((0) * 10 + 4);

            trianglesWhite.Add((resolution - 1) * 10 + 5);
            trianglesWhite.Add((0) * 10 + 5);
            trianglesWhite.Add((resolution - 1) * 10 + 6);
            trianglesWhite.Add((resolution - 1) * 10 + 6);
            trianglesWhite.Add((0) * 10 + 5);
            trianglesWhite.Add((0) * 10 + 6);



            trianglesGrass.Add((resolution - 1) * 10 + 0);
            trianglesGrass.Add((0) * 10 + 0);
            trianglesGrass.Add((resolution - 1) * 10 + 1);
            trianglesGrass.Add((resolution - 1) * 10 + 1);
            trianglesGrass.Add((0) * 10 + 0);
            trianglesGrass.Add((0) * 10 + 1);

            trianglesGrass.Add((resolution - 1) * 10 + 1);
            trianglesGrass.Add((0) * 10 + 1);
            trianglesGrass.Add((resolution - 1) * 10 + 2);
            trianglesGrass.Add((resolution - 1) * 10 + 2);
            trianglesGrass.Add((0) * 10 + 1);
            trianglesGrass.Add((0) * 10 + 2);

            trianglesGrass.Add((resolution - 1) * 10 + 7);
            trianglesGrass.Add((0) * 10 + 7);
            trianglesGrass.Add((resolution - 1) * 10 + 8);
            trianglesGrass.Add((resolution - 1) * 10 + 8);
            trianglesGrass.Add((0) * 10 + 7);
            trianglesGrass.Add((0) * 10 + 8);

            trianglesGrass.Add((resolution - 1) * 10 + 8);
            trianglesGrass.Add((0) * 10 + 8);
            trianglesGrass.Add((resolution - 1) * 10 + 9);
            trianglesGrass.Add((resolution - 1) * 10 + 9);
            trianglesGrass.Add((0) * 10 + 8);
            trianglesGrass.Add((0) * 10 + 9);
            #endregion
        }



        meshFilter.mesh.Clear();
        meshFilter.mesh.vertices = vertices.ToArray();
        meshFilter.mesh.uv       = uvs.ToArray();

        meshFilter.mesh.subMeshCount = 3;

        Debug.Log("Submeshcount: " + meshFilter.mesh.subMeshCount);

        meshFilter.mesh.SetTriangles(triangles.ToArray(), 0);
        meshFilter.mesh.SetTriangles(trianglesWhite.ToArray(), 1);
        meshFilter.mesh.SetTriangles(trianglesGrass.ToArray(), 2);

        meshFilter.mesh.RecalculateNormals();

        instTrack.GetComponent <MeshCollider>().sharedMesh = meshFilter.mesh;



        /*for (int i = 0; i < resolution; i++)
         * {
         *  float xPos = ((float)i) / ((float)resolution);
         *
         *  GameObject inst = (GameObject)Instantiate(prefabPoint);
         *  inst.transform.position = racetrack.track.SplineAt(xPos);
         * }*/

        return(racetrack);
    }
Пример #16
0
    public override Racetrack ApplyRacetrack(Racetrack racetrack)
    {
        if (instTrack != null)
        {
            Destroy(instTrack);
            instTrack = null;
        }
        instTrack = Instantiate(renderedTrackPrefab, transform);
        instTrack.transform.localPosition = Vector3.zero;
        instTrack.transform.localScale    = new Vector3(20f, 1f, 20f);

        MeshFilter meshFilter = instTrack.GetComponent <MeshFilter>();

        List <Vector3> vertices  = new List <Vector3>();
        List <int>     triangles = new List <int>();
        List <Vector2> uvs       = new List <Vector2>();

        List <int> trianglesWhite = new List <int>();

        List <int> trianglesGrass = new List <int>();


        float xPosFirst = 0f;

        Vector3 middlePosFirst = racetrack.track.SplineAt(xPosFirst);

        middlePosFirst.y = racetrack.height.SplineAt(xPosFirst);

        Vector3[] tangentFirst = racetrack.track.TangentAt(xPosFirst);

        Vector3 forwardFirst = tangentFirst[1] - tangentFirst[0];

        forwardFirst.Normalize();
        Vector3 sidewardsFirst = Quaternion.Euler(0f, 90f, 0f) * forwardFirst;

        Vector3 upwardsFirst = Vector3.Cross(sidewardsFirst, forwardFirst) * -1f;

        upwardsFirst.Normalize();
        float distUpFirst = Mathf.Tan((racetrack.bend.SplineAt(xPosFirst) * Mathf.PI) / 180f);

        upwardsFirst *= distUpFirst;
        upwardsFirst *= 20f;

        sidewardsFirst.Normalize();

        Vector3 firstl_p = (sidewardsFirst + upwardsFirst) * -0.5f * racetrack.width.SplineAt(xPosFirst) + middlePosFirst;
        Vector3 firstr_p = (sidewardsFirst + upwardsFirst) * 0.5f * racetrack.width.SplineAt(xPosFirst) + middlePosFirst;

        Vector3 firstl_whiteBegin = firstl_p + (sidewardsFirst + upwardsFirst) * whiteStripOffset;
        Vector3 firstr_whiteBegin = firstr_p - (sidewardsFirst + upwardsFirst) * whiteStripOffset;

        Vector3 firstl_whiteInner = firstl_whiteBegin + (sidewardsFirst + upwardsFirst) * whiteStripWidth;
        Vector3 firstr_whiteInner = firstr_whiteBegin - (sidewardsFirst + upwardsFirst) * whiteStripWidth;

        Vector3 firstl_grassSameHeight = firstl_p - (sidewardsFirst + upwardsFirst) * grassWidth;
        Vector3 firstr_grassSameHeight = firstr_p + (sidewardsFirst + upwardsFirst) * grassWidth;

        Vector3 firstl_grassHill = firstl_grassSameHeight - (sidewardsFirst + upwardsFirst) * grassHillWidth + Vector3.Cross((sidewardsFirst), forwardFirst) * grassHillHeight;
        Vector3 firstr_grassHill = firstr_grassSameHeight + (sidewardsFirst + upwardsFirst) * grassHillWidth + Vector3.Cross((sidewardsFirst), forwardFirst) * grassHillHeight;

        //Vector3 firstl_np = sidewardsFirst * -0.5f * racetrack.width.SplineAt(((float)i + 1) / ((float)resolution));
        //Vector3 firstr_np = sidewardsFirst * 0.5f * racetrack.width.SplineAt(((float)i + 1) / ((float)resolution));

        //vertices.Add(firstl_p);
        //vertices.Add(firstr_p);

        vertices.Add(firstl_grassHill);
        vertices.Add(firstl_grassSameHeight);
        vertices.Add(firstl_p);
        vertices.Add(firstl_whiteBegin);
        vertices.Add(firstl_whiteInner);
        vertices.Add(firstr_whiteInner);
        vertices.Add(firstr_whiteBegin);
        vertices.Add(firstr_p);
        vertices.Add(firstr_grassSameHeight);
        vertices.Add(firstr_grassHill);

        uvs.Add(new Vector2(firstl_grassHill.x, firstl_grassHill.z));
        uvs.Add(new Vector2(firstl_grassSameHeight.x, firstl_grassSameHeight.z));
        uvs.Add(new Vector2(firstl_p.x, firstl_p.z));
        uvs.Add(new Vector2(firstl_whiteBegin.x, firstl_whiteBegin.z));
        uvs.Add(new Vector2(firstl_whiteInner.x, firstl_whiteInner.z));
        uvs.Add(new Vector2(firstr_whiteInner.x, firstr_whiteInner.z));
        uvs.Add(new Vector2(firstr_whiteBegin.x, firstr_whiteBegin.z));
        uvs.Add(new Vector2(firstr_p.x, firstr_p.z));
        uvs.Add(new Vector2(firstr_grassSameHeight.x, firstr_grassSameHeight.z));
        uvs.Add(new Vector2(firstr_grassHill.x, firstr_grassHill.z));

        for (int i = 1; i < resolution; i++)
        {
            float xPos = ((float)i) / ((float)resolution);

            Vector3 middlePos = racetrack.track.SplineAt(xPos);
            middlePos.y = racetrack.height.SplineAt(xPos);

            Vector3[] tangent = racetrack.track.TangentAt(xPos);

            Vector3 forward = tangent[1] - tangent[0];
            forward.Normalize();
            Vector3 sidewards = Quaternion.Euler(0f, 90f, 0f) * forward;

            Vector3 upwards = Vector3.Cross(sidewards, forward) * -1f;
            upwards.Normalize();
            float distUp = Mathf.Tan((racetrack.bend.SplineAt(xPos) * Mathf.PI) / 180f);
            upwards *= distUp;
            upwards *= 20f;

            //upwards = new Vector3(0f, 1f, 0f);

            Debug.Log("Distup: " + distUp);

            sidewards.Normalize();

            Vector3 l_p = (sidewards + upwards) * -0.5f * racetrack.width.SplineAt(xPos) + middlePos;
            Vector3 r_p = (sidewards + upwards) * 0.5f * racetrack.width.SplineAt(xPos) + middlePos;

            Vector3 l_whiteBegin = l_p + (sidewards + upwards) * whiteStripOffset;
            Vector3 r_whiteBegin = r_p - (sidewards + upwards) * whiteStripOffset;

            Vector3 l_whiteInner = l_whiteBegin + (sidewards + upwards) * whiteStripWidth;
            Vector3 r_whiteInner = r_whiteBegin - (sidewards + upwards) * whiteStripWidth;

            Vector3 l_grassSameHeight = l_p - (sidewards + upwards) * grassWidth;
            Vector3 r_grassSameHeight = r_p + (sidewards + upwards) * grassWidth;

            Vector3 l_grassHill = l_grassSameHeight - (sidewards + upwards) * grassHillWidth + Vector3.Cross((sidewards), forward) * grassHillHeight;
            Vector3 r_grassHill = r_grassSameHeight + (sidewards + upwards) * grassHillWidth + Vector3.Cross((sidewards), forward) * grassHillHeight;

            //Vector3 l_np = sidewards * -0.5f * racetrack.width.SplineAt(((float)i + 1) / ((float)resolution));
            //Vector3 r_np = sidewards * 0.5f * racetrack.width.SplineAt(((float)i + 1) / ((float)resolution));

            //vertices.Add(l_p);
            //vertices.Add(r_p);

            vertices.Add(l_grassHill);
            vertices.Add(l_grassSameHeight);
            vertices.Add(l_p);
            vertices.Add(l_whiteBegin);
            vertices.Add(l_whiteInner);
            vertices.Add(r_whiteInner);
            vertices.Add(r_whiteBegin);
            vertices.Add(r_p);
            vertices.Add(r_grassSameHeight);
            vertices.Add(r_grassHill);

            uvs.Add(new Vector2(l_grassHill.x, l_grassHill.z));
            uvs.Add(new Vector2(l_grassSameHeight.x, l_grassSameHeight.z));
            uvs.Add(new Vector2(l_p.x, l_p.z));
            uvs.Add(new Vector2(l_whiteBegin.x, l_whiteBegin.z));
            uvs.Add(new Vector2(l_whiteInner.x, l_whiteInner.z));
            uvs.Add(new Vector2(r_whiteInner.x, r_whiteInner.z));
            uvs.Add(new Vector2(r_whiteBegin.x, r_whiteBegin.z));
            uvs.Add(new Vector2(r_p.x, r_p.z));
            uvs.Add(new Vector2(r_grassSameHeight.x, r_grassSameHeight.z));
            uvs.Add(new Vector2(r_grassHill.x, r_grassHill.z));

            triangles.Add((i - 1) * 10 + 2);
            triangles.Add((i - 0) * 10 + 2);
            triangles.Add((i - 1) * 10 + 3);
            triangles.Add((i - 1) * 10 + 3);
            triangles.Add((i - 0) * 10 + 2);
            triangles.Add((i - 0) * 10 + 3);

            triangles.Add((i - 1) * 10 + 4);
            triangles.Add((i - 0) * 10 + 4);
            triangles.Add((i - 1) * 10 + 5);
            triangles.Add((i - 1) * 10 + 5);
            triangles.Add((i - 0) * 10 + 4);
            triangles.Add((i - 0) * 10 + 5);

            triangles.Add((i - 1) * 10 + 6);
            triangles.Add((i - 0) * 10 + 6);
            triangles.Add((i - 1) * 10 + 7);
            triangles.Add((i - 1) * 10 + 7);
            triangles.Add((i - 0) * 10 + 6);
            triangles.Add((i - 0) * 10 + 7);



            trianglesWhite.Add((i - 1) * 10 + 3);
            trianglesWhite.Add((i - 0) * 10 + 3);
            trianglesWhite.Add((i - 1) * 10 + 4);
            trianglesWhite.Add((i - 1) * 10 + 4);
            trianglesWhite.Add((i - 0) * 10 + 3);
            trianglesWhite.Add((i - 0) * 10 + 4);

            trianglesWhite.Add((i - 1) * 10 + 5);
            trianglesWhite.Add((i - 0) * 10 + 5);
            trianglesWhite.Add((i - 1) * 10 + 6);
            trianglesWhite.Add((i - 1) * 10 + 6);
            trianglesWhite.Add((i - 0) * 10 + 5);
            trianglesWhite.Add((i - 0) * 10 + 6);



            trianglesGrass.Add((i - 1) * 10 + 0);
            trianglesGrass.Add((i - 0) * 10 + 0);
            trianglesGrass.Add((i - 1) * 10 + 1);
            trianglesGrass.Add((i - 1) * 10 + 1);
            trianglesGrass.Add((i - 0) * 10 + 0);
            trianglesGrass.Add((i - 0) * 10 + 1);

            trianglesGrass.Add((i - 1) * 10 + 1);
            trianglesGrass.Add((i - 0) * 10 + 1);
            trianglesGrass.Add((i - 1) * 10 + 2);
            trianglesGrass.Add((i - 1) * 10 + 2);
            trianglesGrass.Add((i - 0) * 10 + 1);
            trianglesGrass.Add((i - 0) * 10 + 2);

            trianglesGrass.Add((i - 1) * 10 + 7);
            trianglesGrass.Add((i - 0) * 10 + 7);
            trianglesGrass.Add((i - 1) * 10 + 8);
            trianglesGrass.Add((i - 1) * 10 + 8);
            trianglesGrass.Add((i - 0) * 10 + 7);
            trianglesGrass.Add((i - 0) * 10 + 8);

            trianglesGrass.Add((i - 1) * 10 + 8);
            trianglesGrass.Add((i - 0) * 10 + 8);
            trianglesGrass.Add((i - 1) * 10 + 9);
            trianglesGrass.Add((i - 1) * 10 + 9);
            trianglesGrass.Add((i - 0) * 10 + 8);
            trianglesGrass.Add((i - 0) * 10 + 9);
        }

        if (true)
        {
            #region Last One

            /*float xPos = 0f;
             *
             * Vector3 middlePos = racetrack.track.SplineAt(xPos);
             *
             * Vector3[] tangent = racetrack.track.TangentAt(xPos);
             *
             * Vector3 forward = tangent[1] - tangent[0];
             * forward.Normalize();
             * Vector3 sidewards = Quaternion.Euler(0f, 90f, 0f) * forward;
             *
             * sidewards.Normalize();
             *
             * Vector3 l_p = sidewards * -0.5f * racetrack.width.SplineAt(xPos) + middlePos;
             * Vector3 r_p = sidewards * 0.5f * racetrack.width.SplineAt(xPos) + middlePos;
             *
             * Vector3 l_whiteBegin = l_p + sidewards * whiteStripOffset;
             * Vector3 r_whiteBegin = r_p - sidewards * whiteStripOffset;
             *
             * Vector3 l_whiteInner = l_whiteBegin + sidewards * whiteStripWidth;
             * Vector3 r_whiteInner = r_whiteBegin - sidewards * whiteStripWidth;
             *
             * Vector3 l_grassSameHeight = l_p - sidewards * grassWidth;
             * Vector3 r_grassSameHeight = r_p + sidewards * grassWidth;
             *
             * Vector3 l_grassHill = l_grassSameHeight - sidewards * grassHillWidth + Vector3.Cross(sidewards, forward) * grassHillHeight;
             * Vector3 r_grassHill = r_grassSameHeight + sidewards * grassHillWidth + Vector3.Cross(sidewards, forward) * grassHillHeight;
             *
             * //Vector3 l_np = sidewards * -0.5f * racetrack.width.SplineAt(((float)i + 1) / ((float)resolution));
             * //Vector3 r_np = sidewards * 0.5f * racetrack.width.SplineAt(((float)i + 1) / ((float)resolution));
             *
             * //vertices.Add(l_p);
             * //vertices.Add(r_p);
             *
             * vertices.Add(l_grassHill);
             * vertices.Add(l_grassSameHeight);
             * vertices.Add(l_p);
             * vertices.Add(l_whiteBegin);
             * vertices.Add(l_whiteInner);
             * vertices.Add(r_whiteInner);
             * vertices.Add(r_whiteBegin);
             * vertices.Add(r_p);
             * vertices.Add(r_grassSameHeight);
             * vertices.Add(r_grassHill);
             *
             * uvs.Add(new Vector2(l_grassHill.x, l_grassHill.z));
             * uvs.Add(new Vector2(l_grassSameHeight.x, l_grassSameHeight.z));
             * uvs.Add(new Vector2(l_p.x, l_p.z));
             * uvs.Add(new Vector2(l_whiteBegin.x, l_whiteBegin.z));
             * uvs.Add(new Vector2(l_whiteInner.x, l_whiteInner.z));
             * uvs.Add(new Vector2(r_whiteInner.x, r_whiteInner.z));
             * uvs.Add(new Vector2(r_whiteBegin.x, r_whiteBegin.z));
             * uvs.Add(new Vector2(r_p.x, r_p.z));
             * uvs.Add(new Vector2(r_grassSameHeight.x, r_grassSameHeight.z));
             * uvs.Add(new Vector2(r_grassHill.x, r_grassHill.z));*/

            triangles.Add((resolution - 1) * 10 + 2);
            triangles.Add((0) * 10 + 2);
            triangles.Add((resolution - 1) * 10 + 3);
            triangles.Add((resolution - 1) * 10 + 3);
            triangles.Add((0) * 10 + 2);
            triangles.Add((0) * 10 + 3);

            triangles.Add((resolution - 1) * 10 + 4);
            triangles.Add((0) * 10 + 4);
            triangles.Add((resolution - 1) * 10 + 5);
            triangles.Add((resolution - 1) * 10 + 5);
            triangles.Add((0) * 10 + 4);
            triangles.Add((0) * 10 + 5);

            triangles.Add((resolution - 1) * 10 + 6);
            triangles.Add((0) * 10 + 6);
            triangles.Add((resolution - 1) * 10 + 7);
            triangles.Add((resolution - 1) * 10 + 7);
            triangles.Add((0) * 10 + 6);
            triangles.Add((0) * 10 + 7);



            trianglesWhite.Add((resolution - 1) * 10 + 3);
            trianglesWhite.Add((0) * 10 + 3);
            trianglesWhite.Add((resolution - 1) * 10 + 4);
            trianglesWhite.Add((resolution - 1) * 10 + 4);
            trianglesWhite.Add((0) * 10 + 3);
            trianglesWhite.Add((0) * 10 + 4);

            trianglesWhite.Add((resolution - 1) * 10 + 5);
            trianglesWhite.Add((0) * 10 + 5);
            trianglesWhite.Add((resolution - 1) * 10 + 6);
            trianglesWhite.Add((resolution - 1) * 10 + 6);
            trianglesWhite.Add((0) * 10 + 5);
            trianglesWhite.Add((0) * 10 + 6);



            trianglesGrass.Add((resolution - 1) * 10 + 0);
            trianglesGrass.Add((0) * 10 + 0);
            trianglesGrass.Add((resolution - 1) * 10 + 1);
            trianglesGrass.Add((resolution - 1) * 10 + 1);
            trianglesGrass.Add((0) * 10 + 0);
            trianglesGrass.Add((0) * 10 + 1);

            trianglesGrass.Add((resolution - 1) * 10 + 1);
            trianglesGrass.Add((0) * 10 + 1);
            trianglesGrass.Add((resolution - 1) * 10 + 2);
            trianglesGrass.Add((resolution - 1) * 10 + 2);
            trianglesGrass.Add((0) * 10 + 1);
            trianglesGrass.Add((0) * 10 + 2);

            trianglesGrass.Add((resolution - 1) * 10 + 7);
            trianglesGrass.Add((0) * 10 + 7);
            trianglesGrass.Add((resolution - 1) * 10 + 8);
            trianglesGrass.Add((resolution - 1) * 10 + 8);
            trianglesGrass.Add((0) * 10 + 7);
            trianglesGrass.Add((0) * 10 + 8);

            trianglesGrass.Add((resolution - 1) * 10 + 8);
            trianglesGrass.Add((0) * 10 + 8);
            trianglesGrass.Add((resolution - 1) * 10 + 9);
            trianglesGrass.Add((resolution - 1) * 10 + 9);
            trianglesGrass.Add((0) * 10 + 8);
            trianglesGrass.Add((0) * 10 + 9);
            #endregion
        }



        meshFilter.mesh.Clear();
        meshFilter.mesh.vertices = vertices.ToArray();
        meshFilter.mesh.uv       = uvs.ToArray();

        meshFilter.mesh.subMeshCount = 3;

        //Debug.Log("Submeshcount: " + meshFilter.mesh.subMeshCount);

        meshFilter.mesh.SetTriangles(triangles.ToArray(), 0);
        meshFilter.mesh.SetTriangles(trianglesWhite.ToArray(), 1);
        meshFilter.mesh.SetTriangles(trianglesGrass.ToArray(), 2);

        meshFilter.mesh.RecalculateNormals();

        instTrack.GetComponent <MeshCollider>().sharedMesh = meshFilter.mesh;



        /*for (int i = 0; i < resolution; i++)
         * {
         *  float xPos = ((float)i) / ((float)resolution);
         *
         *  GameObject inst = (GameObject)Instantiate(prefabPoint);
         *  inst.transform.position = racetrack.track.SplineAt(xPos);
         * }*/

        return(racetrack);
    }