Skip to content

Commit

Permalink
Shifter: Squash_01 add scale multipliers Closes #339
Browse files Browse the repository at this point in the history
  • Loading branch information
miquelcampos committed Nov 16, 2023
1 parent 8e73390 commit a930f8f
Show file tree
Hide file tree
Showing 4 changed files with 917 additions and 104 deletions.
264 changes: 203 additions & 61 deletions release/scripts/mgear/shifter_classic_components/squash_01/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,47 +24,57 @@ def addObjects(self):
self.normal = self.guide.blades["blade"].z * -1
self.binormal = self.guide.blades["blade"].x

t = transform.getTransformLookingAt(self.guide.apos[0],
self.guide.apos[1],
self.normal,
axis="yx",
negate=self.negate)
self.ctl_npo = primitive.addTransform(self.root,
self.getName("ctl_npo"), t)
self.ctl = self.addCtl(self.ctl_npo,
"base_ctl",
t,
self.color_ik,
"square",
w=1.0,
tp=self.parentCtlTag)

self.ref_base = primitive.addTransform(self.ctl,
self.getName("ref_base"),
t)
t = transform.getTransformLookingAt(
self.guide.apos[0],
self.guide.apos[1],
self.normal,
axis="yx",
negate=self.negate,
)
self.ctl_npo = primitive.addTransform(
self.root, self.getName("ctl_npo"), t
)
self.ctl = self.addCtl(
self.ctl_npo,
"base_ctl",
t,
self.color_ik,
"square",
w=1.0,
tp=self.parentCtlTag,
)

self.ref_base = primitive.addTransform(
self.ctl, self.getName("ref_base"), t
)
self.in_SDK = primitive.addTransform(
self.ref_base, self.getName("in_SDK"), t
)

t = transform.setMatrixPosition(t, self.guide.apos[1])

self.ik_cns = primitive.addTransform(self.ctl,
self.getName("ik_cns"),
t)
self.squash_npo = primitive.addTransform(self.ik_cns,
self.getName("squash_npo"),
t)
self.squash_ctl = self.addCtl(self.squash_npo,
"squash_ctl",
t,
self.color_ik,
"crossarrow",
w=1.0,
ro=dt.Vector(1.5708, 0, 0),
tp=self.ctl)
self.ik_cns = primitive.addTransform(
self.ctl, self.getName("ik_cns"), t
)
self.squash_npo = primitive.addTransform(
self.ik_cns, self.getName("squash_npo"), t
)
self.squash_ctl = self.addCtl(
self.squash_npo,
"squash_ctl",
t,
self.color_ik,
"crossarrow",
w=1.0,
ro=dt.Vector(1.5708, 0, 0),
tp=self.ctl,
)

attribute.setKeyableAttributes(self.squash_ctl, ["tx", "ty", "tz"])

self.ref_squash = primitive.addTransform(self.squash_ctl,
self.getName("ref_squash"),
t)
self.ref_squash = primitive.addTransform(
self.squash_ctl, self.getName("ref_squash"), t
)

self.div_cns = []

Expand All @@ -87,7 +97,59 @@ def addAttributes(self):
"ikref",
"Ik Ref",
0,
self.settings["ikrefarray"].split(","))
self.settings["ikrefarray"].split(","),
)

# setup param
self.squashX_att = self.addSetupParam(
"squashX",
"Squash X Mult",
"double",
self.settings["squashX"],
0,
1,
)
self.squashY_att = self.addSetupParam(
"squashY",
"Squash Y Mult",
"double",
self.settings["squashY"],
0,
1,
)
self.squashZ_att = self.addSetupParam(
"squashZ",
"Squash Z Mult",
"double",
self.settings["squashZ"],
0,
1,
)

self.stretchX_att = self.addSetupParam(
"stretchX",
"Stretch X Mult",
"double",
self.settings["stretchX"],
0,
1,
)
self.stretchY_att = self.addSetupParam(
"stretchY",
"Stretch Y Mult",
"double",
self.settings["stretchY"],
0,
1,
)
self.stretchZ_att = self.addSetupParam(
"stretchZ",
"Stretch Z Mult",
"double",
self.settings["stretchZ"],
0,
1,
)

# =====================================================
# OPERATORS
Expand All @@ -100,42 +162,51 @@ def addOperators(self):
we shouldn't create any new object in this method.
"""
applyop.aimCns(self.ref_base,
self.squash_ctl,
axis="yx",
wupType=2,
wupVector=[1, 0, 0],
wupObject=self.ctl,
maintainOffset=False)
applyop.aimCns(self.ref_squash,
self.ctl,
axis="-yx",
wupType=2,
wupVector=[1, 0, 0],
wupObject=self.squash_ctl,
maintainOffset=False)
applyop.aimCns(
self.ref_base,
self.squash_ctl,
axis="yx",
wupType=2,
wupVector=[1, 0, 0],
wupObject=self.ctl,
maintainOffset=False,
)
applyop.aimCns(
self.ref_squash,
self.ctl,
axis="-yx",
wupType=2,
wupVector=[1, 0, 0],
wupObject=self.squash_ctl,
maintainOffset=False,
)
bIncrement = 1.0
blend = 0
for i, div_cns in enumerate(self.div_cns):
intMatrix = applyop.gear_intmatrix_op(
self.ref_base.attr("worldMatrix"),
self.in_SDK.attr("worldMatrix"),
self.ref_squash.attr("worldMatrix"),
blend)
blend,
)

applyop.gear_mulmatrix_op(intMatrix.attr("output"),
div_cns.attr("parentInverseMatrix[0]"),
div_cns)
applyop.gear_mulmatrix_op(
intMatrix.attr("output"),
div_cns.attr("parentInverseMatrix[0]"),
div_cns,
)

blend = blend + bIncrement

d = vector.getDistance(self.guide.apos[0], self.guide.apos[1])
dist_node = node.createDistNode(self.squash_ctl, self.ctl)

rootWorld_node = node.createDecomposeMatrixNode(
self.ctl.attr("worldMatrix"))
self.ctl.attr("worldMatrix")
)

div_node = node.createDivNode(dist_node + ".distance",
rootWorld_node + ".outputScaleY")
div_node = node.createDivNode(
dist_node + ".distance", rootWorld_node + ".outputScaleY"
)

div_node = node.createDivNode(div_node + ".outputX", d)
rev_node = node.createReverseNode(div_node + ".outputX")
Expand All @@ -144,9 +215,31 @@ def addOperators(self):
add_node.input1D[0].set(1.0)
rev_node.outputX >> add_node.input1D[1]

div_node.outputX >> self.ref_base.scaleY
add_node.output1D >> self.ref_base.scaleX
add_node.output1D >> self.ref_base.scaleZ
# div_node.outputX >> self.ref_base.scaleY
# add_node.output1D >> self.ref_base.scaleX
# add_node.output1D >> self.ref_base.scaleZ

self.conditional_scale_multiplier(
div_node.outputX,
div_node.outputX,
self.stretchX_att,
self.squashX_att,
self.ref_base.scaleX,
)
self.conditional_scale_multiplier(
div_node.outputX,
add_node.output1D,
self.stretchY_att,
self.squashY_att,
self.ref_base.scaleY,
)
self.conditional_scale_multiplier(
div_node.outputX,
div_node.outputX,
self.stretchZ_att,
self.squashZ_att,
self.ref_base.scaleZ,
)

# =====================================================
# CONNECTOR
Expand All @@ -169,3 +262,52 @@ def setRelation(self):
def connect_standard(self):
"""standard connection definition for the component"""
self.connect_standardWithSimpleIkRef()

# helper
def conditional_scale_multiplier(
self, cond_attr, driver_attr, attrA, attrB, output_value
):
"""
Adjusts the output value to be 1 when driver_attr is 1.0, and uses attrA or attrB
to multiply based on the difference from 1.0 when driver_attr changes.
Args:
driver_attr (pm.Attribute): The driving attribute.
attrA (pm.Attribute): Attribute to multiply with if driver_attr differs from 1.0.
attrB (pm.Attribute): Attribute to multiply with if driver_attr differs from 1.0.
output_value (pm.Attribute): The attribute to receive the final scaled value.
"""
# Create necessary nodes
condition_node = pm.createNode("condition")
multiply_node_a = pm.createNode("multiplyDivide")
multiply_node_b = pm.createNode("multiplyDivide")
plus_minus_node = pm.createNode("plusMinusAverage")
subtract_node = pm.createNode("plusMinusAverage")

# Setup subtract node to calculate difference from 1.0
subtract_node.operation.set(2) # Subtract operation
subtract_node.input1D[0].set(1.0)
driver_attr >> subtract_node.input1D[1]

# Setup condition node
cond_attr >> condition_node.firstTerm
condition_node.secondTerm.set(1)
condition_node.operation.set(4) # Less than

# Connect subtract node to multiply nodes
subtract_node.output1D >> multiply_node_a.input1X
attrA >> multiply_node_a.input2X
subtract_node.output1D >> multiply_node_b.input1X
attrB >> multiply_node_b.input2X

# Connect multiply nodes to condition node
multiply_node_a.outputX >> condition_node.colorIfFalseR
multiply_node_b.outputX >> condition_node.colorIfTrueR

# Setup plusMinusAverage node
plus_minus_node.operation.set(1) # Sum operation
plus_minus_node.input1D[0].set(1.0)
condition_node.outColorR >> plus_minus_node.input1D[1]

# Connect plusMinusAverage node to output value
plus_minus_node.output1D >> output_value
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,12 @@ def addParameters(self):
-1,
None,
None)
self.pSquashX = self.addParam("squashX", "double", 1, 0, 1)
self.pSquashY = self.addParam("squashY", "double", 1, 0, 1)
self.pSquashZ = self.addParam("squashZ", "double", 1, 0, 1)
self.pStretchX = self.addParam("stretchX", "double", 1, 0, 1)
self.pStretchY = self.addParam("stretchY", "double", 1, 0, 1)
self.pStretchZ = self.addParam("stretchZ", "double", 1, 0, 1)

##########################################################
# Setting Page
Expand Down Expand Up @@ -120,6 +126,27 @@ def populate_componentControls(self):
for item in refArrayItems:
self.settingsTab.refArray_listWidget.addItem(item)

self.settingsTab.squashX_slider.setValue(int(self.root.attr("squashX").get() * 100))
self.settingsTab.squashX_spinBox.setValue(int(self.root.attr("squashX").get() * 100))

self.settingsTab.squashY_slider.setValue(int(self.root.attr("squashY").get() * 100))
self.settingsTab.squashY_spinBox.setValue(int(self.root.attr("squashY").get() * 100))

self.settingsTab.squashZ_slider.setValue(int(self.root.attr("squashZ").get() * 100))
self.settingsTab.squashZ_spinBox.setValue(int(self.root.attr("squashZ").get() * 100))


self.settingsTab.stretchX_slider.setValue(int(self.root.attr("stretchX").get() * 100))
self.settingsTab.stretchX_spinBox.setValue(int(self.root.attr("stretchX").get() * 100))

self.settingsTab.stretchY_slider.setValue(int(self.root.attr("stretchY").get() * 100))
self.settingsTab.stretchY_spinBox.setValue(int(self.root.attr("stretchY").get() * 100))

self.settingsTab.stretchZ_slider.setValue(int(self.root.attr("stretchZ").get() * 100))
self.settingsTab.stretchZ_spinBox.setValue(int(self.root.attr("stretchZ").get() * 100))



def create_componentLayout(self):

self.settings_layout = QtWidgets.QVBoxLayout()
Expand All @@ -140,6 +167,24 @@ def create_componentConnections(self):
"ikrefarray"))
self.settingsTab.refArray_listWidget.installEventFilter(self)

self.settingsTab.squashX_slider.valueChanged.connect(partial(self.updateSlider, self.settingsTab.squashX_slider, "squashX"))
self.settingsTab.squashX_spinBox.valueChanged.connect(partial(self.updateSlider, self.settingsTab.squashX_spinBox, "squashX"))

self.settingsTab.squashY_slider.valueChanged.connect(partial(self.updateSlider, self.settingsTab.squashY_slider, "squashY"))
self.settingsTab.squashY_spinBox.valueChanged.connect(partial(self.updateSlider, self.settingsTab.squashY_spinBox, "squashY"))

self.settingsTab.squashZ_slider.valueChanged.connect(partial(self.updateSlider, self.settingsTab.squashZ_slider, "squashZ"))
self.settingsTab.squashZ_spinBox.valueChanged.connect(partial(self.updateSlider, self.settingsTab.squashZ_spinBox, "squashZ"))

self.settingsTab.stretchX_slider.valueChanged.connect(partial(self.updateSlider, self.settingsTab.stretchX_slider, "stretchX"))
self.settingsTab.stretchX_spinBox.valueChanged.connect(partial(self.updateSlider, self.settingsTab.stretchX_spinBox, "stretchX"))

self.settingsTab.stretchY_slider.valueChanged.connect(partial(self.updateSlider, self.settingsTab.stretchY_slider, "stretchY"))
self.settingsTab.stretchY_spinBox.valueChanged.connect(partial(self.updateSlider, self.settingsTab.stretchY_spinBox, "stretchY"))

self.settingsTab.stretchZ_slider.valueChanged.connect(partial(self.updateSlider, self.settingsTab.stretchZ_slider, "stretchZ"))
self.settingsTab.stretchZ_spinBox.valueChanged.connect(partial(self.updateSlider, self.settingsTab.stretchZ_spinBox, "stretchZ"))

def eventFilter(self, sender, event):
if event.type() == QtCore.QEvent.ChildRemoved:
if sender == self.settingsTab.refArray_listWidget:
Expand Down
Loading

0 comments on commit a930f8f

Please sign in to comment.