private Mesh buildCircleMesh() { Mesh mesh = new Mesh(); var vertices = new List <Vector3>(); var colors = new List <Color>(); var indices = new List <int>(); List <Vector3> partMeshTop = Circles.CreatePartMesh(0, 2 * Mathf.PI, 0.5f, _segments); for (int vertex = 0; vertex < partMeshTop.Count; vertex++) { partMeshTop[vertex] = new Vector3(partMeshTop[vertex].x, 1, partMeshTop[vertex].y); } vertices.AddRange(partMeshTop); List <Vector3> partMeshBottom = Circles.CreatePartMesh(0, 2 * Mathf.PI, 0.5f, _segments); for (int vertex = 0; vertex < partMeshBottom.Count; vertex++) { partMeshBottom[vertex] = new Vector3(partMeshBottom[vertex].x, 0, partMeshBottom[vertex].y); } vertices.AddRange(partMeshBottom); List <int> round = Circles.CreateRound(vertices.Count - partMeshBottom.Count - partMeshTop.Count, partMeshTop.Count - 1, 0); indices.AddRange(round); vertices.Add(new Vector3(0, 1, 0)); List <Vector3> partMeshTopPlate = Circles.CreatePartMesh(0, 2 * Mathf.PI, 0.5f, _segments); partMeshTopPlate[0] = new Vector3(partMeshTopPlate[0].x, 1, partMeshTopPlate[0].y); for (int vertex = 1; vertex < partMeshTopPlate.Count; vertex++) { partMeshTopPlate[vertex] = new Vector3(partMeshTopPlate[vertex].x, 1, partMeshTopPlate[vertex].y); indices.Add(vertices.Count - 1); indices.Add(vertices.Count + vertex); indices.Add(vertices.Count - 1 + vertex); } vertices.AddRange(partMeshTopPlate); mesh.name = "CylinderTopPlate"; mesh.vertices = vertices.ToArray(); mesh.SetIndices(indices.ToArray(), MeshTopology.Triangles, 0); mesh.RecalculateNormals(); return(mesh); }
protected override void RebuildVisualization() { if (_presenter == null || _presenter.NumberOfDimensions < 1) { Debug.LogError("Presenter is either null or has not enough dimensions to represent this visualization"); return; } var vertices = new List <Vector3>(); var colors = new List <Color>(); var indices = new List <int>(); int offset = (int)_presenter.SelectedMinItem; int length = (int)_presenter.SelectedMaxItem - offset; float maxValue = VisViewHelper.GetGlobalMaximum(_presenter); float radius = 0.5f * _size.x; float divisor = 0; //TODO find better way to determine divisor (what 100% is) for (int dimIndex = 0; dimIndex < _presenter.NumberOfDimensions; dimIndex++) { divisor += VisViewHelper.GetItemValueAbsolute(_presenter, dimIndex, _valueIndex + offset) / maxValue; } MultiDimDataPresenter presenter = (MultiDimDataPresenter)_presenter; Debug.Log(presenter.CaptionDimension.GetStringValue(ValueIndex)); float startAngle = 0; for (int dimIndex = 0; dimIndex < _presenter.NumberOfDimensions; dimIndex++) { float height = -(VisViewHelper.GetItemValueAbsolute(_presenter, dimIndex, _3DIndex + offset) / maxValue) * _size.z; vertices.Add(new Vector3(0, 0, height)); int zeroTop = vertices.Count - 1; float sumOfDim = VisViewHelper.GetItemValueAbsolute(_presenter, dimIndex, _valueIndex + offset) / maxValue; float part = sumOfDim / divisor; colors.Add(_style.GetColorCategorical(dimIndex, part)); float angle = part * Mathf.PI * 2; float endAngle = startAngle + angle; List <Vector3> partMeshTop = Circles.CreatePartMesh(startAngle, endAngle, radius, _segments); for (int i = 0; i < partMeshTop.Count; i++) { partMeshTop[i] = new Vector3(partMeshTop[i].x, partMeshTop[i].y, height); } for (int vertex = 1; vertex < partMeshTop.Count; vertex++) { colors.Add(_style.GetColorCategorical(dimIndex, part)); indices.Add(vertices.Count - 1); indices.Add(vertices.Count + vertex); indices.Add(vertices.Count - 1 + vertex); } colors.Add(_style.GetColorCategorical(dimIndex, part)); vertices.AddRange(partMeshTop); vertices.Add(Vector3.zero); int zeroBottom = vertices.Count - 1; colors.Add(_style.GetColorCategorical(dimIndex, part)); List <Vector3> partMeshBottom = Circles.CreatePartMesh(startAngle, endAngle, radius, _segments); for (int vertex = 1; vertex < partMeshBottom.Count; vertex++) { colors.Add(_style.GetColorCategorical(dimIndex, part)); indices.Add(vertices.Count - 1); indices.Add(vertices.Count - 1 + vertex); indices.Add(vertices.Count + vertex); } colors.Add(_style.GetColorCategorical(dimIndex, part)); vertices.AddRange(partMeshBottom); //adding side quads int[] tris = new int[] { zeroTop, zeroTop + 1, zeroBottom + 1, zeroTop, zeroBottom + 1, zeroBottom, zeroTop, vertices.Count - 1, zeroBottom - 1, zeroTop, zeroBottom, vertices.Count - 1 }; indices.AddRange(tris); //adding rounds List <int> round = Circles.CreateRound(vertices.Count - partMeshBottom.Count - partMeshTop.Count - 1, partMeshTop.Count - 1, 1); indices.AddRange(round); startAngle = endAngle; } var mesh = new Mesh(); mesh.name = "PieChart3DMesh"; mesh.vertices = vertices.ToArray(); mesh.colors = colors.ToArray(); mesh.SetIndices(indices.ToArray(), MeshTopology.Triangles, 0); mesh.RecalculateNormals(); var meshFilter = GetComponent <MeshFilter>(); meshFilter.sharedMesh = mesh; }