public void BeginSpriteBatch(RenderStateVariables renderStates, Layer layer, BeginType beginType, Camera camera) { Matrix matrix = GetZoomAndMatrix(layer, camera); SamplerState samplerState = GetSamplerState(renderStates); bool isFullscreen = renderStates.ClipRectangle == null; RasterizerState rasterizerState; if (isFullscreen) { rasterizerState = scissorTestDisabled; } else { rasterizerState = scissorTestEnabled; } Rectangle scissorRectangle = new Rectangle(); if (rasterizerState.ScissorTestEnable) { scissorRectangle = renderStates.ClipRectangle.Value; // make sure values of with and height are never less than 0: if (scissorRectangle.Width < 0) { scissorRectangle.Width = 0; } if (scissorRectangle.Height < 0) { scissorRectangle.Height = 0; } } DepthStencilState depthStencilState = DepthStencilState.DepthRead; if (beginType == BeginType.Begin) { mSpriteBatch.ReplaceRenderStates(SpriteSortMode.Immediate, renderStates.BlendState, samplerState, depthStencilState, rasterizerState, null, matrix, scissorRectangle); } else { mSpriteBatch.PushRenderStates(SpriteSortMode.Immediate, renderStates.BlendState, samplerState, depthStencilState, rasterizerState, null, matrix, scissorRectangle); } }
private Microsoft.Xna.Framework.Graphics.SamplerState GetSamplerState(RenderStateVariables renderStates) { SamplerState samplerState; if (renderStates.Wrap) { if (renderStates.Filtering) { samplerState = SamplerState.LinearWrap; } else { samplerState = SamplerState.PointWrap; } } else { if (renderStates.Filtering) { samplerState = SamplerState.LinearClamp; } else { samplerState = SamplerState.PointClamp; } } return(samplerState); }
private void AdjustRenderStates(RenderStateVariables renderState, Layer layer, IRenderable renderable) { BlendState renderBlendState = renderable.BlendState; bool wrap = renderable.Wrap; bool shouldResetStates = false; if (renderBlendState == null) { renderBlendState = BlendState.NonPremultiplied; } if (renderState.BlendState != renderBlendState) { renderState.BlendState = renderable.BlendState; shouldResetStates = true; } if (renderState.Wrap != wrap) { renderState.Wrap = wrap; shouldResetStates = true; } if (shouldResetStates) { BeginSpriteBatch(renderState, layer, BeginType.Begin); } }
private void AdjustRenderStates(RenderStateVariables renderState, Layer layer, IRenderableIpso renderable) { BlendState renderBlendState = renderable.BlendState; bool wrap = renderable.Wrap; bool shouldResetStates = false; if (renderBlendState == null) { renderBlendState = Renderer.NormalBlendState; } if (renderState.BlendState != renderBlendState) { // This used to set this, but not sure why...I think it should set the renderBlendState: //renderState.BlendState = renderable.BlendState; renderState.BlendState = renderBlendState; shouldResetStates = true; } if (renderState.ColorOperation != renderable.ColorOperation) { renderState.ColorOperation = renderable.ColorOperation; shouldResetStates = true; } if (renderState.Wrap != wrap) { renderState.Wrap = wrap; shouldResetStates = true; } if (renderable.ClipsChildren) { Rectangle clipRectangle = GetScissorRectangleFor(Camera, renderable); if (renderState.ClipRectangle == null || clipRectangle != renderState.ClipRectangle.Value) { //todo: Don't just overwrite it, constrain this rect to the existing one, if it's not null: var adjustedRectangle = clipRectangle; if (renderState.ClipRectangle != null) { adjustedRectangle = ConstrainRectangle(clipRectangle, renderState.ClipRectangle.Value); } renderState.ClipRectangle = adjustedRectangle; shouldResetStates = true; } } if (shouldResetStates) { spriteRenderer.BeginSpriteBatch(renderState, layer, BeginType.Begin, mCamera); } }
private RasterizerState GetRasterizerState(RenderStateVariables renderStates, Layer layer) { bool isFullscreen = layer.ScissorIpso == null; if (isFullscreen) { return(scissorTestDisabled); } else { return(scissorTestEnabled); } }
public void BeginSpriteBatch(RenderStateVariables renderStates, Layer layer, BeginType beginType, Camera camera) { Matrix matrix = GetZoomAndMatrix(layer, camera); SamplerState samplerState = GetSamplerState(renderStates); bool isFullscreen = renderStates.ClipRectangle == null; RasterizerState rasterizerState; if (isFullscreen) { rasterizerState = scissorTestDisabled; } else { rasterizerState = scissorTestEnabled; } Rectangle scissorRectangle = new Rectangle(); if (rasterizerState.ScissorTestEnable) { scissorRectangle = renderStates.ClipRectangle.Value; } DepthStencilState depthStencilState = DepthStencilState.DepthRead; if (beginType == BeginType.Begin) { mSpriteBatch.ReplaceRenderStates(SpriteSortMode.Immediate, renderStates.BlendState, samplerState, depthStencilState, rasterizerState, null, matrix, scissorRectangle); } else { mSpriteBatch.PushRenderStates(SpriteSortMode.Immediate, renderStates.BlendState, samplerState, depthStencilState, rasterizerState, null, matrix, scissorRectangle); } }
private void AdjustRenderStates(RenderStateVariables renderState, Layer layer, IRenderableIpso renderable) { BlendState renderBlendState = renderable.BlendState; bool wrap = renderable.Wrap; bool shouldResetStates = false; if (renderBlendState == null) { renderBlendState = BlendState.NonPremultiplied; } if (renderState.BlendState != renderBlendState) { renderState.BlendState = renderable.BlendState; shouldResetStates = true; } if (renderState.Wrap != wrap) { renderState.Wrap = wrap; shouldResetStates = true; } if (renderable.ClipsChildren) { Rectangle clipRectangle = GetScissorRectangleFor(Camera, renderable); if (renderState.ClipRectangle == null || clipRectangle != renderState.ClipRectangle.Value) { //todo: Don't just overwrite it, constrain this rect to the existing one, if it's not null: var adjustedRectangle = clipRectangle; if (renderState.ClipRectangle != null) { adjustedRectangle = ConstrainRectangle(clipRectangle, renderState.ClipRectangle.Value); } renderState.ClipRectangle = adjustedRectangle; shouldResetStates = true; } } if (shouldResetStates) { spriteRenderer.BeginSpriteBatch(renderState, layer, BeginType.Begin, mCamera); } }
private void BeginSpriteBatch(RenderStateVariables renderStates, Layer layer, BeginType beginType) { Matrix matrix = GetZoomAndMatrix(layer); SamplerState samplerState = GetSamplerState(renderStates); RasterizerState rasterizerState = GetRasterizerState(renderStates, layer); Rectangle scissorRectangle = new Rectangle(); if (rasterizerState.ScissorTestEnable) { scissorRectangle = layer.GetScissorRectangleFor(mCamera); } DepthStencilState depthStencilState = DepthStencilState.DepthRead; if (beginType == BeginType.Begin) { mSpriteBatch.Begin(SpriteSortMode.Immediate, renderStates.BlendState, samplerState, depthStencilState, rasterizerState, null, matrix, scissorRectangle); } else { mSpriteBatch.Push(SpriteSortMode.Immediate, renderStates.BlendState, samplerState, depthStencilState, rasterizerState, null, matrix, scissorRectangle); } mDrawCallsPerFrame++; }
private Microsoft.Xna.Framework.Graphics.SamplerState GetSamplerState(RenderStateVariables renderStates) { SamplerState samplerState; if (renderStates.Wrap) { if (renderStates.Filtering) { samplerState = SamplerState.LinearWrap; } else { samplerState = SamplerState.PointWrap; } } else { if (renderStates.Filtering) { samplerState = SamplerState.LinearClamp; } else { samplerState = SamplerState.PointClamp; } } return samplerState; }
private RasterizerState GetRasterizerState(RenderStateVariables renderStates, Layer layer) { bool isFullscreen = layer.ScissorIpso == null; if (isFullscreen) { return scissorTestDisabled; } else { return scissorTestEnabled; } }
private void BeginSpriteBatch(RenderStateVariables renderStates, Layer layer, BeginType beginType) { Matrix matrix = GetZoomAndMatrix(layer); SamplerState samplerState = GetSamplerState(renderStates); RasterizerState rasterizerState = GetRasterizerState(renderStates, layer); Rectangle scissorRectangle = new Rectangle(); if(rasterizerState.ScissorTestEnable) { scissorRectangle = layer.GetScissorRectangleFor(mCamera); } DepthStencilState depthStencilState = DepthStencilState.DepthRead; if (beginType == BeginType.Begin) { mSpriteBatch.Begin(SpriteSortMode.Immediate, renderStates.BlendState, samplerState, depthStencilState, rasterizerState, null, matrix, scissorRectangle); } else { mSpriteBatch.Push(SpriteSortMode.Immediate, renderStates.BlendState, samplerState, depthStencilState, rasterizerState, null, matrix, scissorRectangle); } mDrawCallsPerFrame++; }
public void BeginSpriteBatch(RenderStateVariables renderStates, Layer layer, BeginType beginType, Camera camera) { Matrix matrix = Renderer.UseBasicEffectRendering ? Matrix.Identity : GetZoomAndMatrix(layer, camera); SamplerState samplerState = GetSamplerState(renderStates); bool isFullscreen = renderStates.ClipRectangle == null; RasterizerState rasterizerState; if (isFullscreen) { rasterizerState = scissorTestDisabled; } else { rasterizerState = scissorTestEnabled; } Rectangle scissorRectangle = new Rectangle(); if (rasterizerState.ScissorTestEnable) { scissorRectangle = renderStates.ClipRectangle.Value; // make sure values of with and height are never less than 0: if (scissorRectangle.Width < 0) { scissorRectangle.Width = 0; } if (scissorRectangle.Height < 0) { scissorRectangle.Height = 0; } } DepthStencilState depthStencilState = DepthStencilState.DepthRead; var width = camera.ClientWidth; var height = camera.ClientHeight; BasicEffect effectiveEffect = null; if (Renderer.UseBasicEffectRendering) { if (Renderer.ApplyCameraZoomOnWorldTranslation) { basicEffect.World = Matrix.CreateTranslation( -width / (2f * camera.Zoom), -height / (2f * camera.Zoom), 0); } else { basicEffect.World = Matrix.CreateTranslation( -width / (2f), -height / (2f), 0); } //effect.Projection = Matrix.CreateOrthographic(100, 100, 0.0001f, 1000); basicEffect.Projection = Matrix.CreateOrthographic( width, -height, -1, 1); basicEffect.View = GetZoomAndMatrix(layer, camera); effectiveEffect = Renderer.UseBasicEffectRendering ? basicEffect : null; } switch (renderStates.ColorOperation) { case ColorOperation.ColorTextureAlpha: basicEffect.TextureEnabled = true; basicEffect.VertexColorEnabled = true; // Since MonoGame doesn't use custom shaders, we have to hack this // using Fog. It works...but it's slow and introduces a lot of render breaks. // At some point in the future we should try to fix this. basicEffect.FogEnabled = true; basicEffect.FogStart = 0; basicEffect.FogEnd = 0; break; case ColorOperation.Modulate: basicEffect.VertexColorEnabled = true; basicEffect.FogEnabled = false; basicEffect.TextureEnabled = true; break; } if (beginType == BeginType.Begin) { mSpriteBatch.ReplaceRenderStates(SpriteSortMode.Immediate, renderStates.BlendState, samplerState, depthStencilState, rasterizerState, effectiveEffect, matrix, scissorRectangle); } else { mSpriteBatch.PushRenderStates(SpriteSortMode.Immediate, renderStates.BlendState, samplerState, depthStencilState, rasterizerState, effectiveEffect, matrix, scissorRectangle); } }