/// <summary> /// Create a simple Sphere object /// </summary> /// <param name="pos"></param> /// <param name="ori"></param> /// <returns></returns> private IObject SpawnPrimitive(Vector3 pos, Matrix ori) { ///Load a Model with a custom texture sm2 = new SimpleModel(factory,"Model\\ball"); sm2.SetTexture(factory.CreateTexture2DColor(1,1,Color.White,false), TextureType.DIFFUSE); IMaterial m; if (forward) { ForwardXNABasicShader nd = new ForwardXNABasicShader(); m = new ForwardMaterial(nd); } else { DeferredNormalShader nd = new DeferredNormalShader(); m = new DeferredMaterial(nd); } PhysxPhysicWorld PhysxPhysicWorld = _mundo.PhysicWorld as PhysxPhysicWorld; ///First we create a shape description SphereShapeDescription SphereGeometry = new SphereShapeDescription(ballSize); ///then we create the physic object PhysxPhysicObject PhysxPhysicObject = new PhysxPhysicObject(SphereGeometry, 0.5f, Matrix.CreateTranslation(pos), Vector3.One * ballSize); IObject o = new IObject(m, sm2, PhysxPhysicObject); return o; }
/// <summary> /// Create a simple Sphere object /// </summary> /// <param name="pos"></param> /// <param name="ori"></param> /// <returns></returns> private IObject SpawnPrimitive(Vector3 pos, Matrix ori) { ///Load a Model with a custom texture sm2 = new SimpleModel(factory, "Model\\ball"); sm2.SetTexture(factory.CreateTexture2DColor(1, 1, Color.White, false), TextureType.DIFFUSE); IMaterial m; if (forward) { ForwardXNABasicShader nd = new ForwardXNABasicShader(); m = new ForwardMaterial(nd); } else { DeferredNormalShader nd = new DeferredNormalShader(); m = new DeferredMaterial(nd); } PhysxPhysicWorld PhysxPhysicWorld = _mundo.PhysicWorld as PhysxPhysicWorld; ///First we create a shape description SphereShapeDescription SphereGeometry = new SphereShapeDescription(ballSize); ///then we create the physic object PhysxPhysicObject PhysxPhysicObject = new PhysxPhysicObject(SphereGeometry, 0.5f, Matrix.CreateTranslation(pos), Vector3.One * ballSize); IObject o = new IObject(m, sm2, PhysxPhysicObject); return(o); }
public static SLAct createSphere(float x, float y, float z, float radius, float density, bool fix) { Vector3 pos = new Vector3(x, y, z); ActorDescription actorDesc = new ActorDescription(); BodyDescription bodyDesc = new BodyDescription(); actorDesc.SetToDefault(); bodyDesc.SetToDefault(); SphereShapeDescription capsuleDesc = new SphereShapeDescription() { Radius = radius, LocalPose = Matrix.Translation(new Vector3(0, 0, 0)), //Name = mName // LocalRotation = Matrix.CreateRotationZ(45) }; actorDesc.Shapes.Add(capsuleDesc); if (density > 0) { actorDesc.BodyDescription = bodyDesc; actorDesc.Density = density; } actorDesc.GlobalPose = Matrix.Translation(pos); SLAct act = new SLAct(actorDesc); act.no_gravity = fix; return(act); }
public static Actor CreateCog(StillDesign.PhysX.Scene scene) { var actorDesc = new ActorDescription(); float radius = 6f; float radius2 = 6.8f; for (int i = 0; i < 16; i++) { SphereShapeDescription desc = new SphereShapeDescription(0.6f); float angle = (i + 0.5f) * MathHelper.TwoPi * (1 / 16f); desc.LocalPosition = new Vector3(radius * (float)Math.Sin(angle), radius * (float)Math.Cos(angle), 0); actorDesc.Shapes.Add(desc); desc = new SphereShapeDescription(0.2f); desc.LocalPosition = new Vector3(radius2 * (float)Math.Sin(angle), radius2 * (float)Math.Cos(angle), 0); actorDesc.Shapes.Add(desc); } actorDesc.BodyDescription = new BodyDescription(); actorDesc.BodyDescription.Mass = 10; actorDesc.GlobalPose = Matrix.CreateRotationX(MathHelper.PiOver2); return(scene.CreateActor(actorDesc)); }
protected override void LoadContent(GraphicInfo GraphicInfo, GraphicFactory factory, IContentManager contentManager) { PhysxPhysicWorld PhysxPhysicWorld = World.PhysicWorld as PhysxPhysicWorld; base.LoadContent(GraphicInfo, factory, contentManager); { SimpleModel simpleModel = new SimpleModel(factory, "Model//cenario"); StillDesign.PhysX.Material material1 = PhysxPhysicWorld.CreatePhysicMaterial( new StillDesign.PhysX.MaterialDescription() { Restitution = 0.3f, DynamicFriction = 0.5f, StaticFriction = 1, } ); PhysxTriangleMesh tmesh = new PhysxTriangleMesh(PhysxPhysicWorld, simpleModel, Matrix.Identity, Vector3.One, 1, material1); ForwardXNABasicShader shader = new ForwardXNABasicShader(ForwardXNABasicShaderDescription.Default()); ForwardMaterial fmaterial = new ForwardMaterial(shader); IObject obj = new IObject(fmaterial, simpleModel, tmesh); this.World.AddObject(obj); } BallThrowPhysx28 BallThrowBullet = new BallThrowPhysx28(this.World, GraphicFactory); this.AttachCleanUpAble(BallThrowBullet); for (int i = 0; i < 10; i++) { StillDesign.PhysX.Material material2 = PhysxPhysicWorld.CreatePhysicMaterial( new StillDesign.PhysX.MaterialDescription() { Restitution = PloobsEngine.Utils.StaticRandom.RandomBetween(0, 1), DynamicFriction = PloobsEngine.Utils.StaticRandom.RandomBetween(0, 1), StaticFriction = PloobsEngine.Utils.StaticRandom.RandomBetween(0, 1), RestitutionCombineMode = CombineMode.Max, } ); ///Load a Model with a custom texture SimpleModel sm2 = new SimpleModel(factory, "Model\\ball"); sm2.SetTexture(factory.CreateTexture2DColor(1, 1, Color.Green, false), TextureType.DIFFUSE); ForwardXNABasicShader nd = new ForwardXNABasicShader(); IMaterial m = new ForwardMaterial(nd); SphereShapeDescription SphereGeometry = new SphereShapeDescription(5f); SphereGeometry.Material = material2; PhysxPhysicObject PhysxPhysicObject = new PhysxPhysicObject(SphereGeometry, 0.5f, Matrix.CreateTranslation(new Vector3(100, 100, 50 * i)), Vector3.One * 5f); IObject o = new IObject(m, sm2, PhysxPhysicObject); this.World.AddObject(o); } this.World.CameraManager.AddCamera(new CameraFirstPerson(GraphicInfo)); }
public void TestSyncOnlineClient() { var conn = NetworkingUtilities.ConnectTCP(10045, "5.149.17.16"); //var conn = NetworkingClientTest.ConnectTCP(10045, "127.0.0.1"); conn.Receiving = true; var client = new ClientPacketManagerNetworked(conn); var clientSyncer = new ClientSyncer(client); var physicsEngine = new PhysicsEngine(); StillDesign.PhysX.Scene serverScene = null; PhysicsDebugRendererXNA debugRenderer; PhysicsDebugRendererXNA debugRendererServer; var game = new XNAGame(); game.InitializeEvent += delegate { physicsEngine.Initialize(); serverScene = physicsEngine.CreateScene(physicsEngine.Scene.Gravity, true); debugRenderer = new PhysicsDebugRendererXNA(game, physicsEngine.Scene); game.AddXNAObject(debugRenderer); debugRendererServer = new PhysicsDebugRendererXNA(game, serverScene); game.AddXNAObject(debugRendererServer); ActorDescription actorDesc; SphereShapeDescription shape; shape = new SphereShapeDescription(1); actorDesc = new ActorDescription(shape); actorDesc.BodyDescription = new BodyDescription(10); var client1 = clientSyncer.CreateActor(physicsEngine.Scene.CreateActor(actorDesc)); client1.ID = 2; // Identify }; game.UpdateEvent += delegate { physicsEngine.Update(game); physicsEngine.UpdateScene(game.Elapsed, serverScene); clientSyncer.Update(game.Elapsed); }; client.SyncronizeRemotePacketIDs(); client.WaitForUDPConnected(); game.Run(); physicsEngine.Dispose(); }
protected override void LoadContent(GraphicInfo GraphicInfo, GraphicFactory factory ,IContentManager contentManager) { PhysxPhysicWorld PhysxPhysicWorld = World.PhysicWorld as PhysxPhysicWorld; base.LoadContent(GraphicInfo, factory, contentManager); { SimpleModel simpleModel = new SimpleModel(factory, "Model//cenario"); StillDesign.PhysX.Material material1 = PhysxPhysicWorld.CreatePhysicMaterial( new StillDesign.PhysX.MaterialDescription() { Restitution = 0.3f, DynamicFriction = 0.5f, StaticFriction = 1, } ); PhysxTriangleMesh tmesh = new PhysxTriangleMesh(PhysxPhysicWorld, simpleModel, Matrix.Identity, Vector3.One, 1, material1); ForwardXNABasicShader shader = new ForwardXNABasicShader(ForwardXNABasicShaderDescription.Default()); ForwardMaterial fmaterial = new ForwardMaterial(shader); IObject obj = new IObject(fmaterial, simpleModel, tmesh); this.World.AddObject(obj); } BallThrowPhysx28 BallThrowBullet = new BallThrowPhysx28(this.World, GraphicFactory); this.AttachCleanUpAble(BallThrowBullet); for (int i = 0; i < 10; i++) { StillDesign.PhysX.Material material2 = PhysxPhysicWorld.CreatePhysicMaterial( new StillDesign.PhysX.MaterialDescription() { Restitution = PloobsEngine.Utils.StaticRandom.RandomBetween(0,1), DynamicFriction = PloobsEngine.Utils.StaticRandom.RandomBetween(0, 1), StaticFriction = PloobsEngine.Utils.StaticRandom.RandomBetween(0, 1), RestitutionCombineMode = CombineMode.Max, } ); ///Load a Model with a custom texture SimpleModel sm2 = new SimpleModel(factory, "Model\\ball"); sm2.SetTexture(factory.CreateTexture2DColor(1, 1, Color.Green, false), TextureType.DIFFUSE); ForwardXNABasicShader nd = new ForwardXNABasicShader(); IMaterial m = new ForwardMaterial(nd); SphereShapeDescription SphereGeometry = new SphereShapeDescription(5f); SphereGeometry.Material = material2; PhysxPhysicObject PhysxPhysicObject = new PhysxPhysicObject(SphereGeometry, 0.5f, Matrix.CreateTranslation(new Vector3(100,100,50 * i)), Vector3.One * 5f); IObject o = new IObject(m, sm2, PhysxPhysicObject); this.World.AddObject(o); } this.World.CameraManager.AddCamera(new CameraFirstPerson(GraphicInfo)); }
public static void AddCogToothShapes(ActorDescription actorDesc, Vector3 pos, Vector3 normal, Vector3 tangent) { SphereShapeDescription desc = new SphereShapeDescription(0.6f); desc.LocalPosition = pos; actorDesc.Shapes.Add(desc); desc = new SphereShapeDescription(0.2f); desc.LocalPosition = pos + 0.6f * normal; actorDesc.Shapes.Add(desc); }
public SphereShape(RigidBody rigidBody, Matrix4x4 realParentPose, Material material, SphereShapeDescriptor descriptor) { var sphereShapeDescription = new SphereShapeDescription(descriptor.Radius) {Material = material._wrappedMaterial}; _wrappedSphereShape = (StillDesign.PhysX.SphereShape)rigidBody.WrappedActor.CreateShape(sphereShapeDescription); SetRealParentPose(realParentPose); UserData = descriptor.UserData; if (rigidBody.HasDefaultShape) { rigidBody.WrappedActor.Shapes[0].Dispose(); rigidBody.HasDefaultShape = false; } }
protected override void LoadContent(GraphicInfo GraphicInfo, GraphicFactory factory, IContentManager contentManager) { PhysxPhysicWorld PhysxPhysicWorld = World.PhysicWorld as PhysxPhysicWorld; base.LoadContent(GraphicInfo, factory, contentManager); { SimpleModel simpleModel = new SimpleModel(factory, "Model//cenario"); PhysxTriangleMesh tmesh = new PhysxTriangleMesh(PhysxPhysicWorld, simpleModel, Matrix.Identity, Vector3.One); ForwardXNABasicShader shader = new ForwardXNABasicShader(ForwardXNABasicShaderDescription.Default()); ForwardMaterial fmaterial = new ForwardMaterial(shader); IObject obj = new IObject(fmaterial, simpleModel, tmesh); this.World.AddObject(obj); } { ///Load a Model with a custom texture SimpleModel sm2 = new SimpleModel(factory, "Model\\ball"); sm2.SetTexture(factory.CreateTexture2DColor(1, 1, Color.Aquamarine, false), TextureType.DIFFUSE); ForwardXNABasicShader nd = new ForwardXNABasicShader(); IMaterial m = new ForwardMaterial(nd); SphereShapeDescription SphereGeometry = new SphereShapeDescription(15f); PhysxGhostObject PhysxPhysicObject = new PhysxGhostObject(new Vector3(100, 100, 100), Matrix.Identity, Vector3.One * 15f); IObject o = new IObject(m, sm2, PhysxPhysicObject); this.World.AddObject(o); ///Physx Trigger !!! ///Just need to pass a shape to it ///WORKS THE SAME AS BEPU TRIGGER ///LOOK AT INTRODUCTION DEMOS PhysxTrigger PhysxTrigger = new PloobsEngine.Physics.PhysxTrigger( SphereGeometry, Matrix.CreateTranslation(new Vector3(100, 100, 100)), new PloobsEngine.Trigger.TriggerEvent("TriggerEvent", "TriggerEvent"), null, true, true, true); World.AddTrigger(PhysxTrigger); } BallThrowPhysx28 BallThrowBullet = new BallThrowPhysx28(this.World, GraphicFactory); this.AttachCleanUpAble(BallThrowBullet); this.World.CameraManager.AddCamera(new CameraFirstPerson(GraphicInfo)); ReciveMessage = new ReciveMessage(); }
public void InitDynamic() { if (actor != null) { return; } SphereShapeDescription shapeDescription = new SphereShapeDescription(Radius); ActorDescription actorDescription = new ActorDescription(shapeDescription); actorDescription.BodyDescription = new BodyDescription(2f); actorDescription.GlobalPose = Matrix.CreateTranslation(Center); actor = scene.CreateActor(actorDescription); }
public void RequiredMassSpaceInertia() { var shapeDescription = new SphereShapeDescription( 5 ); shapeDescription.Flags |= ( ShapeFlag.TriggerOnEnter | ShapeFlag.TriggerOnLeave ); var actorDesc = new ActorDescription() { BodyDescription = new BodyDescription( 1 ) { MassSpaceInertia = new Vector3( 1, 1, 1 ), BodyFlags = BodyFlag.Kinematic }, Shapes = { shapeDescription } }; Assert.IsTrue( actorDesc.IsValid() ); }
public SphereShape(RigidBody rigidBody, Matrix4x4 realParentPose, Material material, SphereShapeDescriptor descriptor) { var sphereShapeDescription = new SphereShapeDescription(descriptor.Radius) { Material = material._wrappedMaterial }; _wrappedSphereShape = (StillDesign.PhysX.SphereShape)rigidBody.WrappedActor.CreateShape(sphereShapeDescription); SetRealParentPose(realParentPose); UserData = descriptor.UserData; if (rigidBody.HasDefaultShape) { rigidBody.WrappedActor.Shapes[0].Dispose(); rigidBody.HasDefaultShape = false; } }
public void RequiredMassSpaceInertia() { var shapeDescription = new SphereShapeDescription(5); shapeDescription.Flags |= (ShapeFlag.TriggerOnEnter | ShapeFlag.TriggerOnLeave); var actorDesc = new ActorDescription() { BodyDescription = new BodyDescription(1) { MassSpaceInertia = new Vector3(1, 1, 1), BodyFlags = BodyFlag.Kinematic }, Shapes = { shapeDescription } }; Assert.IsTrue(actorDesc.IsValid()); }
public static Actor CreateSphere(Vector3 pos, float radius, float density) { // Add a single-shape actor to the scene var actorDesc = new ActorDescription(); var bodyDesc = new BodyDescription(); // The actor has one shape, a sphere var sphereDesc = new SphereShapeDescription(radius); //{ // LocalPose = Matrix.CreateTranslation(new Vector3(0, radius, 0)) //}; actorDesc.Shapes.Add(sphereDesc); if (density > 0) { actorDesc.BodyDescription = bodyDesc; actorDesc.Density = density; } actorDesc.GlobalPose = Matrix.CreateTranslation(pos); return(PhysX.Instance.Scene.CreateActor(actorDesc)); }
public static NonCar GenerateNonCar(CActor actor, List <NoncarFile> nonCars) { if (actor.Model == null) { return(null); } if (actor.Name.StartsWith("&")) { int index = int.Parse(actor.Name.Substring(1, 2)); NoncarFile nonCarFile = nonCars.Find(a => a.IndexNumber == index); if (nonCarFile == null) { Debug.WriteLine("No noncar matching " + actor.Name); return(null); } ActorDescription actorDesc = new ActorDescription(); actorDesc.BodyDescription = new BodyDescription() { Mass = nonCarFile.Mass }; BoxShapeDescription boxDesc = new BoxShapeDescription(); boxDesc.Size = nonCarFile.BoundingBox.GetSize(); boxDesc.LocalPosition = nonCarFile.BoundingBox.GetCenter(); actorDesc.Shapes.Add(boxDesc); foreach (Vector3 extraPoint in nonCarFile.ExtraBoundingBoxPoints) { SphereShapeDescription extra = new SphereShapeDescription(0.2f); extra.LocalPosition = extraPoint; extra.Mass = 0; actorDesc.Shapes.Add(extra); } Vector3 scaleout, transout; Quaternion b; bool success = actor.Matrix.Decompose(out scaleout, out b, out transout); //if (!success) throw new Exception(); Matrix m = Matrix.CreateFromQuaternion(b) * Matrix.CreateTranslation(transout); StillDesign.PhysX.Actor instance = PhysX.Instance.Scene.CreateActor(actorDesc); instance.GlobalPose = m; instance.SetCenterOfMassOffsetLocalPosition(nonCarFile.CenterOfMass); instance.Group = PhysXConsts.NonCarId; //foreach (Shape s in instance.Shapes) // s.SetFlag(ShapeFlag.Visualization, false); NonCar noncar = new NonCar { Config = nonCarFile, CActor = actor }; instance.UserData = noncar; actor.AttachToPhysX(instance); if (nonCarFile.BendAngleBeforeSnapping > 0) { noncar.AttachToGround(); } instance.Sleep(); return(noncar); } else { return(null); } }
public void TestSyncOnlineServer() { var server = new ServerPacketManagerNetworked(10045, 10046); var serverSyncer = new ServerSyncer(server); server.Start(); var physicsEngine = new PhysicsEngine(); StillDesign.PhysX.Scene serverScene = null; PhysicsDebugRendererXNA debugRenderer; PhysicsDebugRendererXNA debugRendererServer; var game = new XNAGame(); ServerSyncedActor server1 = null; game.InitializeEvent += delegate { physicsEngine.Initialize(); serverScene = physicsEngine.CreateScene(physicsEngine.Scene.Gravity, true); debugRenderer = new PhysicsDebugRendererXNA(game, physicsEngine.Scene); game.AddXNAObject(debugRenderer); debugRendererServer = new PhysicsDebugRendererXNA(game, serverScene); game.AddXNAObject(debugRendererServer); ActorDescription actorDesc; SphereShapeDescription shape; shape = new SphereShapeDescription(1); actorDesc = new ActorDescription(shape); actorDesc.BodyDescription = new BodyDescription(10); server1 = serverSyncer.CreateActor(serverScene.CreateActor(actorDesc)); ((WorldPhysxSyncActor)server1.Actor).Actor.AddForce(Vector3.UnitX * 200, ForceMode.Impulse); server1.ID = 2; // Identify }; game.UpdateEvent += delegate { physicsEngine.Update(game); physicsEngine.UpdateScene(game.Elapsed, serverScene); serverSyncer.Update(game.Elapsed); if (game.Keyboard.IsKeyDown(Keys.Up)) { ((WorldPhysxSyncActor)server1.Actor).Actor.AddForce(Vector3.UnitX * 200, ForceMode.Force); } if (game.Keyboard.IsKeyDown(Keys.Down)) { ((WorldPhysxSyncActor)server1.Actor).Actor.AddForce(-Vector3.UnitX * 200, ForceMode.Force); } }; game.Run(); physicsEngine.Dispose(); }
public void TestSyncDirect() { var client = new ClientSyncedActor(); var server = new ServerSyncedActor(); var physicsEngine = new PhysicsEngine(); StillDesign.PhysX.Scene serverScene = null; PhysicsDebugRendererXNA debugRenderer; PhysicsDebugRendererXNA debugRendererServer; var game = new XNAGame(); float totalTime = 0; float timeSinceTick = 0; float tickRate = 1 / 30f; int tickNumber = 0; float packetLoss = 0.25f; var rand = new Random(); game.InitializeEvent += delegate { physicsEngine.Initialize(); serverScene = physicsEngine.CreateScene(physicsEngine.Scene.Gravity, true); debugRenderer = new PhysicsDebugRendererXNA(game, physicsEngine.Scene); game.AddXNAObject(debugRenderer); debugRendererServer = new PhysicsDebugRendererXNA(game, serverScene); game.AddXNAObject(debugRendererServer); ActorDescription actorDesc; SphereShapeDescription shape; shape = new SphereShapeDescription(1); actorDesc = new ActorDescription(shape); actorDesc.BodyDescription = new BodyDescription(10); server.Actor = new WorldPhysxSyncActor(serverScene.CreateActor(actorDesc)); ((WorldPhysxSyncActor)server.Actor).Actor.AddForce(Vector3.UnitX * 200, ForceMode.Impulse); shape = new SphereShapeDescription(1); actorDesc = new ActorDescription(shape); actorDesc.BodyDescription = new BodyDescription(10); client.Actor = new WorldPhysxSyncActor(physicsEngine.Scene.CreateActor(actorDesc)); }; game.UpdateEvent += delegate { physicsEngine.Update(game); physicsEngine.UpdateScene(game.Elapsed, serverScene); totalTime += game.Elapsed; timeSinceTick += game.Elapsed; int totalMiliseconds = (int)(totalTime * 1000); while (timeSinceTick > tickRate) { timeSinceTick -= tickRate; //Do a tick tickNumber++; server.Tick(); var p = new UpdateEntityPacket(); p.Positie = server.Positie; p.RotatieQuat = server.RotatieQuat; if (rand.NextDouble() < 1 - packetLoss) { client.AddEntityUpdate(tickNumber, p); } } client.Process(totalMiliseconds, tickRate); }; game.Run(); physicsEngine.Dispose(); }
public void TestSyncOnline() { var server = new ServerPacketManagerNetworked(10045, 10046); var success = new AutoResetEvent(false); var serverSyncer = new ServerSyncer(server); server.Start(); var conn = NetworkingUtilities.ConnectTCP(10045, "127.0.0.1"); conn.Receiving = true; var client = new ClientPacketManagerNetworked(conn); var clientSyncer = new ClientSyncer(client); var physicsEngine = new PhysicsEngine(); StillDesign.PhysX.Scene serverScene = null; PhysicsDebugRendererXNA debugRenderer; PhysicsDebugRendererXNA debugRendererServer; var game = new XNAGame(); game.InitializeEvent += delegate { physicsEngine.Initialize(); serverScene = physicsEngine.CreateScene(physicsEngine.Scene.Gravity, true); debugRenderer = new PhysicsDebugRendererXNA(game, physicsEngine.Scene); game.AddXNAObject(debugRenderer); debugRendererServer = new PhysicsDebugRendererXNA(game, serverScene); game.AddXNAObject(debugRendererServer); ActorDescription actorDesc; SphereShapeDescription shape; shape = new SphereShapeDescription(1); actorDesc = new ActorDescription(shape); actorDesc.BodyDescription = new BodyDescription(10); var server1 = serverSyncer.CreateActor(serverScene.CreateActor(actorDesc)); ((WorldPhysxSyncActor)server1.Actor).Actor.AddForce(Vector3.UnitX * 200, ForceMode.Impulse); shape = new SphereShapeDescription(1); actorDesc = new ActorDescription(shape); actorDesc.BodyDescription = new BodyDescription(10); var client1 = clientSyncer.CreateActor(physicsEngine.Scene.CreateActor(actorDesc)); client1.ID = server1.ID; // Identify }; game.UpdateEvent += delegate { physicsEngine.Update(game); physicsEngine.UpdateScene(game.Elapsed, serverScene); serverSyncer.Update(game.Elapsed); clientSyncer.Update(game.Elapsed); }; client.SyncronizeRemotePacketIDs(); client.WaitForUDPConnected(); game.Run(); physicsEngine.Dispose(); }
public void TestSyncOffline() { var serverpm = new SimpleServerPacketManager(); var clientpm = serverpm.CreateClient(); var clientSyncer = new ClientSyncer(clientpm); var serverSyncer = new ServerSyncer(serverpm); var physicsEngine = new PhysicsEngine(); StillDesign.PhysX.Scene serverScene = null; PhysicsDebugRendererXNA debugRenderer; PhysicsDebugRendererXNA debugRendererServer; var game = new XNAGame(); float totalTime = 0; float timeSinceTick = 0; float tickRate = 1 / 30f; int tickNumber = 0; float packetLoss = 0.25f; var rand = new Random(); game.InitializeEvent += delegate { physicsEngine.Initialize(); serverScene = physicsEngine.CreateScene(physicsEngine.Scene.Gravity, true); debugRenderer = new PhysicsDebugRendererXNA(game, physicsEngine.Scene); game.AddXNAObject(debugRenderer); debugRendererServer = new PhysicsDebugRendererXNA(game, serverScene); game.AddXNAObject(debugRendererServer); ActorDescription actorDesc; SphereShapeDescription shape; shape = new SphereShapeDescription(1); actorDesc = new ActorDescription(shape); actorDesc.BodyDescription = new BodyDescription(10); var server = serverSyncer.CreateActor(serverScene.CreateActor(actorDesc)); ((WorldPhysxSyncActor)server.Actor).Actor.AddForce(Vector3.UnitX * 200, ForceMode.Impulse); shape = new SphereShapeDescription(1); actorDesc = new ActorDescription(shape); actorDesc.BodyDescription = new BodyDescription(10); var client = clientSyncer.CreateActor(physicsEngine.Scene.CreateActor(actorDesc)); client.ID = server.ID; // Identify }; game.UpdateEvent += delegate { physicsEngine.Update(game); physicsEngine.UpdateScene(game.Elapsed, serverScene); serverSyncer.Update(game.Elapsed); clientSyncer.Update(game.Elapsed); }; game.Run(); physicsEngine.Dispose(); }
protected override void LoadContent(GraphicInfo GraphicInfo, GraphicFactory factory ,IContentManager contentManager) { PhysxPhysicWorld PhysxPhysicWorld = World.PhysicWorld as PhysxPhysicWorld; base.LoadContent(GraphicInfo, factory, contentManager); { SimpleModel simpleModel = new SimpleModel(factory, "Model//cenario"); PhysxTriangleMesh tmesh = new PhysxTriangleMesh(PhysxPhysicWorld,simpleModel, Matrix.Identity, Vector3.One); ForwardXNABasicShader shader = new ForwardXNABasicShader(ForwardXNABasicShaderDescription.Default()); ForwardMaterial fmaterial = new ForwardMaterial(shader); IObject obj = new IObject(fmaterial, simpleModel, tmesh); this.World.AddObject(obj); } { ///Load a Model with a custom texture SimpleModel sm2 = new SimpleModel(factory, "Model\\ball"); sm2.SetTexture(factory.CreateTexture2DColor(1, 1, Color.Aquamarine, false), TextureType.DIFFUSE); ForwardXNABasicShader nd = new ForwardXNABasicShader(); IMaterial m =new ForwardMaterial(nd); SphereShapeDescription SphereGeometry = new SphereShapeDescription(5f); PhysxGhostObject PhysxPhysicObject = new PhysxGhostObject(new Vector3(100,100,100),Matrix.Identity, Vector3.One * 5f); IObject o = new IObject(m, sm2, PhysxPhysicObject); this.World.AddObject(o); PhysxTrigger PhysxTrigger = new PloobsEngine.Physics.PhysxTrigger( SphereGeometry, Matrix.CreateTranslation(new Vector3(100, 100, 100)), new PloobsEngine.Trigger.TriggerEvent("TriggerEvent", "TriggerEvent"), null, true); World.AddTrigger(PhysxTrigger); } BallThrowPhysx28 BallThrowBullet = new BallThrowPhysx28(this.World, GraphicFactory); this.AttachCleanUpAble(BallThrowBullet); this.World.CameraManager.AddCamera(new CameraFirstPerson(GraphicInfo)); ReciveMessage ReciveMessage = new ReciveMessage(); }
public VehicleChassis(Vehicle vehicle) { Vehicle = vehicle; Wheels = new List<VehicleWheel>(); VehicleFile carFile = vehicle.Config; ActorDescription actorDesc = new ActorDescription(); actorDesc.BodyDescription = new BodyDescription(); actorDesc.BodyDescription.Mass = carFile.Mass; var boxDesc = new BoxShapeDescription(); boxDesc.Size = carFile.BoundingBox.GetSize(); boxDesc.LocalPosition = carFile.BoundingBox.GetCenter(); boxDesc.Name = PhysXConsts.VehicleBody; boxDesc.Flags |= ShapeFlag.PointContactForce; actorDesc.Shapes.Add(boxDesc); foreach (Vector3 extraPoint in carFile.ExtraBoundingBoxPoints) { var extraDesc = new SphereShapeDescription(0.2f); extraDesc.LocalPosition = extraPoint; extraDesc.Mass = 0; actorDesc.Shapes.Add(extraDesc); } using (UtilitiesLibrary lib = new UtilitiesLibrary()) { Vector3 size = carFile.Size; Vector3 inertiaTensor = lib.ComputeBoxInteriaTensor(Vector3.Zero, carFile.Mass, size); //actorDesc.BodyDescription.MassSpaceInertia = inertiaTensor; } TireFunctionDescription lngTFD = new TireFunctionDescription(); lngTFD.ExtremumSlip = 0.1f; lngTFD.ExtremumValue = 4f; lngTFD.AsymptoteSlip = 2.0f; lngTFD.AsymptoteValue = 3.2f; _rearLateralTireFn = new TireFunctionDescription(); _rearLateralTireFn.ExtremumSlip = 0.2f; _rearLateralTireFn.ExtremumValue = 2.1f; _rearLateralTireFn.AsymptoteSlip = 0.0013f * carFile.Mass; _rearLateralTireFn.AsymptoteValue = 0.02f; _frontLateralTireFn = _rearLateralTireFn; _frontLateralTireFn.ExtremumValue = 1.9f; MaterialDescription md = new MaterialDescription(); md.Flags = MaterialFlag.DisableFriction; Material m = PhysX.Instance.Scene.CreateMaterial(md); int wheelIndex = 0; foreach (CWheelActor wheel in carFile.WheelActors) { WheelShapeDescription wheelDesc = new WheelShapeDescription(); wheelDesc.InverseWheelMass = 0.08f; wheelDesc.LongitudalTireForceFunction = lngTFD; wheelDesc.Flags = WheelShapeFlag.ClampedFriction; wheelDesc.Material = m; wheelDesc.Radius = wheel.IsDriven ? carFile.DrivenWheelRadius : carFile.NonDrivenWheelRadius; wheelDesc.SuspensionTravel = (wheel.IsFront ? carFile.SuspensionGiveFront : carFile.SuspensionGiveRear) * 18; float heightModifier = (wheelDesc.SuspensionTravel + wheelDesc.Radius) / wheelDesc.SuspensionTravel; SpringDescription spring = new SpringDescription(); if (carFile.Mass > 3000) spring.SpringCoefficient = 10.5f * heightModifier * carFile.Mass; else spring.SpringCoefficient = 6.5f * heightModifier * Math.Min(1000, carFile.Mass); spring.DamperCoefficient = carFile.SuspensionDamping * 6f; wheelDesc.Suspension = spring; wheelDesc.LocalPosition = wheel.Position; wheelDesc.Name = (wheelIndex).ToString(); wheelIndex++; wheelDesc.LateralTireForceFunction = wheel.IsFront ? _frontLateralTireFn : _rearLateralTireFn; actorDesc.Shapes.Add(wheelDesc); } _physXActor = PhysX.Instance.Scene.CreateActor(actorDesc); _heightOffset = _physXActor.Shapes[0].LocalPosition.Y * -2; if (_heightOffset < 0) _heightOffset = 0; foreach (Shape shape in _physXActor.Shapes) { shape.LocalPosition += new Vector3(0, _heightOffset, 0); if (shape is WheelShape) { wheelIndex = int.Parse(shape.Name); Wheels.Add(new VehicleWheel(this, carFile.WheelActors[wheelIndex], (WheelShape)shape, carFile.WheelActors[wheelIndex].IsLeft ? 0.17f : -0.17f) { Index = wheelIndex }); } } _physXActor.Group = PhysXConsts.VehicleId; _physXActor.UserData = vehicle; _physXActor.WakeUp(60.0f); //_physXActor.RaiseBodyFlag(BodyFlag.DisableGravity); //set center of mass Vector3 massPos = carFile.CenterOfMass; massPos.Y = carFile.WheelActors[0].Position.Y - carFile.NonDrivenWheelRadius + _heightOffset + 0.35f; _massPos = massPos; _physXActor.SetCenterOfMassOffsetLocalPosition(massPos); //a real power curve doesnt work too well :) List<float> power = new List<float>(new float[] { 0.5f, 0.5f, 0.5f, 1f, 1f, 1.0f, 1.0f, 0 }); List<float> ratios = new List<float>(new float[] { 3.227f, 2.360f, 1.685f, 1.312f, 1.000f, 0.793f }); BaseGearbox gearbox = BaseGearbox.Create(false, ratios, 0.4f); Motor = new Motor(power, carFile.EnginePower, 6f, carFile.TopSpeed, gearbox); Motor.Gearbox.CurrentGear = 0; }
public static NonCar GenerateNonCar(CActor actor, List<NoncarFile> nonCars) { if (actor.Model == null) return null; if (actor.Name.StartsWith("&")) { int index = int.Parse(actor.Name.Substring(1, 2)); NoncarFile nonCarFile = nonCars.Find(a => a.IndexNumber == index); if (nonCarFile == null) { Debug.WriteLine("No noncar matching " + actor.Name); return null; } ActorDescription actorDesc = new ActorDescription(); actorDesc.BodyDescription = new BodyDescription() { Mass = nonCarFile.Mass }; BoxShapeDescription boxDesc = new BoxShapeDescription(); boxDesc.Size = nonCarFile.BoundingBox.GetSize(); boxDesc.LocalPosition = nonCarFile.BoundingBox.GetCenter(); actorDesc.Shapes.Add(boxDesc); foreach (Vector3 extraPoint in nonCarFile.ExtraBoundingBoxPoints) { SphereShapeDescription extra = new SphereShapeDescription(0.2f); extra.LocalPosition = extraPoint; extra.Mass = 0; actorDesc.Shapes.Add(extra); } Vector3 scaleout, transout; Quaternion b; bool success = actor.Matrix.Decompose(out scaleout, out b, out transout); //if (!success) throw new Exception(); Matrix m = Matrix.CreateFromQuaternion(b) * Matrix.CreateTranslation(transout); StillDesign.PhysX.Actor instance = PhysX.Instance.Scene.CreateActor(actorDesc); instance.GlobalPose = m; instance.SetCenterOfMassOffsetLocalPosition(nonCarFile.CenterOfMass); instance.Group = PhysXConsts.NonCarId; //foreach (Shape s in instance.Shapes) // s.SetFlag(ShapeFlag.Visualization, false); NonCar noncar = new NonCar { Config = nonCarFile, CActor = actor }; instance.UserData = noncar; actor.AttachToPhysX(instance); if (nonCarFile.BendAngleBeforeSnapping > 0) { noncar.AttachToGround(); } instance.Sleep(); return noncar; } else { return null; } }
public VehicleChassis(Vehicle vehicle) { Vehicle = vehicle; Wheels = new List <VehicleWheel>(); VehicleFile carFile = vehicle.Config; ActorDescription actorDesc = new ActorDescription(); actorDesc.BodyDescription = new BodyDescription(); actorDesc.BodyDescription.Mass = carFile.Mass; var boxDesc = new BoxShapeDescription(); boxDesc.Size = carFile.BoundingBox.GetSize(); boxDesc.LocalPosition = carFile.BoundingBox.GetCenter(); boxDesc.Name = PhysXConsts.VehicleBody; boxDesc.Flags |= ShapeFlag.PointContactForce; actorDesc.Shapes.Add(boxDesc); foreach (Vector3 extraPoint in carFile.ExtraBoundingBoxPoints) { var extraDesc = new SphereShapeDescription(0.2f); extraDesc.LocalPosition = extraPoint; extraDesc.Mass = 0; actorDesc.Shapes.Add(extraDesc); } using (UtilitiesLibrary lib = new UtilitiesLibrary()) { Vector3 size = carFile.Size; Vector3 inertiaTensor = lib.ComputeBoxInteriaTensor(Vector3.Zero, carFile.Mass, size); //actorDesc.BodyDescription.MassSpaceInertia = inertiaTensor; } TireFunctionDescription lngTFD = new TireFunctionDescription(); lngTFD.ExtremumSlip = 0.1f; lngTFD.ExtremumValue = 4f; lngTFD.AsymptoteSlip = 2.0f; lngTFD.AsymptoteValue = 3.2f; _rearLateralTireFn = new TireFunctionDescription(); _rearLateralTireFn.ExtremumSlip = 0.2f; _rearLateralTireFn.ExtremumValue = 2.1f; _rearLateralTireFn.AsymptoteSlip = 0.0013f * carFile.Mass; _rearLateralTireFn.AsymptoteValue = 0.02f; _frontLateralTireFn = _rearLateralTireFn; _frontLateralTireFn.ExtremumValue = 1.9f; MaterialDescription md = new MaterialDescription(); md.Flags = MaterialFlag.DisableFriction; Material m = PhysX.Instance.Scene.CreateMaterial(md); int wheelIndex = 0; foreach (CWheelActor wheel in carFile.WheelActors) { WheelShapeDescription wheelDesc = new WheelShapeDescription(); wheelDesc.InverseWheelMass = 0.08f; wheelDesc.LongitudalTireForceFunction = lngTFD; wheelDesc.Flags = WheelShapeFlag.ClampedFriction; wheelDesc.Material = m; wheelDesc.Radius = wheel.IsDriven ? carFile.DrivenWheelRadius : carFile.NonDrivenWheelRadius; wheelDesc.SuspensionTravel = (wheel.IsFront ? carFile.SuspensionGiveFront : carFile.SuspensionGiveRear) * 18; float heightModifier = (wheelDesc.SuspensionTravel + wheelDesc.Radius) / wheelDesc.SuspensionTravel; SpringDescription spring = new SpringDescription(); if (carFile.Mass > 3000) { spring.SpringCoefficient = 10.5f * heightModifier * carFile.Mass; } else { spring.SpringCoefficient = 6.5f * heightModifier * Math.Min(1000, carFile.Mass); } spring.DamperCoefficient = carFile.SuspensionDamping * 6f; wheelDesc.Suspension = spring; wheelDesc.LocalPosition = wheel.Position; wheelDesc.Name = (wheelIndex).ToString(); wheelIndex++; wheelDesc.LateralTireForceFunction = wheel.IsFront ? _frontLateralTireFn : _rearLateralTireFn; actorDesc.Shapes.Add(wheelDesc); } _physXActor = PhysX.Instance.Scene.CreateActor(actorDesc); _heightOffset = _physXActor.Shapes[0].LocalPosition.Y * -2; if (_heightOffset < 0) { _heightOffset = 0; } foreach (Shape shape in _physXActor.Shapes) { shape.LocalPosition += new Vector3(0, _heightOffset, 0); if (shape is WheelShape) { wheelIndex = int.Parse(shape.Name); Wheels.Add(new VehicleWheel(this, carFile.WheelActors[wheelIndex], (WheelShape)shape, carFile.WheelActors[wheelIndex].IsLeft ? 0.17f : -0.17f) { Index = wheelIndex }); } } _physXActor.Group = PhysXConsts.VehicleId; _physXActor.UserData = vehicle; _physXActor.WakeUp(60.0f); //_physXActor.RaiseBodyFlag(BodyFlag.DisableGravity); //set center of mass Vector3 massPos = carFile.CenterOfMass; massPos.Y = carFile.WheelActors[0].Position.Y - carFile.NonDrivenWheelRadius + _heightOffset + 0.35f; _massPos = massPos; _physXActor.SetCenterOfMassOffsetLocalPosition(massPos); //a real power curve doesnt work too well :) List <float> power = new List <float>(new float[] { 0.5f, 0.5f, 0.5f, 1f, 1f, 1.0f, 1.0f, 0 }); List <float> ratios = new List <float>(new float[] { 3.227f, 2.360f, 1.685f, 1.312f, 1.000f, 0.793f }); BaseGearbox gearbox = BaseGearbox.Create(false, ratios, 0.4f); Motor = new Motor(power, carFile.EnginePower, 6f, carFile.TopSpeed, gearbox); Motor.Gearbox.CurrentGear = 0; }
protected override void LoadContent(GraphicInfo GraphicInfo, GraphicFactory factory, IContentManager contentManager) { PhysxPhysicWorld PhysxPhysicWorld = World.PhysicWorld as PhysxPhysicWorld; base.LoadContent(GraphicInfo, factory, contentManager); ///Cosntruct a grid of vertices to make a cloth int w = 50; int h = 50; float hw = w / 2.0f; float hh = h / 2.0f; Vector3 p = new Vector3(0, 70, 0); var grid = VertexGrid.CreateGrid(w, h); ///Cloth Model (Code inside the demo) ClothModel ClothModel = new PloobsEngine.Modelo.ClothModel(factory, PhysxPhysicWorld, new ClothMeshDescription(), grid.Points, grid.TextCoords, grid.Indices, "Textures//fabric"); ///Cloth Description var clothDesc = new ClothDescription() { Friction = 0.5f, ClothMesh = ClothModel.ClothMesh, Flags = ClothFlag.Gravity | ClothFlag.Bending | ClothFlag.CollisionTwoway | ClothFlag.Visualization | ClothFlag.SelfCollision, Thickness = 0.5f, }; ///Adding Cloth Vertices clothDesc.MeshData.AllocatePositions <Vector3>(grid.Points.Length); clothDesc.MeshData.AllocateIndices <int>(grid.Indices.Length); clothDesc.MeshData.AllocateNormals <Vector3>(grid.Points.Length); clothDesc.MeshData.MaximumVertices = grid.Points.Length; clothDesc.MeshData.MaximumIndices = grid.Indices.Length; clothDesc.MeshData.NumberOfVertices = grid.Points.Length; clothDesc.MeshData.NumberOfIndices = grid.Indices.Length; ///Cloth Physic Model PhysxClothObject PhysxClothObject = new PloobsEngine.Physics.PhysxClothObject(clothDesc, Matrix.CreateTranslation(-hw, 0, -hh) * Matrix.CreateTranslation(p)); ForwardXNABasicShader ForwardXNABasicShader = new PloobsEngine.Material.ForwardXNABasicShader(); ClothMaterial ClothMaterial = new ClothMaterial(ForwardXNABasicShader); IObject IObject = new PloobsEngine.SceneControl.IObject(ClothMaterial, ClothModel, PhysxClothObject); World.AddObject(IObject); { SimpleModel simpleModel = new SimpleModel(factory, "Model//table", "Textures//wood_dark"); StillDesign.PhysX.Material material1 = PhysxPhysicWorld.CreatePhysicMaterial( new StillDesign.PhysX.MaterialDescription() { Restitution = 0.3f, DynamicFriction = 0.5f, StaticFriction = 1, } ); PhysxTriangleMesh tmesh = new PhysxTriangleMesh(PhysxPhysicWorld, simpleModel, Matrix.Identity, Vector3.One, 1, material1); ForwardXNABasicShader shader = new ForwardXNABasicShader(ForwardXNABasicShaderDescription.Default()); ForwardMaterial fmaterial = new ForwardMaterial(shader); IObject obj = new IObject(fmaterial, simpleModel, tmesh); this.World.AddObject(obj); shader.BasicEffect.EnableDefaultLighting(); } { StillDesign.PhysX.Material material2 = PhysxPhysicWorld.CreatePhysicMaterial( new StillDesign.PhysX.MaterialDescription() { Restitution = PloobsEngine.Utils.StaticRandom.RandomBetween(0, 1), DynamicFriction = PloobsEngine.Utils.StaticRandom.RandomBetween(0, 1), StaticFriction = PloobsEngine.Utils.StaticRandom.RandomBetween(0, 1), RestitutionCombineMode = CombineMode.Max, } ); { SimpleModel sm2 = new SimpleModel(factory, "Model\\ball"); sm2.SetTexture(factory.CreateTexture2DColor(1, 1, Color.Green, false), TextureType.DIFFUSE); ForwardXNABasicShader nd = new ForwardXNABasicShader(); IMaterial m = new ForwardMaterial(nd); SphereShapeDescription SphereGeometry = new SphereShapeDescription(5); SphereGeometry.Material = material2; PhysxPhysicObject PhysxPhysicObject = new PhysxPhysicObject(SphereGeometry, 0.5f, Matrix.CreateTranslation(new Vector3(0, 50, 0)), Vector3.One * 5f); IObject o = new IObject(m, sm2, PhysxPhysicObject); this.World.AddObject(o); nd.BasicEffect.EnableDefaultLighting(); PhysxPhysicObject.isMotionLess = true; } } BallThrowPhysx28 BallThrowBullet = new BallThrowPhysx28(this.World, GraphicFactory); BallThrowBullet.ballSize = 1; BallThrowBullet.Speed = 20; this.AttachCleanUpAble(BallThrowBullet); this.World.CameraManager.AddCamera(new CameraFirstPerson(GraphicInfo)); }