54 import maya.OpenMaya
as OpenMaya
55 import maya.OpenMayaMPx
as OpenMayaMPx
56 import maya.OpenMayaRender
as OpenMayaRender
57 import maya.OpenMayaUI
as OpenMayaUI
62 kPluginLocatorTypeName =
"spFootPrintLocator"
63 kPluginLocatorManipTypeName =
"spFootPrintLocatorManip"
68 glRenderer = OpenMayaRender.MHardwareRenderer.theRenderer()
69 glFT = glRenderer.glFunctionTable()
71 sole = ( [ 0.00, 0.0, -0.70 ],
83 [ -0.15, 0.0, -0.14 ],
84 [ -0.16, 0.0, -0.25 ],
85 [ -0.17, 0.0, -0.35 ],
86 [ -0.17, 0.0, -0.46 ],
87 [ -0.16, 0.0, -0.54 ],
88 [ -0.13, 0.0, -0.61 ],
89 [ -0.09, 0.0, -0.65 ],
90 [ -0.04, 0.0, -0.69 ],
91 [ -0.00, 0.0, -0.70 ] )
93 heel = ( [ 0.00, 0.0, 0.06 ],
102 [ -0.04, 0.0, 0.30 ],
103 [ -0.09, 0.0, 0.29 ],
104 [ -0.11, 0.0, 0.28 ],
105 [ -0.13, 0.0, 0.25 ],
106 [ -0.14, 0.0, 0.21 ],
107 [ -0.14, 0.0, 0.15 ],
108 [ -0.13, 0.0, 0.06 ],
109 [ -0.00, 0.0, 0.06 ] )
112 class footPrintLocatorManip(OpenMayaMPx.MPxManipContainer):
114 OpenMayaMPx.MPxManipContainer.__init__(self)
118 def createChildren(self):
123 self.fDistanceManip = self.addDistanceManip(
"distanceManip",
"distance")
126 distanceManipFn.setStartPoint(startPoint)
127 distanceManipFn.setDirection(direction)
129 sys.stderr.write(
"ERROR: footPrintLocatorManip.createChildren\n")
132 def plugToManipConversion( manipIndex ):
135 numDataObj = numData.create(OpenMaya.MFnNumericData.k3Double)
137 vec = self.nodeTranslation()
138 numData.setData3Double(vec.x, vec.y, vec.z)
140 returnData = OpenMaya.MManipData(numDataObj)
142 sys.stderr.write(
"ERROR: footPrintLocatorManip.plugToManipConversion\n")
146 def connectToDependNode(self, node):
149 dagNodeFn.getPath(self.fNodePath)
154 sizePlug = nodeFn.findPlug(
'size')
155 distanceManipFn.connectToDistancePlug(sizePlug)
157 self.finishAddingManips()
158 OpenMayaMPx.MPxManipContainer.connectToDependNode(self, node)
160 sys.stderr.write(
"ERROR: footPrintLocatorManip.connectToDependNode\n")
163 def draw(self, view, path, style, status):
164 OpenMayaMPx.MPxManipContainer.draw(self, view, path, style, status)
168 textPosVector = self.nodeTranslation()
169 textPosPoint =
OpenMaya.MPoint(textPosVector.x, textPosVector.y, textPosVector.z)
171 view.drawText(
'Stretch Me!', textPosPoint, OpenMayaUI.M3dView.kLeft)
174 def startPointCallback(self, index):
176 numDataObj = numData.create(OpenMaya.MFnNumericData.k3Double)
178 vec = self.nodeTranslation()
179 numData.setData3Double(vec.x, vec.y, vec.z)
181 return OpenMayaUI.MManipData(numDataObj)
183 def nodeTranslation(self):
193 return transformFn.translation(OpenMaya.MSpace.kWorld)
196 class footPrintLocator(OpenMayaMPx.MPxLocatorNode):
200 OpenMayaMPx.MPxLocatorNode.__init__(self)
202 def compute(self, plug, dataBlock):
203 return OpenMaya.kUnknownParameter
205 def draw(self, view, path, style, status):
206 thisNode = self.thisMObject()
210 sizeVal = plug.asMDistance()
212 multiplier = sizeVal.asCentimeters()
216 if style == OpenMayaUI.M3dView.kFlatShaded
or style == OpenMayaUI.M3dView.kGouraudShaded:
217 glFT.glPushAttrib(OpenMayaRender.MGL_CURRENT_BIT)
219 if status == OpenMayaUI.M3dView.kActive:
220 view.setDrawColor( 13, OpenMayaUI.M3dView.kActiveColors )
222 view.setDrawColor( 13, OpenMayaUI.M3dView.kDormantColors )
225 glFT.glBegin( OpenMayaRender.MGL_TRIANGLE_FAN )
226 for i
in range(last):
227 glFT.glVertex3f(sole[i][0]*multiplier, sole[i][1]*multiplier, sole[i][2]*multiplier)
231 glFT.glBegin( OpenMayaRender.MGL_TRIANGLE_FAN )
232 for i
in range(last):
233 glFT.glVertex3f(heel[i][0]*multiplier, heel[i][1]*multiplier, heel[i][2]*multiplier)
238 glFT.glBegin(OpenMayaRender.MGL_LINES)
241 for i
in range(last):
242 glFT.glVertex3f( sole[i][0]*multiplier, sole[i][1]*multiplier, sole[i][2]*multiplier )
243 glFT.glVertex3f( sole[i+1][0]*multiplier, sole[i+1][1]*multiplier, sole[i+1][2]*multiplier )
246 for i
in range(last):
247 glFT.glVertex3f( heel[i][0]*multiplier, heel[i][1]*multiplier, heel[i][2]*multiplier )
248 glFT.glVertex3f( heel[i+1][0]*multiplier, heel[i+1][1]*multiplier, heel[i+1][2]*multiplier )
257 def boundingBox(self):
258 thisNode = self.thisMObject()
261 sizeVal = plug.asMDistance()
263 multiplier = sizeVal.asCentimeters()
268 corner1 = corner1 * multiplier
269 corner2 = corner2 * multiplier
275 def locatorCreator():
276 return OpenMayaMPx.asMPxPtr( footPrintLocator() )
278 def locatorInitializer():
280 footPrintLocator.size = unitFn.create(
"size",
"in", OpenMaya.MFnUnitAttribute.kDistance)
281 unitFn.setDefault(10.0)
282 unitFn.setStorable(
True)
283 unitFn.setWritable(
True)
285 footPrintLocator.addAttribute( footPrintLocator.size )
286 OpenMayaMPx.MPxManipContainer.addToManipConnectTable(footPrintLocatorId)
288 def locatorManipCreator():
289 return OpenMayaMPx.asMPxPtr( footPrintLocatorManip() )
291 def locatorManipInitializer():
292 OpenMayaMPx.MPxManipContainer.initialize()
296 def initializePlugin(mobject):
297 mplugin = OpenMayaMPx.MFnPlugin(mobject)
300 mplugin.registerNode( kPluginLocatorTypeName, footPrintLocatorId, locatorCreator, locatorInitializer, OpenMayaMPx.MPxNode.kLocatorNode )
302 sys.stderr.write(
"Failed to register node: %s" % kPluginLocatorTypeName )
306 mplugin.registerNode( kPluginLocatorManipTypeName, footPrintLocatorManipId, locatorManipCreator, locatorManipInitializer, OpenMayaMPx.MPxNode.kManipContainer )
308 sys.stderr.write(
"Failed to register node: %s" % kPluginLocatorManipTypeName )
313 def uninitializePlugin(mobject):
314 mplugin = OpenMayaMPx.MFnPlugin(mobject)
316 mplugin.deregisterNode( footPrintLocatorId )
318 sys.stderr.write(
"Failed to deregister node: %s" % kPluginLocatorTypeName )
322 mplugin.deregisterNode( footPrintLocatorManipId )
324 sys.stderr.write(
"Failed to deregister node: %s" % kPluginLocatorManipTypeName )