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
50 The presence of this function tells Maya that the plugin produces, and
51 expects to be passed, objects created using the Maya Python API 2.0.
55 def matrixAsArray(matrix):
58 array.append(matrix[i])
63 sole = [ [ 0.00, 0.0, -0.70 ],
75 [ -0.15, 0.0, -0.14 ],
76 [ -0.16, 0.0, -0.25 ],
77 [ -0.17, 0.0, -0.35 ],
78 [ -0.17, 0.0, -0.46 ],
79 [ -0.16, 0.0, -0.54 ],
80 [ -0.13, 0.0, -0.61 ],
81 [ -0.09, 0.0, -0.65 ],
82 [ -0.04, 0.0, -0.69 ],
83 [ -0.00, 0.0, -0.70 ] ]
84 heel = [ [ 0.00, 0.0, 0.06 ],
100 [ -0.00, 0.0, 0.06 ] ]
110 class footPrint(omui.MPxLocatorNode):
111 id = om.MTypeId( 0x00080033 )
112 drawDbClassification =
"drawdb/geometry/footPrint_GeometryOverride"
113 drawRegistrantId =
"FootprintNode_GeometryOverridePlugin"
123 unitFn = om.MFnUnitAttribute()
125 footPrint.size = unitFn.create(
"size",
"sz", om.MFnUnitAttribute.kDistance )
126 unitFn.default = om.MDistance(1.0)
128 om.MPxNode.addAttribute( footPrint.size )
131 omui.MPxLocatorNode.__init__(self)
133 def compute(self, plug, data):
136 def draw(self, view, path, style, status):
139 thisNode = self.thisMObject()
140 plug = om.MPlug( thisNode, footPrint.size )
141 sizeVal = plug.asMDistance()
142 multiplier = sizeVal.asCentimeters()
144 global sole, soleCount
145 global heel, heelCount
150 import maya.OpenMayaRender
as v1omr
151 glRenderer = v1omr.MHardwareRenderer.theRenderer()
152 glFT = glRenderer.glFunctionTable()
154 if ( style == omui.M3dView.kFlatShaded )
or ( style == omui.M3dView.kGouraudShaded ):
157 glFT.glPushAttrib( v1omr.MGL_CURRENT_BIT )
160 glFT.glDisable( v1omr.MGL_CULL_FACE )
162 if status == omui.M3dView.kActive:
163 view.setDrawColor( 13, omui.M3dView.kActiveColors )
165 view.setDrawColor( 13, omui.M3dView.kDormantColors )
167 glFT.glBegin( v1omr.MGL_TRIANGLE_FAN )
168 for i
in xrange(soleCount-1):
169 glFT.glVertex3f( sole[i][0] * multiplier, sole[i][1] * multiplier, sole[i][2] * multiplier )
172 glFT.glBegin( v1omr.MGL_TRIANGLE_FAN )
173 for i
in xrange(heelCount-1):
174 glFT.glVertex3f( heel[i][0] * multiplier, heel[i][1] * multiplier, heel[i][2] * multiplier )
181 glFT.glBegin( v1omr.MGL_LINES )
182 for i
in xrange(soleCount-1):
183 glFT.glVertex3f( sole[i][0] * multiplier, sole[i][1] * multiplier, sole[i][2] * multiplier )
184 glFT.glVertex3f( sole[i+1][0] * multiplier, sole[i+1][1] * multiplier, sole[i+1][2] * multiplier )
186 for i
in xrange(heelCount-1):
187 glFT.glVertex3f( heel[i][0] * multiplier, heel[i][1] * multiplier, heel[i][2] * multiplier )
188 glFT.glVertex3f( heel[i+1][0] * multiplier, heel[i+1][1] * multiplier, heel[i+1][2] * multiplier )
196 def boundingBox(self):
199 thisNode = self.thisMObject()
200 plug = om.MPlug( thisNode, footPrint.size )
201 sizeVal = plug.asMDistance()
202 multiplier = sizeVal.asCentimeters()
204 corner1 = om.MPoint( -0.17, 0.0, -0.7 )
205 corner2 = om.MPoint( 0.17, 0.0, 0.3 )
207 corner1 *= multiplier
208 corner2 *= multiplier
210 return om.MBoundingBox( corner1, corner2 )
212 def getShapeSelectionMask(self)
213 selType = om.MSelectionMask(
"footPrintSelection")
214 return om.MSelectionMask( selType )
222 class footPrintGeometryOverride(omr.MPxGeometryOverride):
223 colorParameterName_ =
"solidColor"
224 wireframeHeelItemName_ =
"heelLocatorWires"
225 wireframeSoleItemName_ =
"soleLocatorWires"
226 shadedHeelItemName_ =
"heelLocatorTriangles"
227 shadedSoleItemName_ =
"soleLocatorTriangles"
231 return footPrintGeometryOverride(obj)
233 def __init__(self, obj):
234 omr.MPxGeometryOverride.__init__(self, obj)
235 self. mSolidUIShader =
None
236 self.mLocatorNode = obj
237 self.mMultiplier = 0.0
238 self.mMultiplierChanged =
True
240 shaderMgr = omr.MRenderer.getShaderManager()
242 self.mSolidUIShader = shaderMgr.getStockShader(omr.MShaderManager.k3dSolidShader)
245 if self.mSolidUIShader:
246 shaderMgr = omr.MRenderer.getShaderManager()
248 shaderMgr.releaseShader(self.mSolidUIShader)
250 def supportedDrawAPIs(self):
252 return omr.MRenderer.kOpenGL | omr.MRenderer.kOpenGLCoreProfile | omr.MRenderer.kDirectX11
254 def hasUIDrawables(self):
258 plug = om.MPlug(self.mLocatorNode, footPrint.size)
261 sizeVal = plug.asMDistance()
262 newScale = sizeVal.asCentimeters()
264 if newScale != self.mMultiplier:
265 self.mMultiplier = newScale
266 self.mMultiplierChanged =
True
271 def isIndexingDirty(self, item):
274 def isStreamDirty(self, desc):
275 return self.mMultiplierChanged
277 def updateRenderItems(self, dagPath, renderList ):
281 ( (footPrintGeometryOverride.wireframeHeelItemName_,
282 footPrintGeometryOverride.wireframeSoleItemName_),
283 omr.MGeometry.kLineStrip,
284 omr.MGeometry.kWireframe),
287 ( (footPrintGeometryOverride.shadedHeelItemName_,
288 footPrintGeometryOverride.shadedSoleItemName_),
289 omr.MGeometry.kTriangleStrip,
290 omr.MGeometry.kShaded)
293 for itemNameList, geometryType, drawMode
in fullItemList:
294 for itemName
in itemNameList:
296 index = renderList.indexOf(itemName)
298 renderItem = omr.MRenderItem.create(
300 omr.MRenderItem.DecorationItem,
302 renderItem.setDrawMode(drawMode)
303 renderItem.setDepthPriority(5)
305 renderList.append(renderItem)
307 renderItem = renderList[index]
310 if self.mSolidUIShader:
311 self.mSolidUIShader.setParameter(footPrintGeometryOverride.colorParameterName_, omr.MGeometryUtilities.wireframeColor(dagPath))
312 renderItem.setShader(self.mSolidUIShader)
313 renderItem.enable(
True)
315 def populateGeometry(self, requirements, renderItems, data):
316 vertexBufferDescriptorList = requirements.vertexRequirements()
318 for vertexBufferDescriptor
in vertexBufferDescriptorList:
319 if vertexBufferDescriptor.semantic == omr.MGeometry.kPosition:
320 verticesCount = soleCount+heelCount
321 verticesBuffer = data.createVertexBuffer(vertexBufferDescriptor)
322 verticesPositionDataAddress = verticesBuffer.acquire(verticesCount,
True)
323 verticesPositionData = ((ctypes.c_float * 3)*verticesCount).from_address(verticesPositionDataAddress)
325 verticesPointerOffset = 0
329 for vtxList
in (heel, sole):
331 verticesPositionData[verticesPointerOffset][0] = vtx[0] * self.mMultiplier
332 verticesPositionData[verticesPointerOffset][1] = vtx[1] * self.mMultiplier
333 verticesPositionData[verticesPointerOffset][2] = vtx[2] * self.mMultiplier
334 verticesPointerOffset += 1
336 verticesBuffer.commit(verticesPositionDataAddress)
340 for item
in renderItems:
351 if item.name() == footPrintGeometryOverride.wireframeHeelItemName_:
353 elif item.name() == footPrintGeometryOverride.wireframeSoleItemName_:
354 startIndex = heelCount
356 elif item.name() == footPrintGeometryOverride.shadedHeelItemName_:
357 numIndex = heelCount - 2
359 endIndex = heelCount - 2
361 elif item.name() == footPrintGeometryOverride.shadedSoleItemName_:
362 startIndex = heelCount
363 endIndex = heelCount + soleCount - 2
364 numIndex = soleCount - 2
368 indexBuffer = data.createIndexBuffer(omr.MGeometry.kUnsignedInt32)
369 indicesAddress = indexBuffer.acquire(numIndex,
True)
370 indices = (ctypes.c_uint * numIndex).from_address(indicesAddress)
376 indices[i] = startIndex + i
380 indices[i] = startIndex + i/2
382 indices[i+1] = endIndex - i/2
385 indexBuffer.commit(indicesAddress)
386 item.associateWithIndexBuffer(indexBuffer)
388 mMultiplierChanged =
False
390 def initializePlugin(obj):
391 plugin = om.MFnPlugin(obj,
"Autodesk",
"3.0",
"Any")
394 plugin.registerNode(
"footPrint_GeometryOverride", footPrint.id, footPrint.creator, footPrint.initialize, om.MPxNode.kLocatorNode, footPrint.drawDbClassification)
396 sys.stderr.write(
"Failed to register node\n")
400 omr.MDrawRegistry.registerGeometryOverrideCreator(footPrint.drawDbClassification, footPrint.drawRegistrantId, footPrintGeometryOverride.creator)
402 sys.stderr.write(
"Failed to register override\n")
406 om.MSelectionMask.registerSelectionType(
"footPrintSelection")
407 mel.eval(
"selectType -byName \"footPrintSelection\" 1")
409 sys.stderr.write(
"Failed to register selection mask\n")
412 def uninitializePlugin(obj):
413 plugin = om.MFnPlugin(obj)
416 plugin.deregisterNode(footPrint.id)
418 sys.stderr.write(
"Failed to deregister node\n")
422 omr.MDrawRegistry.deregisterGeometryOverrideCreator(footPrint.drawDbClassification, footPrint.drawRegistrantId)
424 sys.stderr.write(
"Failed to deregister override\n")
428 om.MSelectionMask.deregisterSelectionType(
"footPrintSelection")
430 sys.stderr.write(
"Failed to deregister selection mask\n")