Example #1
0
        /// <summary>
        /// Calculate new position based on cursor in drag mode and move brick.
        /// </summary>
        void MoveToCursor(DragableBrick brick, Vector3 mousePosition)
        {
            if (lastMousePosition != mousePosition)
            {
                lastMousePosition = mousePosition;
                IPositioner positioner = GetPositioner(brick);
                lastProposedPosition = positioner.GetPosition(mousePosition, ToolsManager.instance.snapToGridButton.isSelected, 0.5f);

                if (!isJoined && lastProposedPosition.isJoined)
                {
                    AudioSource.PlayClipAtPoint(Preferences.instance.joinBrickSound, UnityEngine.Camera.main.transform.position);
                    dragableBrick.FlashBrick();
                }

                isJoined = lastProposedPosition.isJoined;

                var moveVector = lastProposedPosition.position - brick.transform.position;
                if (moveVector.magnitude > 1)
                {
                    lastProposedPosition.position = brick.transform.position + moveVector.normalized;
                }

                brick.transform.position = lastProposedPosition.position;
                brick.transform.rotation = lastProposedPosition.rotation;
            }
        }
        public virtual void StartMoving(DragableBrick brick, Vector3 handlePoint)
        {
            dragPointOffset = handlePoint - brick.transform.position;

            //reset drag offset when it goes outside bouds
            if (Mathf.Abs(dragPointOffset.x) > brick.GetBounds().extents.x)
            {
                dragPointOffset.x = 0;
            }
            if (Mathf.Abs(dragPointOffset.y) > brick.GetBounds().extents.y)
            {
                dragPointOffset.y = 0;
            }
            if (Mathf.Abs(dragPointOffset.z) > brick.GetBounds().extents.z)
            {
                dragPointOffset.z = 0;
            }

            Vector3 brickLowestPoint = brick.GetLowestPoint();

            lowestYoffset    = brickLowestPoint.y - brick.transform.position.y;
            rayYOffset       = brickLowestPoint.y - handlePoint.y;
            positionOffset   = handlePoint;
            positionOffset.y = brickLowestPoint.y;
            positionOffset   = brick.transform.position - positionOffset;

            minDistanceToCamera   = brick.GetBounds().extents.x * 20;
            maxDistanceFromCamera = brick.GetBounds().extents.x * 1000;

            cam        = UnityEngine.Camera.main;
            this.brick = brick;
        }
Example #3
0
    /// <summary>
    /// Generate new brick button.
    /// </summary>
    /// <param name="file">Prefa file name.</param>
    /// <param name="number">Number added to name</param>
    /// <param name="parent">:arent node to new button.</param>
    void GenerateButton(string file, int number, Transform parent)
    {
        //create GameObject
        GameObject buttonObject = new GameObject();

        buttonObject.transform.SetParent(parent);
        buttonObject.name = string.Format("brick button {0}", number);

        //atache Image component
        Image image = buttonObject.AddComponent <Image>();

        //attach BrickButtonScript and configure it
        BrickButton button = buttonObject.AddComponent <BrickButton>();

        button.brickResourcePath = ExtractResourcesPath(file);

        //generate button icon
        GameObject    brickPrefab = (GameObject)EditorGUIUtility.Load(file);
        DragableBrick brick       = brickPrefab.GetComponent <DragableBrick>();
        var           s           = Path.DirectorySeparatorChar;
        string        iconPath    = string.Format(string.Concat("Assets", s, "Resources", s, "Icons", s, "{0}.png"), brick.name);

        BrickUtils.GenerateIcon(brick, iconPath, 256);

        //configure icon
        button.imageResourcePath = ExtractResourcesPath(iconPath);
        string standardIconPath = string.Concat("Assets", s, "Gfx", s, "UI", s, "Icons", s, "BrickButtonIcon.png");
        //AssetDatabase.ImportAsset(standardIconPath);
        Sprite sprite = AssetDatabase.LoadAssetAtPath <Sprite>(standardIconPath);

        image.sprite = sprite;

        //configure group
        if (file.Contains("AgaQ Lukowe Poziome i Pionowe STL"))
        {
            button.group = 1;
        }
        else if (file.Contains("AgaQ Prostopadłoscianowe STL"))
        {
            button.group = 2;
        }
        else if (file.Contains("AgaQ Rownolegloboczne poziome STL"))
        {
            button.group = 3;
        }
        else if (file.Contains("AgaQ Schodkowe STL"))
        {
            button.group = 4;
        }
        else if (file.Contains("AgaQ Skalowe przechodzace STL"))
        {
            button.group = 5;
        }
        else if (file.Contains("AgaQ Trapezowe STL"))
        {
            button.group = 6;
        }
    }
Example #4
0
        /// <summary>
        /// Gets the proper positioner for brick.
        /// </summary>
        /// <returns>The positioner.</returns>
        /// <param name="brick">Brick.</param>
        IPositioner GetPositioner(DragableBrick brick)
        {
            if (brick is AgaQBrick)
            {
                return(joinablePositioner);
            }

            return(simplePositioner);
        }
Example #5
0
        /// <summary>
        /// Clone the specified brick.
        /// </summary>
        /// <param name="brick">Brick.</param>
        /// <param name="eventData">Event data.</param>
        public void Clone(DragableBrick brick, PointerEventData eventData)
        {
            var newBrick = BrickBuilder.Clone(brick);

            if (newBrick is DragableBrick)
            {
                dragableBrick = newBrick as DragableBrick;
                base.OnBeginDrag(dragableBrick, eventData);
            }
        }
Example #6
0
 /// <summary>
 /// Adds the rigid body do object if there is no any.
 /// </summary>
 /// <param name="dragableBrick">Dragable brick.</param>
 void AddRigidBody(DragableBrick dragableBrick)
 {
     if (dragableBrick.GetComponent <Rigidbody>() == null)
     {
         var rigidBody = dragableBrick.gameObject.AddComponent <Rigidbody>();
         if (rigidBody != null)
         {
             rigidBody.isKinematic = true;
         }
     }
 }
Example #7
0
        /// <summary>
        /// Clone selected bricks.
        /// </summary>
        /// <param name="brick">Clicked brick being selected</param>
        /// <param name="eventData">Event data.</param>
        public void CloneSelection(DragableBrick brick, PointerEventData eventData)
        {
            List <SelectableBrick> clonedBricks = new List <SelectableBrick>();
            var bricks = SelectionManager.instance.GetSelected();

            //clone bricks
            foreach (var brickToClone in bricks)
            {
                var newBrick = BrickBuilder.Clone(brickToClone);
                clonedBricks.Add(newBrick as SelectableBrick);
            }

            //start moving
            base.OnBeginDrag(clonedBricks, eventData);
        }
Example #8
0
        public override bool OnEndDrag(DragableBrick brick, PointerEventData eventData)
        {
            if (brick == null)
            {
                return(true);
            }

            bool canEndDrag = base.OnEndDrag(brick, eventData);

            //restart add tool ar next frame
            if (canEndDrag)
            {
                ToolsManager.instance.StartCoroutine(RestartAdding(brick));
            }

            return(canEndDrag);
        }
Example #9
0
        /// <summary>
        /// Replace current dragged brick with new one/
        /// </summary>
        /// <param name="brick">Brick.</param>
        public virtual void ChangeBrick(DragableBrick brick)
        {
            var toDestroy = dragableBrick;

            OnEndMove?.Invoke();
            SelectionManager.instance.Clear();

            PrepareBrickToDrag(brick);
            dragableBrick = brick;
            var positioner = GetPositioner(brick);

            positioner.StartMoving(brick, brick.transform.position);

            OnStartMove?.Invoke(dragableBrick);

            UnityEngine.Object.DestroyImmediate(toDestroy.gameObject);
        }
Example #10
0
        public override bool OnEndDrag(DragableBrick brick, PointerEventData eventData)
        {
            if (dragableBrick == null)
            {
                return(true);
            }

            if (dragableBrick.isTransparent || !lastProposedPosition.isValid)
            {
                AudioSource.PlayClipAtPoint(Preferences.instance.errorSound, UnityEngine.Camera.main.transform.position);
                return(false);
            }

            RegisterHistory();
            EndDragging();

            return(true);
        }
Example #11
0
        public override bool OnBeginDrag(DragableBrick brick, PointerEventData eventData)
        {
            if (Input.GetKey(KeyCode.V))
            {
                return(false);
            }

            if (brick == null)
            {
                Debug.LogError("MoveTool.OnBeginDrag: brcik is null!");
                return(false);
            }

            PrepareBrickToDrag(brick);
            StartDrag(eventData);

            return(true);
        }
Example #12
0
        /// <summary>
        /// Prepare brics to be dragged
        /// </summary>
        /// <param name="bricks">Bricks.</param>
        void PrepareBricksToDrag(List <SelectableBrick> bricks)
        {
            if (bricks.Count == 0)
            {
                return;
            }

            if (bricks.Count == 1 && bricks[0] is DragableBrick)
            {
                PrepareBrickToDrag(bricks[0] as DragableBrick);
                dragableBrick = bricks[0] as DragableBrick;
            }
            else
            {
                dragableBrick = PrepereGroupToDrag(bricks);
            }
            AddRigidBody(dragableBrick);
        }
Example #13
0
        /// <summary>
        /// Prepare brick or all selected bric to be dragged.
        /// </summary>
        /// <param name="brick">Brick that is dragged</param>
        void PrepareBrickToDrag(DragableBrick brick)
        {
            if (SelectionManager.instance.SelectedAmount <= 1)
            {
                dragableBrick = brick;
                dragableBrick.SetHighlighted(false);
                dragableBrick.SetLayer(Preferences.instance.movingLayer);
                groupBrick = false;

                //prepare undo nodes
                historyNodes = HistoryTool.PrepareTransformNodes(brick.gameObject);
            }
            else
            {
                var selectedBricks = SelectionManager.instance.GetSelected();
                dragableBrick = PrepereGroupToDrag(selectedBricks);
            }

            dragableBrick.isDragging = true;
            AddRigidBody(dragableBrick);
        }
Example #14
0
        /// <summary>
        /// End drag operation
        /// </summary>
        void EndDragging()
        {
            SelectionManager.instance.RestoreSelectionEffect();

            OnEndMove?.Invoke();

            //remove all rigidbodies and disable reporing
            var bricks = dragableBrick.GetComponentsInChildren <TransparentBrick>();

            foreach (var brick in bricks)
            {
                var rigidBody = brick.gameObject.GetComponent <Rigidbody>();
                if (rigidBody != null)
                {
                    UnityEngine.Object.DestroyImmediate(rigidBody);
                }
                if (brick is DragableBrick)
                {
                    (brick as DragableBrick).isDragging = false;
                }
            }

            if (groupBrick)
            {
                var childBricks = dragableBrick.GetComponentsInChildren <DragableBrick>();
                foreach (var childBrick in childBricks)
                {
                    childBrick.transform.SetParent(dragableBrick.transform.parent);
                    childBrick.SetLayer(0); //set default layer
                }

                UnityEngine.Object.Destroy(dragableBrick.gameObject);
            }
            else
            {
                dragableBrick.SetLayer(0); //set default layer
            }
            isDragging    = false;
            dragableBrick = null;
        }
Example #15
0
        /// <summary>
        /// Check cursor keys and rotae brick if pressed
        /// </summary>
        /// <param name="brick">Brick.</param>
        void HandleRotationKeys(DragableBrick brick)
        {
            bool  snapToGrid   = ToolsManager.instance.snapToGridButton.isSelected;
            float rotationStep = snapToGrid ? 90 : Preferences.instance.moveToolRotationStep;

            if (Input.GetKeyDown(KeyCode.LeftArrow))
            {
                brick.transform.rotation = Rotate(brick.transform.rotation, 0, rotationStep);
            }
            else if (Input.GetKeyDown(KeyCode.RightArrow))
            {
                brick.transform.rotation = Rotate(brick.transform.rotation, 0, -rotationStep);
            }
            else if (Input.GetKeyDown(KeyCode.UpArrow))
            {
                brick.transform.rotation = Rotate(brick.transform.rotation, rotationStep, 0);
            }
            else if (Input.GetKeyDown(KeyCode.DownArrow))
            {
                brick.transform.rotation = Rotate(brick.transform.rotation, -rotationStep, 0);
            }
        }
Example #16
0
 public virtual void EndMoving()
 {
     brick = null;
 }
Example #17
0
 public override bool OnBeginDrag(DragableBrick brick, PointerEventData eventData)
 {
     return(false);
 }
Example #18
0
 public override bool OnEndDrag(DragableBrick brick, PointerEventData eventData)
 {
     return(base.OnEndDrag(brick, eventData));
 }
Example #19
0
 public void StartMoving(DragableBrick brick, Vector3 handlePoint)
 {
     this.brick = brick;
 }
Example #20
0
 /// <summary>
 /// Begin dragging. Added to provide bypas for derived classes to MoveTool.OnBeginDrag function.
 /// </summary>
 /// <param name="brick">Brick.</param>
 protected void BeginDrag(DragableBrick brick)
 {
     base.OnBeginDrag(brick, null);
 }
Example #21
0
 public virtual bool OnEndDrag(DragableBrick brick, UnityEngine.EventSystems.PointerEventData eventData)
 {
     return(true);
 }
Example #22
0
 public virtual void OnDrag(DragableBrick brick, UnityEngine.EventSystems.PointerEventData eventData)
 {
 }
        public void BeforeTests()
        {
            GameObject gameObject = new GameObject();

            brick = gameObject.AddComponent <DragableBrick>();
        }
Example #24
0
 public void EndMoving()
 {
     brick = null;
 }
 public void ShowProperties(DragableBrick brick)
 {
     ShowProperties(brick, brick is AgaQBrick);
 }
Example #26
0
        /// <summary>
        /// Tunrn off (set inactive) selected bricks
        /// and register it HistoryManager.
        /// </summary>
        public void DeleteSelected()
        {
            var currSelObject = EventSystem.current.currentSelectedGameObject;

            if (currSelObject != null)
            {
                var input = currSelObject.GetComponent <InputField>();
                if (input != null)
                {
                    return;
                }
            }

            var selectedBricks = SelectionManager.instance.GetSelected();

            SelectionManager.instance.Clear();

            if (selectedBricks.Count > 0 || isDragging)
            {
                DragableBrick dragObject = null;

                //if dragging is pending break it
                if (isDragging)
                {
                    dragObject = dragableBrick;
                    OnCancel();
                }

                //prepare state for undo
                HistoryNodeRemove[] historyNodes = selectedBricks.Count > 0 ?
                                                   HistoryTool.PrepareRemoveNodes(selectedBricks) :
                                                   HistoryTool.PrepareRemoveNodes(dragObject.gameObject);

                //remove selected bricks
                //(realy don't delete them, just set inactive to be able to do undo action)
                if (selectedBricks.Count > 0)
                {
                    foreach (var brick in selectedBricks)
                    {
                        if (brick is AgaQBrick)
                        {
                            (brick as AgaQBrick).ClearJoints();
                        }

                        brick.gameObject.SetActive(false);
                    }
                }
                else
                {
                    if (dragObject is AgaQBrick)
                    {
                        (dragObject as AgaQBrick).ClearJoints();
                    }

                    dragObject.gameObject.SetActive(false);
                }

                //register state in history
                HistoryManager.instance.Register(historyNodes);

                if (OnModelChange != null)
                {
                    OnModelChange();
                }
            }
        }
 public override void StartMoving(DragableBrick brick, Vector3 handlePoint)
 {
     cam = UnityEngine.Camera.main;
     base.StartMoving(brick, handlePoint);
 }