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