Beispiel #1
0
        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);
        }
Beispiel #2
0
        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));
        }