5 Commits
Author SHA1 Message Date
MachinePainting 4129bfe434 Rename the node to Transform & Rotate Pro
"Rotate" is the word people actually search for, and almost nothing in
the ecosystem registers under that name, so keeping it in the display
name is worth more than a tidier one. The node menu now shows
"Transform & Rotate Pro", and the class is TransformRotatePro to match.

The registration key stays MP_ImageTransform on purpose. That key is
what saved workflows and placed nodes reference, so changing it again
would break any node already dropped on a canvas. The key is never
shown in the UI, so there is no cost to leaving it as it is - a comment
in __init__.py records why it differs from the class name.

Category is unchanged at MachinePaintingNodes/Rotate & Scale. README
updated throughout.
2026-09-03 03:40:04 -07:00
MachinePainting f925929ddf Rename Image Rotate to Image Transform Pro
The node does rotate, scale, move, canvas resize, mask cut-out and
background fill, so "rotate" undersold it. "Transform" is the standard
term for rotate + scale + translate, matches the existing
MachinePaintingNodes/Transform category, matches the pack's "... Pro"
convention, and leaves room for flip / skew / corner-pin later.

  image_rotate.py     -> image_transform.py
  class ImageRotate   -> ImageTransformPro
  MP_ImageRotate      -> MP_ImageTransform
  display name        -> Image Transform Pro

Also adds a DESCRIPTION attribute. ComfyUI reads DESCRIPTION rather
than the docstring for the node tooltip and indexes it for node search,
so the node is still found by typing "rotate", "scale" or "move" even
though those words are no longer in its name.

Free to rename: the node has never shipped in a release, so no saved
workflow refers to the old key.
2026-09-03 03:09:15 -07:00
MachinePainting 766d69bdaf Add zoom to the Remove Background Pro rotation block
Mirrors the Image Rotate node: a centre-zero, exponential zoom slider
(-100 = 0.25x, -50 = 0.5x, 0 = 1.0x, +50 = 2x, +100 = 4x) sitting
between the angle and the XY placement sliders, and gated by the same
enable_rotation toggle.

The canvas never grows, so zooming in crops at the frame and zooming
out leaves empty edges (image black, mask 0). Image and mask ride the
same matrix, so every output stays registered.
2026-09-03 03:00:32 -07:00
MachinePainting 09062bb124 Fix rotation widgets overlapping the preview in Remove Background Pro
The rotation widgets were hidden by setting `type = "hidden"` and a
computeSize of [0, -4]. That is the older ComfyUI technique and the
current frontend does not support it: there is no "hidden" widget type,
and both isWidgetVisible() and getLayoutWidgets() key off a boolean
`hidden` flag instead.

The result was that the four collapsed widgets still counted as visible,
stayed in the layout pass, and were drawn at zero height on top of the
widgets below them, pushing the node's preview image up over the
sliders. Remove Background Pro on main was unaffected because it has no
hidden widgets.

Hide with `widget.hidden` instead, which drops the widget from the
layout pass entirely. Also swapped the toggle reflow to litegraph's own
expandToFitContent(), which grows the node to clear newly shown widgets
without ever shrinking it, so the preview keeps the room it had.
2026-09-03 02:47:54 -07:00
MachinePainting ea2a2021f8 v2.2.0 - Add Image Rotate node and rotation controls for Remove Background Pro
Image Rotate (new node): rotate, zoom and reposition an image inside a
definable canvas. Free or fixed (45 degree snap) rotation, centre-zero
angle slider (CCW left, CW right), exponential centre-zero zoom
(-100 = 0.25x, +100 = 4x), percent-based XY placement, and
transparent/black/white background fill. An optional mask input rides
the identical matrix so it stays registered to the image. Canvas W/H
inputs default to 0, meaning "match the incoming image".

Remove Background Pro: rotation block added at the bottom of the
settings (enable toggle, free/fixed method, angle slider, XY
placement). Applied after removal so rembg always segments the upright
image; the canvas stays at the original size and image, mask,
masked_image, mask_bw and passthrough are all warped by the same
matrix.

New transform_utils module keeps the rotate/zoom/offset math identical
across both nodes. js/image_transform.js snaps the angle slider to 45
degree steps in fixed mode and hides the rotation widgets until the
toggle is on; Python snaps too, so the result is correct regardless of
frontend version.
2026-09-03 02:26:27 -07:00