Esempio n. 1
0
        private void LoadMeshData(BlamCacheFile cacheFile, StructureLayout meshLayout)
        {
            IReader reader = cacheFile.Reader;
            StructureValueCollection meshValueCollection = StructureReader.ReadStructure(reader, meshLayout);

            ulong numSubmeshes    = meshValueCollection.GetInteger("number of submeshes");
            ulong numVertexGroups = meshValueCollection.GetInteger("number of vertex groups");

            uint submeshTableOffset     = (uint)cacheFile.PointerToFileOffset((uint)meshValueCollection.GetInteger("submesh table address"));
            uint vertexGroupTableOffset = (uint)cacheFile.PointerToFileOffset((uint)meshValueCollection.GetInteger("vertex group table address"));

            Submeshes = new List <BlamModelSubmesh>((int)numSubmeshes);
            for (int i = 0; i < Submeshes.Capacity; i++)
            {
                Submeshes.Add(new BlamModelSubmesh(submeshTableOffset, i, cacheFile));
            }
            VertexGroups = new List <BlamModelVertexGroup>((int)numVertexGroups);
            for (int i = 0; i < VertexGroups.Capacity; i++)
            {
                VertexGroups.Add(new BlamModelVertexGroup(vertexGroupTableOffset, i, cacheFile));
            }
            VertexType = (MeshVertexType)meshValueCollection.GetInteger("vertex format");

            for (int i = 1; i <= VertexBufferIndices.Length; i++)
            {
                string indexerString = string.Format("vertex buffer {0}", i);
                VertexBufferIndices[i - 1] = (Int16)meshValueCollection.GetInteger(indexerString);
            }

            for (int i = 1; i <= IndexBufferIndices.Length; i++)
            {
                string indexerString = string.Format("index buffer {0}", i);
                IndexBufferIndices[i - 1] = (Int16)meshValueCollection.GetInteger(indexerString);
            }
        }
Esempio n. 2
0
        private void LoadRegions(ITag modelTag, BlamCacheFile blamCacheFile)
        {
            IReader         reader            = blamCacheFile.Reader;
            StructureLayout renderModelLayout = blamCacheFile.GetLayout("render model");

            reader.SeekTo(modelTag.MetaLocation.AsOffset());
            renderModelValues = StructureReader.ReadStructure(blamCacheFile.Reader, renderModelLayout);

            ulong numRegions         = renderModelValues.GetInteger("number of regions");
            ulong regionTableAddress = renderModelValues.GetInteger("region table address");

            long expandedRegionTableOffset = blamCacheFile.PointerToFileOffset((uint)regionTableAddress);

            StructureLayout modelRegionLayout = blamCacheFile.GetLayout("model region");

            ResourceDatumIndex = new DatumIndex(renderModelValues.GetInteger("resource datum index"));
            Regions            = new List <BlamRenderModelRegion>();

            var x = blamCacheFile.Get().Resources.LoadResourceTable(blamCacheFile.Reader).Resources[ResourceDatumIndex.Index];

            for (ulong regionNum = 0ul; regionNum < numRegions; regionNum++)
            {
                long regionPointer = expandedRegionTableOffset + (long)((ulong)modelRegionLayout.Size * regionNum);
                Regions.Add(new BlamRenderModelRegion(regionPointer, blamCacheFile));
            }
        }
Esempio n. 3
0
        private void LoadModelCompressionData(ITag modelTag, BlamCacheFile blamCacheFile)
        {
            ulong numBoundingBoxes       = renderModelValues.GetInteger("number of bounding boxes");
            ulong boundingBoxTableAddr   = renderModelValues.GetInteger("bounding box table address");
            ulong boundingboxTableOffset = (ulong)blamCacheFile.PointerToFileOffset((uint)boundingBoxTableAddr);

            StructureLayout boundingBoxElementLayout = blamCacheFile.GetLayout("model bounding box");

            Compression = new BlamModelCompression();
            List <StructureValueCollection> boundingBoxTableData = new List <StructureValueCollection>((int)numBoundingBoxes);

            for (ulong i = 0; i < numBoundingBoxes; i++)
            {
                ulong offset = (i * (ulong)boundingBoxElementLayout.Size);
                blamCacheFile.Reader.SeekTo((long)(boundingboxTableOffset + offset));
                boundingBoxTableData.Add(StructureReader.ReadStructure(blamCacheFile.Reader, boundingBoxElementLayout));
            }
            Compression.ReadCompressionData(boundingBoxTableData);
        }
Esempio n. 4
0
        private void LoadRenderGeometry(ITag modelTag, BlamCacheFile blamCacheFile)
        {
            ulong runtimeGeometryFlags = renderModelValues.GetInteger("render geometry runtime flags");
            ulong numMeshes            = renderModelValues.GetInteger("number of sections");
            ulong meshTableAddress     = renderModelValues.GetInteger("section table address");

            ulong meshTableOffset = (ulong)blamCacheFile.PointerToFileOffset((uint)meshTableAddress);

            Geometry = new BlamModelRenderGeometry((RenderGeometryRuntimeFlags)runtimeGeometryFlags, meshTableOffset, numMeshes);
            var resources = blamCacheFile.ResourceTable;

            foreach (var res in resources.Resources)
            {
                ITag tag = res.ParentTag;
                if (tag != modelTag)
                {
                    continue;
                }

                Geometry.Read(blamCacheFile, res);
                break;
            }
        }