12 import maya.api.OpenMaya
as om
13 import maya.api.OpenMayaUI
as omui
14 import maya.api.OpenMayaRender
as omr
18 The presence of this function tells Maya that the plugin produces, and
19 expects to be passed, objects created using the Maya Python API 2.0.
24 class geometryReplicator(om.MPxSurfaceShape):
25 id = om.MTypeId(0x00080069)
26 drawDbClassification =
"drawdb/geometry/geometryReplicator_py"
27 drawRegistrantId =
"geometryReplicatorPlugin_py"
34 om.MPxSurfaceShape.__init__(self)
38 return geometryReplicator()
42 nAttr = om.MFnNumericAttribute()
44 geometryReplicator.aShowCPV = nAttr.create(
"showCPV",
"sc", om.MFnNumericData.kBoolean, 0)
45 om.MPxNode.addAttribute(geometryReplicator.aShowCPV)
47 geometryReplicator.aBaseMesh = nAttr.create(
"isBaseMesh",
"bm", om.MFnNumericData.kBoolean, 0)
48 om.MPxNode.addAttribute(geometryReplicator.aBaseMesh)
50 def postConstructor(self):
51 self.isRenderable =
True
56 def boundingBox(self):
57 corner1 = om.MPoint( -0.5, 0.0, -0.5 )
58 corner2 = om.MPoint( 0.5, 0.0, 0.5 )
60 return om.MBoundingBox( corner1, corner2 )
70 class geometryReplicatorGeometryOverride(omr.MPxGeometryOverride):
71 def __init__(self, obj):
72 omr.MPxGeometryOverride.__init__(self, obj)
73 self.fThisNode = om.MObject(obj)
74 self.fType = om.MFn.kInvalid
75 self.fPath = om.MDagPath()
79 return geometryReplicatorGeometryOverride(obj)
81 def supportedDrawAPIs(self):
83 return (omr.MRenderer.kOpenGL | omr.MRenderer.kDirectX11)
87 plug = om.MPlug(self.fThisNode, geometryReplicator.aShowCPV)
94 plug = om.MPlug(self.fThisNode, geometryReplicator.aBaseMesh)
99 def requiresUnsharedGeometricStreams(self, requirements):
106 descList = requirements.vertexRequirements()
107 for desc
in descList:
108 if desc.semantic == omr.MGeometry.kTexture
and desc.semanticName
in [
"vertexid",
"faceid",
"localuvcoord"]:
113 if not self.fPath.isValid():
114 fnThisNode = om.MFnDependencyNode(self.fThisNode)
116 messageAttr = fnThisNode.attribute(
"message")
117 messagePlug = om.MPlug(self.fThisNode, messageAttr)
119 connections = messagePlug.connectedTo(
False,
True)
120 for plug
in connections:
122 if node.hasFn(om.MFn.kMesh)
or node.hasFn(om.MFn.kNurbsSurface)
or node.hasFn(om.MFn.kNurbsCurve)
or node.hasFn(om.MFn.kBezierCurve):
123 path = om.MDagPath.getAPathTo(node)
125 self.fType = path.apiType()
128 def updateRenderItems(self, path, list):
129 if not self.fPath.isValid():
131 shaderManager = omr.MRenderer.getShaderManager()
132 if shaderManager
is None:
135 if self.fType == om.MFn.kNurbsCurve
or self.fType == om.MFn.kBezierCurve:
138 index = list.indexOf(
"geometryReplicatorCurve")
140 curveItem = omr.MRenderItem.create(
"geometryReplicatorCurve", omr.MRenderItem.NonMaterialSceneItem, omr.MGeometry.kLines)
141 curveItem.setDrawMode(omr.MGeometry.kAll)
142 list.append(curveItem)
144 shader = shaderManager.getStockShader(omr.MShaderManager.k3dSolidShader)
145 if shader
is not None:
146 theColor = [1.0, 0.0, 0.0, 1.0]
147 shader.setParameter(
"solidColor", theColor)
149 curveItem.setShader(shader)
150 shaderManager.releaseShader(shader)
153 curveItem = list[index]
155 if curveItem
is not None:
156 curveItem.enable(
True)
158 elif self.fType == om.MFn.kMesh:
161 index = list.indexOf(
"geometryReplicatorWireframe")
163 wireframeItem = omr.MRenderItem.create(
"geometryReplicatorWireframe", omr.MRenderItem.DecorationItem, omr.MGeometry.kLines)
164 wireframeItem.setDrawMode(omr.MGeometry.kWireframe)
165 wireframeItem.setDepthPriority(omr.MRenderItem.sActiveWireDepthPriority)
166 list.append(wireframeItem)
168 shader = shaderManager.getStockShader(omr.MShaderManager.k3dSolidShader)
169 if shader
is not None:
170 theColor = [1.0, 0.0, 0.0, 1.0]
171 shader.setParameter(
"solidColor", theColor)
173 wireframeItem.setShader(shader)
174 shaderManager.releaseShader(shader)
177 wireframeItem = list[index]
179 if wireframeItem
is not None:
180 wireframeItem.enable(
True)
183 showCPV = self.isCPVShown()
184 index = list.indexOf(
"StandardShadedItem", omr.MGeometry.kTriangles, omr.MGeometry.kShaded)
186 shadedItem = list[index]
187 if shadedItem
is not None:
188 shadedItem.enable(
not showCPV)
190 index = list.indexOf(
"StandardShadedItem", omr.MGeometry.kTriangles, omr.MGeometry.kTextured)
192 shadedItem = list[index]
193 if shadedItem
is not None:
194 shadedItem.enable(
not showCPV)
197 index = list.indexOf(
"geometryReplicatorCPV")
199 cpvItem = list[index]
200 if cpvItem
is not None:
201 cpvItem.enable(showCPV)
206 cpvItem = omr.MRenderItem.create(
"geometryReplicatorCPV", omr.MRenderItem.MaterialSceneItem, omr.MGeometry.kTriangles)
207 cpvItem.setDrawMode(omr.MGeometry.kShaded | omr.MGeometry.kTextured)
210 shader = shaderManager.getStockShader(omr.MShaderManager.k3dCPVSolidShader)
211 if shader
is not None:
212 cpvItem.setShader(shader)
214 shaderManager.releaseShader(shader)
216 def populateGeometry(self, requirements, renderItems, data):
217 if not self.fPath.isValid():
224 options = omr.MGeometryExtractor.kPolyGeom_Normal
225 if self.isBaseMesh():
226 options = options | omr.MGeometryExtractor.kPolyGeom_BaseMesh
227 if self.requiresUnsharedGeometricStreams(requirements):
228 options = options | omr.MGeometryExtractor.kPolyGeom_NotSharing
230 extractor = omr.MGeometryExtractor(requirements, self.fPath, options)
231 if extractor
is None:
235 descList = requirements.vertexRequirements()
236 for desc
in descList:
238 if desc.semantic == omr.MGeometry.kPosition
or desc.semantic == omr.MGeometry.kPosition
or desc.semantic == omr.MGeometry.kNormal
or desc.semantic == omr.MGeometry.kTexture
or desc.semantic == omr.MGeometry.kTangent
or desc.semantic == omr.MGeometry.kBitangent
or desc.semantic == omr.MGeometry.kColor:
239 vertexBuffer = data.createVertexBuffer(desc)
240 if vertexBuffer
is not None:
245 vertexCount = extractor.vertexCount()
246 vertices = vertexBuffer.acquire(vertexCount,
True)
247 if vertices
is not None:
248 extractor.populateVertexBuffer(vertices, vertexCount, desc)
249 vertexBuffer.commit(vertices)
252 for item
in renderItems:
253 indexBuffer = data.createIndexBuffer(omr.MGeometry.kUnsignedInt32)
254 if indexBuffer
is None:
261 if item.primitive() == omr.MGeometry.kTriangles:
262 triangleDesc = omr.MIndexBufferDescriptor(omr.MIndexBufferDescriptor.kTriangle,
"", omr.MGeometry.kTriangles, 3)
263 numTriangles = extractor.primitiveCount(triangleDesc)
265 indices = indexBuffer.acquire(3 * numTriangles,
True)
266 extractor.populateIndexBuffer(indices, numTriangles, triangleDesc)
267 indexBuffer.commit(indices)
269 elif item.primitive() == omr.MGeometry.kLines:
270 edgeDesc = omr.MIndexBufferDescriptor(omr.MIndexBufferDescriptor.kEdgeLine,
"", omr.MGeometry.kLines, 2)
271 numEdges = extractor.primitiveCount(edgeDesc)
273 indices = indexBuffer.acquire(2 * numEdges,
True)
274 extractor.populateIndexBuffer(indices, numEdges, edgeDesc)
275 indexBuffer.commit(indices)
277 item.associateWithIndexBuffer(indexBuffer)
290 def initializePlugin(obj):
291 plugin = om.MFnPlugin(obj,
"Autodesk",
"3.0",
"Any")
293 plugin.registerShape(
"geometryReplicator_py", geometryReplicator.id, geometryReplicator.creator, geometryReplicator.initialize, geometryReplicator.drawDbClassification)
295 sys.stderr.write(
"Failed to register shape\n")
299 omr.MDrawRegistry.registerGeometryOverrideCreator(geometryReplicator.drawDbClassification, geometryReplicator.drawRegistrantId, geometryReplicatorGeometryOverride.creator)
301 sys.stderr.write(
"Failed to register override\n")
304 def uninitializePlugin(obj):
305 plugin = om.MFnPlugin(obj)
307 omr.MDrawRegistry.deregisterGeometryOverrideCreator(geometryReplicator.drawDbClassification, geometryReplicator.drawRegistrantId)
309 sys.stderr.write(
"Failed to deregister override\n")
313 plugin.deregisterNode(geometryReplicator.id)
315 sys.stderr.write(
"Failed to deregister shape\n")