Пример #1
0
    public static void SaveMeshInPlace(MenuCommand menuCommand)
    {
        RoadMeshCreator rc = menuCommand.context as RoadMeshCreator;
        Mesh            m  = rc.Mesh;

        SaveMesh(m, m.name, false, true);
    }
Пример #2
0
    public static void SaveMeshNewInstanceItem(MenuCommand menuCommand)
    {
        RoadMeshCreator rc = menuCommand.context as RoadMeshCreator;
        Mesh            m  = rc.Mesh;

        SaveMesh(m, m.name, true, true);
    }
Пример #3
0
    void MeshInitialize()
    {
        RoadMeshCreator meshCreator = creator.GetComponent <RoadMeshCreator>();

        meshCreator.pathCreator = creator.GetComponent <PathCreator>();
        meshCreator.roadWidth   = this.roadWidth;
        meshCreator.ManualPathUpdated();
    }
Пример #4
0
    public void createPath()
    {
        roadPath = new RoadPath(transform.position);

        roadSettings = new RoadSettings();

        meshCreator = new RoadMeshCreator();
    }
Пример #5
0
    // Start is called before the first frame update
    void Start()
    {
        pathcreator = GetComponent <PathCreator>();
        meshCreator = GetComponent <RoadMeshCreator>();

        pathcreator.bezierPath = new BezierPath(points, false, PathSpace.xy);
        pathcreator.bezierPath.ControlPointMode  = BezierPath.ControlMode.Automatic;
        pathcreator.bezierPath.AutoControlLength = 0.02f;
        meshCreator.roadWidth = roadWidth;


        meshCreator.CreatePath();
    }
Пример #6
0
    public string GenerateCompleteStatus()
    {
        /* This funciton creates the general status of the map all the players need
         * and sends it to them
         *
         * Mapstatus should contain the following:
         *
         * 1) The Bezier definition of the track
         * 2) The Vertext definition of the walls of the track
         * 3) Placement of all the checkpoints
         *
         */

        MapStatus       mapStatus = new MapStatus();
        TrackController tc        = GameObject.FindObjectOfType <TrackController>();
        RoadMeshCreator pst       = GameObject.FindObjectOfType <RoadMeshCreator>();


        List <Vector3Json> bezierPoints = new List <Vector3Json>();

        foreach (Vector3 point in pst.pathCreator.bezierPath.points)
        {
            bezierPoints.Add(point);
        }

        mapStatus.bezierPoints = bezierPoints;
        mapStatus.roadWidth    = pst.roadWidth;

        GameObject         checkpointHolder = tc.checkpointHolder;
        List <Vector3Json> checkPointPos    = new List <Vector3Json>();
        List <Vector3Json> checkPointRot    = new List <Vector3Json>();

        Bounds checkPointBound = checkpointHolder.transform.GetChild(0).GetComponent <BoxCollider>().bounds;

        for (int i = 0; i < checkpointHolder.transform.childCount; i++)
        {
            Transform t = checkpointHolder.transform.GetChild(i);
            checkPointPos.Add(t.position);
            checkPointRot.Add(t.rotation.eulerAngles);
        }

        mapStatus.checkPointPos  = checkPointPos;
        mapStatus.checkPointRot  = checkPointRot;
        mapStatus.checkpointSize = checkPointBound.size;

        mapStatus.midpoint      = new List <Vector3Json>();
        mapStatus.wallLeft      = new List <Vector3Json>();
        mapStatus.wallRight     = new List <Vector3Json>();
        mapStatus.roadDirection = new List <Vector3Json>();

        VertexPath vertexPath = pst.pathCreator.path;

        Vector3[] pathPoints = vertexPath.localPoints;

        for (int i = 0; i < vertexPath.localPoints.Length; i++)
        {
            Vector3 midPoint   = pathPoints[i];
            Vector3 localRight = Vector3.Cross(Vector3.up, vertexPath.GetTangent(i));

            Vector3 vertSideA = vertexPath.GetPoint(i) - localRight * Mathf.Abs(pst.roadWidth);
            Vector3 vertSideB = vertexPath.GetPoint(i) + localRight * Mathf.Abs(pst.roadWidth);

            mapStatus.midpoint.Add(midPoint);
            mapStatus.wallLeft.Add(vertSideA);
            mapStatus.wallRight.Add(vertSideB);
            mapStatus.roadDirection.Add(vertexPath.GetTangent(i));
        }

        string mapStatusJson = JsonConvert.SerializeObject(mapStatus);

        //Debug.Log(mapStatusJson);

        if (debug)
        {
            for (int i = 1; i < mapStatus.wallLeft.Count; i++)
            {
                // Left
                Vector3 point_l1 = mapStatus.wallRight[i - 1];
                Vector3 point_l2 = mapStatus.wallRight[i];
                Debug.DrawLine(point_l1, point_l2, Color.red);

                // Right
                Vector3 point_r1 = mapStatus.wallLeft[i - 1];
                Vector3 point_r2 = mapStatus.wallLeft[i];
                Debug.DrawLine(point_r1, point_r2, Color.blue);
            }
        }

        return(mapStatusJson);
    }
Пример #7
0
    private void drawScene()
    {
        Handles.color = road.roadSettings.nodeColor;
        for (int i = 0; i < road.roadPath.PointsCount; i++)
        {
            Vector3 updatePos;
            if (i % 3 == 0)
            {
                updatePos = Handles.FreeMoveHandle(road.roadPath[i].Position, Quaternion.identity, road.roadSettings.nodeSize, Vector3.zero, Handles.CylinderHandleCap);
            }
            else
            {
                updatePos = Handles.PositionHandle(road.roadPath[i].Position, Quaternion.identity);
            }

            if (updatePos != road.roadPath[i].Position)
            {
                Undo.RecordObject(road, "Moved point");
                road.roadPath.movePosition(i, updatePos);
            }
        }

        for (int i = 0; i < road.roadPath.SegmentCount; i++)
        {
            Point[] segment = road.roadPath.getSegment(i);
            Handles.color = road.roadSettings.lineColor;
            Handles.DrawLine(segment[0].Position, segment[1].Position);
            Handles.DrawLine(segment[3].Position, segment[2].Position);
            if (road.roadSettings.showCurve)
            {
                Handles.DrawBezier(segment[0].Position, segment[3].Position, segment[1].Position, segment[2].Position, road.roadSettings.curveColor, null, road.roadSettings.curveWidth);
            }
        }


        if (road.roadSettings.showPoints || road.roadSettings.showPointForwards || road.roadSettings.showPointBinormals ||
            road.roadSettings.showPointNormals || road.roadSettings.showVertices || road.roadSettings.showTris ||
            road.roadSettings.showMeshNormals || road.roadSettings.showUVs || road.roadSettings.showPathCenter)
        {
            Point[]   roadPoints = road.roadPath.getRoadPathPoints(road.roadSettings.spacing);
            Vector3[] forwardDir = road.meshCreator.getPointsForward(roadPoints, road.roadPath.Closed);
            Vector3[] binormals  = road.meshCreator.getPointsBinormal(forwardDir, Vector3.up);
            Vector3[] normals    = road.meshCreator.getPointsNormal(forwardDir, binormals, new Vector2(0.0f, 1.0f));

            if (road.roadSettings.showPathCenter)
            {
                Vector3 pathCenter = RoadPath.getCenter(roadPoints);
                Handles.Label(pathCenter, "Center:\n" + pathCenter.ToString());
            }
            if (road.roadSettings.showPoints)
            {
                Handles.color = road.roadSettings.pathColor;
                foreach (Point node in roadPoints)
                {
                    Handles.SphereHandleCap(1, node.Position, Quaternion.identity, road.roadSettings.size, EventType.Repaint);
                }
            }

            if (road.roadSettings.showPathLabels)
            {
                for (int i = 0; i < roadPoints.Length; i++)
                {
                    Handles.Label(roadPoints[i].Position, i.ToString());
                }
            }

            if (road.roadSettings.showPointForwards)
            {
                Handles.color = road.roadSettings.nodeForwardColor;
                for (int i = 0; i < roadPoints.Length; i++)
                {
                    if (!road.roadPath.Closed && i == roadPoints.Length - 1)
                    {
                        break;
                    }

                    Handles.ArrowHandleCap(1, roadPoints[i].Position, Quaternion.LookRotation(forwardDir[i]), road.roadSettings.nodeArrowSize, EventType.Repaint);
                }
            }
            if (road.roadSettings.showPointBinormals)
            {
                Handles.color = road.roadSettings.nodeBinormalColor;
                for (int i = 0; i < roadPoints.Length; i++)
                {
                    if (!road.roadPath.Closed && i == roadPoints.Length - 1)
                    {
                        break;
                    }
                    Handles.ArrowHandleCap(1, roadPoints[i].Position, Quaternion.LookRotation(binormals[i]), road.roadSettings.nodeArrowSize, EventType.Repaint);
                }
            }
            if (road.roadSettings.showPointNormals)
            {
                Handles.color = road.roadSettings.nodeNormalColor;
                for (int i = 0; i < roadPoints.Length; i++)
                {
                    if (!road.roadPath.Closed && i == roadPoints.Length - 1)
                    {
                        break;
                    }
                    Handles.ArrowHandleCap(1, roadPoints[i].Position, Quaternion.LookRotation(normals[i]), road.roadSettings.nodeArrowSize, EventType.Repaint);
                }
            }

            foreach (DrawableShape shape in road.meshCreator.shapesToRender)
            {
                Shape renderShape = RoadMeshCreator.enumToShape(shape);
                if (road.roadSettings.showVertices || road.roadSettings.showTris || road.roadSettings.showPointNormals || road.roadSettings.showUVs || road.roadSettings.showVertIndices)
                {
                    Vector3[] vertices = road.meshCreator.getMeshVertices(roadPoints, renderShape, shape.offset, Vector3.up, shape.trackCompletion, road.roadPath.Closed);
                    int[]     tris     = road.meshCreator.getMeshTris(vertices.Length, renderShape, shape.winding, shape.trackCompletion, road.roadPath.Closed);

                    if (road.roadSettings.showVertices)
                    {
                        Handles.color = road.roadSettings.vertexColor;
                        foreach (Vector3 vertexPos in vertices)
                        {
                            Handles.SphereHandleCap(1, vertexPos, Quaternion.identity, road.roadSettings.size, EventType.Repaint);
                        }
                    }

                    if (road.roadSettings.showVertIndices)
                    {
                        for (int i = 0; i < vertices.Length; i++)
                        {
                            Handles.Label(vertices[i], i.ToString());
                        }
                    }
                    if (road.roadSettings.showTris)
                    {
                        Handles.color = Color.green;
                        for (int i = 0; i < tris.Length / 3; i++)
                        {
                            int index = 3 * i;
                            Handles.DrawLine(vertices[tris[index]], vertices[tris[index + 1]]);
                            Handles.DrawLine(vertices[tris[index + 1]], vertices[tris[index + 2]]);
                            Handles.DrawLine(vertices[tris[index + 2]], vertices[tris[index]]);
                        }
                    }

                    if (road.roadSettings.showMeshNormals)
                    {
                        Handles.color = Color.white;
                        Vector3[] vertexNormals = road.meshCreator.pointToMeshNormals(roadPoints, renderShape, Vector3.up, shape.winding, shape.trackCompletion, road.roadPath.Closed);


                        for (int i = 0; i < vertexNormals.Length; i++)
                        {
                            Handles.ArrowHandleCap(1, vertices[i], Quaternion.LookRotation(vertexNormals[i]), road.roadSettings.nodeArrowSize, EventType.Repaint);
                        }
                    }

                    if (road.roadSettings.showUVs)
                    {
                        Vector2[] UVs = road.meshCreator.getMeshUV(vertices.Length, renderShape);
                        for (int i = 0; i < UVs.Length; i++)
                        {
                            Handles.Label(vertices[i], UVs[i].ToString());
                        }
                    }
                }
            }
        }
    }
Пример #8
0
    // Start is called before the first frame update
    void Start()
    {
        playerPathFollower = player.GetComponent <PathFollower>();

        if (create)
        {
            transforms     = new List <Transform>();
            pathCreators   = new List <PathCreator>();
            finalPositions = new List <Vector3>();
            roadMeshes     = new List <RoadMeshCreator>();


            // Get data
            string path = "Assets/Data/priceData.csv";

            StreamReader reader       = new StreamReader(path);
            string       priceDataRaw = reader.ReadToEnd();
            reader.Close();

            var priceData = priceDataRaw.Split('\n');
            //Transform[] transforms = new Transform[priceData.Length];


            float xDistance = 0.0f;
            //int curTransform = 0;
            foreach (string price in priceData)
            {
                if (price == "")
                {
                    continue;
                }
                GameObject tempHusk = GameObject.Instantiate(emptyHusk);
                tempHusk.transform.position = new Vector3(xDistance, float.Parse(price) * 3, 0);
                transforms.Add(tempHusk.transform);
                xDistance += Random.Range(5, 20);
                //curTransform++;
            }

            updateBezier();

            // Create bezier paths
            // Get 5-10 points and make a path
            int last = 0;
            int next = 15;

            while (last + next < transforms.Count)
            {
                // Instantiate a PathCreator
                GameObject newRoadCreator = GameObject.Instantiate(roadCreator);

                PathCreator     newPathCreator     = newRoadCreator.GetComponent <PathCreator>();
                RoadMeshCreator newRoadMeshCreator = newRoadCreator.GetComponent <RoadMeshCreator>();

                List <Transform> transformSlice = transforms.GetRange(last, next);

                newPathCreator.bezierPath = new BezierPath(transformSlice);
                newRoadMeshCreator.updatePath();

                finalPositions.Add(transformSlice[transformSlice.Count - 1].position);
                pathCreators.Add(newPathCreator);
                roadMeshes.Add(newRoadMeshCreator);

                last += next;
                next  = Random.Range(5, 10);
            }
        }


        playerPathFollower.pathCreator = pathCreators[0];
    }
Пример #9
0
    private void generatePath()
    {
        bounds = trackArea.GetComponent <MeshRenderer>().bounds;
        List <Vector3> points     = new List <Vector3>();
        int            num_points = Random.Range(Points_min, Points_max);


        RoadMeshCreator pst = (RoadMeshCreator)GetComponent <PathSceneTool>();
        PathCreator     pc  = GetComponent <PathCreator>();

        for (int i = 0; i < num_points; i++)
        {
            float size_x = bounds.size.x;
            float size_z = bounds.size.z;
            float size_y = bounds.size.y;

            //print(string.Format("Size X: {0}, Y: {1} Z: {2}", size_x, size_y, size_z));

            float x = Random.Range(bounds.center.x - size_x / 2, bounds.center.x + size_x / 2);
            float z = Random.Range(bounds.center.z - size_z / 2, bounds.center.z + size_z / 2);
            float y = 1;

            // I want to use some dumb raycasting so that the Y level always is on top of the terrain
            RaycastHit hit;
            if (Physics.Raycast(new Vector3(x, 10000, z), Vector3.down, out hit))
            {
                y = hit.point.y + pst.thickness;
            }

            //print(string.Format("Point X: {0}, Y: {1} Z: {2}", x, y, z));

            Vector3 point = new Vector3(x, y, z);
            points.Add(point);
        }

        trackPath = new BezierPath(points, true, PathSpace.xyz);
        trackPath.AutoControlLength = Random.Range(0.1f, 1.0f);
        trackPath.IsClosed          = true;

        /*
         * for(int i = 0; i < trackPath.NumPoints; i++)
         * {
         *  Vector3 point = trackPath.GetPoint(i);
         *  float y = Random.Range(0.0f, 10.0f);
         *  point.y = y;
         * }
         */
        trackPath.NotifyPathModified();

        pc.bezierPath = trackPath;

        pst.TriggerUpdate();

        GameObject   road         = GameObject.Find("Road Mesh Holder");
        MeshCollider roadCollider = road.GetComponent <MeshCollider>();

        Destroy(roadCollider);
        roadCollider = road.AddComponent <MeshCollider>();
        MeshFilter roadMesh = road.GetComponent <MeshFilter>();

        roadCollider.sharedMesh = roadMesh.mesh;
    }