예제 #1
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);
        }
예제 #2
0
        public static CSphere Read(DatReader datReader)
        {
            CSphere obj = new CSphere();

            obj.Origin = new AceVector3(datReader.ReadSingle(), datReader.ReadSingle(), datReader.ReadSingle());
            obj.Radius = datReader.ReadSingle();
            return(obj);
        }
예제 #3
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);
        }
예제 #4
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);
        }