Example #1
0
def CreateSkeletonCloud(model):
    cloud = model.FindChild('ICE_Skeleton')
    if cloud:
        XSI.DeleteObj(cloud)

    cloud = model.AddPrimitive('PointCloud', 'ICE_Skeleton')
    tree = ICETree.CreateICETree(cloud, 'Emit', 0)

    emit = XSI.AddICECompoundNode('IRBuildSkeleton', tree)
    XSI.ConnectICENodes('{}.port1'.format(tree), '{}.Execute'.format(emit))

    tree = ICETree.CreateICETree(cloud, 'Deform', 2)
    deform = XSI.AddICECompoundNode('IRDeformSkeleton', tree)
    XSI.ConnectICENodes('{}.port1'.format(tree), '{}.Execute'.format(deform))

    return cloud
Example #2
0
    def Symmetrize(self):
        if self.side == MIDDLE:
            XSI.LogMessage(
                '[BuildRigElement] : Can\'t symmetrize middle elements !')
            return None

        sibling = IRSkeleton(None, self.GetSymParent(self.parent), self.name,
                             self.mode, self.GetOppositeSide(), self.divisions,
                             self.mirror, self.suffix)

        sibling.position = self.position
        sibling.rotation = self.rotation
        sibling.sibling = self
        self.sibling = sibling

        sibling.CreateGuide()

        # add symmetrize element data ICE Tree
        tree = ICETree.CreateICETree(sibling.crv, 'SymmetyrizeDatas', 2)
        node = XSI.AddICECompoundNode('IRSymetrizeSkeletonDatas', str(tree))

        XSI.ConnectICENodes('{}.port1'.format(tree), '{}.Execute'.format(node))
        name = ICETree.ReplaceModelNameByThisModel(self.crv, self.model)
        XSI.SetValue('{}.Reference'.format(node), name, '')

        return sibling
Example #3
0
def CreateMuscleMesh(model, deform=True):
    root = model.FindChild("Muscles")
    if not root:
        root = model.AddNull("Muscles")

    static = model.FindChild("Muscle_Static")
    if not static:
        static = root.AddPrimitive("EmptyPolygonMesh")
        static.Name = "Muscle_Static"
        tree = tre.CreateICETree(static, "Init", 0)

        build = XSI.AddICECompoundNode("IRBuildMuscles", str(tree))
        XSI.ConnectICENodes(str(tree) + ".port1", str(build) + ".Execute")

    deform = model.FindChild("Muscle_Deform")
    if not deform:
        deform = root.AddPrimitive("EmptyPolygonMesh")
        deform.Name = "Muscle_Deform"
    '''
	mesh = model.AddPolymesh("PointCloud","ICE_Muscles")
	tree = tre.CreateICETree(cloud,"Emit",0)
	
	muscle = xsi.AddICECompoundNode("MusclesFromNull", str(tree))
	xsi.ConnectICENodes(str(tree)+".port1",str(muscle)+".Execute")
	
	tree = tre.CreateICETree(cloud,"Deform",2)
	
	bind = xsi.AddICECompoundNode("BindMusclesToSkeleton", str(tree))
	xsi.ConnectICENodes(str(tree)+".port1", str(bind)+".Execute")
	'''
    return None
Example #4
0
    def Symmetrize(self):
        if self.side == MIDDLE:
            XSI.LogMessage(
                "[ICERig] : Can't symmetrize middle elements ---> aborted...!")
            return None

        sibling = IRMuscle(None, self.GetSymParent(self.parent), self.name,
                           self.GetOppositeSide(), self.mirror, self.suffix)

        sibling.position = self.position
        sibling.rotation = self.rotation
        sibling.sibling = self
        self.sibling = sibling

        sibling.CreateGuide()

        # add symmetrize element data ICE Tree
        t = tre.CreateICETree(sibling.crv, "SymmetrizeMuscleGuide", 2)
        n = XSI.AddICECompoundNode("IRSymetrizeMuscleDatas", str(t))

        XSI.ConnectICENodes(str(t) + ".port1", str(n) + ".Execute")
        name = tre.ReplaceModelNameByThisModel(self.crv, self.model)
        XSI.SetValue(str(n) + ".Reference", name, "")

        return sibling
Example #5
0
def applyColorizePointTree(model,obj,id):
	oIceTree = XSI.ApplyOp("ICETree", obj, "siNode", "", "", 0)
	oColorize = XSI.AddICECompoundNode("bbpp Colorize Point", oIceTree)
	XSI.ConnectICENodes(str(oIceTree) + ".port1", str(oColorize) + ".Execute")
	oGet1 = XSI.AddICENode("GetDataNode", oIceTree)
	XSI.SetValue(str(oGet1) + ".reference", model.FullName)
	XSI.ConnectICENodes(str(oColorize) + ".TransformationModel", str(oGet1) + ".outname")
	XSI.SetValue(str(oColorize) + ".PointID", id, "")
Example #6
0
def ReorderCurveGroup(model, _type):
    """ Reorder curve group
	:param Model model: SDK Model object
	:param int _type: rig element type
	"""
    if _type not in [ID_SKELETON, ID_MUSCLE]:
        return

    if _type == ID_SKELETON:
        emit_ref = 'this_model.Guide_Curves'
        prop_name = 'RigElement'
        grp_name = 'Guide_Curves'

    elif _type == ID_MUSCLE:
        emit_ref = 'this_model.Muscle_Curves'
        prop_name = 'MuscleElement'
        grp_name = 'Muscle_Curves'

    # get all guide curves
    guides = [
        g for g in model.FindChildren2('*_Crv', '', constants.siCurveFamily,
                                       True) if g.Properties(prop_name)
    ]

    if guides and len(guides) > 1:
        # get guide curve group
        grp = model.Groups(grp_name)

        cloud = model.AddPrimitive('PointCloud', 'ICE_Correct')
        tree = ICETree.CreateICETree(cloud, 'Emit', 0)

        emit = XSI.AddICECompoundNode('IRCorrectEmit', tree)
        XSI.ConnectICENodes('{}.port1'.format(tree), '{}.Execute'.format(emit))
        XSI.SetValue('{}.Reference'.format(emit), emit_ref, None)

        # get point cloud data
        cloud_geom = cloud.ActivePrimitive.Geometry
        positions_attr = cloud_geom.GetICEAttributeFromName('PointPosition')
        positions = positions_attr.DataArray
        indices_attr = cloud_geom.GetICEAttributeFromName('ShowGuideID')
        indices = indices_attr.DataArray
        sorted_guides = [g for g in guides]

        for guide in guides:
            geom = guide.ActivePrimitive.Geometry
            closest_indices = [
                FindClosestIndex(p.Position, positions, indices)
                for p in geom.Points
            ]
            r = max(set(closest_indices), key=closest_indices.count)
            sorted_guides[r] = guide

        if grp:
            XSI.DeleteObj(grp)

        Utils.GroupSetup(model, sorted_guides, grp_name)
        XSI.DeleteObj(cloud)
Example #7
0
def CreateMuscleCloud(model, deform=False):
    cloud = model.FindChild("ICE_Muscles")
    if cloud:
        XSI.LogMessage(
            "[CreateMuscleCloud] Muscle Cloud already exists : skipped....")
        return cloud

    cloud = model.AddPrimitive("PointCloud", "ICE_Muscles")
    tree = tre.CreateICETree(cloud, "Emit", 0)

    muscle = XSI.AddICECompoundNode("IRMuscleCloudInit", str(tree))
    XSI.ConnectICENodes(str(tree) + ".port1", str(muscle) + ".Execute")

    tree = tre.CreateICETree(cloud, "Deform", 2)

    bind = XSI.AddICECompoundNode("BindMusclesToSkeleton", str(tree))
    XSI.ConnectICENodes(str(tree) + ".port1", str(bind) + ".Execute")

    return cloud
Example #8
0
    def Rig(self):
        cloth_op = GetClothOperator(self.object)
        if not cloth_op:
            XSIUIToolKit.MsgBox(
                'No Syflex Operator on "{}"+"'.format(self.object),
                constants.siMsgCritical, 'ClothBuilder')
            return

        collide_op = XSI.ApplyOperator(
            'syCollide', ';'.join([
                cloth_op.FullName, self.pntCluster.FullName,
                self.collider.ActivePrimitive.FullName,
                self.collider.Kinematics.FullName, self.polyCluster.FullName,
                self.object.Kinematics.FullName
            ]))

        collide_op.Parameters('Reset').Value = True

        collide_op.Parameters('ExtEnvelope').Value = 0.05
        collide_op.Parameters('IntEnvelope').Value = -0.05
        collide_op.Parameters('Friction').Value = 0.2
        collide_op.Parameters('Damp').Value = 0.01

        # if this collider isn't a cloth object
        # nor extra collider object we add pre roll setup
        if not self.collider.Properties('Cloth_Rigger') and not self.extra:
            # create init ICE tree
            trees = self.collider.ActivePrimitive.ICETrees
            if not trees.Find('InitCollide'):
                tree = ICETree.CreateIceTree(self.collider, 'InitCollide', 1)
                compound = XSI.AddICECompoundNode('ClothInitTarget', str(tree))
                XSI.ConnectICENodes('{}.port1'.format(tree),
                                    '{}.Execute'.format(compound))

            # create pre-roll ICE tree
            if not trees.Find('PreRollCollide'):
                tree = ICETree.CreateIceTree(self.collider, 'PreRollCollide',
                                             3)
                compound = XSI.AddICECompoundNode('ClothTargetPreRoll',
                                                  str(tree))
                XSI.ConnectICENodes('{}.port1'.format(tree),
                                    '{}.Execute'.format(compound))
Example #9
0
def Cloth_ApplyStiffnessOp(obj, target):
    tree = ICETree.CreateICETree(obj, 'ClothStiffness', 1)
    compound = XSI.AddICECompoundNode('ClothSetMimicStiffness', str(tree))
    XSI.ConnectICENodes('{}.port1'.format(tree), '{}.execute'.format(compound))

    if obj.Model.FullName == target.Model.FullName:
        XSI.SetValue('{}.Velocity_Driver_Reference'.format(compound),
                     ICETree.ReplaceModelNameByThisModel(target), '')
    else:
        XSI.SetValue('{}.Velocity_Driver_Reference'.format(compound),
                     target.FullName, '')
Example #10
0
def CreateFitter(ppg, obj, mesh):
    tree = ICETree.CreateICETree(obj, 'Fitter', 2)
    node = XSI.AddICECompoundNode('IRFitSkeleton', str(tree))
    XSI.ConnectICENodes('{}.port1'.format(tree), '{}.Execute'.format(node))

    if obj and mesh:
        name = ICETree.ReplaceModelNameByThisModel(mesh, obj.Model)
        XSI.SetValue('{}.Reference'.format(node), name, '')
    else:
        XSI.LogMessage('No geometry set, Fitter may be invalid',
                       constants.siWarningMsg)
    return tree
Example #11
0
def MergeRigCloud(model, clouds, name):
	cloud = model.AddPrimitive("PointCloud", name)
	tree = XSI.ApplyOp("ICETree", cloud, "siNode", "", "", 2)
	idx = 1
	for c in clouds:
		merge = XSI.AddICECompoundNode("MergeRigPointCloud", str(tree))
		XSI.AddPortToICENode(str(tree) + ".port" + str(idx), "siNodePortDataInsertionLocationAfter")
		XSI.ConnectICENodes(str(tree) + ".port" + str(idx), str(merge) + ".execute")
		get = XSI.AddICENode("GetDataNode", str(tree))
		XSI.SetValue(str(get) + ".reference", ReplaceModelNameByThisModel(c), "")
		XSI.ConnectICENodes(str(merge) + ".Cloud", str(get) + ".outname")
		idx += 1
Example #12
0
def bbppTransformation_CreateCorrespondanceIceTree(obj,group,map):
	oModel = PPG.Inspected(0).Parent3DObject
	oIceTree = XSI.ApplyOp("ICETree", obj, "siNode", "", "", 0)
	oCorrespondance = XSI.AddICECompoundNode("bbpp Correspondance Map", oIceTree)
	XSI.ConnectICENodes(str(oIceTree) + ".port1", str(oCorrespondance) + ".Execute")
	oGet1 = XSI.AddICENode("GetDataNode", oIceTree)
	oGet2 = XSI.AddICENode("GetDataNode", oIceTree)
	#sGroupName = replaceModelNameByThisModel(oModel,group.FullName)
	XSI.SetValue(str(oGet1) + ".reference", group.FullName)
	XSI.ConnectICENodes(str(oCorrespondance) + ".PointsGroup", str(oGet1) + ".outname")
	sMapName = replaceObjectNameBySelf(obj,map.FullName)
	XSI.SetValue(str(oGet2) + ".reference", sMapName + ".Colors")
	XSI.ConnectICENodes(str(oCorrespondance) + ".ColorMap", str(oGet2) + ".outname")
Example #13
0
def CreateEnvelopeDuplicate(model, skin):
    # check ICE skeleton
    skeleton = model.FindChild('ICE_Skeleton')

    # check envelope group
    env_grp = model.Groups('Envelope')

    if not skeleton:
        XSI.LogMessage(
            '[CreateEnvelopeDuplicate] No ICE Skeleton or no Envelope Group!',
            constants.siWarning)
        return

    # check nb deformers
    num_points = skeleton.ActivePrimitive.Geometry.Points.Count
    if not env_grp or not num_points == env_grp.Members.Count:
        env_grp = Skeleton.CreateEnvelopeNullsFromSkeletonCloud(model)

    # duplicate mesh
    dup = Utils.GetMeshCopy(skin)
    skin.Parent3DObject.AddChild(dup)
    skin.Properties('Visibility').Parameters('ViewVis').Value = False

    XSI.ApplyFlexEnv('{};{}'.format(dup.FullName, env_grp.Members.GetAsText()),
                     '', 2)

    # transfer weights
    tree = ICETree.CreateICETree(dup, 'TransferWeights', 0)
    compound = XSI.AddICECompoundNode('TransferWeightsFromICESkeleton',
                                      str(tree))
    XSI.ConnectICENodes('{}.port1'.format(tree), '{}.execute'.format(compound))
    name = ICETree.ReplaceModelNameByThisModel(skin, model)
    XSI.SetValue('{}.Reference'.format(compound), name)

    # deform
    tree = ICETree.CreateICETree(dup, 'Deform', 2)
    deform = XSI.AddICECompoundNode('ICE Envelope Skeleton', str(tree))
    XSI.ConnectICENodes('{}.port1'.format(tree), '{}.execute'.format(deform))
    '''
Example #14
0
def BindSkinToSkeleton(model, skin):
    # prepare mesh
    Utils.GetWeightMap(skin, 'SmoothWeightMap', 1, 0, 1)
    Utils.GetWeightMap(skin, 'SearchMap', 1, 0, 1)
    Utils.GetWeightMap(skin, 'StretchMap', 1, 0, 1)
    Utils.GetWeightMap(skin, 'BulgeMap', 1, 0, 1)
    Utils.GetWeightMap(skin, 'RaycastMap', 0, 0, 1)
    Utils.GetWeightMap(skin, 'MuscleMap', 0, 0, 1)

    # get weights
    tree = ICETree.CreateICETree(skin, 'GetWeights', 0)
    compound = XSI.AddICECompoundNode('IRGetSkeletonWeights', str(tree))
    XSI.ConnectICENodes('{}.port1'.format(tree), '{}.execute'.format(compound))

    # no deform
    '''
Example #15
0
    def CreateGuide(self):
        if self.CheckElementExist():
            XSI.LogMessage(
                '[CreateSkeletonElement] {}_Crv already exist !'.format(
                    self.fullname), constants.siWarning)
            return False

        if self.mirror:
            self.crv = Utils.BuildCurveOnSymmetrizedPositions(self.position)
        else:
            self.crv = Utils.BuildCurveOnPositions(self.position)
        self.cluster = Utils.CreateAlwaysCompleteCluster(
            self.crv, constants.siVertexCluster, 'ElementData')
        Utils.GetWeightMap(self.crv, 'WidthMap', 0.01, 0, 1.0, self.cluster)
        Utils.GetWeightMap(self.crv, 'DepthMap', 0.01, 0, 1.0, self.cluster)
        Utils.GetWeightMap(self.crv, 'CollideMap', 1.0, 0.0, 1.0, self.cluster)
        Utils.GetWeightMap(self.crv, 'StickMap', 1.0, 0.0, 1.0, self.cluster)
        self.cluster.AddProperty('SimpleDeformShape', 0, 'Offset')

        # freeze curve
        XSI.FreezeObj(self.crv)

        # create self-symmetrize node
        if self.mirror:
            tree = ICETree.CreateICETree(self.crv, 'SelfSymmetrize', 2)
            node = XSI.AddICECompoundNode('IRSelfSymmetrizeSkeletonDatas',
                                          str(tree))
            XSI.AddPortToICENode('{}.port1'.format(tree),
                                 'siNodePortDataInsertionLocationAfter')
            XSI.ConnectICENodes('{}.port2'.format(tree),
                                '{}.Execute'.format(node))

        self.root.AddChild(self.crv)
        Utils.SetWireColor(self.crv, COLOR_SKELETON_R, COLOR_SKELETON_G,
                           COLOR_SKELETON_B)
        self.crv.Name = self.fullname + self.suffix

        # add rig element property
        self.prop = self.crv.AddProperty('RigElement')
        self.prop.Parameters('ElementType').Value = self.mode
        self.prop.Parameters('ElementName').Value = self.name
        self.prop.Parameters('Divisions').Value = self.divisions
        self.prop.Parameters('Side').Value = self.side

        Utils.GroupSetup(self.model, [self.crv], 'Guide_Curves')

        return True
Example #16
0
def Cloth_GetExtraCollider(prop):
    obj = prop.Parent3DObject
    parent = obj.Parent3DObject

    model = obj.Model
    collide_mesh = model.FindChild('ExtraCollider')
    if not collide_mesh:
        collide_mesh = parent.AddPrimitive('EmptyPolygonMesh', 'ExtraCollider')
        tree = ICETree.CreateICETree(collide_mesh, 'ClothExtraCollider', 0)
        compound = XSI.AddICECompoundNode('ClothExtraCollider', str(tree))
        XSI.ConnectICENodes('{}.port1'.format(tree),
                            '{}.execute'.format(compound))

    extra = Cloth.Collider(obj, collide_mesh, True)
    extra.GetPntCluster()
    extra.GetPolyCluster()
    extra.Rig()

    return extra
Example #17
0
def SetOneElementMap(crv, obj, name):
    weight_map = Utils.GetWeightMap(obj, name)
    tree = obj.ActivePrimitive.ICETrees.Find('SetOneElement')
    if not tree:
        tree = ICETree.CreateIceTree(obj, 'SetOneElement', 1)

    setter = XSI.AddICECompoundNode('SetOneElementMap', str(tree))
    idx = tree.InputPorts.Count
    XSI.AddPortToICENode('{}.port{}'.format(tree, idx),
                         'siNodePortDataInsertionLocationAfter')
    XSI.ConnectICENodes('{}.port{}'.format(tree, idx),
                        '{}.execute'.format(setter))
    XSI.SetValue('{}.reference'.format(setter),
                 'this.cls.WeightMapCls.{}'.format(name), '')
    getter = XSI.AddICENode('GetDataNode', str(tree))
    XSI.SetValue('{}.reference'.format(getter),
                 ICETree.ReplaceModelNameByThisModel(crv), '')
    XSI.ConnectICENodes('{}.Guide_Curve'.format(setter),
                        '{}.outname'.format(getter))
    return weight_map
Example #18
0
def Cloth_GetTargetMesh(prop):
    mesh = prop.Parent3DObject
    model = mesh.Model

    dup = prop.Parameters('CreateTargetMesh').Value
    target = None
    if not dup:
        target = Cloth_DuplicateMesh(mesh)
    else:
        try:
            target = model.FindChild(prop.Parameters('TargetMesh').Value)
            if not target:
                target = Cloth_DuplicateMesh(mesh)
        except RuntimeError:
            target = Cloth_DuplicateMesh(mesh)
        '''
		if not uti.CheckGeometryMatch(mesh,target):
			XSIUIToolkit.MsgBox('Target Mesh Invalid: we generate a new one',constants.siMsgExclamation,'Cloth_Tools')
			target = Cloth_DuplicateMesh(mesh)
		'''

    #Transfer Envelope from Output mesh if not exists
    if not target.ActivePrimitive.ConstructionHistory.Find('envelopop'):
        out = Cloth_GetOutputMesh(prop)
        if out:
            envelope = out.ActivePrimitive.ConstructionHistory.Find(
                'envelopop')
            if envelope:
                env = XSI.Dictionary.GetObject(envelope)
                weights = env.PortAt(4, 0, 0).Target2
                XSI.ApplyGenOp('Gator', '',
                               ';'.join([target.FullName, out.FullName]), 3,
                               'siPersistentOperation', 'siKeepGenOpInputs',
                               '')
                XSI.TransferClusterPropertiesAcrossGenOp(
                    '{}.polymsh.TransferAttributes'.format(target.FullName),
                    target.FullName, str(weights), 'Envelope_Weights', '')
                XSI.FreezeModeling(target)

    # Deform OutputMesh
    Cloth_DeformOutputMesh(prop)

    # Create Init ICE Tree
    trees = target.ActivePrimitive.ICETrees
    if not trees.Find('InitTarget'):
        tree = ICETree.CreateICETree(target, 'InitTarget', 1)
        compound = XSI.AddICECompoundNode('ClothInitTarget', str(tree))
        XSI.ConnectICENodes('{}.port1'.format(tree),
                            '{}.Execute'.format(compound))

    # Create PreRoll ICE Tree
    if not trees.Find('PreRollTarget'):
        tree = ICETree.CreateICETree(target, 'PreRollTarget', 3)
        compound = XSI.AddICECompoundNode('ClothTargetPreRoll', str(tree))
        XSI.ConnectICENodes('{}.port1'.format(tree),
                            '{}.Execute'.format(compound))

    # Update Cloth Rigger
    prop.Parameters('CreateTargetMesh').Value = 1
    prop.Parameters('TargetMesh').Value = target.Name
    Utils.SetVisibility([target], False, False)

    Cloth_Rigger_RebuildLayout(prop)
    try:
        PPG.Refresh()
    except RuntimeError:
        pass

    return target
Example #19
0
def Cloth_ApplyRestoreOp(obj, target):
    tree = ICETree.CreateICETree(obj, 'ClothRestore', 2)
    compound = XSI.AddICECompoundNode('ClothRestoreShape', str(tree))
    XSI.ConnectICENodes('{}.port1'.format(tree), '{}.Result'.format(compound))
    XSI.SetValue('{}.Target_Mesh_Reference'.format(compound),
                 ICETree.ReplaceModelNameByThisModel(target), '')
Example #20
0
def Cloth_ApplyInitOp(obj, target):
    tree = ICETree.CreateICETree(obj, 'ClothInit', 1)
    compound = XSI.AddICECompoundNode('ClothInitShape', str(tree))
    XSI.ConnectICENodes('{}.port1'.format(tree), '{}.execute'.format(compound))
    XSI.SetValue('{}.Reference'.format(compound),
                 ICETree.ReplaceModelNameByThisModel(target, obj.Model), '')
Example #21
0
def BuildIK2BonesRig(parent, crv, ppg):
    name = crv.Name.replace("_Crv", "")
    side = MIDDLE
    if name.find("L_", 0, 2) > -1:
        side = LEFT
    elif name.find("R_", 0, 2) > -1:
        side = RIGHT

    prefix = "M_"
    if side == LEFT:
        prefix = "L_"
    elif side == RIGHT:
        prefix = "R_"

    ppg.Parameters("GlobalSize").Value

    r = ppg.Parameters(prefix + "ColorR_IK").Value
    g = ppg.Parameters(prefix + "ColorG_IK").Value
    b = ppg.Parameters(prefix + "ColorB_IK").Value

    pnts = crv.ActivePrimitive.Geometry.Points
    if pnts.Count == 3:
        p0 = pnts[0].Position
        p1 = pnts[1].Position
        p2 = pnts[2].Position
    else:
        last = pnts.Count - 1
        p0 = pnts[0].Position
        pos = []
        for i in range(1, last):
            pos.append(pnts[i].Position)
        p1 = Utils.GetAveragePosition(pos)
        p2 = pnts[last].Position

    dir1 = XSIMath.CreateVector3()
    dir1.Sub(p0, p1)
    dir2 = XSIMath.CreateVector3()
    dir2.Sub(p1, p2)

    length = dir1.Length() + dir2.Length()

    plane = XSIMath.CreateVector3()
    plane.Cross(dir1, dir2)
    plane.NormalizeInPlace()

    offset = XSIMath.CreateVector3()
    offset.Normalize(dir1)
    offset.ScaleInPlace(-length * 0.5)
    offset.AddInPlace(p1)

    l1 = dir1.Length()
    l2 = dir2.Length()

    transform = XSIMath.CreateTransform()
    transform.SetTranslation(p0)

    root = Icon.IRIcon(parent, name + "_Root_Ctrl", transform, [r, g, b],
                       "cube", 0.1 * length, 0.1 * length, 0.1 * length)
    ik = Utils.MakeRigNull(parent, 1, name + "_IK")

    transform.SetTranslation(p1)
    ik.Kinematics.Global.Transform = transform

    tree = ICETree.CreateICETree(ik, "IK", 2)
    ik_node = XSI.AddICECompoundNode("IK2BonesKinematics", tree)
    XSI.ConnectICENodes(str(tree) + ".port1", str(ik_node) + ".Execute")

    # set ik values
    XSI.SetValue(
        str(ik_node) + ".Reference", "this_model." + name + "_Root_Ctrl", "")
    XSI.SetValue(
        str(ik_node) + ".Reference1", "this_model." + name + "_Eff_Ctrl", "")
    XSI.SetValue(
        str(ik_node) + ".Reference2", "this_model." + name + "_UpV_Ctrl", "")
    XSI.SetValue(str(ik_node) + ".LengthA", l1, "")
    XSI.SetValue(str(ik_node) + ".LengthB", l2, "")

    knee = Icon.IRIcon(ik, name + "_Knee_Ctrl", transform, [r, g, b], "sphere",
                       0.1 * length, 0.1 * length, 0.1 * length)

    transform.SetTranslation(offset)
    upv = Icon.IRIcon(root, name + "_UpV_Ctrl", transform, [r, g, b],
                      "pyramid", 0.05 * length, 0.05 * length, 0.05 * length)

    transform.SetTranslation(p2)
    eff = Icon.IRIcon(parent, name + "_Eff_Ctrl", transform, [r, g, b],
                      "square", length, length, length)

    Utils.ResetStaticKinematicState([root, knee, eff])
    Utils.GroupSetup(parent.Model, [root, knee, eff], "IK_Rig")
    XSI.SetNeutralPose([root, knee, eff, upv], "siSRT", "")
Example #22
0
def bbppTransformation_BuildOutputMesh_OnClicked( ):
	oPPG = PPG.Inspected(0)
	oModel = oPPG.Parent3DObject
	oStartCloud = oModel.FindChild("StartCloud")
	oEndCloud = oModel.FindChild("EndCloud")
	
	oStartGrp = oModel.Groups("Start");
	oEndGrp = oModel.Groups("End");
	
	# does geometry exists?
	oStartGeomStatic =  bbppTransformation_StartGeometryStaticExist(oPPG)
	oEndGeomStatic =  bbppTransformation_EndGeometryStaticExist(oPPG)
	
	if not oStartGeomStatic or not oEndGeomStatic:
		XSI.LogMessage("bbppTransformation Geometry Does not exist ---> Can't build Output Mesh!", constants.siError)
		return
	
	if oPPG.AnimatedTransformation.Value:
		oStartGeomAnimated =  bbppTransformation_StartGeometryAnimatedExist(oPPG)
		oEndGeomAnimated =  bbppTransformation_EndGeometryAnimatedExist(oPPG)
		
		if not oStartGeomAnimated or not oEndGeomAnimated:
			XSI.LogMessage("bbppTransformation Geometry Does not exist ---> Can't build Output Mesh!", constants.siError)
			return
	
	# create start geometry point cloud
	if not oStartCloud:
		# create emission node
		oStartCloud = XSI.GetPrim("PointCloud", "StartCloud", oModel)
		oIceTree = XSI.ApplyOp("ICETree", oStartCloud, "siNode", "", "", 0)
		oEmit = XSI.AddICECompoundNode("bbpp Emit From Points", oIceTree)
		XSI.ConnectICENodes(str(oIceTree) + ".port1", str(oEmit) + ".add")
		oGet1 = XSI.AddICENode("GetDataNode", oIceTree)
		XSI.SetValue(str(oGet1) + ".reference", oStartGeomStatic.FullName)
		XSI.ConnectICENodes(str(oEmit) + ".Emiter", str(oGet1) + ".outname")
		XSI.SetValue(str(oEmit) + ".Color_red", 0.9)
		XSI.SetValue(str(oEmit) + ".Color_green", 0.4)
		XSI.SetValue(str(oEmit) + ".Color_blue", 0.1)
		
		# create blend node
		oBlend = XSI.AddICECompoundNode("bbpp Blend Cloud", oIceTree)
		XSI.AddPortToICENode(str(oIceTree) + ".port1", "siNodePortDataInsertionLocationAfter")
		XSI.ConnectICENodes(str(oIceTree) + ".port2", str(oBlend) + ".Execute")
		oGet2 = XSI.AddICENode("GetDataNode", oIceTree)
		XSI.SetValue(str(oGet2) + ".reference", str(oStartGrp))
		XSI.ConnectICENodes(str(oBlend) + ".Start_Cloud", str(oGet2) + ".outname")
		oGet3 = XSI.AddICENode("GetDataNode", oIceTree)
		XSI.SetValue(str(oGet3) + ".reference", str(oEndGrp))
		XSI.ConnectICENodes(str(oBlend) + ".End_Cloud", str(oGet3) + ".outname")
		oGet4 = XSI.AddICENode("GetDataNode", oIceTree)
		XSI.SetValue(str(oGet4) + ".reference", oEndGeomStatic.FullName)
		XSI.ConnectICENodes(str(oBlend) + ".Target_Geometry", str(oGet4) + ".value")
		
		# connect timer
		oTimer = XSI.AddICECompoundNode("bbpp Transformation Timer", oIceTree)
		XSI.ConnectICENodes(str(oBlend) + ".Blend", str(oTimer) + ".Blend")
		oGet5 = XSI.AddICENode("GetDataNode", oIceTree)
		XSI.SetValue(str(oGet5) + ".reference", oPPG.StartFrame.FullName)
		oGet6 = XSI.AddICENode("GetDataNode", oIceTree)
		XSI.SetValue(str(oGet6) + ".reference", oPPG.EndFrame.FullName)
		XSI.ConnectICENodes(str(oTimer) + ".Start_Frame", str(oGet5) + ".value")
		XSI.ConnectICENodes(str(oTimer) + ".End_Frame", str(oGet6) + ".value")

	# create end geometry point cloud
	if not oEndCloud:
		# create emission node
		oEndCloud = XSI.GetPrim("PointCloud", "EndCloud", oModel)
		oIceTree = XSI.ApplyOp("ICETree", oEndCloud, "siNode", "", "", 0)
		oEmit = XSI.AddICECompoundNode("bbpp Emit From Points", oIceTree)
		XSI.ConnectICENodes(str(oIceTree) + ".port1", str(oEmit) + ".add")
		oGet1 = XSI.AddICENode("GetDataNode", oIceTree)
		XSI.SetValue(str(oGet1) + ".reference", oEndGeomStatic.FullName)
		XSI.ConnectICENodes(str(oEmit) + ".Emiter", str(oGet1) + ".outname")
		XSI.SetValue(str(oEmit) + ".Color_red", 0.1)
		XSI.SetValue(str(oEmit) + ".Color_green", 0.9)
		XSI.SetValue(str(oEmit) + ".Color_blue", 0.4)
		
		# create blend node
		oBlend = XSI.AddICECompoundNode("bbpp Blend Cloud", oIceTree)
		XSI.AddPortToICENode(str(oIceTree) + ".port1", "siNodePortDataInsertionLocationAfter")
		XSI.ConnectICENodes(str(oIceTree) + ".port2", str(oBlend) + ".Execute")
		oGet2 = XSI.AddICENode("GetDataNode", oIceTree)
		XSI.SetValue(str(oGet2) + ".reference", str(oEndGrp))
		XSI.ConnectICENodes(str(oBlend) + ".Start_Cloud", str(oGet2) + ".outname")
		oGet3 = XSI.AddICENode("GetDataNode", oIceTree)
		XSI.SetValue(str(oGet3) + ".reference", str(oStartGrp))
		XSI.ConnectICENodes(str(oBlend) + ".End_Cloud", str(oGet3) + ".outname")
		oGet4 = XSI.AddICENode("GetDataNode", oIceTree)
		XSI.SetValue(str(oGet4) + ".reference", oStartGeomStatic.FullName)
		XSI.ConnectICENodes(str(oBlend) + ".Target_Geometry", str(oGet4) + ".value")
		
		# connect timer
		oTimer = XSI.AddICECompoundNode("bbpp Transformation Timer", oIceTree)
		XSI.ConnectICENodes(str(oBlend) + ".Blend", str(oTimer) + ".Blend")
		oGet5 = XSI.AddICENode("GetDataNode", oIceTree)
		XSI.SetValue(str(oGet5) + ".reference", oPPG.StartFrame.FullName)
		oGet6 = XSI.AddICENode("GetDataNode", oIceTree)
		XSI.SetValue(str(oGet6) + ".reference", oPPG.EndFrame.FullName)
		XSI.ConnectICENodes(str(oTimer) + ".Start_Frame", str(oGet5) + ".value")
		XSI.ConnectICENodes(str(oTimer) + ".End_Frame", str(oGet6) + ".value")
		XSI.SetValue(str(oTimer) + ".Revert", True)
		
	# create Blob Mesh
	# delete it if already exists
	bbppTransformation_BlobGeometryExist(oPPG)
	XSI.SelectObj(str(oStartCloud) + "," + str(oEndCloud))
	XSI.Create_Polygonizer_Polymesh()
	oBlob = XSI.Selection(0)
	oBlob.Name = "OutputMesh"
	oModel.AddChild(oBlob)
	oBlobOp = oBlob.ActivePrimitive.ConstructionHistory.Find("Polygonizer")
	
	
	# create expression for in-between
	#--------------------------------------
	# detail
	sStartFrame = oPPG.StartFrame.FullName
	sEndFrame = oPPG.EndFrame.FullName
	sTimelapse = sEndFrame+" - "+sStartFrame
	oExpr = "(1 - sin(cond(FC>"+sStartFrame+",cond(Fc<"+sEndFrame+",(Fc - "+sStartFrame+")/("+sTimelapse+"),1),0)*180)) *2 + 2"
	oBlobOp.Parameters("Detail").AddExpression(oExpr)
	
	# blur isofield
	oExpr = "sin(cond(FC>"+sStartFrame+",cond(Fc<"+sEndFrame+",(Fc - "+sStartFrame+")/("+sTimelapse+"),1),0)*180)/2"
	oBlobOp.Parameters("BlurIsofieldStrength").AddExpression(oExpr)
	
	# smooth mesh
	oExpr = "sin(cond(FC>"+sStartFrame+",cond(Fc<"+sEndFrame+",(Fc - "+sStartFrame+")/("+sTimelapse+"),1),0)*180)*4+2"
	oBlobOp.Parameters("SmoothMeshStrength").AddExpression(oExpr)
	
	# isolevel
	oBlobOp.Parameters("Isolevel").Value = 1
Example #23
0
def GatherSkinDataOnSelf(skin):
    all_clusters = []
    model = skin.Model

    elements = CollectSkeletonElements(model)
    for element in elements:
        # check cluster and weight map existence
        cluster_name = '{}_Cls'.format(element.ElementName.Value)
        cluster = skin.ActivePrimitive.Geometry.Clusters(cluster_name)
        if not cluster:
            cluster = Utils.CreateCompleteButNotAlwaysCluster(
                skin, constants.siVertexCluster, cluster_name)
        all_clusters.append(cluster)
        wm = Utils.GetWeightMap(skin, 'WeightMap', 1, 0, 1, cluster)

    # create build array and set data nodes
    tree = ICETree.CreateRigIceTree(skin, 'GatherDatas', 1)
    setter = XSI.AddICECompoundNode('Set Data', tree)
    XSI.SetValue(
        '{}.Reference'.format(setter),
        'Self.__ElementWeights',
    )
    build = XSI.AddICENode('BuildArrayNode', tree)
    XSI.ConnectICENodes('{}.value'.format(setter), '{}.array'.format(build))
    XSI.ConnectICENodes('{}.port1'.format(tree), '{}.execute'.format(setter))

    idx = 1
    # connect each element map
    for cluster in all_clusters:
        getter = XSI.AddICECompoundNode('GetRigElementWeight', tree)
        if idx > 1:
            XSI.AddPortToICENode('{}.value{}'.format(build, idx - 1),
                                 'siNodePortDataInsertionLocationAfter')
        XSI.SetValue('{}.reference'.format(getter),
                     'Self.cls.{}'.format(cluster.Name), "")
        XSI.ConnectICENodes('{}.value{}'.format(build, idx),
                            '{}.Weight'.format(getter))
        idx += 1

    # check for weight maps
    Utils.GetWeightMap(skin, 'SmoothWeightMap', 1, 0, 1)
    Utils.GetWeightMap(skin, 'SearchMap', 1, 0, 1)
    Utils.GetWeightMap(skin, 'BulgeMap', 1, 0, 1)
    Utils.GetWeightMap(skin, 'StretchMap', 1, 0, 1)

    # get smooth weight map
    getter = XSI.AddICENode('GetDataNode', tree)
    XSI.SetValue('{}.reference'.format(getter),
                 'Self.cls.WeightMapCls.SmoothWeightMap.Weights', '')
    XSI.AddPortToICENode('{}.Value'.format(setter),
                         'siNodePortDataInsertionLocationAfter')
    XSI.SetValue('{}.Reference1'.format(setter), 'Self.__SmoothWeights', '')
    XSI.ConnectICENodes('{}.value1'.format(setter), '{}.value'.format(getter))

    # get search map
    getter = XSI.AddICENode('GetDataNode', tree)
    XSI.SetValue('{}.reference'.format(getter),
                 'Self.cls.WeightMapCls.SearchMap.Weights', '')
    XSI.AddPortToICENode('{}.Value1'.format(setter),
                         'siNodePortDataInsertionLocationAfter')
    XSI.SetValue('{}.Reference2'.format(setter), 'Self.__PerPointSearch', '')
    XSI.ConnectICENodes('{}.value2'.format(setter), '{}.value'.format(getter))

    # get stretch map
    getter = XSI.AddICENode('GetDataNode', tree)
    XSI.SetValue('{}.reference'.format(getter),
                 'Self.cls.WeightMapCls.StretchMap.Weights', '')
    XSI.AddPortToICENode('{}.Value2'.format(setter),
                         'siNodePortDataInsertionLocationAfter')
    XSI.SetValue('{}.Reference3'.format(setter), 'Self.__PerPointStretch', '')
    XSI.ConnectICENodes('{}.value3'.format(setter), '{}.value'.format(getter))

    # get bulge map
    getter = XSI.AddICENode('GetDataNode', tree)
    XSI.SetValue('{}.reference'.format(getter),
                 'Self.cls.WeightMapCls.BulgeMap.Weights', '')
    XSI.AddPortToICENode('{}.Value3'.format(setter),
                         'siNodePortDataInsertionLocationAfter')
    XSI.SetValue('{}.Reference4'.format(setter), 'Self.__PerPointBulge', '')
    XSI.ConnectICENodes('{}.value4'.format(setter), '{}.value'.format(getter))

    # show affected points
    affected = XSI.AddICECompoundNode('ShowRigAffectedPoints', tree)
    XSI.AddPortToICENode('{}.port1'.format(tree),
                         'siNodePortDataInsertionLocationAfter')
    XSI.ConnectICENodes('{}.port2'.format(tree), '{}.Execute'.format(affected))