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 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 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 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)