41 from builtins
import range
44 import maya.api.OpenMaya
as om
45 import maya.api.OpenMayaUI
as omui
46 import maya.api.OpenMayaAnim
as oma
47 import maya.api.OpenMayaRender
as omr
48 import maya.mel
as mel
52 The presence of this function tells Maya that the plugin produces, and
53 expects to be passed, objects created using the Maya Python API 2.0.
57 def matrixAsArray(matrix):
60 array.append(matrix[i])
65 sole = [ [ 0.00, 0.0, -0.70 ],
77 [ -0.15, 0.0, -0.14 ],
78 [ -0.16, 0.0, -0.25 ],
79 [ -0.17, 0.0, -0.35 ],
80 [ -0.17, 0.0, -0.46 ],
81 [ -0.16, 0.0, -0.54 ],
82 [ -0.13, 0.0, -0.61 ],
83 [ -0.09, 0.0, -0.65 ],
84 [ -0.04, 0.0, -0.69 ],
85 [ -0.00, 0.0, -0.70 ] ]
86 heel = [ [ 0.00, 0.0, 0.06 ],
100 [ -0.14, 0.0, 0.15 ],
101 [ -0.13, 0.0, 0.06 ],
102 [ -0.00, 0.0, 0.06 ] ]
110 the3dSolidShaders = {}
112 def get3dSolidShader(color):
115 if key
in the3dSolidShaders:
116 return the3dSolidShaders[key]
120 shaderMgr = omr.MRenderer.getShaderManager()
122 shader = shaderMgr.getStockShader(omr.MShaderManager.k3dSolidShader)
125 shader.setParameter(footPrintGeometryOverride.colorParameterName_, color)
126 the3dSolidShaders[key] = shader
130 def releaseShaders():
131 shaderMgr = omr.MRenderer.getShaderManager()
133 for key, shader
in list(the3dSolidShaders.items()):
134 shaderMgr.releaseShader(shader)
136 the3dSolidShaders.clear()
144 class footPrint(omui.MPxLocatorNode):
145 id = om.MTypeId( 0x00080066 )
146 drawDbClassification =
"drawdb/geometry/footPrint_GeometryOverride_py"
147 drawRegistrantId =
"FootprintNode_GeometryOverridePlugin_py"
157 unitFn = om.MFnUnitAttribute()
159 footPrint.size = unitFn.create(
"size",
"sz", om.MFnUnitAttribute.kDistance )
160 unitFn.default = om.MDistance(1.0)
162 om.MPxNode.addAttribute( footPrint.size )
165 omui.MPxLocatorNode.__init__(self)
167 def compute(self, plug, data):
170 def draw(self, view, path, style, status):
173 thisNode = self.thisMObject()
174 plug = om.MPlug( thisNode, footPrint.size )
175 sizeVal = plug.asMDistance()
176 multiplier = sizeVal.asCentimeters()
178 global sole, soleCount
179 global heel, heelCount
184 import maya.OpenMayaRender
as v1omr
185 glRenderer = v1omr.MHardwareRenderer.theRenderer()
186 glFT = glRenderer.glFunctionTable()
188 if ( style == omui.M3dView.kFlatShaded )
or ( style == omui.M3dView.kGouraudShaded ):
191 glFT.glPushAttrib( v1omr.MGL_CURRENT_BIT )
194 glFT.glDisable( v1omr.MGL_CULL_FACE )
196 if status == omui.M3dView.kActive:
197 view.setDrawColor( 13, omui.M3dView.kActiveColors )
199 view.setDrawColor( 13, omui.M3dView.kDormantColors )
201 glFT.glBegin( v1omr.MGL_TRIANGLE_FAN )
202 for i
in range(soleCount-1):
203 glFT.glVertex3f( sole[i][0] * multiplier, sole[i][1] * multiplier, sole[i][2] * multiplier )
206 glFT.glBegin( v1omr.MGL_TRIANGLE_FAN )
207 for i
in range(heelCount-1):
208 glFT.glVertex3f( heel[i][0] * multiplier, heel[i][1] * multiplier, heel[i][2] * multiplier )
215 glFT.glBegin( v1omr.MGL_LINES )
216 for i
in range(soleCount-1):
217 glFT.glVertex3f( sole[i][0] * multiplier, sole[i][1] * multiplier, sole[i][2] * multiplier )
218 glFT.glVertex3f( sole[i+1][0] * multiplier, sole[i+1][1] * multiplier, sole[i+1][2] * multiplier )
220 for i
in range(heelCount-1):
221 glFT.glVertex3f( heel[i][0] * multiplier, heel[i][1] * multiplier, heel[i][2] * multiplier )
222 glFT.glVertex3f( heel[i+1][0] * multiplier, heel[i+1][1] * multiplier, heel[i+1][2] * multiplier )
230 def boundingBox(self):
233 thisNode = self.thisMObject()
234 plug = om.MPlug( thisNode, footPrint.size )
235 sizeVal = plug.asMDistance()
236 multiplier = sizeVal.asCentimeters()
238 corner1 = om.MPoint( -0.17, 0.0, -0.7 )
239 corner2 = om.MPoint( 0.17, 0.0, 0.3 )
241 corner1 *= multiplier
242 corner2 *= multiplier
244 return om.MBoundingBox( corner1, corner2 )
246 def getShapeSelectionMask(self):
247 selType = om.MSelectionMask(
"footPrintSelection_py")
248 return om.MSelectionMask( selType )
256 class footPrintGeometryOverride(omr.MPxGeometryOverride):
257 colorParameterName_ =
"solidColor"
258 wireframeItemName_ =
"footPrintLocatorWires"
259 shadedItemName_ =
"footPrintLocatorTriangles"
263 return footPrintGeometryOverride(obj)
265 def __init__(self, obj):
266 omr.MPxGeometryOverride.__init__(self, obj)
267 self.mLocatorNode = obj
268 self.mMultiplier = 0.0
269 self.mMultiplierChanged =
True
274 def supportedDrawAPIs(self):
276 return omr.MRenderer.kOpenGL | omr.MRenderer.kOpenGLCoreProfile | omr.MRenderer.kDirectX11
278 def hasUIDrawables(self):
282 plug = om.MPlug(self.mLocatorNode, footPrint.size)
285 sizeVal = plug.asMDistance()
286 newScale = sizeVal.asCentimeters()
288 if newScale != self.mMultiplier:
289 self.mMultiplier = newScale
290 self.mMultiplierChanged =
True
295 def isIndexingDirty(self, item):
298 def isStreamDirty(self, desc):
299 return self.mMultiplierChanged
301 def updateRenderItems(self, dagPath, renderList ):
302 shader = get3dSolidShader(omr.MGeometryUtilities.wireframeColor(dagPath))
307 (footPrintGeometryOverride.wireframeItemName_, omr.MGeometry.kLines, omr.MGeometry.kWireframe),
308 (footPrintGeometryOverride.shadedItemName_, omr.MGeometry.kTriangles, omr.MGeometry.kShaded)
311 for itemName, geometryType, drawMode
in fullItemList:
313 index = renderList.indexOf(itemName)
315 renderItem = omr.MRenderItem.create(
317 omr.MRenderItem.DecorationItem,
319 renderItem.setDrawMode(drawMode)
320 renderItem.setDepthPriority(5)
322 renderList.append(renderItem)
324 renderItem = renderList[index]
327 renderItem.setShader(shader)
328 renderItem.enable(
True)
330 def populateGeometry(self, requirements, renderItems, data):
331 vertexBufferDescriptorList = requirements.vertexRequirements()
333 for vertexBufferDescriptor
in vertexBufferDescriptorList:
334 if vertexBufferDescriptor.semantic == omr.MGeometry.kPosition:
335 verticesCount = soleCount+heelCount
336 verticesBuffer = data.createVertexBuffer(vertexBufferDescriptor)
337 verticesPositionDataAddress = verticesBuffer.acquire(verticesCount,
True)
338 verticesPositionData = ((ctypes.c_float * 3)*verticesCount).from_address(verticesPositionDataAddress)
340 verticesPointerOffset = 0
344 for vtxList
in (heel, sole):
346 verticesPositionData[verticesPointerOffset][0] = vtx[0] * self.mMultiplier
347 verticesPositionData[verticesPointerOffset][1] = vtx[1] * self.mMultiplier
348 verticesPositionData[verticesPointerOffset][2] = vtx[2] * self.mMultiplier
349 verticesPointerOffset += 1
351 verticesBuffer.commit(verticesPositionDataAddress)
355 for item
in renderItems:
359 indexBuffer = data.createIndexBuffer(omr.MGeometry.kUnsignedInt32)
361 if item.name() == footPrintGeometryOverride.wireframeItemName_:
365 numPrimitive = heelCount + soleCount - 2
366 numIndex = numPrimitive * 2
368 indicesAddress = indexBuffer.acquire(numIndex,
True)
369 indices = (ctypes.c_uint * numIndex).from_address(indicesAddress)
375 if i < (heelCount - 1) * 2:
377 primitiveIndex = i // 2
379 startIndex = heelCount
380 primitiveIndex = i // 2 - heelCount + 1
382 indices[i] = startIndex + primitiveIndex
383 indices[i+1] = startIndex + primitiveIndex + 1
387 indexBuffer.commit(indicesAddress)
389 elif item.name() == footPrintGeometryOverride.shadedItemName_:
392 numPrimitive = heelCount + soleCount - 4
393 numIndex = numPrimitive * 3
395 indicesAddress = indexBuffer.acquire(numIndex,
True)
396 indices = (ctypes.c_uint * numIndex).from_address(indicesAddress)
402 if i < (heelCount - 2) * 3:
404 primitiveIndex = i // 3
406 startIndex = heelCount
407 primitiveIndex = i // 3 - heelCount + 2
409 indices[i] = startIndex
410 indices[i+1] = startIndex + primitiveIndex + 1
411 indices[i+2] = startIndex + primitiveIndex + 2
415 indexBuffer.commit(indicesAddress)
417 item.associateWithIndexBuffer(indexBuffer)
419 mMultiplierChanged =
False
421 def initializePlugin(obj):
422 plugin = om.MFnPlugin(obj,
"Autodesk",
"3.0",
"Any")
425 plugin.registerNode(
"footPrint_GeometryOverride_py", footPrint.id, footPrint.creator, footPrint.initialize, om.MPxNode.kLocatorNode, footPrint.drawDbClassification)
427 sys.stderr.write(
"Failed to register node\n")
431 omr.MDrawRegistry.registerGeometryOverrideCreator(footPrint.drawDbClassification, footPrint.drawRegistrantId, footPrintGeometryOverride.creator)
433 sys.stderr.write(
"Failed to register override\n")
437 om.MSelectionMask.registerSelectionType(
"footPrintSelection_py")
438 mel.eval(
"selectType -byName \"footPrintSelection_py\" 1")
440 sys.stderr.write(
"Failed to register selection mask\n")
443 def uninitializePlugin(obj):
444 plugin = om.MFnPlugin(obj)
447 plugin.deregisterNode(footPrint.id)
449 sys.stderr.write(
"Failed to deregister node\n")
453 omr.MDrawRegistry.deregisterGeometryOverrideCreator(footPrint.drawDbClassification, footPrint.drawRegistrantId)
455 sys.stderr.write(
"Failed to deregister override\n")
459 om.MSelectionMask.deregisterSelectionType(
"footPrintSelection_py")
461 sys.stderr.write(
"Failed to deregister selection mask\n")
467 sys.stderr.write(
"Failed to release shaders\n")