/// <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; }
/// <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; } }
/// <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); }
/// <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); } }
/// <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; } } }
/// <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); }
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); }
/// <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); }
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); }
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); }
/// <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); }
/// <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); }
/// <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; }
/// <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); } }
public virtual void EndMoving() { brick = null; }
public override bool OnBeginDrag(DragableBrick brick, PointerEventData eventData) { return(false); }
public override bool OnEndDrag(DragableBrick brick, PointerEventData eventData) { return(base.OnEndDrag(brick, eventData)); }
public void StartMoving(DragableBrick brick, Vector3 handlePoint) { this.brick = brick; }
/// <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); }
public virtual bool OnEndDrag(DragableBrick brick, UnityEngine.EventSystems.PointerEventData eventData) { return(true); }
public virtual void OnDrag(DragableBrick brick, UnityEngine.EventSystems.PointerEventData eventData) { }
public void BeforeTests() { GameObject gameObject = new GameObject(); brick = gameObject.AddComponent <DragableBrick>(); }
public void EndMoving() { brick = null; }
public void ShowProperties(DragableBrick brick) { ShowProperties(brick, brick is AgaQBrick); }
/// <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); }