def LoadAndParseAniFile(self): self.AniHeader.Signature = binaryreader.ReadUInt( self.AniFileStream, 1)[0] self.AniHeader.Version = binaryreader.ReadUInt(self.AniFileStream, 1)[0] self.AniHeader.MaxFrame = binaryreader.ReadInt(self.AniFileStream, 1)[0] self.AniHeader.ModelNum = binaryreader.ReadInt(self.AniFileStream, 1)[0] # self.AniHeader.AniType = binaryreader.ReadInt(self.AniFileStream, 1)[0] self.AniHeader.AniType = EAnimationType( binaryreader.ReadInt(self.AniFileStream, 1)[0]) print("Ani Version: {0}, ani maxframe: {1}, ani anitype: {2}".format( self.AniHeader.Version, self.AniHeader.MaxFrame, self.AniHeader.AniType)) globalvars.CurrentAniFileVersion = self.AniHeader.Version if self.AniHeader.Version != raidflags.EXPORTER_CURRENT_ANI_VER: # @todo add warning - ani not latest version pass LoaderObj = None if globalvars.CurrentAniFileVersion == raidflags.EXPORTER_ANI_VER12: LoaderObj = aniparser.FAniFileLoaderImpl_v12() elif globalvars.CurrentAniFileVersion == raidflags.EXPORTER_ANI_VER11: LoaderObj = aniparser.FAniFileLoaderImpl_v11() elif globalvars.CurrentAniFileVersion == raidflags.EXPORTER_ANI_VER9: LoaderObj = aniparser.FAniFileLoaderImpl_v9() elif globalvars.CurrentAniFileVersion == raidflags.EXPORTER_ANI_VER8: LoaderObj = aniparser.FAniFileLoaderImpl_v7() elif globalvars.CurrentAniFileVersion == raidflags.EXPORTER_ANI_VER7: LoaderObj = aniparser.FAniFileLoaderImpl_v7() elif globalvars.CurrentAniFileVersion == raidflags.EXPORTER_ANI_VER6: LoaderObj = aniparser.FAniFileLoaderImpl_v6() else: # @todo ani version error pass for i in range(self.AniHeader.ModelNum): AniNode = FAniNode() if self.AniHeader.AniType == EAnimationType.RAniType_Vertex: # if self.AniHeader.AniType == 1: LoaderObj.LoadVertexAni(AniNode, self.AniFileStream) elif self.AniHeader.AniType == EAnimationType.RAniType_Bone: # elif self.AniHeader.AniType == 2: LoaderObj.LoadBoneAni(AniNode, self.AniFileStream) if AniNode.Name == "Bip01": self.AniRootNode = AniNode else: # @todo pass LoaderObj.LoadVisibilityKey(AniNode, self.AniFileStream) self.AniMeshNodes.append(AniNode) return
def LoadVertex(self, Node, FileStream, Offset): try: dwFVF = binaryreader.ReadUInt(FileStream, 1)[0] LightMapID = binaryreader.ReadInt(FileStream, 1)[0] Node.PointsCount = binaryreader.ReadInt(FileStream, 1)[0] for i in range(Node.PointsCount): Vec = datatypes.FVector(binaryreader.ReadFloat(FileStream, 3)) Node.PointsTable.append(Vec) if Node.PointsCount: Node.CalculateLocalBoundingBox() Node.NormalsCount = binaryreader.ReadInt(FileStream, 1)[0] for i in range(Node.NormalsCount): Vec = datatypes.FVector(binaryreader.ReadFloat(FileStream, 3)) Node.NormalsTable.append(Vec) Node.TangentTanCount = binaryreader.ReadInt(FileStream, 1)[0] for i in range(Node.TangentTanCount): Vec = datatypes.FVector4(binaryreader.ReadFloat(FileStream, 4)) Node.TangentTanTable.append(Vec) Node.TangentBinCount = binaryreader.ReadInt(FileStream, 1)[0] for i in range(Node.TangentBinCount): Vec = datatypes.FVector(binaryreader.ReadFloat(FileStream, 3)) Node.TangentBinTable.append(Vec) Node.TexCoordCount = binaryreader.ReadInt(FileStream, 1)[0] for i in range(Node.TexCoordCount): Vec = datatypes.FVector(binaryreader.ReadFloat(FileStream, 3)) Node.TexCoordTable.append(Vec) except struct.error as err: errorhandling.HandleStructUnpackError(err)
def LoadAndParseEluFile(self): self.EluHeader.Signature = binaryreader.ReadUInt( self.EluFileStream, 1)[0] self.EluHeader.Version = binaryreader.ReadUInt(self.EluFileStream, 1)[0] self.EluHeader.MaterialNum = binaryreader.ReadInt( self.EluFileStream, 1)[0] self.EluHeader.MeshNum = binaryreader.ReadInt(self.EluFileStream, 1)[0] globalvars.CurrentEluFileVersion = self.EluHeader.Version if self.EluHeader.Signature != raidflags.EXPORTER_SIG: # @todo add signature error pass if self.EluHeader.Version != raidflags.EXPORTER_CURRENT_MESH_VER: # @todo add warning - elu not latest version pass LoaderObj = None if globalvars.CurrentEluFileVersion == raidflags.EXPORTER_MESH_VER20: LoaderObj = eluparser.FEluNodeLoaderImpl_v20() elif globalvars.CurrentEluFileVersion == raidflags.EXPORTER_MESH_VER18: LoaderObj = eluparser.FEluNodeLoaderImpl_v18() elif globalvars.CurrentEluFileVersion == raidflags.EXPORTER_MESH_VER17: LoaderObj = eluparser.FEluNodeLoaderImpl_v17() elif globalvars.CurrentEluFileVersion == raidflags.EXPORTER_MESH_VER16: LoaderObj = eluparser.FEluNodeLoaderImpl_v16() elif globalvars.CurrentEluFileVersion == raidflags.EXPORTER_MESH_VER15: LoaderObj = eluparser.FEluNodeLoaderImpl_v15() elif globalvars.CurrentEluFileVersion == raidflags.EXPORTER_MESH_VER14: LoaderObj = eluparser.FEluNodeLoaderImpl_v14() elif globalvars.CurrentEluFileVersion == raidflags.EXPORTER_MESH_VER13: LoaderObj = eluparser.FEluNodeLoaderImpl_v13() elif globalvars.CurrentEluFileVersion == raidflags.EXPORTER_MESH_VER12: LoaderObj = eluparser.FEluNodeLoaderImpl_v12() else: # @todo elu version error pass for i in range(self.EluHeader.MeshNum): EluNode = FEluNode() LoaderObj.Load(EluNode, self.EluFileStream) self.EluMeshNodes.append(EluNode) return
def LoadInfo(self, Node, FileStream, Offset): try: Node.LocalMatrix = datatypes.FMatrix( binaryreader.ReadFloat(FileStream, 16)) Node.BaseVisibility = binaryreader.ReadFloat(FileStream, 1)[0] Node.dwFlag = binaryreader.ReadUInt(FileStream, 1)[0] try: Node.MeshAlign = datatypes.RMeshAlign( binaryreader.ReadInt(FileStream, 1)[0]) except ValueError as er: Message = "Node.MeshAlign value is out of allowed range." filelogger.AddLog(globalvars.LogFileStream, Message, filelogger.LogType.LogType_Warning) Node.LODProjectIndex = binaryreader.ReadInt(FileStream, 1)[0] except struct.error as err: errorhandling.HandleStructUnpackError(err)
def LoadVertexAni(self, Node, FileStream, Offset=None): try: Node.Name = binaryreader.ReadWord(FileStream) Node.VertexCount = binaryreader.ReadInt(FileStream, 1)[0] print("Vertex Count: ", Node.VertexCount) Node.Vertex_V_Count = binaryreader.ReadInt(FileStream, 1)[0] print("Vertex V Count: ", Node.Vertex_V_Count) # if Node.VertexCount > 0: for i in range(Node.VertexCount): VertFrame = binaryreader.ReadUInt(FileStream, 1)[0] Node.VertexFrame.append(VertFrame) for i in range(Node.VertexCount): Node.VertexTable.append([]) for j in range(Node.Vertex_V_Count): Vec = datatypes.FVector(binaryreader.ReadFloat(FileStream, 3)) Node.VertexTable[i].append(Vec) self.LoadVertexAniBoundingBox(Node, FileStream) except struct.error as err: errorhandling.HandleStructUnpackError(err)
def LoadInfo(self, Node, FileStream, Offset): try: Node.dwFlag = binaryreader.ReadUInt(FileStream, 1)[0] try: Node.MeshAlign = datatypes.RMeshAlign( binaryreader.ReadInt(FileStream, 1)[0]) except ValueError as er: Message = "Node.MeshAlign value is out of allowed range." filelogger.AddLog(globalvars.LogFileStream, Message, filelogger.LogType.LogType_Warning) if globalvars.CurrentEluFileVersion < raidflags.EXPORTER_MESH_VER11: # Unused data AniPartsType = binaryreader.ReadInt(FileStream, 1)[0] PartsPosInfoType = binaryreader.ReadInt(FileStream, 1)[0] PartsType = binaryreader.ReadInt(FileStream, 1)[0] Node.LocalMatrix = datatypes.FMatrix( binaryreader.ReadFloat(FileStream, 16)) if globalvars.CurrentEluFileVersion >= raidflags.EXPORTER_MESH_VER11: Node.BaseVisibility = binaryreader.ReadInt(FileStream, 1)[0] except struct.error as err: errorhandling.HandleStructUnpackError(err)