Exemplo n.º 1
0
        /// <summary>
        /// Ends rendering, should always be called after DrawMesh()!
        /// </summary>
        public void End()
        {
            if (Sprites.Count == 0)
            {
                return;
            }
            //Device.RasterizerState.CullMode = CullMode.CullCounterClockwiseFace;

            var character = Sprites.Where(x => x.Effect == _3DSpriteEffect.CHARACTER).ToList();
            var pass      = WorldConfig.Current.PassOffset * 2;

            PPXDepthEngine.RenderPPXDepth(Avatar.Effect, true, (depth) =>
            {
                RenderSpriteList(character, Avatar.Effect, Avatar.Effect.Techniques[OBJIDMode ? 1 : pass]);
            });

            /*
             * ApplyCamera(Effect);
             * Effect.World = world;
             * Effect.TextureEnabled = true;
             * Effect.Texture = binding.Texture;
             * Effect.CommitChanges();
             *
             * Effect.Begin();
             * foreach (var pass in Effect.CurrentTechnique.Passes)
             * {
             *  pass.Begin();
             *  binding.Mesh.Draw(Device);
             *  pass.End();
             * }
             * Effect.End();*/
        }
Exemplo n.º 2
0
        public void RenderCache(List <_2DDrawBuffer> cache)
        {
            var effect = this.Effect;

            Device.BlendState = BlendState.AlphaBlend;
            //  set the only parameter this effect takes.
            effect.Parameters["dirToFront"].SetValue(FrontDirForRot(((FSO.LotView.Utils.WorldCamera)WorldCamera).Rotation));
            effect.Parameters["offToBack"].SetValue(BackOffForRot(((FSO.LotView.Utils.WorldCamera)WorldCamera).Rotation));
            effect.Parameters["viewProjection"].SetValue(this.View * this.Projection);
            var mat = this.WorldCamera.View * this.WorldCamera.Projection;

            effect.Parameters["worldViewProjection"].SetValue(this.WorldCamera.View * this.WorldCamera.Projection);
            effect.Parameters["ambientLight"].SetValue(AmbientLight);
            //effect.Parameters["depthOutMode"].SetValue(OutputDepth && (!FSOEnvironment.UseMRT));

            foreach (var buffer in cache)
            {
                PPXDepthEngine.RenderPPXDepth(effect, false, (depth) =>
                {
                    foreach (var group in buffer.Groups)
                    {
                        RenderDrawGroup(group);
                    }
                });
            }
        }
Exemplo n.º 3
0
        public void RenderCache(List <_2DDrawBuffer> cache)
        {
            var effect = this.Effect;

            Device.BlendState = BlendState.AlphaBlend;
            //  set the only parameter this effect takes.
            var frontDir = FrontDirForRot(((FSO.LotView.Utils.WorldCamera)WorldCamera).Rotation);

            effect.Parameters["dirToFront"].SetValue(frontDir);
            effect.Parameters["offToBack"].SetValue(BackOffForRot(((FSO.LotView.Utils.WorldCamera)WorldCamera).Rotation));
            //frontDir /= 3;
            //WorldContent._2DWorldBatchEffect.Parameters["LightOffset"].SetValue(new Vector2(frontDir.X / (6 * 75), frontDir.Z / (6 * 75)));
            var mat = this.WorldCamera.View * this.WorldCamera.Projection;

            effect.Parameters["worldViewProjection"].SetValue(mat);
            effect.Parameters["iWVP"].SetValue(Matrix.Invert(mat));
            //effect.Parameters["depthOutMode"].SetValue(OutputDepth && (!FSOEnvironment.UseMRT));

            foreach (var buffer in cache)
            {
                PPXDepthEngine.RenderPPXDepth(effect, false, (depth) =>
                {
                    foreach (var group in buffer.Groups)
                    {
                        RenderDrawGroup(group);
                    }
                });
            }
        }
Exemplo n.º 4
0
        public void DrawImmediate(_2DStandaloneSprite sprite)
        {
            var effect = this.Effect;

            if (!FSOEnvironment.DirectX)
            {
                Device.Indices = null; //monogame why
                Device.Indices = SpriteIndices;
            }
            PPXDepthEngine.RenderPPXDepth(effect, false, (depth) =>
            {
                effect.pixelTexture = sprite.Pixel;
                if (sprite.Depth != null)
                {
                    effect.depthTexture = sprite.Depth;
                }
                if (sprite.Mask != null)
                {
                    effect.maskTexture = sprite.Mask;
                }

                EffectPassCollection passes = effect.CurrentTechnique.Passes;

                EffectPass pass = passes[Math.Min(passes.Count - 1, WorldConfig.Current.DirPassOffset)];
                pass.Apply();
                if (sprite.GPUVertices != null)
                {
                    Device.SetVertexBuffer(sprite.GPUVertices);
                    Device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, 2);
                }
            });
        }
Exemplo n.º 5
0
        /// <summary>
        /// Processes the accumulated draw commands and paints the screen. Optionally outputs to a vertex cache.
        /// </summary>
        public void End(List <_2DDrawBuffer> cache, bool outputDepth)
        {
            if (WorldCamera == null)
            {
                return;
            }
            var effect = this.Effect;

            if (cache == null)
            {
                Device.BlendState = BlendState.AlphaBlend;
                //  set the only parameter this effect takes.
                var frontDir = FrontDirForRot(((FSO.LotView.Utils.WorldCamera)WorldCamera).Rotation);
                effect.Parameters["dirToFront"].SetValue(frontDir);
                effect.Parameters["offToBack"].SetValue(BackOffForRot(((FSO.LotView.Utils.WorldCamera)WorldCamera).Rotation));
                //frontDir /= 3;
                //WorldContent._2DWorldBatchEffect.Parameters["LightOffset"].SetValue(new Vector2(frontDir.X / (6 * 75), frontDir.Z / (6 * 75)));
                var mat = this.WorldCamera.View * this.WorldCamera.Projection;
                effect.Parameters["worldViewProjection"].SetValue(mat);
                var inv = Matrix.Invert(mat);
                effect.Parameters["iWVP"].SetValue(inv);
                effect.Parameters["rotProjection"].SetValue(((WorldCamera)this.WorldCamera).GetRotationMatrix() * this.WorldCamera.Projection);
                //effect.Parameters["depthOutMode"].SetValue(outputDepth && (!FSOEnvironment.UseMRT));
            }

            if (Sprites.Count == 0)
            {
                return;
            }
            int i = 0;

            foreach (var sprites in Sprites)
            {
                if (cache != null)
                {
                    if (i >= cache.Count)
                    {
                        cache.Add(new _2DDrawBuffer());
                    }
                    EndDrawSprites(sprites, cache[i].Groups, outputDepth);
                }
                else
                {
                    var temp = new _2DDrawBuffer();
                    EndDrawSprites(sprites, temp.Groups, OutputDepth);
                    PPXDepthEngine.RenderPPXDepth(effect, false, (depth) =>
                    {
                        RenderCache(new List <_2DDrawBuffer> {
                            temp
                        });
                        //EndDrawSprites(sprites, null, OutputDepth);
                    });
                    temp.Dispose();
                }
                i++;
            }
        }
Exemplo n.º 6
0
        public override void Draw(GraphicsDevice device, WorldState world)
        {
            device.RasterizerState = RasterizerState.CullNone;
            if (ShapeDirty)
            {
                RegenRoof(device);
                ShapeDirty = false;
                StyleDirty = false;
            }
            else if (StyleDirty)
            {
                RemeshRoof(device);
                StyleDirty = false;
            }

            for (int i = 0; i < Drawgroups.Length; i++)
            {
                if (i > world.Level - 1)
                {
                    return;
                }
                Effect.Parameters["Level"].SetValue((float)i + 1.0001f);
                if (Drawgroups[i] != null)
                {
                    var dg = Drawgroups[i];
                    if (dg.NumPrimitives == 0)
                    {
                        continue;
                    }
                    PPXDepthEngine.RenderPPXDepth(Effect, true, (depthMode) =>
                    {
                        world._3D.ApplyCamera(Effect);
                        Effect.Parameters["World"].SetValue(Matrix.Identity);
                        Effect.Parameters["DiffuseColor"].SetValue(new Vector4(world.OutsideColor.R / 255f, world.OutsideColor.G / 255f, world.OutsideColor.B / 255f, 1.0f));
                        Effect.Parameters["UseTexture"].SetValue(true);
                        Effect.Parameters["BaseTex"].SetValue(Texture);
                        Effect.Parameters["Alpha"].SetValue(1f);
                        Effect.Parameters["IgnoreColor"].SetValue(false);
                        Effect.Parameters["TexOffset"].SetValue(Vector2.Zero);
                        Effect.Parameters["TexMatrix"].SetValue(new Vector4(1, 0, 0, 1));

                        device.SetVertexBuffer(dg.VertexBuffer);
                        device.Indices = dg.IndexBuffer;

                        Effect.CurrentTechnique = Effect.Techniques["DrawBase"];
                        var pass = Effect.CurrentTechnique.Passes[(Common.FSOEnvironment.Enable3D && (world as RC.WorldStateRC)?.Use2DCam == false)?2:WorldConfig.Current.PassOffset];
                        pass.Apply();
                        device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, dg.NumPrimitives);
                    });
                }
            }
        }
Exemplo n.º 7
0
        public override void Draw(GraphicsDevice device, WorldState world)
        {
            if (ShapeDirty)
            {
                RegenRoof(device);
                ShapeDirty = false;
                StyleDirty = false;
            }
            else if (StyleDirty)
            {
                RemeshRoof(device);
                StyleDirty = false;
            }

            for (int i = 0; i < Drawgroups.Length; i++)
            {
                if (i > world.Level - 1)
                {
                    return;
                }
                Effect.Parameters["Level"].SetValue((float)i + 1);
                if (Drawgroups[i] != null)
                {
                    var dg = Drawgroups[i];
                    if (dg.NumPrimitives == 0)
                    {
                        continue;
                    }
                    PPXDepthEngine.RenderPPXDepth(Effect, true, (depthMode) =>
                    {
                        world._3D.ApplyCamera(Effect);
                        Effect.Parameters["World"].SetValue(Matrix.Identity);
                        Effect.Parameters["DiffuseColor"].SetValue(new Vector4(world.OutsideColor.R / 255f, world.OutsideColor.G / 255f, world.OutsideColor.B / 255f, 1.0f));
                        Effect.Parameters["UseTexture"].SetValue(true);
                        Effect.Parameters["BaseTex"].SetValue(Texture);

                        device.SetVertexBuffer(dg.VertexBuffer);
                        device.Indices = dg.IndexBuffer;

                        Effect.CurrentTechnique = Effect.Techniques["DrawBase"];
                        foreach (var pass in Effect.CurrentTechnique.Passes)
                        {
                            pass.Apply();
                            device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, dg.NumPrimitives);
                        }
                    });
                }
            }
        }
Exemplo n.º 8
0
        /// <summary>
        /// Render the terrain
        /// </summary>
        /// <param name="device"></param>
        /// <param name="world"></param>
        public override void Draw(GraphicsDevice device, WorldState world)
        {
            var _3d    = world.CameraMode == CameraRenderMode._3D;
            var nonIso = world.CameraMode != CameraRenderMode._2D;

            if (TerrainDirty || VertexBuffer == null || GridAsTexture != _3d)
            {
                GridAsTexture = _3d;
                RegenTerrain(device, Bp);
            }
            if (VertexBuffer == null)
            {
                return;
            }
            if (world.Light != null)
            {
                LightVec = world.Light.LightVec;
            }
            var transitionIntensity = (world.Camera as WorldCamera3D)?.FromIntensity ?? 0f;

            Alpha = 1 - (float)Math.Pow(transitionIntensity, 150f);

            device.DepthStencilState = DepthStencilState.Default;
            device.BlendState        = BlendState.NonPremultiplied;
            device.RasterizerState   = RasterizerState.CullNone;
            PPXDepthEngine.RenderPPXDepth(Effect, true, (depthMode) =>
            {
                Effect.LightGreen = LightGreen.ToVector4();
                Effect.DarkGreen  = DarkGreen.ToVector4();
                Effect.DarkBrown  = DarkBrown.ToVector4();
                Effect.LightBrown = LightBrown.ToVector4();
                var light         = new Vector3(0.3f, 1, -0.3f);

                Effect.LightVec        = LightVec;
                Effect.UseTexture      = false;
                Effect.ScreenSize      = new Vector2(device.Viewport.Width, device.Viewport.Height) / world.PreciseZoom;
                Effect.TerrainNoise    = TextureGenerator.GetTerrainNoise(device);
                Effect.TerrainNoiseMip = TextureGenerator.GetTerrainNoise(device);
                Effect.GrassFadeMul    = (float)Math.Sqrt(device.Viewport.Width / 1920f);

                Effect.FadeRectangle = new Vector4(77 * 3 / 2f + SubworldOff.X, 77 * 3 / 2f + SubworldOff.Y, 77 * 3, 77 * 3);
                Effect.FadeWidth     = 35f * 3;

                Effect.TileSize  = new Vector2(1f / Bp.Width, 1f / Bp.Height);
                Effect.RoomMap   = world.Rooms.RoomMaps[0];
                Effect.RoomLight = world.AmbientLight;
                Effect.Alpha     = Alpha;

                var offset          = -world.WorldSpace.GetScreenOffset();
                var cam2d           = world.Cameras.Camera2D.Camera;
                var rot             = (world.Cameras.Camera2D.Camera.RotateOff / 180) * Math.PI;
                var smat            = new Vector4((float)Math.Cos(rot), (float)Math.Sin(rot) * 0.5f, -(float)Math.Sin(rot) / 0.5f, (float)Math.Cos(rot));
                var sr              = Math.Abs(smat.Y);
                Effect.ScreenMatrix = smat;
                var anchor          = cam2d.RotationAnchor;
                var ctr             = new Vector2();
                if (anchor != null)
                {
                    ctr  = world.WorldSpace.GetScreenFromTile(new Vector2(anchor.Value.X, anchor.Value.Y));
                    ctr -= world.WorldSpace.GetScreenFromTile(new Vector2(cam2d.CenterTile.X, cam2d.CenterTile.Y));
                }
                ctr += world.WorldSpace.WorldPx / 2;
                Effect.ScreenRotCenter = ctr;

                Effect.Projection = world.Projection;
                var view          = world.View;
                //if (!_3d) view = view * Matrix.CreateTranslation(0, 0, -0.25f);
                Effect.View = view;
                //world._3D.ApplyCamera(Effect);
                var translation = ((world.Zoom == WorldZoom.Far) ? -7 : ((world.Zoom == WorldZoom.Medium) ? -5 : -3)) * (20 / 522f);
                if (world.PreciseZoom < 1)
                {
                    translation /= world.PreciseZoom;
                }
                else
                {
                    translation *= world.PreciseZoom;
                }
                var altOff   = Bp.BaseAlt * Bp.TerrainFactor * 3;
                var worldmat = Matrix.Identity * Matrix.CreateTranslation(0, translation - altOff, 0);
                Effect.World = worldmat;
                if (_3d)
                {
                    Effect.CamPos = world.Camera.Position + (world.Cameras.ModelTranslation ?? new Vector3());
                }
                else
                {
                    var flat         = view;
                    flat.Translation = new Vector3(0, 0, 0);
                    var pos          = Vector3.Transform(new Vector3(0, 0, 20000), Matrix.Invert(flat));
                    Effect.CamPos    = pos;
                }
                Effect.DiffuseColor = world.OutsideColor.ToVector4() * Color.Lerp(LightGreen, Color.White, 0.25f).ToVector4();

                device.SetVertexBuffer(VertexBuffer);
                device.Indices = IndexBuffer;

                Effect.UseTexture  = true;
                Effect.IgnoreColor = true;
                Effect.SetTechnique(GrassTechniques.DrawBase);

                var floors = new HashSet <sbyte>();
                for (sbyte f = 0; f < world.Level; f++)
                {
                    floors.Add(f);
                }
                var pass = Effect.CurrentTechnique.Passes[(_3d) ? 2 : WorldConfig.Current.PassOffset];
                Bp.FloorGeom.DrawFloor(device, Effect, world.Zoom, world.Rotation, world.Rooms.RoomMaps, floors, pass, state: world, screenAlignUV: !nonIso);
                Effect.GrassShininess = 0.02f;// (float)0.25);

                pass.Apply();

                float grassScale;
                float grassDensity;
                switch (world.Zoom)
                {
                case WorldZoom.Far:
                    grassScale   = 4;
                    grassDensity = 0.56f;
                    break;

                case WorldZoom.Medium:
                    grassScale   = 2;
                    grassDensity = 0.50f;
                    break;

                default:
                    grassScale   = 1;
                    grassDensity = 0.43f;
                    break;
                }

                grassDensity  *= GrassDensityScale;
                var primitives = Bp.FloorGeom.SetGrassIndices(device, Effect, world);

                var parallax = false;

                Effect.TexMatrix = new Vector4(1f, 1f, -1f, 1f);
                Effect.TexOffset = new Vector2(0.5f, 0.5f);

                if (primitives > 0)
                {
                    Effect.Alpha   = (Alpha - 0.75f) * 4;
                    Effect.Level   = (float)0.0001f;
                    Effect.RoomMap = world.Rooms.RoomMaps[0];
                    Effect.SetTechnique(GrassTechniques.DrawBlades);
                    int grassNum = (int)Math.Ceiling(GrassHeight / (float)grassScale);

                    RenderTargetBinding[] rts = null;
                    if (FSOEnvironment.UseMRT)
                    {
                        rts = device.GetRenderTargets();
                        if (rts.Length > 1)
                        {
                            device.SetRenderTarget((RenderTarget2D)rts[0].RenderTarget);
                        }
                    }
                    var depth = device.DepthStencilState;
                    device.DepthStencilState = DepthStencilState.DepthRead;

                    if (parallax)
                    {
                        grassScale *= grassNum;
                        grassNum    = 1;
                    }
                    for (int i = 1; i <= grassNum; i++)
                    {
                        Effect.World = Matrix.Identity * Matrix.CreateTranslation(0, i * (20 / 522f) * grassScale - altOff, 0);

                        if (!parallax)
                        {
                            Effect.GrassProb = grassDensity * ((grassNum - (i / (2f * grassNum))) / (float)grassNum);
                        }
                        else
                        {
                            Effect.GrassProb = grassDensity * ((4 - (2 / (2f * 4))) / (float)4);
                        }
                        Effect.ParallaxHeight = grassScale * (20 / 522f) * (100 / 512f) / 4;
                        offset += new Vector2(smat.Z, smat.W);

                        var off2 = new Vector2(world.WorldSpace.WorldPxWidth, world.WorldSpace.WorldPxHeight);
                        off2     = (off2 / world.PreciseZoom - off2) / 2;

                        Effect.ScreenOffset = offset - off2;

                        pass = Effect.CurrentTechnique.Passes[(_3d)?((parallax)?3:2):WorldConfig.Current.PassOffset];
                        pass.Apply();
                        device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, primitives);
                    }
                    if (FSOEnvironment.UseMRT)
                    {
                        device.SetRenderTargets(rts);
                    }
                    device.DepthStencilState = depth;
                }

                if (GridPrimitives > 0 && world.BuildMode > 0)
                {
                    RenderTargetBinding[] rts = null;
                    if (FSOEnvironment.UseMRT)
                    {
                        rts = device.GetRenderTargets();
                        if (rts.Length > 1)
                        {
                            device.SetRenderTarget((RenderTarget2D)rts[0].RenderTarget);
                        }
                    }

                    var depth = device.DepthStencilState;
                    device.DepthStencilState = DepthStencilState.DepthRead;
                    Effect.SetTechnique(GrassTechniques.DrawGrid);
                    Effect.BaseTex = GridTex;
                    Effect.World   = Matrix.Identity * Matrix.CreateTranslation(0, (18 / 522f) * grassScale - altOff, 0);
                    pass           = Effect.CurrentTechnique.Passes[(GridAsTexture)?2:0];

                    if (GridAsTexture)
                    {
                        if (TGridPrimitives > 0 && !TGridIndexBuffer.IsDisposed)
                        {
                            //draw target size in red, below old size
                            device.Indices      = TGridIndexBuffer;
                            Effect.DiffuseColor = new Vector4(0.5f, 1f, 0.5f, 1.0f);
                            pass.Apply();
                            device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, TGridPrimitives);
                        }


                        Effect.DiffuseColor =
                            Content.Content.Get().TS1 ?
                            new Vector4(1.0f, 1.0f, 1.0f, 0.8f) :
                            new Vector4(0.0f, 0.0f, 0.0f, 0.8f);
                        device.Indices = GridIndexBuffer;
                        pass.Apply();
                        device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, GridPrimitives);
                    }
                    else
                    {
                        if (TGridPrimitives > 0 && !TGridIndexBuffer.IsDisposed)
                        {
                            //draw target size in red, below old size
                            device.Indices      = TGridIndexBuffer;
                            Effect.DiffuseColor = new Vector4(0.5f, 1f, 0.5f, 1.0f);
                            pass = Effect.CurrentTechnique.Passes[(_3d) ? 1 : 0];
                            pass.Apply();
                            device.DrawIndexedPrimitives(PrimitiveType.LineList, 0, 0, TGridPrimitives);
                        }

                        Effect.DiffuseColor = new Vector4(0, 0, 0, 1.0f);
                        device.Indices      = GridIndexBuffer;
                        pass = Effect.CurrentTechnique.Passes[(_3d) ? 1 : 0];
                        pass.Apply();
                        device.DrawIndexedPrimitives(PrimitiveType.LineList, 0, 0, GridPrimitives);
                    }


                    device.DepthStencilState = depth;

                    if (FSOEnvironment.UseMRT)
                    {
                        device.SetRenderTargets(rts);
                    }
                }
            });
        }
Exemplo n.º 9
0
        /// <summary>
        /// Render the terrain
        /// </summary>
        /// <param name="device"></param>
        /// <param name="world"></param>
        public override void Draw(GraphicsDevice device, WorldState world)
        {
            if (TerrainDirty || VertexBuffer == null)
            {
                RegenTerrain(device, world, Bp);
            }
            if (VertexBuffer == null)
            {
                return;
            }
            if (world.Light != null)
            {
                LightVec = world.Light.LightVec;
            }
            device.DepthStencilState = DepthStencilState.Default;
            device.BlendState        = BlendState.NonPremultiplied;
            device.RasterizerState   = RasterizerState.CullNone;
            PPXDepthEngine.RenderPPXDepth(Effect, true, (depthMode) =>
            {
                Effect.Parameters["LightGreen"].SetValue(LightGreen.ToVector4());
                Effect.Parameters["DarkGreen"].SetValue(DarkGreen.ToVector4());
                Effect.Parameters["DarkBrown"].SetValue(DarkBrown.ToVector4());
                Effect.Parameters["LightBrown"].SetValue(LightBrown.ToVector4());
                var light = new Vector3(0.3f, 1, -0.3f);
                //light.Normalize();
                Effect.Parameters["LightVec"]?.SetValue(LightVec);
                Effect.Parameters["UseTexture"].SetValue(false);
                Effect.Parameters["ScreenSize"].SetValue(new Vector2(device.Viewport.Width, device.Viewport.Height) / world.PreciseZoom);
                Effect.Parameters["TerrainNoise"].SetValue(TextureGenerator.GetTerrainNoise(device));
                Effect.Parameters["TerrainNoiseMip"].SetValue(TextureGenerator.GetTerrainNoise(device));
                Effect.Parameters["GrassFadeMul"].SetValue((float)Math.Sqrt(device.Viewport.Width / 1920f));


                Effect.Parameters["TileSize"].SetValue(new Vector2(1f / Bp.Width, 1f / Bp.Height));
                Effect.Parameters["RoomMap"].SetValue(world.Rooms.RoomMaps[0]);
                Effect.Parameters["RoomLight"].SetValue(world.AmbientLight);
                //Effect.Parameters["depthOutMode"].SetValue(DepthMode && (!FSOEnvironment.UseMRT));

                var offset = -world.WorldSpace.GetScreenOffset();

                Effect.Parameters["Projection"].SetValue(world.Camera.Projection);
                var view = world.Camera.View;
                if (!_3D)
                {
                    view = view * Matrix.CreateTranslation(0, 0, -0.25f);
                }
                Effect.Parameters["View"].SetValue(view);
                //world._3D.ApplyCamera(Effect);
                var translation = ((world.Zoom == WorldZoom.Far) ? -7 : ((world.Zoom == WorldZoom.Medium) ? -5 : -3)) * (20 / 522f);
                if (world.PreciseZoom < 1)
                {
                    translation /= world.PreciseZoom;
                }
                else
                {
                    translation *= world.PreciseZoom;
                }
                var altOff   = Bp.BaseAlt * Bp.TerrainFactor * 3;
                var worldmat = Matrix.Identity * Matrix.CreateTranslation(0, translation - altOff, 0);
                Effect.Parameters["World"].SetValue(worldmat);

                Effect.Parameters["DiffuseColor"].SetValue(new Vector4(world.OutsideColor.R / 255f, world.OutsideColor.G / 255f, world.OutsideColor.B / 255f, 1f));

                device.SetVertexBuffer(VertexBuffer);
                device.Indices = IndexBuffer;

                Effect.Parameters["UseTexture"].SetValue(true);
                Effect.Parameters["IgnoreColor"].SetValue(true);
                Effect.CurrentTechnique = Effect.Techniques["DrawBase"];

                var floors = new HashSet <sbyte>();
                for (sbyte f = 0; f < world.Level; f++)
                {
                    floors.Add(f);
                }
                var pass = Effect.CurrentTechnique.Passes[(_3D) ? 2 : WorldConfig.Current.PassOffset];
                Bp.FloorGeom.DrawFloor(device, Effect, world.Zoom, world.Rotation, world.Rooms.RoomMaps, floors, pass, state: world);

                pass.Apply();
                //device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, NumPrimitives);

                int grassScale;
                float grassDensity;
                switch (world.Zoom)
                {
                case WorldZoom.Far:
                    grassScale   = 4;
                    grassDensity = 0.56f;
                    break;

                case WorldZoom.Medium:
                    grassScale   = 2;
                    grassDensity = 0.50f;
                    break;

                default:
                    grassScale   = 1;
                    grassDensity = 0.43f;
                    break;
                }

                //    grassScale = 0;

                grassDensity  *= GrassDensityScale;
                var primitives = Bp.FloorGeom.SetGrassIndices(device, Effect, world);

                if (primitives > 0)
                {
                    Effect.Parameters["Level"].SetValue((float)0.0001f);
                    Effect.Parameters["RoomMap"].SetValue(world.Rooms.RoomMaps[0]);
                    Effect.CurrentTechnique = Effect.Techniques["DrawBlades"];
                    int grassNum            = (int)Math.Ceiling(GrassHeight / (float)grassScale);

                    RenderTargetBinding[] rts = null;
                    if (FSOEnvironment.UseMRT)
                    {
                        rts = device.GetRenderTargets();
                        if (rts.Length > 1)
                        {
                            device.SetRenderTarget((RenderTarget2D)rts[0].RenderTarget);
                        }
                    }
                    var depth = device.DepthStencilState;
                    device.DepthStencilState = DepthStencilState.DepthRead;
                    for (int i = 0; i < grassNum; i++)
                    {
                        Effect.Parameters["World"].SetValue(Matrix.Identity * Matrix.CreateTranslation(0, i * (20 / 522f) * grassScale - altOff, 0));
                        Effect.Parameters["GrassProb"].SetValue(grassDensity * ((grassNum - (i / (2f * grassNum))) / (float)grassNum));
                        offset += new Vector2(0, 1);

                        var off2 = new Vector2(world.WorldSpace.WorldPxWidth, world.WorldSpace.WorldPxHeight);
                        off2     = (off2 / world.PreciseZoom - off2) / 2;

                        Effect.Parameters["ScreenOffset"].SetValue(offset - off2);

                        pass = Effect.CurrentTechnique.Passes[(_3D)?2:WorldConfig.Current.PassOffset];
                        pass.Apply();
                        device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, primitives);
                    }
                    if (FSOEnvironment.UseMRT)
                    {
                        device.SetRenderTargets(rts);
                    }
                    device.DepthStencilState = depth;
                }

                if (GridPrimitives > 0 && world.BuildMode > 0)
                {
                    RenderTargetBinding[] rts = null;
                    if (FSOEnvironment.UseMRT)
                    {
                        rts = device.GetRenderTargets();
                        if (rts.Length > 1)
                        {
                            device.SetRenderTarget((RenderTarget2D)rts[0].RenderTarget);
                        }
                    }

                    var depth = device.DepthStencilState;
                    device.DepthStencilState = DepthStencilState.DepthRead;
                    Effect.CurrentTechnique  = Effect.Techniques["DrawGrid"];
                    Effect.Parameters["World"].SetValue(Matrix.Identity * Matrix.CreateTranslation(0, (18 / 522f) * grassScale - altOff, 0));

                    if (TGridPrimitives > 0 && !TGridIndexBuffer.IsDisposed)
                    {
                        //draw target size in red, below old size
                        device.Indices = TGridIndexBuffer;
                        Effect.Parameters["DiffuseColor"].SetValue(new Vector4(0.5f, 1f, 0.5f, 1.0f));
                        pass = Effect.CurrentTechnique.Passes[(_3D)?1:0];
                        pass.Apply();
                        device.DrawIndexedPrimitives(PrimitiveType.LineList, 0, 0, TGridPrimitives);
                    }

                    Effect.Parameters["DiffuseColor"].SetValue(new Vector4(0, 0, 0, 1.0f));
                    device.Indices = GridIndexBuffer;
                    pass           = Effect.CurrentTechnique.Passes[(_3D) ? 1 : 0];
                    pass.Apply();
                    device.DrawIndexedPrimitives(PrimitiveType.LineList, 0, 0, GridPrimitives);


                    device.DepthStencilState = depth;

                    if (FSOEnvironment.UseMRT)
                    {
                        device.SetRenderTargets(rts);
                    }
                }
            });
        }
Exemplo n.º 10
0
        /// <summary>
        /// Render the terrain
        /// </summary>
        /// <param name="device"></param>
        /// <param name="world"></param>
        public override void Draw(GraphicsDevice device, WorldState world)
        {
            if (VertexBuffer == null)
            {
                return;
            }
            PPXDepthEngine.RenderPPXDepth(Effect, true, (depthMode) =>
            {
                Effect.Parameters["LightGreen"].SetValue(LightGreen.ToVector4());
                Effect.Parameters["DarkGreen"].SetValue(DarkGreen.ToVector4());
                Effect.Parameters["DarkBrown"].SetValue(DarkBrown.ToVector4());
                Effect.Parameters["LightBrown"].SetValue(LightBrown.ToVector4());
                Effect.Parameters["ScreenSize"].SetValue(new Vector2(device.Viewport.Width, device.Viewport.Height));
                //Effect.Parameters["depthOutMode"].SetValue(DepthMode && (!FSOEnvironment.UseMRT));

                var offset = -world.WorldSpace.GetScreenOffset();

                world._3D.ApplyCamera(Effect);
                var worldmat = Matrix.Identity * Matrix.CreateTranslation(0, ((world.Zoom == WorldZoom.Far) ? -5 : ((world.Zoom == WorldZoom.Medium) ? -4 : -3)) * (20 / 522f), 0);
                Effect.Parameters["World"].SetValue(worldmat);

                Effect.Parameters["DiffuseColor"].SetValue(new Vector4(world.OutsideColor.R / 255f, world.OutsideColor.G / 255f, world.OutsideColor.B / 255f, 1.0f));

                device.SetVertexBuffer(VertexBuffer);
                device.Indices = IndexBuffer;

                Effect.CurrentTechnique = Effect.Techniques["DrawBase"];
                foreach (var pass in Effect.CurrentTechnique.Passes)
                {
                    pass.Apply();
                    device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, 0, 0, NumPrimitives);
                }

                int grassScale;
                float grassDensity;
                switch (world.Zoom)
                {
                case WorldZoom.Far:
                    grassScale   = 4;
                    grassDensity = 0.56f;
                    break;

                case WorldZoom.Medium:
                    grassScale   = 2;
                    grassDensity = 0.50f;
                    break;

                default:
                    grassScale   = 1;
                    grassDensity = 0.43f;
                    break;
                }

                grassDensity *= GrassDensityScale;

                if (BladePrimitives > 0)
                {
                    Effect.CurrentTechnique = Effect.Techniques["DrawBlades"];
                    int grassNum            = (int)Math.Ceiling(GrassHeight / (float)grassScale);

                    //if (depthMode && (!FSOEnvironment.UseMRT)) return;
                    RenderTargetBinding[] rts = null;
                    if (FSOEnvironment.UseMRT)
                    {
                        rts = device.GetRenderTargets();
                        if (rts.Length > 1)
                        {
                            device.SetRenderTarget((RenderTarget2D)rts[0].RenderTarget);
                        }
                    }
                    device.Indices = BladeIndexBuffer;
                    for (int i = 0; i < grassNum; i++)
                    {
                        Effect.Parameters["World"].SetValue(Matrix.Identity * Matrix.CreateTranslation(0, i * (20 / 522f) * grassScale, 0));
                        Effect.Parameters["GrassProb"].SetValue(grassDensity * ((grassNum - (i / (2f * grassNum))) / (float)grassNum));
                        offset += new Vector2(0, 1);
                        Effect.Parameters["ScreenOffset"].SetValue(offset);

                        foreach (var pass in Effect.CurrentTechnique.Passes)
                        {
                            pass.Apply();
                            device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, 0, 0, BladePrimitives);
                        }
                    }
                    if (FSOEnvironment.UseMRT)
                    {
                        device.SetRenderTargets(rts);
                    }
                }
            });
        }
Exemplo n.º 11
0
        /// <summary>
        /// Render the terrain
        /// </summary>
        /// <param name="device"></param>
        /// <param name="world"></param>
        public override void Draw(GraphicsDevice device, WorldState world)
        {
            if (TerrainDirty || VertexBuffer == null)
            {
                RegenTerrain(device, world, Bp);
            }
            if (VertexBuffer == null)
            {
                return;
            }
            PPXDepthEngine.RenderPPXDepth(Effect, true, (depthMode) =>
            {
                Effect.Parameters["LightGreen"].SetValue(LightGreen.ToVector4());
                Effect.Parameters["DarkGreen"].SetValue(DarkGreen.ToVector4());
                Effect.Parameters["DarkBrown"].SetValue(DarkBrown.ToVector4());
                Effect.Parameters["LightBrown"].SetValue(LightBrown.ToVector4());
                Effect.Parameters["Level"].SetValue((float)0);
                Effect.Parameters["UseTexture"].SetValue(false);
                Effect.Parameters["ScreenSize"].SetValue(new Vector2(device.Viewport.Width, device.Viewport.Height) / world.PreciseZoom);
                //Effect.Parameters["depthOutMode"].SetValue(DepthMode && (!FSOEnvironment.UseMRT));

                var offset = -world.WorldSpace.GetScreenOffset();

                world._3D.ApplyCamera(Effect);
                var translation = ((world.Zoom == WorldZoom.Far) ? -7 : ((world.Zoom == WorldZoom.Medium) ? -5 : -3)) * (20 / 522f);
                if (world.PreciseZoom < 1)
                {
                    translation /= world.PreciseZoom;
                }
                else
                {
                    translation *= world.PreciseZoom;
                }
                var worldmat = Matrix.Identity * Matrix.CreateTranslation(0, translation, 0);
                Effect.Parameters["World"].SetValue(worldmat);

                Effect.Parameters["DiffuseColor"].SetValue(new Vector4(world.OutsideColor.R / 255f, world.OutsideColor.G / 255f, world.OutsideColor.B / 255f, 1.0f));

                device.SetVertexBuffer(VertexBuffer);
                device.Indices = IndexBuffer;

                Effect.CurrentTechnique = Effect.Techniques["DrawBase"];
                var pass = Effect.CurrentTechnique.Passes[WorldConfig.Current.PassOffset];
                pass.Apply();
                device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, NumPrimitives);

                int grassScale;
                float grassDensity;
                switch (world.Zoom)
                {
                case WorldZoom.Far:
                    grassScale   = 4;
                    grassDensity = 0.56f;
                    break;

                case WorldZoom.Medium:
                    grassScale   = 2;
                    grassDensity = 0.50f;
                    break;

                default:
                    grassScale   = 1;
                    grassDensity = 0.43f;
                    break;
                }

                grassDensity *= GrassDensityScale;

                if (BladePrimitives > 0)
                {
                    Effect.CurrentTechnique = Effect.Techniques["DrawBlades"];
                    int grassNum            = (int)Math.Ceiling(GrassHeight / (float)grassScale);

                    RenderTargetBinding[] rts = null;
                    if (FSOEnvironment.UseMRT)
                    {
                        rts = device.GetRenderTargets();
                        if (rts.Length > 1)
                        {
                            device.SetRenderTarget((RenderTarget2D)rts[0].RenderTarget);
                        }
                    }
                    var depth = device.DepthStencilState;
                    device.DepthStencilState = DepthStencilState.None;
                    device.Indices           = BladeIndexBuffer;
                    for (int i = 0; i < grassNum; i++)
                    {
                        Effect.Parameters["World"].SetValue(Matrix.Identity * Matrix.CreateTranslation(0, i * (20 / 522f) * grassScale, 0));
                        Effect.Parameters["GrassProb"].SetValue(grassDensity * ((grassNum - (i / (2f * grassNum))) / (float)grassNum));
                        offset += new Vector2(0, 1);

                        var off2 = new Vector2(world.WorldSpace.WorldPxWidth, world.WorldSpace.WorldPxHeight);
                        off2     = (off2 / world.PreciseZoom - off2) / 2;

                        Effect.Parameters["ScreenOffset"].SetValue(offset - off2);

                        pass = Effect.CurrentTechnique.Passes[WorldConfig.Current.PassOffset];
                        pass.Apply();
                        device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, BladePrimitives);
                    }
                    if (FSOEnvironment.UseMRT)
                    {
                        device.SetRenderTargets(rts);
                    }
                    device.DepthStencilState = depth;
                }

                if (GridPrimitives > 0 && world.BuildMode > 0)
                {
                    RenderTargetBinding[] rts = null;
                    if (FSOEnvironment.UseMRT)
                    {
                        rts = device.GetRenderTargets();
                        if (rts.Length > 1)
                        {
                            device.SetRenderTarget((RenderTarget2D)rts[0].RenderTarget);
                        }
                    }

                    var depth = device.DepthStencilState;
                    device.DepthStencilState = DepthStencilState.None;
                    Effect.CurrentTechnique  = Effect.Techniques["DrawGrid"];
                    Effect.Parameters["World"].SetValue(Matrix.Identity * Matrix.CreateTranslation(0, ((int)(world.Zoom) - 1) * (18 / 522f) * grassScale, 0));

                    if (TGridPrimitives > 0 && !TGridIndexBuffer.IsDisposed)
                    {
                        //draw target size in red, below old size
                        device.Indices = TGridIndexBuffer;
                        Effect.Parameters["DiffuseColor"].SetValue(new Vector4(0.5f, 1f, 0.5f, 1.0f));
                        pass = Effect.CurrentTechnique.Passes[0];
                        pass.Apply();
                        device.DrawIndexedPrimitives(PrimitiveType.LineList, 0, 0, TGridPrimitives);
                    }

                    Effect.Parameters["DiffuseColor"].SetValue(new Vector4(0, 0, 0, 1.0f));
                    device.Indices = GridIndexBuffer;
                    pass           = Effect.CurrentTechnique.Passes[0];
                    pass.Apply();
                    device.DrawIndexedPrimitives(PrimitiveType.LineList, 0, 0, GridPrimitives);


                    device.DepthStencilState = depth;

                    if (FSOEnvironment.UseMRT)
                    {
                        device.SetRenderTargets(rts);
                    }
                }
            });
        }
Exemplo n.º 12
0
        /// <summary>
        /// Render the terrain
        /// </summary>
        /// <param name="device"></param>
        /// <param name="world"></param>
        public override void Draw(GraphicsDevice device, WorldState world)
        {
            if (TerrainDirty || VertexBuffer == null)
            {
                RegenTerrain(device, Bp);
            }
            if (VertexBuffer == null)
            {
                return;
            }
            if (world.Light != null)
            {
                LightVec = world.Light.LightVec;
            }
            var transitionIntensity = (world.Camera as WorldCamera3D)?.FromIntensity ?? 0f;

            Alpha = 1 - (float)Math.Pow(transitionIntensity, 150f);

            device.DepthStencilState = DepthStencilState.Default;
            device.BlendState        = BlendState.NonPremultiplied;
            device.RasterizerState   = RasterizerState.CullNone;
            PPXDepthEngine.RenderPPXDepth(Effect, true, (depthMode) =>
            {
                Effect.Parameters["LightGreen"].SetValue(LightGreen.ToVector4());
                Effect.Parameters["DarkGreen"].SetValue(DarkGreen.ToVector4());
                Effect.Parameters["DarkBrown"].SetValue(DarkBrown.ToVector4());
                Effect.Parameters["LightBrown"].SetValue(LightBrown.ToVector4());
                var light = new Vector3(0.3f, 1, -0.3f);

                Effect.Parameters["LightVec"]?.SetValue(LightVec);
                Effect.Parameters["UseTexture"].SetValue(false);
                Effect.Parameters["ScreenSize"].SetValue(new Vector2(device.Viewport.Width, device.Viewport.Height) / world.PreciseZoom);
                Effect.Parameters["TerrainNoise"].SetValue(TextureGenerator.GetTerrainNoise(device));
                Effect.Parameters["TerrainNoiseMip"].SetValue(TextureGenerator.GetTerrainNoise(device));
                Effect.Parameters["GrassFadeMul"].SetValue((float)Math.Sqrt(device.Viewport.Width / 1920f));

                Effect.Parameters["FadeRectangle"].SetValue(new Vector4(77 * 3 / 2f + SubworldOff.X, 77 * 3 / 2f + SubworldOff.Y, 77 * 3, 77 * 3));
                Effect.Parameters["FadeWidth"].SetValue(35f * 3);

                Effect.Parameters["TileSize"].SetValue(new Vector2(1f / Bp.Width, 1f / Bp.Height));
                Effect.Parameters["RoomMap"].SetValue(world.Rooms.RoomMaps[0]);
                Effect.Parameters["RoomLight"].SetValue(world.AmbientLight);
                Effect.Parameters["Alpha"].SetValue(Alpha);
                //Effect.Parameters["depthOutMode"].SetValue(DepthMode && (!FSOEnvironment.UseMRT));

                var offset = -world.WorldSpace.GetScreenOffset();

                Effect.Parameters["Projection"].SetValue(world.Camera.Projection);
                var view = world.Camera.View;
                var _3d  = _3D;
                if (!_3d)
                {
                    view = view * Matrix.CreateTranslation(0, 0, -0.25f);
                }
                Effect.Parameters["View"].SetValue(view);
                //world._3D.ApplyCamera(Effect);
                var translation = ((world.Zoom == WorldZoom.Far) ? -7 : ((world.Zoom == WorldZoom.Medium) ? -5 : -3)) * (20 / 522f);
                if (world.PreciseZoom < 1)
                {
                    translation /= world.PreciseZoom;
                }
                else
                {
                    translation *= world.PreciseZoom;
                }
                var altOff   = Bp.BaseAlt * Bp.TerrainFactor * 3;
                var worldmat = Matrix.Identity * Matrix.CreateTranslation(0, translation - altOff, 0);
                Effect.Parameters["World"].SetValue(worldmat);
                if ((world as RC.WorldStateRC)?.Use2DCam == false)
                {
                    Effect.Parameters["CamPos"]?.SetValue(world.Camera.Position + world.Camera.Translation);
                }
                else
                {
                    Effect.Parameters["CamPos"]?.SetValue(new Vector3(10000, 7071.0678118654752440084436210485f, 10000));
                }
                Effect.Parameters["DiffuseColor"].SetValue(world.OutsideColor.ToVector4() * Color.Lerp(LightGreen, Color.White, 0.25f).ToVector4());

                device.SetVertexBuffer(VertexBuffer);
                device.Indices = IndexBuffer;

                Effect.Parameters["UseTexture"].SetValue(true);
                Effect.Parameters["IgnoreColor"].SetValue(true);
                Effect.CurrentTechnique = Effect.Techniques["DrawBase"];

                var floors = new HashSet <sbyte>();
                for (sbyte f = 0; f < world.Level; f++)
                {
                    floors.Add(f);
                }
                var pass = Effect.CurrentTechnique.Passes[(_3d) ? 2 : WorldConfig.Current.PassOffset];
                Bp.FloorGeom.DrawFloor(device, Effect, world.Zoom, world.Rotation, world.Rooms.RoomMaps, floors, pass, state: world);
                Effect.Parameters["GrassShininess"].SetValue(0.02f);// (float)0.25);

                pass.Apply();
                //device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, NumPrimitives);

                float grassScale;
                float grassDensity;
                switch (world.Zoom)
                {
                case WorldZoom.Far:
                    grassScale   = 4;
                    grassDensity = 0.56f;
                    break;

                case WorldZoom.Medium:
                    grassScale   = 2;
                    grassDensity = 0.50f;
                    break;

                default:
                    grassScale   = 1;
                    grassDensity = 0.43f;
                    break;
                }

                //    grassScale = 0;

                grassDensity  *= GrassDensityScale;
                var primitives = Bp.FloorGeom.SetGrassIndices(device, Effect, world);

                var parallax = false;

                Effect.Parameters["TexMatrix"].SetValue(new Vector4(1f, 1f, -1f, 1f));
                Effect.Parameters["TexOffset"].SetValue(new Vector2(0.5f, 0.5f));

                if (primitives > 0 && _3D == _3d)
                {
                    Effect.Parameters["Alpha"].SetValue((Alpha - 0.75f) * 4);
                    Effect.Parameters["Level"].SetValue((float)0.0001f);
                    Effect.Parameters["RoomMap"].SetValue(world.Rooms.RoomMaps[0]);
                    Effect.CurrentTechnique = Effect.Techniques["DrawBlades"];
                    int grassNum            = (int)Math.Ceiling(GrassHeight / (float)grassScale);

                    RenderTargetBinding[] rts = null;
                    if (FSOEnvironment.UseMRT)
                    {
                        rts = device.GetRenderTargets();
                        if (rts.Length > 1)
                        {
                            device.SetRenderTarget((RenderTarget2D)rts[0].RenderTarget);
                        }
                    }
                    var depth = device.DepthStencilState;
                    device.DepthStencilState = DepthStencilState.DepthRead;

                    if (parallax)
                    {
                        grassScale *= grassNum;
                        grassNum    = 1;
                    }
                    for (int i = 1; i <= grassNum; i++)
                    {
                        Effect.Parameters["World"].SetValue(Matrix.Identity * Matrix.CreateTranslation(0, i * (20 / 522f) * grassScale - altOff, 0));

                        if (!parallax)
                        {
                            Effect.Parameters["GrassProb"].SetValue(grassDensity * ((grassNum - (i / (2f * grassNum))) / (float)grassNum));
                        }
                        else
                        {
                            Effect.Parameters["GrassProb"].SetValue(grassDensity * ((4 - (2 / (2f * 4))) / (float)4));
                        }
                        Effect.Parameters["ParallaxHeight"].SetValue(grassScale * (20 / 522f) * (100 / 512f) / 4);
                        offset += new Vector2(0, 1);

                        var off2 = new Vector2(world.WorldSpace.WorldPxWidth, world.WorldSpace.WorldPxHeight);
                        off2     = (off2 / world.PreciseZoom - off2) / 2;

                        Effect.Parameters["ScreenOffset"].SetValue(offset - off2);

                        pass = Effect.CurrentTechnique.Passes[(_3d)?((parallax)?3:2):WorldConfig.Current.PassOffset];
                        pass.Apply();
                        device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, primitives);
                    }
                    if (FSOEnvironment.UseMRT)
                    {
                        device.SetRenderTargets(rts);
                    }
                    device.DepthStencilState = depth;
                }

                if (GridPrimitives > 0 && world.BuildMode > 0)
                {
                    RenderTargetBinding[] rts = null;
                    if (FSOEnvironment.UseMRT)
                    {
                        rts = device.GetRenderTargets();
                        if (rts.Length > 1)
                        {
                            device.SetRenderTarget((RenderTarget2D)rts[0].RenderTarget);
                        }
                    }

                    var depth = device.DepthStencilState;
                    device.DepthStencilState = DepthStencilState.DepthRead;
                    Effect.CurrentTechnique  = Effect.Techniques["DrawGrid"];
                    Effect.Parameters["BaseTex"].SetValue(GridTex);
                    Effect.Parameters["World"].SetValue(Matrix.Identity * Matrix.CreateTranslation(0, (18 / 522f) * grassScale - altOff, 0));
                    pass = Effect.CurrentTechnique.Passes[(GridAsTexture)?2:0];

                    if (GridAsTexture)
                    {
                        if (TGridPrimitives > 0 && !TGridIndexBuffer.IsDisposed)
                        {
                            //draw target size in red, below old size
                            device.Indices = TGridIndexBuffer;
                            Effect.Parameters["DiffuseColor"].SetValue(new Vector4(0.5f, 1f, 0.5f, 1.0f));
                            pass.Apply();
                            device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, TGridPrimitives);
                        }


                        Effect.Parameters["DiffuseColor"].SetValue(
                            Content.Content.Get().TS1 ?
                            new Vector4(1.0f, 1.0f, 1.0f, 0.8f) :
                            new Vector4(0.0f, 0.0f, 0.0f, 0.8f));
                        device.Indices = GridIndexBuffer;
                        pass.Apply();
                        device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, GridPrimitives);
                    }
                    else
                    {
                        if (TGridPrimitives > 0 && !TGridIndexBuffer.IsDisposed)
                        {
                            //draw target size in red, below old size
                            device.Indices = TGridIndexBuffer;
                            Effect.Parameters["DiffuseColor"].SetValue(new Vector4(0.5f, 1f, 0.5f, 1.0f));
                            pass = Effect.CurrentTechnique.Passes[(_3d) ? 1 : 0];
                            pass.Apply();
                            device.DrawIndexedPrimitives(PrimitiveType.LineList, 0, 0, TGridPrimitives);
                        }

                        Effect.Parameters["DiffuseColor"].SetValue(new Vector4(0, 0, 0, 1.0f));
                        device.Indices = GridIndexBuffer;
                        pass           = Effect.CurrentTechnique.Passes[(_3d) ? 1 : 0];
                        pass.Apply();
                        device.DrawIndexedPrimitives(PrimitiveType.LineList, 0, 0, GridPrimitives);
                    }


                    device.DepthStencilState = depth;

                    if (FSOEnvironment.UseMRT)
                    {
                        device.SetRenderTargets(rts);
                    }
                }
            });
        }
Exemplo n.º 13
0
        public override void Draw(GraphicsDevice device, WorldState world)
        {
            var enableParallax = WorldConfig.Current.Complex && ParallaxTexture != null;

            device.RasterizerState = RasterizerState.CullNone;
            if (ShapeDirty)
            {
                RegenRoof(device);
                ShapeDirty = false;
                StyleDirty = false;
            }
            else if (StyleDirty)
            {
                RemeshRoof(device);
                StyleDirty = false;
            }

            device.RasterizerState = RasterizerState.CullClockwise;
            device.BlendState      = BlendState.AlphaBlend;
            for (int i = 0; i < Drawgroups.Length; i++)
            {
                if (i > world.Level - 1)
                {
                    break;
                }
                Effect.Level = (float)i + 1.0001f;
                if (Drawgroups[i] != null)
                {
                    var dg = Drawgroups[i];
                    if (dg.NumPrimitives == 0)
                    {
                        continue;
                    }
                    PPXDepthEngine.RenderPPXDepth(Effect, true, (depthMode) =>
                    {
                        Effect.View         = world.View;
                        Effect.Projection   = world.Projection;
                        Effect.World        = Matrix.Identity;
                        Effect.DiffuseColor = new Vector4(world.OutsideColor.R / 255f, world.OutsideColor.G / 255f, world.OutsideColor.B / 255f, 1.0f);
                        Effect.UseTexture   = true;
                        Effect.BaseTex      = Texture;
                        Effect.Alpha        = 1f;
                        Effect.IgnoreColor  = false;
                        Effect.TexOffset    = Vector2.Zero;
                        Effect.TexMatrix    = new Vector4(1, 0, 0, 1);

                        Effect.ParallaxUVTexMat = new Vector4(1, 0, 1, 0);
                        Effect.ParallaxHeight   = 0.2f * TexRescale;
                        Effect.ParallaxTex      = ParallaxTexture;
                        Effect.NormalMapTex     = NormalMap;

                        Effect.GrassShininess = 0.01f;//005f);

                        var pass3d = (enableParallax) ? 3 : 2;
                        var pass2d = (enableParallax && WorldConfig.Current.AdvancedLighting) ? 3 : WorldConfig.Current.PassOffset;

                        device.SetVertexBuffer(dg.VertexBuffer);
                        device.Indices = dg.IndexBuffer;

                        Effect.SetTechnique(GrassTechniques.DrawBase);
                        var pass = Effect.CurrentTechnique.Passes[(world.CameraMode == CameraRenderMode._3D)?pass3d:pass2d];
                        pass.Apply();
                        device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, dg.NumPrimitives);

                        if (dg.AdvNumPrimitives > 0)
                        {
                            device.SetVertexBuffer(dg.AdvVertexBuffer);
                            device.Indices        = dg.AdvIndexBuffer;
                            Effect.BaseTex        = EdgeTexture;
                            Effect.GrassShininess = 0.003f;
                            pass = Effect.CurrentTechnique.Passes[(world.CameraMode == CameraRenderMode._3D) ? 2 : WorldConfig.Current.PassOffset];
                            pass.Apply();
                            device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, dg.AdvNumPrimitives);
                        }
                    });
                }
            }
            device.BlendState      = BlendState.Opaque;
            device.RasterizerState = RasterizerState.CullNone;
        }