39 import maya.OpenMaya
as OpenMaya
40 import maya.OpenMayaMPx
as OpenMayaMPx
41 import maya.OpenMayaRender
as OpenMayaRender
42 import maya.OpenMayaUI
as OpenMayaUI
47 kPluginLocatorTypeName =
"spFootPrintLocator"
48 kPluginLocatorManipTypeName =
"spFootPrintLocatorManip"
50 footPrintLocatorId = OpenMaya.MTypeId(0x8700C)
51 footPrintLocatorManipId = OpenMaya.MTypeId(0x8700D)
53 glRenderer = OpenMayaRender.MHardwareRenderer.theRenderer()
54 glFT = glRenderer.glFunctionTable()
56 sole = ( [ 0.00, 0.0, -0.70 ],
68 [ -0.15, 0.0, -0.14 ],
69 [ -0.16, 0.0, -0.25 ],
70 [ -0.17, 0.0, -0.35 ],
71 [ -0.17, 0.0, -0.46 ],
72 [ -0.16, 0.0, -0.54 ],
73 [ -0.13, 0.0, -0.61 ],
74 [ -0.09, 0.0, -0.65 ],
75 [ -0.04, 0.0, -0.69 ],
76 [ -0.00, 0.0, -0.70 ] )
78 heel = ( [ 0.00, 0.0, 0.06 ],
94 [ -0.00, 0.0, 0.06 ] )
97 class footPrintLocatorManip(OpenMayaMPx.MPxManipContainer):
99 OpenMayaMPx.MPxManipContainer.__init__(self)
100 self.fDistanceManip = OpenMaya.MDagPath()
101 self.fNodePath = OpenMaya.MDagPath()
103 def createChildren(self):
105 startPoint = OpenMaya.MPoint(0.0, 0.0, 0.0)
106 direction = OpenMaya.MVector(0.0, 1.0, 0.0)
108 self.fDistanceManip = self.addDistanceManip(
"distanceManip",
"distance")
110 distanceManipFn = OpenMayaUI.MFnDistanceManip(self.fDistanceManip)
111 distanceManipFn.setStartPoint(startPoint)
112 distanceManipFn.setDirection(direction)
114 sys.stderr.write(
"ERROR: footPrintLocatorManip.createChildren\n")
117 def plugToManipConversion( manipIndex ):
119 numData = OpenMaya.MFnNumericData()
120 numDataObj = numData.create(OpenMaya.MFnNumericData.k3Double)
122 vec = self.nodeTranslation()
123 numData.setData3Double(vec.x, vec.y, vec.z)
125 returnData = OpenMaya.MManipData(numDataObj)
127 sys.stderr.write(
"ERROR: footPrintLocatorManip.plugToManipConversion\n")
131 def connectToDependNode(self, node):
133 dagNodeFn = OpenMaya.MFnDagNode(node)
134 dagNodeFn.getPath(self.fNodePath)
136 distanceManipFn = OpenMayaUI.MFnDistanceManip(self.fDistanceManip)
137 nodeFn = OpenMaya.MFnDependencyNode(node)
139 sizePlug = nodeFn.findPlug(
'size')
140 distanceManipFn.connectToDistancePlug(sizePlug)
142 self.finishAddingManips()
143 OpenMayaMPx.MPxManipContainer.connectToDependNode(self, node)
145 sys.stderr.write(
"ERROR: footPrintLocatorManip.connectToDependNode\n")
148 def draw(self, view, path, style, status):
149 OpenMayaMPx.MPxManipContainer.draw(self, view, path, style, status)
153 textPosVector = self.nodeTranslation()
154 textPosPoint = OpenMaya.MPoint(textPosVector.x, textPosVector.y, textPosVector.z)
156 view.drawText(
'Stretch Me!', textPosPoint, OpenMayaUI.M3dView.kLeft)
159 def startPointCallback(self, index):
160 numData = OpenMaya.MFnNumericData()
161 numDataObj = numData.create(OpenMaya.MFnNumericData.k3Double)
163 vec = self.nodeTranslation()
164 numData.setData3Double(vec.x, vec.y, vec.z)
166 return OpenMayaUI.MManipData(numDataObj)
168 def nodeTranslation(self):
169 dagFn = OpenMaya.MFnDagNode(self.fNodePath)
170 path = OpenMaya.MDagPath()
177 transformFn = OpenMaya.MFnTransform(path)
178 return transformFn.translation(OpenMaya.MSpace.kWorld)
181 class footPrintLocator(OpenMayaMPx.MPxLocatorNode):
182 size = OpenMaya.MObject()
185 OpenMayaMPx.MPxLocatorNode.__init__(self)
187 def compute(self, plug, dataBlock):
188 return OpenMaya.kUnknownParameter
190 def draw(self, view, path, style, status):
191 thisNode = self.thisMObject()
193 plug = OpenMaya.MPlug(thisNode, self.size)
195 sizeVal = plug.asMDistance()
197 multiplier = sizeVal.asCentimeters()
201 if style == OpenMayaUI.M3dView.kFlatShaded
or style == OpenMayaUI.M3dView.kGouraudShaded:
202 glFT.glPushAttrib(OpenMayaRender.MGL_CURRENT_BIT)
204 if status == OpenMayaUI.M3dView.kActive:
205 view.setDrawColor( 13, OpenMayaUI.M3dView.kActiveColors )
207 view.setDrawColor( 13, OpenMayaUI.M3dView.kDormantColors )
210 glFT.glBegin( OpenMayaRender.MGL_TRIANGLE_FAN )
211 for i
in range(last):
212 glFT.glVertex3f(sole[i][0]*multiplier, sole[i][1]*multiplier, sole[i][2]*multiplier)
216 glFT.glBegin( OpenMayaRender.MGL_TRIANGLE_FAN )
217 for i
in range(last):
218 glFT.glVertex3f(heel[i][0]*multiplier, heel[i][1]*multiplier, heel[i][2]*multiplier)
223 glFT.glBegin(OpenMayaRender.MGL_LINES)
226 for i
in range(last):
227 glFT.glVertex3f( sole[i][0]*multiplier, sole[i][1]*multiplier, sole[i][2]*multiplier )
228 glFT.glVertex3f( sole[i+1][0]*multiplier, sole[i+1][1]*multiplier, sole[i+1][2]*multiplier )
231 for i
in range(last):
232 glFT.glVertex3f( heel[i][0]*multiplier, heel[i][1]*multiplier, heel[i][2]*multiplier )
233 glFT.glVertex3f( heel[i+1][0]*multiplier, heel[i+1][1]*multiplier, heel[i+1][2]*multiplier )
242 def boundingBox(self):
243 thisNode = self.thisMObject()
244 plug = OpenMaya.MPlug(thisNode, self.size)
246 sizeVal = plug.asMDistance()
248 multiplier = sizeVal.asCentimeters()
250 corner1 = OpenMaya.MPoint(-0.17, 0.0, -0.7)
251 corner2 = OpenMaya.MPoint(0.17, 0.0, 0.3)
253 corner1 = corner1 * multiplier
254 corner2 = corner2 * multiplier
256 bbox = OpenMaya.MBoundingBox( corner1, corner2 )
260 def locatorCreator():
261 return OpenMayaMPx.asMPxPtr( footPrintLocator() )
263 def locatorInitializer():
264 unitFn = OpenMaya.MFnUnitAttribute()
265 footPrintLocator.size = unitFn.create(
"size",
"in", OpenMaya.MFnUnitAttribute.kDistance)
266 unitFn.setDefault(10.0)
267 unitFn.setStorable(
True)
268 unitFn.setWritable(
True)
270 footPrintLocator.addAttribute( footPrintLocator.size )
271 OpenMayaMPx.MPxManipContainer.addToManipConnectTable(footPrintLocatorId)
273 def locatorManipCreator():
274 return OpenMayaMPx.asMPxPtr( footPrintLocatorManip() )
276 def locatorManipInitializer():
277 OpenMayaMPx.MPxManipContainer.initialize()
281 def initializePlugin(mobject):
282 mplugin = OpenMayaMPx.MFnPlugin(mobject)
285 mplugin.registerNode( kPluginLocatorTypeName, footPrintLocatorId, locatorCreator, locatorInitializer, OpenMayaMPx.MPxNode.kLocatorNode )
287 sys.stderr.write(
"Failed to register node: %s" % kPluginLocatorTypeName )
291 mplugin.registerNode( kPluginLocatorManipTypeName, footPrintLocatorManipId, locatorManipCreator, locatorManipInitializer, OpenMayaMPx.MPxNode.kManipContainer )
293 sys.stderr.write(
"Failed to register node: %s" % kPluginLocatorManipTypeName )
298 def uninitializePlugin(mobject):
299 mplugin = OpenMayaMPx.MFnPlugin(mobject)
301 mplugin.deregisterNode( footPrintLocatorId )
303 sys.stderr.write(
"Failed to deregister node: %s" % kPluginLocatorTypeName )
307 mplugin.deregisterNode( footPrintLocatorManipId )
309 sys.stderr.write(
"Failed to deregister node: %s" % kPluginLocatorManipTypeName )