32 from builtins
import range
35 import maya.api.OpenMaya
as om
36 import maya.api.OpenMayaUI
as omui
37 import maya.api.OpenMayaAnim
as oma
38 import maya.api.OpenMayaRender
as omr
39 import maya.mel
as mel
43 The presence of this function tells Maya that the plugin produces, and
44 expects to be passed, objects created using the Maya Python API 2.0.
48 def matrixAsArray(matrix):
51 array.append(matrix[i])
56 sole = [ [ 0.00, 0.0, -0.70 ],
68 [ -0.15, 0.0, -0.14 ],
69 [ -0.16, 0.0, -0.25 ],
70 [ -0.17, 0.0, -0.35 ],
71 [ -0.17, 0.0, -0.46 ],
72 [ -0.16, 0.0, -0.54 ],
73 [ -0.13, 0.0, -0.61 ],
74 [ -0.09, 0.0, -0.65 ],
75 [ -0.04, 0.0, -0.69 ],
76 [ -0.00, 0.0, -0.70 ] ]
77 heel = [ [ 0.00, 0.0, 0.06 ],
93 [ -0.00, 0.0, 0.06 ] ]
101 the3dSolidShaders = {}
103 def get3dSolidShader(color):
106 if key
in the3dSolidShaders:
107 return the3dSolidShaders[key]
111 shaderMgr = omr.MRenderer.getShaderManager()
113 shader = shaderMgr.getStockShader(omr.MShaderManager.k3dSolidShader)
116 shader.setParameter(footPrintGeometryOverrideAnimatedMaterial.colorParameterName_, color)
117 the3dSolidShaders[key] = shader
121 def releaseShaders():
122 shaderMgr = omr.MRenderer.getShaderManager()
124 for key, shader
in list(the3dSolidShaders.items()):
125 shaderMgr.releaseShader(shader)
127 the3dSolidShaders.clear()
135 class footPrint(omui.MPxLocatorNode):
136 id = om.MTypeId( 0x0008006A )
137 drawDbClassification =
"drawdb/geometry/footPrint_GeometryOverride_AnimatedMaterial_py"
138 drawRegistrantId =
"footPrintNode_GeometryOverride_AnimatedMaterialPlugin_py"
148 unitFn = om.MFnUnitAttribute()
150 footPrint.size = unitFn.create(
"size",
"sz", om.MFnUnitAttribute.kDistance )
151 unitFn.default = om.MDistance(1.0)
153 om.MPxNode.addAttribute( footPrint.size )
156 omui.MPxLocatorNode.__init__(self)
158 def compute(self, plug, data):
161 def draw(self, view, path, style, status):
164 thisNode = self.thisMObject()
165 plug = om.MPlug( thisNode, footPrint.size )
166 sizeVal = plug.asMDistance()
167 multiplier = sizeVal.asCentimeters()
169 global sole, soleCount
170 global heel, heelCount
175 import maya.OpenMayaRender
as v1omr
176 glRenderer = v1omr.MHardwareRenderer.theRenderer()
177 glFT = glRenderer.glFunctionTable()
179 if ( style == omui.M3dView.kFlatShaded )
or ( style == omui.M3dView.kGouraudShaded ):
182 glFT.glPushAttrib( v1omr.MGL_CURRENT_BIT )
185 glFT.glDisable( v1omr.MGL_CULL_FACE )
187 if status == omui.M3dView.kActive:
188 view.setDrawColor( 13, omui.M3dView.kActiveColors )
190 view.setDrawColor( 13, omui.M3dView.kDormantColors )
192 glFT.glBegin( v1omr.MGL_TRIANGLE_FAN )
193 for i
in range(soleCount-1):
194 glFT.glVertex3f( sole[i][0] * multiplier, sole[i][1] * multiplier, sole[i][2] * multiplier )
197 glFT.glBegin( v1omr.MGL_TRIANGLE_FAN )
198 for i
in range(heelCount-1):
199 glFT.glVertex3f( heel[i][0] * multiplier, heel[i][1] * multiplier, heel[i][2] * multiplier )
206 glFT.glBegin( v1omr.MGL_LINES )
207 for i
in range(soleCount-1):
208 glFT.glVertex3f( sole[i][0] * multiplier, sole[i][1] * multiplier, sole[i][2] * multiplier )
209 glFT.glVertex3f( sole[i+1][0] * multiplier, sole[i+1][1] * multiplier, sole[i+1][2] * multiplier )
211 for i
in range(heelCount-1):
212 glFT.glVertex3f( heel[i][0] * multiplier, heel[i][1] * multiplier, heel[i][2] * multiplier )
213 glFT.glVertex3f( heel[i+1][0] * multiplier, heel[i+1][1] * multiplier, heel[i+1][2] * multiplier )
221 def boundingBox(self):
224 thisNode = self.thisMObject()
225 plug = om.MPlug( thisNode, footPrint.size )
226 sizeVal = plug.asMDistance()
227 multiplier = sizeVal.asCentimeters()
229 corner1 = om.MPoint( -0.17, 0.0, -0.7 )
230 corner2 = om.MPoint( 0.17, 0.0, 0.3 )
232 corner1 *= multiplier
233 corner2 *= multiplier
235 return om.MBoundingBox( corner1, corner2 )
237 def getShapeSelectionMask(self):
238 selType = om.MSelectionMask(
"footPrintSelection")
239 return om.MSelectionMask( selType )
247 class footPrintGeometryOverrideAnimatedMaterial(omr.MPxGeometryOverride):
248 colorParameterName_ =
"solidColor"
249 wireframeItemName_ =
"footPrintLocatorWires"
250 shadedItemName_ =
"footPrintLocatorTriangles"
254 return footPrintGeometryOverrideAnimatedMaterial(obj)
256 def __init__(self, obj):
257 omr.MPxGeometryOverride.__init__(self, obj)
258 self.mLocatorNode = obj
259 self.mMultiplier = 0.0
260 self.mMultiplierChanged =
True
265 def supportedDrawAPIs(self):
267 return omr.MRenderer.kOpenGL | omr.MRenderer.kOpenGLCoreProfile | omr.MRenderer.kDirectX11
269 def hasUIDrawables(self):
273 plug = om.MPlug(self.mLocatorNode, footPrint.size)
276 sizeVal = plug.asMDistance()
277 newScale = sizeVal.asCentimeters()
279 if newScale != self.mMultiplier:
280 self.mMultiplier = newScale
281 self.mMultiplierChanged =
True
286 def isIndexingDirty(self, item):
289 def isStreamDirty(self, desc):
290 return self.mMultiplierChanged
292 def updateRenderItems(self, dagPath, renderList ):
293 shader = get3dSolidShader(omr.MGeometryUtilities.wireframeColor(dagPath))
298 (footPrintGeometryOverrideAnimatedMaterial.wireframeItemName_, omr.MGeometry.kLines, omr.MGeometry.kWireframe),
299 (footPrintGeometryOverrideAnimatedMaterial.shadedItemName_, omr.MGeometry.kTriangles, omr.MGeometry.kShaded)
302 for itemName, geometryType, drawMode
in fullItemList:
304 index = renderList.indexOf(itemName)
306 renderItem = omr.MRenderItem.create(
308 omr.MRenderItem.DecorationItem,
310 renderItem.setDrawMode(drawMode)
311 renderItem.setDepthPriority(5)
313 renderList.append(renderItem)
315 renderItem = renderList[index]
318 renderItem.setShader(shader)
319 renderItem.enable(
True)
321 def populateGeometry(self, requirements, renderItems, data):
322 vertexBufferDescriptorList = requirements.vertexRequirements()
324 for vertexBufferDescriptor
in vertexBufferDescriptorList:
325 if vertexBufferDescriptor.semantic == omr.MGeometry.kPosition:
326 verticesCount = soleCount+heelCount
327 verticesBuffer = data.createVertexBuffer(vertexBufferDescriptor)
328 verticesPositionDataAddress = verticesBuffer.acquire(verticesCount,
True)
329 verticesPositionData = ((ctypes.c_float * 3)*verticesCount).from_address(verticesPositionDataAddress)
331 verticesPointerOffset = 0
335 for vtxList
in (heel, sole):
337 verticesPositionData[verticesPointerOffset][0] = vtx[0] * self.mMultiplier
338 verticesPositionData[verticesPointerOffset][1] = vtx[1] * self.mMultiplier
339 verticesPositionData[verticesPointerOffset][2] = vtx[2] * self.mMultiplier
340 verticesPointerOffset += 1
342 verticesBuffer.commit(verticesPositionDataAddress)
346 for item
in renderItems:
350 indexBuffer = data.createIndexBuffer(omr.MGeometry.kUnsignedInt32)
352 if item.name() == footPrintGeometryOverrideAnimatedMaterial.wireframeItemName_:
356 numPrimitive = heelCount + soleCount - 2
357 numIndex = numPrimitive * 2
359 indicesAddress = indexBuffer.acquire(numIndex,
True)
360 indices = (ctypes.c_uint * numIndex).from_address(indicesAddress)
366 if i < (heelCount - 1) * 2:
368 primitiveIndex = i // 2
370 startIndex = heelCount
371 primitiveIndex = i // 2 - heelCount + 1
373 indices[i] = startIndex + primitiveIndex
374 indices[i+1] = startIndex + primitiveIndex + 1
378 indexBuffer.commit(indicesAddress)
380 elif item.name() == footPrintGeometryOverrideAnimatedMaterial.shadedItemName_:
383 numPrimitive = heelCount + soleCount - 4
384 numIndex = numPrimitive * 3
386 indicesAddress = indexBuffer.acquire(numIndex,
True)
387 indices = (ctypes.c_uint * numIndex).from_address(indicesAddress)
393 if i < (heelCount - 2) * 3:
395 primitiveIndex = i // 3
397 startIndex = heelCount
398 primitiveIndex = i // 3 - heelCount + 2
400 indices[i] = startIndex
401 indices[i+1] = startIndex + primitiveIndex + 1
402 indices[i+2] = startIndex + primitiveIndex + 2
406 indexBuffer.commit(indicesAddress)
408 item.associateWithIndexBuffer(indexBuffer)
410 mMultiplierChanged =
False
412 def initializePlugin(obj):
413 plugin = om.MFnPlugin(obj,
"Autodesk",
"3.0",
"Any")
416 plugin.registerNode(
"py2FootPrint_GeometryOverride_AnimatedMaterial", footPrint.id, footPrint.creator, footPrint.initialize, om.MPxNode.kLocatorNode, footPrint.drawDbClassification)
418 sys.stderr.write(
"Failed to register node\n")
422 omr.MDrawRegistry.registerGeometryOverrideCreator(footPrint.drawDbClassification, footPrint.drawRegistrantId, footPrintGeometryOverrideAnimatedMaterial.creator)
424 sys.stderr.write(
"Failed to register override\n")
428 om.MSelectionMask.registerSelectionType(
"footPrintSelection")
429 mel.eval(
"selectType -byName \"footPrintSelection\" 1")
431 sys.stderr.write(
"Failed to register selection mask\n")
434 def uninitializePlugin(obj):
435 plugin = om.MFnPlugin(obj)
438 plugin.deregisterNode(footPrint.id)
440 sys.stderr.write(
"Failed to deregister node\n")
444 omr.MDrawRegistry.deregisterGeometryOverrideCreator(footPrint.drawDbClassification, footPrint.drawRegistrantId)
446 sys.stderr.write(
"Failed to deregister override\n")
450 om.MSelectionMask.deregisterSelectionType(
"footPrintSelection")
452 sys.stderr.write(
"Failed to deregister selection mask\n")
458 sys.stderr.write(
"Failed to release shaders\n")