62 import maya.OpenMaya
as OpenMaya
63 import maya.OpenMayaMPx
as OpenMayaMPx
67 kRockingTransformPluginName =
"spRockingTransform"
68 kRockingTransformNodeName =
"spRockingTransformNode"
69 kRockingTransformNodeID = OpenMaya.MTypeId(0x87014)
70 kRockingTransformMatrixID = OpenMaya.MTypeId(0x87015)
75 kTrackingDictionary = {}
78 class rockingTransformMatrix(OpenMayaMPx.MPxTransformationMatrix):
81 OpenMayaMPx.MPxTransformationMatrix.__init__(self)
82 kTrackingDictionary[OpenMayaMPx.asHashable(self)] = self
86 del kTrackingDictionary[OpenMayaMPx.asHashable(self)]
88 def setRockInX(self,rockingValue):
89 self.rockXValue = rockingValue
92 return self.rockXValue
94 def asMatrix(self,percent=None):
96 Find the new matrix and return it
99 matrix = OpenMayaMPx.MPxTransformationMatrix.asMatrix(self)
100 tm = OpenMaya.MTransformationMatrix(matrix)
101 quat = self.rotation()
102 rockingValue = self.getRockInX()
103 newTheta = math.radians( rockingValue )
104 quat.setToXAxis( newTheta )
105 tm.addRotationQuaternion( quat.x, quat.y, quat.z, quat.w, OpenMaya.MSpace.kTransform )
108 m = OpenMayaMPx.MPxTransformationMatrix(self)
110 trans = m.translation()
111 rotatePivotTrans = m.rotatePivot()
112 scalePivotTrans = m.scalePivotTranslation()
113 trans = trans * percent
114 rotatePivotTrans = rotatePivotTrans * percent
115 scalePivotTrans = scalePivotTrans * percent
117 m.setRotatePivot( rotatePivotTrans )
118 m.setScalePivotTranslation( scalePivotTrans )
120 quat = self.rotation()
121 rockingValue = self.getRockInX()
122 newTheta = math.radians( rockingValue )
124 quat.setToXAxis( newTheta )
126 eulerRotate = m.eulerRotation()
127 m.rotateTo( eulerRotate * percent, OpenMaya.MSpace.kTransform )
129 s = self.scale( OpenMaya.MSpace.kTransform )
130 s.x = 1.0 + ( s.x - 1.0 ) * percent
131 s.y = 1.0 + ( s.y - 1.0 ) * percent
132 s.z = 1.0 + ( s.z - 1.0 ) * percent
133 m.scaleTo( s, OpenMaya.MSpace.kTransform )
138 class rockingTransformNode(OpenMayaMPx.MPxTransform):
139 aRockInX = OpenMaya.MObject()
141 def __init__(self, transform=None):
142 if transform
is None:
143 OpenMayaMPx.MPxTransform.__init__(self)
145 OpenMayaMPx.MPxTransform.__init__(self, transform)
146 self.rockXValue = 0.0
148 def createTransformationMatrix(self):
149 return OpenMayaMPx.asMPxPtr( rockingTransformMatrix() )
152 return kRockingTransformNodeName
155 def validateAndSetValue(self, plug, handle, context):
156 if not plug.isNull():
157 block = self._forceCache(context)
158 blockHandle = block.outputValue(plug)
160 if plug == self.aRockInX:
162 rockInX = handle.asDouble()
163 blockHandle.setDouble(rockInX)
167 ltm = self.getRockingTransformationMatrix()
169 ltm.setRockInX(rockInX)
171 blockHandle.setClean()
177 OpenMayaMPx.MPxTransform.validateAndSetValue(self, plug, handle, context)
180 def getRockingTransformationMatrix(self):
181 baseXform = self.transformationMatrixPtr()
182 return kTrackingDictionary[OpenMayaMPx.asHashable(baseXform)]
187 return OpenMayaMPx.asMPxPtr( rockingTransformMatrix() )
190 return OpenMayaMPx.asMPxPtr( rockingTransformNode() )
192 def nodeInitializer():
193 numFn = OpenMaya.MFnNumericAttribute()
195 rockingTransformNode.aRockInX = numFn.create(
"RockInX",
"rockx", OpenMaya.MFnNumericData.kDouble, 0.0)
197 numFn.setKeyable(
True)
198 numFn.setAffectsWorldSpace(
True)
200 rockingTransformNode.addAttribute(rockingTransformNode.aRockInX)
201 rockingTransformNode.mustCallValidateAndSet(rockingTransformNode.aRockInX)
205 def initializePlugin(mobject):
206 mplugin = OpenMayaMPx.MFnPlugin(mobject)
209 mplugin.registerTransform( kRockingTransformPluginName, kRockingTransformNodeID, \
210 nodeCreator, nodeInitializer, matrixCreator, kRockingTransformMatrixID )
212 sys.stderr.write(
"Failed to register transform: %s\n" % kRockingTransformPluginName )
216 def uninitializePlugin(mobject):
217 mplugin = OpenMayaMPx.MFnPlugin(mobject)
220 mplugin.deregisterNode( kRockingTransformNodeID )
222 sys.stderr.write(
"Failed to unregister node: %s\n" % kRockingTransformPluginName )