예제 #1
0
def test(outPath):
	minFrame = xhou.getMinFrame()
	maxFrame = xhou.getMaxFrame()
	chLst = xhou.getChannelsInGroup("MOT") # "EXP"
	kfr = KfrExporter()
	kfr.build(chLst, minFrame, maxFrame, hou.fps())
	xcore.dbgmsg("Saving keyframes to " + outPath)
	kfr.save(outPath)
예제 #2
0
 def printMtlInfo(self):
     if self.mtlNum > 0:
         npol = 0
         for i, mtl in enumerate(self.mtlLst):
             xcore.dbgmsg("-- Mtl[" + str(i) + "]")
             xcore.dbgmsg(" Name: " + mtl.getName())
             xcore.dbgmsg(" Path: " + mtl.getPath())
             xcore.dbgmsg(" #pol: " + str(mtl.getPolNum()))
             npol += mtl.getPolNum()
         xcore.dbgmsg("total pol # " + str(npol))
예제 #3
0
	def writeData(self, bw, top):
		plnLst = []
		for plnName in self.planes: plnLst.append(self.planes[plnName])
		npln = len(plnLst)
		bw.align(0x10)
		infoTop = bw.getPos()
		bw.patch(self.patchPos, bw.getPos() - top) # -> info
		for i in xrange(npln):
			plnLst[i].writeInfo(bw)
		for i, pln in enumerate(plnLst):
			bw.align(4)
			bw.patch(infoTop + (i*0x20), bw.getPos() - top)
			xcore.dbgmsg("Saving plane " + pln.name)
			pln.writeData(bw)
예제 #4
0
	def __init__(self, xval, nodeLst, fnameFlg = False, folders = None):
		self.xval = xval
		strLst = xval.strLst
		vecLst = xval.vecLst
		v2Lst = xval.v2Lst
		v3Lst = xval.v3Lst
		v4Lst = xval.v4Lst
		self.lst = []
		for node in nodeLst:
			self.lst.append(ValGrp(xval, node, fnameFlg, folders))
		if 0:
			xcore.dbgmsg("#vec2 " + str(v2Lst.num()))
			xcore.dbgmsg("#vec3 " + str(v3Lst.num()))
			xcore.dbgmsg("#vec4 " + str(v4Lst.num()))
			xcore.dbgmsg("# " + str(v2Lst.num() + v3Lst.num() + v4Lst.num()))
		for grp in self.lst:
			for prm in grp.lst:
				if prm.type == ValType.VEC4:
					prm.valId = vecLst.add(v4Lst.get(prm.valId))
		for grp in self.lst:
			for prm in grp.lst:
				if prm.type == ValType.VEC3:
					prm.valId = vecLst.add(v3Lst.get(prm.valId))
		for grp in self.lst:
			for prm in grp.lst:
				if prm.type == ValType.VEC2:
					prm.valId = vecLst.add(v2Lst.get(prm.valId))
예제 #5
0
 def initSkin(self):
     self.skinNames = None
     self.skinData = None
     self.maxWgtPerPnt = 0
     skinAttr = self.geo.findPointAttrib("boneCapture")
     if skinAttr:
         self.skinNames = []
         self.skinNameToStrId = {}
         tbl = skinAttr.indexPairPropertyTables()[0]
         n = tbl.numIndices()
         for i in xrange(n):
             name = tbl.stringPropertyValueAtIndex("pCaptPath", i)
             name = name.split("/cregion")[0]
             nameId = self.strLst.add(name)
             self.skinNameToStrId[name] = nameId
             self.skinNames.append(name)
         self.skinData = []
         for ipnt, pnt in enumerate(self.pnts):
             skin = pnt.floatListAttribValue(skinAttr)
             nwgt = len(skin) / 2
             iw = []
             for i in xrange(nwgt):
                 idx = int(skin[i * 2])
                 wgt = skin[i * 2 + 1]
                 if idx >= 0.0:
                     if wgt > 0.0 and wgt < 1.0e-3: wgt = 0.0
                     if wgt > 0.0:
                         iw.append([idx, wgt])
                     elif wgt < 0.0:
                         xcore.dbgmsg(
                             "Warning: negative weight at point {}".format(
                                 ipnt))
             if len(iw) < 1:
                 xcore.dbgmsg("Warning: unweighted point {}".format(ipnt))
                 iw.append([0, 0.0])
             iw.sort(key=lambda iw: -iw[1])
             if len(iw) > 4:
                 xcore.dbgmsg(
                     "Warning: too many weights at point {}".format(ipnt))
                 iw = iw[:4]
             self.skinData.append(iw)
         for iskn, skn in enumerate(self.skinData):
             self.maxWgtPerPnt = max(self.maxWgtPerPnt, len(skn))
             s = 0.0
             for iw in skn:
                 s += iw[1]
             if s and s != 1.0:
                 s = 1.0 / s
                 for iw in skn:
                     iw[1] *= s
예제 #6
0
	def initGrps(self):
		if (len(self.pols)) < 1: return
		geoGrps = []
		if self.usePrimGroups:
			for grp in self.geo.primGroups():
				if not self.batPrefix or grp.name().startswith(self.batPrefix):
					geoGrps.append(grp)
		grps = []
		if len(geoGrps) < 1:
			xcore.dbgmsg("using mtl bats")
			nmtl = len(self.mtls)
			for i in xrange(nmtl):
				grp = MdlPolGrp(self)
				grp.imtl = i
				grp.name = self.mtls[i].getName()
				grps.append(grp)
			for ipol, pol in enumerate(self.pols):
				grps[pol.imtl].ipols.append(ipol)
		else:
			xcore.dbgmsg("using grp bats")
			primToPolIdx = {}
			for ipol, pol in enumerate(self.pols):
				primToPolIdx[pol.prim] = ipol
			for gg in geoGrps:
				grp = MdlPolGrp(self)
				grp.name = gg.name()
				for prim in gg.prims():
					#if prim in primToPolIdx:
					grp.ipols.append(primToPolIdx[prim])
				grp.imtl = self.pols[grp.ipols[0]].imtl
				grps.append(grp)
		ngrps = len(grps)
		xcore.dbgmsg(str(ngrps) + " polygon groups")
		nskin = self.numSkin()
		if nskin > 0:
			for grp in grps:
				grp.ijnts = []
				jmask = 0
				for ipol in grp.ipols:
					pol = self.pols[ipol]
					for ipnt in pol.pids:
						for iw in self.skinData[ipnt]:
							ijnt = iw[0]
							jmask |= 1 << ijnt
				for ijnt in xrange(nskin):
					if jmask & (1 << ijnt):
						grp.ijnts.append(ijnt)
		self.grps = grps
예제 #7
0
    def initBats(self):
        self.bats = []
        nskin = self.numSkin()
        if nskin > 0:
            if self.batJntsLimit > 0:
                for igrp, grp in enumerate(self.grps):
                    njnts = len(grp.ijnts)
                    if njnts > self.batJntsLimit:
                        xcore.dbgmsg("splitting grp: " + grp.name + " (" +
                                     str(njnts) + " joints)")
                        npol = len(grp.ipols)
                        idx = 0
                        org = 0
                        idiv = 0
                        jmask = 0
                        while idx < npol:
                            ipol = grp.ipols[idx]
                            pol = self.pols[ipol]
                            jmaskPrev = jmask
                            for ipnt in pol.pids:
                                for iw in self.skinData[ipnt]:
                                    ijnt = iw[0]
                                    jmask |= 1 << ijnt
                            njnt = 0
                            for ijnt in xrange(nskin):
                                if jmask & (1 << ijnt): njnt += 1
                            if njnt > self.batJntsLimit:
                                bat = MdlBatch(self)
                                bat.igrp = igrp
                                bat.idiv = idiv
                                bat.org = org
                                bat.npol = idx - org
                                bat.jntLstFromMask(jmaskPrev)
                                bat.name = grp.name + "_" + str(bat.idiv)
                                self.bats.append(bat)
                                jmask = 0
                                org = idx
                                idiv += 1
                            else:
                                if idx == npol - 1:
                                    bat = MdlBatch(self)
                                    bat.igrp = igrp
                                    bat.idiv = idiv
                                    bat.org = org
                                    bat.npol = idx - org + 1
                                    bat.jntLstFromMask(jmask)
                                    bat.name = grp.name + "_" + str(bat.idiv)
                                    self.bats.append(bat)
                                idx += 1
                    else:
                        bat = MdlBatch(self)
                        bat.igrp = igrp
                        bat.name = grp.name
                        bat.org = 0
                        bat.npol = len(grp.ipols)
                        bat.ijnts = grp.ijnts
                        self.bats.append(bat)
            else:
                for igrp, grp in enumerate(self.grps):
                    bat = MdlBatch(self)
                    bat.igrp = igrp
                    bat.name = grp.name
                    bat.org = 0
                    bat.npol = len(grp.ipols)
                    bat.ijnts = grp.ijnts
                    self.bats.append(bat)
        else:  # !skin
            for igrp, grp in enumerate(self.grps):
                bat = MdlBatch(self)
                bat.igrp = igrp
                bat.name = grp.name
                bat.org = 0
                bat.npol = len(grp.ipols)
                bat.ijnts = grp.ijnts
                self.bats.append(bat)

        for bat in self.bats:
            bat.nameId = self.strLst.add(bat.name)
            bat.calcNumTris()
            bat.calcIdxRange()

        self.nidx16 = 0
        self.nidx32 = 0
        for bat in self.bats:
            if bat.isIdx16():
                bat.idxOrg = self.nidx16
                self.nidx16 += bat.ntri * 3
            else:
                bat.idxOrg = self.nidx32
                self.nidx32 += bat.ntri * 3
        xcore.dbgmsg("#bats: " + str(self.numBat()))
예제 #8
0
 def printInfo(self):
     xcore.dbgmsg(self.exprText + " @ " + self.nodeName + " " +
                  self.nodePath + " " + self.chanName)
예제 #9
0
def testClip(outPath):
	kfr = KfrExporter()
	kfr.buildFromClip("/obj/motionfx/MOT_newclip1", hou.fps())
	xcore.dbgmsg("Saving clip keyframes to " + outPath)
	kfr.save(outPath)
예제 #10
0
def expVal(lst, outPath, fnameFlg = False, folders = None):
	val = ValExporter()
	val.build(lst, fnameFlg, folders)
	xcore.dbgmsg("Saving values to " + outPath)
	val.save(outPath)