Project

General

Profile

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

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

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 977756d7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
188
189
  static void disableBlending()
190
    {
191
    sState.blend = cState.blend;
192
193
    if (cState.blend != 0)
194
      {
195
      cState.blend = 0;
196
      GLES31.glDisable(GLES31.GL_BLEND);
197
      }
198
    }
199
200
///////////////////////////////////////////////////////////////////////////////////////////////////
201
202
  static void restoreBlending()
203
    {
204
    if (sState.blend != cState.blend)
205
      {
206
      cState.blend = sState.blend;
207
208
      if (cState.blend == 0)
209
        {
210
        GLES31.glDisable(GLES31.GL_BLEND);
211
        }
212
      else
213
        {
214
        GLES31.glEnable(GLES31.GL_BLEND);
215
        }
216
      }
217
    }
218
219 56c6ca24 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
220
221
  static void enableDepthTest()
222
    {
223
    sState.depthTest = cState.depthTest;
224
225
    if (cState.depthTest != 1)
226
      {
227
      cState.depthTest = 1;
228
      GLES31.glEnable(GLES31.GL_DEPTH_TEST);
229
      }
230
    }
231
232
///////////////////////////////////////////////////////////////////////////////////////////////////
233
234
  static void restoreDepthTest()
235
    {
236
    if (sState.depthTest != cState.depthTest)
237
      {
238
      cState.depthTest = sState.depthTest;
239
240
      if (cState.depthTest == 0)
241
        {
242
        GLES31.glDisable(GLES31.GL_DEPTH_TEST);
243
        }
244
      else
245
        {
246
        GLES31.glEnable(GLES31.GL_DEPTH_TEST);
247
        }
248
      }
249
    }
250
251 cab7c165 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
252
253
  static void switchOffDrawing()
254
    {
255 e6519ac8 Leszek Koltunski
    GLES31.glEnable(GLES31.GL_SCISSOR_TEST);
256
    GLES31.glScissor(0,0,0,0);
257 cab7c165 Leszek Koltunski
    }
258
259
///////////////////////////////////////////////////////////////////////////////////////////////////
260
261
  static void restoreDrawing()
262
    {
263 e6519ac8 Leszek Koltunski
    GLES31.glDisable(GLES31.GL_SCISSOR_TEST);
264 cab7c165 Leszek Koltunski
    }
265
266 33f59f22 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
267
268
  static void switchOffColorDepthStencil()
269
    {
270
    sState.stencilTest = cState.stencilTest;
271
272
    if( cState.stencilTest!=0 )
273
      {
274
      cState.stencilTest = 0;
275
      //android.util.Log.d("State", "stencil test off");
276
      GLES31.glDisable(GLES31.GL_STENCIL_TEST);
277
      }
278
279
    sState.depthTest = cState.depthTest;
280
281
    if( cState.depthTest!=0 )
282
      {
283
      cState.depthTest = 0;
284
      //android.util.Log.d("State", "depth test off");
285
      GLES31.glDisable(GLES31.GL_DEPTH_TEST);
286
      }
287
288
    sState.colorMaskR = cState.colorMaskR;
289
    sState.colorMaskG = cState.colorMaskG;
290
    sState.colorMaskB = cState.colorMaskB;
291
    sState.colorMaskA = cState.colorMaskA;
292
293
    if( cState.colorMaskR!=0 || cState.colorMaskG!=0 || cState.colorMaskB!=0 || cState.colorMaskA!=0 )
294
      {
295
      cState.colorMaskR = 0;
296
      cState.colorMaskG = 0;
297
      cState.colorMaskB = 0;
298
      cState.colorMaskA = 0;
299
      //android.util.Log.d("State", "switch off color writing");
300
      GLES31.glColorMask(false,false,false,false);
301
      }
302
303
    sState.depthMask = cState.depthMask;
304
305
    if( cState.depthMask!=0 )
306
      {
307
      cState.depthMask = 0;
308
      //android.util.Log.d("State", "switch off depth writing");
309
      GLES31.glDepthMask(false);
310
      }
311
312
    sState.stencilMask = cState.stencilMask;
313
314
    if( cState.stencilMask!= 0x00 )
315
      {
316
      cState.stencilMask = 0x00;
317
      //android.util.Log.d("State", "stencil mask off");
318
      GLES31.glStencilMask(cState.stencilMask);
319
      }
320
    }
321
322
///////////////////////////////////////////////////////////////////////////////////////////////////
323
324
  static void switchColorDepthOnStencilOff()
325
    {
326
    sState.stencilTest = cState.stencilTest;
327
328
    if( cState.stencilTest!=0 )
329
      {
330
      cState.stencilTest = 0;
331
      //android.util.Log.d("State", "stencil test off");
332
      GLES31.glDisable(GLES31.GL_STENCIL_TEST);
333
      }
334
335
    sState.depthTest = cState.depthTest;
336
337
    if( cState.depthTest!=0 )
338
      {
339
      cState.depthTest = 0;
340
      //android.util.Log.d("State", "depth test off");
341
      GLES31.glDisable(GLES31.GL_DEPTH_TEST);
342
      }
343
344
    sState.colorMaskR = cState.colorMaskR;
345
    sState.colorMaskG = cState.colorMaskG;
346
    sState.colorMaskB = cState.colorMaskB;
347
    sState.colorMaskA = cState.colorMaskA;
348
349
    if( cState.colorMaskR!=1 || cState.colorMaskG!=1 || cState.colorMaskB!=1 || cState.colorMaskA!=1 )
350
      {
351
      cState.colorMaskR = 1;
352
      cState.colorMaskG = 1;
353
      cState.colorMaskB = 1;
354
      cState.colorMaskA = 1;
355
      //android.util.Log.d("State", "switch on color writing");
356
      GLES31.glColorMask(true,true,true,true);
357
      }
358
359
    sState.depthMask = cState.depthMask;
360
361
    if( cState.depthMask!=1 )
362
      {
363
      cState.depthMask = 1;
364
      //android.util.Log.d("State", "switch on depth writing");
365
      GLES31.glDepthMask(true);
366
      }
367
368
    sState.stencilMask = cState.stencilMask;
369
370
    if( cState.stencilMask!= 0x00 )
371
      {
372
      cState.stencilMask = 0x00;
373
      //android.util.Log.d("State", "stencil mask off");
374
      GLES31.glStencilMask(cState.stencilMask);
375
      }
376
    }
377
378
///////////////////////////////////////////////////////////////////////////////////////////////////
379
380
  static void restoreColorDepthStencil()
381
    {
382
    if( sState.stencilTest!=cState.stencilTest )
383
      {
384
      cState.stencilTest = sState.stencilTest;
385
386
      if (cState.stencilTest == 0)
387
        {
388
        GLES31.glDisable(GLES31.GL_STENCIL_TEST);
389
        }
390
      else
391
        {
392
        GLES31.glEnable(GLES31.GL_STENCIL_TEST);
393
        }
394
      }
395
    if( sState.depthTest!=cState.depthTest )
396
      {
397
      cState.depthTest = sState.depthTest;
398
399
      if (cState.depthTest == 0)
400
        {
401
        GLES31.glDisable(GLES31.GL_DEPTH_TEST);
402
        }
403
      else
404
        {
405
        GLES31.glEnable(GLES31.GL_DEPTH_TEST);
406
        }
407
      }
408
    if( sState.colorMaskR!=cState.colorMaskR || sState.colorMaskG!=cState.colorMaskG || sState.colorMaskB!=cState.colorMaskB || sState.colorMaskA!=cState.colorMaskA)
409
      {
410
      cState.colorMaskR = sState.colorMaskR;
411
      cState.colorMaskG = sState.colorMaskG;
412
      cState.colorMaskB = sState.colorMaskB;
413
      cState.colorMaskA = sState.colorMaskA;
414
      GLES31.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
415
      }
416
    if( sState.depthMask!=cState.depthMask )
417
      {
418
      cState.depthMask = sState.depthMask;
419
      GLES31.glDepthMask(cState.depthMask==1);
420
      }
421
    if( sState.stencilMask!=cState.stencilMask )
422
      {
423
      cState.stencilMask = sState.stencilMask;
424
      GLES31.glStencilMask(cState.stencilMask);
425
      }
426
    }
427
428 8777ce17 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
429
430 bbe3283b Leszek Koltunski
  static void disableStencil()
431 8777ce17 Leszek Koltunski
    {
432
    sState.stencilTest = cState.stencilTest;
433
434 bbe3283b Leszek Koltunski
    if (cState.stencilTest != 0)
435 8777ce17 Leszek Koltunski
      {
436 bbe3283b Leszek Koltunski
      cState.stencilTest = 0;
437
      GLES31.glDisable(GLES31.GL_STENCIL_TEST);
438 8777ce17 Leszek Koltunski
      }
439
440
    sState.stencilFuncFunc = cState.stencilFuncFunc;
441
    sState.stencilFuncRef  = cState.stencilFuncRef;
442
    sState.stencilFuncMask = cState.stencilFuncMask;
443
444
    if( cState.stencilFuncFunc!=GLES31.GL_EQUAL || cState.stencilFuncRef!=1 || cState.stencilFuncMask!=STENCIL_MASK )
445
      {
446
      cState.stencilFuncFunc = GLES31.GL_EQUAL;
447
      cState.stencilFuncRef  = 1;
448
      cState.stencilFuncMask = STENCIL_MASK;
449
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
450
      }
451
452
    sState.stencilMask = cState.stencilMask;
453
454
    if( cState.stencilMask!= 0x00 )
455
      {
456
      cState.stencilMask = 0x00;
457
      GLES31.glStencilMask(cState.stencilMask);
458
      }
459
    }
460
461
///////////////////////////////////////////////////////////////////////////////////////////////////
462
463
  static void restoreStencil()
464
    {
465
    if (sState.stencilTest != cState.stencilTest)
466
      {
467
      cState.stencilTest = sState.stencilTest;
468
469
      if (cState.stencilTest == 0)
470
        {
471
        GLES31.glDisable(GLES31.GL_STENCIL_TEST);
472
        }
473
      else
474
        {
475
        GLES31.glEnable(GLES31.GL_STENCIL_TEST);
476
        }
477
      }
478
    if( sState.stencilFuncFunc!=cState.stencilFuncFunc || sState.stencilFuncRef!=cState.stencilFuncRef || sState.stencilFuncMask!=cState.stencilFuncMask )
479
      {
480
      cState.stencilFuncFunc = sState.stencilFuncFunc;
481
      cState.stencilFuncRef  = sState.stencilFuncRef ;
482
      cState.stencilFuncMask = sState.stencilFuncMask;
483
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
484
      }
485
    if( sState.stencilMask!=cState.stencilMask )
486
      {
487
      cState.stencilMask = sState.stencilMask;
488
      GLES31.glStencilMask(cState.stencilMask);
489
      }
490
    }
491
492 270c27bc Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
493
494 a13dde77 Leszek Koltunski
  static void setUpStencilMark(boolean color)
495 270c27bc Leszek Koltunski
    {
496 20ee7cc9 Leszek Koltunski
    sState.stencilTest = cState.stencilTest;
497
498 5b959cc5 Leszek Koltunski
    if( cState.stencilTest!=1 )
499 270c27bc Leszek Koltunski
      {
500 5b959cc5 Leszek Koltunski
      cState.stencilTest = 1;
501 b3120b1b leszek
      //android.util.Log.d("State", "stencil test on");
502 e6519ac8 Leszek Koltunski
      GLES31.glEnable(GLES31.GL_STENCIL_TEST);
503 270c27bc Leszek Koltunski
      }
504 20ee7cc9 Leszek Koltunski
505
    sState.stencilFuncFunc = cState.stencilFuncFunc;
506
    sState.stencilFuncRef  = cState.stencilFuncRef;
507
    sState.stencilFuncMask = cState.stencilFuncMask;
508
509 e6519ac8 Leszek Koltunski
    if( cState.stencilFuncFunc!=GLES31.GL_ALWAYS || cState.stencilFuncRef!=1 || cState.stencilFuncMask!=STENCIL_MASK )
510 270c27bc Leszek Koltunski
      {
511 e6519ac8 Leszek Koltunski
      cState.stencilFuncFunc = GLES31.GL_ALWAYS;
512 5b959cc5 Leszek Koltunski
      cState.stencilFuncRef  = 1;
513
      cState.stencilFuncMask = STENCIL_MASK;
514 b3120b1b leszek
      //android.util.Log.d("State", "stencil func on");
515 e6519ac8 Leszek Koltunski
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
516 270c27bc Leszek Koltunski
      }
517 20ee7cc9 Leszek Koltunski
518
    sState.stencilOpSfail = cState.stencilOpSfail;
519
    sState.stencilOpDpfail= cState.stencilOpDpfail;
520
    sState.stencilOpDppass= cState.stencilOpDppass;
521
522 e6519ac8 Leszek Koltunski
    if( cState.stencilOpSfail!=GLES31.GL_KEEP || cState.stencilOpDpfail!=GLES31.GL_KEEP || cState.stencilOpDppass!=GLES31.GL_REPLACE )
523 270c27bc Leszek Koltunski
      {
524 e6519ac8 Leszek Koltunski
      cState.stencilOpSfail = GLES31.GL_KEEP;
525
      cState.stencilOpDpfail= GLES31.GL_KEEP;
526
      cState.stencilOpDppass= GLES31.GL_REPLACE;
527 b3120b1b leszek
      //android.util.Log.d("State", "stencil op on");
528 e6519ac8 Leszek Koltunski
      GLES31.glStencilOp(cState.stencilOpSfail,cState.stencilOpDpfail,cState.stencilOpDppass);
529 270c27bc Leszek Koltunski
      }
530 20ee7cc9 Leszek Koltunski
531
    sState.colorMaskR = cState.colorMaskR;
532
    sState.colorMaskG = cState.colorMaskG;
533
    sState.colorMaskB = cState.colorMaskB;
534
    sState.colorMaskA = cState.colorMaskA;
535
536 a13dde77 Leszek Koltunski
    int clr = color ? 1:0;
537
538
    if( cState.colorMaskR!=clr || cState.colorMaskG!=clr || cState.colorMaskB!=clr || cState.colorMaskA!=clr )
539 270c27bc Leszek Koltunski
      {
540 a13dde77 Leszek Koltunski
      cState.colorMaskR = clr;
541
      cState.colorMaskG = clr;
542
      cState.colorMaskB = clr;
543
      cState.colorMaskA = clr;
544 b3120b1b leszek
      //android.util.Log.d("State", "switch off color writing");
545 a13dde77 Leszek Koltunski
      GLES31.glColorMask(color,color,color,color);
546 270c27bc Leszek Koltunski
      }
547 20ee7cc9 Leszek Koltunski
548
    sState.depthMask = cState.depthMask;
549
550 1d6d261e Leszek Koltunski
    if( cState.depthMask!=1 )
551 270c27bc Leszek Koltunski
      {
552 1d6d261e Leszek Koltunski
      cState.depthMask = 1;
553
      //android.util.Log.d("State", "switch on depth writing");
554 e6519ac8 Leszek Koltunski
      GLES31.glDepthMask(true);
555 270c27bc Leszek Koltunski
      }
556 20ee7cc9 Leszek Koltunski
557
    sState.stencilMask = cState.stencilMask;
558
559 5b959cc5 Leszek Koltunski
    if( cState.stencilMask!= STENCIL_MASK )
560 270c27bc Leszek Koltunski
      {
561 5b959cc5 Leszek Koltunski
      cState.stencilMask = STENCIL_MASK;
562 b3120b1b leszek
      //android.util.Log.d("State", "stencil mask on");
563 e6519ac8 Leszek Koltunski
      GLES31.glStencilMask(cState.stencilMask);
564 270c27bc Leszek Koltunski
      }
565
    }
566
567 984dc935 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
568
569
  static void unsetUpStencilMark()
570
    {
571
    if( sState.stencilTest!=cState.stencilTest )
572
      {
573
      cState.stencilTest = sState.stencilTest;
574
575
      if (cState.stencilTest == 0)
576
        {
577 e6519ac8 Leszek Koltunski
        GLES31.glDisable(GLES31.GL_STENCIL_TEST);
578 984dc935 Leszek Koltunski
        }
579
      else
580
        {
581 e6519ac8 Leszek Koltunski
        GLES31.glEnable(GLES31.GL_STENCIL_TEST);
582 984dc935 Leszek Koltunski
        }
583
      }
584
    if( sState.colorMaskR!=cState.colorMaskR || sState.colorMaskG!=cState.colorMaskG || sState.colorMaskB!=cState.colorMaskB || sState.colorMaskA!=cState.colorMaskA)
585
      {
586
      cState.colorMaskR = sState.colorMaskR;
587
      cState.colorMaskG = sState.colorMaskG;
588
      cState.colorMaskB = sState.colorMaskB;
589
      cState.colorMaskA = sState.colorMaskA;
590 e6519ac8 Leszek Koltunski
      GLES31.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
591 984dc935 Leszek Koltunski
      }
592
    if( sState.depthMask!=cState.depthMask )
593
      {
594
      cState.depthMask = sState.depthMask;
595 e6519ac8 Leszek Koltunski
      GLES31.glDepthMask(cState.depthMask==1);
596 984dc935 Leszek Koltunski
      }
597
    if( sState.stencilMask!=cState.stencilMask )
598
      {
599
      cState.stencilMask = sState.stencilMask;
600 e6519ac8 Leszek Koltunski
      GLES31.glStencilMask(cState.stencilMask);
601 984dc935 Leszek Koltunski
      }
602
    }
603
604 270c27bc Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
605 7266d8ef Leszek Koltunski
/**
606
 * Only for use by the library itself.
607
 *
608
 * @y.exclude
609
 */
610
  public static void useStencilMark()
611 270c27bc Leszek Koltunski
    {
612 20ee7cc9 Leszek Koltunski
    sState.stencilMask = cState.stencilMask;
613
614 5b959cc5 Leszek Koltunski
    if( cState.stencilTest!=1 )
615 270c27bc Leszek Koltunski
      {
616 5b959cc5 Leszek Koltunski
      cState.stencilTest = 1;
617 e6519ac8 Leszek Koltunski
      GLES31.glEnable(GLES31.GL_STENCIL_TEST);
618 270c27bc Leszek Koltunski
      }
619 20ee7cc9 Leszek Koltunski
620
    sState.stencilFuncFunc = cState.stencilFuncFunc;
621
    sState.stencilFuncRef  = cState.stencilFuncRef;
622
    sState.stencilFuncMask = cState.stencilFuncMask;
623
624 e6519ac8 Leszek Koltunski
    if( cState.stencilFuncFunc!=GLES31.GL_EQUAL || cState.stencilFuncRef!=1 || cState.stencilFuncMask!=STENCIL_MASK )
625 270c27bc Leszek Koltunski
      {
626 e6519ac8 Leszek Koltunski
      cState.stencilFuncFunc = GLES31.GL_EQUAL;
627 5b959cc5 Leszek Koltunski
      cState.stencilFuncRef  = 1;
628
      cState.stencilFuncMask = STENCIL_MASK;
629 e6519ac8 Leszek Koltunski
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
630 270c27bc Leszek Koltunski
      }
631 20ee7cc9 Leszek Koltunski
632
    sState.stencilMask = cState.stencilMask;
633
634 5b959cc5 Leszek Koltunski
    if( cState.stencilMask!= 0x00 )
635 270c27bc Leszek Koltunski
      {
636 5b959cc5 Leszek Koltunski
      cState.stencilMask = 0x00;
637 e6519ac8 Leszek Koltunski
      GLES31.glStencilMask(cState.stencilMask);
638 270c27bc Leszek Koltunski
      }
639 20ee7cc9 Leszek Koltunski
640
    sState.depthMask = cState.depthMask;
641
642
    if( cState.depthMask!=0 )
643 81f0078a Leszek Koltunski
      {
644
      cState.depthMask = 0;
645 e6519ac8 Leszek Koltunski
      GLES31.glDepthMask(false);
646 81f0078a Leszek Koltunski
      }
647 20ee7cc9 Leszek Koltunski
648
    sState.depthTest = cState.depthTest;
649
650 81f0078a Leszek Koltunski
    if( cState.depthTest!=0 )
651
      {
652
      cState.depthTest = 0;
653 e6519ac8 Leszek Koltunski
      GLES31.glDisable(GLES31.GL_DEPTH_TEST);
654 81f0078a Leszek Koltunski
      }
655 270c27bc Leszek Koltunski
    }
656
657
///////////////////////////////////////////////////////////////////////////////////////////////////
658 7266d8ef Leszek Koltunski
/**
659
 * Only for use by the library itself.
660
 *
661
 * @y.exclude
662
 */
663
  public static void unuseStencilMark()
664 270c27bc Leszek Koltunski
    {
665 5b959cc5 Leszek Koltunski
    if( sState.stencilTest!=cState.stencilTest )
666 270c27bc Leszek Koltunski
      {
667 5b959cc5 Leszek Koltunski
      cState.stencilTest = sState.stencilTest;
668 270c27bc Leszek Koltunski
669 5b959cc5 Leszek Koltunski
      if (cState.stencilTest == 0)
670 270c27bc Leszek Koltunski
        {
671 e6519ac8 Leszek Koltunski
        GLES31.glDisable(GLES31.GL_STENCIL_TEST);
672 270c27bc Leszek Koltunski
        }
673
      else
674
        {
675 e6519ac8 Leszek Koltunski
        GLES31.glEnable(GLES31.GL_STENCIL_TEST);
676 270c27bc Leszek Koltunski
        }
677
      }
678 5b959cc5 Leszek Koltunski
    if( sState.stencilFuncFunc!=cState.stencilFuncFunc || sState.stencilFuncRef!=cState.stencilFuncRef || sState.stencilFuncMask!=cState.stencilFuncMask )
679 270c27bc Leszek Koltunski
      {
680 5b959cc5 Leszek Koltunski
      cState.stencilFuncFunc = sState.stencilFuncFunc;
681
      cState.stencilFuncRef  = sState.stencilFuncRef ;
682
      cState.stencilFuncMask = sState.stencilFuncMask;
683 e6519ac8 Leszek Koltunski
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
684 270c27bc Leszek Koltunski
      }
685 5b959cc5 Leszek Koltunski
    if( sState.stencilMask!=cState.stencilMask )
686 270c27bc Leszek Koltunski
      {
687 5b959cc5 Leszek Koltunski
      cState.stencilMask = sState.stencilMask;
688 e6519ac8 Leszek Koltunski
      GLES31.glStencilMask(cState.stencilMask);
689 270c27bc Leszek Koltunski
      }
690 81f0078a Leszek Koltunski
    if( sState.depthMask!=cState.depthMask )
691
      {
692
      cState.depthMask = sState.depthMask;
693 e6519ac8 Leszek Koltunski
      GLES31.glDepthMask(cState.depthMask==1);
694 81f0078a Leszek Koltunski
      }
695
    if( sState.depthTest!=cState.depthTest )
696
      {
697
      cState.depthTest = sState.depthTest;
698
699
      if (cState.depthTest == 0)
700
        {
701 e6519ac8 Leszek Koltunski
        GLES31.glDisable(GLES31.GL_DEPTH_TEST);
702 81f0078a Leszek Koltunski
        }
703
      else
704
        {
705 e6519ac8 Leszek Koltunski
        GLES31.glEnable(GLES31.GL_DEPTH_TEST);
706 81f0078a Leszek Koltunski
        }
707
      }
708 270c27bc Leszek Koltunski
    }
709
710 9dba4df1 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
711
712
  void apply()
713
    {
714 cc8151c4 leszek
    //android.util.Log.e("State", "APPLYING STATE");
715 d582c116 Leszek Koltunski
716 cc8151c4 leszek
    /////////////////////////////////////////////////////
717
    // 1. Write to color buffer?
718 5b959cc5 Leszek Koltunski
    if( mState.colorMaskR!=cState.colorMaskR || mState.colorMaskG!=cState.colorMaskG || mState.colorMaskB!=cState.colorMaskB || mState.colorMaskA!=cState.colorMaskA)
719 9dba4df1 leszek
      {
720 cc8151c4 leszek
      //android.util.Log.d("State", "setting color mask");
721 5b959cc5 Leszek Koltunski
      cState.colorMaskR = mState.colorMaskR;
722
      cState.colorMaskG = mState.colorMaskG;
723
      cState.colorMaskB = mState.colorMaskB;
724
      cState.colorMaskA = mState.colorMaskA;
725 e6519ac8 Leszek Koltunski
      GLES31.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
726 9dba4df1 leszek
      }
727
728 cc8151c4 leszek
    /////////////////////////////////////////////////////
729 d582c116 Leszek Koltunski
    // 2. Enable Depth test?
730 5b959cc5 Leszek Koltunski
    if( mState.depthTest!=cState.depthTest )
731 9dba4df1 leszek
      {
732 5b959cc5 Leszek Koltunski
      cState.depthTest = mState.depthTest;
733 d582c116 Leszek Koltunski
734 5b959cc5 Leszek Koltunski
      if (cState.depthTest == 0)
735 cc8151c4 leszek
        {
736
        //android.util.Log.d("State", "disabling depth test");
737 e6519ac8 Leszek Koltunski
        GLES31.glDisable(GLES31.GL_DEPTH_TEST);
738 cc8151c4 leszek
        }
739 9dba4df1 leszek
      else
740
        {
741 cc8151c4 leszek
        //android.util.Log.d("State", "enable depth test");
742 e6519ac8 Leszek Koltunski
        GLES31.glEnable(GLES31.GL_DEPTH_TEST);
743 9dba4df1 leszek
        }
744
      }
745
746 cc8151c4 leszek
    /////////////////////////////////////////////////////
747
    // 3. Change Depth Function?
748 5b959cc5 Leszek Koltunski
    if( mState.depthFunc!=cState.depthFunc )
749 cc8151c4 leszek
      {
750
      //android.util.Log.d("State", "setting depth func");
751 5b959cc5 Leszek Koltunski
      cState.depthFunc = mState.depthFunc;
752 e6519ac8 Leszek Koltunski
      GLES31.glDepthFunc(cState.depthFunc);
753 cc8151c4 leszek
      }
754 d582c116 Leszek Koltunski
755 cc8151c4 leszek
    /////////////////////////////////////////////////////
756
    // 4. Write to Depth buffer?
757 5b959cc5 Leszek Koltunski
    if( mState.depthMask!=cState.depthMask )
758 d582c116 Leszek Koltunski
      {
759 cc8151c4 leszek
      //android.util.Log.d("State", "setting depth mask");
760 5b959cc5 Leszek Koltunski
      cState.depthMask = mState.depthMask;
761 e6519ac8 Leszek Koltunski
      GLES31.glDepthMask(cState.depthMask==1);
762 d582c116 Leszek Koltunski
      }
763
764 cc8151c4 leszek
    /////////////////////////////////////////////////////
765
    // 5. Enable Blending?
766 5b959cc5 Leszek Koltunski
    if( mState.blend!=cState.blend )
767 c834348d leszek
      {
768 5b959cc5 Leszek Koltunski
      cState.blend = mState.blend;
769 d582c116 Leszek Koltunski
770 5b959cc5 Leszek Koltunski
      if (cState.blend == 0)
771 cc8151c4 leszek
        {
772
        //android.util.Log.d("State", "disabling blending");
773 e6519ac8 Leszek Koltunski
        GLES31.glDisable(GLES31.GL_BLEND);
774 cc8151c4 leszek
        }
775 c834348d leszek
      else
776
        {
777 cc8151c4 leszek
        //android.util.Log.d("State", "enabling blending");
778 e6519ac8 Leszek Koltunski
        GLES31.glEnable(GLES31.GL_BLEND);
779 c834348d leszek
        }
780
      }
781
782 cc8151c4 leszek
    /////////////////////////////////////////////////////
783
    // 6. Change Blend function?
784 5b959cc5 Leszek Koltunski
    if( mState.blendSrc!=cState.blendSrc || mState.blendDst!=cState.blendDst )
785 cc8151c4 leszek
      {
786
      //android.util.Log.d("State", "setting blend function");
787 5b959cc5 Leszek Koltunski
      cState.blendSrc = mState.blendSrc;
788
      cState.blendDst = mState.blendDst;
789 e6519ac8 Leszek Koltunski
      GLES31.glBlendFunc(cState.blendSrc,cState.blendDst);
790 cc8151c4 leszek
      }
791 d582c116 Leszek Koltunski
792 cc8151c4 leszek
    /////////////////////////////////////////////////////
793
    // 7. Enable/Disable Stencil Test?
794 5b959cc5 Leszek Koltunski
    if( mState.stencilTest!=cState.stencilTest )
795 9dba4df1 leszek
      {
796 5b959cc5 Leszek Koltunski
      cState.stencilTest = mState.stencilTest;
797 d582c116 Leszek Koltunski
798 5b959cc5 Leszek Koltunski
      if (cState.stencilTest == 0)
799 cc8151c4 leszek
        {
800
        //android.util.Log.d("State", "disabling stencil test");
801 e6519ac8 Leszek Koltunski
        GLES31.glDisable(GLES31.GL_STENCIL_TEST);
802 cc8151c4 leszek
        }
803 9dba4df1 leszek
      else
804
        {
805 cc8151c4 leszek
        //android.util.Log.d("State", "enabling stencil test");
806 e6519ac8 Leszek Koltunski
        GLES31.glEnable(GLES31.GL_STENCIL_TEST);
807 9dba4df1 leszek
        }
808
      }
809 d582c116 Leszek Koltunski
810 cc8151c4 leszek
    /////////////////////////////////////////////////////
811
    // 8. Adjust Stencil function?
812 5b959cc5 Leszek Koltunski
    if( mState.stencilFuncFunc!=cState.stencilFuncFunc || mState.stencilFuncRef!=cState.stencilFuncRef || mState.stencilFuncMask!=cState.stencilFuncMask )
813 cc8151c4 leszek
      {
814
      //android.util.Log.d("State", "setting stencil function");
815 5b959cc5 Leszek Koltunski
      cState.stencilFuncFunc = mState.stencilFuncFunc;
816
      cState.stencilFuncRef  = mState.stencilFuncRef ;
817
      cState.stencilFuncMask = mState.stencilFuncMask;
818 e6519ac8 Leszek Koltunski
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
819 cc8151c4 leszek
      }
820
821
    /////////////////////////////////////////////////////
822
    // 9. Adjust Stencil operation?
823 5b959cc5 Leszek Koltunski
    if( mState.stencilOpSfail!=cState.stencilOpSfail || mState.stencilOpDpfail!=cState.stencilOpDpfail || mState.stencilOpDppass!=cState.stencilOpDppass )
824 cc8151c4 leszek
      {
825
      //android.util.Log.d("State", "setting stencil op");
826 5b959cc5 Leszek Koltunski
      cState.stencilOpSfail = mState.stencilOpSfail;
827
      cState.stencilOpDpfail= mState.stencilOpDpfail;
828
      cState.stencilOpDppass= mState.stencilOpDppass;
829 e6519ac8 Leszek Koltunski
      GLES31.glStencilOp(cState.stencilOpSfail,cState.stencilOpDpfail,cState.stencilOpDppass);
830 cc8151c4 leszek
      }
831 d582c116 Leszek Koltunski
832 cc8151c4 leszek
    /////////////////////////////////////////////////////
833
    // 10. Write to Stencil buffer?
834 5b959cc5 Leszek Koltunski
    if( mState.stencilMask!=cState.stencilMask )
835 d582c116 Leszek Koltunski
      {
836 cc8151c4 leszek
      //android.util.Log.d("State", "setting stencil mask");
837 5b959cc5 Leszek Koltunski
      cState.stencilMask = mState.stencilMask;
838 e6519ac8 Leszek Koltunski
      GLES31.glStencilMask(cState.stencilMask);
839 d582c116 Leszek Koltunski
      }
840 ad16ed3b Leszek Koltunski
841 cc8151c4 leszek
    /////////////////////////////////////////////////////
842
    // 11. Clear buffers?
843 ad16ed3b Leszek Koltunski
    if( mClear!=0 )
844
      {
845 cc8151c4 leszek
      //android.util.Log.d("State", "clearing buffer");
846 e6519ac8 Leszek Koltunski
      GLES31.glClear(mClear);
847 ad16ed3b Leszek Koltunski
      }
848 9dba4df1 leszek
    }
849
850
///////////////////////////////////////////////////////////////////////////////////////////////////
851
852
  void glColorMask(boolean r, boolean g, boolean b, boolean a)
853
    {
854 5b959cc5 Leszek Koltunski
    mState.colorMaskR = (r ? 1:0);
855
    mState.colorMaskG = (g ? 1:0);
856
    mState.colorMaskB = (b ? 1:0);
857
    mState.colorMaskA = (a ? 1:0);
858 9dba4df1 leszek
    }
859
860
///////////////////////////////////////////////////////////////////////////////////////////////////
861
862
  void glDepthMask(boolean mask)
863
    {
864 5b959cc5 Leszek Koltunski
    mState.depthMask = (mask ? 1:0);
865 9dba4df1 leszek
    }
866
867
///////////////////////////////////////////////////////////////////////////////////////////////////
868
869
  void glStencilMask(int mask)
870
    {
871 5b959cc5 Leszek Koltunski
    mState.stencilMask = mask;
872 9dba4df1 leszek
    }
873
874
///////////////////////////////////////////////////////////////////////////////////////////////////
875
876
  void glEnable(int test)
877
    {
878 e6519ac8 Leszek Koltunski
         if( test==GLES31.GL_DEPTH_TEST   ) mState.depthTest   = 1;
879
    else if( test==GLES31.GL_STENCIL_TEST ) mState.stencilTest = 1;
880
    else if( test==GLES31.GL_BLEND        ) mState.blend       = 1;
881 9dba4df1 leszek
    }
882
883
///////////////////////////////////////////////////////////////////////////////////////////////////
884
885
  void glDisable(int test)
886
    {
887 e6519ac8 Leszek Koltunski
         if( test==GLES31.GL_DEPTH_TEST   ) mState.depthTest   = 0;
888
    else if( test==GLES31.GL_STENCIL_TEST ) mState.stencilTest = 0;
889
    else if( test==GLES31.GL_BLEND        ) mState.blend       = 0;
890 9dba4df1 leszek
    }
891
892
///////////////////////////////////////////////////////////////////////////////////////////////////
893
894
  void glStencilFunc(int func, int ref, int mask)
895
    {
896 5b959cc5 Leszek Koltunski
    mState.stencilFuncFunc = func;
897
    mState.stencilFuncRef  = ref;
898
    mState.stencilFuncMask = mask;
899 9dba4df1 leszek
    }
900
901
///////////////////////////////////////////////////////////////////////////////////////////////////
902
903
  void glStencilOp(int sfail, int dpfail, int dppass)
904
    {
905 5b959cc5 Leszek Koltunski
    mState.stencilOpSfail = sfail;
906
    mState.stencilOpDpfail= dpfail;
907
    mState.stencilOpDppass= dppass;
908 9dba4df1 leszek
    }
909
910
///////////////////////////////////////////////////////////////////////////////////////////////////
911
912
  void glDepthFunc(int func)
913
    {
914 5b959cc5 Leszek Koltunski
    mState.depthFunc = func;
915 9dba4df1 leszek
    }
916 c834348d leszek
917
///////////////////////////////////////////////////////////////////////////////////////////////////
918
919
  void glBlendFunc(int src, int dst)
920
    {
921 5b959cc5 Leszek Koltunski
    mState.blendSrc = src;
922
    mState.blendDst = dst;
923 c834348d leszek
    }
924
925 ad16ed3b Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
926
927
  void glClear(int mask)
928
    {
929
    mClear = mask;
930
    }
931 9dba4df1 leszek
}