public IEnumerable <TerrainRow> GetTerrainRows([NotNull] Box box) { int startTileIndexX; int endTileIndexX; int startTileIndexY; double terrainTileSize; double terrainXMin; double terrainYMin; int terrainTileCount; GetTerrainTiling( box, FirstTerrainBox, out terrainTileCount, out startTileIndexX, out endTileIndexX, out startTileIndexY, out terrainTileSize, out terrainXMin, out terrainYMin); for (var terrainTileIndex = 0; terrainTileIndex < terrainTileCount; terrainTileIndex++) { int iX = terrainTileIndex % (endTileIndexX - startTileIndexX); int iY = terrainTileIndex / (endTileIndexX - startTileIndexX); double xMin = terrainXMin + (iX + startTileIndexX) * terrainTileSize; double yMin = terrainYMin + (iY + startTileIndexY) * terrainTileSize; double xMax = terrainXMin + (iX + startTileIndexX + 1) * terrainTileSize; double yMax = terrainYMin + (iY + startTileIndexY + 1) * terrainTileSize; IEnvelope terrainBox = new EnvelopeClass(); terrainBox.PutCoords(xMin, yMin, xMax, yMax); terrainBox.SpatialReference = _terrainReference.Dataset.SpatialReference; var terrainRow = new TerrainRow(terrainBox, _terrainReference, _resolution, _progress); yield return(terrainRow); if (terrainRow.HasLoadedSurface) { terrainRow.DisposeSurface(); } } }
private TerrainRow ReadTerrainRow(BinaryReader reader) { TerrainRow row = new TerrainRow(); row.MiddlePoint = new Vector3(reader.ReadInt16(), reader.ReadInt16(), -reader.ReadInt16()); row.RightPoints[0] = row.MiddlePoint; row.RightPoints[1] = new Vector3(reader.ReadInt16(), reader.ReadInt16(), -reader.ReadInt16()); row.RightPoints[2] = new Vector3(reader.ReadInt16(), reader.ReadInt16(), -reader.ReadInt16()); row.RightPoints[3] = new Vector3(reader.ReadInt16(), reader.ReadInt16(), -reader.ReadInt16()); row.RightPoints[4] = new Vector3(reader.ReadInt16(), reader.ReadInt16(), -reader.ReadInt16()); row.RightPoints[5] = new Vector3(reader.ReadInt16(), reader.ReadInt16(), -reader.ReadInt16()); row.LeftPoints[0] = row.MiddlePoint; row.LeftPoints[1] = new Vector3(reader.ReadInt16(), reader.ReadInt16(), -reader.ReadInt16()); row.LeftPoints[2] = new Vector3(reader.ReadInt16(), reader.ReadInt16(), -reader.ReadInt16()); row.LeftPoints[3] = new Vector3(reader.ReadInt16(), reader.ReadInt16(), -reader.ReadInt16()); row.LeftPoints[4] = new Vector3(reader.ReadInt16(), reader.ReadInt16(), -reader.ReadInt16()); row.LeftPoints[5] = new Vector3(reader.ReadInt16(), reader.ReadInt16(), -reader.ReadInt16()); row.MiddlePoint *= GameConfig.TerrainScale; for (int i = 0; i < NbrTerrainPointsPerSide; i++) { row.RightPoints[i] *= GameConfig.TerrainScale; } for (int i = 0; i < NbrTerrainPointsPerSide; i++) { row.LeftPoints[i] *= GameConfig.TerrainScale; } // Each point is relative to the previous point for (int i = 1; i < NbrTerrainPointsPerSide; i++) { row.RightPoints[i] += row.RightPoints[i - 1]; } for (int i = 1; i < NbrTerrainPointsPerSide; i++) { row.LeftPoints[i] += row.LeftPoints[i - 1]; } return(row); }