private void UpdateMouseRay(GameTime time) { Ray ray = World.Camera.GetMouseRay(Screen.InputManager.CurrentMousePosition); GameObjectDistance nearest = null; foreach (IGameObject obj in World.Objects) { if (obj.IsVisible) { GameObjectDistance intersection = obj.Intersects(ray); if (intersection != null) { if (intersection.Distance > 0 && (nearest == null || intersection.Distance < nearest.Distance)) { nearest = intersection; } } } } if (nearest != null) { World.SelectedObject = nearest.Object; } else { World.SelectedObject = null; } }
//Is called when a selection from the context menu is made void ContextCallback(object obj) { //make the passed object to a string string clb = obj.ToString(); //add the node we want if (clb.Equals("inputNode")) { InputNode inputNode = ScriptableObject.CreateInstance <InputNode>(); inputNode.WindowRect = new Rect(mousePos.x, mousePos.y, 200, 80); windows.Add(inputNode); } else if (clb.Equals("outputNode")) { OutputNode outputNode = ScriptableObject.CreateInstance <OutputNode>(); outputNode.WindowRect = new Rect(mousePos.x, mousePos.y, 200, 80); windows.Add(outputNode); } else if (clb.Equals("calcNode")) { CalcNode calcNode = ScriptableObject.CreateInstance <CalcNode>(); calcNode.WindowRect = new Rect(mousePos.x, mousePos.y, 200, 95); windows.Add(calcNode); } else if (clb.Equals("compNode")) { ComparisonNode compNode = ScriptableObject.CreateInstance <ComparisonNode>(); compNode.WindowRect = new Rect(mousePos.x, mousePos.y, 200, 95); windows.Add(compNode); } else if (clb.Equals("numNode")) { NumberNode numNode = ScriptableObject.CreateInstance <NumberNode>(); numNode.WindowRect = new Rect(mousePos.x, mousePos.y, 200, 95); windows.Add(numNode); } else if (clb.Equals("goObj")) { GameObjectNode goObj = ScriptableObject.CreateInstance <GameObjectNode>(); goObj.WindowRect = new Rect(mousePos.x, mousePos.y, 200, 100); windows.Add(goObj); } else if (clb.Equals("goActive")) { GameObjectActive goNode = ScriptableObject.CreateInstance <GameObjectActive>(); goNode.WindowRect = new Rect(mousePos.x, mousePos.y, 200, 80); windows.Add(goNode); } else if (clb.Equals("goDistance")) { GameObjectDistance goDistance = ScriptableObject.CreateInstance <GameObjectDistance>(); goDistance.WindowRect = new Rect(mousePos.x, mousePos.y, 200, 80); windows.Add(goDistance); } else if (clb.Equals("timerNode")) { TimerNode tNode = ScriptableObject.CreateInstance <TimerNode>(); tNode.WindowRect = new Rect(mousePos.x, mousePos.y, 200, 95); windows.Add(tNode); } else if (clb.Equals("boolNode")) { BoolNode bNode = ScriptableObject.CreateInstance <BoolNode>(); bNode.WindowRect = new Rect(mousePos.x, mousePos.y, 120, 75); windows.Add(bNode); } else if (clb.Equals("clearAll")) { windows.Clear(); } else if (clb.Equals("reset")) { PanX = PanY = 0; } else if (clb.Equals("makeTransition")) //if it's a transition { bool clickedOnWindow = false; int selectedIndex = -1; //find the window that it was clicked for (int i = 0; i < windows.Count; i++) { if (windows[i].WindowRect.Contains(mousePos)) { selectedIndex = i; clickedOnWindow = true; break; } } //and make it the selected node of the transition if (clickedOnWindow) { selectedNode = windows[selectedIndex]; makeTransitionMode = true; } } else if (clb.Equals("deleteNode")) //if it's a delete node { bool clickedOnWindow = false; int selectedIndex = -1; //find the selected node for (int i = 0; i < windows.Count; i++) { if (windows[i].WindowRect.Contains(mousePos)) { selectedIndex = i; clickedOnWindow = true; break; } } if (clickedOnWindow) { //delete it from our list BaseNode selNode = windows[selectedIndex]; windows.RemoveAt(selectedIndex); //then pass it to all our nodes that is deleted foreach (BaseNode n in windows) { n.NodeDeleted(selNode); } } } //we use else if instead of a switch because: /*Selecting from a set of multiple cases is faster with if statements than with switch */ }