27 from builtins
import range
29 import maya.api.OpenMaya
as om
30 import maya.api.OpenMayaUI
as omui
31 import maya.api.OpenMayaAnim
as oma
32 import maya.api.OpenMayaRender
as omr
33 import maya.cmds
as cmds
37 The presence of this function tells Maya that the plugin produces, and
38 expects to be passed, objects created using the Maya Python API 2.0.
42 def matrixAsArray(matrix):
45 array.append(matrix[i])
50 sole = [ [ 0.00, 0.0, -0.70 ],
62 [ -0.15, 0.0, -0.14 ],
63 [ -0.16, 0.0, -0.25 ],
64 [ -0.17, 0.0, -0.35 ],
65 [ -0.17, 0.0, -0.46 ],
66 [ -0.16, 0.0, -0.54 ],
67 [ -0.13, 0.0, -0.61 ],
68 [ -0.09, 0.0, -0.65 ],
69 [ -0.04, 0.0, -0.69 ],
70 [ -0.00, 0.0, -0.70 ] ]
71 heel = [ [ 0.00, 0.0, 0.06 ],
87 [ -0.00, 0.0, 0.06 ] ]
97 class footPrint(omui.MPxLocatorNode):
98 id = om.MTypeId( 0x00080067 )
99 drawDbClassification =
"drawdb/geometry/footPrint_py"
100 drawRegistrantId =
"FootprintNodePlugin_py"
110 unitFn = om.MFnUnitAttribute()
112 footPrint.size = unitFn.create(
"size",
"sz", om.MFnUnitAttribute.kDistance )
113 unitFn.default = om.MDistance(1.0)
115 om.MPxNode.addAttribute( footPrint.size )
118 omui.MPxLocatorNode.__init__(self)
120 def compute(self, plug, data):
123 def draw(self, view, path, style, status):
126 thisNode = self.thisMObject()
127 plug = om.MPlug( thisNode, footPrint.size )
128 sizeVal = plug.asMDistance()
129 multiplier = sizeVal.asCentimeters()
131 global sole, soleCount
132 global heel, heelCount
137 import maya.OpenMayaRender
as v1omr
138 glRenderer = v1omr.MHardwareRenderer.theRenderer()
139 glFT = glRenderer.glFunctionTable()
141 if ( style == omui.M3dView.kFlatShaded )
or ( style == omui.M3dView.kGouraudShaded ):
144 glFT.glPushAttrib( v1omr.MGL_CURRENT_BIT )
147 glFT.glDisable( v1omr.MGL_CULL_FACE )
149 if status == omui.M3dView.kActive:
150 view.setDrawColor( 13, omui.M3dView.kActiveColors )
152 view.setDrawColor( 13, omui.M3dView.kDormantColors )
154 glFT.glBegin( v1omr.MGL_TRIANGLE_FAN )
155 for i
in range(soleCount-1):
156 glFT.glVertex3f( sole[i][0] * multiplier, sole[i][1] * multiplier, sole[i][2] * multiplier )
159 glFT.glBegin( v1omr.MGL_TRIANGLE_FAN )
160 for i
in range(heelCount-1):
161 glFT.glVertex3f( heel[i][0] * multiplier, heel[i][1] * multiplier, heel[i][2] * multiplier )
168 glFT.glBegin( v1omr.MGL_LINES )
169 for i
in range(soleCount-1):
170 glFT.glVertex3f( sole[i][0] * multiplier, sole[i][1] * multiplier, sole[i][2] * multiplier )
171 glFT.glVertex3f( sole[i+1][0] * multiplier, sole[i+1][1] * multiplier, sole[i+1][2] * multiplier )
173 for i
in range(heelCount-1):
174 glFT.glVertex3f( heel[i][0] * multiplier, heel[i][1] * multiplier, heel[i][2] * multiplier )
175 glFT.glVertex3f( heel[i+1][0] * multiplier, heel[i+1][1] * multiplier, heel[i+1][2] * multiplier )
181 view.setDrawColor( om.MColor( (0.1, 0.8, 0.8, 1.0) ) )
182 view.drawText(
"Footprint", om.MPoint( 0.0, 0.0, 0.0 ), omui.M3dView.kCenter )
187 def boundingBox(self):
190 thisNode = self.thisMObject()
191 plug = om.MPlug( thisNode, footPrint.size )
192 sizeVal = plug.asMDistance()
193 multiplier = sizeVal.asCentimeters()
195 corner1 = om.MPoint( -0.17, 0.0, -0.7 )
196 corner2 = om.MPoint( 0.17, 0.0, 0.3 )
198 corner1 *= multiplier
199 corner2 *= multiplier
201 return om.MBoundingBox( corner1, corner2 )
208 class footPrintData(om.MUserData):
210 om.MUserData.__init__(self,
False)
212 self.fColor = om.MColor()
213 self.fLineList = om.MPointArray()
214 self.fTriangleList = 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.fLineList.clear()
273 for i
in range(soleCount-1):
274 data.fLineList.append( om.MPoint(sole[i][0] * fMultiplier, sole[i][1] * fMultiplier, sole[i][2] * fMultiplier) )
275 data.fLineList.append( om.MPoint(sole[i+1][0] * fMultiplier, sole[i+1][1] * fMultiplier, sole[i+1][2] * fMultiplier) )
277 for i
in range(heelCount-1):
278 data.fLineList.append( om.MPoint(heel[i][0] * fMultiplier, heel[i][1] * fMultiplier, heel[i][2] * fMultiplier) )
279 data.fLineList.append( om.MPoint(heel[i+1][0] * fMultiplier, heel[i+1][1] * fMultiplier, heel[i+1][2] * fMultiplier) )
281 data.fTriangleList.clear()
283 for i
in range(1,soleCount-1):
284 data.fTriangleList.append( om.MPoint(sole[0][0] * fMultiplier, sole[0][1] * fMultiplier, sole[0][2] * fMultiplier) )
285 data.fTriangleList.append( om.MPoint(sole[i][0] * fMultiplier, sole[i][1] * fMultiplier, sole[i][2] * fMultiplier) )
286 data.fTriangleList.append( om.MPoint(sole[i+1][0] * fMultiplier, sole[i+1][1] * fMultiplier, sole[i+1][2] * fMultiplier) )
288 for i
in range(1,heelCount-1):
289 data.fTriangleList.append( om.MPoint(heel[0][0] * fMultiplier, heel[0][1] * fMultiplier, heel[0][2] * fMultiplier) )
290 data.fTriangleList.append( om.MPoint(heel[i][0] * fMultiplier, heel[i][1] * fMultiplier, heel[i][2] * fMultiplier) )
291 data.fTriangleList.append( om.MPoint(heel[i+1][0] * fMultiplier, heel[i+1][1] * fMultiplier, heel[i+1][2] * fMultiplier) )
293 data.fColor = omr.MGeometryUtilities.wireframeColor(objPath)
297 def hasUIDrawables(self):
300 def addUIDrawables(self, objPath, drawManager, frameContext, data):
302 if not isinstance(locatordata, footPrintData):
305 drawManager.beginDrawable()
308 drawManager.setColor( locatordata.fColor )
309 drawManager.setDepthPriority(5)
311 if (frameContext.getDisplayStyle() & omr.MFrameContext.kGouraudShaded):
312 drawManager.mesh(omr.MGeometry.kTriangles, locatordata.fTriangleList)
314 drawManager.mesh(omr.MUIDrawManager.kLines, locatordata.fLineList)
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_py", footPrint.id, footPrint.creator, footPrint.initialize, om.MPxNode.kLocatorNode, footPrint.drawDbClassification)
342 sys.stderr.write(
"Failed to register node\n")
346 cmds.pluginDisplayFilter(
"footPrintFilter_py", register=
True, label=
"Footprint (Python)", classification=footPrint.drawDbClassification)
348 sys.stderr.write(
"Failed to register displayFilter\n")
352 omr.MDrawRegistry.registerDrawOverrideCreator(footPrint.drawDbClassification, footPrint.drawRegistrantId, footPrintDrawOverride.creator)
354 sys.stderr.write(
"Failed to register override\n")
357 def uninitializePlugin(obj):
358 plugin = om.MFnPlugin(obj)
361 plugin.deregisterNode(footPrint.id)
363 sys.stderr.write(
"Failed to deregister node\n")
367 cmds.pluginDisplayFilter(
"footPrintFilter_py", deregister=
True)
369 sys.stderr.write(
"Failed to deregister displayFilter\n")
373 omr.MDrawRegistry.deregisterDrawOverrideCreator(footPrint.drawDbClassification, footPrint.drawRegistrantId)
375 sys.stderr.write(
"Failed to deregister override\n")