private Vector3[] GetVertices() { var sphereGen = new IcoSphereGenerator() .SetCenter(Center) .SetRadius(Radius) .SetRecursionLevel(2) .SetGradient(GradientUtils.ParseGradient("gradient(#808080, #606060 50%, #505050)")); var meshData = new MeshData(DummyMeshIndex.Default, sphereGen.CalculateVertexCount()); sphereGen.Build(meshData); return(meshData.Vertices); }
/// <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); }