internal void RemoveRigidBody(RigidbodyComponent rigidBody) { if (discreteDynamicsWorld == null) { throw new Exception("Cannot perform this action when the physics engine is set to CollisionsOnly"); } discreteDynamicsWorld.RemoveRigidBody(rigidBody.InternalRigidBody); }
internal void AddRigidBody(RigidbodyComponent rigidBody, CollisionFilterGroupFlags group, CollisionFilterGroupFlags mask) { if (discreteDynamicsWorld == null) { throw new Exception("Cannot perform this action when the physics engine is set to CollisionsOnly"); } discreteDynamicsWorld.AddRigidBody(rigidBody.InternalRigidBody, (short)group, (short)mask); }
public override void Start() { simulation = this.GetSimulation(); simulation.Gravity = new Vector3(0, -9, 0); cubeRigidBody = cube.Get<RigidbodyComponent>(); cubeRigidBody.CanSleep = false; sphereRigidBody = sphere.Get<RigidbodyComponent>(); sphereRigidBody.CanSleep = false; // Create the UI constraintNameBlock = new TextBlock { Font = Font, TextSize = 55, TextColor = Color.White, }; constraintNameBlock.SetCanvasPinOrigin(new Vector3(0.5f, 0.5f, 0)); constraintNameBlock.SetCanvasRelativePosition(new Vector3(0.5f, 0.83f, 0)); Entity.Get<UIComponent>().Page = new UIPage { RootElement = new Canvas { Children = { constraintNameBlock, CreateButton("Next", Font, 1), CreateButton("Previous", Font, -1) } } }; // Create and initialize constraint PhysicsSampleList.Add(CreatePoint2PointConstraint); PhysicsSampleList.Add(CreateHingeConstraint); PhysicsSampleList.Add(CreateGearConstraint); PhysicsSampleList.Add(CreateSliderConstraint); PhysicsSampleList.Add(CreateConeTwistConstraint); PhysicsSampleList.Add(CreateGeneric6DoFConstraint); PhysicsSampleList[constraintIndex](); //Add a script for the slider constraint, to apply an impulse on collision cubeRigidBody.ProcessCollisions = true; Script.AddTask(async () => { while (Game.IsRunning) { var collision = await cubeRigidBody.NewCollision(); if (!(currentConstraint is SliderConstraint)) continue; if (collision.ColliderA != sphereRigidBody && collision.ColliderB != sphereRigidBody) continue; sphereRigidBody.LinearVelocity = Vector3.Zero; //clear any existing velocity sphereRigidBody.ApplyImpulse(new Vector3(-25, 0, 0)); //fire impulse } }); }
public void Clear() { rigidBody = null; }
public XenkoMotionState(RigidbodyComponent rb) { rigidBody = rb; }
/// <summary> /// Creates the constraint. /// </summary> /// <param name="type">The type.</param> /// <param name="rigidBodyA">The rigid body a.</param> /// <param name="rigidBodyB">The rigid body b.</param> /// <param name="frameA">The frame a.</param> /// <param name="frameB">The frame b.</param> /// <param name="useReferenceFrameA">if set to <c>true</c> [use reference frame a].</param> /// <returns></returns> /// <exception cref="System.Exception"> /// Cannot perform this action when the physics engine is set to CollisionsOnly /// or /// Both RigidBodies must be valid /// </exception> public static Constraint CreateConstraint(ConstraintTypes type, RigidbodyComponent rigidBodyA, RigidbodyComponent rigidBodyB, Matrix frameA, Matrix frameB, bool useReferenceFrameA = false) { if (rigidBodyA == null || rigidBodyB == null) throw new Exception("Both RigidBodies must be valid"); //todo check if the 2 rbs are on the same engine instance! var rbA = rigidBodyA.InternalRigidBody; var rbB = rigidBodyB.InternalRigidBody; switch (type) { case ConstraintTypes.Point2Point: { var constraint = new Point2PointConstraint { InternalPoint2PointConstraint = new BulletSharp.Point2PointConstraint(rbA, rbB, frameA.TranslationVector, frameB.TranslationVector), RigidBodyA = rigidBodyA, RigidBodyB = rigidBodyB }; constraint.InternalConstraint = constraint.InternalPoint2PointConstraint; rigidBodyA.LinkedConstraints.Add(constraint); rigidBodyB.LinkedConstraints.Add(constraint); return constraint; } case ConstraintTypes.Hinge: { var constraint = new HingeConstraint { InternalHingeConstraint = new BulletSharp.HingeConstraint(rbA, rbB, frameA, frameB, useReferenceFrameA), RigidBodyA = rigidBodyA, RigidBodyB = rigidBodyB }; constraint.InternalConstraint = constraint.InternalHingeConstraint; rigidBodyA.LinkedConstraints.Add(constraint); rigidBodyB.LinkedConstraints.Add(constraint); return constraint; } case ConstraintTypes.Slider: { var constraint = new SliderConstraint { InternalSliderConstraint = new BulletSharp.SliderConstraint(rbA, rbB, frameA, frameB, useReferenceFrameA), RigidBodyA = rigidBodyA, RigidBodyB = rigidBodyB }; constraint.InternalConstraint = constraint.InternalSliderConstraint; rigidBodyA.LinkedConstraints.Add(constraint); rigidBodyB.LinkedConstraints.Add(constraint); return constraint; } case ConstraintTypes.ConeTwist: { var constraint = new ConeTwistConstraint { InternalConeTwistConstraint = new BulletSharp.ConeTwistConstraint(rbA, rbB, frameA, frameB), RigidBodyA = rigidBodyA, RigidBodyB = rigidBodyB }; constraint.InternalConstraint = constraint.InternalConeTwistConstraint; rigidBodyA.LinkedConstraints.Add(constraint); rigidBodyB.LinkedConstraints.Add(constraint); return constraint; } case ConstraintTypes.Generic6DoF: { var constraint = new Generic6DoFConstraint { InternalGeneric6DofConstraint = new BulletSharp.Generic6DofConstraint(rbA, rbB, frameA, frameB, useReferenceFrameA), RigidBodyA = rigidBodyA, RigidBodyB = rigidBodyB }; constraint.InternalConstraint = constraint.InternalGeneric6DofConstraint; rigidBodyA.LinkedConstraints.Add(constraint); rigidBodyB.LinkedConstraints.Add(constraint); return constraint; } case ConstraintTypes.Generic6DoFSpring: { var constraint = new Generic6DoFSpringConstraint { InternalGeneric6DofSpringConstraint = new BulletSharp.Generic6DofSpringConstraint(rbA, rbB, frameA, frameB, useReferenceFrameA), RigidBodyA = rigidBodyA, RigidBodyB = rigidBodyB }; constraint.InternalConstraint = constraint.InternalGeneric6DofConstraint = constraint.InternalGeneric6DofSpringConstraint; rigidBodyA.LinkedConstraints.Add(constraint); rigidBodyB.LinkedConstraints.Add(constraint); return constraint; } case ConstraintTypes.Gear: { var constraint = new GearConstraint { InternalGearConstraint = new BulletSharp.GearConstraint(rbA, rbB, frameA.TranslationVector, frameB.TranslationVector), RigidBodyA = rigidBodyA, RigidBodyB = rigidBodyB }; constraint.InternalConstraint = constraint.InternalGearConstraint; rigidBodyA.LinkedConstraints.Add(constraint); rigidBodyB.LinkedConstraints.Add(constraint); return constraint; } } return null; }
/// <summary> /// Creates the constraint. /// </summary> /// <param name="type">The type.</param> /// <param name="rigidBodyA">The rigid body a.</param> /// <param name="frameA">The frame a.</param> /// <param name="useReferenceFrameA">if set to <c>true</c> [use reference frame a].</param> /// <returns></returns> /// <exception cref="System.Exception"> /// Cannot perform this action when the physics engine is set to CollisionsOnly /// or /// Both RigidBodies must be valid /// or /// A Gear constraint always needs two rigidbodies to be created. /// </exception> public static Constraint CreateConstraint(ConstraintTypes type, RigidbodyComponent rigidBodyA, Matrix frameA, bool useReferenceFrameA = false) { if (rigidBodyA == null) throw new Exception("Both RigidBodies must be valid"); var rbA = rigidBodyA.InternalRigidBody; switch (type) { case ConstraintTypes.Point2Point: { var constraint = new Point2PointConstraint { InternalPoint2PointConstraint = new BulletSharp.Point2PointConstraint(rbA, frameA.TranslationVector), RigidBodyA = rigidBodyA, }; constraint.InternalConstraint = constraint.InternalPoint2PointConstraint; rigidBodyA.LinkedConstraints.Add(constraint); return constraint; } case ConstraintTypes.Hinge: { var constraint = new HingeConstraint { InternalHingeConstraint = new BulletSharp.HingeConstraint(rbA, frameA, useReferenceFrameA), RigidBodyA = rigidBodyA, }; constraint.InternalConstraint = constraint.InternalHingeConstraint; rigidBodyA.LinkedConstraints.Add(constraint); return constraint; } case ConstraintTypes.Slider: { var constraint = new SliderConstraint { InternalSliderConstraint = new BulletSharp.SliderConstraint(rbA, frameA, useReferenceFrameA), RigidBodyA = rigidBodyA, }; constraint.InternalConstraint = constraint.InternalSliderConstraint; rigidBodyA.LinkedConstraints.Add(constraint); return constraint; } case ConstraintTypes.ConeTwist: { var constraint = new ConeTwistConstraint { InternalConeTwistConstraint = new BulletSharp.ConeTwistConstraint(rbA, frameA), RigidBodyA = rigidBodyA }; constraint.InternalConstraint = constraint.InternalConeTwistConstraint; rigidBodyA.LinkedConstraints.Add(constraint); return constraint; } case ConstraintTypes.Generic6DoF: { var constraint = new Generic6DoFConstraint { InternalGeneric6DofConstraint = new BulletSharp.Generic6DofConstraint(rbA, frameA, useReferenceFrameA), RigidBodyA = rigidBodyA }; constraint.InternalConstraint = constraint.InternalGeneric6DofConstraint; rigidBodyA.LinkedConstraints.Add(constraint); return constraint; } case ConstraintTypes.Generic6DoFSpring: { var constraint = new Generic6DoFSpringConstraint { InternalGeneric6DofSpringConstraint = new BulletSharp.Generic6DofSpringConstraint(rbA, frameA, useReferenceFrameA), RigidBodyA = rigidBodyA }; constraint.InternalConstraint = constraint.InternalGeneric6DofConstraint = constraint.InternalGeneric6DofSpringConstraint; rigidBodyA.LinkedConstraints.Add(constraint); return constraint; } case ConstraintTypes.Gear: { throw new Exception("A Gear constraint always needs two rigidbodies to be created."); } } return null; }
internal void RemoveRigidBody(RigidbodyComponent rigidBody) { if (discreteDynamicsWorld == null) throw new Exception("Cannot perform this action when the physics engine is set to CollisionsOnly"); discreteDynamicsWorld.RemoveRigidBody(rigidBody.InternalRigidBody); }
internal void AddRigidBody(RigidbodyComponent rigidBody, CollisionFilterGroupFlags group, CollisionFilterGroupFlags mask) { if (discreteDynamicsWorld == null) throw new Exception("Cannot perform this action when the physics engine is set to CollisionsOnly"); discreteDynamicsWorld.AddRigidBody(rigidBody.InternalRigidBody, (short)group, (short)mask); }
/// <summary> /// Creates the constraint. /// </summary> /// <param name="type">The type.</param> /// <param name="rigidBodyA">The rigid body a.</param> /// <param name="rigidBodyB">The rigid body b.</param> /// <param name="frameA">The frame a.</param> /// <param name="frameB">The frame b.</param> /// <param name="useReferenceFrameA">if set to <c>true</c> [use reference frame a].</param> /// <returns></returns> /// <exception cref="System.Exception"> /// Cannot perform this action when the physics engine is set to CollisionsOnly /// or /// Both RigidBodies must be valid /// </exception> public static Constraint CreateConstraint(ConstraintTypes type, RigidbodyComponent rigidBodyA, RigidbodyComponent rigidBodyB, Matrix frameA, Matrix frameB, bool useReferenceFrameA = false) { if (rigidBodyA == null || rigidBodyB == null) { throw new Exception("Both RigidBodies must be valid"); } //todo check if the 2 rbs are on the same engine instance! var rbA = rigidBodyA.InternalRigidBody; var rbB = rigidBodyB.InternalRigidBody; switch (type) { case ConstraintTypes.Point2Point: { var constraint = new Point2PointConstraint { InternalPoint2PointConstraint = new BulletSharp.Point2PointConstraint(rbA, rbB, frameA.TranslationVector, frameB.TranslationVector), RigidBodyA = rigidBodyA, RigidBodyB = rigidBodyB }; constraint.InternalConstraint = constraint.InternalPoint2PointConstraint; rigidBodyA.LinkedConstraints.Add(constraint); rigidBodyB.LinkedConstraints.Add(constraint); return(constraint); } case ConstraintTypes.Hinge: { var constraint = new HingeConstraint { InternalHingeConstraint = new BulletSharp.HingeConstraint(rbA, rbB, frameA, frameB, useReferenceFrameA), RigidBodyA = rigidBodyA, RigidBodyB = rigidBodyB }; constraint.InternalConstraint = constraint.InternalHingeConstraint; rigidBodyA.LinkedConstraints.Add(constraint); rigidBodyB.LinkedConstraints.Add(constraint); return(constraint); } case ConstraintTypes.Slider: { var constraint = new SliderConstraint { InternalSliderConstraint = new BulletSharp.SliderConstraint(rbA, rbB, frameA, frameB, useReferenceFrameA), RigidBodyA = rigidBodyA, RigidBodyB = rigidBodyB }; constraint.InternalConstraint = constraint.InternalSliderConstraint; rigidBodyA.LinkedConstraints.Add(constraint); rigidBodyB.LinkedConstraints.Add(constraint); return(constraint); } case ConstraintTypes.ConeTwist: { var constraint = new ConeTwistConstraint { InternalConeTwistConstraint = new BulletSharp.ConeTwistConstraint(rbA, rbB, frameA, frameB), RigidBodyA = rigidBodyA, RigidBodyB = rigidBodyB }; constraint.InternalConstraint = constraint.InternalConeTwistConstraint; rigidBodyA.LinkedConstraints.Add(constraint); rigidBodyB.LinkedConstraints.Add(constraint); return(constraint); } case ConstraintTypes.Generic6DoF: { var constraint = new Generic6DoFConstraint { InternalGeneric6DofConstraint = new BulletSharp.Generic6DofConstraint(rbA, rbB, frameA, frameB, useReferenceFrameA), RigidBodyA = rigidBodyA, RigidBodyB = rigidBodyB }; constraint.InternalConstraint = constraint.InternalGeneric6DofConstraint; rigidBodyA.LinkedConstraints.Add(constraint); rigidBodyB.LinkedConstraints.Add(constraint); return(constraint); } case ConstraintTypes.Generic6DoFSpring: { var constraint = new Generic6DoFSpringConstraint { InternalGeneric6DofSpringConstraint = new BulletSharp.Generic6DofSpringConstraint(rbA, rbB, frameA, frameB, useReferenceFrameA), RigidBodyA = rigidBodyA, RigidBodyB = rigidBodyB }; constraint.InternalConstraint = constraint.InternalGeneric6DofConstraint = constraint.InternalGeneric6DofSpringConstraint; rigidBodyA.LinkedConstraints.Add(constraint); rigidBodyB.LinkedConstraints.Add(constraint); return(constraint); } case ConstraintTypes.Gear: { var constraint = new GearConstraint { InternalGearConstraint = new BulletSharp.GearConstraint(rbA, rbB, frameA.TranslationVector, frameB.TranslationVector), RigidBodyA = rigidBodyA, RigidBodyB = rigidBodyB }; constraint.InternalConstraint = constraint.InternalGearConstraint; rigidBodyA.LinkedConstraints.Add(constraint); rigidBodyB.LinkedConstraints.Add(constraint); return(constraint); } } return(null); }
/// <summary> /// Creates the constraint. /// </summary> /// <param name="type">The type.</param> /// <param name="rigidBodyA">The rigid body a.</param> /// <param name="frameA">The frame a.</param> /// <param name="useReferenceFrameA">if set to <c>true</c> [use reference frame a].</param> /// <returns></returns> /// <exception cref="System.Exception"> /// Cannot perform this action when the physics engine is set to CollisionsOnly /// or /// Both RigidBodies must be valid /// or /// A Gear constraint always needs two rigidbodies to be created. /// </exception> public static Constraint CreateConstraint(ConstraintTypes type, RigidbodyComponent rigidBodyA, Matrix frameA, bool useReferenceFrameA = false) { if (rigidBodyA == null) { throw new Exception("Both RigidBodies must be valid"); } var rbA = rigidBodyA.InternalRigidBody; switch (type) { case ConstraintTypes.Point2Point: { var constraint = new Point2PointConstraint { InternalPoint2PointConstraint = new BulletSharp.Point2PointConstraint(rbA, frameA.TranslationVector), RigidBodyA = rigidBodyA, }; constraint.InternalConstraint = constraint.InternalPoint2PointConstraint; rigidBodyA.LinkedConstraints.Add(constraint); return(constraint); } case ConstraintTypes.Hinge: { var constraint = new HingeConstraint { InternalHingeConstraint = new BulletSharp.HingeConstraint(rbA, frameA, useReferenceFrameA), RigidBodyA = rigidBodyA, }; constraint.InternalConstraint = constraint.InternalHingeConstraint; rigidBodyA.LinkedConstraints.Add(constraint); return(constraint); } case ConstraintTypes.Slider: { var constraint = new SliderConstraint { InternalSliderConstraint = new BulletSharp.SliderConstraint(rbA, frameA, useReferenceFrameA), RigidBodyA = rigidBodyA, }; constraint.InternalConstraint = constraint.InternalSliderConstraint; rigidBodyA.LinkedConstraints.Add(constraint); return(constraint); } case ConstraintTypes.ConeTwist: { var constraint = new ConeTwistConstraint { InternalConeTwistConstraint = new BulletSharp.ConeTwistConstraint(rbA, frameA), RigidBodyA = rigidBodyA }; constraint.InternalConstraint = constraint.InternalConeTwistConstraint; rigidBodyA.LinkedConstraints.Add(constraint); return(constraint); } case ConstraintTypes.Generic6DoF: { var constraint = new Generic6DoFConstraint { InternalGeneric6DofConstraint = new BulletSharp.Generic6DofConstraint(rbA, frameA, useReferenceFrameA), RigidBodyA = rigidBodyA }; constraint.InternalConstraint = constraint.InternalGeneric6DofConstraint; rigidBodyA.LinkedConstraints.Add(constraint); return(constraint); } case ConstraintTypes.Generic6DoFSpring: { var constraint = new Generic6DoFSpringConstraint { InternalGeneric6DofSpringConstraint = new BulletSharp.Generic6DofSpringConstraint(rbA, frameA, useReferenceFrameA), RigidBodyA = rigidBodyA }; constraint.InternalConstraint = constraint.InternalGeneric6DofConstraint = constraint.InternalGeneric6DofSpringConstraint; rigidBodyA.LinkedConstraints.Add(constraint); return(constraint); } case ConstraintTypes.Gear: { throw new Exception("A Gear constraint always needs two rigidbodies to be created."); } } return(null); }
public override async Task Execute() { animationComponent = Entity.Get<AnimationComponent>(); rigidbodyElement = Entity.Get<RigidbodyComponent>(); rigidbodyElement.LinearFactor = new Vector3(0, 1, 0); //allow only Y motion rigidbodyElement.AngularFactor = new Vector3(0, 0, 0); //allow no rotation await Reset(); while (Game.IsRunning) { await WaitMs((int)(enemyLife * 1000)); if (exploding != null) { await exploding; exploding = null; } await Reset(); } }
public override async Task Execute() { spriteSheet = BulletSheet; agentSpriteComponent = Entity.Get<SpriteComponent>(); var animComponent = Entity.Get<AnimationComponent>(); PlayingAnimation playingAnimation = null; // Calculate offset of the bullet from the Agent if he is facing left and right side // TODO improve this var bulletOffset = new Vector3(1.3f, 1.65f, 0f); // Initialize game entities if (!IsLiveReloading) { shootDelayCounter = 0f; isAgentFacingRight = true; currentAgentAnimation = AgentAnimation.Idle; } CurrentAgentAnimation = currentAgentAnimation; var normalScaleX = Entity.Transform.Scale.X; var bulletCS = BulletColliderShape; Task animTask = null; while (Game.IsRunning) { await Script.NextFrame(); var inputState = GetKeyboardInputState(); if (inputState == InputState.None) inputState = GetPointerInputState(); if (inputState == InputState.RunLeft || inputState == InputState.RunRight) { // Update Agent's position var dt = (float)Game.UpdateTime.Elapsed.TotalSeconds; Entity.Transform.Position.X += ((inputState == InputState.RunRight) ? AgentMoveDistance : -AgentMoveDistance) * dt; if (Entity.Transform.Position.X < -gameWidthHalfX) Entity.Transform.Position.X = -gameWidthHalfX; if (Entity.Transform.Position.X > gameWidthHalfX) Entity.Transform.Position.X = gameWidthHalfX; isAgentFacingRight = inputState == InputState.RunRight; // If agent face left, flip the sprite Entity.Transform.Scale.X = isAgentFacingRight ? normalScaleX : -normalScaleX; // Update the sprite animation and state CurrentAgentAnimation = AgentAnimation.Run; if (playingAnimation == null || playingAnimation.Name != "Run") { playingAnimation = animComponent.Play("Run"); } } else if (inputState == InputState.Shoot) { if(animTask != null && !animTask.IsCompleted) continue; if (animTask != null && animTask.IsCompleted) playingAnimation = null; animTask = null; var rb = new RigidbodyComponent { CanCollideWith = CollisionFilterGroupFlags.CustomFilter1, CollisionGroup = CollisionFilterGroups.DefaultFilter }; rb.ColliderShapes.Add(new ColliderShapeAssetDesc { Shape = bulletCS }); // Spawns a new bullet var bullet = new Entity { new SpriteComponent { SpriteProvider = SpriteFromSheet.Create(spriteSheet, "bullet") }, rb, new BeamScript() }; bullet.Name = "bullet"; bullet.Transform.Position = (isAgentFacingRight) ? Entity.Transform.Position + bulletOffset : Entity.Transform.Position + (bulletOffset * new Vector3(-1, 1, 1)); bullet.Transform.UpdateWorldMatrix(); SceneSystem.SceneInstance.Scene.Entities.Add(bullet); rb.LinearFactor = new Vector3(1, 0, 0); rb.AngularFactor = new Vector3(0, 0, 0); rb.ApplyImpulse(isAgentFacingRight ? new Vector3(25, 0, 0) : new Vector3(-25, 0, 0)); // Start animation for shooting CurrentAgentAnimation = AgentAnimation.Shoot; if (playingAnimation == null || playingAnimation.Name != "Attack") { playingAnimation = animComponent.Play("Attack"); animTask = playingAnimation.Ended(); } } else { CurrentAgentAnimation = AgentAnimation.Idle; if (playingAnimation == null || playingAnimation.Name != "Stance") { playingAnimation = animComponent.Play("Stance"); } } } }