Beispiel #1
0
        private Vector2[] GetPoints(bool isCeiling, params TerrainGenerator.TerrainPoint[] terrainPoints)
        {
            int index      = 0;
            var startPoint = terrainPoints[index++];
            var endPoint   = terrainPoints[index++];
            var nextPoint  = terrainPoints[index++];

            float baseY = isCeiling ? ceilingY : floorY;

            // Create rasterized points.
            var points = new Vector2[4 + this.smoothingPoints];

            index = 0;
            // Create flat edge at the base.
            points[index].x   = endPoint.x;
            points[index++].y = baseY;
            points[index].x   = startPoint.x;
            points[index++].y = baseY;
            // Go up to the start point.
            points[index].x   = startPoint.x;
            points[index++].y = startPoint.GetY(isCeiling);

            // Create spline
            Vector2 p1 = new Vector2(startPoint.x, startPoint.GetY(isCeiling));
            Vector2 p2 = new Vector2(endPoint.x, endPoint.GetY(isCeiling));
            Vector2 p3 = new Vector2(nextPoint.x, nextPoint.GetY(isCeiling));

            Vector2[] splinePoints = { p1, p2, p3 };
            if (this.s == null)
            {
                Debug.Log("ONCE?");
                this.s = new Spline.ContinuousSpline(splinePoints);
            }
            else
            {
                s.AddControlPoints(splinePoints);
            }

            // Calculate delta
            float delta = (endPoint.x - startPoint.x) / (smoothingPoints + 1f);
            float currX = startPoint.x;

            // Get smoothing points Y
            for (int i = 0; i < this.smoothingPoints; i++)
            {
                currX             += delta;
                points [index].x   = currX;
                points [index++].y = s.Value(currX);
            }

            // Finish with the end point.
            points[index].x   = endPoint.x;
            points[index++].y = endPoint.GetY(isCeiling);
            return(points);
        }
Beispiel #2
0
        private Vector2[] GetPoints(bool isCeiling, params TerrainGenerator.TerrainPoint[] terrainPoints)
        {
            int index      = 0;
            var startPoint = terrainPoints[index++];
            var endPoint   = terrainPoints[index++];
            var nextPoint  = terrainPoints[index++];

            float baseY = isCeiling ? ceilingY : floorY;

            // Create rasterized points.
            //var points = new Vector2[13];
            var points = new Vector2[60];

            index = 0;
            // Create flat edge at the base.
            points[index].x   = endPoint.x;
            points[index++].y = baseY;
            points[index].x   = startPoint.x;
            points[index++].y = baseY;
            // Go up to the start point.
            points[index].x   = startPoint.x;
            points[index++].y = startPoint.GetY(isCeiling);

            Vector2[] addedPoints = new Vector2[1];
            addedPoints[0].x = nextPoint.x;
            addedPoints[0].y = nextPoint.GetY(isCeiling);


            if (startPoint.x == -3)
            {
                Vector2[] tempTop    = new Vector2[3];
                Vector2[] tempBottom = new Vector2[3];
                for (int i = 0; i < 3; i++)
                {
                    tempTop[i].x    = Game.instance.terrainPoints[i].x;
                    tempTop[i].y    = Game.instance.terrainPoints[i].ceilingY;
                    tempBottom[i].x = Game.instance.terrainPoints[i].x;
                    tempBottom[i].y = Game.instance.terrainPoints[i].floorY;
                }
                topSpline    = new Spline.ContinuousSpline(tempTop);
                bottomSpline = new Spline.ContinuousSpline(tempBottom);
            }
            else
            {
                if (isCeiling == true)
                {
                    topSpline.AddControlPoints(addedPoints);
                }
                else
                {
                    bottomSpline.AddControlPoints(addedPoints);
                }
            }

            float delta = (endPoint.x - startPoint.x) / (points.Length - 3);

            while (index < points.Length - 1)
            {
                float interpolated = points[index - 1].x + delta;
                points[index].x = interpolated;
                if (isCeiling)
                {
                    points[index].y = topSpline.Value(interpolated);
                }
                else
                {
                    points[index].y = bottomSpline.Value(interpolated);
                }
                index++;
            }

            // Finish with the end point.
            points[index].x   = endPoint.x;
            points[index++].y = endPoint.GetY(isCeiling);
            return(points);
        }