public void LoadVisualization() { AppConfig.SharingEnabled = GameObject.Find("SharingEnabledToggle").GetComponent <Toggle>().isOn; AppConfig.IsServerInstance = GameObject.Find("ServerInstanceToggle").GetComponent <Toggle>().isOn; var modelDropdown = GameObject.Find("ProjectModelDropdown").GetComponent <Dropdown>(); string modelfile = modelDropdown.options[modelDropdown.value].text; UIManager.Instance.Deactivate(UIElement.SettingsPanel); UIManager.Instance.Activate(UIElement.ContentPane); UIManager.Instance.Deactivate(UIElement.InfoPanel); UIManager.Instance.Deactivate(UIElement.Toolbar); GameObject.Find("ContentPane").transform.position = GazeManager.Instance.GazeOrigin; GameObject.Find("ContentPane").transform.position += GazeManager.Instance.GazeTransform.forward * 2f; GameObject.Find("ContentPane").transform.position -= GazeManager.Instance.GazeTransform.up * 0.5f; string assetpath = Application.streamingAssetsPath; string filepath = Path.Combine(assetpath, modelfile); string filecontent = FileReader.Read(new Uri(filepath).AbsolutePath); Task.Factory.StartNew(() => { JSONObject modeldata = JSONObject.Create(filecontent); OSGiProject project = OSGiProjectParser.Instance.Parse(modeldata); VisualizationLoader.Instance.VisualizationLoaded += OnVisualizationLoaded; VisualizationLoader.Instance.Load(project); }); }
// TODO: Refactor. public void BuildRandomGraphLayout(OSGiProject project, Vector3 min, Vector3 max, float minDist, int maxIter) { _project = project; int overlappingBundles = 0; foreach (GraphVertex vertex in project.DependencyGraph.Vertices) { Vector3 diagonalVector = min - max; float randomX = diagonalVector.x * SyncDataStorage.Instance.GetRandomNumber(_random); float randomY = diagonalVector.y * SyncDataStorage.Instance.GetRandomNumber(_random); float randomZ = diagonalVector.z * SyncDataStorage.Instance.GetRandomNumber(_random); Vector3 randomVector = min + new Vector3(randomX, randomY, randomZ); int iteration = 0; while (!CheckOverlap(randomVector, vertex.Island, minDist) && iteration <= maxIter) { randomX = diagonalVector.x * SyncDataStorage.Instance.GetRandomNumber(_random); randomY = diagonalVector.y * SyncDataStorage.Instance.GetRandomNumber(_random); randomZ = diagonalVector.z * SyncDataStorage.Instance.GetRandomNumber(_random); randomVector = min + new Vector3(randomX, randomY, randomZ); iteration++; } vertex.Position = randomVector; if (iteration >= maxIter) { overlappingBundles++; } } Debug.Log("Graph layout is computed! Number of overlapping bundles: " + overlappingBundles); }
public List <CartographicIsland> BuildFromProject(OSGiProject project) { _cartographicIslands.Clear(); foreach (Bundle bundle in project.Bundles) { _cartographicIslands.Add(BuildFromBundle(bundle)); } return(_cartographicIslands); }
public void BuildForceDirectedLayout(OSGiProject project) { _simulationData = new Dictionary <GraphVertex, VertexPositionData>(); _project = project; // TODO: Refactor float attraction = 10.0f; float spring = 1.0f; float repulsion = 5.0f; float attractToCenter = 0.005f; float friction = 0.105f; float timestep = StepSize; foreach (GraphVertex vertex in project.DependencyGraph.Vertices) { float rr = 20f; float x = (SyncDataStorage.Instance.GetRandomNumber(_random) - 0.5f) * rr; float y = (SyncDataStorage.Instance.GetRandomNumber(_random) - 0.5f) * rr; Vector2 startPos = new Vector2(x, y); VertexPositionData vertexData = new VertexPositionData(startPos, startPos); _simulationData.Add(vertex, vertexData); } int stepCounter = 0; while (stepCounter < SimulationSteps) { foreach (GraphVertex vertex in project.DependencyGraph.Vertices) { Vector2 netForce = Vector2.zero; netForce += ForceDirectedAttraction(vertex, attraction, spring); netForce += ForceDirectedRepulsion(vertex, repulsion); netForce -= ForceDirectedAttractToCenter(vertex, attractToCenter); VerletIntegration(vertex, netForce, friction, timestep); netForce = new Vector2((float)Math.Truncate(netForce.x * 10) / 10, (float)Math.Truncate(netForce.y * 10) / 10); stepCounter++; } } foreach (GraphVertex vertex in project.DependencyGraph.Vertices) { VertexPositionData vertexData = _simulationData[vertex]; Vector3 pos = new Vector3(vertexData.position.x, 0, vertexData.position.y); vertex.Position = pos; } }
public void Load(OSGiProject project) { _osgiProject = project; List <CartographicIsland> islandStructures = IslandStructureBuilder.Instance.BuildFromProject(project); Debug.Log("Island Structures built..."); Vector3 min = new Vector3(150.0f, 150.0f, 150.0f); Vector3 max = new Vector3(500.0f, 500.0f, 500.0f); GraphLayoutBuilder.Instance.BuildRandomGraphLayout(project, min, max, 50.0f, 100); Debug.Log("Force directed graph layout computed..."); IslandGameObjectBuilder.Instance.IslandGameObjectsBuilt += OnIslandGameObjectsBuilt; UnityMainThreadDispatcher.Instance.Enqueue(() => { StartCoroutine(IslandGameObjectBuilder.Instance.BuildFromIslandStructures(islandStructures)); }); }