ngSkinTools v2: what's new?

What changed in ngSkinTools 2.0 when compared to v1 ?


  • ngSkinTools now operates with skinCluster inputs/outputs directly. This means that you can have modifiers on top of your mesh (collapse vertices, subdivide, etc), and that should not disrupt any operations for plugin. In V1, in a lot of cases ngSkinTools would look at the final mesh that skinCluster connects to, and behave unexpectedly if vertex order or count is changed. I'm also trying to open door to multiple-skinclusers-per-mesh workflow, should be fully supported in v2 with time (just needs a bit more testing and UI updates).
  • Various performance improvements. It's a shame these days to watch your multi-CPU computer sit almost idle while application claims it's pretends to work hard. ngSkinTools v2, wherever it makes sense, should make full use of your Threadrippers, Ryzens, Core I9s or any other modern CPU.

There still are some very very slow locations in code. Primarily, huge meshes with lots of joints still feel sluggish. Maya's native APIs are still single-threaded. For now the goals for V2 are:

  • Meshes with up to 300,000 verts, 200influences are expected to behave near-realtime;
  • 1,000,000-2,000,000 verts / 500 infl should not fail to initialize/load and be workable with tradeoffs;


  • Much better performance due to completely reworked paint engine, which is now multithreaded, so when painting with wide brushes or flooding, it should now be much more responsive. The only big bottleneck in speed remains Maya's skinCluster node itself - I have some ideas, but that will have to wait for later iterations of 2.x
  • Influence selection on screen: also known as "the biggest missing feature in ngSkinTools", should now be fixed. Influences can be "sampled" from the surface (you press S and click on the surface - and the most dominant influence of the selection gets activated). This should speed up switching between influences substantially.
  • Brush projection mode (surface or screen)
  • Influences limit while painting
  • Sample current joint on stroke start
  • Toggle original mesh: while in paint tool, you can quickly switch between weights preview
  • show single influence colored


  • New way of mirroring: mirror layer effect. The weights you paint on the layer are never modified by mirror (unlike mirror or interactive mirror). Instead, mirroring happens on a separate buffer that gets automatically updated each time you edit the layer. This further contributes to non-destructive workflow: painting weights and editing mirroring settings become two independent actions. Also, with this method weights at the mirror seam are now a tiny bit better handled.

Things removed

  • Multi-mesh smooth. It was a tough decision, but for now working with multiple meshes simultaneously complicates implementation substantially, and with layers, effects already, it becomes unfeasible to continue supporting multi-mesh workflow. Will have to revisit this in the future.
  • Smooth as separate tool is gone; paint/flood is now fast enough to use instead. Smooth as a separate tool has this story where it was the first tool (even before layers) that was implemented in ngSkinTools, it had really crappy implementation behind it and now it's time for it's retirement.:)


  • API revamp; slowly switching to PEP 8 style, trying to design with api-first approach in mind - the grand plan is to make ngSkinTools enjoyable to automate, include in your autorigs, etc.
  • UI code rework. Like it's usual with UI, it's pretty hard to not make a mess out of it.