// ---- 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>(); } }
/// <summary> /// Initializes a new instance of the <see cref="Mesh"/> class. /// </summary> public VertexBuffer() { VertexSkinCount = 0; Attributes = new ResDict <VertexAttrib>(); Buffers = new List <Buffer>(); }
// ---- 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>(); }
/// <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; }
/// <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>(); }
/// <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>(); }
/// <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>(); }
// ---- 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>(); } }
/// <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>(); }
/// <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>(); }
/// <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>(); }
/// <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>(); }
/// <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>(); }
/// <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>(); }
/// <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]; }
/// <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>(); }
/// <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(); }
/// <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; }
// ---- 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>(); } }
// ---- 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>(); } }
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(); } } }
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); } }
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"; } } }
// ---- 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)); } } }