Example #1
0
    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)
Example #2
0
    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)
Example #4
0
    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)
Example #7
0
 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)
Example #8
0
    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)
Example #9
0
    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
Example #10
0
    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)
Example #11
0
    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)
Example #14
0
    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)
Example #15
0
    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)
Example #17
0
    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)