Update
This commit is contained in:
103
2023/scripts/rigging_tools/ngskintools2/api/import_v1.py
Normal file
103
2023/scripts/rigging_tools/ngskintools2/api/import_v1.py
Normal file
@@ -0,0 +1,103 @@
|
||||
# for same mesh, convert from v1 layers to v2
|
||||
from maya import cmds, mel
|
||||
|
||||
from ngSkinTools2.api.log import getLogger
|
||||
from ngSkinTools2.decorators import undoable
|
||||
|
||||
logger = getLogger("import v1")
|
||||
|
||||
__has_v1 = None
|
||||
|
||||
|
||||
def has_v1():
|
||||
global __has_v1
|
||||
if __has_v1 is not None:
|
||||
return __has_v1
|
||||
|
||||
__has_v1 = False
|
||||
try:
|
||||
cmds.loadPlugin('ngSkinTools')
|
||||
__has_v1 = True
|
||||
except:
|
||||
pass
|
||||
|
||||
|
||||
def can_import(target):
|
||||
if not has_v1():
|
||||
return False
|
||||
try:
|
||||
result = cmds.ngSkinLayer(target, q=True, lda=True)
|
||||
return result == 1
|
||||
except Exception as err:
|
||||
logger.error(err)
|
||||
return False
|
||||
|
||||
|
||||
def cleanup(selection):
|
||||
"""
|
||||
Delete V1 data from provided list of nodes. Must be a v1 compatible target
|
||||
|
||||
|
||||
:type selection: list[string]
|
||||
"""
|
||||
for s in selection:
|
||||
hist = cmds.listHistory(s) or []
|
||||
skinClusters = [i for i in hist if cmds.nodeType(i) in ('skinCluster')]
|
||||
cmds.delete(
|
||||
[
|
||||
i
|
||||
for skinCluster in skinClusters
|
||||
for i in cmds.listHistory(skinCluster, future=True, levels=1)
|
||||
if cmds.nodeType(i) in ('ngSkinLayerDisplay', 'ngSkinLayerData')
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
@undoable
|
||||
def import_layers(target):
|
||||
if not has_v1():
|
||||
return False
|
||||
|
||||
import ngSkinTools2.api as ngst_api
|
||||
|
||||
layers = ngst_api.init_layers(target)
|
||||
|
||||
layerList = cmds.ngSkinLayer(target, q=True, listLayers=True)
|
||||
layerList = [layerList[i : i + 3] for i in range(0, len(layerList), 3)]
|
||||
|
||||
layerIdMap = {0: None}
|
||||
|
||||
def get_layer_influences(layerId):
|
||||
influences = mel.eval("ngSkinLayer -id {0} -q -listLayerInfluences -activeInfluences {1}".format(layerId, target)) or []
|
||||
return zip(influences[0::2], map(int, influences[1::2]))
|
||||
|
||||
def get_layer_weights(layerId, infl):
|
||||
return mel.eval("ngSkinLayer -id {0:d} -paintTarget {1} -q -w {2:s}".format(layerId, infl, target))
|
||||
|
||||
def copy_layer(oldLayerId, newLayer):
|
||||
"""
|
||||
|
||||
:type oldLayerId: int
|
||||
:type newLayer: ngSkinTools2.api.layers.Layer
|
||||
"""
|
||||
|
||||
newLayer.opacity = mel.eval("ngSkinLayer -id {0:d} -q -opacity {1:s}".format(oldLayerId, target))
|
||||
newLayer.enabled = mel.eval("ngSkinLayer -id {0:d} -q -enabled {1:s}".format(oldLayerId, target))
|
||||
|
||||
newLayer.set_weights(ngst_api.NamedPaintTarget.MASK, get_layer_weights(oldLayerId, "mask"))
|
||||
newLayer.set_weights(ngst_api.NamedPaintTarget.DUAL_QUATERNION, get_layer_weights(oldLayerId, "dq"))
|
||||
|
||||
for inflPath, inflId in get_layer_influences(oldLayerId):
|
||||
logger.info("importing influence %s for layer %s", inflPath, oldLayerId)
|
||||
weights = get_layer_weights(oldLayerId, inflId)
|
||||
newLayer.set_weights(inflId, weights)
|
||||
|
||||
with ngst_api.suspend_updates(target):
|
||||
for layerId, layerName, layerParent in layerList:
|
||||
layerId = int(layerId)
|
||||
layerParent = int(layerParent)
|
||||
newLayer = layers.add(name=layerName, force_empty=True, parent=layerIdMap[layerParent])
|
||||
newLayer.index = 0
|
||||
layerIdMap[layerId] = newLayer.id
|
||||
|
||||
copy_layer(layerId, newLayer)
|
||||
Reference in New Issue
Block a user