public void ChainedStateSwitcherTest() { // check that you can enter edit modes repeatedly and escape out of each one (like popups within popups) var logs = new List <string>(); StateSwitcher ss1 = new StateSwitcher(); ss1.Focus(); ss1.Register(new DummyComponent(logs, "1")); StateSwitcher ss2 = new StateSwitcher(); ss2.Register(new DummyComponent(logs, "2")); StateSwitcher ss3 = new StateSwitcher(); ss3.Register(new DummyComponent(logs, "3")); ss1.AddKeyFocus(Trigger.E, ss2, () => { return; }, false); ss2.AddKeyFocus(Trigger.E, ss3, () => { return; }, false); var mockInputManager = new MockInputManager(); var uiContext = new UIContext(mockInputManager, null); SimulateKeyPress(mockInputManager, uiContext, Keys.P); foreach (var key in new[] { Keys.E, Keys.E, Keys.E, Keys.Escape, Keys.Escape, Keys.Escape }) { SimulateKeyPress(mockInputManager, uiContext, key); SimulateKeyPress(mockInputManager, uiContext, Keys.P); } string expectedResult = "1,2,3,3,2,1,1"; string actualResult = string.Join(",", logs); Assert.AreEqual(expectedResult, actualResult); }
public void AddSwitcher(Type switcherType) { if (!HasSwitcher(switcherType)) { StateSwitcher <User> s = (StateSwitcher <User>)Activator.CreateInstance(switcherType); stateSwitchers.Add(switcherType, s); if (Active) { s.ActivateSwitcher(effected, stateMachine); } } }
private void Start() { fpsState = FPController.Instance; szState = SZController.Instance; switcher = StateSwitcher.Instance; szMemory = SZMemory.Instance; if (Options.Instance.isFP_isFirst) { stateType = PlayerStateType.FirstPerson; fpsState.Unlock(); } else { stateType = PlayerStateType.StageZone; szState.Unlock(); } }
// TODO: somehow we have orphan vertices public MeshTemplate() { vertexData = new VertexDataComponent() { saveColor = false }; lineData = new LineDataComponent() { vertexData = vertexData }; polyData = new VertexListHashDataComponent() { vertexData = vertexData }; polyData.AddObserver(this); faceMesh = new FaceMesh() { vertexData = vertexData }; lineMesh = new LineMesh() { vertexData = vertexData }; pointMesh = new PointMesh() { vertexData = vertexData }; var tracker = new PointCollectionTracker <VertexData>(vertexData, x => x.position); Register(vertexData, lineData, polyData, faceMesh, lineMesh, pointMesh); // setup ui // TODO: these all need to be in reversible actions var selector = new Selector <VertexData>(new CameraSelectionProvider <VertexData>(tracker), x => { x.color = Color.Orange; RecalculateEverything(); }, x => { x.color = Color.Black; RecalculateEverything(); } ); Register(selector); CameraMouseTracker dragMouseTracker = new CameraMouseTracker() { stepSize = 0.25f }; // TODO: maybe make event handlers so you can do += stuff... dragMouseTracker.OnStepDiff = x => { foreach (var s in selector.selected) { s.position += x; } RecalculateEverything(); }; StateSwitcher switcher = new StateSwitcher(this); switcher.AddKeyFocus(Trigger.G, dragMouseTracker, () => { // translate vertices Vector3 selectedSum = Vector3.Zero; foreach (var s in selector.selected) { selectedSum += s.position; } dragMouseTracker.worldOrigin = selectedSum / selector.selected.Count; dragMouseTracker.mouseOrigin = new Vector2(Mouse.GetState().X, Mouse.GetState().Y); dragMouseTracker.oldOffset = null; }, true); switcher.AddKeyFocus(Trigger.E, dragMouseTracker, () => { // extrude Vector3 selectedSum = Vector3.Zero; foreach (var s in selector.selected) { selectedSum += s.position; } dragMouseTracker.worldOrigin = selectedSum / selector.selected.Count; dragMouseTracker.mouseOrigin = new Vector2(Mouse.GetState().X, Mouse.GetState().Y); dragMouseTracker.oldOffset = null; var selectedPolys = GetSelectedPolys(selector); var clonedPolys = ClonePolys(selectedPolys); foreach (var p in clonedPolys) { polyData.Add(p); } SetSelected(selector, clonedPolys); var perim1 = GetPerimeterPieces(selectedPolys); var perim2 = GetPerimeterPieces(clonedPolys); for (int i = 0; i < perim1.Count; i++) { polyData.Add(new VertexData[] { perim1[i][1], perim2[i][1], perim2[i][0], perim1[i][0] }); } foreach (var p in selectedPolys) { polyData.Remove(p); } }, true); switcher.AddKeyFocus(Trigger.ShiftA, dragMouseTracker, () => { // add a new unit plane and drag var v1 = new VertexData(new Vector3(0, 0, 0), Color.Black); var v2 = new VertexData(new Vector3(1, 0, 0), Color.Black); var v3 = new VertexData(new Vector3(1, 0, 1), Color.Black); var v4 = new VertexData(new Vector3(0, 0, 1), Color.Black); vertexData.AddRange(new[] { v1, v2, v3, v4 }); var newPoly = new VertexData[] { v1, v2, v3, v4 }; polyData.Add(newPoly); SetSelected(selector, new List <VertexData[]>() { newPoly }); dragMouseTracker.worldOrigin = new Vector3(0.5f, 0, 0.5f); dragMouseTracker.mouseOrigin = new Vector2(Mouse.GetState().X, Mouse.GetState().Y); dragMouseTracker.oldOffset = null; var selectedPolys = GetSelectedPolys(selector); }, true); Register(switcher); RegisterListener(new InputListener(Trigger.Delete, x => { var selectedPolys = GetSelectedPolys(selector); foreach (var p in selectedPolys) { polyData.Remove(p); } })); RegisterListener(new InputListener(Trigger.F, x => { var selectedLines = GetSelectedLines(selector); VertexData[] newPoly = new VertexData[selector.selected.Count]; newPoly[0] = selectedLines[0][1]; newPoly[1] = selectedLines[0][0]; List <VertexData> remaining = selector.selected.ToList(); remaining.Remove(newPoly[0]); remaining.Remove(newPoly[1]); for (int i = 2; i < newPoly.Length; i++) { VertexData best = null; double bestValue = -100; foreach (var r in remaining) { Vector3 v1 = newPoly[i - 1].position - newPoly[i - 2].position; Vector3 v2 = r.position - newPoly[i - 1].position; v1.Normalize(); v2.Normalize(); double thisValue = Vector3.Dot(v1, v2); if (thisValue > bestValue) { bestValue = thisValue; best = r; } } remaining.Remove(best); newPoly[i] = best; } polyData.Add(newPoly); })); Register(new PlaneGrid()); }
private void Awake() { Instance = this; }