public void Init() { m_terrainTileArray = new TerrainTileData[transform.childCount]; for (int i = 0; i < transform.childCount; i++) { Transform child = transform.GetChild(i); m_terrainTileArray[i] = new TerrainTileData(child.gameObject.name); m_terrainTileArray[i].CalculateBound(child.gameObject); } }
private bool BuildMesh() { var terrainTileSquares = _controller.terrainController.terrainGeneratorSettings.size - 1; var collisionTileVertexCount = _controller.collisionBlockVertexCount; var collisionTileSquares = collisionTileVertexCount - 1; var chunkOffsetX = collisionTileSquares * _location.x; var chunkOffsetY = collisionTileSquares * _location.y; var startTerrainTileX = Mathf.FloorToInt(chunkOffsetX / (float)terrainTileSquares); var startTerrainTileY = Mathf.FloorToInt(chunkOffsetY / (float)terrainTileSquares); var endTerrainTileX = Mathf.CeilToInt((chunkOffsetX + collisionTileSquares) / (float)terrainTileSquares); var endTerrainTileY = Mathf.CeilToInt((chunkOffsetY + collisionTileSquares) / (float)terrainTileSquares); var mainTileCountX = endTerrainTileX - startTerrainTileX + 1; var mainTileCountY = endTerrainTileY - startTerrainTileY + 1; var mainTiles = new TerrainTileData[mainTileCountX * mainTileCountY]; _usedTerrainTiles = new Vector3[mainTileCountX * mainTileCountY]; var dataSize = terrainTileSquares + 3; var startTerrainTileIndexX = startTerrainTileX * terrainTileSquares; var startTerrainTileIndexY = startTerrainTileY * terrainTileSquares; var startOffsetX = chunkOffsetX - startTerrainTileIndexX; var startOffsetY = chunkOffsetY - startTerrainTileIndexY; for (var x = 0; x < mainTileCountX; x++) { for (var y = 0; y < mainTileCountY; y++) { var tile = _controller.terrainController.GetExistingTile(x + startTerrainTileX, y + startTerrainTileY); if (tile == null || !tile.isBuilt) { //Debug.Log("Could not load collision tile because the terrain data has not been initialized!"); return(false); } mainTiles[x + y * mainTileCountX] = tile.data; _usedTerrainTiles[x + y * mainTileCountX] = tile.transform.position; } } for (var x = 0; x < _controller.collisionBlockVertexCount; x++) { for (var y = 0; y < _controller.collisionBlockVertexCount; y++) { var tileX = Mathf.FloorToInt((chunkOffsetX + x) / (float)terrainTileSquares) - startTerrainTileX; var tileY = Mathf.FloorToInt((chunkOffsetY + y) / (float)terrainTileSquares) - startTerrainTileY; var innerOffsetX = 1 + ((startOffsetX + x) % terrainTileSquares); var innerOffsetY = 1 + ((startOffsetY + y) % terrainTileSquares); var height = mainTiles[tileX + tileY * mainTileCountX].locationData[innerOffsetX + dataSize * innerOffsetY].position.y; _initialVertices[x + _controller.collisionBlockVertexCount * y] = new Vector3( x * _controller.terrainController.terrainGeneratorSettings.gridSize, height, y * _controller.terrainController.terrainGeneratorSettings.gridSize); _initialNormals[x + _controller.collisionBlockVertexCount * y] = mainTiles[tileX + tileY * mainTileCountX] .locationData[innerOffsetX + dataSize * innerOffsetY].normal; var color = mainTiles[tileX + tileY * mainTileCountX].splats[(innerOffsetX - 1) + (dataSize - 2) * (innerOffsetY - 1)]; _initialSplats[x + _controller.collisionBlockVertexCount * y] = new Vector4(color.r, color.g, color.b, color.a); } } //Definition Stage //Tessellation Stage for (var i = 0; i < _initialTriangles.Length / 3; i++) { AddTessellatedTriangle(i, _triangles, _vertices, _normals, _splats); } return(true); }