private void LoadMeshData(BlamCacheFile cacheFile, StructureLayout meshLayout) { IReader reader = cacheFile.Reader; StructureValueCollection meshValueCollection = StructureReader.ReadStructure(reader, meshLayout); ulong numSubmeshes = meshValueCollection.GetInteger("number of submeshes"); ulong numVertexGroups = meshValueCollection.GetInteger("number of vertex groups"); uint submeshTableOffset = (uint)cacheFile.PointerToFileOffset((uint)meshValueCollection.GetInteger("submesh table address")); uint vertexGroupTableOffset = (uint)cacheFile.PointerToFileOffset((uint)meshValueCollection.GetInteger("vertex group table address")); Submeshes = new List <BlamModelSubmesh>((int)numSubmeshes); for (int i = 0; i < Submeshes.Capacity; i++) { Submeshes.Add(new BlamModelSubmesh(submeshTableOffset, i, cacheFile)); } VertexGroups = new List <BlamModelVertexGroup>((int)numVertexGroups); for (int i = 0; i < VertexGroups.Capacity; i++) { VertexGroups.Add(new BlamModelVertexGroup(vertexGroupTableOffset, i, cacheFile)); } VertexType = (MeshVertexType)meshValueCollection.GetInteger("vertex format"); for (int i = 1; i <= VertexBufferIndices.Length; i++) { string indexerString = string.Format("vertex buffer {0}", i); VertexBufferIndices[i - 1] = (Int16)meshValueCollection.GetInteger(indexerString); } for (int i = 1; i <= IndexBufferIndices.Length; i++) { string indexerString = string.Format("index buffer {0}", i); IndexBufferIndices[i - 1] = (Int16)meshValueCollection.GetInteger(indexerString); } }
private void LoadRegions(ITag modelTag, BlamCacheFile blamCacheFile) { IReader reader = blamCacheFile.Reader; StructureLayout renderModelLayout = blamCacheFile.GetLayout("render model"); reader.SeekTo(modelTag.MetaLocation.AsOffset()); renderModelValues = StructureReader.ReadStructure(blamCacheFile.Reader, renderModelLayout); ulong numRegions = renderModelValues.GetInteger("number of regions"); ulong regionTableAddress = renderModelValues.GetInteger("region table address"); long expandedRegionTableOffset = blamCacheFile.PointerToFileOffset((uint)regionTableAddress); StructureLayout modelRegionLayout = blamCacheFile.GetLayout("model region"); ResourceDatumIndex = new DatumIndex(renderModelValues.GetInteger("resource datum index")); Regions = new List <BlamRenderModelRegion>(); var x = blamCacheFile.Get().Resources.LoadResourceTable(blamCacheFile.Reader).Resources[ResourceDatumIndex.Index]; for (ulong regionNum = 0ul; regionNum < numRegions; regionNum++) { long regionPointer = expandedRegionTableOffset + (long)((ulong)modelRegionLayout.Size * regionNum); Regions.Add(new BlamRenderModelRegion(regionPointer, blamCacheFile)); } }
private void LoadModelCompressionData(ITag modelTag, BlamCacheFile blamCacheFile) { ulong numBoundingBoxes = renderModelValues.GetInteger("number of bounding boxes"); ulong boundingBoxTableAddr = renderModelValues.GetInteger("bounding box table address"); ulong boundingboxTableOffset = (ulong)blamCacheFile.PointerToFileOffset((uint)boundingBoxTableAddr); StructureLayout boundingBoxElementLayout = blamCacheFile.GetLayout("model bounding box"); Compression = new BlamModelCompression(); List <StructureValueCollection> boundingBoxTableData = new List <StructureValueCollection>((int)numBoundingBoxes); for (ulong i = 0; i < numBoundingBoxes; i++) { ulong offset = (i * (ulong)boundingBoxElementLayout.Size); blamCacheFile.Reader.SeekTo((long)(boundingboxTableOffset + offset)); boundingBoxTableData.Add(StructureReader.ReadStructure(blamCacheFile.Reader, boundingBoxElementLayout)); } Compression.ReadCompressionData(boundingBoxTableData); }
private void LoadRenderGeometry(ITag modelTag, BlamCacheFile blamCacheFile) { ulong runtimeGeometryFlags = renderModelValues.GetInteger("render geometry runtime flags"); ulong numMeshes = renderModelValues.GetInteger("number of sections"); ulong meshTableAddress = renderModelValues.GetInteger("section table address"); ulong meshTableOffset = (ulong)blamCacheFile.PointerToFileOffset((uint)meshTableAddress); Geometry = new BlamModelRenderGeometry((RenderGeometryRuntimeFlags)runtimeGeometryFlags, meshTableOffset, numMeshes); var resources = blamCacheFile.ResourceTable; foreach (var res in resources.Resources) { ITag tag = res.ParentTag; if (tag != modelTag) { continue; } Geometry.Read(blamCacheFile, res); break; } }