Inheritance: MonoBehaviour
Ejemplo n.º 1
0
    void OnEnable()
    {
        if (target != null)
        {
            _trackBuildR = (TrackBuildR)target;
            _track = _trackBuildR.track;
        }

        _stageToolbarTexturesA = new Texture2D[numberOfMenuOptionsA];
        _stageToolbarTexturesA[0] = (Texture2D)Resources.Load("GUI/track");
        _stageToolbarTexturesA[1] = (Texture2D)Resources.Load("GUI/boundary");
        _stageToolbarTexturesA[2] = (Texture2D)Resources.Load("GUI/bumpers");
        _stageToolbarTexturesA[3] = (Texture2D)Resources.Load("GUI/textures");
        _stageToolbarTexturesA[4] = (Texture2D)Resources.Load("GUI/terrain");
        _stageToolbarTexturesB = new Texture2D[numberOfMenuOptionsB];
        _stageToolbarTexturesB[0] = (Texture2D)Resources.Load("GUI/stunt");
        _stageToolbarTexturesB[1] = (Texture2D)Resources.Load("GUI/diagram");
        _stageToolbarTexturesB[2] = (Texture2D)Resources.Load("GUI/options");
        _stageToolbarTexturesB[3] = (Texture2D)Resources.Load("GUI/export");

        //Preview Camera
        if (_trackBuildR.trackEditorPreview != null)
            DestroyImmediate(_trackBuildR.trackEditorPreview);
        if (!EditorApplication.isPlaying && SystemInfo.supportsRenderTextures)
        {
            _trackBuildR.trackEditorPreview = new GameObject("Track Preview Cam");
            _trackBuildR.trackEditorPreview.hideFlags = HideFlags.HideAndDontSave;
            _trackBuildR.trackEditorPreview.AddComponent<Camera>();
            _trackBuildR.trackEditorPreview.GetComponent<Camera>().fieldOfView = 80;
            _trackBuildR.trackEditorPreview.GetComponent<Camera>().depth = -99999;
            //Retreive camera settings from the main camera
            Camera[] cams = Camera.allCameras;
            bool sceneHasCamera = cams.Length > 0;
            Camera sceneCamera = null;
            Skybox sceneCameraSkybox = null;
            if (Camera.main)
            {
                sceneCamera = Camera.main;
            }
            else if (sceneHasCamera)
            {
                sceneCamera = cams[0];
            }

            if (sceneCamera != null)
                if (sceneCameraSkybox == null)
                    sceneCameraSkybox = sceneCamera.GetComponent<Skybox>();
            if (sceneCamera != null)
            {
                _trackBuildR.trackEditorPreview.GetComponent<Camera>().backgroundColor = sceneCamera.backgroundColor;
                if (sceneCameraSkybox != null)
                    _trackBuildR.trackEditorPreview.AddComponent<Skybox>().material = sceneCameraSkybox.material;
                else
                    if (RenderSettings.skybox != null)
                        _trackBuildR.trackEditorPreview.AddComponent<Skybox>().material = RenderSettings.skybox;
            }
        }
    }
Ejemplo n.º 2
0
 public static void CreateNewBuilding()
 {
     GameObject newTrack = new GameObject("New Track");
     Undo.RegisterCreatedObjectUndo(newTrack, "Created New Track BuildR Track");
     TrackBuildR trackBuildR = newTrack.AddComponent<TrackBuildR>();
     trackBuildR.Init();
     //Focus on new track
     Selection.objects = new Object[] { newTrack };
     SceneView.lastActiveSceneView.FrameSelected();
 }
Ejemplo n.º 3
0
    private static void Export(string filename, string folder, TrackBuildR data, Mesh exportMesh, ExportMaterial[] exportTextures)
    {
        switch (data.fileType)
        {
        case TrackBuildR.fileTypes.Obj:
            OBJExporter.Export(folder, filename, exportMesh, exportTextures, data.copyTexturesIntoExportFolder);
            break;

        case TrackBuildR.fileTypes.Fbx:
            FBXExporter.Export(folder, filename, exportMesh, exportTextures, data.copyTexturesIntoExportFolder);
            break;
        }
    }
Ejemplo n.º 4
0
    private static void ExportCollider(TrackBuildR data)
    {
        DynamicMesh COL_MESH = new DynamicMesh();

//        COL_MESH.subMeshCount = data.textures.Count;
//        BuildrBuildingCollider.Build(COL_MESH, data);
//        COL_MESH.CollapseSubmeshes();
        COL_MESH.Build();

        ExportMaterial[] exportTextures = new ExportMaterial[1];
        ExportMaterial   newTexture     = new ExportMaterial();

        newTexture.name      = "blank";
        newTexture.filepath  = "";
        newTexture.generated = true;
        exportTextures[0]    = newTexture;

        int numberOfColliderMeshes = COL_MESH.meshCount;

        Mesh[] meshes = COL_MESH.meshes;
        for (int i = 0; i < numberOfColliderMeshes; i++)
        {
            MeshUtility.Optimize(meshes[i]);
            string ColliderSuffixIndex = ((numberOfColliderMeshes > 1) ? "_" + i : "");
            string ColliderFileName    = data.exportFilename + COLLIDER_SUFFIX + ColliderSuffixIndex;
            string ColliderFolder      = ROOT_FOLDER + data.exportFilename + "/";
            Export(ColliderFileName, ColliderFolder, data, meshes[i], exportTextures);
        }

        //string newDirectory = rootFolder+track.exportFilename;
        //if(!CreateFolder(newDirectory))
        //	return;
//        ExportMaterial[] exportTextures = new ExportMaterial[1];
//        ExportMaterial newTexture = new ExportMaterial();
//        newTexture.customName = "";
//        newTexture.filepath = "";
//        newTexture.generated = true;
//        exportTextures[0] = newTexture;
//        Export(track.exportFilename + COLLIDER_SUFFIX, ROOT_FOLDER + track.exportFilename + "/", track, EXPORT_MESH, exportTextures);
//
//        COL_MESH = null;
//        EXPORT_MESH = null;
    }
    public static void OnInspectorGUI(TrackBuildR _trackBuildR, int selectedPointIndex, int selectedCurveIndex)
    {
        TrackBuildRTrack _track = _trackBuildR.track;

        if (TrackBuildREditor._stageToolbarTexturesA == null)
            return;

        GUILayout.BeginVertical(GUILayout.Width(400));

        //Track Preview Window
        EditorGUILayout.Space();
        RenderPreview(_trackBuildR);
        EditorGUILayout.LabelField("Track Lap Length approx. " + (_track.trackLength / 1000).ToString("F2") + "km / " + (_track.trackLength / 1609.34f).ToString("F2") + " miles");

        EditorGUILayout.LabelField("Track Polycount: "+_track.lastPolycount);

        int currentTrackMode = (int)_trackBuildR.mode;
        int currentTrackModeA = currentTrackMode < 5 ? currentTrackMode : -1;
        int currentTrackModeB = currentTrackMode > 4 ? currentTrackMode - 5 : -1;
        GUIContent[] guiContentA = new GUIContent[TrackBuildREditor.numberOfMenuOptionsA];
        GUIContent[] guiContentB = new GUIContent[TrackBuildREditor.numberOfMenuOptionsB];
        for (int i = 0; i < TrackBuildREditor.numberOfMenuOptionsA; i++)
            guiContentA[i] = new GUIContent(TrackBuildREditor._stageToolbarTexturesA[i], TrackBuildREditor.trackModeString[i]);
        for (int i = 0; i < TrackBuildREditor.numberOfMenuOptionsB; i++)
            guiContentB[i] = new GUIContent(TrackBuildREditor._stageToolbarTexturesB[i], TrackBuildREditor.trackModeString[i]);
        int newTrackModeA = GUILayout.Toolbar(currentTrackModeA, guiContentA, GUILayout.Width(400), GUILayout.Height(50));
        int newTrackModeB = GUILayout.Toolbar(currentTrackModeB, guiContentB, GUILayout.Width(400), GUILayout.Height(50));
        if (newTrackModeA != currentTrackModeA)
        {
            _trackBuildR.mode = (TrackBuildR.modes)newTrackModeA;
            GUI.changed = true;
        }
        if (newTrackModeB != currentTrackModeB)
        {
            _trackBuildR.mode = (TrackBuildR.modes)newTrackModeB + 5;
            GUI.changed = true;
        }

        if (_track.numberOfTextures == 0)
            EditorGUILayout.HelpBox("There are no textures defined. Track will not render until this is done", MessageType.Error);

        TrackBuildRPoint point = null;
        if (_track.realNumberOfPoints > 0)
        {
            point = _trackBuildR.track[selectedPointIndex];
        }

        if(!_track.render)
            EditorGUILayout.HelpBox("Track rendering is disabled", MessageType.Warning);

        switch(_trackBuildR.mode)
        {
            case TrackBuildR.modes.track:

                EditorGUILayout.Space();
                Title("Track", TrackBuildRColours.GREEN);

                bool trackloop = EditorGUILayout.Toggle("Is Looped", _track.loop);
                if(_track.loop != trackloop)
                {
                    Undo.RecordObject(_track, "Toggled Loop");
                    _track.loop = trackloop;
                }

                EditorGUILayout.BeginHorizontal();
                if(_trackBuildR.pointMode != TrackBuildR.pointModes.add)
                {
                    if(GUILayout.Button("Add New Point"))
                        _trackBuildR.pointMode = TrackBuildR.pointModes.add;
                }
                else
                {
                    if(GUILayout.Button("Cancel Add New Point"))
                        _trackBuildR.pointMode = TrackBuildR.pointModes.transform;
                }

                EditorGUI.BeginDisabledGroup(_track.realNumberOfPoints < 3);
                if(_trackBuildR.pointMode != TrackBuildR.pointModes.remove)
                {
                    if(GUILayout.Button("Remove Point"))
                        _trackBuildR.pointMode = TrackBuildR.pointModes.remove;
                }
                else
                {
                    if(GUILayout.Button("Cancel Remove Point"))
                        _trackBuildR.pointMode = TrackBuildR.pointModes.transform;
                }
                EditorGUI.EndDisabledGroup();
                EditorGUILayout.EndHorizontal();

                if(!_track.drawMode)
                {
                    EditorGUILayout.BeginHorizontal();
                    if(GUILayout.Button("Layout Track Points"))
                    {
                        if(EditorUtility.DisplayDialog("Discard Current Track?", "Do you wish to discard the current track layout?", "Yup", "Nope"))
                        {
                            _track.Clear();
                            _track.loop = true;
                            _track.drawMode = true;
                        }
                    }
                    if(GUILayout.Button("?", GUILayout.Width(35)))
                    {
                        EditorUtility.DisplayDialog("Layout Track", "This allows you to click place points to define your track. It will erase the current track layout and start anew. Ideally used with a defined diagram to help you plot out the track", "Ok - got it!");

                    }
                    EditorGUILayout.EndHorizontal();
                }
                else
                {
                    if(GUILayout.Button("Stop Layout Track"))
                    {
                        _track.loop = false;
                        _track.drawMode = false;
                    }
                    EditorGUILayout.EndVertical();
                    return;
                }

                float meshResolution = _track.meshResolution;
                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Track Mesh Resolution", GUILayout.Width(140));
                meshResolution = EditorGUILayout.Slider(meshResolution, 0.9f, 20.0f);
                EditorGUILayout.LabelField("metres", GUILayout.Width(60));
                EditorGUILayout.EndHorizontal();
                if(meshResolution != _track.meshResolution)
                {
                    _track.SetTrackDirty();
                    _track.meshResolution = meshResolution;
                }

                if(_track.realNumberOfPoints == 0)
                {
                    EditorGUILayout.HelpBox("There are no track points defined, add nextNormIndex track point to begin", MessageType.Warning);
                    EditorGUILayout.EndVertical();
                    return;
                }


                EditorGUILayout.Space();
                Title("Track Point", TrackBuildRColours.RED);
                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Point " + (selectedPointIndex + 1) + " selected");
                if(GUILayout.Button("Goto Point"))
                    GotoScenePoint(point.position);
                EditorGUILayout.EndHorizontal();


                int currentMode = (int)_trackBuildR.pointMode;
                int newStage = GUILayout.Toolbar(currentMode, TrackBuildREditor.pointModeString);
                if(newStage != currentMode)
                {
                    _trackBuildR.pointMode = (TrackBuildR.pointModes)newStage;
                    GUI.changed = true;
                }

                switch(_trackBuildR.pointMode)
                {
                    case TrackBuildR.pointModes.transform:
                        Vector3 pointposition = EditorGUILayout.Vector3Field("Point Position", point.position);
                        if(pointposition != point.position)
                        {
                            Undo.RecordObject(point, "Position Modified");
                            point.position = pointposition;
                        }
                        break;

                    case TrackBuildR.pointModes.controlpoint:
                        bool pointsplitControlPoints = EditorGUILayout.Toggle("Split Control Points", point.splitControlPoints);
                        if(pointsplitControlPoints != point.splitControlPoints)
                        {
                            Undo.RecordObject(point, "Split Points Toggled");
                            point.splitControlPoints = pointsplitControlPoints;
                        }
                        Vector3 pointforwardControlPoint = EditorGUILayout.Vector3Field("Control Point Position", point.forwardControlPoint);
                        if(pointforwardControlPoint != point.forwardControlPoint)
                        {
                            Undo.RecordObject(point, "Forward Control Point Changed");
                            point.forwardControlPoint = pointforwardControlPoint;
                        }
                        break;

                    case TrackBuildR.pointModes.trackup:

                        //nothing to show - yet...

                        break;

                    case TrackBuildR.pointModes.trackpoint:


                        EditorGUILayout.BeginHorizontal();
                        EditorGUILayout.LabelField("Point Crown");
                        float pointcrownAngle = EditorGUILayout.Slider(point.crownAngle, -45, 45);
                        if(pointcrownAngle != point.crownAngle)
                        {
                            point.isDirty = true;
                            Undo.RecordObject(point, "Crown Modified");
                            point.crownAngle = pointcrownAngle;
                        }
                        EditorGUILayout.EndHorizontal();

                        EditorGUILayout.BeginHorizontal();
                        EditorGUILayout.LabelField("Point Width", GUILayout.Width(250));
                        float pointwidth = EditorGUILayout.FloatField(point.width);
                        if(pointwidth != point.width)
                        {
                            point.isDirty = true;
                            Undo.RecordObject(point, "Width Modified");
                            point.width = pointwidth;
                        }
                        EditorGUILayout.LabelField("metres", GUILayout.Width(75));
                        EditorGUILayout.EndHorizontal();
                        break;
                }
                break;

            case TrackBuildR.modes.boundary:

                EditorGUILayout.Space();
                Title("Track Boundary", TrackBuildRColours.GREEN);
                //Track Based Boundary Options
                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Split Boundary from Track");
                bool trackdisconnectBoundary = EditorGUILayout.Toggle(_track.disconnectBoundary, GUILayout.Width(25));
                if(trackdisconnectBoundary != _track.disconnectBoundary)
                {
                    Undo.RecordObject(_track, "disconnect boundary");
                    _track.disconnectBoundary = trackdisconnectBoundary;
                    GUI.changed = true;
                    _track.ReRenderTrack();
                }

                if(GUILayout.Button("Reset Boundary Points"))
                {
                    Undo.RecordObject(_track, "reset boundary");
                    for(int i = 0; i < _track.numberOfPoints; i++)
                    {
                        _track[i].MatchBoundaryValues();
                    }
                }
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Render Both Sides of Boundary");
                bool renderBothSides = EditorGUILayout.Toggle(_track.renderBoundaryWallReverse, GUILayout.Width(50));
                if(_track.renderBoundaryWallReverse != renderBothSides)
                {
                    Undo.RecordObject(_track, "render reverse boundary");
                    _track.renderBoundaryWallReverse = renderBothSides;
                    GUI.changed = true;
                    _track.ReRenderTrack();
                }
                EditorGUILayout.EndHorizontal();

                float newTrackColliderHeight = EditorGUILayout.FloatField("Track Collider Height", _track.trackColliderWallHeight);
                if(newTrackColliderHeight != _track.trackColliderWallHeight)
                {
                    Undo.RecordObject(_track, "trackCollider height");
                    _track.trackColliderWallHeight = newTrackColliderHeight;
                    _track.ReRenderTrack();
                    GUI.changed = true;
                }

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Track Collider Should Have Roof");
                bool newRoofCooliderValue = EditorGUILayout.Toggle(_track.includeColliderRoof, GUILayout.Width(50));
                if(newRoofCooliderValue != _track.includeColliderRoof)
                {
                    Undo.RecordObject(_track, "trackCollider roof");
                    _track.includeColliderRoof = newRoofCooliderValue;
                    _track.ReRenderTrack();
                    GUI.changed = true;
                }
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.Space();
                Title("Point Boundary", TrackBuildRColours.RED);
                //Selected Point Boundary Options
                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Point " + (selectedPointIndex + 1) + " selected");
                if(GUILayout.Button("Goto Point"))
                    GotoScenePoint(point.position);
                EditorGUILayout.EndHorizontal();

                int currentBoundaryMode = (int)_trackBuildR.boundaryMode;
                int newBoundaryMode = GUILayout.Toolbar(currentBoundaryMode, TrackBuildREditor.boundaryModeString);
                if(newBoundaryMode != currentBoundaryMode)
                {
                    _trackBuildR.boundaryMode = (TrackBuildR.boundaryModes)newBoundaryMode;
                    GUI.changed = true;
                }

                if(_track.realNumberOfPoints > 0)
                {
                    EditorGUILayout.BeginHorizontal();
                    EditorGUILayout.LabelField("Split Boundary Control Points");
                    bool pointSplitControlPoints = EditorGUILayout.Toggle(point.leftSplitControlPoints, GUILayout.Width(50));
                    if(point.leftSplitControlPoints != pointSplitControlPoints)
                    {
                        Undo.RecordObject(point, "split boundary");
                        point.leftSplitControlPoints = pointSplitControlPoints;
                        point.rightSplitControlPoints = pointSplitControlPoints;
                        GUI.changed = true;
                        _track.SetTrackDirty();
                    }
                    EditorGUILayout.EndHorizontal();

                }

                EditorGUILayout.HelpBox("It is suggested that you disable the trackCollider bounding box when working on Track BuildR\nYou can do this by clicking on 'gizmos' above the scene view and deselecting 'Mesh Collider'", MessageType.Info);
                break;

            case TrackBuildR.modes.bumpers:

                EditorGUILayout.Space();
                Title("Track Bumpers", TrackBuildRColours.RED);
                bool _tracktrackBumpers = EditorGUILayout.Toggle("Enable", _track.trackBumpers);
                if(_track.trackBumpers != _tracktrackBumpers)
                {
                    Undo.RecordObject(_track, "bumpers");
                    if(_tracktrackBumpers == false)
                        for(int i = 0; i < _track.numberOfCurves; i++)
                            _track[i].generateBumpers = false;
                    _track.trackBumpers = _tracktrackBumpers;
                }
                EditorGUI.BeginDisabledGroup(!_track.trackBumpers);

                TrackBuildRTrack.BumperModes _trackBumperMode = (TrackBuildRTrack.BumperModes)EditorGUILayout.EnumPopup("Bumper Mode", _track.bumperMode);
                if (_track.bumperMode != _trackBumperMode)
                {
                    Undo.RecordObject(_track, "bumpers");
                    _track.bumperMode = _trackBumperMode;
                    _track.SetTrackDirty();
                }


                float bumperWidth = EditorGUILayout.Slider("Width", _track.bumperWidth, 0.1f, 2.0f);
                if(bumperWidth != _track.bumperWidth)
                {
                    Undo.RecordObject(_track, "bumper width");
                    GUI.changed = true;
                    _track.bumperWidth = bumperWidth;
                }
                float bumperHeight = EditorGUILayout.Slider("Outer Height", _track.bumperHeight, 0.01f, 0.2f);
                if(bumperHeight != _track.bumperHeight)
                {
                    Undo.RecordObject(_track, "bumper height");
                    GUI.changed = true;
                    _track.bumperHeight = bumperHeight;
                }

                float additionalBumperHeight = EditorGUILayout.Slider("Additional Height", _track.additionalBumperHeight, 0.0f, 0.2f);
                if (additionalBumperHeight != _track.additionalBumperHeight)
                {
                    Undo.RecordObject(_track, "bumper height");
                    GUI.changed = true;
                    _track.additionalBumperHeight = additionalBumperHeight;
                }

                float bumperAngleThresold = EditorGUILayout.Slider("Threshold Angle", _track.bumperAngleThresold, 0.005f, 1.5f);
                if(bumperAngleThresold != _track.bumperAngleThresold)
                {
                    Undo.RecordObject(_track, "bumper threshold");
                    GUI.changed = true;
                    _track.bumperAngleThresold = bumperAngleThresold;
                }
                if(GUI.changed)//change on mouse up
                {
                    _track.ReRenderTrack();
                }
                EditorGUI.EndDisabledGroup();
                break;

            case TrackBuildR.modes.textures:

                EditorGUILayout.Space();
                Title("Render Properties", TrackBuildRColours.BLUE);

                pointTrackSelection = GUILayout.Toolbar(pointTrackSelection, pointTrackNames);

                TrackBuildRPoint[] selectedCurves;
                EditorGUILayout.BeginHorizontal();
                switch(pointTrackSelection)
                {
                    default://selected point
                        selectedCurves = new []{_track[selectedCurveIndex]};//select the single track point to modify
                        Undo.RecordObjects(selectedCurves, "Curve Details Modified");

                        EditorGUILayout.LabelField("Selected Curve: " + selectedCurves[0].pointName);
                        if(GUILayout.Button("Goto Curve"))
                            GotoScenePoint(selectedCurves[0].center);
                        break;

                    case 1://track wide
                        selectedCurves = _track.points;//select all track points to modify
                        Undo.RecordObjects(selectedCurves, "Curve Details Modified");
                        break;
                }
                EditorGUILayout.EndHorizontal();

                TrackBuildRPoint selectedCurve = selectedCurves[0];

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Render Curve");
                bool render = EditorGUILayout.Toggle(selectedCurve.render);
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Render Boundaries");
                bool renderBounds = EditorGUILayout.Toggle(selectedCurve.renderBounds);
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Boundary Height");
                float boundaryHeight = EditorGUILayout.Slider(selectedCurve.boundaryHeight, 0, 10);
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Colliders");
                bool trackCollider = EditorGUILayout.Toggle(selectedCurve.trackCollider);
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Side Colliders");
                bool colliderSides = EditorGUILayout.Toggle(selectedCurve.colliderSides);
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Track Width", GUILayout.Width(250));
                float trackPointWidth = EditorGUILayout.FloatField(selectedCurve.width);
                EditorGUILayout.LabelField("metres", GUILayout.Width(75));
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Extrude Track");
                bool extrudeTrack = EditorGUILayout.Toggle(selectedCurve.extrudeTrack);
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Render Track Bottom");
                bool extrudeTrackBottom = EditorGUILayout.Toggle(selectedCurve.extrudeTrackBottom);
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Render Curve End");
                bool extrudeCurveEnd = EditorGUILayout.Toggle(selectedCurve.extrudeCurveEnd);
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Extrude Length");
                float extrudeLength = EditorGUILayout.Slider(selectedCurve.extrudeLength, 0.1f, 100.0f);
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Extrude Bevel");
                float extrudeBevel = EditorGUILayout.Slider(selectedCurve.extrudeBevel, 0, 2);
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Generate Bumpers");
                bool generateBumpers = EditorGUILayout.Toggle(selectedCurve.generateBumpers);
                EditorGUILayout.EndHorizontal();

                if (selectedCurve.width != trackPointWidth)
                    foreach (TrackBuildRPoint selectedCurveArray in selectedCurves)
                        selectedCurveArray.width = trackPointWidth;
                if (selectedCurve.render != render)
                    foreach (TrackBuildRPoint selectedCurveArray in selectedCurves)
                        selectedCurveArray.render = render;
                if (selectedCurve.renderBounds != renderBounds)
                    foreach (TrackBuildRPoint selectedCurveArray in selectedCurves)
                        selectedCurveArray.renderBounds = renderBounds;
                if (selectedCurve.boundaryHeight != boundaryHeight)
                    foreach (TrackBuildRPoint selectedCurveArray in selectedCurves)
                        selectedCurveArray.boundaryHeight = boundaryHeight;
                if (selectedCurve.trackCollider != trackCollider)
                    foreach (TrackBuildRPoint selectedCurveArray in selectedCurves)
                        selectedCurveArray.trackCollider = trackCollider;
                if (selectedCurve.extrudeTrack != extrudeTrack)
                    foreach (TrackBuildRPoint selectedCurveArray in selectedCurves)
                        selectedCurveArray.extrudeTrack = extrudeTrack;
                if (selectedCurve.extrudeTrackBottom != extrudeTrackBottom)
                    foreach (TrackBuildRPoint selectedCurveArray in selectedCurves)
                        selectedCurveArray.extrudeTrackBottom = extrudeTrackBottom;
                if (selectedCurve.extrudeCurveEnd != extrudeCurveEnd)
                    foreach (TrackBuildRPoint selectedCurveArray in selectedCurves)
                        selectedCurveArray.extrudeCurveEnd = extrudeCurveEnd;
                if (selectedCurve.extrudeLength != extrudeLength)
                    foreach (TrackBuildRPoint selectedCurveArray in selectedCurves)
                        selectedCurveArray.extrudeLength = extrudeLength;
                if (selectedCurve.extrudeBevel != extrudeBevel)
                    foreach (TrackBuildRPoint selectedCurveArray in selectedCurves)
                        selectedCurveArray.extrudeBevel = extrudeBevel;
                if (selectedCurve.generateBumpers != generateBumpers)
                    foreach (TrackBuildRPoint selectedCurveArray in selectedCurves)
                        selectedCurveArray.generateBumpers = generateBumpers;
                if (selectedCurve.colliderSides != colliderSides)
                    foreach (TrackBuildRPoint selectedCurveArray in selectedCurves)
                        selectedCurveArray.colliderSides = colliderSides;

                TrackBuildRTexture[] textures = _track.GetTexturesArray();
                int numberOfTextures = textures.Length;
                string[] textureNames = new string[numberOfTextures];
                for(int t = 0; t < numberOfTextures; t++)
                    textureNames[t] = textures[t].customName;
                if(numberOfTextures > 0)
                {
                    int trackTextureStyleIndex = CurveTextureSelector(_track, selectedCurve.trackTextureStyleIndex, "Track Texture");
                    if(trackTextureStyleIndex != selectedCurve.trackTextureStyleIndex)
                    {
                        foreach (TrackBuildRPoint selectedCurveArray in selectedCurves)
                            selectedCurveArray.trackTextureStyleIndex = trackTextureStyleIndex;
                        GUI.changed = true;
                        _track.ReRenderTrack();
                    }
                    int offroadTextureStyleIndex = CurveTextureSelector(_track, selectedCurve.offroadTextureStyleIndex, "Offroad Texture");
                    if(offroadTextureStyleIndex != selectedCurve.offroadTextureStyleIndex)
                    {
                        foreach (TrackBuildRPoint selectedCurveArray in selectedCurves)
                            selectedCurveArray.offroadTextureStyleIndex = offroadTextureStyleIndex;
                        GUI.changed = true;
                        _track.ReRenderTrack();
                    }
                    int boundaryTextureStyleIndex = CurveTextureSelector(_track, selectedCurve.boundaryTextureStyleIndex, "Boundary Texture");
                    if(boundaryTextureStyleIndex != selectedCurve.boundaryTextureStyleIndex)
                    {
                        foreach (TrackBuildRPoint selectedCurveArray in selectedCurves)
                            selectedCurveArray.boundaryTextureStyleIndex = boundaryTextureStyleIndex;
                        GUI.changed = true;
                        _track.ReRenderTrack();
                    }
                    int bumperTextureStyleIndex = CurveTextureSelector(_track, selectedCurve.bumperTextureStyleIndex, "Bumper Texture");
                    if(bumperTextureStyleIndex != selectedCurve.bumperTextureStyleIndex)
                    {
                        foreach (TrackBuildRPoint selectedCurveArray in selectedCurves)
                            selectedCurveArray.bumperTextureStyleIndex = bumperTextureStyleIndex;
                        GUI.changed = true;
                        _track.ReRenderTrack();
                    }
                    int extrudeTextureStyleIndex = CurveTextureSelector(_track, selectedCurve.bottomTextureStyleIndex, "Track Extrude Texture");
                    if(extrudeTextureStyleIndex != selectedCurve.bottomTextureStyleIndex)
                    {
                        foreach (TrackBuildRPoint selectedCurveArray in selectedCurves)
                            selectedCurveArray.bottomTextureStyleIndex = extrudeTextureStyleIndex;
                        GUI.changed = true;
                        _track.ReRenderTrack();
                    }
                }

                EditorGUILayout.Space();
                Title("Track Texture Library", TrackBuildRColours.RED);

                if(GUILayout.Button("Add New"))
                {
                    _track.AddTexture();
                    numberOfTextures++;
                    selectedTexture = numberOfTextures - 1;
                }
                if(numberOfTextures == 0)
                {
                    EditorGUILayout.HelpBox("There are no textures to show", MessageType.Info);
//                    return;
                    break;
                }

                if(numberOfTextures > 0)
                {
                    EditorGUILayout.BeginHorizontal();
                    EditorGUILayout.LabelField("Texture", GUILayout.Width(75));

                    selectedTexture = EditorGUILayout.Popup(selectedTexture, textureNames);

                    TrackBuildRTexture trackBuildRTexture = _track.Texture(selectedTexture);

                    if(GUILayout.Button("Remove Texture"))
                    {
                        _track.RemoveTexture(trackBuildRTexture);
                        numberOfTextures--;
                        selectedTexture = 0;
                        trackBuildRTexture = _track.Texture(selectedTexture);
                        return;
                    }
                    EditorGUILayout.EndHorizontal();

                    if(TextureGUI(ref trackBuildRTexture))
                    {
                        _track.ReRenderTrack();
                    }
                }
                break;


            case TrackBuildR.modes.terrain:

                Title("Terrain", TrackBuildRColours.RED);

                EditorGUILayout.HelpBox("I'd love to hear feedback on this new feature.\nWhat works? What doesn't.\nLet me know!", MessageType.Info);

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Terrain Mode", GUILayout.Width(90));
                EditorGUI.BeginDisabledGroup(_trackBuildR.terrainMode == TrackBuildR.terrainModes.mergeTerrain);
                if(GUILayout.Button("Merge Terrain"))
                    _trackBuildR.terrainMode = TrackBuildR.terrainModes.mergeTerrain;
                EditorGUI.EndDisabledGroup();
                EditorGUI.BeginDisabledGroup(_trackBuildR.terrainMode == TrackBuildR.terrainModes.conformTrack);
                if(GUILayout.Button("Conform Track"))
                    _trackBuildR.terrainMode = TrackBuildR.terrainModes.conformTrack;
                EditorGUI.EndDisabledGroup();
                EditorGUILayout.EndHorizontal();
                EditorGUILayout.Space();

                switch(_trackBuildR.terrainMode)
                {
                    case TrackBuildR.terrainModes.mergeTerrain:

                        EditorGUILayout.BeginVertical("box");
                        Title("Terrain Merge", TrackBuildRColours.RED);
                        EditorGUILayout.LabelField("Selected Terrain");
                        EditorGUILayout.BeginHorizontal();
                        _track.mergeTerrain = (Terrain)EditorGUILayout.ObjectField(_track.mergeTerrain, typeof(Terrain), true);
                        if(GUILayout.Button("Find Terrain"))
                            _track.mergeTerrain = GameObject.FindObjectOfType<Terrain>();
                        EditorGUILayout.EndHorizontal();

                        EditorGUILayout.Space();

                        EditorGUILayout.BeginVertical("box");
                        EditorGUILayout.LabelField("Terrain Merge Width");
                        _track.terrainMergeWidth = EditorGUILayout.Slider(_track.terrainMergeWidth, 0, 100);
                        EditorGUILayout.EndVertical();
                
                        EditorGUILayout.BeginVertical("box");
                        EditorGUILayout.LabelField("Terrain Match Accuracy");
                        _track.terrainAccuracy = EditorGUILayout.Slider(_track.terrainAccuracy, 0, 5);
                        EditorGUILayout.EndVertical();

                        EditorGUILayout.BeginVertical("box");
                        EditorGUILayout.LabelField("Terrain Match Margin");
                        _track.terrainMergeMargin = EditorGUILayout.Slider(_track.terrainMergeMargin, 1, 5);
                        EditorGUILayout.EndVertical();

                        EditorGUILayout.BeginVertical("box");
                        EditorGUILayout.LabelField("Terrain Merge Curve");
                        _track.mergeCurve = EditorGUILayout.CurveField(_track.mergeCurve, GUILayout.Height(75));
                        EditorGUILayout.EndVertical();

                        if (_track.mergeTerrain == null)
                            EditorGUILayout.HelpBox("You have not selected a terrain in the scene", MessageType.Error);

                        if (_track.disconnectBoundary)
                            EditorGUILayout.HelpBox("Terrain Merge doesn't fully support tracks that have boundaries split", MessageType.Error);

                        EditorGUI.BeginDisabledGroup(_track.mergeTerrain == null);
                        if(GUILayout.Button("Merge Terrain", GUILayout.Height(50)))
                        {
                            if(_track.disconnectBoundary)
                            {
                                if (EditorUtility.DisplayDialog("Terrain Merge Warning", "Terrain Merge doesn't fully support tracks that have boundaries split", "Continue", "Cancel"))
                                {
                                    Undo.RecordObject(_track.mergeTerrain.terrainData, "Merge Terrain");
                                    TrackBuildRTerrain.MergeTerrain(_track, _track.mergeTerrain);
                                }
                            }
                            else
                            {
                                Undo.RecordObject(_track.mergeTerrain.terrainData, "Merge Terrain");
                                TrackBuildRTerrain.MergeTerrain(_track, _track.mergeTerrain);
                            }
                        }
                        EditorGUI.EndDisabledGroup();
                        EditorGUILayout.EndVertical();
                        break;

                    case TrackBuildR.terrainModes.conformTrack:

                        EditorGUILayout.BeginVertical("box");
                        Title("Conform Track to Terrain", TrackBuildRColours.RED);
                        EditorGUILayout.LabelField("Selected Terrain");
                        EditorGUILayout.BeginHorizontal();
                        _track.mergeTerrain = (Terrain)EditorGUILayout.ObjectField(_track.mergeTerrain, typeof(Terrain), true);
                        if(GUILayout.Button("Find Terrain"))
                            _track.mergeTerrain = GameObject.FindObjectOfType<Terrain>();
                        EditorGUILayout.EndHorizontal();

                        EditorGUILayout.Space();
                
                        EditorGUILayout.BeginVertical("box");
                        EditorGUILayout.LabelField("Track Conform Accuracy");
                        _track.conformAccuracy = EditorGUILayout.Slider(_track.conformAccuracy, 0, 25);
                        EditorGUILayout.EndVertical();

                        if (_track.mergeTerrain == null)
                            EditorGUILayout.HelpBox("You have not selected a terrain in the scene", MessageType.Error);

                        EditorGUI.BeginDisabledGroup(_track.mergeTerrain == null);
                        if(GUILayout.Button("Conform Track", GUILayout.Height(50)))
                        {
                            Undo.RecordObject(_track, "Conform Track");
                            TrackBuildRTerrain.ConformTrack(_track, _track.mergeTerrain);
                        }
                        EditorGUI.EndDisabledGroup();
                        EditorGUILayout.EndVertical();

                        break;
                }

                break;

            case TrackBuildR.modes.stunt:
                
                EditorGUILayout.Space();
                Title("Stunt", TrackBuildRColours.RED);

                if(_track.realNumberOfPoints == 0)
                {
                    EditorGUILayout.HelpBox("No Track to Apply Parts to",MessageType.Error);
                    return;
                }

                EditorGUILayout.BeginHorizontal("box");
                EditorGUILayout.LabelField("Stunt Part Type");
                _trackBuildR.stuntMode = (TrackBuildR.stuntModes)EditorGUILayout.EnumPopup(_trackBuildR.stuntMode, GUILayout.Width(160), GUILayout.Height(30));
                EditorGUILayout.EndHorizontal();

                switch(_trackBuildR.stuntMode)
                {
                    case TrackBuildR.stuntModes.loop:
                        EditorGUILayout.BeginHorizontal();
                        EditorGUILayout.LabelField("Loop Radius");
                        _track.loopRadius = EditorGUILayout.Slider(_track.loopRadius, 10, 100);
                        EditorGUILayout.EndHorizontal();
                        if(GUILayout.Button("Add Loop da Loop"))
                        {
                            Undo.RecordObject(_track, "Add Loop");
                            TrackBuildRStuntUtil.AddLoop(_track, selectedPointIndex);
                            GUI.changed = true;
                        }
                        break;

                    case TrackBuildR.stuntModes.jump:


                        EditorGUILayout.BeginHorizontal();
                        EditorGUILayout.LabelField("Jump Height Radius");
                        _track.jumpHeight = EditorGUILayout.Slider(_track.jumpHeight, 0, 50);
                        EditorGUILayout.EndHorizontal();


                        EditorGUILayout.BeginHorizontal();
                        EditorGUILayout.LabelField("Maximum Jump Length");
                        _track.maxJumpLength = EditorGUILayout.Slider(_track.maxJumpLength, 1, 100);
                        EditorGUILayout.EndHorizontal();

                        if (GUILayout.Button("Add Jump to Point"))
                        {
                            //                    Undo.RecordObject(_track, "Add Jump");
                            TrackBuildRStuntUtil.AddJump(_track, selectedPointIndex);
                            GUI.changed = true;
                        }

                        break;
                    case TrackBuildR.stuntModes.jumptwist:

                        EditorGUILayout.BeginHorizontal();
                        EditorGUILayout.LabelField("Jump Height Radius");
                        _track.jumpHeight = EditorGUILayout.Slider(_track.jumpHeight, 0, 50);
                        EditorGUILayout.EndHorizontal();
                        
                        EditorGUILayout.BeginHorizontal();
                        EditorGUILayout.LabelField("Maximum Jump Length");
                        _track.maxJumpLength = EditorGUILayout.Slider(_track.maxJumpLength, 1, 100);
                        EditorGUILayout.EndHorizontal();

                        EditorGUILayout.BeginHorizontal();
                        EditorGUILayout.LabelField("Jump Twist Angle");
                        _track.twistAngle = EditorGUILayout.Slider(_track.twistAngle, -90, 90);
                        EditorGUILayout.EndHorizontal();

                        if (GUILayout.Button("Add Jump Twist to Point"))
                        {
                            //                    Undo.RecordObject(_track, "Add Jump");
                            TrackBuildRStuntUtil.AddJumpTwist(_track, selectedPointIndex);
                            GUI.changed = true;
                        }

                        break;

//                        case TrackBuildR.stuntModes.twist:
//
//                         EditorGUILayout.BeginHorizontal();
//                        EditorGUILayout.LabelField("Twist Radius");
//                        _track.twistRadius = EditorGUILayout.Slider(_track.twistRadius, 0, 50);
//                        EditorGUILayout.EndHorizontal();
//
//                        
//                        EditorGUILayout.BeginHorizontal();
//                        EditorGUILayout.LabelField("Maximum Twist Length");
//                        _track.maxJumpLength = EditorGUILayout.Slider(_track.maxJumpLength, 1, 100);
//                        EditorGUILayout.EndHorizontal();
//
//                        if(GUILayout.Button("Add Twist to Point"))
//                        {
//                            //                    Undo.RecordObject(_track, "Add Jump");
//                            TrackBuildRStuntUtil.AddTwist(_track, selectedPointIndex);
//                            GUI.changed = true;
//                        }
//
//                        break;
                }




                break;

            case TrackBuildR.modes.diagram:

                _track.CheckDiagram();

                EditorGUILayout.Space();
                Title("Diagram Image", TrackBuildRColours.RED);

                _track.showDiagram = EditorGUILayout.Toggle("Show Diagram", _track.showDiagram);
                _track.diagramGO.GetComponent<Renderer>().enabled = _track.showDiagram;

                EditorGUILayout.BeginHorizontal();
                if(_track.diagramMaterial.mainTexture != null)
                {
                    float height = _track.diagramMaterial.mainTexture.height * (200.0f / _track.diagramMaterial.mainTexture.width);
                    GUILayout.Label(_track.diagramMaterial.mainTexture, GUILayout.Width(200), GUILayout.Height(height));
                }
                EditorGUILayout.BeginVertical();
                if(GUILayout.Button("Load Diagram"))
                {
                    string newDiagramFilepath = EditorUtility.OpenFilePanel("Load Track Diagram", "/", "");
                    if(newDiagramFilepath != _track.diagramFilepath)
                    {
                        _track.diagramFilepath = newDiagramFilepath;
                        WWW www = new WWW("file:///" + newDiagramFilepath);
                        Texture2D newTexture = new Texture2D(100, 100);
                        www.LoadImageIntoTexture(newTexture);
                        _track.diagramMaterial.mainTexture = newTexture;

                        _track.diagramGO.transform.localScale = new Vector3(newTexture.width, 0, newTexture.height);
                        _track.showDiagram = true;
                    }
                }
                if(GUILayout.Button("Clear"))
                {
                    _track.diagramFilepath = "";
                    _track.diagramMaterial.mainTexture = null;
                    _track.showDiagram = false;
                }


                GUILayout.Space(20);
                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Diagram Scale", GUILayout.Width(100));
                float newScale = EditorGUILayout.FloatField(_track.scale, GUILayout.Width(40));
                if(_track.scale != newScale)
                {
                    _track.scale = newScale;
                    UpdateDiagram(_track);
                }
                EditorGUILayout.LabelField("metres", GUILayout.Width(50));
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.BeginHorizontal();
                if(_track.assignedPoints == 0)
                {
                    if(GUILayout.Button("Draw Scale"))
                    {
                        _track.assignedPoints = 1;
                    }
                    if(GUILayout.Button("?", GUILayout.Width(25)))
                    {
                        EditorUtility.DisplayDialog("Draw Scale", "Once you load a diagram, use this to define the start and end of the diagram scale (I do hope your diagram has a scale...)", "ok");
                    }
                }
                else
                {
                    if(GUILayout.Button("Cancel Draw Scale"))
                    {
                        _track.assignedPoints = 0;
                    }
                }
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.EndVertical();
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.LabelField(_track.diagramFilepath);


                break;

            case TrackBuildR.modes.options:

                EditorGUILayout.Space();
                Title("Generation Options", TrackBuildRColours.RED);

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Render Track");
                _track.render = EditorGUILayout.Toggle(_track.render, GUILayout.Width(15));
                EditorGUILayout.EndHorizontal();

                //Toggle showing the wireframe when we have selected the model.
                EditorGUILayout.BeginHorizontal(GUILayout.Width(400));
                EditorGUILayout.LabelField("Show Wireframe");
                _track.showWireframe = EditorGUILayout.Toggle(_track.showWireframe, GUILayout.Width(15));
                EditorGUILayout.EndHorizontal();

                //Lightmap rendering
                EditorGUILayout.BeginHorizontal(GUILayout.Width(400));
                EditorGUI.BeginDisabledGroup(_trackBuildR.lightmapGenerated);
                if(GUILayout.Button("Build Lightmap UVs", GUILayout.Height(38)))
                {
                    Undo.RecordObject(_trackBuildR, "Build Lightmap UVs");
                    _trackBuildR.GenerateSecondaryUVSet();
                    GUI.changed = false;
                }
                EditorGUI.EndDisabledGroup();
                if(!_trackBuildR.lightmapGenerated)
                    EditorGUILayout.HelpBox("The model doesn't have lightmap UVs", MessageType.Warning);
                EditorGUILayout.EndHorizontal();

                //Mesh Optimisation
                EditorGUILayout.BeginHorizontal(GUILayout.Width(400));
                EditorGUI.BeginDisabledGroup(_trackBuildR.optimised);
                if(GUILayout.Button("Optimise Mesh For Runtime", GUILayout.Height(38)))
                {
                    Undo.RecordObject(_trackBuildR, "Optimise Meshes");
                    _trackBuildR.OptimseMeshes();
                    GUI.changed = false;
                }
                EditorGUI.EndDisabledGroup();
                if(!_trackBuildR.optimised)
                    EditorGUILayout.HelpBox("The model is currently fully optimised for runtime", MessageType.Warning);
                EditorGUILayout.EndHorizontal();

                if(GUILayout.Button("Force Full Rebuild of Track"))
                    _trackBuildR.ForceFullRecalculation();

                break;

            case TrackBuildR.modes.export:
                TrackBuildRExport.InspectorGUI(_trackBuildR);
                break;
        }

        GUILayout.EndVertical();
    }
    private static void RenderPreview(TrackBuildR _trackBuildR)
    {
        if (!SystemInfo.supportsRenderTextures)
            return;

        if (EditorApplication.isPlaying)
            return;

        TrackBuildRTrack _track = _trackBuildR.track;
        if (_track.realNumberOfPoints < 2)
            return;

        if (pointPreviewTexture == null)
            pointPreviewTexture = new RenderTexture(previewResolution, Mathf.RoundToInt(previewResolution / aspect), 24, RenderTextureFormat.Default);

        float previewpercent = (_trackBuildR.previewPercentage + _trackBuildR.previewStartPoint) % 1.0f;
        if(!_trackBuildR.previewForward) previewpercent = 1.0f - previewpercent;

        _track.diagramGO.GetComponent<Renderer>().enabled = false;
        GameObject trackEditorPreview = _trackBuildR.trackEditorPreview;
        Vector3 trackUp = _track.GetTrackUp(previewpercent) * Vector3.forward;
        Vector3 trackDirection = _track.GetTrackDirection(previewpercent);
        if (!_trackBuildR.previewForward) trackDirection = -trackDirection;
        trackEditorPreview.transform.position = _track.GetTrackPosition(previewpercent) + (previewCameraHeight.y * trackUp) + _trackBuildR.transform.position;
        trackEditorPreview.transform.rotation = Quaternion.LookRotation(trackDirection, trackUp);
        trackEditorPreview.GetComponent<Camera>().targetTexture = pointPreviewTexture;
        trackEditorPreview.GetComponent<Camera>().Render();
        trackEditorPreview.GetComponent<Camera>().targetTexture = null;
        _track.diagramGO.GetComponent<Renderer>().enabled = _track.showDiagram;
        
        GUILayout.Label("", GUILayout.Width(400), GUILayout.Height(225));
        Rect guiRect = GUILayoutUtility.GetLastRect();
        GUI.DrawTexture(guiRect, pointPreviewTexture, ScaleMode.ScaleToFit, false);

        EditorGUILayout.BeginHorizontal();
        string trackForwardText = _trackBuildR.previewForward ? "Track Preivew Direction Forward >>" : "<< Track Preivew Direction Backward";
        if(GUILayout.Button(trackForwardText))
            _trackBuildR.previewForward = !_trackBuildR.previewForward;
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.LabelField("Preview Track Percentage");
        EditorGUILayout.BeginHorizontal();
        _trackBuildR.previewPercentage = EditorGUILayout.Slider(_trackBuildR.previewPercentage, 0, 1);
        EditorGUILayout.LabelField("0-1", GUILayout.Width(25));
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.LabelField("Preview Track Start Point");
        EditorGUILayout.BeginHorizontal();
        _trackBuildR.previewStartPoint = EditorGUILayout.Slider(_trackBuildR.previewStartPoint, 0, 1);
        EditorGUILayout.LabelField("0-1", GUILayout.Width(25));
        EditorGUILayout.EndHorizontal();
    }
Ejemplo n.º 7
0
    public static void InspectorGUI(TrackBuildR track)
    {
        TrackBuildRTrack trackData = track.track;

        const int guiWidth    = 400;
        const int textWidth   = 348;
        const int toggleWidth = 25;
        const int helpWidth   = 20;

        CURRENT_TRANSFORM = track.transform;
        EditorGUILayout.Space();
        EditorGUILayout.Space();
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Filename", GUILayout.Width(225));
        track.exportFilename = EditorGUILayout.TextField(track.exportFilename, GUILayout.Width(175));
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.Space();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Filetype", GUILayout.Width(350));
        track.fileType = (TrackBuildR.fileTypes)EditorGUILayout.EnumPopup(track.fileType, GUILayout.Width(50));
        switch (track.fileType)
        {
        case TrackBuildR.fileTypes.Obj:
            FILE_EXTENTION = ".obj";
            break;

        case TrackBuildR.fileTypes.Fbx:
            FILE_EXTENTION = ".fbx";
            break;
        }
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.Space();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Copy Textures into Export Folder", GUILayout.Width(textWidth));
        track.copyTexturesIntoExportFolder = EditorGUILayout.Toggle(track.copyTexturesIntoExportFolder, GUILayout.Width(toggleWidth));
        if (GUILayout.Button("?", GUILayout.Width(helpWidth)))
        {
            string helpTitle = "Help - Copy Textures into Export Folder";
            string helpBody  = "Check this box if you want to copy the textures you are using into the export folder." +
                               "\nThis is useful if you plan to use the exported model elsewhere. Having the model and the textures in one folder will allow you to move this model with ease.";
            EditorUtility.DisplayDialog(helpTitle, helpBody, "close");
        }
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Export Collider");
//        track.exportSimpleCollider = EditorGUILayout.Toggle(track.exportSimpleCollider, GUILayout.Width(toggleWidth));
        track.exportCollider = EditorGUILayout.Toggle(track.exportCollider, GUILayout.Width(toggleWidth));
        if (GUILayout.Button("?", GUILayout.Width(helpWidth)))
        {
            string helpTitle = "Help - Export Collider Mesh";
            string helpBody  = "Check this box if you wish to generate a trackCollider mesh for your model." +
                               "\nThis will generate a mesh to be used with colliders.";
            EditorUtility.DisplayDialog(helpTitle, helpBody, "close");
        }
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Export as Prefab", GUILayout.Width(textWidth));
        track.createPrefabOnExport = EditorGUILayout.Toggle(track.createPrefabOnExport, GUILayout.Width(toggleWidth));
        if (GUILayout.Button("?", GUILayout.Width(helpWidth)))
        {
            string helpTitle = "Help - Export as Prefab";
            string helpBody  = "Select this if you wish to create a prefab of your model." +
                               "\nThis is recommended if you're exporting a trackCollider so they will get packaged together.";
            EditorUtility.DisplayDialog(helpTitle, helpBody, "close");
        }
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.Space();

        bool usingSubstances  = false;
        int  numberOfTextures = trackData.numberOfTextures;

        for (int i = 0; i < numberOfTextures; i++)
        {
            TrackBuildRTexture texture = trackData.Texture(i);
            if (texture.type == TrackBuildRTexture.Types.Substance)
            {
                usingSubstances = true;
                break;
            }
        }
        if (usingSubstances)
        {
            EditorGUILayout.HelpBox("Model uses Substance textures." +
                                    "\nExporting model to " + track.fileType + " will lose references to this texture and it will be rendered white.",
                                    MessageType.Warning);
        }

        if (GUILayout.Button("Export", GUILayout.Width(guiWidth), GUILayout.Height(40)))
        {
            ExportModel(track);
        }

        EditorGUILayout.Space();
        if (GUILayout.Button("Export to XML"))
        {
            string defaultName = track.name;
            defaultName.Replace(" ", "_");
            string filepath = EditorUtility.SaveFilePanel("Export Track BuildR Track to XML", "Assets/TrackBuildR", defaultName, "xml");

            if (filepath != "")
            {
                using (StreamWriter sw = new StreamWriter(filepath))
                {
                    sw.Write(track.ToXML());//write out contents of data to XML
                }
            }
            AssetDatabase.Refresh();
        }
        if (GUILayout.Button("Import from XML"))
        {
            string xmlpath = EditorUtility.OpenFilePanel("Import Track BuildR Track from XML", "Assets/TrackBuildR/", "xml");
            if (xmlpath != "")
            {
                track.FromXML(xmlpath);
            }
        }
        if (GUILayout.Button("Import from KML"))
        {
            string xmlpath = EditorUtility.OpenFilePanel("Import Google Earth KML", "Assets/TrackBuildR/", "kml");
            if (xmlpath != "")
            {
                track.FromKML(xmlpath);
            }
        }

        CURRENT_TRANSFORM = null;
    }
Ejemplo n.º 8
0
    private static void ExportModel(TrackBuildR track)
    {
        GameObject baseObject = new GameObject(track.exportFilename);

        baseObject.transform.position = CURRENT_TRANSFORM.position;
        baseObject.transform.rotation = CURRENT_TRANSFORM.rotation;
        EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.0f);
        track.ForceFullRecalculation();
        EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.1f);
        try
        {
            TrackBuildRTrack trackData = track.track;

            //check overwrites...
            string newDirectory = ROOT_FOLDER + track.exportFilename;
            if (!CreateFolder(newDirectory))
            {
                EditorUtility.ClearProgressBar();
                return;
            }

            EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.15f);

            int              numberOfCurves    = trackData.numberOfCurves;
            int              numberOfDynMeshes = 9;
            float            exportProgress    = 0.75f / (numberOfCurves * numberOfDynMeshes);
            ExportMaterial[] exportMaterials   = new ExportMaterial[1];
            ExportMaterial   exportTexture     = new ExportMaterial();

            TrackBuildRTexture[] textures = trackData.GetTexturesArray();
            int        textureCount       = textures.Length;
            Material[] materials          = new Material[textureCount];
            for (int t = 0; t < textureCount; t++)
            {
                TrackBuildRTexture texture = textures[t];
                if (!texture.isSubstance && !texture.isUSer)
                {
                    string materialPath = string.Format("{0}{1}/{2}.mat", ROOT_FOLDER, track.exportFilename, texture.customName);
                    if (File.Exists(materialPath))
                    {
                        Material mat = (Material)AssetDatabase.LoadAssetAtPath(materialPath, typeof(Material));
                        EditorUtility.CopySerialized(texture.material, mat);
                        AssetDatabase.SaveAssets();
                        materials[t] = mat;
                        continue;
                    }
                    Material tempMat = Object.Instantiate(texture.material);
                    AssetDatabase.CreateAsset(tempMat, materialPath);
                    materials[t] = (Material)AssetDatabase.LoadAssetAtPath(materialPath, typeof(Material));
                }
                else
                {
                    materials[t] = texture.isUSer ? texture.userMaterial : texture.proceduralMaterial;
                }
            }

            string[] dynNames      = { "track", "bumper", "boundary", "bottom", "offroad", "trackCollider" };
            string[] colliderNames = { "track collider", "wall collider", "offroad collider", "bumper collider" };
            for (int c = 0; c < numberOfCurves; c++)
            {
                TrackBuildRPoint curve = trackData[c];

                DynamicMesh[] dynMeshes = new DynamicMesh[numberOfDynMeshes];
                dynMeshes[0] = curve.dynamicTrackMesh;
                dynMeshes[1] = curve.dynamicBumperMesh;
                dynMeshes[2] = curve.dynamicBoundaryMesh;
                dynMeshes[3] = curve.dynamicBottomMesh;
                dynMeshes[4] = curve.dynamicOffroadMesh;
                dynMeshes[5] = curve.dynamicColliderMesh1; //track surface
                dynMeshes[6] = curve.dynamicColliderMesh2; //walls and roof
                dynMeshes[7] = curve.dynamicColliderMesh3; //track bottom and offroad
                dynMeshes[8] = curve.dynamicColliderMesh4; //bumpers

                int[]            textureIndeices = { curve.trackTextureStyleIndex, curve.bumperTextureStyleIndex, curve.boundaryTextureStyleIndex, curve.bottomTextureStyleIndex, curve.offroadTextureStyleIndex, 0 };
                PhysicMaterial[] physicMaterials = { trackData.Texture(curve.trackTextureStyleIndex).physicMaterial, trackData.Texture(curve.boundaryTextureStyleIndex).physicMaterial, trackData.Texture(curve.offroadTextureStyleIndex).physicMaterial, trackData.Texture(curve.bumperTextureStyleIndex).physicMaterial };

                for (int d = 0; d < numberOfDynMeshes; d++)
                {
                    int textureIndex = Mathf.Clamp(d, 0, 5);
                    if (EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "Exporting Track Curve " + c + " " + dynNames[textureIndex], 0.15f + exportProgress * (c * numberOfDynMeshes + d)))
                    {
                        EditorUtility.ClearProgressBar();
                        return;
                    }

                    DynamicMesh exportDynMesh = dynMeshes[d];
//                    if(track.includeTangents || exportDynMesh.isEmpty)
//                        exportDynMesh.Build();//rebuild with tangents

                    TrackBuildRTexture texture = trackData.Texture(textureIndeices[textureIndex]);
                    exportTexture.name      = texture.customName;
                    exportTexture.material  = texture.material;
                    exportTexture.generated = false;
                    exportTexture.filepath  = texture.filePath;
                    exportMaterials[0]      = exportTexture;

                    Material mat = materials[textureIndeices[textureIndex]];

                    int    meshCount = exportDynMesh.meshCount;
                    Mesh[] meshes    = exportDynMesh.meshes;
                    for (int i = 0; i < meshCount; i++)
                    {
                        Mesh exportMesh = meshes[i];
                        MeshUtility.Optimize(exportMesh);
                        string filenameSuffix = trackModelName(dynNames[textureIndex], c, (meshCount > 1) ? i : -1); // "trackCurve" + c + ((meshCount > 1) ? "_" + i.ToString() : "");
                        if (d > 4)                                                                                   //colliders
                        {
                            filenameSuffix = string.Format("{0}_{1}", filenameSuffix, (d % 5));
                        }
                        string filename = track.exportFilename + filenameSuffix;
                        Export(filename, ROOT_FOLDER + track.exportFilename + "/", track, exportMesh, exportMaterials);

                        if (track.createPrefabOnExport)
                        {
                            AssetDatabase.Refresh();//ensure the database is up to date...

                            string modelFilePath = ROOT_FOLDER + track.exportFilename + "/" + filename + FILE_EXTENTION;
                            if (d < numberOfDynMeshes - 4)
                            {
                                GameObject newModel = (GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadMainAssetAtPath(modelFilePath));
                                newModel.name                    = filename;
                                newModel.transform.parent        = baseObject.transform;
                                newModel.transform.localPosition = Vector3.zero;
                                newModel.transform.localRotation = Quaternion.identity;

                                MeshRenderer[] renders = newModel.GetComponentsInChildren <MeshRenderer>();
                                foreach (MeshRenderer rend in renders)
                                {
                                    rend.material = mat;
                                }
                            }
                            else
                            {
                                int          colliderIndex  = d - (numberOfDynMeshes - 4);
                                GameObject   colliderObject = new GameObject(colliderNames[colliderIndex]);
                                MeshCollider collider       = colliderObject.AddComponent <MeshCollider>();
                                collider.sharedMesh                    = (Mesh)AssetDatabase.LoadAssetAtPath(modelFilePath, typeof(Mesh));
                                collider.material                      = physicMaterials[colliderIndex];
                                colliderObject.transform.parent        = baseObject.transform;
                                colliderObject.transform.localPosition = Vector3.zero;
                                colliderObject.transform.localRotation = Quaternion.identity;
                            }
                        }
                    }
                }
            }
            if (track.createPrefabOnExport)
            {
                string prefabPath = ROOT_FOLDER + track.exportFilename + "/" + track.exportFilename + ".prefab";
                Object prefab     = AssetDatabase.LoadAssetAtPath(prefabPath, typeof(GameObject));
                if (prefab == null)
                {
                    prefab = PrefabUtility.CreateEmptyPrefab(prefabPath);
                }
                PrefabUtility.ReplacePrefab(baseObject, prefab, ReplacePrefabOptions.ConnectToPrefab);
            }

            EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.70f);

            AssetDatabase.Refresh();//ensure the database is up to date...
        }
        catch (System.Exception e)
        {
            Debug.LogError("Track BuildR Export Error: " + e);
            EditorUtility.ClearProgressBar();
            AssetDatabase.Refresh();//ensure the database is up to date...
        }
        Object.DestroyImmediate(baseObject);
        EditorUtility.ClearProgressBar();
        EditorUtility.UnloadUnusedAssetsImmediate();
        AssetDatabase.Refresh();
    }
Ejemplo n.º 9
0
    void OnEnable()
    {
        if (target != null)
        {
            _trackBuildR = (TrackBuildR)target;
            _track       = _trackBuildR.track;
        }

        _stageToolbarTexturesA    = new Texture2D[numberOfMenuOptionsA];
        _stageToolbarTexturesA[0] = (Texture2D)Resources.Load("GUI/track");
        _stageToolbarTexturesA[1] = (Texture2D)Resources.Load("GUI/boundary");
        _stageToolbarTexturesA[2] = (Texture2D)Resources.Load("GUI/bumpers");
        _stageToolbarTexturesA[3] = (Texture2D)Resources.Load("GUI/textures");
        _stageToolbarTexturesA[4] = (Texture2D)Resources.Load("GUI/terrain");
        _stageToolbarTexturesB    = new Texture2D[numberOfMenuOptionsB];
        _stageToolbarTexturesB[0] = (Texture2D)Resources.Load("GUI/stunt");
        _stageToolbarTexturesB[1] = (Texture2D)Resources.Load("GUI/diagram");
        _stageToolbarTexturesB[2] = (Texture2D)Resources.Load("GUI/options");
        _stageToolbarTexturesB[3] = (Texture2D)Resources.Load("GUI/export");

        //Preview Camera
        if (_trackBuildR.trackEditorPreview != null)
        {
            DestroyImmediate(_trackBuildR.trackEditorPreview);
        }
        if (!EditorApplication.isPlaying && SystemInfo.supportsRenderTextures)
        {
            _trackBuildR.trackEditorPreview           = new GameObject("Track Preview Cam");
            _trackBuildR.trackEditorPreview.hideFlags = HideFlags.HideAndDontSave;
            _trackBuildR.trackEditorPreview.AddComponent <Camera>();
            _trackBuildR.trackEditorPreview.GetComponent <Camera>().fieldOfView = 80;
            _trackBuildR.trackEditorPreview.GetComponent <Camera>().depth       = -99999;
            //Retreive camera settings from the main camera
            Camera[] cams              = Camera.allCameras;
            bool     sceneHasCamera    = cams.Length > 0;
            Camera   sceneCamera       = null;
            Skybox   sceneCameraSkybox = null;
            if (Camera.main)
            {
                sceneCamera = Camera.main;
            }
            else if (sceneHasCamera)
            {
                sceneCamera = cams[0];
            }

            if (sceneCamera != null)
            {
                if (sceneCameraSkybox == null)
                {
                    sceneCameraSkybox = sceneCamera.GetComponent <Skybox>();
                }
            }
            if (sceneCamera != null)
            {
                _trackBuildR.trackEditorPreview.GetComponent <Camera>().backgroundColor = sceneCamera.backgroundColor;
                if (sceneCameraSkybox != null)
                {
                    _trackBuildR.trackEditorPreview.AddComponent <Skybox>().material = sceneCameraSkybox.material;
                }
                else
                if (RenderSettings.skybox != null)
                {
                    _trackBuildR.trackEditorPreview.AddComponent <Skybox>().material = RenderSettings.skybox;
                }
            }
        }
    }
Ejemplo n.º 10
0
    private static void ExportModel(TrackBuildR track)
    {
        GameObject baseObject = new GameObject(track.exportFilename);

        baseObject.transform.position = CURRENT_TRANSFORM.position;
        baseObject.transform.rotation = CURRENT_TRANSFORM.rotation;
        EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.0f);
        track.ForceFullRecalculation();
        EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.1f);
        try
        {
            TrackBuildRTrack trackData = track.track;

            //check overwrites...
            string newDirectory = ROOT_FOLDER + track.exportFilename;
            if (!CreateFolder(newDirectory))
            {
                EditorUtility.ClearProgressBar();
                return;
            }

            EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.15f);

            int              numberOfCurves  = trackData.numberOfCurves;
            float            exportProgress  = 0.75f / (numberOfCurves * 6.0f);
            ExportMaterial[] exportMaterials = new ExportMaterial[1];
            ExportMaterial   exportTexture   = new ExportMaterial();

            string[] dynNames = new [] { "track", "bumper", "boundary", "bottom", "offread", "trackCollider" };
            for (int c = 0; c < numberOfCurves; c++)
            {
                TrackBuildRPoint curve = trackData[c];

                int numberOfDynMeshes = 6;
                DynamicMeshGenericMultiMaterialMesh[] dynMeshes = new DynamicMeshGenericMultiMaterialMesh[6];
                dynMeshes[0] = curve.dynamicTrackMesh;
                dynMeshes[1] = curve.dynamicBumperMesh;
                dynMeshes[2] = curve.dynamicBoundaryMesh;
                dynMeshes[3] = curve.dynamicBottomMesh;
                dynMeshes[4] = curve.dynamicOffroadMesh;
                dynMeshes[5] = curve.dynamicColliderMesh;

                int[] textureIndeices = new int[] { curve.trackTextureStyleIndex, curve.bumperTextureStyleIndex, curve.boundaryTextureStyleIndex, curve.bottomTextureStyleIndex, curve.offroadTextureStyleIndex, 0 };

                for (int d = 0; d < numberOfDynMeshes; d++)
                {
                    if (EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "Exporting Track Curve " + c + " " + dynNames[d], 0.15f + exportProgress * (c * 6 + d)))
                    {
                        EditorUtility.ClearProgressBar();
                        return;
                    }
                    DynamicMeshGenericMultiMaterialMesh exportDynMesh = dynMeshes[d];
                    if (track.includeTangents || exportDynMesh.isEmpty)
                    {
                        exportDynMesh.Build(track.includeTangents);//rebuild with tangents
                    }
                    TrackBuildRTexture texture = trackData.Texture(textureIndeices[d]);
                    exportTexture.name      = texture.customName;
                    exportTexture.material  = texture.material;
                    exportTexture.generated = false;
                    exportTexture.filepath  = texture.filePath;
                    exportMaterials[0]      = exportTexture;

                    int meshCount = exportDynMesh.meshCount;
                    for (int i = 0; i < meshCount; i++)
                    {
                        Mesh exportMesh = exportDynMesh[i].mesh;
                        MeshUtility.Optimize(exportMesh);
                        string filenameSuffix = trackModelName(dynNames[d], c, (meshCount > 1) ? i : -1);// "trackCurve" + c + ((meshCount > 1) ? "_" + i.ToString() : "");
                        string filename       = track.exportFilename + filenameSuffix;
                        Export(filename, ROOT_FOLDER + track.exportFilename + "/", track, exportMesh, exportMaterials);

                        if (track.createPrefabOnExport)
                        {
                            AssetDatabase.Refresh();//ensure the database is up to date...

                            string modelFilePath = ROOT_FOLDER + track.exportFilename + "/" + filename + FILE_EXTENTION;
                            if (d < numberOfDynMeshes - 1)
                            {
                                GameObject newModel = (GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadMainAssetAtPath(modelFilePath));
                                newModel.name                    = filename;
                                newModel.transform.parent        = baseObject.transform;
                                newModel.transform.localPosition = Vector3.zero;
                                newModel.transform.localRotation = Quaternion.identity;
                            }
                            else
                            {
                                GameObject colliderObject = new GameObject("trackCollider");
                                colliderObject.AddComponent <MeshCollider>().sharedMesh = (Mesh)AssetDatabase.LoadAssetAtPath(modelFilePath, typeof(Mesh));
                                colliderObject.transform.parent        = baseObject.transform;
                                colliderObject.transform.localPosition = Vector3.zero;
                                colliderObject.transform.localRotation = Quaternion.identity;
                            }
                        }
                    }
                }
            }
            if (track.createPrefabOnExport)
            {
                string prefabPath = ROOT_FOLDER + track.exportFilename + "/" + track.exportFilename + ".prefab";
                Object prefab     = AssetDatabase.LoadAssetAtPath(prefabPath, typeof(GameObject));
                if (prefab == null)
                {
                    prefab = PrefabUtility.CreateEmptyPrefab(prefabPath);
                }
                PrefabUtility.ReplacePrefab(baseObject, prefab, ReplacePrefabOptions.ConnectToPrefab);
            }

            EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.70f);

            AssetDatabase.Refresh();//ensure the database is up to date...
        }
        catch (System.Exception e)
        {
            Debug.LogError("BuildR Export Error: " + e);
            EditorUtility.ClearProgressBar();
        }
        Object.DestroyImmediate(baseObject);
        EditorUtility.ClearProgressBar();
        EditorUtility.UnloadUnusedAssets();
        AssetDatabase.Refresh();
    }
Ejemplo n.º 11
0
 private static void Export(string filename, string folder, TrackBuildR data, Mesh exportMesh, ExportMaterial[] exportTextures)
 {
     switch (data.fileType)
     {
         case TrackBuildR.fileTypes.Obj:
             OBJExporter.Export(folder, filename, exportMesh, exportTextures, data.copyTexturesIntoExportFolder);
             break;
         case TrackBuildR.fileTypes.Fbx:
             FBXExporter.Export(folder, filename, exportMesh, exportTextures, data.copyTexturesIntoExportFolder);
             break;
     }
 }
Ejemplo n.º 12
0
    private static void ExportCollider(TrackBuildR data)
    {
        DynamicMesh COL_MESH = new DynamicMesh();
//        COL_MESH.subMeshCount = data.textures.Count;
//        BuildrBuildingCollider.Build(COL_MESH, data);
//        COL_MESH.CollapseSubmeshes();
        COL_MESH.Build();

        ExportMaterial[] exportTextures = new ExportMaterial[1];
        ExportMaterial newTexture = new ExportMaterial();
        newTexture.name = "blank";
        newTexture.filepath = "";
        newTexture.generated = true;
        exportTextures[0] = newTexture;

        int numberOfColliderMeshes = COL_MESH.meshCount;
        Mesh[] meshes = COL_MESH.meshes;
        for (int i = 0; i < numberOfColliderMeshes; i++)
        {
            MeshUtility.Optimize(meshes[i]);
            string ColliderSuffixIndex = ((numberOfColliderMeshes > 1) ? "_" + i : "");
            string ColliderFileName = data.exportFilename + COLLIDER_SUFFIX + ColliderSuffixIndex;
            string ColliderFolder = ROOT_FOLDER + data.exportFilename + "/";
            Export(ColliderFileName, ColliderFolder, data, meshes[i], exportTextures);
        }

        //string newDirectory = rootFolder+track.exportFilename;
        //if(!CreateFolder(newDirectory))
        //	return;
//        ExportMaterial[] exportTextures = new ExportMaterial[1];
//        ExportMaterial newTexture = new ExportMaterial();
//        newTexture.customName = "";
//        newTexture.filepath = "";
//        newTexture.generated = true;
//        exportTextures[0] = newTexture;
//        Export(track.exportFilename + COLLIDER_SUFFIX, ROOT_FOLDER + track.exportFilename + "/", track, EXPORT_MESH, exportTextures);
//
//        COL_MESH = null;
//        EXPORT_MESH = null;
    }
Ejemplo n.º 13
0
    public static void InspectorGUI(TrackBuildR track)
    {
        TrackBuildRTrack trackData = track.track;

        const int guiWidth = 400;
        const int textWidth = 348;
        const int toggleWidth = 25;
        const int helpWidth = 20;

        CURRENT_TRANSFORM = track.transform;
        EditorGUILayout.Space();
        EditorGUILayout.Space();
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Filename", GUILayout.Width(225));
        track.exportFilename = EditorGUILayout.TextField(track.exportFilename, GUILayout.Width(175));
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.Space();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Filetype", GUILayout.Width(350));
        track.fileType = (TrackBuildR.fileTypes)EditorGUILayout.EnumPopup(track.fileType, GUILayout.Width(50));
        switch (track.fileType)
        {
            case TrackBuildR.fileTypes.Obj:
                FILE_EXTENTION = ".obj";
                break;
            case TrackBuildR.fileTypes.Fbx:
                FILE_EXTENTION = ".fbx";
                break;
        }
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.Space();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Copy Textures into Export Folder", GUILayout.Width(textWidth));
        track.copyTexturesIntoExportFolder = EditorGUILayout.Toggle(track.copyTexturesIntoExportFolder, GUILayout.Width(toggleWidth));
        if (GUILayout.Button("?", GUILayout.Width(helpWidth)))
        {
            string helpTitle = "Help - Copy Textures into Export Folder";
            string helpBody = "Check this box if you want to copy the textures you are using into the export folder." +
                "\nThis is useful if you plan to use the exported model elsewhere. Having the model and the textures in one folder will allow you to move this model with ease.";
            EditorUtility.DisplayDialog(helpTitle, helpBody, "close");
        }
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Export Collider");
//        track.exportSimpleCollider = EditorGUILayout.Toggle(track.exportSimpleCollider, GUILayout.Width(toggleWidth));
        track.exportCollider = EditorGUILayout.Toggle(track.exportCollider, GUILayout.Width(toggleWidth));
        if (GUILayout.Button("?", GUILayout.Width(helpWidth)))
        {
            string helpTitle = "Help - Export Collider Mesh";
            string helpBody = "Check this box if you wish to generate a trackCollider mesh for your model." +
                "\nThis will generate a mesh to be used with colliders.";
            EditorUtility.DisplayDialog(helpTitle, helpBody, "close");
        }
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Export as Prefab", GUILayout.Width(textWidth));
        track.createPrefabOnExport = EditorGUILayout.Toggle(track.createPrefabOnExport, GUILayout.Width(toggleWidth));
        if (GUILayout.Button("?", GUILayout.Width(helpWidth)))
        {
            string helpTitle = "Help - Export as Prefab";
            string helpBody = "Select this if you wish to create a prefab of your model." +
                "\nThis is recommended if you're exporting a trackCollider so they will get packaged together.";
            EditorUtility.DisplayDialog(helpTitle, helpBody, "close");
        }
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.Space();

        bool usingSubstances = false;
        int numberOfTextures = trackData.numberOfTextures;
        for(int i = 0; i < numberOfTextures; i++)
        {
            TrackBuildRTexture texture = trackData.Texture(i);
            if(texture.type == TrackBuildRTexture.Types.Substance)
            {
                usingSubstances = true;
                break;
            }
        }
        if (usingSubstances)
        {
            EditorGUILayout.HelpBox("Model uses Substance textures." +
                "\nExporting model to " + track.fileType + " will lose references to this texture and it will be rendered white.",
                MessageType.Warning);
        }

        if (GUILayout.Button("Export", GUILayout.Width(guiWidth), GUILayout.Height(40)))
        {
            ExportModel(track);
        }

        EditorGUILayout.Space();
        if(GUILayout.Button("Export to XML"))
        {
            string defaultName = track.name;
            defaultName.Replace(" ", "_");
            string filepath = EditorUtility.SaveFilePanel("Export Track BuildR Track to XML", "Assets/TrackBuildR", defaultName, "xml");

            if (filepath != "")
            {
                using (StreamWriter sw = new StreamWriter(filepath))
                {
                    sw.Write(track.ToXML());//write out contents of data to XML
                }
            }
            AssetDatabase.Refresh();
        }
        if (GUILayout.Button("Import from XML"))
        {
            string xmlpath = EditorUtility.OpenFilePanel("Import Track BuildR Track from XML", "Assets/TrackBuildR/", "xml");
            if (xmlpath != "")
                track.FromXML(xmlpath);
        }
        if (GUILayout.Button("Import from KML"))
        {
            string xmlpath = EditorUtility.OpenFilePanel("Import Google Earth KML", "Assets/TrackBuildR/", "kml");
            if (xmlpath != "")
                track.FromKML(xmlpath);
        }

        CURRENT_TRANSFORM = null;
    }
Ejemplo n.º 14
0
    private static void ExportModel(TrackBuildR track)
    {
        GameObject baseObject = new GameObject(track.exportFilename);
        baseObject.transform.position = CURRENT_TRANSFORM.position;
        baseObject.transform.rotation = CURRENT_TRANSFORM.rotation;
        EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.0f);
        track.ForceFullRecalculation();
        EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.1f);
        try
        {
            TrackBuildRTrack trackData = track.track;

            //check overwrites...
            string newDirectory = ROOT_FOLDER + track.exportFilename;
            if(!CreateFolder(newDirectory))
            {
                EditorUtility.ClearProgressBar();
                return;
            }

            EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.15f);

            int numberOfCurves = trackData.numberOfCurves;
            int numberOfDynMeshes = 9;
            float exportProgress = 0.75f / (numberOfCurves * numberOfDynMeshes);
            ExportMaterial[] exportMaterials = new ExportMaterial[1];
            ExportMaterial exportTexture = new ExportMaterial();
            
            TrackBuildRTexture[] textures = trackData.GetTexturesArray();
            int textureCount = textures.Length;
            Material[] materials = new Material[textureCount];
            for (int t = 0; t < textureCount; t++)
            {
                TrackBuildRTexture texture = textures[t];
                if (!texture.isSubstance && !texture.isUSer)
                {
                    string materialPath = string.Format("{0}{1}/{2}.mat", ROOT_FOLDER, track.exportFilename, texture.customName);
                    if(File.Exists(materialPath))
                    {
                        Material mat = (Material)AssetDatabase.LoadAssetAtPath(materialPath, typeof(Material));
                        EditorUtility.CopySerialized(texture.material, mat);
                        AssetDatabase.SaveAssets();
                        materials[t] = mat;
                        continue;
                    }
                    Material tempMat = Object.Instantiate(texture.material);
                    AssetDatabase.CreateAsset(tempMat, materialPath);
                    materials[t] = (Material)AssetDatabase.LoadAssetAtPath(materialPath, typeof(Material));
                }
                else
                {
                    materials[t] = texture.isUSer ? texture.userMaterial : texture.proceduralMaterial;
                }
            }

            string[] dynNames = {"track","bumper","boundary","bottom","offroad","trackCollider"};
            string[] colliderNames = { "track collider", "wall collider", "offroad collider", "bumper collider" };
            for (int c = 0; c < numberOfCurves; c++)
            {
                TrackBuildRPoint curve = trackData[c];

                DynamicMesh[] dynMeshes = new DynamicMesh[numberOfDynMeshes];
                dynMeshes[0] = curve.dynamicTrackMesh;
                dynMeshes[1] = curve.dynamicBumperMesh;
                dynMeshes[2] = curve.dynamicBoundaryMesh;
                dynMeshes[3] = curve.dynamicBottomMesh;
                dynMeshes[4] = curve.dynamicOffroadMesh;
                dynMeshes[5] = curve.dynamicColliderMesh1;//track surface
                dynMeshes[6] = curve.dynamicColliderMesh2;//walls and roof
                dynMeshes[7] = curve.dynamicColliderMesh3;//track bottom and offroad
                dynMeshes[8] = curve.dynamicColliderMesh4;//bumpers

                int[] textureIndeices = { curve.trackTextureStyleIndex ,curve.bumperTextureStyleIndex, curve.boundaryTextureStyleIndex, curve.bottomTextureStyleIndex, curve.offroadTextureStyleIndex, 0};
                PhysicMaterial[] physicMaterials = { trackData.Texture(curve.trackTextureStyleIndex).physicMaterial, trackData.Texture(curve.boundaryTextureStyleIndex).physicMaterial, trackData.Texture(curve.offroadTextureStyleIndex).physicMaterial, trackData.Texture(curve.bumperTextureStyleIndex).physicMaterial };

                for (int d = 0; d < numberOfDynMeshes; d++)
                {
                    int textureIndex = Mathf.Clamp(d, 0, 5);
                    if (EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "Exporting Track Curve " + c + " " + dynNames[textureIndex], 0.15f + exportProgress * (c * numberOfDynMeshes + d)))
                    {
                        EditorUtility.ClearProgressBar();
                        return;
                    }

                    DynamicMesh exportDynMesh = dynMeshes[d];
//                    if(track.includeTangents || exportDynMesh.isEmpty)
//                        exportDynMesh.Build();//rebuild with tangents

                    TrackBuildRTexture texture = trackData.Texture(textureIndeices[textureIndex]);
                    exportTexture.name = texture.customName;
                    exportTexture.material = texture.material;
                    exportTexture.generated = false;
                    exportTexture.filepath = texture.filePath;
                    exportMaterials[0] = exportTexture;

                    Material mat = materials[textureIndeices[textureIndex]];

                    int meshCount = exportDynMesh.meshCount;
                    Mesh[] meshes = exportDynMesh.meshes;
                    for (int i = 0; i < meshCount; i++)
                    {
                        Mesh exportMesh = meshes[i];
                        MeshUtility.Optimize(exportMesh);
                        string filenameSuffix = trackModelName(dynNames[textureIndex], c, (meshCount > 1) ? i : -1);// "trackCurve" + c + ((meshCount > 1) ? "_" + i.ToString() : "");
                        if(d > 4)//colliders
                            filenameSuffix = string.Format("{0}_{1}", filenameSuffix, (d % 5));
                        string filename = track.exportFilename + filenameSuffix;
                        Export(filename, ROOT_FOLDER + track.exportFilename + "/", track, exportMesh, exportMaterials);

                        if(track.createPrefabOnExport)
                        {
                            AssetDatabase.Refresh();//ensure the database is up to date...

                            string modelFilePath = ROOT_FOLDER + track.exportFilename + "/" + filename + FILE_EXTENTION;
                            if(d < numberOfDynMeshes - 4)
                            {
                                GameObject newModel = (GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadMainAssetAtPath(modelFilePath));
                                newModel.name = filename;
                                newModel.transform.parent = baseObject.transform;
                                newModel.transform.localPosition = Vector3.zero;
                                newModel.transform.localRotation = Quaternion.identity;

                                MeshRenderer[] renders = newModel.GetComponentsInChildren<MeshRenderer>();
                                foreach(MeshRenderer rend in renders)
                                    rend.material = mat;
                            }
                            else
                            {
                                int colliderIndex = d - (numberOfDynMeshes - 4);
                                GameObject colliderObject = new GameObject(colliderNames[colliderIndex]);
                                MeshCollider collider = colliderObject.AddComponent<MeshCollider>();
                                collider.sharedMesh = (Mesh)AssetDatabase.LoadAssetAtPath(modelFilePath, typeof(Mesh));
                                collider.material = physicMaterials[colliderIndex];
                                colliderObject.transform.parent = baseObject.transform;
                                colliderObject.transform.localPosition = Vector3.zero;
                                colliderObject.transform.localRotation = Quaternion.identity;
                            }
                        }
                    }

                }
            }
            if(track.createPrefabOnExport)
            {
                string prefabPath = ROOT_FOLDER + track.exportFilename + "/" + track.exportFilename + ".prefab";
                Object prefab = AssetDatabase.LoadAssetAtPath(prefabPath, typeof(GameObject));
                if(prefab == null)
                    prefab = PrefabUtility.CreateEmptyPrefab(prefabPath);
                PrefabUtility.ReplacePrefab(baseObject, prefab, ReplacePrefabOptions.ConnectToPrefab);
            }

            EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.70f);

            AssetDatabase.Refresh();//ensure the database is up to date...


        }
        catch(System.Exception e)
        {
            Debug.LogError("Track BuildR Export Error: "+e);
            EditorUtility.ClearProgressBar();
            AssetDatabase.Refresh();//ensure the database is up to date...
        }
        Object.DestroyImmediate(baseObject);
        EditorUtility.ClearProgressBar();
        EditorUtility.UnloadUnusedAssetsImmediate();
        AssetDatabase.Refresh();
    }