public void Open(DemoOpenInfo demoInfo) { this.window = demoInfo.Window; this.viewport = demoInfo.Viewport; this.scene = demoInfo.Scene; this.demoInfo = demoInfo; Open(); }
public static DisposeCallback RegisterDup(DemoOpenInfo info, List<Body> bodies) { LinkedList<Body> removable = new LinkedList<Body>(); Body body = null; Scalar rotation = 0; Vector2D scale = new Vector2D(1, 1); bool duplicate = false; bool makeJoint = false; Vector2D anchor = Vector2D.Zero; int count = 0; Body bj1 = null; Body bj2 = null; EventHandler<ViewportMouseButtonEventArgs> mouseDown = delegate(object sender, ViewportMouseButtonEventArgs e) { IntersectionInfo temp; switch (e.Button) { case MouseButton.PrimaryButton: if (makeJoint) { count++; switch (count) { case 1: for (LinkedListNode<Body> node = removable.First; node != null; node = node.Next) { Vector2D pos = node.Value.Matrices.ToBody * e.Position; if (node.Value.Shape.TryGetIntersection(pos, out temp)) { bj1 = node.Value; return; } } count--; break; case 2: anchor = e.Position; break; case 3: for (LinkedListNode<Body> node = removable.First; node != null; node = node.Next) { Vector2D pos = node.Value.Matrices.ToBody * e.Position; if (node.Value.Shape.TryGetIntersection(pos, out temp)) { bj2 = node.Value; return; } } count--; break; } } else { foreach (Body b in bodies) { Vector2D pos = b.Matrices.ToBody * e.Position; if (b.Shape.TryGetIntersection(pos, out temp)) { body = b.Duplicate(); info.Scene.AddGraphic(new BodyGraphic(body)); return; } } for (LinkedListNode<Body> node = removable.First; node != null; node = node.Next) { Vector2D pos = node.Value.Matrices.ToBody * e.Position; if (node.Value.Shape.TryGetIntersection(pos, out temp)) { if (duplicate) { body = node.Value.Duplicate(); info.Scene.AddGraphic(new BodyGraphic(body)); return; } else { body = node.Value; removable.Remove(node); return; } } } } break; case MouseButton.SecondaryButton: for (LinkedListNode<Body> node = removable.First; node != null; node = node.Next) { Vector2D pos = node.Value.Matrices.ToBody * e.Position; if (node.Value.Shape.TryGetIntersection(pos, out temp)) { node.Value.Lifetime.IsExpired = true; removable.Remove(node); return; } } break; } }; EventHandler<ViewportMouseMotionEventArgs> mouseMotion = delegate(object sender, ViewportMouseMotionEventArgs e) { if (body != null) { body.State.Position.Linear = e.Position; } }; EventHandler<ViewportMouseButtonEventArgs> mouseUp = delegate(object sender, ViewportMouseButtonEventArgs e) { if (body != null) { removable.AddLast(body); body = null; } }; EventHandler<KeyboardEventArgs> keyDown = delegate(object sender, KeyboardEventArgs e) { switch (e.Key) { case Key.Q: rotation -= .05f; break; case Key.E: rotation += .05f; break; case Key.W: scale.Y += .05f; break; case Key.S: scale.Y -= .05f; break; case Key.A: scale.X -= .05f; break; case Key.D: scale.X += .05f; break; case Key.LeftControl: case Key.RightControl: duplicate = true; break; case Key.LeftShift: case Key.RightShift: count = 0; makeJoint = true; break; } }; EventHandler<KeyboardEventArgs> keyUp = delegate(object sender, KeyboardEventArgs e) { switch (e.Key) { case Key.Q: rotation += .05f; break; case Key.E: rotation -= .05f; break; case Key.W: scale.Y -= .05f; break; case Key.S: scale.Y += .05f; break; case Key.A: scale.X += .05f; break; case Key.D: scale.X -= .05f; break; case Key.LeftControl: case Key.RightControl: duplicate = false; break; case Key.LeftShift: case Key.RightShift: switch (count) { case 2: info.Scene.Engine.AddJoint(new FixedHingeJoint(bj1, anchor, new Lifespan())); break; case 3: info.Scene.Engine.AddJoint(new HingeJoint(bj1, bj2, anchor, new Lifespan())); break; } count = 0; makeJoint = false; break; } }; EventHandler<DrawEventArgs> onDraw = delegate(object sender, DrawEventArgs e) { if (body != null) { body.State.Position.Angular += rotation; body.Transformation *= Matrix2x3.FromScale(scale); body.ApplyPosition(); } }; info.Scene.BeginDrawing += onDraw; info.Viewport.MouseDown += mouseDown; info.Viewport.MouseMotion += mouseMotion; info.Viewport.MouseUp += mouseUp; Events.KeyboardDown += keyDown; Events.KeyboardUp += keyUp; return delegate() { info.Scene.BeginDrawing -= onDraw; info.Viewport.MouseDown -= mouseDown; info.Viewport.MouseMotion -= mouseMotion; info.Viewport.MouseUp -= mouseUp; Events.KeyboardDown -= keyDown; Events.KeyboardUp -= keyUp; }; }
public static DisposeCallback RegisterDup(DemoOpenInfo info, List <Body> bodies) { LinkedList <Body> removable = new LinkedList <Body>(); Body body = null; Scalar rotation = 0; Vector2D scale = new Vector2D(1, 1); bool duplicate = false; bool makeJoint = false; Vector2D anchor = Vector2D.Zero; int count = 0; Body bj1 = null; Body bj2 = null; EventHandler <ViewportMouseButtonEventArgs> mouseDown = delegate(object sender, ViewportMouseButtonEventArgs e) { IntersectionInfo temp; switch (e.Button) { case MouseButton.PrimaryButton: if (makeJoint) { count++; switch (count) { case 1: for (LinkedListNode <Body> node = removable.First; node != null; node = node.Next) { Vector2D pos = node.Value.Matrices.ToBody * e.Position; if (node.Value.Shape.TryGetIntersection(pos, out temp)) { bj1 = node.Value; return; } } count--; break; case 2: anchor = e.Position; break; case 3: for (LinkedListNode <Body> node = removable.First; node != null; node = node.Next) { Vector2D pos = node.Value.Matrices.ToBody * e.Position; if (node.Value.Shape.TryGetIntersection(pos, out temp)) { bj2 = node.Value; return; } } count--; break; } } else { foreach (Body b in bodies) { Vector2D pos = b.Matrices.ToBody * e.Position; if (b.Shape.TryGetIntersection(pos, out temp)) { body = b.Duplicate(); info.Scene.AddGraphic(new BodyGraphic(body)); return; } } for (LinkedListNode <Body> node = removable.First; node != null; node = node.Next) { Vector2D pos = node.Value.Matrices.ToBody * e.Position; if (node.Value.Shape.TryGetIntersection(pos, out temp)) { if (duplicate) { body = node.Value.Duplicate(); info.Scene.AddGraphic(new BodyGraphic(body)); return; } else { body = node.Value; removable.Remove(node); return; } } } } break; case MouseButton.SecondaryButton: for (LinkedListNode <Body> node = removable.First; node != null; node = node.Next) { Vector2D pos = node.Value.Matrices.ToBody * e.Position; if (node.Value.Shape.TryGetIntersection(pos, out temp)) { node.Value.Lifetime.IsExpired = true; removable.Remove(node); return; } } break; } }; EventHandler <ViewportMouseMotionEventArgs> mouseMotion = delegate(object sender, ViewportMouseMotionEventArgs e) { if (body != null) { body.State.Position.Linear = e.Position; } }; EventHandler <ViewportMouseButtonEventArgs> mouseUp = delegate(object sender, ViewportMouseButtonEventArgs e) { if (body != null) { removable.AddLast(body); body = null; } }; EventHandler <KeyboardEventArgs> keyDown = delegate(object sender, KeyboardEventArgs e) { switch (e.Key) { case Key.Q: rotation -= .05f; break; case Key.E: rotation += .05f; break; case Key.W: scale.Y += .05f; break; case Key.S: scale.Y -= .05f; break; case Key.A: scale.X -= .05f; break; case Key.D: scale.X += .05f; break; case Key.LeftControl: case Key.RightControl: duplicate = true; break; case Key.LeftShift: case Key.RightShift: count = 0; makeJoint = true; break; } }; EventHandler <KeyboardEventArgs> keyUp = delegate(object sender, KeyboardEventArgs e) { switch (e.Key) { case Key.Q: rotation += .05f; break; case Key.E: rotation -= .05f; break; case Key.W: scale.Y -= .05f; break; case Key.S: scale.Y += .05f; break; case Key.A: scale.X += .05f; break; case Key.D: scale.X -= .05f; break; case Key.LeftControl: case Key.RightControl: duplicate = false; break; case Key.LeftShift: case Key.RightShift: switch (count) { case 2: info.Scene.Engine.AddJoint(new FixedHingeJoint(bj1, anchor, new Lifespan())); break; case 3: info.Scene.Engine.AddJoint(new HingeJoint(bj1, bj2, anchor, new Lifespan())); break; } count = 0; makeJoint = false; break; } }; EventHandler <DrawEventArgs> onDraw = delegate(object sender, DrawEventArgs e) { if (body != null) { body.State.Position.Angular += rotation; body.Transformation *= Matrix2x3.FromScale(scale); body.ApplyPosition(); } }; info.Scene.BeginDrawing += onDraw; info.Viewport.MouseDown += mouseDown; info.Viewport.MouseMotion += mouseMotion; info.Viewport.MouseUp += mouseUp; Events.KeyboardDown += keyDown; Events.KeyboardUp += keyUp; return(delegate() { info.Scene.BeginDrawing -= onDraw; info.Viewport.MouseDown -= mouseDown; info.Viewport.MouseMotion -= mouseMotion; info.Viewport.MouseUp -= mouseUp; Events.KeyboardDown -= keyDown; Events.KeyboardUp -= keyUp; }); }