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); }
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); }
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); }
public abstract StructureBspCacheFileTagResources GetStructureBspCacheFileTagResources(TagResourceReference resourceReference);
public abstract SoundResourceDefinition GetSoundResourceDefinition(TagResourceReference resourceReference);
public abstract ModelAnimationTagResource GetModelAnimationTagResource(TagResourceReference resourceReference);
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)); }
public override BinkResource GetBinkResource(TagResourceReference resourceReference) { throw new NotImplementedException(); }
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)); }
public abstract BinkResource GetBinkResource(TagResourceReference resourceReference);
public abstract BitmapTextureInterleavedInteropResource GetBitmapTextureInterleavedInteropResource(TagResourceReference resourceReference);
public PageableResource GetPageableResource(TagResourceReference resourceReference) { return(resourceReference.HaloOnlinePageableResource); }