private void BuildCell(Canvas canvas, Rule rule, IGameObject terrainObject, MeshCell cell, RenderMode renderMode, string name) { var cellGameObject = _gameObjectFactory.CreateNew(name, terrainObject); var meshData = new TerrainMeshData(_objectPool); meshData.GameObject = cellGameObject; meshData.Index = renderMode == RenderMode.Scene ? new TerrainMeshIndex(16, 16, cell.Rectangle, meshData.Triangles) : (IMeshIndex)DummyMeshIndex.Default; // build canvas and extra layers BuildBackground(rule, meshData, cell.Background, renderMode); BuildWater(rule, meshData, cell, renderMode); BuildCarRoads(rule, meshData, cell, renderMode); BuildPedestrianLayers(rule, meshData, cell, renderMode); foreach (var surfaceRegion in cell.Surfaces) { BuildSurface(rule, meshData, surfaceRegion, renderMode); } Trace.Debug(LogTag, "Total triangles: {0}", meshData.Triangles.Count.ToString()); meshData.Index.Build(); BuildObject(cellGameObject, canvas, rule, meshData); }
private void BuildSurface(Rule rule, TerrainMeshData meshData, MeshRegion meshRegion, RenderMode renderMode) { if (meshRegion.Mesh == null) { return; } float colorNoiseFreq = renderMode == RenderMode.Scene ? meshRegion.ColorNoiseFreq : 0; float eleNoiseFreq = renderMode == RenderMode.Scene ? meshRegion.ElevationNoiseFreq : 0; var gradient = _customizationService.GetGradient(meshRegion.GradientKey); if (meshRegion.ModifyMeshAction != null) { meshRegion.ModifyMeshAction(meshRegion.Mesh); } foreach (var triangle in meshRegion.Mesh.Triangles) { AddTriangle(rule, meshData, triangle, gradient, eleNoiseFreq, colorNoiseFreq); } meshRegion.Dispose(); }
private void BuildPedestrianLayers(Rule rule, TerrainMeshData meshData, MeshCell cell, RenderMode renderMode) { var meshRegion = cell.WalkRoads; if (meshRegion.Mesh == null) { return; } var gradient = rule.GetPedestrianLayerGradient(_customizationService); float eleNoiseFreq = rule.GetPedestrianLayerEleNoiseFreq(); float colorNoiseFreq = renderMode == RenderMode.Scene ? rule.GetPedestrianLayerColorNoiseFreq() : 0; foreach (var triangle in meshRegion.Mesh.Triangles) { AddTriangle(rule, meshData, triangle, gradient, eleNoiseFreq, colorNoiseFreq); } meshRegion.Dispose(); }
private void BuildCarRoads(Rule rule, TerrainMeshData meshData, MeshCell cell, RenderMode renderMode) { var meshRegion = cell.CarRoads; var isScene = renderMode == RenderMode.Scene; float eleNoiseFreq = rule.GetCarLayerEleNoiseFreq(); float colorNoiseFreq = isScene ? rule.GetCarLayerColorNoiseFreq() : 0; float roadOffset = 0.3f; if (meshRegion.Mesh == null) { return; } var gradient = rule.GetCarLayerGradient(_customizationService); foreach (var triangle in meshRegion.Mesh.Triangles) { AddTriangle(rule, meshData, triangle, gradient, eleNoiseFreq, colorNoiseFreq, -roadOffset); } if (isScene) { BuildOffsetShape(meshData, meshRegion, rule.GetBackgroundLayerGradient(_customizationService), cell.Rectangle, colorNoiseFreq, roadOffset); } meshRegion.Dispose(); }
private void BuildBackground(Rule rule, TerrainMeshData meshData, MeshRegion meshRegion, RenderMode renderMode) { if (meshRegion.Mesh == null) { return; } var gradient = rule.GetBackgroundLayerGradient(_customizationService); float eleNoiseFreq = rule.GetBackgroundLayerEleNoiseFreq(); float colorNoiseFreq = renderMode == RenderMode.Scene ? rule.GetBackgroundLayerColorNoiseFreq() : 0; foreach (var triangle in meshRegion.Mesh.Triangles) { AddTriangle(rule, meshData, triangle, gradient, eleNoiseFreq, colorNoiseFreq); } meshRegion.Dispose(); }
private void BuildWater(Rule rule, TerrainMeshData meshData, MeshCell cell, RenderMode renderMode) { var meshRegion = cell.Water; if (meshRegion.Mesh == null) { return; } float colorNoiseFreq = renderMode == RenderMode.Scene ? rule.GetWaterLayerColorNoiseFreq() : 0; float eleNoiseFreq = rule.GetWaterLayerEleNoiseFreq(); var meshTriangles = meshData.Triangles; var bottomGradient = rule.GetBackgroundLayerGradient(_customizationService); var waterSurfaceGradient = rule.GetWaterLayerGradient(_customizationService); var waterBottomLevelOffset = rule.GetWaterLayerBottomLevel(); var waterSurfaceLevelOffset = rule.GetWaterLayerSurfaceLevel(); var elevationOffset = waterBottomLevelOffset - waterSurfaceLevelOffset; var surfaceOffset = renderMode == RenderMode.Scene ? -waterBottomLevelOffset : 0; // NOTE: substitute gradient in overview mode if (renderMode == RenderMode.Overview) { bottomGradient = waterSurfaceGradient; } int index = 0; var vertexCount = meshRegion.Mesh.Triangles.Count * 3; var waterVertices = new Vector3[vertexCount]; var waterTriangles = new int[vertexCount]; var waterColors = new Color[vertexCount]; foreach (var triangle in meshRegion.Mesh.Triangles) { // bottom surface AddTriangle(rule, meshData, triangle, bottomGradient, eleNoiseFreq, colorNoiseFreq, surfaceOffset); // NOTE: build offset shape only in case of Scene mode if (renderMode == RenderMode.Overview) { continue; } var meshTriangle = meshTriangles[meshTriangles.Count - 1]; var p0 = meshTriangle.Vertex0; var p1 = meshTriangle.Vertex1; var p2 = meshTriangle.Vertex2; // reuse just added vertices waterVertices[index] = new Vector3(p0.x, p0.y + elevationOffset, p0.z); waterVertices[index + 1] = new Vector3(p1.x, p1.y + elevationOffset, p1.z); waterVertices[index + 2] = new Vector3(p2.x, p2.y + elevationOffset, p2.z); var color = GradientUtils.GetColor(waterSurfaceGradient, waterVertices[index], colorNoiseFreq); waterColors[index] = color; waterColors[index + 1] = color; waterColors[index + 2] = color; waterTriangles[index] = index; waterTriangles[index + 1] = index + 2; waterTriangles[index + 2] = index + 1; index += 3; } // finalizing offset shape if (renderMode == RenderMode.Scene) { BuildOffsetShape(meshData, meshRegion, rule.GetBackgroundLayerGradient(_customizationService), cell.Rectangle, colorNoiseFreq, waterBottomLevelOffset); Observable.Start(() => BuildWaterObject(rule, meshData, waterVertices, waterTriangles, waterColors), Scheduler.MainThread); } }
private Tile CreateTile(RenderMode renderMode) { return(new Tile(TestHelper.BerlinTestFilePoint, new Vector2d(0, 0), renderMode, new Canvas(_objectPool), TileSize, TileSize)); }