Here’s a class and a couple of convenience scripts for adding collision nodes and tags to eggs after exporting them out. It’s nothing you can’t do by hand with a text editor but this would fit content pipelines much nicer since it can be automated. Feel free to rip apart/extend the class and convenience functions.
Installation:
- Copy the code from below and save them in the same folder. I put them in my panda/bin folder so they can be used in the same way as maya2egg, egg-opt-char etc.
egg-tag usage:
egg-tag.py -i [-o ] --nodes|-n “nodeName[,nodeName1]” --tags|-t “tag[,tag1]” --values|-v “val1[,val2]”
egg-collide usage:
egg-collide.py -i [-o ] --nodes|-n “nodeName[,nodeName1]” [–keep|-k “True|False”]
EggPost.py
from pandac.PandaModules import EggData, EggGroup, Filename
class EggPost(EggData):
def __init__(self,filename):
super(EggPost,self).__init__()
pandaPath = Filename.fromOsSpecific(filename)
self.read(pandaPath)
def __findInGroup(self, nodeList, groupName):
"""
Searches a list of eggNodes for a named group,
recursively searches, returns the first one it finds.
If it doesn't find anything, returns False
"""
returnNode = None
for node in nodeList:
if node.getClassType().getName() == "EggGroup":
#print "Node name:",node.getName()
if node.getName() == groupName:
return node
testNode = self.__findInGroup(node.getChildren(),groupName)
#print "Test Node:",testNode
if testNode != False:
return testNode
return False
def findGroup(self,groupName):
return self.__findInGroup(self.getChildren(),groupName)
def tagGroup(self,groupName,tag,value):
targetGroup = self.findGroup(groupName)
#print targetGroup
if targetGroup:
print "tagging %s with %s:%s"%(groupName,tag,value)
targetGroup.setTag(tag,value)
def collideGroup(self,groupName,keep="False"):
targetGroup = self.findGroup(groupName)
if targetGroup:
if keep == "True":
cFlags = EggGroup.CFKeep+EggGroup.CFDescend
else:
cFlags = EggGroup.CFDescend
targetGroup.setCsType(EggGroup.CSTPolyset)
targetGroup.setCollideFlags(cFlags)
def saveEgg(self,eggName=None):
if eggName is None:
saveFile = pandaPath
else:
saveFile = Filename.fromOsSpecific(eggName)
self.writeEgg(saveFile)
egg-collide.py
import EggPost
if __name__ == "__main__":
import sys, getopt
try:
opts, args = getopt.getopt(sys.argv[1:],"i:o:n:k:h",["in=","out=","nodes=","keep=","help"])
except getopt.GetoptError:
print "Error: unknown parameter"
sys.exit(2)
keepValues = []
for opt, arg in opts:
if opt in ("-h","--help"):
print "Help! I need somebody... help!"
sys.exit()
# Put in usage here sometime later
if opt in ("-i","--in"):
targetFile = arg
if opt in ("-o","--out"):
outFile = arg
if opt in ("-n","--nodes"):
print "nodes"
targetNodes = arg.split(",")
if opt in ("-k","--keep"):
print "yays"
keepValues = arg.split(",")
if len(keepValues) > len(targetNodes):
print "\nError: more keep values than target nodes"
sys.exit(2)
targetEgg = EggPost.EggPost(targetFile)
for i in xrange(len(targetNodes)):
if i < len(keepValues):
targetEgg.collideGroup(targetNodes[i],keepValues[i])
else:
targetEgg.collideGroup(targetNodes[i])
if outFile:
targetEgg.saveEgg(outFile)
else:
targetEgg.saveEgg()
egg-tag.py
import EggPost
if __name__ == "__main__":
import sys, getopt
try:
opts, args = getopt.getopt(sys.argv[1:],"i:o:n:t:v:h",["in=","out=","nodes=","tags=","values=","help"])
except getopt.GetoptError:
print "Error: unknown parameter"
sys.exit(2)
for opt, arg in opts:
if opt in ("-h","--help"):
print "Help! I need somebody... help!"
# Put in usage here sometime later
if opt in ("-i","--in"):
targetFile = arg
if opt in ("-o","--out"):
outFile = arg
if opt in ("-n","--nodes"):
targetNodes = arg.split(",")
print "targetNodes:",targetNodes
if opt in ("-t","--tags"):
nodeTags = arg.split(",")
if opt in ("-v","--values"):
tagValues = arg.split(",")
if (len(targetNodes)+len(nodeTags)+len(tagValues))/3 != len(targetNodes):
print "\nError: The number of target nodes, tags and values mismatch"
sys.exit(2)
targetEgg = EggPost.EggPost(targetFile)
for i in xrange(len(targetNodes)):
print "attempting to tag %s with %s:%s"%(targetNodes[i],nodeTags[i],tagValues[i])
targetEgg.tagGroup(targetNodes[i],nodeTags[i],tagValues[i])
if outFile:
targetEgg.saveEgg(outFile)
else:
targetEgg.saveEgg()