internal static void Read(ResFileSwitchLoader loader, ShapeAnim shapeAnim)
        {
            if (loader.ResFile.VersionMajor2 == 9)
            {
                shapeAnim.Flags = (ShapeAnimFlags)loader.ReadUInt32();
            }
            else
            {
                loader.LoadHeaderBlock();
            }

            shapeAnim.Name      = loader.LoadString();
            shapeAnim.Path      = loader.LoadString();
            shapeAnim.BindModel = loader.Load <Model>();
            uint BindIndicesOffset           = loader.ReadOffset();
            uint VertexShapeAnimsArrayOffset = loader.ReadOffset();

            shapeAnim.UserData = loader.LoadDictValues <UserData>();
            if (loader.ResFile.VersionMajor2 < 9)
            {
                shapeAnim.Flags = (ShapeAnimFlags)loader.ReadInt16();
            }
            ushort numUserData        = loader.ReadUInt16();
            ushort numVertexShapeAnim = loader.ReadUInt16();
            ushort numKeyShapeAnim    = loader.ReadUInt16();

            shapeAnim.FrameCount = loader.ReadInt32();
            shapeAnim.BakedSize  = loader.ReadUInt32();
            ushort numCurve = loader.ReadUInt16();

            shapeAnim.BindIndices      = loader.LoadCustom(() => loader.ReadUInt16s(numVertexShapeAnim), BindIndicesOffset);
            shapeAnim.VertexShapeAnims = loader.LoadList <VertexShapeAnim>(numVertexShapeAnim, VertexShapeAnimsArrayOffset);
        }
Exemple #2
0
        public static void Read(ResFileSwitchLoader loader, VisibilityAnim visibilityAnim)
        {
            if (loader.ResFile.VersionMajor2 == 9)
            {
                visibilityAnim._flags = loader.ReadUInt16();
                loader.ReadUInt16(); //Padding
            }
            else
            {
                loader.LoadHeaderBlock();
            }
            visibilityAnim.Name      = loader.LoadString();
            visibilityAnim.Path      = loader.LoadString();
            visibilityAnim.BindModel = loader.Load <Model>();
            long BindIndicesOffset   = loader.ReadInt64();
            long CurveArrayOffset    = loader.ReadInt64();
            long BaseDataArrayOffset = loader.ReadInt64();
            long NameArrayOffset     = loader.ReadInt64();

            visibilityAnim.UserData = loader.LoadDictValues <UserData>();

            if (loader.ResFile.VersionMajor2 != 9)
            {
                visibilityAnim._flags = loader.ReadUInt16();
            }
            else
            {
                loader.ReadUInt16(); //Idk what this is
            }
            ushort numUserData = loader.ReadUInt16();

            visibilityAnim.FrameCount = loader.ReadInt32();
            ushort numAnim  = loader.ReadUInt16();
            ushort numCurve = loader.ReadUInt16();

            visibilityAnim.BakedSize = loader.ReadUInt32();

            visibilityAnim.BindIndices = loader.LoadCustom(() => loader.ReadUInt16s(numAnim), (uint)BindIndicesOffset);
            visibilityAnim.Names       = loader.LoadCustom(() => loader.LoadStrings(numAnim), (uint)NameArrayOffset); // Offset to name list.
            visibilityAnim.Curves      = loader.LoadList <AnimCurve>(numCurve, (uint)CurveArrayOffset);

            visibilityAnim.baseDataBytes = new List <byte>();
            visibilityAnim.BaseDataList  = loader.LoadCustom(() =>
            {
                bool[] baseData = new bool[numAnim];
                int i           = 0;
                while (i < numAnim)
                {
                    byte b = loader.ReadByte();
                    visibilityAnim.baseDataBytes.Add(b);
                    for (int j = 0; j < 8 && i < numAnim; j++)
                    {
                        baseData[i] = b.GetBit(j);
                    }
                    i++;
                }
                return(baseData);
            }, (uint)BaseDataArrayOffset);
        }
Exemple #3
0
        public static void Read(ResFileSwitchLoader loader, Shape shape)
        {
            if (loader.ResFile.VersionMajor2 == 9)
            {
                shape.Flags = loader.ReadEnum <ShapeFlags>(true);
            }
            else
            {
                loader.LoadHeaderBlock();
            }

            shape.Name         = loader.LoadString();
            shape.VertexBuffer = loader.Load <VertexBuffer>();
            long MeshArrayOffset         = loader.ReadOffset();
            long SkinBoneIndexListOffset = loader.ReadOffset();

            shape.KeyShapes = loader.LoadDictValues <KeyShape>();
            long BoundingBoxArrayOffset = loader.ReadOffset();
            long RadiusOffset           = 0;

            if (loader.ResFile.VersionMajor2 > 2 || loader.ResFile.VersionMajor > 0)
            {
                RadiusOffset = loader.ReadOffset();
                long UserPointer = loader.ReadInt64();
            }
            else
            {
                long UserPointer = loader.ReadInt64();
                shape.RadiusArray.Add(loader.ReadSingle());
            }
            if (loader.ResFile.VersionMajor2 != 9)
            {
                shape.Flags = loader.ReadEnum <ShapeFlags>(true);
            }
            ushort idx = loader.ReadUInt16();

            shape.MaterialIndex     = loader.ReadUInt16();
            shape.BoneIndex         = loader.ReadUInt16();
            shape.VertexBufferIndex = loader.ReadUInt16();
            ushort numSkinBoneIndex = loader.ReadUInt16();

            shape.VertexSkinCount = loader.ReadByte();
            byte numMesh       = loader.ReadByte();
            byte numKeys       = loader.ReadByte();
            byte numTargetAttr = loader.ReadByte();

            if (loader.ResFile.VersionMajor2 <= 2 && loader.ResFile.VersionMajor == 0)
            {
                loader.Seek(2); //padding
            }
            else if (loader.ResFile.VersionMajor2 == 9)
            {
                loader.Seek(2); //padding
            }
            else
            {
                loader.Seek(6); //padding
            }
            shape.Meshes          = numMesh == 0 ? new List <Mesh>() : loader.LoadList <Mesh>(numMesh, (uint)MeshArrayOffset).ToList();
            shape.SkinBoneIndices = numSkinBoneIndex == 0 ? new List <ushort>() : loader.LoadCustom(() => loader.ReadUInt16s(numSkinBoneIndex), (uint)SkinBoneIndexListOffset)?.ToList();

            if (RadiusOffset != 0)
            {
                shape.RadiusArray = numMesh == 0 ? new List <float>() : loader.LoadCustom(() => loader.ReadSingles(numMesh), (uint)RadiusOffset).ToList();
            }

            int boundingboxCount = shape.Meshes.Sum(x => x.SubMeshes.Count + 1);

            shape.SubMeshBoundings = boundingboxCount == 0 ? new List <Bounding>() : loader.LoadCustom(() =>
                                                                                                       loader.ReadBoundings(boundingboxCount), (uint)BoundingBoxArrayOffset)?.ToList();

            shape.SubMeshBoundingNodes = new List <BoundingNode>();
        }
        public static void Read(ResFileSwitchLoader loader, VisibilityAnim visibilityAnim)
        {
            if (loader.ResFile.VersionMajor2 == 9)
            {
                visibilityAnim._flags = loader.ReadUInt16();
                loader.ReadUInt16(); //Padding
            }
            else
            {
                loader.LoadHeaderBlock();
            }
            visibilityAnim.Name      = loader.LoadString();
            visibilityAnim.Path      = loader.LoadString();
            visibilityAnim.BindModel = loader.Load <Model>();
            long BindIndicesOffset   = loader.ReadInt64();
            long CurveArrayOffset    = loader.ReadInt64();
            long BaseDataArrayOffset = loader.ReadInt64();
            long NameArrayOffset     = loader.ReadInt64();

            visibilityAnim.UserData = loader.LoadDictValues <UserData>();

            if (loader.ResFile.VersionMajor2 != 9)
            {
                visibilityAnim._flags = loader.ReadUInt16();
            }
            else
            {
                loader.ReadUInt16(); //Idk what this is
            }
            ushort numUserData = loader.ReadUInt16();

            visibilityAnim.FrameCount = loader.ReadInt32();
            ushort numAnim  = loader.ReadUInt16();
            ushort numCurve = loader.ReadUInt16();

            visibilityAnim.BakedSize = loader.ReadUInt32();

            visibilityAnim.BindIndices = loader.LoadCustom(() => loader.ReadUInt16s(numAnim), (uint)BindIndicesOffset);
            visibilityAnim.Names       = loader.LoadCustom(() => loader.LoadStrings(numAnim), (uint)NameArrayOffset); // Offset to name list.
            visibilityAnim.Curves      = loader.LoadList <AnimCurve>(numCurve, (uint)CurveArrayOffset);

            visibilityAnim.baseDataBytes = new List <byte>();
            visibilityAnim.BaseDataList  = loader.LoadCustom(() =>
            {
                bool[] baseData = new bool[numAnim];
                int keyIndex    = 0;
                for (int i = 0; i < numAnim; i++)
                {
                    if (numAnim <= keyIndex)
                    {
                        break;
                    }

                    int value = loader.ReadInt32();

                    //Bit shift each key value
                    for (int j = 0; j < 32; j++)
                    {
                        if (numAnim <= keyIndex)
                        {
                            break;
                        }

                        bool set = (value & 0x1) != 0;
                        value  >>= 1;

                        baseData[keyIndex] = set;
                        keyIndex++;
                    }
                }
                return(baseData);
            }, (uint)BaseDataArrayOffset);
        }