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()
and evalType
is not om.MPxNode.kLeaveDirty:
655 if ( evaluationNode.dirtyPlugExists(apiMesh.inputSurface)
or
656 evaluationNode.dirtyPlugExists(apiMesh.mControlPoints) ):
657 self.notifyViewport()
659 def setDependentsDirty(self, plug, plugArray):
671 if plug == apiMesh.inputSurface
or plug == om.MPxSurfaceShape.mControlPoints
or plug == om.MPxSurfaceShape.mControlValueX
or plug == om.MPxSurfaceShape.mControlValueY
or plug == om.MPxSurfaceShape.mControlValueZ:
672 self.signalDirtyToViewport()
674 def getInternalValue(self, plug, handle):
700 if plug == om.MPxSurfaceShape.mControlPoints
or plug == om.MPxSurfaceShape.mControlValueX
or plug == om.MPxSurfaceShape.mControlValueY
or plug == om.MPxSurfaceShape.mControlValueZ:
708 if self.hasHistory():
709 return om.MPxNode.getInternalValue(self, plug, handle)
712 if plug == om.MPxSurfaceShape.mControlPoints
and not plug.isArray():
713 index = plug.logicalIndex()
714 pnt = self.getPointValue(index)
715 handle.set3Double( pnt[0], pnt[1], pnt[2] )
717 elif plug == om.MPxSurfaceShape.mControlValueX:
718 parentPlug = plug.parent()
719 index = parentPlug.logicalIndex()
720 val = self.getChannelValue( index, 0 )
721 handle.setDouble( val )
723 elif plug == om.MPxSurfaceShape.mControlValueY:
724 parentPlug = plug.parent()
725 index = parentPlug.logicalIndex()
726 val = self.getChannelValue( index, 1 )
727 handle.setDouble( val )
729 elif plug == om.MPxSurfaceShape.mControlValueZ:
730 parentPlug = plug.parent()
731 index = parentPlug.logicalIndex()
732 val = self.getChannelValue( index, 2 )
733 handle.setDouble( val )
742 elif plug == om.MPxSurfaceShape.mHasHistoryOnCreate:
743 handle.setBool( self.fHasHistoryOnCreate )
746 isOk = om.MPxSurfaceShape.getInternalValue(self, plug, handle)
750 def setInternalValue(self, plug, handle):
776 if plug == om.MPxSurfaceShape.mControlPoints
or plug == om.MPxSurfaceShape.mControlValueX
or plug == om.MPxSurfaceShape.mControlValueY
or plug == om.MPxSurfaceShape.mControlValueZ:
786 if self.hasHistory():
787 self.verticesUpdated()
788 return om.MPxNode.setInternalValue(self, plug, handle)
791 if plug == om.MPxSurfaceShape.mControlPoints
and not plug.isArray():
792 index = plug.logicalIndex()
793 self.setPointValue( index, handle.asDouble3() )
795 elif plug == om.MPxSurfaceShape.mControlValueX:
796 parentPlug = plug.parent()
797 index = parentPlug.logicalIndex()
798 self.setChannelValue( index, 0, handle.asDouble() )
800 elif plug == om.MPxSurfaceShape.mControlValueY:
801 parentPlug = plug.parent()
802 index = parentPlug.logicalIndex()
803 self.setChannelValue( index, 1, handle.asDouble() )
805 elif plug == om.MPxSurfaceShape.mControlValueZ:
806 parentPlug = plug.parent()
807 index = parentPlug.logicalIndex()
808 self.setChannelValue( index, 2, handle.asDouble() )
817 elif plug == om.MPxSurfaceShape.mHasHistoryOnCreate:
818 self.fHasHistoryOnCreate = handle.asBool()
821 isOk = om.MPxSurfaceShape.setInternalValue(self, plug, handle)
825 def connectionMade(self, plug, otherPlug, asSrc):
833 if plug == apiMesh.inputSurface:
834 thisObj = self.thisMObject()
835 historyPlug = om.MPlug( thisObj, om.MPxSurfaceShape.mHasHistoryOnCreate )
836 historyPlug.setBool(
True )
838 thisObj = self.thisMObject()
839 dgNode = om.MFnDependencyNode( thisObj )
840 instObjGroups = dgNode.findPlug(
"instObjGroups",
True)
841 if plug == instObjGroups:
842 self.setMaterialDirty(
True)
844 return om.MPxNode.connectionMade(self, plug, otherPlug, asSrc )
846 def connectionBroken(self, plug, otherPlug, asSrc):
854 if plug == apiMesh.inputSurface:
855 thisObj = self.thisMObject()
856 historyPlug = om.MPlug( thisObj, om.MPxSurfaceShape.mHasHistoryOnCreate )
857 historyPlug.setBool(
False )
859 thisObj = self.thisMObject()
860 dgNode = om.MFnDependencyNode( thisObj )
861 instObjGroups = dgNode.findPlug(
"instObjGroups",
True)
862 if plug == instObjGroups:
863 self.setMaterialDirty(
True)
865 return om.MPxNode.connectionBroken(self, plug, otherPlug, asSrc )
867 def shouldSave(self, plug):
878 if plug == om.MPxSurfaceShape.mControlPoints
or plug == om.MPxSurfaceShape.mControlValueX
or plug == om.MPxSurfaceShape.mControlValueY
or plug == om.MPxSurfaceShape.mControlValueZ:
879 if self.hasHistory():
883 result = om.MPxNode.shouldSave(self, plug)
888 elif plug == apiMesh.cachedSurface:
889 if self.hasHistory():
893 data = plug.asMObject()
894 result =
not data.isNull()
897 result = om.MPxNode.shouldSave(self, plug)
903 def componentToPlugs(self, component, list):
916 if component.hasFn(om.MFn.kSingleIndexedComponent):
917 fnVtxComp = om.MFnSingleIndexedComponent( self.convertToVertexComponent(component) )
918 thisNode = self.thisMObject()
919 plug = om.MPlug( thisNode, om.MPxSurfaceShape.mControlPoints )
923 self.convertToTweakNodePlug(plug)
925 for i
in range(fnVtxComp.elementCount):
926 plug.selectAncestorLogicalIndex(fnVtxComp.element(i), plug.attribute())
929 def matchComponent(self, item, spec, list):
953 result = om.MPxSurfaceShape.kMatchOk
955 dim = attrSpec.dimensions
964 if ( (1 == len(spec))
and (dim > 0)
and ((name ==
"vtx")
or (name ==
"f")) ):
966 attrIndex = attrSpec[0]
969 numComp = self.meshGeom().faceCount
970 typeComp = om.MFn.kMeshPolygonComponent
972 numComp = len(self.meshGeom().vertices)
973 typeComp = om.MFn.kMeshVertComponent
978 if attrIndex.hasLowerBound():
979 lower = attrIndex.getLower()
980 if attrIndex.hasUpperBound():
981 upper = attrIndex.getUpper()
985 if lower > upper
or upper >= numComp:
986 result = om.MPxSurfaceShape.kMatchInvalidAttributeRange
989 path = item.getDagPath(0)
990 fnComp = om.MFnSingleIndexedComponent()
991 objComp = fnComp.create( typeComp )
993 for i
in range(lower, upper+1):
994 fnComp.addElement( i )
996 list.add( (path, objComp),
False )
1000 result = om.MPxSurfaceShape.matchComponent(self, item, spec, list )
1004 def match(self, mask, componentList):
1025 if len(componentList) == 0:
1026 result = mask.intersects( om.MSelectionMask.kSelectMeshes )
1029 for comp
in componentList:
1030 if comp.apiType() == om.MFn.kMeshVertComponent
and mask.intersects(om.MSelectionMask.kSelectMeshVerts):
1038 def createFullVertexGroup(self):
1053 fnComponent = om.MFnSingleIndexedComponent()
1054 fullComponent = fnComponent.create( om.MFn.kMeshVertComponent )
1059 numVertices = len(self.meshGeom().vertices)
1060 fnComponent.setCompleteData( numVertices )
1062 return fullComponent
1064 def getShapeSelectionMask(self):
1074 selType = om.MSelectionMask.kSelectMeshes
1075 return om.MSelectionMask( selType )
1077 def getComponentSelectionMask(self):
1087 selMask = om.MSelectionMask(om.MSelectionMask.kSelectMeshVerts)
1088 selMask.addMask(om.MSelectionMask.kSelectMeshEdges)
1089 selMask.addMask(om.MSelectionMask.kSelectMeshFaces)
1092 def localShapeInAttr(self):
1105 return apiMesh.inputSurface
1107 def localShapeOutAttr(self):
1121 return apiMesh.outputSurface
1123 def worldShapeOutAttr(self):
1137 return apiMesh.outputSurface
1139 def cachedShapeAttr(self):
1151 return apiMesh.cachedSurface
1154 def geometryData(self):
1162 datablock = self.forceCache()
1163 handle = datablock.inputValue( apiMesh.inputSurface )
1164 return handle.data()
1166 def closestPoint(self, toThisPoint, theClosestPoint, tolerance):
1177 geometry = self.meshGeom()
1178 numVertices = len(geometry.vertices)
1179 for i
in range(numVertices):
1180 tryThisOne = geometry.vertices[i]
1184 theClosestPoint = geometry.vertices[0]
1188 def transformUsing(self, mat, componentList, cachingMode=om.MPxSurfaceShape.kNoPointCaching, pointCache=None):
1206 geometry = self.meshGeom()
1210 savePoints = (cachingMode == om.MPxSurfaceShape.kSavePoints
and pointCache
is not None)
1211 restorePoints = (cachingMode == om.MPxSurfaceShape.kRestorePoints
and pointCache
is not None)
1216 cacheLen = len(pointCache)
1221 if len(componentList) > 0:
1224 for comp
in componentList:
1225 fnComp = om.MFnSingleIndexedComponent( self.convertToVertexComponent(comp) )
1226 elemCount = fnComp.elementCount
1228 for idx
in range(elemCount):
1229 elemIndex = fnComp.element(idx)
1230 geometry.vertices[elemIndex] = pointCache[cacheIndex]
1232 if cacheIndex >= cacheLen:
1235 if cacheIndex >= cacheLen:
1242 vertLen = len(geometry.vertices)
1243 for idx
in range(vertLen):
1244 geometry.vertices[idx] = pointCache[cacheIndex]
1246 if cacheIndex >= cacheLen:
1253 if len(componentList) > 0:
1256 setSizeIncrement =
True
1257 for comp
in componentList:
1258 fnComp = om.MFnSingleIndexedComponent( self.convertToVertexComponent(comp) )
1259 elemCount = fnComp.elementCount
1261 if savePoints
and setSizeIncrement:
1262 pointCache.sizeIncrement = elemCount
1263 setSizeIncrement =
False
1265 for idx
in range(elemCount):
1266 elemIndex = fnComp.element(idx)
1268 pointCache.append(geometry.vertices[elemIndex])
1270 geometry.vertices[elemIndex] *= mat
1271 geometry.normals[idx] = geometry.normals[idx].transformAsNormal( mat )
1277 vertLen = len(geometry.vertices)
1279 pointCache.sizeIncrement = vertLen
1281 for idx
in range(vertLen):
1283 pointCache.append(geometry.vertices[idx])
1285 geometry.vertices[idx] *= mat
1286 geometry.normals[idx] = geometry.normals[idx].transformAsNormal( mat )
1289 self.updateCachedSurface( geometry, componentList )
1291 def tweakUsing(self, mat, componentList, cachingMode, pointCache, handle):
1312 geometry = self.meshGeom()
1316 savePoints = (cachingMode == om.MPxSurfaceShape.kSavePoints
and pointCache
is not None)
1317 updatePoints = (cachingMode == om.MPxSurfaceShape.kUpdatePoints
and pointCache
is not None)
1318 restorePoints = (cachingMode == om.MPxSurfaceShape.kRestorePoints
and pointCache
is not None)
1320 builder = handle.builder()
1325 cacheLen = len(pointCache)
1330 if len(componentList) > 0:
1333 for comp
in componentList:
1334 fnComp = om.MFnSingleIndexedComponent( self.convertToVertexComponent(comp) )
1335 elemCount = fnComp.elementCount
1337 for idx
in range(elemCount):
1338 elemIndex = fnComp.element(idx)
1339 cachePt = pointCache[cacheIndex]
1340 elem = builder.addElement( elemIndex )
1341 elem.set3Double(cachePt.x, cachePt.y, cachePt.z)
1343 if cacheIndex >= cacheLen:
1346 if cacheIndex >= cacheLen:
1353 vertLen = len(geometry.vertices)
1354 for idx
in range(vertLen):
1355 cachePt = pointCache[cacheIndex]
1356 elem = builder.addElement( idx )
1357 elem.set3Double(cachePt.x, cachePt.y, cachePt.z)
1359 if cacheIndex >= cacheLen:
1367 if len(componentList) > 0:
1368 setSizeIncrement =
True
1369 for comp
in componentList:
1370 fnComp = om.MFnSingleIndexedComponent( self.convertToVertexComponent(comp) )
1371 elemCount = fnComp.elementCount
1373 if savePoints
and setSizeIncrement:
1374 pointCache.sizeIncrement = elemCount
1375 setSizeIncrement =
False
1377 for idx
in range(elemCount):
1378 elemIndex = fnComp.element(idx)
1379 currPt = newPt = geometry.vertices[elemIndex]
1381 delta = newPt - currPt
1382 elem = builder.addElement( elemIndex )
1383 elem.set3Double(delta.x, delta.y, delta.z)
1388 pointCache.append(delta*(-1.0))
1390 elif updatePoints
and cacheIndex < cacheLen:
1391 pointCache[cacheIndex] = pointCache[cacheIndex] - delta
1398 vertLen = len(geometry.vertices)
1400 pointCache.sizeIncrement = vertLen
1402 for idx
in range(vertLen):
1403 currPt = newPt = geometry.vertices[idx]
1405 delta = newPt - currPt
1406 elem = builder.addElement( idx )
1407 elem.set3Double(delta.x, delta.y, delta.z)
1412 pointCache.append(delta*(-1.0))
1414 elif updatePoints
and idx < cacheLen:
1415 pointCache[cacheIndex] = pointCache[cacheIndex] - delta
1425 self.childChanged( om.MPxSurfaceShape.kBoundingBoxChanged )
1428 self.signalDirtyToViewport()
1432 def weightedTransformUsing(self, xform, space, componentList, cachingMode, pointCache, freezePlane):
1458 plg_useWeightedTransformUsingFunction = om.MPlug( self.thisMObject(), apiMesh.useWeightedTransformUsingFunction )
1459 val_useWeightedTransformUsingFunction = plg_useWeightedTransformUsingFunction.asBool()
1460 if not val_useWeightedTransformUsingFunction:
1461 om.MPxSurfaceShape.weightedTransformUsing(self, xform, space, componentList, cachingMode, pointCache, freezePlane)
1462 self.signalDirtyToViewport()
1467 savePoints = (cachingMode == om.MPxSurfaceShape.kSavePoints
and pointCache
is not None)
1468 updatePoints = (cachingMode == om.MPxSurfaceShape.kUpdatePoints
and pointCache
is not None)
1469 restorePoints = (cachingMode == om.MPxSurfaceShape.kRestorePoints
and pointCache
is not None)
1470 transformOrigPoints = (cachingMode == om.MPxSurfaceShape.kTransformOriginalPoints
and pointCache
is not None)
1473 spaceInv = om.MMatrix()
1475 spaceInv = space.inverse()
1479 geometry = self.meshGeom()
1482 setSizeIncrement =
True
1484 for comp
in componentList:
1485 fnComp = om.MFnSingleIndexedComponent( self.convertToVertexComponent(comp) )
1486 elemCount = fnComp.elementCount
1487 hasWeights = fnComp.hasWeights
1488 hasSeam = (freezePlane
is not None)
1490 if savePoints
and setSizeIncrement:
1491 pointCache.sizeIncrement = elemCount
1492 setSizeIncrement =
False
1494 for idx
in range(elemCount):
1495 elemIndex = fnComp.element( idx )
1498 perc = fnComp.weight(idx).influence()
1501 if perc > almostZero:
1504 geometry.vertices[elemIndex] = om.MVector( pointCache[pointCacheIndex] )
1505 pointCacheIndex += 1
1510 pointCache.append( geometry.vertices[elemIndex] )
1512 elif transformOrigPoints:
1513 geometry.vertices[elemIndex] = om.MVector( pointCache[pointCacheIndex] )
1516 pointCache[pointCacheIndex] = geometry.vertices[elemIndex]
1521 mat = xform.asMatrix()
1523 mat = space * xform.asMatrix(perc) * spaceInv
1525 mat = xform.asMatrix(perc)
1528 currPt = newPt = geometry.vertices[elemIndex]
1532 if hasSeam
and fnComp.weight(idx).seam() > 0.0:
1533 newPt += freezePlane.normal() * (fnComp.weight(idx).seam() * (freezePlane.directedDistance(currPt) - freezePlane.directedDistance(newPt)))
1536 geometry.vertices[elemIndex] = newPt
1537 pointCacheIndex += 1
1540 self.updateCachedSurface( geometry, componentList )
1542 def weightedTweakUsing(self, xform, space, componentList, cachingMode, pointCache, freezePlane, handle):
1573 plg_useWeightedTweakUsingFunction = om.MPlug( self.thisMObject(), apiMesh.useWeightedTweakUsingFunction )
1574 val_useWeightedTweakUsingFunction = plg_useWeightedTweakUsingFunction.asBool()
1575 if not val_useWeightedTweakUsingFunction:
1576 om.MPxSurfaceShape.weightedTweakUsing(self, xform, space, componentList, cachingMode, pointCache, freezePlane, handle)
1579 geometry = self.meshGeom()
1583 savePoints = (cachingMode == om.MPxSurfaceShape.kSavePoints
and pointCache
is not None)
1584 updatePoints = (cachingMode == om.MPxSurfaceShape.kUpdatePoints
and pointCache
is not None)
1585 restorePoints = (cachingMode == om.MPxSurfaceShape.kRestorePoints
and pointCache
is not None)
1586 transformOrigPoints = (cachingMode == om.MPxSurfaceShape.kTransformOriginalPoints
and pointCache
is not None)
1588 builder = handle.builder()
1593 cacheLen = len(pointCache)
1600 for comp
in componentList:
1601 fnComp = om.MFnSingleIndexedComponent( self.convertToVertexComponent(comp) )
1602 elemCount = fnComp.elementCount
1604 for idx
in range(elemCount):
1605 elemIndex = fnComp.element( idx )
1606 cachePt = pointCache[cacheIndex]
1607 elem = builder.addElement( elemIndex )
1608 elem.set3Double(cachePt.x, cachePt.y, cachePt.z)
1610 if cacheIndex >= cacheLen:
1621 setSizeIncrement =
True
1622 spaceInv = om.MMatrix()
1624 spaceInv = space.inverse()
1626 for comp
in componentList:
1627 fnComp = om.MFnSingleIndexedComponent( self.convertToVertexComponent(comp) )
1628 elemCount = fnComp.elementCount
1629 hasWeights = fnComp.hasWeights
1630 hasSeam = (freezePlane
is not None)
1632 if savePoints
and setSizeIncrement:
1633 pointCache.sizeIncrement = elemCount
1634 setSizeIncrement =
False
1636 for idx
in range(elemCount):
1637 elemIndex = fnComp.element( idx )
1640 perc = fnComp.weight(idx).influence()
1643 if perc > almostZero:
1649 mat = xform.asMatrix()
1651 mat = space * xform.asMatrix(perc) * spaceInv
1653 mat = xform.asMatrix(perc)
1658 if transformOrigPoints:
1659 geometry.vertices[elemIndex] = om.MVector( pointCache[cacheIndex] )
1663 currPt = newPt = geometry.vertices[elemIndex]
1668 if hasSeam
and fnComp.weight(idx).seam() > 0.0:
1669 newPt += freezePlane.normal() * (fnComp.weight(idx).seam() * (freezePlane.directedDistance(currPt) - freezePlane.directedDistance(newPt)))
1672 delta = newPt - currPt
1674 elem = builder.addElement( elemIndex )
1675 elem.set3Double(delta.x, delta.y, delta.z)
1680 pointCache.append(delta*(-1.0))
1681 elif updatePoints
and cacheIndex < cacheLen:
1682 pointCache[cacheIndex] = pointCache[cacheIndex] - delta
1692 self.childChanged( om.MPxSurfaceShape.kBoundingBoxChanged )
1696 def vertexOffsetDirection(self, component, direction, mode, normalize):
1715 fnComp = om.MFnSingleIndexedComponent( self.convertToVertexComponent(component) )
1716 if component.apiType() != om.MFn.kMeshVertComponent:
1719 geometry = self.meshGeom()
1726 normal = geometry.normals[ idx ]
1728 if mode == om.MPxSurfaceShape.kNormal:
1731 direction.append( normal )
1737 uAxis = om.MVector()
1738 vAxis = om.MVector()
1742 a = math.abs(normal[0])
1744 if a < math.abs(normal[1]):
1746 a = math.fabs(normal[1])
1748 if a < math.abs(normal[2]):
1754 a = math.sqrt(normal[i]*normal[i] + normal[j]*normal[j])
1755 uAxis[i] = -normal[j]/a
1756 uAxis[j] = normal[i]/a
1758 vAxis = normal^uAxis
1760 if mode == om.MPxSurfaceShape.kUTangent
or mode == om.MPxSurfaceShape.kUVNTriad:
1763 direction.append( uAxis )
1765 if mode == om.MPxSurfaceShape.kVTangent
or mode == om.MPxSurfaceShape.kUVNTriad:
1768 direction.append( vAxis )
1770 if mode == om.MPxSurfaceShape.kUVNTriad:
1773 direction.append( normal )
1779 def isBounded(self):
1788 def boundingBox(self):
1795 if self.fShapeDirty:
1799 thisNode = self.thisMObject()
1800 c1Plug = om.MPlug( thisNode, apiMesh.bboxCorner1 )
1801 c2Plug = om.MPlug( thisNode, apiMesh.bboxCorner2 )
1802 corner1Object = c1Plug.asMObject()
1803 corner2Object = c2Plug.asMObject()
1805 fnData = om.MFnNumericData()
1806 fnData.setObject( corner1Object )
1807 corner1 = fnData.getData()
1809 fnData.setObject( corner2Object )
1810 corner2 = fnData.getData()
1812 corner1Point = om.MPoint( corner1[0], corner1[1], corner1[2] )
1813 corner2Point = om.MPoint( corner2[0], corner2[1], corner2[2] )
1815 return om.MBoundingBox( corner1Point, corner2Point )
1819 def geometryIteratorSetup(self, componentList, components, forReadOnly=False):
1836 if components.isNull():
1837 vtxComponents = om.MObjectArray([self.convertToVertexComponent(c)
for c
in componentList])
1838 return apiMeshGeomIterator( self.meshGeom(), vtxComponents )
1840 return apiMeshGeomIterator( self.meshGeom(), self.convertToVertexComponent(components) )
1842 def acceptsGeometryIterator(self, arg0, arg1=None, arg2=None):
1868 def hasHistory(self):
1874 return self.fHasHistoryOnCreate
1876 def shapeDirty(self):
1883 return self.fShapeDirty
1885 def resetShapeDirty(self):
1891 self.fShapeDirty =
False
1893 def materialDirty(self):
1900 return self.fMaterialDirty
1902 def setMaterialDirty(self, dirty):
1908 self.fMaterialDirty = dirty
1910 def computeInputSurface(self, plug, datablock):
1919 if self.hasHistory():
1920 inputHandle = datablock.inputValue( apiMesh.inputSurface )
1922 surf = inputHandle.asPluginData()
1923 if not isinstance(surf, apiMeshData):
1924 raise RuntimeError(
"computeInputSurface : invalid inputSurface data found")
1928 fnDataCreator = om.MFnPluginData()
1929 fnDataCreator.create( apiMeshData.id )
1931 newCachedData = fnDataCreator.data()
1932 if not isinstance(newCachedData, apiMeshData):
1933 raise RuntimeError(
"computeInputSurface : invalid proxy cached apiMeshData object")
1935 newCachedData.fGeometry.copy(surf.fGeometry)
1937 cachedHandle = datablock.outputValue( apiMesh.cachedSurface )
1938 if not isinstance(cachedHandle, om.MDataHandle):
1939 raise RuntimeError(
"computeInputSurface : invalid cachedSurface")
1941 cachedHandle.setMPxData( newCachedData )
1943 def computeOutputSurface(self, plug, datablock):
1958 self.computeInputSurface( plug, datablock )
1962 cachedHandle = datablock.outputValue( apiMesh.cachedSurface )
1963 if not isinstance(cachedHandle, om.MDataHandle):
1964 raise RuntimeError(
"computeOutputSurface : invalid cachedSurface")
1966 cached = cachedHandle.asPluginData()
1967 if not isinstance(cached, apiMeshData):
1968 raise RuntimeError(
"computeOutputSurface : invalid cachedSurface data found")
1970 datablock.setClean( plug )
1974 if self.hasHistory():
1975 self.applyTweaks( datablock, cached.fGeometry )
1978 cpHandle = datablock.inputArrayValue( om.MPxSurfaceShape.mControlPoints )
1979 cpHandle.setAllClean()
1983 fnDataCreator = om.MFnPluginData()
1984 fnDataCreator.create( apiMeshData.id )
1986 newData = fnDataCreator.data()
1987 if not isinstance(newData, apiMeshData):
1988 raise RuntimeError(
"computeOutputSurface : invalid proxy cached apiMeshData object")
1992 newData.fGeometry.copy(cached.fGeometry)
1996 outHandle = datablock.outputValue( apiMesh.outputSurface )
1997 outHandle.setMPxData( newData )
2001 self.computeBoundingBox( datablock )
2006 def computeWorldSurface(self, plug, datablock):
2013 self.computeOutputSurface( plug, datablock )
2014 inHandle = datablock.outputValue( apiMesh.outputSurface )
2015 outSurf = inHandle.asPluginData()
2016 if not isinstance(outSurf, apiMeshData):
2017 raise RuntimeError(
"computeWorldSurface : invalid outSurf")
2021 fnDataCreator = om.MFnPluginData()
2022 fnDataCreator.create( apiMeshData.id )
2024 newData = fnDataCreator.data()
2025 if not isinstance(newData, apiMeshData):
2026 raise RuntimeError(
"computeWorldSurface : invalid proxy cached apiMeshData object")
2029 worldMat = self.getWorldMatrix(datablock, 0)
2030 newData.matrix = worldMat
2034 newData.fGeometry.copy( outSurf.fGeometry )
2038 arrayIndex = plug.logicalIndex()
2040 worldHandle = datablock.outputArrayValue( apiMesh.worldSurface )
2041 builder = worldHandle.builder()
2042 outHandle = builder.addElement( arrayIndex )
2044 outHandle.setMPxData( newData )
2049 def computeBoundingBox(self, datablock):
2059 lowerHandle = datablock.outputValue( apiMesh.bboxCorner1 )
2060 upperHandle = datablock.outputValue( apiMesh.bboxCorner2 )
2062 geometry = self.meshGeom()
2063 cnt = len(geometry.vertices)
2069 tmppnt = geometry.vertices[0]
2070 lower = [ tmppnt[0], tmppnt[1], tmppnt[2] ]
2071 upper = [ tmppnt[0], tmppnt[1], tmppnt[2] ]
2073 for i
in range(cnt):
2074 pnt = geometry.vertices[i]
2076 if pnt[0] < lower[0]: lower[0] = pnt[0]
2077 if pnt[1] < lower[1]: lower[1] = pnt[1]
2078 if pnt[2] < lower[2]: lower[2] = pnt[2]
2080 if pnt[0] > upper[0]: upper[0] = pnt[0]
2081 if pnt[1] > upper[1]: upper[1] = pnt[1]
2082 if pnt[2] > upper[2]: upper[2] = pnt[2]
2084 lowerHandle.set3Double(lower[0], lower[1], lower[2])
2085 upperHandle.set3Double(upper[0], upper[1], upper[2])
2087 lowerHandle.setClean()
2088 upperHandle.setClean()
2092 self.childChanged( om.MPxSurfaceShape.kBoundingBoxChanged )
2094 def convertToVertexComponent(self, components):
2096 Converts edge and face components into vertex components. This
2097 allows applying transform offsets to the vertex when edge or faces
2103 srcComponent = om.MFnSingleIndexedComponent(components)
2104 srcComponentType = srcComponent.componentType
2108 if srcComponentType != om.MFn.kMeshVertComponent:
2109 srcIndices = set(srcComponent.getElements())
2110 retVal = srcComponent.create(om.MFn.kMeshVertComponent)
2111 vtxComponent = om.MFnSingleIndexedComponent(retVal)
2113 geomPtr = self.meshGeom()
2117 for faceIdx
in range(0, geomPtr.faceCount):
2119 numVerts = geomPtr.face_counts[faceIdx]
2121 for v
in range(0, numVerts):
2122 if srcComponentType == om.MFn.kMeshEdgeComponent:
2123 if edgeId
in srcIndices:
2124 vindex1 = base + (v % numVerts)
2125 vindex2 = base + ((v+1) % numVerts)
2127 vertexId1 = geomPtr.face_connects[vindex1]
2128 vertexId2 = geomPtr.face_connects[vindex2]
2130 vtxComponent.addElement(vertexId1)
2131 vtxComponent.addElement(vertexId2)
2136 if faceIdx
in srcIndices:
2137 vindex = base + (v % numVerts)
2138 vertexId = geomPtr.face_connects[vindex]
2139 vtxComponent.addElement(vertexId)
2145 def applyTweaks(self, datablock, geometry):
2153 cpHandle = datablock.inputArrayValue( om.MPxSurfaceShape.mControlPoints )
2157 while not cpHandle.isDone():
2158 elemIndex = cpHandle.elementLogicalIndex()
2159 pntHandle = cpHandle.outputValue()
2161 offset = pntHandle.asDouble3()
2165 geometry.vertices[elemIndex] += om.MPoint(offset[0],offset[1],offset[2])
2170 def updateCachedSurface(self, geometry, componentList):
2189 datablock = self.forceCache()
2191 cachedHandle = datablock.outputValue( apiMesh.cachedSurface )
2192 cached = cachedHandle.asPluginData()
2194 dHandle = datablock.outputValue( om.MPxSurfaceShape.mControlPoints )
2199 if self.hasHistory()
and cached:
2204 self.buildControlPoints( datablock, len(geometry.vertices) )
2206 cpHandle = om.MArrayDataHandle( dHandle )
2210 for comp
in componentList:
2211 fnComp = om.MFnSingleIndexedComponent( self.convertToVertexComponent(comp) )
2212 for elemIndex
in fnComp.getElements():
2213 cpHandle.jumpToLogicalElement( elemIndex )
2214 pntHandle = cpHandle.outputValue()
2216 pnt = pntHandle.asDouble3()
2218 oldPnt = cached.fGeometry.vertices[elemIndex]
2219 newPnt = geometry.vertices[elemIndex]
2220 offset = newPnt - oldPnt
2226 pntHandle.set3Double(pnt[0], pnt[1], pnt[2])
2231 cached.fGeometry.copy(geometry)
2233 pCPs = om.MPlug( self.thisMObject(), om.MPxSurfaceShape.mControlPoints)
2234 pCPs.setMDataHandle(dHandle)
2238 self.computeBoundingBox( datablock )
2243 self.childChanged( om.MPxSurfaceShape.kBoundingBoxChanged )
2246 self.signalDirtyToViewport()
2248 def getPointValue(self, pntInd):
2255 geometry = self.cachedGeom()
2257 return geometry.vertices[ pntInd ]
2261 def getChannelValue(self, pntInd, vlInd):
2268 geometry = self.cachedGeom()
2270 return geometry.vertices[ pntInd ][ vlInd ]
2274 def setPointValue(self, pntInd, val):
2281 geometry = self.cachedGeom()
2283 geometry.vertices[ pntInd ] = om.MPoint(val)
2285 self.verticesUpdated()
2287 def setChannelValue(self, pntInd, vlInd, val):
2294 geometry = self.cachedGeom()
2296 geometry.vertices[ pntInd ][ vlInd ] = val
2298 self.verticesUpdated()
2300 def meshObject(self):
2311 datablock = self.forceCache()
2317 handle = datablock.inputValue( apiMesh.outputSurface )
2318 return handle.data()
2326 meshObj = self.meshObject()
2327 if meshObj == om.MObject.kNullObj:
2328 raise RuntimeError(
"meshGeom : failed to get apiMeshData")
2329 fnData = om.MFnPluginData( meshObj )
2330 data = fnData.data()
2331 if not isinstance(data, apiMeshData):
2332 raise RuntimeError(
"meshGeom : failed to get apiMeshData")
2333 return data.fGeometry
2335 def cachedObject(self):
2345 datablock = self.forceCache()
2346 handle = datablock.outputValue( apiMesh.cachedSurface )
2347 return handle.data()
2349 def cachedGeom(self):
2356 fnData = om.MFnPluginData( self.cachedObject() )
2357 data = fnData.data()
2358 if not isinstance(data, apiMeshData):
2359 raise RuntimeError(
"cachedGeom : failed to get apiMeshData")
2361 return data.fGeometry
2363 def buildControlPoints(self, datablock, count):
2371 cpH = datablock.outputArrayValue( om.MPxSurfaceShape.mControlPoints )
2373 oldBuilder = cpH.builder()
2374 if count != len(oldBuilder):
2377 builder = om.MArrayDataBuilder( oldBuilder )
2379 for vtx
in range(count):
2380 builder.addElement( vtx )
2386 def verticesUpdated(self):
2394 self.childChanged( om.MPxSurfaceShape.kBoundingBoxChanged )
2395 self.childChanged( om.MPxSurfaceShape.kObjectChanged )
2397 def setShapeDirty(self):
2398 self.fShapeDirty =
True
2400 def notifyViewport(self):
2401 omr.MRenderer.setGeometryDrawDirty(self.thisMObject())
2403 def signalDirtyToViewport(self):
2404 self.setShapeDirty()
2405 self.notifyViewport()
2407 class apiMeshGeometryShape(apiMesh):
2408 sDrawDbClassification =
"drawdb/geometry/apiMesh_py"
2410 id = om.MTypeId(0x8009B)
2413 super(apiMeshGeometryShape, self).__init__()
2417 return apiMeshGeometryShape()
2421 return apiMesh.initialize()
2423 class apiMeshSubsceneShape(apiMesh):
2424 sDrawDbClassification =
"drawdb/subscene/apiMesh_py"
2426 id = om.MTypeId(0x8009C)
2429 super(apiMeshSubsceneShape, self).__init__()
2433 return apiMeshSubsceneShape()
2437 om.MPxNode.inheritAttributesFrom(apiMesh.sNodeName)
2449 class apiMeshCreator(om.MPxNode):
2450 id = om.MTypeId(0x8008A)
2460 outputSurface =
None
2464 return apiMeshCreator()
2468 typedAttr = om.MFnTypedAttribute()
2469 numericAttr = om.MFnNumericAttribute()
2470 enumAttr = om.MFnEnumAttribute()
2473 apiMeshCreator.size = numericAttr.create(
"size",
"sz", om.MFnNumericData.kDouble, 1 )
2474 numericAttr.array =
False
2475 numericAttr.usesArrayDataBuilder =
False
2476 numericAttr.hidden =
False
2477 numericAttr.keyable =
True
2478 om.MPxNode.addAttribute( apiMeshCreator.size )
2480 apiMeshCreator.shapeType = enumAttr.create(
"shapeType",
"st", 0 )
2481 enumAttr.addField(
"cube", 0 )
2482 enumAttr.addField(
"sphere", 1 )
2483 enumAttr.hidden =
False
2484 enumAttr.keyable =
True
2485 om.MPxNode.addAttribute( apiMeshCreator.shapeType )
2487 apiMeshCreator.inputMesh = typedAttr.create(
"inputMesh",
"im", om.MFnData.kMesh, om.MObject.kNullObj )
2488 typedAttr.hidden =
True
2489 om.MPxNode.addAttribute( apiMeshCreator.inputMesh )
2492 apiMeshCreator.outputSurface = typedAttr.create(
"outputSurface",
"os", apiMeshData.id, om.MObject.kNullObj )
2493 typedAttr.writable =
False
2494 om.MPxNode.addAttribute( apiMeshCreator.outputSurface )
2498 om.MPxNode.attributeAffects( apiMeshCreator.inputMesh, apiMeshCreator.outputSurface )
2499 om.MPxNode.attributeAffects( apiMeshCreator.size, apiMeshCreator.outputSurface )
2500 om.MPxNode.attributeAffects( apiMeshCreator.shapeType, apiMeshCreator.outputSurface )
2503 om.MPxNode.__init__(self)
2511 def compute(self, plug, datablock):
2519 if plug == apiMeshCreator.outputSurface:
2523 fnDataCreator = om.MFnPluginData()
2524 fnDataCreator.create( apiMeshData.id )
2526 newData = fnDataCreator.data()
2527 if not isinstance(newData, apiMeshData):
2528 raise RuntimeError(
"compute : invalid proxy cached apiMeshData object")
2530 geometry = newData.fGeometry
2535 hasHistory = self.computeInputMesh( plug, datablock, geometry )
2541 sizeHandle = datablock.inputValue( apiMeshCreator.size )
2542 shape_size = sizeHandle.asDouble()
2543 typeHandle = datablock.inputValue( apiMeshCreator.shapeType )
2544 shape_type = typeHandle.asShort()
2547 self.buildCube( shape_size, geometry )
2548 elif shape_type == 1:
2549 self.buildSphere( shape_size, 32, geometry )
2551 geometry.faceCount = len(geometry.face_counts)
2555 outHandle = datablock.outputValue( apiMeshCreator.outputSurface )
2556 outHandle.setMPxData( newData )
2557 datablock.setClean( plug )
2571 def computeInputMesh(self, plug, datablock, geometry):
2582 inputData = datablock.inputValue( apiMeshCreator.inputMesh )
2583 surf = inputData.asMesh()
2587 thisObj = self.thisMObject()
2588 surfPlug = om.MPlug( thisObj, apiMeshCreator.inputMesh )
2589 if not surfPlug.isConnected:
2590 datablock.setClean( plug )
2595 surfFn = om.MFnMesh(surf)
2596 geometry.vertices = surfFn.getPoints(om.MSpace.kObject)
2600 hasUVs = surfFn.numUVs() > 0
2601 uvs = surfFn.getUVs()
2602 geometry.uvcoords.ucoord = uvs[0]
2603 geometry.uvcoords.vcoord = uvs[1]
2605 for i
in range(surfFn.numPolygons()):
2606 polyVerts = surfFn.getPolygonVertices(i)
2608 pvc = len(polyVerts)
2609 geometry.face_counts.append( pvc )
2611 for v
in range(pvc):
2613 uvId = surfFn.getPolygonUVid(i, v)
2614 geometry.uvcoords.faceVertexIndex.append( uvId )
2615 geometry.face_connects.append( polyVerts[v] )
2617 for n
in range(len(geometry.vertices)):
2618 normal = surfFn.getVertexNormal(n)
2619 geometry.normals.append( normal )
2623 def buildCube(self, cube_size, geometry):
2630 geometry.vertices.clear()
2631 geometry.normals.clear()
2632 geometry.face_counts.clear()
2633 geometry.face_connects.clear()
2634 geometry.uvcoords.reset()
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 ) )
2643 geometry.vertices.append( om.MPoint( cube_size, cube_size, -cube_size ) )
2645 normal_value = 0.5775
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 ) )
2653 geometry.normals.append( om.MVector( normal_value, normal_value, -normal_value ) )
2658 uv_pts = [ [ 0.375, 0.0 ],
2675 num_face_connects = 24
2676 uv_fvid = [ 0, 1, 2, 3,
2683 for i
in range(uv_count):
2684 geometry.uvcoords.append_uv( uv_pts[i][0], uv_pts[i][1] )
2686 for i
in range(num_face_connects):
2687 geometry.uvcoords.faceVertexIndex.append( uv_fvid[i] )
2693 face_counts = [ 4, 4, 4, 4, 4, 4 ]
2695 for i
in range(num_faces):
2696 geometry.face_counts.append( face_counts[i] )
2700 face_connects = [ 0, 1, 2, 3,
2707 for i
in range(num_face_connects):
2708 geometry.face_connects.append( face_connects[i] )
2710 def buildSphere(self, radius, divisions, geometry):
2718 geometry.vertices.clear()
2719 geometry.normals.clear()
2720 geometry.face_counts.clear()
2721 geometry.face_connects.clear()
2722 geometry.uvcoords.reset()
2726 u_delta = math.pi / divisions
2727 v_delta = 2 * math.pi / divisions
2729 topPole = om.MPoint( 0.0, radius, 0.0 )
2730 botPole = om.MPoint( 0.0, -radius, 0.0 )
2734 geometry.vertices.append( botPole )
2735 geometry.normals.append( botPole - om.MPoint.kOrigin )
2737 for i
in range(divisions-1):
2741 for j
in range(divisions):
2742 x = radius * math.cos(u) * math.cos(v)
2743 y = radius * math.sin(u)
2744 z = radius * math.cos(u) * math.sin(v)
2746 pnt = om.MPoint( x, y, z )
2747 geometry.vertices.append( pnt )
2748 geometry.normals.append( pnt - om.MPoint.kOrigin )
2751 geometry.vertices.append( topPole )
2752 geometry.normals.append( topPole - om.MPoint.kOrigin )
2758 for i
in range(divisions):
2759 for j
in range(divisions):
2761 geometry.face_counts.append( 3 )
2763 geometry.face_connects.append( 0 )
2764 geometry.face_connects.append( j + vid )
2765 if j == divisions-1:
2766 geometry.face_connects.append( vid )
2768 geometry.face_connects.append( j + vid + 1 )
2770 elif i == divisions-1:
2771 geometry.face_counts.append( 3 )
2773 geometry.face_connects.append( j + vid + 1 - divisions )
2774 geometry.face_connects.append( vid + 1 )
2775 if j == divisions-1:
2776 geometry.face_connects.append( vid + 1 - divisions )
2778 geometry.face_connects.append( j + vid + 2 - divisions )
2781 geometry.face_counts.append( 4 )
2783 geometry.face_connects.append( j + vid + 1 - divisions )
2784 geometry.face_connects.append( j + vid + 1 )
2785 if j == divisions-1:
2786 geometry.face_connects.append( vid + 1 )
2787 geometry.face_connects.append( vid + 1 - divisions )
2789 geometry.face_connects.append( j + vid + 2 )
2790 geometry.face_connects.append( j + vid + 2 - divisions )
2797 class ShadedItemUserData(om.MUserData):
2798 def __init__(self, override):
2799 om.MUserData.__init__(self, legacy=
False)
2800 self.fOverride = override
2804 class apiMeshHWSelectionUserData(om.MUserData):
2806 om.MUserData.__init__(self, legacy=
False)
2807 self.fMeshGeom =
None
2808 self.fInstanceIndex = 0
2809 self.fFaceViewSelectedStates =
None
2812 sViewSelectedInstanceMark = -1
2813 sViewSelectedFaceSelectionNames = set()
2818 def gatherViewSelectedFaceInfo(frameContext, instances, meshGeom):
2819 viewSelectedFaceInfo = collections.defaultdict(list)
2821 if (
not meshGeom
or meshGeom.faceCount <= 0):
2822 return False, viewSelectedFaceInfo
2824 renderingDestinationResult = frameContext.renderingDestination()
2826 if (renderingDestinationResult[0] != omr.MFrameContext.k3dViewport):
2827 return False, viewSelectedFaceInfo
2829 view = omui.M3dView.getM3dViewFromModelPanel(renderingDestinationResult[1])
2831 if(
not view
or not view.viewIsFiltered()):
2832 return False, viewSelectedFaceInfo
2835 viewSelectedList = view.filteredObjectList()
2836 if(viewSelectedList):
2838 for instIdx
in range(len(instances)):
2839 intersectionList = om.MSelectionList()
2841 intersectionList.add(instances[instIdx])
2842 intersectionList.intersect(viewSelectedList,
True)
2844 selectionIt = om.MItSelectionList(intersectionList)
2845 while not selectionIt.isDone():
2846 comp = selectionIt.getComponent()[1]
2849 viewSelectedFaceInfo[instIdx].append(sViewSelectedInstanceMark)
2852 fnComp = om.MFnSingleIndexedComponent(comp)
2854 if (fnComp.componentType == om.MFn.kMeshPolygonComponent):
2855 faceIds = fnComp.getElements()
2857 for i
in range(len(faceIds)):
2859 if (faceId >= 0
and faceId < meshGeom.faceCount):
2860 viewSelectedFaceInfo[instIdx].append(faceId)
2864 return True, viewSelectedFaceInfo
2868 def shouldDrawInstance(viewSelectedFaceInfo, instIdx):
2871 if instIdx
in viewSelectedFaceInfo:
2872 faceIds = viewSelectedFaceInfo[instIdx]
2875 if id != sViewSelectedInstanceMark:
2893 class simpleComponentConverterSubsceneOverride(omr.MPxComponentConverter):
2894 def __init__(self, componentType, selectionType):
2895 omr.MPxComponentConverter.__init__(self)
2897 self.fComponentType = componentType
2898 self.fSelectionType = selectionType
2900 self.fComponent = om.MFnSingleIndexedComponent()
2901 self.fComponentObject = om.MObject.kNullObj
2902 self.fLookupTable = []
2904 def initialize(self, renderItem):
2906 self.fComponentObject = self.fComponent.create( self.fComponentType )
2911 if self.fComponentType == om.MFn.kMeshPolygonComponent:
2912 selectionData = renderItem.getCustomData()
2913 if isinstance(selectionData, apiMeshHWSelectionUserData):
2914 meshGeom = selectionData.fMeshGeom
2915 faceStates = selectionData.fFaceViewSelectedStates
2919 for i
in range(meshGeom.faceCount):
2920 numVerts = meshGeom.face_counts[i]
2922 if(
not faceStates
or faceStates[i]):
2923 numTriangles += numVerts - 2
2925 self.fLookupTable = [0]*numTriangles
2929 for faceId
in range(meshGeom.faceCount):
2931 numVerts = meshGeom.face_counts[faceId]
2933 if(
not faceStates
or faceStates[faceId]):
2934 for v
in range(1, numVerts-1):
2935 self.fLookupTable[triId] = faceId
2938 def addIntersection(self, intersection):
2945 if self.fComponentType == om.MFn.kMeshEdgeComponent:
2948 if intersection.instanceID == 1
or intersection.instanceID == 3:
2951 idx = intersection.index
2953 if self.fComponentType == om.MFn.kMeshPolygonComponent:
2954 if idx >= 0
and idx < len(self.fLookupTable):
2955 idx = self.fLookupTable[idx]
2957 self.fComponent.addElement(idx)
2959 def component(self):
2961 return self.fComponentObject
2963 def selectionMask(self):
2965 return self.fSelectionType
2969 def creatorVertexSelection():
2970 mask = om.MSelectionMask(om.MSelectionMask.kSelectMeshVerts)
2971 mask.addMask(om.MSelectionMask.kSelectPointsForGravity)
2972 return simpleComponentConverterSubsceneOverride(om.MFn.kMeshVertComponent, mask)
2976 def creatorEdgeSelection():
2977 return simpleComponentConverterSubsceneOverride(om.MFn.kMeshEdgeComponent, om.MSelectionMask.kSelectMeshEdges)
2981 def creatorFaceSelection():
2982 return simpleComponentConverterSubsceneOverride(om.MFn.kMeshPolygonComponent, om.MSelectionMask.kSelectMeshFaces)
2984 class apiMeshSubSceneOverride(omr.MPxSubSceneOverride):
2985 sWireName =
"apiMeshWire_subscene_py"
2986 sSelectName =
"apiMeshSelection_subscene_py"
2987 sBoxName =
"apiMeshBox_subscene_py"
2988 sSelectedBoxName =
"apiMeshBoxSelection_subscene_py"
2989 sShadedName =
"apiMeshShaded_subscene_py"
2990 sTexturedName =
"apiMeshTextured_subscene_py"
2992 sVertexSelectionName =
"apiMeshVertexSelection_subscene_py"
2993 sEdgeSelectionName =
"apiMeshEdgeSelection_subscene_py"
2994 sFaceSelectionName =
"apiMeshFaceSelection_subscene_py"
2996 sActiveVertexName =
"apiMeshActiveVertex_subscene_py"
2997 sActiveEdgeName =
"apiMeshActiveEdge_subscene_py"
2998 sActiveFaceName =
"apiMeshActiveFace_subscene_py"
3000 sNameSeparator =
"_"
3002 class InstanceInfo(object):
3003 def __init__(self, transform, isSelected):
3004 self.fTransform = transform
3005 self.fIsSelected = isSelected
3009 return apiMeshSubSceneOverride(obj)
3012 def shadedItemLinkLost(userData):
3013 if not userData
is None and not userData.fOverride
is None:
3014 if not userData.fOverride.fMesh
is None:
3015 userData.fOverride.fMesh.setMaterialDirty(
True)
3016 userData.fOverride =
None
3019 def __init__(self, obj):
3020 omr.MPxSubSceneOverride.__init__(self, obj)
3022 node = om.MFnDependencyNode(obj)
3023 self.fMesh = node.userNode()
3024 self.fObject = om.MObject(obj)
3025 self.fWireShader =
None
3026 self.fThickWireShader =
None
3027 self.fSelectShader =
None
3028 self.fThickSelectShader =
None
3029 self.fShadedShader =
None
3030 self.fVertexComponentShader =
None
3031 self.fEdgeComponentShader =
None
3032 self.fFaceComponentShader =
None
3033 self.fPositionBuffer =
None
3034 self.fNormalBuffer =
None
3035 self.fBoxPositionBuffer =
None
3036 self.fWireIndexBuffer =
None
3037 self.fBoxIndexBuffer =
None
3038 self.fShadedIndexBuffer =
None
3039 self.fActiveVerticesIndexBuffer =
None
3040 self.fActiveEdgesIndexBuffer =
None
3041 self.fActiveFacesIndexBuffer =
None
3042 self.fThickLineWidth = -1.0
3043 self.fQueuedLineWidth = -1.0
3044 self.fNumInstances = 0
3045 self.fIsInstanceMode =
False
3046 self.fQueueUpdate =
False
3047 self.fUseQueuedLineUpdate =
False
3049 self.fInstanceInfoCache = collections.defaultdict(set)
3051 self.fActiveVerticesSet = set()
3052 self.fActiveEdgesSet = set()
3053 self.fActiveFacesSet = set()
3055 self.fViewSelectedFaceInfoCache = collections.defaultdict(list)
3056 self.fLinkLostCallbackData = []
3061 shaderMgr = omr.MRenderer.getShaderManager()
3063 if self.fWireShader:
3064 shaderMgr.releaseShader(self.fWireShader)
3065 self.fWireShader =
None
3067 if self.fThickWireShader:
3068 shaderMgr.releaseShader(self.fThickWireShader)
3069 self.fThickWireShader =
None
3071 if self.fSelectShader:
3072 shaderMgr.releaseShader(self.fSelectShader)
3073 self.fSelectShader =
None
3075 if self.fThickSelectShader:
3076 shaderMgr.releaseShader(self.fThickSelectShader)
3077 self.fThickSelectShader =
None
3079 if self.fShadedShader:
3080 shaderMgr.releaseShader(self.fShadedShader)
3081 self.fShadedShader =
None
3083 if self.fVertexComponentShader:
3084 shaderMgr.releaseShader(self.fVertexComponentShader)
3085 self.fVertexComponentShader =
None
3087 if self.fEdgeComponentShader:
3088 shaderMgr.releaseShader(self.fEdgeComponentShader)
3089 self.fEdgeComponentShader =
None
3091 if self.fFaceComponentShader:
3092 shaderMgr.releaseShader(self.fFaceComponentShader)
3093 self.fFaceComponentShader =
None
3097 def supportedDrawAPIs(self):
3099 return omr.MRenderer.kOpenGL | omr.MRenderer.kDirectX11 | omr.MRenderer.kOpenGLCoreProfile
3101 def requiresUpdate(self, container, frameContext):
3103 if len(container) == 0:
3110 def update(self, container, frameContext):
3112 self.manageRenderItems(container, frameContext, self.fMesh.shapeDirty()
or len(container) == 0)
3115 self.fMesh.resetShapeDirty()
3117 def furtherUpdateRequired(self, frameContext):
3118 if self.fUseQueuedLineUpdate:
3119 if not frameContext.inUserInteraction()
and not frameContext.userChangingViewContext():
3120 return self.fQueueUpdate
3124 def manageRenderItems(self, container, frameContext, updateGeometry):
3126 if not self.fMesh
or self.fObject.isNull():
3129 shaderMgr = omr.MRenderer.getShaderManager()
3133 node = om.MFnDagNode(self.fObject)
3134 instances = node.getAllPaths()
3135 if len(instances) == 0:
3139 sRed = [1.0, 0.0, 0.0, 1.0]
3140 sGreen = [0.0, 1.0, 0.0, 1.0]
3141 sWhite = [1.0, 1.0, 1.0, 1.0]
3144 if not self.fWireShader:
3145 self.fWireShader = shaderMgr.getStockShader(omr.MShaderManager.k3dSolidShader)
3146 self.fWireShader.setParameter(
"solidColor", sRed)
3148 if not self.fThickWireShader:
3149 self.fThickWireShader = shaderMgr.getStockShader(omr.MShaderManager.k3dThickLineShader)
3150 self.fThickWireShader.setParameter(
"solidColor", sRed)
3152 if not self.fSelectShader:
3153 self.fSelectShader = shaderMgr.getStockShader(omr.MShaderManager.k3dSolidShader)
3154 self.fSelectShader.setParameter(
"solidColor", sGreen)
3156 if not self.fThickSelectShader:
3157 self.fThickSelectShader = shaderMgr.getStockShader(omr.MShaderManager.k3dThickLineShader)
3158 self.fThickSelectShader.setParameter(
"solidColor", sGreen)
3160 if not self.fVertexComponentShader:
3161 self.fVertexComponentShader = shaderMgr.getStockShader(omr.MShaderManager.k3dFatPointShader)
3162 self.fVertexComponentShader.setParameter(
"solidColor", sWhite)
3163 self.fVertexComponentShader.setParameter(
"pointSize", [5.0, 5.0])
3165 if not self.fEdgeComponentShader:
3166 self.fEdgeComponentShader = shaderMgr.getStockShader(omr.MShaderManager.k3dThickLineShader)
3167 self.fEdgeComponentShader.setParameter(
"solidColor", sWhite)
3168 self.fEdgeComponentShader.setParameter(
"lineWidth", [2.0, 2.0])
3170 if not self.fFaceComponentShader:
3171 self.fFaceComponentShader = shaderMgr.getStockShader(omr.MShaderManager.k3dSolidShader)
3172 self.fFaceComponentShader.setParameter(
"solidColor", sWhite)
3174 if not self.fShadedShader:
3175 self.fShadedShader = shaderMgr.getStockShader(omr.MShaderManager.k3dBlinnShader)
3179 self.rebuildGeometryBuffers()
3181 if not all((self.fPositionBuffer, self.fNormalBuffer, self.fBoxPositionBuffer, self.fWireIndexBuffer, self.fBoxIndexBuffer, self.fShadedIndexBuffer)):
3184 isActiveViewFiltered, viewSelectedFaceInfo = gatherViewSelectedFaceInfo(frameContext, instances, self.fMesh.meshGeom())
3186 selectedList = om.MGlobal.getActiveSelectionList()
3188 anyMatrixChanged =
False
3189 itemsChanged =
False
3190 instanceArrayLength = len(instances)
3191 numInstanceSelected = 0
3192 numInstanceUnselected = 0
3195 instanceMatrixArray = om.MMatrixArray(instanceArrayLength)
3196 selectedInstanceMatrixArray = om.MMatrixArray(instanceArrayLength)
3197 unselectedInstanceMatrixArray = om.MMatrixArray(instanceArrayLength)
3199 for instIdx
in range(instanceArrayLength):
3205 instance = instances[instIdx]
3206 instanceNum = instance.instanceNumber()
3208 if (instance.isValid
and instance.isVisible
and (
not isActiveViewFiltered
or shouldDrawInstance(viewSelectedFaceInfo, instIdx))):
3209 instanceInfo = apiMeshSubSceneOverride.InstanceInfo(instance.inclusiveMatrix(), useSelectHighlight(selectedList, instance))
3211 if( instanceNum
not in self.fInstanceInfoCache
or
3212 self.fInstanceInfoCache[instanceNum].fIsSelected != instanceInfo.fIsSelected
or
3213 not self.fInstanceInfoCache[instanceNum].fTransform.isEquivalent(instanceInfo.fTransform)):
3215 self.fInstanceInfoCache[instanceNum] = instanceInfo
3216 anyMatrixChanged =
True
3218 instanceMatrixArray[numInstances] = instanceInfo.fTransform
3221 if instanceInfo.fIsSelected:
3222 selectedInstanceMatrixArray[numInstanceSelected] = instanceInfo.fTransform
3223 numInstanceSelected += 1
3225 unselectedInstanceMatrixArray[numInstanceUnselected] = instanceInfo.fTransform
3226 numInstanceUnselected += 1
3228 if (instanceNum
in self.fInstanceInfoCache):
3230 del self.fInstanceInfoCache[instanceNum]
3232 anyMatrixChanged =
True
3234 instanceMatrixArray.setLength(numInstances)
3235 selectedInstanceMatrixArray.setLength(numInstanceSelected)
3236 unselectedInstanceMatrixArray.setLength(numInstanceUnselected)
3237 if self.fNumInstances != numInstances:
3238 anyMatrixChanged =
True
3239 self.fNumInstances = numInstances
3241 anyInstanceSelected = numInstanceSelected > 0
3242 anyInstanceUnselected = numInstanceUnselected > 0
3244 activeVerticesSet = set()
3245 activeEdgesSet = set()
3246 activeFacesSet = set()
3248 meshGeom = self.fMesh.meshGeom()
3249 if meshGeom
and self.fMesh.hasActiveComponents():
3250 activeComponents = self.fMesh.activeComponents()
3251 if len(activeComponents) > 0:
3252 fnComponent = om.MFnSingleIndexedComponent( activeComponents[0] )
3253 if fnComponent.elementCount > 0:
3254 activeIds = fnComponent.getElements()
3256 if fnComponent.componentType == om.MFn.kMeshVertComponent:
3257 activeVerticesSet = set(activeIds)
3259 elif fnComponent.componentType == om.MFn.kMeshEdgeComponent:
3260 activeEdgesSet = set(activeIds)
3262 elif fnComponent.componentType == om.MFn.kMeshPolygonComponent:
3263 activeFacesSet = set(activeIds)
3266 updateActiveItems = updateGeometry
or self.fActiveVerticesSet != activeVerticesSet
or self.fActiveEdgesSet != activeEdgesSet
or self.fActiveFacesSet != activeFacesSet
3267 self.fActiveVerticesSet = activeVerticesSet
3268 self.fActiveEdgesSet = activeEdgesSet
3269 self.fActiveFacesSet = activeFacesSet
3271 if updateActiveItems:
3272 self.rebuildActiveComponentIndexBuffers()
3274 anyVertexSelected = bool(self.fActiveVerticesSet)
3275 anyEdgeSelected = bool(self.fActiveEdgesSet)
3276 anyFaceSelected = bool(self.fActiveFacesSet)
3278 if (anyVertexSelected
and not self.fActiveVerticesIndexBuffer)
or (anyEdgeSelected
and not self.fActiveEdgesIndexBuffer)
or (anyFaceSelected
and not self.fActiveFacesIndexBuffer):
3283 wireItem = container.find(self.sWireName)
3284 if not wireItem
and anyInstanceUnselected:
3285 wireItem = omr.MRenderItem.create( self.sWireName, omr.MRenderItem.DecorationItem, omr.MGeometry.kLines)
3286 wireItem.setDrawMode(omr.MGeometry.kWireframe)
3287 wireItem.setDepthPriority(omr.MRenderItem.sActiveWireDepthPriority)
3288 wireItem.setShader(self.fWireShader)
3289 container.add(wireItem)
3292 elif wireItem
and not anyInstanceUnselected:
3293 container.remove(self.sWireName)
3297 selectItem = container.find(self.sSelectName)
3298 if not selectItem
and anyInstanceSelected:
3299 selectItem = omr.MRenderItem.create( self.sSelectName, omr.MRenderItem.DecorationItem, omr.MGeometry.kLines)
3300 selectItem.setDrawMode(omr.MGeometry.kWireframe | omr.MGeometry.kShaded | omr.MGeometry.kTextured)
3301 selectItem.setDepthPriority(omr.MRenderItem.sActiveWireDepthPriority)
3302 selectItem.setShader(self.fSelectShader)
3303 container.add(selectItem)
3306 elif selectItem
and not anyInstanceSelected:
3307 container.remove(self.sSelectName)
3311 boxItem = container.find(self.sBoxName)
3312 if not boxItem
and anyInstanceUnselected:
3313 boxItem = omr.MRenderItem.create( self.sBoxName, omr.MRenderItem.NonMaterialSceneItem, omr.MGeometry.kLines)
3314 boxItem.setDrawMode(omr.MGeometry.kBoundingBox)
3315 boxItem.setShader(self.fWireShader)
3316 container.add(boxItem)
3319 elif boxItem
and not anyInstanceUnselected:
3320 container.remove(self.sBoxName)
3324 selectedBoxItem = container.find(self.sSelectedBoxName)
3325 if not selectedBoxItem
and anyInstanceSelected:
3326 selectedBoxItem = omr.MRenderItem.create( self.sSelectedBoxName, omr.MRenderItem.NonMaterialSceneItem, omr.MGeometry.kLines)
3327 selectedBoxItem.setDrawMode(omr.MGeometry.kBoundingBox)
3328 selectedBoxItem.setShader(self.fSelectShader)
3329 container.add(selectedBoxItem)
3332 elif selectedBoxItem
and not anyInstanceSelected:
3333 container.remove(self.sSelectedBoxName)
3334 selectedBoxItem =
None
3337 shadedItem = container.find(self.sShadedName)
3340 shadedItem = omr.MRenderItem.create( self.sShadedName, omr.MRenderItem.MaterialSceneItem, omr.MGeometry.kTriangles)
3341 shadedItem.setDrawMode(omr.MGeometry.kShaded)
3342 shadedItem.setExcludedFromPostEffects(
False)
3343 shadedItem.setCastsShadows(
True)
3344 shadedItem.setReceivesShadows(
True)
3345 container.add(shadedItem)
3348 texturedItem = container.find(self.sTexturedName)
3349 if not texturedItem:
3351 texturedItem = omr.MRenderItem.create( self.sTexturedName, omr.MRenderItem.MaterialSceneItem, omr.MGeometry.kTriangles)
3352 texturedItem.setDrawMode(omr.MGeometry.kTextured)
3353 texturedItem.setExcludedFromPostEffects(
False)
3354 texturedItem.setCastsShadows(
True)
3355 texturedItem.setReceivesShadows(
True)
3356 container.add(texturedItem)
3365 connectedPlugs = om.MPlugArray()
3366 (sets, comps) = node.getConnectedSetsAndMembers(0,
True)
3368 dn = om.MFnDependencyNode(obj)
3369 shaderPlug = dn.findPlug(
"surfaceShader",
True)
3370 connectedPlugs = shaderPlug.connectedTo(
True,
False)
3371 if len(connectedPlugs) > 0:
3372 shader = connectedPlugs[0].node()
3377 updateMaterial = self.fMesh.materialDirty()
3378 self.fMesh.setMaterialDirty(
False)
3381 if updateMaterial
or not shadedItem.isShaderFromNode():
3383 not shadedItem.setShaderFromNode2(shader,
3385 apiMeshSubSceneOverride.shadedItemLinkLost,
3386 ShadedItemUserData(self),
3388 shadedItem.setShader(self.fShadedShader)
3391 if updateMaterial
or not texturedItem.isShaderFromNode():
3393 not texturedItem.setShaderFromNode2(shader,
3395 apiMeshSubSceneOverride.shadedItemLinkLost,
3396 ShadedItemUserData(self),
3398 texturedItem.setShader(self.fShadedShader)
3400 print(
"Unexpected error:", sys.exc_info()[0])
3404 vertexSelectionItem = container.find(self.sVertexSelectionName)
3405 if not vertexSelectionItem:
3406 vertexSelectionItem = omr.MRenderItem.create( self.sVertexSelectionName, omr.MRenderItem.DecorationItem, omr.MGeometry.kPoints)
3408 vertexSelectionItem.setDrawMode(omr.MGeometry.kSelectionOnly)
3410 mask = om.MSelectionMask(om.MSelectionMask.kSelectMeshVerts)
3411 mask.addMask(om.MSelectionMask.kSelectPointsForGravity)
3412 vertexSelectionItem.setSelectionMask( mask )
3414 vertexSelectionItem.setDepthPriority(omr.MRenderItem.sSelectionDepthPriority)
3415 vertexSelectionItem.setShader(self.fVertexComponentShader)
3416 container.add(vertexSelectionItem)
3422 useDrawInstancingOnEdgeSelectionItem =
False
3425 edgeSelectionItem = container.find(self.sEdgeSelectionName)
3426 if not edgeSelectionItem:
3428 drawMode = omr.MGeometry.kSelectionOnly
3429 depthPriority = omr.MRenderItem.sSelectionDepthPriority
3430 if useDrawInstancingOnEdgeSelectionItem:
3432 drawMode = omr.MGeometry.kAll
3434 depthPriority = omr.MRenderItem.sActiveWireDepthPriority-1
3436 edgeSelectionItem = omr.MRenderItem.create( self.sEdgeSelectionName, omr.MRenderItem.DecorationItem, omr.MGeometry.kLines)
3437 edgeSelectionItem.setDrawMode(drawMode)
3439 edgeSelectionItem.setDepthPriority(depthPriority)
3441 edgeSelectionItem.setSelectionMask( om.MSelectionMask.kSelectMeshEdges )
3442 edgeSelectionItem.setShader(self.fWireShader)
3443 container.add(edgeSelectionItem)
3447 faceSelectionItem = container.find(self.sFaceSelectionName)
3448 if not faceSelectionItem:
3449 faceSelectionItem = omr.MRenderItem.create( self.sFaceSelectionName, omr.MRenderItem.DecorationItem, omr.MGeometry.kTriangles)
3451 faceSelectionItem.setDrawMode(omr.MGeometry.kSelectionOnly)
3453 faceSelectionItem.setSelectionMask( om.MSelectionMask.kSelectMeshFaces )
3455 faceSelectionItem.setDepthPriority(omr.MRenderItem.sSelectionDepthPriority)
3456 faceSelectionItem.setShader(self.fFaceComponentShader)
3457 container.add(faceSelectionItem)
3462 mySelectionData = apiMeshHWSelectionUserData()
3463 mySelectionData.fMeshGeom = self.fMesh.meshGeom()
3464 faceSelectionItem.setCustomData(mySelectionData)
3467 activeVertexItem = container.find(self.sActiveVertexName)
3468 if not activeVertexItem
and anyVertexSelected:
3469 activeVertexItem = omr.MRenderItem.create( self.sActiveVertexName, omr.MRenderItem.DecorationItem, omr.MGeometry.kPoints)
3470 activeVertexItem.setDrawMode(omr.MGeometry.kAll)
3471 activeVertexItem.setDepthPriority(omr.MRenderItem.sActivePointDepthPriority)
3472 activeVertexItem.setShader(self.fVertexComponentShader)
3473 container.add(activeVertexItem)
3476 elif activeVertexItem
and not anyVertexSelected:
3477 container.remove(self.sActiveVertexName)
3478 activeVertexItem =
None
3482 activeEdgeItem = container.find(self.sActiveEdgeName)
3483 if not activeEdgeItem
and anyEdgeSelected:
3484 activeEdgeItem = omr.MRenderItem.create( self.sActiveEdgeName, omr.MRenderItem.DecorationItem, omr.MGeometry.kLines)
3485 activeEdgeItem.setDrawMode(omr.MGeometry.kAll)
3486 activeEdgeItem.setDepthPriority(omr.MRenderItem.sActiveLineDepthPriority)
3487 activeEdgeItem.setShader(self.fEdgeComponentShader)
3488 container.add(activeEdgeItem)
3491 elif activeEdgeItem
and not anyEdgeSelected:
3492 container.remove(self.sActiveEdgeName)
3493 activeEdgeItem =
None
3497 activeFaceItem = container.find(self.sActiveFaceName)
3498 if not activeFaceItem
and anyFaceSelected:
3499 activeFaceItem = omr.MRenderItem.create( self.sActiveFaceName, omr.MRenderItem.DecorationItem, omr.MGeometry.kTriangles)
3500 activeFaceItem.setDrawMode(omr.MGeometry.kAll)
3501 activeFaceItem.setDepthPriority(omr.MRenderItem.sActiveLineDepthPriority)
3502 activeFaceItem.setShader(self.fFaceComponentShader)
3503 container.add(activeFaceItem)
3506 elif activeFaceItem
and not anyFaceSelected:
3507 container.remove(self.sActiveFaceName)
3508 activeFaceItem =
None
3512 lineWidth = frameContext.getGlobalLineWidth()
3513 userWidthChange =
not floatApproxEqual(lineWidth, self.fThickLineWidth)
3516 targetRefinedLineWidth = 50.0
3518 self.fThickLineWidth = lineWidth
3522 if self.fUseQueuedLineUpdate:
3523 self.fQueuedLineWidth = lineWidth
3524 if self.fQueuedLineWidth < targetRefinedLineWidth:
3525 self.fQueueUpdate =
True
3531 if self.fUseQueuedLineUpdate
and self.fQueueUpdate:
3532 if self.fQueuedLineWidth < targetRefinedLineWidth:
3533 lineWidth = self.fQueuedLineWidth
3534 self.fQueuedLineWidth += 1
3535 self.fQueueUpdate =
True
3540 self.fQueueUpdate =
False
3543 if not floatApproxEqual(lineWidth, 1.0):
3545 lineWidthArray = [ lineWidth, lineWidth ]
3546 self.fThickWireShader.setParameter(
"lineWidth", lineWidthArray)
3547 self.fThickSelectShader.setParameter(
"lineWidth", lineWidthArray)
3549 wireItem.setShader(self.fThickWireShader)
3551 selectItem.setShader(self.fThickSelectShader)
3555 wireItem.setShader(self.fWireShader)
3557 selectItem.setShader(self.fSelectShader)
3560 if itemsChanged
or updateGeometry:
3561 bounds = self.fMesh.boundingBox()
3563 wireBuffers = omr.MVertexBufferArray()
3564 wireBuffers.append(self.fPositionBuffer,
"positions")
3566 self.setGeometryForRenderItem(wireItem, wireBuffers, self.fWireIndexBuffer, bounds)
3568 self.setGeometryForRenderItem(selectItem, wireBuffers, self.fWireIndexBuffer, bounds)
3570 boxBuffers = omr.MVertexBufferArray()
3571 boxBuffers.append(self.fBoxPositionBuffer,
"positions")
3573 self.setGeometryForRenderItem(boxItem, boxBuffers, self.fBoxIndexBuffer, bounds)
3575 self.setGeometryForRenderItem(selectedBoxItem, boxBuffers, self.fBoxIndexBuffer, bounds)
3577 shadedBuffers = omr.MVertexBufferArray()
3578 shadedBuffers.append(self.fPositionBuffer,
"positions")
3579 shadedBuffers.append(self.fNormalBuffer,
"normals")
3580 self.setGeometryForRenderItem(shadedItem, shadedBuffers, self.fShadedIndexBuffer, bounds)
3581 self.setGeometryForRenderItem(texturedItem, shadedBuffers, self.fShadedIndexBuffer, bounds)
3584 self.setGeometryForRenderItem(vertexSelectionItem, wireBuffers, objectBox = bounds)
3585 self.setGeometryForRenderItem(edgeSelectionItem, wireBuffers, self.fWireIndexBuffer, bounds)
3586 self.setGeometryForRenderItem(faceSelectionItem, wireBuffers, self.fShadedIndexBuffer, bounds)
3589 if itemsChanged
or updateActiveItems:
3590 bounds = self.fMesh.boundingBox()
3592 vertexBuffer = omr.MVertexBufferArray()
3593 vertexBuffer.append(self.fPositionBuffer,
"positions")
3595 if activeVertexItem:
3596 self.setGeometryForRenderItem(activeVertexItem, vertexBuffer, self.fActiveVerticesIndexBuffer, bounds)
3598 self.setGeometryForRenderItem(activeEdgeItem, vertexBuffer, self.fActiveEdgesIndexBuffer, bounds)
3600 self.setGeometryForRenderItem(activeFaceItem, vertexBuffer, self.fActiveFacesIndexBuffer, bounds)
3603 if itemsChanged
or anyMatrixChanged:
3604 if not self.fIsInstanceMode
and numInstances == 1:
3607 objToWorld = instanceMatrixArray[0]
3610 wireItem.setMatrix(objToWorld)
3612 selectItem.setMatrix(objToWorld)
3614 boxItem.setMatrix(objToWorld)
3616 selectedBoxItem.setMatrix(objToWorld)
3617 shadedItem.setMatrix(objToWorld)
3618 texturedItem.setMatrix(objToWorld)
3620 vertexSelectionItem.setMatrix(objToWorld)
3621 edgeSelectionItem.setMatrix(objToWorld)
3622 faceSelectionItem.setMatrix(objToWorld)
3624 if useDrawInstancingOnEdgeSelectionItem:
3627 transform1 = objToWorld
3630 transform2 = objToWorld * 2
3633 transform3 = objToWorld * 3
3637 transforms = om.MMatrixArray((transform1, transform2, transform3))
3638 self.setInstanceTransformArray(edgeSelectionItem, transforms)
3643 self.removeAllInstances(edgeSelectionItem)
3647 newInstanceId = self.addInstanceTransform(edgeSelectionItem, transform1)
3648 print(
"newInstanceId " + str(newInstanceId))
3649 newInstanceId = self.addInstanceTransform(edgeSelectionItem, transform2)
3650 print(
"newInstanceId " + str(newInstanceId))
3651 newInstanceId = self.addInstanceTransform(edgeSelectionItem, transform3)
3652 print(
"newInstanceId " + str(newInstanceId))
3654 if activeVertexItem:
3655 activeVertexItem.setMatrix(objToWorld)
3657 activeEdgeItem.setMatrix(objToWorld)
3659 activeFaceItem.setMatrix(objToWorld)
3674 self.setInstanceTransformArray(wireItem, unselectedInstanceMatrixArray)
3676 self.setInstanceTransformArray(selectItem, selectedInstanceMatrixArray)
3678 self.setInstanceTransformArray(boxItem, unselectedInstanceMatrixArray)
3680 self.setInstanceTransformArray(selectedBoxItem, selectedInstanceMatrixArray)
3681 self.setInstanceTransformArray(shadedItem, instanceMatrixArray)
3682 self.setInstanceTransformArray(texturedItem, instanceMatrixArray)
3684 self.setInstanceTransformArray(vertexSelectionItem, instanceMatrixArray)
3685 self.setInstanceTransformArray(edgeSelectionItem, instanceMatrixArray)
3686 self.setInstanceTransformArray(faceSelectionItem, instanceMatrixArray)
3688 if activeVertexItem:
3689 self.setInstanceTransformArray(activeVertexItem, instanceMatrixArray)
3691 self.setInstanceTransformArray(activeEdgeItem, instanceMatrixArray)
3693 self.setInstanceTransformArray(activeFaceItem, instanceMatrixArray)
3698 self.fIsInstanceMode =
True
3700 self.manageIsolateSelectRenderItems(container, frameContext, instances, viewSelectedFaceInfo, shader, updateMaterial, updateGeometry)
3702 if itemsChanged
or anyMatrixChanged
or updateGeometry:
3704 omr.MRenderer.setLightsAndShadowsDirty()
3706 def manageIsolateSelectRenderItems(self, container, frameContext, instances, viewSelectedFaceInfo, shader, updateMaterial, updateGeometry):
3707 if (
not self.fMesh):
3710 meshGeom = self.fMesh.meshGeom()
3715 destination = frameContext.renderingDestination()
3716 if (destination[0] != omr.MFrameContext.k3dViewport):
3720 activeViewName = destination[1]
3722 updateViewSelectedFaces =
False
3724 if(activeViewName
not in self.fViewSelectedFaceInfoCache):
3726 if(len(viewSelectedFaceInfo) != 0):
3727 updateViewSelectedFaces =
True
3729 elif(self.fViewSelectedFaceInfoCache[activeViewName] != viewSelectedFaceInfo):
3730 updateViewSelectedFaces =
True
3735 if updateViewSelectedFaces:
3738 prevInstIdxArray = set()
3739 if (activeViewName
in self.fViewSelectedFaceInfoCache):
3740 prevInfo = self.fViewSelectedFaceInfoCache[activeViewName]
3741 for instIdx, faceIdxList
in list(prevInfo.items()):
3742 for faceIdx
in faceIdxList:
3743 if faceIdx != sViewSelectedInstanceMark:
3744 prevInstIdxArray.add(instIdx)
3747 currInstIdxArray = set()
3748 for instIdx, faceIdxList
in list(viewSelectedFaceInfo.items()):
3749 for faceIdx
in faceIdxList:
3750 if (faceIdx != sViewSelectedInstanceMark):
3751 currInstIdxArray.add(instIdx)
3754 self.fViewSelectedFaceInfoCache[activeViewName] = viewSelectedFaceInfo
3760 diffInstIdxArray = prevInstIdxArray - currInstIdxArray
3762 for instIdx
in diffInstIdxArray:
3763 namePostfix = self.sNameSeparator + str(instIdx) + self.sNameSeparator + activeViewName
3765 shadedName = self.sShadedName + namePostfix
3766 container.remove(shadedName)
3768 texturedName = self.sTexturedName + namePostfix
3769 container.remove(texturedName)
3771 faceSelectionName = self.sFaceSelectionName + namePostfix
3772 container.remove(faceSelectionName)
3776 for instIdx
in currInstIdxArray:
3777 namePostfix = self.sNameSeparator + str(instIdx) + self.sNameSeparator + activeViewName
3779 shadedName = self.sShadedName + namePostfix
3780 viewSelectedShadedItem = container.find(shadedName)
3781 if not viewSelectedShadedItem:
3783 viewSelectedShadedItem = omr.MRenderItem.create(shadedName, omr.MRenderItem.MaterialSceneItem, omr.MGeometry.kTriangles)
3784 viewSelectedShadedItem.setDrawMode(omr.MGeometry.kShaded)
3785 viewSelectedShadedItem.setExcludedFromPostEffects(
False)
3786 viewSelectedShadedItem.setCastsShadows(
True)
3787 viewSelectedShadedItem.setReceivesShadows(
True)
3789 container.add(viewSelectedShadedItem)
3791 userData = apiMeshHWSelectionUserData()
3792 userData.fMeshGeom = meshGeom
3793 userData.fInstanceIndex = instIdx
3794 viewSelectedShadedItem.setCustomData(userData)
3796 texturedName = self.sTexturedName + namePostfix
3797 viewSelectedTexturedItem = container.find(texturedName)
3798 if not viewSelectedTexturedItem:
3800 viewSelectedTexturedItem = omr.MRenderItem.create(texturedName, omr.MRenderItem.MaterialSceneItem, omr.MGeometry.kTriangles)
3802 viewSelectedTexturedItem.setDrawMode(omr.MGeometry.kTextured)
3803 viewSelectedTexturedItem.setExcludedFromPostEffects(
False)
3804 viewSelectedTexturedItem.setCastsShadows(
True)
3805 viewSelectedTexturedItem.setReceivesShadows(
True)
3806 container.add(viewSelectedTexturedItem)
3808 userData = apiMeshHWSelectionUserData()
3809 userData.fMeshGeom = meshGeom
3810 userData.fInstanceIndex = instIdx
3811 viewSelectedTexturedItem.setCustomData(userData)
3813 faceSelectionName = self.sFaceSelectionName + namePostfix
3814 viewSelectedFaceSelectionItem = container.find(faceSelectionName)
3815 if not viewSelectedFaceSelectionItem:
3817 viewSelectedFaceSelectionItem = omr.MRenderItem.create(faceSelectionName, omr.MRenderItem.DecorationItem, omr.MGeometry.kTriangles)
3820 viewSelectedFaceSelectionItem.setDrawMode(omr.MGeometry.kSelectionOnly)
3822 viewSelectedFaceSelectionItem.setSelectionMask(om.MSelectionMask.kSelectMeshFaces)
3824 viewSelectedFaceSelectionItem.setDepthPriority(omr.MRenderItem.sSelectionDepthPriority)
3825 viewSelectedFaceSelectionItem.setShader(self.fFaceComponentShader)
3826 container.add(viewSelectedFaceSelectionItem)
3828 userData = apiMeshHWSelectionUserData()
3829 userData.fMeshGeom = meshGeom
3830 userData.fInstanceIndex = instIdx
3831 viewSelectedFaceSelectionItem.setCustomData(userData)
3834 if (faceSelectionName
not in sViewSelectedFaceSelectionNames):
3835 omr.MDrawRegistry.registerComponentConverter(faceSelectionName, simpleComponentConverterSubsceneOverride.creatorFaceSelection)
3836 sViewSelectedFaceSelectionNames.add(faceSelectionName)
3841 for key
in self.fViewSelectedFaceInfoCache:
3843 faceInfo = self.fViewSelectedFaceInfoCache[key]
3844 isActiveView = viewName == activeViewName
3846 instIdxArray = set()
3847 for instIdx
in faceInfo:
3848 faceIdx = faceInfo[instIdx]
3849 if (faceIdx != sViewSelectedInstanceMark):
3850 instIdxArray.add(instIdx)
3852 for instIdx
in instIdxArray:
3853 namePostfix = self.sNameSeparator + str(instIdx) + self.sNameSeparator + viewName
3855 viewSelectedShadedItem = container.find(self.sShadedName + namePostfix)
3856 viewSelectedTexturedItem = container.find(self.sTexturedName + namePostfix)
3857 viewSelectedFaceSelectionItem = container.find(self.sFaceSelectionName + namePostfix)
3858 if (
not viewSelectedShadedItem
or not viewSelectedTexturedItem
or not viewSelectedFaceSelectionItem):
3862 viewSelectedShadedItem.enable(isActiveView)
3863 viewSelectedTexturedItem.enable(isActiveView)
3864 viewSelectedFaceSelectionItem.enable(isActiveView)
3867 instance = instances[instIdx]
3868 objToWorld = instance.inclusiveMatrix()
3869 viewSelectedShadedItem.setMatrix(objToWorld)
3870 viewSelectedTexturedItem.setMatrix(objToWorld)
3871 viewSelectedFaceSelectionItem.setMatrix(objToWorld)
3874 if (updateViewSelectedFaces
or updateMaterial
or updateGeometry):
3876 if (updateMaterial
or not viewSelectedShadedItem.isShaderFromNode()):
3878 userData = ShadedItemUserData(self)
3880 if shader
and viewSelectedShadedItem.setShaderFromNode2(shader, instance, apiMeshSubSceneOverride.shadedItemLinkLost, userData,
True):
3881 self.fLinkLostCallbackData.append(userData)
3883 viewSelectedShadedItem.setShader(self.fShadedShader)
3885 if (updateMaterial
or not viewSelectedTexturedItem.isShaderFromNode()):
3886 userData = ShadedItemUserData(self)
3888 if shader
and viewSelectedTexturedItem.setShaderFromNode2(shader, instance, apiMeshSubSceneOverride.shadedItemLinkLost, userData,
True):
3889 self.fLinkLostCallbackData.append(userData)
3891 viewSelectedTexturedItem.setShader(self.fShadedShader)
3893 shadedBuffers = omr.MVertexBufferArray()
3894 shadedBuffers.append(self.fPositionBuffer,
"positions")
3895 shadedBuffers.append(self.fNormalBuffer,
"normals")
3897 selectionBuffers = omr.MVertexBufferArray()
3898 selectionBuffers.append(self.fPositionBuffer,
"positions")
3901 for faceIdx
in range(meshGeom.faceCount):
3902 faceStates.append(
False)
3904 faceIds = faceInfo[instIdx]
3905 for faceIdx
in faceIds:
3906 if (faceIdx != sViewSelectedInstanceMark):
3907 faceStates[faceIdx] =
True
3910 for faceIdx
in range(meshGeom.faceCount):
3911 numVerts = meshGeom.face_counts[faceIdx]
3913 if faceStates[faceIdx]:
3914 numTriangles += numVerts - 2
3916 indexBuffer = omr.MIndexBuffer(omr.MGeometry.kUnsignedInt32)
3917 bufferSize = numTriangles * 3
3919 dataAddress = indexBuffer.acquire(bufferSize,
True)
3921 data = (ctypes.c_uint * bufferSize).from_address(dataAddress)
3925 for faceIdx
in range(meshGeom.faceCount):
3927 numVerts = meshGeom.face_counts[faceIdx]
3929 if (faceStates[faceIdx]):
3930 for v
in range(1, numVerts - 1):
3931 data[idx] = meshGeom.face_connects[base]
3933 data[idx] = meshGeom.face_connects[base + v]
3935 data[idx] = meshGeom.face_connects[base + v + 1]
3938 indexBuffer.commit(dataAddress)
3941 bounds = self.fMesh.boundingBox()
3942 self.setGeometryForRenderItem(viewSelectedShadedItem, shadedBuffers, indexBuffer, bounds)
3943 self.setGeometryForRenderItem(viewSelectedTexturedItem, shadedBuffers, indexBuffer, bounds)
3944 self.setGeometryForRenderItem(viewSelectedFaceSelectionItem, selectionBuffers, indexBuffer, bounds)
3947 userData = viewSelectedShadedItem.getCustomData()
3948 if userData
and isinstance(userData, apiMeshHWSelectionUserData):
3949 userData.fMeshGeom = meshGeom
3951 userData = viewSelectedTexturedItem.getCustomData()
3952 if userData
and isinstance(userData, apiMeshHWSelectionUserData):
3953 userData.fMeshGeom = meshGeom
3955 userData = viewSelectedFaceSelectionItem.getCustomData()
3956 if userData
and isinstance(userData, apiMeshHWSelectionUserData):
3957 userData.fMeshGeom = meshGeom
3958 userData.fFaceViewSelectedStates = faceStates
3960 def rebuildGeometryBuffers(self):
3962 meshGeom = self.fMesh.meshGeom()
3965 bounds = self.fMesh.boundingBox()
3968 self.clearGeometryBuffers()
3973 totalPoints = len(meshGeom.vertices)
3974 for i
in range(meshGeom.faceCount):
3975 numVerts = meshGeom.face_counts[i]
3977 numTriangles += numVerts - 2
3978 totalVerts += numVerts
3981 posDesc = omr.MVertexBufferDescriptor(
"", omr.MGeometry.kPosition, omr.MGeometry.kFloat, 3)
3982 normalDesc = omr.MVertexBufferDescriptor(
"", omr.MGeometry.kNormal, omr.MGeometry.kFloat, 3)
3984 self.fPositionBuffer = omr.MVertexBuffer(posDesc)
3985 self.fNormalBuffer = omr.MVertexBuffer(normalDesc)
3986 self.fBoxPositionBuffer = omr.MVertexBuffer(posDesc)
3988 positionDataAddress = self.fPositionBuffer.acquire(totalPoints,
True)
3989 normalDataAddress = self.fNormalBuffer.acquire(totalPoints,
True)
3990 boxPositionDataAddress = self.fBoxPositionBuffer.acquire(8,
True)
3993 self.fWireIndexBuffer = omr.MIndexBuffer(omr.MGeometry.kUnsignedInt32)
3994 self.fBoxIndexBuffer = omr.MIndexBuffer(omr.MGeometry.kUnsignedInt32)
3995 self.fShadedIndexBuffer = omr.MIndexBuffer(omr.MGeometry.kUnsignedInt32)
3997 wireBufferDataAddress = self.fWireIndexBuffer.acquire(2*totalVerts,
True)
3998 boxBufferDataAddress = self.fBoxIndexBuffer.acquire(24,
True)
3999 shadedBufferDataAddress = self.fShadedIndexBuffer.acquire(3*numTriangles,
True)
4002 if not all((positionDataAddress, normalDataAddress, boxPositionDataAddress, wireBufferDataAddress, boxBufferDataAddress, shadedBufferDataAddress)):
4003 self.clearGeometryBuffers()
4006 positionData = ((ctypes.c_float * 3)*totalPoints).from_address(positionDataAddress)
4007 normalData = ((ctypes.c_float * 3)*totalPoints).from_address(normalDataAddress)
4008 boxPositionData = ((ctypes.c_float * 3)*8).from_address(boxPositionDataAddress)
4010 wireBufferData = (ctypes.c_uint * (2*totalVerts)).from_address(wireBufferDataAddress)
4011 boxBufferData = (ctypes.c_uint * 24).from_address(boxBufferDataAddress)
4012 shadedBufferData = ((ctypes.c_uint * 3)*numTriangles).from_address(shadedBufferDataAddress)
4015 for vid,position
in enumerate(meshGeom.vertices):
4016 positionData[vid][0] = position[0]
4017 positionData[vid][1] = position[1]
4018 positionData[vid][2] = position[2]
4020 for vid,normal
in enumerate(meshGeom.normals):
4021 normalData[vid][0] = normal[0]
4022 normalData[vid][1] = normal[1]
4023 normalData[vid][2] = normal[2]
4025 self.fPositionBuffer.commit(positionDataAddress)
4026 positionDataAddress =
None
4027 self.fNormalBuffer.commit(normalDataAddress)
4028 normalDataAddress =
None
4033 boxPositionData[0][0] = bbmin.x
4034 boxPositionData[0][1] = bbmin.y
4035 boxPositionData[0][2] = bbmin.z
4037 boxPositionData[1][0] = bbmin.x
4038 boxPositionData[1][1] = bbmin.y
4039 boxPositionData[1][2] = bbmax.z
4041 boxPositionData[2][0] = bbmax.x
4042 boxPositionData[2][1] = bbmin.y
4043 boxPositionData[2][2] = bbmax.z
4045 boxPositionData[3][0] = bbmax.x
4046 boxPositionData[3][1] = bbmin.y
4047 boxPositionData[3][2] = bbmin.z
4049 boxPositionData[4][0] = bbmin.x
4050 boxPositionData[4][1] = bbmax.y
4051 boxPositionData[4][2] = bbmin.z
4053 boxPositionData[5][0] = bbmin.x
4054 boxPositionData[5][1] = bbmax.y
4055 boxPositionData[5][2] = bbmax.z
4057 boxPositionData[6][0] = bbmax.x
4058 boxPositionData[6][1] = bbmax.y
4059 boxPositionData[6][2] = bbmax.z
4061 boxPositionData[7][0] = bbmax.x
4062 boxPositionData[7][1] = bbmax.y
4063 boxPositionData[7][2] = bbmin.z
4065 self.fBoxPositionBuffer.commit(boxPositionDataAddress)
4066 boxPositionDataAddress =
None
4072 for i
in range(meshGeom.faceCount):
4074 numVerts = meshGeom.face_counts[i]
4077 for v
in range(numVerts-1):
4078 wireBufferData[idx] = meshGeom.face_connects[vid]
4081 wireBufferData[idx] = meshGeom.face_connects[vid]
4084 wireBufferData[idx] = meshGeom.face_connects[vid]
4087 wireBufferData[idx] = meshGeom.face_connects[first]
4093 self.fWireIndexBuffer.commit(wireBufferDataAddress)
4094 wireBufferDataAddress =
None
4097 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 ]
4099 boxBufferData[i] = indexData[i]
4101 self.fBoxIndexBuffer.commit(boxBufferDataAddress)
4102 boxBufferDataAddress =
None
4107 for i
in range(meshGeom.faceCount):
4109 numVerts = meshGeom.face_counts[i]
4111 for v
in range(1, numVerts-1):
4112 shadedBufferData[idx][0] = meshGeom.face_connects[base]
4113 shadedBufferData[idx][1] = meshGeom.face_connects[base+v]
4114 shadedBufferData[idx][2] = meshGeom.face_connects[base+v+1]
4119 self.fShadedIndexBuffer.commit(shadedBufferDataAddress)
4120 shadedBufferDataAddress =
None
4122 def rebuildActiveComponentIndexBuffers(self):
4124 meshGeom = self.fMesh.meshGeom()
4129 self.clearActiveComponentIndexBuffers()
4132 numActiveVertices = len(self.fActiveVerticesSet)
4133 if numActiveVertices > 0:
4134 self.fActiveVerticesIndexBuffer = omr.MIndexBuffer(omr.MGeometry.kUnsignedInt32)
4135 activeVerticesDataAddress = self.fActiveVerticesIndexBuffer.acquire(numActiveVertices,
True)
4136 if activeVerticesDataAddress:
4137 activeVerticesData = (ctypes.c_uint*numActiveVertices).from_address(activeVerticesDataAddress)
4140 for vid
in self.fActiveVerticesSet:
4141 activeVerticesData[idx] = vid
4144 self.fActiveVerticesIndexBuffer.commit(activeVerticesDataAddress)
4145 activeVerticesDataAddress =
None
4148 numActiveEdges = len(self.fActiveEdgesSet)
4149 if numActiveEdges > 0:
4150 self.fActiveEdgesIndexBuffer = omr.MIndexBuffer(omr.MGeometry.kUnsignedInt32)
4151 activeEdgesDataAddress = self.fActiveEdgesIndexBuffer.acquire(2*numActiveEdges,
True)
4152 if activeEdgesDataAddress:
4153 activeEdgesData = ((ctypes.c_uint * 2)*numActiveEdges).from_address(activeEdgesDataAddress)
4159 for i
in range(meshGeom.faceCount):
4161 numVerts = meshGeom.face_counts[i]
4164 for v
in range(numVerts-1):
4165 if eid
in self.fActiveEdgesSet:
4166 activeEdgesData[idx][0] = meshGeom.face_connects[vid]
4167 activeEdgesData[idx][1] = meshGeom.face_connects[vid + 1]
4172 if eid
in self.fActiveEdgesSet:
4173 activeEdgesData[idx][0] = meshGeom.face_connects[vid]
4174 activeEdgesData[idx][1] = meshGeom.face_connects[first]
4181 self.fActiveEdgesIndexBuffer.commit(activeEdgesDataAddress)
4182 activeEdgesDataAddress =
None
4185 numActiveFaces = len(self.fActiveFacesSet)
4186 if numActiveFaces > 0:
4187 numActiveFacesTriangles = 0
4188 for i
in range(meshGeom.faceCount):
4189 if i
in self.fActiveFacesSet:
4190 numVerts = meshGeom.face_counts[i]
4192 numActiveFacesTriangles += numVerts - 2
4194 self.fActiveFacesIndexBuffer = omr.MIndexBuffer(omr.MGeometry.kUnsignedInt32)
4195 activeFacesDataAddress = self.fActiveFacesIndexBuffer.acquire(3*numActiveFacesTriangles,
True)
4196 if activeFacesDataAddress:
4197 activeFacesData = ((ctypes.c_uint * 3)*numActiveFacesTriangles).from_address(activeFacesDataAddress)
4201 for i
in range(meshGeom.faceCount):
4202 numVerts = meshGeom.face_counts[i]
4204 if i
in self.fActiveFacesSet:
4205 for v
in range(1, numVerts-1):
4206 activeFacesData[idx][0] = meshGeom.face_connects[vid]
4207 activeFacesData[idx][1] = meshGeom.face_connects[vid+v]
4208 activeFacesData[idx][2] = meshGeom.face_connects[vid+v+1]
4213 self.fActiveFacesIndexBuffer.commit(activeFacesDataAddress)
4214 activeFacesDataAddress =
None
4216 def clearBuffers(self):
4217 self.clearGeometryBuffers()
4218 self.clearActiveComponentIndexBuffers()
4220 def clearGeometryBuffers(self):
4221 self.fPositionBuffer =
None
4222 self.fNormalBuffer =
None
4223 self.fBoxPositionBuffer =
None
4224 self.fWireIndexBuffer =
None
4225 self.fBoxIndexBuffer =
None
4226 self.fShadedIndexBuffer =
None
4228 def clearActiveComponentIndexBuffers(self):
4229 self.fActiveVerticesIndexBuffer =
None
4230 self.fActiveEdgesIndexBuffer =
None
4231 self.fActiveFacesIndexBuffer =
None
4233 def updateSelectionGranularity(self, path, selectionContext):
4244 displayStatus = omr.MGeometryUtilities.displayStatus(path)
4245 if displayStatus == omr.MGeometryUtilities.kHilite:
4247 globalComponentMask = om.MGlobal.objectSelectionMask()
4248 if om.MGlobal.selectionMode() == om.MGlobal.kSelectComponentMode:
4249 globalComponentMask = om.MGlobal.componentSelectionMask()
4251 supportedComponentMask = om.MSelectionMask( om.MSelectionMask.kSelectMeshVerts )
4252 supportedComponentMask.addMask( om.MSelectionMask.kSelectMeshEdges )
4253 supportedComponentMask.addMask( om.MSelectionMask.kSelectMeshFaces )
4254 supportedComponentMask.addMask( om.MSelectionMask.kSelectPointsForGravity )
4256 if globalComponentMask.intersects(supportedComponentMask):
4257 selectionContext.selectionLevel = omr.MSelectionContext.kComponent
4258 elif omr.MPxSubSceneOverride.pointSnappingActive():
4259 selectionContext.selectionLevel = omr.MSelectionContext.kComponent
4261 def getSelectionPath(self, renderItem, dagPath):
4262 node = om.MFnDagNode(self.fObject)
4266 instances = node.getAllPaths()
4267 if not instances
or len(instances) == 0:
4270 dagPath.set(instances[0])
4273 def getInstancedSelectionPath(self, renderItem, intersection, dagPath):
4274 node = om.MFnDagNode(self.fObject)
4278 instances = node.getAllPaths()
4279 instanceCount = len(instances)
4280 if not instances
or instanceCount == 0:
4283 instanceId = intersection.instanceID
4286 if(instanceCount == 1
or instanceId == -1):
4288 userData = renderItem.getCustomData()
4290 isinstance(userData, apiMeshHWSelectionUserData)
and
4291 userData.fInstanceIndex >= 0
and
4292 userData.fInstanceIndex < instanceCount):
4293 instanceId = userData.fInstanceIndex
4295 dagPath.set(instances[instanceId])
4302 elif(instanceId >=1
and instanceId <= instanceCount):
4303 view = omui.M3dView.active3dView()
4304 if view.viewIsFiltered():
4306 viewSelectedList = view.filteredObjectList()
4307 if viewSelectedList:
4308 for instIdx
in range(instanceCount):
4309 instance = instances[instIdx]
4310 if instance.isValid()
and instance.isVisible():
4311 intersectionList = om.MSelectionList()
4313 intersectionList.add(instance)
4314 intersectionList.intersect(viewSelectedList,
True)
4316 selectionIt = om.MItSelectionList(intersectionList)
4317 while not selectionIt.isDone():
4318 comp = selectionIt.getComponent()[1]
4321 instanceId = instanceId - 1
4323 dagPath.set(instance)
4327 for instIdx
in range(instanceCount):
4328 instance = instances[instIdx]
4329 if (instance.isValid()
and instance.isVisible()):
4330 instanceId = instanceId - 1
4331 if (instanceId == 0):
4332 dagPath.set(instance)
4346 class apiMeshUserData(om.MUserData):
4348 om.MUserData.__init__(self, legacy=
False)
4350 self.fNumModifications = 0
4353 def callbackDataPrint(context, renderItemList):
4354 for item
in renderItemList:
4356 path = item.sourceDagPath()
4357 print(
"\tITEM: '" + item.name() +
"' -- SOURCE: '" + path.fullPathName() +
"'")
4359 passCtx = context.getPassContext()
4360 passId = passCtx.passIdentifier()
4361 passSem = passCtx.passSemantics()
4362 print(
"\tAPI mesh drawing in pass[" + passId +
"], semantic[" + passSem +
"]")
4365 def apiMeshPreDrawCallback(context, renderItemList, shaderInstance):
4366 print(
"PRE-draw callback triggered for render item list with data:")
4367 callbackDataPrint(context, renderItemList)
4370 def apiMeshPostDrawCallback(context, renderItemList, shaderInstance):
4371 print(
"POST-draw callback triggered for render item list with data:")
4372 callbackDataPrint(context, renderItemList)
4376 class meshVertComponentConverterGeometryOverride(omr.MPxComponentConverter):
4378 omr.MPxComponentConverter.__init__(self)
4380 self.fComponent = om.MFnSingleIndexedComponent()
4381 self.fComponentObject = om.MObject.kNullObj
4384 def initialize(self, renderItem):
4386 self.fComponentObject = self.fComponent.create( om.MFn.kMeshVertComponent )
4392 selectionData = renderItem.getCustomData()
4393 if isinstance(selectionData, apiMeshHWSelectionUserData):
4394 meshGeom = selectionData.fMeshGeom
4398 for i
in range(meshGeom.faceCount):
4399 numVerts = meshGeom.face_counts[i]
4401 numTriangles += numVerts - 2
4402 self.fVertices = [0]*(3*numTriangles)
4407 for faceIdx
in range(meshGeom.faceCount):
4409 numVerts = meshGeom.face_counts[faceIdx]
4411 for v
in range(1, numVerts-1):
4412 self.fVertices[idx] = meshGeom.face_connects[base]
4413 self.fVertices[idx+1] = meshGeom.face_connects[base+v]
4414 self.fVertices[idx+2] = meshGeom.face_connects[base+v+1]
4418 def addIntersection(self, intersection):
4421 rawIdx = intersection.index
4423 if rawIdx >= 0
and rawIdx < len(self.fVertices):
4424 idx = self.fVertices[rawIdx]
4425 self.fComponent.addElement(idx)
4427 def component(self):
4429 return self.fComponentObject
4431 def selectionMask(self):
4433 mask = om.MSelectionMask(om.MSelectionMask.kSelectMeshVerts)
4434 mask.addMask(om.MSelectionMask.kSelectPointsForGravity)
4439 return meshVertComponentConverterGeometryOverride()
4443 class meshEdgeComponentConverterGeometryOverride(omr.MPxComponentConverter):
4445 omr.MPxComponentConverter.__init__(self)
4447 self.fComponent = om.MFnSingleIndexedComponent()
4448 self.fComponentObject = om.MObject.kNullObj
4451 def initialize(self, renderItem):
4453 self.fComponentObject = self.fComponent.create( om.MFn.kMeshEdgeComponent )
4465 selectionData = renderItem.getCustomData()
4466 if isinstance(selectionData, apiMeshHWSelectionUserData):
4467 meshGeom = selectionData.fMeshGeom
4471 for i
in range(meshGeom.faceCount):
4472 numVerts = meshGeom.face_counts[i]
4474 totalVerts += numVerts
4475 self.fEdges = [0]*(totalVerts)
4480 for faceIdx
in range(meshGeom.faceCount):
4482 numVerts = meshGeom.face_counts[faceIdx]
4484 for v
in range(numVerts):
4485 self.fEdges[idx] = edgeId
4489 def addIntersection(self, intersection):
4492 rawIdx = intersection.index
4494 if rawIdx >= 0
and rawIdx < len(self.fEdges):
4495 idx = self.fEdges[rawIdx]
4496 self.fComponent.addElement(idx)
4498 def component(self):
4500 return self.fComponentObject
4502 def selectionMask(self):
4504 return om.MSelectionMask(om.MSelectionMask.kSelectMeshEdges)
4508 return meshEdgeComponentConverterGeometryOverride()
4512 class meshFaceComponentConverterGeometryOverride(omr.MPxComponentConverter):
4514 omr.MPxComponentConverter.__init__(self)
4516 self.fComponent = om.MFnSingleIndexedComponent()
4517 self.fComponentObject = om.MObject.kNullObj
4520 def initialize(self, renderItem):
4522 self.fComponentObject = self.fComponent.create( om.MFn.kMeshPolygonComponent )
4534 selectionData = renderItem.getCustomData()
4535 if isinstance(selectionData, apiMeshHWSelectionUserData):
4536 meshGeom = selectionData.fMeshGeom
4539 isolateSelect = renderItem.isIsolateSelectCopy()
4542 enableFaces = [0] * meshGeom.faceCount
4543 for i
in range(meshGeom.faceCount):
4544 enableFaces[i] =
False
4546 fnComponent = om.MFnSingleIndexedComponent( renderItem.shadingComponent() )
4547 if(fnComponent.componentType == om.MFn.kMeshPolygonComponent):
4548 faceIds = fnComponent.getElements()
4550 for i
in range(len(faceIds)):
4551 enableFaces[faceIds[i]] =
True
4555 for i
in range(meshGeom.faceCount):
4556 numVerts = meshGeom.face_counts[i]
4558 if(
not isolateSelect
or enableFaces[i]):
4559 numTriangles += numVerts - 2
4561 self.fFaces = [0]*numTriangles
4565 for faceIdx
in range(meshGeom.faceCount):
4567 numVerts = meshGeom.face_counts[faceIdx]
4569 if(
not isolateSelect
or enableFaces[faceIdx]):
4570 for v
in range(1, numVerts-1):
4571 self.fFaces[idx] = faceIdx
4576 def addIntersection(self, intersection):
4579 rawIdx = intersection.index
4581 if rawIdx >= 0
and rawIdx < len(self.fFaces):
4582 idx = self.fFaces[rawIdx]
4583 self.fComponent.addElement(idx)
4585 def component(self):
4587 return self.fComponentObject
4589 def selectionMask(self):
4591 return om.MSelectionMask(om.MSelectionMask.kSelectMeshFaces)
4595 return meshFaceComponentConverterGeometryOverride()
4597 class apiMeshGeometryOverride(omr.MPxGeometryOverride):
4599 sWireframeItemName =
"apiMeshWire_py"
4600 sShadedTemplateItemName =
"apiMeshShadedTemplateWire_py"
4601 sSelectedWireframeItemName =
"apiMeshSelectedWireFrame_py"
4602 sVertexItemName =
"apiMeshVertices_py"
4603 sEdgeSelectionItemName =
"apiMeshEdgeSelection_py"
4604 sFaceSelectionItemName =
"apiMeshFaceSelection_py"
4605 sActiveVertexItemName =
"apiMeshActiveVertices_py"
4606 sVertexIdItemName =
"apiMeshVertexIds_py"
4607 sVertexPositionItemName =
"apiMeshVertexPositions_py"
4608 sShadedModeFaceCenterItemName =
"apiMeshFaceCenterInShadedMode_py"
4609 sWireframeModeFaceCenterItemName =
"apiMeshFaceCenterInWireframeMode_py"
4610 sShadedProxyItemName =
"apiShadedProxy_py"
4611 sAffectedEdgeItemName =
"apiMeshAffectedEdges_py"
4612 sAffectedFaceItemName =
"apiMeshAffectedFaces_py"
4613 sActiveVertexStreamName =
"apiMeshSharedVertexStream_py"
4614 sFaceCenterStreamName =
"apiMeshFaceCenterStream_py"
4618 return apiMeshGeometryOverride(obj)
4620 def __init__(self, obj):
4621 omr.MPxGeometryOverride.__init__(self, obj)
4623 node = om.MFnDependencyNode(obj)
4624 self.fMesh = node.userNode()
4625 self.fMeshGeom =
None
4626 self.fColorRemapTexture =
None
4628 self.fActiveVertices = om.MIntArray()
4629 self.fActiveVerticesSet = set()
4630 self.fActiveEdgesSet = set()
4631 self.fActiveFacesSet = set()
4632 self.fCastsShadows =
False
4633 self.fReceivesShadows =
False
4635 self.fEnableNumericDisplay =
False
4641 self.fDrawSharedActiveVertices =
True
4643 self.fDrawActiveVerticesWithRamp =
False
4644 self.fLinearSampler =
None
4647 self.fDrawFaceCenters =
True
4649 if self.fDrawActiveVerticesWithRamp:
4650 self.fDrawFaceCenters =
False
4655 self.fUseCustomColors =
False
4666 self.fProxyShader = omr.MShaderManager.k3dCPVThickDashLineShader
4670 self.fInternalItems_NoShadowCast =
False
4671 self.fInternalItems_NoShadowReceive =
False
4672 self.fInternalItems_NoPostEffects =
False
4676 self.fExternalItems_NoShadowCast =
False
4677 self.fExternalItems_NoShadowReceive =
False
4678 self.fExternalItemsNonTri_NoShadowCast =
False
4679 self.fExternalItemsNonTri_NoShadowReceive =
False
4683 self.fExternalItems_NoPostEffects =
True
4684 self.fExternalItemsNonTri_NoPostEffects =
True
4688 self.fMeshGeom =
None
4690 if self.fColorRemapTexture:
4691 textureMgr = omr.MRenderer.getTextureManager()
4693 textureMgr.releaseTexture(self.fColorRemapTexture)
4694 self.fColorRemapTexture =
None
4696 if self.fLinearSampler:
4697 omr.MStateManager.releaseSamplerState(self.fLinearSampler)
4698 self.fLinearSampler =
None
4700 def supportedDrawAPIs(self):
4702 return omr.MRenderer.kOpenGL | omr.MRenderer.kDirectX11 | omr.MRenderer.kOpenGLCoreProfile
4707 self.fActiveVertices.clear()
4708 self.fActiveVerticesSet = set()
4709 self.fActiveEdgesSet = set()
4710 self.fActiveFacesSet = set()
4712 self.fMeshGeom = self.fMesh.meshGeom()
4714 if self.fMeshGeom
and self.fMesh.hasActiveComponents():
4715 activeComponents = self.fMesh.activeComponents()
4716 if len(activeComponents) > 0:
4717 fnComponent = om.MFnSingleIndexedComponent( activeComponents[0] )
4718 if fnComponent.elementCount > 0:
4719 activeIds = fnComponent.getElements()
4721 if fnComponent.componentType == om.MFn.kMeshVertComponent:
4722 self.fActiveVertices = activeIds
4723 self.fActiveVerticesSet = set(activeIds)
4725 elif fnComponent.componentType == om.MFn.kMeshEdgeComponent:
4726 self.fActiveEdgesSet = set(activeIds)
4728 elif fnComponent.componentType == om.MFn.kMeshPolygonComponent:
4729 self.fActiveFacesSet = set(activeIds)
4731 def updateRenderItems(self, path, list):
4735 shaderMgr = omr.MRenderer.getShaderManager()
4739 dagNode = om.MFnDagNode(path)
4740 castsShadowsPlug = dagNode.findPlug(
"castsShadows",
False)
4741 self.fCastsShadows = castsShadowsPlug.asBool()
4742 receiveShadowsPlug = dagNode.findPlug(
"receiveShadows",
False)
4743 self.fReceivesShadows = receiveShadowsPlug.asBool()
4744 enableNumericDisplayPlug = dagNode.findPlug(
"enableNumericDisplay",
False)
4745 self.fEnableNumericDisplay = enableNumericDisplayPlug.asBool()
4748 self.updateDormantAndTemplateWireframeItems(path, list, shaderMgr)
4749 self.updateActiveWireframeItem(path, list, shaderMgr)
4752 self.updateDormantVerticesItem(path, list, shaderMgr)
4753 self.updateActiveVerticesItem(path, list, shaderMgr)
4756 self.updateVertexNumericItems(path, list, shaderMgr)
4759 if self.fDrawFaceCenters:
4760 self.updateWireframeModeFaceCenterItem(path, list, shaderMgr)
4761 self.updateShadedModeFaceCenterItem(path, list, shaderMgr)
4764 self.updateAffectedComponentItems(path, list, shaderMgr)
4767 self.updateSelectionComponentItems(path, list, shaderMgr)
4770 self.updateProxyShadedItem(path, list, shaderMgr)
4776 testShadedOverrides = self.fInternalItems_NoShadowCast
or self.fInternalItems_NoShadowReceive
or self.fInternalItems_NoPostEffects
4777 if testShadedOverrides:
4782 drawMode = item.drawMode()
4783 if drawMode == omr.MGeometry.kShaded
or drawMode == omr.MGeometry.kTextured:
4784 if item.name() != self.sShadedTemplateItemName:
4785 item.setCastsShadows(
not self.fInternalItems_NoShadowCast
and self.fCastsShadows )
4786 item.setReceivesShadows(
not self.fInternalItems_NoShadowReceive
and self.fReceivesShadows )
4787 item.setExcludedFromPostEffects( self.fInternalItems_NoPostEffects )
4789 def populateGeometry(self, requirements, renderItems, data):
4800 if self.fMeshGeom ==
None:
4801 raise RuntimeError(
"populateGeometry : invalid fMeshGeom")
4803 debugPopulateGeometry =
False
4804 if debugPopulateGeometry:
4805 print(
"> Begin populate geometry")
4808 activeVertexCount = len(self.fActiveVertices)
4813 for i
in range(self.fMeshGeom.faceCount):
4814 numVerts = self.fMeshGeom.face_counts[i]
4816 numTriangles += numVerts - 2
4817 totalVerts += numVerts
4820 self.updateGeometryRequirements(requirements, data, activeVertexCount, totalVerts, debugPopulateGeometry)
4823 wireIndexBuffer =
None
4825 for item
in renderItems:
4834 itemBuffers = item.requiredVertexBuffers()
4835 for desc
in itemBuffers:
4836 print(
"Buffer Required for Item '" + item.name() +
"':")
4837 print(
"\tBufferName: " + desc.name)
4838 print(
"\tDataType: " + omr.MGeometry.dataTypeString(desc.dataType) +
" (dimension " + str(desc.dimension) +
")")
4839 print(
"\tSemantic: " + omr.MGeometry.semanticString(desc.semantic))
4844 myCustomData = item.getCustomData()
4845 if isinstance(myCustomData, apiMeshUserData):
4846 print(
"Custom data '" + myCustomData.fMessage +
"', modified count='" + str(myCustomData.fNumModifications) +
"'")
4848 print(
"No custom data")
4852 if item.name() == self.sActiveVertexItemName:
4853 self.updateIndexingForVertices( item, data, numTriangles, activeVertexCount, debugPopulateGeometry)
4857 if self.fDrawFaceCenters
and (item.name() == self.sShadedModeFaceCenterItemName
or item.name() == self.sWireframeModeFaceCenterItemName):
4858 self.updateIndexingForFaceCenters( item, data, debugPopulateGeometry)
4862 elif item.name() == self.sVertexItemName
or item.name() == self.sVertexIdItemName
or item.name() == self.sVertexPositionItemName:
4863 self.updateIndexingForDormantVertices( item, data, numTriangles )
4867 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):
4868 self.updateIndexingForWireframeItems(wireIndexBuffer, item, data, totalVerts)
4874 elif item.name() == self.sAffectedEdgeItemName:
4875 self.updateIndexingForEdges(item, data, totalVerts,
True)
4876 elif item.name() == self.sEdgeSelectionItemName:
4877 self.updateIndexingForEdges(item, data, totalVerts,
False)
4883 elif item.name() == self.sAffectedFaceItemName:
4884 self.updateIndexingForFaces(item, data, numTriangles,
True)
4885 elif item.name() == self.sFaceSelectionItemName:
4886 self.updateIndexingForFaces(item, data, numTriangles,
False)
4890 elif item.primitive() == omr.MGeometry.kTriangles:
4891 self.updateIndexingForShadedTriangles(item, data, numTriangles)
4893 if debugPopulateGeometry:
4894 print(
"> End populate geometry")
4897 self.fMeshGeom =
None
4898 self.fActiveVertices.clear()
4899 self.fActiveVerticesSet = set()
4900 self.fActiveEdgesSet = set()
4901 self.fActiveFacesSet = set()
4903 def updateSelectionGranularity(self, path, selectionContext):
4915 displayStatus = omr.MGeometryUtilities.displayStatus(path)
4916 if displayStatus == omr.MGeometryUtilities.kHilite:
4918 globalComponentMask = om.MGlobal.objectSelectionMask()
4919 if om.MGlobal.selectionMode() == om.MGlobal.kSelectComponentMode:
4920 globalComponentMask = om.MGlobal.componentSelectionMask()
4922 supportedComponentMask = om.MSelectionMask( om.MSelectionMask.kSelectMeshVerts )
4923 supportedComponentMask.addMask( om.MSelectionMask.kSelectMeshEdges )
4924 supportedComponentMask.addMask( om.MSelectionMask.kSelectMeshFaces )
4925 supportedComponentMask.addMask( om.MSelectionMask.kSelectPointsForGravity )
4927 if globalComponentMask.intersects(supportedComponentMask):
4928 selectionContext.selectionLevel = omr.MSelectionContext.kComponent
4929 elif omr.MPxGeometryOverride.pointSnappingActive():
4930 selectionContext.selectionLevel = omr.MSelectionContext.kComponent
4932 def printShader(self, shader):
4937 params = shader.parameterList()
4938 print(
"DEBUGGING SHADER, BEGIN PARAM LIST OF LENGTH " + str(len(params)))
4940 for param
in params:
4941 paramType = shader.parameterType(param)
4942 isArray = shader.isArrayParameter(param)
4944 typeAsStr =
"Unknown"
4945 if paramType == omr.MShaderInstance.kInvalid:
4946 typeAsStr =
"Invalid"
4947 elif paramType == omr.MShaderInstance.kBoolean:
4948 typeAsStr =
"Boolean"
4949 elif paramType == omr.MShaderInstance.kInteger:
4950 typeAsStr =
"Integer"
4951 elif paramType == omr.MShaderInstance.kFloat:
4953 elif paramType == omr.MShaderInstance.kFloat2:
4954 typeAsStr =
"Float2"
4955 elif paramType == omr.MShaderInstance.kFloat3:
4956 typeAsStr =
"Float3"
4957 elif paramType == omr.MShaderInstance.kFloat4:
4958 typeAsStr =
"Float4"
4959 elif paramType == omr.MShaderInstance.kFloat4x4Row:
4960 typeAsStr =
"Float4x4Row"
4961 elif paramType == omr.MShaderInstance.kFloat4x4Col:
4962 typeAsStr =
"Float4x4Col"
4963 elif paramType == omr.MShaderInstance.kTexture1:
4964 typeAsStr =
"1D Texture"
4965 elif paramType == omr.MShaderInstance.kTexture2:
4966 typeAsStr =
"2D Texture"
4967 elif paramType == omr.MShaderInstance.kTexture3:
4968 typeAsStr =
"3D Texture"
4969 elif paramType == omr.MShaderInstance.kTextureCube:
4970 typeAsStr =
"Cube Texture"
4971 elif paramType == omr.MShaderInstance.kSampler:
4972 typeAsStr =
"Sampler"
4974 print(
"ParamName='" + param +
"', ParamType='" + typeAsStr +
"', IsArrayParameter:'" + str(isArray) +
"'")
4976 print(
"END PARAM LIST")
4978 def setSolidColor(self, shaderInstance, defaultColor, customColor=None):
4981 color = defaultColor
4982 if self.fUseCustomColors
and customColor:
4985 shaderInstance.setParameter(
"solidColor", color)
4989 def setSolidPointSize(self, shaderInstance, size):
4993 shaderInstance.setParameter(
"pointSize", [size, size])
4997 def setLineWidth(self, shaderInstance, width):
5001 shaderInstance.setParameter(
"lineWidth", [width, width])
5005 def enableActiveComponentDisplay(self, path):
5017 displayStatus = omr.MGeometryUtilities.displayStatus(path)
5018 if displayStatus == omr.MGeometryUtilities.kHilite
or displayStatus == omr.MGeometryUtilities.kActiveComponent:
5024 if path.isTemplated():
5030 def updateDormantAndTemplateWireframeItems(self, path, list, shaderMgr):
5042 dormantColor = [ 0.0, 0.0, 1.0, 1.0 ]
5043 templateColor = [ 0.45, 0.45, 0.45, 1.0 ]
5044 activeTemplateColor = [ 1.0, 0.5, 0.5, 1.0 ]
5053 wireframeItem =
None
5054 index = list.indexOf(self.sWireframeItemName)
5056 wireframeItem = omr.MRenderItem.create( self.sWireframeItemName, omr.MRenderItem.DecorationItem, omr.MGeometry.kLines)
5057 wireframeItem.setDrawMode(omr.MGeometry.kWireframe)
5061 wireframeItem.setDepthPriority( omr.MRenderItem.sDormantWireDepthPriority )
5063 list.append(wireframeItem)
5068 preCb = apiMeshPreDrawCallback
5069 postCb = apiMeshPostDrawCallback
5071 shader = shaderMgr.getStockShader(omr.MShaderManager.k3dSolidShader, preCb, postCb)
5074 wireframeItem.setShader(shader)
5078 self.printShader( shader )
5081 shaderMgr.releaseShader(shader)
5083 wireframeItem = list[index]
5087 shadedTemplateItem =
None
5088 index = list.indexOf(self.sShadedTemplateItemName)
5090 shadedTemplateItem = omr.MRenderItem.create( self.sShadedTemplateItemName, omr.MRenderItem.DecorationItem, omr.MGeometry.kLines)
5091 shadedTemplateItem.setDrawMode(omr.MGeometry.kAll)
5095 shadedTemplateItem.setDepthPriority( omr.MRenderItem.sDormantWireDepthPriority )
5097 list.append(shadedTemplateItem)
5099 shader = shaderMgr.getStockShader(omr.MShaderManager.k3dSolidShader)
5102 shadedTemplateItem.setShader(shader)
5106 self.printShader( shader )
5109 shaderMgr.releaseShader(shader)
5111 shadedTemplateItem = list[index]
5114 shadedTemplateItem.setCastsShadows(
not self.fExternalItemsNonTri_NoShadowCast )
5115 shadedTemplateItem.setReceivesShadows(
not self.fExternalItemsNonTri_NoShadowReceive )
5116 shadedTemplateItem.setExcludedFromPostEffects( self.fExternalItemsNonTri_NoPostEffects )
5118 displayStatus = omr.MGeometryUtilities.displayStatus(path)
5119 wireColor = omr.MGeometryUtilities.wireframeColor(path)
5124 shader = wireframeItem.getShader()
5126 if displayStatus == omr.MGeometryUtilities.kTemplate:
5127 self.setSolidColor( shader, wireColor, templateColor)
5128 wireframeItem.enable(
True)
5130 elif displayStatus == omr.MGeometryUtilities.kActiveTemplate:
5131 self.setSolidColor( shader, wireColor, activeTemplateColor)
5132 wireframeItem.enable(
True)
5134 elif displayStatus == omr.MGeometryUtilities.kDormant:
5135 self.setSolidColor( shader, wireColor, dormantColor)
5136 wireframeItem.enable(
True)
5138 elif displayStatus == omr.MGeometryUtilities.kActiveAffected:
5139 theColor = [ 0.5, 0.0, 1.0, 1.0 ]
5140 self.setSolidColor( shader, wireColor, theColor)
5141 wireframeItem.enable(
True)
5144 wireframeItem.enable(
False)
5148 if shadedTemplateItem:
5149 isTemplate = path.isTemplated()
5150 shader = shadedTemplateItem.getShader()
5152 if displayStatus == omr.MGeometryUtilities.kTemplate:
5153 self.setSolidColor( shader, wireColor, templateColor)
5154 shadedTemplateItem.enable(isTemplate)
5156 elif displayStatus == omr.MGeometryUtilities.kActiveTemplate:
5157 self.setSolidColor( shader, wireColor, activeTemplateColor)
5158 shadedTemplateItem.enable(isTemplate)
5160 elif displayStatus == omr.MGeometryUtilities.kDormant:
5161 self.setSolidColor( shader, wireColor, dormantColor)
5162 shadedTemplateItem.enable(isTemplate)
5165 shadedTemplateItem.enable(
False)
5167 def updateActiveWireframeItem(self, path, list, shaderMgr):
5172 index = list.indexOf(self.sSelectedWireframeItemName)
5174 selectItem = omr.MRenderItem.create(self.sSelectedWireframeItemName, omr.MRenderItem.DecorationItem, omr.MGeometry.kLines)
5175 selectItem.setDrawMode(omr.MGeometry.kAll)
5180 selectItem.setDepthPriority( omr.MRenderItem.sActiveWireDepthPriority )
5181 list.append(selectItem)
5186 shaderId = omr.MShaderManager.k3dSolidShader
5188 shaderId = omr.MShaderManager.k3dThickLineShader
5190 shader = shaderMgr.getStockShader(shaderId)
5193 selectItem.setShader(shader)
5195 shaderMgr.releaseShader(shader)
5197 selectItem = list[index]
5201 shader = selectItem.getShader()
5203 displayStatus = omr.MGeometryUtilities.displayStatus(path)
5204 wireColor = omr.MGeometryUtilities.wireframeColor(path)
5206 if displayStatus == omr.MGeometryUtilities.kLead:
5207 theColor = [ 0.0, 0.8, 0.0, 1.0 ]
5208 self.setSolidColor( shader, wireColor, theColor)
5209 selectItem.enable(
True)
5211 elif displayStatus == omr.MGeometryUtilities.kActive:
5212 theColor = [ 1.0, 1.0, 1.0, 1.0 ]
5213 self.setSolidColor( shader, wireColor, theColor)
5214 selectItem.enable(
True)
5216 elif displayStatus == omr.MGeometryUtilities.kHilite
or displayStatus == omr.MGeometryUtilities.kActiveComponent:
5217 theColor = [ 0.0, 0.5, 0.7, 1.0 ]
5218 self.setSolidColor( shader, wireColor, theColor)
5219 selectItem.enable(
True)
5222 selectItem.enable(
False)
5225 myCustomData = selectItem.getCustomData()
5226 if not myCustomData:
5228 myCustomData = apiMeshUserData()
5229 myCustomData.fMessage =
"I'm custom data!"
5230 selectItem.setCustomData(myCustomData)
5233 myCustomData.fNumModifications += 1
5235 def updateWireframeModeFaceCenterItem(self, path, list, shaderMgr):
5239 wireframeModeFaceCenterItem =
None
5240 index = list.indexOf(self.sWireframeModeFaceCenterItemName)
5242 wireframeModeFaceCenterItem = omr.MRenderItem.create(self.sWireframeModeFaceCenterItemName, omr.MRenderItem.DecorationItem, omr.MGeometry.kPoints)
5243 wireframeModeFaceCenterItem.setDrawMode(omr.MGeometry.kWireframe)
5244 wireframeModeFaceCenterItem.setDepthPriority( omr.MRenderItem.sActiveWireDepthPriority )
5246 list.append(wireframeModeFaceCenterItem)
5248 shader = shaderMgr.getStockShader( omr.MShaderManager.k3dFatPointShader )
5252 self.setSolidPointSize( shader, pointSize )
5254 wireframeModeFaceCenterItem.setShader(shader, self.sFaceCenterStreamName )
5257 shaderMgr.releaseShader(shader)
5259 wireframeModeFaceCenterItem = list[index]
5261 if wireframeModeFaceCenterItem:
5262 shader = wireframeModeFaceCenterItem.getShader()
5265 theColor = [ 0.0, 0.0, 1.0, 1.0 ]
5266 self.setSolidColor( shader, theColor )
5269 isTemplate = path.isTemplated()
5270 wireframeModeFaceCenterItem.enable(
not isTemplate )
5272 def updateShadedModeFaceCenterItem(self, path, list, shaderMgr):
5276 shadedModeFaceCenterItem =
None
5277 index = list.indexOf(self.sShadedModeFaceCenterItemName)
5279 shadedModeFaceCenterItem = omr.MRenderItem.create( self.sShadedModeFaceCenterItemName, omr.MRenderItem.DecorationItem, omr.MGeometry.kPoints)
5280 shadedModeFaceCenterItem.setDrawMode(omr.MGeometry.kShaded | omr.MGeometry.kTextured)
5282 shadedModeFaceCenterItem.setDepthPriority(omr.MRenderItem.sActivePointDepthPriority)
5284 list.append(shadedModeFaceCenterItem)
5286 shader = shaderMgr.getStockShader( omr.MShaderManager.k3dFatPointShader )
5290 self.setSolidPointSize( shader, pointSize )
5292 shadedModeFaceCenterItem.setShader(shader, self.sFaceCenterStreamName )
5295 shaderMgr.releaseShader(shader)
5297 shadedModeFaceCenterItem = list[index]
5299 if shadedModeFaceCenterItem:
5300 shadedModeFaceCenterItem.setExcludedFromPostEffects(
True)
5302 shader = shadedModeFaceCenterItem.getShader()
5303 wireColor = omr.MGeometryUtilities.wireframeColor(path)
5307 self.setSolidColor( shader, wireColor )
5309 displayStatus = omr.MGeometryUtilities.displayStatus(path)
5310 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:
5311 shadedModeFaceCenterItem.enable(
True)
5314 shadedModeFaceCenterItem.enable(
False)
5316 def updateDormantVerticesItem(self, path, list, shaderMgr):
5321 index = list.indexOf(self.sVertexItemName)
5323 vertexItem = omr.MRenderItem.create(self.sVertexItemName, omr.MRenderItem.DecorationItem, omr.MGeometry.kPoints)
5326 vertexItem.setDrawMode(omr.MGeometry.kAll)
5329 mask = om.MSelectionMask(om.MSelectionMask.kSelectMeshVerts)
5330 mask.addMask(om.MSelectionMask.kSelectPointsForGravity)
5331 vertexItem.setSelectionMask( mask )
5336 vertexItem.setDepthPriority( omr.MRenderItem.sDormantPointDepthPriority )
5337 list.append(vertexItem)
5339 shader = shaderMgr.getStockShader( omr.MShaderManager.k3dFatPointShader )
5343 self.setSolidPointSize( shader, pointSize )
5346 vertexItem.setShader(shader)
5349 shaderMgr.releaseShader(shader)
5351 vertexItem = list[index]
5354 shader = vertexItem.getShader()
5356 theColor = [ 0.0, 0.0, 1.0, 1.0 ]
5357 self.setSolidColor( shader, theColor )
5359 displayStatus = omr.MGeometryUtilities.displayStatus(path)
5363 if displayStatus == omr.MGeometryUtilities.kHilite
or omr.MPxGeometryOverride.pointSnappingActive():
5367 if path.isTemplated():
5368 vertexItem.enable(
False)
5370 vertexItem.enable(
True)
5372 vertexItem.enable(
False)
5374 mySelectionData = vertexItem.getCustomData()
5375 if not isinstance(mySelectionData, apiMeshHWSelectionUserData):
5377 mySelectionData = apiMeshHWSelectionUserData()
5378 vertexItem.setCustomData(mySelectionData)
5380 mySelectionData.fMeshGeom = self.fMeshGeom
5382 def updateActiveVerticesItem(self, path, list, shaderMgr):
5387 index = list.indexOf(self.sActiveVertexItemName)
5389 activeItem = omr.MRenderItem.create(self.sActiveVertexItemName, omr.MRenderItem.DecorationItem, omr.MGeometry.kPoints)
5390 activeItem.setDrawMode(omr.MGeometry.kAll)
5393 activeItem.setDepthPriority( omr.MRenderItem.sActivePointDepthPriority )
5394 list.append(activeItem)
5396 shaderId = omr.MShaderManager.k3dFatPointShader
5397 if self.fDrawActiveVerticesWithRamp:
5398 shaderId = omr.MShaderManager.k3dColorLookupFatPointShader
5400 shader = shaderMgr.getStockShader( shaderId )
5404 self.setSolidPointSize( shader, pointSize )
5408 if self.fDrawActiveVerticesWithRamp:
5409 textureMgr = omr.MRenderer.getTextureManager()
5412 if not self.fColorRemapTexture:
5414 colorArray = [ 1.0, 0.0, 0.0, 1.0,
5416 0.0, 0.0, 1.0, 1.0 ]
5419 textureDesc = omr.MTextureDescription()
5420 textureDesc.setToDefault2DTexture()
5421 textureDesc.fWidth = arrayLen
5422 textureDesc.fHeight = 1
5423 textureDesc.fDepth = 1
5424 textureDesc.fBytesPerSlice = textureDesc.fBytesPerRow = 24*arrayLen
5425 textureDesc.fMipmaps = 1
5426 textureDesc.fArraySlices = 1
5427 textureDesc.fTextureType = omr.MRenderer.kImage1D
5428 textureDesc.fFormat = omr.MRenderer.kR32G32B32A32_FLOAT
5429 self.fColorRemapTexture = textureMgr.acquireTexture(
"", textureDesc, colorArray,
False)
5431 if not self.fLinearSampler:
5432 samplerDesc = omr.MSamplerStateDesc()
5433 samplerDesc.addressU = omr.MSamplerState.kTexClamp
5434 samplerDesc.addressV = omr.MSamplerState.kTexClamp
5435 samplerDesc.addressW = omr.MSamplerState.kTexClamp
5436 samplerDesc.filter = omr.MSamplerState.kMinMagMipLinear
5437 fLinearSampler = omr.MStateManager.acquireSamplerState(samplerDesc)
5439 if self.fColorRemapTexture
and self.fLinearSampler:
5441 shader.setParameter(
"map", self.fColorRemapTexture)
5442 shader.setParameter(
"samp", self.fLinearSampler)
5446 rampValueRange = om.MFloatVector(0.0, 1.0)
5447 shader.setParameter(
"UVRange", rampValueRange)
5451 if self.fDrawSharedActiveVertices:
5452 activeItem.setShader(shader, self.sActiveVertexStreamName)
5454 activeItem.setShader(shader,
None)
5457 shaderMgr.releaseShader(shader)
5460 activeItem = list[index]
5463 shader = activeItem.getShader()
5466 theColor = [ 1.0, 1.0, 0.0, 1.0 ]
5467 self.setSolidColor( shader, theColor )
5469 enable = (bool(self.fActiveVerticesSet)
and self.enableActiveComponentDisplay(path))
5470 activeItem.enable( enable )
5472 def updateVertexNumericItems(self, path, list, shaderMgr):
5480 index = list.indexOf(self.sVertexIdItemName)
5482 vertexItem = omr.MRenderItem.create( self.sVertexIdItemName, omr.MRenderItem.DecorationItem, omr.MGeometry.kPoints)
5483 vertexItem.setDrawMode(omr.MGeometry.kAll)
5484 vertexItem.setDepthPriority( omr.MRenderItem.sDormantPointDepthPriority )
5485 list.append(vertexItem)
5488 shader = shaderMgr.getStockShader( omr.MShaderManager.k3dIntegerNumericShader )
5491 vertexItem.setShader(shader, self.sVertexIdItemName)
5492 shaderMgr.releaseShader(shader)
5494 vertexItem = list[index]
5497 shader = vertexItem.getShader()
5500 theColor = [ 1.0, 1.0, 0.0, 1.0 ]
5501 self.setSolidColor( shader, theColor )
5503 vertexItem.enable(self.fEnableNumericDisplay)
5508 index = list.indexOf(self.sVertexPositionItemName)
5510 vertexItem = omr.MRenderItem.create( self.sVertexPositionItemName, omr.MRenderItem.DecorationItem, omr.MGeometry.kPoints)
5511 vertexItem.setDrawMode(omr.MGeometry.kAll)
5512 vertexItem.setDepthPriority( omr.MRenderItem.sDormantPointDepthPriority )
5513 list.append(vertexItem)
5516 shader = shaderMgr.getStockShader( omr.MShaderManager.k3dFloat3NumericShader )
5519 vertexItem.setShader(shader, self.sVertexPositionItemName)
5520 shaderMgr.releaseShader(shader)
5522 vertexItem = list[index]
5525 shader = vertexItem.getShader()
5528 theColor = [ 0.0, 1.0, 1.0, 1.0 ]
5529 self.setSolidColor( shader, theColor)
5531 vertexItem.enable(self.fEnableNumericDisplay)
5533 def updateAffectedComponentItems(self, path, list, shaderMgr):
5540 componentItem =
None
5541 index = list.indexOf(self.sAffectedEdgeItemName)
5543 componentItem = omr.MRenderItem.create( self.sAffectedEdgeItemName, omr.MRenderItem.DecorationItem, omr.MGeometry.kLines)
5544 componentItem.setDrawMode(omr.MGeometry.kAll)
5548 componentItem.setDepthPriority( omr.MRenderItem.sActiveLineDepthPriority )
5549 list.append(componentItem)
5551 shader = shaderMgr.getStockShader( omr.MShaderManager.k3dThickLineShader )
5555 self.setLineWidth( shader, lineSize )
5558 componentItem.setShader(shader,
None)
5561 shaderMgr.releaseShader(shader)
5563 componentItem = list[index]
5566 shader = componentItem.getShader()
5569 theColor = [ 1.0, 1.0, 1.0, 1.0 ]
5570 self.setSolidColor( shader, theColor )
5572 enable = ((bool(self.fActiveVerticesSet)
or bool(self.fActiveEdgesSet))
and self.enableActiveComponentDisplay(path))
5573 componentItem.enable( enable )
5579 componentItem =
None
5580 index = list.indexOf(self.sAffectedFaceItemName)
5582 componentItem = omr.MRenderItem.create( self.sAffectedFaceItemName, omr.MRenderItem.DecorationItem, omr.MGeometry.kTriangles)
5583 componentItem.setDrawMode(omr.MGeometry.kAll)
5586 componentItem.setDepthPriority( omr.MRenderItem.sDormantWireDepthPriority )
5589 componentItem.setAllowIsolateSelectCopy(
True)
5591 list.append(componentItem)
5593 shader = shaderMgr.getStockShader( omr.MShaderManager.k3dStippleShader )
5596 componentItem.setShader(shader,
None)
5599 shaderMgr.releaseShader(shader)
5601 componentItem = list[index]
5604 shader = componentItem.getShader()
5607 theColor = [ 1.0, 1.0, 1.0, 1.0 ]
5608 self.setSolidColor( shader, theColor )
5610 enable = ((bool(self.fActiveVerticesSet)
or bool(self.fActiveFacesSet))
and self.enableActiveComponentDisplay(path))
5611 componentItem.enable( enable )
5613 def updateSelectionComponentItems(self, path, list, shaderMgr):
5628 selectionItem =
None
5629 index = list.indexOf(self.sEdgeSelectionItemName)
5631 selectionItem = omr.MRenderItem.create( self.sEdgeSelectionItemName, omr.MRenderItem.DecorationItem, omr.MGeometry.kLines)
5634 selectionItem.setDrawMode(omr.MGeometry.kSelectionOnly)
5637 selectionItem.setSelectionMask( om.MSelectionMask.kSelectMeshEdges )
5640 selectionItem.setDepthPriority( omr.MRenderItem.sSelectionDepthPriority )
5641 list.append(selectionItem)
5643 shader = shaderMgr.getStockShader(omr.MShaderManager.k3dThickLineShader)
5646 selectionItem.setShader(shader,
None)
5649 shaderMgr.releaseShader(shader)
5651 selectionItem = list[index]
5654 selectionItem.enable(
True)
5656 mySelectionData = selectionItem.getCustomData()
5657 if not isinstance(mySelectionData, apiMeshHWSelectionUserData):
5659 mySelectionData = apiMeshHWSelectionUserData()
5660 selectionItem.setCustomData(mySelectionData)
5662 mySelectionData.fMeshGeom = self.fMeshGeom
5666 index = list.indexOf(self.sFaceSelectionItemName)
5668 selectionItem = omr.MRenderItem.create( self.sFaceSelectionItemName, omr.MRenderItem.DecorationItem, omr.MGeometry.kTriangles)
5671 selectionItem.setDrawMode(omr.MGeometry.kSelectionOnly)
5674 selectionItem.setSelectionMask( om.MSelectionMask.kSelectMeshFaces )
5677 selectionItem.setDepthPriority( omr.MRenderItem.sSelectionDepthPriority )
5680 selectionItem.setAllowIsolateSelectCopy(
True)
5682 list.append(selectionItem)
5684 shader = shaderMgr.getStockShader(omr.MShaderManager.k3dSolidShader)
5687 selectionItem.setShader(shader,
None)
5690 shaderMgr.releaseShader(shader)
5692 selectionItem = list[index]
5695 selectionItem.enable(
True)
5697 mySelectionData = selectionItem.getCustomData()
5698 if not isinstance(mySelectionData, apiMeshHWSelectionUserData):
5700 mySelectionData = apiMeshHWSelectionUserData()
5701 selectionItem.setCustomData(mySelectionData)
5703 mySelectionData.fMeshGeom = self.fMeshGeom
5705 def updateProxyShadedItem(self, path, list, shaderMgr):
5710 dormantColor = [ 0.0, 0.0, 1.0, 1.0 ]
5711 templateColor = [ 0.45, 0.45, 0.45, 1.0 ]
5712 activeTemplateColor = [ 1.0, 0.5, 0.5, 1.0 ]
5719 raiseAboveShaded =
True
5720 shadedDrawMode = omr.MGeometry.kShaded | omr.MGeometry.kTextured
5723 useFragmentShader = self.fProxyShader < 0
5724 if not useFragmentShader:
5725 shadedDrawMode |= omr.MGeometry.kWireframe
5730 itemType = omr.MRenderItem.NonMaterialSceneItem
5731 primitive = omr.MGeometry.kLines
5732 filledProxy = useFragmentShader
or self.fProxyShader == omr.MShaderManager.k3dStippleShader
5734 itemType = omr.MRenderItem.MaterialSceneItem
5735 primitive = omr.MGeometry.kTriangles
5737 depthPriority = omr.MRenderItem.sDormantWireDepthPriority
5738 if raiseAboveShaded:
5739 depthPriority = omr.MRenderItem.sActiveWireDepthPriority
5742 index = list.indexOf(self.sShadedProxyItemName)
5744 proxyItem = omr.MRenderItem.create( self.sShadedProxyItemName, itemType, primitive)
5745 proxyItem.setDrawMode(shadedDrawMode)
5746 proxyItem.setDepthPriority( depthPriority )
5748 proxyItem.setCastsShadows(
not self.fExternalItems_NoShadowCast
and self.fCastsShadows )
5749 proxyItem.setReceivesShadows(
not self.fExternalItems_NoShadowReceive
and self.fReceivesShadows )
5750 proxyItem.setExcludedFromPostEffects( self.fExternalItems_NoPostEffects )
5752 list.append(proxyItem)
5757 if useFragmentShader:
5758 shader = shaderMgr.getFragmentShader(
"mayaLambertSurface",
"outSurfaceFinal",
True)
5759 sBlue = [ 0.4, 0.4, 1.0 ]
5760 shader.setParameter(
"color", sBlue)
5761 shader.setIsTransparent(
False)
5763 shader = shaderMgr.getStockShader( self.fProxyShader )
5767 self.setLineWidth(shader, 10.0)
5770 proxyItem.setShader(shader)
5772 shaderMgr.releaseShader(shader)
5774 proxyItem = list[index]
5781 proxyItem.setCastsShadows(
not self.fExternalItems_NoShadowCast
and self.fCastsShadows )
5782 proxyItem.setReceivesShadows(
not self.fExternalItems_NoShadowReceive
and self.fReceivesShadows )
5783 proxyItem.setExcludedFromPostEffects( self.fExternalItems_NoPostEffects )
5788 haveShadedItems =
False
5792 drawMode = item.drawMode()
5793 if drawMode == omr.MGeometry.kShaded
or drawMode == omr.MGeometry.kTextured:
5794 if item.name() != self.sShadedTemplateItemName:
5795 haveShadedItems =
True
5798 displayStatus = omr.MGeometryUtilities.displayStatus(path)
5799 wireColor = omr.MGeometryUtilities.wireframeColor(path)
5806 shader = proxyItem.getShader()
5808 if displayStatus == omr.MGeometryUtilities.kTemplate:
5809 self.setSolidColor( shader, wireColor, templateColor )
5811 elif displayStatus == omr.MGeometryUtilities.kActiveTemplate:
5812 self.setSolidColor( shader, wireColor, activeTemplateColor )
5814 elif displayStatus == omr.MGeometryUtilities.kDormant:
5815 self.setSolidColor( shader, wireColor, dormantColor )
5822 if path.isTemplated():
5823 proxyItem.enable(
False)
5825 proxyItem.enable(
not haveShadedItems)
5827 proxyItem.enable(
not haveShadedItems)
5830 def updateGeometryRequirements(self, requirements, data, activeVertexCount, totalVerts, debugPopulateGeometry):
5836 positionBuffer =
None
5837 positionDataAddress =
None
5840 vertexNumericIdBuffer =
None
5841 vertexNumericIdDataAddress =
None
5842 vertexNumericIdData =
None
5844 vertexNumericIdPositionBuffer =
None
5845 vertexNumericIdPositionDataAddress =
None
5846 vertexNumericIdPositionData =
None
5848 vertexNumericLocationBuffer =
None
5849 vertexNumericLocationDataAddress =
None
5850 vertexNumericLocationData =
None
5852 vertexNumericLocationPositionBuffer =
None
5853 vertexNumericLocationPositionDataAddress =
None
5854 vertexNumericLocationPositionData =
None
5856 activeVertexPositionBuffer =
None
5857 activeVertexPositionDataAddress =
None
5858 activeVertexPositionData =
None
5860 activeVertexUVBuffer =
None
5861 activeVertexUVDataAddress =
None
5862 activeVertexUVData =
None
5864 faceCenterPositionBuffer =
None
5865 faceCenterPositionDataAddress =
None
5866 faceCenterPositionData =
None
5869 normalDataAddress =
None
5873 cpvDataAddress =
None
5877 uvDataAddress =
None
5880 numUVs = self.fMeshGeom.uvcoords.uvcount()
5882 descList = requirements.vertexRequirements()
5883 satisfiedRequirements = [
False,] * len(descList)
5884 for i
in range(len(descList)):
5888 if self.fDrawSharedActiveVertices
and (desc.name == self.sActiveVertexStreamName):
5889 if desc.semantic == omr.MGeometry.kPosition:
5890 if not activeVertexPositionBuffer:
5891 activeVertexPositionBuffer = data.createVertexBuffer(desc)
5892 if activeVertexPositionBuffer:
5893 satisfiedRequirements[i] =
True
5894 if debugPopulateGeometry:
5895 print(
">>> Fill in data for active vertex requirement '" + desc.name +
"'. Semantic = kPosition")
5896 activeVertexPositionDataAddress = activeVertexPositionBuffer.acquire(activeVertexCount,
True)
5897 if activeVertexPositionDataAddress:
5898 activeVertexPositionData = ((ctypes.c_float * 3)*activeVertexCount).from_address(activeVertexPositionDataAddress)
5900 elif desc.semantic == omr.MGeometry.kTexture:
5901 if not activeVertexUVBuffer:
5902 activeVertexUVBuffer = data.createVertexBuffer(desc)
5903 if activeVertexUVBuffer:
5904 satisfiedRequirements[i] =
True
5905 if debugPopulateGeometry:
5906 print(
">>> Fill in data for active vertex requirement '" + desc.name +
"'. Semantic = kTexture")
5907 activeVertexUVDataAddress = activeVertexUVBuffer.acquire(activeVertexCount,
True)
5908 if activeVertexUVDataAddress:
5909 activeVertexUVData = ((ctypes.c_float * 3)*activeVertexCount).from_address(activeVertexUVDataAddress)
5916 elif self.fDrawFaceCenters
and desc.name == self.sFaceCenterStreamName:
5917 if desc.semantic == omr.MGeometry.kPosition:
5918 if not faceCenterPositionBuffer:
5919 faceCenterPositionBuffer = data.createVertexBuffer(desc)
5920 if faceCenterPositionBuffer:
5921 satisfiedRequirements[i] =
True
5922 if debugPopulateGeometry:
5923 print(
">>> Fill in data for face center vertex requirement '" + desc.name +
"'. Semantic = kPosition")
5924 faceCenterPositionDataAddress = faceCenterPositionBuffer.acquire(self.fMeshGeom.faceCount,
True)
5925 if faceCenterPositionDataAddress:
5926 faceCenterPositionData = ((ctypes.c_float * 3)*self.fMeshGeom.faceCount).from_address(faceCenterPositionDataAddress)
5935 if desc.semantic == omr.MGeometry.kPosition:
5936 if desc.name == self.sVertexIdItemName:
5937 if not vertexNumericIdPositionBuffer:
5938 vertexNumericIdPositionBuffer = data.createVertexBuffer(desc)
5939 if vertexNumericIdPositionBuffer:
5940 satisfiedRequirements[i] =
True
5941 if debugPopulateGeometry:
5942 print(
">>> Fill in data for requirement '" + desc.name +
"'. Semantic = kPosition")
5943 print(
"Acquire 3loat-numeric position buffer")
5944 vertexNumericIdPositionDataAddress = vertexNumericIdPositionBuffer.acquire(totalVerts,
True)
5945 if vertexNumericIdPositionDataAddress:
5946 vertexNumericIdPositionData = ((ctypes.c_float * 3)*totalVerts).from_address(vertexNumericIdPositionDataAddress)
5948 elif desc.name == self.sVertexPositionItemName:
5949 if not vertexNumericLocationPositionBuffer:
5950 vertexNumericLocationPositionBuffer = data.createVertexBuffer(desc)
5951 if vertexNumericLocationPositionBuffer:
5952 satisfiedRequirements[i] =
True
5953 if debugPopulateGeometry:
5954 print(
">>> Fill in data for requirement '" + desc.name +
"'. Semantic = kPosition")
5955 print(
"Acquire 3loat-numeric position buffer")
5956 vertexNumericLocationPositionDataAddress = vertexNumericLocationPositionBuffer.acquire(totalVerts,
True)
5957 if vertexNumericLocationPositionDataAddress:
5958 vertexNumericLocationPositionData = ((ctypes.c_float * 3)*totalVerts).from_address(vertexNumericLocationPositionDataAddress)
5961 if not positionBuffer:
5962 positionBuffer = data.createVertexBuffer(desc)
5964 satisfiedRequirements[i] =
True
5965 if debugPopulateGeometry:
5966 print(
">>> Fill in data for requirement '" + desc.name +
"'. Semantic = kPosition")
5967 print(
"Acquire unnamed position buffer")
5968 positionDataAddress = positionBuffer.acquire(totalVerts,
True)
5969 if positionDataAddress:
5970 positionData = ((ctypes.c_float * 3)*totalVerts).from_address(positionDataAddress)
5972 elif desc.semantic == omr.MGeometry.kNormal:
5973 if not normalBuffer:
5974 normalBuffer = data.createVertexBuffer(desc)
5976 satisfiedRequirements[i] =
True
5977 if debugPopulateGeometry:
5978 print(
">>> Fill in data for requirement '" + desc.name +
"'. Semantic = kNormal")
5979 normalDataAddress = normalBuffer.acquire(totalVerts,
True)
5980 if normalDataAddress:
5981 normalData = ((ctypes.c_float * 3)*totalVerts).from_address(normalDataAddress)
5983 elif desc.semantic == omr.MGeometry.kTexture:
5984 numericValue =
"numericvalue"
5985 numeric3Value =
"numeric3value"
5988 if desc.semanticName.lower() == numericValue
and desc.name == self.sVertexIdItemName:
5989 if not vertexNumericIdBuffer:
5990 vertexNumericIdBuffer = data.createVertexBuffer(desc)
5991 if vertexNumericIdBuffer:
5992 satisfiedRequirements[i] =
True
5993 if debugPopulateGeometry:
5994 print(
">>> Fill in data for requirement '" + desc.name +
"'. Semantic = kTexture")
5995 print(
"Acquire 1loat numeric buffer")
5996 vertexNumericIdDataAddress = vertexNumericIdBuffer.acquire(totalVerts,
True)
5997 if vertexNumericIdDataAddress:
5998 vertexNumericIdData = ((ctypes.c_float * 1)*totalVerts).from_address(vertexNumericIdDataAddress)
6001 elif desc.semanticName.lower() == numeric3Value
and desc.name == self.sVertexPositionItemName:
6002 if not vertexNumericLocationBuffer:
6003 vertexNumericLocationBuffer = data.createVertexBuffer(desc)
6004 if vertexNumericLocationBuffer:
6005 satisfiedRequirements[i] =
True
6006 if debugPopulateGeometry:
6007 print(
">>> Fill in data for requirement '" + desc.name +
"'. Semantic = kTexture")
6008 print(
"Acquire 3loat numeric location buffer")
6009 vertexNumericLocationDataAddress = vertexNumericLocationBuffer.acquire(totalVerts,
True)
6010 if vertexNumericLocationDataAddress:
6011 vertexNumericLocationData = ((ctypes.c_float * 3)*totalVerts).from_address(vertexNumericLocationDataAddress)
6014 elif desc.name != self.sVertexIdItemName
and desc.name != self.sVertexPositionItemName:
6016 uvBuffer = data.createVertexBuffer(desc)
6018 satisfiedRequirements[i] =
True
6019 if debugPopulateGeometry:
6020 print(
">>> Fill in data for requirement '" + desc.name +
"'. Semantic = kTexture")
6021 print(
"Acquire a uv buffer")
6022 uvDataAddress = uvBuffer.acquire(totalVerts,
True)
6024 uvData = ((ctypes.c_float * 2)*totalVerts).from_address(uvDataAddress)
6026 elif desc.semantic == omr.MGeometry.kColor:
6028 cpvBuffer = data.createVertexBuffer(desc)
6030 satisfiedRequirements[i] =
True
6031 if debugPopulateGeometry:
6032 print(
">>> Fill in data for requirement '" + desc.name +
"'. Semantic = kColor")
6033 cpvDataAddress = cpvBuffer.acquire(totalVerts,
True)
6035 cpvData = ((ctypes.c_float * 4)*totalVerts).from_address(cpvDataAddress)
6046 for i
in range(self.fMeshGeom.faceCount):
6048 numVerts = self.fMeshGeom.face_counts[i]
6050 for v
in range(numVerts):
6051 if any((positionData, vertexNumericIdPositionData, vertexNumericLocationPositionData, vertexNumericLocationData)):
6052 position = self.fMeshGeom.vertices[self.fMeshGeom.face_connects[vid]]
6055 positionData[pid][0] = position[0]
6056 positionData[pid][1] = position[1]
6057 positionData[pid][2] = position[2]
6059 if vertexNumericIdPositionData:
6060 vertexNumericIdPositionData[pid][0] = position[0]
6061 vertexNumericIdPositionData[pid][1] = position[1]
6062 vertexNumericIdPositionData[pid][2] = position[2]
6064 if vertexNumericLocationPositionData:
6065 vertexNumericLocationPositionData[pid][0] = position[0]
6066 vertexNumericLocationPositionData[pid][1] = position[1]
6067 vertexNumericLocationPositionData[pid][2] = position[2]
6069 if vertexNumericLocationData:
6070 vertexNumericLocationData[pid][0] = position[0]
6071 vertexNumericLocationData[pid][1] = position[1]
6072 vertexNumericLocationData[pid][2] = position[2]
6077 normal = self.fMeshGeom.normals[self.fMeshGeom.face_connects[vid]]
6078 normalData[nid][0] = normal[0]
6079 normalData[nid][1] = normal[1]
6080 normalData[nid][2] = normal[2]
6087 uvNum = self.fMeshGeom.uvcoords.uvId(vid)
6088 uv = self.fMeshGeom.uvcoords.getUV(uvNum)
6089 uvData[uvid][0] = uv[0]
6090 uvData[uvid][1] = uv[0]
6097 position = self.fMeshGeom.vertices[self.fMeshGeom.face_connects[vid]]
6098 cpvData[cid][0] = position[0]
6099 cpvData[cid][1] = position[1]
6100 cpvData[cid][2] = position[2]
6101 cpvData[cid][3] = 1.0
6106 if vertexNumericIdData:
6107 vertexNumericIdData[vid] = (ctypes.c_float * 1)(self.fMeshGeom.face_connects[vid])
6115 if positionDataAddress:
6116 positionBuffer.commit(positionDataAddress)
6118 if normalDataAddress:
6119 normalBuffer.commit(normalDataAddress)
6122 uvBuffer.commit(uvDataAddress)
6125 cpvBuffer.commit(cpvDataAddress)
6127 if vertexNumericIdDataAddress:
6128 vertexNumericIdBuffer.commit(vertexNumericIdDataAddress)
6130 if vertexNumericIdPositionDataAddress:
6131 vertexNumericIdPositionBuffer.commit(vertexNumericIdPositionDataAddress)
6133 if vertexNumericLocationDataAddress:
6134 vertexNumericLocationBuffer.commit(vertexNumericLocationDataAddress)
6136 if vertexNumericLocationPositionDataAddress:
6137 vertexNumericLocationPositionBuffer.commit(vertexNumericLocationPositionDataAddress)
6142 if activeVertexPositionData:
6143 if debugPopulateGeometry:
6144 print(
">>> Fill in the data for active vertex position buffer base on component list")
6148 if activeVertexCount > len(self.fMeshGeom.vertices):
6149 activeVertexCount = len(self.fMeshGeom.vertices)
6151 for i
in range(activeVertexCount):
6152 position = self.fMeshGeom.vertices[ self.fActiveVertices[i] ]
6153 activeVertexPositionData[i][0] = position[0]
6154 activeVertexPositionData[i][1] = position[1]
6155 activeVertexPositionData[i][2] = position[2]
6157 activeVertexPositionBuffer.commit(activeVertexPositionDataAddress)
6159 if activeVertexUVData:
6160 if debugPopulateGeometry:
6161 print(
">>> Fill in the data for active vertex uv buffer base on component list")
6165 if activeVertexCount > len(self.fMeshGeom.vertices):
6166 activeVertexCount = len(self.fMeshGeom.vertices)
6168 for i
in range(activeVertexCount):
6169 activeVertexUVData[i] = i // activeVertexCount
6171 activeVertexUVBuffer.commit(activeVertexUVDataAddress)
6176 if faceCenterPositionData:
6177 if debugPopulateGeometry:
6178 print(
">>> Fill in the data for face center position buffer")
6184 for faceId
in range(self.fMeshGeom.faceCount):
6190 faceCenterPosition = om.MPoint()
6193 numVerts = self.fMeshGeom.face_counts[faceId]
6195 for v
in range(numVerts):
6196 face_vertex_position = self.fMeshGeom.vertices[self.fMeshGeom.face_connects[vid]]
6197 x += face_vertex_position[0]
6198 y += face_vertex_position[1]
6199 z += face_vertex_position[2]
6203 faceCenterPosition = om.MPoint(x, y, z) / numVerts
6208 faceCenterPositionData[faceId][0] = faceCenterPosition[0]
6209 faceCenterPositionData[faceId][1] = faceCenterPosition[1]
6210 faceCenterPositionData[faceId][2] = faceCenterPosition[2]
6212 faceCenterPositionBuffer.commit(faceCenterPositionDataAddress)
6216 for i
in range(len(descList)):
6217 if satisfiedRequirements[i]:
6220 if self.fDrawSharedActiveVertices
and (desc.name == self.sActiveVertexStreamName):
6221 if desc.semantic == omr.MGeometry.kPosition:
6222 satisfiedRequirements[i] =
True
6223 self.cloneVertexBuffer(activeVertexPositionBuffer, data, desc, activeVertexCount, debugPopulateGeometry)
6224 elif desc.semantic == omr.MGeometry.kTexture:
6225 satisfiedRequirements[i] =
True
6226 self.cloneVertexBuffer(activeVertexUVBuffer, data, desc, activeVertexCount, debugPopulateGeometry)
6227 elif self.fDrawFaceCenters
and desc.name == self.sFaceCenterStreamName:
6228 if desc.semantic == omr.MGeometry.kPosition:
6229 satisfiedRequirements[i] =
True
6230 self.cloneVertexBuffer(faceCenterPositionBuffer, data, desc, self.fMeshGeom.faceCount, debugPopulateGeometry)
6232 if desc.semantic == omr.MGeometry.kPosition:
6233 if desc.name == self.sVertexIdItemName:
6234 satisfiedRequirements[i] =
True
6235 self.cloneVertexBuffer(vertexNumericIdPositionBuffer, data, desc, totalVerts, debugPopulateGeometry)
6236 elif desc.name == self.sVertexPositionItemName:
6237 satisfiedRequirements[i] =
True
6238 self.cloneVertexBuffer(vertexNumericLocationPositionBuffer, data, desc, totalVerts, debugPopulateGeometry)
6240 satisfiedRequirements[i] =
True
6241 self.cloneVertexBuffer(positionBuffer, data, desc, totalVerts, debugPopulateGeometry)
6242 elif desc.semantic == omr.MGeometry.kNormal:
6243 satisfiedRequirements[i] =
True
6244 self.cloneVertexBuffer(normalBuffer, data, desc, totalVerts, debugPopulateGeometry)
6245 elif desc.semantic == omr.MGeometry.kTexture:
6246 numericValue =
"numericvalue"
6247 numeric3Value =
"numeric3value"
6248 if desc.semanticName.lower() == numericValue
and desc.name == self.sVertexIdItemName:
6249 satisfiedRequirements[i] =
True
6250 self.cloneVertexBuffer(vertexNumericIdBuffer, data, desc, totalVerts, debugPopulateGeometry)
6251 elif desc.semanticName.lower() == numeric3Value
and desc.name == self.sVertexPositionItemName:
6252 satisfiedRequirements[i] =
True
6253 self.cloneVertexBuffer(vertexNumericLocationBuffer, data, desc, totalVerts, debugPopulateGeometry)
6254 elif desc.name != self.sVertexIdItemName
and desc.name != self.sVertexPositionItemName:
6255 satisfiedRequirements[i] =
True
6256 self.cloneVertexBuffer(uvBuffer, data, desc, totalVerts, debugPopulateGeometry)
6257 elif desc.semantic == omr.MGeometry.kColor:
6258 satisfiedRequirements[i] =
True
6259 self.cloneVertexBuffer(cpvBuffer, data, desc, totalVerts, debugPopulateGeometry)
6261 if not satisfiedRequirements[i]:
6264 destBuffer = data.createVertexBuffer(desc)
6266 satisfiedRequirements[i] =
True
6267 if debugPopulateGeometry:
6268 print(
">>> Fill in dummy requirement '%s'" % (desc.name, ))
6269 destBufferDataAddress = destBuffer.acquire(totalVerts,
True)
6270 if destBufferDataAddress:
6271 destBufferData = ((ctypes.c_float * desc.dimension)*totalVerts).from_address(destBufferDataAddress)
6273 for j
in range(totalVerts):
6274 if desc.dimension == 4:
6275 destBufferData[j] = (1.0, 0.0, 0.0, 1.0)
6276 elif desc.dimension == 3:
6277 destBufferData[j] = (1.0, 0.0, 0.0)
6279 for k
in range(desc.dimension):
6280 destBufferData[j][k] = 0.0
6281 destBuffer.commit(destBufferDataAddress)
6286 def cloneVertexBuffer(self, srcBuffer, data, desc, dataSize, debugPopulateGeometry):
6288 destBuffer = data.createVertexBuffer(desc)
6290 if debugPopulateGeometry:
6291 print(
">>> Cloning requirement '%s'" % (desc.name, ))
6292 destBufferDataAddress = destBuffer.acquire(dataSize,
True)
6293 srcBufferDataAddress = srcBuffer.map()
6294 if destBufferDataAddress
and srcBufferDataAddress:
6295 destBufferData = ((ctypes.c_float * desc.dimension)*dataSize).from_address(destBufferDataAddress)
6296 srcBufferData = ((ctypes.c_float * desc.dimension)*dataSize).from_address(srcBufferDataAddress)
6297 if destBufferData
and srcBufferData:
6298 for j
in range(dataSize):
6299 for k
in range(desc.dimension):
6300 destBufferData[j][k] = srcBufferData[j][k]
6301 destBuffer.commit(destBufferDataAddress)
6305 def updateIndexingForWireframeItems(self, wireIndexBuffer, item, data, totalVerts):
6313 if not wireIndexBuffer:
6314 wireIndexBuffer = data.createIndexBuffer(omr.MGeometry.kUnsignedInt32)
6316 dataAddress = wireIndexBuffer.acquire(2*totalVerts,
True)
6318 data = (ctypes.c_uint * (2*totalVerts)).from_address(dataAddress)
6322 for faceIdx
in range(self.fMeshGeom.faceCount):
6324 numVerts = self.fMeshGeom.face_counts[faceIdx]
6327 for v
in range(numVerts-1):
6343 wireIndexBuffer.commit(dataAddress)
6347 item.associateWithIndexBuffer(wireIndexBuffer)
6349 def updateIndexingForDormantVertices(self, item, data, numTriangles):
6352 indexBuffer = data.createIndexBuffer(omr.MGeometry.kUnsignedInt32)
6354 dataAddress = indexBuffer.acquire(3*numTriangles,
True)
6356 data = (ctypes.c_uint*(3*numTriangles)).from_address(dataAddress)
6361 for faceIdx
in range(self.fMeshGeom.faceCount):
6363 numVerts = self.fMeshGeom.face_counts[faceIdx]
6365 for v
in range(1, numVerts-1):
6367 data[idx+1] = base+v
6368 data[idx+2] = base+v+1
6373 indexBuffer.commit(dataAddress)
6375 item.associateWithIndexBuffer(indexBuffer)
6377 def updateIndexingForFaceCenters(self, item, data, debugPopulateGeometry):
6380 indexBuffer = data.createIndexBuffer(omr.MGeometry.kUnsignedInt32)
6382 dataAddress = indexBuffer.acquire(self.fMeshGeom.faceCount,
True)
6384 data = (ctypes.c_uint * self.fMeshGeom.faceCount).from_address(dataAddress)
6385 if debugPopulateGeometry:
6386 print(
">>> Set up indexing for face centers")
6388 for i
in range(self.fMeshGeom.faceCount):
6393 for i
in range(self.fMeshGeom.faceCount):
6395 numVerts = self.fMeshGeom.face_counts[i]
6400 indexBuffer.commit(dataAddress)
6402 item.associateWithIndexBuffer(indexBuffer)
6404 def updateIndexingForVertices(self, item, data, numTriangles, activeVertexCount, debugPopulateGeometry):
6407 indexBuffer = data.createIndexBuffer(omr.MGeometry.kUnsignedInt32)
6419 if self.fDrawSharedActiveVertices:
6420 dataAddress = indexBuffer.acquire(activeVertexCount,
True)
6422 data = (ctypes.c_uint*activeVertexCount).from_address(dataAddress)
6423 if debugPopulateGeometry:
6424 print(
">>> Set up indexing for shared vertices")
6426 for i
in range(activeVertexCount):
6432 if debugPopulateGeometry:
6433 print(
">>> Set up indexing for unshared vertices")
6435 vertexCount = 3*numTriangles
6436 dataAddress = indexBuffer.acquire(vertexCount,
True)
6438 data = (ctypes.c_uint*vertexCount).from_address(dataAddress)
6439 for i
in range(vertexCount):
6440 data[i] = vertexCount+1
6442 selectionIdSet = self.fActiveVerticesSet
6449 for faceIdx
in range(self.fMeshGeom.faceCount):
6451 numVerts = self.fMeshGeom.face_counts[faceIdx]
6453 for v
in range(1, numVerts-1):
6454 vertexId = self.fMeshGeom.face_connects[base]
6455 if vertexId
in selectionIdSet:
6457 data[idx] = lastFound
6460 vertexId = self.fMeshGeom.face_connects[base+v]
6461 if vertexId
in selectionIdSet:
6463 data[idx] = lastFound
6466 vertexId = self.fMeshGeom.face_connects[base+v+1]
6467 if vertexId
in selectionIdSet:
6468 lastFound = base+v+1
6469 data[idx] = lastFound
6474 for i
in range(vertexCount):
6475 if data[i] == vertexCount+1:
6479 indexBuffer.commit(dataAddress)
6481 item.associateWithIndexBuffer(indexBuffer)
6483 def updateIndexingForEdges(self, item, data, totalVerts, fromSelection):
6486 indexBuffer = data.createIndexBuffer(omr.MGeometry.kUnsignedInt32)
6488 totalEdges = 2*totalVerts
6489 totalEdgesP1 = 2*totalVerts+1
6490 dataAddress = indexBuffer.acquire(totalEdges,
True)
6492 data = (ctypes.c_uint*totalEdges).from_address(dataAddress)
6493 for i
in range(totalEdges):
6494 data[i] = totalEdgesP1
6497 displayAll =
not fromSelection
6498 displayActives = (
not displayAll
and bool(self.fActiveEdgesSet))
6499 displayAffected = (
not displayAll
and not displayActives)
6501 selectionIdSet =
None
6503 selectionIdSet = self.fActiveEdgesSet
6504 elif displayAffected:
6505 selectionIdSet = self.fActiveVerticesSet
6511 for faceIdx
in range(self.fMeshGeom.faceCount):
6513 numVerts = self.fMeshGeom.face_counts[faceIdx]
6515 for v
in range(numVerts):
6516 enableEdge = displayAll
6517 vindex1 = base + (v % numVerts)
6518 vindex2 = base + ((v+1) % numVerts)
6524 vertexId = self.fMeshGeom.face_connects[vindex1]
6525 if vertexId
in selectionIdSet:
6530 vertexId2 = self.fMeshGeom.face_connects[vindex2]
6531 if vertexId2
in selectionIdSet:
6535 elif displayActives:
6538 if edgeId
in selectionIdSet:
6553 for i
in range(totalEdges):
6554 if data[i] == totalEdgesP1:
6557 indexBuffer.commit(dataAddress)
6559 item.associateWithIndexBuffer(indexBuffer)
6561 def updateIndexingForFaces(self, item, data, numTriangles, fromSelection):
6564 indexBuffer = data.createIndexBuffer(omr.MGeometry.kUnsignedInt32)
6566 numTriangleVertices = 3*numTriangles
6567 dataAddress = indexBuffer.acquire(numTriangleVertices,
True)
6569 data = (ctypes.c_uint*numTriangleVertices).from_address(dataAddress)
6570 for i
in range(numTriangleVertices):
6571 data[i] = numTriangleVertices+1
6574 displayAll =
not fromSelection
6575 displayActives = (
not displayAll
and bool(self.fActiveFacesSet))
6576 displayAffected = (
not displayAll
and not displayActives)
6577 isolateSelect = item.isIsolateSelectCopy()
6581 enableFaces = [0] * self.fMeshGeom.faceCount
6583 for i
in range(self.fMeshGeom.faceCount):
6584 enableFaces[i] =
False
6587 fnComponent = om.MFnSingleIndexedComponent( item.shadingComponent() )
6588 if(fnComponent.componentType == om.MFn.kMeshPolygonComponent):
6589 faceIds = fnComponent.getElements()
6591 for i
in range(len(faceIds)):
6592 enableFaces[faceIds[i]] =
True
6595 selectionIdSet =
None
6597 selectionIdSet = self.fActiveFacesSet
6598 elif displayAffected:
6599 selectionIdSet = self.fActiveVerticesSet
6604 for faceIdx
in range(self.fMeshGeom.faceCount):
6606 numVerts = self.fMeshGeom.face_counts[faceIdx]
6613 for v
in range(1, numVerts-1):
6614 vertexId = self.fMeshGeom.face_connects[base]
6615 if vertexId
in selectionIdSet:
6620 vertexId2 = self.fMeshGeom.face_connects[base+v]
6621 if vertexId2
in selectionIdSet:
6626 vertexId3 = self.fMeshGeom.face_connects[base+v+1]
6627 if vertexId3
in selectionIdSet:
6629 lastFound = base+v+1
6631 elif displayActives:
6632 if (
not isolateSelect
or enableFaces[faceIdx]):
6635 if faceIdx
in selectionIdSet:
6638 elif (
not isolateSelect
or enableFaces[faceIdx]):
6647 for v
in range(1, numVerts-1):
6649 data[idx+1] = base+v
6650 data[idx+2] = base+v+1
6656 for i
in range(numTriangleVertices):
6657 if data[i] == numTriangleVertices+1:
6660 indexBuffer.commit(dataAddress)
6662 item.associateWithIndexBuffer(indexBuffer)
6664 def updateIndexingForShadedTriangles(self, item, data, numTriangles):
6668 indexBuffer = data.createIndexBuffer(omr.MGeometry.kUnsignedInt32)
6670 isolateSelect = item.isIsolateSelectCopy()
6674 enableFaces = [0] * self.fMeshGeom.faceCount
6676 for i
in range(self.fMeshGeom.faceCount):
6677 enableFaces[i] =
False
6679 fnComponent = om.MFnSingleIndexedComponent( item.shadingComponent() )
6680 if(fnComponent.componentType == om.MFn.kMeshPolygonComponent):
6681 faceIds = fnComponent.getElements()
6683 for i
in range(len(faceIds)):
6684 enableFaces[faceIds[i]] =
True
6686 indices = [0] * numTriangles * 3
6690 for faceIdx
in range(self.fMeshGeom.faceCount):
6692 numVerts = self.fMeshGeom.face_counts[faceIdx]
6694 if (
not isolateSelect
or enableFaces[faceIdx]):
6695 for v
in range(1, numVerts-1):
6697 indices[idx+1] = base+v
6698 indices[idx+2] = base+v+1
6702 dataAddress = indexBuffer.acquire(len(indices),
True)
6704 data = (ctypes.c_uint * len(indices)).from_address(dataAddress)
6706 for i
in range(len(indices)):
6707 data[i] = indices[i]
6709 indexBuffer.commit(dataAddress)
6711 item.associateWithIndexBuffer(indexBuffer)
6724 def initializePlugin(obj):
6725 plugin = om.MFnPlugin(obj,
"Autodesk",
"3.0",
"Any")
6728 plugin.registerData(
"apiMeshData_py", apiMeshData.id, apiMeshData.creator, om.MPxData.kGeometryData)
6730 sys.stderr.write(
"Failed to register data\n")
6734 plugin.registerShape(
"apiMesh_py", apiMeshGeometryShape.id, apiMeshGeometryShape.creator, apiMeshGeometryShape.initialize, apiMeshGeometryShape.sDrawDbClassification)
6736 sys.stderr.write(
"Failed to register node\n")
6740 plugin.registerShape(
"apiMeshSubscene_py", apiMeshSubsceneShape.id, apiMeshSubsceneShape.creator, apiMeshSubsceneShape.initialize, apiMeshSubsceneShape.sDrawDbClassification)
6742 sys.stderr.write(
"Failed to register node\n")
6746 plugin.registerNode(
"apiMeshCreator_py", apiMeshCreator.id, apiMeshCreator.creator, apiMeshCreator.initialize)
6748 sys.stderr.write(
"Failed to register node\n")
6752 omr.MDrawRegistry.registerGeometryOverrideCreator(apiMeshGeometryShape.sDrawDbClassification, apiMesh.sDrawRegistrantId, apiMeshGeometryOverride.creator)
6754 sys.stderr.write(
"Failed to register override\n")
6758 omr.MDrawRegistry.registerSubSceneOverrideCreator(apiMeshSubsceneShape.sDrawDbClassification, apiMesh.sDrawRegistrantId, apiMeshSubSceneOverride.creator)
6760 sys.stderr.write(
"Failed to register override\n")
6764 omr.MDrawRegistry.registerComponentConverter(apiMeshGeometryOverride.sVertexItemName, meshVertComponentConverterGeometryOverride.creator)
6765 omr.MDrawRegistry.registerComponentConverter(apiMeshGeometryOverride.sEdgeSelectionItemName, meshEdgeComponentConverterGeometryOverride.creator)
6766 omr.MDrawRegistry.registerComponentConverter(apiMeshGeometryOverride.sFaceSelectionItemName, meshFaceComponentConverterGeometryOverride.creator)
6768 sys.stderr.write(
"Failed to register component converters\n")
6772 omr.MDrawRegistry.registerComponentConverter(apiMeshSubSceneOverride.sVertexSelectionName, simpleComponentConverterSubsceneOverride.creatorVertexSelection)
6773 omr.MDrawRegistry.registerComponentConverter(apiMeshSubSceneOverride.sEdgeSelectionName, simpleComponentConverterSubsceneOverride.creatorEdgeSelection)
6774 omr.MDrawRegistry.registerComponentConverter(apiMeshSubSceneOverride.sFaceSelectionName, simpleComponentConverterSubsceneOverride.creatorFaceSelection)
6776 sys.stderr.write(
"Failed to register component converters\n")
6779 def uninitializePlugin(obj):
6780 plugin = om.MFnPlugin(obj)
6782 omr.MDrawRegistry.deregisterComponentConverter(apiMeshSubSceneOverride.sVertexSelectionName)
6783 omr.MDrawRegistry.deregisterComponentConverter(apiMeshSubSceneOverride.sEdgeSelectionName)
6784 omr.MDrawRegistry.deregisterComponentConverter(apiMeshSubSceneOverride.sFaceSelectionName)
6787 for faceSelectionName
in sViewSelectedFaceSelectionNames:
6788 omr.MDrawRegistry.deregisterComponentConverter(faceSelectionName)
6791 omr.MDrawRegistry.deregisterComponentConverter(apiMeshGeometryOverride.sVertexItemName)
6792 omr.MDrawRegistry.deregisterComponentConverter(apiMeshGeometryOverride.sEdgeSelectionItemName)
6793 omr.MDrawRegistry.deregisterComponentConverter(apiMeshGeometryOverride.sFaceSelectionItemName)
6796 omr.MDrawRegistry.deregisterGeometryOverrideCreator(apiMeshGeometryShape.sDrawDbClassification, apiMesh.sDrawRegistrantId)
6798 sys.stderr.write(
"Failed to deregister override\n")
6802 omr.MDrawRegistry.deregisterSubSceneOverrideCreator(apiMeshSubsceneShape.sDrawDbClassification, apiMesh.sDrawRegistrantId)
6804 sys.stderr.write(
"Failed to deregister override\n")
6808 plugin.deregisterNode(apiMeshCreator.id)
6810 sys.stderr.write(
"Failed to deregister node\n")
6814 plugin.deregisterNode(apiMeshSubsceneShape.id)
6816 sys.stderr.write(
"Failed to deregister node\n")
6820 plugin.deregisterNode(apiMeshGeometryShape.id)
6822 sys.stderr.write(
"Failed to deregister node\n")
6826 plugin.deregisterData(apiMeshData.id)
6828 sys.stderr.write(
"Failed to deregister data\n")