def writeFaceNumbers(fp, human, proxyData): fp.write("#else\n") if human.uvsetFile: uvset = proxyData["__uvset__"] for ftn in uvset.faceNumbers: fp.write(ftn) else: obj = human.meshData fmats = {} for f in obj.faces: fmats[f.idx] = MaterialNumbers[f.mtl[0:3]] deleteGroups = [] deleteVerts = None for proxy in proxyData.values(): deleteGroups += proxy.deleteGroups deleteVerts = mh2proxy.multiplyDeleteVerts(proxy, deleteVerts) for fg in obj.faceGroups: if mh2proxy.deleteGroup(fg.name, deleteGroups): for f in fg.faces: fmats[f.idx] = 6 elif "joint" in fg.name: for f in fg.faces: fmats[f.idx] = 4 elif fg.name == "helper-tights": for f in fg.faces: fmats[f.idx] = 5 elif fg.name == "helper-skirt": for f in fg.faces: fmats[f.idx] = 7 elif ("tongue" in fg.name): for f in fg.faces: fmats[f.idx] = 1 elif ("eyebrown" in fg.name) or ("lash" in fg.name): for f in fg.faces: fmats[f.idx] = 3 if deleteVerts: for f in obj.faces: v = f.verts[0] if deleteVerts[v.idx]: fmats[f.idx] = 6 mn = -1 fn = 0 f0 = 0 for f in obj.faces: if fmats[fn] != mn: if fn != f0: fp.write(" ftn %d %d 1 ;\n" % (fn-f0, mn)) mn = fmats[fn] f0 = fn fn += 1 if fn != f0: fp.write(" ftn %d %d 1 ;\n" % (fn-f0, mn)) fp.write("#endif\n")
def writeFaceNumbers(fp, amt, config): if amt.human.uvset: for ftn in amt.human.uvset.faceNumbers: fp.write(ftn) else: obj = amt.mesh fmats = numpy.zeros(len(obj.coord), int) for fn, mtl in obj.materials.items(): fmats[fn] = MaterialNumbers[mtl] # TODO use facemask set on module3d instead (cant we reuse filterMesh from collect module?) deleteVerts = None deleteGroups = [] for fg in obj.faceGroups: fmask = obj.getFaceMaskForGroups([fg.name]) if mh2proxy.deleteGroup(fg.name, deleteGroups): fmats[fmask] = 6 elif "joint" in fg.name: fmats[fmask] = 4 elif fg.name == "helper-tights": fmats[fmask] = 5 elif fg.name == "helper-skirt": fmats[fmask] = 7 elif ("tongue" in fg.name): fmats[fmask] = 1 elif ("eyebrown" in fg.name) or ("lash" in fg.name): fmats[fmask] = 3 if deleteVerts != None: for fn, fverts in enumerate(obj.fvert): if deleteVerts[fverts[0]]: fmats[fn] = 6 mn = -1 fn = 0 f0 = 0 for fverts in obj.fvert: if fmats[fn] != mn: if fn != f0: fp.write(" ftn %d %d 1 ;\n" % (fn - f0, mn)) mn = fmats[fn] f0 = fn fn += 1 if fn != f0: fp.write(" ftn %d %d 1 ;\n" % (fn - f0, mn))
def writeFaceNumbers(fp, amt, config): if amt.human.uvset: for ftn in amt.human.uvset.faceNumbers: fp.write(ftn) else: obj = amt.mesh fmats = numpy.zeros(len(obj.coord), int) for fn,mtl in obj.materials.items(): fmats[fn] = MaterialNumbers[mtl] # TODO use facemask set on module3d instead (cant we reuse filterMesh from collect module?) deleteVerts = None deleteGroups = [] for fg in obj.faceGroups: fmask = obj.getFaceMaskForGroups([fg.name]) if mh2proxy.deleteGroup(fg.name, deleteGroups): fmats[fmask] = 6 elif "joint" in fg.name: fmats[fmask] = 4 elif fg.name == "helper-tights": fmats[fmask] = 5 elif fg.name == "helper-skirt": fmats[fmask] = 7 elif ("tongue" in fg.name): fmats[fmask] = 1 elif ("eyebrown" in fg.name) or ("lash" in fg.name): fmats[fmask] = 3 if deleteVerts != None: for fn,fverts in enumerate(obj.fvert): if deleteVerts[fverts[0]]: fmats[fn] = 6 mn = -1 fn = 0 f0 = 0 for fverts in obj.fvert: if fmats[fn] != mn: if fn != f0: fp.write(" ftn %d %d 1 ;\n" % (fn-f0, mn)) mn = fmats[fn] f0 = fn fn += 1 if fn != f0: fp.write(" ftn %d %d 1 ;\n" % (fn-f0, mn))
def writeFaceNumbers(fp, human, config, proxyData): fp.write("#else\n") if human.uvset: for ftn in human.uvset.faceNumbers: fp.write(ftn) else: obj = human.meshData fmats = {} print(obj.materials.items) for fn, mtl in obj.materials.items(): fmats[fn] = MaterialNumbers[mtl] if config.hidden: deleteVerts = None deleteGroups = [] else: deleteGroups = [] deleteVerts = numpy.zeros(len(obj.verts), bool) for proxy in proxyData.values(): deleteGroups += proxy.deleteGroups deleteVerts = deleteVerts | proxy.deleteVerts for fg in obj.faceGroups: if mh2proxy.deleteGroup(fg.name, deleteGroups): for f in fg.faces: fmats[f.idx] = 6 elif "joint" in fg.name: for f in fg.faces: fmats[f.idx] = 4 elif fg.name == "helper-tights": for f in fg.faces: fmats[f.idx] = 5 elif fg.name == "helper-skirt": for f in fg.faces: fmats[f.idx] = 7 elif ("tongue" in fg.name): for f in fg.faces: fmats[f.idx] = 1 elif ("eyebrown" in fg.name) or ("lash" in fg.name): for f in fg.faces: fmats[f.idx] = 3 if deleteVerts != None: for f in obj.faces: v = f.verts[0] if deleteVerts[v.idx]: fmats[f.idx] = 6 mn = -1 fn = 0 f0 = 0 for f in obj.faces: if fmats[fn] != mn: if fn != f0: fp.write(" ftn %d %d 1 ;\n" % (fn - f0, mn)) mn = fmats[fn] f0 = fn fn += 1 if fn != f0: fp.write(" ftn %d %d 1 ;\n" % (fn - f0, mn)) fp.write("#endif\n")
def filterMesh(meshInfo, obj, deleteGroups, deleteVerts, eyebrows, lashes): #(verts1, vnormals1, uvValues1, faces1, weights1, targets1) = mesh1 killUvs = numpy.zeros(len(obj.texco), bool) killFaces = numpy.zeros(len(obj.faces), bool) if deleteVerts != None: killVerts = deleteVerts for f in obj.faces: for v in f.verts: if killVerts[v.idx]: killFaces[f.idx] = True else: killVerts = numpy.zeros(len(obj.verts), bool) for fg in obj.faceGroups: if (("joint" in fg.name) or ("helper" in fg.name) or ((not eyebrows) and (("eyebrown" in fg.name) or ("cornea" in fg.name))) or ((not lashes) and ("lash" in fg.name)) or mh2proxy.deleteGroup(fg.name, deleteGroups)): for f in fg.faces: killFaces[f.idx] = True for v in f.verts: killVerts[v.idx] = True for vt in f.uv: killUvs[vt] = True n = 0 nv = {} verts = [] for m, v in enumerate(meshInfo.verts): if not killVerts[m]: verts.append(v) nv[m] = n n += 1 meshInfo.verts = verts vnormals = [] for m, vn in enumerate(meshInfo.vnormals): if not killVerts[m]: vnormals.append(vn) meshInfo.vnormals = vnormals n = 0 uvValues = [] nuv = {} for m, uv in enumerate(meshInfo.uvValues): if not killUvs[m]: uvValues.append(uv) nuv[m] = n n += 1 meshInfo.uvValues = uvValues faces = [] for fn, f in enumerate(meshInfo.faces): if not killFaces[fn]: f2 = [] for c in f: v2 = nv[c[0]] uv2 = nuv[c[1]] f2.append([v2, uv2]) faces.append(f2) meshInfo.faces = faces if meshInfo.weights: weights = {} for (b, wts1) in meshInfo.weights.items(): wts2 = [] for (v1, w) in wts1: if not killVerts[v1]: wts2.append((nv[v1], w)) weights[b] = wts2 meshInfo.weights = weights if meshInfo.targets: targets = [] for (name, morphs1) in meshInfo.targets: morphs2 = {} for (v1, dx) in morphs1.items(): if not killVerts[v1]: morphs2[nv[v1]] = dx targets.append((name, morphs2)) meshInfo.targets = targets return meshInfo
def writeFaceNumbers(fp, human, config, proxyData): fp.write("#else\n") if human.uvset: for ftn in human.uvset.faceNumbers: fp.write(ftn) else: obj = human.meshData fmats = {} print(obj.materials.items) for fn,mtl in obj.materials.items(): fmats[fn] = MaterialNumbers[mtl] if config.hidden: deleteVerts = None deleteGroups = [] else: deleteGroups = [] deleteVerts = numpy.zeros(len(obj.verts), bool) for proxy in proxyData.values(): deleteGroups += proxy.deleteGroups deleteVerts = deleteVerts | proxy.deleteVerts for fg in obj.faceGroups: if mh2proxy.deleteGroup(fg.name, deleteGroups): for f in fg.faces: fmats[f.idx] = 6 elif "joint" in fg.name: for f in fg.faces: fmats[f.idx] = 4 elif fg.name == "helper-tights": for f in fg.faces: fmats[f.idx] = 5 elif fg.name == "helper-skirt": for f in fg.faces: fmats[f.idx] = 7 elif ("tongue" in fg.name): for f in fg.faces: fmats[f.idx] = 1 elif ("eyebrown" in fg.name) or ("lash" in fg.name): for f in fg.faces: fmats[f.idx] = 3 if deleteVerts != None: for f in obj.faces: v = f.verts[0] if deleteVerts[v.idx]: fmats[f.idx] = 6 mn = -1 fn = 0 f0 = 0 for f in obj.faces: if fmats[fn] != mn: if fn != f0: fp.write(" ftn %d %d 1 ;\n" % (fn-f0, mn)) mn = fmats[fn] f0 = fn fn += 1 if fn != f0: fp.write(" ftn %d %d 1 ;\n" % (fn-f0, mn)) fp.write("#endif\n")
def filterMesh(meshInfo, scale, deleteGroups, deleteVerts, eyebrows, lashes, useFaceMask = False): """ Filter out vertices and faces from the mesh that are not desired for exporting. """ # TODO scaling does not belong in a filter method obj = meshInfo.object killUvs = numpy.zeros(len(obj.texco), bool) killFaces = numpy.zeros(len(obj.fvert), bool) if deleteVerts is not None: killVerts = deleteVerts for fn,fverts in enumerate(obj.fvert): for vn in fverts: if killVerts[vn]: killFaces[fn] = True else: killVerts = numpy.zeros(len(obj.coord), bool) killGroups = [] for fg in obj.faceGroups: if (("joint" in fg.name) or ("helper" in fg.name) or ((not eyebrows) and (("eyebrown" in fg.name) or ("cornea" in fg.name))) or ((not lashes) and ("lash" in fg.name)) or mh2proxy.deleteGroup(fg.name, deleteGroups)): killGroups.append(fg.name) faceMask = obj.getFaceMaskForGroups(killGroups) if useFaceMask: # Apply the facemask set on the module3d object (the one used for rendering within MH) faceMask = numpy.logical_or(faceMask, numpy.logical_not(obj.getFaceMask())) killFaces[faceMask] = True #verts = obj.fvert[faceMask] verts = obj.fvert[numpy.logical_not(faceMask)] vertMask = numpy.ones(len(obj.coord), bool) vertMask[verts] = False verts = numpy.argwhere(vertMask) del vertMask killVerts[verts] = True #uvs = obj.fuvs[faceMask] uvs = obj.fuvs[numpy.logical_not(faceMask)] uvMask = numpy.ones(len(obj.texco), bool) uvMask[uvs] = False uvs = numpy.argwhere(uvMask) del uvMask killUvs[uvs] = True n = 0 newVerts = {} coords = [] for m,co in enumerate(obj.coord): if not killVerts[m]: coords.append(scale*co) newVerts[m] = n n += 1 n = 0 texVerts = [] newUvs = {} for m,uv in enumerate(obj.texco): if not killUvs[m]: texVerts.append(uv) newUvs[m] = n n += 1 faceVerts = [] faceUvs = [] for fn,fverts in enumerate(obj.fvert): if not killFaces[fn]: fverts2 = [] fuvs2 = [] for vn in fverts: fverts2.append(newVerts[vn]) for uv in obj.fuvs[fn]: fuvs2.append(newUvs[uv]) faceVerts.append(fverts2) faceUvs.append(fuvs2) weights = {} if meshInfo.weights: for (b, wts1) in meshInfo.weights.items(): wts2 = [] for (v1,w) in wts1: if not killVerts[v1]: wts2.append((newVerts[v1],w)) weights[b] = wts2 shapes = [] if meshInfo.shapes: for (name, morphs1) in meshInfo.shapes: morphs2 = {} for (v1,dx) in morphs1.items(): if not killVerts[v1]: morphs2[newVerts[v1]] = scale*dx shapes.append((name, morphs2)) meshInfo.fromProxy(coords, texVerts, faceVerts, faceUvs, weights, shapes) meshInfo.vertexMask = numpy.logical_not(killVerts) meshInfo.vertexMapping = newVerts meshInfo.faceMask = numpy.logical_not(faceMask) return meshInfo
def filterMesh(mesh1, obj, deleteGroups, deleteVerts): (verts1, vnormals1, uvValues1, faces1, weights1, targets1) = mesh1 killVerts = {} killUvs = {} killFaces = {} for v in obj.verts: killVerts[v.idx] = False for f in obj.faces: killFaces[f.idx] = False for vt in f.uv: killUvs[vt] = False for vn in deleteVerts: killVerts[vn] = True for fg in obj.faceGroups: if (((not the.Options["helpers"]) and (("joint" in fg.name) or ("helper" in fg.name))) or ((not the.Options["eyebrows"]) and (("eyebrown" in fg.name) or ("cornea" in fg.name))) or ((not the.Options["lashes"]) and ("lash" in fg.name)) or mh2proxy.deleteGroup(fg.name, deleteGroups)): print(" kill %s" % fg.name) for f in fg.faces: killFaces[f.idx] = True for v in f.verts: killVerts[v.idx] = True for vt in f.uv: killUvs[vt] = True n = 0 nv = {} verts2 = [] for m,v in enumerate(verts1): if not killVerts[m]: verts2.append(v) nv[m] = n n += 1 vnormals2 = [] for m,vn in enumerate(vnormals1): if not killVerts[m]: vnormals2.append(vn) n = 0 uvValues2 = [] nuv = {} for m,uv in enumerate(uvValues1): if not killUvs[m]: uvValues2.append(uv) nuv[m] = n n += 1 faces2 = [] for fn,f in enumerate(faces1): if not killFaces[fn]: f2 = [] for c in f: v2 = nv[c[0]] uv2 = nuv[c[1]] f2.append([v2, uv2]) faces2.append(f2) if weights1: weights2 = {} for (b, wts1) in weights1.items(): wts2 = [] for (v1,w) in wts1: if not killVerts[v1]: wts2.append((nv[v1],w)) weights2[b] = wts2 else: weights2 = weights1 if targets1: targets2 = [] for (name, morphs1) in targets1: morphs2 = [] for (v1,dx) in morphs1: if not killVerts[v1]: morphs2.append((nv[v1],dx)) targets2.append(name, morphs2) else: targets2 = targets1 return (verts2, vnormals2, uvValues2, faces2, weights2, targets2)
def filterMesh(meshInfo, obj, deleteGroups, deleteVerts, eyebrows, lashes): #(verts1, vnormals1, uvValues1, faces1, weights1, targets1) = mesh1 killUvs = numpy.zeros(len(obj.texco), bool) killFaces = numpy.zeros(len(obj.faces), bool) if deleteVerts != None: killVerts = deleteVerts for f in obj.faces: for v in f.verts: if killVerts[v.idx]: killFaces[f.idx] = True else: killVerts = numpy.zeros(len(obj.verts), bool) for fg in obj.faceGroups: if (("joint" in fg.name) or ("helper" in fg.name) or ((not eyebrows) and (("eyebrown" in fg.name) or ("cornea" in fg.name))) or ((not lashes) and ("lash" in fg.name)) or mh2proxy.deleteGroup(fg.name, deleteGroups)): for f in fg.faces: killFaces[f.idx] = True for v in f.verts: killVerts[v.idx] = True for vt in f.uv: killUvs[vt] = True n = 0 nv = {} verts = [] for m,v in enumerate(meshInfo.verts): if not killVerts[m]: verts.append(v) nv[m] = n n += 1 meshInfo.verts = verts vnormals = [] for m,vn in enumerate(meshInfo.vnormals): if not killVerts[m]: vnormals.append(vn) meshInfo.vnormals = vnormals n = 0 uvValues = [] nuv = {} for m,uv in enumerate(meshInfo.uvValues): if not killUvs[m]: uvValues.append(uv) nuv[m] = n n += 1 meshInfo.uvValues = uvValues faces = [] for fn,f in enumerate(meshInfo.faces): if not killFaces[fn]: f2 = [] for c in f: v2 = nv[c[0]] uv2 = nuv[c[1]] f2.append([v2, uv2]) faces.append(f2) meshInfo.faces = faces if meshInfo.weights: weights = {} for (b, wts1) in meshInfo.weights.items(): wts2 = [] for (v1,w) in wts1: if not killVerts[v1]: wts2.append((nv[v1],w)) weights[b] = wts2 meshInfo.weights = weights if meshInfo.targets: targets = [] for (name, morphs1) in meshInfo.targets: morphs2 = {} for (v1,dx) in morphs1.items(): if not killVerts[v1]: morphs2[nv[v1]] = dx targets.append((name, morphs2)) meshInfo.targets = targets return meshInfo