public void Update(ComponentizedEntity entity, IGameContext gameContext, IUpdateContext updateContext)
        {
            if (Texture != null)
            {
                if (Texture.IsReady)
                {
                    if (Texture.Asset.Texture != _cachedTextureAssetRef)
                    {
                        _cachedTextureAssetRef = Texture.Asset.Texture;
                        _cachedPixelWidth      = _cachedTextureAssetRef.Width;
                        _cachedPixelHeight     = _cachedTextureAssetRef.Height;
                        if (IsCompressedFormat(_cachedTextureAssetRef.Format))
                        {
                            throw new InvalidOperationException(
                                      "The texture provided to the PerPixelCollisionTexture component is a " +
                                      "compressed texture.  Only uncompressed textures can be used with the " +
                                      "per-pixel collision algorithm, as the texture must be read to the CPU.");
                        }
                        else
                        {
                            _cachedPixelData = new Color[_cachedPixelWidth * _cachedPixelHeight];
                        }
                        _cachedTextureAssetRef.GetData(_cachedPixelData);
                    }
                }
            }

            Update();
        }
Пример #2
0
        public void Update(ComponentizedEntity entity, IGameContext gameContext, IUpdateContext updateContext)
        {
            if (!string.IsNullOrWhiteSpace(UserInterfaceAssetName))
            {
                if (_userInterfaceAssetRef == null ||
                    _userInterfaceControllerAsset != UserInterfaceAssetName)
                {
                    _userInterfaceAssetRef        = _assetManager.Get <UserInterfaceAsset>(UserInterfaceAssetName);
                    _userInterfaceControllerAsset = UserInterfaceAssetName;
                }

                if (_userInterfaceAssetRef.IsReady && _userInterfaceAssetRef.Asset != _userInterfaceAsset)
                {
                    if (_userInterfaceController != null)
                    {
                        _userInterfaceController.Enabled = false;
                    }

                    _userInterfaceAsset              = _userInterfaceAssetRef.Asset;
                    _userInterfaceController         = _userInterfaceFactory.CreateUserInterfaceController(_userInterfaceAsset);
                    _userInterfaceController.Enabled = true;

                    // Register behaviours.
                    foreach (var behaviour in _behaviourRegistration)
                    {
                        behaviour(_userInterfaceController);
                    }
                }
            }

            if (_userInterfaceController != null)
            {
                _userInterfaceController.Update(gameContext, updateContext);
            }
        }
        public void Render(ComponentizedEntity entity, IGameContext gameContext, IRenderContext renderContext)
        {
            if (!Enabled)
            {
                return;
            }

            if (renderContext.IsCurrentRenderPass <I2DBatchedRenderPass>() && Texture != null)
            {
                Vector2?size = null;
                if (Texture.IsReady)
                {
                    size = new Vector2(
                        Texture.Asset.Texture.Width * entity.Transform.LocalScale.X,
                        Texture.Asset.Texture.Width * entity.Transform.LocalScale.Y);
                }

                var defaultVec     = Vector3.Right;
                var transformedVec = Vector3.Transform(defaultVec, entity.Transform.LocalRotation);
                var twodVec        = new Vector2(transformedVec.X, transformedVec.Y);
                var rotation       = (float)Math.Atan2(twodVec.Y, twodVec.X);

                _renderUtilities.RenderTexture(
                    renderContext,
                    new Vector2(entity.Transform.LocalPosition.X, entity.Transform.LocalPosition.Y),
                    Texture,
                    size,
                    Color,
                    rotation,
                    RotationAnchor,
                    FlipHorizontally,
                    FlipVertically,
                    SourceArea);
            }
        }
Пример #4
0
        public void Update(ComponentizedEntity entity, IServerContext serverContext, IUpdateContext updateContext)
        {
            if (_didUpdateSync)
            {
                return;
            }

            Update();
        }
Пример #5
0
 public void Render(ComponentizedEntity entity, IGameContext gameContext, IRenderContext renderContext)
 {
     if (!renderContext.Is3DContext && Texture != null)
     {
         _renderUtilities.RenderTexture(
             renderContext,
             new Vector2(entity.X, entity.Y),
             Texture);
     }
 }
 public void Render(ComponentizedEntity entity, IGameContext gameContext, IRenderContext renderContext)
 {
     if (!renderContext.Is3DContext && Texture != null)
     {
         _renderUtilities.RenderTexture(
             renderContext,
             new Vector2(entity.X, entity.Y),
             Texture);
     }
 }
 public void Render(ComponentizedEntity entity, IGameContext gameContext, IRenderContext renderContext)
 {
     if (!renderContext.Is3DContext && Font != null)
     {
         _renderUtilities.RenderText(
             renderContext,
             new Vector2(entity.LocalMatrix.Translation.X, entity.LocalMatrix.Translation.Y),
             Text,
             Font);
     }
 }
Пример #8
0
        public void Render(ComponentizedEntity entity, IGameContext gameContext, IRenderContext renderContext)
        {
            var matrix          = Matrix.Identity;
            var matrixComponent = _node.Parent?.UntypedValue as IHasMatrix;

            if (matrixComponent != null)
            {
                matrix *= matrixComponent.GetFinalMatrix();
            }
            _renderUtilities.RenderPlane(renderContext, matrix, Color);
        }
        public void Update(ComponentizedEntity entity, IGameContext gameContext, IUpdateContext updateContext)
        {
            if (!Enabled)
            {
                return;
            }

            if (_jitterWorld != _physicsEngine.GetInternalPhysicsWorld())
            {
                // TODO: Deregister rigid bodies from old world.
                if (_jitterWorld != null && _physicsControllerConstraint != null)
                {
                    _jitterWorld.RemoveConstraint(_physicsControllerConstraint);
                    _physicsControllerConstraint = null;
                }
                _jitterWorld = _physicsEngine.GetInternalPhysicsWorld();
            }

            if (_physicalComponent.RigidBodies.Length > 0 && _physicalComponent.RigidBodies[0] != _rigidBody)
            {
                if (_physicsControllerConstraint != null)
                {
                    _jitterWorld.RemoveConstraint(_physicsControllerConstraint);
                    _physicsControllerConstraint = null;
                }
            }

            if (_physicalComponent.RigidBodies.Length > 0)
            {
                if (_physicsControllerConstraint == null)
                {
                    _physicsControllerConstraint = new PhysicsControllerConstraint(
                        _jitterWorld,
                        _physicalComponent.RigidBodies[0]);
                    _jitterWorld.AddConstraint(_physicsControllerConstraint);
                }

                _physicsControllerConstraint.TargetVelocity = TargetVelocity.ToJitterVector();
                _physicsControllerConstraint.TryJump = TryJump;
                _physicsControllerConstraint.JumpVelocity = JumpVelocity;
                _physicsControllerConstraint.Stiffness = Stiffness;

                if (TargetVelocity.LengthSquared() > 0f)
                {
                    // Wake up the rigid body.
                    _physicalComponent.RigidBodies[0].IsActive = true;
                }
            }
        }
        public void Update(ComponentizedEntity entity, IGameContext gameContext, IUpdateContext updateContext)
        {
            if (!Enabled)
            {
                return;
            }

            if (_jitterWorld != _physicsEngine.GetInternalPhysicsWorld())
            {
                // TODO: Deregister rigid bodies from old world.
                if (_jitterWorld != null && _physicsControllerConstraint != null)
                {
                    _jitterWorld.RemoveConstraint(_physicsControllerConstraint);
                    _physicsControllerConstraint = null;
                }
                _jitterWorld = _physicsEngine.GetInternalPhysicsWorld();
            }

            if (_physicalComponent.RigidBodies.Length > 0 && _physicalComponent.RigidBodies[0] != _rigidBody)
            {
                if (_physicsControllerConstraint != null)
                {
                    _jitterWorld.RemoveConstraint(_physicsControllerConstraint);
                    _physicsControllerConstraint = null;
                }
            }

            if (_physicalComponent.RigidBodies.Length > 0)
            {
                if (_physicsControllerConstraint == null)
                {
                    _physicsControllerConstraint = new PhysicsControllerConstraint(
                        _jitterWorld,
                        _physicalComponent.RigidBodies[0]);
                    _jitterWorld.AddConstraint(_physicsControllerConstraint);
                }

                _physicsControllerConstraint.TargetVelocity = TargetVelocity.ToJitterVector();
                _physicsControllerConstraint.TryJump        = TryJump;
                _physicsControllerConstraint.JumpVelocity   = JumpVelocity;
                _physicsControllerConstraint.Stiffness      = Stiffness;

                if (TargetVelocity.LengthSquared() > 0f)
                {
                    // Wake up the rigid body.
                    _physicalComponent.RigidBodies[0].IsActive = true;
                }
            }
        }
        public void Render(ComponentizedEntity entity, IGameContext gameContext, IRenderContext renderContext)
        {
            if (!Enabled)
            {
                return;
            }

            if (!renderContext.IsCurrentRenderPass <I3DRenderPass>() && Texture != null)
            {
                _renderUtilities.RenderTexture(
                    renderContext,
                    new Vector2(entity.Transform.LocalPosition.X, entity.Transform.LocalPosition.Y),
                    Texture);
            }
        }
        public void Render(ComponentizedEntity entity, IGameContext gameContext, IRenderContext renderContext)
        {
            if (!Enabled)
            {
                return;
            }

            if (!renderContext.IsCurrentRenderPass<I3DRenderPass>() && Texture != null)
            {
                _renderUtilities.RenderTexture(
                    renderContext,
                    new Vector2(entity.Transform.LocalPosition.X, entity.Transform.LocalPosition.Y),
                    Texture);
            }
        }
        public void Prerender(ComponentizedEntity entity, IGameContext gameContext, IRenderContext renderContext)
        {
            var enabled      = Enabled && renderContext.IsCurrentRenderPass <I3DRenderPass>();
            var debugEnabled = DebugEnabled && renderContext.IsCurrentRenderPass <IDebugRenderPass>();

            if (enabled || DebugEnabled)
            {
                var parentFinalTransform = (_node?.Parent?.UntypedValue as IHasTransform)?.FinalTransform;
                if (parentFinalTransform == null)
                {
                    return;
                }

                var sourceLocal = HeadOffset;
                var lookAtLocal = HeadOffset + Vector3.Transform(Vector3.Forward, Transform.LocalMatrix);
                var upLocal     = HeadOffset + Vector3.Up;

                var sourceAbsolute = Vector3.Transform(sourceLocal, parentFinalTransform.AbsoluteMatrix);
                var lookAtAbsolute = Vector3.Transform(lookAtLocal, parentFinalTransform.AbsoluteMatrix);
                var upAbsolute     = Vector3.Transform(upLocal, parentFinalTransform.AbsoluteMatrix) -
                                     Vector3.Transform(sourceLocal, parentFinalTransform.AbsoluteMatrix);

                if (enabled)
                {
                    _firstPersonCamera.Apply(
                        renderContext,
                        sourceAbsolute,
                        lookAtAbsolute,
                        upAbsolute,
                        FieldOfView);
                }
                else if (debugEnabled)
                {
                    _debugRenderer.RenderDebugLine(
                        renderContext,
                        sourceAbsolute,
                        lookAtAbsolute,
                        Color.Cyan,
                        Color.Cyan);
                    _debugRenderer.RenderDebugLine(
                        renderContext,
                        sourceAbsolute,
                        sourceAbsolute + upAbsolute,
                        Color.Cyan,
                        Color.Lime);
                }
            }
        }
        public void Update(ComponentizedEntity entity, IGameContext gameContext, IUpdateContext updateContext)
        {
            if (!Enabled)
            {
                return;
            }

            if (!_didSetVelocityLastFrame)
            {
                _firstPersonControllerPhysicsComponent.TargetVelocity = Vector3.Zero;
            }

            _didSetVelocityLastFrame = false;
            _cumulativeMoveX = 0;
            _cumulativeMoveZ = 0;
        }
Пример #15
0
        public void Update(ComponentizedEntity entity, IGameContext gameContext, IUpdateContext updateContext)
        {
            if (!Enabled)
            {
                return;
            }

            if (!_didSetVelocityLastFrame)
            {
                _firstPersonControllerPhysicsComponent.TargetVelocity = Vector3.Zero;
            }

            _didSetVelocityLastFrame = false;
            _cumulativeMoveX         = 0;
            _cumulativeMoveZ         = 0;
        }
        public void Prerender(ComponentizedEntity entity, IGameContext gameContext, IRenderContext renderContext)
        {
            var enabled = Enabled && renderContext.IsCurrentRenderPass<I3DRenderPass>();
            var debugEnabled = DebugEnabled && renderContext.IsCurrentRenderPass<IDebugRenderPass>();
            if (enabled || DebugEnabled)
            {
                var parentFinalTransform = (_node?.Parent?.UntypedValue as IHasTransform)?.FinalTransform;
                if (parentFinalTransform == null)
                {
                    return;
                }

                var sourceLocal = HeadOffset;
                var lookAtLocal = HeadOffset + Vector3.Transform(Vector3.Forward, Transform.LocalMatrix);
                var upLocal = HeadOffset + Vector3.Up;

                var sourceAbsolute = Vector3.Transform(sourceLocal, parentFinalTransform.AbsoluteMatrix);
                var lookAtAbsolute = Vector3.Transform(lookAtLocal, parentFinalTransform.AbsoluteMatrix);
                var upAbsolute = Vector3.Transform(upLocal, parentFinalTransform.AbsoluteMatrix) -
                                 Vector3.Transform(sourceLocal, parentFinalTransform.AbsoluteMatrix);

                if (enabled)
                {
                    _firstPersonCamera.Apply(
                        renderContext,
                        sourceAbsolute,
                        lookAtAbsolute,
                        upAbsolute,
                        FieldOfView);
                }
                else if (debugEnabled)
                {
                    _debugRenderer.RenderDebugLine(
                        renderContext,
                        sourceAbsolute,
                        lookAtAbsolute,
                        Color.Cyan,
                        Color.Cyan);
                    _debugRenderer.RenderDebugLine(
                        renderContext,
                        sourceAbsolute,
                        sourceAbsolute + upAbsolute,
                        Color.Cyan,
                        Color.Lime);
                }
            }
        }
        public void Render(ComponentizedEntity entity, IGameContext gameContext, IRenderContext renderContext)
        {
            if (!Enabled)
            {
                return;
            }

            if (_physicsControllerConstraint != null && _physicalComponent.RigidBodies.Length > 0)
            {
                _debugRenderer.RenderDebugLine(
                    renderContext,
                    _physicalComponent.RigidBodies[0].Position.ToXNAVector(),
                    _physicalComponent.RigidBodies[0].Position.ToXNAVector() + TargetVelocity,
                    Color.Yellow,
                    Color.Yellow);
            }
        }
Пример #18
0
        public void Render(ComponentizedEntity entity, IGameContext gameContext, IRenderContext renderContext)
        {
            if (!Enabled)
            {
                return;
            }

            if (renderContext.IsCurrentRenderPass <I3DRenderPass>())
            {
                var matrix          = Matrix.Identity;
                var matrixComponent = _node.Parent?.UntypedValue as IHasTransform;
                if (matrixComponent != null)
                {
                    matrix *= matrixComponent.FinalTransform.AbsoluteMatrix;
                }
                _renderUtilities.RenderPlane(renderContext, Effect.Effect, Effect.Effect.CreateParameterSet(), matrix, Color);
            }
        }
        public void Render(ComponentizedEntity entity, IGameContext gameContext, IRenderContext renderContext)
        {
            if (!Enabled)
            {
                return;
            }

            if (renderContext.IsCurrentRenderPass<I3DRenderPass>())
            {
                var matrix = Matrix.Identity;
                var matrixComponent = _node.Parent?.UntypedValue as IHasTransform;
                if (matrixComponent != null)
                {
                    matrix *= matrixComponent.FinalTransform.AbsoluteMatrix;
                }
                _renderUtilities.RenderPlane(renderContext, Effect.Effect, Effect.Effect.CreateParameterSet(), matrix, Color);
            }
        }
        public void Render(ComponentizedEntity entity, IGameContext gameContext, IRenderContext renderContext)
        {
            if (!Enabled)
            {
                return;
            }

            if (renderContext.IsCurrentRenderPass<I3DRenderPass>())
            {
                _renderUtilities.RenderCube(
                    renderContext,
                    Effect,
                    Effect.CreateParameterSet(),
                    Matrix.CreateTranslation(-0.5f, -0.5f, -0.5f) *
                    FinalTransform.AbsoluteMatrix, 
                    Color);
            }
        }
Пример #21
0
        public void Render(ComponentizedEntity entity, IGameContext gameContext, IRenderContext renderContext)
        {
            if (!Enabled)
            {
                return;
            }

            if (renderContext.IsCurrentRenderPass <I3DRenderPass>())
            {
                _renderUtilities.RenderCube(
                    renderContext,
                    Effect,
                    Effect.CreateParameterSet(),
                    Matrix.CreateTranslation(-0.5f, -0.5f, -0.5f) *
                    FinalTransform.AbsoluteMatrix,
                    Color);
            }
        }
        public void Update(ComponentizedEntity entity, IGameContext gameContext, IUpdateContext updateContext)
        {
            if (!_enabled || _serverOnly)
            {
                return;
            }

            _localTick++;
            _isRunningOnClient = true;

            // For all synchronised values, update them with their time machine if they have one.
            foreach (var data in _synchronisedData)
            {
                if (data.Value.TimeMachine != null)
                {
                    data.Value.SetValueDelegate(
                        data.Value.TimeMachine.Get(_localTick));
                }
            }

            if (!_uniqueIdentifierForEntity.HasValue)
            {
                // TODO: Support predicted entities here.
                // We don't have an identifier provided by the server, so skip all this logic.
                return;
            }

            if (ClientAuthoritiveMode != ClientAuthoritiveMode.None)
            {
                // This client has some level of authority over the entity, so send data that's important.
                switch (ClientAuthoritiveMode)
                {
                case ClientAuthoritiveMode.TrustClient:
                    PrepareAndTransmitSynchronisation(entity, _localTick, true, ClientAuthoritiveMode);
                    break;

                case ClientAuthoritiveMode.ReplayInputs:
                    throw new NotSupportedException("Replaying inputs provided by clients is not yet supported.");

                default:
                    throw new InvalidOperationException("Unknown client authoritivity mode: " + ClientAuthoritiveMode);
                }
            }
        }
        public void Update(ComponentizedEntity entity, IGameContext gameContext, IUpdateContext updateContext)
        {
            if (Texture != null)
            {
                if (Texture.IsReady)
                {
                    if (Texture.Asset.Texture != _cachedTextureAssetRef)
                    {
                        _cachedTextureAssetRef = Texture.Asset.Texture;
                        _cachedPixelWidth      = _cachedTextureAssetRef.Width;
                        _cachedPixelHeight     = _cachedTextureAssetRef.Height;
                        _cachedPixelData       = new Color[_cachedPixelWidth * _cachedPixelHeight];
                        _cachedTextureAssetRef.GetData(_cachedPixelData);
                    }
                }
            }

            Update();
        }
        public void Update(ComponentizedEntity entity, IGameContext gameContext, IUpdateContext updateContext)
        {
            if (_standardPointLight == null)
            {
                throw new InvalidOperationException(
                          "The light was null (presumably because this code is executing on a server), " +
                          "but the Update method that accepts a game context was called.");
            }

            var matrix          = Matrix.Identity;
            var matrixComponent = _node.Parent?.UntypedValue as IHasTransform;

            if (matrixComponent != null)
            {
                matrix *= matrixComponent.FinalTransform.AbsoluteMatrix;
            }

            _standardPointLight.LightPosition = Vector3.Transform(Vector3.Zero, matrix);
        }
        public bool ReceiveMessage(ComponentizedEntity entity, IGameContext gameContext, IUpdateContext updateContext, MxDispatcher dispatcher, MxClient server,
                                   byte[] payload, uint protocolId)
        {
            if (!_enabled)
            {
                return(false);
            }

            if (_uniqueIdentifierForEntity == null)
            {
                return(false);
            }

            var propertyMessage = _networkMessageSerialization.Deserialize(payload) as EntityPropertiesMessage;

            if (propertyMessage == null || propertyMessage.EntityID != _uniqueIdentifierForEntity.Value)
            {
                return(false);
            }

            // If the entity is a synchronised entity, collect properties of the synchronised object
            // directly.
            var synchronisedEntity = entity as ISynchronisedObject;

            if (synchronisedEntity != null)
            {
                _synchronisationContext = synchronisedEntity;
                _synchronisationContext.DeclareSynchronisedProperties(this);
            }

            // Iterate through all the components on the entity and get their synchronisation data as well.
            foreach (var synchronisedComponent in entity.Components.OfType <ISynchronisedObject>())
            {
                _synchronisationContext = synchronisedComponent;
                _synchronisationContext.DeclareSynchronisedProperties(this);
            }

            AssignMessageToSyncData(propertyMessage, _synchronisedData, server.Group);
            return(true);
        }
Пример #26
0
        public void Render(ComponentizedEntity entity, IGameContext gameContext, IRenderContext renderContext)
        {
            if (!Enabled)
            {
                return;
            }

            if (renderContext.IsCurrentRenderPass <I3DRenderPass>())
            {
                IEffect effect;
                if (Effect != null)
                {
                    effect = Effect;
                }
                else if (_defaultSurfaceEffect.IsReady)
                {
                    effect = _defaultSurfaceEffect.Asset.Effects?["Color"];
                }
                else
                {
                    return;
                }

                if (effect == null)
                {
                    return;
                }

                var matrix          = Matrix.Identity;
                var matrixComponent = _node.Parent?.UntypedValue as IHasTransform;
                if (matrixComponent != null)
                {
                    matrix *= matrixComponent.FinalTransform.AbsoluteMatrix;
                }
                _renderUtilities.RenderPlane(renderContext, effect, effect.CreateParameterSet(), matrix, Color);
            }
        }
Пример #27
0
        public void Render(ComponentizedEntity entity, IGameContext gameContext, IRenderContext renderContext)
        {
            if (!Enabled)
            {
                return;
            }

            if (renderContext.IsCurrentRenderPass <I3DRenderPass>())
            {
                IEffect effect;
                if (Effect != null)
                {
                    effect = Effect;
                }
                else if (_defaultSurfaceEffect.IsReady)
                {
                    effect = _defaultSurfaceEffect.Asset.Effects?["Color"];
                }
                else
                {
                    return;
                }

                if (effect == null)
                {
                    return;
                }

                _renderUtilities.RenderCube(
                    renderContext,
                    effect,
                    effect.CreateParameterSet(),
                    Matrix.CreateTranslation(-0.5f, -0.5f, -0.5f) *
                    FinalTransform.AbsoluteMatrix,
                    Color);
            }
        }
        public void Update(ComponentizedEntity entity, IGameContext gameContext, IUpdateContext updateContext)
        {
            if (_standardPointLight == null)
            {
                throw new InvalidOperationException(
                    "The light was null (presumably because this code is executing on a server), " +
                    "but the Update method that accepts a game context was called.");
            }

            var matrix = Matrix.Identity;
            var matrixComponent = _node.Parent?.UntypedValue as IHasTransform;
            if (matrixComponent != null)
            {
                matrix *= matrixComponent.FinalTransform.AbsoluteMatrix;
            }

            _standardPointLight.LightPosition = Vector3.Transform(Vector3.Zero, matrix);
        }
        public bool Handle(ComponentizedEntity componentizedEntity, IGameContext gameContext,
            IEventEngine<IGameContext> eventEngine, Event @event)
        {
            if (!Enabled)
            {
                return false;
            }

            var gamepadEvent = @event as GamePadEvent;
            var keyHeldEvent = @event as KeyHeldEvent;
            var mouseEvent = @event as MouseEvent;

            if (gamepadEvent != null)
            {
                _firstPersonCameraComponent.Yaw -= gamepadEvent.GamePadState.ThumbSticks.Right.X*
                                                   ThumbstickLookSensitivity;
                _firstPersonCameraComponent.Pitch += gamepadEvent.GamePadState.ThumbSticks.Right.Y*
                                                     ThumbstickLookSensitivity;

                var limit = MathHelper.PiOver2 - MathHelper.ToRadians(5);
                _firstPersonCameraComponent.Pitch = MathHelper.Clamp(_firstPersonCameraComponent.Pitch, -limit, limit);

                var lookAt = _firstPersonCameraComponent.Transform.LocalMatrix;
                var relativeMovementVector = new Vector3(
                    gamepadEvent.GamePadState.ThumbSticks.Left.X*ThumbstickMoveSensitivity* MovementSpeed,
                    0f,
                    -gamepadEvent.GamePadState.ThumbSticks.Left.Y*ThumbstickMoveSensitivity * MovementSpeed);
                
                var absoluteMovementVector =
                    _firstPersonCameraComponent.ComputeWorldSpaceVectorFromLocalSpace(relativeMovementVector);

                _firstPersonControllerPhysicsComponent.TargetVelocity = absoluteMovementVector;
                _didSetVelocityLastFrame = true;

                return true;
            }

            if (mouseEvent != null && MouseLock)
            {
                var centerX = gameContext.Window.ClientBounds.Width/2;
                var centerY = gameContext.Window.ClientBounds.Height/2;

                _firstPersonCameraComponent.Yaw += (centerX - mouseEvent.MouseState.X)/1000f;
                _firstPersonCameraComponent.Pitch += (centerY - mouseEvent.MouseState.Y)/1000f;

                var limit = MathHelper.PiOver2 - MathHelper.ToRadians(5);
                _firstPersonCameraComponent.Pitch = MathHelper.Clamp(_firstPersonCameraComponent.Pitch, -limit, limit);

                Mouse.SetPosition(centerX, centerY);

                return true;
            }

            if (keyHeldEvent != null)
            {
                var didConsume = false;
                var moveX = 0;
                var moveZ = 0;

                if (keyHeldEvent.Key == Keys.A)
                {
                    _cumulativeMoveX -= 1;
                    didConsume = true;
                }
                if (keyHeldEvent.Key == Keys.D)
                {
                    _cumulativeMoveX += 1;
                    didConsume = true;
                }
                if (keyHeldEvent.Key == Keys.W)
                {
                    _cumulativeMoveZ += 1;
                    didConsume = true;
                }
                if (keyHeldEvent.Key == Keys.S)
                {
                    _cumulativeMoveZ -= 1;
                    didConsume = true;
                }

                var relativeMovementVector = new Vector3(
                    _cumulativeMoveX * ThumbstickMoveSensitivity * MovementSpeed,
                    0f,
                    -_cumulativeMoveZ * ThumbstickMoveSensitivity * MovementSpeed);
                var absoluteMovementVector =
                    _firstPersonCameraComponent.ComputeWorldSpaceVectorFromLocalSpace(relativeMovementVector);

                _firstPersonControllerPhysicsComponent.TargetVelocity = absoluteMovementVector;
                _didSetVelocityLastFrame = true;

                return didConsume;
            }

            return false;
        }
Пример #30
0
 public void Update(ComponentizedEntity entity, IServerContext serverContext, IUpdateContext updateContext)
 {
     Update();
 }
 public void Update(ComponentizedEntity entity, IServerContext serverContext, IUpdateContext updateContext)
 {
     Update();
 }
        public bool Handle(ComponentizedEntity componentizedEntity, IGameContext gameContext,
            IEventEngine<IGameContext> eventEngine, Event @event)
        {
            if (!Enabled)
            {
                return false;
            }

            var gamepadEvent = @event as GamePadEvent;
            var keyHeldEvent = @event as KeyHeldEvent;
            var mouseEvent = @event as MouseEvent;

            if (gamepadEvent != null)
            {
                _firstPersonCameraComponent.Yaw -= gamepadEvent.GamePadState.ThumbSticks.Right.X*
                                                   ThumbstickLookSensitivity;
                _firstPersonCameraComponent.Pitch += gamepadEvent.GamePadState.ThumbSticks.Right.Y*
                                                     ThumbstickLookSensitivity;

                var limit = MathHelper.PiOver2 - MathHelper.ToRadians(5);
                _firstPersonCameraComponent.Pitch = MathHelper.Clamp(_firstPersonCameraComponent.Pitch, -limit, limit);

                var lookAt = _firstPersonCameraComponent.Transform.LocalMatrix;
                var relativeMovementVector = new Vector3(
                    gamepadEvent.GamePadState.ThumbSticks.Left.X*ThumbstickMoveSensitivity,
                    0f,
                    -gamepadEvent.GamePadState.ThumbSticks.Left.Y*ThumbstickMoveSensitivity);
                var absoluteMovementVector = Vector3.Transform(relativeMovementVector, lookAt);

                componentizedEntity.Transform.LocalPosition += absoluteMovementVector;

                return true;
            }

            if (mouseEvent != null)
            {
                var centerX = gameContext.Window.ClientBounds.Width/2;
                var centerY = gameContext.Window.ClientBounds.Height/2;

                _firstPersonCameraComponent.Yaw += (centerX - mouseEvent.MouseState.X)/1000f;
                _firstPersonCameraComponent.Pitch += (centerY - mouseEvent.MouseState.Y)/1000f;

                var limit = MathHelper.PiOver2 - MathHelper.ToRadians(5);
                _firstPersonCameraComponent.Pitch = MathHelper.Clamp(_firstPersonCameraComponent.Pitch, -limit, limit);

                Mouse.SetPosition(centerX, centerY);

                return true;
            }

            if (keyHeldEvent != null)
            {
                var didConsume = false;
                var moveX = 0;
                var moveZ = 0;

                if (keyHeldEvent.Key == Keys.A)
                {
                    moveX = -1;
                    didConsume = true;
                }
                if (keyHeldEvent.Key == Keys.D)
                {
                    moveX = 1;
                    didConsume = true;
                }
                if (keyHeldEvent.Key == Keys.W)
                {
                    moveZ = 1;
                    didConsume = true;
                }
                if (keyHeldEvent.Key == Keys.S)
                {
                    moveZ = -1;
                    didConsume = true;
                }
                var lookAt = _firstPersonCameraComponent.Transform.LocalMatrix;
                var relativeMovementVector = new Vector3(
                    moveX*ThumbstickMoveSensitivity,
                    0f,
                    -moveZ*ThumbstickMoveSensitivity);
                var absoluteMovementVector = Vector3.Transform(relativeMovementVector, lookAt);

                componentizedEntity.Transform.LocalPosition += absoluteMovementVector;

                return didConsume;
            }

            return false;
        }
        public void Render(ComponentizedEntity entity, IGameContext gameContext, IRenderContext renderContext)
        {
            if (!_enabled || _serverOnly)
            {
                return;
            }

            if (renderContext.IsCurrentRenderPass <IDebugRenderPass>())
            {
                var debugRenderPass     = renderContext.GetCurrentRenderPass <IDebugRenderPass>();
                var entityTransformSync = _synchronisedData.Select(x => x.Value).FirstOrDefault(x => x.Name == "entity.transform");

                if (entityTransformSync != null && debugRenderPass.EnabledLayers.OfType <ServerStateDebugLayer>().Any())
                {
                    var lastValueSerialized = entityTransformSync.LastValueFromServer as NetworkTransform;
                    if (lastValueSerialized != null)
                    {
                        var timeMachine = entityTransformSync.TimeMachine;
                        if (timeMachine != null)
                        {
                            var lastValueRelative = lastValueSerialized.DeserializeFromNetwork();
                            var lastValueAbsolute = DefaultFinalTransform.Create(entity.FinalTransform.ParentObject,
                                                                                 new TransformContainer(lastValueRelative));

                            var clientLocalTickValueRelative = timeMachine.Get(_localTick) as ITransform;
                            var clientLocalTickValueAbsolute = DefaultFinalTransform.Create(entity.FinalTransform.ParentObject,
                                                                                            new TransformContainer(clientLocalTickValueRelative));

                            var clientRewindValueRelative = timeMachine.Get(_localTick - _networkEngine.ClientRenderDelayTicks) as ITransform;
                            var clientRewindValueAbsolute = DefaultFinalTransform.Create(entity.FinalTransform.ParentObject,
                                                                                         new TransformContainer(clientRewindValueRelative));

                            var lastValuePoint   = Vector3.Transform(Vector3.Zero, lastValueAbsolute.AbsoluteMatrix);
                            var lastValueUp      = Vector3.Transform(Vector3.Up, lastValueAbsolute.AbsoluteMatrix);
                            var lastValueForward = Vector3.Transform(Vector3.Forward, lastValueAbsolute.AbsoluteMatrix);
                            var lastValueLeft    = Vector3.Transform(Vector3.Left, lastValueAbsolute.AbsoluteMatrix);

                            var clientLocalTickPoint   = Vector3.Transform(Vector3.Zero, clientLocalTickValueAbsolute.AbsoluteMatrix);
                            var clientLocalTickUp      = Vector3.Transform(Vector3.Up, clientLocalTickValueAbsolute.AbsoluteMatrix);
                            var clientLocalTickForward = Vector3.Transform(Vector3.Forward, clientLocalTickValueAbsolute.AbsoluteMatrix);
                            var clientLocalTickLeft    = Vector3.Transform(Vector3.Left, clientLocalTickValueAbsolute.AbsoluteMatrix);

                            var clientRewindValueTickPoint   = Vector3.Transform(Vector3.Zero, clientRewindValueAbsolute.AbsoluteMatrix);
                            var clientRewindValueTickUp      = Vector3.Transform(Vector3.Up, clientRewindValueAbsolute.AbsoluteMatrix);
                            var clientRewindValueTickForward = Vector3.Transform(Vector3.Forward, clientRewindValueAbsolute.AbsoluteMatrix);
                            var clientRewindValueTickLeft    = Vector3.Transform(Vector3.Left, clientRewindValueAbsolute.AbsoluteMatrix);

                            if (entity.GetType().Name == "CubeEntity")
                            {
                                Console.WriteLine(lastValueSerialized);
                            }

                            // Render the previous and next server states.
                            _debugRenderer.RenderDebugLine(renderContext, lastValuePoint, lastValueUp, Color.Red, Color.Red);
                            _debugRenderer.RenderDebugLine(renderContext, lastValuePoint, lastValueForward, Color.Red, Color.Red);
                            _debugRenderer.RenderDebugLine(renderContext, lastValuePoint, lastValueLeft, Color.Red, Color.Red);
                            _debugRenderer.RenderDebugLine(renderContext, clientLocalTickPoint, clientLocalTickUp, Color.Orange, Color.Orange);
                            _debugRenderer.RenderDebugLine(renderContext, clientLocalTickPoint, clientLocalTickForward, Color.Orange, Color.Orange);
                            _debugRenderer.RenderDebugLine(renderContext, clientLocalTickPoint, clientLocalTickLeft, Color.Orange, Color.Orange);
                            _debugRenderer.RenderDebugLine(renderContext, clientRewindValueTickPoint, clientRewindValueTickUp, Color.Yellow, Color.Yellow);
                            _debugRenderer.RenderDebugLine(renderContext, clientRewindValueTickPoint, clientRewindValueTickForward, Color.Yellow, Color.Yellow);
                            _debugRenderer.RenderDebugLine(renderContext, clientRewindValueTickPoint, clientRewindValueTickLeft, Color.Yellow, Color.Yellow);
                        }
                    }
                }
            }
        }
        private void PrepareAndTransmitSynchronisation(ComponentizedEntity entity, int tick, bool isFromClient, ClientAuthoritiveMode clientAuthoritiveMode)
        {
            if (!_uniqueIdentifierForEntity.HasValue)
            {
                throw new InvalidOperationException("PrepareAndTransmit should not be called without an entity ID!");
            }

            // If the entity is a synchronised entity, collect properties of the synchronised object
            // directly.
            var synchronisedEntity = entity as ISynchronisedObject;

            if (synchronisedEntity != null)
            {
                _synchronisationContext = synchronisedEntity;
                _synchronisationContext.DeclareSynchronisedProperties(this);
            }

            // Iterate through all the components on the entity and get their synchronisation data as well.
            foreach (var synchronisedComponent in entity.Components.OfType <ISynchronisedObject>())
            {
                _synchronisationContext = synchronisedComponent;
                _synchronisationContext.DeclareSynchronisedProperties(this);
            }

            // Sync properties to each client.
            foreach (var dispatcher in _networkEngine.CurrentDispatchers)
            {
                foreach (var group in dispatcher.ValidClientGroups)
                {
                    if (ClientAuthoritiveMode != ClientAuthoritiveMode.None &&
                        ClientOwnership != null &&
                        OnlySendToAuthoritiveClient)
                    {
                        if (ClientOwnership != group)
                        {
                            // This client doesn't own the entity, and this entity is only
                            // synchronised with clients that own it.
                            continue;
                        }
                    }

                    if (isFromClient || _clientsEntityIsKnownOn.Contains(group))
                    {
                        if (_synchronisedData.Count > 0)
                        {
                            // Now calculate the delta to transmit over the network.
                            var currentTick = tick; // TODO: Use TimeTick
                            _synchronisedDataToTransmit.Clear();
                            foreach (var data in _synchronisedData.Values)
                            {
                                var needsSync = false;

                                // Check the target for this data to see whether or not we send it to
                                // this particular client.
                                if (data.SynchronisationTargets == SynchroniseTargets.OwningClient &&
                                    (ClientOwnership == null ||
                                     !(ClientOwnership == group)))
                                {
                                    // This data should only be synchronised to the owning client, and
                                    // we are not the owning client.
                                    continue;
                                }
                                else if (data.SynchronisationTargets == SynchroniseTargets.NonOwningClients &&
                                         (ClientOwnership == null ||
                                          ClientOwnership == group))
                                {
                                    // This data should only be synchronised to non-owning clients, and
                                    // we either are the owning client, or no client ownership has been set.
                                    continue;
                                }

                                // If we're on the client and we haven't had an initial piece of data from the server,
                                // we never synchronise because we don't know what the initial value is.
                                if (isFromClient && !data.HasReceivedInitialSync.GetOrDefault(group, false))
                                {
                                    continue;
                                }

                                // If we haven't performed the initial synchronisation, we always transmit the data.
                                if (!data.HasPerformedInitialSync.GetOrDefault(group, false))
                                {
                                    _networkEngine.LogSynchronisationEvent(
                                        "Must send property '" + data.Name + "' on entity ID " + _uniqueIdentifierForEntity +
                                        " because the endpoint " + group + " has not received it's initial sync.");
                                    needsSync = true;
                                }

                                // If we are on the client (i.e. the client assumes it's authoritive), or if the
                                // server knows that the client does not have authority, then allow this next section.
                                // Or to put it another way, if we're not on the client and we know the client has
                                // authority, only transmit data for the first time because the client will make
                                // decisions from that point onwards.
                                if (isFromClient || clientAuthoritiveMode != ClientAuthoritiveMode.TrustClient ||
                                    (clientAuthoritiveMode == ClientAuthoritiveMode.TrustClient &&
                                     group != ClientOwnership))
                                {
                                    var lastValue    = data.LastValue;
                                    var currentValue = data.CurrentValue;

                                    if (lastValue is ITransform)
                                    {
                                        throw new InvalidOperationException(
                                                  "Last value property got stored as ITransform, but should have been stored as NetworkTransform!");
                                    }

                                    if (currentValue is ITransform)
                                    {
                                        currentValue = ((ITransform)currentValue).SerializeToNetwork();
                                    }

                                    if (!Equals(lastValue, currentValue))
                                    {
                                        if (data.LastFrameSynced.GetOrDefault(group, 0) + data.FrameInterval < currentTick)
                                        {
                                            _networkEngine.LogSynchronisationEvent(
                                                "Sending property '" + data.Name + "' on entity ID " + _uniqueIdentifierForEntity +
                                                " because the value has changed (old value: " + lastValue + ", new value: " + currentValue + ")," +
                                                " and the next frame synced target for group " + group + "" +
                                                " is " + (data.LastFrameSynced.GetOrDefault(group, 0) + data.FrameInterval) + "" +
                                                " and the current tick is " + currentTick + ".");
                                            needsSync = true;
                                        }
                                    }
                                }

                                if (needsSync)
                                {
                                    _synchronisedDataToTransmit.Add(data);
                                }
                            }

                            if (_synchronisedDataToTransmit.Count > 0)
                            {
                                // Build up the synchronisation message.
                                var message = new EntityPropertiesMessage();
                                message.EntityID        = _uniqueIdentifierForEntity.Value;
                                message.FrameTick       = currentTick;
                                message.PropertyNames   = new string[_synchronisedDataToTransmit.Count];
                                message.PropertyTypes   = new int[_synchronisedDataToTransmit.Count];
                                message.IsClientMessage = isFromClient;
                                message.MessageOrder    = _messageOrder++;

                                bool reliable;
                                AssignSyncDataToMessage(_synchronisedDataToTransmit, message, currentTick, group, out reliable);

                                // Send an entity properties message to the client.
                                _networkEngine.Send(
                                    dispatcher,
                                    group,
                                    message,
                                    reliable);
                            }
                        }
                    }
                }
            }
        }
Пример #35
0
 public void Update(ComponentizedEntity entity, IGameContext gameContext, IUpdateContext updateContext)
 {
     Update();
 }
Пример #36
0
        public bool Handle(ComponentizedEntity componentizedEntity, IGameContext gameContext,
                           IEventEngine <IGameContext> eventEngine, Event @event)
        {
            if (!Enabled)
            {
                return(false);
            }

            var gamepadEvent = @event as GamePadEvent;
            var keyHeldEvent = @event as KeyHeldEvent;
            var mouseEvent   = @event as MouseEvent;

            if (gamepadEvent != null)
            {
                _firstPersonCameraComponent.Yaw -= gamepadEvent.GamePadState.ThumbSticks.Right.X *
                                                   ThumbstickLookSensitivity;
                _firstPersonCameraComponent.Pitch += gamepadEvent.GamePadState.ThumbSticks.Right.Y *
                                                     ThumbstickLookSensitivity;

                var limit = MathHelper.PiOver2 - MathHelper.ToRadians(5);
                _firstPersonCameraComponent.Pitch = MathHelper.Clamp(_firstPersonCameraComponent.Pitch, -limit, limit);

                var lookAt = _firstPersonCameraComponent.Transform.LocalMatrix;
                var relativeMovementVector = new Vector3(
                    gamepadEvent.GamePadState.ThumbSticks.Left.X * ThumbstickMoveSensitivity * MovementSpeed,
                    0f,
                    -gamepadEvent.GamePadState.ThumbSticks.Left.Y * ThumbstickMoveSensitivity * MovementSpeed);

                var absoluteMovementVector =
                    _firstPersonCameraComponent.ComputeWorldSpaceVectorFromLocalSpace(relativeMovementVector);

                _firstPersonControllerPhysicsComponent.TargetVelocity = absoluteMovementVector;
                _didSetVelocityLastFrame = true;

                return(true);
            }

            if (mouseEvent != null && MouseLock)
            {
                var centerX = gameContext.Window.ClientBounds.Width / 2;
                var centerY = gameContext.Window.ClientBounds.Height / 2;

                _firstPersonCameraComponent.Yaw   += (centerX - mouseEvent.MouseState.X) / 1000f;
                _firstPersonCameraComponent.Pitch += (centerY - mouseEvent.MouseState.Y) / 1000f;

                var limit = MathHelper.PiOver2 - MathHelper.ToRadians(5);
                _firstPersonCameraComponent.Pitch = MathHelper.Clamp(_firstPersonCameraComponent.Pitch, -limit, limit);

                Mouse.SetPosition(centerX, centerY);

                return(true);
            }

            if (keyHeldEvent != null)
            {
                var didConsume = false;
                var moveX      = 0;
                var moveZ      = 0;

                if (keyHeldEvent.Key == Keys.A)
                {
                    _cumulativeMoveX -= 1;
                    didConsume        = true;
                }
                if (keyHeldEvent.Key == Keys.D)
                {
                    _cumulativeMoveX += 1;
                    didConsume        = true;
                }
                if (keyHeldEvent.Key == Keys.W)
                {
                    _cumulativeMoveZ += 1;
                    didConsume        = true;
                }
                if (keyHeldEvent.Key == Keys.S)
                {
                    _cumulativeMoveZ -= 1;
                    didConsume        = true;
                }

                var relativeMovementVector = new Vector3(
                    _cumulativeMoveX * ThumbstickMoveSensitivity * MovementSpeed,
                    0f,
                    -_cumulativeMoveZ * ThumbstickMoveSensitivity * MovementSpeed);
                var absoluteMovementVector =
                    _firstPersonCameraComponent.ComputeWorldSpaceVectorFromLocalSpace(relativeMovementVector);

                _firstPersonControllerPhysicsComponent.TargetVelocity = absoluteMovementVector;
                _didSetVelocityLastFrame = true;

                return(didConsume);
            }

            return(false);
        }
        public void Update(ComponentizedEntity entity, IServerContext serverContext, IUpdateContext updateContext)
        {
            if (!_enabled)
            {
                return;
            }

            _localTick++;
            _isRunningOnClient = false;

            if (_uniqueIdentifierForEntity == null)
            {
                _uniqueIdentifierForEntity = _uniqueIdentifierAllocator.Allocate();
                _networkEngine.RegisterObjectAsNetworkId(_uniqueIdentifierForEntity.Value, entity);
            }

            if (_serverOnly)
            {
                return;
            }

            // Sync the entity to the client if it hasn't been already.
            foreach (var dispatcher in _networkEngine.CurrentDispatchers)
            {
                foreach (var group in dispatcher.ValidClientGroups)
                {
                    if (ClientAuthoritiveMode != ClientAuthoritiveMode.None &&
                        ClientOwnership != null &&
                        OnlySendToAuthoritiveClient)
                    {
                        if (ClientOwnership != group)
                        {
                            // This client doesn't own the entity, and this entity is only
                            // synchronised with clients that own it.
                            _consoleHandle.LogDebug("Entity is owned by " + ClientOwnership + ", and target client is " + group + " who doesn't own it, so I'm not syncing it.");
                            continue;
                        }
                    }

                    if (!_clientsEntityIsKnownOn.Contains(group))
                    {
                        _consoleHandle.LogDebug("Entity is not known to " + group + ", sending creation message.");

                        // Send an entity creation message to the client.
                        var createMessage = new EntityCreateMessage
                        {
                            EntityID         = _uniqueIdentifierForEntity.Value,
                            EntityType       = entity.GetType().AssemblyQualifiedName,
                            InitialTransform = entity.Transform.SerializeToNetwork(),
                            FrameTick        = _localTick,
                            MessageOrder     = _messageOrder++,
                        };
                        _networkEngine.Send(
                            dispatcher,
                            group,
                            createMessage,
                            true);

                        _clientsEntityIsKnownOn.Add(group);
                    }
                }
            }

            PrepareAndTransmitSynchronisation(entity, _localTick, false, ClientAuthoritiveMode);
        }
 public void Update(ComponentizedEntity entity, IGameContext gameContext, IUpdateContext updateContext)
 {
     Update();
 }
        public void Render(ComponentizedEntity entity, IGameContext gameContext, IRenderContext renderContext)
        {
            if (!Enabled)
            {
                return;
            }

            if (renderContext.IsCurrentRenderPass<I3DRenderPass>())
            {
                if (Effect == null)
                {
                    _useDefaultEffects = true;
                }
                else
                {
                    _useDefaultEffects = false;
                }

                if (_useDefaultEffects && _uberEffectAsset == null)
                {
                    _uberEffectAsset = _assetManager.Get<UberEffectAsset>("effect.BuiltinSurface");
                }

                if (Model != null)
                {
                    var matrix = FinalTransform.AbsoluteMatrix;
                    
                    bool changedRenderRequest = _lastWorldMatrix != matrix;
                    string changedRenderRequestBy = changedRenderRequest ? "matrix" : "";

                    var material = OverrideMaterial ?? _model.Material;

                    UpdateCachedModel(material, ref changedRenderRequest, ref changedRenderRequestBy);

                    var effect = GetEffect(ref changedRenderRequest, ref changedRenderRequestBy);

                    var parameterSet = GetEffectParameterSet(material, ref changedRenderRequest, ref changedRenderRequestBy);

                    var animation = GetModelAnimation(ref changedRenderRequest, ref changedRenderRequestBy);

                    if (animation != null)
                    {
                        animation.Apply(_model, _animationTracker.ElapsedMilliseconds / 1000f, 0.5f);

                        _renderRequest = _model.CreateRenderRequest(renderContext, effect, parameterSet, matrix);
                    }
                    else if (changedRenderRequest || _renderRequest == null)
                    {
                        _renderRequest = _model.CreateRenderRequest(renderContext, effect, parameterSet, matrix);
                    }

                    _lastWorldMatrix = matrix;

                    _renderBatcher.QueueRequest(
                        renderContext,
                        _renderRequest);
                }
                else
                {
                    _lastCachedModel = null;
                    _lastCachedDiffuseTexture = null;
                }
            }
        }
        public void Render(ComponentizedEntity entity, IGameContext gameContext, IRenderContext renderContext)
        {
            if (!Enabled)
            {
                return;
            }

            if (_physicsControllerConstraint != null && _physicalComponent.RigidBodies.Length > 0)
            {
                _debugRenderer.RenderDebugLine(
                    renderContext,
                    _physicalComponent.RigidBodies[0].Position.ToXNAVector(),
                    _physicalComponent.RigidBodies[0].Position.ToXNAVector() + TargetVelocity,
                    Color.Yellow,
                    Color.Yellow);
            }
        }
        public bool Handle(ComponentizedEntity componentizedEntity, IGameContext gameContext,
                           IEventEngine <IGameContext> eventEngine, Event @event)
        {
            if (!Enabled)
            {
                return(false);
            }

            var gamepadEvent = @event as GamePadEvent;
            var keyHeldEvent = @event as KeyHeldEvent;
            var mouseEvent   = @event as MouseEvent;

            if (gamepadEvent != null)
            {
                _firstPersonCameraComponent.Yaw -= gamepadEvent.GamePadState.ThumbSticks.Right.X *
                                                   ThumbstickLookSensitivity;
                _firstPersonCameraComponent.Pitch += gamepadEvent.GamePadState.ThumbSticks.Right.Y *
                                                     ThumbstickLookSensitivity;

                var limit = MathHelper.PiOver2 - MathHelper.ToRadians(5);
                _firstPersonCameraComponent.Pitch = MathHelper.Clamp(_firstPersonCameraComponent.Pitch, -limit, limit);

                var lookAt = _firstPersonCameraComponent.Transform.LocalMatrix;
                var relativeMovementVector = new Vector3(
                    gamepadEvent.GamePadState.ThumbSticks.Left.X * ThumbstickMoveSensitivity,
                    0f,
                    -gamepadEvent.GamePadState.ThumbSticks.Left.Y * ThumbstickMoveSensitivity);
                var absoluteMovementVector = Vector3.Transform(relativeMovementVector, lookAt);

                componentizedEntity.Transform.LocalPosition += absoluteMovementVector;

                return(true);
            }

            if (mouseEvent != null)
            {
                var centerX = gameContext.Window.ClientBounds.Width / 2;
                var centerY = gameContext.Window.ClientBounds.Height / 2;

                _firstPersonCameraComponent.Yaw   += (centerX - mouseEvent.MouseState.X) / 1000f;
                _firstPersonCameraComponent.Pitch += (centerY - mouseEvent.MouseState.Y) / 1000f;

                var limit = MathHelper.PiOver2 - MathHelper.ToRadians(5);
                _firstPersonCameraComponent.Pitch = MathHelper.Clamp(_firstPersonCameraComponent.Pitch, -limit, limit);

                Mouse.SetPosition(centerX, centerY);

                return(true);
            }

            if (keyHeldEvent != null)
            {
                var didConsume = false;
                var moveX      = 0;
                var moveZ      = 0;

                if (keyHeldEvent.Key == Keys.A)
                {
                    moveX      = -1;
                    didConsume = true;
                }
                if (keyHeldEvent.Key == Keys.D)
                {
                    moveX      = 1;
                    didConsume = true;
                }
                if (keyHeldEvent.Key == Keys.W)
                {
                    moveZ      = 1;
                    didConsume = true;
                }
                if (keyHeldEvent.Key == Keys.S)
                {
                    moveZ      = -1;
                    didConsume = true;
                }
                var lookAt = _firstPersonCameraComponent.Transform.LocalMatrix;
                var relativeMovementVector = new Vector3(
                    moveX * ThumbstickMoveSensitivity,
                    0f,
                    -moveZ * ThumbstickMoveSensitivity);
                var absoluteMovementVector = Vector3.Transform(relativeMovementVector, lookAt);

                componentizedEntity.Transform.LocalPosition += absoluteMovementVector;

                return(didConsume);
            }

            return(false);
        }
        public bool ReceiveMessage(ComponentizedEntity entity, IServerContext serverContext, IUpdateContext updateContext, MxDispatcher dispatcher, MxClient client, byte[] payload, uint protocolId)
        {
            if (!_enabled)
            {
                return(false);
            }

            if (_uniqueIdentifierForEntity == null)
            {
                return(false);
            }

            // See what kind of messages we accept, based on the client authority.
            switch (ClientAuthoritiveMode)
            {
            case ClientAuthoritiveMode.None:
                // We don't accept any client data about this entity, so ignore it.
                return(false);

            case ClientAuthoritiveMode.TrustClient:
            {
                // Check to see if the message is coming from a client that has authority.
                if (ClientOwnership != null && ClientOwnership != client.Group)
                {
                    // We don't trust this message.
                    return(false);
                }

                // We trust the client, so process this information like a client would.
                var propertyMessage = _networkMessageSerialization.Deserialize(payload) as EntityPropertiesMessage;

                if (propertyMessage == null || propertyMessage.EntityID != _uniqueIdentifierForEntity.Value)
                {
                    return(false);
                }

                // If the entity is a synchronised entity, collect properties of the synchronised object
                // directly.
                var synchronisedEntity = entity as ISynchronisedObject;
                if (synchronisedEntity != null)
                {
                    _synchronisationContext = synchronisedEntity;
                    _synchronisationContext.DeclareSynchronisedProperties(this);
                }

                // Iterate through all the components on the entity and get their synchronisation data as well.
                foreach (var synchronisedComponent in entity.Components.OfType <ISynchronisedObject>())
                {
                    _synchronisationContext = synchronisedComponent;
                    _synchronisationContext.DeclareSynchronisedProperties(this);
                }

                AssignMessageToSyncData(propertyMessage, _synchronisedData, client.Group);
                return(true);
            }

            case ClientAuthoritiveMode.ReplayInputs:
                // We don't implement this yet, but we don't want to allow client packets to cause
                // a server error, so silently consume it.
                return(false);
            }

            return(false);
        }
Пример #43
0
        public void Render(ComponentizedEntity entity, IGameContext gameContext, IRenderContext renderContext)
        {
            if (!Enabled)
            {
                return;
            }

            if (renderContext.IsCurrentRenderPass <I3DRenderPass>())
            {
                if (Effect == null)
                {
                    _useDefaultEffects = true;
                }
                else
                {
                    _useDefaultEffects = false;
                }

                if (_useDefaultEffects && _uberEffectAsset == null)
                {
                    _uberEffectAsset = _assetManager.Get <UberEffectAsset>("effect.BuiltinSurface");
                }

                if (Model != null)
                {
                    var matrix = FinalTransform.AbsoluteMatrix;

                    bool   changedRenderRequest   = _lastWorldMatrix != matrix;
                    string changedRenderRequestBy = changedRenderRequest ? "matrix" : "";

                    var material = OverrideMaterial ?? _model.Material;

                    UpdateCachedModel(material, ref changedRenderRequest, ref changedRenderRequestBy);

                    var effect = GetEffect(ref changedRenderRequest, ref changedRenderRequestBy);

                    var parameterSet = GetEffectParameterSet(material, ref changedRenderRequest, ref changedRenderRequestBy);

                    var animation = GetModelAnimation(ref changedRenderRequest, ref changedRenderRequestBy);

                    if (animation != null)
                    {
                        animation.Apply(_model, _animationTracker.ElapsedMilliseconds / 1000f, 0.5f);

                        _renderRequest = _model.CreateRenderRequest(renderContext, effect, parameterSet, matrix);
                    }
                    else if (changedRenderRequest || _renderRequest == null)
                    {
                        _renderRequest = _model.CreateRenderRequest(renderContext, effect, parameterSet, matrix);
                    }

                    _lastWorldMatrix = matrix;

                    _renderBatcher.QueueRequest(
                        renderContext,
                        _renderRequest);
                }
                else
                {
                    _lastCachedModel          = null;
                    _lastCachedDiffuseTexture = null;
                }
            }
        }