Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
DepthStencilState.OpenGL.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 #if SILICONSTUDIO_PARADOX_GRAPHICS_API_OPENGL
4 using System;
5 #if SILICONSTUDIO_PARADOX_GRAPHICS_API_OPENGLES
6 using OpenTK.Graphics.ES30;
7 #else
8 using OpenTK.Graphics.OpenGL;
9 #endif
10 
11 namespace SiliconStudio.Paradox.Graphics
12 {
13  public partial class DepthStencilState
14  {
15  private DepthFunction depthFunction;
16 
17  private DepthStencilState(GraphicsDevice device, DepthStencilStateDescription depthStencilStateDescription)
18  : base(device)
19  {
20  Description = depthStencilStateDescription;
21 
22  depthFunction = Description.DepthBufferFunction.ToOpenGLDepthFunction();
23  }
24 
25  /// <inheritdoc/>
26  protected internal override bool OnRecreate()
27  {
28  base.OnRecreate();
29  return true;
30  }
31 
32  public void Apply(int stencilReference)
33  {
34  if (Description.DepthBufferEnable)
35  {
36  GL.Enable(EnableCap.DepthTest);
37  ApplyDepthMask();
38  GL.DepthFunc(depthFunction);
39  }
40  else
41  {
42  GL.Disable(EnableCap.DepthTest);
43  }
44 
45  if (Description.StencilEnable)
46  {
47  GL.Enable(EnableCap.StencilTest);
48  GL.StencilMask(Description.StencilMask);
49 
50 #if SILICONSTUDIO_PARADOX_GRAPHICS_API_OPENGLCORE
51  GL.StencilFunc(Description.FrontFace.StencilFunction.ToOpenGLStencilFunction(), stencilReference, Description.StencilWriteMask); // set both faces
52  GL.StencilFuncSeparate(Version20.StencilBackFunc, Description.BackFace.StencilFunction.ToOpenGLStencilFunction(), stencilReference, Description.StencilWriteMask); // override back face
53  GL.StencilOpSeparate(StencilFace.Front, Description.FrontFace.StencilDepthBufferFail.ToOpenGL(), Description.FrontFace.StencilFail.ToOpenGL(), Description.FrontFace.StencilPass.ToOpenGL());
54  GL.StencilOpSeparate(StencilFace.Back, Description.BackFace.StencilDepthBufferFail.ToOpenGL(), Description.BackFace.StencilFail.ToOpenGL(), Description.BackFace.StencilPass.ToOpenGL());
55 #elif SILICONSTUDIO_PARADOX_GRAPHICS_API_OPENGLES
56  GL.StencilFuncSeparate(CullFaceMode.Front, Description.FrontFace.StencilFunction.ToOpenGLStencilFunction(), stencilReference, Description.StencilWriteMask);
57  GL.StencilFuncSeparate(CullFaceMode.Back, Description.BackFace.StencilFunction.ToOpenGLStencilFunction(), stencilReference, Description.StencilWriteMask);
58  GL.StencilOpSeparate(CullFaceMode.Front, Description.FrontFace.StencilDepthBufferFail.ToOpenGL(), Description.FrontFace.StencilFail.ToOpenGL(), Description.FrontFace.StencilPass.ToOpenGL());
59  GL.StencilOpSeparate(CullFaceMode.Back, Description.BackFace.StencilDepthBufferFail.ToOpenGL(), Description.BackFace.StencilFail.ToOpenGL(), Description.BackFace.StencilPass.ToOpenGL());
60 #endif
61  }
62  else
63  {
64  GL.Disable(EnableCap.StencilTest);
65  }
66  }
67 
68  internal void ApplyDepthMask()
69  {
70  GL.DepthMask(Description.DepthBufferWriteEnable && GraphicsDevice.hasDepthStencilBuffer);
71  }
72  }
73 }
74 #endif