Exemplo n.º 1
0
        public static DependencyReader CreateReader(this ICacheFile cache, IAddressTranslator translator, Stream stream, bool leaveOpen)
        {
            var reader = new DependencyReader(stream, cache.ByteOrder, leaveOpen);

            reader.RegisterInstance(cache);
            reader.RegisterInstance(translator);

            if (cache.CacheType >= CacheType.Halo2Xbox)
            {
                reader.RegisterType(() => new Matrix4x4
                {
                    M11 = reader.ReadSingle(),
                    M12 = reader.ReadSingle(),
                    M13 = reader.ReadSingle(),

                    M21 = reader.ReadSingle(),
                    M22 = reader.ReadSingle(),
                    M23 = reader.ReadSingle(),

                    M31 = reader.ReadSingle(),
                    M32 = reader.ReadSingle(),
                    M33 = reader.ReadSingle(),

                    M41 = reader.ReadSingle(),
                    M42 = reader.ReadSingle(),
                    M43 = reader.ReadSingle(),
                });
            }

            return(reader);
        }
Exemplo n.º 2
0
        public BlockCollection(DependencyReader reader, MetadataHeader metadata)
        {
            this.metadata = metadata;

            reader.Seek(16, SeekOrigin.Current);
            blockCount = reader.ReadUInt32();
        }
Exemplo n.º 3
0
        public MetadataHeader(DependencyReader reader)
        {
            reader.RegisterInstance(this);

            Header               = reader.ReadObject <TagHeader>();
            Dependencies         = reader.ReadEnumerable <TagDependency>(Header.DependencyCount).ToList();
            DataBlocks           = reader.ReadEnumerable <DataBlock>(Header.DataBlockCount).ToList();
            StructureDefinitions = reader.ReadEnumerable <TagStructureDefinition>(Header.TagStructureCount).ToList();
            DataReferences       = reader.ReadEnumerable <DataBlockReference>(Header.DataReferenceCount).ToList();
            TagReferences        = reader.ReadEnumerable <TagBlockReference>(Header.TagReferenceCount).ToList();
            StringIds            = reader.ReadEnumerable <StringId>(Header.StringIdCount).ToList();

            stringTable     = new List <string>(StringIds.Count);
            stringsByOffset = new Dictionary <int, int>(StringIds.Count);
            stringsByHash   = new Dictionary <uint, int>(StringIds.Count);

            var startPos = reader.BaseStream.Position;

            while (reader.BaseStream.Position < startPos + Header.StringTableSize)
            {
                var relative     = reader.BaseStream.Position - startPos;
                var currentValue = reader.ReadNullTerminatedString();
                stringsByOffset.Add((int)relative, stringTable.Count);

                var hash = MurMur3.Hash32(currentValue);
                if (!stringsByHash.ContainsKey(hash))
                {
                    stringsByHash.Add(hash, stringTable.Count);
                }

                stringTable.Add(currentValue);
            }
        }
Exemplo n.º 4
0
        public DependencyReader CreateReader()
        {
            var fs     = new FileStream(FileName, FileMode.Open, FileAccess.Read);
            var reader = new DependencyReader(fs, ByteOrder.LittleEndian);

            return(reader);
        }
Exemplo n.º 5
0
        public void ExtractCodeDependencies_NamespaceMatch()
        {
            var reader = new DependencyReader();

            var dependency = reader.ExtractCodeDependencies(FileText);

            dependency.Namespace.ShouldBe("Omnia.Behaviours.T99.Internal.System");
        }
Exemplo n.º 6
0
        public static IIndexItem GetShaderDiffuse(TagReference tagRef, DependencyReader reader)
        {
            if (tagRef.Tag == null)
            {
                return(null);
            }

            int offset;

            switch (tagRef.Tag.ClassCode)
            {
            case "soso":
                offset = 176;
                break;

            case "senv":
                offset = 148;
                break;

            case "sgla":
                offset = 356;
                break;

            case "schi":
                offset = 228;
                break;

            case "scex":
                offset = 900;
                break;

            case "swat":
            case "smet":
                offset = 88;
                break;

            default: return(null);
            }

            reader.Seek(tagRef.Tag.MetaPointer.Address + offset, SeekOrigin.Begin);

            var bitmId = reader.ReadInt16();

            if (bitmId == -1)
            {
                return(null);
            }
            else
            {
                return(tagRef.Tag.CacheFile.TagIndex[bitmId]);
            }
        }
Exemplo n.º 7
0
        public CompressedVertex(DependencyReader reader)
        {
            Position   = new RealVector3D(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
            Normal     = new HenDN3(reader.ReadUInt32());
            Binormal   = new HenDN3(reader.ReadUInt32());
            Tangent    = new HenDN3(reader.ReadUInt32());
            TexCoords  = new RealVector2D(reader.ReadInt16() / (float)short.MaxValue, reader.ReadInt16() / (float)short.MaxValue);
            NodeIndex1 = (short)(reader.ReadByte() / 3);
            NodeIndex2 = (short)(reader.ReadByte() / 3);

            var node0Weight = reader.ReadUInt16() / (float)short.MaxValue;

            NodeWeights = new RealVector2D(node0Weight, 1 - node0Weight);
        }
Exemplo n.º 8
0
        public BlockCollection(DependencyReader reader, ICacheFile cache, IAddressTranslator translator, IPointerExpander expander)
            : base(reader, cache, translator, expander)
        {
            if (IsInvalid)
            {
                return;
            }

            reader.BaseStream.Position = Pointer.Address;
            for (int i = 0; i < Count; i++)
            {
                items.Add((T)reader.ReadObject(typeof(T), (int)cache.CacheType));
            }
        }
Exemplo n.º 9
0
        public void ExtractFileDependencies_Successfully()
        {
            var reader = new DependencyReader();

            var references = reader.ExtractFileDependencies(@"
<Project Sdk=""Microsoft.NET.Sdk"">

  <PropertyGroup>
    <TargetFramework>net472</TargetFramework>
    <AssemblyTitle>MySystem.External.MyCompany</AssemblyTitle>
    <AssemblyVersion>1.0.1</AssemblyVersion>
    <FileVersion>1.0.1</FileVersion>
  </PropertyGroup>

  <PropertyGroup>
    <OutputPath>$(ProjectDir)bin</OutputPath>
    <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include=""Google.Protobuf"" Version=""3.6.1"" />
    <PackageReference Include=""Microsoft.AspNet.WebApi.Client"" Version=""5.2.6"" />
    <PackageReference Include=""Newtonsoft.Json"" Version=""12.0.3"" />
    <PackageReference Include=""Omnia.Libraries.Infrastructure.Connector.Client"" Version=""3.0.237"" />
    <PackageReference Include=""Omnia.Libraries.Infrastructure.Behaviours"" Version=""3.0.118"" />
    <PackageReference Include=""Microsoft.Extensions.DependencyInjection"" Version=""3.1.3"" /> 
    <PackageReference Include=""Microsoft.Extensions.Http"" Version=""3.1.3"" />
	<PackageReference Include=""Microsoft.CSharp"" Version=""4.5.0"" />
  </ItemGroup>

  <ItemGroup>
    <Compile Include=""..\..\_common\**\*.*"" LinkBase=""_common"" />
  </ItemGroup>

	 <ItemGroup>
    <Reference Include=""MyCompany"">
      <HintPath>C:\Program Files (x86)\Common Files\MyCompany\MyCompany.dll</HintPath>
    </Reference>
  </ItemGroup>
	
</Project>");


            references.Count.ShouldBe(1);
            var reference = references.First();

            reference.AssemblyName.ShouldBe("MyCompany");
            reference.Path.ShouldBe(@"C:\Program Files (x86)\Common Files\MyCompany\MyCompany.dll");
        }
Exemplo n.º 10
0
        public DataPointer(DependencyReader reader, ICacheFile cache)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            if (cache == null)
            {
                throw new ArgumentNullException(nameof(cache));
            }

            _value = reader.ReadInt32();
            _cache = cache;
        }
Exemplo n.º 11
0
        public ResourceIdentifier(DependencyReader reader, ICacheFile cache)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            if (cache == null)
            {
                throw new ArgumentNullException(nameof(cache));
            }

            this.cache = cache;
            identifier = reader.ReadInt32();
        }
Exemplo n.º 12
0
        private DependencyReader CreateReader(string fileName, IAddressTranslator translator)
        {
            var fs     = new FileStream(fileName, FileMode.Open, FileAccess.Read);
            var reader = new DependencyReader(fs, ByteOrder);

            reader.RegisterInstance <CacheFile>(this);
            reader.RegisterInstance <ICacheFile>(this);

            if (translator != null)
            {
                reader.RegisterInstance <IAddressTranslator>(translator);
            }

            return(reader);
        }
Exemplo n.º 13
0
        public void ExtractCodeDependencies_Successfully()
        {
            var reader = new DependencyReader();

            var data = reader.ExtractCodeDependencies(FileText);

            data.Expression.ShouldNotBeNull();
            data.Expression.ShouldBe(@"using MyCompany;
    namespace CodeDependencies
    {
        public class MyDto
        {
            public string Name { get; set; }
        }
    }");
        }
Exemplo n.º 14
0
        public TagBlock(DependencyReader reader, ICacheFile cache, IAddressTranslator translator, IPointerExpander expander)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            if (translator == null)
            {
                throw new ArgumentNullException(nameof(translator));
            }

            Count   = reader.ReadInt32();
            Pointer = new Pointer(reader.ReadInt32(), translator, expander);

            IsInvalid = Count <= 0 || Pointer.Address < 0 || Pointer.Address >= reader.BaseStream.Length;
        }
Exemplo n.º 15
0
        internal DependencyReader CreateReader(Stream stream)
        {
            var reader = new DependencyReader(stream, ByteOrder.LittleEndian);

            //verify header when reading a module file
            if (stream is FileStream)
            {
                var header = reader.PeekInt32();

                if (header != ModuleHeader)
                {
                    throw Exceptions.NotAValidMapFile(FileName);
                }
            }

            reader.RegisterInstance(this);

            return(reader);
        }
Exemplo n.º 16
0
        internal void LoadBlocks(int currentBlock, long collectionOffset, DependencyReader reader)
        {
            if (blockCount == 0)
            {
                return;
            }

            var structdef = metadata.StructureDefinitions.First(s => s.FieldBlock == currentBlock && s.FieldOffset == collectionOffset);

            if (structdef.TargetIndex < 0)
            {
                return;
            }

            var block = metadata.DataBlocks[structdef.TargetIndex];

            var blockSize = FixedSizeAttribute.ValueFor(typeof(T));

            reader.Seek(block.Offset, SeekOrigin.Begin);
            for (int i = 0; i < blockCount; i++)
            {
                Add(reader.ReadObject <T>());
            }

            var blockProps = typeof(T).GetProperties()
                             .Where(p => p.PropertyType.IsGenericType && p.PropertyType.GetGenericTypeDefinition() == typeof(BlockCollection <>));

            int index = 0;

            foreach (var item in this)
            {
                var adjustedBase = blockSize * index++;
                foreach (var prop in blockProps)
                {
                    var collection = prop.GetValue(item) as IBlockCollection;
                    var offset     = OffsetAttribute.ValueFor(prop);
                    collection.LoadBlocks(structdef.TargetIndex, adjustedBase + offset, reader);
                }
            }
        }
Exemplo n.º 17
0
        internal void ReadItems(DependencyReader reader)
        {
            if (items.Any())
            {
                throw new InvalidOperationException();
            }

            for (int i = 0; i < TagCount; i++)
            {
                reader.Seek(cache.Header.IndexAddress + HeaderSize + i * 32, SeekOrigin.Begin);

                var item = reader.ReadObject(new IndexItem(cache));
                items.Add(item);

                if (CacheFactory.SystemClasses.Contains(item.ClassCode))
                {
                    sysItems.Add(item.ClassCode, item);
                }

                reader.Seek(item.FileNamePointer.Address, SeekOrigin.Begin);
                Filenames.Add(item.Id, reader.ReadNullTerminatedString());
            }
        }
Exemplo n.º 18
0
        public DdsImage ToDds(int index)
        {
            if (index < 0 || index >= Bitmaps.Count)
            {
                throw new ArgumentOutOfRangeException(nameof(index));
            }

            var submap = Bitmaps[index];

            var dir          = Directory.GetParent(cache.FileName).FullName;
            var bitmapSource = Path.Combine(dir, CacheFile.BitmapsMap);

            //Xbox maps and player-made CE maps use internal bitmap resources
            if (cache.CacheType == CacheType.Halo1Xbox ||
                cache.CacheType == CacheType.Halo1CE && item.MetaPointer.Address > 0)
            {
                bitmapSource = cache.FileName;
            }

            byte[] data;

            using (var fs = new FileStream(bitmapSource, FileMode.Open, FileAccess.Read))
                using (var reader = new DependencyReader(fs, ByteOrder.LittleEndian))
                {
                    reader.Seek(submap.PixelsOffset, SeekOrigin.Begin);
                    data = reader.ReadBytes(submap.PixelsSize);
                }

            //not sure if this works, haven't seen any Halo1 bitmaps with the swizzle flag
            //if (submap.Flags.HasFlag(BitmapFlags.Swizzled))
            //{
            //    var bpp = submap.BitmapFormat.Bpp();
            //    data = TextureUtils.Swizzle(data, submap.Width, submap.Height, 1, bpp);
            //}

            return(TextureUtils.GetDds(submap.Height, submap.Width, submap.BitmapFormat, submap.BitmapType == TextureType.CubeMap, data));
        }
Exemplo n.º 19
0
 public BlockCollection(DependencyReader reader, ICacheFile cache, IAddressTranslator translator)
     : this(reader, cache, translator, null)
 {
 }
Exemplo n.º 20
0
        public static IEnumerable <GeometryMaterial> GetMaterials(IEnumerable <TagReference> shaderRefs, DependencyReader reader)
        {
            foreach (var shaderRef in shaderRefs)
            {
                var bitmTag = GetShaderDiffuse(shaderRef, reader);
                if (bitmTag == null)
                {
                    yield return(null);

                    continue;
                }

                yield return(new GeometryMaterial
                {
                    Name = Utils.GetFileName(shaderRef.Tag.FullPath),
                    Submaterials = new List <ISubmaterial>
                    {
                        new SubMaterial
                        {
                            Usage = MaterialUsage.Diffuse,
                            Bitmap = bitmTag.ReadMetadata <bitmap>(),
                            Tiling = new RealVector2D(1, 1)
                        }
                    }
                });
            }
        }
Exemplo n.º 21
0
 void IBlockCollection.LoadBlocks(int currentBlock, long collectionOffset, DependencyReader itemReader) => LoadBlocks(currentBlock, collectionOffset, itemReader);
Exemplo n.º 22
0
        private IEnumerable <GeometryMesh> ReadPCMeshes(DependencyReader reader)
        {
            var tagIndex = cache.TagIndex as ITagIndexGen1;

            if (tagIndex == null)
            {
                throw new NotSupportedException();
            }

            foreach (var section in Sections)
            {
                var indices   = new List <int>();
                var vertices  = new List <UncompressedVertex>();
                var submeshes = new List <IGeometrySubmesh>();

                foreach (var submesh in section.Submeshes)
                {
                    var gSubmesh = new GeometrySubmesh
                    {
                        MaterialIndex = submesh.ShaderIndex,
                        IndexStart    = indices.Count,
                        IndexLength   = submesh.IndexCount + 2
                    };

                    submeshes.Add(gSubmesh);

                    reader.Seek(tagIndex.VertexDataOffset + tagIndex.IndexDataOffset + submesh.IndexOffset, SeekOrigin.Begin);
                    indices.AddRange(reader.ReadEnumerable <ushort>(gSubmesh.IndexLength).Select(i => i + vertices.Count));

                    reader.Seek(tagIndex.VertexDataOffset + submesh.VertexOffset, SeekOrigin.Begin);
                    var vertsTemp = reader.ReadEnumerable <UncompressedVertex>(submesh.VertexCount).ToList();

                    if (UScale != 1 || VScale != 1)
                    {
                        vertsTemp.ForEach((v) =>
                        {
                            var vec     = v.TexCoords;
                            vec.X      *= UScale;
                            vec.Y      *= VScale;
                            v.TexCoords = vec;
                        });
                    }

                    if (Flags.HasFlag(ModelFlags.UseLocalNodes))
                    {
                        var address = section.Submeshes.Pointer.Address;
                        address += section.Submeshes.IndexOf(submesh) * 132;
                        reader.Seek(address + 107, SeekOrigin.Begin);
                        var nodeCount = reader.ReadByte();
                        var nodes     = reader.ReadEnumerable <byte>(nodeCount).ToArray();

                        vertsTemp.ForEach((v) =>
                        {
                            v.NodeIndex1 = nodes[v.NodeIndex1];
                            v.NodeIndex2 = nodes[v.NodeIndex2];
                        });
                    }

                    vertices.AddRange(vertsTemp);
                }

                yield return(new GeometryMesh
                {
                    IndexFormat = IndexFormat.TriangleStrip,
                    VertexWeights = VertexWeights.Skinned,
                    Indicies = indices.ToArray(),
                    Vertices = vertices.ToArray(),
                    Submeshes = submeshes
                });
            }
        }
Exemplo n.º 23
0
        private IEnumerable <GeometryMesh> ReadXboxMeshes(DependencyReader reader)
        {
            var tagIndex = cache.TagIndex as ITagIndexGen1;

            if (tagIndex == null)
            {
                throw new NotSupportedException();
            }

            foreach (var section in Sections)
            {
                var indices   = new List <int>();
                var vertices  = new List <CompressedVertex>();
                var submeshes = new List <IGeometrySubmesh>();

                foreach (var submesh in section.Submeshes)
                {
                    if (submesh.IndexCount == 0 || submesh.VertexCount == 0)
                    {
                        continue;
                    }

                    try
                    {
                        var gSubmesh = new GeometrySubmesh
                        {
                            MaterialIndex = submesh.ShaderIndex,
                            IndexStart    = indices.Count,
                            IndexLength   = submesh.IndexCount + 2
                        };

                        submeshes.Add(gSubmesh);

                        reader.Seek(submesh.IndexOffset - tagIndex.Magic, SeekOrigin.Begin);
                        reader.ReadInt32();
                        reader.Seek(reader.ReadInt32() - tagIndex.Magic, SeekOrigin.Begin);

                        var indicesTemp = reader.ReadEnumerable <ushort>(gSubmesh.IndexLength).ToList();
                        indices.AddRange(indicesTemp.Select(i => i + vertices.Count));

                        reader.Seek(submesh.VertexOffset - tagIndex.Magic, SeekOrigin.Begin);
                        reader.ReadInt32();
                        reader.Seek(reader.ReadInt32() - tagIndex.Magic, SeekOrigin.Begin);

                        var vertsTemp = new List <CompressedVertex>();
                        for (int i = 0; i < submesh.VertexCount; i++)
                        {
                            vertsTemp.Add(new CompressedVertex(reader));
                        }

                        if (UScale != 1 || VScale != 1)
                        {
                            vertsTemp.ForEach((v) =>
                            {
                                var vec     = v.TexCoords;
                                vec.X      *= UScale;
                                vec.Y      *= VScale;
                                v.TexCoords = vec;
                            });
                        }

                        //if (Flags.HasFlag(ModelFlags.UseLocalNodes))
                        //{
                        //    var address = section.Submeshes.Pointer.Address;
                        //    address += section.Submeshes.IndexOf(submesh) * 208;
                        //    reader.Seek(address + 107, SeekOrigin.Begin);
                        //    var nodeCount = reader.ReadByte();
                        //    var nodes = reader.ReadEnumerable<byte>(nodeCount).ToArray();

                        //    vertsTemp.ForEach((v) =>
                        //    {
                        //        v.NodeIndex1 = nodes[v.NodeIndex1];
                        //        v.NodeIndex2 = nodes[v.NodeIndex2];
                        //    });
                        //}

                        vertices.AddRange(vertsTemp);
                    }
                    catch { }
                }

                yield return(new GeometryMesh
                {
                    IndexFormat = IndexFormat.TriangleStrip,
                    VertexWeights = VertexWeights.Skinned,
                    Indicies = indices.ToArray(),
                    Vertices = vertices.ToArray(),
                    Submeshes = submeshes
                });
            }
        }