Project

General

Profile

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

library / src / main / java / org / distorted / library / main / DistortedRenderState.java @ 7a5e538a

1 9dba4df1 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2016 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Distorted.                                                               //
5
//                                                                                               //
6
// Distorted is free software: you can redistribute it and/or modify                             //
7
// it under the terms of the GNU General Public License as published by                          //
8
// the Free Software Foundation, either version 2 of the License, or                             //
9
// (at your option) any later version.                                                           //
10
//                                                                                               //
11
// Distorted is distributed in the hope that it will be useful,                                  //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
14
// GNU General Public License for more details.                                                  //
15
//                                                                                               //
16
// You should have received a copy of the GNU General Public License                             //
17
// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19
20 fe82a979 Leszek Koltunski
package org.distorted.library.main;
21 9dba4df1 leszek
22 e6519ac8 Leszek Koltunski
import android.opengl.GLES31;
23 9dba4df1 leszek
24
///////////////////////////////////////////////////////////////////////////////////////////////////
25
/**
26
 * Remember the OpenGL state.
27 ad16ed3b Leszek Koltunski
 * <p>
28
 * This is a member of DistortedNode. Remembers the OpenGL state we want to set just before rendering
29
 * the Node.
30 7266d8ef Leszek Koltunski
 * <p>
31
 * Only for use by the library itself.
32
 *
33
 * @y.exclude
34 9dba4df1 leszek
 */
35 7266d8ef Leszek Koltunski
public class DistortedRenderState
36 9dba4df1 leszek
{
37 23eecbd9 Leszek Koltunski
  // TODO: figure this out dynamically; this assumes 8 bit stencil buffer.
38
  private static final int STENCIL_MASK = (1<<8)-1;
39
40 5b959cc5 Leszek Koltunski
  private static class RenderState
41
    {
42
    private int colorMaskR, colorMaskG, colorMaskB, colorMaskA;
43
    private int depthMask;
44
    private int stencilMask;
45
    private int depthTest;
46
    private int stencilTest;
47
    private int stencilFuncFunc, stencilFuncRef, stencilFuncMask;
48
    private int stencilOpSfail, stencilOpDpfail, stencilOpDppass;
49
    private int depthFunc;
50
    private int blend;
51
    private int blendSrc, blendDst;
52
    }
53
54
  private RenderState mState;          // state the current object wants to have
55
  static private RenderState cState = new RenderState();   // current OpenGL Stave
56
  static private RenderState sState = new RenderState();   // saved OpenGL state
57
58
  private int mClear;
59 270c27bc Leszek Koltunski
60 9dba4df1 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
61 c834348d leszek
// default: color writes on, depth test and writes on, blending on, stencil off.
62 9dba4df1 leszek
63
  DistortedRenderState()
64
    {
65 5b959cc5 Leszek Koltunski
    mState = new RenderState();
66
67
    mState.colorMaskR = 1;
68
    mState.colorMaskG = 1;
69
    mState.colorMaskB = 1;
70
    mState.colorMaskA = 1;
71
72
    mState.depthTest  = 1;
73
    mState.depthMask  = 1;
74 e6519ac8 Leszek Koltunski
    mState.depthFunc  = GLES31.GL_LEQUAL;
75 5b959cc5 Leszek Koltunski
76
    mState.blend      = 1;
77 e6519ac8 Leszek Koltunski
    mState.blendSrc   = GLES31.GL_SRC_ALPHA;
78
    mState.blendDst   = GLES31.GL_ONE_MINUS_SRC_ALPHA;
79 5b959cc5 Leszek Koltunski
80
    mState.stencilTest     = 0;
81
    mState.stencilMask     = STENCIL_MASK;
82 e6519ac8 Leszek Koltunski
    mState.stencilFuncFunc = GLES31.GL_NEVER;
83 5b959cc5 Leszek Koltunski
    mState.stencilFuncRef  = 0;
84
    mState.stencilFuncMask = STENCIL_MASK;
85 e6519ac8 Leszek Koltunski
    mState.stencilOpSfail  = GLES31.GL_KEEP;
86
    mState.stencilOpDpfail = GLES31.GL_KEEP;
87
    mState.stencilOpDppass = GLES31.GL_KEEP;
88 ad16ed3b Leszek Koltunski
89
    mClear = 0;
90 9dba4df1 leszek
    }
91
92
///////////////////////////////////////////////////////////////////////////////////////////////////
93 f75a4eee Leszek Koltunski
// reset state of everything to a known state.
94 9dba4df1 leszek
95
  static void reset()
96
    {
97 f75a4eee Leszek Koltunski
    cState.colorMaskR = 1;
98
    cState.colorMaskG = 1;
99
    cState.colorMaskB = 1;
100
    cState.colorMaskA = 1;
101 e6519ac8 Leszek Koltunski
    GLES31.glColorMask(true,true,true,true);
102 f75a4eee Leszek Koltunski
103
    cState.depthTest = 1;
104
    cState.depthMask = 1;
105 e6519ac8 Leszek Koltunski
    cState.depthFunc = GLES31.GL_LEQUAL;
106
    GLES31.glEnable(GLES31.GL_DEPTH_TEST);
107
    GLES31.glDepthMask(true);
108
    GLES31.glDepthFunc(cState.depthFunc);
109 f75a4eee Leszek Koltunski
110
    cState.stencilTest     = 0;
111
    cState.stencilMask     = STENCIL_MASK;
112 e6519ac8 Leszek Koltunski
    cState.stencilFuncFunc = GLES31.GL_NEVER;
113 f75a4eee Leszek Koltunski
    cState.stencilFuncRef  = 0;
114
    cState.stencilFuncMask = STENCIL_MASK;
115 e6519ac8 Leszek Koltunski
    cState.stencilOpSfail  = GLES31.GL_KEEP;
116
    cState.stencilOpDpfail = GLES31.GL_KEEP;
117
    cState.stencilOpDppass = GLES31.GL_KEEP;
118
    GLES31.glDisable(GLES31.GL_STENCIL_TEST);
119
    GLES31.glStencilMask(cState.stencilMask);
120 f75a4eee Leszek Koltunski
121
    cState.blend      = 1;
122 e6519ac8 Leszek Koltunski
    cState.blendSrc   = GLES31.GL_SRC_ALPHA;
123
    cState.blendDst   = GLES31.GL_ONE_MINUS_SRC_ALPHA;
124
    GLES31.glEnable(GLES31.GL_BLEND);
125
    GLES31.glBlendFunc(cState.blendSrc,cState.blendDst);
126 9dba4df1 leszek
    }
127
128 580f7d10 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
129
130 23eecbd9 Leszek Koltunski
  static void colorDepthStencilOn()
131 580f7d10 leszek
    {
132 20ee7cc9 Leszek Koltunski
    sState.colorMaskR = cState.colorMaskR;
133
    sState.colorMaskG = cState.colorMaskG;
134
    sState.colorMaskB = cState.colorMaskB;
135
    sState.colorMaskA = cState.colorMaskA;
136
137 5b959cc5 Leszek Koltunski
    if( cState.colorMaskR!=1 || cState.colorMaskG!=1 || cState.colorMaskB!=1 || cState.colorMaskA!=1 )
138 580f7d10 leszek
      {
139 5b959cc5 Leszek Koltunski
      cState.colorMaskR = 1;
140
      cState.colorMaskG = 1;
141
      cState.colorMaskB = 1;
142
      cState.colorMaskA = 1;
143 e6519ac8 Leszek Koltunski
      GLES31.glColorMask(true,true,true,true);
144 580f7d10 leszek
      }
145 20ee7cc9 Leszek Koltunski
146
    sState.depthMask = cState.depthMask;
147
148 5b959cc5 Leszek Koltunski
    if( cState.depthMask!=1 )
149 580f7d10 leszek
      {
150 5b959cc5 Leszek Koltunski
      cState.depthMask = 1;
151 e6519ac8 Leszek Koltunski
      GLES31.glDepthMask(true);
152 580f7d10 leszek
      }
153 20ee7cc9 Leszek Koltunski
154
    sState.stencilMask = cState.stencilMask;
155
156 5b959cc5 Leszek Koltunski
    if( cState.stencilMask!= STENCIL_MASK )
157 23eecbd9 Leszek Koltunski
      {
158 5b959cc5 Leszek Koltunski
      cState.stencilMask = STENCIL_MASK;
159 e6519ac8 Leszek Koltunski
      GLES31.glStencilMask(cState.stencilMask);
160 23eecbd9 Leszek Koltunski
      }
161 580f7d10 leszek
    }
162
163 20ee7cc9 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
164
165
  static void colorDepthStencilRestore()
166
    {
167
    if( sState.colorMaskR!=cState.colorMaskR || sState.colorMaskG!=cState.colorMaskG || sState.colorMaskB!=cState.colorMaskB || sState.colorMaskA!=cState.colorMaskA)
168
      {
169
      cState.colorMaskR = sState.colorMaskR;
170
      cState.colorMaskG = sState.colorMaskG;
171
      cState.colorMaskB = sState.colorMaskB;
172
      cState.colorMaskA = sState.colorMaskA;
173 e6519ac8 Leszek Koltunski
      GLES31.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
174 20ee7cc9 Leszek Koltunski
      }
175
    if( sState.depthMask!=cState.depthMask )
176
      {
177
      cState.depthMask = sState.depthMask;
178 e6519ac8 Leszek Koltunski
      GLES31.glDepthMask(cState.depthMask==1);
179 20ee7cc9 Leszek Koltunski
      }
180
    if( sState.stencilMask!=cState.stencilMask )
181
      {
182
      cState.stencilMask = sState.stencilMask;
183 e6519ac8 Leszek Koltunski
      GLES31.glStencilMask(cState.stencilMask);
184 20ee7cc9 Leszek Koltunski
      }
185
    }
186
187 56c6ca24 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
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 cab7c165 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
220
221
  static void switchOffDrawing()
222
    {
223 e6519ac8 Leszek Koltunski
    GLES31.glEnable(GLES31.GL_SCISSOR_TEST);
224
    GLES31.glScissor(0,0,0,0);
225 cab7c165 Leszek Koltunski
    }
226
227
///////////////////////////////////////////////////////////////////////////////////////////////////
228
229
  static void restoreDrawing()
230
    {
231 e6519ac8 Leszek Koltunski
    GLES31.glDisable(GLES31.GL_SCISSOR_TEST);
232 cab7c165 Leszek Koltunski
    }
233
234 33f59f22 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
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 8777ce17 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
397
398 bbe3283b Leszek Koltunski
  static void disableStencil()
399 8777ce17 Leszek Koltunski
    {
400
    sState.stencilTest = cState.stencilTest;
401
402 bbe3283b Leszek Koltunski
    if (cState.stencilTest != 0)
403 8777ce17 Leszek Koltunski
      {
404 bbe3283b Leszek Koltunski
      cState.stencilTest = 0;
405
      GLES31.glDisable(GLES31.GL_STENCIL_TEST);
406 8777ce17 Leszek Koltunski
      }
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 270c27bc Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
461
462 a13dde77 Leszek Koltunski
  static void setUpStencilMark(boolean color)
463 270c27bc Leszek Koltunski
    {
464 20ee7cc9 Leszek Koltunski
    sState.stencilTest = cState.stencilTest;
465
466 5b959cc5 Leszek Koltunski
    if( cState.stencilTest!=1 )
467 270c27bc Leszek Koltunski
      {
468 5b959cc5 Leszek Koltunski
      cState.stencilTest = 1;
469 b3120b1b leszek
      //android.util.Log.d("State", "stencil test on");
470 e6519ac8 Leszek Koltunski
      GLES31.glEnable(GLES31.GL_STENCIL_TEST);
471 270c27bc Leszek Koltunski
      }
472 20ee7cc9 Leszek Koltunski
473
    sState.stencilFuncFunc = cState.stencilFuncFunc;
474
    sState.stencilFuncRef  = cState.stencilFuncRef;
475
    sState.stencilFuncMask = cState.stencilFuncMask;
476
477 e6519ac8 Leszek Koltunski
    if( cState.stencilFuncFunc!=GLES31.GL_ALWAYS || cState.stencilFuncRef!=1 || cState.stencilFuncMask!=STENCIL_MASK )
478 270c27bc Leszek Koltunski
      {
479 e6519ac8 Leszek Koltunski
      cState.stencilFuncFunc = GLES31.GL_ALWAYS;
480 5b959cc5 Leszek Koltunski
      cState.stencilFuncRef  = 1;
481
      cState.stencilFuncMask = STENCIL_MASK;
482 b3120b1b leszek
      //android.util.Log.d("State", "stencil func on");
483 e6519ac8 Leszek Koltunski
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
484 270c27bc Leszek Koltunski
      }
485 20ee7cc9 Leszek Koltunski
486
    sState.stencilOpSfail = cState.stencilOpSfail;
487
    sState.stencilOpDpfail= cState.stencilOpDpfail;
488
    sState.stencilOpDppass= cState.stencilOpDppass;
489
490 e6519ac8 Leszek Koltunski
    if( cState.stencilOpSfail!=GLES31.GL_KEEP || cState.stencilOpDpfail!=GLES31.GL_KEEP || cState.stencilOpDppass!=GLES31.GL_REPLACE )
491 270c27bc Leszek Koltunski
      {
492 e6519ac8 Leszek Koltunski
      cState.stencilOpSfail = GLES31.GL_KEEP;
493
      cState.stencilOpDpfail= GLES31.GL_KEEP;
494
      cState.stencilOpDppass= GLES31.GL_REPLACE;
495 b3120b1b leszek
      //android.util.Log.d("State", "stencil op on");
496 e6519ac8 Leszek Koltunski
      GLES31.glStencilOp(cState.stencilOpSfail,cState.stencilOpDpfail,cState.stencilOpDppass);
497 270c27bc Leszek Koltunski
      }
498 20ee7cc9 Leszek Koltunski
499
    sState.colorMaskR = cState.colorMaskR;
500
    sState.colorMaskG = cState.colorMaskG;
501
    sState.colorMaskB = cState.colorMaskB;
502
    sState.colorMaskA = cState.colorMaskA;
503
504 a13dde77 Leszek Koltunski
    int clr = color ? 1:0;
505
506
    if( cState.colorMaskR!=clr || cState.colorMaskG!=clr || cState.colorMaskB!=clr || cState.colorMaskA!=clr )
507 270c27bc Leszek Koltunski
      {
508 a13dde77 Leszek Koltunski
      cState.colorMaskR = clr;
509
      cState.colorMaskG = clr;
510
      cState.colorMaskB = clr;
511
      cState.colorMaskA = clr;
512 b3120b1b leszek
      //android.util.Log.d("State", "switch off color writing");
513 a13dde77 Leszek Koltunski
      GLES31.glColorMask(color,color,color,color);
514 270c27bc Leszek Koltunski
      }
515 20ee7cc9 Leszek Koltunski
516
    sState.depthMask = cState.depthMask;
517
518 1d6d261e Leszek Koltunski
    if( cState.depthMask!=1 )
519 270c27bc Leszek Koltunski
      {
520 1d6d261e Leszek Koltunski
      cState.depthMask = 1;
521
      //android.util.Log.d("State", "switch on depth writing");
522 e6519ac8 Leszek Koltunski
      GLES31.glDepthMask(true);
523 270c27bc Leszek Koltunski
      }
524 20ee7cc9 Leszek Koltunski
525
    sState.stencilMask = cState.stencilMask;
526
527 5b959cc5 Leszek Koltunski
    if( cState.stencilMask!= STENCIL_MASK )
528 270c27bc Leszek Koltunski
      {
529 5b959cc5 Leszek Koltunski
      cState.stencilMask = STENCIL_MASK;
530 b3120b1b leszek
      //android.util.Log.d("State", "stencil mask on");
531 e6519ac8 Leszek Koltunski
      GLES31.glStencilMask(cState.stencilMask);
532 270c27bc Leszek Koltunski
      }
533
    }
534
535 984dc935 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
536
537
  static void unsetUpStencilMark()
538
    {
539
    if( sState.stencilTest!=cState.stencilTest )
540
      {
541
      cState.stencilTest = sState.stencilTest;
542
543
      if (cState.stencilTest == 0)
544
        {
545 e6519ac8 Leszek Koltunski
        GLES31.glDisable(GLES31.GL_STENCIL_TEST);
546 984dc935 Leszek Koltunski
        }
547
      else
548
        {
549 e6519ac8 Leszek Koltunski
        GLES31.glEnable(GLES31.GL_STENCIL_TEST);
550 984dc935 Leszek Koltunski
        }
551
      }
552
    if( sState.colorMaskR!=cState.colorMaskR || sState.colorMaskG!=cState.colorMaskG || sState.colorMaskB!=cState.colorMaskB || sState.colorMaskA!=cState.colorMaskA)
553
      {
554
      cState.colorMaskR = sState.colorMaskR;
555
      cState.colorMaskG = sState.colorMaskG;
556
      cState.colorMaskB = sState.colorMaskB;
557
      cState.colorMaskA = sState.colorMaskA;
558 e6519ac8 Leszek Koltunski
      GLES31.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
559 984dc935 Leszek Koltunski
      }
560
    if( sState.depthMask!=cState.depthMask )
561
      {
562
      cState.depthMask = sState.depthMask;
563 e6519ac8 Leszek Koltunski
      GLES31.glDepthMask(cState.depthMask==1);
564 984dc935 Leszek Koltunski
      }
565
    if( sState.stencilMask!=cState.stencilMask )
566
      {
567
      cState.stencilMask = sState.stencilMask;
568 e6519ac8 Leszek Koltunski
      GLES31.glStencilMask(cState.stencilMask);
569 984dc935 Leszek Koltunski
      }
570
    }
571
572 270c27bc Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
573 7266d8ef Leszek Koltunski
/**
574
 * Only for use by the library itself.
575
 *
576
 * @y.exclude
577
 */
578
  public static void useStencilMark()
579 270c27bc Leszek Koltunski
    {
580 20ee7cc9 Leszek Koltunski
    sState.stencilMask = cState.stencilMask;
581
582 5b959cc5 Leszek Koltunski
    if( cState.stencilTest!=1 )
583 270c27bc Leszek Koltunski
      {
584 5b959cc5 Leszek Koltunski
      cState.stencilTest = 1;
585 e6519ac8 Leszek Koltunski
      GLES31.glEnable(GLES31.GL_STENCIL_TEST);
586 270c27bc Leszek Koltunski
      }
587 20ee7cc9 Leszek Koltunski
588
    sState.stencilFuncFunc = cState.stencilFuncFunc;
589
    sState.stencilFuncRef  = cState.stencilFuncRef;
590
    sState.stencilFuncMask = cState.stencilFuncMask;
591
592 e6519ac8 Leszek Koltunski
    if( cState.stencilFuncFunc!=GLES31.GL_EQUAL || cState.stencilFuncRef!=1 || cState.stencilFuncMask!=STENCIL_MASK )
593 270c27bc Leszek Koltunski
      {
594 e6519ac8 Leszek Koltunski
      cState.stencilFuncFunc = GLES31.GL_EQUAL;
595 5b959cc5 Leszek Koltunski
      cState.stencilFuncRef  = 1;
596
      cState.stencilFuncMask = STENCIL_MASK;
597 e6519ac8 Leszek Koltunski
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
598 270c27bc Leszek Koltunski
      }
599 20ee7cc9 Leszek Koltunski
600
    sState.stencilMask = cState.stencilMask;
601
602 5b959cc5 Leszek Koltunski
    if( cState.stencilMask!= 0x00 )
603 270c27bc Leszek Koltunski
      {
604 5b959cc5 Leszek Koltunski
      cState.stencilMask = 0x00;
605 e6519ac8 Leszek Koltunski
      GLES31.glStencilMask(cState.stencilMask);
606 270c27bc Leszek Koltunski
      }
607 20ee7cc9 Leszek Koltunski
608
    sState.depthMask = cState.depthMask;
609
610
    if( cState.depthMask!=0 )
611 81f0078a Leszek Koltunski
      {
612
      cState.depthMask = 0;
613 e6519ac8 Leszek Koltunski
      GLES31.glDepthMask(false);
614 81f0078a Leszek Koltunski
      }
615 20ee7cc9 Leszek Koltunski
616
    sState.depthTest = cState.depthTest;
617
618 81f0078a Leszek Koltunski
    if( cState.depthTest!=0 )
619
      {
620
      cState.depthTest = 0;
621 e6519ac8 Leszek Koltunski
      GLES31.glDisable(GLES31.GL_DEPTH_TEST);
622 81f0078a Leszek Koltunski
      }
623 270c27bc Leszek Koltunski
    }
624
625
///////////////////////////////////////////////////////////////////////////////////////////////////
626 7266d8ef Leszek Koltunski
/**
627
 * Only for use by the library itself.
628
 *
629
 * @y.exclude
630
 */
631
  public static void unuseStencilMark()
632 270c27bc Leszek Koltunski
    {
633 5b959cc5 Leszek Koltunski
    if( sState.stencilTest!=cState.stencilTest )
634 270c27bc Leszek Koltunski
      {
635 5b959cc5 Leszek Koltunski
      cState.stencilTest = sState.stencilTest;
636 270c27bc Leszek Koltunski
637 5b959cc5 Leszek Koltunski
      if (cState.stencilTest == 0)
638 270c27bc Leszek Koltunski
        {
639 e6519ac8 Leszek Koltunski
        GLES31.glDisable(GLES31.GL_STENCIL_TEST);
640 270c27bc Leszek Koltunski
        }
641
      else
642
        {
643 e6519ac8 Leszek Koltunski
        GLES31.glEnable(GLES31.GL_STENCIL_TEST);
644 270c27bc Leszek Koltunski
        }
645
      }
646 5b959cc5 Leszek Koltunski
    if( sState.stencilFuncFunc!=cState.stencilFuncFunc || sState.stencilFuncRef!=cState.stencilFuncRef || sState.stencilFuncMask!=cState.stencilFuncMask )
647 270c27bc Leszek Koltunski
      {
648 5b959cc5 Leszek Koltunski
      cState.stencilFuncFunc = sState.stencilFuncFunc;
649
      cState.stencilFuncRef  = sState.stencilFuncRef ;
650
      cState.stencilFuncMask = sState.stencilFuncMask;
651 e6519ac8 Leszek Koltunski
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
652 270c27bc Leszek Koltunski
      }
653 5b959cc5 Leszek Koltunski
    if( sState.stencilMask!=cState.stencilMask )
654 270c27bc Leszek Koltunski
      {
655 5b959cc5 Leszek Koltunski
      cState.stencilMask = sState.stencilMask;
656 e6519ac8 Leszek Koltunski
      GLES31.glStencilMask(cState.stencilMask);
657 270c27bc Leszek Koltunski
      }
658 81f0078a Leszek Koltunski
    if( sState.depthMask!=cState.depthMask )
659
      {
660
      cState.depthMask = sState.depthMask;
661 e6519ac8 Leszek Koltunski
      GLES31.glDepthMask(cState.depthMask==1);
662 81f0078a Leszek Koltunski
      }
663
    if( sState.depthTest!=cState.depthTest )
664
      {
665
      cState.depthTest = sState.depthTest;
666
667
      if (cState.depthTest == 0)
668
        {
669 e6519ac8 Leszek Koltunski
        GLES31.glDisable(GLES31.GL_DEPTH_TEST);
670 81f0078a Leszek Koltunski
        }
671
      else
672
        {
673 e6519ac8 Leszek Koltunski
        GLES31.glEnable(GLES31.GL_DEPTH_TEST);
674 81f0078a Leszek Koltunski
        }
675
      }
676 270c27bc Leszek Koltunski
    }
677
678 9dba4df1 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
679
680
  void apply()
681
    {
682 cc8151c4 leszek
    //android.util.Log.e("State", "APPLYING STATE");
683 d582c116 Leszek Koltunski
684 cc8151c4 leszek
    /////////////////////////////////////////////////////
685
    // 1. Write to color buffer?
686 5b959cc5 Leszek Koltunski
    if( mState.colorMaskR!=cState.colorMaskR || mState.colorMaskG!=cState.colorMaskG || mState.colorMaskB!=cState.colorMaskB || mState.colorMaskA!=cState.colorMaskA)
687 9dba4df1 leszek
      {
688 cc8151c4 leszek
      //android.util.Log.d("State", "setting color mask");
689 5b959cc5 Leszek Koltunski
      cState.colorMaskR = mState.colorMaskR;
690
      cState.colorMaskG = mState.colorMaskG;
691
      cState.colorMaskB = mState.colorMaskB;
692
      cState.colorMaskA = mState.colorMaskA;
693 e6519ac8 Leszek Koltunski
      GLES31.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
694 9dba4df1 leszek
      }
695
696 cc8151c4 leszek
    /////////////////////////////////////////////////////
697 d582c116 Leszek Koltunski
    // 2. Enable Depth test?
698 5b959cc5 Leszek Koltunski
    if( mState.depthTest!=cState.depthTest )
699 9dba4df1 leszek
      {
700 5b959cc5 Leszek Koltunski
      cState.depthTest = mState.depthTest;
701 d582c116 Leszek Koltunski
702 5b959cc5 Leszek Koltunski
      if (cState.depthTest == 0)
703 cc8151c4 leszek
        {
704
        //android.util.Log.d("State", "disabling depth test");
705 e6519ac8 Leszek Koltunski
        GLES31.glDisable(GLES31.GL_DEPTH_TEST);
706 cc8151c4 leszek
        }
707 9dba4df1 leszek
      else
708
        {
709 cc8151c4 leszek
        //android.util.Log.d("State", "enable depth test");
710 e6519ac8 Leszek Koltunski
        GLES31.glEnable(GLES31.GL_DEPTH_TEST);
711 9dba4df1 leszek
        }
712
      }
713
714 cc8151c4 leszek
    /////////////////////////////////////////////////////
715
    // 3. Change Depth Function?
716 5b959cc5 Leszek Koltunski
    if( mState.depthFunc!=cState.depthFunc )
717 cc8151c4 leszek
      {
718
      //android.util.Log.d("State", "setting depth func");
719 5b959cc5 Leszek Koltunski
      cState.depthFunc = mState.depthFunc;
720 e6519ac8 Leszek Koltunski
      GLES31.glDepthFunc(cState.depthFunc);
721 cc8151c4 leszek
      }
722 d582c116 Leszek Koltunski
723 cc8151c4 leszek
    /////////////////////////////////////////////////////
724
    // 4. Write to Depth buffer?
725 5b959cc5 Leszek Koltunski
    if( mState.depthMask!=cState.depthMask )
726 d582c116 Leszek Koltunski
      {
727 cc8151c4 leszek
      //android.util.Log.d("State", "setting depth mask");
728 5b959cc5 Leszek Koltunski
      cState.depthMask = mState.depthMask;
729 e6519ac8 Leszek Koltunski
      GLES31.glDepthMask(cState.depthMask==1);
730 d582c116 Leszek Koltunski
      }
731
732 cc8151c4 leszek
    /////////////////////////////////////////////////////
733
    // 5. Enable Blending?
734 5b959cc5 Leszek Koltunski
    if( mState.blend!=cState.blend )
735 c834348d leszek
      {
736 5b959cc5 Leszek Koltunski
      cState.blend = mState.blend;
737 d582c116 Leszek Koltunski
738 5b959cc5 Leszek Koltunski
      if (cState.blend == 0)
739 cc8151c4 leszek
        {
740
        //android.util.Log.d("State", "disabling blending");
741 e6519ac8 Leszek Koltunski
        GLES31.glDisable(GLES31.GL_BLEND);
742 cc8151c4 leszek
        }
743 c834348d leszek
      else
744
        {
745 cc8151c4 leszek
        //android.util.Log.d("State", "enabling blending");
746 e6519ac8 Leszek Koltunski
        GLES31.glEnable(GLES31.GL_BLEND);
747 c834348d leszek
        }
748
      }
749
750 cc8151c4 leszek
    /////////////////////////////////////////////////////
751
    // 6. Change Blend function?
752 5b959cc5 Leszek Koltunski
    if( mState.blendSrc!=cState.blendSrc || mState.blendDst!=cState.blendDst )
753 cc8151c4 leszek
      {
754
      //android.util.Log.d("State", "setting blend function");
755 5b959cc5 Leszek Koltunski
      cState.blendSrc = mState.blendSrc;
756
      cState.blendDst = mState.blendDst;
757 e6519ac8 Leszek Koltunski
      GLES31.glBlendFunc(cState.blendSrc,cState.blendDst);
758 cc8151c4 leszek
      }
759 d582c116 Leszek Koltunski
760 cc8151c4 leszek
    /////////////////////////////////////////////////////
761
    // 7. Enable/Disable Stencil Test?
762 5b959cc5 Leszek Koltunski
    if( mState.stencilTest!=cState.stencilTest )
763 9dba4df1 leszek
      {
764 5b959cc5 Leszek Koltunski
      cState.stencilTest = mState.stencilTest;
765 d582c116 Leszek Koltunski
766 5b959cc5 Leszek Koltunski
      if (cState.stencilTest == 0)
767 cc8151c4 leszek
        {
768
        //android.util.Log.d("State", "disabling stencil test");
769 e6519ac8 Leszek Koltunski
        GLES31.glDisable(GLES31.GL_STENCIL_TEST);
770 cc8151c4 leszek
        }
771 9dba4df1 leszek
      else
772
        {
773 cc8151c4 leszek
        //android.util.Log.d("State", "enabling stencil test");
774 e6519ac8 Leszek Koltunski
        GLES31.glEnable(GLES31.GL_STENCIL_TEST);
775 9dba4df1 leszek
        }
776
      }
777 d582c116 Leszek Koltunski
778 cc8151c4 leszek
    /////////////////////////////////////////////////////
779
    // 8. Adjust Stencil function?
780 5b959cc5 Leszek Koltunski
    if( mState.stencilFuncFunc!=cState.stencilFuncFunc || mState.stencilFuncRef!=cState.stencilFuncRef || mState.stencilFuncMask!=cState.stencilFuncMask )
781 cc8151c4 leszek
      {
782
      //android.util.Log.d("State", "setting stencil function");
783 5b959cc5 Leszek Koltunski
      cState.stencilFuncFunc = mState.stencilFuncFunc;
784
      cState.stencilFuncRef  = mState.stencilFuncRef ;
785
      cState.stencilFuncMask = mState.stencilFuncMask;
786 e6519ac8 Leszek Koltunski
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
787 cc8151c4 leszek
      }
788
789
    /////////////////////////////////////////////////////
790
    // 9. Adjust Stencil operation?
791 5b959cc5 Leszek Koltunski
    if( mState.stencilOpSfail!=cState.stencilOpSfail || mState.stencilOpDpfail!=cState.stencilOpDpfail || mState.stencilOpDppass!=cState.stencilOpDppass )
792 cc8151c4 leszek
      {
793
      //android.util.Log.d("State", "setting stencil op");
794 5b959cc5 Leszek Koltunski
      cState.stencilOpSfail = mState.stencilOpSfail;
795
      cState.stencilOpDpfail= mState.stencilOpDpfail;
796
      cState.stencilOpDppass= mState.stencilOpDppass;
797 e6519ac8 Leszek Koltunski
      GLES31.glStencilOp(cState.stencilOpSfail,cState.stencilOpDpfail,cState.stencilOpDppass);
798 cc8151c4 leszek
      }
799 d582c116 Leszek Koltunski
800 cc8151c4 leszek
    /////////////////////////////////////////////////////
801
    // 10. Write to Stencil buffer?
802 5b959cc5 Leszek Koltunski
    if( mState.stencilMask!=cState.stencilMask )
803 d582c116 Leszek Koltunski
      {
804 cc8151c4 leszek
      //android.util.Log.d("State", "setting stencil mask");
805 5b959cc5 Leszek Koltunski
      cState.stencilMask = mState.stencilMask;
806 e6519ac8 Leszek Koltunski
      GLES31.glStencilMask(cState.stencilMask);
807 d582c116 Leszek Koltunski
      }
808 ad16ed3b Leszek Koltunski
809 cc8151c4 leszek
    /////////////////////////////////////////////////////
810
    // 11. Clear buffers?
811 ad16ed3b Leszek Koltunski
    if( mClear!=0 )
812
      {
813 cc8151c4 leszek
      //android.util.Log.d("State", "clearing buffer");
814 e6519ac8 Leszek Koltunski
      GLES31.glClear(mClear);
815 ad16ed3b Leszek Koltunski
      }
816 9dba4df1 leszek
    }
817
818
///////////////////////////////////////////////////////////////////////////////////////////////////
819
820
  void glColorMask(boolean r, boolean g, boolean b, boolean a)
821
    {
822 5b959cc5 Leszek Koltunski
    mState.colorMaskR = (r ? 1:0);
823
    mState.colorMaskG = (g ? 1:0);
824
    mState.colorMaskB = (b ? 1:0);
825
    mState.colorMaskA = (a ? 1:0);
826 9dba4df1 leszek
    }
827
828
///////////////////////////////////////////////////////////////////////////////////////////////////
829
830
  void glDepthMask(boolean mask)
831
    {
832 5b959cc5 Leszek Koltunski
    mState.depthMask = (mask ? 1:0);
833 9dba4df1 leszek
    }
834
835
///////////////////////////////////////////////////////////////////////////////////////////////////
836
837
  void glStencilMask(int mask)
838
    {
839 5b959cc5 Leszek Koltunski
    mState.stencilMask = mask;
840 9dba4df1 leszek
    }
841
842
///////////////////////////////////////////////////////////////////////////////////////////////////
843
844
  void glEnable(int test)
845
    {
846 e6519ac8 Leszek Koltunski
         if( test==GLES31.GL_DEPTH_TEST   ) mState.depthTest   = 1;
847
    else if( test==GLES31.GL_STENCIL_TEST ) mState.stencilTest = 1;
848
    else if( test==GLES31.GL_BLEND        ) mState.blend       = 1;
849 9dba4df1 leszek
    }
850
851
///////////////////////////////////////////////////////////////////////////////////////////////////
852
853
  void glDisable(int test)
854
    {
855 e6519ac8 Leszek Koltunski
         if( test==GLES31.GL_DEPTH_TEST   ) mState.depthTest   = 0;
856
    else if( test==GLES31.GL_STENCIL_TEST ) mState.stencilTest = 0;
857
    else if( test==GLES31.GL_BLEND        ) mState.blend       = 0;
858 9dba4df1 leszek
    }
859
860
///////////////////////////////////////////////////////////////////////////////////////////////////
861
862
  void glStencilFunc(int func, int ref, int mask)
863
    {
864 5b959cc5 Leszek Koltunski
    mState.stencilFuncFunc = func;
865
    mState.stencilFuncRef  = ref;
866
    mState.stencilFuncMask = mask;
867 9dba4df1 leszek
    }
868
869
///////////////////////////////////////////////////////////////////////////////////////////////////
870
871
  void glStencilOp(int sfail, int dpfail, int dppass)
872
    {
873 5b959cc5 Leszek Koltunski
    mState.stencilOpSfail = sfail;
874
    mState.stencilOpDpfail= dpfail;
875
    mState.stencilOpDppass= dppass;
876 9dba4df1 leszek
    }
877
878
///////////////////////////////////////////////////////////////////////////////////////////////////
879
880
  void glDepthFunc(int func)
881
    {
882 5b959cc5 Leszek Koltunski
    mState.depthFunc = func;
883 9dba4df1 leszek
    }
884 c834348d leszek
885
///////////////////////////////////////////////////////////////////////////////////////////////////
886
887
  void glBlendFunc(int src, int dst)
888
    {
889 5b959cc5 Leszek Koltunski
    mState.blendSrc = src;
890
    mState.blendDst = dst;
891 c834348d leszek
    }
892
893 ad16ed3b Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
894
895
  void glClear(int mask)
896
    {
897
    mClear = mask;
898
    }
899 9dba4df1 leszek
}