Project

General

Profile

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

library / src / main / java / org / distorted / library / main / DistortedRenderState.java @ 33f59f22

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 enableDepthTest()
190
    {
191
    sState.depthTest = cState.depthTest;
192

    
193
    if (cState.depthTest != 1)
194
      {
195
      cState.depthTest = 1;
196
      GLES31.glEnable(GLES31.GL_DEPTH_TEST);
197
      }
198
    }
199

    
200
///////////////////////////////////////////////////////////////////////////////////////////////////
201

    
202
  static void restoreDepthTest()
203
    {
204
    if (sState.depthTest != cState.depthTest)
205
      {
206
      cState.depthTest = sState.depthTest;
207

    
208
      if (cState.depthTest == 0)
209
        {
210
        GLES31.glDisable(GLES31.GL_DEPTH_TEST);
211
        }
212
      else
213
        {
214
        GLES31.glEnable(GLES31.GL_DEPTH_TEST);
215
        }
216
      }
217
    }
218

    
219
///////////////////////////////////////////////////////////////////////////////////////////////////
220

    
221
  static void switchOffDrawing()
222
    {
223
    GLES31.glEnable(GLES31.GL_SCISSOR_TEST);
224
    GLES31.glScissor(0,0,0,0);
225
    }
226

    
227
///////////////////////////////////////////////////////////////////////////////////////////////////
228

    
229
  static void restoreDrawing()
230
    {
231
    GLES31.glDisable(GLES31.GL_SCISSOR_TEST);
232
    }
233

    
234
///////////////////////////////////////////////////////////////////////////////////////////////////
235

    
236
  static void switchOffColorDepthStencil()
237
    {
238
    sState.stencilTest = cState.stencilTest;
239

    
240
    if( cState.stencilTest!=0 )
241
      {
242
      cState.stencilTest = 0;
243
      //android.util.Log.d("State", "stencil test off");
244
      GLES31.glDisable(GLES31.GL_STENCIL_TEST);
245
      }
246

    
247
    sState.depthTest = cState.depthTest;
248

    
249
    if( cState.depthTest!=0 )
250
      {
251
      cState.depthTest = 0;
252
      //android.util.Log.d("State", "depth test off");
253
      GLES31.glDisable(GLES31.GL_DEPTH_TEST);
254
      }
255

    
256
    sState.colorMaskR = cState.colorMaskR;
257
    sState.colorMaskG = cState.colorMaskG;
258
    sState.colorMaskB = cState.colorMaskB;
259
    sState.colorMaskA = cState.colorMaskA;
260

    
261
    if( cState.colorMaskR!=0 || cState.colorMaskG!=0 || cState.colorMaskB!=0 || cState.colorMaskA!=0 )
262
      {
263
      cState.colorMaskR = 0;
264
      cState.colorMaskG = 0;
265
      cState.colorMaskB = 0;
266
      cState.colorMaskA = 0;
267
      //android.util.Log.d("State", "switch off color writing");
268
      GLES31.glColorMask(false,false,false,false);
269
      }
270

    
271
    sState.depthMask = cState.depthMask;
272

    
273
    if( cState.depthMask!=0 )
274
      {
275
      cState.depthMask = 0;
276
      //android.util.Log.d("State", "switch off depth writing");
277
      GLES31.glDepthMask(false);
278
      }
279

    
280
    sState.stencilMask = cState.stencilMask;
281

    
282
    if( cState.stencilMask!= 0x00 )
283
      {
284
      cState.stencilMask = 0x00;
285
      //android.util.Log.d("State", "stencil mask off");
286
      GLES31.glStencilMask(cState.stencilMask);
287
      }
288
    }
289

    
290
///////////////////////////////////////////////////////////////////////////////////////////////////
291

    
292
  static void switchColorDepthOnStencilOff()
293
    {
294
    sState.stencilTest = cState.stencilTest;
295

    
296
    if( cState.stencilTest!=0 )
297
      {
298
      cState.stencilTest = 0;
299
      //android.util.Log.d("State", "stencil test off");
300
      GLES31.glDisable(GLES31.GL_STENCIL_TEST);
301
      }
302

    
303
    sState.depthTest = cState.depthTest;
304

    
305
    if( cState.depthTest!=0 )
306
      {
307
      cState.depthTest = 0;
308
      //android.util.Log.d("State", "depth test off");
309
      GLES31.glDisable(GLES31.GL_DEPTH_TEST);
310
      }
311

    
312
    sState.colorMaskR = cState.colorMaskR;
313
    sState.colorMaskG = cState.colorMaskG;
314
    sState.colorMaskB = cState.colorMaskB;
315
    sState.colorMaskA = cState.colorMaskA;
316

    
317
    if( cState.colorMaskR!=1 || cState.colorMaskG!=1 || cState.colorMaskB!=1 || cState.colorMaskA!=1 )
318
      {
319
      cState.colorMaskR = 1;
320
      cState.colorMaskG = 1;
321
      cState.colorMaskB = 1;
322
      cState.colorMaskA = 1;
323
      //android.util.Log.d("State", "switch on color writing");
324
      GLES31.glColorMask(true,true,true,true);
325
      }
326

    
327
    sState.depthMask = cState.depthMask;
328

    
329
    if( cState.depthMask!=1 )
330
      {
331
      cState.depthMask = 1;
332
      //android.util.Log.d("State", "switch on depth writing");
333
      GLES31.glDepthMask(true);
334
      }
335

    
336
    sState.stencilMask = cState.stencilMask;
337

    
338
    if( cState.stencilMask!= 0x00 )
339
      {
340
      cState.stencilMask = 0x00;
341
      //android.util.Log.d("State", "stencil mask off");
342
      GLES31.glStencilMask(cState.stencilMask);
343
      }
344
    }
345

    
346
///////////////////////////////////////////////////////////////////////////////////////////////////
347

    
348
  static void restoreColorDepthStencil()
349
    {
350
    if( sState.stencilTest!=cState.stencilTest )
351
      {
352
      cState.stencilTest = sState.stencilTest;
353

    
354
      if (cState.stencilTest == 0)
355
        {
356
        GLES31.glDisable(GLES31.GL_STENCIL_TEST);
357
        }
358
      else
359
        {
360
        GLES31.glEnable(GLES31.GL_STENCIL_TEST);
361
        }
362
      }
363
    if( sState.depthTest!=cState.depthTest )
364
      {
365
      cState.depthTest = sState.depthTest;
366

    
367
      if (cState.depthTest == 0)
368
        {
369
        GLES31.glDisable(GLES31.GL_DEPTH_TEST);
370
        }
371
      else
372
        {
373
        GLES31.glEnable(GLES31.GL_DEPTH_TEST);
374
        }
375
      }
376
    if( sState.colorMaskR!=cState.colorMaskR || sState.colorMaskG!=cState.colorMaskG || sState.colorMaskB!=cState.colorMaskB || sState.colorMaskA!=cState.colorMaskA)
377
      {
378
      cState.colorMaskR = sState.colorMaskR;
379
      cState.colorMaskG = sState.colorMaskG;
380
      cState.colorMaskB = sState.colorMaskB;
381
      cState.colorMaskA = sState.colorMaskA;
382
      GLES31.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
383
      }
384
    if( sState.depthMask!=cState.depthMask )
385
      {
386
      cState.depthMask = sState.depthMask;
387
      GLES31.glDepthMask(cState.depthMask==1);
388
      }
389
    if( sState.stencilMask!=cState.stencilMask )
390
      {
391
      cState.stencilMask = sState.stencilMask;
392
      GLES31.glStencilMask(cState.stencilMask);
393
      }
394
    }
395

    
396
///////////////////////////////////////////////////////////////////////////////////////////////////
397

    
398
  static void disableStencil()
399
    {
400
    sState.stencilTest = cState.stencilTest;
401

    
402
    if (cState.stencilTest != 0)
403
      {
404
      cState.stencilTest = 0;
405
      GLES31.glDisable(GLES31.GL_STENCIL_TEST);
406
      }
407

    
408
    sState.stencilFuncFunc = cState.stencilFuncFunc;
409
    sState.stencilFuncRef  = cState.stencilFuncRef;
410
    sState.stencilFuncMask = cState.stencilFuncMask;
411

    
412
    if( cState.stencilFuncFunc!=GLES31.GL_EQUAL || cState.stencilFuncRef!=1 || cState.stencilFuncMask!=STENCIL_MASK )
413
      {
414
      cState.stencilFuncFunc = GLES31.GL_EQUAL;
415
      cState.stencilFuncRef  = 1;
416
      cState.stencilFuncMask = STENCIL_MASK;
417
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
418
      }
419

    
420
    sState.stencilMask = cState.stencilMask;
421

    
422
    if( cState.stencilMask!= 0x00 )
423
      {
424
      cState.stencilMask = 0x00;
425
      GLES31.glStencilMask(cState.stencilMask);
426
      }
427
    }
428

    
429
///////////////////////////////////////////////////////////////////////////////////////////////////
430

    
431
  static void restoreStencil()
432
    {
433
    if (sState.stencilTest != cState.stencilTest)
434
      {
435
      cState.stencilTest = sState.stencilTest;
436

    
437
      if (cState.stencilTest == 0)
438
        {
439
        GLES31.glDisable(GLES31.GL_STENCIL_TEST);
440
        }
441
      else
442
        {
443
        GLES31.glEnable(GLES31.GL_STENCIL_TEST);
444
        }
445
      }
446
    if( sState.stencilFuncFunc!=cState.stencilFuncFunc || sState.stencilFuncRef!=cState.stencilFuncRef || sState.stencilFuncMask!=cState.stencilFuncMask )
447
      {
448
      cState.stencilFuncFunc = sState.stencilFuncFunc;
449
      cState.stencilFuncRef  = sState.stencilFuncRef ;
450
      cState.stencilFuncMask = sState.stencilFuncMask;
451
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
452
      }
453
    if( sState.stencilMask!=cState.stencilMask )
454
      {
455
      cState.stencilMask = sState.stencilMask;
456
      GLES31.glStencilMask(cState.stencilMask);
457
      }
458
    }
459

    
460
///////////////////////////////////////////////////////////////////////////////////////////////////
461

    
462
  static void setUpStencilMark()
463
    {
464
    sState.stencilTest = cState.stencilTest;
465

    
466
    if( cState.stencilTest!=1 )
467
      {
468
      cState.stencilTest = 1;
469
      //android.util.Log.d("State", "stencil test on");
470
      GLES31.glEnable(GLES31.GL_STENCIL_TEST);
471
      }
472

    
473
    sState.stencilFuncFunc = cState.stencilFuncFunc;
474
    sState.stencilFuncRef  = cState.stencilFuncRef;
475
    sState.stencilFuncMask = cState.stencilFuncMask;
476

    
477
    if( cState.stencilFuncFunc!=GLES31.GL_ALWAYS || cState.stencilFuncRef!=1 || cState.stencilFuncMask!=STENCIL_MASK )
478
      {
479
      cState.stencilFuncFunc = GLES31.GL_ALWAYS;
480
      cState.stencilFuncRef  = 1;
481
      cState.stencilFuncMask = STENCIL_MASK;
482
      //android.util.Log.d("State", "stencil func on");
483
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
484
      }
485

    
486
    sState.stencilOpSfail = cState.stencilOpSfail;
487
    sState.stencilOpDpfail= cState.stencilOpDpfail;
488
    sState.stencilOpDppass= cState.stencilOpDppass;
489

    
490
    if( cState.stencilOpSfail!=GLES31.GL_KEEP || cState.stencilOpDpfail!=GLES31.GL_KEEP || cState.stencilOpDppass!=GLES31.GL_REPLACE )
491
      {
492
      cState.stencilOpSfail = GLES31.GL_KEEP;
493
      cState.stencilOpDpfail= GLES31.GL_KEEP;
494
      cState.stencilOpDppass= GLES31.GL_REPLACE;
495
      //android.util.Log.d("State", "stencil op on");
496
      GLES31.glStencilOp(cState.stencilOpSfail,cState.stencilOpDpfail,cState.stencilOpDppass);
497
      }
498

    
499
    sState.colorMaskR = cState.colorMaskR;
500
    sState.colorMaskG = cState.colorMaskG;
501
    sState.colorMaskB = cState.colorMaskB;
502
    sState.colorMaskA = cState.colorMaskA;
503

    
504
    if( cState.colorMaskR!=0 || cState.colorMaskG!=0 || cState.colorMaskB!=0 || cState.colorMaskA!=0 )
505
      {
506
      cState.colorMaskR = 0;
507
      cState.colorMaskG = 0;
508
      cState.colorMaskB = 0;
509
      cState.colorMaskA = 0;
510
      //android.util.Log.d("State", "switch off color writing");
511
      GLES31.glColorMask(false,false,false,false);
512
      }
513

    
514
    sState.depthMask = cState.depthMask;
515

    
516
    if( cState.depthMask!=1 )
517
      {
518
      cState.depthMask = 1;
519
      //android.util.Log.d("State", "switch on depth writing");
520
      GLES31.glDepthMask(true);
521
      }
522

    
523
    sState.stencilMask = cState.stencilMask;
524

    
525
    if( cState.stencilMask!= STENCIL_MASK )
526
      {
527
      cState.stencilMask = STENCIL_MASK;
528
      //android.util.Log.d("State", "stencil mask on");
529
      GLES31.glStencilMask(cState.stencilMask);
530
      }
531
    }
532

    
533
///////////////////////////////////////////////////////////////////////////////////////////////////
534

    
535
  static void unsetUpStencilMark()
536
    {
537
    if( sState.stencilTest!=cState.stencilTest )
538
      {
539
      cState.stencilTest = sState.stencilTest;
540

    
541
      if (cState.stencilTest == 0)
542
        {
543
        GLES31.glDisable(GLES31.GL_STENCIL_TEST);
544
        }
545
      else
546
        {
547
        GLES31.glEnable(GLES31.GL_STENCIL_TEST);
548
        }
549
      }
550
    if( sState.colorMaskR!=cState.colorMaskR || sState.colorMaskG!=cState.colorMaskG || sState.colorMaskB!=cState.colorMaskB || sState.colorMaskA!=cState.colorMaskA)
551
      {
552
      cState.colorMaskR = sState.colorMaskR;
553
      cState.colorMaskG = sState.colorMaskG;
554
      cState.colorMaskB = sState.colorMaskB;
555
      cState.colorMaskA = sState.colorMaskA;
556
      GLES31.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
557
      }
558
    if( sState.depthMask!=cState.depthMask )
559
      {
560
      cState.depthMask = sState.depthMask;
561
      GLES31.glDepthMask(cState.depthMask==1);
562
      }
563
    if( sState.stencilMask!=cState.stencilMask )
564
      {
565
      cState.stencilMask = sState.stencilMask;
566
      GLES31.glStencilMask(cState.stencilMask);
567
      }
568
    }
569

    
570
///////////////////////////////////////////////////////////////////////////////////////////////////
571
/**
572
 * Only for use by the library itself.
573
 *
574
 * @y.exclude
575
 */
576
  public static void useStencilMark()
577
    {
578
    sState.stencilMask = cState.stencilMask;
579

    
580
    if( cState.stencilTest!=1 )
581
      {
582
      cState.stencilTest = 1;
583
      GLES31.glEnable(GLES31.GL_STENCIL_TEST);
584
      }
585

    
586
    sState.stencilFuncFunc = cState.stencilFuncFunc;
587
    sState.stencilFuncRef  = cState.stencilFuncRef;
588
    sState.stencilFuncMask = cState.stencilFuncMask;
589

    
590
    if( cState.stencilFuncFunc!=GLES31.GL_EQUAL || cState.stencilFuncRef!=1 || cState.stencilFuncMask!=STENCIL_MASK )
591
      {
592
      cState.stencilFuncFunc = GLES31.GL_EQUAL;
593
      cState.stencilFuncRef  = 1;
594
      cState.stencilFuncMask = STENCIL_MASK;
595
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
596
      }
597

    
598
    sState.stencilMask = cState.stencilMask;
599

    
600
    if( cState.stencilMask!= 0x00 )
601
      {
602
      cState.stencilMask = 0x00;
603
      GLES31.glStencilMask(cState.stencilMask);
604
      }
605

    
606
    sState.depthMask = cState.depthMask;
607

    
608
    if( cState.depthMask!=0 )
609
      {
610
      cState.depthMask = 0;
611
      GLES31.glDepthMask(false);
612
      }
613

    
614
    sState.depthTest = cState.depthTest;
615

    
616
    if( cState.depthTest!=0 )
617
      {
618
      cState.depthTest = 0;
619
      GLES31.glDisable(GLES31.GL_DEPTH_TEST);
620
      }
621
    }
622

    
623
///////////////////////////////////////////////////////////////////////////////////////////////////
624
/**
625
 * Only for use by the library itself.
626
 *
627
 * @y.exclude
628
 */
629
  public static void unuseStencilMark()
630
    {
631
    if( sState.stencilTest!=cState.stencilTest )
632
      {
633
      cState.stencilTest = sState.stencilTest;
634

    
635
      if (cState.stencilTest == 0)
636
        {
637
        GLES31.glDisable(GLES31.GL_STENCIL_TEST);
638
        }
639
      else
640
        {
641
        GLES31.glEnable(GLES31.GL_STENCIL_TEST);
642
        }
643
      }
644
    if( sState.stencilFuncFunc!=cState.stencilFuncFunc || sState.stencilFuncRef!=cState.stencilFuncRef || sState.stencilFuncMask!=cState.stencilFuncMask )
645
      {
646
      cState.stencilFuncFunc = sState.stencilFuncFunc;
647
      cState.stencilFuncRef  = sState.stencilFuncRef ;
648
      cState.stencilFuncMask = sState.stencilFuncMask;
649
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
650
      }
651
    if( sState.stencilMask!=cState.stencilMask )
652
      {
653
      cState.stencilMask = sState.stencilMask;
654
      GLES31.glStencilMask(cState.stencilMask);
655
      }
656
    if( sState.depthMask!=cState.depthMask )
657
      {
658
      cState.depthMask = sState.depthMask;
659
      GLES31.glDepthMask(cState.depthMask==1);
660
      }
661
    if( sState.depthTest!=cState.depthTest )
662
      {
663
      cState.depthTest = sState.depthTest;
664

    
665
      if (cState.depthTest == 0)
666
        {
667
        GLES31.glDisable(GLES31.GL_DEPTH_TEST);
668
        }
669
      else
670
        {
671
        GLES31.glEnable(GLES31.GL_DEPTH_TEST);
672
        }
673
      }
674
    }
675

    
676
///////////////////////////////////////////////////////////////////////////////////////////////////
677

    
678
  void apply()
679
    {
680
    //android.util.Log.e("State", "APPLYING STATE");
681

    
682
    /////////////////////////////////////////////////////
683
    // 1. Write to color buffer?
684
    if( mState.colorMaskR!=cState.colorMaskR || mState.colorMaskG!=cState.colorMaskG || mState.colorMaskB!=cState.colorMaskB || mState.colorMaskA!=cState.colorMaskA)
685
      {
686
      //android.util.Log.d("State", "setting color mask");
687
      cState.colorMaskR = mState.colorMaskR;
688
      cState.colorMaskG = mState.colorMaskG;
689
      cState.colorMaskB = mState.colorMaskB;
690
      cState.colorMaskA = mState.colorMaskA;
691
      GLES31.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
692
      }
693

    
694
    /////////////////////////////////////////////////////
695
    // 2. Enable Depth test?
696
    if( mState.depthTest!=cState.depthTest )
697
      {
698
      cState.depthTest = mState.depthTest;
699

    
700
      if (cState.depthTest == 0)
701
        {
702
        //android.util.Log.d("State", "disabling depth test");
703
        GLES31.glDisable(GLES31.GL_DEPTH_TEST);
704
        }
705
      else
706
        {
707
        //android.util.Log.d("State", "enable depth test");
708
        GLES31.glEnable(GLES31.GL_DEPTH_TEST);
709
        }
710
      }
711

    
712
    /////////////////////////////////////////////////////
713
    // 3. Change Depth Function?
714
    if( mState.depthFunc!=cState.depthFunc )
715
      {
716
      //android.util.Log.d("State", "setting depth func");
717
      cState.depthFunc = mState.depthFunc;
718
      GLES31.glDepthFunc(cState.depthFunc);
719
      }
720

    
721
    /////////////////////////////////////////////////////
722
    // 4. Write to Depth buffer?
723
    if( mState.depthMask!=cState.depthMask )
724
      {
725
      //android.util.Log.d("State", "setting depth mask");
726
      cState.depthMask = mState.depthMask;
727
      GLES31.glDepthMask(cState.depthMask==1);
728
      }
729

    
730
    /////////////////////////////////////////////////////
731
    // 5. Enable Blending?
732
    if( mState.blend!=cState.blend )
733
      {
734
      cState.blend = mState.blend;
735

    
736
      if (cState.blend == 0)
737
        {
738
        //android.util.Log.d("State", "disabling blending");
739
        GLES31.glDisable(GLES31.GL_BLEND);
740
        }
741
      else
742
        {
743
        //android.util.Log.d("State", "enabling blending");
744
        GLES31.glEnable(GLES31.GL_BLEND);
745
        }
746
      }
747

    
748
    /////////////////////////////////////////////////////
749
    // 6. Change Blend function?
750
    if( mState.blendSrc!=cState.blendSrc || mState.blendDst!=cState.blendDst )
751
      {
752
      //android.util.Log.d("State", "setting blend function");
753
      cState.blendSrc = mState.blendSrc;
754
      cState.blendDst = mState.blendDst;
755
      GLES31.glBlendFunc(cState.blendSrc,cState.blendDst);
756
      }
757

    
758
    /////////////////////////////////////////////////////
759
    // 7. Enable/Disable Stencil Test?
760
    if( mState.stencilTest!=cState.stencilTest )
761
      {
762
      cState.stencilTest = mState.stencilTest;
763

    
764
      if (cState.stencilTest == 0)
765
        {
766
        //android.util.Log.d("State", "disabling stencil test");
767
        GLES31.glDisable(GLES31.GL_STENCIL_TEST);
768
        }
769
      else
770
        {
771
        //android.util.Log.d("State", "enabling stencil test");
772
        GLES31.glEnable(GLES31.GL_STENCIL_TEST);
773
        }
774
      }
775

    
776
    /////////////////////////////////////////////////////
777
    // 8. Adjust Stencil function?
778
    if( mState.stencilFuncFunc!=cState.stencilFuncFunc || mState.stencilFuncRef!=cState.stencilFuncRef || mState.stencilFuncMask!=cState.stencilFuncMask )
779
      {
780
      //android.util.Log.d("State", "setting stencil function");
781
      cState.stencilFuncFunc = mState.stencilFuncFunc;
782
      cState.stencilFuncRef  = mState.stencilFuncRef ;
783
      cState.stencilFuncMask = mState.stencilFuncMask;
784
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
785
      }
786

    
787
    /////////////////////////////////////////////////////
788
    // 9. Adjust Stencil operation?
789
    if( mState.stencilOpSfail!=cState.stencilOpSfail || mState.stencilOpDpfail!=cState.stencilOpDpfail || mState.stencilOpDppass!=cState.stencilOpDppass )
790
      {
791
      //android.util.Log.d("State", "setting stencil op");
792
      cState.stencilOpSfail = mState.stencilOpSfail;
793
      cState.stencilOpDpfail= mState.stencilOpDpfail;
794
      cState.stencilOpDppass= mState.stencilOpDppass;
795
      GLES31.glStencilOp(cState.stencilOpSfail,cState.stencilOpDpfail,cState.stencilOpDppass);
796
      }
797

    
798
    /////////////////////////////////////////////////////
799
    // 10. Write to Stencil buffer?
800
    if( mState.stencilMask!=cState.stencilMask )
801
      {
802
      //android.util.Log.d("State", "setting stencil mask");
803
      cState.stencilMask = mState.stencilMask;
804
      GLES31.glStencilMask(cState.stencilMask);
805
      }
806

    
807
    /////////////////////////////////////////////////////
808
    // 11. Clear buffers?
809
    if( mClear!=0 )
810
      {
811
      //android.util.Log.d("State", "clearing buffer");
812
      GLES31.glClear(mClear);
813
      }
814
    }
815

    
816
///////////////////////////////////////////////////////////////////////////////////////////////////
817

    
818
  void glColorMask(boolean r, boolean g, boolean b, boolean a)
819
    {
820
    mState.colorMaskR = (r ? 1:0);
821
    mState.colorMaskG = (g ? 1:0);
822
    mState.colorMaskB = (b ? 1:0);
823
    mState.colorMaskA = (a ? 1:0);
824
    }
825

    
826
///////////////////////////////////////////////////////////////////////////////////////////////////
827

    
828
  void glDepthMask(boolean mask)
829
    {
830
    mState.depthMask = (mask ? 1:0);
831
    }
832

    
833
///////////////////////////////////////////////////////////////////////////////////////////////////
834

    
835
  void glStencilMask(int mask)
836
    {
837
    mState.stencilMask = mask;
838
    }
839

    
840
///////////////////////////////////////////////////////////////////////////////////////////////////
841

    
842
  void glEnable(int test)
843
    {
844
         if( test==GLES31.GL_DEPTH_TEST   ) mState.depthTest   = 1;
845
    else if( test==GLES31.GL_STENCIL_TEST ) mState.stencilTest = 1;
846
    else if( test==GLES31.GL_BLEND        ) mState.blend       = 1;
847
    }
848

    
849
///////////////////////////////////////////////////////////////////////////////////////////////////
850

    
851
  void glDisable(int test)
852
    {
853
         if( test==GLES31.GL_DEPTH_TEST   ) mState.depthTest   = 0;
854
    else if( test==GLES31.GL_STENCIL_TEST ) mState.stencilTest = 0;
855
    else if( test==GLES31.GL_BLEND        ) mState.blend       = 0;
856
    }
857

    
858
///////////////////////////////////////////////////////////////////////////////////////////////////
859

    
860
  void glStencilFunc(int func, int ref, int mask)
861
    {
862
    mState.stencilFuncFunc = func;
863
    mState.stencilFuncRef  = ref;
864
    mState.stencilFuncMask = mask;
865
    }
866

    
867
///////////////////////////////////////////////////////////////////////////////////////////////////
868

    
869
  void glStencilOp(int sfail, int dpfail, int dppass)
870
    {
871
    mState.stencilOpSfail = sfail;
872
    mState.stencilOpDpfail= dpfail;
873
    mState.stencilOpDppass= dppass;
874
    }
875

    
876
///////////////////////////////////////////////////////////////////////////////////////////////////
877

    
878
  void glDepthFunc(int func)
879
    {
880
    mState.depthFunc = func;
881
    }
882

    
883
///////////////////////////////////////////////////////////////////////////////////////////////////
884

    
885
  void glBlendFunc(int src, int dst)
886
    {
887
    mState.blendSrc = src;
888
    mState.blendDst = dst;
889
    }
890

    
891
///////////////////////////////////////////////////////////////////////////////////////////////////
892

    
893
  void glClear(int mask)
894
    {
895
    mClear = mask;
896
    }
897
}
(9-9/21)