Ejemplo n.º 1
0
        public override void UpdateScene(float dt)
        {
            base.UpdateScene(dt);
            if (Util.IsKeyDown(Keys.Up))
            {
                _camera.Walk(10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.Down))
            {
                _camera.Walk(-10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.Left))
            {
                _camera.Strafe(-10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.Right))
            {
                _camera.Strafe(10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.PageUp))
            {
                _camera.Zoom(-dt);
            }
            if (Util.IsKeyDown(Keys.PageDown))
            {
                _camera.Zoom(+dt);
            }

            _camera.UpdateViewMatrix();
        }
Ejemplo n.º 2
0
        public override void DrawScene()
        {
            ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.White);
            ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);

            ImmediateContext.InputAssembler.InputLayout       = InputLayouts.PosColor;
            ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
            _camera.UpdateViewMatrix();

            Matrix view     = _camera.View;
            Matrix proj     = _camera.Proj;
            Matrix viewProj = _camera.ViewProj;

            Effects.ColorFX.SetWorldViewProj(viewProj);

            ImmediateContext.Rasterizer.State = RenderStates.NoCullRS;

            if (Util.IsKeyDown(Keys.W))
            {
                ImmediateContext.Rasterizer.State = RenderStates.WireframeRS;
            }
            ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_mapVB, VertexPC.Stride, 0));

            for (int p = 0; p < Effects.ColorFX.ColorTech.Description.PassCount; p++)
            {
                var pass = Effects.ColorFX.ColorTech.GetPassByIndex(p);
                pass.Apply(ImmediateContext);
                ImmediateContext.Draw(_mapVertCount, 0);
            }
            ImmediateContext.Rasterizer.State = null;



            SwapChain.Present(0, PresentFlags.None);
        }
Ejemplo n.º 3
0
        public override void DrawScene()
        {
            base.DrawScene();
            ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.Black);
            ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth, 1.0f, 0);

            ImmediateContext.InputAssembler.InputLayout       = _layout;
            ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;

            _camera.UpdateViewMatrix();

            var view = _camera.View;
            var proj = _camera.Proj;

            // doesn't seem to be much benefit here
            // 550 fps avg with depth pre-pass
            // 775 fps avg without
            //DepthPrePass();
            ForwardSetup();

            ImmediateContext.OutputMerger.DepthStencilState = RenderStates.LessEqualDSS;

            var activeTech = _effect.Directional;

            for (var p = 0; p < activeTech.Description.PassCount; p++)
            {
                var pass = activeTech.GetPassByIndex(p);
                _bunnyInstance.Draw(ImmediateContext, pass, view, proj, DrawDirectional);
            }

            SwapChain.Present(0, PresentFlags.None);
        }
Ejemplo n.º 4
0
        public override void DrawScene()
        {
            base.DrawScene();
            ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.CornflowerBlue);
            ImmediateContext.ClearDepthStencilView(
                DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);

            ImmediateContext.InputAssembler.InputLayout       = InputLayouts.PosNormalTexTan;
            ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;

            _camera.UpdateViewMatrix();
            var viewProj = _camera.ViewProj;
            var view     = _camera.View;
            var proj     = _camera.Proj;

            Effects.NormalMapFX.SetDirLights(_dirLights);
            Effects.NormalMapFX.SetEyePosW(_camera.Position);

            var activeTech = Effects.NormalMapFX.Light3TexTech;

            for (var p = 0; p < activeTech.Description.PassCount; p++)
            {
                var pass = activeTech.GetPassByIndex(p);
                _modelInstance.Draw(ImmediateContext, pass, view, proj);
                _stoneInstance.Draw(ImmediateContext, pass, view, proj);
                _dwarfInstance.Draw(ImmediateContext, pass, view, proj);
            }

            SwapChain.Present(0, PresentFlags.None);
        }
Ejemplo n.º 5
0
        public override void DrawScene()
        {
            base.DrawScene();
            ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.Silver);
            ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);

            ImmediateContext.InputAssembler.InputLayout       = InputLayouts.Basic32;
            ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;

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

            _cam.UpdateViewMatrix();


            var viewProj = _cam.ViewProj;

            Effects.BasicFX.SetDirLights(_dirLights);
            Effects.BasicFX.SetEyePosW(_cam.Position);

            var activeTech = Effects.BasicFX.Light3Tech;

            for (int p = 0; p < activeTech.Description.PassCount; p++)
            {
                if (Util.IsKeyDown(Keys.D1))
                {
                    ImmediateContext.Rasterizer.State = RenderStates.WireframeRS;
                }
                ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_meshVB, stride, offset));
                ImmediateContext.InputAssembler.SetIndexBuffer(_meshIB, Format.R32_UInt, 0);

                var world = _meshWorld;
                var wit   = MathF.InverseTranspose(world);
                var wvp   = world * viewProj;

                Effects.BasicFX.SetWorld(world);
                Effects.BasicFX.SetWorldInvTranspose(wit);
                Effects.BasicFX.SetWorldViewProj(wvp);
                Effects.BasicFX.SetMaterial(_meshMat);

                var pass = activeTech.GetPassByIndex(p);
                pass.Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(_meshIndexCount, 0, 0);
                ImmediateContext.Rasterizer.State = null;

                if (_pickedTriangle >= 0)
                {
                    ImmediateContext.OutputMerger.DepthStencilState     = RenderStates.LessEqualDSS;
                    ImmediateContext.OutputMerger.DepthStencilReference = 0;

                    Effects.BasicFX.SetMaterial(_pickedTriangleMat);
                    pass.Apply(ImmediateContext);
                    ImmediateContext.DrawIndexed(3, 3 * _pickedTriangle, 0);

                    ImmediateContext.OutputMerger.DepthStencilState = null;
                }
            }
            SwapChain.Present(0, PresentFlags.None);
        }
Ejemplo n.º 6
0
        public override void UpdateScene(float dt)
        {
            base.UpdateScene(dt);
            if (Util.IsKeyDown(Keys.Up))
            {
                _camera.Walk(10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.Down))
            {
                _camera.Walk(-10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.Left))
            {
                _camera.Strafe(-10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.Right))
            {
                _camera.Strafe(10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.PageUp))
            {
                _camera.Zoom(-dt * 10.0f);
            }
            if (Util.IsKeyDown(Keys.PageDown))
            {
                _camera.Zoom(+dt * 10.0f);
            }
            if (Util.IsKeyDown(Keys.D1))
            {
                _camWalkMode = true;
            }
            if (Util.IsKeyDown(Keys.D2))
            {
                _camWalkMode = false;
            }
            if (_camWalkMode)
            {
                var camPos = _camera.Position;
                var y      = _terrain.Height(camPos.X, camPos.Z);
                _camera.Position = new Vector3(camPos.X, y + 2.0f, camPos.Z);
            }

            if (Util.IsKeyDown(Keys.R))
            {
                _fire.Reset();
                _rain.Reset();
            }

            _fire.Update(dt, Timer.TotalTime);
            _rain.Update(dt, Timer.TotalTime);

            _camera.UpdateViewMatrix();
        }
Ejemplo n.º 7
0
        public override void DrawScene()
        {
            base.DrawScene();
            ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.Black);
            ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth, 1.0f, 0);

            ImmediateContext.InputAssembler.InputLayout       = _layout;
            ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;

            _camera.UpdateViewMatrix();

            var view = _camera.View;
            var proj = _camera.Proj;

            // directional lighting
            ImmediateContext.OutputMerger.DepthStencilState = RenderStates.LessEqualDSS;
            ForwardSetup();

            var activeTech = _effect.Directional;

            for (var p = 0; p < activeTech.Description.PassCount; p++)
            {
                var pass = activeTech.GetPassByIndex(p);
                _bunnyInstance.Draw(ImmediateContext, pass, view, proj, DrawDirectional);
            }

            // point lights
            var prevBlend = ImmediateContext.OutputMerger.BlendState;

            ImmediateContext.OutputMerger.BlendState = _additiveBlend;
            for (int i = 0; i < NumLights; i++)
            {
                PointSetup(i);
                activeTech = _effect.PointLight;
                for (var p = 0; p < activeTech.Description.PassCount; p++)
                {
                    var pass = activeTech.GetPassByIndex(p);
                    _bunnyInstance.Draw(ImmediateContext, pass, view, proj, DrawPoint);
                }
            }


            ImmediateContext.OutputMerger.BlendState = prevBlend;
            SwapChain.Present(0, PresentFlags.None);
        }
Ejemplo n.º 8
0
        public override void UpdateScene(float dt)
        {
            base.UpdateScene(dt);
            if (Util.IsKeyDown(Keys.Up))
            {
                _camera.Walk(10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.Down))
            {
                _camera.Walk(-10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.Left))
            {
                _camera.Strafe(-10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.Right))
            {
                _camera.Strafe(10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.PageUp))
            {
                _camera.Zoom(-dt);
            }
            if (Util.IsKeyDown(Keys.PageDown))
            {
                _camera.Zoom(+dt);
            }

            _lightRotationAngle += 0.1f * dt;

            var r = Matrix.RotationY(_lightRotationAngle);

            for (var i = 0; i < 3; i++)
            {
                var lightDir = _originalLightDirs[i];
                lightDir = Vector3.TransformNormal(lightDir, r);
                _dirLights[i].Direction = lightDir;
            }

            BuildShadowTransform();
            _camera.UpdateViewMatrix();
        }
Ejemplo n.º 9
0
        public override void UpdateScene(float dt)
        {
            base.UpdateScene(dt);

            // Get camera position from polar coords
            var x = radius * MathF.Sin(phi) * MathF.Cos(theta);
            var z = radius * MathF.Sin(phi) * MathF.Sin(theta);
            var y = radius * MathF.Cos(phi);

            // Build the view matrix
            var pos    = new Vector3(x, y, z);
            var target = new Vector3(0);
            var up     = new Vector3(0, 1, 0);

            view = Matrix.LookAtLH(pos, target, up);

            eyePosW = pos;

            foreach (ShapeBase sb in shapes)
            {
                if (sb is AnimatedShape)
                {
                    AnimatedShape shape = (AnimatedShape)sb;

                    if (shape.Bouncing)
                    {
                        shape.Bounce(shape.BounceFloor, shape.BounceCeiling);
                    }

                    if (shape.BounceTranslate)
                    {
                        shape.BounceAndTranslate(shape.BounceFloor, shape.BounceCeiling, shape.TranslateTarget);
                    }
                }

                camera.UpdateViewMatrix();
            }
        }
Ejemplo n.º 10
0
        public bool Update(Vector3 position, Vector3 direction, float range, float angle)
        {
            var result = _dirty;

            _dirty = false;

            if (result || _camera.FovY != angle || _camera.FarZ != range)
            {
                _camera.FovY = angle;
                _camera.FarZ = range;
                _camera.SetLens(1f);
                result = true;
            }

            if (result || _camera.Position != position || Vector3.Dot(_camera.Look, direction) < 0.99)
            {
                _camera.LookAt(position, position + direction,
                               Math.Abs(direction.Y - 1f) < 0.01f || Math.Abs(direction.Y - (-1f)) < 0.01f ? Vector3.UnitX : Vector3.UnitY);
                _camera.UpdateViewMatrix();
                result = true;
            }

            if (result)
            {
                ShadowTransform = _camera.ViewProj * new Matrix {
                    M11 = 0.5f,
                    M22 = -0.5f,
                    M33 = 1.0f,
                    M41 = 0.5f,
                    M42 = 0.5f,
                    M44 = 1.0f
                };
            }

            return(result);
        }
Ejemplo n.º 11
0
        public override void UpdateScene(float dt)
        {
            base.UpdateScene(dt);
            if (Util.IsKeyDown(Keys.Up))
            {
                _camera.Walk(10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.Down))
            {
                _camera.Walk(-10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.Left))
            {
                _camera.Strafe(-10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.Right))
            {
                _camera.Strafe(10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.PageUp))
            {
                _camera.Zoom(-dt);
            }
            if (Util.IsKeyDown(Keys.PageDown))
            {
                _camera.Zoom(+dt);
            }
            var skullScale        = Matrix.Scaling(0.2f, 0.2f, 0.2f);
            var skullOffset       = Matrix.Translation(3, 2, 0);
            var skullLocalRotate  = Matrix.RotationY(2.0f * Timer.TotalTime);
            var skullGlobalRotate = Matrix.RotationY(0.5f * Timer.TotalTime);

            _skullWorld = skullScale * skullLocalRotate * skullOffset * skullGlobalRotate;

            _camera.UpdateViewMatrix();
        }
Ejemplo n.º 12
0
        public override void UpdateScene(float dt)
        {
            base.UpdateScene(dt);
            if (Util.IsKeyDown(Keys.Up))
            {
                _cam.Walk(10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.Down))
            {
                _cam.Walk(-10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.Left))
            {
                _cam.Strafe(-10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.Right))
            {
                _cam.Strafe(10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.D1))
            {
                _frustumCullingEnabled = true;
            }
            if (Util.IsKeyDown(Keys.D2))
            {
                _frustumCullingEnabled = false;
            }
            if (Util.IsKeyDown(Keys.U))
            {
                _instancing = false;
            }
            if (Util.IsKeyDown(Keys.I))
            {
                _instancing = true;
            }
            if (Util.IsKeyDown(Keys.B))
            {
                _skullsOrBoxes = false;
            }
            if (Util.IsKeyDown(Keys.S))
            {
                _skullsOrBoxes = true;
            }
            _cam.UpdateViewMatrix();
            _visibleObjectCount = 0;
            if (_frustumCullingEnabled)
            {
                var db = ImmediateContext.MapSubresource(_instanceBuffer, MapMode.WriteDiscard, MapFlags.None);

                foreach (var instancedData in _instancedData)
                {
                    var w   = instancedData.World;
                    var box = new BoundingBox(
                        Vector3.TransformCoordinate(_skullBox.Minimum, w),
                        Vector3.TransformCoordinate(_skullBox.Maximum, w)
                        );

                    if (_cam.Visible(box))
                    {
                        db.Data.Write(instancedData);
                        _visibleObjectCount++;
                    }
                }

                ImmediateContext.UnmapSubresource(_instanceBuffer, 0);
            }
            else
            {
                var db = ImmediateContext.MapSubresource(_instanceBuffer, MapMode.WriteDiscard, MapFlags.None);
                foreach (var instancedData in _instancedData)
                {
                    db.Data.Write(instancedData);
                    _visibleObjectCount++;
                }

                ImmediateContext.UnmapSubresource(_instanceBuffer, 0);
            }
            MainWindowCaption = String.Format("Instancing and Culling Demo    {0} objects visible out of {1}", _visibleObjectCount, _instancedData.Count);
        }
Ejemplo n.º 13
0
        public override void DrawScene()
        {
            ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.Silver);
            ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);

            ImmediateContext.InputAssembler.InputLayout       = InputLayouts.Basic32;
            ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
            Matrix view;
            Matrix proj;
            Matrix viewProj;

            if (_useFpsCamera)
            {
                _cam.UpdateViewMatrix();

                view     = _cam.View;
                proj     = _cam.Proj;
                viewProj = _cam.ViewProj;
                Effects.BasicFX.SetEyePosW(_cam.Position);
            }
            else
            {
                _cam2.UpdateViewMatrix();

                view     = _cam2.View;
                proj     = _cam2.Proj;
                viewProj = _cam2.ViewProj;
                Effects.BasicFX.SetEyePosW(_cam2.Position);
            }

            Effects.BasicFX.SetDirLights(_dirLights);


            var activeTexTech   = Effects.BasicFX.Light1TexTech;
            var activeSkullTech = Effects.BasicFX.Light1Tech;

            switch (_lightCount)
            {
            case 1:
                activeTexTech   = Effects.BasicFX.Light1TexTech;
                activeSkullTech = Effects.BasicFX.Light1Tech;
                break;

            case 2:
                activeTexTech   = Effects.BasicFX.Light2TexTech;
                activeSkullTech = Effects.BasicFX.Light2Tech;
                break;

            case 3:
                activeTexTech   = Effects.BasicFX.Light3TexTech;
                activeSkullTech = Effects.BasicFX.Light3Tech;
                break;
            }
            for (var p = 0; p < activeTexTech.Description.PassCount; p++)
            {
                var pass = activeTexTech.GetPassByIndex(p);
                ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_shapesVB, Basic32.Stride, 0));
                ImmediateContext.InputAssembler.SetIndexBuffer(_shapesIB, Format.R32_UInt, 0);

                var world             = _gridWorld;
                var worldInvTranspose = MathF.InverseTranspose(world);
                var wvp = world * view * proj;
                Effects.BasicFX.SetWorld(world);
                Effects.BasicFX.SetWorldInvTranspose(worldInvTranspose);
                Effects.BasicFX.SetWorldViewProj(wvp);
                Effects.BasicFX.SetTexTransform(Matrix.Scaling(6, 8, 1));
                Effects.BasicFX.SetMaterial(_gridMat);
                Effects.BasicFX.SetDiffuseMap(_floorTexSRV);
                pass.Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(_gridIndexCount, _gridIndexOffset, _gridVertexOffset);

                world             = _boxWorld;
                worldInvTranspose = MathF.InverseTranspose(world);
                wvp = world * viewProj;
                Effects.BasicFX.SetWorld(world);
                Effects.BasicFX.SetWorldInvTranspose(worldInvTranspose);
                Effects.BasicFX.SetWorldViewProj(wvp);
                Effects.BasicFX.SetTexTransform(Matrix.Identity);
                Effects.BasicFX.SetMaterial(_boxMat);
                Effects.BasicFX.SetDiffuseMap(_stoneTexSRV);
                pass.Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(_boxIndexCount, _boxIndexOffset, _boxVertexOffset);

                foreach (var matrix in _cylWorld)
                {
                    world             = matrix;
                    worldInvTranspose = MathF.InverseTranspose(world);
                    wvp = world * viewProj;
                    Effects.BasicFX.SetWorld(world);
                    Effects.BasicFX.SetWorldInvTranspose(worldInvTranspose);
                    Effects.BasicFX.SetWorldViewProj(wvp);
                    Effects.BasicFX.SetTexTransform(Matrix.Identity);
                    Effects.BasicFX.SetMaterial(_cylinderMat);
                    Effects.BasicFX.SetDiffuseMap(_brickTexSRV);
                    pass.Apply(ImmediateContext);
                    ImmediateContext.DrawIndexed(_cylinderIndexCount, _cylinderIndexOffset, _cylinderVertexOffset);
                }
                foreach (var matrix in _sphereWorld)
                {
                    world             = matrix;
                    worldInvTranspose = MathF.InverseTranspose(world);
                    wvp = world * viewProj;
                    Effects.BasicFX.SetWorld(world);
                    Effects.BasicFX.SetWorldInvTranspose(worldInvTranspose);
                    Effects.BasicFX.SetWorldViewProj(wvp);
                    Effects.BasicFX.SetTexTransform(Matrix.Identity);
                    Effects.BasicFX.SetMaterial(_sphereMat);
                    Effects.BasicFX.SetDiffuseMap(_stoneTexSRV);
                    pass.Apply(ImmediateContext);
                    ImmediateContext.DrawIndexed(_sphereIndexCount, _sphereIndexOffset, _sphereVertexOffset);
                }
            }
            for (int p = 0; p < activeSkullTech.Description.PassCount; p++)
            {
                var pass = activeSkullTech.GetPassByIndex(p);
                ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_skullVB, Basic32.Stride, 0));
                ImmediateContext.InputAssembler.SetIndexBuffer(_skullIB, Format.R32_UInt, 0);

                var world             = _skullWorld;
                var worldInvTranspose = MathF.InverseTranspose(world);
                var wvp = world * viewProj;
                Effects.BasicFX.SetWorld(world);
                Effects.BasicFX.SetWorldInvTranspose(worldInvTranspose);
                Effects.BasicFX.SetWorldViewProj(wvp);
                Effects.BasicFX.SetMaterial(_skullMat);
                pass.Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0);
            }
            SwapChain.Present(0, PresentFlags.None);
        }
Ejemplo n.º 14
0
        public override void DrawScene()
        {
            base.DrawScene();

            ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.Silver);
            ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);

            _camera.UpdateViewMatrix();

            var view     = _camera.View;
            var proj     = _camera.Proj;
            var viewProj = _camera.ViewProj;

            var blendFactor = new Color4(0, 0, 0, 0);

            Effects.BasicFX.SetDirLights(_dirLights);
            Effects.BasicFX.SetEyePosW(_camera.Position);
            Effects.BasicFX.SetCubeMap(_sky.CubeMapSRV);

            Effects.NormalMapFX.SetDirLights(_dirLights);
            Effects.NormalMapFX.SetEyePosW(_camera.Position);
            Effects.NormalMapFX.SetCubeMap(_sky.CubeMapSRV);

            Effects.DisplacementMapFX.SetDirLights(_dirLights);
            Effects.DisplacementMapFX.SetEyePosW(_camera.Position);
            Effects.DisplacementMapFX.SetCubeMap(_sky.CubeMapSRV);

            Effects.DisplacementMapFX.SetHeightScale(0.05f);
            Effects.DisplacementMapFX.SetMaxTessDistance(1.0f);
            Effects.DisplacementMapFX.SetMinTessDistance(25.0f);
            Effects.DisplacementMapFX.SetMinTessFactor(1.0f);
            Effects.DisplacementMapFX.SetMaxTessFactor(5.0f);

            var activeTech       = Effects.DisplacementMapFX.Light3Tech;
            var activeSphereTech = Effects.BasicFX.Light3ReflectTech;
            var activeSkullTech  = Effects.BasicFX.Light3ReflectTech;

            switch (_renderOptions)
            {
            case RenderOptions.Basic:
                activeTech = Effects.BasicFX.Light3TexTech;
                ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
                break;

            case RenderOptions.NormalMap:
                activeTech = Effects.NormalMapFX.Light3TexTech;
                ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
                break;

            case RenderOptions.DisplacementMap:
                activeTech = Effects.DisplacementMapFX.Light3TexTech;
                ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.PatchListWith3ControlPoints;
                break;
            }
            var stride = PosNormalTexTan.Stride;
            var offset = 0;

            ImmediateContext.InputAssembler.InputLayout = InputLayouts.PosNormalTexTan;
            ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_shapesVB, stride, offset));
            ImmediateContext.InputAssembler.SetIndexBuffer(_shapesIB, Format.R32_UInt, 0);

            if (Util.IsKeyDown(Keys.W))
            {
                ImmediateContext.Rasterizer.State = RenderStates.WireframeRS;
            }
            for (int p = 0; p < activeTech.Description.PassCount; p++)
            {
                var world = _gridWorld;
                var wit   = MathF.InverseTranspose(world);
                var wvp   = world * viewProj;

                switch (_renderOptions)
                {
                case RenderOptions.Basic:
                    Effects.BasicFX.SetWorld(world);
                    Effects.BasicFX.SetWorldInvTranspose(wit);
                    Effects.BasicFX.SetWorldViewProj(wvp);
                    Effects.BasicFX.SetTexTransform(Matrix.Scaling(8, 10, 1));
                    Effects.BasicFX.SetMaterial(_gridMat);
                    Effects.BasicFX.SetDiffuseMap(_stoneTexSRV);
                    break;

                case RenderOptions.NormalMap:
                    Effects.NormalMapFX.SetWorld(world);
                    Effects.NormalMapFX.SetWorldInvTranspose(wit);
                    Effects.NormalMapFX.SetWorldViewProj(wvp);
                    Effects.NormalMapFX.SetTexTransform(Matrix.Scaling(8, 10, 1));
                    Effects.NormalMapFX.SetMaterial(_gridMat);
                    Effects.NormalMapFX.SetDiffuseMap(_stoneTexSRV);
                    Effects.NormalMapFX.SetNormalMap(_stoneNormalTexSRV);
                    break;

                case RenderOptions.DisplacementMap:
                    Effects.DisplacementMapFX.SetWorld(world);
                    Effects.DisplacementMapFX.SetWorldInvTranspose(wit);
                    Effects.DisplacementMapFX.SetViewProj(viewProj);
                    Effects.DisplacementMapFX.SetWorldViewProj(wvp);
                    Effects.DisplacementMapFX.SetTexTransform(Matrix.Scaling(8, 10, 1));
                    Effects.DisplacementMapFX.SetMaterial(_gridMat);
                    Effects.DisplacementMapFX.SetDiffuseMap(_stoneTexSRV);
                    Effects.DisplacementMapFX.SetNormalMap(_stoneNormalTexSRV);
                    break;
                }
                var pass = activeTech.GetPassByIndex(p);
                pass.Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(_gridIndexCount, _gridIndexOffset, _gridVertexOffset);

                world = _boxWorld;
                wit   = MathF.InverseTranspose(world);
                wvp   = world * viewProj;

                switch (_renderOptions)
                {
                case RenderOptions.Basic:
                    Effects.BasicFX.SetWorld(world);
                    Effects.BasicFX.SetWorldInvTranspose(wit);
                    Effects.BasicFX.SetWorldViewProj(wvp);
                    Effects.BasicFX.SetTexTransform(Matrix.Scaling(2, 1, 1));
                    Effects.BasicFX.SetMaterial(_boxMat);
                    Effects.BasicFX.SetDiffuseMap(_brickTexSRV);
                    break;

                case RenderOptions.NormalMap:
                    Effects.NormalMapFX.SetWorld(world);
                    Effects.NormalMapFX.SetWorldInvTranspose(wit);
                    Effects.NormalMapFX.SetWorldViewProj(wvp);
                    Effects.NormalMapFX.SetTexTransform(Matrix.Scaling(2, 1, 1));
                    Effects.NormalMapFX.SetMaterial(_boxMat);
                    Effects.NormalMapFX.SetDiffuseMap(_brickTexSRV);
                    Effects.NormalMapFX.SetNormalMap(_brickNormalTexSRV);
                    break;

                case RenderOptions.DisplacementMap:
                    Effects.DisplacementMapFX.SetWorld(world);
                    Effects.DisplacementMapFX.SetWorldInvTranspose(wit);
                    Effects.DisplacementMapFX.SetViewProj(viewProj);
                    Effects.DisplacementMapFX.SetWorldViewProj(wvp);
                    Effects.DisplacementMapFX.SetTexTransform(Matrix.Scaling(2, 1, 1));
                    Effects.DisplacementMapFX.SetMaterial(_boxMat);
                    Effects.DisplacementMapFX.SetDiffuseMap(_brickTexSRV);
                    Effects.DisplacementMapFX.SetNormalMap(_brickNormalTexSRV);
                    break;
                }
                pass.Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(_boxIndexCount, _boxIndexOffset, _boxVertexOffset);

                foreach (var matrix in _cylWorld)
                {
                    world = matrix;
                    wit   = MathF.InverseTranspose(world);
                    wvp   = world * viewProj;

                    switch (_renderOptions)
                    {
                    case RenderOptions.Basic:
                        Effects.BasicFX.SetWorld(world);
                        Effects.BasicFX.SetWorldInvTranspose(wit);
                        Effects.BasicFX.SetWorldViewProj(wvp);
                        Effects.BasicFX.SetTexTransform(Matrix.Scaling(1, 2, 1));
                        Effects.BasicFX.SetMaterial(_cylinderMat);
                        Effects.BasicFX.SetDiffuseMap(_brickTexSRV);
                        break;

                    case RenderOptions.NormalMap:
                        Effects.NormalMapFX.SetWorld(world);
                        Effects.NormalMapFX.SetWorldInvTranspose(wit);
                        Effects.NormalMapFX.SetWorldViewProj(wvp);
                        Effects.NormalMapFX.SetTexTransform(Matrix.Scaling(1, 2, 1));
                        Effects.NormalMapFX.SetMaterial(_cylinderMat);
                        Effects.NormalMapFX.SetDiffuseMap(_brickTexSRV);
                        Effects.NormalMapFX.SetNormalMap(_brickNormalTexSRV);
                        break;

                    case RenderOptions.DisplacementMap:
                        Effects.DisplacementMapFX.SetWorld(world);
                        Effects.DisplacementMapFX.SetWorldInvTranspose(wit);
                        Effects.DisplacementMapFX.SetViewProj(viewProj);
                        Effects.DisplacementMapFX.SetWorldViewProj(wvp);
                        Effects.DisplacementMapFX.SetTexTransform(Matrix.Scaling(1, 2, 1));
                        Effects.DisplacementMapFX.SetMaterial(_cylinderMat);
                        Effects.DisplacementMapFX.SetDiffuseMap(_brickTexSRV);
                        Effects.DisplacementMapFX.SetNormalMap(_brickNormalTexSRV);
                        break;
                    }
                    pass.Apply(ImmediateContext);
                    ImmediateContext.DrawIndexed(_cylinderIndexCount, _cylinderIndexOffset, _cylinderVertexOffset);
                }
            }
            ImmediateContext.HullShader.Set(null);
            ImmediateContext.DomainShader.Set(null);
            ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;

            for (int p = 0; p < activeSphereTech.Description.PassCount; p++)
            {
                foreach (var matrix in _sphereWorld)
                {
                    var world = matrix;
                    var wit   = MathF.InverseTranspose(world);
                    var wvp   = world * viewProj;

                    Effects.BasicFX.SetWorld(world);
                    Effects.BasicFX.SetWorldInvTranspose(wit);
                    Effects.BasicFX.SetWorldViewProj(wvp);
                    Effects.BasicFX.SetTexTransform(Matrix.Identity);
                    Effects.BasicFX.SetMaterial(_sphereMat);

                    activeSphereTech.GetPassByIndex(p).Apply(ImmediateContext);
                    ImmediateContext.DrawIndexed(_sphereIndexCount, _sphereIndexOffset, _sphereVertexOffset);
                }
            }
            stride = Basic32.Stride;
            offset = 0;

            ImmediateContext.Rasterizer.State = null;

            ImmediateContext.InputAssembler.InputLayout = InputLayouts.Basic32;
            ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_skullVB, stride, offset));
            ImmediateContext.InputAssembler.SetIndexBuffer(_skullIB, Format.R32_UInt, 0);

            for (int p = 0; p < activeSkullTech.Description.PassCount; p++)
            {
                var world = _skullWorld;
                var wit   = MathF.InverseTranspose(world);
                var wvp   = world * viewProj;

                Effects.BasicFX.SetWorld(world);
                Effects.BasicFX.SetWorldInvTranspose(wit);
                Effects.BasicFX.SetWorldViewProj(wvp);
                Effects.BasicFX.SetMaterial(_skullMat);

                activeSkullTech.GetPassByIndex(p).Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0);
            }
            _sky.Draw(ImmediateContext, _camera);

            ImmediateContext.Rasterizer.State = null;
            ImmediateContext.OutputMerger.DepthStencilState     = null;
            ImmediateContext.OutputMerger.DepthStencilReference = 0;

            SwapChain.Present(0, PresentFlags.None);
        }
Ejemplo n.º 15
0
        public override void UpdateScene(float dt)
        {
            base.UpdateScene(dt);
            if (Util.IsKeyDown(Keys.Up))
            {
                _camera.Walk(10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.Down))
            {
                _camera.Walk(-10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.Left))
            {
                _camera.Strafe(-10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.Right))
            {
                _camera.Strafe(10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.PageUp))
            {
                _camera.Zoom(-dt);
            }
            if (Util.IsKeyDown(Keys.PageDown))
            {
                _camera.Zoom(+dt);
            }

            _camera.UpdateViewMatrix();

            for (var index = 0; index < _ammo.Count; index++)
            {
                var shot = _ammo[index];
                shot.Particle.Integrate(dt);
                if (shot.Particle.Position.Y < 0.0f || shot.StartTime + 10.0f < Timer.TotalTime || shot.Particle.Position.Z > 200.0f)
                {
                    _ammo.Remove(shot);
                }
            }
            _fireDelay -= dt;
            if (Util.IsKeyDown(Keys.D1))
            {
                _currentShotType = ShotType.Pistol;
            }
            else if (Util.IsKeyDown(Keys.D2))
            {
                _currentShotType = ShotType.Artillery;
            }
            else if (Util.IsKeyDown(Keys.D3))
            {
                _currentShotType = ShotType.Fireball;
            }
            else if (Util.IsKeyDown(Keys.D4))
            {
                _currentShotType = ShotType.Laser;
            }
            else if (Util.IsKeyDown(Keys.Space) && _fireDelay < 0)
            {
                Fire();
                _fireDelay = 0.2f;
            }
        }