// Update is called once per frame void Update() { if (dragging) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // ray to ground plane if (dragPlane.Raycast(ray, out rayDistance)) { if (typeOfHandle == HandleType.translateY) { // maybe add maximum Vector3 newPos = connectObject.transform.position + Vector3.Project((ray.GetPoint(rayDistance) + offsetOnDragBegin) - connectObject.transform.position, connectObject.transform.up); newPos = Vector3.ClampMagnitude(RasterManager.Instance.Raster(newPos), 10f); // check y is not below 0 if (newPos.y < 0f) { newPos = new Vector3(newPos.x, 0f, newPos.z); } connectObject.transform.position = newPos; } else if (typeOfHandle == HandleType.ScaleUniform) { Vector3 newPos = connectObject.transform.position + Vector3.Project((ray.GetPoint(rayDistance) + offsetOnDragBegin) - connectObject.transform.position, connectObject.transform.up); newPos = Vector3.ClampMagnitude(RasterManager.Instance.Raster(newPos), 10f); // check y is not below 0 if (newPos.y < 0f) { newPos = new Vector3(newPos.x, 0f, newPos.z); } // get new scale Top to Bottom Vector3 newTopToBottom = newPos - connectObject.boundingBox.GetBottomCenter(); // scale accordingly Vector3 newScale = scaleOneBeginDrag * (newTopToBottom.magnitude / InitialTopToBottom.magnitude); connectObject.cube.transform.parent.localScale = Vector3.ClampMagnitude(new Vector3(Mathf.Max(0.4f, newScale.x), Mathf.Max(0.4f, newScale.y), Mathf.Max(0.4f, newScale.z)), 7f); connectObject.boundingBox.CalculateBoundingBox(); // use update bb from master thesis connectObject.boundingBox.DrawBoundingBox(); connectObject.PlaceHandles(); } else if (typeOfHandle == HandleType.ScaleNonUniform) { Debug.Log("nonuniform in action"); Vector3 newPos = transform.parent.position + Vector3.Project((ray.GetPoint(rayDistance) + offsetOnDragBegin) - transform.parent.position, transform.parent.forward); newPos = RasterManager.Instance.Raster(newPos); // get new scale Top to Bottom Vector3 newHandleToCenter = newPos - connectObject.boundingBox.GetCenter(); // scale accordingly Vector3 newScale = scaleOneBeginDrag * (newHandleToCenter.magnitude / InitialHandleToCenter.magnitude); //connectObject.cube.transform.parent.localScale = Vector3.ClampMagnitude(new Vector3(Mathf.Max(0.4f, newScale.x), Mathf.Max(0.4f, newScale.y), Mathf.Max(0.4f, newScale.z)), 7f); // apply only to one direction newScale = Vector3.Project(newScale, transform.parent.forward); if (newScale.x <= 0.01f) { newScale = new Vector3(connectObject.cube.transform.parent.localScale.x, newScale.y, newScale.z); } if (newScale.y <= 0.01f) { newScale = new Vector3(newScale.x, connectObject.cube.transform.parent.localScale.y, newScale.z); } if (newScale.z <= 0.01f) { newScale = new Vector3(newScale.x, newScale.y, connectObject.cube.transform.parent.localScale.z); } connectObject.cube.transform.parent.localScale = newScale; connectObject.boundingBox.CalculateBoundingBox(); // use update bb from master thesis connectObject.boundingBox.DrawBoundingBox(); connectObject.PlaceHandles(); } else if (typeOfHandle == HandleType.Rotate) { Debug.Log("Rotation in action"); } } } }