public virtual void OnCalculateGlobalRect(bool recursive, Rect clipRect)
        {
            if (!Visible)
            {
                cliped = true;
                return;
            }
            GlobalScale = 1;
            PaintElement p = Parent;

            while (p != null)
            {
                GlobalScale *= p.LocalScale;
                p            = p.Parent;
            }
            GlobalRect.size = LocalRect.size * GlobalScale;
            if (Parent == null)
            {
                GlobalRect.position = LocalRect.position;
            }
            else
            {
                GlobalRect.position = LocalRect.position * GlobalScale + Parent.GlobalCentroid;
            }
            cliped = !(DontClip || GlobalRect.Overlaps(clipRect));
        }
Пример #2
0
        public BehaviourNodeGUI AddChild(PaintElement parent, BehaviourMeta meta, Vector2 localPos)
        {
            if (parent != null && parent.Parent != TreeCanvas)
            {
                return(null);
            }
            BehaviourNodeGUI node = new BehaviourNodeGUI(this);

            node.Self = new BehaviourNodeGUI.Decorator(GenerateId, meta);
            node.Self.UpdatePropertiesInfo();
            Rect r = new Rect();

            r.size         = node.CalculateLocalSize();
            r.position     = localPos - Vector2.right * r.size.x * 0.5f;
            node.LocalRect = r;
            TreeCanvas.AddElement(node);
            TreeGraph.AddNode(node);
            if (parent != null)
            {
                TreeGraph.AddPath(0, parent, node);
            }
            RebuildExecutionOrder();

            return(node);
        }
Пример #3
0
        public PaintElement GetNodeBTParent(PaintElement node)
        {
            TreeGraph.GetAllParent(0, node, mCache);
            PaintElement parent = mCache.Count > 0 ? mCache[0] : null;

            mCache.Clear();
            return(parent);
        }
Пример #4
0
 public void RemoveElement(PaintElement ele)
 {
     if (ele.Parent == this)
     {
         ele.Parent = null;
         //Elements.Remove(ele);
     }
 }
 public void RemoveElement(PaintElement ele)
 {
     if (ele.Parent == this)
     {
         ele.Parent   = null;
         ele.IsActive = false;
         //Elements.Remove(ele);
     }
 }
Пример #6
0
 public void AddElement(PaintElement ele)
 {
     if (ele.Parent != null || Elements.Contains(ele))
     {
         return;
     }
     Elements.Add(ele);
     ele.Parent = this;
 }
Пример #7
0
 public void BeginEditNode(PaintElement target, ENodeEditMode mode)
 {
     if (target == null && mode != ENodeEditMode.none || EditorApplication.isPlaying)
     {
         return;
     }
     EditMode   = mode;
     EditTarget = target;
 }
 public override bool InteractKeyUp(KeyCode key)
 {
     for (int i = Elements.Count - 1; i >= 0; i--)
     {
         PaintElement ele = Elements[i];
         if (ele.InteractKeyUp(key))
         {
             return(true);
         }
     }
     return(OnKeyUp == null ? false : OnKeyUp(key));
 }
 public override bool InteractMouseClick(EMouseButton button, Vector2 mousePosition)
 {
     for (int i = Elements.Count - 1; i >= 0; i--)
     {
         PaintElement ele = Elements[i];
         if (ele.GlobalRect.Contains(mousePosition) && ele.InteractMouseClick(button, mousePosition))
         {
             return(true);
         }
     }
     return(OnMouseClick == null ? false : OnMouseClick(button, mousePosition));
 }
Пример #10
0
        void ModifyThisAsParent()
        {
            PaintElement ele = mWindow.GetNodeBTParent(mWindow.EditTarget);

            if (ele != null)
            {
                mWindow.TreeGraph.RemovePath(0, ele, mWindow.EditTarget);
            }
            mWindow.TreeGraph.AddPath(0, this, mWindow.EditTarget);
            mWindow.BeginEditNode(null, BehaviourTreeDesignerWindow.ENodeEditMode.none);
            mWindow.RebuildExecutionOrder();
        }
 public override bool InteractDragBegin(EMouseButton button, Vector2 mousePosition)
 {
     for (int i = Elements.Count - 1; i >= 0; i--)
     {
         PaintElement ele = Elements[i];
         if (ele.Visible && ele.GlobalRect.Contains(mousePosition) && ele.InteractDragBegin(button, mousePosition))
         {
             mDragTarget = ele;
             return(true);
         }
     }
     mOnSelfDrag = OnDragBegin == null ? false : OnDragBegin(button, mousePosition);
     return(mOnSelfDrag);
 }
 public override bool InteractDragEnd(EMouseButton button, Vector2 mousePosition)
 {
     if (mOnSelfDrag)
     {
         mOnSelfDrag = false;
         return(OnDragEnd == null ? false : OnDragEnd(button, mousePosition));
     }
     if (mDragTarget != null)
     {
         bool ret = mDragTarget.InteractDragEnd(button, mousePosition);
         mDragTarget = null;
         return(ret);
     }
     return(false);
 }
 public void Resort(bool recursive)
 {
     GlobalUtil.Sort(Elements, (x, y) => x.SortOrder > y.SortOrder ? 1 : -1);
     if (recursive)
     {
         for (int i = 0; i < Elements.Count; i++)
         {
             PaintElement can = Elements[i];
             if (can is EditorGUICanvas)
             {
                 ((EditorGUICanvas)can).Resort(recursive);
             }
         }
     }
 }
Пример #14
0
        public virtual void CalculateGlobalRect(bool recursive)
        {
            GlobalScale = 1;
            PaintElement p = Parent;

            while (p != null)
            {
                GlobalScale *= p.LocalScale;
                p            = p.Parent;
            }
            GlobalRect.size = LocalRect.size * GlobalScale;
            if (Parent == null)
            {
                GlobalRect.position = LocalRect.position;
            }
            else
            {
                GlobalRect.position = LocalRect.position * GlobalScale + Parent.GlobalCentroid;
            }
        }
        public override void OnGUI(Rect clipRect)
        {
            float gsize = GridSize * GlobalScale;

            if (GlobalScale > 0 && ShowGridLine && GridSize > 1)
            {
                OnDrawGridLine(clipRect, gsize);
            }
            bool clean = false;

            if (LocalScale > 0)
            {
                for (int i = 0; i < Elements.Count; i++)
                {
                    PaintElement ele = Elements[i];
                    if (ele.Parent != this)
                    {
                        clean = true;
                    }
                    if (ele.cliped)
                    {
                        continue;
                    }
                    ele.OnGUI(clipRect);
                }
            }
            if (clean)
            {
                for (int i = Elements.Count - 1; i >= 0; i--)
                {
                    PaintElement ele = Elements[i];
                    if (ele.Parent != this)
                    {
                        Elements.RemoveAt(i);
                        ele.OnRemoved();
                    }
                }
            }
        }
Пример #16
0
        void OnTaskList()
        {
            mRaycastMeta = null;
            Installizer.contentStyle.alignment = TextAnchor.MiddleCenter;
            Vector2      tsize = new Vector2(mMinTaskWidth * GlobalScale, 30 * GlobalScale);
            Vector2      dsize = new Vector2(mMinTaskWidth * GlobalScale, 20 * GlobalScale);
            PaintElement node  = Context;
            Rect         r     = new Rect();
            float        delta = 0;

            r.size     = new Vector2(tsize.x, 22);
            r.position = new Vector2(GlobalRect.xMax - tsize.x, GlobalRect.yMin + 2);
            if (OnSearchFieldGUI(r))
            {
                delta += 22;
            }
            bool search = !string.IsNullOrEmpty(mSearchContext);

            r.size     = new Vector2(tsize.x, GlobalRect.height - delta);
            r.position = new Vector2(GlobalRect.xMax - tsize.x, GlobalRect.yMin + 20);

            OnMetaList(mTaskList, r, search, false);
        }
Пример #17
0
        public void NewNode(PaintElement context)
        {
            if (EditorApplication.isPlaying)
            {
                return;
            }
            if (mTaskList.Count < 2 || !BehaviourModuleManager.GetOrNewInstance().Composites.Contains(mTaskList[1].BTMeta))
            {
                mTaskList.Clear();
                mMinTaskWidth = 200;
                List <BehaviourMeta> lst;
                lst = BehaviourModuleManager.GetOrNewInstance().Composites;
                string category = null;
                for (int i = 0; i < lst.Count; i++)
                {
                    MetaUI m = new MetaUI(lst[i]);
                    if (m.BTMeta.Category != category)
                    {
                        category      = m.BTMeta.Category;
                        mDropDownMeta = new MetaUI(category);
                        mTaskList.Add(mDropDownMeta);
                    }
                    mTaskList.Add(m);
                    mMinTaskWidth = Mathf.Max(mMinTaskWidth, m.Width);
                }
            }

            Mode    = EMode.new_node;
            Visible = true;
            Context = context;
            Rect rect = new Rect();

            rect.size     = new Vector2(mMinTaskWidth, 270); // 170 + 200
            rect.position = Parent.CalculateLocalPosition(mWindow.GlobalMousePosition) - new Vector2(mMinTaskWidth * 0.5f, 0);
            LocalRect     = rect;
            mDragEnd      = true;
        }
Пример #18
0
        protected virtual void OnSocketGUI()
        {
            Rect rect = new Rect();

            rect.size = new Vector2(LocalRect.width - 30, 15) * GlobalScale;
            if (rect.size.y > 3)
            {
                bool editmode = !EditorApplication.isPlayingOrWillChangePlaymode && !mWindow.ContextMenu.Visible && mWindow.EditMode == BehaviourTreeDesignerWindow.ENodeEditMode.none;
                rect.center = new Vector2(GlobalRect.center.x, GlobalRect.yMax - rect.size.y * 0.5f);
                bool inrect = rect.Contains(mWindow.GlobalMousePosition);
                if (mWindow.EditTarget == this && mWindow.EditMode == BehaviourTreeDesignerWindow.ENodeEditMode.modify_child)
                {
                    GUI.Label(rect, "", "flow node 0 on");
                }
                else if (mWindow.EditMode == BehaviourTreeDesignerWindow.ENodeEditMode.modify_parent &&
                         inrect && CanLinkBetween(this, mWindow.EditTarget as BehaviourNodeGUI))
                {
                    if (GUI.Button(rect, "", "flow node 0 on"))
                    {
                        ModifyThisAsParent();
                    }
                }
                else if (editmode)
                {
                    if (GUI.Button(rect, "", inrect ? "flow node 0 on" : "textarea"))
                    {
                        mWindow.BeginEditNode(this, BehaviourTreeDesignerWindow.ENodeEditMode.modify_child);
                    }
                }
                else
                {
                    GUI.Label(rect, "", "textarea");
                }

                rect.center = new Vector2(GlobalRect.center.x, GlobalRect.yMin + rect.size.y * 0.5f);
                inrect      = rect.Contains(mWindow.GlobalMousePosition);
                if (mWindow.EditTarget == this && mWindow.EditMode == BehaviourTreeDesignerWindow.ENodeEditMode.modify_parent)
                {
                    GUI.Label(rect, "", "flow node 0 on");
                }
                else if (mWindow.EditMode == BehaviourTreeDesignerWindow.ENodeEditMode.modify_child &&
                         inrect && mWindow.TreeGraph.GetParentCount(0, this) == 0)
                {
                    if (GUI.Button(rect, "", "flow node 0 on"))
                    {
                        ModifyThisAsChild();
                    }
                }
                else if (editmode)
                {
                    if (GUI.Button(rect, "", inrect ? "flow node 0 on" : "textarea"))
                    {
                        mWindow.BeginEditNode(this, BehaviourTreeDesignerWindow.ENodeEditMode.modify_parent);
                    }
                }
                else
                {
                    GUI.Label(rect, "", "textarea");
                }
                Rect btn = new Rect();
                btn.size   = new Vector2(20, 20);
                btn.center = new Vector2(rect.center.x, rect.yMin - 10);
                if (editmode && (rect.Contains(mWindow.GlobalMousePosition) || btn.Contains(mWindow.GlobalMousePosition)))
                {
                    PaintElement parent = mWindow.GetNodeBTParent(this);
                    if (parent != null && GUI.Button(btn, "", "WinBtnCloseActiveMac"))
                    {
                        mWindow.TreeGraph.RemovePath(0, parent, this);
                        mWindow.RebuildExecutionOrder();
                    }
                }
            }
        }
Пример #19
0
        public override void OnGUI(Rect clipRect)
        {
            mRaycastElement = null;
            float gsize = GridSize * GlobalScale;

            if (GlobalScale > 0 && ShowGridLine && GridSize > 1)
            {
                OnDrawGridLine(clipRect, gsize);
            }
            bool clean = false;

            if (LocalScale > 0)
            {
                bool style = !string.IsNullOrEmpty(Style);
                if (style)
                {
                    GUI.Label(GlobalRect, "", Style);
                }
                float title = OnTitleRect(clipRect);
                GUI.BeginClip(new Rect(GlobalRect.x, GlobalRect.y + title, GlobalRect.width, GlobalRect.height - title));
                clipRect.position = Vector2.zero;
                clipRect.size     = new Vector2(GlobalRect.width, GlobalRect.height - title);
                Vector2 offset = mScrollPos - new Vector2(GlobalRect.x, GlobalRect.y + title);
                mLocalSize = Vector2.zero;
                for (int i = 0; i < Elements.Count; i++)
                {
                    PaintElement ele = Elements[i];
                    if (!ele.Visible)
                    {
                        continue;
                    }
                    Rect rect = ele.GlobalRect;
                    rect.position += offset;
                    ele.GlobalRect = rect;
                    mLocalSize.x   = Math.Max(ele.LocalRect.xMax, mLocalSize.x);
                    mLocalSize.y   = Math.Max(ele.LocalRect.yMax, mLocalSize.y);
                    if (ele.DontClip || clipRect.Overlaps(ele.GlobalRect))
                    {
                        ele.OnGUI(clipRect);
                        if (ele.GlobalRect.Contains(Event.current.mousePosition))
                        {
                            mRaycastElement = ele;
                        }
                    }
                    if (ele.Parent != this)
                    {
                        clean = true;
                    }
                }
                GUI.EndClip();
                if (!mDrag)
                {
                    Vector2 scroll = new Vector2();
                    scroll.x = Mathf.Clamp(mScrollPos.x, Mathf.Min(10, LocalRect.width - mLocalSize.x), 10);
                    scroll.y = Mathf.Clamp(mScrollPos.y, Mathf.Min(10, LocalRect.height - mLocalSize.y), 10);
                    if (Vector2.SqrMagnitude(scroll - mScrollPos) > 1)
                    {
                        mScrollPos = Vector2.Lerp(mScrollPos, scroll, 0.1f);
                    }
                    else
                    {
                        mScrollPos = scroll;
                    }
                }
            }
            if (clean)
            {
                for (int i = Elements.Count - 1; i >= 0; i--)
                {
                    PaintElement ele = Elements[i];
                    if (ele.Parent != this)
                    {
                        Elements.RemoveAt(i);
                        ele.OnRemoved();
                    }
                }
            }
        }