예제 #1
0
        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;
                }
            }
        }
예제 #2
0
파일: WMOViewer.cs 프로젝트: justMaku/W3DT
        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;
        }