Beispiel #1
0
 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
Beispiel #15
0
 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)
Beispiel #17
0
 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)
Beispiel #26
0
 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)    
Beispiel #28
0
 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