コード例 #1
0
        // ---- METHODS ------------------------------------------------------------------------------------------------

        void IResData.Load(ResFileLoader loader)
        {
            loader.CheckSignature(_signature);
            if (loader.IsSwitch)
            {
                Switch.LightAnimParser.Read((Switch.Core.ResFileSwitchLoader)loader, this);
            }
            else
            {
                Flags = loader.ReadEnum <LightAnimFlags>(true);
                ushort numUserData = loader.ReadUInt16();
                FrameCount = loader.ReadInt32();
                byte numCurve = loader.ReadByte();
                LightTypeIndex        = loader.ReadSByte();
                DistanceAttnFuncIndex = loader.ReadSByte();
                AngleAttnFuncIndex    = loader.ReadSByte();
                BakedSize             = loader.ReadUInt32();
                Name                 = loader.LoadString();
                LightTypeName        = loader.LoadString();
                DistanceAttnFuncName = loader.LoadString();
                AngleAttnFuncName    = loader.LoadString();
                Curves               = loader.LoadList <AnimCurve>(numCurve);
                BaseData             = loader.LoadCustom(() => new LightAnimData(loader, AnimatedFields));
                UserData             = loader.LoadDict <UserData>();
            }
        }
コード例 #2
0
ファイル: VertexBuffer.cs プロジェクト: shukenmg/BfresLibrary
        /// <summary>
        /// Initializes a new instance of the <see cref="Mesh"/> class.
        /// </summary>
        public VertexBuffer()
        {
            VertexSkinCount = 0;

            Attributes = new ResDict <VertexAttrib>();
            Buffers    = new List <Buffer>();
        }
コード例 #3
0
        // ---- CONSTRUCTORS & DESTRUCTOR ------------------------------------------------------------------------------

        /// <summary>
        /// Initializes a new instance of the <see cref="ResFile"/> class.
        /// </summary>
        public ResFile()
        {
            Name          = "";
            DataAlignment = 8192;

            VersionMajor  = 3;
            VersionMajor2 = 4;
            VersionMinor  = 0;
            VersionMinor2 = 4;

            //Initialize Dictionaries
            Models              = new ResDict <Model>();
            Textures            = new ResDict <TextureShared>();
            SkeletalAnims       = new ResDict <SkeletalAnim>();
            ShaderParamAnims    = new ResDict <MaterialAnim>();
            ColorAnims          = new ResDict <MaterialAnim>();
            TexSrtAnims         = new ResDict <MaterialAnim>();
            TexPatternAnims     = new ResDict <MaterialAnim>();
            BoneVisibilityAnims = new ResDict <VisibilityAnim>();
            MatVisibilityAnims  = new ResDict <MaterialAnim>();
            ShapeAnims          = new ResDict <ShapeAnim>();
            SceneAnims          = new ResDict <SceneAnim>();
            ExternalFiles       = new ResDict <ExternalFile>();
            MaterialAnims       = new ResDict <MaterialAnim>();
        }
コード例 #4
0
ファイル: Skeleton.cs プロジェクト: shukenmg/BfresLibrary
 /// <summary>
 /// Initializes a new instance of the <see cref="Skeleton"/> class.
 /// </summary>
 public Skeleton()
 {
     MatrixToBoneList     = new List <ushort>();
     InverseModelMatrices = new List <Matrix3x4>();
     Bones         = new ResDict <Bone>();
     FlagsRotation = SkeletonFlagsRotation.EulerXYZ;
     FlagsScaling  = SkeletonFlagsScaling.Maya;
 }
コード例 #5
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ShaderAssign"/> class.
 /// </summary>
 public ShaderAssign()
 {
     ShaderArchiveName = "";
     ShadingModelName  = "";
     Revision          = 0;
     AttribAssigns     = new ResDict <ResString>();
     SamplerAssigns    = new ResDict <ResString>();
     ShaderOptions     = new ResDict <ResString>();
 }
コード例 #6
0
        /// <summary>
        /// Initializes a new instance of the <see cref="SceneAnim"/> class.
        /// </summary>
        public SceneAnim()
        {
            Name = "";
            Path = "";

            CameraAnims = new ResDict <CameraAnim>();
            LightAnims  = new ResDict <LightAnim>();
            FogAnims    = new ResDict <FogAnim>();
            UserData    = new ResDict <UserData>();
        }
コード例 #7
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Model"/> class.
 /// </summary>
 public Model()
 {
     Name          = "";
     Path          = "";
     Skeleton      = new Skeleton();
     VertexBuffers = new List <VertexBuffer>();
     Shapes        = new ResDict <Shape>();
     Materials     = new ResDict <Material>();
     UserData      = new ResDict <UserData>();
 }
コード例 #8
0
        // ---- METHODS ------------------------------------------------------------------------------------------------

        void IResData.Load(ResFileLoader loader)
        {
            loader.CheckSignature(_signature);
            if (loader.IsSwitch)
            {
                Switch.VisibilityAnimParser.Read((Switch.Core.ResFileSwitchLoader)loader, this);
            }
            else
            {
                Name   = loader.LoadString();
                Path   = loader.LoadString();
                _flags = loader.ReadUInt16();
                ushort numAnim  = 0;
                ushort numCurve = 0;
                if (loader.ResFile.Version >= 0x03040000)
                {
                    ushort numUserData = loader.ReadUInt16();
                    FrameCount = loader.ReadInt32();
                    numAnim    = loader.ReadUInt16();
                    numCurve   = loader.ReadUInt16();
                    BakedSize  = loader.ReadUInt32();
                }
                else
                {
                    FrameCount = loader.ReadInt16();
                    numAnim    = loader.ReadUInt16();
                    numCurve   = loader.ReadUInt16();
                    ushort numUserData = loader.ReadUInt16();
                    BakedSize = loader.ReadUInt32();
                    int padding2 = loader.ReadInt16();
                }
                BindModel     = loader.Load <Model>();
                BindIndices   = loader.LoadCustom(() => loader.ReadUInt16s(numAnim));
                Names         = loader.LoadCustom(() => loader.LoadStrings(numAnim)); // Offset to name list.
                Curves        = loader.LoadList <AnimCurve>(numCurve);
                baseDataBytes = new List <byte>();
                BaseDataList  = loader.LoadCustom(() =>
                {
                    bool[] baseData = new bool[numAnim];
                    int i           = 0;
                    while (i < numAnim)
                    {
                        byte b = loader.ReadByte();
                        baseDataBytes.Add(b);
                        for (int j = 0; j < 8 && i < numAnim; j++)
                        {
                            baseData[i] = b.GetBit(j);
                        }
                        i++;
                    }
                    return(baseData);
                });
                UserData = loader.LoadDict <UserData>();
            }
        }
コード例 #9
0
ファイル: CameraAnim.cs プロジェクト: shukenmg/BfresLibrary
        /// <summary>
        /// Initializes a new instance of the <see cref="CameraAnim"/> class.
        /// </summary>
        public CameraAnim()
        {
            Name       = "";
            Flags      = CameraAnimFlags.EulerZXY;
            FrameCount = 0;
            BakedSize  = 0;

            BaseData = new CameraAnimData();
            Curves   = new List <AnimCurve>();
            UserData = new ResDict <UserData>();
        }
コード例 #10
0
ファイル: FogAnim.cs プロジェクト: shukenmg/BfresLibrary
        /// <summary>
        /// Initializes a new instance of the <see cref="FogAnim"/> class.
        /// </summary>
        public FogAnim()
        {
            Name = "";
            DistanceAttnFuncName = "";
            Flags                 = 0;
            FrameCount            = 0;
            BakedSize             = 0;
            DistanceAttnFuncIndex = 0;

            BaseData = new FogAnimData();
            Curves   = new List <AnimCurve>();
            UserData = new ResDict <UserData>();
        }
コード例 #11
0
ファイル: ShapeAnim.cs プロジェクト: SDarkMagic/BfresLibrary
 /// <summary>
 /// Initializes a new instance of the <see cref="ShapeAnim"/> class.
 /// </summary>
 public ShapeAnim()
 {
     Name             = "";
     Path             = "";
     Flags            = 0;
     BindModel        = new Model();
     BindIndices      = new ushort[0];
     VertexShapeAnims = new List <VertexShapeAnim>();
     FrameCount       = 0;
     BakedSize        = 0;
     BindIndices      = new ushort[0];
     UserData         = new ResDict <UserData>();
 }
コード例 #12
0
 /// <summary>
 /// Initializes a new instance of the <see cref="VisibilityAnim"/> class.
 /// </summary>
 public VisibilityAnim()
 {
     Name         = "";
     Path         = "";
     Flags        = 0;
     FrameCount   = 1;
     BakedSize    = 0;
     Curves       = new List <AnimCurve>();
     BindIndices  = new ushort[0];
     Names        = new List <string>();
     BaseDataList = new bool[0];
     UserData     = new ResDict <UserData>();
 }
コード例 #13
0
 /// <summary>
 /// Initializes a new instance of the <see cref="SkeletalAnim"/> class.
 /// </summary>
 public SkeletalAnim()
 {
     Name = "";
     Path = "";
     FlagsAnimSettings = 0;
     FlagsScale        = SkeletalAnimFlagsScale.Maya;
     FlagsRotate       = SkeletalAnimFlagsRotate.EulerXYZ;
     FrameCount        = 0;
     BakedSize         = 0;
     BoneAnims         = new List <BoneAnim>();
     BindSkeleton      = new Skeleton();
     BindIndices       = new ushort[0];
     UserData          = new ResDict <UserData>();
 }
コード例 #14
0
ファイル: MaterialAnim.cs プロジェクト: shukenmg/BfresLibrary
        /// <summary>
        /// Initializes a new instance of the <see cref="MaterialAnim"/> class.
        /// </summary>
        public MaterialAnim()
        {
            Name             = "";
            Path             = "";
            BindModel        = new Model();
            BindIndices      = new ushort[0];
            TextureNames     = new ResDict <TextureRef>();
            TextureBindArray = new List <long>();

            Flags      = 0;
            FrameCount = 1;
            BakedSize  = 0;

            MaterialAnimDataList = new List <MaterialAnimData>();
            UserData             = new ResDict <UserData>();
        }
コード例 #15
0
ファイル: Material.cs プロジェクト: SDarkMagic/BfresLibrary
        /// <summary>
        /// Initializes a new instance of the <see cref="Material"/> class.
        /// </summary>
        public Material()
        {
            Name  = "";
            Flags = MaterialFlags.Visible;

            ShaderAssign = new ShaderAssign();

            RenderInfos  = new ResDict <RenderInfo>();
            TextureRefs  = new List <TextureRef>();
            Samplers     = new ResDict <Sampler>();
            UserData     = new ResDict <UserData>();
            ShaderParams = new ResDict <ShaderParam>();

            ShaderParamData = new byte[0];
            VolatileFlags   = new byte[0];
        }
コード例 #16
0
        /// <summary>
        /// Initializes a new instance of the <see cref="LightAnim"/> class.
        /// </summary>
        public LightAnim()
        {
            Name = "";
            DistanceAttnFuncName = "";
            AngleAttnFuncName    = "";
            Flags                 = 0;
            LightTypeIndex        = 0;
            AnimatedFields        = 0;
            FrameCount            = 0;
            BakedSize             = 0;
            DistanceAttnFuncIndex = 0;
            AngleAttnFuncIndex    = 0;

            BaseData = new LightAnimData();
            Curves   = new List <AnimCurve>();
            UserData = new ResDict <UserData>();
        }
コード例 #17
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Shape"/> class.
 /// </summary>
 public Shape()
 {
     Name                   = "";
     Flags                  = ShapeFlags.HasVertexBuffer;
     MaterialIndex          = 0;
     BoneIndex              = 0;
     VertexBufferIndex      = 0;
     RadiusArray            = new List <float>();
     VertexSkinCount        = 0;
     TargetAttribCount      = 0;
     Meshes                 = new List <Mesh>();
     SkinBoneIndices        = new List <ushort>();
     KeyShapes              = new ResDict <KeyShape>();
     SubMeshBoundings       = new List <Bounding>();
     SubMeshBoundingNodes   = new List <BoundingNode>();
     SubMeshBoundingIndices = new List <ushort>();
     VertexBuffer           = new VertexBuffer();
 }
コード例 #18
0
ファイル: Bone.cs プロジェクト: shukenmg/BfresLibrary
        /// <summary>
        /// Initializes a new instance of the <see cref="Bone"/> class.
        /// </summary>
        public Bone()
        {
            Name              = "";
            UserData          = new ResDict <UserData>();
            ParentIndex       = -1;
            SmoothMatrixIndex = -1;
            RigidMatrixIndex  = -1;
            BillboardIndex    = -1;

            Scale    = new Vector3F(1, 1, 1);
            Rotation = new Vector4F(0, 0, 0, 0);
            Position = new Vector3F(0, 0, 0);

            Flags                    = BoneFlags.Visible;
            FlagsRotation            = BoneFlagsRotation.EulerXYZ;
            FlagsBillboard           = BoneFlagsBillboard.None;
            FlagsTransform           = BoneFlagsTransform.None;
            FlagsTransformCumulative = BoneFlagsTransformCumulative.None;
        }
コード例 #19
0
        // ---- METHODS ------------------------------------------------------------------------------------------------

        void IResData.Load(ResFileLoader loader)
        {
            loader.CheckSignature(_signature);
            if (loader.IsSwitch)
            {
                Switch.ShapeAnimParser.Read((Switch.Core.ResFileSwitchLoader)loader, this);
            }
            else
            {
                Name  = loader.LoadString();
                Path  = loader.LoadString();
                Flags = loader.ReadEnum <ShapeAnimFlags>(true);

                ushort numUserData;
                ushort numVertexShapeAnim;
                ushort numKeyShapeAnim;
                ushort numCurve;
                if (loader.ResFile.Version >= 0x03040000)
                {
                    numUserData        = loader.ReadUInt16();
                    FrameCount         = loader.ReadInt32();
                    numVertexShapeAnim = loader.ReadUInt16();
                    numKeyShapeAnim    = loader.ReadUInt16();
                    numCurve           = loader.ReadUInt16();
                    loader.Seek(2);
                    BakedSize = loader.ReadUInt32();
                }
                else
                {
                    FrameCount         = loader.ReadUInt16();
                    numVertexShapeAnim = loader.ReadUInt16();
                    numKeyShapeAnim    = loader.ReadUInt16();
                    numUserData        = loader.ReadUInt16();
                    numCurve           = loader.ReadUInt16();
                    BakedSize          = loader.ReadUInt32();
                }

                BindModel        = loader.Load <Model>();
                BindIndices      = loader.LoadCustom(() => loader.ReadUInt16s(numVertexShapeAnim));
                VertexShapeAnims = loader.LoadList <VertexShapeAnim>(numVertexShapeAnim);
                UserData         = loader.LoadDict <UserData>();
            }
        }
コード例 #20
0
ファイル: CameraAnim.cs プロジェクト: shukenmg/BfresLibrary
        // ---- METHODS ------------------------------------------------------------------------------------------------

        void IResData.Load(ResFileLoader loader)
        {
            loader.CheckSignature(_signature);
            if (loader.IsSwitch)
            {
                Switch.CameraAnimParser.Read((Switch.Core.ResFileSwitchLoader)loader, this);
            }
            else
            {
                Flags = loader.ReadEnum <CameraAnimFlags>(false);
                loader.Seek(2);
                FrameCount = loader.ReadInt32();
                byte numCurve = loader.ReadByte();
                loader.Seek(1);
                ushort numUserData = loader.ReadUInt16();
                BakedSize = loader.ReadUInt32();
                Name      = loader.LoadString();
                Curves    = loader.LoadList <AnimCurve>(numCurve);
                BaseData  = loader.LoadCustom(() => new CameraAnimData(loader));
                UserData  = loader.LoadDict <UserData>();
            }
        }
コード例 #21
0
        internal void PreSave()
        {
            Version = SaveVersion();
            bool calculateBakeSizes = true;

            if (MatVisibilityAnims == null)
            {
                MatVisibilityAnims = new ResDict <MaterialAnim>();
            }

            for (int i = 0; i < Models.Count; i++)
            {
                for (int s = 0; s < Models[i].Shapes.Count; s++)
                {
                    Models[i].Shapes[s].VertexBuffer = Models[i].VertexBuffers[Models[i].Shapes[s].VertexBufferIndex];

                    //Link texture sections for wii u texture refs
                    if (Textures != null)
                    {
                        foreach (var texRef in Models[i].Materials[Models[i].Shapes[s].MaterialIndex].TextureRefs)
                        {
                            if (Textures.ContainsKey(texRef.Name))
                            {
                                texRef.Texture = Textures[texRef.Name];
                            }
                        }
                    }
                }
            }

            for (int i = 0; i < SkeletalAnims.Count; i++)
            {
                int curveIndex = 0;
                if (calculateBakeSizes)
                {
                    SkeletalAnims[i].BakedSize = 0;
                }
                for (int s = 0; s < SkeletalAnims[i].BoneAnims.Count; s++)
                {
                    SkeletalAnims[i].BoneAnims[s].BeginCurve = curveIndex;
                    curveIndex += SkeletalAnims[i].BoneAnims[s].Curves.Count;

                    if (calculateBakeSizes)
                    {
                        foreach (var curve in SkeletalAnims[i].BoneAnims[s].Curves)
                        {
                            SkeletalAnims[i].BakedSize += curve.CalculateBakeSize(IsPlatformSwitch);
                        }
                    }
                }
            }

            // Update ShapeAnim instances.
            foreach (ShapeAnim anim in ShapeAnims.Values)
            {
                int curveIndex = 0;
                int infoIndex  = 0;
                if (calculateBakeSizes)
                {
                    anim.BakedSize = 0;
                }
                foreach (VertexShapeAnim subAnim in anim.VertexShapeAnims)
                {
                    subAnim.BeginCurve        = curveIndex;
                    subAnim.BeginKeyShapeAnim = infoIndex;
                    curveIndex += subAnim.Curves.Count;
                    infoIndex  += subAnim.KeyShapeAnimInfos.Count;

                    if (calculateBakeSizes)
                    {
                        foreach (var curve in subAnim.Curves)
                        {
                            anim.BakedSize += curve.CalculateBakeSize(IsPlatformSwitch);
                        }
                    }
                }
            }

            foreach (var anim in TexPatternAnims.Values)
            {
                anim.signature = IsPlatformSwitch ? "FMAA" : "FTXP";
                int curveIndex = 0;
                int infoIndex  = 0;
                if (calculateBakeSizes)
                {
                    anim.BakedSize = 0;
                }
                foreach (var subAnim in anim.MaterialAnimDataList)
                {
                    if (subAnim.Curves.Count > 0)
                    {
                        subAnim.TexturePatternCurveIndex = curveIndex;
                    }
                    subAnim.InfoIndex = infoIndex;
                    curveIndex       += subAnim.Curves.Count;
                    infoIndex        += subAnim.PatternAnimInfos.Count;

                    if (calculateBakeSizes)
                    {
                        foreach (var curve in subAnim.Curves)
                        {
                            anim.BakedSize += curve.CalculateBakeSize(IsPlatformSwitch);
                        }
                    }
                }
            }

            foreach (var anim in TexSrtAnims.Values)
            {
                anim.signature = IsPlatformSwitch ? "FMAA" : "FSHU";
                int curveIndex = 0;
                int infoIndex  = 0;
                if (calculateBakeSizes)
                {
                    anim.BakedSize = 0;
                }
                foreach (var subAnim in anim.MaterialAnimDataList)
                {
                    if (subAnim.Curves.Count > 0)
                    {
                        subAnim.TexturePatternCurveIndex = curveIndex;
                    }
                    subAnim.InfoIndex = infoIndex;
                    curveIndex       += subAnim.Curves.Count;
                    infoIndex        += subAnim.PatternAnimInfos.Count;

                    if (calculateBakeSizes)
                    {
                        foreach (var curve in subAnim.Curves)
                        {
                            anim.BakedSize += curve.CalculateBakeSize(IsPlatformSwitch);
                        }
                    }
                }
            }

            foreach (var anim in ColorAnims.Values)
            {
                anim.signature = IsPlatformSwitch ? "FMAA" : "FSHU";
                int curveIndex = 0;
                int infoIndex  = 0;
                if (calculateBakeSizes)
                {
                    anim.BakedSize = 0;
                }
                foreach (var subAnim in anim.MaterialAnimDataList)
                {
                    if (subAnim.Curves.Count > 0)
                    {
                        subAnim.TexturePatternCurveIndex = curveIndex;
                    }
                    subAnim.InfoIndex = infoIndex;
                    curveIndex       += subAnim.Curves.Count;
                    infoIndex        += subAnim.PatternAnimInfos.Count;

                    if (calculateBakeSizes)
                    {
                        foreach (var curve in subAnim.Curves)
                        {
                            anim.BakedSize += curve.CalculateBakeSize(IsPlatformSwitch);
                        }
                    }
                }
            }

            foreach (var anim in ShaderParamAnims.Values)
            {
                anim.signature = IsPlatformSwitch ? "FMAA" : "FSHU";
                int curveIndex = 0;
                int infoIndex  = 0;
                if (calculateBakeSizes)
                {
                    anim.BakedSize = 0;
                }
                foreach (var subAnim in anim.MaterialAnimDataList)
                {
                    if (subAnim.Curves.Count > 0)
                    {
                        subAnim.ShaderParamCurveIndex = curveIndex;
                    }
                    subAnim.InfoIndex = infoIndex;
                    curveIndex       += subAnim.Curves.Count;
                    infoIndex        += subAnim.ParamAnimInfos.Count;

                    if (calculateBakeSizes)
                    {
                        foreach (var curve in subAnim.Curves)
                        {
                            anim.BakedSize += curve.CalculateBakeSize(IsPlatformSwitch);
                        }
                    }
                }
            }

            foreach (var anim in MatVisibilityAnims.Values)
            {
                int curveIndex = 0;
                int infoIndex  = 0;
                if (calculateBakeSizes)
                {
                    anim.BakedSize = 0;
                }
                foreach (var subAnim in anim.MaterialAnimDataList)
                {
                    if (subAnim.Curves.Count > 0)
                    {
                        subAnim.VisalCurveIndex = curveIndex;
                    }
                    curveIndex += subAnim.Curves.Count;

                    if (calculateBakeSizes)
                    {
                        foreach (var curve in subAnim.Curves)
                        {
                            anim.BakedSize += curve.CalculateBakeSize(IsPlatformSwitch);
                        }
                    }
                }
            }

            foreach (var anim in SceneAnims.Values)
            {
                foreach (var camAnim in anim.CameraAnims.Values)
                {
                    if (calculateBakeSizes)
                    {
                        foreach (var curve in camAnim.Curves)
                        {
                            camAnim.BakedSize += curve.CalculateBakeSize(IsPlatformSwitch);
                        }
                    }
                }
            }

            foreach (var anim in BoneVisibilityAnims.Values)
            {
                anim.BakedSize = 0;
                foreach (var curve in anim.Curves)
                {
                    anim.BakedSize += curve.CalculateBakeSize(IsPlatformSwitch);
                }
            }

            if (IsPlatformSwitch)
            {
                MaterialAnims.Clear();
                foreach (var anim in ShaderParamAnims.Values)
                {
                    MaterialAnims.Add(anim.Name, anim);
                }

                foreach (var anim in TexSrtAnims.Values)
                {
                    MaterialAnims.Add(anim.Name, anim);
                }

                foreach (var anim in ColorAnims.Values)
                {
                    MaterialAnims.Add(anim.Name, anim);
                }

                foreach (var anim in TexPatternAnims.Values)
                {
                    MaterialAnims.Add(anim.Name, anim);
                }

                foreach (var anim in MatVisibilityAnims.Values)
                {
                    MaterialAnims.Add(anim.Name, anim);
                }

                for (int i = 0; i < MaterialAnims.Count; i++)
                {
                    MaterialAnims[i].signature = "FMAA";
                }
            }

            //Custom external file loading
            foreach (var file in ExternalFiles)
            {
                if (file.Value.LoadedFileData is Brtcamera)
                {
                    var cam = file.Value.LoadedFileData as Brtcamera;
                    cam.IsBigEndian = !IsPlatformSwitch;
                    var mem = new MemoryStream();
                    cam.Save(mem);
                    file.Value.Data = mem.ToArray();
                }
            }
        }
コード例 #22
0
ファイル: MaterialAnim.cs プロジェクト: shukenmg/BfresLibrary
        void IResData.Save(ResFileSaver saver)
        {
            saver.WriteSignature(signature);
            if (signature == "FMAA")
            {
                if (saver.ResFile.VersionMajor2 == 9)
                {
                    saver.Write(Flags, true);
                    saver.Seek(2);
                }
                else
                {
                    saver.Seek(12);
                }

                if (TextureBindArray == null || TextureNames.Count != TextureBindArray.Count)
                {
                    TextureBindArray = new long[TextureNames.Count].ToList();
                    for (int i = 0; i < TextureNames.Count; i++)
                    {
                        TextureBindArray[i] = -1;
                    }
                }

                ((Switch.Core.ResFileSwitchSaver)saver).SaveRelocateEntryToSection(saver.Position, 2, 1, 0, 1, "Material Animation");
                saver.SaveString(Name);
                saver.SaveString(Path);
                saver.Write(0L); //Bind Model
                ((Switch.Core.ResFileSwitchSaver)saver).SaveRelocateEntryToSection(saver.Position, 7, 1, 0, 1, "Material Animation");
                PosBindIndicesOffset      = saver.SaveOffset();
                PosMatAnimDataOffset      = saver.SaveOffset();
                PosTextureNamesUnkOffset  = saver.SaveOffset();
                PosTextureNamesOffset     = saver.SaveOffset();
                PosUserDataOffset         = saver.SaveOffset();
                PosUserDataDictOffset     = saver.SaveOffset();
                PosTextureBindArrayOffset = saver.SaveOffset();
                if (saver.ResFile.VersionMajor2 != 9)
                {
                    saver.Write(Flags, true);
                }

                if (saver.ResFile.VersionMajor2 == 9)
                {
                    saver.Write(FrameCount);
                    saver.Write(BakedSize);
                    saver.Write((ushort)UserData.Count);
                    saver.Write((ushort)MaterialAnimDataList.Count);
                    saver.Write((ushort)MaterialAnimDataList.Sum((x) => x.Curves.Count));
                }
                else
                {
                    saver.Write((ushort)UserData.Count);
                    saver.Write((ushort)MaterialAnimDataList.Count);
                    saver.Write((ushort)MaterialAnimDataList.Sum((x) => x.Curves.Count));
                    saver.Write(FrameCount);
                    saver.Write(BakedSize);
                }

                saver.Write((ushort)MaterialAnimDataList.Sum((x) => x.ParamCount));
                saver.Write((ushort)MaterialAnimDataList.Sum((x) => x.TexturePatternCount));
                saver.Write((ushort)MaterialAnimDataList.Sum((x) => x.VisibilyCount));
                saver.Write(TextureNames != null ? (ushort)TextureNames.Count : (ushort)0);
                if (saver.ResFile.VersionMajor2 == 9)
                {
                    saver.Write((ushort)0);
                }
            }
            else if (signature == "FSHU")
            {
                saver.SaveString(Name);
                saver.SaveString(Path);
                saver.Write((uint)Flags);
                if (saver.ResFile.Version >= 0x03040000)
                {
                    saver.Write(FrameCount);
                    saver.Write((ushort)MaterialAnimDataList.Count);
                    saver.Write((ushort)UserData.Count);

                    int curveCount = MaterialAnimDataList.Sum((x) => x.Curves.Count);
                    foreach (var mat in MaterialAnimDataList)
                    {
                        curveCount += mat.ParamAnimInfos.Sum((x) => x.ConstantCount);
                    }

                    saver.Write(curveCount);
                    saver.Write(MaterialAnimDataList.Sum((x) => x.Curves.Count));
                    saver.Write(BakedSize);
                }
                else
                {
                    saver.Write((ushort)FrameCount);
                    saver.Write((ushort)MaterialAnimDataList.Count);
                    saver.Write(UnknownValue);
                    saver.Write(MaterialAnimDataList.Sum((x) => x.Curves.Count));
                    saver.Write(BakedSize);
                    saver.Write(0);
                }

                PosBindModelOffset   = saver.SaveOffsetPos();
                PosBindIndicesOffset = saver.SaveOffsetPos();
                PosMatAnimDataOffset = saver.SaveOffsetPos();
                PosUserDataOffset    = saver.SaveOffsetPos();
            }
            else if (signature == "FTXP")
            {
                if (TextureNames == null)
                {
                    TextureNames = new ResDict <TextureRef>();
                }
                if (MaterialAnimDataList == null)
                {
                    MaterialAnimDataList = new List <MaterialAnimData>();
                }

                saver.SaveString(Name);
                saver.SaveString(Path);
                saver.Write(Flags, true);

                if (saver.ResFile.Version > 0x03040000 && saver.ResFile.Version < 0x03040002)
                {
                    saver.Write((ushort)UserData.Count);
                    saver.Write(FrameCount);
                    saver.Write((ushort)TextureNames.Count);
                    saver.Write((ushort)MaterialAnimDataList.Count);
                    saver.Write(MaterialAnimDataList.Sum((x) => x.PatternAnimInfos.Count));
                    saver.Write(MaterialAnimDataList.Sum((x) => x.Curves.Count));
                    saver.Write(BakedSize);
                }
                else if (saver.ResFile.Version >= 0x03040000)
                {
                    saver.Write((ushort)UserData.Count);
                    saver.Write(FrameCount);
                    saver.Write((ushort)TextureNames.Count);
                    saver.Write((ushort)MaterialAnimDataList.Count);
                    saver.Write(MaterialAnimDataList.Sum((x) => x.PatternAnimInfos.Count));
                    saver.Write(MaterialAnimDataList.Sum((x) => x.Curves.Count));
                    saver.Write(BakedSize);
                }
                else
                {
                    saver.Write((ushort)FrameCount);
                    saver.Write((ushort)TextureNames.Count);
                    saver.Write((ushort)MaterialAnimDataList.Count);
                    saver.Write((ushort)UserData.Count);
                    saver.Write((ushort)MaterialAnimDataList.Sum((x) => x.PatternAnimInfos.Count));
                    saver.Write(MaterialAnimDataList.Sum((x) => x.Curves.Count));
                    saver.Write(BakedSize);
                    saver.Seek(4);
                }
                saver.Save(BindModel);
                saver.SaveCustom(BindIndices, () => saver.Write(BindIndices));
                saver.SaveCustom(MaterialAnimDataList, () =>
                {
                    foreach (var matAnim in MaterialAnimDataList)
                    {
                        matAnim.Save(saver, signature);
                    }
                });

                if (saver.ResFile.Version >= 0x03040002)
                {
                    saver.SaveDict(TextureNames);
                }
                else
                {
                    saver.SaveList(TextureNames.Values.ToList());
                }
                saver.SaveDict(UserData);
            }
        }
コード例 #23
0
        internal void PreSave()
        {
            Version = SaveVersion();

            if (MatVisibilityAnims == null)
            {
                MatVisibilityAnims = new ResDict <MaterialAnim>();
            }

            for (int i = 0; i < Models.Count; i++)
            {
                for (int s = 0; s < Models[i].Shapes.Count; s++)
                {
                    Models[i].Shapes[s].VertexBuffer = Models[i].VertexBuffers[Models[i].Shapes[s].VertexBufferIndex];

                    //Link texture sections for wii u texture refs
                    if (Textures != null)
                    {
                        foreach (var texRef in Models[i].Materials[Models[i].Shapes[s].MaterialIndex].TextureRefs)
                        {
                            if (Textures.ContainsKey(texRef.Name))
                            {
                                texRef.Texture = Textures[texRef.Name];
                            }
                        }
                    }
                }
            }

            for (int i = 0; i < SkeletalAnims.Count; i++)
            {
                int curveIndex = 0;
                SkeletalAnims[i].BakedSize = 0;
                for (int s = 0; s < SkeletalAnims[i].BoneAnims.Count; s++)
                {
                    SkeletalAnims[i].BoneAnims[s].BeginCurve = curveIndex;
                    curveIndex += SkeletalAnims[i].BoneAnims[s].Curves.Count;

                    foreach (var curve in SkeletalAnims[i].BoneAnims[s].Curves)
                    {
                        SkeletalAnims[i].BakedSize += curve.CalculateBakeSize(IsPlatformSwitch);
                    }
                }
            }

            // Update ShapeAnim instances.
            foreach (ShapeAnim anim in ShapeAnims.Values)
            {
                int curveIndex = 0;
                int infoIndex  = 0;
                anim.BakedSize = 0;
                foreach (VertexShapeAnim subAnim in anim.VertexShapeAnims)
                {
                    subAnim.BeginCurve        = curveIndex;
                    subAnim.BeginKeyShapeAnim = infoIndex;
                    curveIndex += subAnim.Curves.Count;
                    infoIndex  += subAnim.KeyShapeAnimInfos.Count;

                    foreach (var curve in subAnim.Curves)
                    {
                        anim.BakedSize += curve.CalculateBakeSize(IsPlatformSwitch);
                    }
                }
            }

            foreach (var anim in TexPatternAnims.Values)
            {
                int curveIndex = 0;
                int infoIndex  = 0;
                anim.BakedSize = 0;
                foreach (var subAnim in anim.MaterialAnimDataList)
                {
                    if (subAnim.Curves.Count > 0)
                    {
                        subAnim.TexturePatternCurveIndex = curveIndex;
                    }
                    subAnim.InfoIndex = infoIndex;
                    curveIndex       += subAnim.Curves.Count;
                    infoIndex        += subAnim.PatternAnimInfos.Count;

                    foreach (var curve in subAnim.Curves)
                    {
                        anim.BakedSize += curve.CalculateBakeSize(IsPlatformSwitch);
                    }
                }
            }

            foreach (var anim in TexSrtAnims.Values)
            {
                int curveIndex = 0;
                int infoIndex  = 0;
                anim.BakedSize = 0;
                foreach (var subAnim in anim.MaterialAnimDataList)
                {
                    if (subAnim.Curves.Count > 0)
                    {
                        subAnim.TexturePatternCurveIndex = curveIndex;
                    }
                    subAnim.InfoIndex = infoIndex;
                    curveIndex       += subAnim.Curves.Count;
                    infoIndex        += subAnim.PatternAnimInfos.Count;

                    foreach (var curve in subAnim.Curves)
                    {
                        anim.BakedSize += curve.CalculateBakeSize(IsPlatformSwitch);
                    }
                }
            }

            foreach (var anim in ColorAnims.Values)
            {
                int curveIndex = 0;
                int infoIndex  = 0;
                anim.BakedSize = 0;
                foreach (var subAnim in anim.MaterialAnimDataList)
                {
                    if (subAnim.Curves.Count > 0)
                    {
                        subAnim.TexturePatternCurveIndex = curveIndex;
                    }
                    subAnim.InfoIndex = infoIndex;
                    curveIndex       += subAnim.Curves.Count;
                    infoIndex        += subAnim.PatternAnimInfos.Count;

                    foreach (var curve in subAnim.Curves)
                    {
                        anim.BakedSize += curve.CalculateBakeSize(IsPlatformSwitch);
                    }
                }
            }

            foreach (var anim in ShaderParamAnims.Values)
            {
                int curveIndex = 0;
                int infoIndex  = 0;
                anim.BakedSize = 0;
                foreach (var subAnim in anim.MaterialAnimDataList)
                {
                    if (subAnim.Curves.Count > 0)
                    {
                        subAnim.ShaderParamCurveIndex = curveIndex;
                    }
                    subAnim.InfoIndex = infoIndex;
                    curveIndex       += subAnim.Curves.Count;
                    infoIndex        += subAnim.ParamAnimInfos.Count;

                    foreach (var curve in subAnim.Curves)
                    {
                        anim.BakedSize += curve.CalculateBakeSize(IsPlatformSwitch);
                    }
                }
            }

            foreach (var anim in MatVisibilityAnims.Values)
            {
                int curveIndex = 0;
                int infoIndex  = 0;
                anim.BakedSize = 0;
                foreach (var subAnim in anim.MaterialAnimDataList)
                {
                    if (subAnim.Curves.Count > 0)
                    {
                        subAnim.VisalCurveIndex = curveIndex;
                    }
                    curveIndex += subAnim.Curves.Count;

                    foreach (var curve in subAnim.Curves)
                    {
                        anim.BakedSize += curve.CalculateBakeSize(IsPlatformSwitch);
                    }
                }
            }

            foreach (var anim in BoneVisibilityAnims.Values)
            {
                anim.BakedSize = 0;
                foreach (var curve in anim.Curves)
                {
                    anim.BakedSize += curve.CalculateBakeSize(IsPlatformSwitch);
                }
            }

            if (IsPlatformSwitch)
            {
                MaterialAnims.Clear();
                foreach (var anim in TexPatternAnims.Values)
                {
                    MaterialAnims.Add(anim.Name, anim);
                }

                foreach (var anim in ShaderParamAnims.Values)
                {
                    MaterialAnims.Add(anim.Name, anim);
                }

                foreach (var anim in TexSrtAnims.Values)
                {
                    MaterialAnims.Add(anim.Name, anim);
                }

                foreach (var anim in ColorAnims.Values)
                {
                    MaterialAnims.Add(anim.Name, anim);
                }

                foreach (var anim in MatVisibilityAnims.Values)
                {
                    MaterialAnims.Add(anim.Name, anim);
                }

                for (int i = 0; i < MaterialAnims.Count; i++)
                {
                    MaterialAnims[i].signature = "FMAA";
                }
            }
        }
コード例 #24
0
        // ---- METHODS ------------------------------------------------------------------------------------------------

        void IResData.Load(ResFileLoader loader)
        {
            loader.CheckSignature(_signature);
            if (loader.IsSwitch)
            {
                if (loader.ResFile.VersionMajor2 == 9)
                {
                    _flags = loader.ReadUInt32();
                }
                else
                {
                    ((Switch.Core.ResFileSwitchLoader)loader).LoadHeaderBlock();
                }

                Name         = loader.LoadString();
                Path         = loader.LoadString();
                BindSkeleton = loader.Load <Skeleton>();
                uint BindIndexArray      = loader.ReadOffset();
                uint BoneAnimArrayOffset = loader.ReadOffset();
                UserData = loader.LoadDictValues <UserData>();
                if (loader.ResFile.VersionMajor2 != 9)
                {
                    _flags = loader.ReadUInt32();
                }

                FrameCount = loader.ReadInt32();
                int numCurve = loader.ReadInt32();
                BakedSize = loader.ReadUInt32();
                ushort numBoneAnim = loader.ReadUInt16();
                ushort numUserData = loader.ReadUInt16();

                if (loader.ResFile.VersionMajor2 != 9)
                {
                    loader.ReadUInt32(); //Padding
                }
                BoneAnims   = loader.LoadList <BoneAnim>(numBoneAnim, BoneAnimArrayOffset).ToList();
                BindIndices = loader.LoadCustom(() => loader.ReadUInt16s(numBoneAnim), BindIndexArray);
            }
            else
            {
                ushort numBoneAnim = 0;
                if (loader.ResFile.Version >= 0x02040000)
                {
                    Name   = loader.LoadString();
                    Path   = loader.LoadString();
                    _flags = loader.ReadUInt32();

                    if (loader.ResFile.Version >= 0x03040000)
                    {
                        FrameCount  = loader.ReadInt32();
                        numBoneAnim = loader.ReadUInt16();
                        ushort numUserData = loader.ReadUInt16();
                        int    numCurve    = loader.ReadInt32();
                        BakedSize = loader.ReadUInt32();
                    }
                    else
                    {
                        FrameCount  = loader.ReadUInt16();
                        numBoneAnim = loader.ReadUInt16();
                        ushort numUserData = loader.ReadUInt16();
                        ushort numCurve    = loader.ReadUInt16();
                        BakedSize = loader.ReadUInt32();
                        loader.Seek(4); //padding
                    }

                    BoneAnims    = loader.LoadList <BoneAnim>(numBoneAnim).ToList();
                    BindSkeleton = loader.Load <Skeleton>();
                    BindIndices  = loader.LoadCustom(() => loader.ReadUInt16s(numBoneAnim));
                    UserData     = loader.LoadDict <UserData>();
                }
                else
                {
                    _flags      = loader.ReadUInt32();
                    FrameCount  = loader.ReadUInt16();
                    numBoneAnim = loader.ReadUInt16();
                    ushort numUserData = loader.ReadUInt16();
                    ushort numCurve    = loader.ReadUInt16();
                    Name         = loader.LoadString();
                    Path         = loader.LoadString();
                    BoneAnims    = loader.LoadList <BoneAnim>(numBoneAnim).ToList();
                    BindSkeleton = loader.Load <Skeleton>();
                    BindIndices  = loader.LoadCustom(() => loader.ReadUInt16s(numBoneAnim));
                }
            }
        }