Exemple #1
0
        /// <inheritdoc />
        public override IGameObject BuildArea(Tile tile, Rule rule, Area area)
        {
            base.BuildArea(tile, rule, area);

            if (tile.Registry.Contains(area.Id))
            {
                return(null);
            }

            double   radius;
            Vector2d center;

            CircleUtils.GetCircle(tile.RelativeNullPoint, area.Points, out radius, out center);

            var elevation = ElevationProvider.GetElevation(center);

            var height       = rule.GetHeight();
            var minHeight    = rule.GetMinHeight();
            var actualHeight = (height - minHeight);
            var color        = rule.GetFillColor();
            var gradient     = CustomizationService.GetGradient(color);

            tile.Registry.RegisterGlobal(area.Id);

            var cylinderGen = new CylinderGenerator()
                              .SetCenter(new Vector3((float)center.X, elevation + minHeight, (float)center.Y))
                              .SetHeight(actualHeight)
                              .SetMaxSegmentHeight(5f)
                              .SetRadialSegments(7)
                              .SetRadius((float)radius)
                              .SetGradient(gradient);

            var meshData = new MeshData(MeshDestroyIndex.Default, cylinderGen.CalculateVertexCount())
            {
                GameObject  = GameObjectFactory.CreateNew(GetName(area)),
                MaterialKey = rule.GetMaterialKey()
            };

            cylinderGen.Build(meshData);

            BuildObject(tile.GameObject, meshData, rule, area);
            return(meshData.GameObject);
        }
        /// <inheritdoc />
        public override IGameObject BuildArea(Tile tile, Rule rule, Area area)
        {
            base.BuildArea(tile, rule, area);

            if (tile.Registry.Contains(area.Id))
            {
                return(null);
            }
            tile.Registry.RegisterGlobal(area.Id);

            double   radius;
            Vector2d center;

            CircleUtils.GetCircle(tile.RelativeNullPoint, area.Points, out radius, out center);

            var elevation = ElevationProvider.GetElevation(center);
            var minHeight = rule.GetMinHeight();
            var color     = rule.GetFillColor();
            var gradient  = CustomizationService.GetGradient(color);

            int recursionLevel = rule.EvaluateDefault("recursion_level", 2);

            var center3d = new Vector3((float)center.X, elevation + minHeight, (float)center.Y);

            var sphereGen = new IcoSphereGenerator()
                            .SetCenter(center3d)
                            .SetRadius((float)radius)
                            .SetRecursionLevel(recursionLevel)
                            .SetGradient(gradient);

            var meshData = new MeshData(new SphereMeshIndex((float)radius, center3d),
                                        sphereGen.CalculateVertexCount());

            meshData.GameObject  = GameObjectFactory.CreateNew(GetName(area));
            meshData.MaterialKey = rule.GetMaterialKey();

            sphereGen.Build(meshData);

            BuildObject(tile.GameObject, meshData, rule, area);

            return(meshData.GameObject);
        }
        /// <inheritdoc />
        public override List <MeshData> Build(Building building)
        {
            Vector2d center;
            double   radius;

            CircleUtils.GetCircle(building.Footprint, out radius, out center);

            var center3d = new Vector3((float)center.X,
                                       building.Elevation + building.MinHeight + building.Height,
                                       (float)center.Y);

            var sphereGen = new IcoSphereGenerator()
                            .SetCenter(center3d)
                            .SetRadius((float)radius)
                            .SetRecursionLevel(2)
                            .IsSemiphere(true)
                            .SetGradient(CustomizationService.GetGradient(building.RoofColor));

            var mesh = CreateMesh(building.Footprint);

            var        floorCount       = building.Levels;
            var        floorVertexCount = mesh.Triangles.Count * 3 * 2 * floorCount;
            IMeshIndex floorMeshIndex   = new MultiPlaneMeshIndex(building.Levels, floorVertexCount);

            var roofVertexCount = sphereGen.CalculateVertexCount();

            var vertexCount = roofVertexCount + floorVertexCount;

            bool limitIsReached = false;

            if (vertexCount * 2 > Consts.MaxMeshSize)
            {
                vertexCount    = roofVertexCount;
                limitIsReached = true;
                floorMeshIndex = DummyMeshIndex.Default;
            }

            var meshIndex = new CompositeMeshIndex(2)
                            .AddMeshIndex(new SphereMeshIndex((float)radius, center3d))
                            .AddMeshIndex(floorMeshIndex);
            var meshData = new MeshData(meshIndex, vertexCount);

            // attach roof
            sphereGen.Build(meshData);

            if (!limitIsReached)
            {
                // attach floors
                AttachFloors(new RoofContext()
                {
                    Mesh      = mesh,
                    MeshData  = meshData,
                    MeshIndex = (MultiPlaneMeshIndex)floorMeshIndex,

                    Bottom             = building.Elevation + building.MinHeight,
                    FloorCount         = floorCount,
                    FloorHeight        = building.Height / floorCount,
                    FloorFrontGradient = CustomizationService.GetGradient(building.FloorFrontColor),
                    FloorBackGradient  = CustomizationService.GetGradient(building.FloorBackColor),

                    IsLastRoof = false
                });

                return(new List <MeshData>(1)
                {
                    meshData
                });
            }

            var meshDataList = BuildFloors(building, building.Levels, false);

            meshDataList.Add(meshData);
            return(meshDataList);
        }