def LoadVertex(self, Node, FileStream, Offset): try: 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.FVector(binaryreader.ReadFloat(FileStream, 3)) Vec4 = datatypes.FVector4.FromVec3(Vec) Node.TangentTanTable.append(Vec4) 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 LoadFace(self, Node, FileStream, Offset): try: Node.FaceCount = binaryreader.ReadInt(FileStream, 1)[0] if (Node.FaceCount): Node.TotalDegrees = binaryreader.ReadInt(FileStream, 1)[0] Node.TotalTriangles = binaryreader.ReadInt(FileStream, 1)[0] for i in range(Node.FaceCount): MeshPolygonData = datatypes.FMeshPolygonData() MeshPolygonData.Vertices = binaryreader.ReadInt( FileStream, 1)[0] for j in range(MeshPolygonData.Vertices): UnsignedShorts = binaryreader.ReadUShort(FileStream, 6) FaceSubData = datatypes.FFaceSubData() FaceSubData.p = UnsignedShorts[0] FaceSubData.uv = UnsignedShorts[1] FaceSubData.uv2 = UnsignedShorts[2] FaceSubData.n = UnsignedShorts[3] FaceSubData.n_tan = UnsignedShorts[4] FaceSubData.n_bin = UnsignedShorts[5] MeshPolygonData.FaceSubDatas.append(FaceSubData) MeshPolygonData.MaterialID = binaryreader.ReadShort( FileStream, 1)[0] Node.PolygonTable.append(MeshPolygonData) try: assert Node.TotalDegrees == sum(len(MeshPolygonData.FaceSubDatas) \ for MeshPolygonData in Node.PolygonTable), \ "Assertion Failed: TotalDegrees value does not match expected value for node - {}".format(Node.NodeName) except AssertionError as err: errorhandling.HandleAssertionError(err) except struct.error as err: errorhandling.HandleStructUnpackError(err)
def LoadVisibilityKey(self, Node, FileStream, Offset=None): try: if globalvars.CurrentAniFileVersion >= raidflags.EXPORTER_ANI_VER5: VisCount = binaryreader.ReadInt(FileStream, 1)[0] Node.VisKeyTrack.Count = VisCount if VisCount: for i in range(VisCount): VisKey = datatypes.FVisKey() VisKey.Frame = binaryreader.ReadInt(FileStream, 1)[0] VisKey.Vis = binaryreader.ReadFloat(FileStream, 1)[0] if VisKey.Vis < 0.0: VisKey.Vis = 0.0 Node.VisKeyTrack.Data.append(VisKey) return True else: VisCount = binaryreader.ReadInt(FileStream, 1)[0] Node.VisKeyTrack.Count = VisCount if VisCount: for i in range(VisCount): VisKey = datatypes.FVisKey() VisKey.Vis = binaryreader.ReadFloat(FileStream, 1)[0] if VisKey.Vis < 0.0: VisKey.Vis = 0.0 VisKey.Frame = binaryreader.ReadInt(FileStream, 1)[0] Node.VisKeyTrack.Data.append(VisKey) return True return False except struct.error as err: errorhandling.HandleStructUnpackError(err)
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 LoadVisibilityKey(self, Node, FileStream, Offset=None): try: AnimType = datatypes.FAnimType(binaryreader.ReadInt(FileStream, 3)) if AnimType.Count > 0: Node.VisKeyTrack.Count = AnimType.Count for i in range(AnimType.Count): VisKey = datatypes.FVisKey() VisKey.Frame = binaryreader.ReadInt(FileStream, 1)[0] VisKey.Vis = binaryreader.ReadFloat(FileStream, 1)[0] Node.VisKeyTrack.Data.append(VisKey) except struct.error as err: errorhandling.HandleStructUnpackError(err)
def LoadVisibilityKey(self, Node, FileStream, Offset=None): try: VisCount = binaryreader.ReadInt(FileStream, 1)[0] if VisCount: Node.VisKeyTrack.Count = VisCount for i in range(VisCount): VisKey = datatypes.FVisKey() VisKey.Frame = binaryreader.ReadInt(FileStream, 1)[0] VisKey.Vis = binaryreader.ReadFloat(FileStream, 1)[0] Node.VisKeyTrack.Data.append(VisKey) return True return False except struct.error as err: errorhandling.HandleStructUnpackError(err)
def LoadName(self, Node, FileStream, Offset): try: Node.NodeName = binaryreader.ReadWord(FileStream) Node.ParentNodeID = binaryreader.ReadInt(FileStream, 1)[0] Node.NodeParentName = binaryreader.ReadWord(FileStream) except struct.error as err: errorhandling.HandleStructUnpackError(err)
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 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 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)
def LoadBoneAni(self, Node, FileStream, Offset=None): try: Node.Name = binaryreader.ReadWord(FileStream) if globalvars.CurrentAniFileVersion >= raidflags.EXPORTER_ANI_VER6: Node.ParentName = binaryreader.ReadWord(FileStream) Node.LocalMatrix = datatypes.FMatrix( binaryreader.ReadFloat(FileStream, 16)) PosKeyNum = binaryreader.ReadInt(FileStream, 1)[0] if PosKeyNum: Node.PositionKeyTrack.Count = PosKeyNum + 1 for i in range(PosKeyNum): PosKey = datatypes.FVecKey() PosKey.Vector = datatypes.FVector( binaryreader.ReadFloat(FileStream, 3)) PosKey.Frame = binaryreader.ReadInt(FileStream, 1)[0] Node.PositionKeyTrack.Data.append(PosKey) LastPosKey = Node.PositionKeyTrack.Data[PosKeyNum - 1] Node.PositionKeyTrack.Data.append(LastPosKey) RotKeyNum = binaryreader.ReadInt(FileStream, 1)[0] if RotKeyNum: Node.RotationKeyTrack.Count = RotKeyNum + 1 for i in range(RotKeyNum): QuatKey = datatypes.FQuatKey() QuatKey.Quat = datatypes.FQuaternion( binaryreader.ReadFloat(FileStream, 4)) QuatKey.Frame = binaryreader.ReadInt(FileStream, 1)[0] Node.RotationKeyTrack.Data.append(QuatKey) LastQuatKey = Node.RotationKeyTrack.Data[RotKeyNum - 1] Node.RotationKeyTrack.Data.append(LastQuatKey) if globalvars.CurrentAniFileVersion >= raidflags.EXPORTER_ANI_VER5: ScaleCount = binaryreader.ReadInt(FileStream, 1)[0] if ScaleCount: Node.ScaleKeyTrack.Count = ScaleCount for i in range(ScaleCount): ScaleKey = datatypes.FVecKey() ScaleKey.Vector = datatypes.FVector( binaryreader.ReadFloat(FileStream, 3)) ScaleKey.Frame = binaryreader.ReadInt(FileStream, 1)[0] Node.ScaleKeyTrack.Data.append(ScaleKey) except struct.error as err: errorhandling.HandleStructUnpackError(err)
def LoadBoneAni(self, Node, FileStream, Offset=None): try: Node.Name = binaryreader.ReadWord(FileStream) Node.ParentName = binaryreader.ReadWord(FileStream) Node.LocalMatrix = datatypes.FMatrix( binaryreader.ReadFloat(FileStream, 16)) AnimType_1 = datatypes.FAnimType( binaryreader.ReadInt(FileStream, 3)) if AnimType_1.Count > 0: Node.PositionKeyTrack.Count = AnimType_1.Count + 1 for i in range(AnimType_1.Count): PosKey = datatypes.FVecKey() PosKey.Vector = datatypes.FVector( binaryreader.ReadFloat(FileStream, 3)) PosKey.Frame = binaryreader.ReadInt(FileStream, 1)[0] Node.PositionKeyTrack.Data.append(PosKey) LastPosKey = Node.PositionKeyTrack.Data[AnimType_1.Count - 1] Node.PositionKeyTrack.Data.append(LastPosKey) AnimType_2 = datatypes.FAnimType( binaryreader.ReadInt(FileStream, 3)) if AnimType_2.Count > 0: Node.RotationKeyTrack.Count = AnimType_2.Count + 1 for i in range(AnimType_2.Count): QuatKey = datatypes.FQuatKey() QuatKey.Quat = datatypes.FQuaternion( binaryreader.ReadFloat(FileStream, 4)) QuatKey.Frame = binaryreader.ReadInt(FileStream, 1)[0] Node.RotationKeyTrack.Data.append(QuatKey) LastQuatKey = Node.RotationKeyTrack.Data[AnimType_2.Count - 1] Node.RotationKeyTrack.Data.append(LastQuatKey) AnimType_3 = datatypes.FAnimType( binaryreader.ReadInt(FileStream, 3)) if AnimType_3.Count > 0: Node.ScaleKeyTrack.Count = AnimType_3.Count for i in range(AnimType_3.Count): ScaleKey = datatypes.FVecKey() ScaleKey.Vector = datatypes.FVector( binaryreader.ReadFloat(FileStream, 3)) ScaleKey.Frame = binaryreader.ReadInt(FileStream, 1)[0] Node.ScaleKeyTrack.Data.append(ScaleKey) except struct.error as err: errorhandling.HandleStructUnpackError(err)
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) LightMapTexCoordTableCount = binaryreader.ReadInt(FileStream, 1)[0] FileStream.seek(FileStream.tell() + 3 * 4 * LightMapTexCoordTableCount) except struct.error as err: errorhandling.HandleStructUnpackError(err)
def LoadVertexInfo(self, Node, FileStream, Offset): try: Node.PointColorCount = binaryreader.ReadInt(FileStream, 1)[0] for i in range(Node.PointColorCount): Vec = datatypes.FVector(binaryreader.ReadFloat(FileStream, 3)) Node.PointColorTable.append(Vec) if Node.PointsCount == 0 or Node.FaceCount == 0: Node.AddFlag(raidflags.RM_FLAG_DUMMY_MESH) Node.MaterialID = binaryreader.ReadInt(FileStream, 1)[0] Node.PhysiqueCount = binaryreader.ReadInt(FileStream, 1)[0] if Node.PhysiqueCount: try: assert Node.PointsCount == Node.PhysiqueCount, \ "Assertion Failed: Points Count is not same as Physique Count - {0}".format(Node.NodeName) except AssertionError as err: errorhandling.HandleAssertionError(err) for i in range(Node.PhysiqueCount): Size = binaryreader.ReadInt(FileStream, 1)[0] PhysiqueInfo = datatypes.FPhysiqueInfo() for j in range(Size): PhysiqueSubData = datatypes.FPhysiqueSubData() PhysiqueSubData.cid = binaryreader.ReadUShort( FileStream, 1)[0] PhysiqueSubData.pid = binaryreader.ReadUShort( FileStream, 1)[0] PhysiqueSubData.weight = binaryreader.ReadFloat( FileStream, 1)[0] PhysiqueInfo.PhysiqueSubDatas.append(PhysiqueSubData) PhysiqueInfo.Num = len(PhysiqueInfo.PhysiqueSubDatas) Node.PhysiqueTable.append(PhysiqueInfo) if Size > raidflags.PHYSIQUE_MAX_WEIGHT: for m in range(Size): for n in range(m + 1, Size): if PhysiqueInfo.PhysiqueSubDatas[ m].weight < PhysiqueInfo.PhysiqueSubDatas[ n].weight: Temp = datatypes.FPhysiqueSubData() Temp = PhysiqueInfo.PhysiqueSubDatas[m] PhysiqueInfo.PhysiqueSubDatas[ m] = PhysiqueInfo.PhysiqueSubDatas[n] PhysiqueInfo.PhysiqueSubDatas[n] = Temp fSum3 = sum(PhysiqueSubData.weight for PhysiqueSubData in PhysiqueInfo.PhysiqueSubDatas) PhysiqueInfo.PhysiqueSubDatas[ 0].weight = PhysiqueInfo.PhysiqueSubDatas[ 0].weight / fSum3 PhysiqueInfo.PhysiqueSubDatas[ 1].weight = PhysiqueInfo.PhysiqueSubDatas[ 1].weight / fSum3 PhysiqueInfo.PhysiqueSubDatas[ 2].weight = PhysiqueInfo.PhysiqueSubDatas[ 2].weight / fSum3 PhysiqueInfo.Num = 3 except struct.error as err: errorhandling.HandleStructUnpackError(err)
def LoadBoneAni(self, Node, FileStream, Offset=None): try: Node.Name = binaryreader.ReadWord(FileStream) Node.BaseTranslation = datatypes.FVector( binaryreader.ReadFloat(FileStream, 3)) Node.BaseRotation = datatypes.FQuaternion( binaryreader.ReadFloat(FileStream, 4)) Node.BaseScale = datatypes.FVector( binaryreader.ReadInt(FileStream, 3)) AnimType_1 = datatypes.FAnimType( binaryreader.ReadInt(FileStream, 3)) if AnimType_1.Count > 0: Node.PositionKeyTrack.Count = AnimType_1.Count + 1 if AnimType_1.CountType == 10: for i in range(AnimType_1.Count): Frame = binaryreader.ReadInt(FileStream, 1)[0] ShortTuple = binaryreader.ReadUShort(FileStream, 3) FloatTuple = datatypes.ConvertShortToFloat(ShortTuple) PosKey = datatypes.FVecKey() PosKey.Frame = Frame PosKey.Vector = datatypes.FVector(FloatTuple) Node.PositionKeyTrack.Data.append(PosKey) LastPosKey = Node.PositionKeyTrack.Data[AnimType_1.Count - 1] Node.PositionKeyTrack.Data.append(LastPosKey) elif AnimType_1.CountType == 16: for i in range(AnimType_1.Count): PosKey = datatypes.FVecKey() PosKey.Vector = datatypes.FVector( binaryreader.ReadFloat(FileStream, 3)) PosKey.Frame = binaryreader.ReadInt(FileStream, 1)[0] Node.PositionKeyTrack.Data.append(PosKey) LastPosKey = Node.PositionKeyTrack.Data[AnimType_1.Count - 1] Node.PositionKeyTrack.Data.append(LastPosKey) else: Message = "{0} node error: RAnimType_1.CountType is incorrect.".format( Node.Name) filelogger.AddLog(globalvars.LogFileStream, Message, filelogger.ELogMessageType.Log_Error) return AnimType_2 = datatypes.FAnimType( binaryreader.ReadInt(FileStream, 3)) if AnimType_2.Count > 0: Node.RotationKeyTrack.Count = AnimType_2.Count + 1 if AnimType_2.CountType == 10: for i in range(AnimType_2.Count): Frame = binaryreader.ReadInt(FileStream, 1)[0] ShortTuple = binaryreader.ReadUShort(FileStream, 3) X, Y, Z = datatypes.ConvertShortToFloat(ShortTuple) W = 0 FTol = X * X + Y * Y + Z * Z if FTol <= 1.0: Sub1 = 1.0 - FTol FSqrt = math.sqrt(Sub1) W = FSqrt QuatKey = datatypes.FQuatKey() QuatKey.Frame = Frame QuatKey.Quat = datatypes.FQuaternion((X, Y, Z, W)) Node.RotationKeyTrack.Data.append(QuatKey) LastQuatKey = Node.RotationKeyTrack.Data[AnimType_2.Count - 1] Node.RotationKeyTrack.Data.append(LastQuatKey) elif AnimType_2.CountType == 16: for i in range(AnimType_2.Count): Frame = binaryreader.ReadInt(FileStream, 1)[0] X, Y, Z = binaryreader.ReadFloat(FileStream, 3) W = 0 FTol = X * X + Y * Y + Z * Z if FTol <= 1.0: Sub1 = 1.0 - FTol FSqrt = math.sqrt(Sub1) W = FSqrt QuatKey = datatypes.FQuatKey() QuatKey.Frame = Frame QuatKey.Quat = datatypes.FQuaternion((X, Y, Z, W)) Node.RotationKeyTrack.Data.append(QuatKey) LastQuatKey = Node.RotationKeyTrack.Data[AnimType_2.Count - 1] Node.RotationKeyTrack.Data.append(LastQuatKey) elif AnimType_2.CountType == 20: for i in range(AnimType_2.Count): QuatKey = datatypes.FQuatKey() QuatKey.Quat = datatypes.FQuaternion( binaryreader.ReadFloat(FileStream, 4)) QuatKey.Frame = binaryreader.ReadInt(FileStream, 1)[0] Node.RotationKeyTrack.Data.append(QuatKey) LastQuatKey = Node.RotationKeyTrack.Data[AnimType_2.Count - 1] Node.RotationKeyTrack.Data.append(LastQuatKey) else: Message = "{0} node error: RAnimType_2.CountType is incorrect.".format( Node.Name) filelogger.AddLog(globalvars.LogFileStream, Message, filelogger.ELogMessageType.Log_Error) return AnimType_3 = datatypes.FAnimType( binaryreader.ReadInt(FileStream, 3)) if AnimType_3.Count > 0: Node.ScaleKeyTrack.Count = AnimType_3.Count for i in range(AnimType_3.Count): ScaleKey = datatypes.FVecKey() ScaleKey.Vector = datatypes.FVector( binaryreader.ReadFloat(FileStream, 3)) ScaleKey.Frame = binaryreader.ReadInt(FileStream, 1)[0] Node.ScaleKeyTrack.Data.append(ScaleKey) except struct.error as err: errorhandling.HandleStructUnpackError(err)
def LoadEtc(self, Node, FileStream, Offset): try: PrimitiveType = binaryreader.ReadInt(FileStream, 1)[0] Node.VertexIndexCount = binaryreader.ReadInt(FileStream, 1)[0] for i in range(Node.VertexIndexCount): VertexIndex = datatypes.FVertexIndex() UnsignedShorts = binaryreader.ReadUShort(FileStream, 6) VertexIndex.p = UnsignedShorts[0] VertexIndex.n = UnsignedShorts[1] VertexIndex.uv = UnsignedShorts[2] VertexIndex.uv2 = UnsignedShorts[3] VertexIndex.n_tan = UnsignedShorts[4] VertexIndex.n_bin = UnsignedShorts[5] Node.VertexIndexTable.append(VertexIndex) Node.BoneCount = binaryreader.ReadInt(FileStream, 1)[0] for i in range(Node.BoneCount): Matrix = datatypes.FMatrix( binaryreader.ReadFloat(FileStream, 16)) Node.BoneTable.append(Matrix) for i in range(Node.BoneCount): BoneIndex = binaryreader.ReadUShort(FileStream, 1)[0] Node.BoneTableIndices.append(BoneIndex) Node.MaterialInfoCount = binaryreader.ReadInt(FileStream, 1)[0] for i in range(Node.MaterialInfoCount): MtrlTableInfo = datatypes.FMtrlTableInfo() if globalvars.CurrentEluFileVersion < raidflags.EXPORTER_MESH_VER9: MtrlTableInfo.MaterialID = binaryreader.ReadInt( FileStream, 1)[0] MtrlTableInfo.Offset = binaryreader.ReadUShort( FileStream, 1)[0] MtrlTableInfo.Count = binaryreader.ReadUShort( FileStream, 1)[0] MtrlTableInfo.SubMaterialIDForDrawMasking = binaryreader.ReadInt( FileStream, 1)[0] else: MtrlTableInfo.MaterialID = binaryreader.ReadInt( FileStream, 1)[0] MtrlTableInfo.Offset = binaryreader.ReadUShort( FileStream, 1)[0] MtrlTableInfo.Count = binaryreader.ReadUShort( FileStream, 1)[0] MtrlTableInfo.SubMaterialIDForDrawMasking = binaryreader.ReadInt( FileStream, 1)[0] Node.MaterialInfoTable.append(MtrlTableInfo) Node.FaceIndexCount = binaryreader.ReadInt(FileStream, 1)[0] for i in range(Node.FaceIndexCount): FaceIndex = binaryreader.ReadUShort(FileStream, 1)[0] Node.FaceIndexTable.append(FaceIndex) # @todo GetBipID Node.BoundingBox.vmin = datatypes.FVector( binaryreader.ReadFloat(FileStream, 3)) Node.BoundingBox.vmax = datatypes.FVector( binaryreader.ReadFloat(FileStream, 3)) # @todo fix bounding box except struct.error as err: errorhandling.HandleStructUnpackError(err)