示例#1
0
    private static string ToMeshShapeString(Voxel.MeshShapeType input)
    {
        switch (input)
        {
        case Voxel.MeshShapeType.None:
            return("none");

        case Voxel.MeshShapeType.Cube:
            return("cube");

        case Voxel.MeshShapeType.Ramp:
            return("ramp");

        case Voxel.MeshShapeType.SmallCorner:
            return("small-corner");

        case Voxel.MeshShapeType.LargeCorner:
            return("large-corner");

        case Voxel.MeshShapeType.MiterConvex:
            return("miter-convex");

        case Voxel.MeshShapeType.MiterConcave:
            return("miter-concave");
        }
        throw new System.ArgumentException("Unknown mesh shape type: " + input);
    }
示例#2
0
    public override void OnInspectorGUI()
    {
        serializedObject.Update();

        var terrain = (VoxelTerrain)target;

        CreatePlanes(terrain);

        EditorGUILayout.LabelField("Plane alignment");
        GUILayout.BeginHorizontal();
        foreach (var kvp in planeNormals)
        {
            if (GUILayout.Toggle(alignment == kvp.Key, kvp.Key.ToString(), "Button"))
            {
                alignment   = kvp.Key;
                createPlane = true;
            }
        }
        GUILayout.EndHorizontal();

        EditorGUILayout.LabelField("Paint mode");
        GUILayout.BeginHorizontal();
        foreach (var mode in paintModes)
        {
            if (GUILayout.Toggle(paintMode == mode, mode.ToString(), "Button"))
            {
                paintMode = mode;
            }
        }
        GUILayout.EndHorizontal();

        EditorGUILayout.LabelField("Available block types");
        ushort blockTypeCount = 0;

        if (GUILayout.Toggle(!paintBlockType, "Don't paint block", "Button"))
        {
            paintBlockType = false;
        }
        foreach (var blockType in terrain.BlockTypes)
        {
            if (GUILayout.Toggle(paintBlockType && selectedBlockType == blockTypeCount, blockType.BlockName, "Button"))
            {
                selectedBlockType = blockTypeCount;
                paintBlockType    = true;
            }
            blockTypeCount++;
        }

        EditorGUILayout.LabelField("Mesh shape type");
        if (GUILayout.Toggle(!paintShape, "Don't paint shape", "Button"))
        {
            paintShape = false;
        }
        foreach (var meshShape in meshShapeTypes)
        {
            if (GUILayout.Toggle(paintShape && selectedMeshShape == meshShape, meshShape.ToString(), "Button"))
            {
                selectedMeshShape = meshShape;
                paintShape        = true;
            }
        }

        EditorGUILayout.LabelField("Rotation direction");
        GUILayout.BeginHorizontal();
        foreach (var rotation in rotationTypes)
        {
            if (GUILayout.Toggle(selectedRotation == rotation, rotation.ToString(), "Button"))
            {
                selectedRotation = rotation;
            }
        }
        GUILayout.EndHorizontal();

        EditorGUILayout.LabelField("Delete all terrain!?");
        if (GUILayout.Button("Clear terrain"))
        {
            terrain.Clear();
        }

        serializedObject.ApplyModifiedProperties();
    }
示例#3
0
    void OnSceneGUI()
    {
        var e         = Event.current;
        var controlId = GUIUtility.GetControlID(FocusType.Passive);
        var terrain   = (VoxelTerrain)target;

        if (e.type == EventType.KeyDown)
        {
            var newAlignment = PlaneAlignment.None;
            var useEvent     = false;
            var index        = 0;
            foreach (var planeNormal in planeNormals)
            {
                if (index >= Row1Keys.Count)
                {
                    return;
                }

                if (e.keyCode == Row1Keys[index++])
                {
                    newAlignment = planeNormal.Key;
                }
            }

            if (newAlignment != PlaneAlignment.None)
            {
                createPlane = true;
                alignment   = newAlignment;
                EditorUtility.SetDirty(terrain);
                useEvent = true;
            }

            index = 0;
            foreach (var blockType in terrain.BlockTypes)
            {
                if (index >= Row2Keys.Count)
                {
                    return;
                }

                if (e.keyCode == Row2Keys[index])
                {
                    selectedBlockType = (ushort)index;
                    useEvent          = true;
                }
                index++;
            }

            index = 0;
            foreach (var meshShape in meshShapeTypes)
            {
                if (index >= Row3Keys.Count)
                {
                    return;
                }

                if (e.keyCode == Row3Keys[index++])
                {
                    selectedMeshShape = meshShape;
                    useEvent          = true;
                }
            }

            index = 0;
            foreach (var rotation in rotationTypes)
            {
                if (index >= Row4Keys.Count)
                {
                    return;
                }

                if (e.keyCode == Row4Keys[index++])
                {
                    selectedRotation = rotation;
                    useEvent         = true;
                }
            }

            if (e.keyCode == KeyCode.Space)
            {
                useEvent = true;
                var        ray = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition);
                RaycastHit rayHit;
                if (Physics.Raycast(ray, out rayHit))
                {
                    var cursorPosition = rayHit.point - rayHit.normal * 0.5f;
                    tileCursorPosition = new Vector3(Mathf.Round(cursorPosition.x), Mathf.Round(cursorPosition.y), Mathf.Round(cursorPosition.z));
                }
            }

            if (useEvent)
            {
                GUIUtility.hotControl = controlId;
                EditorUtility.SetDirty(terrain);
                e.Use();
            }
        }

        CreatePlanes(terrain);

        if ((e.type == EventType.MouseDown || e.type == EventType.MouseDrag) && e.button == 0)
        {
            if (paintBlockType || paintShape)
            {
                GUIUtility.hotControl = controlId;

                var x = (int)tileCursorPosition.x;
                var y = (int)tileCursorPosition.y;
                var z = (int)tileCursorPosition.z;

                if (paintMode == PaintModeType.Single)
                {
                    PaintAtPoint(terrain, x, y, z);
                }
                else if (paintMode == PaintModeType.Rectangle && e.type == EventType.MouseDown)
                {
                    mouseDownTileCursorPosition = tileCursorPosition;
                }

                EditorUtility.SetDirty(terrain);
            }

            if (e.type == EventType.MouseDown)
            {
                e.Use();
            }
        }

        if (e.type == EventType.MouseUp && e.button == 0)
        {
            if (mouseDownTileCursorPosition.HasValue && paintMode == PaintModeType.Rectangle)
            {
                var startX = (int)Mathf.Min(tileCursorPosition.x, mouseDownTileCursorPosition.Value.x);
                var startY = (int)Mathf.Min(tileCursorPosition.y, mouseDownTileCursorPosition.Value.y);
                var startZ = (int)Mathf.Min(tileCursorPosition.z, mouseDownTileCursorPosition.Value.z);

                var endX = (int)Mathf.Max(tileCursorPosition.x, mouseDownTileCursorPosition.Value.x);
                var endY = (int)Mathf.Max(tileCursorPosition.y, mouseDownTileCursorPosition.Value.y);
                var endZ = (int)Mathf.Max(tileCursorPosition.z, mouseDownTileCursorPosition.Value.z);
                for (var z = startZ; z <= endZ; z++)
                {
                    for (var y = startY; y <= endY; y++)
                    {
                        for (var x = startX; x <= endX; x++)
                        {
                            PaintAtPoint(terrain, x, y, z);
                        }
                    }
                }

                EditorUtility.SetDirty(terrain);
                mouseDownTileCursorPosition = null;
            }
        }

        if (e.type == EventType.MouseMove || e.type == EventType.MouseDrag)
        {
            float rayDistance;
            var   ray = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition);
            if (plane.Raycast(ray, out rayDistance))
            {
                cursorPosition = ray.GetPoint(rayDistance);
                var newCursor = new Vector3(Mathf.Round(cursorPosition.x), Mathf.Round(cursorPosition.y), Mathf.Round(cursorPosition.z));

                if (alignment == PlaneAlignment.X)
                {
                    tileCursorPosition = new Vector3(newCursor.x, tileCursorPosition.y, tileCursorPosition.z);
                }
                else if (alignment == PlaneAlignment.Y)
                {
                    tileCursorPosition = new Vector3(tileCursorPosition.x, newCursor.y, tileCursorPosition.z);
                }
                else if (alignment == PlaneAlignment.Z)
                {
                    tileCursorPosition = new Vector3(tileCursorPosition.x, tileCursorPosition.y, newCursor.z);
                }
                else
                {
                    tileCursorPosition = newCursor;
                }
                SceneView.RepaintAll();
            }
        }

        Handles.color = new Color(0.35f, 0.4f, 0.8f, 0.5f);
        Handles.CubeCap(0, tileCursorPosition, Quaternion.identity, 1.0f);

        if (mouseDownTileCursorPosition.HasValue)
        {
            Handles.color = new Color(0.4f, 0.8f, 0.35f, 0.5f);
            Handles.CubeCap(0, mouseDownTileCursorPosition.Value, Quaternion.identity, 1.0f);
        }

        var xColour = (alignment == PlaneAlignment.XY || alignment == PlaneAlignment.XZ || alignment == PlaneAlignment.X) ? Color.red : new Color(1, 1, 1, 0.5f);
        var yColour = (alignment == PlaneAlignment.YZ || alignment == PlaneAlignment.XY || alignment == PlaneAlignment.Y) ? Color.green : new Color(1, 1, 1, 0.5f);
        var zColour = (alignment == PlaneAlignment.XZ || alignment == PlaneAlignment.YZ || alignment == PlaneAlignment.Z) ? Color.blue : new Color(1, 1, 1, 0.5f);

        Handles.color = xColour;
        Handles.DrawLine(tileCursorPosition + Vector3.left * 100, tileCursorPosition + Vector3.right * 100);
        Handles.color = yColour;
        Handles.DrawLine(tileCursorPosition + Vector3.up * 100, tileCursorPosition + Vector3.down * 100);
        Handles.color = zColour;
        Handles.DrawLine(tileCursorPosition + Vector3.forward * 100, tileCursorPosition + Vector3.back * 100);

        var screenPos = Camera.current.WorldToScreenPoint(tileCursorPosition);

        Handles.BeginGUI();
        GUI.Label(new Rect(screenPos.x, Screen.height - screenPos.y, 100, 40), string.Format("({0}, {1}, {2})", tileCursorPosition.x, tileCursorPosition.y, tileCursorPosition.z));
        Handles.EndGUI();
    }