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)
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))
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)
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))
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
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
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()))
def printInfo(self): xcore.dbgmsg(self.exprText + " @ " + self.nodeName + " " + self.nodePath + " " + self.chanName)
def testClip(outPath): kfr = KfrExporter() kfr.buildFromClip("/obj/motionfx/MOT_newclip1", hou.fps()) xcore.dbgmsg("Saving clip keyframes to " + outPath) kfr.save(outPath)
def expVal(lst, outPath, fnameFlg = False, folders = None): val = ValExporter() val.build(lst, fnameFlg, folders) xcore.dbgmsg("Saving values to " + outPath) val.save(outPath)