public void Perform() { _context.ScrollRequest = _context.AccumulatedScrollRequests; _context.AccumulatedScrollRequests = null; _context.ScreenshotRequest = _context.AccumulatedScreenshotRequests; _context.AccumulatedScreenshotRequests = null; _context.VideoCaptureRequest = _context.AccumulatedVideoCaptureRequests; _context.AccumulatedVideoCaptureRequests = null; _context.SelectionRequest = null; if (_states.Cell == null) { if (_context.TotalTime != 0.0) { _context.DisableControls(); } return; } if (_context.TotalTime != _states.EndSimTime) { _context.EnableControls(_states.EndSimTime); } _context.NormalizedTime = _states.CurrentSimTime / (_states.EndSimTime == 0.0 ? 1.0 : _states.EndSimTime); if (IsMouseOverRenderArea()) { MouseState mouseState = _devices.GetMouseState(); if (mouseState.LeftButtonPressed) { _context.SelectionRequest = (Object)true; } if (mouseState.RightButtonPressed) { _context.RenderArea.Cursor = Cursors.SizeAll; SlimDX.Vector3 up = _context.Camera.Up; SlimDX.Vector3 pos = _context.Camera.Position; SlimDX.Vector3 tmp = new SlimDX.Vector3(); float posLength = pos.Length(); //Scrolling if (posLength - 1e-1 > 0.001f * mouseState.DZ) { float coeff = 1.0f - 0.001f * mouseState.DZ / posLength; pos *= coeff; posLength = pos.Length(); } //DX tmp = SlimDX.Vector3.Cross(pos, up); tmp.Normalize(); pos -= tmp * mouseState.DX * 0.01f; pos.Normalize(); pos *= posLength; //DY tmp = SlimDX.Vector3.Cross(pos, up); pos += up * mouseState.DY * 0.01f; pos.Normalize(); pos *= posLength; up = -SlimDX.Vector3.Cross(pos, tmp); up.Normalize(); _context.Camera.Position = pos; _context.Camera.Up = up; } else { _context.RenderArea.Cursor = Cursors.Arrow; } } }
public override void Render() { SlimDX.Direct3D11.DepthStencilState oldDSState = DeviceManager.Instance.context.OutputMerger.DepthStencilState; SlimDX.Direct3D11.BlendState oldBlendState = DeviceManager.Instance.context.OutputMerger.BlendState; SlimDX.Direct3D11.RasterizerState oldRasterizerState = DeviceManager.Instance.context.Rasterizer.State; SlimDX.Direct3D11.VertexShader oldVertexShader = DeviceManager.Instance.context.VertexShader.Get(); SlimDX.Direct3D11.Buffer[] oldVSCBuffers = DeviceManager.Instance.context.VertexShader.GetConstantBuffers(0, 10); SlimDX.Direct3D11.PixelShader oldPixelShader = DeviceManager.Instance.context.PixelShader.Get(); SlimDX.Direct3D11.Buffer[] oldPSCBuffers = DeviceManager.Instance.context.PixelShader.GetConstantBuffers(0, 10); SlimDX.Direct3D11.ShaderResourceView[] oldShaderResources = DeviceManager.Instance.context.PixelShader.GetShaderResources(0, 10); SlimDX.Direct3D11.GeometryShader oldGeometryShader = DeviceManager.Instance.context.GeometryShader.Get(); base.Render(); DeviceManager.Instance.context.OutputMerger.DepthStencilState = oldDSState; DeviceManager.Instance.context.OutputMerger.BlendState = oldBlendState; DeviceManager.Instance.context.Rasterizer.State = oldRasterizerState; DeviceManager.Instance.context.VertexShader.Set(oldVertexShader); DeviceManager.Instance.context.VertexShader.SetConstantBuffers(oldVSCBuffers, 0, 10); DeviceManager.Instance.context.PixelShader.Set(oldPixelShader); DeviceManager.Instance.context.PixelShader.SetConstantBuffers(oldPSCBuffers, 0, 10); DeviceManager.Instance.context.PixelShader.SetShaderResources(oldShaderResources, 0, 10); DeviceManager.Instance.context.GeometryShader.Set(oldGeometryShader); foreach (RenderInstance instance in _renderInstances) { if (instance.Name == null) { continue; } SlimDX.Matrix world = instance.Transform; SlimDX.Matrix view = CameraManager.Instance.frameCamera.View; SlimDX.Matrix projection = CameraManager.Instance.frameCamera.Perspective; //SlimDX.Matrix viewProj = view * projection; SlimDX.Matrix worldViewProjection = world * view * projection; SlimDX.Direct3D11.Viewport vp = DeviceManager.Instance.context.Rasterizer.GetViewports()[0]; SlimDX.Vector3 position3D = SlimDX.Vector3.Project(SlimDX.Vector3.Zero, vp.X, vp.Y, vp.Width, vp.Height, vp.MinZ, vp.MaxZ, worldViewProjection); SlimDX.Vector2 position2D = new SlimDX.Vector2(position3D.X, position3D.Y); if (position3D.Z < vp.MaxZ) { SlimDX.Vector3 objPos = SlimDX.Vector3.Zero; objPos = SlimDX.Vector3.TransformCoordinate(objPos, instance.Transform); SlimDX.Vector3 camPos = CameraManager.Instance.frameCamera.eye; SlimDX.Vector3 objOffset = objPos - camPos; float scale = Math.Min(2.0f, 5.0f / (float)Math.Sqrt(Math.Max(1.0f, objOffset.Length()))); RenderManager.Instance.DrawString(instance.Name, position2D, 16 * scale, new SlimDX.Color4(1.0f, 1.0f, 1.0f)); } } DeviceManager.Instance.context.OutputMerger.DepthStencilState = oldDSState; DeviceManager.Instance.context.OutputMerger.BlendState = oldBlendState; DeviceManager.Instance.context.Rasterizer.State = oldRasterizerState; DeviceManager.Instance.context.VertexShader.Set(oldVertexShader); DeviceManager.Instance.context.VertexShader.SetConstantBuffers(oldVSCBuffers, 0, 10); DeviceManager.Instance.context.PixelShader.Set(oldPixelShader); DeviceManager.Instance.context.PixelShader.SetConstantBuffers(oldPSCBuffers, 0, 10); DeviceManager.Instance.context.PixelShader.SetShaderResources(oldShaderResources, 0, 10); DeviceManager.Instance.context.GeometryShader.Set(oldGeometryShader); }