Pavel Kuzmenko, a technical artist and tools developer, wrote texLab: a native C++ plugin that packs PBR maps into ORM/RMA-style layouts inside Unreal Engine 5.7 and 5.8, and unpacks packaged textures back into individual maps. The pitch is deleting a round trip — export maps, open another DCC, pick a channel layout, pack, reimport, recheck — where the texture on disk may no longer match the preview you approved.

The interesting part isn’t the packing. It’s the decisions that decide whether artists trust the tool.

  • Semantics, not filenames. ORM, RMA, ARM, and MSR look alike and hold different data. Putting Metallic into Roughness is a silent bug that surfaces much later, so channel meaning comes from explicit rules (R = AO, G = Roughness, B = Metallic) in a JSON database TDs can extend. An unknown packed suffix gets an ambiguity report, not a guess.
  • One pack graph. Manual, Preview, and Batch share a single implementation and executor. Two code paths would eventually disagree, and the preview would be the one that’s wrong.
  • Preview is part of the output. Views are Working (float result), Encoded (after the BC7/BC5 round trip through Unreal’s compressor), Delta, and Split Channels. Not bit-exact with the cooked platform asset — but an honest picture of the compression loss you’re signing off on.
  • Float until export. Data stays in floating point through the whole stack, converted to 8-bit and compressed only on write. Operations run in a fixed order in linear space, which matters most for gloss-to-roughness and normal reconstruction — the operations that quietly degrade if you start from an already-compressed source.
  • Safe vs Compact is a visible trade-off. Safe keeps channels independent (ORM to BC7, Normal to BC5). Compact packs more into fewer textures to cut samples and streaming cost, and is not a hidden “fast” preset.

The batch workflow is where the production instincts show. Scan, Rebuild Groups, Validate, Execute — and Validate is a real dry run: semantic coverage, names, groups, estimated savings, planned outputs, nothing written. The Content Browser stays untouched until Execute. New assets are created instead of overwritten, because Unreal’s undo doesn’t reliably restore binary texture payloads. Generated textures keep provenance in Asset User Data, so a packed texture can be traced to its sources months later.

Two more small decisions worth stealing: Seamless Bake fixes tiling seams on the source pixels before packing (50% offset plus a cover mask), and the tool will not reverse it later, because once baked the original pixels are gone. And source fidelity is explicit — the original imported data is used where possible, with a visible fallback to FTextureSource, never a display mip.

The architectural note ties it together: Editor depends on Core, never the reverse, so grouping and semantic matching can be tested headlessly without starting the editor UI.

Most pipeline complaints are really about trust — artists stop believing the preview, so they recheck everything by hand. Making preview and export the same code, refusing to guess, and validating before writing are cheap ways to buy that trust back.