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);
            }
        }
        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);
                        }
                    }
                }
            }
        }