public void ExportLegoMap() { LegoMap legoMap = ComputeLegoMap(); File.WriteAllText("Assets/JSON/" + fileName + ".json", JsonUtility.ToJson(legoMap)); if (exportToCSV) { ExportToCSV(legoMap); } }
void ExportToCSV(LegoMap legoMap) { // Output initialisation int nbHorizontalTiles = Mathf.CeilToInt((float)legoMapSize.x / (float)legoTileSize); int nbVerticalTiles = Mathf.CeilToInt((float)legoMapSize.y / (float)legoTileSize); Debug.Log(nbHorizontalTiles + "," + nbVerticalTiles); // Bigger size to compensate the empty spaces of tiles int outputHorizontalSize = nbHorizontalTiles * legoTileSize; int outputVerticalSize = nbVerticalTiles * legoTileSize; int[] output = new int[outputHorizontalSize * outputVerticalSize]; for (int i = 0; i < legoMapSize.x; i++) { for (int j = 0; j < legoMapSize.y; j++) { output [i * outputVerticalSize + j] = Mathf.RoundToInt(legoMap.columns[i * legoMapSize.y + j].height); } } //Folder and files creation AssetDatabase.CreateFolder("Assets/CSV", folderName); for (int globalHorizontalIndex = 0; globalHorizontalIndex < nbHorizontalTiles; globalHorizontalIndex++) { for (int globalVerticalIndex = 0; globalVerticalIndex < nbVerticalTiles; globalVerticalIndex++) { string filePath = "Assets/CSV/" + folderName + "/" + fileName + "_" + globalHorizontalIndex + "_" + globalVerticalIndex + ".csv"; StringBuilder sb = new StringBuilder(); int globalIndex = (globalHorizontalIndex * outputVerticalSize + globalVerticalIndex) * legoTileSize; //Index to place on the Tile for (int localHorizontalIndex = 0; localHorizontalIndex < legoTileSize; localHorizontalIndex++) { string tempLine = ""; for (int localVerticalIndex = 0; localVerticalIndex < legoTileSize; localVerticalIndex++) { int localIndex = localHorizontalIndex * outputVerticalSize + localVerticalIndex; // index to select the column inside the tile tempLine += output[globalIndex + localIndex] + delimiter; } sb.AppendLine(tempLine); } StreamWriter outStream = System.IO.File.CreateText(filePath); outStream.WriteLine(sb); outStream.Close(); } } }
private static MeshColumn[,] CreateVoxelColumnsFromJson(string json) { LegoMap map = JsonUtility.FromJson <LegoMap>(json); MeshColumn[,] meshColumns = new MeshColumn[map.mapSize.x, map.mapSize.y]; for (int x = 0; x < meshColumns.GetLength(0); x++) { for (int y = 0; y < meshColumns.GetLength(1); y++) { meshColumns[x, y] = new MeshColumn( x * meshColumns.GetLength(1) + y, new Vector2(x, y), map.columns[x * meshColumns.GetLength(1) + y].height, map.columns[x * meshColumns.GetLength(1) + y].type ); } } return(meshColumns); }
public void createJSON() { LegoMap m = new LegoMap(); m.mapSize = new Vector2Int((int)g.sizeGrid.x / g.sizeVoxel, (int)g.sizeGrid.z / g.sizeVoxel); m.mapScale = g.sizeVoxel; m.columns = new List <Column>(); for (int i = 1; i <= g.sizeGrid.x / g.sizeVoxel; i++) { List <Column> list = new List <Column>(); for (int k = 1; k <= g.sizeGrid.z / g.sizeVoxel; k++) { RaycastHit hit; if (Physics.Raycast(transform.position + g.basePos + new Vector3(-g.sizeVoxel / 2f, 0, -g.sizeVoxel / 2f) + new Vector3(i, g.sizeGrid.y / g.sizeVoxel, k) * g.sizeVoxel, Vector3.down, out hit, g.sizeGrid.y, layerMask)) { //Debug.Log(hit.point.y); //Debug.Log("Did Hit"); Column c = new Column(); c.type = Column.Type.Ground; c.height = hit.point.y; m.columns.Add(c); } else { Debug.DrawRay(transform.position + g.basePos + new Vector3(-g.sizeVoxel / 2f, 0, -g.sizeVoxel / 2f) + new Vector3(i, g.sizeGrid.y / g.sizeVoxel, k) * g.sizeVoxel, Vector3.down * g.sizeGrid.y, Color.white); Column c = new Column(); c.type = Column.Type.Ground; c.height = 0; m.columns.Add(c); Debug.Log("No Hit"); } } } //Debug.Log(JsonUtility.ToJson(m)); File.WriteAllText("Assets/JSON/" + nameMap + ".json", JsonUtility.ToJson(m)); }
private LegoMap ComputeLegoMap() { //Initialisation int count = 0; LegoMap legoMap = new LegoMap(); legoMap.mapSize = legoMapSize; legoMap.mapScale = scale; legoMap.columns = new List <Column>(); Vector3 rayOrigin = transform.position - new Vector3( legoMapSize.x * scale / 2f, 0, legoMapSize.y * scale / 2f ); float minHeight = analyserHeight; //Map computation for (int x = 0; x < legoMapSize.x; x++) { for (int z = 0; z < legoMapSize.y; z++) { Vector3 rayPosition = rayOrigin + new Vector3( (x + 0.5f) * scale, 0, (z + 0.5f) * scale ); RaycastHit hit; float height = 0; Column.Type type = Column.Type.Default; if (Physics.Raycast(rayPosition, Vector3.down, out hit, analyserHeight, collisionMask)) { height = analyserHeight - hit.distance; if (height < minHeight) { minHeight = height; } if (hit.collider.tag == "Ground") { type = Column.Type.Ground; } if (hit.collider.tag == "Building") { type = Column.Type.Building; } } Column column = new Column(height, type); legoMap.columns.Add(column); } } // Conversion to legos for (int i = 0; i < legoMap.columns.Count; i++) { // Lowest height brought to 0 if (setGroundAt0) { if (legoMap.columns[i].height < minHeight) { legoMap.columns[i].height = 0; } else { legoMap.columns[i].height -= minHeight; } } legoMap.columns[i].height = Mathf.Round(legoMap.columns[i].height * verticalScaleMultiplicator); count += (int)legoMap.columns[i].height; } legoMap.legoCount = count; return(legoMap); }