Ejemplo n.º 1
0
        private static bool ChangesFoundInStencil(
            GLQueueRendererStencilState previous,
            GLQueueRendererStencilState current
            )
        {
            var mask = GLGraphicsPipelineFlagBits.StencilEnabled
                       | GLGraphicsPipelineFlagBits.TwoSidedStencilMode;

            var pastFlags = mask & previous.Flags;
            var nextFlags = mask & current.Flags;

            return((pastFlags != nextFlags) || (!previous.Enums.Equals(current.Enums)));
        }
Ejemplo n.º 2
0
        private void ApplyStencilChanges(
            GLQueueRendererStencilState past,
            GLQueueRendererStencilState next)
        {
            var pastStencil = past.Enums;
            var nextStencil = next.Enums;

            if (past.Front.WriteMask != next.Front.WriteMask)
            {
                mStencil.SetStencilWriteMask(MgStencilFaceFlagBits.FRONT_BIT, next.Front.WriteMask);
            }

            var newStencilEnabled = (next.Flags & GLGraphicsPipelineFlagBits.StencilEnabled);

            if (mStencil.IsStencilBufferEnabled != (newStencilEnabled != 0))
            {
                if (mStencil.IsStencilBufferEnabled)
                {
                    mStencil.DisableStencilBuffer();
                }
                else
                {
                    mStencil.EnableStencilBuffer();

                    if
                    (
                        nextStencil.FrontStencilFail != pastStencil.FrontStencilFail ||
                        nextStencil.FrontDepthBufferFail != pastStencil.FrontDepthBufferFail ||
                        nextStencil.FrontStencilPass != pastStencil.FrontStencilPass
                    )
                    {
                        mStencil.SetFrontFaceStencilOperation(nextStencil.FrontStencilFail, nextStencil.FrontDepthBufferFail, nextStencil.FrontStencilPass);
                    }
                    if
                    (
                        nextStencil.BackStencilFail != pastStencil.BackStencilFail ||
                        nextStencil.BackDepthBufferFail != pastStencil.BackDepthBufferFail ||
                        nextStencil.BackStencilPass != pastStencil.BackStencilPass
                    )
                    {
                        mStencil.SetBackFaceStencilOperation(nextStencil.BackStencilFail, nextStencil.BackDepthBufferFail, nextStencil.BackStencilPass);
                    }
                }
            }
        }
Ejemplo n.º 3
0
        public void Initialize()
        {
            const int NO_OF_COLOR_ATTACHMENTS = 4;

            mPastColorBlendEnums = mBlend.Initialize(NO_OF_COLOR_ATTACHMENTS);

            var initialStencilValue = mStencil.Initialize();

            mPastStencilInfo = initialStencilValue;

            mPastFrontWriteMask = initialStencilValue.Front.WriteMask;
            mPastBackWriteMask  = initialStencilValue.Back.WriteMask;

            mPastFrontStencilInfo = new GLCmdStencilFunctionInfo
            {
                CompareMask     = initialStencilValue.Front.CompareMask,
                ReferenceMask   = initialStencilValue.Front.Reference,
                StencilFunction = initialStencilValue.Enums.FrontStencilFunction,
            };

            mPastBackStencilInfo = new GLCmdStencilFunctionInfo
            {
                CompareMask     = initialStencilValue.Back.CompareMask,
                ReferenceMask   = initialStencilValue.Back.Reference,
                StencilFunction = initialStencilValue.Enums.BackStencilFunction,
            };

            var initialDepthValue = mDepth.Initialize();

            PreviousPipeline = new GLCmdBufferPipelineItem {
                DepthState   = initialDepthValue,
                StencilState = initialStencilValue.Enums,
            };

            mPastRasterization = mRaster.Initialize();

            mPastClearValues = mClear.Initialize();
        }