private void buttonReadGSFPack_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); if (ofd.ShowDialog() == DialogResult.OK) { GsfPackage gsfPackage = GsfPackage.Read(ofd.FileName); StringBuilder sb = new StringBuilder(); sb.Append("GSF Pack: ").Append(gsfPackage.Name).Append("\r\n"); int modelNumber = 0; int meshNumber = 0; int modelsAmount = gsfPackage.Models.Count; int meshesAmount = 0; Paraworld.Resources.Graphics.Model model; model = gsfPackage.Models[modelNumber]; meshesAmount = model.meshes.Count; Paraworld.Resources.Graphics.Mesh mesh; mesh = model.meshes[meshNumber]; string baseTextureFilename = @"C:\Program Files (x86)\Sunflowers\ParaWorld\Data\Base\Texture\"; string textureFilename = baseTextureFilename + gsfPackage.Materials[model.materialIndices[0]].textureFilename1.Replace('/', '\\').Replace(".tga", "_(0256).dds"); if (!File.Exists(textureFilename)) { textureFilename = null; } TestControls.MeshViewer mv = (TestControls.MeshViewer)elementHostMeshViewer.Child; mv.SetMesh(mesh.BBox, mesh.Vertices, mesh.Triangles, mesh.UVMap, textureFilename); sb.Append("Model: ").Append((modelNumber + 1).ToString()).Append("/").Append(modelsAmount.ToString()).Append("\r\n"); sb.Append("Model Name: ").Append(model.name).Append("\r\n"); sb.Append("Mesh: ").Append((meshNumber + 1).ToString()).Append("/").Append(meshesAmount.ToString()).Append("\r\n"); richTextBoxLastError.Text = sb.ToString(); } }
public override bool Read(BinaryReader br) { objectType = br.ReadInt32(); nameAddress = (int)GsfPackage.ReadRelativeOffset(br); data1Address = GsfPackage.ReadRelativeOffset(br); data1Count = br.ReadInt32(); materialDefsAddress = GsfPackage.ReadRelativeOffset(br); materialDefsCount = br.ReadInt32(); unk1 = br.ReadInt32(); unk2 = br.ReadInt32(); unk3 = br.ReadInt32(); unk4 = br.ReadInt32(); unk5 = br.ReadInt32(); unk6 = br.ReadInt32(); unk7 = br.ReadInt32(); minX = br.ReadSingle(); minY = br.ReadSingle(); minZ = br.ReadSingle(); maxX = br.ReadSingle(); maxY = br.ReadSingle(); maxZ = br.ReadSingle(); childDefsAddress = GsfPackage.ReadRelativeOffset(br); childsDefsCount = br.ReadInt32(); return(true); }
public override bool Read(BinaryReader br) { int c = GetCount(); // Will throw an exception if count is not yet set entries = new List <BaseChunk>(); Entry entry; for (int i = 0; i < c; i++) { entry = new Entry(); entry.Read(br); entries.Add(entry); } for (int i = 0; i < c; i++) { entry = (Entry)entries[i]; if (entry.defsAddress != null && entry.count > 0) { br.BaseStream.Seek(entry.defsAddress.Value, SeekOrigin.Begin); for (int j = 0; j < entry.count; j++) { int address = (int)GsfPackage.ReadRelativeOffset(br); int val = br.ReadInt32(); entry.childsAddress.Add(Tuple.Create(address, val)); } } } return(true); }
public override bool Write(BinaryWriter bw) { bw.Write(objectsTableAddress); GsfPackage.WriteNullablePointer(bw, defsAddress); bw.Write(count); return(true); }
public override bool Write(BinaryWriter bw) { if (entries == null) { return(true); } Entry entry; for (int i = 0; i < entries.Count; i++) { entry = (Entry)entries[i]; entry.Write(bw); } for (int i = 0; i < entries.Count; i++) { entry = (Entry)entries[i]; if (entry.childsAddress != null) { for (int j = 0; j < entry.childsAddress.Count; j++) { GsfPackage.WriteNullablePointer(bw, entry.childsAddress[j].Item1); bw.Write(entry.childsAddress[j].Item2); } } } return(true); }
public override bool Read(BinaryReader br) { materialsCount = br.ReadInt32(); materialsTableOffset = (int)GsfPackage.ReadRelativeOffset(br); materialsTableEntriesCount = br.ReadInt32(); return(true); }
public override bool Read(BinaryReader br) { dummyZero = br.ReadInt32(); gui = br.ReadUInt32(); dummyZero = br.ReadInt32(); transformationData = TransformationData.FromReader(br); c1 = br.ReadInt32(); a1 = GsfPackage.ReadRelativeOffset(br); c1 = br.ReadInt32(); a2 = GsfPackage.ReadRelativeOffset(br); c2 = br.ReadInt32(); c2 = br.ReadInt32(); zero = br.ReadInt32(); type00Blocks = new List <Type00Block>(); type00Datas = new List <Type00Data>(); if (!ReadBlocks(br, a1, c1, type00Blocks)) { return(false); } if (!ReadDatas(br, a2, c2)) { return(false); } return(true); }
public override bool Write(BinaryWriter bw) { bw.Write(objectType); bw.Write(nameAddress); GsfPackage.WriteNullablePointer(bw, data1Address); bw.Write(data1Count); GsfPackage.WriteNullablePointer(bw, materialDefsAddress); bw.Write(materialDefsCount); bw.Write(unk1); bw.Write(unk2); bw.Write(unk3); bw.Write(unk4); bw.Write(unk5); bw.Write(unk6); bw.Write(unk7); bw.Write(minX); bw.Write(minY); bw.Write(minZ); bw.Write(maxX); bw.Write(maxY); bw.Write(maxZ); GsfPackage.WriteNullablePointer(bw, childDefsAddress); bw.Write(childsDefsCount); return(true); }
public override bool Read(BinaryReader br) { offset = GsfPackage.ReadRelativeOffset(br); unknown2 = br.ReadInt32(); meshesData = new List <MeshData>(); frameIndices = new List <short>(); if (offset != null) { br.BaseStream.Seek(offset.Value, SeekOrigin.Begin); Graphics.BoundingBox bb = Graphics.BoundingBox.FromReader(br); // TODO: Use this bounding box in addition (transformation) to the ones from each mesh int amount1 = br.ReadInt32(); int meshesAddress = GsfPackage.ReadRelativeOffset(br).Value; int amount2 = br.ReadInt32(); int frameIndicesAddress = GsfPackage.ReadRelativeOffset(br).Value; int amount3 = br.ReadInt32(); br.BaseStream.Seek(meshesAddress, SeekOrigin.Begin); // Usually should not be needed for (int i = 0; i < amount2; i++) { MeshData md = MeshData.ReadHeader(br); meshesData.Add(md); } for (int i = 0; i < amount2; i++) { meshesData[i].Read(br); } br.BaseStream.Seek(frameIndicesAddress, SeekOrigin.Begin); for (int i = 0; i < amount3; i++) { short index = br.ReadInt16(); frameIndices.Add(index); } } return(true); }
public override bool Read(BinaryReader br) { objectsTableAddress = (int)GsfPackage.ReadRelativeOffset(br); defsAddress = GsfPackage.ReadRelativeOffset(br); count = br.ReadInt32(); childsAddress = new List <Tuple <int, int> >(); return(true); }
public bool Read(BinaryReader br) { gui = br.ReadUInt32(); dummyZero = br.ReadInt32(); transformationData = TransformationData.FromReader(br); nextAmount = br.ReadInt32(); nextAddress = GsfPackage.ReadRelativeOffset(br); nextAmount = br.ReadInt32(); return(true); }
public override bool Read(BinaryReader br) { attributes1 = br.ReadInt32(); attributes2 = br.ReadInt32(); textureFilename1Offset = GsfPackage.ReadRelativeOffset(br); textureFilename2Offset = GsfPackage.ReadRelativeOffset(br); textureFilename3Offset = GsfPackage.ReadRelativeOffset(br); unknown = br.ReadInt32(); return(true); }
public override bool Write(BinaryWriter bw) { bw.Write(attributes1); bw.Write(attributes2); GsfPackage.WriteNullablePointer(bw, textureFilename1Offset); GsfPackage.WriteNullablePointer(bw, textureFilename2Offset); GsfPackage.WriteNullablePointer(bw, textureFilename3Offset); bw.Write(unknown); return(true); }
public override bool Read(BinaryReader br) { objectType = br.ReadInt32(); nameAddress = br.ReadInt32(); data1Address = GsfPackage.ReadRelativeOffset(br); data1Count = br.ReadInt32(); data2Address = GsfPackage.ReadRelativeOffset(br); data2Count = br.ReadInt32(); return(true); }
public override bool Write(BinaryWriter bw) { bw.Write(objectType); bw.Write(nameAddress); GsfPackage.WriteNullablePointer(bw, data1Address); bw.Write(data1Count); GsfPackage.WriteNullablePointer(bw, data2Address); bw.Write(data2Count); return(true); }
// TODO: Update when found the meaning for the 2 unknown values public override bool Read(BinaryReader br) { int pointerToContentsTable = (int)GsfPackage.ReadRelativeOffset(br); int pointerToMaterialsInfo = (int)GsfPackage.ReadRelativeOffset(br); int unknown1 = br.ReadInt32(); // Always 0x0C? int amount = br.ReadInt32(); int unknown2 = br.ReadInt32(); // Always 0x01? materialIndices = new List <int>(); for (int i = 0; i < amount; i++) { int index = br.ReadInt32(); materialIndices.Add(index); } return(true); }
public static MeshData ReadHeader(BinaryReader br) { MeshData md = new MeshData(); md.vertices = new List <Graphics.Vertex>(); md.textureVertices = new List <Graphics.TextureCoords>(); md.triangles = new List <Graphics.Triangle>(); md.unknown1 = new List <short>(); md.boundingBox = Graphics.BoundingBox.FromReader(br); md.verticesCount = br.ReadInt32(); md.trianglesCount = br.ReadInt32(); md.verticesAddress = GsfPackage.ReadRelativeOffset(br); md.trianglesAddress = GsfPackage.ReadRelativeOffset(br); md.trianglesCount = br.ReadInt32(); // Yes, the same value again :-) md.vertexDataSize = br.ReadInt32(); md.unknown1Address = GsfPackage.ReadRelativeOffset(br); md.unknown1Count = br.ReadInt32(); // Same value as verticesCount, or 0 return(md); }