Skip to content

Trim Sheet

Node icon
Generator

Divide a sheet into named, colored trims in any layout, cut-outs and empty space included: a trim sheet template whose layout copies straight into Blender’s ZenUV add-on, or into other tools through Export Data.

A trim sheet is one texture divided into strips, and each strip, a trim, is a material that a modeler maps faces onto: a metal edge, a rubber seal, a painted panel. Trim Sheet makes the template in one node, every trim with its own name, size, and color. A new sheet is rows stacked from top to bottom, each holding trims side by side; from there any trim can be cut again in either direction, space can stay empty, and a trim can hold smaller trims cut out of it (see Cuts, empty space, and cut-outs).

Have a trim sheet texture already, painted elsewhere, baked, or bought? Wire it into the optional Source input and lay the trims over it instead of starting from a blank layout; see Starting from a texture you already have.

OutputWhat it is
SheetThe whole sheet, each trim filled with its color, opaque except for any Padding and empty space. The first output and what the Preview shows by default. Wire it into Export Image for the picture and into Export Data for the layout.
TrimsA batch with one image per trim, at the trim’s size, named after the trim and carrying its color. Use it to make each material on its own, then rebuild the sheet with Arrange’s Original Positions. With a Source wired and Trims Output set to Source, each image is that trim cut from your texture instead.

A new node is a 2048 x 2048 sheet of four 512 px rows named Trim, Trim.001, Trim.002, and Trim.003, each holding one trim.

  • Width and Height set the sheet, from 1 to 8192 pixels. Changing either one rescales every cut and trim to match, in the same undo step. With a Source wired, the sheet takes the source’s size instead, up to 16384 pixels.
  • The last part of every cut takes the rest. In a plain row layout that is the last row and each row’s last trim; deeper in, it is the last part of that cut, whichever way the cut runs. That is how the layout stores its sizes, so when the sheet grows or shrinks, the last parts take up the difference.
  • Every size is a number you can type, the last part’s included: the selected trim’s Width and Height (see The panel). A size trades with exactly one neighbor, so one line moves and everything else stays put, and the neighbor keeps at least 1 px, so nothing can overflow the sheet.
  • Padding (px) (0 to 128, default 0) opens a gap between neighboring trims so mipmaps never bleed one trim’s color into the next. Each edge two trims share gives half the Padding to each side, so the gap between two neighbors equals Padding. A trim that holds cut-outs is inset around each of them too. A sheet border is never inset and the sheet never grows, so a full-width strip still runs edge to edge and still tiles. The gap is transparent on the Sheet output; each trim’s place, its image in Trims, and the rectangles Export Data writes are the padded trim, while the panel’s sizes and the canvas lines stay the whole slot. While you drag a line the slots paint whole, and the gaps come back when you let go. Each trim’s place remembers the Padding, so when the trims go back together, Arrange’s Extrude on Auto (the default) closes every gap by itself.

The Trims section opens with a toolbar. On the left, Split Left/Right, Split Top/Bottom, and Remove act on the selected trim, each grayed with the reason when it cannot act. On the right it reads the count (7 trims; with a source wired, Detect Trims sits there instead), and the menu button opens the Trims list’s menu.

The Trims list shows one compact line per trim in reading order, top to bottom and then left to right: a grip, its swatch, its name, and its size as W x H. Plain rows get a thin rule between them, and a trim’s cut-outs are listed right after it, indented under it.

  • Click a line to select that trim, together with the canvas; the first trim is selected when you start.
  • Double-click a name to rename the trim in place: type and press Enter, or click anywhere else. Escape, or an empty name, keeps the old one. Rename in the list’s menu does the same.
  • Drag a grip to move a trim. In plain rows, a row’s first trim moves the whole row and any other trim moves within its row; otherwise the trim moves, with its cut-outs, among its neighbors in its cut.

Under the list, the Selected Trim section edits the selected trim. With empty space selected on the canvas, it reads Empty space, 420 x 92 and offers Fill instead (see Filling empty space).

The rows for a trim:

RowWhat it does
ColorClick the swatch to pin a color and open the picker; right-click it for Auto Color. The label reads Pinned or Auto.
Width (px)The trim’s width in the nearest side-by-side cut around it, a slider from 1 px to what is available. It trades with the next part of that cut, or with the part before it when the trim is the last, so only the one line between them moves.
Height (px)The same, in the nearest stacked cut.

A trim with no such cut around it spans its whole section that way: its size reads grayed, and hovering it says why (Width is fixed: this trim spans its whole section.). A size its neighbor cannot give is clamped, and the panel says why (Width is limited to 640 px: its neighbor keeps at least 1 px.). The canvas is the main way to size trims; the panel is for names, colors, and exact numbers.

While the Preview shows the Sheet view, or the Source view when a source is wired, the node draws its trims’ lines over the picture:

  • Drag a line to trade size between the two parts it separates, at any depth. One grows exactly as much as the other shrinks, nothing else moves, and both sizes show in pixels at the line. Where two lines meet, you grab the one belonging to the shallower cut.
  • Hold Ctrl to snap: to steps of 1/32 of the sheet, to the trim edges across the line, and to guides. With a source wired, a line also snaps to the texture’s own seams, and the guide reads Seam or Grid. It follows View > Manipulator Snapping.
  • Click a trim to select it, in sync with the panel list. Click empty space to select it; it is hatched (see Filling empty space).
  • Right-click a trim for Split Left/Right, Split Top/Bottom, Leave Empty, and Remove, or empty space for Fill.
  • Drag from empty space to draw a trim (around whole trims too), drag a trim to move it, or Shift-drag on a trim to draw a cut-out (see Drawing and moving trims).
  • With Info on, each trim’s name is drawn inside it, where it fits.

Each gesture is one undo step.

ActionWhat it does
Split Left/RightA vertical cut: a new trim to the right of the selected one takes half its width.
Split Top/BottomA horizontal cut through the selected trim only: a new trim below it takes half its height, and its neighbors are untouched. A new full-width strip comes from splitting a full-width strip.
Leave EmptyOn the canvas, when you right-click a trim: the trim goes and its space stays empty. On a trim that holds cut-outs, the cut-outs stay where they are.
RemoveAlso Delete or Backspace with the pointer over the Preview. The selected trim goes and a neighbor takes its space: the trim before it (to its left or above), else the one after it. A trim alone in its row takes the row with it, and that height goes to the row above, else the one below; at any depth, a trim alone in its part of a cut takes that part with it the same way.

A trim that holds cut-outs cannot be split or removed (Remove its cut-outs or leave them empty first.), but Leave Empty still works on it. The sheet’s last trim cannot be left empty or removed. Delete does nothing in either case, nor while empty space is selected, and a guide selected in the Preview keeps Delete for itself.

A new trim is named after the one it was split from, Blender style: splitting Edge gives Edge.001, then Edge.002, never a name already on the sheet.

The layout is a tree of cuts. A cut divides a section into parts stacked top to bottom or side by side, and the last part takes the leftover at every level, so a cut always fills its section exactly. A part is another cut, a trim, or empty space. A plain row layout is a stack of side-by-side cuts, so a sheet from an earlier version opens and cooks exactly as it did.

  • Empty space is not a trim: it has no name, no line in the Trims list, no frame in the Trims batch, and no row in Export Data, and it is transparent on the Sheet output. Use it for the parts of a sheet nobody maps to.
  • Cut-outs. A trim can hold smaller trims cut out of it. Each cut-out lies wholly inside it, and the part they do not cover stays the trim, so the Sheet shows the innermost trim wherever a cut-out lies. Trims never overlap partway: either they sit side by side or one lies wholly inside another.
  • A trim with cut-outs arrives in the Trims batch as its full rectangle with the cut-outs transparent, so its branch and Arrange work on exactly the region meant. Export Data’s rows and Copy Trims for ZenUV use its full rectangle.
  • Padding insets a trim around each of its cut-outs as well as at its outer edge.

A cut holds up to 64 parts, and cuts nest up to 16 levels deep.

  • Drag from empty space to draw a trim, and the cuts that place it are made for you. The box may reach across empty space and over whole trims: the trims wholly inside it become the new trim’s cut-outs, keeping their names, colors, and identities, and the rest of the sheet keeps its layout. A box that would cut partway through a trim is outlined red with Cuts through Concrete (that trim’s name) at the cursor, and letting go does nothing. The whole sheet, or a whole parent, cannot become one trim. Its size in pixels shows while you drag, and Ctrl snaps to seams, the 1/32 grid, trim edges, and guides, so a box lands on trim edges easily.
  • Drag a trim that has empty space beside it to move it: it trades size with the empty space on either side, and a gap that shrinks to nothing is dropped when you let go. A trim with no empty space beside it does not move; dragging it only selects it.
  • Shift-drag on a trim to draw a cut-out inside it. On a parent’s visible part, Shift-drag draws a cut-out of that parent; the box stays inside the parent and may go around its cut-outs the same way.
  • The cursor tells you which before you press: a crosshair draws (over a trim, while Shift is held), a four-way arrow moves, and the plain arrow means a drag only selects. A drag under 4 screen pixels is a click.

Click empty space on the canvas to select it: it is hatched, and the panel’s Selected Trim section reads Empty space, 420 x 92 with one button, Fill. Fill makes that space a trim, named Trim (or the next free name, Trim.001, Trim.002, and so on) with an auto color, and selects it. Right-clicking empty space offers Fill too. It is one undo step. Empty space inside a parent trim is part of that parent: clicking it selects the parent, and Shift-drag there draws a cut-out of it.

You do not have to author a trim sheet from scratch. The optional Source input takes one image or one texture set, such as a trim sheet painted in another app, baked, or bought, and you lay the trims over it. It reads one sheet, not a batch: a batch stops the node with Trim Sheet reads one sheet. Pick one with Split first.

  • The sheet takes the source’s size. Width and Height are grayed with Size comes from the source., and the layout is scaled to fit. When the layout was drawn at another size, a note under Padding says so (Layout drawn for 2048 x 2048, scaled to the source's 4096 x 4096.), and Match Source Size writes the scaled layout at the source’s size in one undo step; any edit you make while they differ does the same. Unwire the source and the stored size comes back untouched.
  • The Source view. While a source is wired, a third Preview button, Source, shows the texture with the trims drawn over it: each trim tinted in its color, outlined, and named when Info is on. Drag the lines there exactly as on the Sheet view. Wiring a source switches the Preview to Source, and a node with a source opens there; pick Sheet instead and it stays on Sheet. A texture set shows its map strip, opening on Base Color.
  • Detect Trims. The Detect Trims button in the Trims toolbar measures the texture and proposes a layout from its own seams, at any depth. While its popover is open, the Source view shows only the proposal, as dashed outlines with the names the trims will get. Sensitivity (0 to 1, default 0.5) sets how readily a seam becomes a line: raise it to find more lines, including seams that cross only part of a section’s width (or height, for the other direction); lower it to keep only seams that cross the whole section. The popover reads the counts (11 trims, 3 cut-outs, 2 empty areas, padding 8 px, or 4 rows, 11 trims, padding 8 px for a plain row texture), how many trims keep their names and how many are new, and how many seams stop partway across and are left as part of the texture. Apply writes the layout, the Padding, and the source size in one undo step; Cancel, or Escape, changes nothing. Detecting again keeps each existing trim’s name, color, and identity where the new trim covers it.
  • How Detect reads a texture. It cuts a region again wherever seams cross it, down to four levels of cuts (a set of cut-outs counts as one level).
    • Patterns stay whole. Below the first two levels, a trim is cut again only along a seam that crosses at least 90% of it, and three or more evenly spaced lines are taken as the texture’s own pattern (planks, tiles, rivets), not as cuts.
    • Cut-outs. A region whose seams enclose smaller boxes without crossing it is proposed as a trim with cut-outs, when each box touches the region’s border, is at least 8 px on a side, and covers at most half the region. A box floating in the middle of a region, such as a decal, is never a cut-out.
    • Empty space. A fully transparent region is proposed as empty space, and so is a transparent band wider than 32 px; Padding tops out at 32 px. A one-color opaque region is still a trim.
  • Ctrl-snap to seams. Hold Ctrl while dragging a line and it lands on the texture’s own seam, ahead of the grid.
  • Trims Output. Under the sheet’s size, Trims Output picks what the Trims batch carries: Colors (the default, the colored ID trims) or Source (your texture cut into its trims, every map of a texture set included). Either way each frame keeps its name, color, and place, and the Sheet output stays the colored layout. While it is Source, the node’s thumbnail shows the source. At Padding 0, an unedited round trip through Arrange’s Original Positions returns the source exactly.
  • Cut a whole material at once. To cut a base color and its normal map (or any maps) into the same trims, join them first: wire each image into a Texture node’s matching input, wire the Texture into Source, and set Trims Output to Source. Each trim then arrives as a texture set holding every map, cut in register. Two Trim Sheets, one per map, do not pair even with the same layout: each sheet’s trims are its own, and a node that takes both says so.

From a texture you already have to ZenUV:

  1. Wire your trim sheet texture into a Trim Sheet node’s Source. The Preview switches to the Source view.
  2. Click Detect Trims, raise Sensitivity for more lines or lower it for fewer until the dashed proposal follows the seams, and press Apply.
  3. Adjust: Ctrl-drag any line onto its seam, split, remove, or leave trims empty, Fill any empty space you want as a trim, and name each one.
  4. Set Trims Output to Source, so the Trims batch carries the texture cut into its trims.
  5. Edit one trim: right-click it on the Sheet view, choose Edit This Trim on Its Own, then Start from Its Shape, and add your nodes to its branch (see A branch for one trim).
  6. The branch rejoins the rest in an Arrange set to Original Positions, which puts every edited piece back in its place.
  7. Export the layout for ZenUV as in A trim sheet for ZenUV, and the rebuilt sheet with an Export Image.

Every trim starts on an auto color: hues spaced evenly around the wheel over all the trims, at saturation 0.7 and value 0.8, the colors ZenUV gives its own trims.

  • Click the Color swatch under Selected Trim and pick a color to pin it; the label reads Pinned.
  • Right-click the swatch and choose Auto Color to unpin it; the label reads Auto.
  • Wire a Palette into the optional Palette input and its colors replace the auto hues in order, starting over when there are more trims than colors. A pinned trim keeps its own color.
  1. Add a Trim Sheet node and shape the trims: set the sheet’s size, drag the lines, split, and name each trim.
  2. Click the menu button on the Trims toolbar (or right-click the Trims list) and choose Copy Trims for ZenUV.
  3. In Blender, open ZenUV’s Trim List panel, click the dropdown arrow on the list’s right toolbar, and choose Paste Trims from Clipboard. Pick Clear for a fresh sheet (it clears every trim first), Replace to update the trims with the same names after you change the sheet, or Add to append them.
  4. For the texture, wire the Sheet output into an Export Image and set its output path, for example export/trims/trimsheet.png.

Change the sheet, copy again, and paste with Replace to bring ZenUV up to date.

From ZenUV back to ArcBrush: copy the trims from ZenUV’s Trim List menu, then choose Paste Trims from ZenUV from the same Trim Sheet menu. It replaces the layout, keeping the colors and identities of trims that match by name, and holds any layout without partial overlaps, not only rows:

  • Gaps. A small, regular gap between trims is read as Padding, and slack of a pixel or two at a seam is absorbed. A wider gap becomes empty space. When usable empty space remains, the note names the trims around it (The space around Cap A, Cap B and Cap C is empty.) with a Fill Around Them button under it, which makes the largest region bounded by those trims one trim, with them as its cut-outs, in one undo step; Copy then writes that rectangle. If the layout has changed so that space is gone, the button is grayed and says so.
  • A rectangle that wholly contains others becomes a trim with cut-outs.
  • Refusals change nothing and say why, naming the trims: two that overlap without one holding the other, a pinwheel that no straight cut separates, or a layout that needs more than 64 cells in one row or column.

Copy writes a trim with cut-outs as its full rectangle, with each cut-out as its own trim inside it. Empty space is not written.

As a file: to keep the layout as a .json file, wire the Sheet output into an Export Data node, pick the ZenUV Trim Sheet preset, set its Folder, and press Export. The preset writes the same text Copy Trims for ZenUV puts on the clipboard.

The text holds a trimsheet object keyed by trim name, each with its rect ([left, top, right, bottom], with v measured from the bottom as Blender’s UVs are) and its color as sRGB 0 to 1 values, the display values ZenUV stores, so a trim’s color reads the same in both directions. A 16 x 16 sheet with a 6 px row Trim, a 3 px row split into Edge and Edge.001, and a last row Rest writes:

{"trimsheet": {"Trim": {"rect": [0, 1, 1, 0.625], "color": [0.8, 0.239216, 0.239216]},
"Edge": {"rect": [0, 0.625, 0.5, 0.4375], "color": [0.521569, 0.8, 0.239216]},
"Edge.001": {"rect": [0.5, 0.625, 1, 0.4375], "color": [0.239216, 0.8, 0.8]},
"Rest": {"rect": [0, 0.4375, 1, 0], "color": [0.521569, 0.239216, 0.8]}}}

Every other atlas preset (Atlas JSON, C# Sprite Table, GDScript Regions, and the rest) reads a Trim Sheet the same way it reads an Arrange or a Sprite Sheet.

Editing each material, then rebuilding the sheet

Section titled “Editing each material, then rebuilding the sheet”

Every image in the Trims batch remembers where it sat on its sheet, through the nodes you edit it with, through Split Batch, and through Collect.

  1. Wire Trims into the nodes that make each material, splitting the batch with Split Batch when each trim needs its own branch.
  2. Bring the trims back together (a Collect joins Split Batch’s branches) and wire them into an Arrange.
  3. Set Arrange’s Direction to Original Positions. The result is the sheet again, at the sheet’s size, with every trim in its place. Wire it into the Export Data and the Export Image as above, then copy and paste into ZenUV the same way.

A trim that changed size on the way fills its place according to Arrange’s Fit, which Original Positions sets to Stretch. Arrange’s Extrude on Auto repeats each trim’s edge pixels into its half of every Padding gap, so the sheet closes with no transparent seam. A cut-out always lands over its parent, whatever order the branches arrive in on Arrange’s pins, so a parent you filled edge to edge never covers the trims cut out of it. An image with no place on the sheet is left out, with an amber note saying how many.

To check where a frame sits, wire it into an Inspect node: its Place on Sheet section shows the sheet size, the trim’s rectangle in pixels and as UVs, its name, whether it spans the sheet’s full width or height, and the sheet’s Padding when it has one.

Every trim is a frame at its own size, with a name, a color, and a place on the sheet, and the nodes you already use act on it. There is no special node for filling trims.

Right-click a trim on the Sheet view and choose Edit This Trim on Its Own. It adds a branch for that trim only: nodes you add there change that trim, then it rejoins the rest. Pick how the branch starts:

  • Fill It with an Image adds a Crop in Same Shape already sized to the trim. Wire an image or a material into its Image input.
  • Start from Its Shape wires the trim straight to the rebuilt sheet, for a trim you build from its own shape (a bevel, a pattern sized to it).

Either way it builds, or extends, a Split in Pick mode feeding an Arrange in Original Positions, with the rest of the trims passing through Rest, all in one undo step. A trim that already has a branch offers Show Its Branch instead, which selects and frames it. On any batch, right-click a frame tab in the Preview for Edit This Frame on Its Own, the same gesture. A pick follows its trim through renames, reorders, recolors, and resizes.

To treat several trims as a group, route them by name with Split’s Filter mode instead.

Choosing the part of a material that fills a trim

Section titled “Choosing the part of a material that fills a trim”

In Crop’s Same Shape, drag the trim-shaped window over the material and scale it from a corner; every map of a texture set is cut in register. The readout says how many source pixels each trim pixel takes, and four buttons set the window in one click:

  • Fill Trim: the material fills the trim on its tighter side, and the rest of its longer side is cropped.
  • Tile Strip: the material fits across the trim’s short side and repeats a whole number of times along its length, switching Edges to Wrap, so a strip still tiles after a resize.
  • Sheet Density: the whole sheet over the material, so every trim cut from it matches in scale. The window starts here.
  • 1:1 Pixels: one trim pixel per material pixel.

With Edges on Wrap or Mirror the window can run past the material’s edge, and a Ctrl snap to whole repeats keeps a strip tiling. Crop’s Output view shows the cut with no handles.

At Its Place lays the whole layout over one material instead, cutting every trim at its place, so one material covers the sheet with no seams between neighbors. It also cuts a sheet-sized bake back into per-trim pieces: derive per trim, compose on the sheet.

  • Seams. A strip that must tile along its length goes through Seamless Blend with Axes set to Horizontal, which heals its ends without blurring its top and bottom. Check it with an Offset at 50% in a Viewer slot.
  • Group masks. Mask Apply cuts a material’s Opacity, for every trim of a library at once, and Merge Over lays it on another material.
  • One map at a time. Levels, Curves, HSB and the other color and tone nodes edit one named map of a set with their Map row, such as Levels on the Roughness, and Normal Map rescales a Normal’s intensity.
  • Padding and Extrude. Set Padding here to keep neighbors apart under mipmaps. When the trims go back together, Arrange’s Extrude on Auto repeats each trim’s edge pixels into its half of every gap, on every map and the Opacity, so no mip level shows a hole or a neighbor’s color: Padding 20 needs no number typed, each side grows 10 px. Type a larger Extrude to bleed further.
  • Bevels per trim. A Bevel on each trim with Mask From set to Alpha bevels inward from the trim’s border. That is the recipe, so the node shows no warning.
  • Notes that keep you honest. Arrange’s Parameters panel names trims still showing their flat color (2 trims still show their flat color: Pine, Steel.) and inputs stretched unevenly to fit their place. A trim removed from the sheet shows on the node as well. Two batches whose trims would pair up differently are refused by name, never mixed silently.

Resize a trim or insert one and every branch follows: a Same Shape window keeps its spot and its density, a stored whole-repeats count keeps a strip tiling, At Its Place recuts each trim at its new place, and Export Data’s rows update. Values set in pixels, such as Padding, Extrude, a Bevel width, or a Blur radius, stay the same number of pixels, so doubling the sheet’s size halves their share of each trim; adjust them after a large resize.

Every trim’s maps and the sheet-sized result are held while the graph cooks. A 4K float sheet of eight textured trims peaks near 4.6 GB; at 8K it peaks near 18 GB, so 8K sheets in 32-bit (Float) Mode want a machine with 32 GB of memory. Work in 8-bit, or at 4K, on a 16 GB machine.

Pins

PalettePalette
InputOptional
SourcePixels or Texture
InputOptional
SheetImage
Output
TrimsBatch
Output

Sheet

WidthInteger
Default: 2048 Range: 1–16384

Sheet width in pixels (1-8192). Changing it rescales every trim. A wired source sets it

HeightInteger
Default: 2048 Range: 1–16384

Sheet height in pixels (1-8192). Changing it rescales every cut and trim. A wired source sets it

Padding (px)Integer
Default: 0 Range: 0–128

Transparent gap between neighboring trims, in pixels, taken half from each side. The sheet's outer edges get none, so a full-width trim still tiles. Arrange's Extrude on Auto grows each trim back by its half, so the gaps close again

Trims OutputChoice
Default: Colors
A source is wired

What the Trims output carries.

The Sheet output shows the colored layout either way.

  • ColorsEach trim filled with its color, the ID trims. The default.
  • SourceThe wired source cut into its trims, every map of a texture set included. Rebuild the sheet with Arrange in Original Positions.

Trims

TrimsData
Default: 4 trims

Rows top to bottom, each holding named trims. The last row and each row's last trim take the leftover space. Drag the lines in the Preview to resize

LayoutData

The trims as cuts, when they are not plain rows: sections stacked or side by side, trims that hold cut-out trims, and empty space. Each cut's last part takes the leftover space. Drag the lines in the Preview to resize

  • Name every trim before copying: ZenUV’s trims are keyed by name.
  • Turn on Info in the Preview to see each trim’s name drawn inside it.
  • Leave parts of the sheet nobody maps to as empty space: right-click a trim and choose Leave Empty. Click the space and press Fill when you want it back as a trim.
  • Wire a Palette into the Palette input to use your own trim colors instead of the auto hues.
  • Edit trims one by one from the Trims output, then rebuild the sheet with Arrange set to Original Positions.
  • Right-click a trim and choose Edit This Trim on Its Own to build its branch in one step.