// AUX FUNCTIONS

            private void DrawScene(SceneDataControl scene)
            {
                var rect = AdaptToViewport(GetSceneRect(scene), space);

                switch (Event.current.type)
                {
                case EventType.Repaint:
                    GUI.DrawTexture(rect, images[scene.getPreviewBackground()] ?? noBackground);
                    if (sceneList.index != -1 && Controller.Instance.SelectedChapterDataControl.getScenesList().getScenes()[sceneList.index] == scene)
                    {
                        HandleUtil.DrawPolyLine(rect.ToPoints().ToArray(), true, Color.red);
                    }
                    break;
                }

                EditorGUI.DropShadowLabel(new Rect(rect.position - new Vector2(20, 0), rect.size), scene.getId());

                var prevHot = GUIUtility.hotControl;

                EditorGUI.BeginChangeCheck();
                rect = HandleUtil.HandleRectMovement(scene.GetHashCode(), rect);
                if (EditorGUI.EndChangeCheck())
                {
                    rect = RevertFromViewport(rect, space);
                    positions[scene.getId()] = rect.position;

                    // Update in the project data
                    var id = GetScenePropertyId(Controller.Instance.SelectedChapterDataControl, scene);
                    ProjectConfigData.setProperty(id + ".X", ((int)positions[scene.getId()].x).ToString());
                    ProjectConfigData.setProperty(id + ".Y", ((int)positions[scene.getId()].y).ToString());
                }
                if (GUIUtility.hotControl != prevHot)
                {
                    sceneList.index = Controller.Instance.SelectedChapterDataControl.getScenesList().getScenes().IndexOf(scene);
                    if (Event.current.clickCount == 2)
                    {
                        OnSelectElement(scene);
                    }
                }
            }
Exemple #2
0
                public Vector2 this[string id]
                {
                    get
                    {
                        if (!positions.ContainsKey(id))
                        {
                            var idX = id + X;
                            var idY = id + Y;

                            if (!ProjectConfigData.existsKey(idX))
                            {
                                ProjectConfigData.setProperty(idX, "0");
                            }
                            if (!ProjectConfigData.existsKey(idY))
                            {
                                ProjectConfigData.setProperty(idY, "0");
                            }
                            var x = ProjectConfigData.getProperty(idX);
                            var y = ProjectConfigData.getProperty(idY);
                            positions.Add(id, new Vector2(ExParsers.ParseDefault(x, 0), ExParsers.ParseDefault(y, 0)));
                        }

                        return(positions[id]);
                    }
                    set
                    {
                        if (value == this[id]) // this[id] forces positions[id] initialization
                        {
                            return;
                        }

                        positions[id] = value;
                        ProjectConfigData.setProperty(id + X, value.x.ToString(CultureInfo.InvariantCulture));
                        ProjectConfigData.setProperty(id + Y, value.y.ToString(CultureInfo.InvariantCulture));
                    }
                }
            private void Layout()
            {
                try
                {
                    var scenes = Controller.Instance.ChapterList.getSelectedChapterDataControl().getScenesList();

                    // Layout algorithm
                    var settings = new Microsoft.Msagl.Layout.Layered.SugiyamaLayoutSettings();
                    settings.MaxAspectRatioEccentricity = 1.6;
                    settings.NodeSeparation             = 10;
                    settings.PackingMethod = PackingMethod.Compact;

                    // Graph
                    GeometryGraph graph = new GeometryGraph();
                    graph.BoundingBox = new Microsoft.Msagl.Core.Geometry.Rectangle(0, 0, SpaceWidth, SpaceHeight);
                    graph.UpdateBoundingBox();

                    Dictionary <SceneDataControl, Node>         sceneToNode = new Dictionary <SceneDataControl, Node>();
                    Dictionary <UniRx.Tuple <Node, Node>, bool> present     = new Dictionary <UniRx.Tuple <Node, Node>, bool>();

                    foreach (var scene in scenes.getScenes())
                    {
                        sizes.Remove(scene.getPreviewBackground());
                        var rect = GetSceneRect(scene);
                        var node = new Node(CurveFactory.CreateRectangle(rect.width, rect.height, new Point()), scene.getId());
                        graph.Nodes.Add(node);
                        sceneToNode.Add(scene, node);
                    }

                    foreach (var scene in scenes.getScenes())
                    {
                        var node = sceneToNode[scene];
                        foreach (var exit in scene.getExitsList().getExits())
                        {
                            var index = scenes.getSceneIndexByID(exit.getNextSceneId());

                            // If the exit points to a cutscene it normally is out of the array
                            if (index < 0 || index >= scenes.getScenes().Count)
                            {
                                continue;
                            }

                            var nextScene = scenes.getScenes()[index];

                            var t = new UniRx.Tuple <Node, Node>(node, sceneToNode[nextScene]);
                            if (!present.ContainsKey(t))
                            {
                                present.Add(t, true);
                                graph.Edges.Add(new Edge(node, sceneToNode[nextScene]));

                                var exitOrigin = GetExitArea(scene, exit).ToRect().center;
                                var originRect = GetSceneRect(scene);

                                var pos = exitOrigin - originRect.position;
                                pos.x = Mathf.Clamp01(pos.x / originRect.width);
                                pos.y = Mathf.Clamp01(pos.y / originRect.height);

                                // Positioning constraints
                                if (pos.x < 0.3)
                                {
                                    settings.AddLeftRightConstraint(t.Item2, t.Item1);
                                }
                                if (pos.x > 0.7)
                                {
                                    settings.AddLeftRightConstraint(t.Item1, t.Item2);
                                }
                            }
                        }
                    }


                    // Do the layouting
                    LayoutHelpers.CalculateLayout(graph, settings, null);

                    // Extract the results
                    var graphRect  = new Rect((float)graph.Left, (float)graph.Bottom, (float)graph.Width, (float)graph.Height);
                    var canvasRect = new Rect(0, 0, SpaceWidth, SpaceHeight);

                    foreach (var scene in scenes.getScenes())
                    {
                        var n = sceneToNode[scene];
                        positions[scene.getId()] = TransformPoint(new Vector2((float)(n.Center.X - n.Width / 2f), (float)(n.Center.Y + n.Height / 2f)), graphRect, canvasRect, true);

                        // Update in the project data
                        var id = GetScenePropertyId(Controller.Instance.SelectedChapterDataControl, scene);
                        ProjectConfigData.setProperty(id + ".X", ((int)positions[scene.getId()].x).ToString());
                        ProjectConfigData.setProperty(id + ".Y", ((int)positions[scene.getId()].y).ToString());
                    }
                }
                catch (Exception ex)
                {
                    Debug.LogError(ex.Message + " : " + ex.StackTrace);
                }
            }