public BaseObject(Game game, World physicsWorld) : this(game) { this.physicsWorld = physicsWorld; if (!(this is PhysicsAdapter)) { physicsAdapter = new BoxAdapter(game, this, physicsWorld, Vector3.Zero, Vector3.One); physicsAdapterType = typeof(BoxAdapter); physicsAdapterChangeRequested = false; } OnRotationChanged(this, null); }
public override void Update(GameTime gameTime) { base.Update(gameTime); if (physicsAdapterChangeRequested) { bool reenableCharacterController = false, isStatic = false, isActive = false; if (physicsAdapter != null) { if (physicsAdapter.CharacterController != null) { reenableCharacterController = true; } isStatic = physicsAdapter.Body.IsStatic; isActive = physicsAdapter.Body.IsActive; } physicsAdapter = (PhysicsAdapter)Activator.CreateInstance(physicsAdapterType, physicsAdapterParameters); if (reenableCharacterController) { physicsAdapter.EnableCharacterController(); } physicsAdapter.Body.IsActive = isActive; physicsAdapter.Body.IsStatic = isStatic; physicsAdapterChangeRequested = false; } foreach (ControllerScript script in scripts) { script.Update(gameTime); } if (physicsAdapter != null) { if (physicsEnabled) { if (!physicsWorld.RigidBodies.Contains(physicsAdapter.Body)) { physicsWorld.AddBody(physicsAdapter.Body); } physicsAdapter.Update(gameTime); Vector3 v = Vector3.Transform(physicsAdapter.RelativePosition, Matrix.CreateFromQuaternion(physicsAdapter.Rotation)); position = physicsAdapter.Position - v; rotation = physicsAdapter.Rotation; OnRotationChanged(this, new BodyGeoEventArgs(false)); OnPositionChanged(this, new BodyGeoEventArgs(false)); } else { if (physicsWorld.RigidBodies.Contains(physicsAdapter.Body)) { physicsWorld.RemoveBody(physicsAdapter.Body); } } } foreach (ControllerScript script in scripts) { script.LateUpdate(); } }