Project

General

Profile

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

library / src / main / java / org / distorted / library / main / DistortedRenderState.java @ c41d046c

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 8777ce17 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
235
236
  static void enableStencil()
237
    {
238
    sState.stencilTest = cState.stencilTest;
239
240
    if (cState.stencilTest != 1)
241
      {
242
      cState.stencilTest = 1;
243
      GLES31.glEnable(GLES31.GL_STENCIL_TEST);
244
      }
245
246
    sState.stencilFuncFunc = cState.stencilFuncFunc;
247
    sState.stencilFuncRef  = cState.stencilFuncRef;
248
    sState.stencilFuncMask = cState.stencilFuncMask;
249
250
    if( cState.stencilFuncFunc!=GLES31.GL_EQUAL || cState.stencilFuncRef!=1 || cState.stencilFuncMask!=STENCIL_MASK )
251
      {
252
      cState.stencilFuncFunc = GLES31.GL_EQUAL;
253
      cState.stencilFuncRef  = 1;
254
      cState.stencilFuncMask = STENCIL_MASK;
255
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
256
      }
257
258
    sState.stencilMask = cState.stencilMask;
259
260
    if( cState.stencilMask!= 0x00 )
261
      {
262
      cState.stencilMask = 0x00;
263
      GLES31.glStencilMask(cState.stencilMask);
264
      }
265
    }
266
267
///////////////////////////////////////////////////////////////////////////////////////////////////
268
269
  static void restoreStencil()
270
    {
271
    if (sState.stencilTest != cState.stencilTest)
272
      {
273
      cState.stencilTest = sState.stencilTest;
274
275
      if (cState.stencilTest == 0)
276
        {
277
        GLES31.glDisable(GLES31.GL_STENCIL_TEST);
278
        }
279
      else
280
        {
281
        GLES31.glEnable(GLES31.GL_STENCIL_TEST);
282
        }
283
      }
284
    if( sState.stencilFuncFunc!=cState.stencilFuncFunc || sState.stencilFuncRef!=cState.stencilFuncRef || sState.stencilFuncMask!=cState.stencilFuncMask )
285
      {
286
      cState.stencilFuncFunc = sState.stencilFuncFunc;
287
      cState.stencilFuncRef  = sState.stencilFuncRef ;
288
      cState.stencilFuncMask = sState.stencilFuncMask;
289
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
290
      }
291
    if( sState.stencilMask!=cState.stencilMask )
292
      {
293
      cState.stencilMask = sState.stencilMask;
294
      GLES31.glStencilMask(cState.stencilMask);
295
      }
296
    }
297
298 270c27bc Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
299
300
  static void setUpStencilMark()
301
    {
302 20ee7cc9 Leszek Koltunski
    sState.stencilTest = cState.stencilTest;
303
304 5b959cc5 Leszek Koltunski
    if( cState.stencilTest!=1 )
305 270c27bc Leszek Koltunski
      {
306 5b959cc5 Leszek Koltunski
      cState.stencilTest = 1;
307 b3120b1b leszek
      //android.util.Log.d("State", "stencil test on");
308 e6519ac8 Leszek Koltunski
      GLES31.glEnable(GLES31.GL_STENCIL_TEST);
309 270c27bc Leszek Koltunski
      }
310 20ee7cc9 Leszek Koltunski
311
    sState.stencilFuncFunc = cState.stencilFuncFunc;
312
    sState.stencilFuncRef  = cState.stencilFuncRef;
313
    sState.stencilFuncMask = cState.stencilFuncMask;
314
315 e6519ac8 Leszek Koltunski
    if( cState.stencilFuncFunc!=GLES31.GL_ALWAYS || cState.stencilFuncRef!=1 || cState.stencilFuncMask!=STENCIL_MASK )
316 270c27bc Leszek Koltunski
      {
317 e6519ac8 Leszek Koltunski
      cState.stencilFuncFunc = GLES31.GL_ALWAYS;
318 5b959cc5 Leszek Koltunski
      cState.stencilFuncRef  = 1;
319
      cState.stencilFuncMask = STENCIL_MASK;
320 b3120b1b leszek
      //android.util.Log.d("State", "stencil func on");
321 e6519ac8 Leszek Koltunski
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
322 270c27bc Leszek Koltunski
      }
323 20ee7cc9 Leszek Koltunski
324
    sState.stencilOpSfail = cState.stencilOpSfail;
325
    sState.stencilOpDpfail= cState.stencilOpDpfail;
326
    sState.stencilOpDppass= cState.stencilOpDppass;
327
328 e6519ac8 Leszek Koltunski
    if( cState.stencilOpSfail!=GLES31.GL_KEEP || cState.stencilOpDpfail!=GLES31.GL_KEEP || cState.stencilOpDppass!=GLES31.GL_REPLACE )
329 270c27bc Leszek Koltunski
      {
330 e6519ac8 Leszek Koltunski
      cState.stencilOpSfail = GLES31.GL_KEEP;
331
      cState.stencilOpDpfail= GLES31.GL_KEEP;
332
      cState.stencilOpDppass= GLES31.GL_REPLACE;
333 b3120b1b leszek
      //android.util.Log.d("State", "stencil op on");
334 e6519ac8 Leszek Koltunski
      GLES31.glStencilOp(cState.stencilOpSfail,cState.stencilOpDpfail,cState.stencilOpDppass);
335 270c27bc Leszek Koltunski
      }
336 20ee7cc9 Leszek Koltunski
337
    sState.colorMaskR = cState.colorMaskR;
338
    sState.colorMaskG = cState.colorMaskG;
339
    sState.colorMaskB = cState.colorMaskB;
340
    sState.colorMaskA = cState.colorMaskA;
341
342 5b959cc5 Leszek Koltunski
    if( cState.colorMaskR!=0 || cState.colorMaskG!=0 || cState.colorMaskB!=0 || cState.colorMaskA!=0 )
343 270c27bc Leszek Koltunski
      {
344 5b959cc5 Leszek Koltunski
      cState.colorMaskR = 0;
345
      cState.colorMaskG = 0;
346
      cState.colorMaskB = 0;
347
      cState.colorMaskA = 0;
348 b3120b1b leszek
      //android.util.Log.d("State", "switch off color writing");
349 e6519ac8 Leszek Koltunski
      GLES31.glColorMask(false,false,false,false);
350 270c27bc Leszek Koltunski
      }
351 20ee7cc9 Leszek Koltunski
352
    sState.depthMask = cState.depthMask;
353
354 1d6d261e Leszek Koltunski
    if( cState.depthMask!=1 )
355 270c27bc Leszek Koltunski
      {
356 1d6d261e Leszek Koltunski
      cState.depthMask = 1;
357
      //android.util.Log.d("State", "switch on depth writing");
358 e6519ac8 Leszek Koltunski
      GLES31.glDepthMask(true);
359 270c27bc Leszek Koltunski
      }
360 20ee7cc9 Leszek Koltunski
361
    sState.stencilMask = cState.stencilMask;
362
363 5b959cc5 Leszek Koltunski
    if( cState.stencilMask!= STENCIL_MASK )
364 270c27bc Leszek Koltunski
      {
365 5b959cc5 Leszek Koltunski
      cState.stencilMask = STENCIL_MASK;
366 b3120b1b leszek
      //android.util.Log.d("State", "stencil mask on");
367 e6519ac8 Leszek Koltunski
      GLES31.glStencilMask(cState.stencilMask);
368 270c27bc Leszek Koltunski
      }
369
    }
370
371 984dc935 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
372
373
  static void unsetUpStencilMark()
374
    {
375
    if( sState.stencilTest!=cState.stencilTest )
376
      {
377
      cState.stencilTest = sState.stencilTest;
378
379
      if (cState.stencilTest == 0)
380
        {
381 e6519ac8 Leszek Koltunski
        GLES31.glDisable(GLES31.GL_STENCIL_TEST);
382 984dc935 Leszek Koltunski
        }
383
      else
384
        {
385 e6519ac8 Leszek Koltunski
        GLES31.glEnable(GLES31.GL_STENCIL_TEST);
386 984dc935 Leszek Koltunski
        }
387
      }
388
    if( sState.colorMaskR!=cState.colorMaskR || sState.colorMaskG!=cState.colorMaskG || sState.colorMaskB!=cState.colorMaskB || sState.colorMaskA!=cState.colorMaskA)
389
      {
390
      cState.colorMaskR = sState.colorMaskR;
391
      cState.colorMaskG = sState.colorMaskG;
392
      cState.colorMaskB = sState.colorMaskB;
393
      cState.colorMaskA = sState.colorMaskA;
394 e6519ac8 Leszek Koltunski
      GLES31.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
395 984dc935 Leszek Koltunski
      }
396
    if( sState.depthMask!=cState.depthMask )
397
      {
398
      cState.depthMask = sState.depthMask;
399 e6519ac8 Leszek Koltunski
      GLES31.glDepthMask(cState.depthMask==1);
400 984dc935 Leszek Koltunski
      }
401
    if( sState.stencilMask!=cState.stencilMask )
402
      {
403
      cState.stencilMask = sState.stencilMask;
404 e6519ac8 Leszek Koltunski
      GLES31.glStencilMask(cState.stencilMask);
405 984dc935 Leszek Koltunski
      }
406
    }
407
408 270c27bc Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
409 7266d8ef Leszek Koltunski
/**
410
 * Only for use by the library itself.
411
 *
412
 * @y.exclude
413
 */
414
  public static void useStencilMark()
415 270c27bc Leszek Koltunski
    {
416 20ee7cc9 Leszek Koltunski
    sState.stencilMask = cState.stencilMask;
417
418 5b959cc5 Leszek Koltunski
    if( cState.stencilTest!=1 )
419 270c27bc Leszek Koltunski
      {
420 5b959cc5 Leszek Koltunski
      cState.stencilTest = 1;
421 e6519ac8 Leszek Koltunski
      GLES31.glEnable(GLES31.GL_STENCIL_TEST);
422 270c27bc Leszek Koltunski
      }
423 20ee7cc9 Leszek Koltunski
424
    sState.stencilFuncFunc = cState.stencilFuncFunc;
425
    sState.stencilFuncRef  = cState.stencilFuncRef;
426
    sState.stencilFuncMask = cState.stencilFuncMask;
427
428 e6519ac8 Leszek Koltunski
    if( cState.stencilFuncFunc!=GLES31.GL_EQUAL || cState.stencilFuncRef!=1 || cState.stencilFuncMask!=STENCIL_MASK )
429 270c27bc Leszek Koltunski
      {
430 e6519ac8 Leszek Koltunski
      cState.stencilFuncFunc = GLES31.GL_EQUAL;
431 5b959cc5 Leszek Koltunski
      cState.stencilFuncRef  = 1;
432
      cState.stencilFuncMask = STENCIL_MASK;
433 e6519ac8 Leszek Koltunski
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
434 270c27bc Leszek Koltunski
      }
435 20ee7cc9 Leszek Koltunski
436
    sState.stencilMask = cState.stencilMask;
437
438 5b959cc5 Leszek Koltunski
    if( cState.stencilMask!= 0x00 )
439 270c27bc Leszek Koltunski
      {
440 5b959cc5 Leszek Koltunski
      cState.stencilMask = 0x00;
441 e6519ac8 Leszek Koltunski
      GLES31.glStencilMask(cState.stencilMask);
442 270c27bc Leszek Koltunski
      }
443 20ee7cc9 Leszek Koltunski
444
    sState.depthMask = cState.depthMask;
445
446
    if( cState.depthMask!=0 )
447 81f0078a Leszek Koltunski
      {
448
      cState.depthMask = 0;
449 e6519ac8 Leszek Koltunski
      GLES31.glDepthMask(false);
450 81f0078a Leszek Koltunski
      }
451 20ee7cc9 Leszek Koltunski
452
    sState.depthTest = cState.depthTest;
453
454 81f0078a Leszek Koltunski
    if( cState.depthTest!=0 )
455
      {
456
      cState.depthTest = 0;
457 e6519ac8 Leszek Koltunski
      GLES31.glDisable(GLES31.GL_DEPTH_TEST);
458 81f0078a Leszek Koltunski
      }
459 270c27bc Leszek Koltunski
    }
460
461
///////////////////////////////////////////////////////////////////////////////////////////////////
462 7266d8ef Leszek Koltunski
/**
463
 * Only for use by the library itself.
464
 *
465
 * @y.exclude
466
 */
467
  public static void unuseStencilMark()
468 270c27bc Leszek Koltunski
    {
469 5b959cc5 Leszek Koltunski
    if( sState.stencilTest!=cState.stencilTest )
470 270c27bc Leszek Koltunski
      {
471 5b959cc5 Leszek Koltunski
      cState.stencilTest = sState.stencilTest;
472 270c27bc Leszek Koltunski
473 5b959cc5 Leszek Koltunski
      if (cState.stencilTest == 0)
474 270c27bc Leszek Koltunski
        {
475 e6519ac8 Leszek Koltunski
        GLES31.glDisable(GLES31.GL_STENCIL_TEST);
476 270c27bc Leszek Koltunski
        }
477
      else
478
        {
479 e6519ac8 Leszek Koltunski
        GLES31.glEnable(GLES31.GL_STENCIL_TEST);
480 270c27bc Leszek Koltunski
        }
481
      }
482 5b959cc5 Leszek Koltunski
    if( sState.stencilFuncFunc!=cState.stencilFuncFunc || sState.stencilFuncRef!=cState.stencilFuncRef || sState.stencilFuncMask!=cState.stencilFuncMask )
483 270c27bc Leszek Koltunski
      {
484 5b959cc5 Leszek Koltunski
      cState.stencilFuncFunc = sState.stencilFuncFunc;
485
      cState.stencilFuncRef  = sState.stencilFuncRef ;
486
      cState.stencilFuncMask = sState.stencilFuncMask;
487 e6519ac8 Leszek Koltunski
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
488 270c27bc Leszek Koltunski
      }
489 5b959cc5 Leszek Koltunski
    if( sState.stencilMask!=cState.stencilMask )
490 270c27bc Leszek Koltunski
      {
491 5b959cc5 Leszek Koltunski
      cState.stencilMask = sState.stencilMask;
492 e6519ac8 Leszek Koltunski
      GLES31.glStencilMask(cState.stencilMask);
493 270c27bc Leszek Koltunski
      }
494 81f0078a Leszek Koltunski
    if( sState.depthMask!=cState.depthMask )
495
      {
496
      cState.depthMask = sState.depthMask;
497 e6519ac8 Leszek Koltunski
      GLES31.glDepthMask(cState.depthMask==1);
498 81f0078a Leszek Koltunski
      }
499
    if( sState.depthTest!=cState.depthTest )
500
      {
501
      cState.depthTest = sState.depthTest;
502
503
      if (cState.depthTest == 0)
504
        {
505 e6519ac8 Leszek Koltunski
        GLES31.glDisable(GLES31.GL_DEPTH_TEST);
506 81f0078a Leszek Koltunski
        }
507
      else
508
        {
509 e6519ac8 Leszek Koltunski
        GLES31.glEnable(GLES31.GL_DEPTH_TEST);
510 81f0078a Leszek Koltunski
        }
511
      }
512 270c27bc Leszek Koltunski
    }
513
514 9dba4df1 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
515
516
  void apply()
517
    {
518 cc8151c4 leszek
    //android.util.Log.e("State", "APPLYING STATE");
519 d582c116 Leszek Koltunski
520 cc8151c4 leszek
    /////////////////////////////////////////////////////
521
    // 1. Write to color buffer?
522 5b959cc5 Leszek Koltunski
    if( mState.colorMaskR!=cState.colorMaskR || mState.colorMaskG!=cState.colorMaskG || mState.colorMaskB!=cState.colorMaskB || mState.colorMaskA!=cState.colorMaskA)
523 9dba4df1 leszek
      {
524 cc8151c4 leszek
      //android.util.Log.d("State", "setting color mask");
525 5b959cc5 Leszek Koltunski
      cState.colorMaskR = mState.colorMaskR;
526
      cState.colorMaskG = mState.colorMaskG;
527
      cState.colorMaskB = mState.colorMaskB;
528
      cState.colorMaskA = mState.colorMaskA;
529 e6519ac8 Leszek Koltunski
      GLES31.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
530 9dba4df1 leszek
      }
531
532 cc8151c4 leszek
    /////////////////////////////////////////////////////
533 d582c116 Leszek Koltunski
    // 2. Enable Depth test?
534 5b959cc5 Leszek Koltunski
    if( mState.depthTest!=cState.depthTest )
535 9dba4df1 leszek
      {
536 5b959cc5 Leszek Koltunski
      cState.depthTest = mState.depthTest;
537 d582c116 Leszek Koltunski
538 5b959cc5 Leszek Koltunski
      if (cState.depthTest == 0)
539 cc8151c4 leszek
        {
540
        //android.util.Log.d("State", "disabling depth test");
541 e6519ac8 Leszek Koltunski
        GLES31.glDisable(GLES31.GL_DEPTH_TEST);
542 cc8151c4 leszek
        }
543 9dba4df1 leszek
      else
544
        {
545 cc8151c4 leszek
        //android.util.Log.d("State", "enable depth test");
546 e6519ac8 Leszek Koltunski
        GLES31.glEnable(GLES31.GL_DEPTH_TEST);
547 9dba4df1 leszek
        }
548
      }
549
550 cc8151c4 leszek
    /////////////////////////////////////////////////////
551
    // 3. Change Depth Function?
552 5b959cc5 Leszek Koltunski
    if( mState.depthFunc!=cState.depthFunc )
553 cc8151c4 leszek
      {
554
      //android.util.Log.d("State", "setting depth func");
555 5b959cc5 Leszek Koltunski
      cState.depthFunc = mState.depthFunc;
556 e6519ac8 Leszek Koltunski
      GLES31.glDepthFunc(cState.depthFunc);
557 cc8151c4 leszek
      }
558 d582c116 Leszek Koltunski
559 cc8151c4 leszek
    /////////////////////////////////////////////////////
560
    // 4. Write to Depth buffer?
561 5b959cc5 Leszek Koltunski
    if( mState.depthMask!=cState.depthMask )
562 d582c116 Leszek Koltunski
      {
563 cc8151c4 leszek
      //android.util.Log.d("State", "setting depth mask");
564 5b959cc5 Leszek Koltunski
      cState.depthMask = mState.depthMask;
565 e6519ac8 Leszek Koltunski
      GLES31.glDepthMask(cState.depthMask==1);
566 d582c116 Leszek Koltunski
      }
567
568 cc8151c4 leszek
    /////////////////////////////////////////////////////
569
    // 5. Enable Blending?
570 5b959cc5 Leszek Koltunski
    if( mState.blend!=cState.blend )
571 c834348d leszek
      {
572 5b959cc5 Leszek Koltunski
      cState.blend = mState.blend;
573 d582c116 Leszek Koltunski
574 5b959cc5 Leszek Koltunski
      if (cState.blend == 0)
575 cc8151c4 leszek
        {
576
        //android.util.Log.d("State", "disabling blending");
577 e6519ac8 Leszek Koltunski
        GLES31.glDisable(GLES31.GL_BLEND);
578 cc8151c4 leszek
        }
579 c834348d leszek
      else
580
        {
581 cc8151c4 leszek
        //android.util.Log.d("State", "enabling blending");
582 e6519ac8 Leszek Koltunski
        GLES31.glEnable(GLES31.GL_BLEND);
583 c834348d leszek
        }
584
      }
585
586 cc8151c4 leszek
    /////////////////////////////////////////////////////
587
    // 6. Change Blend function?
588 5b959cc5 Leszek Koltunski
    if( mState.blendSrc!=cState.blendSrc || mState.blendDst!=cState.blendDst )
589 cc8151c4 leszek
      {
590
      //android.util.Log.d("State", "setting blend function");
591 5b959cc5 Leszek Koltunski
      cState.blendSrc = mState.blendSrc;
592
      cState.blendDst = mState.blendDst;
593 e6519ac8 Leszek Koltunski
      GLES31.glBlendFunc(cState.blendSrc,cState.blendDst);
594 cc8151c4 leszek
      }
595 d582c116 Leszek Koltunski
596 cc8151c4 leszek
    /////////////////////////////////////////////////////
597
    // 7. Enable/Disable Stencil Test?
598 5b959cc5 Leszek Koltunski
    if( mState.stencilTest!=cState.stencilTest )
599 9dba4df1 leszek
      {
600 5b959cc5 Leszek Koltunski
      cState.stencilTest = mState.stencilTest;
601 d582c116 Leszek Koltunski
602 5b959cc5 Leszek Koltunski
      if (cState.stencilTest == 0)
603 cc8151c4 leszek
        {
604
        //android.util.Log.d("State", "disabling stencil test");
605 e6519ac8 Leszek Koltunski
        GLES31.glDisable(GLES31.GL_STENCIL_TEST);
606 cc8151c4 leszek
        }
607 9dba4df1 leszek
      else
608
        {
609 cc8151c4 leszek
        //android.util.Log.d("State", "enabling stencil test");
610 e6519ac8 Leszek Koltunski
        GLES31.glEnable(GLES31.GL_STENCIL_TEST);
611 9dba4df1 leszek
        }
612
      }
613 d582c116 Leszek Koltunski
614 cc8151c4 leszek
    /////////////////////////////////////////////////////
615
    // 8. Adjust Stencil function?
616 5b959cc5 Leszek Koltunski
    if( mState.stencilFuncFunc!=cState.stencilFuncFunc || mState.stencilFuncRef!=cState.stencilFuncRef || mState.stencilFuncMask!=cState.stencilFuncMask )
617 cc8151c4 leszek
      {
618
      //android.util.Log.d("State", "setting stencil function");
619 5b959cc5 Leszek Koltunski
      cState.stencilFuncFunc = mState.stencilFuncFunc;
620
      cState.stencilFuncRef  = mState.stencilFuncRef ;
621
      cState.stencilFuncMask = mState.stencilFuncMask;
622 e6519ac8 Leszek Koltunski
      GLES31.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
623 cc8151c4 leszek
      }
624
625
    /////////////////////////////////////////////////////
626
    // 9. Adjust Stencil operation?
627 5b959cc5 Leszek Koltunski
    if( mState.stencilOpSfail!=cState.stencilOpSfail || mState.stencilOpDpfail!=cState.stencilOpDpfail || mState.stencilOpDppass!=cState.stencilOpDppass )
628 cc8151c4 leszek
      {
629
      //android.util.Log.d("State", "setting stencil op");
630 5b959cc5 Leszek Koltunski
      cState.stencilOpSfail = mState.stencilOpSfail;
631
      cState.stencilOpDpfail= mState.stencilOpDpfail;
632
      cState.stencilOpDppass= mState.stencilOpDppass;
633 e6519ac8 Leszek Koltunski
      GLES31.glStencilOp(cState.stencilOpSfail,cState.stencilOpDpfail,cState.stencilOpDppass);
634 cc8151c4 leszek
      }
635 d582c116 Leszek Koltunski
636 cc8151c4 leszek
    /////////////////////////////////////////////////////
637
    // 10. Write to Stencil buffer?
638 5b959cc5 Leszek Koltunski
    if( mState.stencilMask!=cState.stencilMask )
639 d582c116 Leszek Koltunski
      {
640 cc8151c4 leszek
      //android.util.Log.d("State", "setting stencil mask");
641 5b959cc5 Leszek Koltunski
      cState.stencilMask = mState.stencilMask;
642 e6519ac8 Leszek Koltunski
      GLES31.glStencilMask(cState.stencilMask);
643 d582c116 Leszek Koltunski
      }
644 ad16ed3b Leszek Koltunski
645 cc8151c4 leszek
    /////////////////////////////////////////////////////
646
    // 11. Clear buffers?
647 ad16ed3b Leszek Koltunski
    if( mClear!=0 )
648
      {
649 cc8151c4 leszek
      //android.util.Log.d("State", "clearing buffer");
650 e6519ac8 Leszek Koltunski
      GLES31.glClear(mClear);
651 ad16ed3b Leszek Koltunski
      }
652 9dba4df1 leszek
    }
653
654
///////////////////////////////////////////////////////////////////////////////////////////////////
655
656
  void glColorMask(boolean r, boolean g, boolean b, boolean a)
657
    {
658 5b959cc5 Leszek Koltunski
    mState.colorMaskR = (r ? 1:0);
659
    mState.colorMaskG = (g ? 1:0);
660
    mState.colorMaskB = (b ? 1:0);
661
    mState.colorMaskA = (a ? 1:0);
662 9dba4df1 leszek
    }
663
664
///////////////////////////////////////////////////////////////////////////////////////////////////
665
666
  void glDepthMask(boolean mask)
667
    {
668 5b959cc5 Leszek Koltunski
    mState.depthMask = (mask ? 1:0);
669 9dba4df1 leszek
    }
670
671
///////////////////////////////////////////////////////////////////////////////////////////////////
672
673
  void glStencilMask(int mask)
674
    {
675 5b959cc5 Leszek Koltunski
    mState.stencilMask = mask;
676 9dba4df1 leszek
    }
677
678
///////////////////////////////////////////////////////////////////////////////////////////////////
679
680
  void glEnable(int test)
681
    {
682 e6519ac8 Leszek Koltunski
         if( test==GLES31.GL_DEPTH_TEST   ) mState.depthTest   = 1;
683
    else if( test==GLES31.GL_STENCIL_TEST ) mState.stencilTest = 1;
684
    else if( test==GLES31.GL_BLEND        ) mState.blend       = 1;
685 9dba4df1 leszek
    }
686
687
///////////////////////////////////////////////////////////////////////////////////////////////////
688
689
  void glDisable(int test)
690
    {
691 e6519ac8 Leszek Koltunski
         if( test==GLES31.GL_DEPTH_TEST   ) mState.depthTest   = 0;
692
    else if( test==GLES31.GL_STENCIL_TEST ) mState.stencilTest = 0;
693
    else if( test==GLES31.GL_BLEND        ) mState.blend       = 0;
694 9dba4df1 leszek
    }
695
696
///////////////////////////////////////////////////////////////////////////////////////////////////
697
698
  void glStencilFunc(int func, int ref, int mask)
699
    {
700 5b959cc5 Leszek Koltunski
    mState.stencilFuncFunc = func;
701
    mState.stencilFuncRef  = ref;
702
    mState.stencilFuncMask = mask;
703 9dba4df1 leszek
    }
704
705
///////////////////////////////////////////////////////////////////////////////////////////////////
706
707
  void glStencilOp(int sfail, int dpfail, int dppass)
708
    {
709 5b959cc5 Leszek Koltunski
    mState.stencilOpSfail = sfail;
710
    mState.stencilOpDpfail= dpfail;
711
    mState.stencilOpDppass= dppass;
712 9dba4df1 leszek
    }
713
714
///////////////////////////////////////////////////////////////////////////////////////////////////
715
716
  void glDepthFunc(int func)
717
    {
718 5b959cc5 Leszek Koltunski
    mState.depthFunc = func;
719 9dba4df1 leszek
    }
720 c834348d leszek
721
///////////////////////////////////////////////////////////////////////////////////////////////////
722
723
  void glBlendFunc(int src, int dst)
724
    {
725 5b959cc5 Leszek Koltunski
    mState.blendSrc = src;
726
    mState.blendDst = dst;
727 c834348d leszek
    }
728
729 ad16ed3b Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
730
731
  void glClear(int mask)
732
    {
733
    mClear = mask;
734
    }
735 9dba4df1 leszek
}