public override void storeChunk(Chunk_Base chunk) { if (chunk is IChunkSoup) { if (groupRoot != null) { groupRoot.addChunk(chunk); } else { Log.Write("WMO: MOGP sub-chunk found before the MOGP chunk? Darkness! Madness!"); } } else { Chunks.Add(chunk); if (chunk is Chunk_MOGP) { groupRoot = (Chunk_MOGP)chunk; } } }
private void CreateWMOMesh() { loadingWindow.Close(); loadingWindow = null; if (loadedFile == null) { return; } Log.Write("CreateWMOMesh: Created new meshes from WMO data..."); texManager.clear(); // Clear any existing textures from the GL. meshes.Clear(); // Clear existing meshes. UI_MeshList.Items.Clear(); // Load all textures into the texture manager. Chunk_MOTX texChunk = (Chunk_MOTX)loadedFile.getChunk(Chunk_MOTX.Magic); foreach (KeyValuePair <int, string> tex in texChunk.textures.raw()) { texManager.addTexture(tex.Key, Path.Combine(Constants.TEMP_DIRECTORY, tex.Value)); } Chunk_MOGN nameChunk = (Chunk_MOGN)loadedFile.getChunk(Chunk_MOGN.Magic); // Material register. Chunk_MOMT matChunk = (Chunk_MOMT)loadedFile.getChunk(Chunk_MOMT.Magic); foreach (Chunk_Base rawChunk in loadedFile.getChunksByID(Chunk_MOGP.Magic)) { Chunk_MOGP chunk = (Chunk_MOGP)rawChunk; string meshName = nameChunk.data.get((int)chunk.groupNameIndex); // Skip antiportals. if (meshName.ToLower().Equals("antiportal")) { continue; } Mesh mesh = new Mesh(meshName); // Populate mesh with vertices. Chunk_MOVT vertChunk = (Chunk_MOVT)chunk.getChunk(Chunk_MOVT.Magic); foreach (Position vertPos in vertChunk.vertices) { mesh.addVert(vertPos); } // Populate mesh with UVs. Chunk_MOTV uvChunk = (Chunk_MOTV)chunk.getChunk(Chunk_MOTV.Magic); foreach (UV uv in uvChunk.uvData) { mesh.addUV(uv); } // Populate mesh with normals. Chunk_MONR normChunk = (Chunk_MONR)chunk.getChunk(Chunk_MONR.Magic); foreach (Position norm in normChunk.normals) { mesh.addNormal(norm); } // Populate mesh with triangles (faces). Chunk_MOVI faceChunk = (Chunk_MOVI)chunk.getChunk(Chunk_MOVI.Magic); Chunk_MOPY faceMatChunk = (Chunk_MOPY)chunk.getChunk(Chunk_MOPY.Magic); for (int i = 0; i < faceChunk.positions.Length; i++) { FacePosition position = faceChunk.positions[i]; FaceInfo info = faceMatChunk.faceInfo[i]; if (info.materialID != 0xFF) // 0xFF (255) identifies a collision face. { Material mat = matChunk.materials[info.materialID]; uint texID = texManager.getTexture((int)mat.texture1.offset); mesh.addFace(texID, mat.texture2.colour, position.point1, position.point2, position.point3); } } Log.Write("CreateWMOMesh: " + mesh.ToAdvancedString()); meshes.Add(mesh); UI_MeshList.Items.Add(mesh); } for (int i = 0; i < UI_MeshList.Items.Count; i++) { UI_MeshList.SetItemChecked(i, true); } // Reset 3D autoRotate = true; rotationY = 0f; //rotationZ = 0f; zoom = 1f; }