Skip to content

UnityEQ Pivot Painter Lab

Troubleshooting

Symptom first. Each entry gives the likely cause and the fix.

Run Bake Doctor. It runs the same checks as the hard pre-bake gate, reports offender counts, and lets you click straight to the elements at fault. Most of what follows is faster to diagnose there than by eye.

Read the bake report. Every bake writes a JSON report under Assets/EQPivotPainterLab_Generated/Reports. It records element counts, level distribution, triangle coverage, warnings and which solver path ran.


The gate refuses rather than writing data that would produce broken motion. Each refusal names the offending elements.

MessageCauseFix
Triangles owned by more than one elementDetection assigned the same triangle twiceRe-detect; if it persists, change detection mode
Coverage below 98%Some triangles belong to no elementRe-detect, or use Split By Island on the leftovers
Hierarchy cycleAn element is its own ancestor, usually after manual re-parentingSelect the named elements and Clear Overrides, then re-solve
Self-parentingAn element was parented to itselfSame as above
Chain deeper than the shader replaysManual re-parenting built a chain longer than 3 hopsRe-parent the named element closer to the root
More than 30,000 elementsThe mesh partitioned into too many piecesUse a coarser detection mode, or raise the minimum element size

This is deliberate. A refused bake is the tool declining to produce a subtly broken result. Do not work around it by relaxing settings until it passes — fix what it named.


Detection produced a single element. Check the element list — if it shows 1, detection did not split anything. Try a different detection mode; for a dense one-mesh tree use Skeleton First (RGS-PA).

Motion is uniform and mushy, with no sense of branches

Section titled “Motion is uniform and mushy, with no sense of branches”

Most elements landed on the same hierarchy level, so they all share one wind tier. Check the level distribution in the report. On dense disconnected foliage the spatial scaffold should produce a spread across levels — if nearly everything is on the deepest level, re-detect with Skeleton First.

Leaves swim, stretch, or pivot from thin air

Section titled “Leaves swim, stretch, or pivot from thin air”

A pivot is sitting off the geometry. Select the element and use Pivot Parent Edge so it pivots from where it attaches rather than its centre. Pivot Base and Pivot Center cover the other common cases.

One branch whips much harder than its neighbours

Section titled “One branch whips much harder than its neighbours”

Its extent — the physical swing arm — is longer than it should be, usually because the forward axis points oddly. Select it and set Axis X/Y/Z to the sensible direction, or set an explicit Extent override.

It should be static. Select it and click Static. Static elements follow their parent’s motion but add none of their own. Use Freeze To Active to pin it to a specific support element.

Painted wind buckets or manual fixes disappear after a re-bake

Section titled “Painted wind buckets or manual fixes disappear after a re-bake”

Auto Detect On Bake is re-running detection and discarding manual state. Turn it off in the preset once you start hand-authoring. Locked parents and locked buckets survive regardless.

Add per-renderer wind variation so each instance gets its own phase and strength offset. Without it, identical materials animate identically.


Magenta means no valid shader. In order of likelihood:

  1. Wrong pipeline shader. Check that the material uses the hero shader matching your active pipeline. The Built-In, URP and HDRP variants are separate shaders.
  2. Shader compile error. Select the shader asset and read the inspector.
  3. Stripped in a build but fine in the editor. The editor compiles variants on demand and cannot reproduce this by construction. Check shader stripping in Graphics settings, and in URP the stripping toggles on the URP asset.

The mesh needs tangents. Check the model importer has Calculate Tangents (or imported tangents) enabled. Also confirm Normal Scale is not 0.

The packed mask map reads wrong — AO in the wrong channel, odd roughness

Section titled “The packed mask map reads wrong — AO in the wrong channel, odd roughness”

Set Packed Mask Layout to match your texture: Unity MaskMap, ORM, ORT, or AO/Rough/Height. The tool does not guess destructively; it reads the channels you tell it to. Use the ORM packer if you have separate AO/Roughness/Metallic maps.

Textures were auto-assigned to the wrong slots

Section titled “Textures were auto-assigned to the wrong slots”

The resolver classifies by filename token. Open the per-slot review panel and override any slot it got wrong. Renaming your source textures to conventional suffixes (_D, _N, _ORM) makes it right first time.

Foliage does not receive ambient occlusion in URP

Section titled “Foliage does not receive ambient occlusion in URP”

SSAO must be in Depth Normals mode to use the DepthNormals pass. Confirm in the Frame Debugger that foliage appears in _CameraNormalsTexture.

HDRP foliage ignores my point lights and spotlights

Section titled “HDRP foliage ignores my point lights and spotlights”

Expected and documented. The HDRP hero shader is lit by the main directional light plus spherical-harmonics environment; additional punctual and area lights do not reach it. For a richer rig, wrap EQPivotPainterDeformFoliage in a Shader Graph and shade with HDRP’s Lit master node.

The HDRP hero shader writes zero motion vectors, so wind motion is not represented to TAA. Whole-object movement is unaffected. Documented limitation.

Source vertex colours are gone on the baked mesh

Section titled “Source vertex colours are gone on the baked mesh”

Baked meshes use vertex colour alpha to carry the per-element material family, so source vertex colours are not preserved. Documented limitation.


Output goes to Assets/EQPivotPainterLab_Generated by default — next to the tool folder, not inside it, so reinstalling an update cannot delete your bakes. Projects that already baked into the older in-folder location keep using it.

It should not. Bakes are deterministic: the same input mesh and settings produce byte-identical textures and UVs. If output changed, something in the asset, preset or source mesh changed. Compare the two JSON reports.

Two elements share vertices and detection keeps merging them

Section titled “Two elements share vertices and detection keeps merging them”

That is welded geometry — they genuinely share vertices. Use SmartCut to split on sharp creases, or Split By Submesh if materials separate them.

Very small pieces are folded back into their neighbour to avoid confetti. If each side of the crease is only a triangle or two, that is the fold-back working as intended. Lower the minimum element size, or check the crease angle is actually below the SmartCut angle.

Re-capture the impostor after any change to the source mesh or materials — the atlas is a snapshot. Check the LODGroup transition distances.

A model imported at a different scale solves differently

Section titled “A model imported at a different scale solves differently”

It should not — detection and repair thresholds derive from the mesh diagonal, so 0.01×, 1× and 100× partition identically. If you see a difference, check that the importer scale factor is applied rather than a scaled parent transform.


Include with any support request:

  • The tool version (see Release_Notes.md and package.json)
  • Your Unity version and render pipeline
  • The JSON bake report for the asset
  • The Bake Doctor verdict

Those four make almost every issue diagnosable without a repro project.

Report an issue with this tool

Opens our feedback form in a new tab with the tool name pre-filled.