private T GetResourceDefinition <T>(TagResourceReference resourceReference)
        {
            var tagResource = GetPageableResource(resourceReference).Resource;

            T result;

            byte[] resourceDefinitionData = tagResource.DefinitionData;
            ApplyResourceDefinitionFixups(tagResource, resourceDefinitionData);

            byte[] resourceRawData = GetResourceData(resourceReference);
            if (resourceRawData == null)
            {
                resourceRawData = new byte[0];
            }

            // deserialize the resource definition again
            using (var definitionDataStream = new MemoryStream(resourceDefinitionData))
                using (var definitionDataReader = new EndianReader(definitionDataStream, EndianFormat.LittleEndian))
                    using (var dataStream = new MemoryStream(resourceRawData))
                        using (var dataReader = new EndianReader(dataStream, EndianFormat.LittleEndian))
                        {
                            var context      = new ResourceDefinitionSerializationContext(dataReader, definitionDataReader, tagResource.DefinitionAddress.Type);
                            var deserializer = new ResourceDeserializer(Cache.Version);
                            // deserialize without access to the data
                            definitionDataReader.SeekTo(tagResource.DefinitionAddress.Offset);
                            result = deserializer.Deserialize <T>(context);
                        }
            return(result);
        }
        public override BitmapTextureInteropResource GetBitmapTextureInteropResource(TagResourceReference resourceReference)
        {
            var tagResource = GetTagResourceFromReference(resourceReference);

            if (!IsResourceValid(tagResource) || GetResourceTypeName(tagResource) != "bitmap_texture_interop_resource")
            {
                return(null);
            }
            return(GetResourceDefinition <BitmapTextureInteropResource>(resourceReference));
        }
        public override ModelAnimationTagResource GetModelAnimationTagResource(TagResourceReference resourceReference)
        {
            var tagResource = GetTagResourceFromReference(resourceReference);

            if (!IsResourceValid(tagResource) || GetResourceTypeName(tagResource) != "model_animation_tag_resource")
            {
                return(null);
            }
            return(GetResourceDefinition <ModelAnimationTagResource>(resourceReference));
        }
        public ResourceData GetTagResourceFromReference(TagResourceReference resourceReference)
        {
            if (!isLoaded)
            {
                LoadResourceCache();
            }

            if (resourceReference == null)
            {
                return(null);
            }

            return(ResourceGestalt.TagResources[resourceReference.Gen3ResourceID.Index]);
        }
        public override StructureBspTagResources GetStructureBspTagResources(TagResourceReference resourceReference)
        {
            if (!IsResourceReferenceValid(resourceReference))
            {
                return(null);
            }
            var resource = GetPageableResource(resourceReference).Resource;

            if (resource.ResourceType != TagResourceTypeGen3.Collision)
            {
                return(null);
            }
            return(GetResourceDefinition <StructureBspTagResources>(resourceReference));
        }
        public override SoundResourceDefinition GetSoundResourceDefinition(TagResourceReference resourceReference)
        {
            if (!IsResourceReferenceValid(resourceReference))
            {
                return(null);
            }
            var resource = GetPageableResource(resourceReference).Resource;

            if (resource.ResourceType != TagResourceTypeGen3.Sound)
            {
                return(null);
            }
            return(GetResourceDefinition <SoundResourceDefinition>(resourceReference));
        }
        public override ModelAnimationTagResource GetModelAnimationTagResource(TagResourceReference resourceReference)
        {
            if (!IsResourceReferenceValid(resourceReference))
            {
                return(null);
            }
            var resource = GetPageableResource(resourceReference).Resource;

            if (resource.ResourceType != TagResourceTypeGen3.Animation)
            {
                return(null);
            }
            return(GetResourceDefinition <ModelAnimationTagResource>(resourceReference));
        }
        public override BitmapTextureInteropResource GetBitmapTextureInteropResource(TagResourceReference resourceReference)
        {
            if (!IsResourceReferenceValid(resourceReference))
            {
                return(null);
            }
            var resource = GetPageableResource(resourceReference).Resource;

            if (resource.ResourceType != TagResourceTypeGen3.Bitmap)
            {
                return(null);
            }
            return(GetResourceDefinition <BitmapTextureInteropResource>(resourceReference));
        }
        public override StructureBspTagResources GetStructureBspTagResources(TagResourceReference resourceReference)
        {
            var tagResource = GetTagResourceFromReference(resourceReference);

            if (!IsResourceValid(tagResource) || GetResourceTypeName(tagResource) != "structure_bsp_tag_resources")
            {
                return(null);
            }
            // extra step for bsp resources
            if (ResourceLayoutTable.Sections[tagResource.SegmentIndex].RequiredPageIndex == -1)
            {
                return(null);
            }
            return(GetResourceDefinition <StructureBspTagResources>(resourceReference));
        }
        public bool IsResourceReferenceValid(TagResourceReference resourceReference)
        {
            if (resourceReference == null || resourceReference.HaloOnlinePageableResource == null)
            {
                return(false);
            }
            var page     = resourceReference.HaloOnlinePageableResource.Page;
            var resource = resourceReference.HaloOnlinePageableResource.Resource;

            if (page == null || resource == null)
            {
                return(false);
            }

            return(true);
        }
        //
        // Overrides
        //

        public byte[] GetResourceData(TagResourceReference resourceReference)
        {
            var pageableResource = GetPageableResource(resourceReference);
            var cache            = GetResourceCache(pageableResource, out var location);

            if (pageableResource.Page == null || pageableResource.Page.UncompressedBlockSize < 0)
            {
                return(null);
            }

            byte[] result = new byte[pageableResource.Page.UncompressedBlockSize];
            using (var cacheStream = OpenCacheRead(location))
                using (var dataStream = new MemoryStream(result))
                {
                    ExtractResource(cacheStream, pageableResource, dataStream);
                }
            return(result);
        }
        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);
        }
Exemple #13
0
        public override SoundResourceDefinition GetSoundResourceDefinition(TagResourceReference resourceReference)
        {
            var tagResource = GetTagResourceFromReference(resourceReference);

            if (!IsResourceValid(tagResource))
            {
                return(null);
            }

            byte[] primaryResourceData   = GetPrimaryResource(resourceReference.Gen3ResourceID);
            byte[] secondaryResourceData = GetSecondaryResource(resourceReference.Gen3ResourceID);

            if (primaryResourceData == null)
            {
                primaryResourceData = new byte[0];
            }

            if (secondaryResourceData == null)
            {
                secondaryResourceData = new byte[0];
            }

            byte[] data = new byte[primaryResourceData.Length + secondaryResourceData.Length];
            Array.Copy(primaryResourceData, 0, data, 0, primaryResourceData.Length);
            Array.Copy(secondaryResourceData, 0, data, primaryResourceData.Length, secondaryResourceData.Length);

            if (data.Length == 0)
            {
                return(null);
            }

            // does not exist in gen3, create one.
            var resourceDef = new SoundResourceDefinition
            {
                Data = new TagData(data)
            };

            return(resourceDef);
        }
Exemple #14
0
        private T GetResourceDefinition <T>(TagResourceReference resourceReference)
        {
            var tagResource = GetTagResourceFromReference(resourceReference);

            T result;

            byte[] resourceDefinitionData = new byte[tagResource.DefinitionDataLength];
            Array.Copy(ResourceGestalt.DefinitionData, tagResource.DefinitionDataOffset, resourceDefinitionData, 0, tagResource.DefinitionDataLength);

            ApplyResourceDefinitionFixups(tagResource, resourceDefinitionData);

            byte[] primaryResourceData   = GetPrimaryResource(resourceReference.Gen3ResourceID);
            byte[] secondaryResourceData = GetSecondaryResource(resourceReference.Gen3ResourceID);

            if (primaryResourceData == null)
            {
                primaryResourceData = new byte[0];
            }

            if (secondaryResourceData == null)
            {
                secondaryResourceData = new byte[0];
            }

            using (var definitionDataStream = new MemoryStream(resourceDefinitionData))
                using (var dataStream = new MemoryStream(primaryResourceData))
                    using (var secondaryDataStream = new MemoryStream(secondaryResourceData))
                        using (var definitionDataReader = new EndianReader(definitionDataStream, EndianFormat.BigEndian))
                            using (var dataReader = new EndianReader(dataStream, EndianFormat.BigEndian))
                                using (var secondaryDataReader = new EndianReader(secondaryDataStream, EndianFormat.BigEndian))
                                {
                                    var context      = new ResourceDefinitionSerializationContext(dataReader, secondaryDataReader, definitionDataReader, tagResource.DefinitionAddress.Type);
                                    var deserializer = new ResourceDeserializer(Cache.Version);
                                    definitionDataReader.SeekTo(tagResource.DefinitionAddress.Offset);
                                    result = deserializer.Deserialize <T>(context);
                                }
            return(result);
        }
Exemple #15
0
 public abstract StructureBspCacheFileTagResources GetStructureBspCacheFileTagResources(TagResourceReference resourceReference);
Exemple #16
0
 public abstract SoundResourceDefinition GetSoundResourceDefinition(TagResourceReference resourceReference);
Exemple #17
0
 public abstract ModelAnimationTagResource GetModelAnimationTagResource(TagResourceReference resourceReference);
Exemple #18
0
 public abstract RenderGeometryApiResourceDefinition GetRenderGeometryApiResourceDefinition(TagResourceReference resourceReference);
        public override RenderGeometryApiResourceDefinition GetRenderGeometryApiResourceDefinition(TagResourceReference resourceReference)
        {
            if (!IsResourceReferenceValid(resourceReference))
            {
                return(null);
            }
            var resource = GetPageableResource(resourceReference).Resource;

            if (resource.ResourceType != TagResourceTypeGen3.RenderGeometry)
            {
                return(null);
            }
            return(GetResourceDefinition <RenderGeometryApiResourceDefinition>(resourceReference));
        }
Exemple #20
0
 public override BinkResource GetBinkResource(TagResourceReference resourceReference)
 {
     throw new NotImplementedException();
 }
Exemple #21
0
        public override RenderGeometryApiResourceDefinition GetRenderGeometryApiResourceDefinition(TagResourceReference resourceReference)
        {
            var tagResource = GetTagResourceFromReference(resourceReference);

            if (!IsResourceValid(tagResource) || GetResourceTypeName(tagResource) != "render_geometry_api_resource_definition")
            {
                return(null);
            }
            return(GetResourceDefinition <RenderGeometryApiResourceDefinition>(resourceReference));
        }
Exemple #22
0
 public abstract BinkResource GetBinkResource(TagResourceReference resourceReference);
Exemple #23
0
 public abstract BitmapTextureInterleavedInteropResource GetBitmapTextureInterleavedInteropResource(TagResourceReference resourceReference);
 public PageableResource GetPageableResource(TagResourceReference resourceReference)
 {
     return(resourceReference.HaloOnlinePageableResource);
 }