示例#1
0
        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);
            }
        }
示例#2
0
        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);
        }
示例#3
0
        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);
            }
        }
示例#4
0
        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);
            }
        }
示例#5
0
        private RasterizerState GetRasterizerState(RenderStateVariables renderStates, Layer layer)
        {
            bool isFullscreen = layer.ScissorIpso == null;

            if (isFullscreen)
            {
                return(scissorTestDisabled);
            }
            else
            {
                return(scissorTestEnabled);
            }
        }
示例#6
0
        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);
            }
        }
示例#7
0
        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);
            }
        }
示例#8
0
        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++;
        }
示例#9
0
        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;
        }
示例#10
0
        private RasterizerState GetRasterizerState(RenderStateVariables renderStates, Layer layer)
        {
            bool isFullscreen = layer.ScissorIpso == null;

            if (isFullscreen)
            {
                return scissorTestDisabled;
            }
            else
            {
                return scissorTestEnabled;
            }
        }
示例#11
0
        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++;
        }
示例#12
0
        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);
            }
        }
示例#13
0
        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);
            }
        }
示例#14
0
        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);
            }
        }