Project

General

Profile

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

library / src / main / java / org / distorted / library / main / InternalRenderState.java @ b7074bc6

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.GLES30;
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 InternalRenderState
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
  InternalRenderState()
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  = GLES30.GL_LEQUAL;
75

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

    
80
    mState.stencilTest     = 0;
81
    mState.stencilMask     = STENCIL_MASK;
82
    mState.stencilFuncFunc = GLES30.GL_NEVER;
83
    mState.stencilFuncRef  = 0;
84
    mState.stencilFuncMask = STENCIL_MASK;
85
    mState.stencilOpSfail  = GLES30.GL_KEEP;
86
    mState.stencilOpDpfail = GLES30.GL_KEEP;
87
    mState.stencilOpDppass = GLES30.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
    GLES30.glColorMask(true,true,true,true);
102

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

    
110
    cState.stencilTest     = 0;
111
    cState.stencilMask     = STENCIL_MASK;
112
    cState.stencilFuncFunc = GLES30.GL_NEVER;
113
    cState.stencilFuncRef  = 0;
114
    cState.stencilFuncMask = STENCIL_MASK;
115
    cState.stencilOpSfail  = GLES30.GL_KEEP;
116
    cState.stencilOpDpfail = GLES30.GL_KEEP;
117
    cState.stencilOpDppass = GLES30.GL_KEEP;
118
    GLES30.glDisable(GLES30.GL_STENCIL_TEST);
119
    GLES30.glStencilMask(cState.stencilMask);
120

    
121
    cState.blend      = 1;
122
    cState.blendSrc   = GLES30.GL_SRC_ALPHA;
123
    cState.blendDst   = GLES30.GL_ONE_MINUS_SRC_ALPHA;
124
    GLES30.glEnable(GLES30.GL_BLEND);
125
    GLES30.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
      GLES30.glColorMask(true,true,true,true);
144
      }
145

    
146
    sState.depthMask = cState.depthMask;
147

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

    
154
    sState.stencilMask = cState.stencilMask;
155

    
156
    if( cState.stencilMask!= STENCIL_MASK )
157
      {
158
      cState.stencilMask = STENCIL_MASK;
159
      GLES30.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
      GLES30.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
      GLES30.glDepthMask(cState.depthMask==1);
179
      }
180
    if( sState.stencilMask!=cState.stencilMask )
181
      {
182
      cState.stencilMask = sState.stencilMask;
183
      GLES30.glStencilMask(cState.stencilMask);
184
      }
185
    }
186

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

    
189
  public static void disableBlending()
190
    {
191
    sState.blend = cState.blend;
192

    
193
    if (cState.blend != 0)
194
      {
195
      cState.blend = 0;
196
      GLES30.glDisable(GLES30.GL_BLEND);
197
      }
198
    }
199

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

    
202
  public static void restoreBlending()
203
    {
204
    if (sState.blend != cState.blend)
205
      {
206
      cState.blend = sState.blend;
207

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

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

    
221
  static void enableDepthTest()
222
    {
223
    sState.depthTest = cState.depthTest;
224

    
225
    if (cState.depthTest != 1)
226
      {
227
      cState.depthTest = 1;
228
      GLES30.glEnable(GLES30.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
        GLES30.glDisable(GLES30.GL_DEPTH_TEST);
243
        }
244
      else
245
        {
246
        GLES30.glEnable(GLES30.GL_DEPTH_TEST);
247
        }
248
      }
249
    }
250

    
251
///////////////////////////////////////////////////////////////////////////////////////////////////
252

    
253
  static void switchOffDrawing()
254
    {
255
    GLES30.glEnable(GLES30.GL_SCISSOR_TEST);
256
    GLES30.glScissor(0,0,0,0);
257
    }
258

    
259
///////////////////////////////////////////////////////////////////////////////////////////////////
260

    
261
  static void restoreDrawing()
262
    {
263
    GLES30.glDisable(GLES30.GL_SCISSOR_TEST);
264
    }
265

    
266
///////////////////////////////////////////////////////////////////////////////////////////////////
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
      GLES30.glDisable(GLES30.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
      GLES30.glDisable(GLES30.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
      GLES30.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
      GLES30.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
      GLES30.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
      GLES30.glDisable(GLES30.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
      GLES30.glDisable(GLES30.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
      GLES30.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
      GLES30.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
      GLES30.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
        GLES30.glDisable(GLES30.GL_STENCIL_TEST);
389
        }
390
      else
391
        {
392
        GLES30.glEnable(GLES30.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
        GLES30.glDisable(GLES30.GL_DEPTH_TEST);
402
        }
403
      else
404
        {
405
        GLES30.glEnable(GLES30.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
      GLES30.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
      GLES30.glDepthMask(cState.depthMask==1);
420
      }
421
    if( sState.stencilMask!=cState.stencilMask )
422
      {
423
      cState.stencilMask = sState.stencilMask;
424
      GLES30.glStencilMask(cState.stencilMask);
425
      }
426
    }
427

    
428
///////////////////////////////////////////////////////////////////////////////////////////////////
429

    
430
  public static void setUpStencilMark(boolean color)
431
    {
432
    sState.stencilTest = cState.stencilTest;
433

    
434
    if( cState.stencilTest!=1 )
435
      {
436
      cState.stencilTest = 1;
437
      //android.util.Log.d("State", "stencil test on");
438
      GLES30.glEnable(GLES30.GL_STENCIL_TEST);
439
      }
440

    
441
    sState.stencilFuncFunc = cState.stencilFuncFunc;
442
    sState.stencilFuncRef  = cState.stencilFuncRef;
443
    sState.stencilFuncMask = cState.stencilFuncMask;
444

    
445
    if( cState.stencilFuncFunc!=GLES30.GL_ALWAYS || cState.stencilFuncRef!=1 || cState.stencilFuncMask!=STENCIL_MASK )
446
      {
447
      cState.stencilFuncFunc = GLES30.GL_ALWAYS;
448
      cState.stencilFuncRef  = 1;
449
      cState.stencilFuncMask = STENCIL_MASK;
450
      //android.util.Log.d("State", "stencil func on");
451
      GLES30.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
452
      }
453

    
454
    sState.stencilOpSfail = cState.stencilOpSfail;
455
    sState.stencilOpDpfail= cState.stencilOpDpfail;
456
    sState.stencilOpDppass= cState.stencilOpDppass;
457

    
458
    if( cState.stencilOpSfail!=GLES30.GL_KEEP || cState.stencilOpDpfail!=GLES30.GL_KEEP || cState.stencilOpDppass!=GLES30.GL_REPLACE )
459
      {
460
      cState.stencilOpSfail = GLES30.GL_KEEP;
461
      cState.stencilOpDpfail= GLES30.GL_KEEP;
462
      cState.stencilOpDppass= GLES30.GL_REPLACE;
463
      //android.util.Log.d("State", "stencil op on");
464
      GLES30.glStencilOp(cState.stencilOpSfail,cState.stencilOpDpfail,cState.stencilOpDppass);
465
      }
466

    
467
    sState.colorMaskR = cState.colorMaskR;
468
    sState.colorMaskG = cState.colorMaskG;
469
    sState.colorMaskB = cState.colorMaskB;
470
    sState.colorMaskA = cState.colorMaskA;
471

    
472
    int clr = color ? 1:0;
473

    
474
    if( cState.colorMaskR!=clr || cState.colorMaskG!=clr || cState.colorMaskB!=clr || cState.colorMaskA!=clr )
475
      {
476
      cState.colorMaskR = clr;
477
      cState.colorMaskG = clr;
478
      cState.colorMaskB = clr;
479
      cState.colorMaskA = clr;
480
      //android.util.Log.d("State", "switch off color writing");
481
      GLES30.glColorMask(color,color,color,color);
482
      }
483

    
484
    sState.depthMask = cState.depthMask;
485

    
486
    if( cState.depthMask!=1 )
487
      {
488
      cState.depthMask = 1;
489
      //android.util.Log.d("State", "switch on depth writing");
490
      GLES30.glDepthMask(true);
491
      }
492

    
493
    sState.stencilMask = cState.stencilMask;
494

    
495
    if( cState.stencilMask!= STENCIL_MASK )
496
      {
497
      cState.stencilMask = STENCIL_MASK;
498
      //android.util.Log.d("State", "stencil mask on");
499
      GLES30.glStencilMask(cState.stencilMask);
500
      }
501
    }
502

    
503
///////////////////////////////////////////////////////////////////////////////////////////////////
504

    
505
  public static void unsetUpStencilMark()
506
    {
507
    if( sState.stencilTest!=cState.stencilTest )
508
      {
509
      cState.stencilTest = sState.stencilTest;
510

    
511
      if (cState.stencilTest == 0)
512
        {
513
        GLES30.glDisable(GLES30.GL_STENCIL_TEST);
514
        }
515
      else
516
        {
517
        GLES30.glEnable(GLES30.GL_STENCIL_TEST);
518
        }
519
      }
520
    if( sState.colorMaskR!=cState.colorMaskR || sState.colorMaskG!=cState.colorMaskG || sState.colorMaskB!=cState.colorMaskB || sState.colorMaskA!=cState.colorMaskA)
521
      {
522
      cState.colorMaskR = sState.colorMaskR;
523
      cState.colorMaskG = sState.colorMaskG;
524
      cState.colorMaskB = sState.colorMaskB;
525
      cState.colorMaskA = sState.colorMaskA;
526
      GLES30.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
527
      }
528
    if( sState.depthMask!=cState.depthMask )
529
      {
530
      cState.depthMask = sState.depthMask;
531
      GLES30.glDepthMask(cState.depthMask==1);
532
      }
533
    if( sState.stencilMask!=cState.stencilMask )
534
      {
535
      cState.stencilMask = sState.stencilMask;
536
      GLES30.glStencilMask(cState.stencilMask);
537
      }
538
    }
539

    
540
///////////////////////////////////////////////////////////////////////////////////////////////////
541
/**
542
 * Only for use by the library itself.
543
 *
544
 * @y.exclude
545
 */
546
  public static void useStencilMark()
547
    {
548
    sState.stencilMask = cState.stencilMask;
549

    
550
    if( cState.stencilTest!=1 )
551
      {
552
      cState.stencilTest = 1;
553
      GLES30.glEnable(GLES30.GL_STENCIL_TEST);
554
      }
555

    
556
    sState.stencilFuncFunc = cState.stencilFuncFunc;
557
    sState.stencilFuncRef  = cState.stencilFuncRef;
558
    sState.stencilFuncMask = cState.stencilFuncMask;
559

    
560
    if( cState.stencilFuncFunc!=GLES30.GL_EQUAL || cState.stencilFuncRef!=1 || cState.stencilFuncMask!=STENCIL_MASK )
561
      {
562
      cState.stencilFuncFunc = GLES30.GL_EQUAL;
563
      cState.stencilFuncRef  = 1;
564
      cState.stencilFuncMask = STENCIL_MASK;
565
      GLES30.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
566
      }
567

    
568
    sState.stencilMask = cState.stencilMask;
569

    
570
    if( cState.stencilMask!= 0x00 )
571
      {
572
      cState.stencilMask = 0x00;
573
      GLES30.glStencilMask(cState.stencilMask);
574
      }
575

    
576
    sState.depthMask = cState.depthMask;
577

    
578
    if( cState.depthMask!=0 )
579
      {
580
      cState.depthMask = 0;
581
      GLES30.glDepthMask(false);
582
      }
583

    
584
    sState.depthTest = cState.depthTest;
585

    
586
    if( cState.depthTest!=0 )
587
      {
588
      cState.depthTest = 0;
589
      GLES30.glDisable(GLES30.GL_DEPTH_TEST);
590
      }
591
    }
592

    
593
///////////////////////////////////////////////////////////////////////////////////////////////////
594
/**
595
 * Only for use by the library itself.
596
 *
597
 * @y.exclude
598
 */
599
  public static void unuseStencilMark()
600
    {
601
    if( sState.stencilTest!=cState.stencilTest )
602
      {
603
      cState.stencilTest = sState.stencilTest;
604

    
605
      if (cState.stencilTest == 0)
606
        {
607
        GLES30.glDisable(GLES30.GL_STENCIL_TEST);
608
        }
609
      else
610
        {
611
        GLES30.glEnable(GLES30.GL_STENCIL_TEST);
612
        }
613
      }
614
    if( sState.stencilFuncFunc!=cState.stencilFuncFunc || sState.stencilFuncRef!=cState.stencilFuncRef || sState.stencilFuncMask!=cState.stencilFuncMask )
615
      {
616
      cState.stencilFuncFunc = sState.stencilFuncFunc;
617
      cState.stencilFuncRef  = sState.stencilFuncRef ;
618
      cState.stencilFuncMask = sState.stencilFuncMask;
619
      GLES30.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
620
      }
621
    if( sState.stencilMask!=cState.stencilMask )
622
      {
623
      cState.stencilMask = sState.stencilMask;
624
      GLES30.glStencilMask(cState.stencilMask);
625
      }
626
    if( sState.depthMask!=cState.depthMask )
627
      {
628
      cState.depthMask = sState.depthMask;
629
      GLES30.glDepthMask(cState.depthMask==1);
630
      }
631
    if( sState.depthTest!=cState.depthTest )
632
      {
633
      cState.depthTest = sState.depthTest;
634

    
635
      if (cState.depthTest == 0)
636
        {
637
        GLES30.glDisable(GLES30.GL_DEPTH_TEST);
638
        }
639
      else
640
        {
641
        GLES30.glEnable(GLES30.GL_DEPTH_TEST);
642
        }
643
      }
644
    }
645

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

    
648
  void apply()
649
    {
650
    //android.util.Log.e("State", "APPLYING STATE");
651

    
652
    /////////////////////////////////////////////////////
653
    // 1. Write to color buffer?
654
    if( mState.colorMaskR!=cState.colorMaskR || mState.colorMaskG!=cState.colorMaskG || mState.colorMaskB!=cState.colorMaskB || mState.colorMaskA!=cState.colorMaskA)
655
      {
656
      //android.util.Log.d("State", "setting color mask");
657
      cState.colorMaskR = mState.colorMaskR;
658
      cState.colorMaskG = mState.colorMaskG;
659
      cState.colorMaskB = mState.colorMaskB;
660
      cState.colorMaskA = mState.colorMaskA;
661
      GLES30.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
662
      }
663

    
664
    /////////////////////////////////////////////////////
665
    // 2. Enable Depth test?
666
    if( mState.depthTest!=cState.depthTest )
667
      {
668
      cState.depthTest = mState.depthTest;
669

    
670
      if (cState.depthTest == 0)
671
        {
672
        //android.util.Log.d("State", "disabling depth test");
673
        GLES30.glDisable(GLES30.GL_DEPTH_TEST);
674
        }
675
      else
676
        {
677
        //android.util.Log.d("State", "enable depth test");
678
        GLES30.glEnable(GLES30.GL_DEPTH_TEST);
679
        }
680
      }
681

    
682
    /////////////////////////////////////////////////////
683
    // 3. Change Depth Function?
684
    if( mState.depthFunc!=cState.depthFunc )
685
      {
686
      //android.util.Log.d("State", "setting depth func");
687
      cState.depthFunc = mState.depthFunc;
688
      GLES30.glDepthFunc(cState.depthFunc);
689
      }
690

    
691
    /////////////////////////////////////////////////////
692
    // 4. Write to Depth buffer?
693
    if( mState.depthMask!=cState.depthMask )
694
      {
695
      //android.util.Log.d("State", "setting depth mask");
696
      cState.depthMask = mState.depthMask;
697
      GLES30.glDepthMask(cState.depthMask==1);
698
      }
699

    
700
    /////////////////////////////////////////////////////
701
    // 5. Enable Blending?
702
    if( mState.blend!=cState.blend )
703
      {
704
      cState.blend = mState.blend;
705

    
706
      if (cState.blend == 0)
707
        {
708
        //android.util.Log.d("State", "disabling blending");
709
        GLES30.glDisable(GLES30.GL_BLEND);
710
        }
711
      else
712
        {
713
        //android.util.Log.d("State", "enabling blending");
714
        GLES30.glEnable(GLES30.GL_BLEND);
715
        }
716
      }
717

    
718
    /////////////////////////////////////////////////////
719
    // 6. Change Blend function?
720
    if( mState.blendSrc!=cState.blendSrc || mState.blendDst!=cState.blendDst )
721
      {
722
      //android.util.Log.d("State", "setting blend function");
723
      cState.blendSrc = mState.blendSrc;
724
      cState.blendDst = mState.blendDst;
725
      GLES30.glBlendFunc(cState.blendSrc,cState.blendDst);
726
      }
727

    
728
    /////////////////////////////////////////////////////
729
    // 7. Enable/Disable Stencil Test?
730
    if( mState.stencilTest!=cState.stencilTest )
731
      {
732
      cState.stencilTest = mState.stencilTest;
733

    
734
      if (cState.stencilTest == 0)
735
        {
736
        //android.util.Log.d("State", "disabling stencil test");
737
        GLES30.glDisable(GLES30.GL_STENCIL_TEST);
738
        }
739
      else
740
        {
741
        //android.util.Log.d("State", "enabling stencil test");
742
        GLES30.glEnable(GLES30.GL_STENCIL_TEST);
743
        }
744
      }
745

    
746
    /////////////////////////////////////////////////////
747
    // 8. Adjust Stencil function?
748
    if( mState.stencilFuncFunc!=cState.stencilFuncFunc || mState.stencilFuncRef!=cState.stencilFuncRef || mState.stencilFuncMask!=cState.stencilFuncMask )
749
      {
750
      //android.util.Log.d("State", "setting stencil function");
751
      cState.stencilFuncFunc = mState.stencilFuncFunc;
752
      cState.stencilFuncRef  = mState.stencilFuncRef ;
753
      cState.stencilFuncMask = mState.stencilFuncMask;
754
      GLES30.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
755
      }
756

    
757
    /////////////////////////////////////////////////////
758
    // 9. Adjust Stencil operation?
759
    if( mState.stencilOpSfail!=cState.stencilOpSfail || mState.stencilOpDpfail!=cState.stencilOpDpfail || mState.stencilOpDppass!=cState.stencilOpDppass )
760
      {
761
      //android.util.Log.d("State", "setting stencil op");
762
      cState.stencilOpSfail = mState.stencilOpSfail;
763
      cState.stencilOpDpfail= mState.stencilOpDpfail;
764
      cState.stencilOpDppass= mState.stencilOpDppass;
765
      GLES30.glStencilOp(cState.stencilOpSfail,cState.stencilOpDpfail,cState.stencilOpDppass);
766
      }
767

    
768
    /////////////////////////////////////////////////////
769
    // 10. Write to Stencil buffer?
770
    if( mState.stencilMask!=cState.stencilMask )
771
      {
772
      //android.util.Log.d("State", "setting stencil mask");
773
      cState.stencilMask = mState.stencilMask;
774
      GLES30.glStencilMask(cState.stencilMask);
775
      }
776

    
777
    /////////////////////////////////////////////////////
778
    // 11. Clear buffers?
779
    if( mClear!=0 )
780
      {
781
      //android.util.Log.d("State", "clearing buffer");
782
      GLES30.glClear(mClear);
783
      }
784
    }
785

    
786
///////////////////////////////////////////////////////////////////////////////////////////////////
787

    
788
  void glColorMask(boolean r, boolean g, boolean b, boolean a)
789
    {
790
    mState.colorMaskR = (r ? 1:0);
791
    mState.colorMaskG = (g ? 1:0);
792
    mState.colorMaskB = (b ? 1:0);
793
    mState.colorMaskA = (a ? 1:0);
794
    }
795

    
796
///////////////////////////////////////////////////////////////////////////////////////////////////
797

    
798
  void glDepthMask(boolean mask)
799
    {
800
    mState.depthMask = (mask ? 1:0);
801
    }
802

    
803
///////////////////////////////////////////////////////////////////////////////////////////////////
804

    
805
  void glStencilMask(int mask)
806
    {
807
    mState.stencilMask = mask;
808
    }
809

    
810
///////////////////////////////////////////////////////////////////////////////////////////////////
811

    
812
  void glEnable(int test)
813
    {
814
         if( test==GLES30.GL_DEPTH_TEST   ) mState.depthTest   = 1;
815
    else if( test==GLES30.GL_STENCIL_TEST ) mState.stencilTest = 1;
816
    else if( test==GLES30.GL_BLEND        ) mState.blend       = 1;
817
    }
818

    
819
///////////////////////////////////////////////////////////////////////////////////////////////////
820

    
821
  void glDisable(int test)
822
    {
823
         if( test==GLES30.GL_DEPTH_TEST   ) mState.depthTest   = 0;
824
    else if( test==GLES30.GL_STENCIL_TEST ) mState.stencilTest = 0;
825
    else if( test==GLES30.GL_BLEND        ) mState.blend       = 0;
826
    }
827

    
828
///////////////////////////////////////////////////////////////////////////////////////////////////
829

    
830
  void glStencilFunc(int func, int ref, int mask)
831
    {
832
    mState.stencilFuncFunc = func;
833
    mState.stencilFuncRef  = ref;
834
    mState.stencilFuncMask = mask;
835
    }
836

    
837
///////////////////////////////////////////////////////////////////////////////////////////////////
838

    
839
  void glStencilOp(int sfail, int dpfail, int dppass)
840
    {
841
    mState.stencilOpSfail = sfail;
842
    mState.stencilOpDpfail= dpfail;
843
    mState.stencilOpDppass= dppass;
844
    }
845

    
846
///////////////////////////////////////////////////////////////////////////////////////////////////
847

    
848
  void glDepthFunc(int func)
849
    {
850
    mState.depthFunc = func;
851
    }
852

    
853
///////////////////////////////////////////////////////////////////////////////////////////////////
854

    
855
  void glBlendFunc(int src, int dst)
856
    {
857
    mState.blendSrc = src;
858
    mState.blendDst = dst;
859
    }
860

    
861
///////////////////////////////////////////////////////////////////////////////////////////////////
862

    
863
  void glClear(int mask)
864
    {
865
    mClear = mask;
866
    }
867
}
(13-13/14)