/// <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();*/ }
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); } }); } }
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); } }); } }
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); } }); }
/// <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++; } }
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); }); } } }
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); } }); } } }
/// <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); } } }); }
/// <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); } } }); }
/// <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); } } }); }
/// <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); } } }); }
/// <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); } } }); }
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; }