/** * Draw a working scale handle in 2d space. */ public static Vector2 ScaleHandle2d(int id, Vector2 position, Vector2 scale, int size) { Event e = Event.current; Vector2 mousePosition = e.mousePosition; int width = size / 4; Handles.color = HANDLE_COLOR_UP; Handles.DrawLine(position, position - Vector2.up * size * scale.y); if (position.y - size > 0f) { Handles.CubeCap(0, ((Vector3)((position - Vector2.up * scale.y * size))) - Vector3.forward * 16, QuaternionUp, width / 3); } Handles.color = HANDLE_COLOR_RIGHT; Handles.DrawLine(position, position + Vector2.right * size * scale.x); if (position.y > 0f) { Handles.CubeCap(0, ((Vector3)((position + Vector2.right * scale.x * size))) - Vector3.forward * 16, Quaternion.Euler(Vector3.up * 90f), width / 3); } Handles.color = HANDLE_COLOR_SCALE; Handles.CubeCap(0, ((Vector3)position) - Vector3.forward * 16, QuaternionUp, width / 2); // If a Tool already is engaged and it's not this one, bail. if (currentId >= 0 && currentId != id) { return(scale); } Rect handleRectUp = new Rect(position.x - width / 2, position.y - size - HANDLE_PADDING, width, size + HANDLE_PADDING); Rect handleRectRight = new Rect(position.x, position.y - width / 2, size + 8, width); Rect handleRectCenter = new Rect(position.x - width / 2, position.y - width / 2, width, width); if (currentId == id) { switch (e.type) { case EventType.MouseDrag: Vector2 diff = axisConstraint.Mask(mousePosition - initialMousePosition); diff.x += size; diff.y = -diff.y; // gui space Y is opposite-world diff.y += size; scale = diff / size; if (axisConstraint == pb_HandleConstraint2D.None) { scale.x = Mathf.Min(scale.x, scale.y); scale.y = Mathf.Min(scale.x, scale.y); } break; case EventType.MouseUp: case EventType.Ignore: currentId = -1; break; } } else { if (e.type == EventType.MouseDown && ((!limitToLeftButton && e.button != MIDDLE_MOUSE_BUTTON) || e.button == LEFT_MOUSE_BUTTON)) { if (handleRectCenter.Contains(mousePosition)) { currentId = id; handleOffset = position - mousePosition; initialMousePosition = mousePosition; axisConstraint = new pb_HandleConstraint2D(1, 1); } else if (handleRectRight.Contains(mousePosition)) { currentId = id; handleOffset = position - mousePosition; initialMousePosition = mousePosition; axisConstraint = new pb_HandleConstraint2D(1, 0); } else if (handleRectUp.Contains(mousePosition)) { currentId = id; handleOffset = position - mousePosition; initialMousePosition = mousePosition; axisConstraint = new pb_HandleConstraint2D(0, 1); } } } return(scale); }
/** * A 2D GUI view position handle. * @param id The Handle id. * @param position The position in GUI coordinates. * @param size How large in pixels to draw this handle. */ public static Vector2 PositionHandle2d(int id, Vector2 position, int size) { int width = size / 4; Rect handleRectUp = new Rect(position.x - width / 2, position.y - size - HANDLE_PADDING, width, size + HANDLE_PADDING); Rect handleRectRight = new Rect(position.x, position.y - width / 2, size, width + HANDLE_PADDING); Handles.color = Color.yellow; Handles.CircleCap(-1, position, Quaternion.identity, width / 2); Handles.color = HANDLE_COLOR_UP; // Y Line Handles.DrawLine(position, position - Vector2.up * size); // Y Cone if (position.y - size > 0f) { Handles.ConeCap(0, ((Vector3)((position - Vector2.up * size))) - ConeDepth, QuaternionUp, width / 2); } Handles.color = HANDLE_COLOR_RIGHT; // X Line Handles.DrawLine(position, position + Vector2.right * size); // X Cap if (position.y > 0f) { Handles.ConeCap(0, ((Vector3)((position + Vector2.right * size))) - ConeDepth, QuaternionRight, width / 2); } // If a Tool already is engaged and it's not this one, bail. if (currentId >= 0 && currentId != id) { return(position); } Event e = Event.current; Vector2 mousePosition = e.mousePosition; Vector2 newPosition = position; if (currentId == id) { switch (e.type) { case EventType.MouseDrag: newPosition = axisConstraint.Mask(mousePosition + handleOffset) + axisConstraint.InverseMask(position); break; case EventType.MouseUp: case EventType.Ignore: currentId = -1; break; } } else { if (e.type == EventType.MouseDown && ((!limitToLeftButton && e.button != MIDDLE_MOUSE_BUTTON) || e.button == LEFT_MOUSE_BUTTON)) { if (Vector2.Distance(mousePosition, position) < width / 2) { currentId = id; handleOffset = position - mousePosition; axisConstraint = new pb_HandleConstraint2D(1, 1); } else if (handleRectRight.Contains(mousePosition)) { currentId = id; handleOffset = position - mousePosition; axisConstraint = new pb_HandleConstraint2D(1, 0); } else if (handleRectUp.Contains(mousePosition)) { currentId = id; handleOffset = position - mousePosition; axisConstraint = new pb_HandleConstraint2D(0, 1); } } } return(newPosition); }