예제 #1
0
        /// <summary>
        /// Indicates whether the current object is equal to another object of the same type.
        /// </summary>
        /// <param name="other">
        /// A <see cref="GraphicsState"/> to compare to this GraphicsState.
        /// </param>
        /// <returns>
        /// It returns true if the current object is equal to <paramref name="other"/>.
        /// </returns>
        /// <remarks>
        /// <para>
        /// This method test only whether <paramref name="other"/> type equals to this type.
        /// </para>
        /// </remarks>
        /// <exception cref="ArgumentNullException">
        /// This exception is thrown if the parameter <paramref name="other"/> is null.
        /// </exception>
        public override bool Equals(IGraphicsState other)
        {
            if (base.Equals(other) == false)
            {
                return(false);
            }
            Debug.Assert(other is WriteMaskState);

            WriteMaskState otherState = (WriteMaskState)other;

            return(true);
        }
예제 #2
0
        /// <summary>
        /// Merge this state with another one.
        /// </summary>
        /// <param name="state">
        /// A <see cref="IGraphicsState"/> having the same <see cref="StateIdentifier"/> of this state.
        /// </param>
        public override void Merge(IGraphicsState state)
        {
            if (state == null)
            {
                throw new ArgumentNullException("state");
            }

            WriteMaskState otherState = state as WriteMaskState;

            if (otherState == null)
            {
                throw new ArgumentException("not a WriteMaskState", "state");
            }
        }
예제 #3
0
 private void ApplyStateCore(GraphicsContext ctx, ShaderProgram program, WriteMaskState currentState)
 {
     // Color
     if (ColorMaskR != currentState.ColorMaskR || ColorMaskG != currentState.ColorMaskG || ColorMaskB != currentState.ColorMaskB || ColorMaskA != currentState.ColorMaskA)
     {
         Gl.ColorMask(ColorMaskR, ColorMaskG, ColorMaskB, ColorMaskA);
     }
     // Depth
     if (DepthMask != currentState.DepthMask)
     {
         Gl.DepthMask(DepthMask);
     }
     // Stencil
     if (ctx.Version >= Gl.Version_200)
     {
         if (StencilMaskFront != StencilMaskBack)
         {
             if (StencilMaskFront != currentState.StencilMaskFront)
             {
                 Gl.StencilMaskSeparate(StencilFaceDirection.Front, StencilMaskFront);
             }
             if (StencilMaskBack != currentState.StencilMaskBack)
             {
                 Gl.StencilMaskSeparate(StencilFaceDirection.Back, StencilMaskBack);
             }
         }
         else
         {
             if (StencilMaskFront != currentState.StencilMaskFront || StencilMaskFront != currentState.StencilMaskBack)
             {
                 Gl.StencilMaskSeparate(StencilFaceDirection.FrontAndBack, StencilMaskFront);
             }
         }
     }
     else
     {
         if (StencilMaskFront != StencilMaskBack)
         {
             throw new InvalidOperationException("seperate stencil mask not supported");
         }
         if (StencilMaskFront != currentState.StencilMaskFront)
         {
             Gl.StencilMask(StencilMaskFront);
         }
     }
 }
예제 #4
0
        /// <summary>
        /// Set ShaderProgram state.
        /// </summary>
        /// <param name="ctx">
        /// A <see cref="GraphicsContext"/> which has defined the shader program <paramref name="program"/>.
        /// </param>
        /// <param name="program">
        /// The <see cref="ShaderProgram"/> which has the state set.
        /// </param>
        public override void Apply(GraphicsContext ctx, ShaderProgram program)
        {
            if (ctx == null)
            {
                throw new ArgumentNullException("ctx");
            }

            WriteMaskState currentState = (WriteMaskState)ctx.GetCurrentState(StateIndex);

            if (currentState != null)
            {
                ApplyStateCore(ctx, program, currentState);
            }
            else
            {
                ApplyStateCore(ctx, program);
            }

            ctx.SetCurrentState(this);
        }