public static GlobalGeometrySectionStructBlock LoadSectionData( this GlobalGeometryBlockInfoStructBlock geometryInfo) { var resourceStream = geometryInfo.GetResourceFromCache( ); if (resourceStream == null) { return(default(GlobalGeometrySectionStructBlock)); } var sectionBlock = new GlobalGeometrySectionStructBlock( ); using (var binaryReader = new BinaryReader(resourceStream)) { sectionBlock.Read(binaryReader); var vertexBufferResources = geometryInfo.Resources.Where( x => x.Type == GlobalGeometryBlockResourceBlock.TypeEnum.VertexBuffer).ToArray( ); for (var i = 0; i < sectionBlock.VertexBuffers.Length && i < vertexBufferResources.Length; ++i) { sectionBlock.VertexBuffers[i].VertexBuffer.Data = resourceStream.GetResourceData(vertexBufferResources[i]); } } return(sectionBlock); }
public static ResourceStream GetResourceFromCache(this GlobalGeometryBlockInfoStructBlock blockInfo) { var ResourceLocation = blockInfo.ResourceLocation; Stream source = null; if (ResourceLocation == Halo2.ResourceSource.Local) { source = ActiveCache as CacheStream; } if (ResourceLocation == Halo2.ResourceSource.Shared) { source = ( Stream )Index.Caches.FirstOrDefault(IsCacheCalled("shared")); } if (ResourceLocation == Halo2.ResourceSource.SinglePlayerShared) { source = ( Stream )Index.Caches.FirstOrDefault(IsCacheCalled("single_player_shared")); } if (ResourceLocation == Halo2.ResourceSource.MainMenu) { source = ( Stream )Index.Caches.FirstOrDefault(IsCacheCalled("mainmenu")); } if (source == null) { return(null); } source.Position = blockInfo.ResourceOffset + 8; var buffer = new byte[blockInfo.BlockSize - 8]; source.Read(buffer, 0, blockInfo.BlockSize - 8); return(new ResourceStream(buffer, blockInfo)); }