private PageableResource ConvertPageableResource(Stream sourceStream, Stream destStream, PageableResource resource) { if (resource.GetLocation(out var location) && location == ResourceLocation.ResourcesB) { resource.ChangeLocation(ResourceLocation.Resources); var resourceData = ResourcesB.ExtractRaw(sourceStream, resource.Page.Index, resource.Page.CompressedBlockSize); resource.Page.Index = Resources.AddRaw(destStream, resourceData); } return(resource); }
private PageableResource ConvertPageableResource(ModPackage modPack, PageableResource resource) { if (resource.Page.Index == -1) { return(resource); } var resourceStream = new MemoryStream(); modPack.Resources.Decompress(modPack.ResourcesStream, resource.Page.Index, resource.Page.CompressedBlockSize, resourceStream); resourceStream.Position = 0; resource.ChangeLocation(ResourceLocation.ResourcesB); resource.Page.OldFlags &= ~OldRawPageFlags.InMods; CacheContext.ResourceCaches.AddResource(resource, resourceStream); return(resource); }
private PageableResource ConvertResource(PageableResource resource, GameCacheContextHaloOnline srcCacheContext, GameCacheContextHaloOnline destCacheContext) { if (resource == null || resource.Page.Index < 0 || !resource.GetLocation(out var location)) { return(null); } Console.WriteLine("- Copying resource {0} in {1}...", resource.Page.Index, location); var data = srcCacheContext.ExtractRawResource(resource); var newLocation = FixResourceLocation(location, srcCacheContext.Version, destCacheContext.Version); resource.ChangeLocation(newLocation); destCacheContext.AddRawResource(resource, data); return(resource); }
private TagResourceReference CreateResource <T>(T resourceDefinition, ResourceLocation location, TagResourceTypeGen3 resourceType) { var resourceReference = new TagResourceReference(); var pageableResource = new PageableResource(); pageableResource.Page = new ResourcePage(); pageableResource.Resource = new ResourceData(); pageableResource.ChangeLocation(location); pageableResource.Resource.Unknown2 = 1; pageableResource.Resource.ResourceType = resourceType; resourceReference.HaloOnlinePageableResource = pageableResource; var definitionStream = new MemoryStream(); var dataStream = new MemoryStream(); using (var definitionWriter = new EndianWriter(definitionStream, EndianFormat.LittleEndian)) using (var dataWriter = new EndianWriter(dataStream, EndianFormat.LittleEndian)) { var context = new ResourceDefinitionSerializationContext(dataWriter, definitionWriter, CacheAddressType.Definition); var serializer = new ResourceSerializer(Cache.Version); serializer.Serialize(context, resourceDefinition); var data = dataStream.ToArray(); var definitionData = definitionStream.ToArray(); dataStream.Position = 0; pageableResource.DisableChecksum(); dataStream.Position = 0; AddResource(pageableResource, dataStream); // add resource definition and fixups pageableResource.Resource.DefinitionData = definitionData; pageableResource.Resource.FixupLocations = context.FixupLocations; pageableResource.Resource.DefinitionAddress = context.MainStructOffset; pageableResource.Resource.InteropLocations = context.InteropLocations; } return(resourceReference); }
private PageableResource ConvertBitmap(Bitmap bitmap, Dictionary <ResourceLocation, Stream> resourceStreams, int imageIndex, string tagName) { var image = bitmap.Images[imageIndex]; BaseBitmap baseBitmap = BitmapConverter.ConvertGen3Bitmap(BlamCache, bitmap, imageIndex, BlamCache.Version); if (baseBitmap == null) { return(null); } // fix type enum if (baseBitmap.Type == BitmapType.Array) { baseBitmap.Type = BitmapType.Texture3D; } SetTagData(baseBitmap, image); var dataSize = baseBitmap.Data.Length; var resource = new PageableResource { Page = new RawPage(), Resource = new TagResourceGen3 { ResourceFixups = new List <TagResourceGen3.ResourceFixup>(), ResourceDefinitionFixups = new List <TagResourceGen3.ResourceDefinitionFixup>(), ResourceType = TagResourceTypeGen3.Bitmap, Unknown2 = 1 } }; using (var dataStream = new MemoryStream(baseBitmap.Data)) { var bitmapResource = new Bitmap.BitmapResource { Resource = resource, Unknown4 = 0 }; var resourceContext = new ResourceSerializationContext(CacheContext, resource); // Create new definition var resourceDefinition = new BitmapTextureInteropResource { Texture = new TagStructureReference <BitmapTextureInteropResource.BitmapDefinition> { Definition = new BitmapTextureInteropResource.BitmapDefinition { Data = new TagData(), UnknownData = new TagData(), } } }; SetResourceDefinitionData(baseBitmap, image, resourceDefinition.Texture.Definition); // // Serialize the new resource definition // var location = bitmap.Usage == 2 ? ResourceLocation.TexturesB : // bump maps ResourceLocation.Textures; // everything else resource.ChangeLocation(location); if (resource == null) { throw new ArgumentNullException("resource"); } if (!dataStream.CanRead) { throw new ArgumentException("The input stream is not open for reading", "dataStream"); } var cache = CacheContext.GetResourceCache(location); if (!resourceStreams.ContainsKey(location)) { resourceStreams[location] = FlagIsSet(PortingFlags.Memory) ? new MemoryStream() : (Stream)CacheContext.OpenResourceCacheReadWrite(location); if (FlagIsSet(PortingFlags.Memory)) { using (var resourceStream = CacheContext.OpenResourceCacheRead(location)) resourceStream.CopyTo(resourceStreams[location]); } } dataSize = (int)(dataStream.Length - dataStream.Position); var data = new byte[dataSize]; dataStream.Read(data, 0, dataSize); resource.Page.Index = cache.Add(resourceStreams[location], data, out uint compressedSize); resource.Page.CompressedBlockSize = compressedSize; resource.Page.UncompressedBlockSize = (uint)dataSize; resource.DisableChecksum(); CacheContext.Serializer.Serialize(resourceContext, resourceDefinition); } return(resource); }