]> git.tdb.fi Git - libs/gl.git/blob - source/core/stenciltest.h
Redesign depth and stencil test and blend state management
[libs/gl.git] / source / core / stenciltest.h
1 #ifndef MSP_GL_STENCILTEST_H_
2 #define MSP_GL_STENCILTEST_H_
3
4 #include <msp/datafile/objectloader.h>
5 #include <msp/strings/lexicalcast.h>
6 #include "predicate.h"
7
8 namespace Msp {
9 namespace GL {
10
11 enum StencilOp
12 {
13         KEEP,
14         SET_ZERO,
15         REPLACE,
16         INCR,
17         DECR,
18         INVERT,
19         INCR_WRAP,
20         DECR_WRAP
21 };
22
23 /**
24 Tests values in the stencil buffer against a reference.  If the test fails, the
25 incoming fragment is discarded.  The stencil buffer may be modified according
26 to results of the stencil test and the depth test.
27 */
28 struct StencilTest
29 {
30         class Loader: public DataFile::ObjectLoader<StencilTest>
31         {
32         public:
33                 Loader(StencilTest &);
34
35         private:
36                 void compare(Predicate);
37                 void actions(StencilOp, StencilOp, StencilOp);
38         };
39
40         bool enabled;
41         Predicate compare;
42         StencilOp stencil_fail_op;
43         StencilOp depth_fail_op;
44         StencilOp depth_pass_op;
45         unsigned reference;
46
47         StencilTest();
48 };
49
50 GLenum get_gl_stencil_op(StencilOp);
51
52 void operator>>(const LexicalConverter &, StencilOp &);
53 void operator<<(LexicalConverter &, StencilOp);
54
55 } // namespace GL
56 } // namespace Msp
57
58 #endif