private bool LoadScene(BackgroundWorker worker, DoWorkEventArgs e)
        {
            if (Path.GetExtension(inputFilename) == ".w2w")
            {
                CR2WFile world;
                using (var fs = new FileStream(inputFilename, FileMode.Open, FileAccess.Read))
                    using (var reader = new BinaryReader(fs))
                    {
                        world = new CR2WFile();
                        world.Read(reader);
                        fs.Close();
                    }

                foreach (var worldChunk in world.chunks)
                {
                    if (worldChunk.REDType == "CLayerInfo")
                    {
                        CLayerInfo info          = (CLayerInfo)worldChunk.data;
                        string     layerFileName = depot + info.DepotFilePath;
                        AddLayer(layerFileName, info.DepotFilePath.ToString(), ref meshId);
                    }
                    else if (worldChunk.REDType == "CClipMap")
                    {
                        CClipMap info = (CClipMap)worldChunk.data;
                        AddTerrain(info, ref meshId);
                    }
                }

                // reset the progress bar
                progressBar.Invoke((MethodInvoker) delegate
                {
                    progressBar.Value = 0;
                });
            }
            else if (Path.GetExtension(inputFilename) == ".w2l")
            {
                AddLayer(inputFilename, inputFilename, ref meshId);

                // reset the progress bar
                progressBar.Invoke((MethodInvoker) delegate
                {
                    progressBar.Value = 0;
                });
            }

            return(true);
        }
        private void AddTerrain(CClipMap info, ref int meshId)
        {
            TreeNode terrainNode = new TreeNode("Terrain");

            float maxHeight       = info.HighestElevation.val;
            float minHeight       = info.LowestElevation.val;
            uint  numTilesPerEdge = info.NumTilesPerEdge.val;
            float terrainSize     = info.TerrainSize.val / numTilesPerEdge;

            uint tileRes = 0;
            int  tileLOD = 0;

            Vector3Df startPoint = new Vector3Df(info.TerrainCorner.X.val, info.TerrainCorner.Y.val, info.TerrainCorner.Z.val);

            //string texFileName = info.Material.DepotPath; // this is a .w2mg
            //Texture terrainTex = driver.GetTexture("");
            Vector3Df nextRow = new Vector3Df(startPoint);
            Vector3Df dy      = new Vector3Df(0.0f, terrainSize, 0.0f);
            Vector3Df dx      = new Vector3Df(terrainSize, 0.0f, 0.0f);

            progressBar.Invoke((MethodInvoker) delegate
            {
                progressBar.Maximum = (int)(numTilesPerEdge * numTilesPerEdge);
            });

            int index = 0;

            for (uint y = 0; y < numTilesPerEdge; ++y)
            {
                Vector3Df nextColumn = new Vector3Df(startPoint + dy * y);

                for (uint x = 0; x < numTilesPerEdge; ++x)
                {
                    var tile = info.TerrainTiles[index++];

                    Vector3Df nextPt = new Vector3Df(nextColumn + dx * x);


                    // read the .wter file to get the LOD we need
                    {
                        var wterFileName = depot + tile.DepotPath;

                        CR2WFile wter;
                        using (var fs = new FileStream(wterFileName, FileMode.Open, FileAccess.Read))
                            using (var reader = new BinaryReader(fs))
                            {
                                wter = new CR2WFile();
                                wter.Read(reader);
                                fs.Close();
                            }

                        CTerrainTile crw = (CTerrainTile)wter.chunks[0].data;
                        tileLOD = (int)crw.Groups[1].Lod1.val;
                        tileRes = (uint)crw.Groups[1].Resolution.val;
                    }

                    var tileFileName = tile.DepotPath;
                    tileFileName += ".";
                    tileFileName += tileLOD.ToString();
                    tileFileName += ".buffer";

                    RenderMessage message = new RenderMessage(MessageType.ADD_TERRAIN_NODE, tileFileName, tileRes, maxHeight, minHeight, terrainSize, nextPt, terrainNode);
                    commandQueue.Enqueue(message);

                    progressBar.Invoke((MethodInvoker) delegate
                    {
                        progressBar.PerformStep();
                    });
                }
            }
        }