26 from builtins
import object
27 from builtins
import next
28 from builtins
import range
29 import sys, math, ctypes, collections
30 import maya.api.OpenMaya
as om
31 import maya.api.OpenMayaUI
as omui
32 import maya.api.OpenMayaRender
as omr
36 The presence of this function tells Maya that the plugin produces, and
37 expects to be passed, objects created using the Maya Python API 2.0.
42 def useSelectHighlight(selectedList, path):
44 displayStatus = omr.MGeometryUtilities.displayStatus(path)
45 if displayStatus == omr.MGeometryUtilities.kHilite
or displayStatus == omr.MGeometryUtilities.kActiveComponent:
48 pathCopy = om.MDagPath(path)
50 while pathCopy.length() > 0:
51 if selectedList.hasItem(pathCopy):
57 def floatApproxEqual(left, right):
58 return abs(left - right) < 0.0001
66 class apiMeshGeomUV(object):
67 def __init__(self, other=None):
74 return self.faceVertexIndex[fvi]
76 def getUV(self, uvId):
77 return [ self.ucoord[uvId], self.vcoord[uvId] ]
80 return self.ucoord[uvId]
83 return self.vcoord[uvId]
86 return len(self.ucoord)
88 def append_uv(self, u, v):
89 self.ucoord.append( u )
90 self.vcoord.append( v )
93 self.ucoord = om.MFloatArray()
94 self.vcoord = om.MFloatArray()
95 self.faceVertexIndex = om.MIntArray()
97 def copy(self, other):
98 self.ucoord = om.MFloatArray(other.ucoord)
99 self.vcoord = om.MFloatArray(other.vcoord)
100 self.faceVertexIndex = om.MIntArray(other.faceVertexIndex)
102 class apiMeshGeom(object):
104 self.vertices = om.MPointArray()
105 self.face_counts = om.MIntArray()
106 self.face_connects = om.MIntArray()
107 self.normals = om.MVectorArray()
108 self.uvcoords = apiMeshGeomUV()
111 def copy(self, other):
112 self.vertices = om.MPointArray(other.vertices)
113 self.face_counts = om.MIntArray(other.face_counts)
114 self.face_connects = om.MIntArray(other.face_connects)
115 self.normals = om.MVectorArray(other.normals)
116 self.uvcoords = apiMeshGeomUV(other.uvcoords)
117 self.faceCount = other.faceCount
135 kWrapString =
"\n\t\t"
137 kNormalKeyword =
"vn"
138 kTextureKeyword =
"vt"
139 kFaceKeyword =
"face"
142 class apiMeshGeomIterator(om.MPxGeometryIterator):
143 def __init__(self, userGeometry, components):
144 om.MPxGeometryIterator.__init__(self, userGeometry, components)
145 self.geometry = userGeometry
152 om.MPxGeometryIterator.reset(self)
153 self.currentPoint = 0
155 maxVertex = len(self.geometry.vertices)
156 self.maxPoints = maxVertex
165 pnt = self.geometry.vertices[ self.index() ]
168 def setPoint(self, pnt):
173 self.geometry.vertices[ self.index() ] = pnt
175 def iteratorCount(self):
180 return len(self.geometry.vertices)
188 class apiMeshData(om.MPxGeometryData):
189 typeName =
"apiMeshData"
190 id = om.MTypeId(0x80778)
197 om.MPxGeometryData.__init__(self)
198 self.fGeometry = apiMeshGeom()
201 self.fGeometry =
None
203 def readASCII(self, argList, idx):
204 idx = self.readVerticesASCII(argList, idx)
205 idx = self.readNormalsASCII(argList, idx)
206 idx = self.readFacesASCII(argList, idx)
207 idx = self.readUVASCII(argList, idx)
210 def readBinary(self, inputData, length):
214 def writeASCII(self):
215 data = self.writeVerticesASCII()
216 data += self.writeNormalsASCII()
217 data += self.writeFacesASCII()
218 data += self.writeUVASCII()
221 def writeBinary(self):
226 self.fGeometry.copy(src.fGeometry)
229 return apiMeshData.id
232 return apiMeshData.typeName
240 def iterator(self, componentList, component, useComponents, world=None):
242 return apiMeshGeomIterator(self.fGeometry, componentList)
244 return apiMeshGeomIterator(self.fGeometry, component)
252 def readVerticesASCII(self, argList, idx):
255 geomStr = argList.asString(idx)
260 if geomStr == kVertexKeyword:
261 idx = argList.lastArgUsed()+1
262 vertexCount = argList.asInt(idx)
263 idx = argList.lastArgUsed()+1
264 for i
in range(vertexCount):
265 vertex = argList.asPoint(idx)
266 idx = argList.lastArgUsed()+1
267 self.fGeometry.vertices.append(vertex)
271 def readNormalsASCII(self, argList, idx):
274 geomStr = argList.asString(idx)
279 if geomStr == kNormalKeyword:
280 idx = argList.lastArgUsed()+1
281 normalCount = argList.asInt(idx)
282 idx = argList.lastArgUsed()+1
283 for i
in range(normalCount):
284 normal = argList.asVector(idx)
285 idx = argList.lastArgUsed()+1
286 self.fGeometry.normals.append(normal)
290 def readFacesASCII(self, argList, idx):
293 geomStr = argList.asString(idx)
298 while geomStr == kFaceKeyword:
299 idx = argList.lastArgUsed()+1
300 faceCount = argList.asInt(idx)
301 idx = argList.lastArgUsed()+1
302 self.fGeometry.face_counts.append(faceCount)
303 for i
in range(faceCount):
304 vid = argList.asInt(idx)
305 idx = argList.lastArgUsed()+1
306 self.fGeometry.face_connects.append(vid)
309 geomStr = argList.asString(idx)
314 self.fGeometry.faceCount = len(self.fGeometry.face_counts)
317 def readUVASCII(self, argList, idx):
318 self.fGeometry.uvcoords.reset()
322 geomStr = argList.asString(idx)
327 if geomStr == kUVKeyword:
328 idx = argList.lastArgUsed()+1
329 uvCount = argList.asInt(idx)
330 idx = argList.lastArgUsed()+1
331 faceVertexListCount = argList.asInt(idx)
332 idx = argList.lastArgUsed()+1
333 for i
in range(uvCount):
334 u = argList.asDouble(idx)
335 idx = argList.lastArgUsed()+1
336 v = argList.asDouble(idx)
337 idx = argList.lastArgUsed()+1
338 self.fGeometry.uvcoords.append_uv(u, v)
340 for i
in range(faceVertexListCount):
341 fvi = argList.asInt(idx)
342 idx = argList.lastArgUsed()+1
343 self.fGeometry.uvcoords.faceVertexIndex.append( fvi )
347 def writeVerticesASCII(self):
348 vertexCount = len(self.fGeometry.vertices)
352 data += kDblQteChar + kVertexKeyword + kDblQteChar + kSpaceChar + str(vertexCount)
354 for i
in range(vertexCount):
355 vertex = self.fGeometry.vertices[i]
358 data += str(vertex[0]) + kSpaceChar + str(vertex[1]) + kSpaceChar + str(vertex[2])
362 def writeNormalsASCII(self):
363 normalCount = len(self.fGeometry.normals)
367 data += kDblQteChar + kNormalKeyword + kDblQteChar + kSpaceChar + str(normalCount)
369 for i
in range(normalCount):
370 normal = self.fGeometry.normals[i]
373 data += str(normal[0]) + kSpaceChar + str(normal[1]) + kSpaceChar + str(normal[2])
377 def writeFacesASCII(self):
378 numFaces = len(self.fGeometry.face_counts)
383 for i
in range(numFaces):
384 faceVertexCount = self.fGeometry.face_counts[i]
388 data += kDblQteChar + kFaceKeyword + kDblQteChar + kSpaceChar + str(faceVertexCount)
392 for v
in range(faceVertexCount):
393 value = self.fGeometry.face_connects[vid]
395 data += str(value) + kSpaceChar
400 def writeUVASCII(self):
401 uvCount = self.fGeometry.uvcoords.uvcount()
402 faceVertexCount = len(self.fGeometry.uvcoords.faceVertexIndex)
409 data += kDblQteChar + kUVKeyword + kDblQteChar + kSpaceChar + str(uvCount) + kSpaceChar + str(faceVertexCount)
411 for i
in range(uvCount):
412 uv = self.fGeometry.uvcoords.getUV(i)
415 data += str(uv[0]) + kSpaceChar + str(uv[1]) + kSpaceChar
417 for i
in range(faceVertexCount):
418 value = self.fGeometry.uvcoords.faceVertexIndex[i]
421 data += str(value) + kSpaceChar
445 class apiMesh(om.MPxSurfaceShape):
446 sNodeName =
"apiMesh_py"
447 sDrawRegistrantId =
"apiMeshPlugin_py"
458 useWeightedTransformUsingFunction =
None
459 useWeightedTweakUsingFunction =
None
470 enableNumericDisplay =
None
478 typedAttr = om.MFnTypedAttribute()
479 numericAttr = om.MFnNumericAttribute()
482 apiMesh.inputSurface = typedAttr.create(
"inputSurface",
"is", apiMeshData.id, om.MObject.kNullObj )
483 typedAttr.storable =
False
484 om.MPxNode.addAttribute( apiMesh.inputSurface )
486 apiMesh.useWeightedTransformUsingFunction = numericAttr.create(
"useWeightedTransformUsingFunction",
"utru", om.MFnNumericData.kBoolean,
True )
487 numericAttr.keyable =
True
488 om.MPxNode.addAttribute( apiMesh.useWeightedTransformUsingFunction )
490 apiMesh.useWeightedTweakUsingFunction = numericAttr.create(
"useWeightedTweakUsingFunction",
"utwu", om.MFnNumericData.kBoolean,
True )
491 numericAttr.keyable =
True
492 om.MPxNode.addAttribute( apiMesh.useWeightedTweakUsingFunction )
494 enableNumericDisplay = numericAttr.create(
"enableNumericDisplay",
"end", om.MFnNumericData.kBoolean,
True )
495 numericAttr.keyable =
True
496 om.MPxNode.addAttribute( enableNumericDisplay )
502 apiMesh.bboxCorner1 = numericAttr.create(
"bboxCorner1",
"bb1", om.MFnNumericData.k3Double, 0 )
503 numericAttr.array =
False
504 numericAttr.usesArrayDataBuilder =
False
505 numericAttr.hidden =
False
506 numericAttr.keyable =
False
507 om.MPxNode.addAttribute( apiMesh.bboxCorner1 )
509 apiMesh.bboxCorner2 = numericAttr.create(
"bboxCorner2",
"bb2", om.MFnNumericData.k3Double, 0 )
510 numericAttr.array =
False
511 numericAttr.usesArrayDataBuilder =
False
512 numericAttr.hidden =
False
513 numericAttr.keyable =
False
514 om.MPxNode.addAttribute( apiMesh.bboxCorner2 )
518 apiMesh.outputSurface = typedAttr.create(
"outputSurface",
"os", apiMeshData.id, om.MObject.kNullObj )
519 typedAttr.writable =
False
520 om.MPxNode.addAttribute( apiMesh.outputSurface )
522 apiMesh.worldSurface = typedAttr.create(
"worldSurface",
"ws", apiMeshData.id, om.MObject.kNullObj )
523 typedAttr.cached =
False
524 typedAttr.writable =
False
525 typedAttr.array =
True
526 typedAttr.usesArrayDataBuilder =
True
527 typedAttr.disconnectBehavior = om.MFnAttribute.kDelete
528 typedAttr.worldSpace =
True
529 om.MPxNode.addAttribute( apiMesh.worldSurface )
533 apiMesh.cachedSurface = typedAttr.create(
"cachedSurface",
"cs", apiMeshData.id, om.MObject.kNullObj )
534 typedAttr.readable =
True
535 typedAttr.writable =
True
536 typedAttr.storable =
True
537 om.MPxNode.addAttribute( apiMesh.cachedSurface )
541 om.MPxNode.attributeAffects( apiMesh.inputSurface, apiMesh.outputSurface )
542 om.MPxNode.attributeAffects( apiMesh.inputSurface, apiMesh.worldSurface )
543 om.MPxNode.attributeAffects( apiMesh.outputSurface, apiMesh.worldSurface )
544 om.MPxNode.attributeAffects( apiMesh.inputSurface, apiMesh.bboxCorner1 )
545 om.MPxNode.attributeAffects( apiMesh.inputSurface, apiMesh.bboxCorner2 )
546 om.MPxNode.attributeAffects( apiMesh.cachedSurface, apiMesh.outputSurface )
547 om.MPxNode.attributeAffects( apiMesh.cachedSurface, apiMesh.worldSurface )
549 om.MPxNode.attributeAffects( om.MPxSurfaceShape.mControlPoints, apiMesh.outputSurface )
550 om.MPxNode.attributeAffects( om.MPxSurfaceShape.mControlValueX, apiMesh.outputSurface )
551 om.MPxNode.attributeAffects( om.MPxSurfaceShape.mControlValueY, apiMesh.outputSurface )
552 om.MPxNode.attributeAffects( om.MPxSurfaceShape.mControlValueZ, apiMesh.outputSurface )
553 om.MPxNode.attributeAffects( om.MPxSurfaceShape.mControlPoints, apiMesh.cachedSurface )
554 om.MPxNode.attributeAffects( om.MPxSurfaceShape.mControlValueX, apiMesh.cachedSurface )
555 om.MPxNode.attributeAffects( om.MPxSurfaceShape.mControlValueY, apiMesh.cachedSurface )
556 om.MPxNode.attributeAffects( om.MPxSurfaceShape.mControlValueZ, apiMesh.cachedSurface )
557 om.MPxNode.attributeAffects( om.MPxSurfaceShape.mControlPoints, apiMesh.worldSurface )
558 om.MPxNode.attributeAffects( om.MPxSurfaceShape.mControlValueX, apiMesh.worldSurface )
559 om.MPxNode.attributeAffects( om.MPxSurfaceShape.mControlValueY, apiMesh.worldSurface )
560 om.MPxNode.attributeAffects( om.MPxSurfaceShape.mControlValueZ, apiMesh.worldSurface )
563 om.MPxSurfaceShape.__init__(self)
573 def postConstructor(self):
588 self.isRenderable =
True
592 self.fHasHistoryOnCreate =
False
596 self.fShapeDirty =
True
597 self.fMaterialDirty =
True
599 def compute(self, plug, datablock):
612 if plug == apiMesh.outputSurface:
613 return self.computeOutputSurface( plug, datablock )
615 elif plug == apiMesh.cachedSurface:
616 return self.computeOutputSurface( plug, datablock )
618 elif plug == apiMesh.worldSurface:
619 return self.computeWorldSurface( plug, datablock )
625 def preEvaluation(self, context, evaluationNode):
637 if context.isNormal():
638 if evaluationNode.dirtyPlugExists(apiMesh.inputSurface)
or evaluationNode.dirtyPlugExists(apiMesh.mControlPoints):
641 def postEvaluation(self, context, evaluationNode, evalType):
654 if context.isNormal():
655 if evaluationNode.dirtyPlugExists(apiMesh.inputSurface)
or evaluationNode.dirtyPlugExists(apiMesh.mControlPoints):
656 self.notifyViewport()
658 def setDependentsDirty(self, plug, plugArray):
670 if plug == apiMesh.inputSurface
or plug == om.MPxSurfaceShape.mControlPoints
or plug == om.MPxSurfaceShape.mControlValueX
or plug == om.MPxSurfaceShape.mControlValueY
or plug == om.MPxSurfaceShape.mControlValueZ:
671 self.signalDirtyToViewport()
673 def getInternalValue(self, plug, handle):
699 if plug == om.MPxSurfaceShape.mControlPoints
or plug == om.MPxSurfaceShape.mControlValueX
or plug == om.MPxSurfaceShape.mControlValueY
or plug == om.MPxSurfaceShape.mControlValueZ:
707 if self.hasHistory():
708 return om.MPxNode.getInternalValue(self, plug, handle)
711 if plug == om.MPxSurfaceShape.mControlPoints
and not plug.isArray():
712 index = plug.logicalIndex()
713 pnt = self.getPointValue(index)
714 handle.set3Double( pnt[0], pnt[1], pnt[2] )
716 elif plug == om.MPxSurfaceShape.mControlValueX:
717 parentPlug = plug.parent()
718 index = parentPlug.logicalIndex()
719 val = self.getChannelValue( index, 0 )
720 handle.setDouble( val )
722 elif plug == om.MPxSurfaceShape.mControlValueY:
723 parentPlug = plug.parent()
724 index = parentPlug.logicalIndex()
725 val = self.getChannelValue( index, 1 )
726 handle.setDouble( val )
728 elif plug == om.MPxSurfaceShape.mControlValueZ:
729 parentPlug = plug.parent()
730 index = parentPlug.logicalIndex()
731 val = self.getChannelValue( index, 2 )
732 handle.setDouble( val )
741 elif plug == om.MPxSurfaceShape.mHasHistoryOnCreate:
742 handle.setBool( self.fHasHistoryOnCreate )
745 isOk = om.MPxSurfaceShape.getInternalValue(self, plug, handle)
749 def setInternalValue(self, plug, handle):
775 if plug == om.MPxSurfaceShape.mControlPoints
or plug == om.MPxSurfaceShape.mControlValueX
or plug == om.MPxSurfaceShape.mControlValueY
or plug == om.MPxSurfaceShape.mControlValueZ:
785 if self.hasHistory():
786 self.verticesUpdated()
787 return om.MPxNode.setInternalValue(self, plug, handle)
790 if plug == om.MPxSurfaceShape.mControlPoints
and not plug.isArray():
791 index = plug.logicalIndex()
792 self.setPointValue( index, handle.asDouble3() )
794 elif plug == om.MPxSurfaceShape.mControlValueX:
795 parentPlug = plug.parent()
796 index = parentPlug.logicalIndex()
797 self.setChannelValue( index, 0, handle.asDouble() )
799 elif plug == om.MPxSurfaceShape.mControlValueY:
800 parentPlug = plug.parent()
801 index = parentPlug.logicalIndex()
802 self.setChannelValue( index, 1, handle.asDouble() )
804 elif plug == om.MPxSurfaceShape.mControlValueZ:
805 parentPlug = plug.parent()
806 index = parentPlug.logicalIndex()
807 self.setChannelValue( index, 2, handle.asDouble() )
816 elif plug == om.MPxSurfaceShape.mHasHistoryOnCreate:
817 self.fHasHistoryOnCreate = handle.asBool()
820 isOk = om.MPxSurfaceShape.setInternalValue(self, plug, handle)
824 def connectionMade(self, plug, otherPlug, asSrc):
832 if plug == apiMesh.inputSurface:
833 thisObj = self.thisMObject()
834 historyPlug = om.MPlug( thisObj, om.MPxSurfaceShape.mHasHistoryOnCreate )
835 historyPlug.setBool(
True )
837 thisObj = self.thisMObject()
838 dgNode = om.MFnDependencyNode( thisObj )
839 instObjGroups = dgNode.findPlug(
"instObjGroups",
True)
840 if plug == instObjGroups:
841 self.setMaterialDirty(
True)
843 return om.MPxNode.connectionMade(self, plug, otherPlug, asSrc )
845 def connectionBroken(self, plug, otherPlug, asSrc):
853 if plug == apiMesh.inputSurface:
854 thisObj = self.thisMObject()
855 historyPlug = om.MPlug( thisObj, om.MPxSurfaceShape.mHasHistoryOnCreate )
856 historyPlug.setBool(
False )
858 thisObj = self.thisMObject()
859 dgNode = om.MFnDependencyNode( thisObj )
860 instObjGroups = dgNode.findPlug(
"instObjGroups",
True)
861 if plug == instObjGroups:
862 self.setMaterialDirty(
True)
864 return om.MPxNode.connectionBroken(self, plug, otherPlug, asSrc )
866 def shouldSave(self, plug):
877 if plug == om.MPxSurfaceShape.mControlPoints
or plug == om.MPxSurfaceShape.mControlValueX
or plug == om.MPxSurfaceShape.mControlValueY
or plug == om.MPxSurfaceShape.mControlValueZ:
878 if self.hasHistory():
882 result = om.MPxNode.shouldSave(self, plug)
887 elif plug == apiMesh.cachedSurface:
888 if self.hasHistory():
892 data = plug.asMObject()
893 result =
not data.isNull()
896 result = om.MPxNode.shouldSave(self, plug)
902 def componentToPlugs(self, component, list):
915 if component.hasFn(om.MFn.kSingleIndexedComponent):
916 fnVtxComp = om.MFnSingleIndexedComponent( self.convertToVertexComponent(component) )
917 thisNode = self.thisMObject()
918 plug = om.MPlug( thisNode, om.MPxSurfaceShape.mControlPoints )
922 self.convertToTweakNodePlug(plug)
924 for i
in range(fnVtxComp.elementCount):
925 plug.selectAncestorLogicalIndex(fnVtxComp.element(i), plug.attribute())
928 def matchComponent(self, item, spec, list):
952 result = om.MPxSurfaceShape.kMatchOk
954 dim = attrSpec.dimensions
963 if ( (1 == len(spec))
and (dim > 0)
and ((name ==
"vtx")
or (name ==
"f")) ):
965 attrIndex = attrSpec[0]
968 numComp = self.meshGeom().faceCount
969 typeComp = om.MFn.kMeshPolygonComponent
971 numComp = len(self.meshGeom().vertices)
972 typeComp = om.MFn.kMeshVertComponent
977 if attrIndex.hasLowerBound():
978 lower = attrIndex.getLower()
979 if attrIndex.hasUpperBound():
980 upper = attrIndex.getUpper()
984 if lower > upper
or upper >= numComp:
985 result = om.MPxSurfaceShape.kMatchInvalidAttributeRange
988 path = item.getDagPath(0)
989 fnComp = om.MFnSingleIndexedComponent()
990 objComp = fnComp.create( typeComp )
992 for i
in range(lower, upper+1):
993 fnComp.addElement( i )
995 list.add( (path, objComp),
False )
999 result = om.MPxSurfaceShape.matchComponent(self, item, spec, list )
1003 def match(self, mask, componentList):
1024 if len(componentList) == 0:
1025 result = mask.intersects( om.MSelectionMask.kSelectMeshes )
1028 for comp
in componentList:
1029 if comp.apiType() == om.MFn.kMeshVertComponent
and mask.intersects(om.MSelectionMask.kSelectMeshVerts):
1037 def createFullVertexGroup(self):
1052 fnComponent = om.MFnSingleIndexedComponent()
1053 fullComponent = fnComponent.create( om.MFn.kMeshVertComponent )
1058 numVertices = len(self.meshGeom().vertices)
1059 fnComponent.setCompleteData( numVertices )
1061 return fullComponent
1063 def getShapeSelectionMask(self):
1073 selType = om.MSelectionMask.kSelectMeshes
1074 return om.MSelectionMask( selType )
1076 def getComponentSelectionMask(self):
1086 selMask = om.MSelectionMask(om.MSelectionMask.kSelectMeshVerts)
1087 selMask.addMask(om.MSelectionMask.kSelectMeshEdges)
1088 selMask.addMask(om.MSelectionMask.kSelectMeshFaces)
1091 def localShapeInAttr(self):
1104 return apiMesh.inputSurface
1106 def localShapeOutAttr(self):
1120 return apiMesh.outputSurface
1122 def worldShapeOutAttr(self):
1136 return apiMesh.outputSurface
1138 def cachedShapeAttr(self):
1150 return apiMesh.cachedSurface
1153 def geometryData(self):
1161 datablock = self.forceCache()
1162 handle = datablock.inputValue( apiMesh.inputSurface )
1163 return handle.data()
1165 def closestPoint(self, toThisPoint, theClosestPoint, tolerance):
1176 geometry = self.meshGeom()
1177 numVertices = len(geometry.vertices)
1178 for i
in range(numVertices):
1179 tryThisOne = geometry.vertices[i]
1183 theClosestPoint = geometry.vertices[0]
1187 def transformUsing(self, mat, componentList, cachingMode=om.MPxSurfaceShape.kNoPointCaching, pointCache=None):
1205 geometry = self.meshGeom()
1209 savePoints = (cachingMode == om.MPxSurfaceShape.kSavePoints
and pointCache
is not None)
1210 restorePoints = (cachingMode == om.MPxSurfaceShape.kRestorePoints
and pointCache
is not None)
1215 cacheLen = len(pointCache)
1220 if len(componentList) > 0:
1223 for comp
in componentList:
1224 fnComp = om.MFnSingleIndexedComponent( self.convertToVertexComponent(comp) )
1225 elemCount = fnComp.elementCount
1227 for idx
in range(elemCount):
1228 elemIndex = fnComp.element(idx)
1229 geometry.vertices[elemIndex] = pointCache[cacheIndex]
1231 if cacheIndex >= cacheLen:
1234 if cacheIndex >= cacheLen:
1241 vertLen = len(geometry.vertices)
1242 for idx
in range(vertLen):
1243 geometry.vertices[idx] = pointCache[cacheIndex]
1245 if cacheIndex >= cacheLen:
1252 if len(componentList) > 0:
1255 setSizeIncrement =
True
1256 for comp
in componentList:
1257 fnComp = om.MFnSingleIndexedComponent( self.convertToVertexComponent(comp) )
1258 elemCount = fnComp.elementCount
1260 if savePoints
and setSizeIncrement:
1261 pointCache.sizeIncrement = elemCount
1262 setSizeIncrement =
False
1264 for idx
in range(elemCount):
1265 elemIndex = fnComp.element(idx)
1267 pointCache.append(geometry.vertices[elemIndex])
1269 geometry.vertices[elemIndex] *= mat
1270 geometry.normals[idx] = geometry.normals[idx].transformAsNormal( mat )
1276 vertLen = len(geometry.vertices)
1278 pointCache.sizeIncrement = vertLen
1280 for idx
in range(vertLen):
1282 pointCache.append(geometry.vertices[idx])
1284 geometry.vertices[idx] *= mat
1285 geometry.normals[idx] = geometry.normals[idx].transformAsNormal( mat )
1288 self.updateCachedSurface( geometry, componentList )
1290 def tweakUsing(self, mat, componentList, cachingMode, pointCache, handle):
1311 geometry = self.meshGeom()
1315 savePoints = (cachingMode == om.MPxSurfaceShape.kSavePoints
and pointCache
is not None)
1316 updatePoints = (cachingMode == om.MPxSurfaceShape.kUpdatePoints
and pointCache
is not None)
1317 restorePoints = (cachingMode == om.MPxSurfaceShape.kRestorePoints
and pointCache
is not None)
1319 builder = handle.builder()
1324 cacheLen = len(pointCache)
1329 if len(componentList) > 0:
1332 for comp
in componentList:
1333 fnComp = om.MFnSingleIndexedComponent( self.convertToVertexComponent(comp) )
1334 elemCount = fnComp.elementCount
1336 for idx
in range(elemCount):
1337 elemIndex = fnComp.element(idx)
1338 cachePt = pointCache[cacheIndex]
1339 elem = builder.addElement( elemIndex )
1340 elem.set3Double(cachePt.x, cachePt.y, cachePt.z)
1342 if cacheIndex >= cacheLen:
1345 if cacheIndex >= cacheLen:
1352 vertLen = len(geometry.vertices)
1353 for idx
in range(vertLen):
1354 cachePt = pointCache[cacheIndex]
1355 elem = builder.addElement( idx )
1356 elem.set3Double(cachePt.x, cachePt.y, cachePt.z)
1358 if cacheIndex >= cacheLen:
1366 if len(componentList) > 0:
1367 setSizeIncrement =
True
1368 for comp
in componentList:
1369 fnComp = om.MFnSingleIndexedComponent( self.convertToVertexComponent(comp) )
1370 elemCount = fnComp.elementCount
1372 if savePoints
and setSizeIncrement:
1373 pointCache.sizeIncrement = elemCount
1374 setSizeIncrement =
False
1376 for idx
in range(elemCount):
1377 elemIndex = fnComp.element(idx)
1378 currPt = newPt = geometry.vertices[elemIndex]
1380 delta = newPt - currPt
1381 elem = builder.addElement( elemIndex )
1382 elem.set3Double(delta.x, delta.y, delta.z)
1387 pointCache.append(delta*(-1.0))
1389 elif updatePoints
and cacheIndex < cacheLen:
1390 pointCache[cacheIndex] = pointCache[cacheIndex] - delta
1397 vertLen = len(geometry.vertices)
1399 pointCache.sizeIncrement = vertLen
1401 for idx
in range(vertLen):
1402 currPt = newPt = geometry.vertices[idx]
1404 delta = newPt - currPt
1405 elem = builder.addElement( idx )
1406 elem.set3Double(delta.x, delta.y, delta.z)
1411 pointCache.append(delta*(-1.0))
1413 elif updatePoints
and idx < cacheLen:
1414 pointCache[cacheIndex] = pointCache[cacheIndex] - delta
1424 self.childChanged( om.MPxSurfaceShape.kBoundingBoxChanged )
1427 self.signalDirtyToViewport()
1431 def weightedTransformUsing(self, xform, space, componentList, cachingMode, pointCache, freezePlane):
1457 plg_useWeightedTransformUsingFunction = om.MPlug( self.thisMObject(), apiMesh.useWeightedTransformUsingFunction )
1458 val_useWeightedTransformUsingFunction = plg_useWeightedTransformUsingFunction.asBool()
1459 if not val_useWeightedTransformUsingFunction:
1460 om.MPxSurfaceShape.weightedTransformUsing(self, xform, space, componentList, cachingMode, pointCache, freezePlane)
1461 self.signalDirtyToViewport()
1466 savePoints = (cachingMode == om.MPxSurfaceShape.kSavePoints
and pointCache
is not None)
1467 updatePoints = (cachingMode == om.MPxSurfaceShape.kUpdatePoints
and pointCache
is not None)
1468 restorePoints = (cachingMode == om.MPxSurfaceShape.kRestorePoints
and pointCache
is not None)
1469 transformOrigPoints = (cachingMode == om.MPxSurfaceShape.kTransformOriginalPoints
and pointCache
is not None)
1472 spaceInv = om.MMatrix()
1474 spaceInv = space.inverse()
1478 geometry = self.meshGeom()
1481 setSizeIncrement =
True
1483 for comp
in componentList:
1484 fnComp = om.MFnSingleIndexedComponent( self.convertToVertexComponent(comp) )
1485 elemCount = fnComp.elementCount
1486 hasWeights = fnComp.hasWeights
1487 hasSeam = (freezePlane
is not None)
1489 if savePoints
and setSizeIncrement:
1490 pointCache.sizeIncrement = elemCount
1491 setSizeIncrement =
False
1493 for idx
in range(elemCount):
1494 elemIndex = fnComp.element( idx )
1497 perc = fnComp.weight(idx).influence()
1500 if perc > almostZero:
1503 geometry.vertices[elemIndex] = om.MVector( pointCache[pointCacheIndex] )
1504 pointCacheIndex += 1
1509 pointCache.append( geometry.vertices[elemIndex] )
1511 elif transformOrigPoints:
1512 geometry.vertices[elemIndex] = om.MVector( pointCache[pointCacheIndex] )
1515 pointCache[pointCacheIndex] = geometry.vertices[elemIndex]
1520 mat = xform.asMatrix()
1522 mat = space * xform.asMatrix(perc) * spaceInv
1524 mat = xform.asMatrix(perc)
1527 currPt = newPt = geometry.vertices[elemIndex]
1531 if hasSeam
and fnComp.weight(idx).seam() > 0.0:
1532 newPt += freezePlane.normal() * (fnComp.weight(idx).seam() * (freezePlane.directedDistance(currPt) - freezePlane.directedDistance(newPt)))
1535 geometry.vertices[elemIndex] = newPt
1536 pointCacheIndex += 1
1539 self.updateCachedSurface( geometry, componentList )
1541 def weightedTweakUsing(self, xform, space, componentList, cachingMode, pointCache, freezePlane, handle):
1572 plg_useWeightedTweakUsingFunction = om.MPlug( self.thisMObject(), apiMesh.useWeightedTweakUsingFunction )
1573 val_useWeightedTweakUsingFunction = plg_useWeightedTweakUsingFunction.asBool()
1574 if not val_useWeightedTweakUsingFunction:
1575 om.MPxSurfaceShape.weightedTweakUsing(self, xform, space, componentList, cachingMode, pointCache, freezePlane, handle)
1578 geometry = self.meshGeom()
1582 savePoints = (cachingMode == om.MPxSurfaceShape.kSavePoints
and pointCache
is not None)
1583 updatePoints = (cachingMode == om.MPxSurfaceShape.kUpdatePoints
and pointCache
is not None)
1584 restorePoints = (cachingMode == om.MPxSurfaceShape.kRestorePoints
and pointCache
is not None)
1585 transformOrigPoints = (cachingMode == om.MPxSurfaceShape.kTransformOriginalPoints
and pointCache
is not None)
1587 builder = handle.builder()
1592 cacheLen = len(pointCache)
1599 for comp
in componentList:
1600 fnComp = om.MFnSingleIndexedComponent( self.convertToVertexComponent(comp) )
1601 elemCount = fnComp.elementCount
1603 for idx
in range(elemCount):
1604 elemIndex = fnComp.element( idx )
1605 cachePt = pointCache[cacheIndex]
1606 elem = builder.addElement( elemIndex )
1607 elem.set3Double(cachePt.x, cachePt.y, cachePt.z)
1609 if cacheIndex >= cacheLen:
1620 setSizeIncrement =
True
1621 spaceInv = om.MMatrix()
1623 spaceInv = space.inverse()
1625 for comp
in componentList:
1626 fnComp = om.MFnSingleIndexedComponent( self.convertToVertexComponent(comp) )
1627 elemCount = fnComp.elementCount
1628 hasWeights = fnComp.hasWeights
1629 hasSeam = (freezePlane
is not None)
1631 if savePoints
and setSizeIncrement:
1632 pointCache.sizeIncrement = elemCount
1633 setSizeIncrement =
False
1635 for idx
in range(elemCount):
1636 elemIndex = fnComp.element( idx )
1639 perc = fnComp.weight(idx).influence()
1642 if perc > almostZero:
1648 mat = xform.asMatrix()
1650 mat = space * xform.asMatrix(perc) * spaceInv
1652 mat = xform.asMatrix(perc)
1657 if transformOrigPoints:
1658 geometry.vertices[elemIndex] = om.MVector( pointCache[cacheIndex] )
1662 currPt = newPt = geometry.vertices[elemIndex]
1667 if hasSeam
and fnComp.weight(idx).seam() > 0.0:
1668 newPt += freezePlane.normal() * (fnComp.weight(idx).seam() * (freezePlane.directedDistance(currPt) - freezePlane.directedDistance(newPt)))
1671 delta = newPt - currPt
1673 elem = builder.addElement( elemIndex )
1674 elem.set3Double(delta.x, delta.y, delta.z)
1679 pointCache.append(delta*(-1.0))
1680 elif updatePoints
and cacheIndex < cacheLen:
1681 pointCache[cacheIndex] = pointCache[cacheIndex] - delta
1691 self.childChanged( om.MPxSurfaceShape.kBoundingBoxChanged )
1695 def vertexOffsetDirection(self, component, direction, mode, normalize):
1714 fnComp = om.MFnSingleIndexedComponent( self.convertToVertexComponent(component) )
1715 if component.apiType() != om.MFn.kMeshVertComponent:
1718 geometry = self.meshGeom()
1725 normal = geometry.normals[ idx ]
1727 if mode == om.MPxSurfaceShape.kNormal:
1730 direction.append( normal )
1736 uAxis = om.MVector()
1737 vAxis = om.MVector()
1741 a = math.abs(normal[0])
1743 if a < math.abs(normal[1]):
1745 a = math.fabs(normal[1])
1747 if a < math.abs(normal[2]):
1753 a = math.sqrt(normal[i]*normal[i] + normal[j]*normal[j])
1754 uAxis[i] = -normal[j]/a
1755 uAxis[j] = normal[i]/a
1757 vAxis = normal^uAxis
1759 if mode == om.MPxSurfaceShape.kUTangent
or mode == om.MPxSurfaceShape.kUVNTriad:
1762 direction.append( uAxis )
1764 if mode == om.MPxSurfaceShape.kVTangent
or mode == om.MPxSurfaceShape.kUVNTriad:
1767 direction.append( vAxis )
1769 if mode == om.MPxSurfaceShape.kUVNTriad:
1772 direction.append( normal )
1778 def isBounded(self):
1787 def boundingBox(self):
1794 if self.fShapeDirty:
1798 thisNode = self.thisMObject()
1799 c1Plug = om.MPlug( thisNode, apiMesh.bboxCorner1 )
1800 c2Plug = om.MPlug( thisNode, apiMesh.bboxCorner2 )
1801 corner1Object = c1Plug.asMObject()
1802 corner2Object = c2Plug.asMObject()
1804 fnData = om.MFnNumericData()
1805 fnData.setObject( corner1Object )
1806 corner1 = fnData.getData()
1808 fnData.setObject( corner2Object )
1809 corner2 = fnData.getData()
1811 corner1Point = om.MPoint( corner1[0], corner1[1], corner1[2] )
1812 corner2Point = om.MPoint( corner2[0], corner2[1], corner2[2] )
1814 return om.MBoundingBox( corner1Point, corner2Point )
1818 def geometryIteratorSetup(self, componentList, components, forReadOnly=False):
1835 if components.isNull():
1836 vtxComponents = om.MObjectArray([self.convertToVertexComponent(c)
for c
in componentList])
1837 return apiMeshGeomIterator( self.meshGeom(), vtxComponents )
1839 return apiMeshGeomIterator( self.meshGeom(), self.convertToVertexComponent(components) )
1841 def acceptsGeometryIterator(self, arg0, arg1=None, arg2=None):
1867 def hasHistory(self):
1873 return self.fHasHistoryOnCreate
1875 def shapeDirty(self):
1882 return self.fShapeDirty
1884 def resetShapeDirty(self):
1890 self.fShapeDirty =
False
1892 def materialDirty(self):
1899 return self.fMaterialDirty
1901 def setMaterialDirty(self, dirty):
1907 self.fMaterialDirty = dirty
1909 def computeInputSurface(self, plug, datablock):
1918 if self.hasHistory():
1919 inputHandle = datablock.inputValue( apiMesh.inputSurface )
1921 surf = inputHandle.asPluginData()
1922 if not isinstance(surf, apiMeshData):
1923 raise RuntimeError(
"computeInputSurface : invalid inputSurface data found")
1927 fnDataCreator = om.MFnPluginData()
1928 fnDataCreator.create( apiMeshData.id )
1930 newCachedData = fnDataCreator.data()
1931 if not isinstance(newCachedData, apiMeshData):
1932 raise RuntimeError(
"computeInputSurface : invalid proxy cached apiMeshData object")
1934 newCachedData.fGeometry.copy(surf.fGeometry)
1936 cachedHandle = datablock.outputValue( apiMesh.cachedSurface )
1937 if not isinstance(cachedHandle, om.MDataHandle):
1938 raise RuntimeError(
"computeInputSurface : invalid cachedSurface")
1940 cachedHandle.setMPxData( newCachedData )
1942 def computeOutputSurface(self, plug, datablock):
1957 self.computeInputSurface( plug, datablock )
1961 cachedHandle = datablock.outputValue( apiMesh.cachedSurface )
1962 if not isinstance(cachedHandle, om.MDataHandle):
1963 raise RuntimeError(
"computeOutputSurface : invalid cachedSurface")
1965 cached = cachedHandle.asPluginData()
1966 if not isinstance(cached, apiMeshData):
1967 raise RuntimeError(
"computeOutputSurface : invalid cachedSurface data found")
1969 datablock.setClean( plug )
1973 if self.hasHistory():
1974 self.applyTweaks( datablock, cached.fGeometry )
1977 cpHandle = datablock.inputArrayValue( om.MPxSurfaceShape.mControlPoints )
1978 cpHandle.setAllClean()
1982 fnDataCreator = om.MFnPluginData()
1983 fnDataCreator.create( apiMeshData.id )
1985 newData = fnDataCreator.data()
1986 if not isinstance(newData, apiMeshData):
1987 raise RuntimeError(
"computeOutputSurface : invalid proxy cached apiMeshData object")
1991 newData.fGeometry.copy(cached.fGeometry)
1995 outHandle = datablock.outputValue( apiMesh.outputSurface )
1996 outHandle.setMPxData( newData )
2000 self.computeBoundingBox( datablock )
2005 def computeWorldSurface(self, plug, datablock):
2012 self.computeOutputSurface( plug, datablock )
2013 inHandle = datablock.outputValue( apiMesh.outputSurface )
2014 outSurf = inHandle.asPluginData()
2015 if not isinstance(outSurf, apiMeshData):
2016 raise RuntimeError(
"computeWorldSurface : invalid outSurf")
2020 fnDataCreator = om.MFnPluginData()
2021 fnDataCreator.create( apiMeshData.id )
2023 newData = fnDataCreator.data()
2024 if not isinstance(newData, apiMeshData):
2025 raise RuntimeError(
"computeWorldSurface : invalid proxy cached apiMeshData object")
2028 worldMat = self.getWorldMatrix(datablock, 0)
2029 newData.matrix = worldMat
2033 newData.fGeometry.copy( outSurf.fGeometry )
2037 arrayIndex = plug.logicalIndex()
2039 worldHandle = datablock.outputArrayValue( apiMesh.worldSurface )
2040 builder = worldHandle.builder()
2041 outHandle = builder.addElement( arrayIndex )
2043 outHandle.setMPxData( newData )
2048 def computeBoundingBox(self, datablock):
2058 lowerHandle = datablock.outputValue( apiMesh.bboxCorner1 )
2059 upperHandle = datablock.outputValue( apiMesh.bboxCorner2 )
2061 geometry = self.meshGeom()
2062 cnt = len(geometry.vertices)
2068 tmppnt = geometry.vertices[0]
2069 lower = [ tmppnt[0], tmppnt[1], tmppnt[2] ]
2070 upper = [ tmppnt[0], tmppnt[1], tmppnt[2] ]
2072 for i
in range(cnt):
2073 pnt = geometry.vertices[i]
2075 if pnt[0] < lower[0]: lower[0] = pnt[0]
2076 if pnt[1] < lower[1]: lower[1] = pnt[1]
2077 if pnt[2] < lower[2]: lower[2] = pnt[2]
2079 if pnt[0] > upper[0]: upper[0] = pnt[0]
2080 if pnt[1] > upper[1]: upper[1] = pnt[1]
2081 if pnt[2] > upper[2]: upper[2] = pnt[2]
2083 lowerHandle.set3Double(lower[0], lower[1], lower[2])
2084 upperHandle.set3Double(upper[0], upper[1], upper[2])
2086 lowerHandle.setClean()
2087 upperHandle.setClean()
2091 self.childChanged( om.MPxSurfaceShape.kBoundingBoxChanged )
2093 def convertToVertexComponent(self, components):
2095 Converts edge and face components into vertex components. This
2096 allows applying transform offsets to the vertex when edge or faces
2102 srcComponent = om.MFnSingleIndexedComponent(components)
2103 srcComponentType = srcComponent.componentType
2107 if srcComponentType != om.MFn.kMeshVertComponent:
2108 srcIndices = set(srcComponent.getElements())
2109 retVal = srcComponent.create(om.MFn.kMeshVertComponent)
2110 vtxComponent = om.MFnSingleIndexedComponent(retVal)
2112 geomPtr = self.meshGeom()
2116 for faceIdx
in range(0, geomPtr.faceCount):
2118 numVerts = geomPtr.face_counts[faceIdx]
2120 for v
in range(0, numVerts):
2121 if srcComponentType == om.MFn.kMeshEdgeComponent:
2122 if edgeId
in srcIndices:
2123 vindex1 = base + (v % numVerts)
2124 vindex2 = base + ((v+1) % numVerts)
2126 vertexId1 = geomPtr.face_connects[vindex1]
2127 vertexId2 = geomPtr.face_connects[vindex2]
2129 vtxComponent.addElement(vertexId1)
2130 vtxComponent.addElement(vertexId2)
2135 if faceIdx
in srcIndices:
2136 vindex = base + (v % numVerts)
2137 vertexId = geomPtr.face_connects[vindex]
2138 vtxComponent.addElement(vertexId)
2144 def applyTweaks(self, datablock, geometry):
2152 cpHandle = datablock.inputArrayValue( om.MPxSurfaceShape.mControlPoints )
2156 while not cpHandle.isDone():
2157 elemIndex = cpHandle.elementLogicalIndex()
2158 pntHandle = cpHandle.outputValue()
2160 offset = pntHandle.asDouble3()
2164 geometry.vertices[elemIndex] += om.MPoint(offset[0],offset[1],offset[2])
2169 def updateCachedSurface(self, geometry, componentList):
2188 datablock = self.forceCache()
2190 cachedHandle = datablock.outputValue( apiMesh.cachedSurface )
2191 cached = cachedHandle.asPluginData()
2193 dHandle = datablock.outputValue( om.MPxSurfaceShape.mControlPoints )
2198 if self.hasHistory()
and cached:
2203 self.buildControlPoints( datablock, len(geometry.vertices) )
2205 cpHandle = om.MArrayDataHandle( dHandle )
2209 for comp
in componentList:
2210 fnComp = om.MFnSingleIndexedComponent( self.convertToVertexComponent(comp) )
2211 for elemIndex
in fnComp.getElements():
2212 cpHandle.jumpToLogicalElement( elemIndex )
2213 pntHandle = cpHandle.outputValue()
2215 pnt = pntHandle.asDouble3()
2217 oldPnt = cached.fGeometry.vertices[elemIndex]
2218 newPnt = geometry.vertices[elemIndex]
2219 offset = newPnt - oldPnt
2225 pntHandle.set3Double(pnt[0], pnt[1], pnt[2])
2230 cached.fGeometry.copy(geometry)
2232 pCPs = om.MPlug( self.thisMObject(), om.MPxSurfaceShape.mControlPoints)
2233 pCPs.setMDataHandle(dHandle)
2237 self.computeBoundingBox( datablock )
2242 self.childChanged( om.MPxSurfaceShape.kBoundingBoxChanged )
2245 self.signalDirtyToViewport()
2247 def getPointValue(self, pntInd):
2254 geometry = self.cachedGeom()
2256 return geometry.vertices[ pntInd ]
2260 def getChannelValue(self, pntInd, vlInd):
2267 geometry = self.cachedGeom()
2269 return geometry.vertices[ pntInd ][ vlInd ]
2273 def setPointValue(self, pntInd, val):
2280 geometry = self.cachedGeom()
2282 geometry.vertices[ pntInd ] = om.MPoint(val)
2284 self.verticesUpdated()
2286 def setChannelValue(self, pntInd, vlInd, val):
2293 geometry = self.cachedGeom()
2295 geometry.vertices[ pntInd ][ vlInd ] = val
2297 self.verticesUpdated()
2299 def meshObject(self):
2310 datablock = self.forceCache()
2316 handle = datablock.inputValue( apiMesh.outputSurface )
2317 return handle.data()
2325 meshObj = self.meshObject()
2326 if meshObj == om.MObject.kNullObj:
2327 raise RuntimeError(
"meshGeom : failed to get apiMeshData")
2328 fnData = om.MFnPluginData( meshObj )
2329 data = fnData.data()
2330 if not isinstance(data, apiMeshData):
2331 raise RuntimeError(
"meshGeom : failed to get apiMeshData")
2332 return data.fGeometry
2334 def cachedObject(self):
2344 datablock = self.forceCache()
2345 handle = datablock.outputValue( apiMesh.cachedSurface )
2346 return handle.data()
2348 def cachedGeom(self):
2355 fnData = om.MFnPluginData( self.cachedObject() )
2356 data = fnData.data()
2357 if not isinstance(data, apiMeshData):
2358 raise RuntimeError(
"cachedGeom : failed to get apiMeshData")
2360 return data.fGeometry
2362 def buildControlPoints(self, datablock, count):
2370 cpH = datablock.outputArrayValue( om.MPxSurfaceShape.mControlPoints )
2372 oldBuilder = cpH.builder()
2373 if count != len(oldBuilder):
2376 builder = om.MArrayDataBuilder( oldBuilder )
2378 for vtx
in range(count):
2379 builder.addElement( vtx )
2385 def verticesUpdated(self):
2393 self.childChanged( om.MPxSurfaceShape.kBoundingBoxChanged )
2394 self.childChanged( om.MPxSurfaceShape.kObjectChanged )
2396 def setShapeDirty(self):
2397 self.fShapeDirty =
True
2399 def notifyViewport(self):
2400 omr.MRenderer.setGeometryDrawDirty(self.thisMObject())
2402 def signalDirtyToViewport(self):
2403 self.setShapeDirty()
2404 self.notifyViewport()
2406 class apiMeshGeometryShape(apiMesh):
2407 sDrawDbClassification =
"drawdb/geometry/apiMesh_py"
2409 id = om.MTypeId(0x8009B)
2412 super(apiMeshGeometryShape, self).__init__()
2416 return apiMeshGeometryShape()
2420 return apiMesh.initialize()
2422 class apiMeshSubsceneShape(apiMesh):
2423 sDrawDbClassification =
"drawdb/subscene/apiMesh_py"
2425 id = om.MTypeId(0x8009C)
2428 super(apiMeshSubsceneShape, self).__init__()
2432 return apiMeshSubsceneShape()
2436 om.MPxNode.inheritAttributesFrom(apiMesh.sNodeName)
2448 class apiMeshCreator(om.MPxNode):
2449 id = om.MTypeId(0x8008A)
2459 outputSurface =
None
2463 return apiMeshCreator()
2467 typedAttr = om.MFnTypedAttribute()
2468 numericAttr = om.MFnNumericAttribute()
2469 enumAttr = om.MFnEnumAttribute()
2472 apiMeshCreator.size = numericAttr.create(
"size",
"sz", om.MFnNumericData.kDouble, 1 )
2473 numericAttr.array =
False
2474 numericAttr.usesArrayDataBuilder =
False
2475 numericAttr.hidden =
False
2476 numericAttr.keyable =
True
2477 om.MPxNode.addAttribute( apiMeshCreator.size )
2479 apiMeshCreator.shapeType = enumAttr.create(
"shapeType",
"st", 0 )
2480 enumAttr.addField(
"cube", 0 )
2481 enumAttr.addField(
"sphere", 1 )
2482 enumAttr.hidden =
False
2483 enumAttr.keyable =
True
2484 om.MPxNode.addAttribute( apiMeshCreator.shapeType )
2486 apiMeshCreator.inputMesh = typedAttr.create(
"inputMesh",
"im", om.MFnData.kMesh, om.MObject.kNullObj )
2487 typedAttr.hidden =
True
2488 om.MPxNode.addAttribute( apiMeshCreator.inputMesh )
2491 apiMeshCreator.outputSurface = typedAttr.create(
"outputSurface",
"os", apiMeshData.id, om.MObject.kNullObj )
2492 typedAttr.writable =
False
2493 om.MPxNode.addAttribute( apiMeshCreator.outputSurface )
2497 om.MPxNode.attributeAffects( apiMeshCreator.inputMesh, apiMeshCreator.outputSurface )
2498 om.MPxNode.attributeAffects( apiMeshCreator.size, apiMeshCreator.outputSurface )
2499 om.MPxNode.attributeAffects( apiMeshCreator.shapeType, apiMeshCreator.outputSurface )
2502 om.MPxNode.__init__(self)
2510 def compute(self, plug, datablock):
2518 if plug == apiMeshCreator.outputSurface:
2522 fnDataCreator = om.MFnPluginData()
2523 fnDataCreator.create( apiMeshData.id )
2525 newData = fnDataCreator.data()
2526 if not isinstance(newData, apiMeshData):
2527 raise RuntimeError(
"compute : invalid proxy cached apiMeshData object")
2529 geometry = newData.fGeometry
2534 hasHistory = self.computeInputMesh( plug, datablock, geometry )
2540 sizeHandle = datablock.inputValue( apiMeshCreator.size )
2541 shape_size = sizeHandle.asDouble()
2542 typeHandle = datablock.inputValue( apiMeshCreator.shapeType )
2543 shape_type = typeHandle.asShort()
2546 self.buildCube( shape_size, geometry )
2547 elif shape_type == 1:
2548 self.buildSphere( shape_size, 32, geometry )
2550 geometry.faceCount = len(geometry.face_counts)
2554 outHandle = datablock.outputValue( apiMeshCreator.outputSurface )
2555 outHandle.setMPxData( newData )
2556 datablock.setClean( plug )
2570 def computeInputMesh(self, plug, datablock, geometry):
2581 inputData = datablock.inputValue( apiMeshCreator.inputMesh )
2582 surf = inputData.asMesh()
2586 thisObj = self.thisMObject()
2587 surfPlug = om.MPlug( thisObj, apiMeshCreator.inputMesh )
2588 if not surfPlug.isConnected:
2589 datablock.setClean( plug )
2594 surfFn = om.MFnMesh(surf)
2595 geometry.vertices = surfFn.getPoints(om.MSpace.kObject)
2599 hasUVs = surfFn.numUVs() > 0
2600 uvs = surfFn.getUVs()
2601 geometry.uvcoords.ucoord = uvs[0]
2602 geometry.uvcoords.vcoord = uvs[1]
2604 for i
in range(surfFn.numPolygons()):
2605 polyVerts = surfFn.getPolygonVertices(i)
2607 pvc = len(polyVerts)
2608 geometry.face_counts.append( pvc )
2610 for v
in range(pvc):
2612 uvId = surfFn.getPolygonUVid(i, v)
2613 geometry.uvcoords.faceVertexIndex.append( uvId )
2614 geometry.face_connects.append( polyVerts[v] )
2616 for n
in range(len(geometry.vertices)):
2617 normal = surfFn.getVertexNormal(n)
2618 geometry.normals.append( normal )
2622 def buildCube(self, cube_size, geometry):
2629 geometry.vertices.clear()
2630 geometry.normals.clear()
2631 geometry.face_counts.clear()
2632 geometry.face_connects.clear()
2633 geometry.uvcoords.reset()
2635 geometry.vertices.append( om.MPoint( -cube_size, -cube_size, -cube_size ) )
2636 geometry.vertices.append( om.MPoint( cube_size, -cube_size, -cube_size ) )
2637 geometry.vertices.append( om.MPoint( cube_size, -cube_size, cube_size ) )
2638 geometry.vertices.append( om.MPoint( -cube_size, -cube_size, cube_size ) )
2639 geometry.vertices.append( om.MPoint( -cube_size, cube_size, -cube_size ) )
2640 geometry.vertices.append( om.MPoint( -cube_size, cube_size, cube_size ) )
2641 geometry.vertices.append( om.MPoint( cube_size, cube_size, cube_size ) )
2642 geometry.vertices.append( om.MPoint( cube_size, cube_size, -cube_size ) )
2644 normal_value = 0.5775
2645 geometry.normals.append( om.MVector( -normal_value, -normal_value, -normal_value ) )
2646 geometry.normals.append( om.MVector( normal_value, -normal_value, -normal_value ) )
2647 geometry.normals.append( om.MVector( normal_value, -normal_value, normal_value ) )
2648 geometry.normals.append( om.MVector( -normal_value, -normal_value, normal_value ) )
2649 geometry.normals.append( om.MVector( -normal_value, normal_value, -normal_value ) )
2650 geometry.normals.append( om.MVector( -normal_value, normal_value, normal_value ) )
2651 geometry.normals.append( om.MVector( normal_value, normal_value, normal_value ) )
2652 geometry.normals.append( om.MVector( normal_value, normal_value, -normal_value ) )
2657 uv_pts = [ [ 0.375, 0.0 ],
2674 num_face_connects = 24
2675 uv_fvid = [ 0, 1, 2, 3,
2682 for i
in range(uv_count):
2683 geometry.uvcoords.append_uv( uv_pts[i][0], uv_pts[i][1] )
2685 for i
in range(num_face_connects):
2686 geometry.uvcoords.faceVertexIndex.append( uv_fvid[i] )
2692 face_counts = [ 4, 4, 4, 4, 4, 4 ]
2694 for i
in range(num_faces):
2695 geometry.face_counts.append( face_counts[i] )
2699 face_connects = [ 0, 1, 2, 3,
2706 for i
in range(num_face_connects):
2707 geometry.face_connects.append( face_connects[i] )
2709 def buildSphere(self, radius, divisions, geometry):
2717 geometry.vertices.clear()
2718 geometry.normals.clear()
2719 geometry.face_counts.clear()
2720 geometry.face_connects.clear()
2721 geometry.uvcoords.reset()
2725 u_delta = math.pi / divisions
2726 v_delta = 2 * math.pi / divisions
2728 topPole = om.MPoint( 0.0, radius, 0.0 )
2729 botPole = om.MPoint( 0.0, -radius, 0.0 )
2733 geometry.vertices.append( botPole )
2734 geometry.normals.append( botPole - om.MPoint.kOrigin )
2736 for i
in range(divisions-1):
2740 for j
in range(divisions):
2741 x = radius * math.cos(u) * math.cos(v)
2742 y = radius * math.sin(u)
2743 z = radius * math.cos(u) * math.sin(v)
2745 pnt = om.MPoint( x, y, z )
2746 geometry.vertices.append( pnt )
2747 geometry.normals.append( pnt - om.MPoint.kOrigin )
2750 geometry.vertices.append( topPole )
2751 geometry.normals.append( topPole - om.MPoint.kOrigin )
2757 for i
in range(divisions):
2758 for j
in range(divisions):
2760 geometry.face_counts.append( 3 )
2762 geometry.face_connects.append( 0 )
2763 geometry.face_connects.append( j + vid )
2764 if j == divisions-1:
2765 geometry.face_connects.append( vid )
2767 geometry.face_connects.append( j + vid + 1 )
2769 elif i == divisions-1:
2770 geometry.face_counts.append( 3 )
2772 geometry.face_connects.append( j + vid + 1 - divisions )
2773 geometry.face_connects.append( vid + 1 )
2774 if j == divisions-1:
2775 geometry.face_connects.append( vid + 1 - divisions )
2777 geometry.face_connects.append( j + vid + 2 - divisions )
2780 geometry.face_counts.append( 4 )
2782 geometry.face_connects.append( j + vid + 1 - divisions )
2783 geometry.face_connects.append( j + vid + 1 )
2784 if j == divisions-1:
2785 geometry.face_connects.append( vid + 1 )
2786 geometry.face_connects.append( vid + 1 - divisions )
2788 geometry.face_connects.append( j + vid + 2 )
2789 geometry.face_connects.append( j + vid + 2 - divisions )
2796 class ShadedItemUserData(om.MUserData):
2797 def __init__(self, override):
2798 om.MUserData.__init__(self, legacy=
False)
2799 self.fOverride = override
2803 class apiMeshHWSelectionUserData(om.MUserData):
2805 om.MUserData.__init__(self, legacy=
False)
2806 self.fMeshGeom =
None
2807 self.fInstanceIndex = 0
2808 self.fFaceViewSelectedStates =
None
2811 sViewSelectedInstanceMark = -1
2812 sViewSelectedFaceSelectionNames = set()
2817 def gatherViewSelectedFaceInfo(frameContext, instances, meshGeom):
2818 viewSelectedFaceInfo = collections.defaultdict(list)
2820 if (
not meshGeom
or meshGeom.faceCount <= 0):
2821 return False, viewSelectedFaceInfo
2823 renderingDestinationResult = frameContext.renderingDestination()
2825 if (renderingDestinationResult[0] != omr.MFrameContext.k3dViewport):
2826 return False, viewSelectedFaceInfo
2828 view = omui.M3dView.getM3dViewFromModelPanel(renderingDestinationResult[1])
2830 if(
not view
or not view.viewIsFiltered()):
2831 return False, viewSelectedFaceInfo
2834 viewSelectedList = view.filteredObjectList()
2835 if(viewSelectedList):
2837 for instIdx
in range(len(instances)):
2838 intersectionList = om.MSelectionList()
2840 intersectionList.add(instances[instIdx])
2841 intersectionList.intersect(viewSelectedList,
True)
2843 selectionIt = om.MItSelectionList(intersectionList)
2844 while not selectionIt.isDone():
2845 comp = selectionIt.getComponent()[1]
2848 viewSelectedFaceInfo[instIdx].append(sViewSelectedInstanceMark)
2851 fnComp = om.MFnSingleIndexedComponent(comp)
2853 if (fnComp.componentType == om.MFn.kMeshPolygonComponent):
2854 faceIds = fnComp.getElements()
2856 for i
in range(len(faceIds)):
2858 if (faceId >= 0
and faceId < meshGeom.faceCount):
2859 viewSelectedFaceInfo[instIdx].append(faceId)
2863 return True, viewSelectedFaceInfo
2867 def shouldDrawInstance(viewSelectedFaceInfo, instIdx):
2870 if instIdx
in viewSelectedFaceInfo:
2871 faceIds = viewSelectedFaceInfo[instIdx]
2874 if id != sViewSelectedInstanceMark:
2892 class simpleComponentConverterSubsceneOverride(omr.MPxComponentConverter):
2893 def __init__(self, componentType, selectionType):
2894 omr.MPxComponentConverter.__init__(self)
2896 self.fComponentType = componentType
2897 self.fSelectionType = selectionType
2899 self.fComponent = om.MFnSingleIndexedComponent()
2900 self.fComponentObject = om.MObject.kNullObj
2901 self.fLookupTable = []
2903 def initialize(self, renderItem):
2905 self.fComponentObject = self.fComponent.create( self.fComponentType )
2910 if self.fComponentType == om.MFn.kMeshPolygonComponent:
2911 selectionData = renderItem.getCustomData()
2912 if isinstance(selectionData, apiMeshHWSelectionUserData):
2913 meshGeom = selectionData.fMeshGeom
2914 faceStates = selectionData.fFaceViewSelectedStates
2918 for i
in range(meshGeom.faceCount):
2919 numVerts = meshGeom.face_counts[i]
2921 if(
not faceStates
or faceStates[i]):
2922 numTriangles += numVerts - 2
2924 self.fLookupTable = [0]*numTriangles
2928 for faceId
in range(meshGeom.faceCount):
2930 numVerts = meshGeom.face_counts[faceId]
2932 if(
not faceStates
or faceStates[faceId]):
2933 for v
in range(1, numVerts-1):
2934 self.fLookupTable[triId] = faceId
2937 def addIntersection(self, intersection):
2944 if self.fComponentType == om.MFn.kMeshEdgeComponent:
2947 if intersection.instanceID == 1
or intersection.instanceID == 3:
2950 idx = intersection.index
2952 if self.fComponentType == om.MFn.kMeshPolygonComponent:
2953 if idx >= 0
and idx < len(self.fLookupTable):
2954 idx = self.fLookupTable[idx]
2956 self.fComponent.addElement(idx)
2958 def component(self):
2960 return self.fComponentObject
2962 def selectionMask(self):
2964 return self.fSelectionType
2968 def creatorVertexSelection():
2969 mask = om.MSelectionMask(om.MSelectionMask.kSelectMeshVerts)
2970 mask.addMask(om.MSelectionMask.kSelectPointsForGravity)
2971 return simpleComponentConverterSubsceneOverride(om.MFn.kMeshVertComponent, mask)
2975 def creatorEdgeSelection():
2976 return simpleComponentConverterSubsceneOverride(om.MFn.kMeshEdgeComponent, om.MSelectionMask.kSelectMeshEdges)
2980 def creatorFaceSelection():
2981 return simpleComponentConverterSubsceneOverride(om.MFn.kMeshPolygonComponent, om.MSelectionMask.kSelectMeshFaces)
2983 class apiMeshSubSceneOverride(omr.MPxSubSceneOverride):
2984 sWireName =
"apiMeshWire_subscene_py"
2985 sSelectName =
"apiMeshSelection_subscene_py"
2986 sBoxName =
"apiMeshBox_subscene_py"
2987 sSelectedBoxName =
"apiMeshBoxSelection_subscene_py"
2988 sShadedName =
"apiMeshShaded_subscene_py"
2989 sTexturedName =
"apiMeshTextured_subscene_py"
2991 sVertexSelectionName =
"apiMeshVertexSelection_subscene_py"
2992 sEdgeSelectionName =
"apiMeshEdgeSelection_subscene_py"
2993 sFaceSelectionName =
"apiMeshFaceSelection_subscene_py"
2995 sActiveVertexName =
"apiMeshActiveVertex_subscene_py"
2996 sActiveEdgeName =
"apiMeshActiveEdge_subscene_py"
2997 sActiveFaceName =
"apiMeshActiveFace_subscene_py"
2999 sNameSeparator =
"_"
3001 class InstanceInfo(object):
3002 def __init__(self, transform, isSelected):
3003 self.fTransform = transform
3004 self.fIsSelected = isSelected
3008 return apiMeshSubSceneOverride(obj)
3011 def shadedItemLinkLost(userData):
3012 if not userData
is None and not userData.fOverride
is None:
3013 if not userData.fOverride.fMesh
is None:
3014 userData.fOverride.fMesh.setMaterialDirty(
True)
3015 userData.fOverride =
None
3018 def __init__(self, obj):
3019 omr.MPxSubSceneOverride.__init__(self, obj)
3021 node = om.MFnDependencyNode(obj)
3022 self.fMesh = node.userNode()
3023 self.fObject = om.MObject(obj)
3024 self.fWireShader =
None
3025 self.fThickWireShader =
None
3026 self.fSelectShader =
None
3027 self.fThickSelectShader =
None
3028 self.fShadedShader =
None
3029 self.fVertexComponentShader =
None
3030 self.fEdgeComponentShader =
None
3031 self.fFaceComponentShader =
None
3032 self.fPositionBuffer =
None
3033 self.fNormalBuffer =
None
3034 self.fBoxPositionBuffer =
None
3035 self.fWireIndexBuffer =
None
3036 self.fBoxIndexBuffer =
None
3037 self.fShadedIndexBuffer =
None
3038 self.fActiveVerticesIndexBuffer =
None
3039 self.fActiveEdgesIndexBuffer =
None
3040 self.fActiveFacesIndexBuffer =
None
3041 self.fThickLineWidth = -1.0
3042 self.fQueuedLineWidth = -1.0
3043 self.fNumInstances = 0
3044 self.fIsInstanceMode =
False
3045 self.fQueueUpdate =
False
3046 self.fUseQueuedLineUpdate =
False
3048 self.fInstanceInfoCache = collections.defaultdict(set)
3050 self.fActiveVerticesSet = set()
3051 self.fActiveEdgesSet = set()
3052 self.fActiveFacesSet = set()
3054 self.fViewSelectedFaceInfoCache = collections.defaultdict(list)
3055 self.fLinkLostCallbackData = []
3060 shaderMgr = omr.MRenderer.getShaderManager()
3062 if self.fWireShader:
3063 shaderMgr.releaseShader(self.fWireShader)
3064 self.fWireShader =
None
3066 if self.fThickWireShader:
3067 shaderMgr.releaseShader(self.fThickWireShader)
3068 self.fThickWireShader =
None
3070 if self.fSelectShader:
3071 shaderMgr.releaseShader(self.fSelectShader)
3072 self.fSelectShader =
None
3074 if self.fThickSelectShader:
3075 shaderMgr.releaseShader(self.fThickSelectShader)
3076 self.fThickSelectShader =
None
3078 if self.fShadedShader:
3079 shaderMgr.releaseShader(self.fShadedShader)
3080 self.fShadedShader =
None
3082 if self.fVertexComponentShader:
3083 shaderMgr.releaseShader(self.fVertexComponentShader)
3084 self.fVertexComponentShader =
None
3086 if self.fEdgeComponentShader:
3087 shaderMgr.releaseShader(self.fEdgeComponentShader)
3088 self.fEdgeComponentShader =
None
3090 if self.fFaceComponentShader:
3091 shaderMgr.releaseShader(self.fFaceComponentShader)
3092 self.fFaceComponentShader =
None
3096 def supportedDrawAPIs(self):
3098 return omr.MRenderer.kOpenGL | omr.MRenderer.kDirectX11 | omr.MRenderer.kOpenGLCoreProfile
3100 def requiresUpdate(self, container, frameContext):
3102 if len(container) == 0:
3109 def update(self, container, frameContext):
3111 self.manageRenderItems(container, frameContext, self.fMesh.shapeDirty()
or len(container) == 0)
3114 self.fMesh.resetShapeDirty()
3116 def furtherUpdateRequired(self, frameContext):
3117 if self.fUseQueuedLineUpdate:
3118 if not frameContext.inUserInteraction()
and not frameContext.userChangingViewContext():
3119 return self.fQueueUpdate
3123 def manageRenderItems(self, container, frameContext, updateGeometry):
3125 if not self.fMesh
or self.fObject.isNull():
3128 shaderMgr = omr.MRenderer.getShaderManager()
3132 node = om.MFnDagNode(self.fObject)
3133 instances = node.getAllPaths()
3134 if len(instances) == 0:
3138 sRed = [1.0, 0.0, 0.0, 1.0]
3139 sGreen = [0.0, 1.0, 0.0, 1.0]
3140 sWhite = [1.0, 1.0, 1.0, 1.0]
3143 if not self.fWireShader:
3144 self.fWireShader = shaderMgr.getStockShader(omr.MShaderManager.k3dSolidShader)
3145 self.fWireShader.setParameter(
"solidColor", sRed)
3147 if not self.fThickWireShader:
3148 self.fThickWireShader = shaderMgr.getStockShader(omr.MShaderManager.k3dThickLineShader)
3149 self.fThickWireShader.setParameter(
"solidColor", sRed)
3151 if not self.fSelectShader:
3152 self.fSelectShader = shaderMgr.getStockShader(omr.MShaderManager.k3dSolidShader)
3153 self.fSelectShader.setParameter(
"solidColor", sGreen)
3155 if not self.fThickSelectShader:
3156 self.fThickSelectShader = shaderMgr.getStockShader(omr.MShaderManager.k3dThickLineShader)
3157 self.fThickSelectShader.setParameter(
"solidColor", sGreen)
3159 if not self.fVertexComponentShader:
3160 self.fVertexComponentShader = shaderMgr.getStockShader(omr.MShaderManager.k3dFatPointShader)
3161 self.fVertexComponentShader.setParameter(
"solidColor", sWhite)
3162 self.fVertexComponentShader.setParameter(
"pointSize", [5.0, 5.0])
3164 if not self.fEdgeComponentShader:
3165 self.fEdgeComponentShader = shaderMgr.getStockShader(omr.MShaderManager.k3dThickLineShader)
3166 self.fEdgeComponentShader.setParameter(
"solidColor", sWhite)
3167 self.fEdgeComponentShader.setParameter(
"lineWidth", [2.0, 2.0])
3169 if not self.fFaceComponentShader:
3170 self.fFaceComponentShader = shaderMgr.getStockShader(omr.MShaderManager.k3dSolidShader)
3171 self.fFaceComponentShader.setParameter(
"solidColor", sWhite)
3173 if not self.fShadedShader:
3174 self.fShadedShader = shaderMgr.getStockShader(omr.MShaderManager.k3dBlinnShader)
3178 self.rebuildGeometryBuffers()
3180 if not all((self.fPositionBuffer, self.fNormalBuffer, self.fBoxPositionBuffer, self.fWireIndexBuffer, self.fBoxIndexBuffer, self.fShadedIndexBuffer)):
3183 isActiveViewFiltered, viewSelectedFaceInfo = gatherViewSelectedFaceInfo(frameContext, instances, self.fMesh.meshGeom())
3185 selectedList = om.MGlobal.getActiveSelectionList()
3187 anyMatrixChanged =
False
3188 itemsChanged =
False
3189 instanceArrayLength = len(instances)
3190 numInstanceSelected = 0
3191 numInstanceUnselected = 0
3194 instanceMatrixArray = om.MMatrixArray(instanceArrayLength)
3195 selectedInstanceMatrixArray = om.MMatrixArray(instanceArrayLength)
3196 unselectedInstanceMatrixArray = om.MMatrixArray(instanceArrayLength)
3198 for instIdx
in range(instanceArrayLength):
3204 instance = instances[instIdx]
3205 instanceNum = instance.instanceNumber()
3207 if (instance.isValid
and instance.isVisible
and (
not isActiveViewFiltered
or shouldDrawInstance(viewSelectedFaceInfo, instIdx))):
3208 instanceInfo = apiMeshSubSceneOverride.InstanceInfo(instance.inclusiveMatrix(), useSelectHighlight(selectedList, instance))
3210 if( instanceNum
not in self.fInstanceInfoCache
or
3211 self.fInstanceInfoCache[instanceNum].fIsSelected != instanceInfo.fIsSelected
or
3212 not self.fInstanceInfoCache[instanceNum].fTransform.isEquivalent(instanceInfo.fTransform)):
3214 self.fInstanceInfoCache[instanceNum] = instanceInfo
3215 anyMatrixChanged =
True
3217 instanceMatrixArray[numInstances] = instanceInfo.fTransform
3220 if instanceInfo.fIsSelected:
3221 selectedInstanceMatrixArray[numInstanceSelected] = instanceInfo.fTransform
3222 numInstanceSelected += 1
3224 unselectedInstanceMatrixArray[numInstanceUnselected] = instanceInfo.fTransform
3225 numInstanceUnselected += 1
3227 if (instanceNum
in self.fInstanceInfoCache):
3229 del self.fInstanceInfoCache[instanceNum]
3231 anyMatrixChanged =
True
3233 instanceMatrixArray.setLength(numInstances)
3234 selectedInstanceMatrixArray.setLength(numInstanceSelected)
3235 unselectedInstanceMatrixArray.setLength(numInstanceUnselected)
3236 if self.fNumInstances != numInstances:
3237 anyMatrixChanged =
True
3238 self.fNumInstances = numInstances
3240 anyInstanceSelected = numInstanceSelected > 0
3241 anyInstanceUnselected = numInstanceUnselected > 0
3243 activeVerticesSet = set()
3244 activeEdgesSet = set()
3245 activeFacesSet = set()
3247 meshGeom = self.fMesh.meshGeom()
3248 if meshGeom
and self.fMesh.hasActiveComponents():
3249 activeComponents = self.fMesh.activeComponents()
3250 if len(activeComponents) > 0:
3251 fnComponent = om.MFnSingleIndexedComponent( activeComponents[0] )
3252 if fnComponent.elementCount > 0:
3253 activeIds = fnComponent.getElements()
3255 if fnComponent.componentType == om.MFn.kMeshVertComponent:
3256 activeVerticesSet = set(activeIds)
3258 elif fnComponent.componentType == om.MFn.kMeshEdgeComponent:
3259 activeEdgesSet = set(activeIds)
3261 elif fnComponent.componentType == om.MFn.kMeshPolygonComponent:
3262 activeFacesSet = set(activeIds)
3265 updateActiveItems = updateGeometry
or self.fActiveVerticesSet != activeVerticesSet
or self.fActiveEdgesSet != activeEdgesSet
or self.fActiveFacesSet != activeFacesSet
3266 self.fActiveVerticesSet = activeVerticesSet
3267 self.fActiveEdgesSet = activeEdgesSet
3268 self.fActiveFacesSet = activeFacesSet
3270 if updateActiveItems:
3271 self.rebuildActiveComponentIndexBuffers()
3273 anyVertexSelected = bool(self.fActiveVerticesSet)
3274 anyEdgeSelected = bool(self.fActiveEdgesSet)
3275 anyFaceSelected = bool(self.fActiveFacesSet)
3277 if (anyVertexSelected
and not self.fActiveVerticesIndexBuffer)
or (anyEdgeSelected
and not self.fActiveEdgesIndexBuffer)
or (anyFaceSelected
and not self.fActiveFacesIndexBuffer):
3282 wireItem = container.find(self.sWireName)
3283 if not wireItem
and anyInstanceUnselected:
3284 wireItem = omr.MRenderItem.create( self.sWireName, omr.MRenderItem.DecorationItem, omr.MGeometry.kLines)
3285 wireItem.setDrawMode(omr.MGeometry.kWireframe)
3286 wireItem.setDepthPriority(omr.MRenderItem.sActiveWireDepthPriority)
3287 wireItem.setShader(self.fWireShader)
3288 container.add(wireItem)
3291 elif wireItem
and not anyInstanceUnselected:
3292 container.remove(self.sWireName)
3296 selectItem = container.find(self.sSelectName)
3297 if not selectItem
and anyInstanceSelected:
3298 selectItem = omr.MRenderItem.create( self.sSelectName, omr.MRenderItem.DecorationItem, omr.MGeometry.kLines)
3299 selectItem.setDrawMode(omr.MGeometry.kWireframe | omr.MGeometry.kShaded | omr.MGeometry.kTextured)
3300 selectItem.setDepthPriority(omr.MRenderItem.sActiveWireDepthPriority)
3301 selectItem.setShader(self.fSelectShader)
3302 container.add(selectItem)
3305 elif selectItem
and not anyInstanceSelected:
3306 container.remove(self.sSelectName)
3310 boxItem = container.find(self.sBoxName)
3311 if not boxItem
and anyInstanceUnselected:
3312 boxItem = omr.MRenderItem.create( self.sBoxName, omr.MRenderItem.NonMaterialSceneItem, omr.MGeometry.kLines)
3313 boxItem.setDrawMode(omr.MGeometry.kBoundingBox)
3314 boxItem.setShader(self.fWireShader)
3315 container.add(boxItem)
3318 elif boxItem
and not anyInstanceUnselected:
3319 container.remove(self.sBoxName)
3323 selectedBoxItem = container.find(self.sSelectedBoxName)
3324 if not selectedBoxItem
and anyInstanceSelected:
3325 selectedBoxItem = omr.MRenderItem.create( self.sSelectedBoxName, omr.MRenderItem.NonMaterialSceneItem, omr.MGeometry.kLines)
3326 selectedBoxItem.setDrawMode(omr.MGeometry.kBoundingBox)
3327 selectedBoxItem.setShader(self.fSelectShader)
3328 container.add(selectedBoxItem)
3331 elif selectedBoxItem
and not anyInstanceSelected:
3332 container.remove(self.sSelectedBoxName)
3333 selectedBoxItem =
None
3336 shadedItem = container.find(self.sShadedName)
3339 shadedItem = omr.MRenderItem.create( self.sShadedName, omr.MRenderItem.MaterialSceneItem, omr.MGeometry.kTriangles)
3340 shadedItem.setDrawMode(omr.MGeometry.kShaded)
3341 shadedItem.setExcludedFromPostEffects(
False)
3342 shadedItem.setCastsShadows(
True)
3343 shadedItem.setReceivesShadows(
True)
3344 container.add(shadedItem)
3347 texturedItem = container.find(self.sTexturedName)
3348 if not texturedItem:
3350 texturedItem = omr.MRenderItem.create( self.sTexturedName, omr.MRenderItem.MaterialSceneItem, omr.MGeometry.kTriangles)
3351 texturedItem.setDrawMode(omr.MGeometry.kTextured)
3352 texturedItem.setExcludedFromPostEffects(
False)
3353 texturedItem.setCastsShadows(
True)
3354 texturedItem.setReceivesShadows(
True)
3355 container.add(texturedItem)
3364 connectedPlugs = om.MPlugArray()
3365 (sets, comps) = node.getConnectedSetsAndMembers(0,
True)
3367 dn = om.MFnDependencyNode(obj)
3368 shaderPlug = dn.findPlug(
"surfaceShader",
True)
3369 connectedPlugs = shaderPlug.connectedTo(
True,
False)
3370 if len(connectedPlugs) > 0:
3371 shader = connectedPlugs[0].node()
3376 updateMaterial = self.fMesh.materialDirty()
3377 self.fMesh.setMaterialDirty(
False)
3380 if updateMaterial
or not shadedItem.isShaderFromNode():
3382 not shadedItem.setShaderFromNode2(shader,
3384 apiMeshSubSceneOverride.shadedItemLinkLost,
3385 ShadedItemUserData(self),
3387 shadedItem.setShader(self.fShadedShader)
3390 if updateMaterial
or not texturedItem.isShaderFromNode():
3392 not texturedItem.setShaderFromNode2(shader,
3394 apiMeshSubSceneOverride.shadedItemLinkLost,
3395 ShadedItemUserData(self),
3397 texturedItem.setShader(self.fShadedShader)
3399 print(
"Unexpected error:", sys.exc_info()[0])
3403 vertexSelectionItem = container.find(self.sVertexSelectionName)
3404 if not vertexSelectionItem:
3405 vertexSelectionItem = omr.MRenderItem.create( self.sVertexSelectionName, omr.MRenderItem.DecorationItem, omr.MGeometry.kPoints)
3407 vertexSelectionItem.setDrawMode(omr.MGeometry.kSelectionOnly)
3409 mask = om.MSelectionMask(om.MSelectionMask.kSelectMeshVerts)
3410 mask.addMask(om.MSelectionMask.kSelectPointsForGravity)
3411 vertexSelectionItem.setSelectionMask( mask )
3413 vertexSelectionItem.setDepthPriority(omr.MRenderItem.sSelectionDepthPriority)
3414 vertexSelectionItem.setShader(self.fVertexComponentShader)
3415 container.add(vertexSelectionItem)
3421 useDrawInstancingOnEdgeSelectionItem =
False
3424 edgeSelectionItem = container.find(self.sEdgeSelectionName)
3425 if not edgeSelectionItem:
3427 drawMode = omr.MGeometry.kSelectionOnly
3428 depthPriority = omr.MRenderItem.sSelectionDepthPriority
3429 if useDrawInstancingOnEdgeSelectionItem:
3431 drawMode = omr.MGeometry.kAll
3433 depthPriority = omr.MRenderItem.sActiveWireDepthPriority-1
3435 edgeSelectionItem = omr.MRenderItem.create( self.sEdgeSelectionName, omr.MRenderItem.DecorationItem, omr.MGeometry.kLines)
3436 edgeSelectionItem.setDrawMode(drawMode)
3438 edgeSelectionItem.setDepthPriority(depthPriority)
3440 edgeSelectionItem.setSelectionMask( om.MSelectionMask.kSelectMeshEdges )
3441 edgeSelectionItem.setShader(self.fWireShader)
3442 container.add(edgeSelectionItem)
3446 faceSelectionItem = container.find(self.sFaceSelectionName)
3447 if not faceSelectionItem:
3448 faceSelectionItem = omr.MRenderItem.create( self.sFaceSelectionName, omr.MRenderItem.DecorationItem, omr.MGeometry.kTriangles)
3450 faceSelectionItem.setDrawMode(omr.MGeometry.kSelectionOnly)
3452 faceSelectionItem.setSelectionMask( om.MSelectionMask.kSelectMeshFaces )
3454 faceSelectionItem.setDepthPriority(omr.MRenderItem.sSelectionDepthPriority)
3455 faceSelectionItem.setShader(self.fFaceComponentShader)
3456 container.add(faceSelectionItem)
3461 mySelectionData = apiMeshHWSelectionUserData()
3462 mySelectionData.fMeshGeom = self.fMesh.meshGeom()
3463 faceSelectionItem.setCustomData(mySelectionData)
3466 activeVertexItem = container.find(self.sActiveVertexName)
3467 if not activeVertexItem
and anyVertexSelected:
3468 activeVertexItem = omr.MRenderItem.create( self.sActiveVertexName, omr.MRenderItem.DecorationItem, omr.MGeometry.kPoints)
3469 activeVertexItem.setDrawMode(omr.MGeometry.kAll)
3470 activeVertexItem.setDepthPriority(omr.MRenderItem.sActivePointDepthPriority)
3471 activeVertexItem.setShader(self.fVertexComponentShader)
3472 container.add(activeVertexItem)
3475 elif activeVertexItem
and not anyVertexSelected:
3476 container.remove(self.sActiveVertexName)
3477 activeVertexItem =
None
3481 activeEdgeItem = container.find(self.sActiveEdgeName)
3482 if not activeEdgeItem
and anyEdgeSelected:
3483 activeEdgeItem = omr.MRenderItem.create( self.sActiveEdgeName, omr.MRenderItem.DecorationItem, omr.MGeometry.kLines)
3484 activeEdgeItem.setDrawMode(omr.MGeometry.kAll)
3485 activeEdgeItem.setDepthPriority(omr.MRenderItem.sActiveLineDepthPriority)
3486 activeEdgeItem.setShader(self.fEdgeComponentShader)
3487 container.add(activeEdgeItem)
3490 elif activeEdgeItem
and not anyEdgeSelected:
3491 container.remove(self.sActiveEdgeName)
3492 activeEdgeItem =
None
3496 activeFaceItem = container.find(self.sActiveFaceName)
3497 if not activeFaceItem
and anyFaceSelected:
3498 activeFaceItem = omr.MRenderItem.create( self.sActiveFaceName, omr.MRenderItem.DecorationItem, omr.MGeometry.kTriangles)
3499 activeFaceItem.setDrawMode(omr.MGeometry.kAll)
3500 activeFaceItem.setDepthPriority(omr.MRenderItem.sActiveLineDepthPriority)
3501 activeFaceItem.setShader(self.fFaceComponentShader)
3502 container.add(activeFaceItem)
3505 elif activeFaceItem
and not anyFaceSelected:
3506 container.remove(self.sActiveFaceName)
3507 activeFaceItem =
None
3511 lineWidth = frameContext.getGlobalLineWidth()
3512 userWidthChange =
not floatApproxEqual(lineWidth, self.fThickLineWidth)
3515 targetRefinedLineWidth = 50.0
3517 self.fThickLineWidth = lineWidth
3521 if self.fUseQueuedLineUpdate:
3522 self.fQueuedLineWidth = lineWidth
3523 if self.fQueuedLineWidth < targetRefinedLineWidth:
3524 self.fQueueUpdate =
True
3530 if self.fUseQueuedLineUpdate
and self.fQueueUpdate:
3531 if self.fQueuedLineWidth < targetRefinedLineWidth:
3532 lineWidth = self.fQueuedLineWidth
3533 self.fQueuedLineWidth += 1
3534 self.fQueueUpdate =
True
3539 self.fQueueUpdate =
False
3542 if not floatApproxEqual(lineWidth, 1.0):
3544 lineWidthArray = [ lineWidth, lineWidth ]
3545 self.fThickWireShader.setParameter(
"lineWidth", lineWidthArray)
3546 self.fThickSelectShader.setParameter(
"lineWidth", lineWidthArray)
3548 wireItem.setShader(self.fThickWireShader)
3550 selectItem.setShader(self.fThickSelectShader)
3554 wireItem.setShader(self.fWireShader)
3556 selectItem.setShader(self.fSelectShader)
3559 if itemsChanged
or updateGeometry:
3560 bounds = self.fMesh.boundingBox()
3562 wireBuffers = omr.MVertexBufferArray()
3563 wireBuffers.append(self.fPositionBuffer,
"positions")
3565 self.setGeometryForRenderItem(wireItem, wireBuffers, self.fWireIndexBuffer, bounds)
3567 self.setGeometryForRenderItem(selectItem, wireBuffers, self.fWireIndexBuffer, bounds)
3569 boxBuffers = omr.MVertexBufferArray()
3570 boxBuffers.append(self.fBoxPositionBuffer,
"positions")
3572 self.setGeometryForRenderItem(boxItem, boxBuffers, self.fBoxIndexBuffer, bounds)
3574 self.setGeometryForRenderItem(selectedBoxItem, boxBuffers, self.fBoxIndexBuffer, bounds)
3576 shadedBuffers = omr.MVertexBufferArray()
3577 shadedBuffers.append(self.fPositionBuffer,
"positions")
3578 shadedBuffers.append(self.fNormalBuffer,
"normals")
3579 self.setGeometryForRenderItem(shadedItem, shadedBuffers, self.fShadedIndexBuffer, bounds)
3580 self.setGeometryForRenderItem(texturedItem, shadedBuffers, self.fShadedIndexBuffer, bounds)
3583 self.setGeometryForRenderItem(vertexSelectionItem, wireBuffers, objectBox = bounds)
3584 self.setGeometryForRenderItem(edgeSelectionItem, wireBuffers, self.fWireIndexBuffer, bounds)
3585 self.setGeometryForRenderItem(faceSelectionItem, wireBuffers, self.fShadedIndexBuffer, bounds)
3588 if itemsChanged
or updateActiveItems:
3589 bounds = self.fMesh.boundingBox()
3591 vertexBuffer = omr.MVertexBufferArray()
3592 vertexBuffer.append(self.fPositionBuffer,
"positions")
3594 if activeVertexItem:
3595 self.setGeometryForRenderItem(activeVertexItem, vertexBuffer, self.fActiveVerticesIndexBuffer, bounds)
3597 self.setGeometryForRenderItem(activeEdgeItem, vertexBuffer, self.fActiveEdgesIndexBuffer, bounds)
3599 self.setGeometryForRenderItem(activeFaceItem, vertexBuffer, self.fActiveFacesIndexBuffer, bounds)
3602 if itemsChanged
or anyMatrixChanged:
3603 if not self.fIsInstanceMode
and numInstances == 1:
3606 objToWorld = instanceMatrixArray[0]
3609 wireItem.setMatrix(objToWorld)
3611 selectItem.setMatrix(objToWorld)
3613 boxItem.setMatrix(objToWorld)
3615 selectedBoxItem.setMatrix(objToWorld)
3616 shadedItem.setMatrix(objToWorld)
3617 texturedItem.setMatrix(objToWorld)
3619 vertexSelectionItem.setMatrix(objToWorld)
3620 edgeSelectionItem.setMatrix(objToWorld)
3621 faceSelectionItem.setMatrix(objToWorld)
3623 if useDrawInstancingOnEdgeSelectionItem:
3626 transform1 = objToWorld
3629 transform2 = objToWorld * 2
3632 transform3 = objToWorld * 3
3636 transforms = om.MMatrixArray((transform1, transform2, transform3))
3637 self.setInstanceTransformArray(edgeSelectionItem, transforms)
3642 self.removeAllInstances(edgeSelectionItem)
3646 newInstanceId = self.addInstanceTransform(edgeSelectionItem, transform1)
3647 print(
"newInstanceId " + str(newInstanceId))
3648 newInstanceId = self.addInstanceTransform(edgeSelectionItem, transform2)
3649 print(
"newInstanceId " + str(newInstanceId))
3650 newInstanceId = self.addInstanceTransform(edgeSelectionItem, transform3)
3651 print(
"newInstanceId " + str(newInstanceId))
3653 if activeVertexItem:
3654 activeVertexItem.setMatrix(objToWorld)
3656 activeEdgeItem.setMatrix(objToWorld)
3658 activeFaceItem.setMatrix(objToWorld)
3673 self.setInstanceTransformArray(wireItem, unselectedInstanceMatrixArray)
3675 self.setInstanceTransformArray(selectItem, selectedInstanceMatrixArray)
3677 self.setInstanceTransformArray(boxItem, unselectedInstanceMatrixArray)
3679 self.setInstanceTransformArray(selectedBoxItem, selectedInstanceMatrixArray)
3680 self.setInstanceTransformArray(shadedItem, instanceMatrixArray)
3681 self.setInstanceTransformArray(texturedItem, instanceMatrixArray)
3683 self.setInstanceTransformArray(vertexSelectionItem, instanceMatrixArray)
3684 self.setInstanceTransformArray(edgeSelectionItem, instanceMatrixArray)
3685 self.setInstanceTransformArray(faceSelectionItem, instanceMatrixArray)
3687 if activeVertexItem:
3688 self.setInstanceTransformArray(activeVertexItem, instanceMatrixArray)
3690 self.setInstanceTransformArray(activeEdgeItem, instanceMatrixArray)
3692 self.setInstanceTransformArray(activeFaceItem, instanceMatrixArray)
3697 self.fIsInstanceMode =
True
3699 self.manageIsolateSelectRenderItems(container, frameContext, instances, viewSelectedFaceInfo, shader, updateMaterial, updateGeometry)
3701 if itemsChanged
or anyMatrixChanged
or updateGeometry:
3703 omr.MRenderer.setLightsAndShadowsDirty()
3705 def manageIsolateSelectRenderItems(self, container, frameContext, instances, viewSelectedFaceInfo, shader, updateMaterial, updateGeometry):
3706 if (
not self.fMesh):
3709 meshGeom = self.fMesh.meshGeom()
3714 destination = frameContext.renderingDestination()
3715 if (destination[0] != omr.MFrameContext.k3dViewport):
3719 activeViewName = destination[1]
3721 updateViewSelectedFaces =
False
3723 if(activeViewName
not in self.fViewSelectedFaceInfoCache):
3725 if(len(viewSelectedFaceInfo) != 0):
3726 updateViewSelectedFaces =
True
3728 elif(self.fViewSelectedFaceInfoCache[activeViewName] != viewSelectedFaceInfo):
3729 updateViewSelectedFaces =
True
3734 if updateViewSelectedFaces:
3737 prevInstIdxArray = set()
3738 if (activeViewName
in self.fViewSelectedFaceInfoCache):
3739 prevInfo = self.fViewSelectedFaceInfoCache[activeViewName]
3740 for instIdx, faceIdxList
in list(prevInfo.items()):
3741 for faceIdx
in faceIdxList:
3742 if faceIdx != sViewSelectedInstanceMark:
3743 prevInstIdxArray.add(instIdx)
3746 currInstIdxArray = set()
3747 for instIdx, faceIdxList
in list(viewSelectedFaceInfo.items()):
3748 for faceIdx
in faceIdxList:
3749 if (faceIdx != sViewSelectedInstanceMark):
3750 currInstIdxArray.add(instIdx)
3753 self.fViewSelectedFaceInfoCache[activeViewName] = viewSelectedFaceInfo
3759 diffInstIdxArray = prevInstIdxArray - currInstIdxArray
3761 for instIdx
in diffInstIdxArray:
3762 namePostfix = self.sNameSeparator + str(instIdx) + self.sNameSeparator + activeViewName
3764 shadedName = self.sShadedName + namePostfix
3765 container.remove(shadedName)
3767 texturedName = self.sTexturedName + namePostfix
3768 container.remove(texturedName)
3770 faceSelectionName = self.sFaceSelectionName + namePostfix
3771 container.remove(faceSelectionName)
3775 for instIdx
in currInstIdxArray:
3776 namePostfix = self.sNameSeparator + str(instIdx) + self.sNameSeparator + activeViewName
3778 shadedName = self.sShadedName + namePostfix
3779 viewSelectedShadedItem = container.find(shadedName)
3780 if not viewSelectedShadedItem:
3782 viewSelectedShadedItem = omr.MRenderItem.create(shadedName, omr.MRenderItem.MaterialSceneItem, omr.MGeometry.kTriangles)
3783 viewSelectedShadedItem.setDrawMode(omr.MGeometry.kShaded)
3784 viewSelectedShadedItem.setExcludedFromPostEffects(
False)
3785 viewSelectedShadedItem.setCastsShadows(
True)
3786 viewSelectedShadedItem.setReceivesShadows(
True)
3788 container.add(viewSelectedShadedItem)
3790 userData = apiMeshHWSelectionUserData()
3791 userData.fMeshGeom = meshGeom
3792 userData.fInstanceIndex = instIdx
3793 viewSelectedShadedItem.setCustomData(userData)
3795 texturedName = self.sTexturedName + namePostfix
3796 viewSelectedTexturedItem = container.find(texturedName)
3797 if not viewSelectedTexturedItem:
3799 viewSelectedTexturedItem = omr.MRenderItem.create(texturedName, omr.MRenderItem.MaterialSceneItem, omr.MGeometry.kTriangles)
3801 viewSelectedTexturedItem.setDrawMode(omr.MGeometry.kTextured)
3802 viewSelectedTexturedItem.setExcludedFromPostEffects(
False)
3803 viewSelectedTexturedItem.setCastsShadows(
True)
3804 viewSelectedTexturedItem.setReceivesShadows(
True)
3805 container.add(viewSelectedTexturedItem)
3807 userData = apiMeshHWSelectionUserData()
3808 userData.fMeshGeom = meshGeom
3809 userData.fInstanceIndex = instIdx
3810 viewSelectedTexturedItem.setCustomData(userData)
3812 faceSelectionName = self.sFaceSelectionName + namePostfix
3813 viewSelectedFaceSelectionItem = container.find(faceSelectionName)
3814 if not viewSelectedFaceSelectionItem:
3816 viewSelectedFaceSelectionItem = omr.MRenderItem.create(faceSelectionName, omr.MRenderItem.DecorationItem, omr.MGeometry.kTriangles)
3819 viewSelectedFaceSelectionItem.setDrawMode(omr.MGeometry.kSelectionOnly)
3821 viewSelectedFaceSelectionItem.setSelectionMask(om.MSelectionMask.kSelectMeshFaces)
3823 viewSelectedFaceSelectionItem.setDepthPriority(omr.MRenderItem.sSelectionDepthPriority)
3824 viewSelectedFaceSelectionItem.setShader(self.fFaceComponentShader)
3825 container.add(viewSelectedFaceSelectionItem)
3827 userData = apiMeshHWSelectionUserData()
3828 userData.fMeshGeom = meshGeom
3829 userData.fInstanceIndex = instIdx
3830 viewSelectedFaceSelectionItem.setCustomData(userData)
3833 if (faceSelectionName
not in sViewSelectedFaceSelectionNames):
3834 omr.MDrawRegistry.registerComponentConverter(faceSelectionName, simpleComponentConverterSubsceneOverride.creatorFaceSelection)
3835 sViewSelectedFaceSelectionNames.add(faceSelectionName)
3840 for key
in self.fViewSelectedFaceInfoCache:
3842 faceInfo = self.fViewSelectedFaceInfoCache[key]
3843 isActiveView = viewName == activeViewName
3845 instIdxArray = set()
3846 for instIdx
in faceInfo:
3847 faceIdx = faceInfo[instIdx]
3848 if (faceIdx != sViewSelectedInstanceMark):
3849 instIdxArray.add(instIdx)
3851 for instIdx
in instIdxArray:
3852 namePostfix = self.sNameSeparator + str(instIdx) + self.sNameSeparator + viewName
3854 viewSelectedShadedItem = container.find(self.sShadedName + namePostfix)
3855 viewSelectedTexturedItem = container.find(self.sTexturedName + namePostfix)
3856 viewSelectedFaceSelectionItem = container.find(self.sFaceSelectionName + namePostfix)
3857 if (
not viewSelectedShadedItem
or not viewSelectedTexturedItem
or not viewSelectedFaceSelectionItem):
3861 viewSelectedShadedItem.enable(isActiveView)
3862 viewSelectedTexturedItem.enable(isActiveView)
3863 viewSelectedFaceSelectionItem.enable(isActiveView)
3866 instance = instances[instIdx]
3867 objToWorld = instance.inclusiveMatrix()
3868 viewSelectedShadedItem.setMatrix(objToWorld)
3869 viewSelectedTexturedItem.setMatrix(objToWorld)
3870 viewSelectedFaceSelectionItem.setMatrix(objToWorld)
3873 if (updateViewSelectedFaces
or updateMaterial
or updateGeometry):
3875 if (updateMaterial
or not viewSelectedShadedItem.isShaderFromNode()):
3877 userData = ShadedItemUserData(self)
3879 if shader
and viewSelectedShadedItem.setShaderFromNode2(shader, instance, apiMeshSubSceneOverride.shadedItemLinkLost, userData,
True):
3880 self.fLinkLostCallbackData.append(userData)
3882 viewSelectedShadedItem.setShader(self.fShadedShader)
3884 if (updateMaterial
or not viewSelectedTexturedItem.isShaderFromNode()):
3885 userData = ShadedItemUserData(self)
3887 if shader
and viewSelectedTexturedItem.setShaderFromNode2(shader, instance, apiMeshSubSceneOverride.shadedItemLinkLost, userData,
True):
3888 self.fLinkLostCallbackData.append(userData)
3890 viewSelectedTexturedItem.setShader(self.fShadedShader)
3892 shadedBuffers = omr.MVertexBufferArray()
3893 shadedBuffers.append(self.fPositionBuffer,
"positions")
3894 shadedBuffers.append(self.fNormalBuffer,
"normals")
3896 selectionBuffers = omr.MVertexBufferArray()
3897 selectionBuffers.append(self.fPositionBuffer,
"positions")
3900 for faceIdx
in range(meshGeom.faceCount):
3901 faceStates.append(
False)
3903 faceIds = faceInfo[instIdx]
3904 for faceIdx
in faceIds:
3905 if (faceIdx != sViewSelectedInstanceMark):
3906 faceStates[faceIdx] =
True
3909 for faceIdx
in range(meshGeom.faceCount):
3910 numVerts = meshGeom.face_counts[faceIdx]
3912 if faceStates[faceIdx]:
3913 numTriangles += numVerts - 2
3915 indexBuffer = omr.MIndexBuffer(omr.MGeometry.kUnsignedInt32)
3916 bufferSize = numTriangles * 3
3918 dataAddress = indexBuffer.acquire(bufferSize,
True)
3920 data = (ctypes.c_uint * bufferSize).from_address(dataAddress)
3924 for faceIdx
in range(meshGeom.faceCount):
3926 numVerts = meshGeom.face_counts[faceIdx]
3928 if (faceStates[faceIdx]):
3929 for v
in range(1, numVerts - 1):
3930 data[idx] = meshGeom.face_connects[base]
3932 data[idx] = meshGeom.face_connects[base + v]
3934 data[idx] = meshGeom.face_connects[base + v + 1]
3937 indexBuffer.commit(dataAddress)
3940 bounds = self.fMesh.boundingBox()
3941 self.setGeometryForRenderItem(viewSelectedShadedItem, shadedBuffers, indexBuffer, bounds)
3942 self.setGeometryForRenderItem(viewSelectedTexturedItem, shadedBuffers, indexBuffer, bounds)
3943 self.setGeometryForRenderItem(viewSelectedFaceSelectionItem, selectionBuffers, indexBuffer, bounds)
3946 userData = viewSelectedShadedItem.getCustomData()
3947 if userData
and isinstance(userData, apiMeshHWSelectionUserData):
3948 userData.fMeshGeom = meshGeom
3950 userData = viewSelectedTexturedItem.getCustomData()
3951 if userData
and isinstance(userData, apiMeshHWSelectionUserData):
3952 userData.fMeshGeom = meshGeom
3954 userData = viewSelectedFaceSelectionItem.getCustomData()
3955 if userData
and isinstance(userData, apiMeshHWSelectionUserData):
3956 userData.fMeshGeom = meshGeom
3957 userData.fFaceViewSelectedStates = faceStates
3959 def rebuildGeometryBuffers(self):
3961 meshGeom = self.fMesh.meshGeom()
3964 bounds = self.fMesh.boundingBox()
3967 self.clearGeometryBuffers()
3972 totalPoints = len(meshGeom.vertices)
3973 for i
in range(meshGeom.faceCount):
3974 numVerts = meshGeom.face_counts[i]
3976 numTriangles += numVerts - 2
3977 totalVerts += numVerts
3980 posDesc = omr.MVertexBufferDescriptor(
"", omr.MGeometry.kPosition, omr.MGeometry.kFloat, 3)
3981 normalDesc = omr.MVertexBufferDescriptor(
"", omr.MGeometry.kNormal, omr.MGeometry.kFloat, 3)
3983 self.fPositionBuffer = omr.MVertexBuffer(posDesc)
3984 self.fNormalBuffer = omr.MVertexBuffer(normalDesc)
3985 self.fBoxPositionBuffer = omr.MVertexBuffer(posDesc)
3987 positionDataAddress = self.fPositionBuffer.acquire(totalPoints,
True)
3988 normalDataAddress = self.fNormalBuffer.acquire(totalPoints,
True)
3989 boxPositionDataAddress = self.fBoxPositionBuffer.acquire(8,
True)
3992 self.fWireIndexBuffer = omr.MIndexBuffer(omr.MGeometry.kUnsignedInt32)
3993 self.fBoxIndexBuffer = omr.MIndexBuffer(omr.MGeometry.kUnsignedInt32)
3994 self.fShadedIndexBuffer = omr.MIndexBuffer(omr.MGeometry.kUnsignedInt32)
3996 wireBufferDataAddress = self.fWireIndexBuffer.acquire(2*totalVerts,
True)
3997 boxBufferDataAddress = self.fBoxIndexBuffer.acquire(24,
True)
3998 shadedBufferDataAddress = self.fShadedIndexBuffer.acquire(3*numTriangles,
True)
4001 if not all((positionDataAddress, normalDataAddress, boxPositionDataAddress, wireBufferDataAddress, boxBufferDataAddress, shadedBufferDataAddress)):
4002 self.clearGeometryBuffers()
4005 positionData = ((ctypes.c_float * 3)*totalPoints).from_address(positionDataAddress)
4006 normalData = ((ctypes.c_float * 3)*totalPoints).from_address(normalDataAddress)
4007 boxPositionData = ((ctypes.c_float * 3)*8).from_address(boxPositionDataAddress)
4009 wireBufferData = (ctypes.c_uint * (2*totalVerts)).from_address(wireBufferDataAddress)
4010 boxBufferData = (ctypes.c_uint * 24).from_address(boxBufferDataAddress)
4011 shadedBufferData = ((ctypes.c_uint * 3)*numTriangles).from_address(shadedBufferDataAddress)
4014 for vid,position
in enumerate(meshGeom.vertices):
4015 positionData[vid][0] = position[0]
4016 positionData[vid][1] = position[1]
4017 positionData[vid][2] = position[2]
4019 for vid,normal
in enumerate(meshGeom.normals):
4020 normalData[vid][0] = normal[0]
4021 normalData[vid][1] = normal[1]
4022 normalData[vid][2] = normal[2]
4024 self.fPositionBuffer.commit(positionDataAddress)
4025 positionDataAddress =
None
4026 self.fNormalBuffer.commit(normalDataAddress)
4027 normalDataAddress =
None
4032 boxPositionData[0][0] = bbmin.x
4033 boxPositionData[0][1] = bbmin.y
4034 boxPositionData[0][2] = bbmin.z
4036 boxPositionData[1][0] = bbmin.x
4037 boxPositionData[1][1] = bbmin.y
4038 boxPositionData[1][2] = bbmax.z
4040 boxPositionData[2][0] = bbmax.x
4041 boxPositionData[2][1] = bbmin.y
4042 boxPositionData[2][2] = bbmax.z
4044 boxPositionData[3][0] = bbmax.x
4045 boxPositionData[3][1] = bbmin.y
4046 boxPositionData[3][2] = bbmin.z
4048 boxPositionData[4][0] = bbmin.x
4049 boxPositionData[4][1] = bbmax.y
4050 boxPositionData[4][2] = bbmin.z
4052 boxPositionData[5][0] = bbmin.x
4053 boxPositionData[5][1] = bbmax.y
4054 boxPositionData[5][2] = bbmax.z
4056 boxPositionData[6][0] = bbmax.x
4057 boxPositionData[6][1] = bbmax.y
4058 boxPositionData[6][2] = bbmax.z
4060 boxPositionData[7][0] = bbmax.x
4061 boxPositionData[7][1] = bbmax.y
4062 boxPositionData[7][2] = bbmin.z
4064 self.fBoxPositionBuffer.commit(boxPositionDataAddress)
4065 boxPositionDataAddress =
None
4071 for i
in range(meshGeom.faceCount):
4073 numVerts = meshGeom.face_counts[i]
4076 for v
in range(numVerts-1):
4077 wireBufferData[idx] = meshGeom.face_connects[vid]
4080 wireBufferData[idx] = meshGeom.face_connects[vid]
4083 wireBufferData[idx] = meshGeom.face_connects[vid]
4086 wireBufferData[idx] = meshGeom.face_connects[first]
4092 self.fWireIndexBuffer.commit(wireBufferDataAddress)
4093 wireBufferDataAddress =
None
4096 indexData = [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ]
4098 boxBufferData[i] = indexData[i]
4100 self.fBoxIndexBuffer.commit(boxBufferDataAddress)
4101 boxBufferDataAddress =
None
4106 for i
in range(meshGeom.faceCount):
4108 numVerts = meshGeom.face_counts[i]
4110 for v
in range(1, numVerts-1):
4111 shadedBufferData[idx][0] = meshGeom.face_connects[base]
4112 shadedBufferData[idx][1] = meshGeom.face_connects[base+v]
4113 shadedBufferData[idx][2] = meshGeom.face_connects[base+v+1]
4118 self.fShadedIndexBuffer.commit(shadedBufferDataAddress)
4119 shadedBufferDataAddress =
None
4121 def rebuildActiveComponentIndexBuffers(self):
4123 meshGeom = self.fMesh.meshGeom()
4128 self.clearActiveComponentIndexBuffers()
4131 numActiveVertices = len(self.fActiveVerticesSet)
4132 if numActiveVertices > 0:
4133 self.fActiveVerticesIndexBuffer = omr.MIndexBuffer(omr.MGeometry.kUnsignedInt32)
4134 activeVerticesDataAddress = self.fActiveVerticesIndexBuffer.acquire(numActiveVertices,
True)
4135 if activeVerticesDataAddress:
4136 activeVerticesData = (ctypes.c_uint*numActiveVertices).from_address(activeVerticesDataAddress)
4139 for vid
in self.fActiveVerticesSet:
4140 activeVerticesData[idx] = vid
4143 self.fActiveVerticesIndexBuffer.commit(activeVerticesDataAddress)
4144 activeVerticesDataAddress =
None
4147 numActiveEdges = len(self.fActiveEdgesSet)
4148 if numActiveEdges > 0:
4149 self.fActiveEdgesIndexBuffer = omr.MIndexBuffer(omr.MGeometry.kUnsignedInt32)
4150 activeEdgesDataAddress = self.fActiveEdgesIndexBuffer.acquire(2*numActiveEdges,
True)
4151 if activeEdgesDataAddress:
4152 activeEdgesData = ((ctypes.c_uint * 2)*numActiveEdges).from_address(activeEdgesDataAddress)
4158 for i
in range(meshGeom.faceCount):
4160 numVerts = meshGeom.face_counts[i]
4163 for v
in range(numVerts-1):
4164 if eid
in self.fActiveEdgesSet:
4165 activeEdgesData[idx][0] = meshGeom.face_connects[vid]
4166 activeEdgesData[idx][1] = meshGeom.face_connects[vid + 1]
4171 if eid
in self.fActiveEdgesSet:
4172 activeEdgesData[idx][0] = meshGeom.face_connects[vid]
4173 activeEdgesData[idx][1] = meshGeom.face_connects[first]
4180 self.fActiveEdgesIndexBuffer.commit(activeEdgesDataAddress)
4181 activeEdgesDataAddress =
None
4184 numActiveFaces = len(self.fActiveFacesSet)
4185 if numActiveFaces > 0:
4186 numActiveFacesTriangles = 0
4187 for i
in range(meshGeom.faceCount):
4188 if i
in self.fActiveFacesSet:
4189 numVerts = meshGeom.face_counts[i]
4191 numActiveFacesTriangles += numVerts - 2
4193 self.fActiveFacesIndexBuffer = omr.MIndexBuffer(omr.MGeometry.kUnsignedInt32)
4194 activeFacesDataAddress = self.fActiveFacesIndexBuffer.acquire(3*numActiveFacesTriangles,
True)
4195 if activeFacesDataAddress:
4196 activeFacesData = ((ctypes.c_uint * 3)*numActiveFacesTriangles).from_address(activeFacesDataAddress)
4200 for i
in range(meshGeom.faceCount):
4201 numVerts = meshGeom.face_counts[i]
4203 if i
in self.fActiveFacesSet:
4204 for v
in range(1, numVerts-1):
4205 activeFacesData[idx][0] = meshGeom.face_connects[vid]
4206 activeFacesData[idx][1] = meshGeom.face_connects[vid+v]
4207 activeFacesData[idx][2] = meshGeom.face_connects[vid+v+1]
4212 self.fActiveFacesIndexBuffer.commit(activeFacesDataAddress)
4213 activeFacesDataAddress =
None
4215 def clearBuffers(self):
4216 self.clearGeometryBuffers()
4217 self.clearActiveComponentIndexBuffers()
4219 def clearGeometryBuffers(self):
4220 self.fPositionBuffer =
None
4221 self.fNormalBuffer =
None
4222 self.fBoxPositionBuffer =
None
4223 self.fWireIndexBuffer =
None
4224 self.fBoxIndexBuffer =
None
4225 self.fShadedIndexBuffer =
None
4227 def clearActiveComponentIndexBuffers(self):
4228 self.fActiveVerticesIndexBuffer =
None
4229 self.fActiveEdgesIndexBuffer =
None
4230 self.fActiveFacesIndexBuffer =
None
4232 def updateSelectionGranularity(self, path, selectionContext):
4243 displayStatus = omr.MGeometryUtilities.displayStatus(path)
4244 if displayStatus == omr.MGeometryUtilities.kHilite:
4246 globalComponentMask = om.MGlobal.objectSelectionMask()
4247 if om.MGlobal.selectionMode() == om.MGlobal.kSelectComponentMode:
4248 globalComponentMask = om.MGlobal.componentSelectionMask()
4250 supportedComponentMask = om.MSelectionMask( om.MSelectionMask.kSelectMeshVerts )
4251 supportedComponentMask.addMask( om.MSelectionMask.kSelectMeshEdges )
4252 supportedComponentMask.addMask( om.MSelectionMask.kSelectMeshFaces )
4253 supportedComponentMask.addMask( om.MSelectionMask.kSelectPointsForGravity )
4255 if globalComponentMask.intersects(supportedComponentMask):
4256 selectionContext.selectionLevel = omr.MSelectionContext.kComponent
4257 elif omr.MPxSubSceneOverride.pointSnappingActive():
4258 selectionContext.selectionLevel = omr.MSelectionContext.kComponent
4260 def getSelectionPath(self, renderItem, dagPath):
4261 node = om.MFnDagNode(self.fObject)
4265 instances = node.getAllPaths()
4266 if not instances
or len(instances) == 0:
4269 dagPath.set(instances[0])
4272 def getInstancedSelectionPath(self, renderItem, intersection, dagPath):
4273 node = om.MFnDagNode(self.fObject)
4277 instances = node.getAllPaths()
4278 instanceCount = len(instances)
4279 if not instances
or instanceCount == 0:
4282 instanceId = intersection.instanceID
4285 if(instanceCount == 1
or instanceId == -1):
4287 userData = renderItem.getCustomData()
4289 isinstance(userData, apiMeshHWSelectionUserData)
and
4290 userData.fInstanceIndex >= 0
and
4291 userData.fInstanceIndex < instanceCount):
4292 instanceId = userData.fInstanceIndex
4294 dagPath.set(instances[instanceId])
4301 elif(instanceId >=1
and instanceId <= instanceCount):
4302 view = omui.M3dView.active3dView()
4303 if view.viewIsFiltered():
4305 viewSelectedList = view.filteredObjectList()
4306 if viewSelectedList:
4307 for instIdx
in range(instanceCount):
4308 instance = instances[instIdx]
4309 if instance.isValid()
and instance.isVisible():
4310 intersectionList = om.MSelectionList()
4312 intersectionList.add(instance)
4313 intersectionList.intersect(viewSelectedList,
True)
4315 selectionIt = om.MItSelectionList(intersectionList)
4316 while not selectionIt.isDone():
4317 comp = selectionIt.getComponent()[1]
4320 instanceId = instanceId - 1
4322 dagPath.set(instance)
4326 for instIdx
in range(instanceCount):
4327 instance = instances[instIdx]
4328 if (instance.isValid()
and instance.isVisible()):
4329 instanceId = instanceId - 1
4330 if (instanceId == 0):
4331 dagPath.set(instance)
4345 class apiMeshUserData(om.MUserData):
4347 om.MUserData.__init__(self, legacy=
False)
4349 self.fNumModifications = 0
4352 def callbackDataPrint(context, renderItemList):
4353 for item
in renderItemList:
4355 path = item.sourceDagPath()
4356 print(
"\tITEM: '" + item.name() +
"' -- SOURCE: '" + path.fullPathName() +
"'")
4358 passCtx = context.getPassContext()
4359 passId = passCtx.passIdentifier()
4360 passSem = passCtx.passSemantics()
4361 print(
"\tAPI mesh drawing in pass[" + passId +
"], semantic[" + passSem +
"]")
4364 def apiMeshPreDrawCallback(context, renderItemList, shaderInstance):
4365 print(
"PRE-draw callback triggered for render item list with data:")
4366 callbackDataPrint(context, renderItemList)
4369 def apiMeshPostDrawCallback(context, renderItemList, shaderInstance):
4370 print(
"POST-draw callback triggered for render item list with data:")
4371 callbackDataPrint(context, renderItemList)
4375 class meshVertComponentConverterGeometryOverride(omr.MPxComponentConverter):
4377 omr.MPxComponentConverter.__init__(self)
4379 self.fComponent = om.MFnSingleIndexedComponent()
4380 self.fComponentObject = om.MObject.kNullObj
4383 def initialize(self, renderItem):
4385 self.fComponentObject = self.fComponent.create( om.MFn.kMeshVertComponent )
4391 selectionData = renderItem.getCustomData()
4392 if isinstance(selectionData, apiMeshHWSelectionUserData):
4393 meshGeom = selectionData.fMeshGeom
4397 for i
in range(meshGeom.faceCount):
4398 numVerts = meshGeom.face_counts[i]
4400 numTriangles += numVerts - 2
4401 self.fVertices = [0]*(3*numTriangles)
4406 for faceIdx
in range(meshGeom.faceCount):
4408 numVerts = meshGeom.face_counts[faceIdx]
4410 for v
in range(1, numVerts-1):
4411 self.fVertices[idx] = meshGeom.face_connects[base]
4412 self.fVertices[idx+1] = meshGeom.face_connects[base+v]
4413 self.fVertices[idx+2] = meshGeom.face_connects[base+v+1]
4417 def addIntersection(self, intersection):
4420 rawIdx = intersection.index
4422 if rawIdx >= 0
and rawIdx < len(self.fVertices):
4423 idx = self.fVertices[rawIdx]
4424 self.fComponent.addElement(idx)
4426 def component(self):
4428 return self.fComponentObject
4430 def selectionMask(self):
4432 mask = om.MSelectionMask(om.MSelectionMask.kSelectMeshVerts)
4433 mask.addMask(om.MSelectionMask.kSelectPointsForGravity)
4438 return meshVertComponentConverterGeometryOverride()
4442 class meshEdgeComponentConverterGeometryOverride(omr.MPxComponentConverter):
4444 omr.MPxComponentConverter.__init__(self)
4446 self.fComponent = om.MFnSingleIndexedComponent()
4447 self.fComponentObject = om.MObject.kNullObj
4450 def initialize(self, renderItem):
4452 self.fComponentObject = self.fComponent.create( om.MFn.kMeshEdgeComponent )
4464 selectionData = renderItem.getCustomData()
4465 if isinstance(selectionData, apiMeshHWSelectionUserData):
4466 meshGeom = selectionData.fMeshGeom
4470 for i
in range(meshGeom.faceCount):
4471 numVerts = meshGeom.face_counts[i]
4473 totalVerts += numVerts
4474 self.fEdges = [0]*(totalVerts)
4479 for faceIdx
in range(meshGeom.faceCount):
4481 numVerts = meshGeom.face_counts[faceIdx]
4483 for v
in range(numVerts):
4484 self.fEdges[idx] = edgeId
4488 def addIntersection(self, intersection):
4491 rawIdx = intersection.index
4493 if rawIdx >= 0
and rawIdx < len(self.fEdges):
4494 idx = self.fEdges[rawIdx]
4495 self.fComponent.addElement(idx)
4497 def component(self):
4499 return self.fComponentObject
4501 def selectionMask(self):
4503 return om.MSelectionMask(om.MSelectionMask.kSelectMeshEdges)
4507 return meshEdgeComponentConverterGeometryOverride()
4511 class meshFaceComponentConverterGeometryOverride(omr.MPxComponentConverter):
4513 omr.MPxComponentConverter.__init__(self)
4515 self.fComponent = om.MFnSingleIndexedComponent()
4516 self.fComponentObject = om.MObject.kNullObj
4519 def initialize(self, renderItem):
4521 self.fComponentObject = self.fComponent.create( om.MFn.kMeshPolygonComponent )
4533 selectionData = renderItem.getCustomData()
4534 if isinstance(selectionData, apiMeshHWSelectionUserData):
4535 meshGeom = selectionData.fMeshGeom
4538 isolateSelect = renderItem.isIsolateSelectCopy()
4541 enableFaces = [0] * meshGeom.faceCount
4542 for i
in range(meshGeom.faceCount):
4543 enableFaces[i] =
False
4545 fnComponent = om.MFnSingleIndexedComponent( renderItem.shadingComponent() )
4546 if(fnComponent.componentType == om.MFn.kMeshPolygonComponent):
4547 faceIds = fnComponent.getElements()
4549 for i
in range(len(faceIds)):
4550 enableFaces[faceIds[i]] =
True
4554 for i
in range(meshGeom.faceCount):
4555 numVerts = meshGeom.face_counts[i]
4557 if(
not isolateSelect
or enableFaces[i]):
4558 numTriangles += numVerts - 2
4560 self.fFaces = [0]*numTriangles
4564 for faceIdx
in range(meshGeom.faceCount):
4566 numVerts = meshGeom.face_counts[faceIdx]
4568 if(
not isolateSelect
or enableFaces[faceIdx]):
4569 for v
in range(1, numVerts-1):
4570 self.fFaces[idx] = faceIdx
4575 def addIntersection(self, intersection):
4578 rawIdx = intersection.index
4580 if rawIdx >= 0
and rawIdx < len(self.fFaces):
4581 idx = self.fFaces[rawIdx]
4582 self.fComponent.addElement(idx)
4584 def component(self):
4586 return self.fComponentObject
4588 def selectionMask(self):
4590 return om.MSelectionMask(om.MSelectionMask.kSelectMeshFaces)
4594 return meshFaceComponentConverterGeometryOverride()
4596 class apiMeshGeometryOverride(omr.MPxGeometryOverride):
4598 sWireframeItemName =
"apiMeshWire_py"
4599 sShadedTemplateItemName =
"apiMeshShadedTemplateWire_py"
4600 sSelectedWireframeItemName =
"apiMeshSelectedWireFrame_py"
4601 sVertexItemName =
"apiMeshVertices_py"
4602 sEdgeSelectionItemName =
"apiMeshEdgeSelection_py"
4603 sFaceSelectionItemName =
"apiMeshFaceSelection_py"
4604 sActiveVertexItemName =
"apiMeshActiveVertices_py"
4605 sVertexIdItemName =
"apiMeshVertexIds_py"
4606 sVertexPositionItemName =
"apiMeshVertexPositions_py"
4607 sShadedModeFaceCenterItemName =
"apiMeshFaceCenterInShadedMode_py"
4608 sWireframeModeFaceCenterItemName =
"apiMeshFaceCenterInWireframeMode_py"
4609 sShadedProxyItemName =
"apiShadedProxy_py"
4610 sAffectedEdgeItemName =
"apiMeshAffectedEdges_py"
4611 sAffectedFaceItemName =
"apiMeshAffectedFaces_py"
4612 sActiveVertexStreamName =
"apiMeshSharedVertexStream_py"
4613 sFaceCenterStreamName =
"apiMeshFaceCenterStream_py"
4617 return apiMeshGeometryOverride(obj)
4619 def __init__(self, obj):
4620 omr.MPxGeometryOverride.__init__(self, obj)
4622 node = om.MFnDependencyNode(obj)
4623 self.fMesh = node.userNode()
4624 self.fMeshGeom =
None
4625 self.fColorRemapTexture =
None
4627 self.fActiveVertices = om.MIntArray()
4628 self.fActiveVerticesSet = set()
4629 self.fActiveEdgesSet = set()
4630 self.fActiveFacesSet = set()
4631 self.fCastsShadows =
False
4632 self.fReceivesShadows =
False
4634 self.fEnableNumericDisplay =
False
4640 self.fDrawSharedActiveVertices =
True
4642 self.fDrawActiveVerticesWithRamp =
False
4643 self.fLinearSampler =
None
4646 self.fDrawFaceCenters =
True
4648 if self.fDrawActiveVerticesWithRamp:
4649 self.fDrawFaceCenters =
False
4654 self.fUseCustomColors =
False
4665 self.fProxyShader = omr.MShaderManager.k3dCPVThickDashLineShader
4669 self.fInternalItems_NoShadowCast =
False
4670 self.fInternalItems_NoShadowReceive =
False
4671 self.fInternalItems_NoPostEffects =
False
4675 self.fExternalItems_NoShadowCast =
False
4676 self.fExternalItems_NoShadowReceive =
False
4677 self.fExternalItemsNonTri_NoShadowCast =
False
4678 self.fExternalItemsNonTri_NoShadowReceive =
False
4682 self.fExternalItems_NoPostEffects =
True
4683 self.fExternalItemsNonTri_NoPostEffects =
True
4687 self.fMeshGeom =
None
4689 if self.fColorRemapTexture:
4690 textureMgr = omr.MRenderer.getTextureManager()
4692 textureMgr.releaseTexture(self.fColorRemapTexture)
4693 self.fColorRemapTexture =
None
4695 if self.fLinearSampler:
4696 omr.MStateManager.releaseSamplerState(self.fLinearSampler)
4697 self.fLinearSampler =
None
4699 def supportedDrawAPIs(self):
4701 return omr.MRenderer.kOpenGL | omr.MRenderer.kDirectX11 | omr.MRenderer.kOpenGLCoreProfile
4706 self.fActiveVertices.clear()
4707 self.fActiveVerticesSet = set()
4708 self.fActiveEdgesSet = set()
4709 self.fActiveFacesSet = set()
4711 self.fMeshGeom = self.fMesh.meshGeom()
4713 if self.fMeshGeom
and self.fMesh.hasActiveComponents():
4714 activeComponents = self.fMesh.activeComponents()
4715 if len(activeComponents) > 0:
4716 fnComponent = om.MFnSingleIndexedComponent( activeComponents[0] )
4717 if fnComponent.elementCount > 0:
4718 activeIds = fnComponent.getElements()
4720 if fnComponent.componentType == om.MFn.kMeshVertComponent:
4721 self.fActiveVertices = activeIds
4722 self.fActiveVerticesSet = set(activeIds)
4724 elif fnComponent.componentType == om.MFn.kMeshEdgeComponent:
4725 self.fActiveEdgesSet = set(activeIds)
4727 elif fnComponent.componentType == om.MFn.kMeshPolygonComponent:
4728 self.fActiveFacesSet = set(activeIds)
4730 def updateRenderItems(self, path, list):
4734 shaderMgr = omr.MRenderer.getShaderManager()
4738 dagNode = om.MFnDagNode(path)
4739 castsShadowsPlug = dagNode.findPlug(
"castsShadows",
False)
4740 self.fCastsShadows = castsShadowsPlug.asBool()
4741 receiveShadowsPlug = dagNode.findPlug(
"receiveShadows",
False)
4742 self.fReceivesShadows = receiveShadowsPlug.asBool()
4743 enableNumericDisplayPlug = dagNode.findPlug(
"enableNumericDisplay",
False)
4744 self.fEnableNumericDisplay = enableNumericDisplayPlug.asBool()
4747 self.updateDormantAndTemplateWireframeItems(path, list, shaderMgr)
4748 self.updateActiveWireframeItem(path, list, shaderMgr)
4751 self.updateDormantVerticesItem(path, list, shaderMgr)
4752 self.updateActiveVerticesItem(path, list, shaderMgr)
4755 self.updateVertexNumericItems(path, list, shaderMgr)
4758 if self.fDrawFaceCenters:
4759 self.updateWireframeModeFaceCenterItem(path, list, shaderMgr)
4760 self.updateShadedModeFaceCenterItem(path, list, shaderMgr)
4763 self.updateAffectedComponentItems(path, list, shaderMgr)
4766 self.updateSelectionComponentItems(path, list, shaderMgr)
4769 self.updateProxyShadedItem(path, list, shaderMgr)
4775 testShadedOverrides = self.fInternalItems_NoShadowCast
or self.fInternalItems_NoShadowReceive
or self.fInternalItems_NoPostEffects
4776 if testShadedOverrides:
4781 drawMode = item.drawMode()
4782 if drawMode == omr.MGeometry.kShaded
or drawMode == omr.MGeometry.kTextured:
4783 if item.name() != self.sShadedTemplateItemName:
4784 item.setCastsShadows(
not self.fInternalItems_NoShadowCast
and self.fCastsShadows )
4785 item.setReceivesShadows(
not self.fInternalItems_NoShadowReceive
and self.fReceivesShadows )
4786 item.setExcludedFromPostEffects( self.fInternalItems_NoPostEffects )
4788 def populateGeometry(self, requirements, renderItems, data):
4799 if self.fMeshGeom ==
None:
4800 raise RuntimeError(
"populateGeometry : invalid fMeshGeom")
4802 debugPopulateGeometry =
False
4803 if debugPopulateGeometry:
4804 print(
"> Begin populate geometry")
4807 activeVertexCount = len(self.fActiveVertices)
4812 for i
in range(self.fMeshGeom.faceCount):
4813 numVerts = self.fMeshGeom.face_counts[i]
4815 numTriangles += numVerts - 2
4816 totalVerts += numVerts
4819 self.updateGeometryRequirements(requirements, data, activeVertexCount, totalVerts, debugPopulateGeometry)
4822 wireIndexBuffer =
None
4824 for item
in renderItems:
4833 itemBuffers = item.requiredVertexBuffers()
4834 for desc
in itemBuffers:
4835 print(
"Buffer Required for Item '" + item.name() +
"':")
4836 print(
"\tBufferName: " + desc.name)
4837 print(
"\tDataType: " + omr.MGeometry.dataTypeString(desc.dataType) +
" (dimension " + str(desc.dimension) +
")")
4838 print(
"\tSemantic: " + omr.MGeometry.semanticString(desc.semantic))
4843 myCustomData = item.getCustomData()
4844 if isinstance(myCustomData, apiMeshUserData):
4845 print(
"Custom data '" + myCustomData.fMessage +
"', modified count='" + str(myCustomData.fNumModifications) +
"'")
4847 print(
"No custom data")
4851 if item.name() == self.sActiveVertexItemName:
4852 self.updateIndexingForVertices( item, data, numTriangles, activeVertexCount, debugPopulateGeometry)
4856 if self.fDrawFaceCenters
and (item.name() == self.sShadedModeFaceCenterItemName
or item.name() == self.sWireframeModeFaceCenterItemName):
4857 self.updateIndexingForFaceCenters( item, data, debugPopulateGeometry)
4861 elif item.name() == self.sVertexItemName
or item.name() == self.sVertexIdItemName
or item.name() == self.sVertexPositionItemName:
4862 self.updateIndexingForDormantVertices( item, data, numTriangles )
4866 elif item.name() == self.sWireframeItemName
or item.name() == self.sShadedTemplateItemName
or item.name() == self.sSelectedWireframeItemName
or (item.primitive() != omr.MGeometry.kTriangles
and item.name() == self.sShadedProxyItemName):
4867 self.updateIndexingForWireframeItems(wireIndexBuffer, item, data, totalVerts)
4873 elif item.name() == self.sAffectedEdgeItemName:
4874 self.updateIndexingForEdges(item, data, totalVerts,
True)
4875 elif item.name() == self.sEdgeSelectionItemName:
4876 self.updateIndexingForEdges(item, data, totalVerts,
False)
4882 elif item.name() == self.sAffectedFaceItemName:
4883 self.updateIndexingForFaces(item, data, numTriangles,
True)
4884 elif item.name() == self.sFaceSelectionItemName:
4885 self.updateIndexingForFaces(item, data, numTriangles,
False)
4889 elif item.primitive() == omr.MGeometry.kTriangles:
4890 self.updateIndexingForShadedTriangles(item, data, numTriangles)
4892 if debugPopulateGeometry:
4893 print(
"> End populate geometry")
4896 self.fMeshGeom =
None
4897 self.fActiveVertices.clear()
4898 self.fActiveVerticesSet = set()
4899 self.fActiveEdgesSet = set()
4900 self.fActiveFacesSet = set()
4902 def updateSelectionGranularity(self, path, selectionContext):
4914 displayStatus = omr.MGeometryUtilities.displayStatus(path)
4915 if displayStatus == omr.MGeometryUtilities.kHilite:
4917 globalComponentMask = om.MGlobal.objectSelectionMask()
4918 if om.MGlobal.selectionMode() == om.MGlobal.kSelectComponentMode:
4919 globalComponentMask = om.MGlobal.componentSelectionMask()
4921 supportedComponentMask = om.MSelectionMask( om.MSelectionMask.kSelectMeshVerts )
4922 supportedComponentMask.addMask( om.MSelectionMask.kSelectMeshEdges )
4923 supportedComponentMask.addMask( om.MSelectionMask.kSelectMeshFaces )
4924 supportedComponentMask.addMask( om.MSelectionMask.kSelectPointsForGravity )
4926 if globalComponentMask.intersects(supportedComponentMask):
4927 selectionContext.selectionLevel = omr.MSelectionContext.kComponent
4928 elif omr.MPxGeometryOverride.pointSnappingActive():
4929 selectionContext.selectionLevel = omr.MSelectionContext.kComponent
4931 def printShader(self, shader):
4936 params = shader.parameterList()
4937 print(
"DEBUGGING SHADER, BEGIN PARAM LIST OF LENGTH " + str(len(params)))
4939 for param
in params:
4940 paramType = shader.parameterType(param)
4941 isArray = shader.isArrayParameter(param)
4943 typeAsStr =
"Unknown"
4944 if paramType == omr.MShaderInstance.kInvalid:
4945 typeAsStr =
"Invalid"
4946 elif paramType == omr.MShaderInstance.kBoolean:
4947 typeAsStr =
"Boolean"
4948 elif paramType == omr.MShaderInstance.kInteger:
4949 typeAsStr =
"Integer"
4950 elif paramType == omr.MShaderInstance.kFloat:
4952 elif paramType == omr.MShaderInstance.kFloat2:
4953 typeAsStr =
"Float2"
4954 elif paramType == omr.MShaderInstance.kFloat3:
4955 typeAsStr =
"Float3"
4956 elif paramType == omr.MShaderInstance.kFloat4:
4957 typeAsStr =
"Float4"
4958 elif paramType == omr.MShaderInstance.kFloat4x4Row:
4959 typeAsStr =
"Float4x4Row"
4960 elif paramType == omr.MShaderInstance.kFloat4x4Col:
4961 typeAsStr =
"Float4x4Col"
4962 elif paramType == omr.MShaderInstance.kTexture1:
4963 typeAsStr =
"1D Texture"
4964 elif paramType == omr.MShaderInstance.kTexture2:
4965 typeAsStr =
"2D Texture"
4966 elif paramType == omr.MShaderInstance.kTexture3:
4967 typeAsStr =
"3D Texture"
4968 elif paramType == omr.MShaderInstance.kTextureCube:
4969 typeAsStr =
"Cube Texture"
4970 elif paramType == omr.MShaderInstance.kSampler:
4971 typeAsStr =
"Sampler"
4973 print(
"ParamName='" + param +
"', ParamType='" + typeAsStr +
"', IsArrayParameter:'" + str(isArray) +
"'")
4975 print(
"END PARAM LIST")
4977 def setSolidColor(self, shaderInstance, defaultColor, customColor=None):
4980 color = defaultColor
4981 if self.fUseCustomColors
and customColor:
4984 shaderInstance.setParameter(
"solidColor", color)
4988 def setSolidPointSize(self, shaderInstance, size):
4992 shaderInstance.setParameter(
"pointSize", [size, size])
4996 def setLineWidth(self, shaderInstance, width):
5000 shaderInstance.setParameter(
"lineWidth", [width, width])
5004 def enableActiveComponentDisplay(self, path):
5016 displayStatus = omr.MGeometryUtilities.displayStatus(path)
5017 if displayStatus == omr.MGeometryUtilities.kHilite
or displayStatus == omr.MGeometryUtilities.kActiveComponent:
5023 if path.isTemplated():
5029 def updateDormantAndTemplateWireframeItems(self, path, list, shaderMgr):
5041 dormantColor = [ 0.0, 0.0, 1.0, 1.0 ]
5042 templateColor = [ 0.45, 0.45, 0.45, 1.0 ]
5043 activeTemplateColor = [ 1.0, 0.5, 0.5, 1.0 ]
5052 wireframeItem =
None
5053 index = list.indexOf(self.sWireframeItemName)
5055 wireframeItem = omr.MRenderItem.create( self.sWireframeItemName, omr.MRenderItem.DecorationItem, omr.MGeometry.kLines)
5056 wireframeItem.setDrawMode(omr.MGeometry.kWireframe)
5060 wireframeItem.setDepthPriority( omr.MRenderItem.sDormantWireDepthPriority )
5062 list.append(wireframeItem)
5067 preCb = apiMeshPreDrawCallback
5068 postCb = apiMeshPostDrawCallback
5070 shader = shaderMgr.getStockShader(omr.MShaderManager.k3dSolidShader, preCb, postCb)
5073 wireframeItem.setShader(shader)
5077 self.printShader( shader )
5080 shaderMgr.releaseShader(shader)
5082 wireframeItem = list[index]
5086 shadedTemplateItem =
None
5087 index = list.indexOf(self.sShadedTemplateItemName)
5089 shadedTemplateItem = omr.MRenderItem.create( self.sShadedTemplateItemName, omr.MRenderItem.DecorationItem, omr.MGeometry.kLines)
5090 shadedTemplateItem.setDrawMode(omr.MGeometry.kAll)
5094 shadedTemplateItem.setDepthPriority( omr.MRenderItem.sDormantWireDepthPriority )
5096 list.append(shadedTemplateItem)
5098 shader = shaderMgr.getStockShader(omr.MShaderManager.k3dSolidShader)
5101 shadedTemplateItem.setShader(shader)
5105 self.printShader( shader )
5108 shaderMgr.releaseShader(shader)
5110 shadedTemplateItem = list[index]
5113 shadedTemplateItem.setCastsShadows(
not self.fExternalItemsNonTri_NoShadowCast )
5114 shadedTemplateItem.setReceivesShadows(
not self.fExternalItemsNonTri_NoShadowReceive )
5115 shadedTemplateItem.setExcludedFromPostEffects( self.fExternalItemsNonTri_NoPostEffects )
5117 displayStatus = omr.MGeometryUtilities.displayStatus(path)
5118 wireColor = omr.MGeometryUtilities.wireframeColor(path)
5123 shader = wireframeItem.getShader()
5125 if displayStatus == omr.MGeometryUtilities.kTemplate:
5126 self.setSolidColor( shader, wireColor, templateColor)
5127 wireframeItem.enable(
True)
5129 elif displayStatus == omr.MGeometryUtilities.kActiveTemplate:
5130 self.setSolidColor( shader, wireColor, activeTemplateColor)
5131 wireframeItem.enable(
True)
5133 elif displayStatus == omr.MGeometryUtilities.kDormant:
5134 self.setSolidColor( shader, wireColor, dormantColor)
5135 wireframeItem.enable(
True)
5137 elif displayStatus == omr.MGeometryUtilities.kActiveAffected:
5138 theColor = [ 0.5, 0.0, 1.0, 1.0 ]
5139 self.setSolidColor( shader, wireColor, theColor)
5140 wireframeItem.enable(
True)
5143 wireframeItem.enable(
False)
5147 if shadedTemplateItem:
5148 isTemplate = path.isTemplated()
5149 shader = shadedTemplateItem.getShader()
5151 if displayStatus == omr.MGeometryUtilities.kTemplate:
5152 self.setSolidColor( shader, wireColor, templateColor)
5153 shadedTemplateItem.enable(isTemplate)
5155 elif displayStatus == omr.MGeometryUtilities.kActiveTemplate:
5156 self.setSolidColor( shader, wireColor, activeTemplateColor)
5157 shadedTemplateItem.enable(isTemplate)
5159 elif displayStatus == omr.MGeometryUtilities.kDormant:
5160 self.setSolidColor( shader, wireColor, dormantColor)
5161 shadedTemplateItem.enable(isTemplate)
5164 shadedTemplateItem.enable(
False)
5166 def updateActiveWireframeItem(self, path, list, shaderMgr):
5171 index = list.indexOf(self.sSelectedWireframeItemName)
5173 selectItem = omr.MRenderItem.create(self.sSelectedWireframeItemName, omr.MRenderItem.DecorationItem, omr.MGeometry.kLines)
5174 selectItem.setDrawMode(omr.MGeometry.kAll)
5179 selectItem.setDepthPriority( omr.MRenderItem.sActiveWireDepthPriority )
5180 list.append(selectItem)
5185 shaderId = omr.MShaderManager.k3dSolidShader
5187 shaderId = omr.MShaderManager.k3dThickLineShader
5189 shader = shaderMgr.getStockShader(shaderId)
5192 selectItem.setShader(shader)
5194 shaderMgr.releaseShader(shader)
5196 selectItem = list[index]
5200 shader = selectItem.getShader()
5202 displayStatus = omr.MGeometryUtilities.displayStatus(path)
5203 wireColor = omr.MGeometryUtilities.wireframeColor(path)
5205 if displayStatus == omr.MGeometryUtilities.kLead:
5206 theColor = [ 0.0, 0.8, 0.0, 1.0 ]
5207 self.setSolidColor( shader, wireColor, theColor)
5208 selectItem.enable(
True)
5210 elif displayStatus == omr.MGeometryUtilities.kActive:
5211 theColor = [ 1.0, 1.0, 1.0, 1.0 ]
5212 self.setSolidColor( shader, wireColor, theColor)
5213 selectItem.enable(
True)
5215 elif displayStatus == omr.MGeometryUtilities.kHilite
or displayStatus == omr.MGeometryUtilities.kActiveComponent:
5216 theColor = [ 0.0, 0.5, 0.7, 1.0 ]
5217 self.setSolidColor( shader, wireColor, theColor)
5218 selectItem.enable(
True)
5221 selectItem.enable(
False)
5224 myCustomData = selectItem.getCustomData()
5225 if not myCustomData:
5227 myCustomData = apiMeshUserData()
5228 myCustomData.fMessage =
"I'm custom data!"
5229 selectItem.setCustomData(myCustomData)
5232 myCustomData.fNumModifications += 1
5234 def updateWireframeModeFaceCenterItem(self, path, list, shaderMgr):
5238 wireframeModeFaceCenterItem =
None
5239 index = list.indexOf(self.sWireframeModeFaceCenterItemName)
5241 wireframeModeFaceCenterItem = omr.MRenderItem.create(self.sWireframeModeFaceCenterItemName, omr.MRenderItem.DecorationItem, omr.MGeometry.kPoints)
5242 wireframeModeFaceCenterItem.setDrawMode(omr.MGeometry.kWireframe)
5243 wireframeModeFaceCenterItem.setDepthPriority( omr.MRenderItem.sActiveWireDepthPriority )
5245 list.append(wireframeModeFaceCenterItem)
5247 shader = shaderMgr.getStockShader( omr.MShaderManager.k3dFatPointShader )
5251 self.setSolidPointSize( shader, pointSize )
5253 wireframeModeFaceCenterItem.setShader(shader, self.sFaceCenterStreamName )
5256 shaderMgr.releaseShader(shader)
5258 wireframeModeFaceCenterItem = list[index]
5260 if wireframeModeFaceCenterItem:
5261 shader = wireframeModeFaceCenterItem.getShader()
5264 theColor = [ 0.0, 0.0, 1.0, 1.0 ]
5265 self.setSolidColor( shader, theColor )
5268 isTemplate = path.isTemplated()
5269 wireframeModeFaceCenterItem.enable(
not isTemplate )
5271 def updateShadedModeFaceCenterItem(self, path, list, shaderMgr):
5275 shadedModeFaceCenterItem =
None
5276 index = list.indexOf(self.sShadedModeFaceCenterItemName)
5278 shadedModeFaceCenterItem = omr.MRenderItem.create( self.sShadedModeFaceCenterItemName, omr.MRenderItem.DecorationItem, omr.MGeometry.kPoints)
5279 shadedModeFaceCenterItem.setDrawMode(omr.MGeometry.kShaded | omr.MGeometry.kTextured)
5281 shadedModeFaceCenterItem.setDepthPriority(omr.MRenderItem.sActivePointDepthPriority)
5283 list.append(shadedModeFaceCenterItem)
5285 shader = shaderMgr.getStockShader( omr.MShaderManager.k3dFatPointShader )
5289 self.setSolidPointSize( shader, pointSize )
5291 shadedModeFaceCenterItem.setShader(shader, self.sFaceCenterStreamName )
5294 shaderMgr.releaseShader(shader)
5296 shadedModeFaceCenterItem = list[index]
5298 if shadedModeFaceCenterItem:
5299 shadedModeFaceCenterItem.setExcludedFromPostEffects(
True)
5301 shader = shadedModeFaceCenterItem.getShader()
5302 wireColor = omr.MGeometryUtilities.wireframeColor(path)
5306 self.setSolidColor( shader, wireColor )
5308 displayStatus = omr.MGeometryUtilities.displayStatus(path)
5309 if displayStatus == omr.MGeometryUtilities.kActive
or displayStatus == omr.MGeometryUtilities.kLead
or displayStatus == omr.MGeometryUtilities.kActiveComponent
or displayStatus == omr.MGeometryUtilities.kLive
or displayStatus == omr.MGeometryUtilities.kHilite:
5310 shadedModeFaceCenterItem.enable(
True)
5313 shadedModeFaceCenterItem.enable(
False)
5315 def updateDormantVerticesItem(self, path, list, shaderMgr):
5320 index = list.indexOf(self.sVertexItemName)
5322 vertexItem = omr.MRenderItem.create(self.sVertexItemName, omr.MRenderItem.DecorationItem, omr.MGeometry.kPoints)
5325 vertexItem.setDrawMode(omr.MGeometry.kAll)
5328 mask = om.MSelectionMask(om.MSelectionMask.kSelectMeshVerts)
5329 mask.addMask(om.MSelectionMask.kSelectPointsForGravity)
5330 vertexItem.setSelectionMask( mask )
5335 vertexItem.setDepthPriority( omr.MRenderItem.sDormantPointDepthPriority )
5336 list.append(vertexItem)
5338 shader = shaderMgr.getStockShader( omr.MShaderManager.k3dFatPointShader )
5342 self.setSolidPointSize( shader, pointSize )
5345 vertexItem.setShader(shader)
5348 shaderMgr.releaseShader(shader)
5350 vertexItem = list[index]
5353 shader = vertexItem.getShader()
5355 theColor = [ 0.0, 0.0, 1.0, 1.0 ]
5356 self.setSolidColor( shader, theColor )
5358 displayStatus = omr.MGeometryUtilities.displayStatus(path)
5362 if displayStatus == omr.MGeometryUtilities.kHilite
or omr.MPxGeometryOverride.pointSnappingActive():
5366 if path.isTemplated():
5367 vertexItem.enable(
False)
5369 vertexItem.enable(
True)
5371 vertexItem.enable(
False)
5373 mySelectionData = vertexItem.getCustomData()
5374 if not isinstance(mySelectionData, apiMeshHWSelectionUserData):
5376 mySelectionData = apiMeshHWSelectionUserData()
5377 vertexItem.setCustomData(mySelectionData)
5379 mySelectionData.fMeshGeom = self.fMeshGeom
5381 def updateActiveVerticesItem(self, path, list, shaderMgr):
5386 index = list.indexOf(self.sActiveVertexItemName)
5388 activeItem = omr.MRenderItem.create(self.sActiveVertexItemName, omr.MRenderItem.DecorationItem, omr.MGeometry.kPoints)
5389 activeItem.setDrawMode(omr.MGeometry.kAll)
5392 activeItem.setDepthPriority( omr.MRenderItem.sActivePointDepthPriority )
5393 list.append(activeItem)
5395 shaderId = omr.MShaderManager.k3dFatPointShader
5396 if self.fDrawActiveVerticesWithRamp:
5397 shaderId = omr.MShaderManager.k3dColorLookupFatPointShader
5399 shader = shaderMgr.getStockShader( shaderId )
5403 self.setSolidPointSize( shader, pointSize )
5407 if self.fDrawActiveVerticesWithRamp:
5408 textureMgr = omr.MRenderer.getTextureManager()
5411 if not self.fColorRemapTexture:
5413 colorArray = [ 1.0, 0.0, 0.0, 1.0,
5415 0.0, 0.0, 1.0, 1.0 ]
5418 textureDesc = omr.MTextureDescription()
5419 textureDesc.setToDefault2DTexture()
5420 textureDesc.fWidth = arrayLen
5421 textureDesc.fHeight = 1
5422 textureDesc.fDepth = 1
5423 textureDesc.fBytesPerSlice = textureDesc.fBytesPerRow = 24*arrayLen
5424 textureDesc.fMipmaps = 1
5425 textureDesc.fArraySlices = 1
5426 textureDesc.fTextureType = omr.MRenderer.kImage1D
5427 textureDesc.fFormat = omr.MRenderer.kR32G32B32A32_FLOAT
5428 self.fColorRemapTexture = textureMgr.acquireTexture(
"", textureDesc, colorArray,
False)
5430 if not self.fLinearSampler:
5431 samplerDesc = omr.MSamplerStateDesc()
5432 samplerDesc.addressU = omr.MSamplerState.kTexClamp
5433 samplerDesc.addressV = omr.MSamplerState.kTexClamp
5434 samplerDesc.addressW = omr.MSamplerState.kTexClamp
5435 samplerDesc.filter = omr.MSamplerState.kMinMagMipLinear
5436 fLinearSampler = omr.MStateManager.acquireSamplerState(samplerDesc)
5438 if self.fColorRemapTexture
and self.fLinearSampler:
5440 shader.setParameter(
"map", self.fColorRemapTexture)
5441 shader.setParameter(
"samp", self.fLinearSampler)
5445 rampValueRange = om.MFloatVector(0.0, 1.0)
5446 shader.setParameter(
"UVRange", rampValueRange)
5450 if self.fDrawSharedActiveVertices:
5451 activeItem.setShader(shader, self.sActiveVertexStreamName)
5453 activeItem.setShader(shader,
None)
5456 shaderMgr.releaseShader(shader)
5459 activeItem = list[index]
5462 shader = activeItem.getShader()
5465 theColor = [ 1.0, 1.0, 0.0, 1.0 ]
5466 self.setSolidColor( shader, theColor )
5468 enable = (bool(self.fActiveVerticesSet)
and self.enableActiveComponentDisplay(path))
5469 activeItem.enable( enable )
5471 def updateVertexNumericItems(self, path, list, shaderMgr):
5479 index = list.indexOf(self.sVertexIdItemName)
5481 vertexItem = omr.MRenderItem.create( self.sVertexIdItemName, omr.MRenderItem.DecorationItem, omr.MGeometry.kPoints)
5482 vertexItem.setDrawMode(omr.MGeometry.kAll)
5483 vertexItem.setDepthPriority( omr.MRenderItem.sDormantPointDepthPriority )
5484 list.append(vertexItem)
5487 shader = shaderMgr.getStockShader( omr.MShaderManager.k3dIntegerNumericShader )
5490 vertexItem.setShader(shader, self.sVertexIdItemName)
5491 shaderMgr.releaseShader(shader)
5493 vertexItem = list[index]
5496 shader = vertexItem.getShader()
5499 theColor = [ 1.0, 1.0, 0.0, 1.0 ]
5500 self.setSolidColor( shader, theColor )
5502 vertexItem.enable(self.fEnableNumericDisplay)
5507 index = list.indexOf(self.sVertexPositionItemName)
5509 vertexItem = omr.MRenderItem.create( self.sVertexPositionItemName, omr.MRenderItem.DecorationItem, omr.MGeometry.kPoints)
5510 vertexItem.setDrawMode(omr.MGeometry.kAll)
5511 vertexItem.setDepthPriority( omr.MRenderItem.sDormantPointDepthPriority )
5512 list.append(vertexItem)
5515 shader = shaderMgr.getStockShader( omr.MShaderManager.k3dFloat3NumericShader )
5518 vertexItem.setShader(shader, self.sVertexPositionItemName)
5519 shaderMgr.releaseShader(shader)
5521 vertexItem = list[index]
5524 shader = vertexItem.getShader()
5527 theColor = [ 0.0, 1.0, 1.0, 1.0 ]
5528 self.setSolidColor( shader, theColor)
5530 vertexItem.enable(self.fEnableNumericDisplay)
5532 def updateAffectedComponentItems(self, path, list, shaderMgr):
5539 componentItem =
None
5540 index = list.indexOf(self.sAffectedEdgeItemName)
5542 componentItem = omr.MRenderItem.create( self.sAffectedEdgeItemName, omr.MRenderItem.DecorationItem, omr.MGeometry.kLines)
5543 componentItem.setDrawMode(omr.MGeometry.kAll)
5547 componentItem.setDepthPriority( omr.MRenderItem.sActiveLineDepthPriority )
5548 list.append(componentItem)
5550 shader = shaderMgr.getStockShader( omr.MShaderManager.k3dThickLineShader )
5554 self.setLineWidth( shader, lineSize )
5557 componentItem.setShader(shader,
None)
5560 shaderMgr.releaseShader(shader)
5562 componentItem = list[index]
5565 shader = componentItem.getShader()
5568 theColor = [ 1.0, 1.0, 1.0, 1.0 ]
5569 self.setSolidColor( shader, theColor )
5571 enable = ((bool(self.fActiveVerticesSet)
or bool(self.fActiveEdgesSet))
and self.enableActiveComponentDisplay(path))
5572 componentItem.enable( enable )
5578 componentItem =
None
5579 index = list.indexOf(self.sAffectedFaceItemName)
5581 componentItem = omr.MRenderItem.create( self.sAffectedFaceItemName, omr.MRenderItem.DecorationItem, omr.MGeometry.kTriangles)
5582 componentItem.setDrawMode(omr.MGeometry.kAll)
5585 componentItem.setDepthPriority( omr.MRenderItem.sDormantWireDepthPriority )
5588 componentItem.setAllowIsolateSelectCopy(
True)
5590 list.append(componentItem)
5592 shader = shaderMgr.getStockShader( omr.MShaderManager.k3dStippleShader )
5595 componentItem.setShader(shader,
None)
5598 shaderMgr.releaseShader(shader)
5600 componentItem = list[index]
5603 shader = componentItem.getShader()
5606 theColor = [ 1.0, 1.0, 1.0, 1.0 ]
5607 self.setSolidColor( shader, theColor )
5609 enable = ((bool(self.fActiveVerticesSet)
or bool(self.fActiveFacesSet))
and self.enableActiveComponentDisplay(path))
5610 componentItem.enable( enable )
5612 def updateSelectionComponentItems(self, path, list, shaderMgr):
5627 selectionItem =
None
5628 index = list.indexOf(self.sEdgeSelectionItemName)
5630 selectionItem = omr.MRenderItem.create( self.sEdgeSelectionItemName, omr.MRenderItem.DecorationItem, omr.MGeometry.kLines)
5633 selectionItem.setDrawMode(omr.MGeometry.kSelectionOnly)
5636 selectionItem.setSelectionMask( om.MSelectionMask.kSelectMeshEdges )
5639 selectionItem.setDepthPriority( omr.MRenderItem.sSelectionDepthPriority )
5640 list.append(selectionItem)
5642 shader = shaderMgr.getStockShader(omr.MShaderManager.k3dThickLineShader)
5645 selectionItem.setShader(shader,
None)
5648 shaderMgr.releaseShader(shader)
5650 selectionItem = list[index]
5653 selectionItem.enable(
True)
5655 mySelectionData = selectionItem.getCustomData()
5656 if not isinstance(mySelectionData, apiMeshHWSelectionUserData):
5658 mySelectionData = apiMeshHWSelectionUserData()
5659 selectionItem.setCustomData(mySelectionData)
5661 mySelectionData.fMeshGeom = self.fMeshGeom
5665 index = list.indexOf(self.sFaceSelectionItemName)
5667 selectionItem = omr.MRenderItem.create( self.sFaceSelectionItemName, omr.MRenderItem.DecorationItem, omr.MGeometry.kTriangles)
5670 selectionItem.setDrawMode(omr.MGeometry.kSelectionOnly)
5673 selectionItem.setSelectionMask( om.MSelectionMask.kSelectMeshFaces )
5676 selectionItem.setDepthPriority( omr.MRenderItem.sSelectionDepthPriority )
5679 selectionItem.setAllowIsolateSelectCopy(
True)
5681 list.append(selectionItem)
5683 shader = shaderMgr.getStockShader(omr.MShaderManager.k3dSolidShader)
5686 selectionItem.setShader(shader,
None)
5689 shaderMgr.releaseShader(shader)
5691 selectionItem = list[index]
5694 selectionItem.enable(
True)
5696 mySelectionData = selectionItem.getCustomData()
5697 if not isinstance(mySelectionData, apiMeshHWSelectionUserData):
5699 mySelectionData = apiMeshHWSelectionUserData()
5700 selectionItem.setCustomData(mySelectionData)
5702 mySelectionData.fMeshGeom = self.fMeshGeom
5704 def updateProxyShadedItem(self, path, list, shaderMgr):
5709 dormantColor = [ 0.0, 0.0, 1.0, 1.0 ]
5710 templateColor = [ 0.45, 0.45, 0.45, 1.0 ]
5711 activeTemplateColor = [ 1.0, 0.5, 0.5, 1.0 ]
5718 raiseAboveShaded =
True
5719 shadedDrawMode = omr.MGeometry.kShaded | omr.MGeometry.kTextured
5722 useFragmentShader = self.fProxyShader < 0
5723 if not useFragmentShader:
5724 shadedDrawMode |= omr.MGeometry.kWireframe
5729 itemType = omr.MRenderItem.NonMaterialSceneItem
5730 primitive = omr.MGeometry.kLines
5731 filledProxy = useFragmentShader
or self.fProxyShader == omr.MShaderManager.k3dStippleShader
5733 itemType = omr.MRenderItem.MaterialSceneItem
5734 primitive = omr.MGeometry.kTriangles
5736 depthPriority = omr.MRenderItem.sDormantWireDepthPriority
5737 if raiseAboveShaded:
5738 depthPriority = omr.MRenderItem.sActiveWireDepthPriority
5741 index = list.indexOf(self.sShadedProxyItemName)
5743 proxyItem = omr.MRenderItem.create( self.sShadedProxyItemName, itemType, primitive)
5744 proxyItem.setDrawMode(shadedDrawMode)
5745 proxyItem.setDepthPriority( depthPriority )
5747 proxyItem.setCastsShadows(
not self.fExternalItems_NoShadowCast
and self.fCastsShadows )
5748 proxyItem.setReceivesShadows(
not self.fExternalItems_NoShadowReceive
and self.fReceivesShadows )
5749 proxyItem.setExcludedFromPostEffects( self.fExternalItems_NoPostEffects )
5751 list.append(proxyItem)
5756 if useFragmentShader:
5757 shader = shaderMgr.getFragmentShader(
"mayaLambertSurface",
"outSurfaceFinal",
True)
5758 sBlue = [ 0.4, 0.4, 1.0 ]
5759 shader.setParameter(
"color", sBlue)
5760 shader.setIsTransparent(
False)
5762 shader = shaderMgr.getStockShader( self.fProxyShader )
5766 self.setLineWidth(shader, 10.0)
5769 proxyItem.setShader(shader)
5771 shaderMgr.releaseShader(shader)
5773 proxyItem = list[index]
5780 proxyItem.setCastsShadows(
not self.fExternalItems_NoShadowCast
and self.fCastsShadows )
5781 proxyItem.setReceivesShadows(
not self.fExternalItems_NoShadowReceive
and self.fReceivesShadows )
5782 proxyItem.setExcludedFromPostEffects( self.fExternalItems_NoPostEffects )
5787 haveShadedItems =
False
5791 drawMode = item.drawMode()
5792 if drawMode == omr.MGeometry.kShaded
or drawMode == omr.MGeometry.kTextured:
5793 if item.name() != self.sShadedTemplateItemName:
5794 haveShadedItems =
True
5797 displayStatus = omr.MGeometryUtilities.displayStatus(path)
5798 wireColor = omr.MGeometryUtilities.wireframeColor(path)
5805 shader = proxyItem.getShader()
5807 if displayStatus == omr.MGeometryUtilities.kTemplate:
5808 self.setSolidColor( shader, wireColor, templateColor )
5810 elif displayStatus == omr.MGeometryUtilities.kActiveTemplate:
5811 self.setSolidColor( shader, wireColor, activeTemplateColor )
5813 elif displayStatus == omr.MGeometryUtilities.kDormant:
5814 self.setSolidColor( shader, wireColor, dormantColor )
5821 if path.isTemplated():
5822 proxyItem.enable(
False)
5824 proxyItem.enable(
not haveShadedItems)
5826 proxyItem.enable(
not haveShadedItems)
5829 def updateGeometryRequirements(self, requirements, data, activeVertexCount, totalVerts, debugPopulateGeometry):
5835 positionBuffer =
None
5836 positionDataAddress =
None
5839 vertexNumericIdBuffer =
None
5840 vertexNumericIdDataAddress =
None
5841 vertexNumericIdData =
None
5843 vertexNumericIdPositionBuffer =
None
5844 vertexNumericIdPositionDataAddress =
None
5845 vertexNumericIdPositionData =
None
5847 vertexNumericLocationBuffer =
None
5848 vertexNumericLocationDataAddress =
None
5849 vertexNumericLocationData =
None
5851 vertexNumericLocationPositionBuffer =
None
5852 vertexNumericLocationPositionDataAddress =
None
5853 vertexNumericLocationPositionData =
None
5855 activeVertexPositionBuffer =
None
5856 activeVertexPositionDataAddress =
None
5857 activeVertexPositionData =
None
5859 activeVertexUVBuffer =
None
5860 activeVertexUVDataAddress =
None
5861 activeVertexUVData =
None
5863 faceCenterPositionBuffer =
None
5864 faceCenterPositionDataAddress =
None
5865 faceCenterPositionData =
None
5868 normalDataAddress =
None
5872 cpvDataAddress =
None
5876 uvDataAddress =
None
5879 numUVs = self.fMeshGeom.uvcoords.uvcount()
5881 descList = requirements.vertexRequirements()
5882 satisfiedRequirements = [
False,] * len(descList)
5883 for i
in range(len(descList)):
5887 if self.fDrawSharedActiveVertices
and (desc.name == self.sActiveVertexStreamName):
5888 if desc.semantic == omr.MGeometry.kPosition:
5889 if not activeVertexPositionBuffer:
5890 activeVertexPositionBuffer = data.createVertexBuffer(desc)
5891 if activeVertexPositionBuffer:
5892 satisfiedRequirements[i] =
True
5893 if debugPopulateGeometry:
5894 print(
">>> Fill in data for active vertex requirement '" + desc.name +
"'. Semantic = kPosition")
5895 activeVertexPositionDataAddress = activeVertexPositionBuffer.acquire(activeVertexCount,
True)
5896 if activeVertexPositionDataAddress:
5897 activeVertexPositionData = ((ctypes.c_float * 3)*activeVertexCount).from_address(activeVertexPositionDataAddress)
5899 elif desc.semantic == omr.MGeometry.kTexture:
5900 if not activeVertexUVBuffer:
5901 activeVertexUVBuffer = data.createVertexBuffer(desc)
5902 if activeVertexUVBuffer:
5903 satisfiedRequirements[i] =
True
5904 if debugPopulateGeometry:
5905 print(
">>> Fill in data for active vertex requirement '" + desc.name +
"'. Semantic = kTexture")
5906 activeVertexUVDataAddress = activeVertexUVBuffer.acquire(activeVertexCount,
True)
5907 if activeVertexUVDataAddress:
5908 activeVertexUVData = ((ctypes.c_float * 3)*activeVertexCount).from_address(activeVertexUVDataAddress)
5915 elif self.fDrawFaceCenters
and desc.name == self.sFaceCenterStreamName:
5916 if desc.semantic == omr.MGeometry.kPosition:
5917 if not faceCenterPositionBuffer:
5918 faceCenterPositionBuffer = data.createVertexBuffer(desc)
5919 if faceCenterPositionBuffer:
5920 satisfiedRequirements[i] =
True
5921 if debugPopulateGeometry:
5922 print(
">>> Fill in data for face center vertex requirement '" + desc.name +
"'. Semantic = kPosition")
5923 faceCenterPositionDataAddress = faceCenterPositionBuffer.acquire(self.fMeshGeom.faceCount,
True)
5924 if faceCenterPositionDataAddress:
5925 faceCenterPositionData = ((ctypes.c_float * 3)*self.fMeshGeom.faceCount).from_address(faceCenterPositionDataAddress)
5934 if desc.semantic == omr.MGeometry.kPosition:
5935 if desc.name == self.sVertexIdItemName:
5936 if not vertexNumericIdPositionBuffer:
5937 vertexNumericIdPositionBuffer = data.createVertexBuffer(desc)
5938 if vertexNumericIdPositionBuffer:
5939 satisfiedRequirements[i] =
True
5940 if debugPopulateGeometry:
5941 print(
">>> Fill in data for requirement '" + desc.name +
"'. Semantic = kPosition")
5942 print(
"Acquire 3loat-numeric position buffer")
5943 vertexNumericIdPositionDataAddress = vertexNumericIdPositionBuffer.acquire(totalVerts,
True)
5944 if vertexNumericIdPositionDataAddress:
5945 vertexNumericIdPositionData = ((ctypes.c_float * 3)*totalVerts).from_address(vertexNumericIdPositionDataAddress)
5947 elif desc.name == self.sVertexPositionItemName:
5948 if not vertexNumericLocationPositionBuffer:
5949 vertexNumericLocationPositionBuffer = data.createVertexBuffer(desc)
5950 if vertexNumericLocationPositionBuffer:
5951 satisfiedRequirements[i] =
True
5952 if debugPopulateGeometry:
5953 print(
">>> Fill in data for requirement '" + desc.name +
"'. Semantic = kPosition")
5954 print(
"Acquire 3loat-numeric position buffer")
5955 vertexNumericLocationPositionDataAddress = vertexNumericLocationPositionBuffer.acquire(totalVerts,
True)
5956 if vertexNumericLocationPositionDataAddress:
5957 vertexNumericLocationPositionData = ((ctypes.c_float * 3)*totalVerts).from_address(vertexNumericLocationPositionDataAddress)
5960 if not positionBuffer:
5961 positionBuffer = data.createVertexBuffer(desc)
5963 satisfiedRequirements[i] =
True
5964 if debugPopulateGeometry:
5965 print(
">>> Fill in data for requirement '" + desc.name +
"'. Semantic = kPosition")
5966 print(
"Acquire unnamed position buffer")
5967 positionDataAddress = positionBuffer.acquire(totalVerts,
True)
5968 if positionDataAddress:
5969 positionData = ((ctypes.c_float * 3)*totalVerts).from_address(positionDataAddress)
5971 elif desc.semantic == omr.MGeometry.kNormal:
5972 if not normalBuffer:
5973 normalBuffer = data.createVertexBuffer(desc)
5975 satisfiedRequirements[i] =
True
5976 if debugPopulateGeometry:
5977 print(
">>> Fill in data for requirement '" + desc.name +
"'. Semantic = kNormal")
5978 normalDataAddress = normalBuffer.acquire(totalVerts,
True)
5979 if normalDataAddress:
5980 normalData = ((ctypes.c_float * 3)*totalVerts).from_address(normalDataAddress)
5982 elif desc.semantic == omr.MGeometry.kTexture:
5983 numericValue =
"numericvalue"
5984 numeric3Value =
"numeric3value"
5987 if desc.semanticName.lower() == numericValue
and desc.name == self.sVertexIdItemName:
5988 if not vertexNumericIdBuffer:
5989 vertexNumericIdBuffer = data.createVertexBuffer(desc)
5990 if vertexNumericIdBuffer:
5991 satisfiedRequirements[i] =
True
5992 if debugPopulateGeometry:
5993 print(
">>> Fill in data for requirement '" + desc.name +
"'. Semantic = kTexture")
5994 print(
"Acquire 1loat numeric buffer")
5995 vertexNumericIdDataAddress = vertexNumericIdBuffer.acquire(totalVerts,
True)
5996 if vertexNumericIdDataAddress:
5997 vertexNumericIdData = ((ctypes.c_float * 1)*totalVerts).from_address(vertexNumericIdDataAddress)
6000 elif desc.semanticName.lower() == numeric3Value
and desc.name == self.sVertexPositionItemName:
6001 if not vertexNumericLocationBuffer:
6002 vertexNumericLocationBuffer = data.createVertexBuffer(desc)
6003 if vertexNumericLocationBuffer:
6004 satisfiedRequirements[i] =
True
6005 if debugPopulateGeometry:
6006 print(
">>> Fill in data for requirement '" + desc.name +
"'. Semantic = kTexture")
6007 print(
"Acquire 3loat numeric location buffer")
6008 vertexNumericLocationDataAddress = vertexNumericLocationBuffer.acquire(totalVerts,
True)
6009 if vertexNumericLocationDataAddress:
6010 vertexNumericLocationData = ((ctypes.c_float * 3)*totalVerts).from_address(vertexNumericLocationDataAddress)
6013 elif desc.name != self.sVertexIdItemName
and desc.name != self.sVertexPositionItemName:
6015 uvBuffer = data.createVertexBuffer(desc)
6017 satisfiedRequirements[i] =
True
6018 if debugPopulateGeometry:
6019 print(
">>> Fill in data for requirement '" + desc.name +
"'. Semantic = kTexture")
6020 print(
"Acquire a uv buffer")
6021 uvDataAddress = uvBuffer.acquire(totalVerts,
True)
6023 uvData = ((ctypes.c_float * 2)*totalVerts).from_address(uvDataAddress)
6025 elif desc.semantic == omr.MGeometry.kColor:
6027 cpvBuffer = data.createVertexBuffer(desc)
6029 satisfiedRequirements[i] =
True
6030 if debugPopulateGeometry:
6031 print(
">>> Fill in data for requirement '" + desc.name +
"'. Semantic = kColor")
6032 cpvDataAddress = cpvBuffer.acquire(totalVerts,
True)
6034 cpvData = ((ctypes.c_float * 4)*totalVerts).from_address(cpvDataAddress)
6045 for i
in range(self.fMeshGeom.faceCount):
6047 numVerts = self.fMeshGeom.face_counts[i]
6049 for v
in range(numVerts):
6050 if any((positionData, vertexNumericIdPositionData, vertexNumericLocationPositionData, vertexNumericLocationData)):
6051 position = self.fMeshGeom.vertices[self.fMeshGeom.face_connects[vid]]
6054 positionData[pid][0] = position[0]
6055 positionData[pid][1] = position[1]
6056 positionData[pid][2] = position[2]
6058 if vertexNumericIdPositionData:
6059 vertexNumericIdPositionData[pid][0] = position[0]
6060 vertexNumericIdPositionData[pid][1] = position[1]
6061 vertexNumericIdPositionData[pid][2] = position[2]
6063 if vertexNumericLocationPositionData:
6064 vertexNumericLocationPositionData[pid][0] = position[0]
6065 vertexNumericLocationPositionData[pid][1] = position[1]
6066 vertexNumericLocationPositionData[pid][2] = position[2]
6068 if vertexNumericLocationData:
6069 vertexNumericLocationData[pid][0] = position[0]
6070 vertexNumericLocationData[pid][1] = position[1]
6071 vertexNumericLocationData[pid][2] = position[2]
6076 normal = self.fMeshGeom.normals[self.fMeshGeom.face_connects[vid]]
6077 normalData[nid][0] = normal[0]
6078 normalData[nid][1] = normal[1]
6079 normalData[nid][2] = normal[2]
6086 uvNum = self.fMeshGeom.uvcoords.uvId(vid)
6087 uv = self.fMeshGeom.uvcoords.getUV(uvNum)
6088 uvData[uvid][0] = uv[0]
6089 uvData[uvid][1] = uv[0]
6096 position = self.fMeshGeom.vertices[self.fMeshGeom.face_connects[vid]]
6097 cpvData[cid][0] = position[0]
6098 cpvData[cid][1] = position[1]
6099 cpvData[cid][2] = position[2]
6100 cpvData[cid][3] = 1.0
6105 if vertexNumericIdData:
6106 vertexNumericIdData[vid] = (ctypes.c_float * 1)(self.fMeshGeom.face_connects[vid])
6114 if positionDataAddress:
6115 positionBuffer.commit(positionDataAddress)
6117 if normalDataAddress:
6118 normalBuffer.commit(normalDataAddress)
6121 uvBuffer.commit(uvDataAddress)
6124 cpvBuffer.commit(cpvDataAddress)
6126 if vertexNumericIdDataAddress:
6127 vertexNumericIdBuffer.commit(vertexNumericIdDataAddress)
6129 if vertexNumericIdPositionDataAddress:
6130 vertexNumericIdPositionBuffer.commit(vertexNumericIdPositionDataAddress)
6132 if vertexNumericLocationDataAddress:
6133 vertexNumericLocationBuffer.commit(vertexNumericLocationDataAddress)
6135 if vertexNumericLocationPositionDataAddress:
6136 vertexNumericLocationPositionBuffer.commit(vertexNumericLocationPositionDataAddress)
6141 if activeVertexPositionData:
6142 if debugPopulateGeometry:
6143 print(
">>> Fill in the data for active vertex position buffer base on component list")
6147 if activeVertexCount > len(self.fMeshGeom.vertices):
6148 activeVertexCount = len(self.fMeshGeom.vertices)
6150 for i
in range(activeVertexCount):
6151 position = self.fMeshGeom.vertices[ self.fActiveVertices[i] ]
6152 activeVertexPositionData[i][0] = position[0]
6153 activeVertexPositionData[i][1] = position[1]
6154 activeVertexPositionData[i][2] = position[2]
6156 activeVertexPositionBuffer.commit(activeVertexPositionDataAddress)
6158 if activeVertexUVData:
6159 if debugPopulateGeometry:
6160 print(
">>> Fill in the data for active vertex uv buffer base on component list")
6164 if activeVertexCount > len(self.fMeshGeom.vertices):
6165 activeVertexCount = len(self.fMeshGeom.vertices)
6167 for i
in range(activeVertexCount):
6168 activeVertexUVData[i] = i // activeVertexCount
6170 activeVertexUVBuffer.commit(activeVertexUVDataAddress)
6175 if faceCenterPositionData:
6176 if debugPopulateGeometry:
6177 print(
">>> Fill in the data for face center position buffer")
6183 for faceId
in range(self.fMeshGeom.faceCount):
6189 faceCenterPosition = om.MPoint()
6192 numVerts = self.fMeshGeom.face_counts[faceId]
6194 for v
in range(numVerts):
6195 face_vertex_position = self.fMeshGeom.vertices[self.fMeshGeom.face_connects[vid]]
6196 x += face_vertex_position[0]
6197 y += face_vertex_position[1]
6198 z += face_vertex_position[2]
6202 faceCenterPosition = om.MPoint(x, y, z) / numVerts
6207 faceCenterPositionData[faceId][0] = faceCenterPosition[0]
6208 faceCenterPositionData[faceId][1] = faceCenterPosition[1]
6209 faceCenterPositionData[faceId][2] = faceCenterPosition[2]
6211 faceCenterPositionBuffer.commit(faceCenterPositionDataAddress)
6215 for i
in range(len(descList)):
6216 if satisfiedRequirements[i]:
6219 if self.fDrawSharedActiveVertices
and (desc.name == self.sActiveVertexStreamName):
6220 if desc.semantic == omr.MGeometry.kPosition:
6221 satisfiedRequirements[i] =
True
6222 self.cloneVertexBuffer(activeVertexPositionBuffer, data, desc, activeVertexCount, debugPopulateGeometry)
6223 elif desc.semantic == omr.MGeometry.kTexture:
6224 satisfiedRequirements[i] =
True
6225 self.cloneVertexBuffer(activeVertexUVBuffer, data, desc, activeVertexCount, debugPopulateGeometry)
6226 elif self.fDrawFaceCenters
and desc.name == self.sFaceCenterStreamName:
6227 if desc.semantic == omr.MGeometry.kPosition:
6228 satisfiedRequirements[i] =
True
6229 self.cloneVertexBuffer(faceCenterPositionBuffer, data, desc, self.fMeshGeom.faceCount, debugPopulateGeometry)
6231 if desc.semantic == omr.MGeometry.kPosition:
6232 if desc.name == self.sVertexIdItemName:
6233 satisfiedRequirements[i] =
True
6234 self.cloneVertexBuffer(vertexNumericIdPositionBuffer, data, desc, totalVerts, debugPopulateGeometry)
6235 elif desc.name == self.sVertexPositionItemName:
6236 satisfiedRequirements[i] =
True
6237 self.cloneVertexBuffer(vertexNumericLocationPositionBuffer, data, desc, totalVerts, debugPopulateGeometry)
6239 satisfiedRequirements[i] =
True
6240 self.cloneVertexBuffer(positionBuffer, data, desc, totalVerts, debugPopulateGeometry)
6241 elif desc.semantic == omr.MGeometry.kNormal:
6242 satisfiedRequirements[i] =
True
6243 self.cloneVertexBuffer(normalBuffer, data, desc, totalVerts, debugPopulateGeometry)
6244 elif desc.semantic == omr.MGeometry.kTexture:
6245 numericValue =
"numericvalue"
6246 numeric3Value =
"numeric3value"
6247 if desc.semanticName.lower() == numericValue
and desc.name == self.sVertexIdItemName:
6248 satisfiedRequirements[i] =
True
6249 self.cloneVertexBuffer(vertexNumericIdBuffer, data, desc, totalVerts, debugPopulateGeometry)
6250 elif desc.semanticName.lower() == numeric3Value
and desc.name == self.sVertexPositionItemName:
6251 satisfiedRequirements[i] =
True
6252 self.cloneVertexBuffer(vertexNumericLocationBuffer, data, desc, totalVerts, debugPopulateGeometry)
6253 elif desc.name != self.sVertexIdItemName
and desc.name != self.sVertexPositionItemName:
6254 satisfiedRequirements[i] =
True
6255 self.cloneVertexBuffer(uvBuffer, data, desc, totalVerts, debugPopulateGeometry)
6256 elif desc.semantic == omr.MGeometry.kColor:
6257 satisfiedRequirements[i] =
True
6258 self.cloneVertexBuffer(cpvBuffer, data, desc, totalVerts, debugPopulateGeometry)
6260 if not satisfiedRequirements[i]:
6263 destBuffer = data.createVertexBuffer(desc)
6265 satisfiedRequirements[i] =
True
6266 if debugPopulateGeometry:
6267 print(
">>> Fill in dummy requirement '%s'" % (desc.name, ))
6268 destBufferDataAddress = destBuffer.acquire(totalVerts,
True)
6269 if destBufferDataAddress:
6270 destBufferData = ((ctypes.c_float * desc.dimension)*totalVerts).from_address(destBufferDataAddress)
6272 for j
in range(totalVerts):
6273 if desc.dimension == 4:
6274 destBufferData[j] = (1.0, 0.0, 0.0, 1.0)
6275 elif desc.dimension == 3:
6276 destBufferData[j] = (1.0, 0.0, 0.0)
6278 for k
in range(desc.dimension):
6279 destBufferData[j][k] = 0.0
6280 destBuffer.commit(destBufferDataAddress)
6285 def cloneVertexBuffer(self, srcBuffer, data, desc, dataSize, debugPopulateGeometry):
6287 destBuffer = data.createVertexBuffer(desc)
6289 if debugPopulateGeometry:
6290 print(
">>> Cloning requirement '%s'" % (desc.name, ))
6291 destBufferDataAddress = destBuffer.acquire(dataSize,
True)
6292 srcBufferDataAddress = srcBuffer.map()
6293 if destBufferDataAddress
and srcBufferDataAddress:
6294 destBufferData = ((ctypes.c_float * desc.dimension)*dataSize).from_address(destBufferDataAddress)
6295 srcBufferData = ((ctypes.c_float * desc.dimension)*dataSize).from_address(srcBufferDataAddress)
6296 if destBufferData
and srcBufferData:
6297 for j
in range(dataSize):
6298 for k
in range(desc.dimension):
6299 destBufferData[j][k] = srcBufferData[j][k]
6300 destBuffer.commit(destBufferDataAddress)
6304 def updateIndexingForWireframeItems(self, wireIndexBuffer, item, data, totalVerts):
6312 if not wireIndexBuffer:
6313 wireIndexBuffer = data.createIndexBuffer(omr.MGeometry.kUnsignedInt32)
6315 dataAddress = wireIndexBuffer.acquire(2*totalVerts,
True)
6317 data = (ctypes.c_uint * (2*totalVerts)).from_address(dataAddress)
6321 for faceIdx
in range(self.fMeshGeom.faceCount):
6323 numVerts = self.fMeshGeom.face_counts[faceIdx]
6326 for v
in range(numVerts-1):
6342 wireIndexBuffer.commit(dataAddress)
6346 item.associateWithIndexBuffer(wireIndexBuffer)
6348 def updateIndexingForDormantVertices(self, item, data, numTriangles):
6351 indexBuffer = data.createIndexBuffer(omr.MGeometry.kUnsignedInt32)
6353 dataAddress = indexBuffer.acquire(3*numTriangles,
True)
6355 data = (ctypes.c_uint*(3*numTriangles)).from_address(dataAddress)
6360 for faceIdx
in range(self.fMeshGeom.faceCount):
6362 numVerts = self.fMeshGeom.face_counts[faceIdx]
6364 for v
in range(1, numVerts-1):
6366 data[idx+1] = base+v
6367 data[idx+2] = base+v+1
6372 indexBuffer.commit(dataAddress)
6374 item.associateWithIndexBuffer(indexBuffer)
6376 def updateIndexingForFaceCenters(self, item, data, debugPopulateGeometry):
6379 indexBuffer = data.createIndexBuffer(omr.MGeometry.kUnsignedInt32)
6381 dataAddress = indexBuffer.acquire(self.fMeshGeom.faceCount,
True)
6383 data = (ctypes.c_uint * self.fMeshGeom.faceCount).from_address(dataAddress)
6384 if debugPopulateGeometry:
6385 print(
">>> Set up indexing for face centers")
6387 for i
in range(self.fMeshGeom.faceCount):
6392 for i
in range(self.fMeshGeom.faceCount):
6394 numVerts = self.fMeshGeom.face_counts[i]
6399 indexBuffer.commit(dataAddress)
6401 item.associateWithIndexBuffer(indexBuffer)
6403 def updateIndexingForVertices(self, item, data, numTriangles, activeVertexCount, debugPopulateGeometry):
6406 indexBuffer = data.createIndexBuffer(omr.MGeometry.kUnsignedInt32)
6418 if self.fDrawSharedActiveVertices:
6419 dataAddress = indexBuffer.acquire(activeVertexCount,
True)
6421 data = (ctypes.c_uint*activeVertexCount).from_address(dataAddress)
6422 if debugPopulateGeometry:
6423 print(
">>> Set up indexing for shared vertices")
6425 for i
in range(activeVertexCount):
6431 if debugPopulateGeometry:
6432 print(
">>> Set up indexing for unshared vertices")
6434 vertexCount = 3*numTriangles
6435 dataAddress = indexBuffer.acquire(vertexCount,
True)
6437 data = (ctypes.c_uint*vertexCount).from_address(dataAddress)
6438 for i
in range(vertexCount):
6439 data[i] = vertexCount+1
6441 selectionIdSet = self.fActiveVerticesSet
6448 for faceIdx
in range(self.fMeshGeom.faceCount):
6450 numVerts = self.fMeshGeom.face_counts[faceIdx]
6452 for v
in range(1, numVerts-1):
6453 vertexId = self.fMeshGeom.face_connects[base]
6454 if vertexId
in selectionIdSet:
6456 data[idx] = lastFound
6459 vertexId = self.fMeshGeom.face_connects[base+v]
6460 if vertexId
in selectionIdSet:
6462 data[idx] = lastFound
6465 vertexId = self.fMeshGeom.face_connects[base+v+1]
6466 if vertexId
in selectionIdSet:
6467 lastFound = base+v+1
6468 data[idx] = lastFound
6473 for i
in range(vertexCount):
6474 if data[i] == vertexCount+1:
6478 indexBuffer.commit(dataAddress)
6480 item.associateWithIndexBuffer(indexBuffer)
6482 def updateIndexingForEdges(self, item, data, totalVerts, fromSelection):
6485 indexBuffer = data.createIndexBuffer(omr.MGeometry.kUnsignedInt32)
6487 totalEdges = 2*totalVerts
6488 totalEdgesP1 = 2*totalVerts+1
6489 dataAddress = indexBuffer.acquire(totalEdges,
True)
6491 data = (ctypes.c_uint*totalEdges).from_address(dataAddress)
6492 for i
in range(totalEdges):
6493 data[i] = totalEdgesP1
6496 displayAll =
not fromSelection
6497 displayActives = (
not displayAll
and bool(self.fActiveEdgesSet))
6498 displayAffected = (
not displayAll
and not displayActives)
6500 selectionIdSet =
None
6502 selectionIdSet = self.fActiveEdgesSet
6503 elif displayAffected:
6504 selectionIdSet = self.fActiveVerticesSet
6510 for faceIdx
in range(self.fMeshGeom.faceCount):
6512 numVerts = self.fMeshGeom.face_counts[faceIdx]
6514 for v
in range(numVerts):
6515 enableEdge = displayAll
6516 vindex1 = base + (v % numVerts)
6517 vindex2 = base + ((v+1) % numVerts)
6523 vertexId = self.fMeshGeom.face_connects[vindex1]
6524 if vertexId
in selectionIdSet:
6529 vertexId2 = self.fMeshGeom.face_connects[vindex2]
6530 if vertexId2
in selectionIdSet:
6534 elif displayActives:
6537 if edgeId
in selectionIdSet:
6552 for i
in range(totalEdges):
6553 if data[i] == totalEdgesP1:
6556 indexBuffer.commit(dataAddress)
6558 item.associateWithIndexBuffer(indexBuffer)
6560 def updateIndexingForFaces(self, item, data, numTriangles, fromSelection):
6563 indexBuffer = data.createIndexBuffer(omr.MGeometry.kUnsignedInt32)
6565 numTriangleVertices = 3*numTriangles
6566 dataAddress = indexBuffer.acquire(numTriangleVertices,
True)
6568 data = (ctypes.c_uint*numTriangleVertices).from_address(dataAddress)
6569 for i
in range(numTriangleVertices):
6570 data[i] = numTriangleVertices+1
6573 displayAll =
not fromSelection
6574 displayActives = (
not displayAll
and bool(self.fActiveFacesSet))
6575 displayAffected = (
not displayAll
and not displayActives)
6576 isolateSelect = item.isIsolateSelectCopy()
6580 enableFaces = [0] * self.fMeshGeom.faceCount
6582 for i
in range(self.fMeshGeom.faceCount):
6583 enableFaces[i] =
False
6586 fnComponent = om.MFnSingleIndexedComponent( item.shadingComponent() )
6587 if(fnComponent.componentType == om.MFn.kMeshPolygonComponent):
6588 faceIds = fnComponent.getElements()
6590 for i
in range(len(faceIds)):
6591 enableFaces[faceIds[i]] =
True
6594 selectionIdSet =
None
6596 selectionIdSet = self.fActiveFacesSet
6597 elif displayAffected:
6598 selectionIdSet = self.fActiveVerticesSet
6603 for faceIdx
in range(self.fMeshGeom.faceCount):
6605 numVerts = self.fMeshGeom.face_counts[faceIdx]
6612 for v
in range(1, numVerts-1):
6613 vertexId = self.fMeshGeom.face_connects[base]
6614 if vertexId
in selectionIdSet:
6619 vertexId2 = self.fMeshGeom.face_connects[base+v]
6620 if vertexId2
in selectionIdSet:
6625 vertexId3 = self.fMeshGeom.face_connects[base+v+1]
6626 if vertexId3
in selectionIdSet:
6628 lastFound = base+v+1
6630 elif displayActives:
6631 if (
not isolateSelect
or enableFaces[faceIdx]):
6634 if faceIdx
in selectionIdSet:
6637 elif (
not isolateSelect
or enableFaces[faceIdx]):
6646 for v
in range(1, numVerts-1):
6648 data[idx+1] = base+v
6649 data[idx+2] = base+v+1
6655 for i
in range(numTriangleVertices):
6656 if data[i] == numTriangleVertices+1:
6659 indexBuffer.commit(dataAddress)
6661 item.associateWithIndexBuffer(indexBuffer)
6663 def updateIndexingForShadedTriangles(self, item, data, numTriangles):
6667 indexBuffer = data.createIndexBuffer(omr.MGeometry.kUnsignedInt32)
6669 isolateSelect = item.isIsolateSelectCopy()
6673 enableFaces = [0] * self.fMeshGeom.faceCount
6675 for i
in range(self.fMeshGeom.faceCount):
6676 enableFaces[i] =
False
6678 fnComponent = om.MFnSingleIndexedComponent( item.shadingComponent() )
6679 if(fnComponent.componentType == om.MFn.kMeshPolygonComponent):
6680 faceIds = fnComponent.getElements()
6682 for i
in range(len(faceIds)):
6683 enableFaces[faceIds[i]] =
True
6685 indices = [0] * numTriangles * 3
6689 for faceIdx
in range(self.fMeshGeom.faceCount):
6691 numVerts = self.fMeshGeom.face_counts[faceIdx]
6693 if (
not isolateSelect
or enableFaces[faceIdx]):
6694 for v
in range(1, numVerts-1):
6696 indices[idx+1] = base+v
6697 indices[idx+2] = base+v+1
6701 dataAddress = indexBuffer.acquire(len(indices),
True)
6703 data = (ctypes.c_uint * len(indices)).from_address(dataAddress)
6705 for i
in range(len(indices)):
6706 data[i] = indices[i]
6708 indexBuffer.commit(dataAddress)
6710 item.associateWithIndexBuffer(indexBuffer)
6723 def initializePlugin(obj):
6724 plugin = om.MFnPlugin(obj,
"Autodesk",
"3.0",
"Any")
6727 plugin.registerData(
"apiMeshData_py", apiMeshData.id, apiMeshData.creator, om.MPxData.kGeometryData)
6729 sys.stderr.write(
"Failed to register data\n")
6733 plugin.registerShape(
"apiMesh_py", apiMeshGeometryShape.id, apiMeshGeometryShape.creator, apiMeshGeometryShape.initialize, apiMeshGeometryShape.sDrawDbClassification)
6735 sys.stderr.write(
"Failed to register node\n")
6739 plugin.registerShape(
"apiMeshSubscene_py", apiMeshSubsceneShape.id, apiMeshSubsceneShape.creator, apiMeshSubsceneShape.initialize, apiMeshSubsceneShape.sDrawDbClassification)
6741 sys.stderr.write(
"Failed to register node\n")
6745 plugin.registerNode(
"apiMeshCreator_py", apiMeshCreator.id, apiMeshCreator.creator, apiMeshCreator.initialize)
6747 sys.stderr.write(
"Failed to register node\n")
6751 omr.MDrawRegistry.registerGeometryOverrideCreator(apiMeshGeometryShape.sDrawDbClassification, apiMesh.sDrawRegistrantId, apiMeshGeometryOverride.creator)
6753 sys.stderr.write(
"Failed to register override\n")
6757 omr.MDrawRegistry.registerSubSceneOverrideCreator(apiMeshSubsceneShape.sDrawDbClassification, apiMesh.sDrawRegistrantId, apiMeshSubSceneOverride.creator)
6759 sys.stderr.write(
"Failed to register override\n")
6763 omr.MDrawRegistry.registerComponentConverter(apiMeshGeometryOverride.sVertexItemName, meshVertComponentConverterGeometryOverride.creator)
6764 omr.MDrawRegistry.registerComponentConverter(apiMeshGeometryOverride.sEdgeSelectionItemName, meshEdgeComponentConverterGeometryOverride.creator)
6765 omr.MDrawRegistry.registerComponentConverter(apiMeshGeometryOverride.sFaceSelectionItemName, meshFaceComponentConverterGeometryOverride.creator)
6767 sys.stderr.write(
"Failed to register component converters\n")
6771 omr.MDrawRegistry.registerComponentConverter(apiMeshSubSceneOverride.sVertexSelectionName, simpleComponentConverterSubsceneOverride.creatorVertexSelection)
6772 omr.MDrawRegistry.registerComponentConverter(apiMeshSubSceneOverride.sEdgeSelectionName, simpleComponentConverterSubsceneOverride.creatorEdgeSelection)
6773 omr.MDrawRegistry.registerComponentConverter(apiMeshSubSceneOverride.sFaceSelectionName, simpleComponentConverterSubsceneOverride.creatorFaceSelection)
6775 sys.stderr.write(
"Failed to register component converters\n")
6778 def uninitializePlugin(obj):
6779 plugin = om.MFnPlugin(obj)
6781 omr.MDrawRegistry.deregisterComponentConverter(apiMeshSubSceneOverride.sVertexSelectionName)
6782 omr.MDrawRegistry.deregisterComponentConverter(apiMeshSubSceneOverride.sEdgeSelectionName)
6783 omr.MDrawRegistry.deregisterComponentConverter(apiMeshSubSceneOverride.sFaceSelectionName)
6786 for faceSelectionName
in sViewSelectedFaceSelectionNames:
6787 omr.MDrawRegistry.deregisterComponentConverter(faceSelectionName)
6790 omr.MDrawRegistry.deregisterComponentConverter(apiMeshGeometryOverride.sVertexItemName)
6791 omr.MDrawRegistry.deregisterComponentConverter(apiMeshGeometryOverride.sEdgeSelectionItemName)
6792 omr.MDrawRegistry.deregisterComponentConverter(apiMeshGeometryOverride.sFaceSelectionItemName)
6795 omr.MDrawRegistry.deregisterGeometryOverrideCreator(apiMeshGeometryShape.sDrawDbClassification, apiMesh.sDrawRegistrantId)
6797 sys.stderr.write(
"Failed to deregister override\n")
6801 omr.MDrawRegistry.deregisterSubSceneOverrideCreator(apiMeshSubsceneShape.sDrawDbClassification, apiMesh.sDrawRegistrantId)
6803 sys.stderr.write(
"Failed to deregister override\n")
6807 plugin.deregisterNode(apiMeshCreator.id)
6809 sys.stderr.write(
"Failed to deregister node\n")
6813 plugin.deregisterNode(apiMeshSubsceneShape.id)
6815 sys.stderr.write(
"Failed to deregister node\n")
6819 plugin.deregisterNode(apiMeshGeometryShape.id)
6821 sys.stderr.write(
"Failed to deregister node\n")
6825 plugin.deregisterData(apiMeshData.id)
6827 sys.stderr.write(
"Failed to deregister data\n")