/// <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); }
/// <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"); } }
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); } } }
/// <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); }