Exemple #1
0
        protected override void UpdateInternal(GameTime gameTime) {
            base.UpdateInternal(gameTime);

            _timeStep = (float)gameTime.ElapsedGameTime.TotalSeconds;
            _gameTime = (float)gameTime.TotalGameTime.TotalSeconds;
            Age += _timeStep;
        }
Exemple #2
0
        protected override void DrawInternal(GameTime gameTime) {
            base.DrawInternal(gameTime);

            var camera = D3DApp11.I.Camera;
            var eyePos = camera.Position;
            var t = Matrix.Translation(eyePos);
            var wvp = t * camera.ViewProjectionMatrix;

            var skyFx = EffectManager11.Instance.GetEffect<SkyboxEffect11>();
            skyFx.SetWorldViewProj(wvp);
            skyFx.SetCubeMap(CubeMapSRV);

            var stride = VertPos.Stride;
            const int offset = 0;
            var context = D3DApp11.I.ImmediateContext;
            context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_vb, stride, offset));
            context.InputAssembler.SetIndexBuffer(_ib, Format.R32_UInt, 0);
            context.InputAssembler.InputLayout = InputLayouts.Pos;
            context.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
            var tech = skyFx.SkyTech;
            for (var p = 0; p < tech.Description.PassCount; p++) {
                using (var pass = tech.GetPassByIndex(p)) {
                    pass.Apply(context);
                    context.DrawIndexed(_indexCount, 0, 0);
                }
            }
        }
Exemple #3
0
 public void Update(GameTime gameTime) {
     if (!IsInitialized) {
         Initialize();
     }
     if (Enabled) {
         UpdateInternal(gameTime);
     }
 }
Exemple #4
0
        protected override void DrawInternal(GameTime gameTime) {
            var immediateContext = D3DApp11.I.ImmediateContext;

            // Clear views
            immediateContext.ClearDepthStencilView(_depthView, DepthStencilClearFlags.Depth, 1.0f, 0);
            immediateContext.ClearRenderTargetView(_renderView, Color.Black);

            base.DrawInternal(gameTime);
        }
Exemple #5
0
        protected override void UpdateInternal(GameTime gameTime) {
            base.UpdateInternal(gameTime);

            var camera = D3DApp11.I.Camera;
            var state = _keyboard.GetCurrentState();
            var d = (float)gameTime.ElapsedGameTime.TotalSeconds;
            const float distanceFactor = 3f;
            const float angleFactor = 0.1f;
            const float zoomFactor = 0.01f;

            if (state.IsPressed(Key.W)) {
                camera.Walk(d * distanceFactor);
            }
            if (state.IsPressed(Key.S)) {
                camera.Walk(-d * distanceFactor);
            }
            if (state.IsPressed(Key.A)) {
                camera.Strafe(-d * distanceFactor);
            }
            if (state.IsPressed(Key.D)) {
                camera.Strafe(d * distanceFactor);
            }
            if (state.IsPressed(Key.Right)) {
                camera.Yaw(d * angleFactor);
            }
            if (state.IsPressed(Key.Left)) {
                camera.Yaw(-d * angleFactor);
            }
            if (state.IsPressed(Key.Up)) {
                camera.Pitch(-d * angleFactor);
            }
            if (state.IsPressed(Key.Down)) {
                camera.Pitch(d * angleFactor);
            }
            if (state.IsPressed(Key.Equals) || state.IsPressed(Key.PageUp) || state.IsPressed(Key.Add)) {
                camera.Zoom(-d * zoomFactor);
            }
            if (state.IsPressed(Key.Subtract) || state.IsPressed(Key.PageDown) || state.IsPressed(Key.Minus)) {
                camera.Zoom(d * zoomFactor);
            }
        }
Exemple #6
0
        protected override void DrawInternal(GameTime gameTime) {
            var device = D3DApp11.I.D3DDevice;
            var context = D3DApp11.I.ImmediateContext;
            var camera = D3DApp11.I.Camera;
            var sky = D3DApp11.I.Skybox;
            var basicFx = EffectManager11.Instance.GetEffect<BasicEffect11>();
            var normalMapFx = EffectManager11.Instance.GetEffect<NormalMapEffect11>();
            var displacementMapFx = EffectManager11.Instance.GetEffect<DisplacementMapEffect11>();
            var depthStencilView = D3DApp11.I.RenderTarget.DepthStencilView;
            var renderTargetView = D3DApp11.I.RenderTarget.RenderTargetView;
            var viewport = D3DApp11.I.RenderTarget.Viewport;

            basicFx.SetShadowMap(null);
            normalMapFx.SetShadowMap(null);
            displacementMapFx.SetShadowMap(null);

            _shadowMap.BindDsvAndSetNullRenderTarget(context);

            DrawSceneToShadowMap(device);

            // 必须复原,避免加入法向贴图和粒子时错误渲染
            context.Rasterizer.State = null;
            context.OutputMerger.BlendState = null;
            if (_settings.DrawMode == DrawMode.Wireframe) {
                context.Rasterizer.State = RenderStates11.Instance.WireframeRS;
            }

            context.HullShader.Set(null);
            context.DomainShader.Set(null);
            context.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
            context.OutputMerger.SetTargets(depthStencilView, renderTargetView);
            context.Rasterizer.SetViewports(new RawViewportF[] { viewport });

            var view = camera.ViewMatrix;
            var proj = camera.ProjectionMatrix;

            basicFx.SetDirLights(_dirLights);
            basicFx.SetEyePosW(camera.Position);
            basicFx.SetCubeMap(_settings.IsReflectionEnabled ? sky.CubeMapSRV : null);
            basicFx.SetShadowMap(_settings.IsShadowEnabled ? _shadowMap.DepthMapSRV : null);

            normalMapFx.SetDirLights(_dirLights);
            normalMapFx.SetEyePosW(camera.Position);
            normalMapFx.SetCubeMap(_settings.IsReflectionEnabled ? sky.CubeMapSRV : null);
            normalMapFx.SetShadowMap(_settings.IsShadowEnabled ? _shadowMap.DepthMapSRV : null);

            displacementMapFx.SetDirLights(_dirLights);
            displacementMapFx.SetEyePosW(camera.Position);
            displacementMapFx.SetCubeMap(_settings.IsReflectionEnabled ? sky.CubeMapSRV : null);
            displacementMapFx.SetShadowMap(_settings.IsShadowEnabled ? _shadowMap.DepthMapSRV : null);
            displacementMapFx.SetMaxTessDistance(0.1f);
            displacementMapFx.SetMinTessDistance(0.05f);

            EffectTechnique activeNonReflectiveGeomTech = normalMapFx.Light3TexTech;
            EffectTechnique activeReflectiveGeomTech = basicFx.Light3TexReflectTech;
            EffectTechnique activeModelTech = basicFx.Light3TexReflectTech;

            UpdateTechniques(out activeNonReflectiveGeomTech, out activeReflectiveGeomTech, out activeModelTech);

            context.InputAssembler.InputLayout = InputLayouts.PosNormTexTan;

            RenderMode renderMode;
            switch (_settings.SurfaceMapping) {
                case SurfaceMapping.Simple:
                    renderMode = RenderMode.Basic;
                    break;
                case SurfaceMapping.NormalMapping:
                    renderMode = RenderMode.NormalMapped;
                    break;
                case SurfaceMapping.DisplacementMapping:
                    renderMode = RenderMode.DisplacementMapped;
                    break;
                default:
                    throw new ArgumentOutOfRangeException(nameof(_settings.SurfaceMapping));
            }

            for (var p = 0; p < activeNonReflectiveGeomTech.Description.PassCount; p++) {
                // draw grid
                var pass = activeNonReflectiveGeomTech.GetPassByIndex(p);
                _grid.ShadowTransform = _shadowTransform;
                _grid.Draw(context, pass, view, proj, renderMode);
                // draw box
                _box.ShadowTransform = _shadowTransform;
                _box.Draw(context, pass, view, proj, renderMode);

                // draw columns
                foreach (var cylinder in _cylinders) {
                    cylinder.ShadowTransform = _shadowTransform;
                    cylinder.Draw(context, pass, view, proj, renderMode);
                }
            }

            for (var p = 0; p < activeReflectiveGeomTech.Description.PassCount; p++) {
                var pass = activeReflectiveGeomTech.GetPassByIndex(p);
                foreach (var sphere in _spheres) {
                    sphere.ShadowTransform = _shadowTransform;
                    sphere.Draw(context, pass, view, proj, RenderMode.Basic);
                }
            }

            // MIC, decelerator
            for (var p = 0; p < activeModelTech.Description.PassCount; ++p) {
                if (_settings.IsDeceleratorVisible) {
                    _decelInstance.ShadowTransform = _shadowTransform;
                    _decelInstance.Draw(context, activeModelTech.GetPassByIndex(p), view, proj, RenderMode.Basic);
                }
                if (_settings.IsBarbecueBarVisible) {
                    _barbInstance.ShadowTransform = _shadowTransform;
                    _barbInstance.Draw(context, activeModelTech.GetPassByIndex(p), view, proj, RenderMode.Basic);
                }
                if (_settings.IsTruckVisible) {
                    _truckInstance.ShadowTransform = _shadowTransform;
                    _truckInstance.Draw(context, activeModelTech.GetPassByIndex(p), view, proj, RenderMode.Basic);
                }
                if (_settings.IsTireVisible) {
                    _tireInstance.ShadowTransform = _shadowTransform;
                    _tireInstance.Draw(context, activeModelTech.GetPassByIndex(p), view, proj, RenderMode.Basic);
                }
            }

            context.Rasterizer.State = null;

            if (_settings.QuadVisible) {
                DrawScreenQuad(device);
            }

            base.DrawInternal(gameTime);
        }
Exemple #7
0
        protected override void UpdateInternal(GameTime gameTime) {
            UpdateBufferedSettings();

            base.UpdateInternal(gameTime);

            if (_settings.AreLightsMoving) {
                _lightRotationAngle = 0.1f * (float)gameTime.TotalGameTime.TotalSeconds;
                var r = Matrix.RotationY(_lightRotationAngle);
                for (var i = 0; i < _dirLights.Length; i++) {
                    var lightDir = _originalLightDirs[i];
                    lightDir = Vector3.TransformNormal(lightDir, r);
                    _dirLights[i].Direction = lightDir;
                }
            }

            var camera = D3DApp11.I.Camera;
            _fire.EyePosW = camera.Position;
            _rain.EyePosW = camera.Position;
            _rain.EmitPosW = camera.Position;

            BuildShadowTransform();
        }
Exemple #8
0
        protected override void DrawInternal(GameTime gameTime) {
            base.DrawInternal(gameTime);

            var camera = D3DApp11.I.Camera;
            var context = D3DApp11.I.ImmediateContext;

            var vp = camera.ViewProjectionMatrix;

            // set shader variables
            _fx.SetViewProj(vp);
            _fx.SetGameTime(_gameTime);
            _fx.SetTimeStep(_timeStep);
            _fx.SetEyePosW(EyePosW);
            _fx.SetEmitPosW(EmitPosW);
            _fx.SetEmitDirW(EmitDirW);
            _fx.SetTexArray(_texArraySRV);
            _fx.SetRandomTex(_randomTexSRV);

            context.InputAssembler.InputLayout = InputLayouts.Particle;
            context.InputAssembler.PrimitiveTopology = PrimitiveTopology.PointList;

            var stride = Particle.Stride;
            const int offset = 0;

            // bind the input vertex buffer for the stream-out technique
            // use the _initVB when _firstRun = true
            context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_firstRun ? _initVB : _drawVB, stride, offset));
            // bind the stream-out vertex buffer
            context.StreamOutput.SetTargets(new[] { new StreamOutputBufferBinding(_streamOutVB, offset) });

            // draw the particles using the stream-out technique, which will update the particles positions
            // and output the resulting particles to the stream-out buffer
            var techDesc = _fx.StreamOutTech.Description;
            for (var p = 0; p < techDesc.PassCount; p++) {
                _fx.StreamOutTech.GetPassByIndex(p).Apply(context);
                if (_firstRun) {
                    context.Draw(1, 0);
                    _firstRun = false;
                } else {
                    // the _drawVB buffer was populated by the Stream-out technique, so we don't
                    // know how many vertices are contained within it.  Direct3D keeps track of this
                    // internally, however, and we can use DrawAuto to draw everything in the buffer.
                    context.DrawAuto();
                }
            }
            // Disable stream-out
            context.StreamOutput.SetTargets(null);

            // ping-pong the stream-out and draw buffers, since we will now want to draw the vertices
            // populated into the buffer that was bound to stream-out
            var temp = _drawVB;
            _drawVB = _streamOutVB;
            _streamOutVB = temp;

            // draw the particles using the draw technique that will transform the points to lines/quads
            context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_drawVB, stride, offset));
            techDesc = _fx.DrawTech.Description;
            for (var p = 0; p < techDesc.PassCount; p++) {
                _fx.DrawTech.GetPassByIndex(p).Apply(context);
                context.DrawAuto();
            }
        }
Exemple #9
0
 protected virtual void DrawInternal(GameTime gameTime) {
 }
Exemple #10
0
 protected virtual void UpdateInternal(GameTime gameTime) {
 }
Exemple #11
0
 public void Draw(GameTime gameTime) {
     if (Visible) {
         DrawInternal(gameTime);
     }
 }
Exemple #12
0
 private void Render() {
     if (!IsRunning) {
         return;
     }
     Timer.FrameTime = 1f / 60f;
     Timer.Tick();
     if (!IsPaused) {
         if (!ManualVSync || (Timer.TotalTime - _lastRenderSecond > Timer.FrameTime)) {
             if (_userResized) {
                 RaiseSurfaceInvalidated(this, EventArgs.Empty);
                 _userResized = false;
             }
             var gameTime = new GameTime(TimeSpan.FromSeconds(Timer.FrameTime), TimeSpan.FromSeconds(Timer.TotalTime));
             Update(gameTime);
             Render(gameTime);
             CalculateFps();
             _lastRenderSecond = Timer.TotalTime;
         }
     } else {
         Thread.Sleep(100);
     }
 }
Exemple #13
0
 protected override void UpdateInternal(GameTime gameTime) {
     base.UpdateInternal(gameTime);
     _camera.UpdateViewMatrix();
 }
Exemple #14
0
 protected abstract void Render(GameTime gameTime);
Exemple #15
0
 protected override void Render(GameTime gameTime) {
     Draw(gameTime);
     // Present!
     _swapChain.Present(0, PresentFlags.None);
 }