Project

General

Profile

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

library / src / main / java / org / distorted / library / main / DistortedRenderState.java @ 8777ce17

1
///////////////////////////////////////////////////////////////////////////////////////////////////
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
package org.distorted.library.main;
21

    
22
import android.opengl.GLES31;
23

    
24
///////////////////////////////////////////////////////////////////////////////////////////////////
25
/**
26
 * Remember the OpenGL state.
27
 * <p>
28
 * This is a member of DistortedNode. Remembers the OpenGL state we want to set just before rendering
29
 * the Node.
30
 * <p>
31
 * Only for use by the library itself.
32
 *
33
 * @y.exclude
34
 */
35
public class DistortedRenderState
36
{
37
  // TODO: figure this out dynamically; this assumes 8 bit stencil buffer.
38
  private static final int STENCIL_MASK = (1<<8)-1;
39

    
40
  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

    
60
///////////////////////////////////////////////////////////////////////////////////////////////////
61
// default: color writes on, depth test and writes on, blending on, stencil off.
62

    
63
  DistortedRenderState()
64
    {
65
    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
    mState.depthFunc  = GLES31.GL_LEQUAL;
75

    
76
    mState.blend      = 1;
77
    mState.blendSrc   = GLES31.GL_SRC_ALPHA;
78
    mState.blendDst   = GLES31.GL_ONE_MINUS_SRC_ALPHA;
79

    
80
    mState.stencilTest     = 0;
81
    mState.stencilMask     = STENCIL_MASK;
82
    mState.stencilFuncFunc = GLES31.GL_NEVER;
83
    mState.stencilFuncRef  = 0;
84
    mState.stencilFuncMask = STENCIL_MASK;
85
    mState.stencilOpSfail  = GLES31.GL_KEEP;
86
    mState.stencilOpDpfail = GLES31.GL_KEEP;
87
    mState.stencilOpDppass = GLES31.GL_KEEP;
88

    
89
    mClear = 0;
90
    }
91

    
92
///////////////////////////////////////////////////////////////////////////////////////////////////
93
// reset state of everything to a known state.
94

    
95
  static void reset()
96
    {
97
    cState.colorMaskR = 1;
98
    cState.colorMaskG = 1;
99
    cState.colorMaskB = 1;
100
    cState.colorMaskA = 1;
101
    GLES31.glColorMask(true,true,true,true);
102

    
103
    cState.depthTest = 1;
104
    cState.depthMask = 1;
105
    cState.depthFunc = GLES31.GL_LEQUAL;
106
    GLES31.glEnable(GLES31.GL_DEPTH_TEST);
107
    GLES31.glDepthMask(true);
108
    GLES31.glDepthFunc(cState.depthFunc);
109

    
110
    cState.stencilTest     = 0;
111
    cState.stencilMask     = STENCIL_MASK;
112
    cState.stencilFuncFunc = GLES31.GL_NEVER;
113
    cState.stencilFuncRef  = 0;
114
    cState.stencilFuncMask = STENCIL_MASK;
115
    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

    
121
    cState.blend      = 1;
122
    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
    }
127

    
128
///////////////////////////////////////////////////////////////////////////////////////////////////
129

    
130
  static void colorDepthStencilOn()
131
    {
132
    sState.colorMaskR = cState.colorMaskR;
133
    sState.colorMaskG = cState.colorMaskG;
134
    sState.colorMaskB = cState.colorMaskB;
135
    sState.colorMaskA = cState.colorMaskA;
136

    
137
    if( cState.colorMaskR!=1 || cState.colorMaskG!=1 || cState.colorMaskB!=1 || cState.colorMaskA!=1 )
138
      {
139
      cState.colorMaskR = 1;
140
      cState.colorMaskG = 1;
141
      cState.colorMaskB = 1;
142
      cState.colorMaskA = 1;
143
      GLES31.glColorMask(true,true,true,true);
144
      }
145

    
146
    sState.depthMask = cState.depthMask;
147

    
148
    if( cState.depthMask!=1 )
149
      {
150
      cState.depthMask = 1;
151
      GLES31.glDepthMask(true);
152
      }
153

    
154
    sState.stencilMask = cState.stencilMask;
155

    
156
    if( cState.stencilMask!= STENCIL_MASK )
157
      {
158
      cState.stencilMask = STENCIL_MASK;
159
      GLES31.glStencilMask(cState.stencilMask);
160
      }
161
    }
162

    
163
///////////////////////////////////////////////////////////////////////////////////////////////////
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
      GLES31.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
174
      }
175
    if( sState.depthMask!=cState.depthMask )
176
      {
177
      cState.depthMask = sState.depthMask;
178
      GLES31.glDepthMask(cState.depthMask==1);
179
      }
180
    if( sState.stencilMask!=cState.stencilMask )
181
      {
182
      cState.stencilMask = sState.stencilMask;
183
      GLES31.glStencilMask(cState.stencilMask);
184
      }
185
    }
186

    
187
///////////////////////////////////////////////////////////////////////////////////////////////////
188

    
189
  static void switchOffDrawing()
190
    {
191
    GLES31.glEnable(GLES31.GL_SCISSOR_TEST);
192
    GLES31.glScissor(0,0,0,0);
193
    }
194

    
195
///////////////////////////////////////////////////////////////////////////////////////////////////
196

    
197
  static void restoreDrawing()
198
    {
199
    GLES31.glDisable(GLES31.GL_SCISSOR_TEST);
200
    }
201

    
202
///////////////////////////////////////////////////////////////////////////////////////////////////
203

    
204
  static void enableStencil()
205
    {
206
    sState.stencilTest = cState.stencilTest;
207

    
208
    if (cState.stencilTest != 1)
209
      {
210
      cState.stencilTest = 1;
211
      GLES31.glEnable(GLES31.GL_STENCIL_TEST);
212
      }
213

    
214
    sState.stencilFuncFunc = cState.stencilFuncFunc;
215
    sState.stencilFuncRef  = cState.stencilFuncRef;
216
    sState.stencilFuncMask = cState.stencilFuncMask;
217

    
218
    if( cState.stencilFuncFunc!=GLES31.GL_EQUAL || cState.stencilFuncRef!=1 || cState.stencilFuncMask!=STENCIL_MASK )
219
      {
220
      cState.stencilFuncFunc = GLES31.GL_EQUAL;
221
      cState.stencilFuncRef  = 1;
222
      cState.stencilFuncMask = STENCIL_MASK;
223
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
224
      }
225

    
226
    sState.stencilMask = cState.stencilMask;
227

    
228
    if( cState.stencilMask!= 0x00 )
229
      {
230
      cState.stencilMask = 0x00;
231
      GLES31.glStencilMask(cState.stencilMask);
232
      }
233
    }
234

    
235
///////////////////////////////////////////////////////////////////////////////////////////////////
236

    
237
  static void restoreStencil()
238
    {
239
    if (sState.stencilTest != cState.stencilTest)
240
      {
241
      cState.stencilTest = sState.stencilTest;
242

    
243
      if (cState.stencilTest == 0)
244
        {
245
        GLES31.glDisable(GLES31.GL_STENCIL_TEST);
246
        }
247
      else
248
        {
249
        GLES31.glEnable(GLES31.GL_STENCIL_TEST);
250
        }
251
      }
252
    if( sState.stencilFuncFunc!=cState.stencilFuncFunc || sState.stencilFuncRef!=cState.stencilFuncRef || sState.stencilFuncMask!=cState.stencilFuncMask )
253
      {
254
      cState.stencilFuncFunc = sState.stencilFuncFunc;
255
      cState.stencilFuncRef  = sState.stencilFuncRef ;
256
      cState.stencilFuncMask = sState.stencilFuncMask;
257
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
258
      }
259
    if( sState.stencilMask!=cState.stencilMask )
260
      {
261
      cState.stencilMask = sState.stencilMask;
262
      GLES31.glStencilMask(cState.stencilMask);
263
      }
264
    }
265

    
266
///////////////////////////////////////////////////////////////////////////////////////////////////
267

    
268
  static void setUpStencilMark()
269
    {
270
    sState.stencilTest = cState.stencilTest;
271

    
272
    if( cState.stencilTest!=1 )
273
      {
274
      cState.stencilTest = 1;
275
      //android.util.Log.d("State", "stencil test on");
276
      GLES31.glEnable(GLES31.GL_STENCIL_TEST);
277
      }
278

    
279
    sState.stencilFuncFunc = cState.stencilFuncFunc;
280
    sState.stencilFuncRef  = cState.stencilFuncRef;
281
    sState.stencilFuncMask = cState.stencilFuncMask;
282

    
283
    if( cState.stencilFuncFunc!=GLES31.GL_ALWAYS || cState.stencilFuncRef!=1 || cState.stencilFuncMask!=STENCIL_MASK )
284
      {
285
      cState.stencilFuncFunc = GLES31.GL_ALWAYS;
286
      cState.stencilFuncRef  = 1;
287
      cState.stencilFuncMask = STENCIL_MASK;
288
      //android.util.Log.d("State", "stencil func on");
289
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
290
      }
291

    
292
    sState.stencilOpSfail = cState.stencilOpSfail;
293
    sState.stencilOpDpfail= cState.stencilOpDpfail;
294
    sState.stencilOpDppass= cState.stencilOpDppass;
295

    
296
    if( cState.stencilOpSfail!=GLES31.GL_KEEP || cState.stencilOpDpfail!=GLES31.GL_KEEP || cState.stencilOpDppass!=GLES31.GL_REPLACE )
297
      {
298
      cState.stencilOpSfail = GLES31.GL_KEEP;
299
      cState.stencilOpDpfail= GLES31.GL_KEEP;
300
      cState.stencilOpDppass= GLES31.GL_REPLACE;
301
      //android.util.Log.d("State", "stencil op on");
302
      GLES31.glStencilOp(cState.stencilOpSfail,cState.stencilOpDpfail,cState.stencilOpDppass);
303
      }
304

    
305
    sState.colorMaskR = cState.colorMaskR;
306
    sState.colorMaskG = cState.colorMaskG;
307
    sState.colorMaskB = cState.colorMaskB;
308
    sState.colorMaskA = cState.colorMaskA;
309

    
310
    if( cState.colorMaskR!=0 || cState.colorMaskG!=0 || cState.colorMaskB!=0 || cState.colorMaskA!=0 )
311
      {
312
      cState.colorMaskR = 0;
313
      cState.colorMaskG = 0;
314
      cState.colorMaskB = 0;
315
      cState.colorMaskA = 0;
316
      //android.util.Log.d("State", "switch off color writing");
317
      GLES31.glColorMask(false,false,false,false);
318
      }
319

    
320
    sState.depthMask = cState.depthMask;
321

    
322
    if( cState.depthMask!=1 )
323
      {
324
      cState.depthMask = 1;
325
      //android.util.Log.d("State", "switch on depth writing");
326
      GLES31.glDepthMask(true);
327
      }
328

    
329
    sState.stencilMask = cState.stencilMask;
330

    
331
    if( cState.stencilMask!= STENCIL_MASK )
332
      {
333
      cState.stencilMask = STENCIL_MASK;
334
      //android.util.Log.d("State", "stencil mask on");
335
      GLES31.glStencilMask(cState.stencilMask);
336
      }
337
    }
338

    
339
///////////////////////////////////////////////////////////////////////////////////////////////////
340

    
341
  static void unsetUpStencilMark()
342
    {
343
    if( sState.stencilTest!=cState.stencilTest )
344
      {
345
      cState.stencilTest = sState.stencilTest;
346

    
347
      if (cState.stencilTest == 0)
348
        {
349
        GLES31.glDisable(GLES31.GL_STENCIL_TEST);
350
        }
351
      else
352
        {
353
        GLES31.glEnable(GLES31.GL_STENCIL_TEST);
354
        }
355
      }
356
    if( sState.colorMaskR!=cState.colorMaskR || sState.colorMaskG!=cState.colorMaskG || sState.colorMaskB!=cState.colorMaskB || sState.colorMaskA!=cState.colorMaskA)
357
      {
358
      cState.colorMaskR = sState.colorMaskR;
359
      cState.colorMaskG = sState.colorMaskG;
360
      cState.colorMaskB = sState.colorMaskB;
361
      cState.colorMaskA = sState.colorMaskA;
362
      GLES31.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
363
      }
364
    if( sState.depthMask!=cState.depthMask )
365
      {
366
      cState.depthMask = sState.depthMask;
367
      GLES31.glDepthMask(cState.depthMask==1);
368
      }
369
    if( sState.stencilMask!=cState.stencilMask )
370
      {
371
      cState.stencilMask = sState.stencilMask;
372
      GLES31.glStencilMask(cState.stencilMask);
373
      }
374
    }
375

    
376
///////////////////////////////////////////////////////////////////////////////////////////////////
377
/**
378
 * Only for use by the library itself.
379
 *
380
 * @y.exclude
381
 */
382
  public static void useStencilMark()
383
    {
384
    sState.stencilMask = cState.stencilMask;
385

    
386
    if( cState.stencilTest!=1 )
387
      {
388
      cState.stencilTest = 1;
389
      GLES31.glEnable(GLES31.GL_STENCIL_TEST);
390
      }
391

    
392
    sState.stencilFuncFunc = cState.stencilFuncFunc;
393
    sState.stencilFuncRef  = cState.stencilFuncRef;
394
    sState.stencilFuncMask = cState.stencilFuncMask;
395

    
396
    if( cState.stencilFuncFunc!=GLES31.GL_EQUAL || cState.stencilFuncRef!=1 || cState.stencilFuncMask!=STENCIL_MASK )
397
      {
398
      cState.stencilFuncFunc = GLES31.GL_EQUAL;
399
      cState.stencilFuncRef  = 1;
400
      cState.stencilFuncMask = STENCIL_MASK;
401
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
402
      }
403

    
404
    sState.stencilMask = cState.stencilMask;
405

    
406
    if( cState.stencilMask!= 0x00 )
407
      {
408
      cState.stencilMask = 0x00;
409
      GLES31.glStencilMask(cState.stencilMask);
410
      }
411

    
412
    sState.depthMask = cState.depthMask;
413

    
414
    if( cState.depthMask!=0 )
415
      {
416
      cState.depthMask = 0;
417
      GLES31.glDepthMask(false);
418
      }
419

    
420
    sState.depthTest = cState.depthTest;
421

    
422
    if( cState.depthTest!=0 )
423
      {
424
      cState.depthTest = 0;
425
      GLES31.glDisable(GLES31.GL_DEPTH_TEST);
426
      }
427
    }
428

    
429
///////////////////////////////////////////////////////////////////////////////////////////////////
430
/**
431
 * Only for use by the library itself.
432
 *
433
 * @y.exclude
434
 */
435
  public static void unuseStencilMark()
436
    {
437
    if( sState.stencilTest!=cState.stencilTest )
438
      {
439
      cState.stencilTest = sState.stencilTest;
440

    
441
      if (cState.stencilTest == 0)
442
        {
443
        GLES31.glDisable(GLES31.GL_STENCIL_TEST);
444
        }
445
      else
446
        {
447
        GLES31.glEnable(GLES31.GL_STENCIL_TEST);
448
        }
449
      }
450
    if( sState.stencilFuncFunc!=cState.stencilFuncFunc || sState.stencilFuncRef!=cState.stencilFuncRef || sState.stencilFuncMask!=cState.stencilFuncMask )
451
      {
452
      cState.stencilFuncFunc = sState.stencilFuncFunc;
453
      cState.stencilFuncRef  = sState.stencilFuncRef ;
454
      cState.stencilFuncMask = sState.stencilFuncMask;
455
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
456
      }
457
    if( sState.stencilMask!=cState.stencilMask )
458
      {
459
      cState.stencilMask = sState.stencilMask;
460
      GLES31.glStencilMask(cState.stencilMask);
461
      }
462
    if( sState.depthMask!=cState.depthMask )
463
      {
464
      cState.depthMask = sState.depthMask;
465
      GLES31.glDepthMask(cState.depthMask==1);
466
      }
467
    if( sState.depthTest!=cState.depthTest )
468
      {
469
      cState.depthTest = sState.depthTest;
470

    
471
      if (cState.depthTest == 0)
472
        {
473
        GLES31.glDisable(GLES31.GL_DEPTH_TEST);
474
        }
475
      else
476
        {
477
        GLES31.glEnable(GLES31.GL_DEPTH_TEST);
478
        }
479
      }
480
    }
481

    
482
///////////////////////////////////////////////////////////////////////////////////////////////////
483

    
484
  void apply()
485
    {
486
    //android.util.Log.e("State", "APPLYING STATE");
487

    
488
    /////////////////////////////////////////////////////
489
    // 1. Write to color buffer?
490
    if( mState.colorMaskR!=cState.colorMaskR || mState.colorMaskG!=cState.colorMaskG || mState.colorMaskB!=cState.colorMaskB || mState.colorMaskA!=cState.colorMaskA)
491
      {
492
      //android.util.Log.d("State", "setting color mask");
493
      cState.colorMaskR = mState.colorMaskR;
494
      cState.colorMaskG = mState.colorMaskG;
495
      cState.colorMaskB = mState.colorMaskB;
496
      cState.colorMaskA = mState.colorMaskA;
497
      GLES31.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
498
      }
499

    
500
    /////////////////////////////////////////////////////
501
    // 2. Enable Depth test?
502
    if( mState.depthTest!=cState.depthTest )
503
      {
504
      cState.depthTest = mState.depthTest;
505

    
506
      if (cState.depthTest == 0)
507
        {
508
        //android.util.Log.d("State", "disabling depth test");
509
        GLES31.glDisable(GLES31.GL_DEPTH_TEST);
510
        }
511
      else
512
        {
513
        //android.util.Log.d("State", "enable depth test");
514
        GLES31.glEnable(GLES31.GL_DEPTH_TEST);
515
        }
516
      }
517

    
518
    /////////////////////////////////////////////////////
519
    // 3. Change Depth Function?
520
    if( mState.depthFunc!=cState.depthFunc )
521
      {
522
      //android.util.Log.d("State", "setting depth func");
523
      cState.depthFunc = mState.depthFunc;
524
      GLES31.glDepthFunc(cState.depthFunc);
525
      }
526

    
527
    /////////////////////////////////////////////////////
528
    // 4. Write to Depth buffer?
529
    if( mState.depthMask!=cState.depthMask )
530
      {
531
      //android.util.Log.d("State", "setting depth mask");
532
      cState.depthMask = mState.depthMask;
533
      GLES31.glDepthMask(cState.depthMask==1);
534
      }
535

    
536
    /////////////////////////////////////////////////////
537
    // 5. Enable Blending?
538
    if( mState.blend!=cState.blend )
539
      {
540
      cState.blend = mState.blend;
541

    
542
      if (cState.blend == 0)
543
        {
544
        //android.util.Log.d("State", "disabling blending");
545
        GLES31.glDisable(GLES31.GL_BLEND);
546
        }
547
      else
548
        {
549
        //android.util.Log.d("State", "enabling blending");
550
        GLES31.glEnable(GLES31.GL_BLEND);
551
        }
552
      }
553

    
554
    /////////////////////////////////////////////////////
555
    // 6. Change Blend function?
556
    if( mState.blendSrc!=cState.blendSrc || mState.blendDst!=cState.blendDst )
557
      {
558
      //android.util.Log.d("State", "setting blend function");
559
      cState.blendSrc = mState.blendSrc;
560
      cState.blendDst = mState.blendDst;
561
      GLES31.glBlendFunc(cState.blendSrc,cState.blendDst);
562
      }
563

    
564
    /////////////////////////////////////////////////////
565
    // 7. Enable/Disable Stencil Test?
566
    if( mState.stencilTest!=cState.stencilTest )
567
      {
568
      cState.stencilTest = mState.stencilTest;
569

    
570
      if (cState.stencilTest == 0)
571
        {
572
        //android.util.Log.d("State", "disabling stencil test");
573
        GLES31.glDisable(GLES31.GL_STENCIL_TEST);
574
        }
575
      else
576
        {
577
        //android.util.Log.d("State", "enabling stencil test");
578
        GLES31.glEnable(GLES31.GL_STENCIL_TEST);
579
        }
580
      }
581

    
582
    /////////////////////////////////////////////////////
583
    // 8. Adjust Stencil function?
584
    if( mState.stencilFuncFunc!=cState.stencilFuncFunc || mState.stencilFuncRef!=cState.stencilFuncRef || mState.stencilFuncMask!=cState.stencilFuncMask )
585
      {
586
      //android.util.Log.d("State", "setting stencil function");
587
      cState.stencilFuncFunc = mState.stencilFuncFunc;
588
      cState.stencilFuncRef  = mState.stencilFuncRef ;
589
      cState.stencilFuncMask = mState.stencilFuncMask;
590
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
591
      }
592

    
593
    /////////////////////////////////////////////////////
594
    // 9. Adjust Stencil operation?
595
    if( mState.stencilOpSfail!=cState.stencilOpSfail || mState.stencilOpDpfail!=cState.stencilOpDpfail || mState.stencilOpDppass!=cState.stencilOpDppass )
596
      {
597
      //android.util.Log.d("State", "setting stencil op");
598
      cState.stencilOpSfail = mState.stencilOpSfail;
599
      cState.stencilOpDpfail= mState.stencilOpDpfail;
600
      cState.stencilOpDppass= mState.stencilOpDppass;
601
      GLES31.glStencilOp(cState.stencilOpSfail,cState.stencilOpDpfail,cState.stencilOpDppass);
602
      }
603

    
604
    /////////////////////////////////////////////////////
605
    // 10. Write to Stencil buffer?
606
    if( mState.stencilMask!=cState.stencilMask )
607
      {
608
      //android.util.Log.d("State", "setting stencil mask");
609
      cState.stencilMask = mState.stencilMask;
610
      GLES31.glStencilMask(cState.stencilMask);
611
      }
612

    
613
    /////////////////////////////////////////////////////
614
    // 11. Clear buffers?
615
    if( mClear!=0 )
616
      {
617
      //android.util.Log.d("State", "clearing buffer");
618
      GLES31.glClear(mClear);
619
      }
620
    }
621

    
622
///////////////////////////////////////////////////////////////////////////////////////////////////
623

    
624
  void glColorMask(boolean r, boolean g, boolean b, boolean a)
625
    {
626
    mState.colorMaskR = (r ? 1:0);
627
    mState.colorMaskG = (g ? 1:0);
628
    mState.colorMaskB = (b ? 1:0);
629
    mState.colorMaskA = (a ? 1:0);
630
    }
631

    
632
///////////////////////////////////////////////////////////////////////////////////////////////////
633

    
634
  void glDepthMask(boolean mask)
635
    {
636
    mState.depthMask = (mask ? 1:0);
637
    }
638

    
639
///////////////////////////////////////////////////////////////////////////////////////////////////
640

    
641
  void glStencilMask(int mask)
642
    {
643
    mState.stencilMask = mask;
644
    }
645

    
646
///////////////////////////////////////////////////////////////////////////////////////////////////
647

    
648
  void glEnable(int test)
649
    {
650
         if( test==GLES31.GL_DEPTH_TEST   ) mState.depthTest   = 1;
651
    else if( test==GLES31.GL_STENCIL_TEST ) mState.stencilTest = 1;
652
    else if( test==GLES31.GL_BLEND        ) mState.blend       = 1;
653
    }
654

    
655
///////////////////////////////////////////////////////////////////////////////////////////////////
656

    
657
  void glDisable(int test)
658
    {
659
         if( test==GLES31.GL_DEPTH_TEST   ) mState.depthTest   = 0;
660
    else if( test==GLES31.GL_STENCIL_TEST ) mState.stencilTest = 0;
661
    else if( test==GLES31.GL_BLEND        ) mState.blend       = 0;
662
    }
663

    
664
///////////////////////////////////////////////////////////////////////////////////////////////////
665

    
666
  void glStencilFunc(int func, int ref, int mask)
667
    {
668
    mState.stencilFuncFunc = func;
669
    mState.stencilFuncRef  = ref;
670
    mState.stencilFuncMask = mask;
671
    }
672

    
673
///////////////////////////////////////////////////////////////////////////////////////////////////
674

    
675
  void glStencilOp(int sfail, int dpfail, int dppass)
676
    {
677
    mState.stencilOpSfail = sfail;
678
    mState.stencilOpDpfail= dpfail;
679
    mState.stencilOpDppass= dppass;
680
    }
681

    
682
///////////////////////////////////////////////////////////////////////////////////////////////////
683

    
684
  void glDepthFunc(int func)
685
    {
686
    mState.depthFunc = func;
687
    }
688

    
689
///////////////////////////////////////////////////////////////////////////////////////////////////
690

    
691
  void glBlendFunc(int src, int dst)
692
    {
693
    mState.blendSrc = src;
694
    mState.blendDst = dst;
695
    }
696

    
697
///////////////////////////////////////////////////////////////////////////////////////////////////
698

    
699
  void glClear(int mask)
700
    {
701
    mClear = mask;
702
    }
703
}
(10-10/22)