Example #1
0
    private bool DrawBoxSelection()
    {
        if (viewModel.PreviousModelFactory == null)
        {
            return(false);
        }
        NPVoxModel   previousTransformedModel = viewModel.PreviousModelFactory.GetProduct();
        NPVoxToUnity npVoxToUnity             = new NPVoxToUnity(previousTransformedModel, viewModel.Animation.MeshFactory.VoxelSize);

        List <NPVoxBox> boxes = viewModel.GetNonEditableBoxes();

        if (boxes != null)
        {
            foreach (NPVoxBox b in boxes)
            {
                NPVoxHandles.DrawBoxSelection(npVoxToUnity, b, false);
            }
        }

        if (!viewModel.IsAreaSelectionActive())
        {
            return(false);
        }


        NPVoxBox box = viewModel.GetAffectedBox();

        if (Event.current.shift)
        {
            // affected area picker
            NPVoxCoord someCoord    = box.RoundedCenter;
            NPVoxCoord someNewCoord = NPVoxHandles.VoxelPicker(new NPVoxToUnity(previousTransformedModel, viewModel.Animation.MeshFactory.VoxelSize), someCoord, 0, ((NPVoxAnimationEditorSession)target).previewFilter.transform);
            if (!someCoord.Equals(someNewCoord))
            {
                viewModel.ChangeAffectedBox(new NPVoxBox(someNewCoord, someNewCoord));
            }
        }
        else
        {
            // affected area box
            NPVoxBox newBox = NPVoxHandles.DrawBoxSelection(npVoxToUnity, box);
            if (!newBox.Equals(box))
            {
                viewModel.ChangeAffectedBox(newBox);
            }
        }

        return(true);
    }
Example #2
0
    private bool DrawBoneSelection()
    {
        if (viewModel.PreviousModelFactory == null)
        {
            return(false);
        }
        NPVoxBoneModel previewModel = viewModel.EditorModelFactory.GetProduct() as NPVoxBoneModel;

        if (previewModel == null)
        {
            return(false);
        }

        if (!viewModel.IsBoneSelectionActive())
        {
            return(false);
        }

        NPVoxToUnity npVoxToUnity = new NPVoxToUnity(previewModel, viewModel.Animation.MeshFactory.VoxelSize);

        // affected area picker
        if (Event.current.isMouse && Event.current.type == EventType.MouseDown && Event.current.button == 0)
        {
//            NPVoxCoord someCoord = NPVoxCoord.INVALID;
            float  mouseScale = NPVoxHandles.GetMouseScale(SceneView.currentDrawingSceneView.camera);
            Camera cam        = SceneView.currentDrawingSceneView.camera;
            Ray    r          = SceneView.currentDrawingSceneView.camera.ScreenPointToRay(
                new Vector3(Event.current.mousePosition.x * mouseScale, -Event.current.mousePosition.y * mouseScale + Camera.current.pixelHeight)
                );
            NPVoxRayCastHit raycastHit = npVoxToUnity.Raycast(r, ((NPVoxAnimationEditorSession)target).previewFilter.transform, 20);
            if (raycastHit.IsHit)
            {
                uint boneMask = previewModel.GetBoneMask(raycastHit.Coord);
                if (boneMask != 0)
                {
                    if (Event.current.control || Event.current.command)
                    {
                        viewModel.ToggleBoneMask(boneMask, Event.current.shift);
                    }
                    else
                    {
                        viewModel.SetBoneMask(boneMask, Event.current.shift);
                    }
                }
            }
        }
        return(true);
    }
Example #3
0
    public static Bounds DrawBoundsSelection(Bounds previous, Vector3 cellOffset, float cellSize)
    {
        NPVoxToUnity npVoxToUnity = new NPVoxToUnity(null, Vector3.one * cellSize, cellOffset - Vector3.one * 0.5f * cellSize);
        NPVoxBox     previousBox  = new NPVoxBox(
            npVoxToUnity.ToVoxCoord(previous.min + Vector3.one * cellSize / 2),
            npVoxToUnity.ToVoxCoord(previous.max - Vector3.one * cellSize / 2)
            );
        NPVoxBox newBox = NPVoxHandles.DrawBoxSelection(npVoxToUnity, previousBox, true);

        if (!previousBox.Equals(newBox))
        {
            Bounds bounds = new Bounds(Vector3.zero, Vector3.zero);
            bounds.SetMinMax(
                npVoxToUnity.ToUnityPosition(newBox.LeftDownBack) - Vector3.one * cellSize / 2,
                npVoxToUnity.ToUnityPosition(newBox.RightUpForward) + Vector3.one * cellSize / 2
                );
            return(bounds);
        }
        else
        {
            return(previous);
        }
    }
Example #4
0
    public System.Func <NPVoxISceneEditable, bool> DrawSceneTool(NPVoxToUnity npVoxToUnity, Transform transform, int tool)
    {
        if (Input == null)
        {
            return(null);
        }

        NPVoxModel model = ((NPVoxIModelFactory)Input).GetProduct() as NPVoxModel;

        if (!model)
        {
            return(null);
        }

        // Start Coord 1
        if (tool == 0)
        {
            NPVoxCoord someNewCoord = NPVoxHandles.VoxelPicker(npVoxToUnity, startCoord1, 0, transform);
            if (!startCoord1.Equals(someNewCoord))
            {
                return((NPVoxISceneEditable t) =>
                {
                    (t as NPVoxTrailAttacher).startCoord1 = someNewCoord;
                    return true;
                });
            }
        }

        // Start Coord 2
        if (tool == 1)
        {
            NPVoxCoord someNewCoord = NPVoxHandles.VoxelPicker(npVoxToUnity, startCoord2, 0, transform);
            if (!startCoord2.Equals(someNewCoord))
            {
                return((NPVoxISceneEditable t) =>
                {
                    (t as NPVoxTrailAttacher).startCoord2 = someNewCoord;
                    return true;
                });
            }
        }

        // Direction 1
        if (tool == 2)
        {
            Quaternion newQuaternion = Handles.RotationHandle(rotation1, npVoxToUnity.ToUnityPosition(startCoord1));
            if (!newQuaternion.Equals(rotation1))
            {
                return((NPVoxISceneEditable t) =>
                {
                    (t as NPVoxTrailAttacher).rotation1 = newQuaternion;
                    return true;
                });
            }
        }

        // Direction 2
        if (tool == 3)
        {
            Quaternion newQuaternion = Handles.RotationHandle(rotation2, npVoxToUnity.ToUnityPosition(startCoord2));
            if (!newQuaternion.Equals(rotation2))
            {
                return((NPVoxISceneEditable t) =>
                {
                    (t as NPVoxTrailAttacher).rotation2 = newQuaternion;
                    return true;
                });
            }
        }

        return(null);
    }
    private void MouseInput()
    {
        int       controlID = GUIUtility.GetControlID(FocusType.Passive);
        EventType eventType = Event.current.GetTypeForControl(controlID);
        Event     e         = Event.current;

        float mouseScale = NPVoxHandles.GetMouseScale(SceneView.currentDrawingSceneView.camera);
        Ray   r          = Camera.current.ScreenPointToRay(new Vector3(Event.current.mousePosition.x * mouseScale, -Event.current.mousePosition.y * mouseScale + Camera.current.pixelHeight));

        bool bShiftHeld = e.shift;
        bool bAltHeld   = e.alt;
        bool bCtrlHeld  = e.control;

        if (Event.current.mousePosition.y < TOOLBAR_HEIGHT)
        {
            // allow to click the buttons always
            return;
        }

        // if (viewModel.CurrentTool == GNBlockMapEditorVM.Tool.ERASE)
        if (inputController.IsErasingActive())
        {
            Handles.color = new Color(128, 0, 0, 0.25f);
            Handles.CubeCap(controlID, viewModel.CurrentCell, Quaternion.identity, viewModel.CellSize);
        }
        if (inputController.IsPrefabNavigationActive())
        {
            Handles.color = new Color(128, 128, 0, 0.05f);
            Handles.CubeCap(controlID, viewModel.CurrentCell, Quaternion.identity, viewModel.CellSize);
        }
        if (inputController.IsPickingActive())
        {
            Handles.color = new Color(128, 128, 0, 0.25f);
            Handles.CubeCap(controlID, viewModel.CurrentCell, Quaternion.identity, viewModel.CellSize);
        }
        if (inputController.IsRotationActive())
        {
            Handles.color = new Color(0, 128, 0, 0.05f);
            Handles.CubeCap(controlID, viewModel.CurrentCell, Quaternion.identity, viewModel.CellSize);
        }

        switch (eventType)
        {
        case EventType.Layout:

            if (inputController.TakeEvents())
            {
                HandleUtility.AddControl(
                    controlID,
                    HandleUtility.DistanceToCircle(r.origin, 10f)
                    );
            }

            break;

        case EventType.MouseDown:
            if (HandleUtility.nearestControl == controlID && e.button == 0)
            {
                GUIUtility.hotControl = controlID;

                if (inputController.MouseDown(e))
                {
                    e.Use();
                    SceneView.RepaintAll();
                }
            }
            break;

        case EventType.MouseUp:
            if (GUIUtility.hotControl == controlID)
            {
                GUI.changed           = true;
                GUIUtility.hotControl = 0;
                e.Use();
            }
            break;

        case EventType.MouseDrag:
            if (GUIUtility.hotControl == controlID)
            {
                if (inputController.MouseDrag(RayCast(r)))
                {
                    e.Use();
                    SceneView.RepaintAll();
                }
            }
            break;

        case EventType.ScrollWheel:
            if (inputController.WheelScrolled(e.delta, bShiftHeld, bAltHeld, bCtrlHeld))
            {
                e.Use();
                if (inputController.MouseMoved(RayCast(r)))
                {
                }
                SceneView.RepaintAll();
            }
            break;

        case EventType.MouseMove:
            if (inputController.MouseMoved(RayCast(r)))
            {
                e.Use();
                SceneView.RepaintAll();
            }
            break;
        }
    }
    public void OnSceneGUI()
    {
        if (!m_bActive)
        {
            return;
        }

        if (viewModel.CurrentTool == GNBlockMapEditorVM.Tool.BOX)
        {
            if (viewModel.SelectBox(GNHandles.DrawBoundsSelection(viewModel.SelectedBox, viewModel.CellOffset, viewModel.CellSize)))
            {
                // SceneView.RepaintAll();
            }
        }
        else
        {
            MouseInput();
        }
        KeyboardInput();
        KeyboardShortcuts();

        GUILayout.BeginArea(new Rect(0, 0, 880, 100));
        EditorGUILayout.BeginVertical();
        {
            EditorGUILayout.BeginHorizontal();
            {
                DrawToolbar();
                DrawCameraToolbar();
            }
            EditorGUILayout.EndHorizontal();
            EditorGUILayout.BeginHorizontal();
            {
                DrawPaintMode();

                EditorGUILayout.BeginVertical();
                DrawShowLayerMode();
                if (viewModel.CurrentTool == GNBlockMapEditorVM.Tool.BOX)
                {
                    DrawBoxTools();
                }
                EditorGUILayout.EndVertical();
            }
            EditorGUILayout.EndHorizontal();
        }
        EditorGUILayout.EndVertical();
        GUILayout.EndArea();

        if (inputController.IsPickingActive())
        {
            GUILayout.BeginArea(new Rect(10, 100, 400, 100));
            GUILayout.Label("Tile Info: " + viewModel.GetTileInfo(), EditorStyles.whiteLargeLabel);
            GUILayout.EndArea();
        }

        if (Event.current.type == EventType.Layout)
        {
            screenScale = NPVoxHandles.GetScreenScale();
        }

        GUILayout.BeginArea(new Rect(10, Screen.height * screenScale - 70, 400, 100));
        EditorGUILayout.BeginHorizontal();
        GUILayout.Label("CellSize: " + viewModel.CellSize, EditorStyles.whiteLargeLabel);
        GUILayout.Label("CellOffset: " + viewModel.CellOffset, EditorStyles.whiteLargeLabel);
        GUILayout.Label("Cell: " + viewModel.CurrentCell, EditorStyles.whiteLargeLabel);
        // GUILayout.Label("Brush: " + viewModel.CurrentPrefabPath, EditorStyles.whiteLargeLabel);
        EditorGUILayout.EndHorizontal();
        GUILayout.EndArea();

        GUILayout.BeginArea(new Rect(Screen.width * screenScale - 350, Screen.height * screenScale - 240, 300, 200));
        GUILayout.BeginHorizontal();
        GUILayout.FlexibleSpace();
        GUILayout.BeginVertical();
        GUILayout.FlexibleSpace();
        GUILayout.Label(inputController.GetCurrentToolInfo(), EditorStyles.whiteLargeLabel);
        GUILayout.EndVertical();
        GUILayout.EndHorizontal();
        GUILayout.EndArea();

        Selection.activeGameObject = ((MonoBehaviour)target).gameObject;

        DrawZIndicator(screenScale);
    }
Example #7
0
    public static NPVoxBox DrawBoxSelection(NPVoxToUnity npVoxToUnity, NPVoxBox box, bool editable = true)
    {
        Vector3 leftDownBack     = npVoxToUnity.ToUnityPosition(box.LeftDownBack) - npVoxToUnity.VoxeSize * 0.5f;
        Vector3 rightUpForward   = npVoxToUnity.ToUnityPosition(box.RightUpForward) + npVoxToUnity.VoxeSize * 0.5f;
        Vector3 rightDownBack    = new Vector3(rightUpForward.x, leftDownBack.y, leftDownBack.z);
        Vector3 leftUpBack       = new Vector3(leftDownBack.x, rightUpForward.y, leftDownBack.z);
        Vector3 rightUpBack      = new Vector3(rightUpForward.x, rightUpForward.y, leftDownBack.z);
        Vector3 leftDownForward  = new Vector3(leftDownBack.x, leftDownBack.y, rightUpForward.z);
        Vector3 rightDownForward = new Vector3(rightUpForward.x, leftDownBack.y, rightUpForward.z);
        Vector3 leftUpForward    = new Vector3(leftDownBack.x, rightUpForward.y, rightUpForward.z);

        Handles.DrawDottedLine(leftDownBack, rightDownBack, 1f);
        Handles.DrawDottedLine(leftDownBack, leftUpBack, 1f);
        Handles.DrawDottedLine(leftUpBack, rightUpBack, 1f);
        Handles.DrawDottedLine(rightDownBack, rightUpBack, 1f);
        Handles.DrawDottedLine(leftDownForward, rightDownForward, 1f);
        Handles.DrawDottedLine(leftDownForward, leftUpForward, 1f);
        Handles.DrawDottedLine(leftUpForward, rightUpForward, 1f);
        Handles.DrawDottedLine(rightDownForward, rightUpForward, 1f);
        Handles.DrawDottedLine(leftDownBack, leftDownForward, 1f);
        Handles.DrawDottedLine(rightDownBack, rightDownForward, 1f);
        Handles.DrawDottedLine(leftUpBack, leftUpForward, 1f);
        Handles.DrawDottedLine(rightUpBack, rightUpForward, 1f);
        if (!editable)
        {
            return(box);
        }

        NPVoxBox newBox = new NPVoxBox(box.LeftDownBack, box.RightUpForward);

        if (SceneView.currentDrawingSceneView.camera.orthographic)
        {
            NPVoxCoord oldCoord;
            NPVoxCoord newCoord;

            oldCoord = box.LeftDownBack;
            newCoord = NPVoxHandles.DrawVoxelHandle(leftDownBack, oldCoord, npVoxToUnity);
            if (!newCoord.Equals(oldCoord))
            {
                newBox.LeftDownBack = newCoord;
            }

            oldCoord = box.RightDownBack;
            newCoord = NPVoxHandles.DrawVoxelHandle(rightDownBack, oldCoord, npVoxToUnity);
            if (!newCoord.Equals(oldCoord))
            {
                newBox.RightDownBack = newCoord;
            }

            oldCoord = box.LeftUpBack;
            newCoord = NPVoxHandles.DrawVoxelHandle(leftUpBack, oldCoord, npVoxToUnity);
            if (!newCoord.Equals(oldCoord))
            {
                newBox.LeftUpBack = newCoord;
            }

            oldCoord = box.RightUpBack;
            newCoord = NPVoxHandles.DrawVoxelHandle(rightUpBack, oldCoord, npVoxToUnity);
            if (!newCoord.Equals(oldCoord))
            {
                newBox.RightUpBack = newCoord;
            }

            oldCoord = box.LeftDownForward;
            newCoord = NPVoxHandles.DrawVoxelHandle(leftDownForward, oldCoord, npVoxToUnity);
            if (!newCoord.Equals(oldCoord))
            {
                newBox.LeftDownForward = newCoord;
            }

            oldCoord = box.RightDownForward;
            newCoord = NPVoxHandles.DrawVoxelHandle(rightDownForward, oldCoord, npVoxToUnity);
            if (!newCoord.Equals(oldCoord))
            {
                newBox.RightDownForward = newCoord;
            }

            oldCoord = box.LeftUpForward;
            newCoord = NPVoxHandles.DrawVoxelHandle(leftUpForward, oldCoord, npVoxToUnity);
            if (!newCoord.Equals(oldCoord))
            {
                newBox.LeftUpForward = newCoord;
            }

            oldCoord = box.RightUpForward;
            newCoord = NPVoxHandles.DrawVoxelHandle(rightUpForward, oldCoord, npVoxToUnity);
            if (!newCoord.Equals(oldCoord))
            {
                newBox.RightUpForward = newCoord;
            }

            // center mover
            oldCoord = box.LeftDownBack;
            newCoord = NPVoxHandles.DrawVoxelHandle(npVoxToUnity.ToUnityPosition(box.SaveCenter), oldCoord, npVoxToUnity);
            if (!newCoord.Equals(oldCoord))
            {
                newBox.SaveCenter += NPVoxCoordUtil.ToVector(newCoord - oldCoord);
            }
        }
        else
        {
            sbyte   oldPos;
            sbyte   newPos;
            Vector3 handlePos;

            handlePos = new Vector3(leftDownBack.x + (rightUpForward.x - leftDownBack.x) / 2, leftDownBack.y + (rightUpForward.y - leftDownBack.y) / 2, leftDownBack.z);
            oldPos    = box.Back;
            newPos    = NPVoxHandles.DrawAxisHandle(handlePos, oldPos, npVoxToUnity, Vector3.forward);
            if (oldPos != newPos)
            {
                newBox.Back = newPos;
            }

            handlePos = new Vector3(leftDownBack.x + (rightUpForward.x - leftDownBack.x) / 2, leftDownBack.y + (rightUpForward.y - leftDownBack.y) / 2, rightUpForward.z);
            oldPos    = box.Forward;
            newPos    = NPVoxHandles.DrawAxisHandle(handlePos, oldPos, npVoxToUnity, Vector3.forward);
            if (oldPos != newPos)
            {
                newBox.Forward = newPos;
            }

            handlePos = new Vector3(leftDownBack.x + (rightUpForward.x - leftDownBack.x) / 2, leftDownBack.y, leftDownBack.z + (rightUpForward.z - leftDownBack.z) / 2);
            oldPos    = box.Down;
            newPos    = NPVoxHandles.DrawAxisHandle(handlePos, oldPos, npVoxToUnity, Vector3.up);
            if (oldPos != newPos)
            {
                newBox.Down = newPos;
            }

            handlePos = new Vector3(leftDownBack.x + (rightUpForward.x - leftDownBack.x) / 2, rightUpForward.y, leftDownBack.z + (rightUpForward.z - leftDownBack.z) / 2);
            oldPos    = box.Up;
            newPos    = NPVoxHandles.DrawAxisHandle(handlePos, oldPos, npVoxToUnity, Vector3.up);
            if (oldPos != newPos)
            {
                newBox.Up = newPos;
            }

            handlePos = new Vector3(leftDownBack.x, leftDownBack.y + (rightUpForward.y - leftDownBack.y) / 2, leftDownBack.z + (rightUpForward.z - leftDownBack.z) / 2);
            oldPos    = box.Left;
            newPos    = NPVoxHandles.DrawAxisHandle(handlePos, oldPos, npVoxToUnity, Vector3.right);
            if (oldPos != newPos)
            {
                newBox.Left = newPos;
            }

            handlePos = new Vector3(rightUpForward.x, leftDownBack.y + (rightUpForward.y - leftDownBack.y) / 2, leftDownBack.z + (rightUpForward.z - leftDownBack.z) / 2);
            oldPos    = box.Right;
            newPos    = NPVoxHandles.DrawAxisHandle(handlePos, oldPos, npVoxToUnity, Vector3.right);
            if (oldPos != newPos)
            {
                newBox.Right = newPos;
            }
        }
        return(newBox);
    }