This takes the in mesh and duplicates it and shuffles it around.
Its just a glorified instancer at the moment
I am trying to get the seed and random attributes on the outside of the code rather than the inside, but they wont budge
#Sam Hodge's Lame Scripted Plugin
"""
#TEST turn a pipe into a cube
import os
import maya
devPath = "/home/samh/dev/scales/scratch"
maya.cmds.file(new=True,force=True)
for i in os.environ:
if "MAYA" and "PLUG" in i:
if devPath not in os.environ[i]:
os.environ[i] = "%s:%s" % (devPath ,os.environ[i])
print "Setup Dev: %s : %s" % (i,os.environ[i])
print "Settings: %s : %s" % (i,os.environ[i])
maya.cmds.unloadPlugin("duplicator.py")
maya.cmds.loadPlugin("duplicator.py")
cubeTrans = maya.cmds.polyCube(ch=0,o=1,w=0.1,h=0.1,d=0.1,sx=4,sy=4,sz=4,cuv=4)[0]
maya.cmds.createNode("shDuplicator")
pipeTrans = maya.cmds.polyPipe(ch=0,o=1,r=10.80581,h=22.165043)[0]
maya.cmds.connectAttr("pCubeShape1.outMesh","shDuplicator1.inputMesh",force=True)
maya.cmds.connectAttr("shDuplicator1.outputMesh","pPipeShape1.inMesh",force=True)
"""
import sys
import random
import maya.OpenMaya as OpenMaya
import maya.OpenMayaMPx as OpenMayaMPx
kPluginNodeName = "shDuplicator"
kPluginNodeId = OpenMaya.MTypeId(0x8700B)
class meshReplicator(OpenMayaMPx.MPxNode):
inputMesh = OpenMaya.MObject()
outputMesh = OpenMaya.MObject()
seed = OpenMaya.MObject()
count = OpenMaya.MObject()
def __init__(self):
OpenMayaMPx.MPxNode.__init__(self)
def dupeMesh(self, inMesh, outData, count, seed):
oldStuff = False
meshFS = OpenMaya.MFnMesh()
if oldStuff:
OpenMaya.MFnMesh().copy(inMesh,outData)
else:
OpenMaya.MFnMesh().copy(inMesh,outData)
#transform = OpenMaya.
meshFS = OpenMaya.MFnMesh(inMesh)
oriVertCount = meshFS.numVertices()
oriPolyCount = meshFS.numPolygons()
oriPointArray = OpenMaya.MFloatPointArray()
meshFS.getPoints(oriPointArray,OpenMaya.MSpace.kObject)
oriPolyCounts = OpenMaya.MIntArray()
oriPolyConnections = OpenMaya.MIntArray()
meshFS.getVertices(oriPolyCounts, oriPolyConnections)
outVertCount = oriVertCount * count
outPolyCount = oriPolyCount * count
oriPointArrayList = [OpenMaya.MPoint() for i in range(oriPointArray.length())]
[meshFS.getPoint(i,oriPointArrayList[i],OpenMaya.MSpace.kObject) for i in range(oriPointArray.length())]
locationArray = OpenMaya.MVectorArray()
locationArray.setLength(count)
random.seed(seed)
#This will come from UV + N + mesh = Transform similar to a follicle
[locationArray.set(OpenMaya.MVector(random.random(),random.random(),random.random()),i) for i in range(locationArray.length())]
transOffset = OpenMaya.MTransformationMatrix()
TransformArrayList = [OpenMaya.MTransformationMatrix() for i in range(locationArray.length())]
[TransformArrayList[i].setTranslation(locationArray[i],OpenMaya.MSpace.kWorld) for i in range(locationArray.length())]
MatrixList = [i.asMatrix() for i in TransformArrayList]
FloatMatrixList = [OpenMaya.MFloatMatrix(i.matrix) for i in MatrixList]
transposeM = FloatMatrixList[0]
outPointArray = OpenMaya.MFloatPointArray()
oriFloatPointList = [oriPointArray[i] for i in range(oriPointArray.length())] #[OpenMaya.MFloatVector(i) for i in oriPointArrayList]
outPointArrayList = []
[outPointArrayList.extend([ j*i for j in oriFloatPointList]) for i in FloatMatrixList]
transVec = OpenMaya.MFloatVector(transposeM(3,0),transposeM(3,1),transposeM(3,2))
tmpTX = oriFloatPointList[0]*FloatMatrixList[0]
outPointArrayList = [OpenMaya.MFloatPoint(i) for i in outPointArrayList]
[outPointArray.append(outPointArrayList[i]) for i in range(len(outPointArrayList))]
oriPolyCountsList = [oriPolyCounts[i] for i in range(oriPolyCounts.length())] * count
outPolyCounts = OpenMaya.MIntArray()
[outPolyCounts.append(i) for i in oriPolyCountsList]
oriPolyConnectionsList = [oriPolyConnections[i] for i in range(oriPolyConnections.length())]
outPolyConnectionsList = []
[outPolyConnectionsList.extend([j + (i * oriVertCount) for j in oriPolyConnectionsList]) for i in range(count)]
outPolyConnections=OpenMaya.MIntArray()
[outPolyConnections.append(i) for i in outPolyConnectionsList]
debug = False
if debug:
print ("Vert Count : %s" % outVertCount)
print ("Poly Count : %s" % outVertCount)
print ("PolyCounts : %s" % outPolyCounts)
print ("PointPosCounts : %s" % ",".join(["%2.2e %2.2e %2.2e" % (outPointArray[i].x, outPointArray[i].y, outPointArray[i].z) for i in range(outPointArray.length())]))
print ("PolyCounnection : %s" % outPolyConnectionsList)
meshFS2 = OpenMaya.MFnMesh()
meshFS2.create(outVertCount, outPolyCount,outPointArray,outPolyCounts,outPolyConnections, outData)
return meshFS
def compute(self, plug, data):
if plug == meshReplicator.outputMesh:
inputData = data.inputValue(meshReplicator.inputMesh)
inMesh = inputData.data()
inputSeed = data.inputValue(meshReplicator.seed)
inSeed = inputSeed.asInt()
inputCount = data.inputValue(meshReplicator.count)
inCount = inputCount.asInt()
outputHandle = data.outputValue(meshReplicator.outputMesh)
dataCreator = OpenMaya.MFnMeshData()
newOutputData = dataCreator.create()
self.dupeMesh(inMesh, newOutputData,5000,69)
outputHandle.setMObject(newOutputData)
data.setClean(plug)
else:
return OpenMaya.kUnknownParameter
def nodeCreator():
return OpenMayaMPx.asMPxPtr( meshReplicator() )
def nodeInitializer():
inTypedAttr = OpenMaya.MFnTypedAttribute()
outTypedAttr = OpenMaya.MFnTypedAttribute()
countNumericAttr = OpenMaya.MFnNumericAttribute()
seedNumericAttr = OpenMaya.MFnNumericAttribute()
meshReplicator.inputMesh = inTypedAttr.create("inputMesh", "in", OpenMaya.MFnData.kMesh)
meshReplicator.outputMesh = outTypedAttr.create("outputMesh", "out", OpenMaya.MFnData.kMesh)
meshReplicator.seed = seedNumericAttr.create("seedRand","seed",OpenMaya.MFnNumericData.kInt)
seedNumericAttr.setDefault(1337)
seedNumericAttr.setKeyable(True)
meshReplicator.count = countNumericAttr.create("countInst","count",OpenMaya.MFnNumericData.kInt)
countNumericAttr.setDefault(50)
countNumericAttr.setKeyable(True)
#seedNumericAttr.setWritable(True)
#seedNumericAttr.setReadable(True)
#seedNumericAttr.setKeyable(True)
#countNumericAttr.setKeyable(True)
meshReplicator.addAttribute(meshReplicator.inputMesh)
meshReplicator.addAttribute(meshReplicator.outputMesh)
meshReplicator.attributeAffects(meshReplicator.inputMesh, meshReplicator.outputMesh)
# initialize the script plug-in
def initializePlugin(mobject):
mplugin = OpenMayaMPx.MFnPlugin(mobject)
try:
mplugin.registerNode( kPluginNodeName, kPluginNodeId, nodeCreator, nodeInitializer)
except:
sys.stderr.write( "Failed to register node: %s" % kPluginNodeName )
raise
# uninitialize the script plug-in
def uninitializePlugin(mobject):
mplugin = OpenMayaMPx.MFnPlugin(mobject)
try:
mplugin.deregisterNode( kPluginNodeId )
except:
sys.stderr.write( "Failed to deregister node: %s" % kPluginNodeName )
raise
- Log in to post comments
Comments
Spot on utilizing this write-up, I really think this url needs c
Spot on utilizing this write-up, I really think this url needs considerably more consideration. I’ll more likely again to learn to read m
- Log in to post comments
Thanks for laying this out, it helped me put together basic a fe
Thanks for laying this out, it helped me put together basic a feather system. At least it got me past the mesh duplication part which I never figured could be such a pain.
- Log in to post comments
