Ejemplo n.º 1
0
    public static void InspectorGUI(BuildrEditMode _editMode, BuildrData _data)
    {
        editMode    = _editMode;
        data        = _data;
        constraints = data.generatorConstraints;

        EditModes newmode = (EditModes)EditorGUILayout.EnumPopup(mode);

        if (newmode != mode)
        {
            mode = newmode;
            switch (mode)
            {
            case EditModes.general:
                editMode.stage = BuildrEditMode.stages.building;
                break;

            case EditModes.floorplan:
                editMode.stage = BuildrEditMode.stages.floorplan;
                editMode.SetMode(BuildrEditMode.modes.floorplan);
                break;
            }
        }

        switch (mode)
        {
        case EditModes.general:
            GeneralOptionsInspector();
            break;

        case EditModes.floorplan:
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("Constrain Building Generation to Floorplan", GUILayout.Width(280));
            constraints.constrainPlanByPlan = EditorGUILayout.Toggle(constraints.constrainPlanByPlan);
            EditorGUILayout.EndHorizontal();
            EditorGUI.BeginDisabledGroup(!constraints.constrainPlanByPlan);
            BuildrEditModeFloorplan.InspectorGUI(editMode, _data.plan);
            EditorGUI.EndDisabledGroup();

            if (data.plan != null)
            {
                constraints.plan = data.plan.Duplicate();
            }
            break;
        }

        if (GUI.changed)
        {
            EditorUtility.SetDirty(_editMode);
            EditorUtility.SetDirty(_data);
            _editMode.UpdateRender();
        }
    }
Ejemplo n.º 2
0
    void OnSceneGUI()
    {
        if (SceneView.focusedWindow == null)
        {
            return;
        }

        if (_data == null)
        {
            _data = _editMode.data;
            return;
        }

        _position   = _editMode.transform.position;
        _handleSize = HandleUtility.GetHandleSize(_position);

        if (_editMode.alwaysSnap)
        {
            _shouldSnap = true;
        }
        else
        {
            _shouldSnap = Event.current.shift;
        }

        if (_data.editing)
        {
            switch (_editMode.stage)
            {
            case BuildrEditMode.stages.floorplan:
                BuildrEditModeFloorplan.SceneGUI(_editMode, _data.plan, _shouldSnap, _handleSize);
                break;

            case BuildrEditMode.stages.building:
                BuildrEditModeHUD.SceneGUI(_editMode, _data, _shouldSnap, _handleSize);
                BuildrEditModeBuilding.SceneGUI(_editMode, _data, _shouldSnap, _handleSize);
                break;

            case BuildrEditMode.stages.facades:
                BuildrEditModeHUD.SceneGUI(_editMode, _data, _shouldSnap, _handleSize);
                break;

            case BuildrEditMode.stages.textures:
                BuildrEditModeHUD.SceneGUI(_editMode, _data, _shouldSnap, _handleSize);
                BuildrEditModeTextures.SceneGUI(_editMode, _data, _shouldSnap, _handleSize);
                break;

            case BuildrEditMode.stages.roofs:
                BuildrEditModeHUD.SceneGUI(_editMode, _data, _shouldSnap, _handleSize);
                break;

            case BuildrEditMode.stages.details:
                BuildrEditModeHUD.SceneGUI(_editMode, _data, _shouldSnap, _handleSize);
                BuildrEditModeDetails.SceneGUI(_editMode, _data, _shouldSnap, _handleSize);
                break;

            case BuildrEditMode.stages.interior:
                BuildrEditModeHUD.SceneGUI(_editMode, _data, _shouldSnap, _handleSize);
                BuildrEditModeInterior.SceneGUI(_editMode, _data, _shouldSnap, _handleSize);
                break;

            case BuildrEditMode.stages.options:
                BuildrEditModeHUD.SceneGUI(_editMode, _data, _shouldSnap, _handleSize);
                break;

            case BuildrEditMode.stages.export:
                BuildrEditModeHUD.SceneGUI(_editMode, _data, _shouldSnap, _handleSize);
                break;
            }
        }
        else
        {
            BuildrGenerateModeEditor.SceneGUI(_editMode, _data, _shouldSnap, _handleSize);
        }

        if (GUI.changed)
        {
            EditorUtility.SetDirty(_editMode);
            EditorUtility.SetDirty(_data);
            _editMode.UpdateRender();
        }
    }
Ejemplo n.º 3
0
    public override void OnInspectorGUI()
    {
        bool editing = (_data != null) ? _data.editing : true;

        EditorGUILayout.Space();

        GUILayout.BeginVertical(GUILayout.Width(400));
        if (editing)
        {
            if (_editMode.stage == BuildrEditMode.stages.start)
            {
                GUILayout.Space(10);
                EditorGUILayout.Space();
                if (Event.current.type == EventType.Repaint)
                {
                    _splashRect = GUILayoutUtility.GetLastRect();
                }
                _splashRect.width  = 300;
                _splashRect.height = 194;
                GUI.DrawTexture(_splashRect, (Texture2D)Resources.Load("splash"));
                GUILayout.Space(_splashRect.height);

                EditorGUILayout.LabelField("Welcome to BuildR.\nSelect from the following menu to begin a new building.", GUILayout.Height(30));

                if (GUILayout.Button("Start floorplan with basic square"))
                {
                    _editMode.StartBuilding();
                    _editMode.SetMode(BuildrEditMode.modes.addNewVolume);
                }

                if (GUILayout.Button("Start floorplan by drawing square"))
                {
                    _editMode.StartBuilding();
                    _editMode.SetMode(BuildrEditMode.modes.addNewVolumeByDraw);
                }

                if (GUILayout.Button("Start floorplan by drawing walls"))
                {
                    _editMode.StartBuilding();
                    _editMode.SetMode(BuildrEditMode.modes.addNewVolumeByPoints);
                }

                if (GUILayout.Button("Procedurally Generate Building"))
                {
                    _editMode.StartBuilding();
                    _editMode.SetStage(BuildrEditMode.stages.building);
                    _editMode.data.editing = false;
                }

                if (GUILayout.Button("Start floorplan from XML"))
                {
                    string xmlPath = EditorUtility.OpenFilePanel("Select the XML file...", "Assets/BuildR/Exported/", "xml");
                    if (xmlPath == "")
                    {
                        return;
                    }
                    BuildrData buildData = _editMode.gameObject.AddComponent <BuildrData>();
                    buildData.plan = ScriptableObject.CreateInstance <BuildrPlan>();
                    BuildrXMLImporter.Import(xmlPath, buildData);
                    _editMode.SetStage(BuildrEditMode.stages.building);
                }

                GUILayout.Space(10);

                GUILayout.BeginHorizontal();
                if (GUILayout.Button("Online Documentation"))
                {
                    Help.BrowseURL("http://buildr.jasperstocker.com/documentation/");
                }

                if (GUILayout.Button("Contact"))
                {
                    Help.BrowseURL("mailto:[email protected]");
                }
                GUILayout.EndHorizontal();
            }
            else
            {
                EditorGUILayout.Space();
                EditorGUILayout.BeginHorizontal();

                //TITLE
                GUIStyle title = new GUIStyle(GUI.skin.label);
                title.fixedHeight      = 60;
                title.fixedWidth       = 223;
                title.alignment        = TextAnchor.UpperCenter;
                title.fontStyle        = FontStyle.Bold;
                title.normal.textColor = Color.white;
                EditorGUILayout.LabelField("Edit Mode", title);
                Texture2D facadeTexture = new Texture2D(1, 1);
                facadeTexture.SetPixel(0, 0, BuildrColours.BLUE);
                facadeTexture.Apply();
                Rect sqrPos = new Rect(0, 0, 0, 0);
                if (Event.current.type == EventType.Repaint)
                {
                    sqrPos = GUILayoutUtility.GetLastRect();
                }
                GUI.DrawTexture(sqrPos, facadeTexture);
                EditorGUI.LabelField(sqrPos, "Edit Mode", title);

                if (GUILayout.Button("Switch to Generate Mode", GUILayout.Width(165)))
                {
                    _editMode.stage = BuildrEditMode.stages.building;
                    _data.editing   = false;
                }
                EditorGUILayout.EndHorizontal();

                bool isLegal = _data.plan != null;
                if (isLegal)
                {
                    isLegal = !(_data.plan.illegalPoints.Length > 0);
                }
                if (isLegal)
                {
                    isLegal = _editMode.transform.localScale == Vector3.one;
                }

                EditorGUILayout.Space();

                GUILayout.BeginHorizontal();
                int currentStage = (int)_editMode.stage - 1;

                GUIContent[] guiContent = new GUIContent[9];
                for (int i = 0; i < 9; i++)
                {
                    guiContent[i] = new GUIContent(_stageToolbarTextures[i], _stageToolbar[i]);
                }
                int newStage = GUILayout.Toolbar(currentStage, guiContent, GUILayout.Width(400), GUILayout.Height(50));
                if (newStage != currentStage)
                {
                    _editMode.stage = (BuildrEditMode.stages)(newStage + 1);
                    _editMode.mode  = BuildrEditMode.modes.floorplan;//reset the floorplan mode
                    UpdateGui();
                }
                GUILayout.EndHorizontal();
                EditorGUILayout.Space();

                if (_editMode.transform.localScale != Vector3.one)
                {
                    EditorGUILayout.HelpBox("The scale is not set to (1,1,1)!", MessageType.Error);
                    return;
                }

                if (_data.plan != null)
                {
                    if (_data.plan.illegalPoints.Length > 0)
                    {
                        EditorGUILayout.HelpBox("Your floorplan contains walls that intersect one another. " + "\nEnsure that no walls intersect another. " + "\nThe intersecting walls are highlighted red.", MessageType.Error);
                    }
                }

                switch (_editMode.stage)
                {
                case BuildrEditMode.stages.floorplan:
                    RenderTitle(_stageToolbar[0]);
                    BuildrEditModeFloorplan.InspectorGUI(_editMode, _data.plan);
                    break;

                case BuildrEditMode.stages.textures:
                    RenderTitle(_stageToolbar[1]);
                    BuildrEditModeTextures.InspectorGUI(_editMode, _data);
                    break;

                case BuildrEditMode.stages.facades:
                    RenderTitle(_stageToolbar[2]);
                    BuildrEditModeFacades.InspectorGUI(_editMode, _data);
                    break;

                case BuildrEditMode.stages.roofs:
                    RenderTitle(_stageToolbar[3]);
                    BuildrEditModeRoofs.InspectorGUI(_editMode, _data);
                    break;

                case BuildrEditMode.stages.details:
                    RenderTitle(_stageToolbar[4]);
                    BuildrEditModeDetails.InspectorGUI(_editMode, _data);
                    break;

                case BuildrEditMode.stages.interior:
                    RenderTitle(_stageToolbar[5]);
                    BuildrEditModeInterior.InspectorGUI(_editMode, _data);
                    break;

                case BuildrEditMode.stages.building:
                    RenderTitle(_stageToolbar[6]);
                    BuildrEditModeBuilding.InspectorGUI(_editMode, _data);
                    break;

                case BuildrEditMode.stages.options:
                    RenderTitle(_stageToolbar[7]);
                    BuildrEditModeOptions.InspectorGUI(_editMode, _data);
                    break;

                case BuildrEditMode.stages.export:
                    RenderTitle(_stageToolbar[8]);
                    BuildrEditModeExport.InspectorGUI(_editMode, _data);
                    break;
                }
            }
        }
        else
        {
            EditorGUILayout.BeginHorizontal();

            //TITLE
            GUIStyle title = new GUIStyle(GUI.skin.label);
            title.fixedHeight = 60;
            title.fixedWidth  = 223;
            title.alignment   = TextAnchor.UpperCenter;
            title.fontStyle   = FontStyle.Bold;
            EditorGUILayout.LabelField("", title);
            Texture2D facadeTexture = new Texture2D(1, 1);
            facadeTexture.SetPixel(0, 0, BuildrColours.BLUE);
            facadeTexture.Apply();
            Rect sqrPos = new Rect(0, 0, 0, 0);
            if (Event.current.type == EventType.Repaint)
            {
                sqrPos = GUILayoutUtility.GetLastRect();
            }
            GUI.DrawTexture(sqrPos, facadeTexture);
            EditorGUI.LabelField(sqrPos, "Genereate Mode (beta)", title);

            if (GUILayout.Button("Switch to Edit Mode", GUILayout.Width(165)))
            {
                _editMode.stage = BuildrEditMode.stages.generate;
                _data.editing   = true;
            }
            EditorGUILayout.EndHorizontal();

            //generating
            BuildrGenerateModeEditor.InspectorGUI(_editMode, _data);
        }
        GUILayout.EndVertical();

        if (Event.current.type == EventType.ValidateCommand)
        {
            switch (Event.current.commandName)
            {
            case "UndoRedoPerformed":
                GUI.changed = true;
                break;
            }
        }

        if (GUI.changed)
        {
            EditorUtility.SetDirty(_editMode);
            if (_data != null)
            {
                EditorUtility.SetDirty(_data);//TODO: LOOK INTO ERROR HERE
            }
            _editMode.UpdateRender();
            UpdateGui();
            //Undo.RegisterSceneUndo("Building Modified");
        }
    }
Ejemplo n.º 4
0
    public static void SceneGUI(BuildrEditMode editMode, BuildrData data, bool shouldSnap, float handleSize)
    {
        switch (mode)
        {
        case EditModes.general:
            //No scene actions
            break;

        case EditModes.floorplan:
            BuildrEditModeFloorplan.SceneGUI(editMode, data.plan, false, handleSize);
            break;
        }

        if (constraints.constrainPlanByArea)
        {
            Rect    area     = constraints.area;
            Vector3 position = editMode.transform.position;

            Vector3 areaLeft   = new Vector3(area.xMin, 0, (area.yMin + area.yMax) / 2);
            Vector3 areaRight  = new Vector3(area.xMax, 0, (area.yMin + area.yMax) / 2);
            Vector3 areaBottom = new Vector3((area.xMin + area.xMax) / 2, 0, area.yMin);
            Vector3 areaTop    = new Vector3((area.xMin + area.xMax) / 2, 0, area.yMax);

            Vector3 newAreaLeft   = Handles.Slider(areaLeft + position, Vector3.left, HandleUtility.GetHandleSize(areaLeft) * 0.666f, Handles.ArrowCap, 0.0f);
            Vector3 newAreaRight  = Handles.Slider(areaRight + position, Vector3.right, HandleUtility.GetHandleSize(areaLeft) * 0.666f, Handles.ArrowCap, 0.0f);
            Vector3 newAreaBottom = Handles.Slider(areaBottom + position, Vector3.back, HandleUtility.GetHandleSize(areaLeft) * 0.666f, Handles.ArrowCap, 0.0f);
            Vector3 newAreaTop    = Handles.Slider(areaTop + position, Vector3.forward, HandleUtility.GetHandleSize(areaLeft) * 0.666f, Handles.ArrowCap, 0.0f);

            newAreaLeft   -= position;
            newAreaRight  -= position;
            newAreaBottom -= position;
            newAreaTop    -= position;

            if (areaLeft != newAreaLeft)
            {
                area.xMin = Mathf.Min(newAreaLeft.x, area.xMax - 1.0f);
            }
            if (areaRight != newAreaRight)
            {
                area.xMax = Mathf.Max(newAreaRight.x, area.xMin + 1.0f);
            }
            if (areaBottom != newAreaBottom)
            {
                area.yMin = Mathf.Min(newAreaBottom.z, area.yMax - 1.0f);
            }
            if (areaTop != newAreaTop)
            {
                area.yMax = Mathf.Max(newAreaTop.z, area.yMin + 1.0f);
            }

            constraints.area = area;

            Vector3 coreBL = new Vector3(area.xMin, 0, area.yMin) + position;
            Vector3 coreBR = new Vector3(area.xMax, 0, area.yMin) + position;
            Vector3 coreTL = new Vector3(area.xMin, 0, area.yMax) + position;
            Vector3 coreTR = new Vector3(area.xMax, 0, area.yMax) + position;
            Handles.DrawLine(coreBL, coreBR);
            Handles.DrawLine(coreBR, coreTR);
            Handles.DrawLine(coreTR, coreTL);
            Handles.DrawLine(coreTL, coreBL);
        }
    }