Ejemplo n.º 1
0
        public override void Unpack(BinaryReader reader, BSPType treeType)
        {
            Type = reader.ReadUInt32();

            SplittingPlane = new Plane();
            SplittingPlane.Unpack(reader);

            PosNode = BSPNode.ReadNode(reader, treeType);
            NegNode = BSPNode.ReadNode(reader, treeType);

            if (treeType == BSPType.Drawing)
            {
                Sphere = new Sphere();
                Sphere.Unpack(reader);

                var numPolys   = reader.ReadUInt32();
                var numPortals = reader.ReadUInt32();

                InPolys = new List <ushort>();
                for (uint i = 0; i < numPolys; i++)
                {
                    InPolys.Add(reader.ReadUInt16());
                }

                InPortals.Unpack(reader, numPortals);
            }
        }
Ejemplo n.º 2
0
        public static BSPNode ReadNode(BinaryReader reader, BSPType treeType)
        {
            // We peek forward to get the type, then revert our position.
            var type = Encoding.ASCII.GetString(reader.ReadBytes(4)).Reverse();

            reader.BaseStream.Position -= 4;

            BSPNode node;

            switch (type)
            {
            case "PORT":
                node = new BSPPortal();
                break;

            case "LEAF":
                node = new BSPLeaf();
                break;

            case "BPnn":
            case "BPIn":
            case "BpIN":
            case "BpnN":
            case "BPIN":
            case "BPnN":
            default:
                node = new BSPNode();
                break;
            }

            node.Unpack(reader, treeType);

            return(node);
        }
Ejemplo n.º 3
0
        public static BSPNode ReadNode(BinaryReader reader, BSPType treeType)
        {
            // We peek forward to get the type, then revert our position.
            var type = reader.ReadUInt32();

            reader.BaseStream.Position -= 4;

            BSPNode node;

            switch (type)
            {
            case PORT:
                node = new BSPPortal();
                break;

            case LEAF:
                node = new BSPLeaf();
                break;

            case BPnn:
            case BPIn:
            case BpIN:
            case BpnN:
            case BPIN:
            case BPnN:
            default:
                node = new BSPNode();
                break;
            }

            node.Unpack(reader, treeType);

            return(node);
        }
Ejemplo n.º 4
0
        public static BSPTree Read(DatReader datReader, BSPType treeType)
        {
            BSPTree obj = new BSPTree();

            obj.RootNode = BSPNode.Read(datReader, treeType);
            return(obj);
        }
Ejemplo n.º 5
0
        public static BSPPortal ReadPortal(DatReader datReader, BSPType treeType)
        {
            BSPPortal obj = new BSPPortal();

            obj.Type           = 0x504F5254; // PORT
            obj.SplittingPlane = Plane.Read(datReader);
            obj.PosNode        = BSPNode.Read(datReader, treeType);
            obj.NegNode        = BSPNode.Read(datReader, treeType);

            if (treeType == BSPType.Drawing)
            {
                obj.Sphere = CSphere.Read(datReader);

                uint numPolys   = datReader.ReadUInt32();
                uint numPortals = datReader.ReadUInt32();

                for (uint i = 0; i < numPolys; i++)
                {
                    obj.InPolys.Add(datReader.ReadUInt16());
                }

                for (uint i = 0; i < numPortals; i++)
                {
                    obj.InPortals.Add(PortalPoly.Read(datReader));
                }
            }

            return(obj);
        }
Ejemplo n.º 6
0
        public TreeNode BuildTree(BSPType bspType)
        {
            var root = new TreeNode("Root");

            root.Items.AddRange(new BSPNode(_bspTree.RootNode).BuildTree(bspType));

            return(root);
        }
Ejemplo n.º 7
0
        } = new List <ushort>();                                        // List of PolygonIds

        public static BSPNode Read(DatReader datReader, BSPType treeType)
        {
            BSPNode obj = new BSPNode();

            obj.Type = datReader.ReadUInt32();

            switch (obj.Type)
            {
            case PORT:
                return(BSPPortal.ReadPortal(datReader, treeType));

            case LEAF:
                return(BSPLeaf.ReadLeaf(datReader, treeType));
            }

            obj.SplittingPlane = Plane.Read(datReader);

            switch (obj.Type)
            {
            case BPnn:
            case BPIn:
                obj.PosNode = BSPNode.Read(datReader, treeType);
                break;

            case BpIN:
            case BpnN:
                obj.NegNode = BSPNode.Read(datReader, treeType);
                break;

            case BPIN:
            case BPnN:
                obj.PosNode = BSPNode.Read(datReader, treeType);
                obj.NegNode = BSPNode.Read(datReader, treeType);
                break;
            }

            if (treeType == BSPType.Cell)
            {
                return(obj);
            }

            obj.Sphere = CSphere.Read(datReader);

            if (treeType == BSPType.Physics)
            {
                return(obj);
            }

            uint numPolys = datReader.ReadUInt32();

            for (uint i = 0; i < numPolys; i++)
            {
                obj.InPolys.Add(datReader.ReadUInt16());
            }
            return(obj);
        }
Ejemplo n.º 8
0
        public virtual void Unpack(BinaryReader reader, BSPType treeType)
        {
            Type = Encoding.ASCII.GetString(reader.ReadBytes(4)).Reverse();

            switch (Type)
            {
            // These types will unpack the data completely, in their own classes
            case "PORT":
            case "LEAF":
                throw new Exception();
            }

            SplittingPlane = new Plane();
            SplittingPlane.Unpack(reader);

            switch (Type)
            {
            case "BPnn":
            case "BPIn":
                PosNode = BSPNode.ReadNode(reader, treeType);
                break;

            case "BpIN":
            case "BpnN":
                NegNode = BSPNode.ReadNode(reader, treeType);
                break;

            case "BPIN":
            case "BPnN":
                PosNode = BSPNode.ReadNode(reader, treeType);
                NegNode = BSPNode.ReadNode(reader, treeType);
                break;
            }

            if (treeType == BSPType.Cell)
            {
                return;
            }

            Sphere = new Sphere();
            Sphere.Unpack(reader);

            if (treeType == BSPType.Physics)
            {
                return;
            }

            InPolys = new List <ushort>();
            uint numPolys = reader.ReadUInt32();

            for (uint i = 0; i < numPolys; i++)
            {
                InPolys.Add(reader.ReadUInt16());
            }
        }
Ejemplo n.º 9
0
        public virtual List<TreeNode> BuildTree(BSPType bspType)
        {
            var type = new TreeNode($"Type: {_bspNode.Type:X8}");

            var splitter = new TreeNode("Splitting Plane: ");
            if (_bspNode.SplittingPlane != null)
                splitter.Name += new Plane(_bspNode.SplittingPlane).ToString();

            var treeNode = new List<TreeNode>() { type, splitter };

            var posNode = new TreeNode("PosNode:");
            if (_bspNode.PosNode != null)
            {
                if (_bspNode.PosNode is ACE.DatLoader.Entity.BSPLeaf leaf)
                    posNode.Items.AddRange(new BSPLeaf(leaf).BuildTree(bspType));
                else if (_bspNode.PosNode is ACE.DatLoader.Entity.BSPPortal portal)
                    posNode.Items.AddRange(new BSPPortal(portal).BuildTree(bspType));
                else
                    posNode.Items.AddRange(new BSPNode(_bspNode.PosNode).BuildTree(bspType));

                treeNode.Add(posNode);
            }

            var negNode = new TreeNode("NegNode:");
            if (_bspNode.NegNode != null)
            {
                if (_bspNode.NegNode is ACE.DatLoader.Entity.BSPLeaf leaf)
                    negNode.Items.AddRange(new BSPLeaf(leaf).BuildTree(bspType));
                else if (_bspNode.NegNode is ACE.DatLoader.Entity.BSPPortal portal)
                    negNode.Items.AddRange(new BSPPortal(portal).BuildTree(bspType));
                else
                    negNode.Items.AddRange(new BSPNode(_bspNode.NegNode).BuildTree(bspType));

                treeNode.Add(negNode);
            }

            if (bspType == BSPType.Cell)
                return treeNode;

            var sphere = new TreeNode($"Sphere: {new Sphere(_bspNode.Sphere).ToString()}");
            treeNode.Add(sphere);

            if (bspType == BSPType.Physics)
                return treeNode;

            var inPolys = new TreeNode($"InPolys: {String.Join(", ", _bspNode.InPolys)}");
            treeNode.Add(inPolys);

            return treeNode;
        }
Ejemplo n.º 10
0
        public override void Unpack(BinaryReader reader, BSPType treeType)
        {
            Type = Encoding.ASCII.GetString(reader.ReadBytes(4)).Reverse();

            LeafIndex = reader.ReadInt32();

            if (treeType == BSPType.Physics)
            {
                Solid = reader.ReadInt32();

                // Note that if Solid is equal to 0, these values will basically be null. Still read them, but they don't mean anything.
                Sphere = new Sphere();
                Sphere.Unpack(reader);

                InPolys = new List <ushort>();
                uint numPolys = reader.ReadUInt32();
                for (uint i = 0; i < numPolys; i++)
                {
                    InPolys.Add(reader.ReadUInt16());
                }
            }
        }
Ejemplo n.º 11
0
        public static BSPLeaf ReadLeaf(DatReader datReader, BSPType treeType)
        {
            BSPLeaf obj = new BSPLeaf();

            obj.Type      = 0x4C454146; // LEAF
            obj.LeafIndex = datReader.ReadInt32();

            if (treeType == BSPType.Physics)
            {
                obj.Solid = datReader.ReadInt32();
                // Note that if Solid is equal to 0, these values will basically be null. Still read them, but they don't mean anything.
                obj.Sphere = CSphere.Read(datReader);

                uint numPolys = datReader.ReadUInt32();
                for (uint i = 0; i < numPolys; i++)
                {
                    obj.InPolys.Add(datReader.ReadUInt16());
                }
            }

            return(obj);
        }
Ejemplo n.º 12
0
        public override List <TreeNode> BuildTree(BSPType bspType)
        {
            var type    = new TreeNode($"Type: {_bspLeaf.Type}");
            var leafIdx = new TreeNode($"LeafIndex: {_bspLeaf.LeafIndex}");

            var treeNode = new List <TreeNode>()
            {
                type, leafIdx
            };

            if (bspType == BSPType.Physics)
            {
                var solid   = new TreeNode($"Solid: {_bspLeaf.Solid}");
                var sphere  = new TreeNode($"Sphere: {new Sphere(_bspLeaf.Sphere).ToString()}");
                var inPolys = new TreeNode($"InPolys: {String.Join(", ", _bspLeaf.InPolys)}");

                treeNode.AddRange(new List <TreeNode>()
                {
                    solid, sphere, inPolys
                });
            }
            return(treeNode);
        }
Ejemplo n.º 13
0
        public override List <TreeNode> BuildTree(BSPType bspType)
        {
            var type = new TreeNode($"Type: {_bspPortal.Type:X8}");

            var splitter = new TreeNode($"Splitting Plane: {new Plane(_bspPortal.SplittingPlane)}");

            var posNode = new TreeNode("PosNode:");

            if (_bspPortal.PosNode != null)
            {
                if (_bspPortal.PosNode is ACE.DatLoader.Entity.BSPLeaf leaf)
                {
                    posNode.Items.AddRange(new BSPLeaf(leaf).BuildTree(bspType));
                }
                else if (_bspPortal.PosNode is ACE.DatLoader.Entity.BSPPortal portal)
                {
                    posNode.Items.AddRange(new BSPPortal(portal).BuildTree(bspType));
                }
                else
                {
                    posNode.Items.AddRange(new BSPNode(_bspPortal.PosNode).BuildTree(bspType));
                }
            }

            var negNode = new TreeNode("NegNode:");

            if (_bspPortal.NegNode != null)
            {
                if (_bspPortal.NegNode is ACE.DatLoader.Entity.BSPLeaf leaf)
                {
                    negNode.Items.AddRange(new BSPLeaf(leaf).BuildTree(bspType));
                }
                else if (_bspPortal.NegNode is ACE.DatLoader.Entity.BSPPortal portal)
                {
                    negNode.Items.AddRange(new BSPPortal(portal).BuildTree(bspType));
                }
                else
                {
                    negNode.Items.AddRange(new BSPNode(_bspPortal.NegNode).BuildTree(bspType));
                }
            }

            var treeNode = new List <TreeNode>()
            {
                type, splitter, posNode, negNode
            };

            if (bspType == BSPType.Drawing)
            {
                var sphere  = new TreeNode($"Sphere: {new Sphere(_bspPortal.Sphere)}");
                var inPolys = new TreeNode($"InPolys: {string.Join(", ", _bspPortal.InPolys)}");

                var inPortals = new TreeNode("InPortals:");
                foreach (var inPortal in _bspPortal.InPortals)
                {
                    inPortals.Items.Add(new TreeNode(new PortalPoly(inPortal).ToString()));
                }

                treeNode.AddRange(new List <TreeNode>()
                {
                    sphere, inPolys, inPortals
                });
            }
            return(treeNode);
        }
Ejemplo n.º 14
0
 public void Unpack(BinaryReader reader, BSPType treeType)
 {
     RootNode = BSPNode.ReadNode(reader, treeType);
 }