66 Commits
Author SHA1 Message Date
MachinePainting ec494703b4 Move the node to the Transform subcategory
CATEGORY is now "MachinePaintingNodes/Transform", so it renders as
"MachinePaintingNodes / Transform" in the node menu.

"Rotate" is no longer needed in the category, since the display name
carries it - Transform & Rotate Pro is already found by searching
"rotate", and so is the DESCRIPTION text.

One level deep, consistent with Mask, Filter, Color and Blend. README
updated to match.
v2.2.0
2026-09-03 03:41:19 -07:00
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 3a574494eb Add short DESCRIPTION text to all 41 nodes
None of the nodes showed description text in ComfyUI because ComfyUI
reads obj_class.DESCRIPTION when it builds node_info - it does not read
the class docstring, which is what these nodes had.

Every registered node now carries a one-line DESCRIPTION, kept to
29-67 characters so it fits the limited space in ComfyUI Manager and
the node search results. Image Transform Pro's four-sentence
description is shortened to match.

Descriptions are derived from each node's existing docstring, or from
the README for the five classes that had no docstring
(ImageBlendPro, ColorMatchBlend and the three Boolean switch nodes).

README also updated for the recent changes: the New Nodes table now
lists the real "Rotate & Scale" category, the XY placement direction is
documented on both nodes (positive X right, positive Y up), and the
v2.2.0 changelog records the placement convention, the node outputs and
the MP_ImageTransform internal name.
2026-09-03 03:32:00 -07:00
MachinePainting 21fbdb901e Flip offset_y so positive moves up, and use the Rotate & Scale category
offset_y was following the raw pixel convention where Y grows downward,
so dragging the slider right pushed the image down. Negated it in
build_matrix so both placement sliders now read the same way: drag
right for right/up, drag left for left/down.

One edit covers both nodes, since Image Transform Pro and Remove
Background Pro share build_matrix.

This is the opposite sign to Photoshop's transform Y field, which is a
deliberate choice: on a centre-zero slider "more" reading as "up" is
more intuitive than matching pixel coordinates.

Category is now "MachinePaintingNodes/Rotate & Scale" - a single
subcategory using "&" rather than "/", which ComfyUI would have split
into nested submenus. Keeps the node one level deep like the rest of
the pack. README heading updated to match.
2026-09-03 03:21:23 -07:00
MachinePainting 2b7afb9931 Move Image Transform Pro to the Rotate/Scale category
CATEGORY is now "MachinePaintingNodes/Rotate/Scale", so the node sits
under MachinePaintingNodes > Rotate > Scale in the node menu.

Spaces around the slashes are deliberately omitted: ComfyUI splits
CATEGORY on "/" to build the submenus, and a segment of
"MachinePaintingNodes " with a trailing space would not match the
existing "MachinePaintingNodes" root, creating a second top-level menu.

README node-table heading updated to match.
2026-09-03 03:19:01 -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 b88d7fbe6d Make the Image Rotate mask input cut the image out
The mask input was transformed and sent to the mask output, but the
image output ignored it entirely - the image came out as a full
un-masked rectangle, so connecting a mask appeared to do nothing.

The rotated mask now drives what stays visible in the image: whatever
it leaves out is filled with the selected background (transparent,
black or white). The mask is multiplied by the coverage of the
transformed image, so an all-white mask still cannot claim area outside
the image itself. With no mask supplied, behaviour is unchanged - the
transformed image extent becomes the mask.

The in-node transparency-grid preview follows the same visibility, so
what you see matches the image output.
2026-09-03 03:00:39 -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 b3c8f01a6b Prefix Image Rotate internal name with MP_ to avoid pack collisions
ImageRotate is a generic internal name that other node packs also
register. ComfyUI merges every pack's NODE_CLASS_MAPPINGS into a single
dict, so identical keys silently overwrite each other and whichever pack
loads last wins - leaving the node missing from the menu.

Renamed the registration key to MP_ImageRotate in both NODE_CLASS_MAPPINGS
and NODE_DISPLAY_NAME_MAPPINGS, matching the existing MP_ImageMaskSwitch
precedent and rule 5 in CLAUDE.md. The Python class name and the
"Image Rotate" display name are unchanged. Safe to rename now because
the node has not shipped in a release, so no saved workflow refers to
the old key.
2026-09-03 02:44:52 -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
MachinePainting 2c2df98f0a v2.1.4 - Clear registry Icon metadata to fix broken avatar v2.1.4 2026-05-07 20:30:51 -07:00
MachinePainting de42b75641 Clear registry Icon metadata (registry expects URL not emoji) [skip ci] 2026-05-07 19:31:16 -07:00
MachinePainting 271b24849c v2.1.3 - Compat fixes: align OpenCV deps, Pillow Resampling, JS absolute imports, registry icon
- Aligned pyproject.toml and requirements.txt to opencv-python-headless (resolves install conflicts on headless servers)
- Replaced deprecated Image.LANCZOS with Image.Resampling.LANCZOS for Pillow 11+ compatibility
- Pinned numpy<3 to avoid breakage when NumPy 3 ships
- Standardized JS frontend imports to absolute /scripts/app.js paths
- Added emoji icon to [tool.comfy] registry metadata
v2.1.3
2026-05-07 19:10:03 -07:00
MachinePainting 73e987305d Expand .gitignore to cover AI agent files (CLAUDE.md, AGENTS.md, GEMINI.md, etc.) 2026-05-07 18:45:39 -07:00
MachinePainting c2db470b77 Update README to match current node features 2026-03-28 10:05:41 -07:00
MachinePainting c864dcf0f7 v2.1.2 - Fix frequency separation to match Photoshop, simplify Blur Pro and Inpaint Mask Pro
Fixes:
- Frequency Separate: locked to Photoshop Apply Image formula (Scale 2, Offset 128, Subtract), removed mode/epsilon
- Frequency Combine: locked to Linear Light blend, added opacity slider, removed mode/epsilon

Updates:
- Blur Pro: removed distance and iterations params, motion blur uses radius, box blur single pass
- Inpaint Mask Pro: removed SEGS support, inpaint_mask now required
v2.1.2
2026-03-28 10:03:40 -07:00
MachinePainting 7b0a60ddd7 Remove unused JS files for blur_pro and inpaint_mask_pro 2026-03-28 06:47:56 -07:00
MachinePainting 60e977c682 v2.1.1 - Add Mask Composite Pro 2X/6X, update Inpaint Mask Pro and Blur Pro
New Nodes:
- Mask Composite Pro 2X: combine 2 masks with per-mask blur/grow-shrink/opacity, screen blend, output selector, invert
- Mask Composite Pro 6X: combine up to 6 masks with same features

Updates:
- Inpaint Mask Pro: added expand/shrink, removed SEGS (simplified to image + mask), inpaint_mask now required, multi-color overlay
- Blur Pro: type-specific sliders marked as advanced for cleaner default view
- Widget visibility uses Python "advanced" flag for new ComfyUI frontend compatibility
- Added CLAUDE.md with versioning and registration rules
- Bump to v2.1.1, 40 nodes total
v2.1.1
2026-03-28 06:43:19 -07:00
MachinePainting 95e4b9e2ce v2.1.0 - Add 6 new nodes: Blur Pro, Noise Grain Pro, Frequency Separate/Combine, Inpaint Mask Pro, Image <> Mask Switch
New Nodes:
- Blur Pro: 5 blur types (Gaussian, Surface, Box, Median, Motion) with dynamic UI, mask support, large radius optimization, preview
- Noise Grain Pro: Film grain with size, sharpness, color/mono, 6 blend modes, seed, mask support
- Frequency Separate: Split image into high/low frequency layers for retouching (subtract/divide modes)
- Frequency Combine: Recombine edited frequency layers
- Inpaint Mask Pro: Inpaint mask management with mask cropping, SEGS support, multi-color overlay preview
- Image <> Mask Switch: Toggle conversion between IMAGE and MASK types

Also: updated README, version bump to 2.1.0, added .claude/ and .codex/ to .gitignore
v2.1.0
2026-03-27 22:41:06 -07:00
MachinePainting 2f6f72bb37 Bump version to 2.0.7 to republish updated description v2.0.7 2026-03-26 01:24:19 -07:00
MachinePainting fa17f5e7ba Update project description in pyproject.toml 2026-03-26 01:22:13 -07:00
MachinePainting aebc98af0a fix: add opencv-python-headless to requirements.txt
The requirements.txt was missing opencv-python-headless, which is
imported by 7 node files at the top level. When cv2 is not installed,
the entire module fails to load silently, causing KeyError for all
nodes including SeedLock.
v2.0.6
2026-03-09 03:11:16 -07:00
MachinePainting 58554c26b6 v2.0.5 - Update README with Z-Image Empty Latent Image node and changelog 2026-03-08 22:48:37 -07:00
MachinePainting 8c28fb25e8 v2.0.5 - Fix pyproject.toml version and correct node count 2026-03-08 11:16:57 -07:00
MachinePainting 1e92baa333 v2.0.5 - Fix ZImageEmptyLatentImage broken import
Replace fragile top-level `from nodes import EmptyLatentImage` with
a direct torch implementation, fixing plugin load failure. Also update
version string and add _old/ to .gitignore.
v2.0.5
2026-02-20 09:45:22 -08:00
MachinePainting 98ecf1afe8 v2.0.4 - Add Z-Image Empty Latent Image node v2.0.4 2026-02-14 00:48:46 -08:00
MachinePainting f332c3d69f v2.0.3 - Add Show Value, Mega Slider Master Value, Mega Sliders X1/X3/X6/X12, Dynamic Value Range 2026-02-12 15:13:08 -08:00
MachinePainting 40b9642eac v2.0.3 - Add Show Value, Mega Sliders X1/X3/X6/X12, Dynamic Value Range v2.0.3 2026-02-12 04:10:14 -08:00
MachinePainting 2c76d5465b Add Text String node, fix Show Text display with JS 2026-02-12 01:13:35 -08:00
MachinePainting 719e11419e Add Text String node, fix Show Text display 2026-02-12 01:06:43 -08:00
MachinePainting 58bd25504e Organize nodes into subcategories 2026-02-12 00:55:57 -08:00
MachinePainting dfb528694a v2.0.2 - Add Text Notes and Show Text nodes v2.0.2 2026-02-12 00:41:15 -08:00
MachinePainting 62b1c0600f v2.0.2 - Add Text Notes and Show Text nodes 2026-02-12 00:38:40 -08:00
MachinePainting 252b4aeab8 Add additional node display images 2026-02-03 03:27:15 -08:00
MachinePainting da8c3bf602 Update README with images 2026-02-03 03:22:01 -08:00
MachinePainting 6a05035a9f Add additional node display images 2026-02-03 03:20:40 -08:00
MachinePainting 2bde7f986b Update README with images 2026-02-03 03:01:51 -08:00
MachinePainting 9eabf8b1c4 Update README with images 2026-02-03 03:00:07 -08:00
MachinePainting 47b2558664 Add additional node display images 2026-02-03 02:41:49 -08:00
MachinePainting 9fe9391212 Add additional node display images 2026-02-03 02:25:28 -08:00
MachinePainting 339127d6de add node image to readme 2026-02-03 02:20:56 -08:00
MachinePainting a7377debfc Update selective color button, add images 2026-02-03 02:17:18 -08:00
MachinePainting 1b2cf46990 Update gitignore to add images 2026-02-03 02:15:31 -08:00
MachinePainting 20065e2513 Add blend modes to color nodes, fix selective color smoothness 2026-02-02 06:18:40 -08:00
MachinePainting d938ae3b4d Remove size params, add line_thickness to histogram 2026-02-02 04:56:01 -08:00
MachinePainting 8d85dbd88d v2.0.1 - Improved curve smoothness with weighted tangent averaging 2026-02-02 04:17:17 -08:00
MachinePainting df54be13ac Enhance README description for ComfyUI
Updated project description for clarity and detail.
2026-02-02 02:38:45 -08:00
MachinePainting be8072739f Update README by removing image
Removed image from README and adjusted content.
2026-02-02 02:08:57 -08:00
MachinePainting dbafc4ee7d Fix boolean nodes to restore original functionality 2026-02-02 01:42:34 -08:00