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); } }
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); }
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); }
public static BSPTree Read(DatReader datReader, BSPType treeType) { BSPTree obj = new BSPTree(); obj.RootNode = BSPNode.Read(datReader, treeType); return(obj); }
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); }
public TreeNode BuildTree(BSPType bspType) { var root = new TreeNode("Root"); root.Items.AddRange(new BSPNode(_bspTree.RootNode).BuildTree(bspType)); return(root); }
} = 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); }
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()); } }
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; }
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()); } } }
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); }
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); }
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); }
public void Unpack(BinaryReader reader, BSPType treeType) { RootNode = BSPNode.ReadNode(reader, treeType); }