//draws arrows manually (not required atm) private void recreateArrows(RDNode rdNode) { if (rdNode.state != RDNode.State.HIDDEN) { for (int i = 0; i < rdNode.parents.Count(); ++i) { //Recreate Parent hopefully recreates incoming array? nope, doesnt, also not with calling UpdateGraphics and/or Setup not... //just changing the line does not update the graphics either. RDNode.Parent parentStruct = rdNode.parents[i]; if (parentStruct.line != null) { Vector.DestroyLine(ref parentStruct.line); } if (parentStruct.arrowHead != null) { GameObject.Destroy(parentStruct.arrowHead); } }//endfor foreach parentnode RDGridArea gridArea = GameObject.FindObjectOfType <RDGridArea>(); //typeof(RDNode).GetMethod("InitializeArrows", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(treeNode, new object[] { }); if (rdNode.state == RDNode.State.RESEARCHED || rdNode.state == RDNode.State.RESEARCHABLE) { typeof(RDNode).GetMethod("DrawArrow", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(rdNode, new object[] { gridArea.LineMaterial }); } else { typeof(RDNode).GetMethod("DrawArrow", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(rdNode, new object[] { gridArea.LineMaterialGray }); } } }
private void updateParentsForNode(RDNode treeNode, ConfigNode treeCfg) { //Debug.Log("updating parents for node " + treeNode.gameObject.name); //clear all old parents. The RD-Scene will take care of drawing the arrows clearParentsFromNode(treeNode); List <RDNode.Parent> connectionList = new List <RDNode.Parent>(); foreach (ConfigNode parentCfg in treeCfg.GetNodes("PARENT_NODE")) { if (parentCfg.HasValue("name")) { string parentName = parentCfg.GetValue("name"); //RDNode parentNode = Array.Find<RDNode>(AssetBase.RnDTechTree.GetTreeNodes(), x => x.gameObject.name == parentName); //RDNode parentNode = AssetBase.RnDTechTree.GetTreeNodes().FirstOrDefault(rdn => rdn.gameObject.name == parentName); //RDNode parentNode = GameObject.FindObjectsOfType(typeof(RDNode)).Cast<RDNode>().FirstOrDefault(rdn => rdn.gameObject.name == parentName); RDNode parentNode = GetNodeNamed(parentName); if (parentNode) //Default-constructed RDNode (if search fails) fails this test { //Debug.Log(" --- parentnode: " + parentName); parentNode.children.Add(treeNode); RDNode.Parent connection; // only manually override the anchor points if BOTH are specified in the config if (parentCfg.HasValue("parentSide") && parentCfg.HasValue("childSide")) { RDNode.Anchor parentAnchor = (RDNode.Anchor)Enum.Parse(typeof(RDNode.Anchor), parentCfg.GetValue("parentSide")); RDNode.Anchor childAnchor = (RDNode.Anchor)Enum.Parse(typeof(RDNode.Anchor), parentCfg.GetValue("childSide")); //Debug.Log("Overriding auto-assignment for node " + treeNode.gameObject.name + " to " + parentAnchor + "->" + childAnchor); connection = new RDNode.Parent(new RDNode.ParentAnchor(parentNode, parentAnchor), childAnchor); parentConnectionsAlreadyProcessed.Add(connection); } else { //create RDNode.Parent structure - anchors will be corrected once all nodes have been loaded connection = new RDNode.Parent(new RDNode.ParentAnchor(parentNode, RDNode.Anchor.RIGHT), RDNode.Anchor.LEFT); } connectionList.Add(connection); } else { Debug.LogError("ATC: Invalid parent node specified for: " + treeNode.gameObject.name + " parent: " + parentName); } } } treeNode.parents = connectionList.ToArray(); }
public List <Vector2> GetVectorArray(RDNode.Parent link) { Func <Vector2, Vector2, RDNode.Anchor, IEnumerable <Vector2> > builder; if (link.parent.anchor == link.anchor) { throw new NotImplementedException("Link between same anchors are not supported."); } else if ((link.parent.anchor <= RDNode.Anchor.BOTTOM && link.anchor >= RDNode.Anchor.RIGHT) || (link.parent.anchor >= RDNode.Anchor.RIGHT && link.anchor <= RDNode.Anchor.BOTTOM)) { builder = this.BuildSingleCorner; } else { builder = this.BuildLine; } return(this.Generate(builder(link.parent.GetPosition(Vector2.zero), this.GetPosition(link.anchor), link.parent.anchor).ToArray()).ToList()); }
private void setupAnchors(RDNode target, ref RDNode.Parent connection) { RDNode source = connection.parent.node; //find main direction from outgoing node (parent) to target (connectionOwner) node to set anchor tags //Exception: Cannot display incoming and outgoing nodes on the same anchor Vector3 connectionVec = target.transform.localPosition - source.transform.localPosition; //calculate/setup anchors List <RDNode.Anchor> possibleParentAnchors = new List <RDNode.Anchor>(); List <RDNode.Anchor> possibleTargetAnchors = new List <RDNode.Anchor>(); if (connectionVec.x >= 0) {//left to right if (isAnchorAvailableForOutgoingArrows(source, RDNode.Anchor.RIGHT)) { possibleParentAnchors.Add(RDNode.Anchor.RIGHT); } possibleTargetAnchors.Add(RDNode.Anchor.LEFT); } else { if (isAnchorAvailableForOutgoingArrows(source, RDNode.Anchor.LEFT)) { possibleParentAnchors.Add(RDNode.Anchor.LEFT); } possibleTargetAnchors.Add(RDNode.Anchor.RIGHT); } if (connectionVec.y >= 0) //up { if (isAnchorAvailableForOutgoingArrows(source, RDNode.Anchor.TOP)) { possibleParentAnchors.Add(RDNode.Anchor.TOP); } possibleTargetAnchors.Add(RDNode.Anchor.BOTTOM); } else // TOP-DOWN connection doesnt work because of parent or target anchor { //neither does or BOTTOM->LEFT RIGHT->TOP neiter //possibleParentAnchors.Add(RDNode.Anchor.BOTTOM); //possibleTargetAnchors.Add(RDNode.Anchor.TOP); } //Debug.Log("options remaining after filtering: " + possibleParentAnchors.Count()); //foreach (RDNode.Anchor anchor in possibleParentAnchors) // Debug.Log("available anchor: " + anchor); //if two options are available, pick the larger distance if (Math.Abs(connectionVec.x) < Math.Abs(connectionVec.y)) //preferrably vertical { { possibleParentAnchors.Reverse(); possibleTargetAnchors.Reverse(); } if (possibleParentAnchors.Count == 0 || possibleTargetAnchors.Count == 0) { Debug.LogWarning("no valid anchor for connection " + source.gameObject.name + "->" + target.gameObject.name + ", direction = " + connectionVec.ToString() + ", defaulting to anchors RIGHT->LEFT"); if (possibleParentAnchors.Count == 0) { possibleParentAnchors.Add(RDNode.Anchor.RIGHT); } if (possibleTargetAnchors.Count == 0) { possibleTargetAnchors.Add(RDNode.Anchor.LEFT); } } //Debug.Log(" anchors for connection " + source.gameObject.name + "->" + target.gameObject.name+ ", direction = " + connectionVec.ToString() + " anchors : " + possibleParentAnchors.First() + " -> " + possibleTargetAnchors.First()); connection.anchor = possibleTargetAnchors.First(); connection.parent.anchor = possibleParentAnchors.First(); }
private void updateParentsForNode(RDNode treeNode, ConfigNode treeCfg) { //Debug.Log("updating parents for node " + treeNode.gameObject.name); //clear all old parents. The RD-Scene will take care of drawing the arrows clearParentsFromNode(treeNode); List<RDNode.Parent> connectionList = new List<RDNode.Parent>(); foreach (ConfigNode parentCfg in treeCfg.GetNodes("PARENT_NODE")) { if (parentCfg.HasValue("name")) { string parentName = parentCfg.GetValue("name"); //RDNode parentNode = Array.Find<RDNode>(AssetBase.RnDTechTree.GetTreeNodes(), x => x.gameObject.name == parentName); //RDNode parentNode = AssetBase.RnDTechTree.GetTreeNodes().FirstOrDefault(rdn => rdn.gameObject.name == parentName); //RDNode parentNode = GameObject.FindObjectsOfType(typeof(RDNode)).Cast<RDNode>().FirstOrDefault(rdn => rdn.gameObject.name == parentName); RDNode parentNode = GetNodeNamed(parentName); if (parentNode) //Default-constructed RDNode (if search fails) fails this test { //Debug.Log(" --- parentnode: " + parentName); parentNode.children.Add(treeNode); RDNode.Parent connection; // only manually override the anchor points if BOTH are specified in the config if (parentCfg.HasValue("parentSide") && parentCfg.HasValue("childSide")) { RDNode.Anchor parentAnchor = (RDNode.Anchor)Enum.Parse(typeof(RDNode.Anchor), parentCfg.GetValue("parentSide")); RDNode.Anchor childAnchor = (RDNode.Anchor)Enum.Parse(typeof(RDNode.Anchor), parentCfg.GetValue("childSide")); //Debug.Log("Overriding auto-assignment for node " + treeNode.gameObject.name + " to " + parentAnchor + "->" + childAnchor); connection = new RDNode.Parent(new RDNode.ParentAnchor(parentNode, parentAnchor), childAnchor); parentConnectionsAlreadyProcessed.Add(connection); } else { //create RDNode.Parent structure - anchors will be corrected once all nodes have been loaded connection = new RDNode.Parent(new RDNode.ParentAnchor(parentNode, RDNode.Anchor.RIGHT), RDNode.Anchor.LEFT); } connectionList.Add(connection); } else { Debug.LogError("ATC: Invalid parent node specified for: " + treeNode.gameObject.name + " parent: " + parentName); } } } treeNode.parents = connectionList.ToArray(); }
public static List <Vector2> Execute(RDNode node, RDNode.Parent parent) => new RDNodeWrapper(node).GetVectorArray(parent);
private void setupAnchors(RDNode target, ref RDNode.Parent connection) { RDNode source = connection.parent.node; //RDNode source = GetNodeNamed(connection.parent.node.name); //Debug.Log("Setting up anchors for " + target.name); //string state = string.Format("target: {0}\nconnection: {1}\nsource: {2}", target, connection, source); //Debug.Log(state); if (source == null) { return; } //find main direction from outgoing node (parent) to target (connectionOwner) node to set anchor tags //Exception: Cannot display incoming and outgoing nodes on the same anchor Vector3 connectionVec; try { connectionVec = target.transform.localPosition - source.transform.localPosition; } catch { Debug.Log("A problem occurred while finding the connection vector between " + source.name + " (source) and " + target.name + " (target)"); try { Debug.Log(target.name + " is able to access its transform: " + (target.transform != null)); } catch { } try { Debug.Log(source.name + " is able to access its transform: " + (source.transform != null)); } catch { } return; } //calculate/setup anchors List <RDNode.Anchor> possibleParentAnchors = new List <RDNode.Anchor>(); List <RDNode.Anchor> possibleTargetAnchors = new List <RDNode.Anchor>(); if (connectionVec.x >= 0) {//left to right if (isAnchorAvailableForOutgoingArrows(source, RDNode.Anchor.RIGHT)) { possibleParentAnchors.Add(RDNode.Anchor.RIGHT); } possibleTargetAnchors.Add(RDNode.Anchor.LEFT); } else { if (isAnchorAvailableForOutgoingArrows(source, RDNode.Anchor.LEFT)) { possibleParentAnchors.Add(RDNode.Anchor.LEFT); } possibleTargetAnchors.Add(RDNode.Anchor.RIGHT); } if (connectionVec.y >= 0) //up { if (isAnchorAvailableForOutgoingArrows(source, RDNode.Anchor.TOP)) { possibleParentAnchors.Add(RDNode.Anchor.TOP); } possibleTargetAnchors.Add(RDNode.Anchor.BOTTOM); } else // TOP-DOWN connection doesnt work because of parent or target anchor { //neither does or BOTTOM->LEFT RIGHT->TOP neiter //possibleParentAnchors.Add(RDNode.Anchor.BOTTOM); //possibleTargetAnchors.Add(RDNode.Anchor.TOP); } //Debug.Log("options remaining after filtering: " + possibleParentAnchors.Count()); //foreach (RDNode.Anchor anchor in possibleParentAnchors) // Debug.Log("available anchor: " + anchor); //if two options are available, pick the larger distance if (Math.Abs(connectionVec.x) < Math.Abs(connectionVec.y)) //preferrably vertical { { possibleParentAnchors.Reverse(); possibleTargetAnchors.Reverse(); } if (possibleParentAnchors.Count == 0 || possibleTargetAnchors.Count == 0) { Debug.LogWarning("no valid anchor for connection " + source.gameObject.name + "->" + target.gameObject.name + ", direction = " + connectionVec.ToString() + ", defaulting to anchors RIGHT->LEFT"); if (possibleParentAnchors.Count == 0) { possibleParentAnchors.Add(RDNode.Anchor.RIGHT); } if (possibleTargetAnchors.Count == 0) { possibleTargetAnchors.Add(RDNode.Anchor.LEFT); } } //Debug.Log(" anchors for connection " + source.gameObject.name + "->" + target.gameObject.name+ ", direction = " + connectionVec.ToString() + " anchors : " + possibleParentAnchors.First() + " -> " + possibleTargetAnchors.First()); connection.anchor = possibleTargetAnchors.First(); connection.parent.anchor = possibleParentAnchors.First(); }