Project

General

Profile

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

library / src / main / java / org / distorted / library / main / DistortedRenderState.java @ 20ee7cc9

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2016 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Distorted.                                                               //
5
//                                                                                               //
6
// Distorted is free software: you can redistribute it and/or modify                             //
7
// it under the terms of the GNU General Public License as published by                          //
8
// the Free Software Foundation, either version 2 of the License, or                             //
9
// (at your option) any later version.                                                           //
10
//                                                                                               //
11
// Distorted is distributed in the hope that it will be useful,                                  //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
14
// GNU General Public License for more details.                                                  //
15
//                                                                                               //
16
// You should have received a copy of the GNU General Public License                             //
17
// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19

    
20
package org.distorted.library.main;
21

    
22
import android.opengl.GLES30;
23

    
24
///////////////////////////////////////////////////////////////////////////////////////////////////
25
/**
26
 * Remember the OpenGL state.
27
 * <p>
28
 * This is a member of DistortedNode. Remembers the OpenGL state we want to set just before rendering
29
 * the Node.
30
 * <p>
31
 * Only for use by the library itself.
32
 *
33
 * @y.exclude
34
 */
35
public class DistortedRenderState
36
{
37
  // TODO: figure this out dynamically; this assumes 8 bit stencil buffer.
38
  private static final int STENCIL_MASK = (1<<8)-1;
39

    
40
  private static class RenderState
41
    {
42
    private int colorMaskR, colorMaskG, colorMaskB, colorMaskA;
43
    private int depthMask;
44
    private int stencilMask;
45
    private int depthTest;
46
    private int stencilTest;
47
    private int stencilFuncFunc, stencilFuncRef, stencilFuncMask;
48
    private int stencilOpSfail, stencilOpDpfail, stencilOpDppass;
49
    private int depthFunc;
50
    private int blend;
51
    private int blendSrc, blendDst;
52
    }
53

    
54
  private RenderState mState;          // state the current object wants to have
55
  static private RenderState cState = new RenderState();   // current OpenGL Stave
56
  static private RenderState sState = new RenderState();   // saved OpenGL state
57

    
58
  private int mClear;
59

    
60
///////////////////////////////////////////////////////////////////////////////////////////////////
61
// default: color writes on, depth test and writes on, blending on, stencil off.
62

    
63
  DistortedRenderState()
64
    {
65
    mState = new RenderState();
66

    
67
    mState.colorMaskR = 1;
68
    mState.colorMaskG = 1;
69
    mState.colorMaskB = 1;
70
    mState.colorMaskA = 1;
71

    
72
    mState.depthTest  = 1;
73
    mState.depthMask  = 1;
74
    mState.depthFunc  = GLES30.GL_LEQUAL;
75

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

    
80
    mState.stencilTest     = 0;
81
    mState.stencilMask     = STENCIL_MASK;
82
    mState.stencilFuncFunc = GLES30.GL_NEVER;
83
    mState.stencilFuncRef  = 0;
84
    mState.stencilFuncMask = STENCIL_MASK;
85
    mState.stencilOpSfail  = GLES30.GL_KEEP;
86
    mState.stencilOpDpfail = GLES30.GL_KEEP;
87
    mState.stencilOpDppass = GLES30.GL_KEEP;
88

    
89
    mClear = 0;
90
    }
91

    
92
///////////////////////////////////////////////////////////////////////////////////////////////////
93
// reset state of everything to 'unknown'
94

    
95
  static void reset()
96
    {
97
    cState.colorMaskR = -1;
98
    cState.colorMaskG = -1;
99
    cState.colorMaskB = -1;
100
    cState.colorMaskA = -1;
101

    
102
    cState.depthTest  = -1;
103
    cState.depthMask  = -1;
104
    cState.depthFunc  = -1;
105

    
106
    cState.blend      = -1;
107
    cState.blendSrc   = -1;
108
    cState.blendDst   = -1;
109

    
110
    cState.stencilTest     = -1;
111
    cState.stencilMask     = -1;
112
    cState.stencilFuncFunc = -1;
113
    cState.stencilFuncRef  = -1;
114
    cState.stencilFuncMask = -1;
115
    cState.stencilOpSfail  = -1;
116
    cState.stencilOpDpfail = -1;
117
    cState.stencilOpDppass = -1;
118
    }
119

    
120
///////////////////////////////////////////////////////////////////////////////////////////////////
121

    
122
  static void colorDepthStencilOn()
123
    {
124
    sState.colorMaskR = cState.colorMaskR;
125
    sState.colorMaskG = cState.colorMaskG;
126
    sState.colorMaskB = cState.colorMaskB;
127
    sState.colorMaskA = cState.colorMaskA;
128

    
129
    if( cState.colorMaskR!=1 || cState.colorMaskG!=1 || cState.colorMaskB!=1 || cState.colorMaskA!=1 )
130
      {
131
      cState.colorMaskR = 1;
132
      cState.colorMaskG = 1;
133
      cState.colorMaskB = 1;
134
      cState.colorMaskA = 1;
135
      GLES30.glColorMask(true,true,true,true);
136
      }
137

    
138
    sState.depthMask = cState.depthMask;
139

    
140
    if( cState.depthMask!=1 )
141
      {
142
      cState.depthMask = 1;
143
      GLES30.glDepthMask(true);
144
      }
145

    
146
    sState.stencilMask = cState.stencilMask;
147

    
148
    if( cState.stencilMask!= STENCIL_MASK )
149
      {
150
      cState.stencilMask = STENCIL_MASK;
151
      GLES30.glStencilMask(cState.stencilMask);
152
      }
153
    }
154

    
155
///////////////////////////////////////////////////////////////////////////////////////////////////
156

    
157
  static void colorDepthStencilRestore()
158
    {
159
    if( sState.colorMaskR!=cState.colorMaskR || sState.colorMaskG!=cState.colorMaskG || sState.colorMaskB!=cState.colorMaskB || sState.colorMaskA!=cState.colorMaskA)
160
      {
161
      cState.colorMaskR = sState.colorMaskR;
162
      cState.colorMaskG = sState.colorMaskG;
163
      cState.colorMaskB = sState.colorMaskB;
164
      cState.colorMaskA = sState.colorMaskA;
165
      GLES30.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
166
      }
167
    if( sState.depthMask!=cState.depthMask )
168
      {
169
      cState.depthMask = sState.depthMask;
170
      GLES30.glDepthMask(cState.depthMask==1);
171
      }
172
    if( sState.stencilMask!=cState.stencilMask )
173
      {
174
      cState.stencilMask = sState.stencilMask;
175
      GLES30.glStencilMask(cState.stencilMask);
176
      }
177
    }
178

    
179
///////////////////////////////////////////////////////////////////////////////////////////////////
180

    
181
  static void switchOffDrawing()
182
    {
183
    GLES30.glEnable(GLES30.GL_SCISSOR_TEST);
184
    GLES30.glScissor(0,0,0,0);
185
    }
186

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

    
189
  static void restoreDrawing()
190
    {
191
    GLES30.glDisable(GLES30.GL_SCISSOR_TEST);
192
    }
193

    
194
///////////////////////////////////////////////////////////////////////////////////////////////////
195

    
196
  static void setUpStencilMark()
197
    {
198
    sState.stencilTest = cState.stencilTest;
199

    
200
    if( cState.stencilTest!=1 )
201
      {
202
      cState.stencilTest = 1;
203
      //android.util.Log.d("State", "stencil test on");
204
      GLES30.glEnable(GLES30.GL_STENCIL_TEST);
205
      }
206

    
207
    sState.stencilFuncFunc = cState.stencilFuncFunc;
208
    sState.stencilFuncRef  = cState.stencilFuncRef;
209
    sState.stencilFuncMask = cState.stencilFuncMask;
210

    
211
    if( cState.stencilFuncFunc!=GLES30.GL_ALWAYS || cState.stencilFuncRef!=1 || cState.stencilFuncMask!=STENCIL_MASK )
212
      {
213
      cState.stencilFuncFunc = GLES30.GL_ALWAYS;
214
      cState.stencilFuncRef  = 1;
215
      cState.stencilFuncMask = STENCIL_MASK;
216
      //android.util.Log.d("State", "stencil func on");
217
      GLES30.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
218
      }
219

    
220
    sState.stencilOpSfail = cState.stencilOpSfail;
221
    sState.stencilOpDpfail= cState.stencilOpDpfail;
222
    sState.stencilOpDppass= cState.stencilOpDppass;
223

    
224
    if( cState.stencilOpSfail!=GLES30.GL_KEEP || cState.stencilOpDpfail!=GLES30.GL_KEEP || cState.stencilOpDppass!=GLES30.GL_REPLACE )
225
      {
226
      cState.stencilOpSfail = GLES30.GL_KEEP;
227
      cState.stencilOpDpfail= GLES30.GL_KEEP;
228
      cState.stencilOpDppass= GLES30.GL_REPLACE;
229
      //android.util.Log.d("State", "stencil op on");
230
      GLES30.glStencilOp(cState.stencilOpSfail,cState.stencilOpDpfail,cState.stencilOpDppass);
231
      }
232

    
233
    sState.colorMaskR = cState.colorMaskR;
234
    sState.colorMaskG = cState.colorMaskG;
235
    sState.colorMaskB = cState.colorMaskB;
236
    sState.colorMaskA = cState.colorMaskA;
237

    
238
    if( cState.colorMaskR!=0 || cState.colorMaskG!=0 || cState.colorMaskB!=0 || cState.colorMaskA!=0 )
239
      {
240
      cState.colorMaskR = 0;
241
      cState.colorMaskG = 0;
242
      cState.colorMaskB = 0;
243
      cState.colorMaskA = 0;
244
      //android.util.Log.d("State", "switch off color writing");
245
      GLES30.glColorMask(false,false,false,false);
246
      }
247

    
248
    sState.depthMask = cState.depthMask;
249

    
250
    if( cState.depthMask!=1 )
251
      {
252
      cState.depthMask = 1;
253
      //android.util.Log.d("State", "switch on depth writing");
254
      GLES30.glDepthMask(true);
255
      }
256

    
257
    sState.stencilMask = cState.stencilMask;
258

    
259
    if( cState.stencilMask!= STENCIL_MASK )
260
      {
261
      cState.stencilMask = STENCIL_MASK;
262
      //android.util.Log.d("State", "stencil mask on");
263
      GLES30.glStencilMask(cState.stencilMask);
264
      }
265
    }
266

    
267
///////////////////////////////////////////////////////////////////////////////////////////////////
268

    
269
  static void unsetUpStencilMark()
270
    {
271
    if( sState.stencilTest!=cState.stencilTest )
272
      {
273
      cState.stencilTest = sState.stencilTest;
274

    
275
      if (cState.stencilTest == 0)
276
        {
277
        GLES30.glDisable(GLES30.GL_STENCIL_TEST);
278
        }
279
      else
280
        {
281
        GLES30.glEnable(GLES30.GL_STENCIL_TEST);
282
        }
283
      }
284
    if( sState.colorMaskR!=cState.colorMaskR || sState.colorMaskG!=cState.colorMaskG || sState.colorMaskB!=cState.colorMaskB || sState.colorMaskA!=cState.colorMaskA)
285
      {
286
      cState.colorMaskR = sState.colorMaskR;
287
      cState.colorMaskG = sState.colorMaskG;
288
      cState.colorMaskB = sState.colorMaskB;
289
      cState.colorMaskA = sState.colorMaskA;
290
      GLES30.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
291
      }
292
    if( sState.depthMask!=cState.depthMask )
293
      {
294
      cState.depthMask = sState.depthMask;
295
      GLES30.glDepthMask(cState.depthMask==1);
296
      }
297
    if( sState.stencilMask!=cState.stencilMask )
298
      {
299
      cState.stencilMask = sState.stencilMask;
300
      GLES30.glStencilMask(cState.stencilMask);
301
      }
302
    }
303

    
304
///////////////////////////////////////////////////////////////////////////////////////////////////
305
/**
306
 * Only for use by the library itself.
307
 *
308
 * @y.exclude
309
 */
310
  public static void useStencilMark()
311
    {
312
    sState.stencilMask = cState.stencilMask;
313

    
314
    if( cState.stencilTest!=1 )
315
      {
316
      cState.stencilTest = 1;
317
      GLES30.glEnable(GLES30.GL_STENCIL_TEST);
318
      }
319

    
320
    sState.stencilFuncFunc = cState.stencilFuncFunc;
321
    sState.stencilFuncRef  = cState.stencilFuncRef;
322
    sState.stencilFuncMask = cState.stencilFuncMask;
323

    
324
    if( cState.stencilFuncFunc!=GLES30.GL_EQUAL || cState.stencilFuncRef!=1 || cState.stencilFuncMask!=STENCIL_MASK )
325
      {
326
      cState.stencilFuncFunc = GLES30.GL_EQUAL;
327
      cState.stencilFuncRef  = 1;
328
      cState.stencilFuncMask = STENCIL_MASK;
329
      GLES30.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
330
      }
331

    
332
    sState.stencilMask = cState.stencilMask;
333

    
334
    if( cState.stencilMask!= 0x00 )
335
      {
336
      cState.stencilMask = 0x00;
337
      GLES30.glStencilMask(cState.stencilMask);
338
      }
339

    
340
    sState.depthMask = cState.depthMask;
341

    
342
    if( cState.depthMask!=0 )
343
      {
344
      cState.depthMask = 0;
345
      GLES30.glDepthMask(false);
346
      }
347

    
348
    sState.depthTest = cState.depthTest;
349

    
350
    if( cState.depthTest!=0 )
351
      {
352
      cState.depthTest = 0;
353
      GLES30.glDisable(GLES30.GL_DEPTH_TEST);
354
      }
355
    }
356

    
357
///////////////////////////////////////////////////////////////////////////////////////////////////
358
/**
359
 * Only for use by the library itself.
360
 *
361
 * @y.exclude
362
 */
363
  public static void unuseStencilMark()
364
    {
365
    if( sState.stencilTest!=cState.stencilTest )
366
      {
367
      cState.stencilTest = sState.stencilTest;
368

    
369
      if (cState.stencilTest == 0)
370
        {
371
        GLES30.glDisable(GLES30.GL_STENCIL_TEST);
372
        }
373
      else
374
        {
375
        GLES30.glEnable(GLES30.GL_STENCIL_TEST);
376
        }
377
      }
378
    if( sState.stencilFuncFunc!=cState.stencilFuncFunc || sState.stencilFuncRef!=cState.stencilFuncRef || sState.stencilFuncMask!=cState.stencilFuncMask )
379
      {
380
      cState.stencilFuncFunc = sState.stencilFuncFunc;
381
      cState.stencilFuncRef  = sState.stencilFuncRef ;
382
      cState.stencilFuncMask = sState.stencilFuncMask;
383
      GLES30.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
384
      }
385
    if( sState.stencilMask!=cState.stencilMask )
386
      {
387
      cState.stencilMask = sState.stencilMask;
388
      GLES30.glStencilMask(cState.stencilMask);
389
      }
390
    if( sState.depthMask!=cState.depthMask )
391
      {
392
      cState.depthMask = sState.depthMask;
393
      GLES30.glDepthMask(cState.depthMask==1);
394
      }
395
    if( sState.depthTest!=cState.depthTest )
396
      {
397
      cState.depthTest = sState.depthTest;
398

    
399
      if (cState.depthTest == 0)
400
        {
401
        GLES30.glDisable(GLES30.GL_DEPTH_TEST);
402
        }
403
      else
404
        {
405
        GLES30.glEnable(GLES30.GL_DEPTH_TEST);
406
        }
407
      }
408
    }
409

    
410
///////////////////////////////////////////////////////////////////////////////////////////////////
411

    
412
  void apply()
413
    {
414
    //android.util.Log.e("State", "APPLYING STATE");
415

    
416
    /////////////////////////////////////////////////////
417
    // 1. Write to color buffer?
418
    if( mState.colorMaskR!=cState.colorMaskR || mState.colorMaskG!=cState.colorMaskG || mState.colorMaskB!=cState.colorMaskB || mState.colorMaskA!=cState.colorMaskA)
419
      {
420
      //android.util.Log.d("State", "setting color mask");
421
      cState.colorMaskR = mState.colorMaskR;
422
      cState.colorMaskG = mState.colorMaskG;
423
      cState.colorMaskB = mState.colorMaskB;
424
      cState.colorMaskA = mState.colorMaskA;
425
      GLES30.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
426
      }
427

    
428
    /////////////////////////////////////////////////////
429
    // 2. Enable Depth test?
430
    if( mState.depthTest!=cState.depthTest )
431
      {
432
      cState.depthTest = mState.depthTest;
433

    
434
      if (cState.depthTest == 0)
435
        {
436
        //android.util.Log.d("State", "disabling depth test");
437
        GLES30.glDisable(GLES30.GL_DEPTH_TEST);
438
        }
439
      else
440
        {
441
        //android.util.Log.d("State", "enable depth test");
442
        GLES30.glEnable(GLES30.GL_DEPTH_TEST);
443
        }
444
      }
445

    
446
    /////////////////////////////////////////////////////
447
    // 3. Change Depth Function?
448
    if( mState.depthFunc!=cState.depthFunc )
449
      {
450
      //android.util.Log.d("State", "setting depth func");
451
      cState.depthFunc = mState.depthFunc;
452
      GLES30.glDepthFunc(cState.depthFunc);
453
      }
454

    
455
    /////////////////////////////////////////////////////
456
    // 4. Write to Depth buffer?
457
    if( mState.depthMask!=cState.depthMask )
458
      {
459
      //android.util.Log.d("State", "setting depth mask");
460
      cState.depthMask = mState.depthMask;
461
      GLES30.glDepthMask(cState.depthMask==1);
462
      }
463

    
464
    /////////////////////////////////////////////////////
465
    // 5. Enable Blending?
466
    if( mState.blend!=cState.blend )
467
      {
468
      cState.blend = mState.blend;
469

    
470
      if (cState.blend == 0)
471
        {
472
        //android.util.Log.d("State", "disabling blending");
473
        GLES30.glDisable(GLES30.GL_BLEND);
474
        }
475
      else
476
        {
477
        //android.util.Log.d("State", "enabling blending");
478
        GLES30.glEnable(GLES30.GL_BLEND);
479
        }
480
      }
481

    
482
    /////////////////////////////////////////////////////
483
    // 6. Change Blend function?
484
    if( mState.blendSrc!=cState.blendSrc || mState.blendDst!=cState.blendDst )
485
      {
486
      //android.util.Log.d("State", "setting blend function");
487
      cState.blendSrc = mState.blendSrc;
488
      cState.blendDst = mState.blendDst;
489
      GLES30.glBlendFunc(cState.blendSrc,cState.blendDst);
490
      }
491

    
492
    /////////////////////////////////////////////////////
493
    // 7. Enable/Disable Stencil Test?
494
    if( mState.stencilTest!=cState.stencilTest )
495
      {
496
      cState.stencilTest = mState.stencilTest;
497

    
498
      if (cState.stencilTest == 0)
499
        {
500
        //android.util.Log.d("State", "disabling stencil test");
501
        GLES30.glDisable(GLES30.GL_STENCIL_TEST);
502
        }
503
      else
504
        {
505
        //android.util.Log.d("State", "enabling stencil test");
506
        GLES30.glEnable(GLES30.GL_STENCIL_TEST);
507
        }
508
      }
509

    
510
    /////////////////////////////////////////////////////
511
    // 8. Adjust Stencil function?
512
    if( mState.stencilFuncFunc!=cState.stencilFuncFunc || mState.stencilFuncRef!=cState.stencilFuncRef || mState.stencilFuncMask!=cState.stencilFuncMask )
513
      {
514
      //android.util.Log.d("State", "setting stencil function");
515
      cState.stencilFuncFunc = mState.stencilFuncFunc;
516
      cState.stencilFuncRef  = mState.stencilFuncRef ;
517
      cState.stencilFuncMask = mState.stencilFuncMask;
518
      GLES30.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
519
      }
520

    
521
    /////////////////////////////////////////////////////
522
    // 9. Adjust Stencil operation?
523
    if( mState.stencilOpSfail!=cState.stencilOpSfail || mState.stencilOpDpfail!=cState.stencilOpDpfail || mState.stencilOpDppass!=cState.stencilOpDppass )
524
      {
525
      //android.util.Log.d("State", "setting stencil op");
526
      cState.stencilOpSfail = mState.stencilOpSfail;
527
      cState.stencilOpDpfail= mState.stencilOpDpfail;
528
      cState.stencilOpDppass= mState.stencilOpDppass;
529
      GLES30.glStencilOp(cState.stencilOpSfail,cState.stencilOpDpfail,cState.stencilOpDppass);
530
      }
531

    
532
    /////////////////////////////////////////////////////
533
    // 10. Write to Stencil buffer?
534
    if( mState.stencilMask!=cState.stencilMask )
535
      {
536
      //android.util.Log.d("State", "setting stencil mask");
537
      cState.stencilMask = mState.stencilMask;
538
      GLES30.glStencilMask(cState.stencilMask);
539
      }
540

    
541
    /////////////////////////////////////////////////////
542
    // 11. Clear buffers?
543
    if( mClear!=0 )
544
      {
545
      //android.util.Log.d("State", "clearing buffer");
546
      GLES30.glClear(mClear);
547
      }
548
    }
549

    
550
///////////////////////////////////////////////////////////////////////////////////////////////////
551

    
552
  void glColorMask(boolean r, boolean g, boolean b, boolean a)
553
    {
554
    mState.colorMaskR = (r ? 1:0);
555
    mState.colorMaskG = (g ? 1:0);
556
    mState.colorMaskB = (b ? 1:0);
557
    mState.colorMaskA = (a ? 1:0);
558
    }
559

    
560
///////////////////////////////////////////////////////////////////////////////////////////////////
561

    
562
  void glDepthMask(boolean mask)
563
    {
564
    mState.depthMask = (mask ? 1:0);
565
    }
566

    
567
///////////////////////////////////////////////////////////////////////////////////////////////////
568

    
569
  void glStencilMask(int mask)
570
    {
571
    mState.stencilMask = mask;
572
    }
573

    
574
///////////////////////////////////////////////////////////////////////////////////////////////////
575

    
576
  void glEnable(int test)
577
    {
578
         if( test==GLES30.GL_DEPTH_TEST   ) mState.depthTest   = 1;
579
    else if( test==GLES30.GL_STENCIL_TEST ) mState.stencilTest = 1;
580
    else if( test==GLES30.GL_BLEND        ) mState.blend       = 1;
581
    }
582

    
583
///////////////////////////////////////////////////////////////////////////////////////////////////
584

    
585
  void glDisable(int test)
586
    {
587
         if( test==GLES30.GL_DEPTH_TEST   ) mState.depthTest   = 0;
588
    else if( test==GLES30.GL_STENCIL_TEST ) mState.stencilTest = 0;
589
    else if( test==GLES30.GL_BLEND        ) mState.blend       = 0;
590
    }
591

    
592
///////////////////////////////////////////////////////////////////////////////////////////////////
593

    
594
  void glStencilFunc(int func, int ref, int mask)
595
    {
596
    mState.stencilFuncFunc = func;
597
    mState.stencilFuncRef  = ref;
598
    mState.stencilFuncMask = mask;
599
    }
600

    
601
///////////////////////////////////////////////////////////////////////////////////////////////////
602

    
603
  void glStencilOp(int sfail, int dpfail, int dppass)
604
    {
605
    mState.stencilOpSfail = sfail;
606
    mState.stencilOpDpfail= dpfail;
607
    mState.stencilOpDppass= dppass;
608
    }
609

    
610
///////////////////////////////////////////////////////////////////////////////////////////////////
611

    
612
  void glDepthFunc(int func)
613
    {
614
    mState.depthFunc = func;
615
    }
616

    
617
///////////////////////////////////////////////////////////////////////////////////////////////////
618

    
619
  void glBlendFunc(int src, int dst)
620
    {
621
    mState.blendSrc = src;
622
    mState.blendDst = dst;
623
    }
624

    
625
///////////////////////////////////////////////////////////////////////////////////////////////////
626

    
627
  void glClear(int mask)
628
    {
629
    mClear = mask;
630
    }
631
}
(9-9/21)