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); }
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); }
public static void Read(ResFileSwitchLoader loader, LightAnim lightAnim) { if (loader.ResFile.VersionMajor2 == 9) { lightAnim.Flags = loader.ReadEnum <LightAnimFlags>(true); loader.Seek(2); } else { loader.LoadHeaderBlock(); } lightAnim.Name = loader.LoadString(); long CurveArrayOffset = loader.ReadInt64(); lightAnim.BaseData = loader.LoadCustom(() => new LightAnimData(loader, lightAnim.AnimatedFields)); lightAnim.UserData = loader.LoadDictValues <UserData>(); lightAnim.LightTypeName = loader.LoadString(); lightAnim.DistanceAttnFuncName = loader.LoadString(); lightAnim.AngleAttnFuncName = loader.LoadString(); ushort numUserData = 0; byte numCurve = 0; if (loader.ResFile.VersionMajor2 == 9) { lightAnim.FrameCount = loader.ReadInt32(); numCurve = loader.ReadByte(); lightAnim.LightTypeIndex = loader.ReadSByte(); lightAnim.DistanceAttnFuncIndex = loader.ReadSByte(); lightAnim.AngleAttnFuncIndex = loader.ReadSByte(); lightAnim.BakedSize = loader.ReadUInt32(); numUserData = loader.ReadUInt16(); loader.Seek(2); } else { lightAnim.Flags = loader.ReadEnum <LightAnimFlags>(true); numUserData = loader.ReadUInt16(); lightAnim.FrameCount = loader.ReadInt32(); numCurve = loader.ReadByte(); lightAnim.LightTypeIndex = loader.ReadSByte(); lightAnim.DistanceAttnFuncIndex = loader.ReadSByte(); lightAnim.AngleAttnFuncIndex = loader.ReadSByte(); lightAnim.BakedSize = loader.ReadUInt32(); } lightAnim.Curves = loader.LoadList <AnimCurve>(numCurve); }
public static void Read(ResFileSwitchLoader loader, CameraAnim cameraAnim) { if (loader.ResFile.VersionMajor2 == 9) { cameraAnim.Flags = loader.ReadEnum <CameraAnimFlags>(true); loader.Seek(2); } else { loader.LoadHeaderBlock(); } cameraAnim.Name = loader.LoadString(); long CurveArrayOffset = loader.ReadInt64(); cameraAnim.BaseData = loader.LoadCustom(() => new CameraAnimData(loader)); cameraAnim.UserData = loader.LoadDictValues <UserData>(); byte numCurve = 0; if (loader.ResFile.VersionMajor2 == 9) { cameraAnim.FrameCount = loader.ReadInt32(); cameraAnim.BakedSize = loader.ReadUInt32(); ushort numUserData = loader.ReadUInt16(); numCurve = loader.ReadByte(); loader.Seek(1); loader.Seek(4); } else { cameraAnim.Flags = loader.ReadEnum <CameraAnimFlags>(true); loader.Seek(2); cameraAnim.FrameCount = loader.ReadInt32(); numCurve = loader.ReadByte(); loader.Seek(1); ushort numUserData = loader.ReadUInt16(); cameraAnim.BakedSize = loader.ReadUInt32(); } cameraAnim.Curves = loader.LoadList <AnimCurve>(numCurve, (uint)CurveArrayOffset); }
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 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); }
public static void Load(ResFileSwitchLoader loader, Material mat) { if (loader.ResFile.VersionMajor2 == 9) { mat.Flags = loader.ReadEnum <MaterialFlags>(true); } else { loader.LoadHeaderBlock(); } mat.Name = loader.LoadString(); mat.RenderInfos = loader.LoadDictValues <RenderInfo>(); mat.ShaderAssign = loader.Load <ShaderAssign>(); long TextureArrayOffset = loader.ReadInt64(); long TextureNameArray = loader.ReadInt64(); long SamplerArrayOffset = loader.ReadInt64(); mat.Samplers = loader.LoadDictValues <Sampler>(); mat.ShaderParams = loader.LoadDictValues <ShaderParam>(); long SourceParamOffset = loader.ReadInt64(); mat.UserData = loader.LoadDictValues <UserData>(); long VolatileFlagsOffset = loader.ReadInt64(); long userPointer = loader.ReadInt64(); long SamplerSlotArrayOffset = loader.ReadInt64(); long TexSlotArrayOffset = loader.ReadInt64(); if (loader.ResFile.VersionMajor2 != 9) { mat.Flags = loader.ReadEnum <MaterialFlags>(true); } ushort idx = loader.ReadUInt16(); ushort numRenderInfo = loader.ReadUInt16(); byte numTextureRef = loader.ReadByte(); byte numSampler = loader.ReadByte(); ushort numShaderParam = loader.ReadUInt16(); ushort numShaderParamVolatile = loader.ReadUInt16(); ushort sizParamSource = loader.ReadUInt16(); ushort sizParamRaw = loader.ReadUInt16(); ushort numUserData = loader.ReadUInt16(); if (loader.ResFile.VersionMajor2 != 9) { loader.ReadUInt32(); //Padding } var textures = loader.LoadCustom(() => loader.LoadStrings(numTextureRef), (uint)TextureNameArray); mat.TextureRefs = new List <TextureRef>(); if (textures != null) { foreach (var tex in textures) { mat.TextureRefs.Add(new TextureRef() { Name = tex }); } } //Add names to the value as switch does not store any foreach (var sampler in mat.Samplers) { sampler.Value.Name = sampler.Key; } mat.ShaderParamData = loader.LoadCustom(() => loader.ReadBytes(sizParamSource), (uint)SourceParamOffset); mat.VolatileFlags = loader.LoadCustom(() => loader.ReadBytes((int)Math.Ceiling(numShaderParam / 8f)), (uint)VolatileFlagsOffset); mat.TextureSlotArray = loader.LoadCustom(() => loader.ReadInt64s(numTextureRef), (uint)SamplerSlotArrayOffset); mat.SamplerSlotArray = loader.LoadCustom(() => loader.ReadInt64s(numSampler), (uint)TexSlotArrayOffset); }