private bool IsInitialized() { ITransformable trans = Data[0] as ITransformable; CameraAttachable camera = Data[1] as CameraAttachable; return(trans != null && camera != null); }
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); }
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; }
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); } } } }
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 }; }