Layers

Basic usage

Basic usage: initialize layers on given skin cluster, add, list and delete layers.

from ngSkinTools2.api import init_layers, Layers

layers = init_layers("skinCluster1")
# alternatively, if layers are already enabled on this mesh,
# layers = Layers("skinCluster1")

layer_base = layers.add("base weights")
layer_one = layers.add("one")
layer_two = layers.add("two", parent=layer_one)

# layer_one instance was created before we added layer_two,
# so we need to reload it with latest data to see recent updates
assert layer_one.children == []
layer_one.reload()
assert layer_one.children == [layer_two]

assert layer_one.parent is None
assert layer_two.parent.name == "one"
all_layers = layers.list()
assert all_layers[0].name == "base weights"
assert all_layers[1].name == "one"
assert all_layers[2].name == "two"

layers.delete(layer_two)

Layer attributes

# basic properties - just treat like fields
layer_one.enabled = False
layer_one.enabled = True
layer_one.name = "arms"
layer_one.opacity = 0.8

# enable mirror effect on everything: mask, dq, influence weights
layer_one.effects.configure_mirror(everything=True)

# enable mirror effect on just influence weights
layer_one.effects.configure_mirror(mirror_weights=True)

Weight buffers

Manipulation of weight buffers. Refer to influences by their logical index (connection index in dependency graph).

from ngSkinTools2.api import NamedPaintTarget

# mask is by default empty
assert layer_one.get_weights(NamedPaintTarget.MASK) == []
# when setting weights, list length must match number of vertices in skinCluster
layer_one.set_weights(NamedPaintTarget.MASK, [0.9, 0, 1, 1])
layer_one.set_weights(0, [1, 1, 1, 1])
# settings weights to influence #1 will override weights on influence #0
layer_one.set_weights(1, [0, 0, 1, 1])
assert layer_one.get_weights(0) == [1, 1, 0, 0]