28 import maya.api.OpenMaya
as om
29 import maya.api.OpenMayaUI
as omui
30 import maya.api.OpenMayaAnim
as oma
31 import maya.api.OpenMayaRender
as omr
35 The presence of this function tells Maya that the plugin produces, and
36 expects to be passed, objects created using the Maya Python API 2.0.
40 def matrixAsArray(matrix):
43 array.append(matrix[i])
48 sole = [ [ 0.00, 0.0, -0.70 ],
60 [ -0.15, 0.0, -0.14 ],
61 [ -0.16, 0.0, -0.25 ],
62 [ -0.17, 0.0, -0.35 ],
63 [ -0.17, 0.0, -0.46 ],
64 [ -0.16, 0.0, -0.54 ],
65 [ -0.13, 0.0, -0.61 ],
66 [ -0.09, 0.0, -0.65 ],
67 [ -0.04, 0.0, -0.69 ],
68 [ -0.00, 0.0, -0.70 ] ]
69 heel = [ [ 0.00, 0.0, 0.06 ],
85 [ -0.00, 0.0, 0.06 ] ]
95 class footPrint(omui.MPxLocatorNode):
96 id = om.MTypeId( 0x80007 )
97 drawDbClassification =
"drawdb/geometry/footPrint"
98 drawRegistrantId =
"FootprintNodePlugin"
108 unitFn = om.MFnUnitAttribute()
110 footPrint.size = unitFn.create(
"size",
"sz", om.MFnUnitAttribute.kDistance )
111 unitFn.default = om.MDistance(1.0)
113 om.MPxNode.addAttribute( footPrint.size )
116 omui.MPxLocatorNode.__init__(self)
118 def compute(self, plug, data):
121 def draw(self, view, path, style, status):
124 thisNode = self.thisMObject()
125 plug = om.MPlug( thisNode, footPrint.size )
126 sizeVal = plug.asMDistance()
127 multiplier = sizeVal.asCentimeters()
129 global sole, soleCount
130 global heel, heelCount
135 import maya.OpenMayaRender
as v1omr
136 glRenderer = v1omr.MHardwareRenderer.theRenderer()
137 glFT = glRenderer.glFunctionTable()
139 if ( style == omui.M3dView.kFlatShaded )
or ( style == omui.M3dView.kGouraudShaded ):
142 glFT.glPushAttrib( v1omr.MGL_CURRENT_BIT )
145 glFT.glDisable( v1omr.MGL_CULL_FACE )
147 if status == omui.M3dView.kActive:
148 view.setDrawColor( 13, omui.M3dView.kActiveColors )
150 view.setDrawColor( 13, omui.M3dView.kDormantColors )
152 glFT.glBegin( v1omr.MGL_TRIANGLE_FAN )
153 for i
in range(soleCount-1):
154 glFT.glVertex3f( sole[i][0] * multiplier, sole[i][1] * multiplier, sole[i][2] * multiplier )
157 glFT.glBegin( v1omr.MGL_TRIANGLE_FAN )
158 for i
in range(heelCount-1):
159 glFT.glVertex3f( heel[i][0] * multiplier, heel[i][1] * multiplier, heel[i][2] * multiplier )
166 glFT.glBegin( v1omr.MGL_LINES )
167 for i
in range(soleCount-1):
168 glFT.glVertex3f( sole[i][0] * multiplier, sole[i][1] * multiplier, sole[i][2] * multiplier )
169 glFT.glVertex3f( sole[i+1][0] * multiplier, sole[i+1][1] * multiplier, sole[i+1][2] * multiplier )
171 for i
in range(heelCount-1):
172 glFT.glVertex3f( heel[i][0] * multiplier, heel[i][1] * multiplier, heel[i][2] * multiplier )
173 glFT.glVertex3f( heel[i+1][0] * multiplier, heel[i+1][1] * multiplier, heel[i+1][2] * multiplier )
179 view.setDrawColor( om.MColor( (0.1, 0.8, 0.8, 1.0) ) )
180 view.drawText(
"Footprint", om.MPoint( 0.0, 0.0, 0.0 ), omui.M3dView.kCenter )
185 def boundingBox(self):
188 thisNode = self.thisMObject()
189 plug = om.MPlug( thisNode, footPrint.size )
190 sizeVal = plug.asMDistance()
191 multiplier = sizeVal.asCentimeters()
193 corner1 = om.MPoint( -0.17, 0.0, -0.7 )
194 corner2 = om.MPoint( 0.17, 0.0, 0.3 )
196 corner1 *= multiplier
197 corner2 *= multiplier
199 return om.MBoundingBox( corner1, corner2 )
206 class footPrintData(om.MUserData):
208 om.MUserData.__init__(self,
False)
210 self.fColor = om.MColor()
211 self.fSoleLineList = om.MPointArray()
212 self.fSoleTriangleList = om.MPointArray()
213 self.fHeelLineList = om.MPointArray()
214 self.fHeelTriangleList = om.MPointArray()
216 class footPrintDrawOverride(omr.MPxDrawOverride):
219 return footPrintDrawOverride(obj)
226 def __init__(self, obj):
227 omr.MPxDrawOverride.__init__(self, obj,
None,
False)
232 self.mCustomBoxDraw =
True
233 self.mCurrentBoundingBox = om.MBoundingBox()
235 def supportedDrawAPIs(self):
237 return omr.MRenderer.kOpenGL | omr.MRenderer.kDirectX11 | omr.MRenderer.kOpenGLCoreProfile
239 def isBounded(self, objPath, cameraPath):
242 def boundingBox(self, objPath, cameraPath):
243 corner1 = om.MPoint( -0.17, 0.0, -0.7 )
244 corner2 = om.MPoint( 0.17, 0.0, 0.3 )
246 multiplier = self.getMultiplier(objPath)
247 corner1 *= multiplier
248 corner2 *= multiplier
250 self.mCurrentBoundingBox.clear()
251 self.mCurrentBoundingBox.expand( corner1 )
252 self.mCurrentBoundingBox.expand( corner2 )
254 return self.mCurrentBoundingBox
256 def disableInternalBoundingBoxDraw(self):
257 return self.mCustomBoxDraw
259 def prepareForDraw(self, objPath, cameraPath, frameContext, oldData):
262 if not isinstance(data, footPrintData):
263 data = footPrintData()
266 global soleCount, sole
267 global heelCount, heel
269 fMultiplier = self.getMultiplier(objPath)
271 data.fSoleLineList.clear()
272 for i
in range(soleCount):
273 data.fSoleLineList.append( om.MPoint(sole[i][0] * fMultiplier, sole[i][1] * fMultiplier, sole[i][2] * fMultiplier) )
275 data.fHeelLineList.clear()
276 for i
in range(heelCount):
277 data.fHeelLineList.append( om.MPoint(heel[i][0] * fMultiplier, heel[i][1] * fMultiplier, heel[i][2] * fMultiplier) )
279 data.fSoleTriangleList.clear()
280 for i
in range(1,soleCount-1):
281 data.fSoleTriangleList.append( om.MPoint(sole[0][0] * fMultiplier, sole[0][1] * fMultiplier, sole[0][2] * fMultiplier) )
282 data.fSoleTriangleList.append( om.MPoint(sole[i][0] * fMultiplier, sole[i][1] * fMultiplier, sole[i][2] * fMultiplier) )
283 data.fSoleTriangleList.append( om.MPoint(sole[i+1][0] * fMultiplier, sole[i+1][1] * fMultiplier, sole[i+1][2] * fMultiplier) )
285 data.fHeelTriangleList.clear()
286 for i
in range(1,heelCount-1):
287 data.fHeelTriangleList.append( om.MPoint(heel[0][0] * fMultiplier, heel[0][1] * fMultiplier, heel[0][2] * fMultiplier) )
288 data.fHeelTriangleList.append( om.MPoint(heel[i][0] * fMultiplier, heel[i][1] * fMultiplier, heel[i][2] * fMultiplier) )
289 data.fHeelTriangleList.append( om.MPoint(heel[i+1][0] * fMultiplier, heel[i+1][1] * fMultiplier, heel[i+1][2] * fMultiplier) )
291 data.fColor = omr.MGeometryUtilities.wireframeColor(objPath)
295 def hasUIDrawables(self):
298 def addUIDrawables(self, objPath, drawManager, frameContext, data):
300 if not isinstance(locatordata, footPrintData):
303 drawManager.beginDrawable()
306 drawManager.setColor( locatordata.fColor )
307 drawManager.setDepthPriority(5)
309 if (frameContext.getDisplayStyle() & omr.MFrameContext.kGouraudShaded):
310 drawManager.mesh(omr.MGeometry.kTriangles, locatordata.fSoleTriangleList)
311 drawManager.mesh(omr.MGeometry.kTriangles, locatordata.fHeelTriangleList)
313 drawManager.mesh(omr.MUIDrawManager.kClosedLine, locatordata.fSoleLineList)
314 drawManager.mesh(omr.MUIDrawManager.kClosedLine, locatordata.fHeelLineList)
317 pos = om.MPoint( 0.0, 0.0, 0.0 )
318 textColor = om.MColor( (0.1, 0.8, 0.8, 1.0) )
320 drawManager.setColor( textColor )
321 drawManager.setFontSize( omr.MUIDrawManager.kSmallFontSize )
322 drawManager.text(pos,
"Footprint", omr.MUIDrawManager.kCenter )
324 drawManager.endDrawable()
326 def getMultiplier(self, objPath):
328 footprintNode = objPath.node()
329 plug = om.MPlug(footprintNode, footPrint.size)
331 sizeVal = plug.asMDistance()
332 return sizeVal.asCentimeters()
336 def initializePlugin(obj):
337 plugin = om.MFnPlugin(obj,
"Autodesk",
"3.0",
"Any")
340 plugin.registerNode(
"footPrint", footPrint.id, footPrint.creator, footPrint.initialize, om.MPxNode.kLocatorNode, footPrint.drawDbClassification)
342 sys.stderr.write(
"Failed to register node\n")
346 omr.MDrawRegistry.registerDrawOverrideCreator(footPrint.drawDbClassification, footPrint.drawRegistrantId, footPrintDrawOverride.creator)
348 sys.stderr.write(
"Failed to register override\n")
351 def uninitializePlugin(obj):
352 plugin = om.MFnPlugin(obj)
355 plugin.deregisterNode(footPrint.id)
357 sys.stderr.write(
"Failed to deregister node\n")
361 omr.MDrawRegistry.deregisterDrawOverrideCreator(footPrint.drawDbClassification, footPrint.drawRegistrantId)
363 sys.stderr.write(
"Failed to deregister override\n")