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