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)
222 def draw(context, data):
225 def __init__(self, obj):
226 omr.MPxDrawOverride.__init__(self, obj, footPrintDrawOverride.draw)
231 self.mCustomBoxDraw =
True
232 self.mCurrentBoundingBox = om.MBoundingBox()
234 def supportedDrawAPIs(self):
236 return omr.MRenderer.kOpenGL | omr.MRenderer.kDirectX11 | omr.MRenderer.kOpenGLCoreProfile
238 def isBounded(self, objPath, cameraPath):
241 def boundingBox(self, objPath, cameraPath):
242 corner1 = om.MPoint( -0.17, 0.0, -0.7 )
243 corner2 = om.MPoint( 0.17, 0.0, 0.3 )
245 multiplier = self.getMultiplier(objPath)
246 corner1 *= multiplier
247 corner2 *= multiplier
249 self.mCurrentBoundingBox.clear()
250 self.mCurrentBoundingBox.expand( corner1 )
251 self.mCurrentBoundingBox.expand( corner2 )
253 return self.mCurrentBoundingBox
255 def disableInternalBoundingBoxDraw(self):
256 return self.mCustomBoxDraw
258 def prepareForDraw(self, objPath, cameraPath, frameContext, oldData):
261 if not isinstance(data, footPrintData):
262 data = footPrintData()
265 global soleCount, sole
266 global heelCount, heel
268 fMultiplier = self.getMultiplier(objPath)
270 data.fSoleLineList.clear()
271 for i
in range(soleCount):
272 data.fSoleLineList.append( om.MPoint(sole[i][0] * fMultiplier, sole[i][1] * fMultiplier, sole[i][2] * fMultiplier) )
274 data.fHeelLineList.clear()
275 for i
in range(heelCount):
276 data.fHeelLineList.append( om.MPoint(heel[i][0] * fMultiplier, heel[i][1] * fMultiplier, heel[i][2] * fMultiplier) )
278 data.fSoleTriangleList.clear()
279 for i
in range(1,soleCount-1):
280 data.fSoleTriangleList.append( om.MPoint(sole[0][0] * fMultiplier, sole[0][1] * fMultiplier, sole[0][2] * fMultiplier) )
281 data.fSoleTriangleList.append( om.MPoint(sole[i][0] * fMultiplier, sole[i][1] * fMultiplier, sole[i][2] * fMultiplier) )
282 data.fSoleTriangleList.append( om.MPoint(sole[i+1][0] * fMultiplier, sole[i+1][1] * fMultiplier, sole[i+1][2] * fMultiplier) )
284 data.fHeelTriangleList.clear()
285 for i
in range(1,heelCount-1):
286 data.fHeelTriangleList.append( om.MPoint(heel[0][0] * fMultiplier, heel[0][1] * fMultiplier, heel[0][2] * fMultiplier) )
287 data.fHeelTriangleList.append( om.MPoint(heel[i][0] * fMultiplier, heel[i][1] * fMultiplier, heel[i][2] * fMultiplier) )
288 data.fHeelTriangleList.append( om.MPoint(heel[i+1][0] * fMultiplier, heel[i+1][1] * fMultiplier, heel[i+1][2] * fMultiplier) )
290 data.fColor = omr.MGeometryUtilities.wireframeColor(objPath)
294 def hasUIDrawables(self):
297 def addUIDrawables(self, objPath, drawManager, frameContext, data):
299 if not isinstance(locatordata, footPrintData):
302 drawManager.beginDrawable()
305 drawManager.setColor( locatordata.fColor )
306 drawManager.setDepthPriority(5)
308 if (frameContext.getDisplayStyle() & omr.MFrameContext.kGouraudShaded):
309 drawManager.mesh(omr.MGeometry.kTriangles, locatordata.fSoleTriangleList)
310 drawManager.mesh(omr.MGeometry.kTriangles, locatordata.fHeelTriangleList)
312 drawManager.mesh(omr.MUIDrawManager.kClosedLine, locatordata.fSoleLineList)
313 drawManager.mesh(omr.MUIDrawManager.kClosedLine, locatordata.fHeelLineList)
316 pos = om.MPoint( 0.0, 0.0, 0.0 )
317 textColor = om.MColor( (0.1, 0.8, 0.8, 1.0) )
319 drawManager.setColor( textColor )
320 drawManager.setFontSize( omr.MUIDrawManager.kSmallFontSize )
321 drawManager.text(pos,
"Footprint", omr.MUIDrawManager.kCenter )
323 drawManager.endDrawable()
325 def getMultiplier(self, objPath):
327 footprintNode = objPath.node()
328 plug = om.MPlug(footprintNode, footPrint.size)
330 sizeVal = plug.asMDistance()
331 return sizeVal.asCentimeters()
335 def initializePlugin(obj):
336 plugin = om.MFnPlugin(obj,
"Autodesk",
"3.0",
"Any")
339 plugin.registerNode(
"footPrint", footPrint.id, footPrint.creator, footPrint.initialize, om.MPxNode.kLocatorNode, footPrint.drawDbClassification)
341 sys.stderr.write(
"Failed to register node\n")
345 omr.MDrawRegistry.registerDrawOverrideCreator(footPrint.drawDbClassification, footPrint.drawRegistrantId, footPrintDrawOverride.creator)
347 sys.stderr.write(
"Failed to register override\n")
350 def uninitializePlugin(obj):
351 plugin = om.MFnPlugin(obj)
354 plugin.deregisterNode(footPrint.id)
356 sys.stderr.write(
"Failed to deregister node\n")
360 omr.MDrawRegistry.deregisterDrawOverrideCreator(footPrint.drawDbClassification, footPrint.drawRegistrantId)
362 sys.stderr.write(
"Failed to deregister override\n")