public void GetFixtureEdgeCoordTest3() { Scene scene = new Scene(); Vector2[] vertices = GetVertices(); Actor actor = new Actor(scene, vertices); actor.SetTransform(new Transform2(new Vector2(), 1, 0, true)); PolygonCoord polyCoord = new PolygonCoord(4, 0.4f); FixtureCoord fixtureCoord = FixtureExt.GetFixtureEdgeCoord(actor, polyCoord); Assert.IsTrue(PolygonExt.GetTransform(vertices, polyCoord) == PolygonExt.GetTransform(fixtureCoord)); }
public void GetFixtureEdgeCoordTest2() { Scene scene = new Scene(); Vector2[] vertices = new Vector2[] { new Vector2(0, 0), new Vector2(1, 0), new Vector2(1, 1), new Vector2(0, 1) }; Actor actor = new Actor(scene, vertices); actor.SetTransform(new Transform2(new Vector2(), 1, 0, true)); PolygonCoord polyCoord = new PolygonCoord(0, 0f); FixtureCoord fixtureCoord = FixtureExt.GetFixtureEdgeCoord(actor, polyCoord); Transform2 expected = PolygonExt.GetTransform(actor.GetWorldVertices(), polyCoord); Transform2 result = PolygonExt.GetTransform(fixtureCoord); Assert.IsTrue(expected.AlmostEqual(result)); }
public void AsymmetricPortalSizeBugTest() { Scene scene = new Scene(); scene.Gravity = new Vector2(); FloatPortal portal0 = new FloatPortal(scene); FloatPortal portal1 = new FloatPortal(scene); portal0.SetTransform(new Transform2(new Vector2(0, 0), 1, (float)Math.PI / 2)); portal1.SetTransform(new Transform2(new Vector2(10, 0), 2, (float)Math.PI / 2, true)); Portal.SetLinked(portal0, portal1); PortalCommon.UpdateWorldTransform(scene); Actor actor = new Actor(scene, PolygonFactory.CreateRectangle(1, 4)); Vector2 startPos = new Vector2(0, 1); actor.SetTransform(new Transform2(startPos)); for (int i = 0; i < 10; i++) { scene.Step(1 / (float)60); Assert.IsTrue((actor.GetTransform().Position - startPos).Length < 0.001f); } }
public void GetWorldPointsTest3() { Scene scene = new Scene(); Vector2[] vertices = new Vector2[] { new Vector2(0, 0), new Vector2(2.2f, 0), new Vector2(1, 1), new Vector2(0, 1) }; Actor actor = new Actor(scene, vertices); actor.SetTransform(new Transform2(new Vector2(4.2f, -5.5f), -2f, -2f, true)); PortalCommon.UpdateWorldTransform(scene); scene.World.ProcessChanges(); Vector2[] fixtureVertices = FixtureExt.GetWorldPoints(actor.Body.FixtureList[0]); Assert.IsTrue(MathExt.IsIsomorphic(actor.GetWorldVertices(), fixtureVertices, (item0, item1) => (item0 - item1).Length < 0.001f)); }
public void StepTest7() { Scene scene = new Scene(); Actor actor = new Actor(scene, PolygonFactory.CreateRectangle(2, 2)); actor.SetTransform(new Transform2(new Vector2(1, 1))); actor.SetVelocity(Transform2.CreateVelocity(new Vector2(0, 3))); Entity entity = new Entity(scene); entity.SetParent(actor); FloatPortal enter = new FloatPortal(scene); enter.SetTransform(new Transform2(new Vector2(1, 2), 1, (float)Math.PI / 2)); //enter.SetVelocity(Transform2.CreateVelocity(new Vector2(1, 0))); FloatPortal exit = new FloatPortal(scene); exit.SetTransform(new Transform2(new Vector2(10, 10))); exit.SetVelocity(Transform2.CreateVelocity(new Vector2(10, 0))); enter.Linked = exit; exit.Linked = enter; PortalCommon.UpdateWorldTransform(scene); SimulationStep.Step(scene.GetAll().OfType<IPortalCommon>(), scene.GetAll().OfType<IPortal>(), 1, null); Assert.IsTrue(entity.GetTransform() == new Transform2()); Assert.IsTrue(entity.GetVelocity() == Transform2.CreateVelocity()); Assert.IsTrue(actor.GetTransform() == actor.WorldTransform); Assert.IsTrue(actor.GetVelocity() == actor.WorldVelocity); }
public void StepTest8() { Scene scene = new Scene(); Actor actor = new Actor(scene, PolygonFactory.CreateRectangle(2, 2)); actor.SetTransform(new Transform2(new Vector2(1, 1))); Transform2 velocity = Transform2.CreateVelocity(new Vector2(0, 3)); actor.SetVelocity(velocity); FixturePortal fixture = new FixturePortal(scene, actor, new PolygonCoord(0, 0.5f)); /*FloatPortal enter = new FloatPortal(scene); enter.SetTransform(new Transform2(new Vector2(1, 2), 1, (float)Math.PI / 2)); //enter.SetVelocity(Transform2.CreateVelocity(new Vector2(1, 0))); FloatPortal exit = new FloatPortal(scene); exit.SetTransform(new Transform2(new Vector2(10, 10))); exit.SetVelocity(Transform2.CreateVelocity(new Vector2(10, 0))); enter.Linked = exit; exit.Linked = enter;*/ PortalCommon.UpdateWorldTransform(scene); Transform2 transformPrevious = fixture.WorldTransform.ShallowClone(); Transform2 actorPrevious = actor.WorldTransform.ShallowClone(); SimulationStep.Step(scene.GetAll().OfType<IPortalCommon>(), scene.GetAll().OfType<IPortal>(), 1, null); Transform2 expected = transformPrevious.Add(velocity); Assert.IsTrue(expected.AlmostEqual(fixture.WorldTransform)); }
/// <summary> /// Creates a Scene from an EditorScene. Scene is intended for gameplay use. /// </summary> public static Scene Export(EditorScene level, Controller controller) { Scene scene = new Scene(); /*if (level.GetAll().OfType<EditorPlayer>().Count() > 0) { Camera2 camera = new Camera2(scene); camera.SetTransform(new Transform2(new Vector2(), 10, 0)); scene.SetActiveCamera(camera); if (level.ActiveCamera != null) { camera.Aspect = level.ActiveCamera.Aspect; } } else*/ { if (level.ActiveCamera != null) { ControllerCamera camera = level.ActiveCamera.ShallowClone(); camera.Scene = scene; scene.SetActiveCamera(camera); } } #region create background Model background = Game.ModelFactory.CreatePlane(); background.Texture = level.Renderer.GetTexture("grid.png"); background.SetColor(new Vector3(1, 1, 0.5f)); background.Transform.Position = new Vector3(0, 0, -5f); float size = 50; background.Transform.Scale = new Vector3(size, size, size); background.TransformUv.Size = size; Entity back = new Entity(scene, new Vector2(0f, 0f)); back.Name = "Background"; back.AddModel(background); back.IsPortalable = false; #endregion Dictionary<EditorObject, SceneNode> dictionary = new Dictionary<EditorObject, SceneNode>(); AnimationDriver animation = new AnimationDriver(); scene.SceneObjectList.Add(animation); List<EditorObject> editorObjects = level.GetAll().OfType<EditorObject>().ToList(); foreach (EditorObject e in editorObjects) { if (e is EditorPortal) { EditorPortal cast = (EditorPortal)e; Entity entity = new Entity(scene); entity.IsPortalable = false; entity.AddModel(ModelFactory.CreatePortal()); entity.ModelList[0].Transform.Position += new Vector3(0, 0, -2); if (cast.OnEdge) { FixturePortal portal = new FixturePortal(scene); portal.Name = cast.Name; dictionary.Add(cast, portal); entity.SetParent(portal); } else { FloatPortal portal = new FloatPortal(scene); portal.Name = cast.Name; portal.SetTransform(cast.GetTransform()); dictionary.Add(cast, portal); entity.SetParent(portal); if (cast.AnimatedTransform != null) { animation.Add(portal, cast.AnimatedTransform); portal.SetTransform(cast.AnimatedTransform.GetTransform(0)); } else { portal.SetTransform(cast.GetTransform()); } } } else if (e is EditorEntity) { EditorEntity cast = (EditorEntity)e; Entity clone = new Entity(scene); clone.Name = cast.Name; clone.AddModelRange(cast.Models); dictionary.Add(cast, clone); if (cast.AnimatedTransform != null) { animation.Add(clone, cast.AnimatedTransform); clone.SetTransform(cast.AnimatedTransform.GetTransform(0)); } else { clone.SetTransform(cast.GetTransform()); } } else if (e is IWall) { EditorObject cast = e; Transform2 t = cast.GetTransform(); Actor actor = new Actor(scene, ((IWall)e).Vertices, t); actor.Name = cast.Name; Transform2 tEntity = new Transform2(); Entity entity = new Entity(scene, tEntity); entity.Name = cast.Name; entity.SetParent(actor); if (e is EditorWall) { EditorWall castWall = (EditorWall)e; actor.SetBodyType(BodyType.Static); //actor.Vertices = castWall.Vertices; entity.AddModel(Game.ModelFactory.CreatePolygon(castWall.Vertices)); //entity.AddModel(Game.ModelFactory.CreateActorDebug(actor)); dictionary.Add(castWall, actor); } else if (e is EditorActor) { //actor.SetVelocity(new Transform2(new Vector2(0.2f, 0))); EditorActor castActor = (EditorActor)e; //actor.Vertices = castActor.Vertices; entity.AddModel(castActor.GetActorModel(castActor)); //entity.AddModel(Game.ModelFactory.CreateActorDebug(actor)); dictionary.Add(castActor, actor); } else { Debug.Assert(false); } if (cast.AnimatedTransform != null) { animation.Add(actor, cast.AnimatedTransform); actor.SetTransform(cast.AnimatedTransform.GetTransform(0)); actor.SetBodyType(BodyType.Kinematic); } else { actor.SetTransform(cast.GetTransform()); } } else if (e is EditorPlayer) { EditorPlayer cast = (EditorPlayer)e; Player player = new Player(controller); Vector2[] polygon = PolygonFactory.CreateNGon(6, 0.5f, new Vector2()); Actor actor = new Actor(scene, polygon); player.SetActor(actor); actor.SetTransform(new Transform2(cast.GetWorldTransform().Position)); //player.Camera = (Camera2)scene.ActiveCamera; Entity entity = new Entity(scene, new Transform2()); entity.Name = cast.Name; entity.SetParent(actor); entity.AddModel(Game.ModelFactory.CreatePolygon(polygon)); scene.SceneObjectList.Add(player); dictionary.Add(cast, player.Actor); } else { Debug.Assert(false); } } foreach (EditorObject e in editorObjects) { SceneNode parent = e.Parent == null ? null : dictionary[e.Parent]; SceneNode clone = dictionary[e]; clone.SetParent(parent); if (clone is IPortal) { if (clone is FixturePortal) { FixturePortal cast = (FixturePortal)clone; cast.SetPosition((IWall)parent, ((EditorPortal)e).PolygonTransform, e.GetTransform().Size, e.GetTransform().MirrorX); Debug.Assert(((IWall)parent).Vertices.Count > 0); IPortal portalEditor = (IPortal)e; if (portalEditor.Linked != null) { cast.Linked = (IPortal)dictionary[(EditorPortal)portalEditor.Linked]; } } else if (clone is FloatPortal) { FloatPortal cast = (FloatPortal)clone; IPortal portalEditor = (IPortal)e; if (portalEditor.Linked != null) { cast.Linked = (IPortal)dictionary[(EditorPortal)portalEditor.Linked]; } } } } PortalCommon.UpdateWorldTransform(scene); return scene; }
public void StepTest5() { Scene scene = new Scene(); Actor p = new Actor(scene, PolygonFactory.CreateRectangle(2, 2)); Transform2 start = new Transform2(new Vector2(0, 0)); Transform2 velocity = Transform2.CreateVelocity(new Vector2(3, 0)); p.SetTransform(start); p.SetVelocity(velocity); FloatPortal enter = new FloatPortal(scene); enter.SetTransform(new Transform2(new Vector2(1, 0))); enter.SetVelocity(Transform2.CreateVelocity(new Vector2(1, 0))); FloatPortal exit = new FloatPortal(scene); exit.SetTransform(new Transform2(new Vector2(10, 10))); exit.SetVelocity(Transform2.CreateVelocity(new Vector2(10, 0))); enter.Linked = exit; exit.Linked = enter; FixturePortal child = new FixturePortal(scene, p, new PolygonCoord(0, 0.5f)); PortalCommon.UpdateWorldTransform(new IPortalCommon[] { p, enter, exit, child }); SimulationStep.Step(scene.GetAll().OfType<IPortalCommon>(), scene.GetAll().OfType<IPortal>(), 1, null); Assert.IsTrue(p.GetTransform().Position == new Vector2(19, 10)); Assert.IsTrue(p.GetVelocity().Position == new Vector2(8, 0)); }
public void SetTransformTest1() { Scene scene = new Scene(); Vector2[] vertices = new Vector2[] { new Vector2(-1, -1), new Vector2(1, -1), new Vector2(1, 1), }; Actor actor = new Actor(scene, vertices); Transform2 t = new Transform2(new Vector2(1, 2), 2, 4.23f, true); actor.SetTransform(t); List<Vector2> fixture = new List<Vector2>(Vector2Ext.Transform(vertices, Matrix4.CreateScale(new Vector3(t.Scale)))); fixture = PolygonExt.SetNormals(fixture); PolygonShape polygon = (PolygonShape)actor.Body.FixtureList[0].Shape; for (int i = 0; i < fixture.Count; i++) { Assert.AreEqual(fixture[i].X, polygon.Vertices[i].X, EQUALITY_EPSILON); Assert.AreEqual(fixture[i].Y, polygon.Vertices[i].Y, EQUALITY_EPSILON); } }
public void SetTransformTest0() { Scene scene = new Scene(); Vector2[] vertices = new Vector2[] { new Vector2(-1, -1), new Vector2(1, -1), new Vector2(1, 1), }; Actor actor = new Actor(scene, vertices); Transform2 t = new Transform2(new Vector2(1, 2), 2, 4.23f, true); actor.SetTransform(t); Assert.IsTrue(actor.GetTransform() == t); }
public void GetWorldVerticesTest0() { Vector2[] vertices = new Vector2[] { new Vector2(0, 0), new Vector2(1, 0), new Vector2(0, 1) }; vertices = PolygonExt.SetNormals(vertices); Scene scene = new Scene(); Actor actor = new Actor(scene, vertices); PortalCommon.UpdateWorldTransform(scene); actor.SetTransform(new Transform2(new Vector2(), 1, 0, false)); Assert.IsTrue(PolygonExt.IsInterior(actor.GetWorldVertices())); actor.SetTransform(new Transform2(new Vector2(), 1, 0, true)); Assert.IsTrue(PolygonExt.IsInterior(actor.GetWorldVertices())); actor.SetTransform(new Transform2(new Vector2(), -1, 0, false)); Assert.IsTrue(PolygonExt.IsInterior(actor.GetWorldVertices())); actor.SetTransform(new Transform2(new Vector2(), -1, 0, true)); Assert.IsTrue(PolygonExt.IsInterior(actor.GetWorldVertices())); }
public void GetFixtureContourTest4() { Actor actor = new Actor(new Scene(), GetVertices()); actor.SetTransform(new Transform2(new Vector2(), -2.2f, 0, true)); GetFixtureContourAssert(actor); }
public void GetCentroidTest4() { Scene scene = new Scene(); scene.Gravity = new Vector2(); Actor actor = new Actor(scene, PolygonFactory.CreateRectangle(0.5f, 3f)); Vector2 offset = new Vector2(2, 5); actor.SetTransform(new Transform2(offset)); FloatPortal enter = new FloatPortal(scene); FloatPortal exit = new FloatPortal(scene); Portal.SetLinked(enter, exit); enter.SetTransform(new Transform2(new Vector2(0, 1) + offset, 1, (float)(Math.PI / 2), true)); exit.SetTransform(new Transform2(new Vector2(5, 0) + offset, 2)); scene.Step(); Vector2 centroid = actor.GetCentroid(); Assert.IsTrue((centroid - new Vector2(0, 1.6959f) - offset).Length < 0.001f); }