private bool LoadTerrainQuad(QuadDesc quad, out QuadTree qt, out QuadTree waterQt, out BBox boundingBox)
 {
     bool flag = false;
     string str = "";
     if (Game.Mode == "fnv")
     {
         str = "meshes\\landscape\\lod\\" + this.worldspaceName + "\\" + this.worldspaceName + ".Level" + this.quadLevel.ToString() + ".X" + quad.x.ToString() + ".Y" + quad.y.ToString() + ".nif";
     }
     else
     {
         str = "meshes\\terrain\\" + this.worldspaceName + "\\" + this.worldspaceName + "." + this.quadLevel.ToString() + "." + quad.x.ToString() + "." + quad.y.ToString() + ".btr";
     }
     boundingBox = new BBox();
     qt = (QuadTree)null;
     waterQt = (QuadTree)null;
     if (!File.Exists(this.gameDir + str) && !BSAArchive.FileExists(str))
     {
         if (this.verbose)
         {
             this.logFile.WriteLog("terrain file not found " + str);
         }
     }
     else
     {
         //Console.WriteLine("Doing " + str);
         //logFile.WriteLog("Doing " + str);
         NiFile niFile = new NiFile();
         niFile.Read(this.gameDir, str, logFile);
         BSMultiBoundNode bsMultiBoundNode1 = (BSMultiBoundNode)niFile.GetBlockAtIndex(0);
         if (bsMultiBoundNode1 != null && bsMultiBoundNode1.GetNumChildren() > 0U)
         {
             BSMultiBound bsMultiBound1 = (BSMultiBound)niFile.GetBlockAtIndex(bsMultiBoundNode1.GetMultiBound());
             BSMultiBoundAABB bsMultiBoundAabb1 = bsMultiBound1 != null ? (BSMultiBoundAABB)niFile.GetBlockAtIndex(bsMultiBound1.GetData()) : (BSMultiBoundAABB)null;
             if (bsMultiBound1 != null && bsMultiBoundAabb1 != null)
             {
                 NiTriShape niTriShape = (NiTriShape)niFile.GetBlockAtIndex(bsMultiBoundNode1.GetChildAtIndex(0));
                 if (niTriShape != null)
                 {
                     NiTriShapeData data = (NiTriShapeData)niFile.GetBlockAtIndex(niTriShape.GetData());
                     Vector3 vector3_1 = bsMultiBoundAabb1.GetPosition() / 4;
                     Vector3 vector3_2 = bsMultiBoundAabb1.GetExtent() / 4;
                     boundingBox.Set(vector3_1[0] - vector3_2[0], vector3_1[0] + vector3_2[0], vector3_1[1] - vector3_2[1], vector3_1[1] + vector3_2[1], vector3_1[2] - vector3_2[2], vector3_1[2] + vector3_2[2]);
                     List<Vector3> vertices = data.GetVertices();
                     if (Game.Mode == "fnv")
                     {
                         for (int index = 0; index < vertices.Count; index++)
                         {
                             vertices[index] = vertices[index] / quadLevel;
                         }
                     }
                     List<Triangle> triangles = data.GetTriangles();
                     for (int index = 0; index < triangles.Count; index++)
                     {
                         Vector3 vertA = vertices[triangles[index][0]];
                         Vector3 vertB = vertices[triangles[index][1]];
                         Vector3 vertC = vertices[triangles[index][2]];
                         if ((vertA[0] == 0 && vertB[0] == 0 && vertC[0] == 0) || (vertA[0] == 4096 && vertB[0] == 4096 && vertC[0] == 4096) || (vertA[1] == 0 && vertB[1] == 0 && vertC[1] == 0) || (vertA[1] == 4096 && vertB[1] == 4096 && vertC[1] == 4096))
                         {
                             triangles.RemoveAt(index);
                             --index;
                         }
                     }
                     data.SetVertices(vertices);
                     data.SetTriangles(triangles);
                     qt = new QuadTree(data, quadLevel);
                     if (qt != null)
                         flag = true;
                 }
             }
             if (Game.Mode != "fnv" && this.removeUnderwaterFaces && bsMultiBoundNode1.GetNumChildren() > 1U)
             {
                 BSMultiBoundNode bsMultiBoundNode2 = (BSMultiBoundNode)niFile.GetBlockAtIndex(bsMultiBoundNode1.GetChildAtIndex(1));
                 if (bsMultiBoundNode2 != null)
                 {
                     BSMultiBound bsMultiBound2 = (BSMultiBound)niFile.GetBlockAtIndex(bsMultiBoundNode2.GetMultiBound());
                     BSMultiBoundAABB bsMultiBoundAabb2 = (BSMultiBoundAABB)niFile.GetBlockAtIndex(bsMultiBound2.GetData());
                     NiTriShapeData datacombined = new NiTriShapeData();
                     ushort numVertices = 0;
                     for (int index = 0; index < bsMultiBoundNode2.GetNumChildren(); index++)
                     {
                         NiObject blockAtIndex = niFile.GetBlockAtIndex(bsMultiBoundNode2.GetChildAtIndex(index));
                         if (blockAtIndex != null)
                         {
                             NiTriShapeData data;
                             if (blockAtIndex.GetClassName() == "BSSegmentedTriShape")
                             {
                                 BSSegmentedTriShape segmentedTriShape = (BSSegmentedTriShape)blockAtIndex;
                                 data = (NiTriShapeData)niFile.GetBlockAtIndex(segmentedTriShape.GetData());
                             }
                             else
                             {
                                 NiTriShape niTriShape = (NiTriShape)blockAtIndex;
                                 data = (NiTriShapeData)niFile.GetBlockAtIndex(niTriShape.GetData());
                             }
                             if (index == 0)
                             {
                                 datacombined = data;
                                 numVertices += data.GetNumVertices();
                             }
                             else
                             {
                                 datacombined.AppendVertices(data.GetVertices());
                                 List<Triangle> triangles = new List<Triangle>(data.GetTriangles());
                                 for (int index2 = 0; index2 < triangles.Count; ++index2)
                                 {
                                     triangles[index2][0] += numVertices;
                                     triangles[index2][1] += numVertices;
                                     triangles[index2][2] += numVertices;
                                 }
                                 datacombined.AppendTriangles(triangles);
                                 numVertices += data.GetNumVertices();
                             }
                         }
                     }
                     Vector3 vector3_1 = bsMultiBoundAabb2.GetPosition() / 4;
                     Vector3 vector3_2 = bsMultiBoundAabb2.GetExtent() / 4;
                     BBox boundingBox1 = new BBox(vector3_1[0] - vector3_2[0], vector3_1[0] + vector3_2[0], vector3_1[1] - vector3_2[1], vector3_1[1] + vector3_2[1], vector3_1[2] - vector3_2[2], vector3_1[2] + vector3_2[2]);
                     waterQt = new QuadTree(datacombined, quadLevel);
                 }
             }
         }
     }
     return flag;
 }