Project

General

Profile

Download (21.1 KB) Statistics
| Branch: | Revision:

library / src / main / java / org / distorted / library / main / DistortedRenderState.java @ a4b182d4

1 9dba4df1 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2016 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Distorted.                                                               //
5
//                                                                                               //
6
// Distorted is free software: you can redistribute it and/or modify                             //
7
// it under the terms of the GNU General Public License as published by                          //
8
// the Free Software Foundation, either version 2 of the License, or                             //
9
// (at your option) any later version.                                                           //
10
//                                                                                               //
11
// Distorted is distributed in the hope that it will be useful,                                  //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
14
// GNU General Public License for more details.                                                  //
15
//                                                                                               //
16
// You should have received a copy of the GNU General Public License                             //
17
// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19
20 fe82a979 Leszek Koltunski
package org.distorted.library.main;
21 9dba4df1 leszek
22 e6519ac8 Leszek Koltunski
import android.opengl.GLES31;
23 9dba4df1 leszek
24
///////////////////////////////////////////////////////////////////////////////////////////////////
25
/**
26
 * Remember the OpenGL state.
27 ad16ed3b Leszek Koltunski
 * <p>
28
 * This is a member of DistortedNode. Remembers the OpenGL state we want to set just before rendering
29
 * the Node.
30 7266d8ef Leszek Koltunski
 * <p>
31
 * Only for use by the library itself.
32
 *
33
 * @y.exclude
34 9dba4df1 leszek
 */
35 7266d8ef Leszek Koltunski
public class DistortedRenderState
36 9dba4df1 leszek
{
37 23eecbd9 Leszek Koltunski
  // TODO: figure this out dynamically; this assumes 8 bit stencil buffer.
38
  private static final int STENCIL_MASK = (1<<8)-1;
39
40 5b959cc5 Leszek Koltunski
  private static class RenderState
41
    {
42
    private int colorMaskR, colorMaskG, colorMaskB, colorMaskA;
43
    private int depthMask;
44
    private int stencilMask;
45
    private int depthTest;
46
    private int stencilTest;
47
    private int stencilFuncFunc, stencilFuncRef, stencilFuncMask;
48
    private int stencilOpSfail, stencilOpDpfail, stencilOpDppass;
49
    private int depthFunc;
50
    private int blend;
51
    private int blendSrc, blendDst;
52
    }
53
54
  private RenderState mState;          // state the current object wants to have
55
  static private RenderState cState = new RenderState();   // current OpenGL Stave
56
  static private RenderState sState = new RenderState();   // saved OpenGL state
57
58
  private int mClear;
59 270c27bc Leszek Koltunski
60 9dba4df1 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
61 c834348d leszek
// default: color writes on, depth test and writes on, blending on, stencil off.
62 9dba4df1 leszek
63
  DistortedRenderState()
64
    {
65 5b959cc5 Leszek Koltunski
    mState = new RenderState();
66
67
    mState.colorMaskR = 1;
68
    mState.colorMaskG = 1;
69
    mState.colorMaskB = 1;
70
    mState.colorMaskA = 1;
71
72
    mState.depthTest  = 1;
73
    mState.depthMask  = 1;
74 e6519ac8 Leszek Koltunski
    mState.depthFunc  = GLES31.GL_LEQUAL;
75 5b959cc5 Leszek Koltunski
76
    mState.blend      = 1;
77 e6519ac8 Leszek Koltunski
    mState.blendSrc   = GLES31.GL_SRC_ALPHA;
78
    mState.blendDst   = GLES31.GL_ONE_MINUS_SRC_ALPHA;
79 5b959cc5 Leszek Koltunski
80
    mState.stencilTest     = 0;
81
    mState.stencilMask     = STENCIL_MASK;
82 e6519ac8 Leszek Koltunski
    mState.stencilFuncFunc = GLES31.GL_NEVER;
83 5b959cc5 Leszek Koltunski
    mState.stencilFuncRef  = 0;
84
    mState.stencilFuncMask = STENCIL_MASK;
85 e6519ac8 Leszek Koltunski
    mState.stencilOpSfail  = GLES31.GL_KEEP;
86
    mState.stencilOpDpfail = GLES31.GL_KEEP;
87
    mState.stencilOpDppass = GLES31.GL_KEEP;
88 ad16ed3b Leszek Koltunski
89
    mClear = 0;
90 9dba4df1 leszek
    }
91
92
///////////////////////////////////////////////////////////////////////////////////////////////////
93 f75a4eee Leszek Koltunski
// reset state of everything to a known state.
94 9dba4df1 leszek
95
  static void reset()
96
    {
97 f75a4eee Leszek Koltunski
    cState.colorMaskR = 1;
98
    cState.colorMaskG = 1;
99
    cState.colorMaskB = 1;
100
    cState.colorMaskA = 1;
101 e6519ac8 Leszek Koltunski
    GLES31.glColorMask(true,true,true,true);
102 f75a4eee Leszek Koltunski
103
    cState.depthTest = 1;
104
    cState.depthMask = 1;
105 e6519ac8 Leszek Koltunski
    cState.depthFunc = GLES31.GL_LEQUAL;
106
    GLES31.glEnable(GLES31.GL_DEPTH_TEST);
107
    GLES31.glDepthMask(true);
108
    GLES31.glDepthFunc(cState.depthFunc);
109 f75a4eee Leszek Koltunski
110
    cState.stencilTest     = 0;
111
    cState.stencilMask     = STENCIL_MASK;
112 e6519ac8 Leszek Koltunski
    cState.stencilFuncFunc = GLES31.GL_NEVER;
113 f75a4eee Leszek Koltunski
    cState.stencilFuncRef  = 0;
114
    cState.stencilFuncMask = STENCIL_MASK;
115 e6519ac8 Leszek Koltunski
    cState.stencilOpSfail  = GLES31.GL_KEEP;
116
    cState.stencilOpDpfail = GLES31.GL_KEEP;
117
    cState.stencilOpDppass = GLES31.GL_KEEP;
118
    GLES31.glDisable(GLES31.GL_STENCIL_TEST);
119
    GLES31.glStencilMask(cState.stencilMask);
120 f75a4eee Leszek Koltunski
121
    cState.blend      = 1;
122 e6519ac8 Leszek Koltunski
    cState.blendSrc   = GLES31.GL_SRC_ALPHA;
123
    cState.blendDst   = GLES31.GL_ONE_MINUS_SRC_ALPHA;
124
    GLES31.glEnable(GLES31.GL_BLEND);
125
    GLES31.glBlendFunc(cState.blendSrc,cState.blendDst);
126 9dba4df1 leszek
    }
127
128 580f7d10 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
129
130 23eecbd9 Leszek Koltunski
  static void colorDepthStencilOn()
131 580f7d10 leszek
    {
132 20ee7cc9 Leszek Koltunski
    sState.colorMaskR = cState.colorMaskR;
133
    sState.colorMaskG = cState.colorMaskG;
134
    sState.colorMaskB = cState.colorMaskB;
135
    sState.colorMaskA = cState.colorMaskA;
136
137 5b959cc5 Leszek Koltunski
    if( cState.colorMaskR!=1 || cState.colorMaskG!=1 || cState.colorMaskB!=1 || cState.colorMaskA!=1 )
138 580f7d10 leszek
      {
139 5b959cc5 Leszek Koltunski
      cState.colorMaskR = 1;
140
      cState.colorMaskG = 1;
141
      cState.colorMaskB = 1;
142
      cState.colorMaskA = 1;
143 e6519ac8 Leszek Koltunski
      GLES31.glColorMask(true,true,true,true);
144 580f7d10 leszek
      }
145 20ee7cc9 Leszek Koltunski
146
    sState.depthMask = cState.depthMask;
147
148 5b959cc5 Leszek Koltunski
    if( cState.depthMask!=1 )
149 580f7d10 leszek
      {
150 5b959cc5 Leszek Koltunski
      cState.depthMask = 1;
151 e6519ac8 Leszek Koltunski
      GLES31.glDepthMask(true);
152 580f7d10 leszek
      }
153 20ee7cc9 Leszek Koltunski
154
    sState.stencilMask = cState.stencilMask;
155
156 5b959cc5 Leszek Koltunski
    if( cState.stencilMask!= STENCIL_MASK )
157 23eecbd9 Leszek Koltunski
      {
158 5b959cc5 Leszek Koltunski
      cState.stencilMask = STENCIL_MASK;
159 e6519ac8 Leszek Koltunski
      GLES31.glStencilMask(cState.stencilMask);
160 23eecbd9 Leszek Koltunski
      }
161 580f7d10 leszek
    }
162
163 20ee7cc9 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
164
165
  static void colorDepthStencilRestore()
166
    {
167
    if( sState.colorMaskR!=cState.colorMaskR || sState.colorMaskG!=cState.colorMaskG || sState.colorMaskB!=cState.colorMaskB || sState.colorMaskA!=cState.colorMaskA)
168
      {
169
      cState.colorMaskR = sState.colorMaskR;
170
      cState.colorMaskG = sState.colorMaskG;
171
      cState.colorMaskB = sState.colorMaskB;
172
      cState.colorMaskA = sState.colorMaskA;
173 e6519ac8 Leszek Koltunski
      GLES31.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
174 20ee7cc9 Leszek Koltunski
      }
175
    if( sState.depthMask!=cState.depthMask )
176
      {
177
      cState.depthMask = sState.depthMask;
178 e6519ac8 Leszek Koltunski
      GLES31.glDepthMask(cState.depthMask==1);
179 20ee7cc9 Leszek Koltunski
      }
180
    if( sState.stencilMask!=cState.stencilMask )
181
      {
182
      cState.stencilMask = sState.stencilMask;
183 e6519ac8 Leszek Koltunski
      GLES31.glStencilMask(cState.stencilMask);
184 20ee7cc9 Leszek Koltunski
      }
185
    }
186
187 cab7c165 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
188
189
  static void switchOffDrawing()
190
    {
191 e6519ac8 Leszek Koltunski
    GLES31.glEnable(GLES31.GL_SCISSOR_TEST);
192
    GLES31.glScissor(0,0,0,0);
193 cab7c165 Leszek Koltunski
    }
194
195
///////////////////////////////////////////////////////////////////////////////////////////////////
196
197
  static void restoreDrawing()
198
    {
199 e6519ac8 Leszek Koltunski
    GLES31.glDisable(GLES31.GL_SCISSOR_TEST);
200 cab7c165 Leszek Koltunski
    }
201
202 270c27bc Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
203
204
  static void setUpStencilMark()
205
    {
206 20ee7cc9 Leszek Koltunski
    sState.stencilTest = cState.stencilTest;
207
208 5b959cc5 Leszek Koltunski
    if( cState.stencilTest!=1 )
209 270c27bc Leszek Koltunski
      {
210 5b959cc5 Leszek Koltunski
      cState.stencilTest = 1;
211 b3120b1b leszek
      //android.util.Log.d("State", "stencil test on");
212 e6519ac8 Leszek Koltunski
      GLES31.glEnable(GLES31.GL_STENCIL_TEST);
213 270c27bc Leszek Koltunski
      }
214 20ee7cc9 Leszek Koltunski
215
    sState.stencilFuncFunc = cState.stencilFuncFunc;
216
    sState.stencilFuncRef  = cState.stencilFuncRef;
217
    sState.stencilFuncMask = cState.stencilFuncMask;
218
219 e6519ac8 Leszek Koltunski
    if( cState.stencilFuncFunc!=GLES31.GL_ALWAYS || cState.stencilFuncRef!=1 || cState.stencilFuncMask!=STENCIL_MASK )
220 270c27bc Leszek Koltunski
      {
221 e6519ac8 Leszek Koltunski
      cState.stencilFuncFunc = GLES31.GL_ALWAYS;
222 5b959cc5 Leszek Koltunski
      cState.stencilFuncRef  = 1;
223
      cState.stencilFuncMask = STENCIL_MASK;
224 b3120b1b leszek
      //android.util.Log.d("State", "stencil func on");
225 e6519ac8 Leszek Koltunski
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
226 270c27bc Leszek Koltunski
      }
227 20ee7cc9 Leszek Koltunski
228
    sState.stencilOpSfail = cState.stencilOpSfail;
229
    sState.stencilOpDpfail= cState.stencilOpDpfail;
230
    sState.stencilOpDppass= cState.stencilOpDppass;
231
232 e6519ac8 Leszek Koltunski
    if( cState.stencilOpSfail!=GLES31.GL_KEEP || cState.stencilOpDpfail!=GLES31.GL_KEEP || cState.stencilOpDppass!=GLES31.GL_REPLACE )
233 270c27bc Leszek Koltunski
      {
234 e6519ac8 Leszek Koltunski
      cState.stencilOpSfail = GLES31.GL_KEEP;
235
      cState.stencilOpDpfail= GLES31.GL_KEEP;
236
      cState.stencilOpDppass= GLES31.GL_REPLACE;
237 b3120b1b leszek
      //android.util.Log.d("State", "stencil op on");
238 e6519ac8 Leszek Koltunski
      GLES31.glStencilOp(cState.stencilOpSfail,cState.stencilOpDpfail,cState.stencilOpDppass);
239 270c27bc Leszek Koltunski
      }
240 20ee7cc9 Leszek Koltunski
241
    sState.colorMaskR = cState.colorMaskR;
242
    sState.colorMaskG = cState.colorMaskG;
243
    sState.colorMaskB = cState.colorMaskB;
244
    sState.colorMaskA = cState.colorMaskA;
245
246 5b959cc5 Leszek Koltunski
    if( cState.colorMaskR!=0 || cState.colorMaskG!=0 || cState.colorMaskB!=0 || cState.colorMaskA!=0 )
247 270c27bc Leszek Koltunski
      {
248 5b959cc5 Leszek Koltunski
      cState.colorMaskR = 0;
249
      cState.colorMaskG = 0;
250
      cState.colorMaskB = 0;
251
      cState.colorMaskA = 0;
252 b3120b1b leszek
      //android.util.Log.d("State", "switch off color writing");
253 e6519ac8 Leszek Koltunski
      GLES31.glColorMask(false,false,false,false);
254 270c27bc Leszek Koltunski
      }
255 20ee7cc9 Leszek Koltunski
256
    sState.depthMask = cState.depthMask;
257
258 1d6d261e Leszek Koltunski
    if( cState.depthMask!=1 )
259 270c27bc Leszek Koltunski
      {
260 1d6d261e Leszek Koltunski
      cState.depthMask = 1;
261
      //android.util.Log.d("State", "switch on depth writing");
262 e6519ac8 Leszek Koltunski
      GLES31.glDepthMask(true);
263 270c27bc Leszek Koltunski
      }
264 20ee7cc9 Leszek Koltunski
265
    sState.stencilMask = cState.stencilMask;
266
267 5b959cc5 Leszek Koltunski
    if( cState.stencilMask!= STENCIL_MASK )
268 270c27bc Leszek Koltunski
      {
269 5b959cc5 Leszek Koltunski
      cState.stencilMask = STENCIL_MASK;
270 b3120b1b leszek
      //android.util.Log.d("State", "stencil mask on");
271 e6519ac8 Leszek Koltunski
      GLES31.glStencilMask(cState.stencilMask);
272 270c27bc Leszek Koltunski
      }
273
    }
274
275 984dc935 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
276
277
  static void unsetUpStencilMark()
278
    {
279
    if( sState.stencilTest!=cState.stencilTest )
280
      {
281
      cState.stencilTest = sState.stencilTest;
282
283
      if (cState.stencilTest == 0)
284
        {
285 e6519ac8 Leszek Koltunski
        GLES31.glDisable(GLES31.GL_STENCIL_TEST);
286 984dc935 Leszek Koltunski
        }
287
      else
288
        {
289 e6519ac8 Leszek Koltunski
        GLES31.glEnable(GLES31.GL_STENCIL_TEST);
290 984dc935 Leszek Koltunski
        }
291
      }
292
    if( sState.colorMaskR!=cState.colorMaskR || sState.colorMaskG!=cState.colorMaskG || sState.colorMaskB!=cState.colorMaskB || sState.colorMaskA!=cState.colorMaskA)
293
      {
294
      cState.colorMaskR = sState.colorMaskR;
295
      cState.colorMaskG = sState.colorMaskG;
296
      cState.colorMaskB = sState.colorMaskB;
297
      cState.colorMaskA = sState.colorMaskA;
298 e6519ac8 Leszek Koltunski
      GLES31.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
299 984dc935 Leszek Koltunski
      }
300
    if( sState.depthMask!=cState.depthMask )
301
      {
302
      cState.depthMask = sState.depthMask;
303 e6519ac8 Leszek Koltunski
      GLES31.glDepthMask(cState.depthMask==1);
304 984dc935 Leszek Koltunski
      }
305
    if( sState.stencilMask!=cState.stencilMask )
306
      {
307
      cState.stencilMask = sState.stencilMask;
308 e6519ac8 Leszek Koltunski
      GLES31.glStencilMask(cState.stencilMask);
309 984dc935 Leszek Koltunski
      }
310
    }
311
312 270c27bc Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
313 7266d8ef Leszek Koltunski
/**
314
 * Only for use by the library itself.
315
 *
316
 * @y.exclude
317
 */
318
  public static void useStencilMark()
319 270c27bc Leszek Koltunski
    {
320 20ee7cc9 Leszek Koltunski
    sState.stencilMask = cState.stencilMask;
321
322 5b959cc5 Leszek Koltunski
    if( cState.stencilTest!=1 )
323 270c27bc Leszek Koltunski
      {
324 5b959cc5 Leszek Koltunski
      cState.stencilTest = 1;
325 e6519ac8 Leszek Koltunski
      GLES31.glEnable(GLES31.GL_STENCIL_TEST);
326 270c27bc Leszek Koltunski
      }
327 20ee7cc9 Leszek Koltunski
328
    sState.stencilFuncFunc = cState.stencilFuncFunc;
329
    sState.stencilFuncRef  = cState.stencilFuncRef;
330
    sState.stencilFuncMask = cState.stencilFuncMask;
331
332 e6519ac8 Leszek Koltunski
    if( cState.stencilFuncFunc!=GLES31.GL_EQUAL || cState.stencilFuncRef!=1 || cState.stencilFuncMask!=STENCIL_MASK )
333 270c27bc Leszek Koltunski
      {
334 e6519ac8 Leszek Koltunski
      cState.stencilFuncFunc = GLES31.GL_EQUAL;
335 5b959cc5 Leszek Koltunski
      cState.stencilFuncRef  = 1;
336
      cState.stencilFuncMask = STENCIL_MASK;
337 e6519ac8 Leszek Koltunski
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
338 270c27bc Leszek Koltunski
      }
339 20ee7cc9 Leszek Koltunski
340
    sState.stencilMask = cState.stencilMask;
341
342 5b959cc5 Leszek Koltunski
    if( cState.stencilMask!= 0x00 )
343 270c27bc Leszek Koltunski
      {
344 5b959cc5 Leszek Koltunski
      cState.stencilMask = 0x00;
345 e6519ac8 Leszek Koltunski
      GLES31.glStencilMask(cState.stencilMask);
346 270c27bc Leszek Koltunski
      }
347 20ee7cc9 Leszek Koltunski
348
    sState.depthMask = cState.depthMask;
349
350
    if( cState.depthMask!=0 )
351 81f0078a Leszek Koltunski
      {
352
      cState.depthMask = 0;
353 e6519ac8 Leszek Koltunski
      GLES31.glDepthMask(false);
354 81f0078a Leszek Koltunski
      }
355 20ee7cc9 Leszek Koltunski
356
    sState.depthTest = cState.depthTest;
357
358 81f0078a Leszek Koltunski
    if( cState.depthTest!=0 )
359
      {
360
      cState.depthTest = 0;
361 e6519ac8 Leszek Koltunski
      GLES31.glDisable(GLES31.GL_DEPTH_TEST);
362 81f0078a Leszek Koltunski
      }
363 270c27bc Leszek Koltunski
    }
364
365
///////////////////////////////////////////////////////////////////////////////////////////////////
366 7266d8ef Leszek Koltunski
/**
367
 * Only for use by the library itself.
368
 *
369
 * @y.exclude
370
 */
371
  public static void unuseStencilMark()
372 270c27bc Leszek Koltunski
    {
373 5b959cc5 Leszek Koltunski
    if( sState.stencilTest!=cState.stencilTest )
374 270c27bc Leszek Koltunski
      {
375 5b959cc5 Leszek Koltunski
      cState.stencilTest = sState.stencilTest;
376 270c27bc Leszek Koltunski
377 5b959cc5 Leszek Koltunski
      if (cState.stencilTest == 0)
378 270c27bc Leszek Koltunski
        {
379 e6519ac8 Leszek Koltunski
        GLES31.glDisable(GLES31.GL_STENCIL_TEST);
380 270c27bc Leszek Koltunski
        }
381
      else
382
        {
383 e6519ac8 Leszek Koltunski
        GLES31.glEnable(GLES31.GL_STENCIL_TEST);
384 270c27bc Leszek Koltunski
        }
385
      }
386 5b959cc5 Leszek Koltunski
    if( sState.stencilFuncFunc!=cState.stencilFuncFunc || sState.stencilFuncRef!=cState.stencilFuncRef || sState.stencilFuncMask!=cState.stencilFuncMask )
387 270c27bc Leszek Koltunski
      {
388 5b959cc5 Leszek Koltunski
      cState.stencilFuncFunc = sState.stencilFuncFunc;
389
      cState.stencilFuncRef  = sState.stencilFuncRef ;
390
      cState.stencilFuncMask = sState.stencilFuncMask;
391 e6519ac8 Leszek Koltunski
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
392 270c27bc Leszek Koltunski
      }
393 5b959cc5 Leszek Koltunski
    if( sState.stencilMask!=cState.stencilMask )
394 270c27bc Leszek Koltunski
      {
395 5b959cc5 Leszek Koltunski
      cState.stencilMask = sState.stencilMask;
396 e6519ac8 Leszek Koltunski
      GLES31.glStencilMask(cState.stencilMask);
397 270c27bc Leszek Koltunski
      }
398 81f0078a Leszek Koltunski
    if( sState.depthMask!=cState.depthMask )
399
      {
400
      cState.depthMask = sState.depthMask;
401 e6519ac8 Leszek Koltunski
      GLES31.glDepthMask(cState.depthMask==1);
402 81f0078a Leszek Koltunski
      }
403
    if( sState.depthTest!=cState.depthTest )
404
      {
405
      cState.depthTest = sState.depthTest;
406
407
      if (cState.depthTest == 0)
408
        {
409 e6519ac8 Leszek Koltunski
        GLES31.glDisable(GLES31.GL_DEPTH_TEST);
410 81f0078a Leszek Koltunski
        }
411
      else
412
        {
413 e6519ac8 Leszek Koltunski
        GLES31.glEnable(GLES31.GL_DEPTH_TEST);
414 81f0078a Leszek Koltunski
        }
415
      }
416 270c27bc Leszek Koltunski
    }
417
418 9dba4df1 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
419
420
  void apply()
421
    {
422 cc8151c4 leszek
    //android.util.Log.e("State", "APPLYING STATE");
423 d582c116 Leszek Koltunski
424 cc8151c4 leszek
    /////////////////////////////////////////////////////
425
    // 1. Write to color buffer?
426 5b959cc5 Leszek Koltunski
    if( mState.colorMaskR!=cState.colorMaskR || mState.colorMaskG!=cState.colorMaskG || mState.colorMaskB!=cState.colorMaskB || mState.colorMaskA!=cState.colorMaskA)
427 9dba4df1 leszek
      {
428 cc8151c4 leszek
      //android.util.Log.d("State", "setting color mask");
429 5b959cc5 Leszek Koltunski
      cState.colorMaskR = mState.colorMaskR;
430
      cState.colorMaskG = mState.colorMaskG;
431
      cState.colorMaskB = mState.colorMaskB;
432
      cState.colorMaskA = mState.colorMaskA;
433 e6519ac8 Leszek Koltunski
      GLES31.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
434 9dba4df1 leszek
      }
435
436 cc8151c4 leszek
    /////////////////////////////////////////////////////
437 d582c116 Leszek Koltunski
    // 2. Enable Depth test?
438 5b959cc5 Leszek Koltunski
    if( mState.depthTest!=cState.depthTest )
439 9dba4df1 leszek
      {
440 5b959cc5 Leszek Koltunski
      cState.depthTest = mState.depthTest;
441 d582c116 Leszek Koltunski
442 5b959cc5 Leszek Koltunski
      if (cState.depthTest == 0)
443 cc8151c4 leszek
        {
444
        //android.util.Log.d("State", "disabling depth test");
445 e6519ac8 Leszek Koltunski
        GLES31.glDisable(GLES31.GL_DEPTH_TEST);
446 cc8151c4 leszek
        }
447 9dba4df1 leszek
      else
448
        {
449 cc8151c4 leszek
        //android.util.Log.d("State", "enable depth test");
450 e6519ac8 Leszek Koltunski
        GLES31.glEnable(GLES31.GL_DEPTH_TEST);
451 9dba4df1 leszek
        }
452
      }
453
454 cc8151c4 leszek
    /////////////////////////////////////////////////////
455
    // 3. Change Depth Function?
456 5b959cc5 Leszek Koltunski
    if( mState.depthFunc!=cState.depthFunc )
457 cc8151c4 leszek
      {
458
      //android.util.Log.d("State", "setting depth func");
459 5b959cc5 Leszek Koltunski
      cState.depthFunc = mState.depthFunc;
460 e6519ac8 Leszek Koltunski
      GLES31.glDepthFunc(cState.depthFunc);
461 cc8151c4 leszek
      }
462 d582c116 Leszek Koltunski
463 cc8151c4 leszek
    /////////////////////////////////////////////////////
464
    // 4. Write to Depth buffer?
465 5b959cc5 Leszek Koltunski
    if( mState.depthMask!=cState.depthMask )
466 d582c116 Leszek Koltunski
      {
467 cc8151c4 leszek
      //android.util.Log.d("State", "setting depth mask");
468 5b959cc5 Leszek Koltunski
      cState.depthMask = mState.depthMask;
469 e6519ac8 Leszek Koltunski
      GLES31.glDepthMask(cState.depthMask==1);
470 d582c116 Leszek Koltunski
      }
471
472 cc8151c4 leszek
    /////////////////////////////////////////////////////
473
    // 5. Enable Blending?
474 5b959cc5 Leszek Koltunski
    if( mState.blend!=cState.blend )
475 c834348d leszek
      {
476 5b959cc5 Leszek Koltunski
      cState.blend = mState.blend;
477 d582c116 Leszek Koltunski
478 5b959cc5 Leszek Koltunski
      if (cState.blend == 0)
479 cc8151c4 leszek
        {
480
        //android.util.Log.d("State", "disabling blending");
481 e6519ac8 Leszek Koltunski
        GLES31.glDisable(GLES31.GL_BLEND);
482 cc8151c4 leszek
        }
483 c834348d leszek
      else
484
        {
485 cc8151c4 leszek
        //android.util.Log.d("State", "enabling blending");
486 e6519ac8 Leszek Koltunski
        GLES31.glEnable(GLES31.GL_BLEND);
487 c834348d leszek
        }
488
      }
489
490 cc8151c4 leszek
    /////////////////////////////////////////////////////
491
    // 6. Change Blend function?
492 5b959cc5 Leszek Koltunski
    if( mState.blendSrc!=cState.blendSrc || mState.blendDst!=cState.blendDst )
493 cc8151c4 leszek
      {
494
      //android.util.Log.d("State", "setting blend function");
495 5b959cc5 Leszek Koltunski
      cState.blendSrc = mState.blendSrc;
496
      cState.blendDst = mState.blendDst;
497 e6519ac8 Leszek Koltunski
      GLES31.glBlendFunc(cState.blendSrc,cState.blendDst);
498 cc8151c4 leszek
      }
499 d582c116 Leszek Koltunski
500 cc8151c4 leszek
    /////////////////////////////////////////////////////
501
    // 7. Enable/Disable Stencil Test?
502 5b959cc5 Leszek Koltunski
    if( mState.stencilTest!=cState.stencilTest )
503 9dba4df1 leszek
      {
504 5b959cc5 Leszek Koltunski
      cState.stencilTest = mState.stencilTest;
505 d582c116 Leszek Koltunski
506 5b959cc5 Leszek Koltunski
      if (cState.stencilTest == 0)
507 cc8151c4 leszek
        {
508
        //android.util.Log.d("State", "disabling stencil test");
509 e6519ac8 Leszek Koltunski
        GLES31.glDisable(GLES31.GL_STENCIL_TEST);
510 cc8151c4 leszek
        }
511 9dba4df1 leszek
      else
512
        {
513 cc8151c4 leszek
        //android.util.Log.d("State", "enabling stencil test");
514 e6519ac8 Leszek Koltunski
        GLES31.glEnable(GLES31.GL_STENCIL_TEST);
515 9dba4df1 leszek
        }
516
      }
517 d582c116 Leszek Koltunski
518 cc8151c4 leszek
    /////////////////////////////////////////////////////
519
    // 8. Adjust Stencil function?
520 5b959cc5 Leszek Koltunski
    if( mState.stencilFuncFunc!=cState.stencilFuncFunc || mState.stencilFuncRef!=cState.stencilFuncRef || mState.stencilFuncMask!=cState.stencilFuncMask )
521 cc8151c4 leszek
      {
522
      //android.util.Log.d("State", "setting stencil function");
523 5b959cc5 Leszek Koltunski
      cState.stencilFuncFunc = mState.stencilFuncFunc;
524
      cState.stencilFuncRef  = mState.stencilFuncRef ;
525
      cState.stencilFuncMask = mState.stencilFuncMask;
526 e6519ac8 Leszek Koltunski
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
527 cc8151c4 leszek
      }
528
529
    /////////////////////////////////////////////////////
530
    // 9. Adjust Stencil operation?
531 5b959cc5 Leszek Koltunski
    if( mState.stencilOpSfail!=cState.stencilOpSfail || mState.stencilOpDpfail!=cState.stencilOpDpfail || mState.stencilOpDppass!=cState.stencilOpDppass )
532 cc8151c4 leszek
      {
533
      //android.util.Log.d("State", "setting stencil op");
534 5b959cc5 Leszek Koltunski
      cState.stencilOpSfail = mState.stencilOpSfail;
535
      cState.stencilOpDpfail= mState.stencilOpDpfail;
536
      cState.stencilOpDppass= mState.stencilOpDppass;
537 e6519ac8 Leszek Koltunski
      GLES31.glStencilOp(cState.stencilOpSfail,cState.stencilOpDpfail,cState.stencilOpDppass);
538 cc8151c4 leszek
      }
539 d582c116 Leszek Koltunski
540 cc8151c4 leszek
    /////////////////////////////////////////////////////
541
    // 10. Write to Stencil buffer?
542 5b959cc5 Leszek Koltunski
    if( mState.stencilMask!=cState.stencilMask )
543 d582c116 Leszek Koltunski
      {
544 cc8151c4 leszek
      //android.util.Log.d("State", "setting stencil mask");
545 5b959cc5 Leszek Koltunski
      cState.stencilMask = mState.stencilMask;
546 e6519ac8 Leszek Koltunski
      GLES31.glStencilMask(cState.stencilMask);
547 d582c116 Leszek Koltunski
      }
548 ad16ed3b Leszek Koltunski
549 cc8151c4 leszek
    /////////////////////////////////////////////////////
550
    // 11. Clear buffers?
551 ad16ed3b Leszek Koltunski
    if( mClear!=0 )
552
      {
553 cc8151c4 leszek
      //android.util.Log.d("State", "clearing buffer");
554 e6519ac8 Leszek Koltunski
      GLES31.glClear(mClear);
555 ad16ed3b Leszek Koltunski
      }
556 9dba4df1 leszek
    }
557
558
///////////////////////////////////////////////////////////////////////////////////////////////////
559
560
  void glColorMask(boolean r, boolean g, boolean b, boolean a)
561
    {
562 5b959cc5 Leszek Koltunski
    mState.colorMaskR = (r ? 1:0);
563
    mState.colorMaskG = (g ? 1:0);
564
    mState.colorMaskB = (b ? 1:0);
565
    mState.colorMaskA = (a ? 1:0);
566 9dba4df1 leszek
    }
567
568
///////////////////////////////////////////////////////////////////////////////////////////////////
569
570
  void glDepthMask(boolean mask)
571
    {
572 5b959cc5 Leszek Koltunski
    mState.depthMask = (mask ? 1:0);
573 9dba4df1 leszek
    }
574
575
///////////////////////////////////////////////////////////////////////////////////////////////////
576
577
  void glStencilMask(int mask)
578
    {
579 5b959cc5 Leszek Koltunski
    mState.stencilMask = mask;
580 9dba4df1 leszek
    }
581
582
///////////////////////////////////////////////////////////////////////////////////////////////////
583
584
  void glEnable(int test)
585
    {
586 e6519ac8 Leszek Koltunski
         if( test==GLES31.GL_DEPTH_TEST   ) mState.depthTest   = 1;
587
    else if( test==GLES31.GL_STENCIL_TEST ) mState.stencilTest = 1;
588
    else if( test==GLES31.GL_BLEND        ) mState.blend       = 1;
589 9dba4df1 leszek
    }
590
591
///////////////////////////////////////////////////////////////////////////////////////////////////
592
593
  void glDisable(int test)
594
    {
595 e6519ac8 Leszek Koltunski
         if( test==GLES31.GL_DEPTH_TEST   ) mState.depthTest   = 0;
596
    else if( test==GLES31.GL_STENCIL_TEST ) mState.stencilTest = 0;
597
    else if( test==GLES31.GL_BLEND        ) mState.blend       = 0;
598 9dba4df1 leszek
    }
599
600
///////////////////////////////////////////////////////////////////////////////////////////////////
601
602
  void glStencilFunc(int func, int ref, int mask)
603
    {
604 5b959cc5 Leszek Koltunski
    mState.stencilFuncFunc = func;
605
    mState.stencilFuncRef  = ref;
606
    mState.stencilFuncMask = mask;
607 9dba4df1 leszek
    }
608
609
///////////////////////////////////////////////////////////////////////////////////////////////////
610
611
  void glStencilOp(int sfail, int dpfail, int dppass)
612
    {
613 5b959cc5 Leszek Koltunski
    mState.stencilOpSfail = sfail;
614
    mState.stencilOpDpfail= dpfail;
615
    mState.stencilOpDppass= dppass;
616 9dba4df1 leszek
    }
617
618
///////////////////////////////////////////////////////////////////////////////////////////////////
619
620
  void glDepthFunc(int func)
621
    {
622 5b959cc5 Leszek Koltunski
    mState.depthFunc = func;
623 9dba4df1 leszek
    }
624 c834348d leszek
625
///////////////////////////////////////////////////////////////////////////////////////////////////
626
627
  void glBlendFunc(int src, int dst)
628
    {
629 5b959cc5 Leszek Koltunski
    mState.blendSrc = src;
630
    mState.blendDst = dst;
631 c834348d leszek
    }
632
633 ad16ed3b Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
634
635
  void glClear(int mask)
636
    {
637
    mClear = mask;
638
    }
639 9dba4df1 leszek
}