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); }
internal static void Read(ResFileSwitchLoader loader, Model model) { if (loader.ResFile.VersionMajor2 == 9) { model.Flags = loader.ReadUInt32(); } else { loader.LoadHeaderBlock(); } model.Name = loader.LoadString(); model.Path = loader.LoadString(); model.Skeleton = loader.Load <Skeleton>(); long VertexArrayOffset = loader.ReadOffset(); model.Shapes = loader.LoadDictValues <Shape>(); long materialValuesOffset = loader.ReadOffset(); if (loader.ResFile.VersionMajor2 == 9) { loader.ReadOffset(); //padding? } long materialDictOffset = loader.ReadOffset(); model.Materials = loader.LoadDictValues <Material>(materialDictOffset, materialValuesOffset); model.UserData = loader.LoadDictValues <UserData>(); long UserPointer = loader.ReadOffset(); ushort numVertexBuffer = loader.ReadUInt16(); ushort numShape = loader.ReadUInt16(); ushort numMaterial = loader.ReadUInt16(); ushort numUserData = 0; if (loader.ResFile.VersionMajor2 == 9) { loader.ReadUInt16(); //padding? numUserData = loader.ReadUInt16(); loader.ReadUInt16(); //padding? uint padding = loader.ReadUInt32(); } else { numUserData = loader.ReadUInt16(); uint totalVertexCount = loader.ReadUInt32(); uint padding = loader.ReadUInt32(); } model.VertexBuffers = loader.LoadList <VertexBuffer>(numVertexBuffer, (uint)VertexArrayOffset); }
public static void Load(ResFileSwitchLoader loader, VertexBuffer vertexBuffer) { if (loader.ResFile.VersionMajor2 == 9) { vertexBuffer.Flags = loader.ReadUInt32(); } else { loader.LoadHeaderBlock(); } vertexBuffer.Attributes = loader.LoadDictValues <VertexAttrib>(); vertexBuffer.MemoryPool = loader.Load <MemoryPool>(); long unk = loader.ReadOffset(); if (loader.ResFile.VersionMajor2 > 2 || loader.ResFile.VersionMajor > 0) { loader.ReadOffset();// unk2 } long VertexBufferSizeOffset = loader.ReadOffset(); long VertexStrideSizeOffset = loader.ReadOffset(); long padding = loader.ReadInt64(); int BufferOffset = loader.ReadInt32(); byte numVertexAttrib = loader.ReadByte(); byte numBuffer = loader.ReadByte(); ushort Idx = loader.ReadUInt16(); uint vertexCount = loader.ReadUInt32(); vertexBuffer.VertexSkinCount = (byte)loader.ReadUInt32(); //Buffers use the index buffer offset from memory info section //This goes to a section in the memory pool which stores all the buffer data, including faces //To obtain a list of all the buffer data, it would be by the index buffer offset + BufferOffset var StrideArray = loader.LoadList <VertexBufferStride>(numBuffer, (uint)VertexStrideSizeOffset); var VertexBufferSizeArray = loader.LoadList <VertexBufferSize>(numBuffer, (uint)VertexBufferSizeOffset); vertexBuffer.Buffers = new List <Buffer>(); for (int buff = 0; buff < numBuffer; buff++) { Buffer data = new Buffer(); data.Flags = VertexBufferSizeArray[buff].GpuAccessFlags; data.Stride = (ushort)StrideArray[buff].Stride; uint size = VertexBufferSizeArray[buff].Size; if (buff == 0) { data.BufferOffset = ((int)BufferInfo.BufferOffset + BufferOffset); } if (buff > 0) { data.BufferOffset = vertexBuffer.Buffers[buff - 1].BufferOffset + vertexBuffer.Buffers[buff - 1].Size; } if (data.BufferOffset % 8 != 0) { data.BufferOffset = data.BufferOffset + (8 - (data.BufferOffset % 8)); } data.Data = new byte[1][]; data.Data[0] = loader.LoadCustom(() => //Load buffer data from mem block { return(loader.ReadBytes((int)size)); }, (uint)data.BufferOffset); vertexBuffer.Buffers.Add(data); } }
public static void Load(ResFileSwitchLoader loader, ResFile resFile) { loader.CheckSignature("FRES"); uint padding = loader.ReadUInt32(); resFile.Version = loader.ReadUInt32(); resFile.SetVersionInfo(resFile.Version); resFile.ByteOrder = loader.ReadByteOrder(); resFile.Alignment = loader.ReadByte(); resFile.TargetAddressSize = loader.ReadByte(); //Thanks MasterF0X for pointing out the layout of the these uint OffsetToFileName = loader.ReadUInt32(); resFile.Flag = loader.ReadUInt16(); resFile.BlockOffset = loader.ReadUInt16(); uint RelocationTableOffset = loader.ReadUInt32(); uint sizFile = loader.ReadUInt32(); resFile.Name = loader.LoadString(); long modelOffset = loader.ReadOffset(); long modelDictOffset = loader.ReadOffset(); if (loader.ResFile.VersionMajor2 == 9) { loader.ReadBytes(32); //reserved } resFile.SkeletalAnims = loader.LoadDictValues <SkeletalAnim>(); resFile.MaterialAnims = loader.LoadDictValues <MaterialAnim>(); resFile.BoneVisibilityAnims = loader.LoadDictValues <VisibilityAnim>(); resFile.ShapeAnims = loader.LoadDictValues <ShapeAnim>(); resFile.SceneAnims = loader.LoadDictValues <SceneAnim>(); resFile.MemoryPool = loader.Load <MemoryPool>(); resFile.BufferInfo = loader.Load <BufferInfo>(); resFile.ExternalFiles = loader.LoadDictValues <ExternalFile>(); long padding1 = loader.ReadInt64(); resFile.StringTable = loader.Load <StringTable>(); uint StringPoolSize = loader.ReadUInt32(); ushort numModel = loader.ReadUInt16(); //Read models after buffer data resFile.Models = loader.LoadDictValues <Model>(modelDictOffset, modelOffset); if (loader.ResFile.VersionMajor2 == 9) { //Count for 2 new sections ushort unkCount = loader.ReadUInt16(); ushort unk2Count = loader.ReadUInt16(); if (unkCount != 0) { throw new System.Exception("unk1 has section!"); } if (unk2Count != 0) { throw new System.Exception("unk2 has section!"); } } ushort numSkeletalAnim = loader.ReadUInt16(); ushort numMaterialAnim = loader.ReadUInt16(); ushort numBoneVisibilityAnim = loader.ReadUInt16(); ushort numShapeAnim = loader.ReadUInt16(); ushort numSceneAnim = loader.ReadUInt16(); ushort numExternalFile = loader.ReadUInt16(); uint padding2 = loader.ReadUInt16(); uint padding3 = loader.ReadUInt32(); resFile.Textures = new ResDict <TextureShared>(); foreach (var ext in resFile.ExternalFiles) { if (ext.Key.Contains(".bntx")) { BntxFile bntx = new BntxFile(new MemoryStream(ext.Value.Data)); ext.Value.LoadedFileData = bntx; foreach (var tex in bntx.Textures) { resFile.Textures.Add(tex.Name, new SwitchTexture(bntx, tex)); } } } resFile.TexPatternAnims = new ResDict <MaterialAnim>(); resFile.MatVisibilityAnims = new ResDict <MaterialAnim>(); resFile.ShaderParamAnims = new ResDict <MaterialAnim>(); resFile.ColorAnims = new ResDict <MaterialAnim>(); resFile.TexSrtAnims = new ResDict <MaterialAnim>(); //Split material animations into shader, texture, and visual animation lists foreach (var anim in resFile.MaterialAnims.Values) { if (anim.Name.Contains("_ftp")) { resFile.TexPatternAnims.Add(anim.Name, anim); } else if (anim.Name.Contains("_fts")) { resFile.ShaderParamAnims.Add(anim.Name, anim); } else if (anim.Name.Contains("_fcl")) { resFile.ColorAnims.Add(anim.Name, anim); } else if (anim.Name.Contains("_fst")) { resFile.TexSrtAnims.Add(anim.Name, anim); } else if (anim.Name.Contains("_fvt")) { resFile.MatVisibilityAnims.Add(anim.Name, anim); } else if (anim.MaterialAnimDataList != null && anim.MaterialAnimDataList.Any(x => x.VisibilyCount > 0)) { resFile.MatVisibilityAnims.Add(anim.Name, anim); } else if (anim.MaterialAnimDataList != null && anim.MaterialAnimDataList.Any(x => x.TexturePatternCount > 0)) { resFile.TexPatternAnims.Add(anim.Name, anim); } else { resFile.ShaderParamAnims.Add(anim.Name, anim); } } }
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>(); }