43 import maya.api.OpenMaya
as om
44 import maya.api.OpenMayaUI
as omui
45 import maya.api.OpenMayaAnim
as oma
46 import maya.api.OpenMayaRender
as omr
47 import maya.mel
as mel
51 The presence of this function tells Maya that the plugin produces, and
52 expects to be passed, objects created using the Maya Python API 2.0.
56 def matrixAsArray(matrix):
59 array.append(matrix[i])
64 sole = [ [ 0.00, 0.0, -0.70 ],
76 [ -0.15, 0.0, -0.14 ],
77 [ -0.16, 0.0, -0.25 ],
78 [ -0.17, 0.0, -0.35 ],
79 [ -0.17, 0.0, -0.46 ],
80 [ -0.16, 0.0, -0.54 ],
81 [ -0.13, 0.0, -0.61 ],
82 [ -0.09, 0.0, -0.65 ],
83 [ -0.04, 0.0, -0.69 ],
84 [ -0.00, 0.0, -0.70 ] ]
85 heel = [ [ 0.00, 0.0, 0.06 ],
100 [ -0.13, 0.0, 0.06 ],
101 [ -0.00, 0.0, 0.06 ] ]
111 class footPrint(omui.MPxLocatorNode):
112 id = om.MTypeId( 0x00080033 )
113 drawDbClassification =
"drawdb/geometry/footPrint_GeometryOverride"
114 drawRegistrantId =
"FootprintNode_GeometryOverridePlugin"
124 unitFn = om.MFnUnitAttribute()
126 footPrint.size = unitFn.create(
"size",
"sz", om.MFnUnitAttribute.kDistance )
127 unitFn.default = om.MDistance(1.0)
129 om.MPxNode.addAttribute( footPrint.size )
132 omui.MPxLocatorNode.__init__(self)
134 def compute(self, plug, data):
137 def draw(self, view, path, style, status):
140 thisNode = self.thisMObject()
141 plug = om.MPlug( thisNode, footPrint.size )
142 sizeVal = plug.asMDistance()
143 multiplier = sizeVal.asCentimeters()
145 global sole, soleCount
146 global heel, heelCount
151 import maya.OpenMayaRender
as v1omr
152 glRenderer = v1omr.MHardwareRenderer.theRenderer()
153 glFT = glRenderer.glFunctionTable()
155 if ( style == omui.M3dView.kFlatShaded )
or ( style == omui.M3dView.kGouraudShaded ):
158 glFT.glPushAttrib( v1omr.MGL_CURRENT_BIT )
161 glFT.glDisable( v1omr.MGL_CULL_FACE )
163 if status == omui.M3dView.kActive:
164 view.setDrawColor( 13, omui.M3dView.kActiveColors )
166 view.setDrawColor( 13, omui.M3dView.kDormantColors )
168 glFT.glBegin( v1omr.MGL_TRIANGLE_FAN )
169 for i
in xrange(soleCount-1):
170 glFT.glVertex3f( sole[i][0] * multiplier, sole[i][1] * multiplier, sole[i][2] * multiplier )
173 glFT.glBegin( v1omr.MGL_TRIANGLE_FAN )
174 for i
in xrange(heelCount-1):
175 glFT.glVertex3f( heel[i][0] * multiplier, heel[i][1] * multiplier, heel[i][2] * multiplier )
182 glFT.glBegin( v1omr.MGL_LINES )
183 for i
in xrange(soleCount-1):
184 glFT.glVertex3f( sole[i][0] * multiplier, sole[i][1] * multiplier, sole[i][2] * multiplier )
185 glFT.glVertex3f( sole[i+1][0] * multiplier, sole[i+1][1] * multiplier, sole[i+1][2] * multiplier )
187 for i
in xrange(heelCount-1):
188 glFT.glVertex3f( heel[i][0] * multiplier, heel[i][1] * multiplier, heel[i][2] * multiplier )
189 glFT.glVertex3f( heel[i+1][0] * multiplier, heel[i+1][1] * multiplier, heel[i+1][2] * multiplier )
197 def boundingBox(self):
200 thisNode = self.thisMObject()
201 plug = om.MPlug( thisNode, footPrint.size )
202 sizeVal = plug.asMDistance()
203 multiplier = sizeVal.asCentimeters()
205 corner1 = om.MPoint( -0.17, 0.0, -0.7 )
206 corner2 = om.MPoint( 0.17, 0.0, 0.3 )
208 corner1 *= multiplier
209 corner2 *= multiplier
211 return om.MBoundingBox( corner1, corner2 )
213 def getShapeSelectionMask(self):
214 selType = om.MSelectionMask(
"footPrintSelection")
215 return om.MSelectionMask( selType )
223 class footPrintGeometryOverride(omr.MPxGeometryOverride):
224 colorParameterName_ =
"solidColor"
225 wireframeItemName_ =
"footPrintLocatorWires"
226 shadedItemName_ =
"footPrintLocatorTriangles"
230 return footPrintGeometryOverride(obj)
232 def __init__(self, obj):
233 omr.MPxGeometryOverride.__init__(self, obj)
234 self. mSolidUIShader =
None
235 self.mLocatorNode = obj
236 self.mMultiplier = 0.0
237 self.mMultiplierChanged =
True
239 shaderMgr = omr.MRenderer.getShaderManager()
241 self.mSolidUIShader = shaderMgr.getStockShader(omr.MShaderManager.k3dSolidShader)
244 if self.mSolidUIShader:
245 shaderMgr = omr.MRenderer.getShaderManager()
247 shaderMgr.releaseShader(self.mSolidUIShader)
249 def supportedDrawAPIs(self):
251 return omr.MRenderer.kOpenGL | omr.MRenderer.kOpenGLCoreProfile | omr.MRenderer.kDirectX11
253 def hasUIDrawables(self):
257 plug = om.MPlug(self.mLocatorNode, footPrint.size)
260 sizeVal = plug.asMDistance()
261 newScale = sizeVal.asCentimeters()
263 if newScale != self.mMultiplier:
264 self.mMultiplier = newScale
265 self.mMultiplierChanged =
True
270 def isIndexingDirty(self, item):
273 def isStreamDirty(self, desc):
274 return self.mMultiplierChanged
276 def updateRenderItems(self, dagPath, renderList ):
277 if not self.mSolidUIShader:
280 self.mSolidUIShader.setParameter(footPrintGeometryOverride.colorParameterName_, omr.MGeometryUtilities.wireframeColor(dagPath))
283 (footPrintGeometryOverride.wireframeItemName_, omr.MGeometry.kLines, omr.MGeometry.kWireframe),
284 (footPrintGeometryOverride.shadedItemName_, omr.MGeometry.kTriangles, omr.MGeometry.kShaded)
287 for itemName, geometryType, drawMode
in fullItemList:
289 index = renderList.indexOf(itemName)
291 renderItem = omr.MRenderItem.create(
293 omr.MRenderItem.DecorationItem,
295 renderItem.setDrawMode(drawMode)
296 renderItem.setDepthPriority(5)
298 renderList.append(renderItem)
300 renderItem = renderList[index]
303 renderItem.setShader(self.mSolidUIShader)
304 renderItem.enable(
True)
306 def populateGeometry(self, requirements, renderItems, data):
307 vertexBufferDescriptorList = requirements.vertexRequirements()
309 for vertexBufferDescriptor
in vertexBufferDescriptorList:
310 if vertexBufferDescriptor.semantic == omr.MGeometry.kPosition:
311 verticesCount = soleCount+heelCount
312 verticesBuffer = data.createVertexBuffer(vertexBufferDescriptor)
313 verticesPositionDataAddress = verticesBuffer.acquire(verticesCount,
True)
314 verticesPositionData = ((ctypes.c_float * 3)*verticesCount).from_address(verticesPositionDataAddress)
316 verticesPointerOffset = 0
320 for vtxList
in (heel, sole):
322 verticesPositionData[verticesPointerOffset][0] = vtx[0] * self.mMultiplier
323 verticesPositionData[verticesPointerOffset][1] = vtx[1] * self.mMultiplier
324 verticesPositionData[verticesPointerOffset][2] = vtx[2] * self.mMultiplier
325 verticesPointerOffset += 1
327 verticesBuffer.commit(verticesPositionDataAddress)
331 for item
in renderItems:
335 indexBuffer = data.createIndexBuffer(omr.MGeometry.kUnsignedInt32)
337 if item.name() == footPrintGeometryOverride.wireframeItemName_:
341 numPrimitive = heelCount + soleCount - 2
342 numIndex = numPrimitive * 2
344 indicesAddress = indexBuffer.acquire(numIndex,
True)
345 indices = (ctypes.c_uint * numIndex).from_address(indicesAddress)
351 if i < (heelCount - 1) * 2:
353 primitiveIndex = i / 2
355 startIndex = heelCount
356 primitiveIndex = i / 2 - heelCount + 1
358 indices[i] = startIndex + primitiveIndex
359 indices[i+1] = startIndex + primitiveIndex + 1
363 indexBuffer.commit(indicesAddress)
365 elif item.name() == footPrintGeometryOverride.shadedItemName_:
368 numPrimitive = heelCount + soleCount - 4
369 numIndex = numPrimitive * 3
371 indicesAddress = indexBuffer.acquire(numIndex,
True)
372 indices = (ctypes.c_uint * numIndex).from_address(indicesAddress)
378 if i < (heelCount - 2) * 3:
380 primitiveIndex = i / 3
382 startIndex = heelCount
383 primitiveIndex = i / 3 - heelCount + 2
385 indices[i] = startIndex
386 indices[i+1] = startIndex + primitiveIndex + 1
387 indices[i+2] = startIndex + primitiveIndex + 2
391 indexBuffer.commit(indicesAddress)
393 item.associateWithIndexBuffer(indexBuffer)
395 mMultiplierChanged =
False
397 def initializePlugin(obj):
398 plugin = om.MFnPlugin(obj,
"Autodesk",
"3.0",
"Any")
401 plugin.registerNode(
"footPrint_GeometryOverride", footPrint.id, footPrint.creator, footPrint.initialize, om.MPxNode.kLocatorNode, footPrint.drawDbClassification)
403 sys.stderr.write(
"Failed to register node\n")
407 omr.MDrawRegistry.registerGeometryOverrideCreator(footPrint.drawDbClassification, footPrint.drawRegistrantId, footPrintGeometryOverride.creator)
409 sys.stderr.write(
"Failed to register override\n")
413 om.MSelectionMask.registerSelectionType(
"footPrintSelection")
414 mel.eval(
"selectType -byName \"footPrintSelection\" 1")
416 sys.stderr.write(
"Failed to register selection mask\n")
419 def uninitializePlugin(obj):
420 plugin = om.MFnPlugin(obj)
423 plugin.deregisterNode(footPrint.id)
425 sys.stderr.write(
"Failed to deregister node\n")
429 omr.MDrawRegistry.deregisterGeometryOverrideCreator(footPrint.drawDbClassification, footPrint.drawRegistrantId)
431 sys.stderr.write(
"Failed to deregister override\n")
435 om.MSelectionMask.deregisterSelectionType(
"footPrintSelection")
437 sys.stderr.write(
"Failed to deregister selection mask\n")