private void Create2DVisualisation(int i, int j)
        {
            ViewBuilder builder = new ViewBuilder(geometryToMeshTopology(creationConfiguration.Geometry), "Scatterplot Matrix");

            builder.initialiseDataView(visualisationReference.dataSource.DataCount);

            builder.setDataDimension(visualisationReference.dataSource[visualisationReference.xScatterplotMatrixDimensions[i].Attribute].Data, ViewBuilder.VIEW_DIMENSION.X);
            builder.setDataDimension(visualisationReference.dataSource[visualisationReference.yScatterplotMatrixDimensions[j].Attribute].Data, ViewBuilder.VIEW_DIMENSION.Y);

            View v = ApplyGeometryAndRendering(creationConfiguration, ref builder);

            //destroy the view to clean the big mesh

            if (v != null)
            {
                v.transform.localPosition = new Vector3(i * xPadding, j * yPadding, 0);
                v.transform.SetParent(transform, false);
                viewList.Add(v);
            }
        }
        // ******************************
        // SPECIFIC VISUALISATION METHODS
        // ******************************

        private View CreateSimpleVisualisation(CreationConfiguration configuration)
        {
            if (visualisationReference.dataSource != null)
            {
                if (!visualisationReference.dataSource.IsLoaded)
                {
                    visualisationReference.dataSource.load();
                }

                ViewBuilder builder = new ViewBuilder(geometryToMeshTopology(configuration.Geometry), "Simple Visualisation");

                if ((visualisationReference.dataSource[getAxis(configuration.Axies, CreationConfiguration.Axis.X)] != null) ||
                    (visualisationReference.dataSource[getAxis(configuration.Axies, CreationConfiguration.Axis.Y)] != null) ||
                    (visualisationReference.dataSource[getAxis(configuration.Axies, CreationConfiguration.Axis.Z)] != null))
                {
                    builder.initialiseDataView(visualisationReference.dataSource.DataCount);

                    if (visualisationReference.dataSource[getAxis(configuration.Axies, CreationConfiguration.Axis.X)] != null)
                    {
                        builder.setDataDimension(visualisationReference.dataSource[getAxis(configuration.Axies, CreationConfiguration.Axis.X)].Data, ViewBuilder.VIEW_DIMENSION.X);
                    }
                    if (visualisationReference.dataSource[getAxis(configuration.Axies, CreationConfiguration.Axis.Y)] != null)
                    {
                        builder.setDataDimension(visualisationReference.dataSource[getAxis(configuration.Axies, CreationConfiguration.Axis.Y)].Data, ViewBuilder.VIEW_DIMENSION.Y);
                    }
                    if (visualisationReference.dataSource[getAxis(configuration.Axies, CreationConfiguration.Axis.Z)] != null)
                    {
                        builder.setDataDimension(visualisationReference.dataSource[getAxis(configuration.Axies, CreationConfiguration.Axis.Z)].Data, ViewBuilder.VIEW_DIMENSION.Z);
                    }

                    //destroy the view to clean the big mesh
                    destroyView();

                    //return the appropriate geometry view
                    return(ApplyGeometryAndRendering(creationConfiguration, ref builder));
                }
            }

            return(null);
        }
        public void LinkVisualisations()
        {
            View pv = GetComponentInChildren <View>();

            if (pv != null)
            {
                DestroyImmediate(pv.gameObject);
            }

            ViewBuilder viewLinked;

            Vector3[]    vSource = visualisationSource.theVisualizationObject.viewList[0].GetPositions(); // bigMesh.getBigMeshVertices();
            Vector3[]    vDest   = visualisationTarget.theVisualizationObject.viewList[0].GetPositions(); // bigMesh.getBigMeshVertices();
            List <Color> colors  = new List <Color>();

            Color[] cSource = visualisationSource.theVisualizationObject.viewList[0].GetColors(); // bigMesh.getColors();
            Color[] cDest   = visualisationTarget.theVisualizationObject.viewList[0].GetColors(); // bigMesh.getColors();

            List <Vector3> vertexBuffer = new List <Vector3>();
            List <int>     indexBuffer  = new List <int>();

            List <float>   positionsLocalX = new List <float>();
            List <float>   positionsLocalY = new List <float>();
            List <float>   positionsLocalZ = new List <float>();
            List <Vector3> normalsBuffer   = new List <Vector3>();

            for (int i = 0; i < vSource.Length; i++)
            {
                positionsLocalX.Add((vSource[i]).x);
                positionsLocalX.Add((vDest[i]).x);
                positionsLocalY.Add((vSource[i]).y);
                positionsLocalY.Add((vDest[i]).y);
                positionsLocalZ.Add((vSource[i]).z);
                positionsLocalZ.Add((vDest[i]).z);

                colors.Add(cSource[i]);
                colors.Add(cDest[i]);

                normalsBuffer.Add(new Vector3((float)i, 0, 0));
                normalsBuffer.Add(new Vector3((float)i, 0, 1));
            }

            for (int i = 0; i < positionsLocalX.Count; i += 2)
            {
                indexBuffer.Add(i);
                indexBuffer.Add(i + 1);
            }

            viewLinked = new ViewBuilder(MeshTopology.Lines, "Linked Visualisation");
            viewLinked.initialiseDataView(positionsLocalX.Count);
            viewLinked.setDataDimension(positionsLocalX.ToArray(), ViewBuilder.VIEW_DIMENSION.X);
            viewLinked.setDataDimension(positionsLocalY.ToArray(), ViewBuilder.VIEW_DIMENSION.Y);
            viewLinked.setDataDimension(positionsLocalZ.ToArray(), ViewBuilder.VIEW_DIMENSION.Z);

            viewLinked.Indices = indexBuffer;
            viewLinked.updateView();
            view = viewLinked.apply(this.gameObject, linkerMaterial);
            view.SetColors(colors.ToArray());
            view.SetAllChannels(normalsBuffer.ToArray());

            view.RecalculateBounds();

            transform.position = Vector3.zero;
            GetComponentInChildren <View>().transform.position = Vector3.zero;
        }
Exemple #4
0
        public override void CreateVisualisation()
        {
            if (visualisationReference.parallelCoordinatesDimensions.Length > 1 && visualisationReference.parallelCoordinatesDimensions.None(x => x == null || x.Attribute == "Undefined"))
            {
                viewList.Clear();
                destroyView();

                ViewBuilder viewParallel;

                List <float> positionsLocalX = new List <float>();
                List <float> positionsLocalY = new List <float>();
                List <float> positionsLocalZ = new List <float>();
                List <int>   indices         = new List <int>();

                for (int i = 0; i < visualisationReference.parallelCoordinatesDimensions.Length; i++)
                {
                    if (visualisationReference.parallelCoordinatesDimensions[i] != null && visualisationReference.parallelCoordinatesDimensions[i].Attribute != "Undefined")
                    {
                        float[] positions = visualisationReference.dataSource[visualisationReference.parallelCoordinatesDimensions[i].Attribute].Data;
                        for (int k = 0; k < positions.Length; k++)
                        {
                            positionsLocalX.Add((float)GameObject_Axes_Holders[i].transform.localPosition.x);
                            positionsLocalY.Add(positions[k] + (float)GameObject_Axes_Holders[i].transform.localPosition.y);
                            positionsLocalZ.Add((float)GameObject_Axes_Holders[i].transform.localPosition.z);
                        }
                    }
                }

                //build indices
                for (int i = 0; i < visualisationReference.dataSource.DataCount; i++)
                {
                    for (int j = 0; j < visualisationReference.parallelCoordinatesDimensions.Length - 1; j++)
                    {
                        indices.Add(j * visualisationReference.dataSource.DataCount + i);
                        indices.Add((j + 1) * visualisationReference.dataSource.DataCount + i);
                    }
                }

                int[] lineLength = new int[visualisationReference.dataSource.DataCount];
                for (int i = 0; i < visualisationReference.dataSource.DataCount; i++)
                {
                    lineLength[i] = visualisationReference.parallelCoordinatesDimensions.Length;
                }

                viewParallel = new ViewBuilder(MeshTopology.Lines, "parallel coordinates");
                viewParallel.initialiseDataView(positionsLocalX.Count);
                viewParallel.setDataDimension(positionsLocalX.ToArray(), ViewBuilder.VIEW_DIMENSION.X);
                viewParallel.setDataDimension(positionsLocalY.ToArray(), ViewBuilder.VIEW_DIMENSION.Y);
                viewParallel.setDataDimension(positionsLocalZ.ToArray(), ViewBuilder.VIEW_DIMENSION.Z);
                viewParallel.Indices    = indices;
                viewParallel.LineLength = lineLength.ToList();
                Material mt = new Material(Shader.Find("IATK/PCPShader"));
                mt.renderQueue = 3000;
                viewParallel.updateView();
                View v = viewParallel.apply(gameObject, mt);

                viewList.Add(v);

                //Creation configuration management
                if (creationConfiguration == null)
                {
                    creationConfiguration = new CreationConfiguration();
                }

                creationConfiguration.VisualisationType             = AbstractVisualisation.VisualisationTypes.PARALLEL_COORDINATES;
                creationConfiguration.parallelCoordinatesDimensions = visualisationReference.parallelCoordinatesDimensions;
                creationConfiguration.colour           = visualisationReference.colour;
                creationConfiguration.ColourDimension  = visualisationReference.colourDimension;
                creationConfiguration.colourKeys       = visualisationReference.dimensionColour;
                creationConfiguration.Geometry         = visualisationReference.geometry;
                creationConfiguration.LinkingDimension = visualisationReference.linkingDimension;
                creationConfiguration.SizeDimension    = visualisationReference.sizeDimension;
                creationConfiguration.Axies            = new Dictionary <CreationConfiguration.Axis, string>();

                //restore properties
                UpdateVisualisation(AbstractVisualisation.PropertyType.Colour);
                UpdateVisualisation(AbstractVisualisation.PropertyType.Size);
                UpdateVisualisation(AbstractVisualisation.PropertyType.SizeValues);
            }
        }
        /// <summary>
        /// returns a View with the specific geometry configuration
        /// </summary>
        /// <param name="configuration"></param>
        /// <param name="builder"></param>
        /// <returns></returns>
        protected View ApplyGeometryAndRendering(CreationConfiguration configuration, ref ViewBuilder builder)
        {
            Material mt = null;

            switch (configuration.Geometry)
            {
            case AbstractVisualisation.GeometryType.Undefined:
                return(null);

            case AbstractVisualisation.GeometryType.Points:
                builder.createIndicesPointTopology();
                mt             = new Material(Shader.Find("IATK/OutlineDots"));
                mt.mainTexture = Resources.Load("circle-outline-basic") as Texture2D;
                mt.renderQueue = 3000;
                return(builder.updateView().
                       apply(gameObject, mt));

            case AbstractVisualisation.GeometryType.Lines:
                if (visualisationReference.linkingDimension == "Undefined")
                {
                    throw new UnityException("The linking field 'Linkinfield' is undefined. Please select a linking field");
                }
                builder.createIndicesLinkedTopology(visualisationReference.dataSource[visualisationReference.linkingDimension].Data, visualisationReference.dataSource[visualisationReference.xDimension.Attribute].Data);
                mt             = new Material(Shader.Find("IATK/LinesShader"));
                mt.renderQueue = 3000;
                return(builder.updateView().
                       apply(gameObject, mt));

            case AbstractVisualisation.GeometryType.Quads:
                builder.createIndicesPointTopology();
                mt             = new Material(Shader.Find("IATK/Quads"));
                mt.renderQueue = 3000;
                return(builder.updateView().
                       apply(gameObject, mt));

            case AbstractVisualisation.GeometryType.LinesAndDots:

                if (visualisationReference.linkingDimension == "Undefined")
                {
                    throw new UnityException("The linking field 'Linkinfield' is undefined. Please select a linking field");
                }
                builder.createIndicesLinkedTopology(visualisationReference.dataSource[visualisationReference.linkingDimension].Data, visualisationReference.dataSource[visualisationReference.xDimension.Attribute].Data);
                mt             = new Material(Shader.Find("IATK/LineAndDotsShader"));
                mt.renderQueue = 3000;
                return(builder.updateView().
                       apply(gameObject, mt));

            case AbstractVisualisation.GeometryType.Cubes:
                builder.createIndicesPointTopology();     // createIndicesLinkedTopology(dataSource[linkingDimension].Data);
                mt             = new Material(Shader.Find("IATK/CubeShader"));
                mt.renderQueue = 3000;
                return(builder.updateView().
                       apply(gameObject, mt));

            case AbstractVisualisation.GeometryType.Bars:
                builder.createIndicesPointTopology();     // createIndicesLinkedTopology(dataSource[linkingDimension].Data);
                mt             = new Material(Shader.Find("IATK/BarShader"));
                mt.renderQueue = 3000;

                return(builder.updateView().
                       apply(gameObject, mt));

            case AbstractVisualisation.GeometryType.Spheres:
                builder.createIndicesPointTopology();     // createIndicesLinkedTopology(dataSource[linkingDimension].Data);
                mt             = new Material(Shader.Find("IATK/SphereShader"));
                mt.mainTexture = Resources.Load("sphere-texture") as Texture2D;
                mt.renderQueue = 3000;
                return(builder.updateView().
                       apply(gameObject, mt));

            default:
                return(null);
            }
        }
        /// <summary>
        /// returns a View with the specific geometry configuration
        /// </summary>
        /// <param name="configuration"></param>
        /// <param name="builder"></param>
        /// <returns></returns>
        protected View ApplyGeometryAndRendering(CreationConfiguration configuration, ref ViewBuilder builder)
        {
            Material mt = null;

            switch (configuration.Geometry)
            {
            case AbstractVisualisation.GeometryType.Undefined:
                return(null);

            case AbstractVisualisation.GeometryType.Points:
                builder.createIndicesPointTopology();
                mt                  = new Material(Shader.Find("IATK/OutlineDots"));
                mt.mainTexture      = Resources.Load("circle-outline-basic") as Texture2D;
                mt.renderQueue      = 3000;
                mt.enableInstancing = true;
                return(builder.updateView().
                       apply(gameObject, mt));

            case AbstractVisualisation.GeometryType.Lines:
                if (visualisationReference.graphDimension != "Undefined")
                {
                    CSVDataSource csvds = (CSVDataSource)(visualisationReference.dataSource);
                    builder.createIndicesGraphTopology(csvds.GraphEdges);
                    mt                  = new Material(Shader.Find("IATK/LinesShader"));
                    mt.renderQueue      = 3000;
                    mt.enableInstancing = true;
                    return(builder.updateView().
                           apply(gameObject, mt));
                }
                else
                if (visualisationReference.linkingDimension != "Undefined")
                {
                    builder.createIndicesConnectedLineTopology(visualisationReference.dataSource[visualisationReference.linkingDimension].Data);
                    mt                  = new Material(Shader.Find("IATK/LinesShader"));
                    mt.renderQueue      = 3000;
                    mt.enableInstancing = true;
                    return(builder.updateView().
                           apply(gameObject, mt));
                }
                else
                {
                    throw new UnityException("'Linkinfield' or 'GraphDimension' is undefined. Please select a linking field or a graph dimension");
                }
                break;

            case AbstractVisualisation.GeometryType.Quads:
                builder.createIndicesPointTopology();
                mt                  = new Material(Shader.Find("IATK/Quads"));
                mt.renderQueue      = 3000;
                mt.enableInstancing = true;
                return(builder.updateView().
                       apply(gameObject, mt));

            case AbstractVisualisation.GeometryType.LinesAndDots:
                if (visualisationReference.graphDimension != "Undefined")
                {
                    CSVDataSource csvds = (CSVDataSource)(visualisationReference.dataSource);
                    builder.createIndicesGraphTopology(csvds.GraphEdges);
                    mt                  = new Material(Shader.Find("IATK/LineAndDotsShader"));
                    mt.renderQueue      = 3000;
                    mt.enableInstancing = true;
                    return(builder.updateView().
                           apply(gameObject, mt));
                }
                if (visualisationReference.linkingDimension != "Undefined")
                {
                    builder.createIndicesConnectedLineTopology(visualisationReference.dataSource[visualisationReference.linkingDimension].Data);
                    mt                  = new Material(Shader.Find("IATK/LineAndDotsShader"));
                    mt.renderQueue      = 3000;
                    mt.enableInstancing = true;
                    return(builder.updateView().
                           apply(gameObject, mt));
                }
                else
                {
                    throw new UnityException("'Linkinfield' or 'GraphDimension' is undefined. Please select a linking field or a graph dimension");
                }


            case AbstractVisualisation.GeometryType.Cubes:
                builder.createIndicesPointTopology();     // createIndicesLinkedTopology(dataSource[linkingDimension].Data);
                mt                  = new Material(Shader.Find("IATK/CubeShader"));
                mt.renderQueue      = 3000;
                mt.enableInstancing = true;
                return(builder.updateView().
                       apply(gameObject, mt));

            case AbstractVisualisation.GeometryType.Bars:
                builder.createIndicesPointTopology();     // createIndicesLinkedTopology(dataSource[linkingDimension].Data);
                mt                  = new Material(Shader.Find("IATK/BarShader"));
                mt.renderQueue      = 3000;
                mt.enableInstancing = true;
                return(builder.updateView().
                       apply(gameObject, mt));

            case AbstractVisualisation.GeometryType.Spheres:
                builder.createIndicesPointTopology();     // createIndicesLinkedTopology(dataSource[linkingDimension].Data);
                mt                  = new Material(Shader.Find("IATK/SphereShader"));
                mt.mainTexture      = Resources.Load("sphere-texture") as Texture2D;
                mt.renderQueue      = 3000;
                mt.enableInstancing = true;
                return(builder.updateView().
                       apply(gameObject, mt));

            default:
                return(null);
            }
        }