private bool IsInitialized()
        {
            ITransformable   trans  = Data[0] as ITransformable;
            CameraAttachable camera = Data[1] as CameraAttachable;

            return(trans != null && camera != null);
        }
Beispiel #2
0
        public void UnregisterSceneTree(SceneNode node)
        {
            Queue <SceneNode> knodes = new Queue <SceneNode>();

            knodes.Enqueue(node);

            while (knodes.Count != 0)
            {
                SceneNode head = knodes.Dequeue();

                _registeredNodes.Remove(head);

                foreach (var child in head.Children)
                {
                    knodes.Enqueue(child);
                }

                foreach (var attachable in head.Attachable)
                {
                    LightAttachable lightAttachable = attachable as LightAttachable;
                    if (lightAttachable != null)
                    {
                        _sceneLights.Remove(lightAttachable);
                    }

                    CameraAttachable cameraAttachable = attachable as CameraAttachable;
                    if (cameraAttachable != null)
                    {
                        _sceneCameras.Remove(cameraAttachable);
                    }
                }
            }

            SortByLayer();
        }
 public OrbitCameraController(ITransformable transformable, CameraAttachable camera)
 {
     Data = new List <object> {
         transformable, camera
     };
     _rotations.X = ( float )Math.PI / 2.0f;
 }
 public FreeCameraController(CameraAttachable camera)
 {
     Data = new List <object> {
         camera
     };
     _screen  = new Vector3(Platform.Instance.DeviceManager.PreferredBackBufferWidth, Platform.Instance.DeviceManager.PreferredBackBufferHeight, 0);
     _screen /= 2;
     _error   = new Vector2(_screen.X * 0.85f, _screen.Y * 0.85f);
     _error2  = new Vector2(_screen.X, _screen.Y);
 }
        private void UpdateParent()
        {
            CameraAttachable camera = Data[1] as CameraAttachable;

            Vector3 objective = GetObjectivePosition();

            Vector3 newPosition = objective + new Vector3(
                ( float )(Math.Cos(_rotations.X) * Math.Cos(_rotations.Y) * _distanceFromObject),
                ( float )(Math.Sin(_rotations.Y) * _distanceFromObject),
                ( float )(Math.Sin(_rotations.X) * Math.Cos(_rotations.Y) * _distanceFromObject));

            //Quaternion newRotation = Quaternion.CreateFromYawPitchRoll( _rotations.Y, _rotations.X, 0 );

            camera.Parent.SetPosition(newPosition);
            camera.LookingDirection = Vector3.Normalize(-newPosition + objective);
        }
        public void Update(GameTime dt)
        {
            CameraAttachable camera = Data[0] as CameraAttachable;

            bool ok = (camera != null);

            if (!ok)
            {
                return;
            }

            if (!Platform.Instance.Game.IsActive)
            {
                return;
            }

            var scrollEvent = Platform.Instance.Input.GetEvent <ScrollEvent>();

            if (scrollEvent != null && scrollEvent.Delta != 0)
            {
                if (Keyboard.GetState().IsKeyUp(Keys.C))
                {
                    camera.Parent.SetPosition(camera.Parent.GetPosition() - scrollEvent.Delta * Vector3.UnitZ);
                }
            }

            Vector3 relativePosition = new Vector3(Mouse.GetState().X, Mouse.GetState().Y, 0f);

            relativePosition -= _screen;

            if (Math.Abs(relativePosition.X) < _error.X && Math.Abs(relativePosition.Y) < _error.Y)
            {
                return;
            }
            if (Math.Abs(relativePosition.X) > _error2.X || Math.Abs(relativePosition.Y) > _error2.Y)
            {
                return;
            }

            relativePosition *= new Vector3(1f, -1f, 0f);
            relativePosition *= ( float )dt.ElapsedGameTime.TotalSeconds;

            Vector3 lookingPosition = camera.Parent.GetPosition() + relativePosition;

            camera.Parent.SetPosition(lookingPosition);
        }
Beispiel #7
0
        public void RegisterSceneTree(SceneNode node)
        {
            Queue <SceneNode> knodes = new Queue <SceneNode>();

            knodes.Enqueue(node);

            while (knodes.Count != 0)
            {
                SceneNode head = knodes.Dequeue();

                /* protect against multiple register */
                if (_registeredNodes.Contains(head))
                {
                    continue;
                }

                _registeredNodes.Add(head);

                foreach (var child in head.Children)
                {
                    knodes.Enqueue(child);
                }

                foreach (var attachable in head.Attachable)
                {
                    LightAttachable lightAttachable = attachable as LightAttachable;
                    if (lightAttachable != null)
                    {
                        _sceneLights.Add(lightAttachable);
                    }

                    CameraAttachable cameraAttachable = attachable as CameraAttachable;
                    if (cameraAttachable != null)
                    {
                        _sceneCameras.Add(cameraAttachable);
                    }
                }
            }
            SortByLayer();
        }
        public void Update(GameTime dt)
        {
            ITransformable   trans  = Data[0] as ITransformable;
            CameraAttachable camera = Data[1] as CameraAttachable;

            bool ok = (trans != null && camera != null);

            if (!ok)
            {
                return;
            }


            _delta = trans.GetPosition() - camera.Parent.GetPosition() + new Vector3(0, 130, 800);

            _delta /= 40;

            Vector3 lookingPosition  = camera.Parent.GetPosition() + _delta;
            Vector3 lookingDirection = Vector3.Normalize(-lookingPosition + trans.GetPosition());

            camera.Parent.SetPosition(lookingPosition);
            //camera.Value.LookingDirection = lookingDirection;
        }
Beispiel #9
0
        private void DrawDepth(float dt)
        {
            if (_sceneCameras.Count == 0)
            {
                return;
            }

            DepthStencilState depthState = new DepthStencilState();

            depthState.DepthBufferEnable      = true;        /* Enable the depth buffer */
            depthState.DepthBufferWriteEnable = true;        /* When drawing to the screen, write to the depth buffer */
            depthState.DepthBufferFunction    = CompareFunction.Less;


            Platform.Instance.Device.BlendState        = BlendState.Opaque;
            Platform.Instance.Device.DepthStencilState = depthState;
            Platform.Instance.Device.RasterizerState   = RasterizerState.CullCounterClockwise;

            CameraAttachable currentCam = _sceneCameras[0];

            Renderer.Instance.LoadMatrix(EMatrix.Projection, currentCam.GetPerspectiveMatrix());
            Renderer.Instance.LoadMatrix(EMatrix.View, currentCam.GetViewMatrix());

            foreach (var registeredNode in _registeredNodes)
            {
                Renderer.Instance.LoadMatrix(EMatrix.World, registeredNode.GetAbsoluteTransformation());
                if (currentCam.GetFrustum().Contains(registeredNode.GetTransformedBoundingBox()) != ContainmentType.Disjoint && !registeredNode.Invisible && registeredNode.DrawsDepth)
                {
                    Renderer.Instance.SetParameter("matWorldViewProj", Renderer.Instance.MatWorldViewProjection);
                    foreach (var attachable in registeredNode.Attachable)
                    {
                        attachable.RenderDepth(dt);
                    }
                }
            }
        }
Beispiel #10
0
        private void DrawScene(float dt)
        {
            if ((StateManager.Instance.CurrentGameState as BaseMenuGameState) != null)
            {
                Quad     scquad = GetScreenQuad();
                Material blur   = Renderer.Instance.GetBlurMaterial();


                blur.SetParameter("matWorldViewProj", Matrix.Identity);
                blur.SetParameter("ColorMap", MenuBackgroundTexture);
                blur.SetParameter("blurDistance", 0.01f);

                scquad.Draw(blur);
            }

            if (_sceneCameras.Count == 0)
            {
                return;
            }

            Platform.Instance.Device.BlendState      = new BlendState();
            Platform.Instance.Device.RasterizerState = RasterizerState.CullCounterClockwise;

            CameraAttachable currentCam = _sceneCameras[0];

            Renderer.Instance.LoadMatrix(EMatrix.Projection, currentCam.GetPerspectiveMatrix());
            Renderer.Instance.LoadMatrix(EMatrix.View, currentCam.GetViewMatrix());

            Renderer.Instance.SetParameter("eyePosition", currentCam.Parent.GetPosition());
            Renderer.Instance.SetParameter("lightPosition", _lightPosition);
            int culledCount = 0;

            foreach (var registeredNode in _registeredNodes)
            {
                Renderer.Instance.LoadMatrix(EMatrix.World, registeredNode.GetAbsoluteTransformation());
                if (currentCam.GetFrustum().Contains(registeredNode.GetTransformedBoundingBox()) != ContainmentType.Disjoint && !registeredNode.Invisible)
                {
                    Renderer.Instance.SetParameter("matWorld", Renderer.Instance.MatWorld);
                    Renderer.Instance.SetParameter("matWorldInverseTranspose", Renderer.Instance.MatWorldInverseTranspose);
                    Renderer.Instance.SetParameter("matWorldViewProj", Renderer.Instance.MatWorldViewProjection);

                    foreach (var attachable in registeredNode.Attachable)
                    {
                        attachable.Render(dt);
                    }
                }
                else
                {
                    culledCount++;
                }
            }


            if (ShowDebugInfo)
            {
                string toShow = culledCount.ToString() + " objects culled out of " + _registeredNodes.Count + " objects\nFPS: " + (1000f / dt).ToString();

                if (_hint == null)
                {
                    _hint = HintManager.Instance.SpawnHint(toShow, new Vector2(600, 20), 200f, 2000f);
                }
                else
                {
                    _hint.Text = toShow;
                    HintManager.Instance.SpawnHint(_hint);
                }
            }

            if (!UsePostDraw)
            {
                return;
            }
            //post render
            foreach (var registeredNode in _registeredNodes)
            {
                Renderer.Instance.LoadMatrix(EMatrix.World, registeredNode.GetAbsoluteTransformation());
                if (currentCam.GetFrustum().Contains(registeredNode.GetTransformedBoundingBox()) != ContainmentType.Disjoint && !registeredNode.Invisible)
                {
                    Renderer.Instance.SetParameter("matWorld", Renderer.Instance.MatWorld);
                    Renderer.Instance.SetParameter("matWorldInverseTranspose", Renderer.Instance.MatWorldInverseTranspose);
                    Renderer.Instance.SetParameter("matWorldViewProj", Renderer.Instance.MatWorldViewProjection);


                    foreach (var attachable in registeredNode.Attachable)
                    {
                        attachable.PostRender(dt);
                    }
                }
            }
        }
 public CameraController(ITransformable transformable, CameraAttachable camera)
 {
     Data = new List <object> {
         transformable, camera
     };
 }