def parse_materials(self, filename): dirpath = rapi.getDirForFilePath(rapi.getInputName()) for i in range(self.numMat): name = self.read_name(128) matName = self.read_name(128) if not matName: matName = "material[%d]" %i self.inFile.seek(44, 1) numTex = self.inFile.readUInt() for i in range(numTex): if i == 1: self.inFile.read('2L') texName = self.read_name(256) texName = os.path.basename(texName) elif i == 2: self.inFile.read('2L') self.read_name(256) os.path.basename(texName) else: self.inFile.read('2L') self.read_name(256) self.matNames.append(matName) self.texNames.append(dirpath + "tex\\" + texName)
def parse_materials(self, filename): dirpath = rapi.getDirForFilePath(rapi.getInputName()) for i in range(self.numMat): name = self.read_name(128) matName = self.read_name(128) if not matName: matName = "material[%d]" % i self.inFile.seek(44, 1) numTex = self.inFile.readUInt() for i in range(numTex): if i == 1: self.inFile.read("2L") texName = self.read_name(256) texName = os.path.basename(texName) elif i == 2: self.inFile.read("2L") self.read_name(256) os.path.basename(texName) else: self.inFile.read("2L") self.read_name(256) self.matNames.append(matName) self.texNames.append(dirpath + "tex\\" + texName)
def parse_material(self): dirpath = rapi.getDirForFilePath(rapi.getInputName()) matName = self.read_name() self.inFile.readByte() #? self.inFile.read('17f') hasDiff = self.inFile.readUInt() if hasDiff: texPath = self.read_name() hasSpec = self.inFile.readUInt() if hasSpec: specPath = self.read_name() hasNorm = self.inFile.readUInt() if hasNorm: normPath = self.read_name() self.inFile.seek(7, 1) blend = self.read_name() texName = os.path.basename(texPath) tempPath = dirpath + "texture\\" + texName material = NoeMaterial(matName, tempPath) material.setDefaultBlend(0) self.matList.append(material) return matName
def load_all_models(mdlList): '''Load all models''' #carry over from previous models matList = [] texList = [] ##load face #facePath = "E:\\My Documents\\Workspace\\sample\\Age of Wushu\\g_face.xmod" #f = open(facePath, 'rb') #data2 = f.read() #parser = AgeOfWushu_XMOD(data2) #parser.parse_file() #material = NoeMaterial("g_face", "E:\\My Documents\\Workspace\\sample\\Age of Wushu\\g_face_1.dds") #matList.append(material) #load the outfit dirPath = rapi.getDirForFilePath(rapi.getInputName()) fileList = [file for file in os.listdir(dirPath) if file.lower().endswith(".xmod")] for file in fileList: f = open(dirPath + file, 'rb') data2 = f.read() parser = AgeOfWushu_XMOD(data2) parser.parse_file() matList.extend(parser.matList) texList.extend(parser.texList) mdl = rapi.rpgConstructModel() mdl.setModelMaterials(NoeModelMaterials(texList, matList)) mdlList.append(mdl)
def parse_textures(self, filename): try: dirpath = rapi.getDirForFilePath(rapi.getInputName()) f = open(dirpath + filename + ".tex", 'rb') data = f.read() bs = NoeBitStream(data) header = bs.readBytes(4) size, numTex, null = bs.read('3L') for i in range(numTex): texSize = bs.readUInt() texFmt = noeStrFromBytes(bs.readBytes(4)) if texFmt == "tex": texFmt = "dds" bs.read('2L') texName = noeStrFromBytes(bs.readBytes(32)) texData = bs.readBytes(texSize) tex = rapi.loadTexByHandler(texData, "." + texFmt) if tex is not None: tex.name = texName self.texList.append(tex) except: pass
def findMODL(self): fName=rapi.getInputName().split('\\')[-1] dirPath = rapi.getDirForFilePath(rapi.getInputName()) f = open(dirPath + "/" + fName,'rb') file = f.read() f.close() offset = file.find(b"MODL") self.data.seek(offset)
def LoadTexture(texName, file): if MODPATH != None: name = MODPATH +'\\'+ texName else: name = rapi.getDirForFilePath(rapi.getInputName()) + texName.split('\\')[-1] print(rapi.getDirForFilePath(rapi.getInputName())) if not rapi.checkFileExists(name): print("Texture not found: %s" %name) else: tex = open(name,'rb').read() noepyLoadRGBA(tex,file.texList) file.texList[-1].name = name return file.texList[-1]
def __init__(self, data): self.inFile = NoeBitStream(data) self.animList = [] self.texList = [] self.matList = [] self.boneList = [] self.dirpath = rapi.getDirForFilePath(rapi.getInputName()) self.texpath = self.dirpath + "texture\\"
def noepyCheckType(data): fName=rapi.getInputName().split('\\')[-1] dirPath = rapi.getDirForFilePath(rapi.getInputName()) bs = open(dirPath + "/" + fName) idstring = line = bs.readline() idstring =''.join(idstring.split('\x00')) bs.close() if not "version" in idstring.lower() : return 0 return 1
def __init__(self, data): self.inFile = NoeBitStream(data) self.animList = [] self.texList = [] self.matList = [] self.boneList = [] self.meshes = [] self.materials = [] self.dirpath = rapi.getDirForFilePath(rapi.getInputName())
def __init__(self, data): self.inFile = NoeBitStream(data) self.animList = [] self.texList = [] self.matList = [] self.boneList = [] self.dirpath = rapi.getDirForFilePath(rapi.getInputName()) self.basename = rapi.getExtensionlessName(rapi.getInputName())
def LoadTexture(texName): if ARTPATH == None: name = rapi.getDirForFilePath(rapi.getInputName())+texName else: name = texName.split('\\')[-1] tex = open(name,'rb').read() tex = rapi.loadTexByHandler(tex,'.dds') tex.name = texName return tex
def __init__(self, data): '''Initialize some data. Refer to Sanae.py to see what is already initialized''' self.inFile = NoeBitStream(data) self.animList = [] self.texList = [] self.matList = [] self.boneList = [] self.dirpath = rapi.getDirForFilePath(rapi.getInputName())
def noepyLoadModel(data, mdlList): ctx = rapi.rpgCreateContext() global dirPath global fileName dirPath = rapi.getDirForFilePath(rapi.getInputName()) fileName = rapi.getLocalFileName(rapi.getInputName()) file = GOBJ(data) mdlList.append(file.mdl) rapi.rpgClearBufferBinds() return 1
def parse_xmtl(self): dirPath = rapi.getDirForFilePath(rapi.getInputName()) xmatLib = self.filename + ".xmtl" f = open(dirPath + xmatLib, 'rb') parser = XmtlParser(f.read()) parser.parse_file(self.filename) for i in range(parser.numMat): matName, texName = parser.matNames[i], parser.texNames[i] material = NoeMaterial(matName, texName) self.matList.append(material)
def parse_materials(self): dirPath = rapi.getDirForFilePath(rapi.getInputName()) matLib = self.filename + ".mtl" f = open(dirPath + matLib, "rb") mat = MaterialParser(f.read()) mat.parse_file(self.filename) for i in range(mat.numMat): matName, texName = mat.matNames[i], mat.texNames[i] material = NoeMaterial(matName, texName) self.matList.append(material)
def parse_materials(self): dirPath = rapi.getDirForFilePath(rapi.getInputName()) matLib = self.filename + ".mtl" f = open(dirPath + matLib, 'rb') mat = MaterialParser(f.read()) mat.parse_file(self.filename) for i in range(mat.numMat): matName, texName = mat.matNames[i], mat.texNames[i] material = NoeMaterial(matName, texName) self.matList.append(material)
def parse_xmtl(self): dirPath = rapi.getDirForFilePath(rapi.getInputName()) xmatLib = self.filename + ".xmtl" f = open(dirPath + xmatLib, "rb") parser = XmtlParser(f.read()) parser.parse_file(self.filename) for i in range(parser.numMat): matName, texName = parser.matNames[i], parser.texNames[i] material = NoeMaterial(matName, texName) self.matList.append(material)
def __init__(self): self.filename = rapi.getInputName().split('\\')[-1] self.dirPath = rapi.getDirForFilePath(rapi.getInputName()) self.matList = [] self.texList = [] self.bones = [] self.anims = [] self.GetMaterials() self.LoadModel() try:self.LoadArmature() except:print('Armature failed to init');pass
def open_file(self, texName): dirpath = rapi.getDirForFilePath(rapi.getInputName()) try: f = open(texName, 'rb') return f except: try: f = open(dirpath + "textures\\" + texName, 'rb') return f except: print("failed to open texture: %s" %texName)
def GetMaterial(self): fName=rapi.getInputName().split('\\')[-1][:-5] self.name = fName dirPath = rapi.getDirForFilePath(rapi.getInputName()) self.path = dirPath try: matFile = open(dirPath+"/"+fName+".material","r") while True: line = matFile.readline() #print(line) if "texture " in line: line=line.split(' ')[-1][:-5];print(line);return line except:print("[*] Material not found.", );return 0 print(fName)
def CreateGeo(self): print(len(self.idxs)) x=0 y=len(self.geos)#8 n = []#[5,6,7] GEO_C = 0 self.matList = [] self.texList = [] dirPath = rapi.getDirForFilePath(rapi.getInputName()) for mat in self.mats: self.matList.append(mat.material) mat = mat.material diffuse = mat.texName normal = mat.nrmTexName specular = mat.specTexName for t in [diffuse,normal,specular]: try: tex = open(dirPath + '/' +t,'rb').read() tex = rapi.loadTexByHandler(tex,'.dds') tex.name = t self.texList.append(tex) except: raise for i in range(x,x+y): #for i in range(len(self.idxs)): idx = self.idxs[i] geo = self.geos[i] prop = geo.props print("%d: "%i,idx.name," | ",geo.name) print(idx.numTri,idx.numIdx,geo.numVert) if not i in n: #material = self.matList[MaterialLink[idx.name]] rapi.rpgSetMaterial(MaterialLink[idx.name]) rapi.rpgBindPositionBufferOfs (geo.vertBuffer, noesis.RPGEODATA_FLOAT, geo.vertLength, prop['position']) rapi.rpgBindUV1BufferOfs (geo.uvBuffer, noesis.RPGEODATA_FLOAT, geo.uvLength, prop['tex0']) rapi.rpgBindNormalBufferOfs (geo.vertBuffer, noesis.RPGEODATA_FLOAT, geo.vertLength, prop['normal']) rapi.rpgBindTangentBufferOfs (geo.vertBuffer, noesis.RPGEODATA_FLOAT, geo.vertLength, prop['tangent']) rapi.rpgCommitTriangles (idx.idxBuffer, noesis.RPGEODATA_USHORT, idx.numIdx, noesis.RPGEO_TRIANGLE, 1) #rapi.rpgCommitTriangles (idx.idxBuffer, noesis.RPGEODATA_USHORT, idx.numTri, noesis.RPGEO_TRIANGLE, 1) if GEO_C == 1: bs = NoeBitStream() fileG = open("geo-%d.p3ddump"%i,'wb') bs.writeUInt(geo.numVert) bs.writeBytes(geo.vertBuffer) bs.writeUInt(idx.numTri) bs.writeBytes(idx.idxBuffer) fileG.write(bs.getBuffer()) fileG.close()
def parse_material(self, matLib): dirpath = rapi.getDirForFilePath(rapi.getInputName()) matLib = os.path.basename(matLib) matPath = dirpath + matLib try: f = open(matPath, 'rb') data = f.read() matLib = MatLibrary(data) material = matLib.parse_file() self.matList.append(material) return material.name except: print("Couldn't find file: ", matLib) return ""
def parse_file(self): dirpath = rapi.getDirForFilePath(rapi.getInputName()) idstring = self.inFile.readBytes(6) self.inFile.readBytes(8) matName = self.read_name() self.inFile.seek(9, 1) self.read_name() self.inFile.seek(217, 1) label = self.read_name() self.inFile.readFloat() texName = self.read_name() texPath = dirpath + texName material = NoeMaterial(matName, texPath) return material
def parseMaterials(self): dirPath = rapi.getDirForFilePath(rapi.getInputName()) self.data.seek(28) self.numMat = self.data.readUInt() matOffset =self.data.readUInt() self.data.seek(matOffset-4,1) materialArray = ANetModelMaterialArray(self.data) self.data.seek(materialArray.materialOffset-4,1) current = self.data.tell() offsetTable = self.data.read("%di"%materialArray.materialCount) diffuse = [0x67531924] normal = [2332802439,2774157488] lightmap = [1745599879,] for i in range(materialArray.materialCount): self.data.seek(current + offsetTable[i] + i*4) matInfo = ANetModelMaterialInfo(self.data) self.data.seek(matInfo.texturepos + matInfo.textureOffset) material = NoeMaterial(str(i),'') #material.setBlendMode("GL_SRC_COLOR","GL_ONE") texInfos = [] for t in range(matInfo.textureCount):texInfos.append(ANetModelTextureReference(self.data)) for texInfo in texInfos: self.data.seek(texInfo.referencepos + texInfo.offsetToFileReference) texInDAT = self.data.read('3H') if texInfo.hash in diffuse or texInfo.hash in normal or texInfo.hash in lightmap: texture = 0xFF00 * (texInDAT[1] - 0x100) + (texInDAT[0] - 0x100) + 1 if texInfo.hash in diffuse: material.setTexture(str(texture)) elif texInfo.hash in normal: material.setNormalTexture(str(texture)) elif texInfo.hash in lightmap: self.lightMapList[i]=NoeMaterial(str(i),"") self.lightMapList[i].setTexture(str(texture)) self.lightMapList[i].setBlendMode("GL_ONE","GL_ONE") try: path = glob.glob(dirPath+str(texture)+'*.atex')[0] tex=open(path,'rb').read() tex=rapi.loadTexByHandler(tex,'.atex') tex.name=str(texture)+'.atex' self.texList.append(tex) except:print("Can't load", texture) else: texture = 0xFF00 * (texInDAT[1] - 0x100) + (texInDAT[0] - 0x100) + 1 #print(texture, texInfo.hash) self.matList.append(material)
def Animations(self): dirPath = rapi.getDirForFilePath(rapi.getInputName()) animFile = open(dirPath+"/anm/jackalman_walk.anm","rb").read() animFile = NoeBitStream(animFile) animFile.seek(4) numBones = animFile.readUInt() numFrames = animFile.readUInt() FPS = animFile.readUInt() animation = [] for i in range(numBones): name = noeStrFromBytes( animFile.readBytes( animFile.readUInt())) anim = [] for t in range(numFrames): pos =x,y,z = animFile.read("3f") rot = animFile.read("4f") #rot = (rot[0],rot[1],rot[2],-rot[3]) scale = animFile.read("3f") rot2 = animFile.read("4f") matrix = NoeQuat(rot).toMat43() matrix.__setitem__(3,(pos)) if i == 1 and t == 0: for m in matrix:print("%6f, %6f, %6f"%(m[0],m[1],m[2])) anim.append(matrix) animation.append(anim) for i in range(numBones): for t in range(numFrames): if t==0 or t>0 : bone = self.boneList[i]._matrix #animation[i][t] = bone.__mul__(animation[i][t]) #animation[i][t] = animation[i][t].__mul__(bone) else: pass frameMat=[] for t in range(numFrames): for i in range(numBones): frameMat.append(animation[i][t]) return (NoeAnim("walk", self.boneList, 1, frameMat, 1),) return (NoeAnim("walk", self.boneList, numFrames, frameMat, 1),) return
def load_all_models(mdlList): '''Load all models''' #carry over from previous models matList = [] texList = [] dirPath = rapi.getDirForFilePath(rapi.getInputName()) fileList = [file for file in os.listdir(dirPath) if file.lower().endswith(".gm2")] for file in fileList: f = open(dirPath + file, 'rb') data2 = f.read() parser = SanaeParser(data2) parser.parse_file() matList.extend(parser.matList) texList.extend(parser.texList) mdl = rapi.rpgConstructModel() mdl.setModelMaterials(NoeModelMaterials(texList, matList)) mdlList.append(mdl)
def parse_materials(self): dirpath = rapi.getDirForFilePath(rapi.getInputName()) for i in range(self.numMat): name = self.read_name(128) matName = self.read_name(128) unkName = self.read_name(256) self.inFile.read('3L') self.inFile.readFloat() self.inFile.read('4L') numTex = self.inFile.readUInt() self.inFile.read('3L') for i in range(numTex): if i == 1: texName = self.read_name(268) texName = os.path.basename(texName) else: self.read_name(268) self.matNames.append(matName) self.texNames.append(dirpath + "tex\\" + texName)
def parse_materials(self): dirpath = rapi.getDirForFilePath(rapi.getInputName()) for i in range(self.numMat): name = self.read_name(128) matName = self.read_name(128) unkName = self.read_name(256) self.inFile.read("3L") self.inFile.readFloat() self.inFile.read("4L") numTex = self.inFile.readUInt() self.inFile.read("3L") for i in range(numTex): if i == 1: texName = self.read_name(268) texName = os.path.basename(texName) else: self.read_name(268) self.matNames.append(matName) self.texNames.append(dirpath + "tex\\" + texName)
def parse_materials(self, filename): dirPath = rapi.getDirForFilePath(rapi.getInputName()) unk, numMat = self.inFile.read('2L') for i in range(numMat): unk1, len1, len2, = self.inFile.read('3L') name1 = self.read_name(len1) matName = self.read_name(len2) matName = "%s[%d]" %(filename, i) self.inFile.seek(5, 1) numProps, unk, unk = self.inFile.read('3L') self.parse_mat_property(numProps) self.inFile.readString() self.inFile.seek(21, 1) self.inFile.seek(4, 1) #skip curdir texName = self.read_ustring() texPath = dirPath + texName material = NoeMaterial(matName, texPath) self.matList.append(material)
def parse_materials(self, numMat, filename): dirpath = rapi.getDirForFilePath(rapi.getInputName()) for i in range(numMat): name = self.read_name(128) self.matName = self.read_name(128) if not self.matName: self.matName = "material[%d]" %i self.inFile.seek(56, 1) flag = self.inFile.readUInt() if flag in [37524, 45716]: self.texName = filename + ".dds" self.inFile.seek(252, 1) else: self.inFile.seek(-4, 1) try: texPath = self.read_name(256) self.texName = os.path.basename(texPath) except: self.texName = filename + ".dds" self.matNames.append(self.matName) self.texNames.append(dirpath + "texture\\" + self.texName)
def get_directory_path(): dirPath = rapi.getDirForFilePath(rapi.getInputName()) if not dirPath: dirPath = os.path.dirname(os.path.abspath(rapi.getInputName())) + os.sep return dirPath
def ReadMaterials(self): self.SearchChunk("353010") self.data.seek(7,1) self.matEmis={} self.matID_F={} for i in range(self.data.readUInt()): self.data.seek(17,1) size = self.data.readUInt() self.data.seek(2,1) length = self.data.readUByte() nameMat = noeStrFromBytes(self.data.readBytes(length)) nameMat = nameMat.split('\\')[-1] self.data.seek(-length-2,1) matbuffer = self.data.readBytes(size) matbuffer = matbuffer.split(b"\x31\x03") buffer = matbuffer[1:] material = NoeMaterial(nameMat,"") for t in range (0,len(buffer),2): length = int(buffer[t][6]) name = buffer[t][7:6+length] name = name.split(b'/')[-1] name = name[:-3]+b'dds' name = name.decode("utf-8") if "_diff.dds" in name: material.setTexture(name) elif "_norm.dds" in name: material.setNormalTexture(name) elif "_spec.dds" in name: material.setSpecularTexture(name) elif "_emis.dds" in name: self.matEmis[i] = NoeMaterial(nameMat+"_Emiss", name) self.matEmis[i].setBlendMode("GL_ONE","GL_ONE") self.matEmis[i].setAlphaTest(0.5) self.matList.append(material) for t in self.matEmis.keys(): self.matList.append(self.matEmis[t]) texList = [] for t in self.matList: try: name=rapi.getDirForFilePath(rapi.getInputName())+t.texName if not t.texName in texList: tex = open(name,'rb').read() tex = rapi.loadTexByHandler(tex,'.dds') tex.name = t.texName if "_diff.dds" in tex.name: try: norm = rapi.getDirForFilePath(rapi.getInputName())+t.nrmTexName spec = rapi.getDirForFilePath(rapi.getInputName())+t.specTexName norm = open(norm,'rb').read() spec = open(spec,'rb').read() norm = rapi.loadTexByHandler(norm,'.dds') spec = rapi.loadTexByHandler(spec,'.dds') norm.name = t.nrmTexName spec.name = t.specTexName decodeHOMM6NormalMap(norm) self.texList.append(norm) self.texList.append(spec) except:pass self.texList.append(tex) except: print("Couldn't find",t.texName) #MrAdults - make a list of emissive textures, find the corresponding diffuse texture, and copy its alpha over emissiveTexs = [t for t in self.texList if "_emis.dds" in t.name] for t in emissiveTexs: diffName = t.name.replace("_emis.dds", "_diff.dds") for d in self.texList: if d.name == diffName: copyTextureAlpha(d, t) break
def ParseAnims(self): import os anims = [] dirPath = rapi.getDirForFilePath(rapi.getInputName())+"/anims" if not os.path.isdir(dirPath): dirPath = rapi.getDirForFilePath(rapi.getInputName()) os.chdir(dirPath) for file in os.listdir("."): if file.endswith(".wza"): animFile = NoeBitStream(open(dirPath + "/" +file,'rb').read()) animFile.seek(4,1) version = animFile.readUShort() #print("Version:",version) animFile.seek(10,1) numBones = animFile.readUByte() if version <= 112: numFrames = animFile.readUByte() numFramesMax = numFrames elif version <= 118: numFrames = animFile.readUShort() numFramesMax = numFrames else: numFrames = list(animFile.read('%dh'%numBones)) numFramesMax = numFrames[:] numFramesMax.sort() if len(numFramesMax) == 0:numFramesMax = 0 elif len(numFramesMax)>1:numFramesMax=numFramesMax[-1] animFile.seek(4,1) anim = [] for i in range(numBones): parent = animFile.readUByte() length = animFile.readUByte() animFile.seek(length,1) if version <=113:mUnknownOne = 0 else: mUnknownOne = animFile.readUInt() try: if version != 119: for f in range(numFrames): if mUnknownOne == 1 and version > 112: animFile.readUInt() for i in range(numBones): #if version == 119: mUnknown = animFile.readUShort() pos = animFile.read('3f') rot = NoeQuat(animFile.read('4f')) mat = rot.toMat43() mat = mat.inverse() mat.__setitem__(3,pos) anim.append(mat) else: for i in range(numBones): for f in range(numFrames[i]): if mUnknownOne == 1: animFile.readUShort() pos = animFile.read('3f') rot = NoeQuat(animFile.read('4f')) mat = rot.toMat43() mat = mat.inverse() mat.__setitem__(3,pos) anim.append(mat) for f in range(numFramesMax - numFrames[i]): anim.append(NoeMat43()) except:print(file);continue if version == 119: temp = anim[:] anim=[] for f in range(numFramesMax): for b in range(numBones): anim.append(temp[f + b*numFramesMax]) animName = file.split(']',1)[-1][:-3] if version ==119:anims.append(NoeAnim(animName,self.skeleton.Bones,numFramesMax,anim)) else:anims.append(NoeAnim(animName,self.skeleton.Bones,numFrames,anim)) return anims