/// <summary> /// Draw everything in the level from background to foreground. /// </summary> public void Draw(GameTime gameTime, Frame frame, DefaultMaterialSet materials) { BitmapBatch bb; var material = materials.Get(materials.ScreenSpaceBitmap, blendState: BlendState.AlphaBlend); for (int i = 0; i <= EntityLayer; ++i) { using (bb = BitmapBatch.New(frame, i, material)) bb.Add(new BitmapDrawCall(layers[i], Vector2.Zero)); } using (bb = BitmapBatch.New(frame, EntityLayer + 1, material)) DrawTiles(bb); using (var entityBatch = BitmapBatch.New(frame, EntityLayer + 1, material)) { foreach (Gem gem in gems) { gem.Draw(gameTime, entityBatch); } Player.Draw(gameTime, entityBatch); foreach (Enemy enemy in enemies) { enemy.Draw(gameTime, entityBatch); } } for (int i = EntityLayer + 1; i < layers.Length; ++i) { using (bb = BitmapBatch.New(frame, i + 1, material)) bb.Add(new BitmapDrawCall(layers[i], Vector2.Zero)); } }
public void Draw( ref BitmapDrawCall drawCall, int?layer = null, bool?worldSpace = null, BlendState blendState = null, SamplerState samplerState = null, Material material = null ) { if (Container == null) { throw new InvalidOperationException("You cannot use the argumentless ImperativeRenderer constructor."); } else if (Container.IsReleased) { throw new ObjectDisposedException("The container this ImperativeRenderer is drawing into has been disposed."); } using (var batch = GetBitmapBatch( layer, worldSpace, blendState, samplerState, material )) { if (LowPriorityMaterialOrdering) { if (material != null) { material = Materials.Get(material, RasterizerState, DepthStencilState, blendState ?? BlendState); } else { material = Materials.GetBitmapMaterial(worldSpace ?? WorldSpace, RasterizerState, DepthStencilState, blendState ?? BlendState); } var mmbb = (MultimaterialBitmapBatch)batch; mmbb.Add(ref drawCall, material, samplerState, samplerState); } else { batch.Add(ref drawCall); } } }
public override void Draw(GameTime gameTime, Frame frame) { var ir = new ImperativeRenderer(frame, Materials, samplerState: SamplerState.LinearClamp); ir.AutoIncrementLayer = true; ir.Clear(color: ClearColor); Text.Position = TopLeft; Text2.LineBreakAtX = Text.LineBreakAtX = BottomRight.X - TopLeft.X; Text.WrapIndentation = Text2.WrapIndentation = Indent.Value ? 64 : 0; ir.OutlineRectangle(new Bounds(TopLeft, BottomRight), Color.Red); var layout = Text.Get(); if (ShowOutlines.Value) { foreach (var dc in layout.DrawCalls) { ir.OutlineRectangle(dc.EstimateDrawBounds(), Color.Blue); } } var m = Materials.Get(Materials.ScreenSpaceShadowedBitmap, blendState: BlendState.AlphaBlend); m.Parameters.ShadowColor.SetValue(new Vector4(0, 0, 0, 0.66f)); m.Parameters.ShadowOffset.SetValue(new Vector2(3.5f, 3.5f)); ir.OutlineRectangle(Bounds.FromPositionAndSize(Text.Position, layout.Size), Color.Yellow * 0.75f); ir.DrawMultiple(layout, material: m); if (Which.Value) { Text2.Position = TopLeft + new Vector2(0, layout.Size.Y + 20); layout = Text2.Get(); if (ShowOutlines.Value) { foreach (var dc in layout.DrawCalls) { ir.OutlineRectangle(dc.EstimateDrawBounds(), Color.Blue); } } ir.OutlineRectangle(Bounds.FromPositionAndSize(Text2.Position, layout.Size), Color.Yellow * 0.75f); ir.DrawMultiple(layout, material: m); } }
public LightingRenderer(ContentManager content, RenderCoordinator coordinator, DefaultMaterialSet materials, LightingEnvironment environment) { Materials = materials; Coordinator = coordinator; IlluminantMaterials = new IlluminantMaterials(materials); StoreScissorRect = _StoreScissorRect; RestoreScissorRect = _RestoreScissorRect; ShadowBatchSetup = _ShadowBatchSetup; IlluminationBatchSetup = _IlluminationBatchSetup; IlluminantMaterials.ClearStencil = materials.Get( materials.Clear, rasterizerState: RasterizerState.CullNone, depthStencilState: new DepthStencilState { StencilEnable = true, StencilMask = StencilTrue, StencilWriteMask = StencilTrue, ReferenceStencil = StencilFalse, StencilFunction = CompareFunction.Always, StencilPass = StencilOperation.Replace, StencilFail = StencilOperation.Replace, }, blendState: BlendState.Opaque ); materials.Add( IlluminantMaterials.DebugOutlines = materials.WorldSpaceGeometry.SetStates( blendState: BlendState.AlphaBlend ) ); // If stencil == false, paint point light at this location PointLightStencil = new DepthStencilState { DepthBufferEnable = false, StencilEnable = true, StencilMask = StencilTrue, StencilWriteMask = StencilFalse, StencilFunction = CompareFunction.Equal, StencilPass = StencilOperation.Keep, StencilFail = StencilOperation.Keep, ReferenceStencil = StencilFalse }; { var dBegin = new[] { MaterialUtil.MakeDelegate( rasterizerState: RenderStates.ScissorOnly, depthStencilState: PointLightStencil ) }; var dEnd = new[] { MaterialUtil.MakeDelegate( rasterizerState: RasterizerState.CullNone, depthStencilState: DepthStencilState.None ) }; #if SDL2 materials.Add(IlluminantMaterials.PointLightExponential = new DelegateMaterial( PointLightMaterialsInner[0] = new Squared.Render.EffectMaterial( content.Load <Effect>("PointLightExponential"), "PointLightExponential" ), dBegin, dEnd )); materials.Add(IlluminantMaterials.PointLightLinear = new DelegateMaterial( PointLightMaterialsInner[1] = new Squared.Render.EffectMaterial( content.Load <Effect>("PointLightLinear"), "PointLightLinear" ), dBegin, dEnd )); materials.Add(IlluminantMaterials.PointLightExponentialRampTexture = new DelegateMaterial( PointLightMaterialsInner[2] = new Squared.Render.EffectMaterial( content.Load <Effect>("PointLightExponentialRampTexture"), "PointLightExponentialRampTexture" ), dBegin, dEnd )); materials.Add(IlluminantMaterials.PointLightLinearRampTexture = new DelegateMaterial( PointLightMaterialsInner[3] = new Squared.Render.EffectMaterial( content.Load <Effect>("PointLightLinearRampTexture"), "PointLightLinearRampTexture" ), dBegin, dEnd )); #else materials.Add(IlluminantMaterials.PointLightExponential = new DelegateMaterial( PointLightMaterialsInner[0] = new Squared.Render.EffectMaterial( content.Load <Effect>("Illumination"), "PointLightExponential" ), dBegin, dEnd )); materials.Add(IlluminantMaterials.PointLightLinear = new DelegateMaterial( PointLightMaterialsInner[1] = new Squared.Render.EffectMaterial( content.Load <Effect>("Illumination"), "PointLightLinear" ), dBegin, dEnd )); materials.Add(IlluminantMaterials.PointLightExponentialRampTexture = new DelegateMaterial( PointLightMaterialsInner[2] = new Squared.Render.EffectMaterial( content.Load <Effect>("Illumination"), "PointLightExponentialRampTexture" ), dBegin, dEnd )); materials.Add(IlluminantMaterials.PointLightLinearRampTexture = new DelegateMaterial( PointLightMaterialsInner[3] = new Squared.Render.EffectMaterial( content.Load <Effect>("Illumination"), "PointLightLinearRampTexture" ), dBegin, dEnd )); #endif } // If stencil == false: set stencil to true. // If stencil == true: leave stencil alone, don't paint this pixel ShadowStencil = new DepthStencilState { DepthBufferEnable = false, StencilEnable = true, StencilMask = StencilTrue, StencilWriteMask = StencilTrue, StencilFunction = CompareFunction.NotEqual, StencilPass = StencilOperation.Replace, StencilFail = StencilOperation.Keep, ReferenceStencil = StencilTrue }; materials.Add(IlluminantMaterials.Shadow = new DelegateMaterial( ShadowMaterialInner = new Squared.Render.EffectMaterial( #if SDL2 content.Load <Effect>("Shadow"), "Shadow" #else content.Load <Effect>("Illumination"), "Shadow" #endif ), new[] { MaterialUtil.MakeDelegate( rasterizerState: RenderStates.ScissorOnly, depthStencilState: ShadowStencil, blendState: RenderStates.DrawNone ) }, new[] { MaterialUtil.MakeDelegate( rasterizerState: RasterizerState.CullNone, depthStencilState: DepthStencilState.None ) } )); #if SDL2 materials.Add(IlluminantMaterials.ScreenSpaceGammaCompressedBitmap = new Squared.Render.EffectMaterial( content.Load <Effect>("ScreenSpaceGammaCompressedBitmap"), "ScreenSpaceGammaCompressedBitmap" )); materials.Add(IlluminantMaterials.WorldSpaceGammaCompressedBitmap = new Squared.Render.EffectMaterial( content.Load <Effect>("WorldSpaceGammaCompressedBitmap"), "WorldSpaceGammaCompressedBitmap" )); materials.Add(IlluminantMaterials.ScreenSpaceToneMappedBitmap = new Squared.Render.EffectMaterial( content.Load <Effect>("ScreenSpaceToneMappedBitmap"), "ScreenSpaceToneMappedBitmap" )); materials.Add(IlluminantMaterials.WorldSpaceToneMappedBitmap = new Squared.Render.EffectMaterial( content.Load <Effect>("WorldSpaceToneMappedBitmap"), "WorldSpaceToneMappedBitmap" )); #else materials.Add(IlluminantMaterials.ScreenSpaceGammaCompressedBitmap = new Squared.Render.EffectMaterial( content.Load <Effect>("HDRBitmap"), "ScreenSpaceGammaCompressedBitmap" )); materials.Add(IlluminantMaterials.WorldSpaceGammaCompressedBitmap = new Squared.Render.EffectMaterial( content.Load <Effect>("HDRBitmap"), "WorldSpaceGammaCompressedBitmap" )); materials.Add(IlluminantMaterials.ScreenSpaceToneMappedBitmap = new Squared.Render.EffectMaterial( content.Load <Effect>("HDRBitmap"), "ScreenSpaceToneMappedBitmap" )); materials.Add(IlluminantMaterials.WorldSpaceToneMappedBitmap = new Squared.Render.EffectMaterial( content.Load <Effect>("HDRBitmap"), "WorldSpaceToneMappedBitmap" )); materials.Add(IlluminantMaterials.ScreenSpaceRampBitmap = new Squared.Render.EffectMaterial( content.Load <Effect>("RampBitmap"), "ScreenSpaceRampBitmap" )); materials.Add(IlluminantMaterials.WorldSpaceRampBitmap = new Squared.Render.EffectMaterial( content.Load <Effect>("RampBitmap"), "WorldSpaceRampBitmap" )); #endif Environment = environment; // Reduce garbage created by BufferPool<>.Allocate when creating cached sectors BufferPool <ShadowVertex> .MaxBufferSize = 1024 * 16; BufferPool <short> .MaxBufferSize = 1024 * 32; }
public override void Draw(Squared.Render.Frame frame) { CreateRenderTargets(); LightmapMaterials.ViewportScale = new Vector2(1f / LightmapScale); LightmapMaterials.ProjectionMatrix = Matrix.CreateOrthographicOffCenter( 0, BackgroundLightmap.Width, BackgroundLightmap.Height, 0, 0, 1 ); using (var backgroundGroup = BatchGroup.ForRenderTarget(frame, 0, Background)) { ClearBatch.AddNew(backgroundGroup, 1, Game.ScreenMaterials.Clear, clearColor: Color.Transparent); using (var bb = BitmapBatch.New(backgroundGroup, 2, Game.ScreenMaterials.WorldSpaceBitmap)) { for (var i = 0; i < 1; i++) { var layer = Layers[i]; var dc = new BitmapDrawCall(layer, Vector2.Zero); dc.SortKey = i; bb.Add(dc); } } } using (var foregroundGroup = BatchGroup.ForRenderTarget(frame, 1, Foreground)) { ClearBatch.AddNew(foregroundGroup, 1, Game.ScreenMaterials.Clear, clearColor: Color.Transparent); using (var bb = BitmapBatch.New(foregroundGroup, 2, Game.ScreenMaterials.WorldSpaceBitmap)) { for (var i = 1; i < Layers.Length; i++) { var layer = Layers[i]; var dc = new BitmapDrawCall(layer, Vector2.Zero); dc.SortKey = i; bb.Add(dc); } } } using (var backgroundLightGroup = BatchGroup.ForRenderTarget(frame, 4, BackgroundLightmap)) { ClearBatch.AddNew(backgroundLightGroup, 1, LightmapMaterials.Clear, clearColor: new Color(32, 32, 32, 255), clearZ: 0, clearStencil: 0); BackgroundRenderer.RenderLighting(frame, backgroundLightGroup, 2); } using (var foregroundLightGroup = BatchGroup.ForRenderTarget(frame, 5, ForegroundLightmap)) { ClearBatch.AddNew(foregroundLightGroup, 1, LightmapMaterials.Clear, clearColor: new Color(96, 96, 96, 255), clearZ: 0, clearStencil: 0); ForegroundRenderer.RenderLighting(frame, foregroundLightGroup, 2); } SetRenderTargetBatch.AddNew(frame, 49, null); ClearBatch.AddNew(frame, 50, Game.ScreenMaterials.Clear, clearColor: Color.Black, clearZ: 0, clearStencil: 0); if (ShowLightmap) { using (var bb = BitmapBatch.New(frame, 55, Game.ScreenMaterials.WorldSpaceBitmap)) { var dc = new BitmapDrawCall(BackgroundLightmap, Vector2.Zero, LightmapScale); bb.Add(dc); } ParticleRenderer.Draw(frame, 56); } else { var dc = new BitmapDrawCall(Background, Vector2.Zero); var material = LightmapMaterials.Get(LightmapMaterials.WorldSpaceLightmappedBitmap, blendState: BlendState.AlphaBlend); using (var bb = BitmapBatch.New(frame, 55, material)) { dc.Textures = new TextureSet(Background, BackgroundLightmap); dc.SortKey = 0; bb.Add(dc); } ParticleRenderer.Draw(frame, 56); using (var bb = BitmapBatch.New(frame, 57, material)) { dc.Textures = new TextureSet(Foreground, ForegroundLightmap); dc.SortKey = 1; bb.Add(dc); } } if (ShowOutlines || (Dragging != null)) { BackgroundRenderer.RenderOutlines(frame, 59, true); } }
public override void Draw(Squared.Render.Frame frame) { CreateRenderTargets(); LightmapMaterials.ViewportScale = new Vector2(1f / LightmapScale); LightmapMaterials.ProjectionMatrix = Matrix.CreateOrthographicOffCenter( 0, BackgroundLightmap.Width, BackgroundLightmap.Height, 0, 0, 1 ); using (var backgroundGroup = BatchGroup.ForRenderTarget(frame, 0, Background)) { ClearBatch.AddNew(backgroundGroup, 1, Game.ScreenMaterials.Clear, clearColor: Color.Transparent); using (var bb = BitmapBatch.New(backgroundGroup, 2, Game.ScreenMaterials.WorldSpaceBitmap)) { for (var i = 0; i < 1; i++) { var layer = Layers[i]; var dc = new BitmapDrawCall(layer, Vector2.Zero); dc.SortKey = i; bb.Add(dc); } } } using (var foregroundGroup = BatchGroup.ForRenderTarget(frame, 1, Foreground)) { ClearBatch.AddNew(foregroundGroup, 1, Game.ScreenMaterials.Clear, clearColor: Color.Transparent); using (var bb = BitmapBatch.New(foregroundGroup, 2, Game.ScreenMaterials.WorldSpaceBitmap)) { for (var i = 1; i < Layers.Length; i++) { var layer = Layers[i]; var dc = new BitmapDrawCall(layer, Vector2.Zero); dc.SortKey = i; bb.Add(dc); } } } if (ShowBrickSpecular) { using (var bricksLightGroup = BatchGroup.ForRenderTarget(frame, 2, ForegroundLightmap)) { ClearBatch.AddNew(bricksLightGroup, 1, LightmapMaterials.Clear, clearColor: new Color(0, 0, 0, 255), clearZ: 0, clearStencil: 0); ForegroundRenderer.RenderLighting(frame, bricksLightGroup, 2); } } if (ShowAOShadow) { using (var aoShadowFirstPassGroup = BatchGroup.ForRenderTarget(frame, 3, AOShadowScratch)) { ClearBatch.AddNew(aoShadowFirstPassGroup, 1, LightmapMaterials.Clear, clearColor: Color.Transparent); using (var bb = BitmapBatch.New(aoShadowFirstPassGroup, 2, Game.ScreenMaterials.ScreenSpaceHorizontalGaussianBlur5Tap)) { bb.Add(new BitmapDrawCall(Foreground, Vector2.Zero, 1f / LightmapScale)); } } } using (var backgroundLightGroup = BatchGroup.ForRenderTarget(frame, 4, BackgroundLightmap)) { ClearBatch.AddNew(backgroundLightGroup, 1, LightmapMaterials.Clear, clearColor: new Color(40, 40, 40, 255), clearZ: 0, clearStencil: 0); BackgroundRenderer.RenderLighting(frame, backgroundLightGroup, 2); if (ShowBrickSpecular) { using (var foregroundLightBatch = BitmapBatch.New(backgroundLightGroup, 3, MaskedForegroundMaterial)) { var dc = new BitmapDrawCall( ForegroundLightmap, Vector2.Zero ); dc.Textures = new TextureSet(dc.Textures.Texture1, BricksLightMask); foregroundLightBatch.Add(dc); } } else { ForegroundRenderer.RenderLighting(frame, backgroundLightGroup, 3); } if (ShowAOShadow) { using (var aoShadowBatch = BitmapBatch.New(backgroundLightGroup, 4, AOShadowMaterial)) { var dc = new BitmapDrawCall( AOShadowScratch, new Vector2(0, 4) ); dc.MultiplyColor = Color.Black; dc.AddColor = Color.White; aoShadowBatch.Add(dc); } } } using (var foregroundLightGroup = BatchGroup.ForRenderTarget(frame, 5, ForegroundLightmap)) { ClearBatch.AddNew(foregroundLightGroup, 1, LightmapMaterials.Clear, clearColor: new Color(127, 127, 127, 255), clearZ: 0, clearStencil: 0); ForegroundRenderer.RenderLighting(frame, foregroundLightGroup, 2); } SetRenderTargetBatch.AddNew(frame, 49, null); ClearBatch.AddNew(frame, 50, Game.ScreenMaterials.Clear, clearColor: Color.Black, clearZ: 0, clearStencil: 0); if (ShowLightmap) { using (var bb = BitmapBatch.New(frame, 55, Game.ScreenMaterials.WorldSpaceBitmap)) { var dc = new BitmapDrawCall(BackgroundLightmap, Vector2.Zero, LightmapScale); bb.Add(dc); } } else { var dc = new BitmapDrawCall(Background, Vector2.Zero); var material = LightmapMaterials.Get(LightmapMaterials.WorldSpaceLightmappedBitmap, blendState: BlendState.AlphaBlend); using (var bb = BitmapBatch.New(frame, 55, material)) { dc.Textures = new TextureSet(Background, BackgroundLightmap); dc.SortKey = 0; bb.Add(dc); } ParticleRenderer.Draw(frame, 56); using (var bb = BitmapBatch.New(frame, 57, material)) { dc.Textures = new TextureSet(Foreground, ForegroundLightmap); dc.SortKey = 1; bb.Add(dc); } } if (ShowOutlines || (Dragging != null)) { BackgroundRenderer.RenderOutlines(frame, 59, true); } }