Project

General

Profile

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

library / src / main / java / org / distorted / library / main / InternalRenderState.java @ 8c57d77b

1 9dba4df1 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
2 2e569ff6 Leszek Koltunski
// Copyright 2016 Leszek Koltunski  leszek@koltunski.pl                                          //
3 9dba4df1 leszek
//                                                                                               //
4 46b572b5 Leszek Koltunski
// This file is part of Distorted.                                                               //
5 9dba4df1 leszek
//                                                                                               //
6 2e569ff6 Leszek Koltunski
// This library is free software; you can redistribute it and/or                                 //
7
// modify it under the terms of the GNU Lesser General Public                                    //
8
// License as published by the Free Software Foundation; either                                  //
9
// version 2.1 of the License, or (at your option) any later version.                            //
10 9dba4df1 leszek
//                                                                                               //
11 2e569ff6 Leszek Koltunski
// This library is distributed in the hope that it will be useful,                               //
12 9dba4df1 leszek
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13 2e569ff6 Leszek Koltunski
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU                             //
14
// Lesser General Public License for more details.                                               //
15 9dba4df1 leszek
//                                                                                               //
16 2e569ff6 Leszek Koltunski
// You should have received a copy of the GNU Lesser General Public                              //
17
// License along with this library; if not, write to the Free Software                           //
18
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA                //
19 9dba4df1 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
20
21 fe82a979 Leszek Koltunski
package org.distorted.library.main;
22 9dba4df1 leszek
23 b7074bc6 Leszek Koltunski
import android.opengl.GLES30;
24 9dba4df1 leszek
25
///////////////////////////////////////////////////////////////////////////////////////////////////
26
/**
27
 * Remember the OpenGL state.
28 ad16ed3b Leszek Koltunski
 * <p>
29
 * This is a member of DistortedNode. Remembers the OpenGL state we want to set just before rendering
30
 * the Node.
31 7266d8ef Leszek Koltunski
 * <p>
32
 * Only for use by the library itself.
33
 *
34
 * @y.exclude
35 9dba4df1 leszek
 */
36 7602a827 Leszek Koltunski
public class InternalRenderState
37 9dba4df1 leszek
{
38 23eecbd9 Leszek Koltunski
  // TODO: figure this out dynamically; this assumes 8 bit stencil buffer.
39
  private static final int STENCIL_MASK = (1<<8)-1;
40
41 5b959cc5 Leszek Koltunski
  private static class RenderState
42
    {
43
    private int colorMaskR, colorMaskG, colorMaskB, colorMaskA;
44
    private int depthMask;
45
    private int stencilMask;
46
    private int depthTest;
47
    private int stencilTest;
48
    private int stencilFuncFunc, stencilFuncRef, stencilFuncMask;
49
    private int stencilOpSfail, stencilOpDpfail, stencilOpDppass;
50
    private int depthFunc;
51
    private int blend;
52
    private int blendSrc, blendDst;
53
    }
54
55 5c84d9c2 Leszek Koltunski
  private final RenderState mState;          // state the current object wants to have
56
  static private final RenderState cState = new RenderState();   // current OpenGL Stave
57
  static private final RenderState sState = new RenderState();   // saved OpenGL state
58 5b959cc5 Leszek Koltunski
59
  private int mClear;
60 270c27bc Leszek Koltunski
61 9dba4df1 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
62 c834348d leszek
// default: color writes on, depth test and writes on, blending on, stencil off.
63 9dba4df1 leszek
64 7602a827 Leszek Koltunski
  InternalRenderState()
65 9dba4df1 leszek
    {
66 5b959cc5 Leszek Koltunski
    mState = new RenderState();
67
68
    mState.colorMaskR = 1;
69
    mState.colorMaskG = 1;
70
    mState.colorMaskB = 1;
71
    mState.colorMaskA = 1;
72
73
    mState.depthTest  = 1;
74
    mState.depthMask  = 1;
75 b7074bc6 Leszek Koltunski
    mState.depthFunc  = GLES30.GL_LEQUAL;
76 5b959cc5 Leszek Koltunski
77
    mState.blend      = 1;
78 b7074bc6 Leszek Koltunski
    mState.blendSrc   = GLES30.GL_SRC_ALPHA;
79
    mState.blendDst   = GLES30.GL_ONE_MINUS_SRC_ALPHA;
80 5b959cc5 Leszek Koltunski
81
    mState.stencilTest     = 0;
82
    mState.stencilMask     = STENCIL_MASK;
83 b7074bc6 Leszek Koltunski
    mState.stencilFuncFunc = GLES30.GL_NEVER;
84 5b959cc5 Leszek Koltunski
    mState.stencilFuncRef  = 0;
85
    mState.stencilFuncMask = STENCIL_MASK;
86 b7074bc6 Leszek Koltunski
    mState.stencilOpSfail  = GLES30.GL_KEEP;
87
    mState.stencilOpDpfail = GLES30.GL_KEEP;
88
    mState.stencilOpDppass = GLES30.GL_KEEP;
89 ad16ed3b Leszek Koltunski
90
    mClear = 0;
91 9dba4df1 leszek
    }
92
93
///////////////////////////////////////////////////////////////////////////////////////////////////
94 f75a4eee Leszek Koltunski
// reset state of everything to a known state.
95 9dba4df1 leszek
96
  static void reset()
97
    {
98 f75a4eee Leszek Koltunski
    cState.colorMaskR = 1;
99
    cState.colorMaskG = 1;
100
    cState.colorMaskB = 1;
101
    cState.colorMaskA = 1;
102 b7074bc6 Leszek Koltunski
    GLES30.glColorMask(true,true,true,true);
103 f75a4eee Leszek Koltunski
104
    cState.depthTest = 1;
105
    cState.depthMask = 1;
106 b7074bc6 Leszek Koltunski
    cState.depthFunc = GLES30.GL_LEQUAL;
107
    GLES30.glEnable(GLES30.GL_DEPTH_TEST);
108
    GLES30.glDepthMask(true);
109
    GLES30.glDepthFunc(cState.depthFunc);
110 f75a4eee Leszek Koltunski
111
    cState.stencilTest     = 0;
112
    cState.stencilMask     = STENCIL_MASK;
113 b7074bc6 Leszek Koltunski
    cState.stencilFuncFunc = GLES30.GL_NEVER;
114 f75a4eee Leszek Koltunski
    cState.stencilFuncRef  = 0;
115
    cState.stencilFuncMask = STENCIL_MASK;
116 b7074bc6 Leszek Koltunski
    cState.stencilOpSfail  = GLES30.GL_KEEP;
117
    cState.stencilOpDpfail = GLES30.GL_KEEP;
118
    cState.stencilOpDppass = GLES30.GL_KEEP;
119
    GLES30.glDisable(GLES30.GL_STENCIL_TEST);
120
    GLES30.glStencilMask(cState.stencilMask);
121 f75a4eee Leszek Koltunski
122
    cState.blend      = 1;
123 b7074bc6 Leszek Koltunski
    cState.blendSrc   = GLES30.GL_SRC_ALPHA;
124
    cState.blendDst   = GLES30.GL_ONE_MINUS_SRC_ALPHA;
125
    GLES30.glEnable(GLES30.GL_BLEND);
126
    GLES30.glBlendFunc(cState.blendSrc,cState.blendDst);
127 9dba4df1 leszek
    }
128
129 580f7d10 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
130
131 23eecbd9 Leszek Koltunski
  static void colorDepthStencilOn()
132 580f7d10 leszek
    {
133 20ee7cc9 Leszek Koltunski
    sState.colorMaskR = cState.colorMaskR;
134
    sState.colorMaskG = cState.colorMaskG;
135
    sState.colorMaskB = cState.colorMaskB;
136
    sState.colorMaskA = cState.colorMaskA;
137
138 5b959cc5 Leszek Koltunski
    if( cState.colorMaskR!=1 || cState.colorMaskG!=1 || cState.colorMaskB!=1 || cState.colorMaskA!=1 )
139 580f7d10 leszek
      {
140 5b959cc5 Leszek Koltunski
      cState.colorMaskR = 1;
141
      cState.colorMaskG = 1;
142
      cState.colorMaskB = 1;
143
      cState.colorMaskA = 1;
144 b7074bc6 Leszek Koltunski
      GLES30.glColorMask(true,true,true,true);
145 580f7d10 leszek
      }
146 20ee7cc9 Leszek Koltunski
147
    sState.depthMask = cState.depthMask;
148
149 5b959cc5 Leszek Koltunski
    if( cState.depthMask!=1 )
150 580f7d10 leszek
      {
151 5b959cc5 Leszek Koltunski
      cState.depthMask = 1;
152 b7074bc6 Leszek Koltunski
      GLES30.glDepthMask(true);
153 580f7d10 leszek
      }
154 20ee7cc9 Leszek Koltunski
155
    sState.stencilMask = cState.stencilMask;
156
157 5b959cc5 Leszek Koltunski
    if( cState.stencilMask!= STENCIL_MASK )
158 23eecbd9 Leszek Koltunski
      {
159 5b959cc5 Leszek Koltunski
      cState.stencilMask = STENCIL_MASK;
160 b7074bc6 Leszek Koltunski
      GLES30.glStencilMask(cState.stencilMask);
161 23eecbd9 Leszek Koltunski
      }
162 580f7d10 leszek
    }
163
164 20ee7cc9 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
165
166
  static void colorDepthStencilRestore()
167
    {
168
    if( sState.colorMaskR!=cState.colorMaskR || sState.colorMaskG!=cState.colorMaskG || sState.colorMaskB!=cState.colorMaskB || sState.colorMaskA!=cState.colorMaskA)
169
      {
170
      cState.colorMaskR = sState.colorMaskR;
171
      cState.colorMaskG = sState.colorMaskG;
172
      cState.colorMaskB = sState.colorMaskB;
173
      cState.colorMaskA = sState.colorMaskA;
174 b7074bc6 Leszek Koltunski
      GLES30.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
175 20ee7cc9 Leszek Koltunski
      }
176
    if( sState.depthMask!=cState.depthMask )
177
      {
178
      cState.depthMask = sState.depthMask;
179 b7074bc6 Leszek Koltunski
      GLES30.glDepthMask(cState.depthMask==1);
180 20ee7cc9 Leszek Koltunski
      }
181
    if( sState.stencilMask!=cState.stencilMask )
182
      {
183
      cState.stencilMask = sState.stencilMask;
184 b7074bc6 Leszek Koltunski
      GLES30.glStencilMask(cState.stencilMask);
185 20ee7cc9 Leszek Koltunski
      }
186
    }
187
188 977756d7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
189
190 809dcae3 Leszek Koltunski
  public static void disableBlending()
191 977756d7 Leszek Koltunski
    {
192
    sState.blend = cState.blend;
193
194
    if (cState.blend != 0)
195
      {
196
      cState.blend = 0;
197 b7074bc6 Leszek Koltunski
      GLES30.glDisable(GLES30.GL_BLEND);
198 977756d7 Leszek Koltunski
      }
199
    }
200
201
///////////////////////////////////////////////////////////////////////////////////////////////////
202
203 809dcae3 Leszek Koltunski
  public static void restoreBlending()
204 977756d7 Leszek Koltunski
    {
205
    if (sState.blend != cState.blend)
206
      {
207
      cState.blend = sState.blend;
208
209
      if (cState.blend == 0)
210
        {
211 b7074bc6 Leszek Koltunski
        GLES30.glDisable(GLES30.GL_BLEND);
212 977756d7 Leszek Koltunski
        }
213
      else
214
        {
215 b7074bc6 Leszek Koltunski
        GLES30.glEnable(GLES30.GL_BLEND);
216 977756d7 Leszek Koltunski
        }
217
      }
218
    }
219
220 56c6ca24 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
221
222
  static void enableDepthTest()
223
    {
224
    sState.depthTest = cState.depthTest;
225
226
    if (cState.depthTest != 1)
227
      {
228
      cState.depthTest = 1;
229 b7074bc6 Leszek Koltunski
      GLES30.glEnable(GLES30.GL_DEPTH_TEST);
230 56c6ca24 Leszek Koltunski
      }
231
    }
232
233
///////////////////////////////////////////////////////////////////////////////////////////////////
234
235
  static void restoreDepthTest()
236
    {
237
    if (sState.depthTest != cState.depthTest)
238
      {
239
      cState.depthTest = sState.depthTest;
240
241
      if (cState.depthTest == 0)
242
        {
243 b7074bc6 Leszek Koltunski
        GLES30.glDisable(GLES30.GL_DEPTH_TEST);
244 56c6ca24 Leszek Koltunski
        }
245
      else
246
        {
247 b7074bc6 Leszek Koltunski
        GLES30.glEnable(GLES30.GL_DEPTH_TEST);
248 56c6ca24 Leszek Koltunski
        }
249
      }
250
    }
251
252 cab7c165 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
253
254 f046b159 Leszek Koltunski
  public static void switchOffDrawing()
255 cab7c165 Leszek Koltunski
    {
256 b7074bc6 Leszek Koltunski
    GLES30.glEnable(GLES30.GL_SCISSOR_TEST);
257
    GLES30.glScissor(0,0,0,0);
258 cab7c165 Leszek Koltunski
    }
259
260
///////////////////////////////////////////////////////////////////////////////////////////////////
261
262 f046b159 Leszek Koltunski
  public static void restoreDrawing()
263 cab7c165 Leszek Koltunski
    {
264 b7074bc6 Leszek Koltunski
    GLES30.glDisable(GLES30.GL_SCISSOR_TEST);
265 cab7c165 Leszek Koltunski
    }
266
267 33f59f22 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
268
269
  static void switchOffColorDepthStencil()
270
    {
271
    sState.stencilTest = cState.stencilTest;
272
273
    if( cState.stencilTest!=0 )
274
      {
275
      cState.stencilTest = 0;
276 8c57d77b Leszek Koltunski
      //DistortedLibrary.logMessage("InternalRenderState: stencil test off");
277 b7074bc6 Leszek Koltunski
      GLES30.glDisable(GLES30.GL_STENCIL_TEST);
278 33f59f22 Leszek Koltunski
      }
279
280
    sState.depthTest = cState.depthTest;
281
282
    if( cState.depthTest!=0 )
283
      {
284
      cState.depthTest = 0;
285 8c57d77b Leszek Koltunski
      //DistortedLibrary.logMessage("InternalRenderState: depth test off");
286 b7074bc6 Leszek Koltunski
      GLES30.glDisable(GLES30.GL_DEPTH_TEST);
287 33f59f22 Leszek Koltunski
      }
288
289
    sState.colorMaskR = cState.colorMaskR;
290
    sState.colorMaskG = cState.colorMaskG;
291
    sState.colorMaskB = cState.colorMaskB;
292
    sState.colorMaskA = cState.colorMaskA;
293
294
    if( cState.colorMaskR!=0 || cState.colorMaskG!=0 || cState.colorMaskB!=0 || cState.colorMaskA!=0 )
295
      {
296
      cState.colorMaskR = 0;
297
      cState.colorMaskG = 0;
298
      cState.colorMaskB = 0;
299
      cState.colorMaskA = 0;
300 8c57d77b Leszek Koltunski
      //DistortedLibrary.logMessage("InternalRenderState: switch off color writing");
301 b7074bc6 Leszek Koltunski
      GLES30.glColorMask(false,false,false,false);
302 33f59f22 Leszek Koltunski
      }
303
304
    sState.depthMask = cState.depthMask;
305
306
    if( cState.depthMask!=0 )
307
      {
308
      cState.depthMask = 0;
309 8c57d77b Leszek Koltunski
      //DistortedLibrary.logMessage("InternalRenderState: switch off depth writing");
310 b7074bc6 Leszek Koltunski
      GLES30.glDepthMask(false);
311 33f59f22 Leszek Koltunski
      }
312
313
    sState.stencilMask = cState.stencilMask;
314
315
    if( cState.stencilMask!= 0x00 )
316
      {
317
      cState.stencilMask = 0x00;
318 8c57d77b Leszek Koltunski
      //DistortedLibrary.logMessage("InternalRenderState: stencil mask off");
319 b7074bc6 Leszek Koltunski
      GLES30.glStencilMask(cState.stencilMask);
320 33f59f22 Leszek Koltunski
      }
321
    }
322
323
///////////////////////////////////////////////////////////////////////////////////////////////////
324
325
  static void switchColorDepthOnStencilOff()
326
    {
327
    sState.stencilTest = cState.stencilTest;
328
329
    if( cState.stencilTest!=0 )
330
      {
331
      cState.stencilTest = 0;
332 8c57d77b Leszek Koltunski
      //DistortedLibrary.logMessage("InternalRenderState: stencil test off");
333 b7074bc6 Leszek Koltunski
      GLES30.glDisable(GLES30.GL_STENCIL_TEST);
334 33f59f22 Leszek Koltunski
      }
335
336
    sState.depthTest = cState.depthTest;
337
338
    if( cState.depthTest!=0 )
339
      {
340
      cState.depthTest = 0;
341 8c57d77b Leszek Koltunski
      //DistortedLibrary.logMessage("InternalRenderState: depth test off");
342 b7074bc6 Leszek Koltunski
      GLES30.glDisable(GLES30.GL_DEPTH_TEST);
343 33f59f22 Leszek Koltunski
      }
344
345
    sState.colorMaskR = cState.colorMaskR;
346
    sState.colorMaskG = cState.colorMaskG;
347
    sState.colorMaskB = cState.colorMaskB;
348
    sState.colorMaskA = cState.colorMaskA;
349
350
    if( cState.colorMaskR!=1 || cState.colorMaskG!=1 || cState.colorMaskB!=1 || cState.colorMaskA!=1 )
351
      {
352
      cState.colorMaskR = 1;
353
      cState.colorMaskG = 1;
354
      cState.colorMaskB = 1;
355
      cState.colorMaskA = 1;
356 8c57d77b Leszek Koltunski
      //DistortedLibrary.logMessage("InternalRenderState: switch on color writing");
357 b7074bc6 Leszek Koltunski
      GLES30.glColorMask(true,true,true,true);
358 33f59f22 Leszek Koltunski
      }
359
360
    sState.depthMask = cState.depthMask;
361
362
    if( cState.depthMask!=1 )
363
      {
364
      cState.depthMask = 1;
365 8c57d77b Leszek Koltunski
      //DistortedLibrary.logMessage("InternalRenderState: switch on depth writing");
366 b7074bc6 Leszek Koltunski
      GLES30.glDepthMask(true);
367 33f59f22 Leszek Koltunski
      }
368
369
    sState.stencilMask = cState.stencilMask;
370
371
    if( cState.stencilMask!= 0x00 )
372
      {
373
      cState.stencilMask = 0x00;
374 8c57d77b Leszek Koltunski
      //DistortedLibrary.logMessage("InternalRenderState: stencil mask off");
375 b7074bc6 Leszek Koltunski
      GLES30.glStencilMask(cState.stencilMask);
376 33f59f22 Leszek Koltunski
      }
377
    }
378
379
///////////////////////////////////////////////////////////////////////////////////////////////////
380
381
  static void restoreColorDepthStencil()
382
    {
383
    if( sState.stencilTest!=cState.stencilTest )
384
      {
385
      cState.stencilTest = sState.stencilTest;
386
387
      if (cState.stencilTest == 0)
388
        {
389 b7074bc6 Leszek Koltunski
        GLES30.glDisable(GLES30.GL_STENCIL_TEST);
390 33f59f22 Leszek Koltunski
        }
391
      else
392
        {
393 b7074bc6 Leszek Koltunski
        GLES30.glEnable(GLES30.GL_STENCIL_TEST);
394 33f59f22 Leszek Koltunski
        }
395
      }
396
    if( sState.depthTest!=cState.depthTest )
397
      {
398
      cState.depthTest = sState.depthTest;
399
400
      if (cState.depthTest == 0)
401
        {
402 b7074bc6 Leszek Koltunski
        GLES30.glDisable(GLES30.GL_DEPTH_TEST);
403 33f59f22 Leszek Koltunski
        }
404
      else
405
        {
406 b7074bc6 Leszek Koltunski
        GLES30.glEnable(GLES30.GL_DEPTH_TEST);
407 33f59f22 Leszek Koltunski
        }
408
      }
409
    if( sState.colorMaskR!=cState.colorMaskR || sState.colorMaskG!=cState.colorMaskG || sState.colorMaskB!=cState.colorMaskB || sState.colorMaskA!=cState.colorMaskA)
410
      {
411
      cState.colorMaskR = sState.colorMaskR;
412
      cState.colorMaskG = sState.colorMaskG;
413
      cState.colorMaskB = sState.colorMaskB;
414
      cState.colorMaskA = sState.colorMaskA;
415 b7074bc6 Leszek Koltunski
      GLES30.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
416 33f59f22 Leszek Koltunski
      }
417
    if( sState.depthMask!=cState.depthMask )
418
      {
419
      cState.depthMask = sState.depthMask;
420 b7074bc6 Leszek Koltunski
      GLES30.glDepthMask(cState.depthMask==1);
421 33f59f22 Leszek Koltunski
      }
422
    if( sState.stencilMask!=cState.stencilMask )
423 8777ce17 Leszek Koltunski
      {
424
      cState.stencilMask = sState.stencilMask;
425 b7074bc6 Leszek Koltunski
      GLES30.glStencilMask(cState.stencilMask);
426 8777ce17 Leszek Koltunski
      }
427
    }
428
429 270c27bc Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
430
431 809dcae3 Leszek Koltunski
  public static void setUpStencilMark(boolean color)
432 270c27bc Leszek Koltunski
    {
433 20ee7cc9 Leszek Koltunski
    sState.stencilTest = cState.stencilTest;
434
435 5b959cc5 Leszek Koltunski
    if( cState.stencilTest!=1 )
436 270c27bc Leszek Koltunski
      {
437 5b959cc5 Leszek Koltunski
      cState.stencilTest = 1;
438 8c57d77b Leszek Koltunski
      //DistortedLibrary.logMessage("InternalRenderState: stencil test on");
439 b7074bc6 Leszek Koltunski
      GLES30.glEnable(GLES30.GL_STENCIL_TEST);
440 270c27bc Leszek Koltunski
      }
441 20ee7cc9 Leszek Koltunski
442
    sState.stencilFuncFunc = cState.stencilFuncFunc;
443
    sState.stencilFuncRef  = cState.stencilFuncRef;
444
    sState.stencilFuncMask = cState.stencilFuncMask;
445
446 b7074bc6 Leszek Koltunski
    if( cState.stencilFuncFunc!=GLES30.GL_ALWAYS || cState.stencilFuncRef!=1 || cState.stencilFuncMask!=STENCIL_MASK )
447 270c27bc Leszek Koltunski
      {
448 b7074bc6 Leszek Koltunski
      cState.stencilFuncFunc = GLES30.GL_ALWAYS;
449 5b959cc5 Leszek Koltunski
      cState.stencilFuncRef  = 1;
450
      cState.stencilFuncMask = STENCIL_MASK;
451 8c57d77b Leszek Koltunski
      //DistortedLibrary.logMessage("InternalRenderState: stencil func on");
452 b7074bc6 Leszek Koltunski
      GLES30.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
453 270c27bc Leszek Koltunski
      }
454 20ee7cc9 Leszek Koltunski
455
    sState.stencilOpSfail = cState.stencilOpSfail;
456
    sState.stencilOpDpfail= cState.stencilOpDpfail;
457
    sState.stencilOpDppass= cState.stencilOpDppass;
458
459 b7074bc6 Leszek Koltunski
    if( cState.stencilOpSfail!=GLES30.GL_KEEP || cState.stencilOpDpfail!=GLES30.GL_KEEP || cState.stencilOpDppass!=GLES30.GL_REPLACE )
460 270c27bc Leszek Koltunski
      {
461 b7074bc6 Leszek Koltunski
      cState.stencilOpSfail = GLES30.GL_KEEP;
462
      cState.stencilOpDpfail= GLES30.GL_KEEP;
463
      cState.stencilOpDppass= GLES30.GL_REPLACE;
464 8c57d77b Leszek Koltunski
      //DistortedLibrary.logMessage("InternalRenderState: stencil op on");
465 b7074bc6 Leszek Koltunski
      GLES30.glStencilOp(cState.stencilOpSfail,cState.stencilOpDpfail,cState.stencilOpDppass);
466 270c27bc Leszek Koltunski
      }
467 20ee7cc9 Leszek Koltunski
468
    sState.colorMaskR = cState.colorMaskR;
469
    sState.colorMaskG = cState.colorMaskG;
470
    sState.colorMaskB = cState.colorMaskB;
471
    sState.colorMaskA = cState.colorMaskA;
472
473 a13dde77 Leszek Koltunski
    int clr = color ? 1:0;
474
475
    if( cState.colorMaskR!=clr || cState.colorMaskG!=clr || cState.colorMaskB!=clr || cState.colorMaskA!=clr )
476 270c27bc Leszek Koltunski
      {
477 a13dde77 Leszek Koltunski
      cState.colorMaskR = clr;
478
      cState.colorMaskG = clr;
479
      cState.colorMaskB = clr;
480
      cState.colorMaskA = clr;
481 8c57d77b Leszek Koltunski
      //DistortedLibrary.logMessage("InternalRenderState: switch off color writing");
482 b7074bc6 Leszek Koltunski
      GLES30.glColorMask(color,color,color,color);
483 270c27bc Leszek Koltunski
      }
484 20ee7cc9 Leszek Koltunski
485
    sState.depthMask = cState.depthMask;
486
487 1d6d261e Leszek Koltunski
    if( cState.depthMask!=1 )
488 270c27bc Leszek Koltunski
      {
489 1d6d261e Leszek Koltunski
      cState.depthMask = 1;
490 8c57d77b Leszek Koltunski
      //DistortedLibrary.logMessage("InternalRenderState: switch on depth writing");
491 b7074bc6 Leszek Koltunski
      GLES30.glDepthMask(true);
492 270c27bc Leszek Koltunski
      }
493 20ee7cc9 Leszek Koltunski
494
    sState.stencilMask = cState.stencilMask;
495
496 5b959cc5 Leszek Koltunski
    if( cState.stencilMask!= STENCIL_MASK )
497 270c27bc Leszek Koltunski
      {
498 5b959cc5 Leszek Koltunski
      cState.stencilMask = STENCIL_MASK;
499 8c57d77b Leszek Koltunski
      //DistortedLibrary.logMessage("InternalRenderState: stencil mask on");
500 b7074bc6 Leszek Koltunski
      GLES30.glStencilMask(cState.stencilMask);
501 270c27bc Leszek Koltunski
      }
502
    }
503
504 984dc935 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
505
506 809dcae3 Leszek Koltunski
  public static void unsetUpStencilMark()
507 984dc935 Leszek Koltunski
    {
508
    if( sState.stencilTest!=cState.stencilTest )
509
      {
510
      cState.stencilTest = sState.stencilTest;
511
512
      if (cState.stencilTest == 0)
513
        {
514 b7074bc6 Leszek Koltunski
        GLES30.glDisable(GLES30.GL_STENCIL_TEST);
515 984dc935 Leszek Koltunski
        }
516
      else
517
        {
518 b7074bc6 Leszek Koltunski
        GLES30.glEnable(GLES30.GL_STENCIL_TEST);
519 984dc935 Leszek Koltunski
        }
520
      }
521
    if( sState.colorMaskR!=cState.colorMaskR || sState.colorMaskG!=cState.colorMaskG || sState.colorMaskB!=cState.colorMaskB || sState.colorMaskA!=cState.colorMaskA)
522
      {
523
      cState.colorMaskR = sState.colorMaskR;
524
      cState.colorMaskG = sState.colorMaskG;
525
      cState.colorMaskB = sState.colorMaskB;
526
      cState.colorMaskA = sState.colorMaskA;
527 b7074bc6 Leszek Koltunski
      GLES30.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
528 984dc935 Leszek Koltunski
      }
529
    if( sState.depthMask!=cState.depthMask )
530
      {
531
      cState.depthMask = sState.depthMask;
532 b7074bc6 Leszek Koltunski
      GLES30.glDepthMask(cState.depthMask==1);
533 984dc935 Leszek Koltunski
      }
534
    if( sState.stencilMask!=cState.stencilMask )
535
      {
536
      cState.stencilMask = sState.stencilMask;
537 b7074bc6 Leszek Koltunski
      GLES30.glStencilMask(cState.stencilMask);
538 984dc935 Leszek Koltunski
      }
539
    }
540
541 270c27bc Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
542 7266d8ef Leszek Koltunski
/**
543
 * Only for use by the library itself.
544
 *
545
 * @y.exclude
546
 */
547
  public static void useStencilMark()
548 270c27bc Leszek Koltunski
    {
549 20ee7cc9 Leszek Koltunski
    sState.stencilMask = cState.stencilMask;
550
551 5b959cc5 Leszek Koltunski
    if( cState.stencilTest!=1 )
552 270c27bc Leszek Koltunski
      {
553 5b959cc5 Leszek Koltunski
      cState.stencilTest = 1;
554 b7074bc6 Leszek Koltunski
      GLES30.glEnable(GLES30.GL_STENCIL_TEST);
555 270c27bc Leszek Koltunski
      }
556 20ee7cc9 Leszek Koltunski
557
    sState.stencilFuncFunc = cState.stencilFuncFunc;
558
    sState.stencilFuncRef  = cState.stencilFuncRef;
559
    sState.stencilFuncMask = cState.stencilFuncMask;
560
561 b7074bc6 Leszek Koltunski
    if( cState.stencilFuncFunc!=GLES30.GL_EQUAL || cState.stencilFuncRef!=1 || cState.stencilFuncMask!=STENCIL_MASK )
562 270c27bc Leszek Koltunski
      {
563 b7074bc6 Leszek Koltunski
      cState.stencilFuncFunc = GLES30.GL_EQUAL;
564 5b959cc5 Leszek Koltunski
      cState.stencilFuncRef  = 1;
565
      cState.stencilFuncMask = STENCIL_MASK;
566 b7074bc6 Leszek Koltunski
      GLES30.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
567 270c27bc Leszek Koltunski
      }
568 20ee7cc9 Leszek Koltunski
569
    sState.stencilMask = cState.stencilMask;
570
571 5b959cc5 Leszek Koltunski
    if( cState.stencilMask!= 0x00 )
572 270c27bc Leszek Koltunski
      {
573 5b959cc5 Leszek Koltunski
      cState.stencilMask = 0x00;
574 b7074bc6 Leszek Koltunski
      GLES30.glStencilMask(cState.stencilMask);
575 270c27bc Leszek Koltunski
      }
576 20ee7cc9 Leszek Koltunski
577
    sState.depthMask = cState.depthMask;
578
579
    if( cState.depthMask!=0 )
580 81f0078a Leszek Koltunski
      {
581
      cState.depthMask = 0;
582 b7074bc6 Leszek Koltunski
      GLES30.glDepthMask(false);
583 81f0078a Leszek Koltunski
      }
584 20ee7cc9 Leszek Koltunski
585
    sState.depthTest = cState.depthTest;
586
587 81f0078a Leszek Koltunski
    if( cState.depthTest!=0 )
588
      {
589
      cState.depthTest = 0;
590 b7074bc6 Leszek Koltunski
      GLES30.glDisable(GLES30.GL_DEPTH_TEST);
591 81f0078a Leszek Koltunski
      }
592 270c27bc Leszek Koltunski
    }
593
594
///////////////////////////////////////////////////////////////////////////////////////////////////
595 7266d8ef Leszek Koltunski
/**
596
 * Only for use by the library itself.
597
 *
598
 * @y.exclude
599
 */
600
  public static void unuseStencilMark()
601 270c27bc Leszek Koltunski
    {
602 5b959cc5 Leszek Koltunski
    if( sState.stencilTest!=cState.stencilTest )
603 270c27bc Leszek Koltunski
      {
604 5b959cc5 Leszek Koltunski
      cState.stencilTest = sState.stencilTest;
605 270c27bc Leszek Koltunski
606 5b959cc5 Leszek Koltunski
      if (cState.stencilTest == 0)
607 270c27bc Leszek Koltunski
        {
608 b7074bc6 Leszek Koltunski
        GLES30.glDisable(GLES30.GL_STENCIL_TEST);
609 270c27bc Leszek Koltunski
        }
610
      else
611
        {
612 b7074bc6 Leszek Koltunski
        GLES30.glEnable(GLES30.GL_STENCIL_TEST);
613 270c27bc Leszek Koltunski
        }
614
      }
615 5b959cc5 Leszek Koltunski
    if( sState.stencilFuncFunc!=cState.stencilFuncFunc || sState.stencilFuncRef!=cState.stencilFuncRef || sState.stencilFuncMask!=cState.stencilFuncMask )
616 270c27bc Leszek Koltunski
      {
617 5b959cc5 Leszek Koltunski
      cState.stencilFuncFunc = sState.stencilFuncFunc;
618
      cState.stencilFuncRef  = sState.stencilFuncRef ;
619
      cState.stencilFuncMask = sState.stencilFuncMask;
620 b7074bc6 Leszek Koltunski
      GLES30.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
621 270c27bc Leszek Koltunski
      }
622 5b959cc5 Leszek Koltunski
    if( sState.stencilMask!=cState.stencilMask )
623 270c27bc Leszek Koltunski
      {
624 5b959cc5 Leszek Koltunski
      cState.stencilMask = sState.stencilMask;
625 b7074bc6 Leszek Koltunski
      GLES30.glStencilMask(cState.stencilMask);
626 270c27bc Leszek Koltunski
      }
627 81f0078a Leszek Koltunski
    if( sState.depthMask!=cState.depthMask )
628
      {
629
      cState.depthMask = sState.depthMask;
630 b7074bc6 Leszek Koltunski
      GLES30.glDepthMask(cState.depthMask==1);
631 81f0078a Leszek Koltunski
      }
632
    if( sState.depthTest!=cState.depthTest )
633
      {
634
      cState.depthTest = sState.depthTest;
635
636
      if (cState.depthTest == 0)
637
        {
638 b7074bc6 Leszek Koltunski
        GLES30.glDisable(GLES30.GL_DEPTH_TEST);
639 81f0078a Leszek Koltunski
        }
640
      else
641
        {
642 b7074bc6 Leszek Koltunski
        GLES30.glEnable(GLES30.GL_DEPTH_TEST);
643 81f0078a Leszek Koltunski
        }
644
      }
645 270c27bc Leszek Koltunski
    }
646
647 9dba4df1 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
648
649
  void apply()
650
    {
651 8c57d77b Leszek Koltunski
    //DistortedLibrary.logMessage("InternalRenderState: APPLYING STATE");
652 d582c116 Leszek Koltunski
653 cc8151c4 leszek
    /////////////////////////////////////////////////////
654
    // 1. Write to color buffer?
655 5b959cc5 Leszek Koltunski
    if( mState.colorMaskR!=cState.colorMaskR || mState.colorMaskG!=cState.colorMaskG || mState.colorMaskB!=cState.colorMaskB || mState.colorMaskA!=cState.colorMaskA)
656 9dba4df1 leszek
      {
657 8c57d77b Leszek Koltunski
      //DistortedLibrary.logMessage("InternalRenderState: setting color mask");
658 5b959cc5 Leszek Koltunski
      cState.colorMaskR = mState.colorMaskR;
659
      cState.colorMaskG = mState.colorMaskG;
660
      cState.colorMaskB = mState.colorMaskB;
661
      cState.colorMaskA = mState.colorMaskA;
662 b7074bc6 Leszek Koltunski
      GLES30.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
663 9dba4df1 leszek
      }
664
665 cc8151c4 leszek
    /////////////////////////////////////////////////////
666 d582c116 Leszek Koltunski
    // 2. Enable Depth test?
667 5b959cc5 Leszek Koltunski
    if( mState.depthTest!=cState.depthTest )
668 9dba4df1 leszek
      {
669 5b959cc5 Leszek Koltunski
      cState.depthTest = mState.depthTest;
670 d582c116 Leszek Koltunski
671 5b959cc5 Leszek Koltunski
      if (cState.depthTest == 0)
672 cc8151c4 leszek
        {
673 8c57d77b Leszek Koltunski
        //DistortedLibrary.logMessage("InternalRenderState: disabling depth test");
674 b7074bc6 Leszek Koltunski
        GLES30.glDisable(GLES30.GL_DEPTH_TEST);
675 cc8151c4 leszek
        }
676 9dba4df1 leszek
      else
677
        {
678 8c57d77b Leszek Koltunski
        //DistortedLibrary.logMessage("InternalRenderState: enable depth test");
679 b7074bc6 Leszek Koltunski
        GLES30.glEnable(GLES30.GL_DEPTH_TEST);
680 9dba4df1 leszek
        }
681
      }
682
683 cc8151c4 leszek
    /////////////////////////////////////////////////////
684
    // 3. Change Depth Function?
685 5b959cc5 Leszek Koltunski
    if( mState.depthFunc!=cState.depthFunc )
686 cc8151c4 leszek
      {
687 8c57d77b Leszek Koltunski
      //DistortedLibrary.logMessage("InternalRenderState: setting depth func");
688 5b959cc5 Leszek Koltunski
      cState.depthFunc = mState.depthFunc;
689 b7074bc6 Leszek Koltunski
      GLES30.glDepthFunc(cState.depthFunc);
690 cc8151c4 leszek
      }
691 d582c116 Leszek Koltunski
692 cc8151c4 leszek
    /////////////////////////////////////////////////////
693
    // 4. Write to Depth buffer?
694 5b959cc5 Leszek Koltunski
    if( mState.depthMask!=cState.depthMask )
695 d582c116 Leszek Koltunski
      {
696 8c57d77b Leszek Koltunski
      //DistortedLibrary.logMessage("InternalRenderState: setting depth mask");
697 5b959cc5 Leszek Koltunski
      cState.depthMask = mState.depthMask;
698 b7074bc6 Leszek Koltunski
      GLES30.glDepthMask(cState.depthMask==1);
699 d582c116 Leszek Koltunski
      }
700
701 cc8151c4 leszek
    /////////////////////////////////////////////////////
702
    // 5. Enable Blending?
703 5b959cc5 Leszek Koltunski
    if( mState.blend!=cState.blend )
704 c834348d leszek
      {
705 5b959cc5 Leszek Koltunski
      cState.blend = mState.blend;
706 d582c116 Leszek Koltunski
707 5b959cc5 Leszek Koltunski
      if (cState.blend == 0)
708 cc8151c4 leszek
        {
709 8c57d77b Leszek Koltunski
        //DistortedLibrary.logMessage("InternalRenderState: disabling blending");
710 b7074bc6 Leszek Koltunski
        GLES30.glDisable(GLES30.GL_BLEND);
711 cc8151c4 leszek
        }
712 c834348d leszek
      else
713
        {
714 8c57d77b Leszek Koltunski
        //DistortedLibrary.logMessage("InternalRenderState: enabling blending");
715 b7074bc6 Leszek Koltunski
        GLES30.glEnable(GLES30.GL_BLEND);
716 c834348d leszek
        }
717
      }
718
719 cc8151c4 leszek
    /////////////////////////////////////////////////////
720
    // 6. Change Blend function?
721 5b959cc5 Leszek Koltunski
    if( mState.blendSrc!=cState.blendSrc || mState.blendDst!=cState.blendDst )
722 cc8151c4 leszek
      {
723 8c57d77b Leszek Koltunski
      //DistortedLibrary.logMessage("InternalRenderState: setting blend function");
724 5b959cc5 Leszek Koltunski
      cState.blendSrc = mState.blendSrc;
725
      cState.blendDst = mState.blendDst;
726 b7074bc6 Leszek Koltunski
      GLES30.glBlendFunc(cState.blendSrc,cState.blendDst);
727 cc8151c4 leszek
      }
728 d582c116 Leszek Koltunski
729 cc8151c4 leszek
    /////////////////////////////////////////////////////
730
    // 7. Enable/Disable Stencil Test?
731 5b959cc5 Leszek Koltunski
    if( mState.stencilTest!=cState.stencilTest )
732 9dba4df1 leszek
      {
733 5b959cc5 Leszek Koltunski
      cState.stencilTest = mState.stencilTest;
734 d582c116 Leszek Koltunski
735 5b959cc5 Leszek Koltunski
      if (cState.stencilTest == 0)
736 cc8151c4 leszek
        {
737 8c57d77b Leszek Koltunski
        //DistortedLibrary.logMessage("InternalRenderState: disabling stencil test");
738 b7074bc6 Leszek Koltunski
        GLES30.glDisable(GLES30.GL_STENCIL_TEST);
739 cc8151c4 leszek
        }
740 9dba4df1 leszek
      else
741
        {
742 8c57d77b Leszek Koltunski
        //DistortedLibrary.logMessage("InternalRenderState: enabling stencil test");
743 b7074bc6 Leszek Koltunski
        GLES30.glEnable(GLES30.GL_STENCIL_TEST);
744 9dba4df1 leszek
        }
745
      }
746 d582c116 Leszek Koltunski
747 cc8151c4 leszek
    /////////////////////////////////////////////////////
748
    // 8. Adjust Stencil function?
749 5b959cc5 Leszek Koltunski
    if( mState.stencilFuncFunc!=cState.stencilFuncFunc || mState.stencilFuncRef!=cState.stencilFuncRef || mState.stencilFuncMask!=cState.stencilFuncMask )
750 cc8151c4 leszek
      {
751 8c57d77b Leszek Koltunski
      //DistortedLibrary.logMessage("InternalRenderState: setting stencil function");
752 5b959cc5 Leszek Koltunski
      cState.stencilFuncFunc = mState.stencilFuncFunc;
753
      cState.stencilFuncRef  = mState.stencilFuncRef ;
754
      cState.stencilFuncMask = mState.stencilFuncMask;
755 b7074bc6 Leszek Koltunski
      GLES30.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
756 cc8151c4 leszek
      }
757
758
    /////////////////////////////////////////////////////
759
    // 9. Adjust Stencil operation?
760 5b959cc5 Leszek Koltunski
    if( mState.stencilOpSfail!=cState.stencilOpSfail || mState.stencilOpDpfail!=cState.stencilOpDpfail || mState.stencilOpDppass!=cState.stencilOpDppass )
761 cc8151c4 leszek
      {
762 8c57d77b Leszek Koltunski
      //DistortedLibrary.logMessage("InternalRenderState: setting stencil op");
763 5b959cc5 Leszek Koltunski
      cState.stencilOpSfail = mState.stencilOpSfail;
764
      cState.stencilOpDpfail= mState.stencilOpDpfail;
765
      cState.stencilOpDppass= mState.stencilOpDppass;
766 b7074bc6 Leszek Koltunski
      GLES30.glStencilOp(cState.stencilOpSfail,cState.stencilOpDpfail,cState.stencilOpDppass);
767 cc8151c4 leszek
      }
768 d582c116 Leszek Koltunski
769 cc8151c4 leszek
    /////////////////////////////////////////////////////
770
    // 10. Write to Stencil buffer?
771 5b959cc5 Leszek Koltunski
    if( mState.stencilMask!=cState.stencilMask )
772 d582c116 Leszek Koltunski
      {
773 8c57d77b Leszek Koltunski
      //DistortedLibrary.logMessage("InternalRenderState: setting stencil mask");
774 5b959cc5 Leszek Koltunski
      cState.stencilMask = mState.stencilMask;
775 b7074bc6 Leszek Koltunski
      GLES30.glStencilMask(cState.stencilMask);
776 d582c116 Leszek Koltunski
      }
777 ad16ed3b Leszek Koltunski
778 cc8151c4 leszek
    /////////////////////////////////////////////////////
779
    // 11. Clear buffers?
780 ad16ed3b Leszek Koltunski
    if( mClear!=0 )
781
      {
782 8c57d77b Leszek Koltunski
      //DistortedLibrary.logMessage("InternalRenderState: clearing buffer");
783 b7074bc6 Leszek Koltunski
      GLES30.glClear(mClear);
784 ad16ed3b Leszek Koltunski
      }
785 9dba4df1 leszek
    }
786
787
///////////////////////////////////////////////////////////////////////////////////////////////////
788
789
  void glColorMask(boolean r, boolean g, boolean b, boolean a)
790
    {
791 5b959cc5 Leszek Koltunski
    mState.colorMaskR = (r ? 1:0);
792
    mState.colorMaskG = (g ? 1:0);
793
    mState.colorMaskB = (b ? 1:0);
794
    mState.colorMaskA = (a ? 1:0);
795 9dba4df1 leszek
    }
796
797
///////////////////////////////////////////////////////////////////////////////////////////////////
798
799
  void glDepthMask(boolean mask)
800
    {
801 5b959cc5 Leszek Koltunski
    mState.depthMask = (mask ? 1:0);
802 9dba4df1 leszek
    }
803
804
///////////////////////////////////////////////////////////////////////////////////////////////////
805
806
  void glStencilMask(int mask)
807
    {
808 5b959cc5 Leszek Koltunski
    mState.stencilMask = mask;
809 9dba4df1 leszek
    }
810
811
///////////////////////////////////////////////////////////////////////////////////////////////////
812
813
  void glEnable(int test)
814
    {
815 b7074bc6 Leszek Koltunski
         if( test==GLES30.GL_DEPTH_TEST   ) mState.depthTest   = 1;
816
    else if( test==GLES30.GL_STENCIL_TEST ) mState.stencilTest = 1;
817
    else if( test==GLES30.GL_BLEND        ) mState.blend       = 1;
818 9dba4df1 leszek
    }
819
820
///////////////////////////////////////////////////////////////////////////////////////////////////
821
822
  void glDisable(int test)
823
    {
824 b7074bc6 Leszek Koltunski
         if( test==GLES30.GL_DEPTH_TEST   ) mState.depthTest   = 0;
825
    else if( test==GLES30.GL_STENCIL_TEST ) mState.stencilTest = 0;
826
    else if( test==GLES30.GL_BLEND        ) mState.blend       = 0;
827 9dba4df1 leszek
    }
828
829
///////////////////////////////////////////////////////////////////////////////////////////////////
830
831
  void glStencilFunc(int func, int ref, int mask)
832
    {
833 5b959cc5 Leszek Koltunski
    mState.stencilFuncFunc = func;
834
    mState.stencilFuncRef  = ref;
835
    mState.stencilFuncMask = mask;
836 9dba4df1 leszek
    }
837
838
///////////////////////////////////////////////////////////////////////////////////////////////////
839
840
  void glStencilOp(int sfail, int dpfail, int dppass)
841
    {
842 5b959cc5 Leszek Koltunski
    mState.stencilOpSfail = sfail;
843
    mState.stencilOpDpfail= dpfail;
844
    mState.stencilOpDppass= dppass;
845 9dba4df1 leszek
    }
846
847
///////////////////////////////////////////////////////////////////////////////////////////////////
848
849
  void glDepthFunc(int func)
850
    {
851 5b959cc5 Leszek Koltunski
    mState.depthFunc = func;
852 9dba4df1 leszek
    }
853 c834348d leszek
854
///////////////////////////////////////////////////////////////////////////////////////////////////
855
856
  void glBlendFunc(int src, int dst)
857
    {
858 5b959cc5 Leszek Koltunski
    mState.blendSrc = src;
859
    mState.blendDst = dst;
860 c834348d leszek
    }
861
862 ad16ed3b Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
863
864
  void glClear(int mask)
865
    {
866
    mClear = mask;
867
    }
868 9dba4df1 leszek
}