Project

General

Profile

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

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

1 9dba4df1 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2016 Leszek Koltunski                                                               //
3
//                                                                                               //
4 46b572b5 Leszek Koltunski
// This file is part of Distorted.                                                               //
5 9dba4df1 leszek
//                                                                                               //
6 46b572b5 Leszek Koltunski
// Distorted is free software: you can redistribute it and/or modify                             //
7 9dba4df1 leszek
// 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 46b572b5 Leszek Koltunski
// Distorted is distributed in the hope that it will be useful,                                  //
12 9dba4df1 leszek
// 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 46b572b5 Leszek Koltunski
// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
18 9dba4df1 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
19
20 fe82a979 Leszek Koltunski
package org.distorted.library.main;
21 9dba4df1 leszek
22 b7074bc6 Leszek Koltunski
import android.opengl.GLES30;
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 7602a827 Leszek Koltunski
public class InternalRenderState
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 7602a827 Leszek Koltunski
  InternalRenderState()
64 9dba4df1 leszek
    {
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 b7074bc6 Leszek Koltunski
    mState.depthFunc  = GLES30.GL_LEQUAL;
75 5b959cc5 Leszek Koltunski
76
    mState.blend      = 1;
77 b7074bc6 Leszek Koltunski
    mState.blendSrc   = GLES30.GL_SRC_ALPHA;
78
    mState.blendDst   = GLES30.GL_ONE_MINUS_SRC_ALPHA;
79 5b959cc5 Leszek Koltunski
80
    mState.stencilTest     = 0;
81
    mState.stencilMask     = STENCIL_MASK;
82 b7074bc6 Leszek Koltunski
    mState.stencilFuncFunc = GLES30.GL_NEVER;
83 5b959cc5 Leszek Koltunski
    mState.stencilFuncRef  = 0;
84
    mState.stencilFuncMask = STENCIL_MASK;
85 b7074bc6 Leszek Koltunski
    mState.stencilOpSfail  = GLES30.GL_KEEP;
86
    mState.stencilOpDpfail = GLES30.GL_KEEP;
87
    mState.stencilOpDppass = GLES30.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 b7074bc6 Leszek Koltunski
    GLES30.glColorMask(true,true,true,true);
102 f75a4eee Leszek Koltunski
103
    cState.depthTest = 1;
104
    cState.depthMask = 1;
105 b7074bc6 Leszek Koltunski
    cState.depthFunc = GLES30.GL_LEQUAL;
106
    GLES30.glEnable(GLES30.GL_DEPTH_TEST);
107
    GLES30.glDepthMask(true);
108
    GLES30.glDepthFunc(cState.depthFunc);
109 f75a4eee Leszek Koltunski
110
    cState.stencilTest     = 0;
111
    cState.stencilMask     = STENCIL_MASK;
112 b7074bc6 Leszek Koltunski
    cState.stencilFuncFunc = GLES30.GL_NEVER;
113 f75a4eee Leszek Koltunski
    cState.stencilFuncRef  = 0;
114
    cState.stencilFuncMask = STENCIL_MASK;
115 b7074bc6 Leszek Koltunski
    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 f75a4eee Leszek Koltunski
121
    cState.blend      = 1;
122 b7074bc6 Leszek Koltunski
    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 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 b7074bc6 Leszek Koltunski
      GLES30.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 b7074bc6 Leszek Koltunski
      GLES30.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 b7074bc6 Leszek Koltunski
      GLES30.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 b7074bc6 Leszek Koltunski
      GLES30.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 b7074bc6 Leszek Koltunski
      GLES30.glDepthMask(cState.depthMask==1);
179 20ee7cc9 Leszek Koltunski
      }
180
    if( sState.stencilMask!=cState.stencilMask )
181
      {
182
      cState.stencilMask = sState.stencilMask;
183 b7074bc6 Leszek Koltunski
      GLES30.glStencilMask(cState.stencilMask);
184 20ee7cc9 Leszek Koltunski
      }
185
    }
186
187 977756d7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
188
189 809dcae3 Leszek Koltunski
  public static void disableBlending()
190 977756d7 Leszek Koltunski
    {
191
    sState.blend = cState.blend;
192
193
    if (cState.blend != 0)
194
      {
195
      cState.blend = 0;
196 b7074bc6 Leszek Koltunski
      GLES30.glDisable(GLES30.GL_BLEND);
197 977756d7 Leszek Koltunski
      }
198
    }
199
200
///////////////////////////////////////////////////////////////////////////////////////////////////
201
202 809dcae3 Leszek Koltunski
  public static void restoreBlending()
203 977756d7 Leszek Koltunski
    {
204
    if (sState.blend != cState.blend)
205
      {
206
      cState.blend = sState.blend;
207
208
      if (cState.blend == 0)
209
        {
210 b7074bc6 Leszek Koltunski
        GLES30.glDisable(GLES30.GL_BLEND);
211 977756d7 Leszek Koltunski
        }
212
      else
213
        {
214 b7074bc6 Leszek Koltunski
        GLES30.glEnable(GLES30.GL_BLEND);
215 977756d7 Leszek Koltunski
        }
216
      }
217
    }
218
219 56c6ca24 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
220
221
  static void enableDepthTest()
222
    {
223
    sState.depthTest = cState.depthTest;
224
225
    if (cState.depthTest != 1)
226
      {
227
      cState.depthTest = 1;
228 b7074bc6 Leszek Koltunski
      GLES30.glEnable(GLES30.GL_DEPTH_TEST);
229 56c6ca24 Leszek Koltunski
      }
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 b7074bc6 Leszek Koltunski
        GLES30.glDisable(GLES30.GL_DEPTH_TEST);
243 56c6ca24 Leszek Koltunski
        }
244
      else
245
        {
246 b7074bc6 Leszek Koltunski
        GLES30.glEnable(GLES30.GL_DEPTH_TEST);
247 56c6ca24 Leszek Koltunski
        }
248
      }
249
    }
250
251 cab7c165 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
252
253
  static void switchOffDrawing()
254
    {
255 b7074bc6 Leszek Koltunski
    GLES30.glEnable(GLES30.GL_SCISSOR_TEST);
256
    GLES30.glScissor(0,0,0,0);
257 cab7c165 Leszek Koltunski
    }
258
259
///////////////////////////////////////////////////////////////////////////////////////////////////
260
261
  static void restoreDrawing()
262
    {
263 b7074bc6 Leszek Koltunski
    GLES30.glDisable(GLES30.GL_SCISSOR_TEST);
264 cab7c165 Leszek Koltunski
    }
265
266 33f59f22 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
267
268
  static void switchOffColorDepthStencil()
269
    {
270
    sState.stencilTest = cState.stencilTest;
271
272
    if( cState.stencilTest!=0 )
273
      {
274
      cState.stencilTest = 0;
275
      //android.util.Log.d("State", "stencil test off");
276 b7074bc6 Leszek Koltunski
      GLES30.glDisable(GLES30.GL_STENCIL_TEST);
277 33f59f22 Leszek Koltunski
      }
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 b7074bc6 Leszek Koltunski
      GLES30.glDisable(GLES30.GL_DEPTH_TEST);
286 33f59f22 Leszek Koltunski
      }
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 b7074bc6 Leszek Koltunski
      GLES30.glColorMask(false,false,false,false);
301 33f59f22 Leszek Koltunski
      }
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 b7074bc6 Leszek Koltunski
      GLES30.glDepthMask(false);
310 33f59f22 Leszek Koltunski
      }
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 b7074bc6 Leszek Koltunski
      GLES30.glStencilMask(cState.stencilMask);
319 33f59f22 Leszek Koltunski
      }
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 b7074bc6 Leszek Koltunski
      GLES30.glDisable(GLES30.GL_STENCIL_TEST);
333 33f59f22 Leszek Koltunski
      }
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 b7074bc6 Leszek Koltunski
      GLES30.glDisable(GLES30.GL_DEPTH_TEST);
342 33f59f22 Leszek Koltunski
      }
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 b7074bc6 Leszek Koltunski
      GLES30.glColorMask(true,true,true,true);
357 33f59f22 Leszek Koltunski
      }
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 b7074bc6 Leszek Koltunski
      GLES30.glDepthMask(true);
366 33f59f22 Leszek Koltunski
      }
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 b7074bc6 Leszek Koltunski
      GLES30.glStencilMask(cState.stencilMask);
375 33f59f22 Leszek Koltunski
      }
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 b7074bc6 Leszek Koltunski
        GLES30.glDisable(GLES30.GL_STENCIL_TEST);
389 33f59f22 Leszek Koltunski
        }
390
      else
391
        {
392 b7074bc6 Leszek Koltunski
        GLES30.glEnable(GLES30.GL_STENCIL_TEST);
393 33f59f22 Leszek Koltunski
        }
394
      }
395
    if( sState.depthTest!=cState.depthTest )
396
      {
397
      cState.depthTest = sState.depthTest;
398
399
      if (cState.depthTest == 0)
400
        {
401 b7074bc6 Leszek Koltunski
        GLES30.glDisable(GLES30.GL_DEPTH_TEST);
402 33f59f22 Leszek Koltunski
        }
403
      else
404
        {
405 b7074bc6 Leszek Koltunski
        GLES30.glEnable(GLES30.GL_DEPTH_TEST);
406 33f59f22 Leszek Koltunski
        }
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 b7074bc6 Leszek Koltunski
      GLES30.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
415 33f59f22 Leszek Koltunski
      }
416
    if( sState.depthMask!=cState.depthMask )
417
      {
418
      cState.depthMask = sState.depthMask;
419 b7074bc6 Leszek Koltunski
      GLES30.glDepthMask(cState.depthMask==1);
420 33f59f22 Leszek Koltunski
      }
421
    if( sState.stencilMask!=cState.stencilMask )
422 8777ce17 Leszek Koltunski
      {
423
      cState.stencilMask = sState.stencilMask;
424 b7074bc6 Leszek Koltunski
      GLES30.glStencilMask(cState.stencilMask);
425 8777ce17 Leszek Koltunski
      }
426
    }
427
428 270c27bc Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
429
430 809dcae3 Leszek Koltunski
  public static void setUpStencilMark(boolean color)
431 270c27bc Leszek Koltunski
    {
432 20ee7cc9 Leszek Koltunski
    sState.stencilTest = cState.stencilTest;
433
434 5b959cc5 Leszek Koltunski
    if( cState.stencilTest!=1 )
435 270c27bc Leszek Koltunski
      {
436 5b959cc5 Leszek Koltunski
      cState.stencilTest = 1;
437 b3120b1b leszek
      //android.util.Log.d("State", "stencil test on");
438 b7074bc6 Leszek Koltunski
      GLES30.glEnable(GLES30.GL_STENCIL_TEST);
439 270c27bc Leszek Koltunski
      }
440 20ee7cc9 Leszek Koltunski
441
    sState.stencilFuncFunc = cState.stencilFuncFunc;
442
    sState.stencilFuncRef  = cState.stencilFuncRef;
443
    sState.stencilFuncMask = cState.stencilFuncMask;
444
445 b7074bc6 Leszek Koltunski
    if( cState.stencilFuncFunc!=GLES30.GL_ALWAYS || cState.stencilFuncRef!=1 || cState.stencilFuncMask!=STENCIL_MASK )
446 270c27bc Leszek Koltunski
      {
447 b7074bc6 Leszek Koltunski
      cState.stencilFuncFunc = GLES30.GL_ALWAYS;
448 5b959cc5 Leszek Koltunski
      cState.stencilFuncRef  = 1;
449
      cState.stencilFuncMask = STENCIL_MASK;
450 b3120b1b leszek
      //android.util.Log.d("State", "stencil func on");
451 b7074bc6 Leszek Koltunski
      GLES30.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
452 270c27bc Leszek Koltunski
      }
453 20ee7cc9 Leszek Koltunski
454
    sState.stencilOpSfail = cState.stencilOpSfail;
455
    sState.stencilOpDpfail= cState.stencilOpDpfail;
456
    sState.stencilOpDppass= cState.stencilOpDppass;
457
458 b7074bc6 Leszek Koltunski
    if( cState.stencilOpSfail!=GLES30.GL_KEEP || cState.stencilOpDpfail!=GLES30.GL_KEEP || cState.stencilOpDppass!=GLES30.GL_REPLACE )
459 270c27bc Leszek Koltunski
      {
460 b7074bc6 Leszek Koltunski
      cState.stencilOpSfail = GLES30.GL_KEEP;
461
      cState.stencilOpDpfail= GLES30.GL_KEEP;
462
      cState.stencilOpDppass= GLES30.GL_REPLACE;
463 b3120b1b leszek
      //android.util.Log.d("State", "stencil op on");
464 b7074bc6 Leszek Koltunski
      GLES30.glStencilOp(cState.stencilOpSfail,cState.stencilOpDpfail,cState.stencilOpDppass);
465 270c27bc Leszek Koltunski
      }
466 20ee7cc9 Leszek Koltunski
467
    sState.colorMaskR = cState.colorMaskR;
468
    sState.colorMaskG = cState.colorMaskG;
469
    sState.colorMaskB = cState.colorMaskB;
470
    sState.colorMaskA = cState.colorMaskA;
471
472 a13dde77 Leszek Koltunski
    int clr = color ? 1:0;
473
474
    if( cState.colorMaskR!=clr || cState.colorMaskG!=clr || cState.colorMaskB!=clr || cState.colorMaskA!=clr )
475 270c27bc Leszek Koltunski
      {
476 a13dde77 Leszek Koltunski
      cState.colorMaskR = clr;
477
      cState.colorMaskG = clr;
478
      cState.colorMaskB = clr;
479
      cState.colorMaskA = clr;
480 b3120b1b leszek
      //android.util.Log.d("State", "switch off color writing");
481 b7074bc6 Leszek Koltunski
      GLES30.glColorMask(color,color,color,color);
482 270c27bc Leszek Koltunski
      }
483 20ee7cc9 Leszek Koltunski
484
    sState.depthMask = cState.depthMask;
485
486 1d6d261e Leszek Koltunski
    if( cState.depthMask!=1 )
487 270c27bc Leszek Koltunski
      {
488 1d6d261e Leszek Koltunski
      cState.depthMask = 1;
489
      //android.util.Log.d("State", "switch on depth writing");
490 b7074bc6 Leszek Koltunski
      GLES30.glDepthMask(true);
491 270c27bc Leszek Koltunski
      }
492 20ee7cc9 Leszek Koltunski
493
    sState.stencilMask = cState.stencilMask;
494
495 5b959cc5 Leszek Koltunski
    if( cState.stencilMask!= STENCIL_MASK )
496 270c27bc Leszek Koltunski
      {
497 5b959cc5 Leszek Koltunski
      cState.stencilMask = STENCIL_MASK;
498 b3120b1b leszek
      //android.util.Log.d("State", "stencil mask on");
499 b7074bc6 Leszek Koltunski
      GLES30.glStencilMask(cState.stencilMask);
500 270c27bc Leszek Koltunski
      }
501
    }
502
503 984dc935 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
504
505 809dcae3 Leszek Koltunski
  public static void unsetUpStencilMark()
506 984dc935 Leszek Koltunski
    {
507
    if( sState.stencilTest!=cState.stencilTest )
508
      {
509
      cState.stencilTest = sState.stencilTest;
510
511
      if (cState.stencilTest == 0)
512
        {
513 b7074bc6 Leszek Koltunski
        GLES30.glDisable(GLES30.GL_STENCIL_TEST);
514 984dc935 Leszek Koltunski
        }
515
      else
516
        {
517 b7074bc6 Leszek Koltunski
        GLES30.glEnable(GLES30.GL_STENCIL_TEST);
518 984dc935 Leszek Koltunski
        }
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 b7074bc6 Leszek Koltunski
      GLES30.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
527 984dc935 Leszek Koltunski
      }
528
    if( sState.depthMask!=cState.depthMask )
529
      {
530
      cState.depthMask = sState.depthMask;
531 b7074bc6 Leszek Koltunski
      GLES30.glDepthMask(cState.depthMask==1);
532 984dc935 Leszek Koltunski
      }
533
    if( sState.stencilMask!=cState.stencilMask )
534
      {
535
      cState.stencilMask = sState.stencilMask;
536 b7074bc6 Leszek Koltunski
      GLES30.glStencilMask(cState.stencilMask);
537 984dc935 Leszek Koltunski
      }
538
    }
539
540 270c27bc Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
541 7266d8ef Leszek Koltunski
/**
542
 * Only for use by the library itself.
543
 *
544
 * @y.exclude
545
 */
546
  public static void useStencilMark()
547 270c27bc Leszek Koltunski
    {
548 20ee7cc9 Leszek Koltunski
    sState.stencilMask = cState.stencilMask;
549
550 5b959cc5 Leszek Koltunski
    if( cState.stencilTest!=1 )
551 270c27bc Leszek Koltunski
      {
552 5b959cc5 Leszek Koltunski
      cState.stencilTest = 1;
553 b7074bc6 Leszek Koltunski
      GLES30.glEnable(GLES30.GL_STENCIL_TEST);
554 270c27bc Leszek Koltunski
      }
555 20ee7cc9 Leszek Koltunski
556
    sState.stencilFuncFunc = cState.stencilFuncFunc;
557
    sState.stencilFuncRef  = cState.stencilFuncRef;
558
    sState.stencilFuncMask = cState.stencilFuncMask;
559
560 b7074bc6 Leszek Koltunski
    if( cState.stencilFuncFunc!=GLES30.GL_EQUAL || cState.stencilFuncRef!=1 || cState.stencilFuncMask!=STENCIL_MASK )
561 270c27bc Leszek Koltunski
      {
562 b7074bc6 Leszek Koltunski
      cState.stencilFuncFunc = GLES30.GL_EQUAL;
563 5b959cc5 Leszek Koltunski
      cState.stencilFuncRef  = 1;
564
      cState.stencilFuncMask = STENCIL_MASK;
565 b7074bc6 Leszek Koltunski
      GLES30.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
566 270c27bc Leszek Koltunski
      }
567 20ee7cc9 Leszek Koltunski
568
    sState.stencilMask = cState.stencilMask;
569
570 5b959cc5 Leszek Koltunski
    if( cState.stencilMask!= 0x00 )
571 270c27bc Leszek Koltunski
      {
572 5b959cc5 Leszek Koltunski
      cState.stencilMask = 0x00;
573 b7074bc6 Leszek Koltunski
      GLES30.glStencilMask(cState.stencilMask);
574 270c27bc Leszek Koltunski
      }
575 20ee7cc9 Leszek Koltunski
576
    sState.depthMask = cState.depthMask;
577
578
    if( cState.depthMask!=0 )
579 81f0078a Leszek Koltunski
      {
580
      cState.depthMask = 0;
581 b7074bc6 Leszek Koltunski
      GLES30.glDepthMask(false);
582 81f0078a Leszek Koltunski
      }
583 20ee7cc9 Leszek Koltunski
584
    sState.depthTest = cState.depthTest;
585
586 81f0078a Leszek Koltunski
    if( cState.depthTest!=0 )
587
      {
588
      cState.depthTest = 0;
589 b7074bc6 Leszek Koltunski
      GLES30.glDisable(GLES30.GL_DEPTH_TEST);
590 81f0078a Leszek Koltunski
      }
591 270c27bc Leszek Koltunski
    }
592
593
///////////////////////////////////////////////////////////////////////////////////////////////////
594 7266d8ef Leszek Koltunski
/**
595
 * Only for use by the library itself.
596
 *
597
 * @y.exclude
598
 */
599
  public static void unuseStencilMark()
600 270c27bc Leszek Koltunski
    {
601 5b959cc5 Leszek Koltunski
    if( sState.stencilTest!=cState.stencilTest )
602 270c27bc Leszek Koltunski
      {
603 5b959cc5 Leszek Koltunski
      cState.stencilTest = sState.stencilTest;
604 270c27bc Leszek Koltunski
605 5b959cc5 Leszek Koltunski
      if (cState.stencilTest == 0)
606 270c27bc Leszek Koltunski
        {
607 b7074bc6 Leszek Koltunski
        GLES30.glDisable(GLES30.GL_STENCIL_TEST);
608 270c27bc Leszek Koltunski
        }
609
      else
610
        {
611 b7074bc6 Leszek Koltunski
        GLES30.glEnable(GLES30.GL_STENCIL_TEST);
612 270c27bc Leszek Koltunski
        }
613
      }
614 5b959cc5 Leszek Koltunski
    if( sState.stencilFuncFunc!=cState.stencilFuncFunc || sState.stencilFuncRef!=cState.stencilFuncRef || sState.stencilFuncMask!=cState.stencilFuncMask )
615 270c27bc Leszek Koltunski
      {
616 5b959cc5 Leszek Koltunski
      cState.stencilFuncFunc = sState.stencilFuncFunc;
617
      cState.stencilFuncRef  = sState.stencilFuncRef ;
618
      cState.stencilFuncMask = sState.stencilFuncMask;
619 b7074bc6 Leszek Koltunski
      GLES30.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
620 270c27bc Leszek Koltunski
      }
621 5b959cc5 Leszek Koltunski
    if( sState.stencilMask!=cState.stencilMask )
622 270c27bc Leszek Koltunski
      {
623 5b959cc5 Leszek Koltunski
      cState.stencilMask = sState.stencilMask;
624 b7074bc6 Leszek Koltunski
      GLES30.glStencilMask(cState.stencilMask);
625 270c27bc Leszek Koltunski
      }
626 81f0078a Leszek Koltunski
    if( sState.depthMask!=cState.depthMask )
627
      {
628
      cState.depthMask = sState.depthMask;
629 b7074bc6 Leszek Koltunski
      GLES30.glDepthMask(cState.depthMask==1);
630 81f0078a Leszek Koltunski
      }
631
    if( sState.depthTest!=cState.depthTest )
632
      {
633
      cState.depthTest = sState.depthTest;
634
635
      if (cState.depthTest == 0)
636
        {
637 b7074bc6 Leszek Koltunski
        GLES30.glDisable(GLES30.GL_DEPTH_TEST);
638 81f0078a Leszek Koltunski
        }
639
      else
640
        {
641 b7074bc6 Leszek Koltunski
        GLES30.glEnable(GLES30.GL_DEPTH_TEST);
642 81f0078a Leszek Koltunski
        }
643
      }
644 270c27bc Leszek Koltunski
    }
645
646 9dba4df1 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
647
648
  void apply()
649
    {
650 cc8151c4 leszek
    //android.util.Log.e("State", "APPLYING STATE");
651 d582c116 Leszek Koltunski
652 cc8151c4 leszek
    /////////////////////////////////////////////////////
653
    // 1. Write to color buffer?
654 5b959cc5 Leszek Koltunski
    if( mState.colorMaskR!=cState.colorMaskR || mState.colorMaskG!=cState.colorMaskG || mState.colorMaskB!=cState.colorMaskB || mState.colorMaskA!=cState.colorMaskA)
655 9dba4df1 leszek
      {
656 cc8151c4 leszek
      //android.util.Log.d("State", "setting color mask");
657 5b959cc5 Leszek Koltunski
      cState.colorMaskR = mState.colorMaskR;
658
      cState.colorMaskG = mState.colorMaskG;
659
      cState.colorMaskB = mState.colorMaskB;
660
      cState.colorMaskA = mState.colorMaskA;
661 b7074bc6 Leszek Koltunski
      GLES30.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
662 9dba4df1 leszek
      }
663
664 cc8151c4 leszek
    /////////////////////////////////////////////////////
665 d582c116 Leszek Koltunski
    // 2. Enable Depth test?
666 5b959cc5 Leszek Koltunski
    if( mState.depthTest!=cState.depthTest )
667 9dba4df1 leszek
      {
668 5b959cc5 Leszek Koltunski
      cState.depthTest = mState.depthTest;
669 d582c116 Leszek Koltunski
670 5b959cc5 Leszek Koltunski
      if (cState.depthTest == 0)
671 cc8151c4 leszek
        {
672
        //android.util.Log.d("State", "disabling depth test");
673 b7074bc6 Leszek Koltunski
        GLES30.glDisable(GLES30.GL_DEPTH_TEST);
674 cc8151c4 leszek
        }
675 9dba4df1 leszek
      else
676
        {
677 cc8151c4 leszek
        //android.util.Log.d("State", "enable depth test");
678 b7074bc6 Leszek Koltunski
        GLES30.glEnable(GLES30.GL_DEPTH_TEST);
679 9dba4df1 leszek
        }
680
      }
681
682 cc8151c4 leszek
    /////////////////////////////////////////////////////
683
    // 3. Change Depth Function?
684 5b959cc5 Leszek Koltunski
    if( mState.depthFunc!=cState.depthFunc )
685 cc8151c4 leszek
      {
686
      //android.util.Log.d("State", "setting depth func");
687 5b959cc5 Leszek Koltunski
      cState.depthFunc = mState.depthFunc;
688 b7074bc6 Leszek Koltunski
      GLES30.glDepthFunc(cState.depthFunc);
689 cc8151c4 leszek
      }
690 d582c116 Leszek Koltunski
691 cc8151c4 leszek
    /////////////////////////////////////////////////////
692
    // 4. Write to Depth buffer?
693 5b959cc5 Leszek Koltunski
    if( mState.depthMask!=cState.depthMask )
694 d582c116 Leszek Koltunski
      {
695 cc8151c4 leszek
      //android.util.Log.d("State", "setting depth mask");
696 5b959cc5 Leszek Koltunski
      cState.depthMask = mState.depthMask;
697 b7074bc6 Leszek Koltunski
      GLES30.glDepthMask(cState.depthMask==1);
698 d582c116 Leszek Koltunski
      }
699
700 cc8151c4 leszek
    /////////////////////////////////////////////////////
701
    // 5. Enable Blending?
702 5b959cc5 Leszek Koltunski
    if( mState.blend!=cState.blend )
703 c834348d leszek
      {
704 5b959cc5 Leszek Koltunski
      cState.blend = mState.blend;
705 d582c116 Leszek Koltunski
706 5b959cc5 Leszek Koltunski
      if (cState.blend == 0)
707 cc8151c4 leszek
        {
708
        //android.util.Log.d("State", "disabling blending");
709 b7074bc6 Leszek Koltunski
        GLES30.glDisable(GLES30.GL_BLEND);
710 cc8151c4 leszek
        }
711 c834348d leszek
      else
712
        {
713 cc8151c4 leszek
        //android.util.Log.d("State", "enabling blending");
714 b7074bc6 Leszek Koltunski
        GLES30.glEnable(GLES30.GL_BLEND);
715 c834348d leszek
        }
716
      }
717
718 cc8151c4 leszek
    /////////////////////////////////////////////////////
719
    // 6. Change Blend function?
720 5b959cc5 Leszek Koltunski
    if( mState.blendSrc!=cState.blendSrc || mState.blendDst!=cState.blendDst )
721 cc8151c4 leszek
      {
722
      //android.util.Log.d("State", "setting blend function");
723 5b959cc5 Leszek Koltunski
      cState.blendSrc = mState.blendSrc;
724
      cState.blendDst = mState.blendDst;
725 b7074bc6 Leszek Koltunski
      GLES30.glBlendFunc(cState.blendSrc,cState.blendDst);
726 cc8151c4 leszek
      }
727 d582c116 Leszek Koltunski
728 cc8151c4 leszek
    /////////////////////////////////////////////////////
729
    // 7. Enable/Disable Stencil Test?
730 5b959cc5 Leszek Koltunski
    if( mState.stencilTest!=cState.stencilTest )
731 9dba4df1 leszek
      {
732 5b959cc5 Leszek Koltunski
      cState.stencilTest = mState.stencilTest;
733 d582c116 Leszek Koltunski
734 5b959cc5 Leszek Koltunski
      if (cState.stencilTest == 0)
735 cc8151c4 leszek
        {
736
        //android.util.Log.d("State", "disabling stencil test");
737 b7074bc6 Leszek Koltunski
        GLES30.glDisable(GLES30.GL_STENCIL_TEST);
738 cc8151c4 leszek
        }
739 9dba4df1 leszek
      else
740
        {
741 cc8151c4 leszek
        //android.util.Log.d("State", "enabling stencil test");
742 b7074bc6 Leszek Koltunski
        GLES30.glEnable(GLES30.GL_STENCIL_TEST);
743 9dba4df1 leszek
        }
744
      }
745 d582c116 Leszek Koltunski
746 cc8151c4 leszek
    /////////////////////////////////////////////////////
747
    // 8. Adjust Stencil function?
748 5b959cc5 Leszek Koltunski
    if( mState.stencilFuncFunc!=cState.stencilFuncFunc || mState.stencilFuncRef!=cState.stencilFuncRef || mState.stencilFuncMask!=cState.stencilFuncMask )
749 cc8151c4 leszek
      {
750
      //android.util.Log.d("State", "setting stencil function");
751 5b959cc5 Leszek Koltunski
      cState.stencilFuncFunc = mState.stencilFuncFunc;
752
      cState.stencilFuncRef  = mState.stencilFuncRef ;
753
      cState.stencilFuncMask = mState.stencilFuncMask;
754 b7074bc6 Leszek Koltunski
      GLES30.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
755 cc8151c4 leszek
      }
756
757
    /////////////////////////////////////////////////////
758
    // 9. Adjust Stencil operation?
759 5b959cc5 Leszek Koltunski
    if( mState.stencilOpSfail!=cState.stencilOpSfail || mState.stencilOpDpfail!=cState.stencilOpDpfail || mState.stencilOpDppass!=cState.stencilOpDppass )
760 cc8151c4 leszek
      {
761
      //android.util.Log.d("State", "setting stencil op");
762 5b959cc5 Leszek Koltunski
      cState.stencilOpSfail = mState.stencilOpSfail;
763
      cState.stencilOpDpfail= mState.stencilOpDpfail;
764
      cState.stencilOpDppass= mState.stencilOpDppass;
765 b7074bc6 Leszek Koltunski
      GLES30.glStencilOp(cState.stencilOpSfail,cState.stencilOpDpfail,cState.stencilOpDppass);
766 cc8151c4 leszek
      }
767 d582c116 Leszek Koltunski
768 cc8151c4 leszek
    /////////////////////////////////////////////////////
769
    // 10. Write to Stencil buffer?
770 5b959cc5 Leszek Koltunski
    if( mState.stencilMask!=cState.stencilMask )
771 d582c116 Leszek Koltunski
      {
772 cc8151c4 leszek
      //android.util.Log.d("State", "setting stencil mask");
773 5b959cc5 Leszek Koltunski
      cState.stencilMask = mState.stencilMask;
774 b7074bc6 Leszek Koltunski
      GLES30.glStencilMask(cState.stencilMask);
775 d582c116 Leszek Koltunski
      }
776 ad16ed3b Leszek Koltunski
777 cc8151c4 leszek
    /////////////////////////////////////////////////////
778
    // 11. Clear buffers?
779 ad16ed3b Leszek Koltunski
    if( mClear!=0 )
780
      {
781 cc8151c4 leszek
      //android.util.Log.d("State", "clearing buffer");
782 b7074bc6 Leszek Koltunski
      GLES30.glClear(mClear);
783 ad16ed3b Leszek Koltunski
      }
784 9dba4df1 leszek
    }
785
786
///////////////////////////////////////////////////////////////////////////////////////////////////
787
788
  void glColorMask(boolean r, boolean g, boolean b, boolean a)
789
    {
790 5b959cc5 Leszek Koltunski
    mState.colorMaskR = (r ? 1:0);
791
    mState.colorMaskG = (g ? 1:0);
792
    mState.colorMaskB = (b ? 1:0);
793
    mState.colorMaskA = (a ? 1:0);
794 9dba4df1 leszek
    }
795
796
///////////////////////////////////////////////////////////////////////////////////////////////////
797
798
  void glDepthMask(boolean mask)
799
    {
800 5b959cc5 Leszek Koltunski
    mState.depthMask = (mask ? 1:0);
801 9dba4df1 leszek
    }
802
803
///////////////////////////////////////////////////////////////////////////////////////////////////
804
805
  void glStencilMask(int mask)
806
    {
807 5b959cc5 Leszek Koltunski
    mState.stencilMask = mask;
808 9dba4df1 leszek
    }
809
810
///////////////////////////////////////////////////////////////////////////////////////////////////
811
812
  void glEnable(int test)
813
    {
814 b7074bc6 Leszek Koltunski
         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 9dba4df1 leszek
    }
818
819
///////////////////////////////////////////////////////////////////////////////////////////////////
820
821
  void glDisable(int test)
822
    {
823 b7074bc6 Leszek Koltunski
         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 9dba4df1 leszek
    }
827
828
///////////////////////////////////////////////////////////////////////////////////////////////////
829
830
  void glStencilFunc(int func, int ref, int mask)
831
    {
832 5b959cc5 Leszek Koltunski
    mState.stencilFuncFunc = func;
833
    mState.stencilFuncRef  = ref;
834
    mState.stencilFuncMask = mask;
835 9dba4df1 leszek
    }
836
837
///////////////////////////////////////////////////////////////////////////////////////////////////
838
839
  void glStencilOp(int sfail, int dpfail, int dppass)
840
    {
841 5b959cc5 Leszek Koltunski
    mState.stencilOpSfail = sfail;
842
    mState.stencilOpDpfail= dpfail;
843
    mState.stencilOpDppass= dppass;
844 9dba4df1 leszek
    }
845
846
///////////////////////////////////////////////////////////////////////////////////////////////////
847
848
  void glDepthFunc(int func)
849
    {
850 5b959cc5 Leszek Koltunski
    mState.depthFunc = func;
851 9dba4df1 leszek
    }
852 c834348d leszek
853
///////////////////////////////////////////////////////////////////////////////////////////////////
854
855
  void glBlendFunc(int src, int dst)
856
    {
857 5b959cc5 Leszek Koltunski
    mState.blendSrc = src;
858
    mState.blendDst = dst;
859 c834348d leszek
    }
860
861 ad16ed3b Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
862
863
  void glClear(int mask)
864
    {
865
    mClear = mask;
866
    }
867 9dba4df1 leszek
}