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; }