Beispiel #1
0
        public static B3DFile OpenFile(string filePath)
        {
            using (BinaryReader reader = new BinaryReader(File.OpenRead(filePath)))
            {
                if (!reader.ReadBytes(4).SequenceEqual(B3DHeader))
                {
                    throw new InvalidDataException($"File is not b3d!");
                }

                B3DFile file = new B3DFile();

                //Skipped unused information
                //TODO: is it really unused???
                reader.BaseStream.Seek(4, SeekOrigin.Current);
                uint materialListOffset = reader.ReadUInt32();
                reader.BaseStream.Seek(4, SeekOrigin.Current);
                uint dataOffset = reader.ReadUInt32();

                //Read materials
                //Jump to material definition
                reader.BaseStream.Seek(materialListOffset * 4, SeekOrigin.Begin);

                uint materialLibrarySize = reader.ReadUInt32();

                file.MaterialLibrary = new List <string>();

                for (uint i = 0; i < materialLibrarySize; i++)
                {
                    file.MaterialLibrary.Add(reader.Read32ByteString());
                }

                //Read Data
                //Jump to data definition
                reader.BaseStream.Seek(dataOffset * 4, SeekOrigin.Begin);

                if (reader.ReadUInt32() == (int)Identifier.Chunk_Start)
                {
                    file.Nodes = new List <INode>();

                    uint ident;

                    while ((ident = reader.ReadUInt32()) != (int)Identifier.Chunk_End)
                    {
                        //if(ident == 444) continue; // Unused???

                        if (ident == (int)Identifier.Block_Start)
                        {
                            NodeHeader header = reader.Read <NodeHeader>();

                            INode node = BaseNode.GetNode(header);

                            node.Read(reader);

                            file.Nodes.Add(node);
                        }
                    }
                }

                return(file);
            }

            throw new NotImplementedException();
        }
Beispiel #2
0
        private unsafe static void RenderPage(Transaction tx, Page page, TextWriter sw, string text, bool open)
        {
            sw.WriteLine(
                "<ul><li><input type='checkbox' id='page-{0}' {3} /><label for='page-{0}'>{4}: Page {0:#,#;;0} - {1} - {2:#,#;;0} entries</label><ul>",
                page.PageNumber, page.IsLeaf ? "Leaf" : "Branch", page.NumberOfEntries, open ? "checked" : "", text);

            for (int i = 0; i < page.NumberOfEntries; i++)
            {
                var nodeHeader = page.GetNode(i);
                if (page.IsLeaf)
                {
                    var key = new Slice(nodeHeader).ToString();
                    sw.Write("<li>{0} {1} - size: {2:#,#}</li>", key, nodeHeader->Flags, NodeHeader.GetDataSize(tx, nodeHeader));
                }
                else
                {
                    var key = new Slice(nodeHeader).ToString();

                    var pageNum = nodeHeader->PageNumber;

                    if (i == 0)
                    {
                        key = "[smallest]";
                    }

                    RenderPage(tx, tx.GetReadOnlyPage(pageNum), sw, key, false);
                }
            }

            sw.WriteLine("</ul></li></ul>");
        }
Beispiel #3
0
 public Node GetNode(NodeHeader node)
 {
     return(this.Find(x => x.Header.ID == node.ID));
 }
Beispiel #4
0
 public Node(NodeHeader header)
 {    
     this.Header = header;
 }