public PageableResource(TagResourceTypeGen3 type, CacheVersion version) : this() { uint?size = null; switch (type) { case TagResourceTypeGen3.Collision: size = typeof(StructureBspTagResources).GetSize(version); break; case TagResourceTypeGen3.Bitmap: size = typeof(BitmapTextureInteropResource).GetSize(version); break; case TagResourceTypeGen3.BitmapInterleaved: size = typeof(BitmapTextureInterleavedInteropResource).GetSize(version); break; case TagResourceTypeGen3.Sound: size = typeof(SoundResourceDefinition).GetSize(version); break; case TagResourceTypeGen3.Animation: size = typeof(ModelAnimationTagResource).GetSize(version); break; case TagResourceTypeGen3.RenderGeometry: size = typeof(RenderGeometryApiResourceDefinition).GetSize(version); break; case TagResourceTypeGen3.Bink: size = typeof(BinkResource).GetSize(version); break; case TagResourceTypeGen3.Pathfinding: size = typeof(StructureBspCacheFileTagResources).GetSize(version); break; } Resource.DefinitionData = new byte[size ?? 0]; Resource.ResourceType = type; }
public PageableResource(TagResourceTypeGen3 type, CacheVersion version, ResourceLocation location) : this(type, version) { ChangeLocation(location); }
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); }