Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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();
        }
Esempio n. 3
0
        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();
        }
Esempio n. 4
0
        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();
        }
Esempio n. 5
0
        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();
        }
Esempio n. 6
0
        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));
 }